BDgraph/0000755000176200001440000000000014043700405011556 5ustar liggesusersBDgraph/NAMESPACE0000644000176200001440000000145114043534425013005 0ustar liggesusersuseDynLib( BDgraph, .registration = TRUE ) export( bdgraph, bdgraph.mpl, transfer, plinks, bf, precision, covariance, select, pgraph, graph.sim, adj2link, link2adj, sparsity, bdgraph.sim, bdgraph.npn, compare, plotcoda, traceplot, plotroc, roc, conf.mat, conf.mat.plot, rgwish, rwish, gnorm, rmvnorm, ddweibull, pdweibull, qdweibull, rdweibull, summary.bdgraph, plot.bdgraph, print.bdgraph, plot.graph, plot.sim, print.sim, detect_cores, get_graph, get_g_prior, get_g_start, get_K_start, get_S_n_p, get_cores ) S3method( "summary", "bdgraph" ) S3method( "plot" , "bdgraph" ) S3method( "print" , "bdgraph" ) S3method( "plot" , "sim" ) S3method( "print" , "sim" ) S3method( "plot" , "graph" ) BDgraph/THANKS0000644000176200001440000000013513522261763012502 0ustar liggesusersThe authors would like to acknowledge the help of the CRAN team to integrate C++ code with R.BDgraph/README.md0000644000176200001440000000665513663252337013066 0ustar liggesusers# **BDgraph** ![](https://www.r-pkg.org/badges/version/BDgraph) ![](https://www.r-pkg.org/badges/last-release/BDgraph) ![](https://cranlogs.r-pkg.org/badges/BDgraph) ![](https://cranlogs.r-pkg.org/badges/grand-total/BDgraph) The `R` package **BDgraph** provides statistical tools for Bayesian structure learning in undirected graphical models for *continuous*, *count*, *binary*, and *mixed data*. The package is implemented the recent improvements in the Bayesian graphical models literature, including [Mohammadi and Wit (2015)](https://projecteuclid.org/euclid.ba/1422468425), [Mohammadi et al. (2017)](https://rss.onlinelibrary.wiley.com/doi/full/10.1111/rssc.12171), [Dobra and Mohammadi (2018)](https://projecteuclid.org/euclid.aoas/1532743478), and [Letac et al. (2018)](https://arxiv.org/abs/1706.04416). Besides, the package contains several functions for simulation and visualization, as well as several multivariate datasets taken from the literature. To speed up the computations, the computationally intensive tasks of the package are implemented in `C++` in parallel using **OpenMP**. ## Installation You can install the latest version from CRAN using: ``` r install.packages( "BDgraph" ) ``` ``` r require( "BDgraph" ) ``` ## Example 1: Gaussian Graphical Models Here is a simple example to see the preformance of the package for the Gaussian graphical models. Frist, by using the function `bdgraph.sim` to simulate 100 observations (n = 100) from a multivariate Gaussian distribution with 8 variables (p = 8) and “scale-free” graph structure, as follows: ``` r data.sim = bdgraph.sim( n = 100, p = 8, graph = "scale-free", vis = TRUE ) round( head( data.sim $ data, 4 ), 2 ) ``` Since the generated data are Gaussian, we run the `bdgraph` function by choosing `method = "ggm"`, as follows: ``` r bdgraph.obj <- bdgraph( data = data.sim, method = "ggm", iter = 5000 ) summary( ssgraph.obj ) ``` To compare the result with the true graph ``` r compare( data.sim, bdgraph.obj, main = c( "Target", "BDgraph" ), vis = TRUE ) ``` Now, as an alternative, we run the `bdgraph.mpl` function which is based on the GGMs and marginal pseudo-likelihood, as follows: ``` r bdgraph.obj_mpl <- bdgraph.mpl( data = data.sim, method = "ggm", iter = 5000 ) summary( bdgraph.obj_mpl ) ``` We could compare the results of both algorithms with the true graph as follows: ``` r compare( data.sim, bdgraph.obj, bdgraph.obj_mpl, main = c( "Target", "BDgraph", "BDgraph_mpl" ), vis = TRUE ) ``` ## Example 2: Gaussian Copula Graphical Models Here is a simple example to see the preformance of the package for the mixed data using Gaussian copula graphical models. Frist, by using the function `bdgraph.sim` to simulate 100 observations (n = 100) from mixed data (`type = "mixed"`) with 7 variables (p = 7) and “random” graph structure, as follows: ``` r data.sim = bdgraph.sim( n = 100, p = 7, type = "mixed", graph = "random", vis = TRUE ) round( head( data.sim $ data, 4 ), 2 ) ``` Since the generated data are mixed data, we are using run the `bdgraph` function by choosing `method = "gcgm"`, as follows: ``` r bdgraph.obj <- bdgraph( data = data.sim, method = "gcgm", iter = 5000 ) summary( ssgraph.obj ) ``` To compare the result with the true graph, we could run ``` r compare( data.sim, bdgraph.obj, main = c( "Target", "BDgraph" ), vis = TRUE ) ``` For more examples see [Mohammadi and Wit (2019)](https://www.jstatsoft.org/article/view/v089i03). BDgraph/data/0000755000176200001440000000000013431574445012504 5ustar liggesusersBDgraph/data/reinis.RData0000644000176200001440000000113713131110245014671 0ustar liggesusersNATœWkl-\xk8VCZvt3 _~:>=.hԯRƣWzp9Χ˺R>|UnnvҺd^IJ:Uw]8l*=֕^O"}]-=ҟ#*%k}ݦO8׫aL/=϶=u6=V糫o6>WqKWm'=_$U@$eJʗPM>~n$mZE[/=>,dyKm}ǽ~\+ѕaW$%Ifω$R4*I])}$I>T-}C-=1[zJܬ$I$Ir;%I!M$IS$I*P.ضfuC$I$I$IOU$I$Iv]$$I$I$I$I$I$I$IߍGiQutVySLJ6y]7&v>nr9{q0̯^/~\/Y^/^\.&f~}& ZBDgraph/data/geneExpression.RData0000644000176200001440000013175212774233401016421 0ustar liggesusersw mőBx^6Y吆Q"B%R(Fi/d!i(QR"$*ITR 黿suz匉+'JIIH&ǑʐRR [~6-e))X.Vq-~&׉{v;s oWOLwۋ2;$z1~ Bϰ%P LA[ FXTP]ΙZ9KFa5wt}RMwꫡ]Y)a[hgEם͂qqR(Y|L%StZ]&9n+ѣfV@ssٓ uGh9hi仧Ҵ1aPzP w݈S}Y(*}";[&!QQ*<ٱ'(}_O8g&zFgv.(wsxnGk4-=c'E^;P.sd{CKpw(vI>;[Ix Qh?r >-zcvZ-j;4}NrˬxMWysAi 0-MQ[鼝_u>P;jLMWڕ д/F,zir:h=[Z}W^0 ~Tо:(VO'OV Gn9('m-'qW Z:כŤą v`y1֠bm/f((9:dK#Axh4(Dte;GF]}FBP63hlK#s<9W47Qz<7КXѵ;Î .4OY"t@03uTK?lyM OdA ퟡhFLF鏾|+$( b=#ДUZUwIxz4]V_"}dn?áKQf2BhWuErPg6/&s\aYXq7#'^ Mki6N&ÌW+sA.A{T.()ד5h(ODu|pNLhՂ sc~h*(b~NrKGPMC|U+hvm$zxnm~zAݪ>8\8;P}Y1{AGZp(]m&τvp}Nv<*7uؒo헠ֻPp: hLy𓢏4Bk61b&o_' jZf߯QB? VJ8HhZ* V%|gDa&&x{kW=IOawb]&Юvk\GZ\ǙCrtYhR퉓yn#.А

PC ]JGtҡp&w(ӀsxBWPW]s= yTWB_ 깋qEi`I$h/X լ@MV~)Tjˠh~TO<\ό{YAǂnP_yKhVI ї%åGBҸv.qt8Y:=F$s(M_lPNLD.vlQ2fAQ0l(.sRP؅_χ޽sp$50-ݡxj~(r:_Y5(sxCY%#c (n0r k=󎥓u~|sj1$&K1B^r)ϝM#r4~T.q$NWeh@VYv!9&ߦo[,u(YEWKe#zZeg*$^{P֘ȂdL#Pcg;7f )H%ks4HI&ϟ]& ƠTEghO[\ˆH2c ryN\|b"w^GWAMֻ^VE-bV#T=SA{Q_p-%9}T<kSv1E-DǩKHM|~=T IE5ćou]R/c+fKL!t(uJa`E,Hr=.mݩvKנ/GZI|'X|[hz׌Fσ{!ƾw[vhxØ @i#ۈCW*Dz{ʾt${$G&A-$-?a|Hwp3 cWCUrVJxN湫yɽ\0_= [uT!6yy@"(g^oᛁXO ͷO B+SfRDTJ |kZP& 47I;N6݃q"{t#-2_-y 42`3U14UQ5u䨄; zwCkꪅ/_Bg1{;D2oqߜyh3a ^eė,rMAt#v5QPx"k2xw=SBO4I WY._ f: oThSsD5A \(W[Ҋ_.ϙf/*gpwMۮ6O[\^q7=|&[77Ыzܨ"F^-} M_ѓ-!>xZL9xK(]T(d1tn$/dKmǠ)tJсïK\8F nt[/MF/ ;YwxCB5t u}>ؿokNM^~ YBB~V4Q}bKcz> rڐ5YG}viI.{$EhBj# NT@54v?O 7/gZ@}1[JeKΊ̇Vቱ!v~*h+O]|JpNV\'R+m5.>R9 u-0g~p }̛\-iO82- "\|;b. >M{tMAQw`}s7 `Ž71yEPON|LUR\cJ˯t諳un$;7Z4?C7A,*?PU}GNYOC촧Jz(OUږ)JOؖ ʽn ި0(ɗ> j噫[xZ$WʿG9DH("#>d<[l2hɑe|L7ҡG:yQ9\33LOiU`7*o@r_H֭?pwWVؗ@.tSНKUA?}ۀu`w7|KNo\)mh е{°Rp@:w_B[ZV.9qt}i[oگ[9F6M BG\^=m09CW6x k1 s\yy|4ǜ;]XSuWߟqںC!k_ 1"S=9-Sap c|A{0 ́$6M\i*[^/9w1rYEе%9uK1"\ͼFh{xXGA9eмa+0eW!)۹M ߉/\մ 4?^f,˂`d=pkl6~尵IV=a)YjM=h8 F(<>"^CSxeSMc7m~q^?^dޓ$8^OzgB~ cla匟|\A5=xڟN6FBcƍR~Q ܸh}kDtlvg)omKj@e=~h1{o~ʼnRBp-*p7c“OO$3;Ϳ:Zf~!m.w ^cj-xsT5$<"gmC/v[zph.P&3"hӚkja K]k&>r*mqG r.tT ;悪czAm<֨W>~-^U8AY\Tbed&/h g @ݔ)Iצ{m=p/%5gOt0گO;G%\{BFBWW3ꏛ꒫A~k Y!`=jߒե8Y1o.`x/ϼ/6p9%gFA{Y1h\k' 56@ ۉoHV[wWAP'ʶeQZ;n~ietJ}˽xrr~kn}h+*A)-n&;/nKq q=|-mSIZ'"C7@9)\mʯZf1hFy$Gwa4gKA1C^mhi!8F9OΕ9Բv= ΁vwGIzBHro$)?Umu-֪4eM_*Ic|69G7>~]zC|3֫n-A#4N(*x~|mq~lW[_V+nrq_-J^!N})mP63/*n*Se*hx$K6*wADJg絾fQ8ZgDܜM= !ѳ؞ÌjPvw] W?דDA"Pόwo UEU2)n#?>kȜjy؞uU29kZX; j]^U4N/ TÏ_S#[Pex]{JOS;O9V>SヾP+Ll)0,5ѿG@ZGx fyPcãA=oI?5*A'w[c$p d&P^;~1ӞՁRkUW$ TZn$wL$hO£WNMS\#[T// @۴gn6ރ؎]&z,xݗHf\ZɂuP ZכȀ+psHӽ*t[8]ϽAg_ɛvA{+sYKtS;[:aOw'cnE|$UmQ wג<_`+Et}x}C_J]"sCC-ymWZM7AOpPM Or1AQX}][fWi wP~yhqO2 !zꞬi ^4P>gt&8Ww8zMg%YDlP]sѿBӣoZ)ܱ G|Vڅl^J^v>O:l7%ܴ<}mTjzu?ho[iy z63\H_ u,hr53Z=OlMjpeP–mb<+@84v2)5A-ׅ1?Cg{^u/MjMۘAe}bS dL!?k ~\dʼ"2/J{S  4Y5+9 t];$4s>g m4],GPkV[ƬMi`Tu. LδEDW-]Q u6s4J@=p>h(*[pB_h^C8E_awI ғ7x}t>(MQ} aěFwn^@ u-(E|nʞ|dДωOXtŞ>ჷ1} 2yަN5^8„5D&O7$ߞx,r ' pcKnPN@` ҿ'#ԗBE揅2huT}nGt,^l qPM\sgp UvAg &SXj_KeX)^/J w3 G8s (1ۻ<) 5t_nd;5D"gΚJiws='gҡ/V V v HP8F?!oM!oh2˭w|hw+]l:Kti2|_lq{5Xv lПJS ɥRyDyQ<'PQ-=^@lQ; rUGc{\_() oE~b2(eK'#sĽvC-;AYʣ=3eF̖DR+~e8.pa VU(]i$g?e}>(>njj=4A`;_Xù9Zq~wG7ph:ܥꌆfI~$ߤ;T AJ[;$t)grAWQ-Nzl&=5ۃ&B|(· eY7) MQ.;4g(%9LpE龠mִ8~{z ¾uMsJNq}_vАiy{ ѩG"ٞA9Ј4DXBIPV:6FAL|5yJQXz]Lhӓ]mD8rMGu+qF9h;wLKwU D6VYq{k>Gæ $|06yHVBrj-G6(/Ì#do5}۬c5'\?* rϬAKcfO{ `ʋ@̋'k@9v25vpooM.f୙߱Nw@+bjJ#[O귇}{jj&j}BŸ9A,S%[ 2X{Zr-n-DˍpBM/wV:vUYoxB{?8k MivN=n BvV՜S7Ò{yM AxoG3 ^ip¬gӥdp?şPB$4F]c|~\D$gt(F\<8ZKC"7THtZ[YM\G~ntAuE;_3*.guyi^' \6O/'Ќd\MFl=8ss]3mEMux^I|DKђA˄SEPL98|t17 ݶ@ j޻Z}鳰cdIu/ʾz-dߤEp'Z`{hPSBx8朄zaGaM,([o][EƂ5{H]Sl:.# ޵۴ORIX5G>̳!P4-[AS ŗqnPxs< AńW$] :v{((,9go4 {lhWLFn/+(3O=Tǵ.硫*j{ۅrc_א?JY K1.)фKc@R~̿ifP/7.ː1c{0s琍{c5S*LNzi|٠ZN8~dD$ZzYF!ˁn xi`Hdw/[޼su߃?#v f{/M ğ 7Xݘ%CkběOcjN`(μ&da -o_m.>I1prRؤ޶MQ}?7U9`>:<~hIM*oR=ɳ:[Ū [w0+bo%9OZt5DMVO?ۡV}qtYo6_xUKSwSM%uno}FݞXQǁsvSfOu#fk8SA"8;4j=c͋ gBgc1_.{/9!}xwh~\ڲgM}8H՞|ln;6.YGguƥyoTM[n B*ueGW(ʝY}u=azUٶqBV3;`yв3]}}އjŭbDƓܬ2t*nU-9u?UL>4]:A8jDoT qB~-.8W/tSi쭳c73ū2ܺqٿ!i-W ݓiYݤ'f޷Ԃx҆.uvϐҎhƌMdr8?C$¶PwzW {KK\G 2mX9८4ՂI^15'  ⠼[_Cö\~a/fO'-Bbp #VSW6B.cҮ!(T6KoAÞt7#?T)s $ .# YY[vWy~y«}A1rY7I AN'[V%gM]KWPCO;LsSl޺Τc@_' ,;~WNseƌ,"QlE'=$ZD;b) Ww!TTp %\wZ?r7k<-3DEPqRQ&3ߒt!pM_ ?l/&?=(J7~* QǞl/=ЃAW ncW0HRCEdބOEςK} 1yɠ xAN/c2z"PTq\;vN󆑭ҡ wUt8#o FeCtCN6eP&)t cJDH$s3]`]hI.MR/ CiK9OemRDJ>ԫsm^~m\AϒDvݻJ{_PFNԹF|. l7#TR 9\'7,) F ;8 So sAU7ntBgi8YA~YЮ;FXy%+&X}̖w|A=xni(.ڣ38i j7"$cS&eCb"k7M{뮰Y5O&}gxnP̓eA>d .O(RƎmۜ^yr7\ҴۢA_J=1,]0MiGn8=]@Vy]Ӿt1wU)Ԛ2$gDԇz23uP_Wv(C? )?L/껯&/Z<^z)Tݰ1cPb712c{4@3ԿVN׸7q-dN>ԍˍ*,)WH'^Z uf@"#dΖXxu.׭={BlݽA7a/;Bwo,=[H]yS@? xşAqپ<ΰ:#rf$9 o=iE}oyˉ6w \<ls]&0\,#_1</OeBdXwo偳$A>yCRj'8Sflq.F1 x* r$r2unhSDt_I/4O C!ޞV d.C|p}ɽx<rC bp0}\̈́׺4oϒ&7rb N~%*7N@{q*'!}ebIp sAūxF)t'Xjs!Yj74dv;bu}3DK:c_@H{7b#sC&iNs􂘻NlQ]moS7c+Dwʙ׶qbz)$=Խ?=xK,\~5^ ҃2nAR?g?fDX/g"xW-]e;-^KN[;4;i<=^]hWV&ħ9|31&zgENVwl6 𥉉FOm{'#Ç!QXѸƠ_Yަ4O {7%r|zw D~u@U!i"Cgno}> "uJoϞ9:T I֮"y=puhBLL̓V|LEg h۾̺~ _]m;6/)Nd^X9Jo҈wFeIkly ۓc@Kph!'jZ neSiW Nav %}.^|ʗ)}os,^>7Lyvv}~2jՏ7[|Q2깁7j ;EH.噿YJ!@sS@\,s7hsm}dj2UH ^{fA=&?}v6粥@y|fd.o坝c3w˯Ox \{; v؊P F|suo\1&TKݓ*o5H@?Nv ڥzZ>G25@EۜO^i0M5{R7l_/5^Ul3r W ?tv=o+cͶ;@`px{O9q$Xыg)<"Y?rfNv~ p} m) m\W x@)[Q ܪmsOM<GӧA{cnT(8q^DNY"xb5=.Vu&-96]ruyšXnYiF {gh'%S~9?ϳ9p<8 \j&V%2L-v6|6bў&;t@-$(˶M}z֗#:yWU1-q+A;yTZ5SU !Z\g/T؛7Q_f]aaɡ~ņ۠~ƓKpۂժKt|sq_C=¯UQ8- Ճyzp~,9f @IڒSQ+,xLrޯ^Y~bpO25v_9RZzƁA'/ߙpţ$ۼF}ԹvYtw!\׼J8}˻dP*oԻEc,}k6fJ ̘r9?yvJrC;BC,F<OQ"PoQ6zv'k}/|x,Ν[/vV@C}Ha7SȺszΪSw-ݝn\ oسܐom'F!\,l 1}J ow9~޼i1gsO9[J5.<iQPiXjx2r:憀TUeuP7n ];Tᣎk[jr~ r&#׭fe6ֱOvHz!nw\5ou.6y=JZƉI(.P^T͘$,-i$<둺S7YGVsW@wz @}< r0P5s)OY]}gFPm Gw1Luzϟ[Niew#=>Z,EPuWHmK.G8Ƈ <ኻ7Su&wH0jUPi?k Ǖ }GC 8o9$ 7͇mAۀ|)[|/UZIU.}O }$fD?͙ĝ Q㽋4!1q0h*W;2oo s1Dcv_ڂwg~O> \fhsEZ!98[Dּx'):j_!Zq.q]1[ FruPYvE΂=yBKHԊrH(Wx&5K3]s&5>G v!#k6@D UrĊ>&D^-ڐɊ>hd$:z,+8K}OJ"\Acs'{!4^!yKSX]I}1Qg )޸"iȜ<2LZ2/ճ<١T& ^3A^?VDZ= /xpEorUvntt3 ,ft v$;O7s Hk&rzѝAc6A礵ynȀrG==ݗ$߄堎{pͬlo,/ ?:o!T_;gIQM?ɺɏI%E=_9uǾi+Jk+BpGΣ0W:|EOV-`^np&=<4 ?!oC DN_7>.ɮn1 &$ؽ0xyK?Ch_t$YuYHKN&Q ]Ѽդ3i,Eh<f;·;j'??(x5|R_(kG8-rG)Zar͍'۵^jpڟ2_!x3)nx.4L_iN:y gB!0?3nw߮19ӑ:~ix /)UԶC|9}R0geq!\PpSCsI_07e'/0pKo>}z7*!Z ^ĴL~ɸ03_1XJj-nzQW &i/`ǰq|&xi6/,@RjU}un`^RBw-Ō/\V~ɯ=2E[A {4C%xQWBdtz:{.B4{$/! 썟jcA?[,BC}|oϝNiMg33'.)^6.7%gѠ~^ אp-#h oUΓT=>+ >,ѓհI]܅d1˳Eww)Ԥ _{\TzR]  =IRvtt/KSM[40'46 H{*%u0v7h:b69Q0[z_="\%Qs|#V"߭.}ҍ./Hb?U,cd„eO>r~m2UC#dM.n陸>L֩'ے:fR]gsS7vpϘ{;IͲ((!NNWtOW{,7l]B8ٺ ?p7 psJnXq<\Hܖq\QkCثn:rGJYbvʴ +}=& J>QNZ}vbpy$+{ muCAW4ߙ[{ů^蚓 (K]gܧgw+UX<˃}ӭ୞y: p}Cc'T2BB^OzmikM5|{uzZ԰ؓ`5*hh!ܻa~0y/'^`ܟVa*dG#zLv y.x3BFӲTHrЍRn Nr6N}|m,Iy֖&?6va0Qp?]gPO?'mX/"pEc}#$KHty؟j3M@qi=9Q׈~='&{q^#²?vSI$- JXft]_5&vg)Qn;&v`O_C*LGj'7=rU퉛=Zj.[`xI9oٙl?%v?L%ӏu :$ ~Ԓ{+b:jgoEB?0=Ӹ8qPW챼yoinm NJ>Ip/=Gg<A}@:m9+jApa>*#|`6YG䎭mNX_6KLg:S֨EO8skxW {"4XG̮/Ȟ{).tk_/9|hO}42;<~Tˢ#z's?N#.w)4hB#T|Agp/, @|zJMpONc)"-s #}j_{c\Vyԍ-PPh+6t}M0؎QAaL;Cpf;\7lkRKHjM~ßY;/e. a@垲7d M̴`9. cy}(O<.3+ mX/zL>g c;Am~mZfNh_GlŘ X4is+Ubǩoi\ Fu!˞ptcU!{!+_w8mF9ܦKO迣";=;\#*Vg-!oHoO׵Oعht ^^Zγ*([6?ѼKҵv;w*uռ!8m ʩ 9'rnW- ^^ˆM^ #w..7dZ09}# ^<VPr]ٷ7a_ѣ%q myQOR+! \CV<=JmiZ犠-oT y:6j07SUӽ4/iK/]cX%8 pVn wk?D ;/.ٯSoII=^WKc`>ak48>H9p?!}`E<=f1V۪3'A鏑`^v ZT],m[0w =OGo΀ L\/pꟊoe8p续+CNfJj(צ۬KAմ䳶?݂pN[Zm^SÖCߣ[Or۟묙_9M͹A{ WB'|Əd]Y'6 t]H8.h._'/~ܨ㏂ӫ5C>>b/ݙb)K$t5NkQ[;mFPOf3Au'!#D}'h 3K\(=Y .}k;Oz;-C2ǩ2pB<pK[! d$tY7 f_(4vƷ3/'rp.|w,{}p7Qh8W^%ㅲև[LcJc $@m4tpnWy|0')셤䙏$t&+MNQ]Kd߬JwYJd?\FA h'/ATg߽z?эZo‹D'}Bgl7o&Cu.)+UԮL}k% >@ GʂxU7Xz}j_ݣwIzZWWeehD}1<ٮ\yLɆWPAP^MOA'^whL mmǪA-}e,n]IE 5m=9:|EO헮K蜠E394Q:܈ y`; E^LشP`+%ƺ$G-{DjWʼ!*–ʄ;]`i,{# )SbH)[=v78oeBI?b9bo)D_(x_)yˇk_H6Drͤ҃35I]{/s;]'ƹ*JoU/ atk)y ,|LMOU7*I sFk28Q׼km?}8FحgO?f=dQqu}sz0(wXpЧ|(V,?%,ǬNY0sռ;M#Ypv6`;Nſ`5jy&=Oy±-|2j )- ^npmtJwتkgl}CZe  Yܴz uvPd:oUKI.2_}r'3'/LWC[Am8ÚwAo|uݩf~xe ''^"sAyln_kA3JQّ$E.zL9$G[ʵops/,OŬ%q^ZM{Fyw҇7KZJ0p U&zWy@psZ> gBrѢgo>WAEge_{)T[zzJ4&FmߐHtl4GI.4_vg^1)#㾣f=T{Ȯ{ RgVGr' }H~ިINn7:w&okއƣ]&\zfnkV\0X=wlU]]Cq`n\8Qc_< '$'{0u?rWqy޻7@T'Ir̜,UGjWC-LgX7x 9[tRv_6n,3M]$x< +.N~6^uՄWp~Hi1z@0{4kC dxgZDFy.Q%'ɜ3jRd׶!}9i,|,RWp+xȥ `<]>|w=gj{a4C#;_R\ڸ`8nv̻ &1WDL3ۊ{Z8){Ǩ5DG>KK῅JP+ʚςTO$WPm{1*1ď/$nnݿ/9yK.G_/xltSP4/&edųd_g;Q'y‰Q`:,ɧL@5zV.oYǁ/.XoXv{භ?jvrsɾt_V[q 85M}5OWz1MiEǒ.wňu3. : tuNnNT5XKZ:-W<'3u@]$G]^?k ;n ^޿ٲSwA~VިtB}X/?s\pJ9,=g؄%:Գ\gԆr ɦjǿn?.ALqq@?Zum߀@29b/x];0`oeq$ߖŏ=k{;"ǥ'xXXbCQ]CY貺3Dy~NUcᤀVS6۴1 1 ._ڙ7/ҟCYӪ&?GUh#9YZ!*xT;LVYL>QF- غ@b3 *g{H J.=i0ggܚS/$~P.]qh9n Y_]tE0g̸{plGr~9.5ku9%Ơ;ܿ/Xk7Kɻl;far +/a@["1=`Zw }כۼN?w&w_>u,_u'gĉ^D^z+q0Ql ('b1>:SNq9$/vLfZ,0X\,u˗&oZ^3T3ܮqN˪5pKVo*|3tnsk]!06mHz͙pH[ ^?[zqA~Z[[U j?z|85uוVP[Mysy]{%0>5S[JPs>c%i_A{Q eMPPwU2ܳ.`/xm Rކ P;$j/k{tv= -^]}R]e=uPT> y-ϪrSs`b/./6N^TZ}Rd=ه/:o?y/ygY@=[ͱ tv[JKw2zZ侞n=b]z<_1|,,6nD^74m,zwSIq8;ܮ dـ߭lMc R L,!xSHXCT> QQRT {4䒇n~aĚj[V5@X}rۻi_>gv}łi]+ ?{OW|<ႥǶ{MI)gԒ)= a兎O!gf=NK'L@{RϽu^Z ;V єgIi,AVb ˵PBnY|K?m+Rr4^3tfu\J`)v<] &U,<@XRfD3pT7A}zR^(Ź`U$EFy"Q ̦mYEGU~kۃoOJߴ4A)ʡmZ `.tU>yC }2 nqD/kvϑY]:>/_x ,3ع?뛃f[UV$_2 ČE>eV~9}zӥ㮂=r~0ւs}!X|g"9_{qѥ]z֞9+zA;|c]RV{'2`Ƚp& "a q̅g˶crk=]XARiA33lZLwNƒjo`=hFF|64FVe?!yހϳ~]u7iD<r2QwL~Zk㠾g 7N=O+`ˎ2.o!|?#KVgdtV9}XF|ĄI-~Qdat-Q^ i$}UN Rw39 O$yxy}wMߵVg>4Hy AOhT-ֳKv]{p\lFmuץA Oo3+#ڟ.a1Y+@S|t?RoՆN:܎Ox |ǐ=f߫$A]+Y9yݿqh x5q!i;'] !ʶy5ޥ [`5}K&~,CC*צWzZLp׏bSR/WSog0b|='t$h0̿mar[YN׉!U:!~a?3_-|b1yH|RKk!5}~A!bif+Ϭ7 $uc|8C~D?r~@zٻ<2b,gxo$+d.jO1k 8ysN|!y`>X"kLn^p\} {1QbgI6{兮2nk_ʑr1ʁ_3w(<=jvt`-kX~oPpɅ(pg;ߚwf-gpf=rt4XͯͧCkY/\Y#k<0I !yj7 hLO']av]pa=2b{6散K&pAP$9(=b٫2gw&Zv LJ!b<T{BGZҝv|iqAO?ix*3I(6o@8_:_APq|o35DGΥ(-s-p][ԶATJ^ Ds>)KV=`d<ApB{R ߃C?W{ro&7"{P}_xN\_#ߏPs$J 8ŞVnz߉BpL2C,,O,dOcV1> 4-|U&oD-:bUVuȎspg[B&x<=Ezǭ֔BcgGM \E|CEKQk{ڿ͸$N:4!fvr\&%9}Q!G@Wge_%DQ)P?3F AENOséPp\Fg܂`` ͱԖƝ*vVP+ɧq}8@Us$F8͍u"(~TiDhkWbPiKysW)Í5C@eW U}b*'}zF@4LrʱԎ75~P-m+@l+XI*OD:Mre-Ge-|O8W2m !=v 9Q }xӷXɷE$O(z\^ XeUpfy-T$~}ϥo;Ziͳٜ 'S9(Ҕn`TyFZR -$⢢w ֚m~f'q;yD-0<0mz$ zSp.]yizCs\6v-;x(| ` ml/Qp>4-w@S*PmX1J$ Rؙh20l׵Ӷ`I| 9Aa>]~`hޫ vG[k7_\`Ԯ|$PZIWU\s ?Z..])y\fov2!cwi*-i-@8e/ă훷U,M;9P']6K(;e0hv׍&lӻL@o6;m@1APt`֥/,=V Bu3<@h/'h4o.,nWy.ڂ'[}s|? /dp3jh5uml/ pOj_w ]ˀg̳]A(S^܏RpzM?tٟ=+ T%gh͚?`1)$-} L_Kti_9CᡄOK{D};w0*7v*"sU_{5s "8}hK~o' 36p2&"k0)|Θ=/Oa3Kkɯ{ޠs3g Xz b^6kEG/v5pOwtm&gx}<3R}71y>>8}p' Ā5Wa ogdgIz 4.D.jDMo{GpoaI8M6.xg-x#o1ȓʁhJyI~t7)o3CuUeϬA)9qxp)9t{`x̙WH^X>x~2t6g60~]]1pi(u׶~] *w ?20qK`EUpw&=ևܨz0KW{Z${9W@aG_;wW/P7O+7 H.[-rdq ~.xńǝ3kNiE]9*549mmpF3j<t|:ې_5vꀝ|e߀0T{se;ĂF$ʔt":9 A5+˲|v 5|0?:翚^sA1p.5oe=Q٨4W=#;q\"n VMFxW'9Gt,zmhwݱn+.4s3vAk&vuhN| dϿ`חn]74FƐ$W'9 i*Gz>ru[6@c΍А˝4wF)8o;tm.>'|ɧk @姡]߼֪>~&]F ~˂Pk5w70)E9wK%}ݮLt ~͠U ZʊOS!a\«*{y247=+-кRy8h95ߞ7hm$7õl}J)84x}{nc M/7!7*xk iGٝN9aCTh0 I».J2 H8J zC+I^ @>"(VMt]}Y.'lppԽ`|p3,p^/MSeu/9 "KCXa[1Y 4=e3U[&Z)o3'4<2!~qĕO>{E;`{]e2R=)lZ>Zǜ%>!}UC!ROwl# FsD0ջ:Itmr[ݒ0xo8x]vV=0k3s$ed'L@w(y0ϤMLi`N*ZCCyu;դ_RmI7R=fMݙ ^ཱུMzt*?5 ^,Cq nwӠs>@e~cDo?^r͓;iRf; =oP\K2//zQO/2$:0Td Xzxx xo ޔ9*S! 0 &}dx3ט%uq^;x.+f7'^]E,Šg{={"K&E7-G9+EoҪy#ԥbr Y3k KVX~̚;[x`:[K]ϿQRO^8Ci 1W#;wUɌ̀pmR/@J-}Lk/e/)G I~ P:o=$񽭴 =vB \fFNFN^2or@e +g3>'DVI8!p*Ϩ{ɥ@-]+yqGp{ہw*n'o{IV7#V_} jwr1Vj"aFIz'9t).}pڰ+KL[ c VAdV|: ^&EȞ@mxŻ^3{[CJM9ݠHtKsv3X/:e\ey?+|vn‹~>RjFFyO\vR_&^ZCN7>H}K.m)mdv&haBC Z4>e#6B+C߰oiI:?UB`|(|kRPVY6h 7l*n0A~R6&.l2o-w^kC70'YwBCPs̼DΖ sAxbPÑI?8U< '@_[!7Ie!x3΅ IBK^2Ǜ`0W - %}߿^wV;A7i,f]tw:L?o)>KI(^sZR&^1oDqyeu?rgj.kb1:/zJ7ㆃ/^kuRC\5noy]=J||:K'fUҷv-8:KZuޣw]7L?F+,=l][탵=`E'|5tH7'n{!;o7?:ݿs|S6W 7k}fNVc/x}y'L!m'zf{xmp+oŁW0IrtCd&]p@D0{O:lq9wd>}4sC?'}IޞKk XZ2|8RHxKNzg(x `lvJxw,M}$39Oﹲ:[i C/n>;D꛵+_":t~yrYOO턟ONg]ğnQc s&۲E)kkwuIpG>rLtXm΅$N vM?ަ~+XyYUS'(]?Ԥ/=;J [{Q\~/;%a[^Cޕ/6CI^O>Q=x3zN-!|}F3X%!ӹ:8y@q:{~ү^ݩm{QS (}>(tݑ}rjSH}Ӄ>=7~wLPB6p ʑ5@_ו;:kU#qᄫ{w$niCrO֌Wg1_ a>S!48h>_8vtϖ{QU^ kUsppfW[MBCW:k{@=K-К y* !P-%0GGpCP]v4MM59s ;g?\([ـ)(V0IӳĠTvq̐W51 )c ^ennHOLwX6o,~g[8yS 7rI%~sp WW#I}ج R42ǚ}s }X/ 9!]K>cҭl? *,0qB<^zF9 Fg"ɆDoM@К ` %W`/n'=CZTߑr5Uǟ1uc鮞%'xuɀw@Ϡnz k R#:FLrߢ:.i#bQn90WvH}F$ ^)_?}}d:q̦q!4& FM"p'*&<ǨW*//isv+; <^oe}JȆ{&Xi>U8"͕av5 H]P'v r)}ӿC`,V_$4;P}2@:T٥kN詬P6X+Ea7a<rbGg4ĕfm!;7斘4k/吸ϓ jbR!3]{x۽fm=}'N&j2$ZΔuכ ч^DhIo|3/ߏᏺovY)Dcd- CPW*Ydc#}[1ox}=X}+?:C#{BRQ¼AVzt襊RW:$: Bڷ/~rٗI? Zj ~)M_nJEJ2$}NexԀ۝I}6 6S&믦)I ew=a?_+ Zrx#bm'wx+Yb/(բG/'+"mOSSǹEZ?6s{3,\0P-- t[K#'n`'˧ NI VSgAX2ev;.aC &VBԩ5+c!?~DMU>ޥ԰pNc[[$>z CgFrz*]Kdކq&J5]y[ PizZޗ=뫵u uKK EnOS2 eUSn f`Ndߢȡ={]:+[]RX/#n45|$^NP?VSE `/=?C{|5C Ҽa('6 "{H(Հa³F&yq#Gst#8ow؀?=_ ~}kJp9.+ =|",:L?W=ξ׋u9A4eoɓ*ŮcAsBEoeRN<YoKA~9&,&Uзs>S2hU0h]w[ Ed{|D7{i qAGw;ʫ>NOGt'4ۭCFC,2 u@hmG;KO@oW!V "j5;)$x*+=gTA['"HQu nObۦw$.{Br Lj:FZYhܒMy™7nm%}ځ8::|3F~~ޏ [87.XxkR9Cz- ݝstY1-89y h gW %||u`?IhZ<5]۝C`VtSGG &_y U{‰o@S|P_W=BSZ򳮠o"D)PR4kբށ4ۅV+@{kū%`&d&UR&g,J[\UP]1C!473 &xuJFﮘ.7 !tיکExjx+؞v27xv$|)W`U xY^dH\@oٗ^v>]U}Sx3S3S p1te P#v>< ٵw wK4[ O׺oHȋbz=kh ʳU{Km ԍ9קϯR]\B3=/Vs>ݒ0\}̮[ndG'0 J=0@I #|ƌ_Z:!R>G ]Nr&?>{t!Ml,7&~েfl]X 'C I?u aeKnn'H^]ŸSB!,,G ɹI>/EAExyA5$ {R?垦ɞYb]ĆB45: 1}ⶣJ^ OuXk;r!q/Al7)_& 5 z|  ߊ.]Ow,HK^8 !P>&/l|3 {'|om[N!ٿ՘;qTxv|C 8p,,W0< ˥zA=?yǀ#hDm}Zc YӖٕttr{зL C^ 6&c.śy1ή tÄgmSyɂAD7||bދăo'!`.^3}4,RS!4'cݏM QSsnƔ,} ޼HiyQ%`p&U^կŽ FOisZ nSG}YݚnĬUǣUW| z^6]fF2?I?"bn}^Y"H%jџF6kk.Y6Z3輖acO5ybsR<057ޠn4taz.V3Aݥ7#1e5JDsWt*}Dfv{O 0 ܷ*[g'A0czed~Zu߿/伲m<ĝ-\L?{U/\W &Tcx0G:jƓ`?*:w_7ewj y=>>:wEk&U_6P+UJ[ۏkEH.hSsAU''K~15pS6') 7m0O`nfA~I}":rKz>hJ?+i.韮_jb&}D33/yT n'De9;m'vOYGmK'w&`HjgA-N mjT/gd|/kb:t^al^fHk]`ԝ!6,{^P0ng p;Gj!4 IH64 ؕjzVvA`MN! ;V$Tԃv#! +fB4#/8|n}g\r l{p7tMEc~ Q?ּa z1'+nxq8c򘻻kuV_rF$x{m؄ߺ/ xx28g;uu[wϘ IM!Q]c{kxBj:9*FA/ob\3ˇh}m;|5S{f }`K?SLu]A5#D}0EΏ Y0ޝC`Q 'xs^zkMYR>u,GS-fQ~'޵Kac6x~?7-X!:zAשM '8;ѿ }'$UD{?ݬ/UI `>s=X| Tf0mے|J6aO'̩&Z: 5_?.&<ڸAO@qd.F d!'5 `.`=fleҊ`]͜"0`$䀶)Np|E-*bXoH4m޼qh\C0bO݃`WM Xi0v?2"멫7#Qbpu(Q#>=zP̠ilRpv%~S7=!>9ΒN+:+@_xT& pu`ߞ݆薩tH>Ԃlq![w6) ӪStݾu2*JW>W:KtQOk G[X֥Dss}uDL||z_=i>ss .Ŀs:1*)|xTpFIHx,GϗAߤ{ПnmǁejAF`lAoK⑾ֿߣNb inm׆@g?ڛ`eg~ c%`ǘS?`μL n 3CѹA/,޺OFI3CrIwe&@H6IЋ:j9GoBa ^K#ڍ`czV4oCrwI081mݐLϡ{=c]S9 nΩ!!e_ e@x{yM95O0_.oj6_A GC[@/|ѨY4<{+ ԏ&E{|B׿󩵷ٳHN3삻B _AᷭvF?<(@ 5dg@W1 ⟈&q,_ZO{Zr:2d v^*ď5o{C4K:֊@Jp^_ Ϊch)З`Ƴ030#`,W`͵qrR=/'#xqЅ&>恺SԂoZ߯ݣtx:?<e<)΀jQ*(Τzy f&iAM_]*ۛ ;,>O,Bp[>  3j;rftyqDgrL} x&4gl^*RGmgb.]ZrǞma`\Ɏ ՚(sE'A֤1XѮ]C˒W JpbzE@L:MIT^jx 1}S|{-h#Jz lz37DӺK ?nizaP7{mwmAiZ_!ȵy;jA3/bzztU7d1X I~ $#|SO|}km#:WU ~<?i'n=yfI<4CiX/}@YWDJ: 8+W \bܯ7O@wD+ _YNm]?LJ8Hd}ge[{jF75)j0>Wԙ9-/!&̮—7UcBt4vu~{"Dp͹5 5N XZqp -~Ye0w$Y|]ݙ[!X쩿Ηڕ5$uI`cSH&~9|A9I }>2o?uܹ}YOFynK1(ߓU3 ?Z?ĩlqDMNI=눎7A?3. *90P 7b!55nH v\ ~_3S # %Llr‟^j]p hȃ@ʅQ›uieA75`w Wg@k9v7F^__mzk?(%uEsݲ\q@/2I_8Ik#vk7]@MsD$`wG(m GtOг]m :>VX0eiӳQ?gsfXw\Լ@? hVjsiM6zXv˜00w6ɂ[@='LE^]9Vp0.iVW1 _u^qI +䥎g%CoKB;;I'BOļ4n-yD SM5jiY^.6<~KYxG5ŋ@0ۤt ϯui׼m`/eRp-ڭ]Tfajj_:~T50twϺ N_X{ؚz=o9kҿVW%rl uL3"֞`;}=mhE#G e%ԫ> ].~kBf\y ߷5)#c"K#}]4*FuԿQT 0N}81;D ,_s"PHJo[Ht~Y#jOy?9ww9WXCp>{Oz߽tvqia_Z &+SXt@pr 0p& ^>KEoY#fULki86-o^~Om^% ݷm3d,;n!XA_vi'H2qHwʮ_(}=j'&K{޷ss˝C}FCbW@t$Ր ήU/>{F1b]J쀠LÝwK'A{|xځ{y;Nk}.z_ ϞԳ`wȍ#|֠xc^:#z1/P> [ϩZfOO8Q_6A/-`hl|SzW[xgж[44}| M`n>;`>X;Q@/l|4T0SwyKUu/5-å_f16fqmLW&@i9cy`iا8o8o6?҃5A ``=Eu_O⿛d&_IfO-uKIۻ_,{JI伻bVjAJ?Kfkxܚ~! jHT$uU\ f-r(v=KGh\b "}ր9G=‹/  |@7Y{cWaK\nR_e%%>J}*޾ Xk:jC8զM06)0&& ))4M>5kJ& )U4MMŹfs-Z(̵e*f? 5166U4^_j"5)MK*fi\jhL)U0?5 S3ESrŹrŹrŹrŹRESa)c3E56W4A!I,7R#ccfSx&r3#<4#Y(7Px([ZHi,3+<455KM@#,͍e23scsq2!SY[^OfaRfd9鿏qZſg(.5&fq-Imai*W̕ˍLjfa+>&r 7>2}R^&dijdm*'3L2VfRe$r-̤斦ה;2bWɱI&:JU^{ONK^Yʮ[zE̔IJe4e assf/i+ZXn)Z(TjLk,uv K3`&f$Ria.5L{%)6 il[j%h̄4IK&e. n{qi "z٫hMHe8 gIhn&C9)SY}Hd*LNּWX-z̰_cR^"YB`4LSG$򏉹{sM7)tmפkzs\O;~٩msǏ}elN1Oo,ݗs sssX}}/y=~k_LqsXqbsCk%sK[}sŽkY;~?8y.ju-Xµ[x@~}7p ,7㝌:\ϼKn>Uw_ ׂMk}7G$\\[f^e#̳5> ͮhw-~w 7`9xW 8>~#oM|> qk,gz`xTf?צ%LYvRֽ3e] ow1s󮄞੭hwv30 .xή-yn|oOQnJYƮ&un%^?̘2v_ֳֵuE}> .IYѹ<|Ͻ72,}p~e}54sˁw Xy?o㼺>Aucc?++yR] [2o60v0\wBGɃМ]σ_[Aw+p4J?mJYǵWscRXֱ{3>3vѷ] V87>Uaހq=<xU?;GSmg++S֏_.=ԉ{f`1eqv8:7UJ}#a;sk>l ߲2 t\ \)[S֓w0wph^ RCFx O0|kMȽC)Q0Wu/~od]mwyp~>Z7*{RFֻ>/%]y nWݽύ)۾;s cls`1^࿓qq<] VqX})ٚm#0SZ~G}C#0\K[4 X[w1&tMi5א>}wJnwO'7Ǡ#+*hqSx4@ʔ \wÃ8cRӛ*x>~w{ƺwxYgt6X ͧ{_{}8n&ZI mV ])k?quwivz~<1ךc[Gx2'硔s[s0xsOOͣ>oq5죚RE[~uucOp0n1#<3>l}źSߛG> :4Yra"ovHo= |}ʶLkcШFRM5ofSڔ}|QY& 0t5{c3m\{0eZkmoKYynn{)VA{5sco5e#pX1}}WyY׺oΡZ#?c;S;S³28}8VOG97& ԭnNqP5?S|(}bOp]Pv7Ҕ}ʍ)e?kRkS{k}71} @>C?>w6p^?FI9+&xx[q )׸KRnoX@{he%.㾏\{ e߳4X:֐~?P >]i>rR7SC|5 hnm  IپZGeN=\QVF8~,: 0/vR\\8oliNA%)e6jìZcXr 臭|ܒ-o.RK̇nHyCZrq#MK:ޚYt<5euOʶvC9Lt%x{ k<pZXrD?b妔N9GSC :(Gwʡ5&έOe|C!xow1N/dMA92lw4@7r7ߐrߘ.geޠ5XkN9wW\k[rz[~VNJse)٬My_o=oLY_ւXoT.ͫK9)enV26_@hק\R/Vq_f`zhXc5+dnfdSq^R nd{SƗ\OsR֧Kݙf`eʹ䇀s%׍}+#pʄ{>k{뚔cw\J9j/ץN5-IySbS"=Rç'kY2gXkS̭֓5 4.t}o4-Ux?<'88qJ3c3ˠ}E5[S}4\(z9 )״Wt#6Te5$}kށq)cפ\oXw IF>6;h`~W X3B_`zq1#4R೾Mݐr})j}\<4u)7 >:0#Id).Myz'{>.\\'t]=6wY)+kRFs)_kR36ֵG 70P]09\q/x%f淖a\i qd)۵R%W2F)'5lKW5̛䉽gj2&׭,Mxfڔק+mjX撔6x,Vc[cS5IVI>PdϺT|oH۝g>p\9"(nO94קWfNM͵ݿa}u{s?KR%*hq}}y?XYW|H6)et{}T{͹gSg7Aop2nzק\=^7rxuM滀=~kܽnL.,ք^sڇSd-q_ڔ[ڔf#)|M{/d=dt1#KwקÙ;ZuC}jgw`v[u֦\_~vkF]07c25kS+=TpJVg=!ec=CRnJYL&lQ[J9^r m%)#w3cc{W?QOg.[qӹȽîIvy>NAK{A1x:xj}Ԛ})]2NSͫŭ)g_wCŜݟ~ZmHF>rl h-)~-OX ]U#<7VL.ݞrxs/7,? ]KV?}=* )lSOK*7>XrOv%5%)[3Xʔ1U);Rֿ)ns%)9.^\cMՃC7L ^8k;+{`Iuw=Uvo;vmwy={۾};w{o*;>gy ՞(D'3?Q2O{<ߓ{-{h[ҧwZhܱc噏;vo}g>G>g>}qs>sO}~aiӖ s9TrW>}sRa>l㙹Oܧe5.gslssCg>/}:$x: W1_;ǠYqߏ}_9>Bws\g0`t 8WA_۶ߘ\_>S4|O~1IEq>}OW>_K_v7s׶v =h<~&wZ瞋Kh4me(xw]hwX z}7pWq/w:4tr ~: _/c,^ŏr}y: c42tx^~XwO*m>g3g [f*d9pZ7 9 ϸ<)}~@K?QpWs8|1>hO@&>YhhZ ?c\6/G ? \?xfG؋{C>[ kOG4Tة'4?` [T.{;:ƺa'7%kMwR!!S:8jk),Gx^ LY߂RCy2>p=)o#|0p̘{/;K ޅL= mHWm2R#4^\{a6|dgg.<B۠Tho^[3G/n O1mX߮1>iꇖ? 5>Fa# 8U:>e߯2 t> goԘY8] Q w0*`~z>Oqٔ}e(lඟ{o߁1=κ]6q *=_?C-gRWbݣ#uy`؋Eڡυ/EOAɡ!a&-dθ MOAuix4 ;tcLv= 9iOË3pX 3Q挏1f[c=w$}\^#x,Oc4eag C>Bo:S&?mSn C|9,*7= b+-uo/&a?t>OYh|a8um^AאŨTj̻y|Aw88O)6e6~ 2k ֐!- ;Khr8¾<} 9E멐H7u .]*?@WٕrL8*t5lOAK+d)e9˸M)ۇ3i#-!۰⧹?lA8f}4;|s؁Oas3ηǷa?8ކq,5_a3b'~i~?k!;Mأc:* |lqg+\ GiǵСOow2f#da'6` Ꮷ5hґ <GLڽQVy=n}hzZ)I=wA7WXwz~ZQKx9M 4{"Y'ɔ1pϹ~ ^@c^<>g;cڰ£|D1CV3gW'px^bI;gv"+_߆g؍'Xctֿq˽ON`{M=h48GO2.ꅔl> ݂8?gg7> 15Z?t~ zL?sqhrܞwؖ]sǸ? '#1}Z6 K[x.a{CffR68'|]kw؇=|< ڗ>h9|GexF\:r BJ3pExUp> M'R|=qer p=? !!îm1'oc1Bw#ip X?:R+ tgu 6SƒW;[Cf쩔jGLxSEnH;:r{Tf9 oʵ1mw_"3nYBNOמ 7lhŵ6}3~覿:cB6Cm`?H-8qI 5Xgʾ]Ha 绁1h5\3DyMt}x''}ƀ=(E';`oƵKSO{7uǩцe5hs t [2][;Sk=+hg< >\6_Oyo-fC;x])@ ̹~ ̆]}C?^N>=̵BBwЁ!%rވCֲ^7|rǀ3hc5^!\@߰ǿ2_^!KIp x_? >a'C'Kܯ%p Bg.,I\D 95#hOӏVf@Q5 8,w[X#t$| "8b/ow ]Y`}cQrsˡ痁xgo9y⾐ih\?,G?h)/WxqLZhhll6f= yYqϤ> Oa{ 9y7:Y3ts$d'y†}C0'q+8G#f 7yCQ*q;0&da~ xcC>vA۷=o;b݆A;݃+8$F|6>ȫ)lE-$NԵ.EysEnqG6 NA'+9 >*D{5qnc>{RORCH9 K7 _єkSό+|}y1M~5)'\7 ;'0r![O̳ƽۀS,\!` = ]=hI ]~i/֜vf]{R͘[EL? ZSovy \KF;|]yp<ĽGW9y콞r!tD{2u)t{&i9ǹ.h;ѕT5OǺ?6Aa`O|t" c/.Qk -|ǁy<L_Iy_rsއ 6&{~5S*Z?Z<~GxLC{cw08Cžcg͔))ħ#6{oϣv(#/u2w): x|E¹+p ~zoRHl5?YíjZ>孞VӶ]ـzΧGe>{R|5}j]EZz4O8%˵`5Z|tg*׭ZxͧC}=~:gjzķ羓&?jiEzsֲj^=Ypzx֒݅Nz| 5ngjߵZZ,F|rX]o>{ZTPO{׮%Gc-=|Po|-5aCdՓZ63Lޜ'^\|Soz]s䴞m]գk5/jl5հֲkbd]eֻ<3th2\z-ҷZk5^˯ZwW۷' ZK&ٞj_S74eT=[QOj7כj`=·Bךk!ZԃLUB-_V==}!PkZkճݵZz-Zg+ ]|rZO'wZh^}zz2PhRF/N|r<7g}d|z7UjѢZޫP-W=W5._]gk}jzt{>h[/u|䯖ślg-PP=_?W9~§<նZ-%srRtbkhS}O-j;^OVOu>j~-٫Su=YZr=Mj}>~T^ }D=9ֵh^K>䥞ҿzP W-e#كZ<]7ӭZ<NZ8ԲA஦iΧN]Kwk٨xTM|[-y_[Jh/[Hzֽ|UZ^Oҏ7>%kK5>txXjχc7|~ϷUz=u'^KZjRZ%狵X=_Kjw!Q=~16TӸ^ ]-|jX=ƽՃ>PC5 ͷ~8Yzr4jԓzxcj|b֒хֺ|K-٫ǗّlX- jyGzx.'Χ7 %bj=WK?g-=3hO5Zlk WSlu|I=Åf>3\ٓ`j;RIZ{%xY/'|B=%Oѩzzvv!zעk-%gUv|\S\[r]Aͧ+8|+cm߫+Z^%2p6o#Ͽ_sg+ Y^M~g<~Aǝ_0ՊtYO=ߘ]RC:7w;؎ { ׼ʱm#$}p"?h\$^A^lͥ6&^¾WBGP_۹ c+ ߋ\-xr0^[y/8 pF->X?ZϷ~A.߯ߏXŏ]~9blW:z?^Pװ]-kt5xrjb㿍~lU#^^KYXV~?Hw=K~J7ݿWovРZn6ПL|/y{Js3^lijhk^?wstwkvsA9.0azvw*1's~qz>ZE$VB|.b~jVֺR__,KHVW|0S=[̺W3. ^8/x^YZW ߕݕڸ|,$_Z=ٺ>^ϗ,B:-ӕ{s-X͵ǟ_ l^dos^:p\ Ů,bJluc'+B<^] b^ |bx{|Y]ϙOÕ{|Z[ |W+_Y,4fY /擉tk>]X/]|Bh:{jq5x])c>l1cOB0,_\)bdJN=|kJt{0,>bdJaX] W'beh12tx>^:^.+ѫ~{/~n1:.C=9}?ត^erKbpR#˕cc1=_Wc瓏j|c{߯bܕJy/|ZybmB.Fç"_Wk{b]XhJ}]J6r1ŬYvvJxX~__^|,+' ͻX]]>'R}g1^\}~Y.B6xrWOޮ^ ݯT{c16?/4|<\켋ՁQ}1T^aW3 g-+;WW2n^[H+W bh!}_:,Fu~1-baRb~^Z=ͅDRݫ񋑝' p>?bt7u~Yq:+ۿJ9+eRy_Z㾻k U::zcjs+j uii՘7v!v<b \|z$]γ+ᕌWk+r.̿d?DڌZN5T;,Mr=X5i% \j'.Wn{YVʃr U?@ܫ]~jSsk8JpJ8A-XWM'׬z2jT/F +TwqTmp}>W}n+iriZ6n>]թ~|%ձdWZ6&UZui*gK*ٿJT[+ x1VYCqӥݓ%/P^P/cnPkН抱׮j_ǪՋO`6fi_wt\ o{=:+aa՗Zz&ݔz4oU]%zP42SͿsp78Oօt16wZ}Q1|1Eu59zM۪֨^\,*ﯖL|cy_%_η⻼I\WOPt9=]8o5cj{AJPQu,Z+mq-OTzr\=?W#5hU+֕[s SorM&_|,s~9H?k 7Wo-X]^rO.bZRX̟ \bx_9~vy)ǏW\q<0T]^bϚVҥҞTu1yH!lC|΅UT|;ն! Z{•𭞳*j{|c||,v_J jU/Hn3~"֏9k.J^jH]/櫄uH*T[?VJjK+WҫZ?j \e7i1ߞzbjAYWZj극BypW֟0VIj;_Cuuv\uUTSZoAd?c;|WZcB1ޕU׭jͽPG[LR//K *UޕO%U*mRwڃ]]ϴؿJo:7[믞Ectb>;\m#F5̿j]ϧWzCu`o2]ﶪq5ʽðMKSƻ_EuLʿJWҕZ ŬU/&[Qvj:ҥJR=O=٬g-z!վ?x[M#ulc5֛oLlU˿rZ BUUKerjj{W֕׸GPCjm>q_oO[Si+Bj%~ >_-}li7xkj=cL|]Z{Pg+iZ{=JȟzkumҟT|4\V^_[TTI_+׮by"UUlPG ?<#똚ccw݉:Ҫby/z.8vm1υQ\y=:ì;qsq)vީ.= xWF~L+/AbŸ!}7]bNjct{ <&+~OCQf9 =fYqIMF1kcC_c>~£\LX{y3[1+rM>/5]p|O8=GbiWtc~h~Kg } !?ACnc_?Cq}[ؗ{ w9F'г1w`?ű~8r(]CQ0~ÞgAo r?ڝ3qF.wywRd'Kv_$1 g W1} #\}ڧ=aq ~$r7^h_ql >‡~MWA;ȭ^ڇ}܏]Q8<39:#?A08Ğ1]AON=~gC;g5#؇Kwޔ7@?{Ǵc=> ciAqǎw#;؟9] g4*_8?|~<~qk_r5<%mPce\Se~dB=ʺ~{syϜ '|^<I&ѯ8<7?ޏ`& n<7<#-qqS?$B~P~MBǁ,O1O=zr}ЃS#=MYz4ƘcucKr>#1=s_es 7V$zxsq8o|K0|"ȱ@?;e;s_1,|: F'ͷ{ 8f?Aac{?A)>hgwF c>hD: ?%8~SO::C}~OaOqgAz|!88cI?%~<}:An?ƩCp?8/O⁞ A|nqz'yl(x LC؋ ڃLNq9c>y}V?>IϤ ף>!K%5"C:zyEog9Y~j_"7O!'@ΟERr1< }{{Q? cόqcc3F. Kcd/U<&:I?|݃w#5{;Ơ@>1(Ns}W#;<}!?Cer7dD$z;iKз:*WsAt 9 )3?ţm4 _L(Wг<΁)8q09)῭i?z4<{x1yNxG?(r?WAV8|1(O摧^u(wͯ@OEy]KّwuJܯ=/ƥwGyu4N5\cS/naNA_pX9 ^3x"ځakj }p?++֋ tokq曡4>!o;8w ;^aO770ƃڍ~(aa~iyF2Wy9IVƝG'XwX9b=oGσ?|#9rJ:^dޱOѣȻ9&@у_+M"ofAG}>ESz k;\9^Ѻrg]Q2%\wq%aKk ;s?ͼIS>mܾ0űuatoF:̸F3{qxX? ;Xt6uf~`ݿ"o!7{g#GۺvVz p~]b}q7 G^GgП>z;\2TG֋/< z\{׬sDѧSqd4VAd:@GrOg8vU; gwVy8|`8xZ:pYGGOK 8{_q_]nz=1Da\WQ^xr^1u sr5}K;y@WMYO>/z_oCAuǰ?+Kh˼-I΢8o}fF(146u}C}'9N?3>g^F׌HBNca<hEz;ܞNksI#k/=c??+Y9CadO ;hyu뭟j+C%j=;bc_/|r|Osݼa]r<}r3]C??ݎ5#xƉ(f :qY_eqp?8>72:gfǡ:w:Lopvʸzy3gq~`zuy.S re\*?sDZ[=qa:σ}K1U.(omCG[pB臭JgG9Chǝ>~eK}F֛{O{;~8z1 zS Gã?q3sBG~{kgP;>zx}k}~jܗ¾aUy`?Z<ex퇸p;b1!?MM^q}c⯼/g_W?p=|G/}56} sȟ~<{_ړu]֧CO|s |Er_pCg//?|s=LSu0zX޺a1<Cȝ<|m@;?ada:~r]89?ggFcaޅȍu+7h:y~?ϬOyD?)?}qC&S;tJ>Ov;a>n؏Nq|ؓ33~z g'BItNA 1`_{~ 9~uG/yx̯Ʊk<{s3;[ihX?L*wĸľGG=\ ![} 8^.Ǝ=iKOy }後q8{ɸ#^3hWݷ2~3΀}A)pq[[t>ayP b?Wuڇ/Oe|z[簎TIe=<+a hȏ}'OkߌŞN.r-c~#Z3O z /Y -U%(e?O'cuL[_r<ʇm ;"/ πP\ӃX8s]ȉ~t%?>~{ejO, goc<~gxqg>koz<Eލ ("u~qK<}|$>gd 4rzNwu_?rP@>OtzC'yQF.?)?b7=c9.Y'n}:CW)(a#K(cYuqm~ xgþr?}5.g]RNqqg@c}7p0Mq޼c|˺]>禽9<t+e_:u v3}?}GM2rm/m?Nh;KYDrSMOۗa/=8S~8͏G8_\C&1}ChB3gwezN㧔{J$of=y+f\S_r:uLy/o_WOq}@3̭gGmk'1|Q:wW k_u=,t?{qǐA>; |n]pϋǡ1(v_~uDg}7hW>}ihch8*1|Y>w̓- s~#ar3O!?=y1cw#wȅusMgsҟ\Ο>r9S%8~ܑ~}L;wv$GN7_eva|4.nAt>|W~T9g _<ܷ 6zv$t/π__z ==y>}gn?rWc_,ϣYo~>l>)6]7O|y^_znO};t z'v:\)kwW~=p@K~zI;܃a4>Yw`P?I3X-aFnO}}wLgrb>hO?z}/7M_OC|~}<1(w|swq>[{+rFǰK%`{ы\N 8>]~^}NMyYwyރUh{}}o?/}>3:։#=^e?%ة,x>}^tv} ?mg8su>֧SuSȭ7_v v|GϾ;7~g9|A߇ (W~.?|iꓥ1`}}χR_&~Dߦ,NzGSן=XwC|NibzkqںM7q$|b:^;?hf>;лP{wVFG-|e9߀ҳzP}}Oyv癕j}p[>?l)o{:/O#'NXwY'c>ls=o1;_:qŸ8d<羰-hpi$C۾|o}Aco L0o/ty@}_z!>g>Y/>>>rOoƑ [(?>ck7}ߨ]Z0=?_Ÿ97}/(+?1},cWȑoʐS]m\{Bޓ~!^ x|ЅNJ߾p(߸t[1}$ϿX45u?C?_$@Szz/;>16zyq~Wiܟ8 }}z%_,x5೟O9f[dzx%.XT{m>Qe} y9 ϵNQ~ pP{/Bk zf^ic9z~GfO@gXĵ#+ȭv~~H' |n>yy} Cmi{$wV̛o7C#)|"ConH!mdX{."oS~)߳4\[kw| p_,Y@j'3sU?ۏݱf_c/ m=`?>oa?wp=8]񽶾oW\}5=&˸/|}L˕M8"%sb_|9N#o>`T~ }qc{$g1o7O9rU~* i7Cֱkeur|D5o qu3#?El}9}55~7/{xyeOS.u{毽i=x>+m]xf{Whf}φ pC0zjՋyй Е{gSK`P'g=)Q9s>G{Gܿ}hOO\O0r{羧̨+{ȿ}a~|9i2Vgv?>//:<ɕc|'c0 잹'穹O+st}>ý]s~zJRϾ$cS#ynsqsve\<~dspkLk5 ϱucC \^ak{ ݱ_ި@A3|ggh= x9gAtBׁ$3d?tyr OOo 1ahe`: 8;˼Wvehvb9uuIΝAz38?z%C*4&RIK 삦q' SMh4L1k,19\rG'uyƌ@RF^+)obݘo{_!S!5·yqǁDʶUh0??&\; w,sȽ^'s 9d s1#qxcǰ]$|8|~5[oXKfؠ'7 |Agb 6q=~:2CٔC(͚a3Os(9lo'k82q{52ٔ}ǀ m%hHavyǹo8xŹXQx1?ס?C禡uo7 xBgq]x0GuSw5aܩ}3gz2)|.seqTҟ_zqϓ):=gZ*h=#|I;a1BW ǡ]8y_ua1aXcpC)Ǜ#zqCnh6Bބ_!l1k3ν|Y1`|37 _v5>;{gɊOϸ-dqw1)ǧŔm|34"ޛ_7A?4Vg9o\8O4%`>Ϝk//§ `) Tמ)ƀ̖U`d^֊s_!!'RawaLY΁cp ~-郎2`6|!ƅ[H> ) >ASη;`m}t帀3dXƹy8!36ƞ8w5N9;l9^qg9œ]~qƇG퇶C5/8> dGR?U{XմbvlqVmE:4}~'Up zk fa)ɋsb=cgs?;Z:B@Br~炟1_M.yH!`9r6!?:WqSUgϳJYR5Kv(e]u` ڎa֗`}6h>O9v12胬g"`x51D2Sb~Y? ,=r=CXךkyH9.qa/{&zySZ'~{b}?r؞HV Z>~+S}=?qϸ+$` cM7lֻ srmRFHmTʾ0ߏ'?ekw?.OOu})wOq5ơc6eg r(ƽ ,;YKBY~|_K2C*rh'>> }gSޗ8K}|OKbt G='Xkv\s!K!sdk~o l8fcњX RE9kƨ_fC#`;{z2<{s.x[^? kOӧ.Lv<ߵ;ƐWs&81/?㭬~"ix{C SD_nMp|bg+x`I`> 8B^Kٗ {qMwX{\= )ׂ?,1EνQq+h s'|?<S}86Lz*^XZ5Jyy \*Ka~'e^O>ɼ甸Ǹ< p ~'$c+$h? on(x݆n10eq:AX/|wS1&4t^F l\ʵa`K9xLC7\+晄nSXGyw7wrm׼|u8[JY0Ƈ8z !Fӛ8oZږK㜶':iI|;r}1kI9ϩ\ȘCi0t|Ϥ x. l3c|34?ig}:Sv饔AOx~~sI 8f }5,s='|qR*΍h)7pXutg뵔m<>qLzT/s{CW=yp-l$0|:e>!/×笗Fʶ;`RMf6zFO}!!OK)Y?M* <'ڶq9us))WX|1(dR9f9XR-_as?͸N1abs"320rr|f7;S8SAߠOWz,hʱSS > +:r)l+=M9ǝIys0~܆=)ws7xYKqyKepf^)e`Aku\J .1&d5b|gs$Rk)g) k$H} ǀ4t{\Of=녔C\ >M(rLw:}kܗroS͹/SڙqZ`s!Gmw GRO3t|<[9םrsϺ3rI&} \<@#TJֵd=;>a~;g7 oty*~#{S >|!ehʽz*Nac.?|#k[-:y m3)!klGF>%~[KPv{.tɔsיc_c9 ^O)%^JzSG٠ݟӫ:<{O޸W:v~Ӷ}37vlf܎2w? };m1o+Vmb\K'otP̳8cc.?m+<\Vmʼ7slο(_|wŽ-U[gt5#W.[.|f_o't4r_ۑ=s_7x.[xFq;momVb'O [n*m/~= wec?*^WξbNų6,/Y \;R̻mUӬó>^\qMߝ{qVyوaX߮Gx6"; *ݎ? !|+uP']ߝm'ܷ~ws#sN3xtt-mϘgA o0Ove-Dڡ+&1.bޮx<ځ]R۝i'poسnR{ y3.K~ovļ+.+g_Ձ|>_ yP/m<ɺk{Gaq?va.Mm ?O'D׊y[o+v󅜯k6Ӆ|lENv?ݍ\Vрz׆|tsG?|!bAл) ;NgK<<'/Y܇FN_~訞tvGw'!跗!G--Q;m}SWgCg =c+vt+턞]kvys;.[] ܻGc63o|MȵIܹSM؁]Jܲ{M凊O jzv?:YV.1|D>slNo#n@t[̧7"حF$v }ӂy+|v#؁]Mܺ:_cnd׿qNqNF?v*vfX9iD޷'}y:ƹ;z}mcf;ҫT{  FIa#8x[g~c/zԾA7rԍ{TS/v؁Nх>n!܄tCCxy6$ԏoFocg[ǝsчx\^' ])X<2ox:'F*i?jĞU^ЋMݶsM\Ҋlaޭ/tЉ\X?iOݍ=؉TSsm}c[ڵG̿;۩@.w_wugf!J:d}e=wa7i?>N+Qșy&e=;泝Xu塁c'~G6C5ߵ 9v5W\ݸؼ\vGzkOawK< =@I^Cg;=Z頎61~nq~j{vr;_؁}(שCށ}چܕzk.Qް;ɿ=WϝӻCWoG6@vc3z7|I~ұ?oNmOƷ:<[_H>QqU`fPF|z#zZhNwq]I}kJgܪ.;K>ybV̷8#mFFN~[GkZGnj+q]I?ׁZ/>f/]gwFހIkz؎}v_[o㿁>m1ߊ1hmLn `3N2֋;W<"m֏g 9kĞwb6c}N: 5W{OoYSˇSv"O[l|ǒB.:v:udev}.vfYV.̳4B~WcpluW`zSve;ο{/&E%n.pO۰'߈o36oئޘoAG _hEo;7y终6m7V(M;ǽsqS~qf}#M +N 9®`_3X_Xk>ᾄu% =4@OmCOpv c7roW0gB.跇:Nq~غM.fp0>*!߱:nn =7^/5or`~ڍΣw]?[֣\6S>#ͺ]tp??Fgy zf9uE td&N~4wS,ǿ+xAWay-v<ϾƁ#wKWa-ϛYG~_1 ';/lB^s E.WޗobWF[wVۈ{whOcǬC@va}<g;#FB[܉?ެ~|jF~6#;?Vw)`CA{kkSe=57_۪៍s\ ݺgs[w{`]j4.Xg: -c^`:t/>Y6>{`?;v?g!G[}yGjB֠?mv}x/WnƾF܎4C.uS!ܭ?`FǸcF|:Gwgg7tj6>fJ~vK̯Зf5Зri=z~&}_pqXop't.a~x~=ۉ+gnEN]wz \]m`c>#wFI ]v0Oڃ_mDNDޭ?ٗ?I<_ZkTXduXռ&┍Ur)ye_}.igt߼orn]}/wC=֛?:yq/o.!ma9#g켫m޽97^~vMj߀I7~-M9hŖS}^i»'p7~ǟ!w ~~7|\F(-}=yqAa$یs&[& ݦBV[ڰ?W&8}jL>Q6wwO|{> ݭg[?}}.Rkx/݂<['nylp|8Һr>gۭ7X%췱'b׶ wlo.S0/E㾐1g3γ?оmϛ'}>*j|ZXg7u:WiއuA}?[&~Nݵ.?{8_F/v7y~ne].s^[N\,tp?uyN)GnsOso0v'_D}w)?oh?>}=z}lBN~vB_L;{Wو/5_vGSn}uq ~y@N[sωqJnkۉۧ];sZo~ /ͺ{g97o/X2F>֏_I~i{rTK~4kyp֥ny ; =5 [܇߉/-Kks|m)d&h>Nz؅?3?G{=h`WS*ʿk}xvycvx}Q~vk쏲o'q>7wnFN+1Fǜoǎh_hىEwO=4r~[џMȧn]vO{Y wO_ڿa8:}XS}wַԟ-/Ĵs˭Ol&#M~}x+?gF~a]$}2yMC}\NcZ~5>~6`}ؗ&#D7}>}*Nu.+|j~X9mBЧą-+gkϙ[wϚw`wwZpqs?c߾'_μ[[k~g#q⹭uf6n"#? 8z>ktO-?gp:t4v>M9'c.%{;֏o@NOc-o!gy:s>>ԙomywK|/Ͻ4mvb7 v_W݃~׸: ☝'oGσO; |nzu7~_c} h} χZ? i}ֺ,l@1-oߥY3Zwr!6Bn&x#.~w^G ] |Ɲ@z'>.[~E߇a?p㌣Њ|uyi`yvcmڠg=Q;ֈ_/r<Y&a-yq؟ln僬{-sn&is5= 7Zs#ۅ_݇]4OU;>^7>z{ϛvq>gr?_^}M}(o YwXԏ| e}^vF~ձhp*&'d>hߛg`}|/FySOOC|~}griP@7}6]~ou:L M<7"}} ik |w+'^*{t_Ez+pۗFm={m/뻩 w|Nq~Q>#bJ4ii^fȺ>֕|nǯ 7]uX~>?t<#I\G5>obS~bƃ9kR{w#|1,H?bw|EsaAkv}}C:=5-#{ط{xS9]מv>}+f;U 7^E1㼥_w/>am뱟~[Ow>a3W-!g羰-hkQ'1UI/a;{ 7<o{awۿfxCKp'r{G~Y}X^܌H~>M׻QʫuTmrhKƳMk;?hEcb]؇7PAE}L]|W}e}>~|_7!~հ=moZ#UZƱƷ'߿w!'Ďla|hwގ/;>х=(>(=\]ݧqb=tkϗ~u}_}']ހ^l^N\[s>w~j|Nbø 9\ڟk> _߻<ȵxu"micZ߼{>U\b܂v>`!n\6aw.} >7lc@#|Ê_}v.;M} HnFk(S<ƞqo!4`_"Z/w`1;>nyeuyjfڮ|adX{.w$__,mǞ;>҂r@;Yuu]q}N){Y[ ua}Z;nyE8bO=U}&vy[cн: 9a>4ߛhb~q> _]=kD|:磭[?'=,>zNO`~?X׵y?{n}2 ~2߻lr>/Lܱ׼N;K~ i~Ns?Y;,-}b/|Er5=m?bnspM1X,W*lngl}xZ5ϲO:d9>CF܎c=|뾳A(ZU~>|?\}^m޺ ;bl"q=pz>.~#Jj^~QyKN_p?9{킿7ۇe?. pyڎݵъ=}Vۺ敍ȹQg{c」?Z"}i6gabEFq};u|`&oXq}:~8.o{re{~K!;̋~f}\cb+O-~ÏqC?w>ʺA-LG?[5>qat}O;F:0A·Xoq3*A|C>γQT9!=1 ȯЛCGڀ8~n97ƕ_BRq~z_!o61{zC|>ءoc>\SNzvo @)=8c\Rw.xϽפr\oî0p ryQ C7 Ǚ>B>ӇWyO qac/"z BǙor&B/J#=l tCN0(Y0\G9&x!CүG?!?S\?]Tdd pOc_sǐ?F8?M_>ß衟腾&I9"'cȓv^?0Տ<Ͳзa>ꁞ'SIG:|=xyWp¯X[78Nk.c0z^Co||灿oЋ'7,\rYR?u\1q֙BMG ? ~i詟8: !Gg㋁}u8|~ָ]d^zMj xv}!_ϙw.36>濰1^? '%h=(|ҟ#؝)S.fAyчyu :q;Q'3:G&>Z7pCil|d<_Cnz8G </; 㘙,ΟTG?!}țMB ?FϔQƫȧ|psׇ<^/tҏ#_O߂?4z y/ڠ'vf=G~Op^{~k(|2^K ~`CLy(?cq%{ QfןL|'#,uB7E6~8~b}؊\|8\ @Q5| 9DK_}cةY`Z/!rm^<>ͬd}fEп}UYQ2>ƭ#9p tA/#g8vz<&s 㨟Ee9ؑWxX?9ZO0߃>Mo0wwy[9 N?:Na7'0?81X"FG}UJأg]k];hӏȿQ?Çq3 =!w> !Gp}iOjoO}TO1=~Y2_7 :!(3^coF8~qzl^_^`9rzk/W6$^; ];FCavԸ,tyrGfb 1gQoOCg'8O}`J3s}1^ֻGx3|!~~ Iġ7yϲ6< t~2KՏ>OaƠ4YW)^בe֋<1Imr7|'_cd5ӌEn[=35^8^rusL !؇Y͐מ[{uqf/4G0xʋ5>O(r?Q&7w_ 3;~ÿW.S"Oo#g3& z[w} >9 >hr:|O^{?5/aFqQ Zt_U9. هoO#ȹunx_yF> ȹuwg~wUbY۸80r>-9:Gw8(%?C<bKgƐ>yp:q !%<8 ]N(ўQ\74ڹI8r50!G}U(?[ǛCo 7Xyy,-p0v0Y,1v:vֺWK "'GLp!g[^io."xc>zǘo iC?}w}|OQఎ_O}ݧЗ-E.[r=ptڭqX®:߇чID?i9Yi=/?_4zo|8^t0^~{>8G WA~G4r2'4ΞoG|tBƐu|qyn_BAx OcW=O L +wqz*v~̯Fa~_9>}{z0:|^.oȓub[>Y@QBG~oM"G# YGwrV_o<¯ 䁣3׭{#1a6 W݁N!{2r{>Hg^@.чaiB|}'؃sןZyR;|e}z4pQk'pO(tue)罿vmc퇿B5r44b>7r)~`ݙx%f}L|˲_F?G?A_q#|I z9Ը}Iro,rd_v~Awͺև)=~f#3soq. Lt7Sȯwu>s~"mȧg߅Yc/ϒ=}Z,tt?ݼme?}ӳ1]e\nfIq~@~@!:P>2Nk짐{,u?Oܯq/Éa_> Ӿ 9܌#\պ{%c~TkCȝpMρ?F/8_yq;!uIoQ} mڇh|.a5?녮}S1 Sf }}^/_(~ }c} p\ NOw1 0o?A֙.?eSyXG~r=t`~!JK_}so=y7v}6^Qh^ᾁu&CK,: FW#i@?.3Zc]1y_bI{=|ϊN݌~c/w/;>Zpjg8Oy/Ծ~nc_Ǎg9nZ7cs?>jy: Y({(wn(3ǧ迂wt:K[}s_:AJ1ֱ^sY>a?}3ī`<4ݬO"/%/ v ;>{5f}cMAOx~}5Y^xʓ YwzF0v /ɸzENgNN%c)|voz':֑ƙOQЋ|;Ggw_La~rcR!M}^G+3ƾaGy?ySoc'Q9I-3_o}Ffz! x.ڏk/Ϋ?n1a}Qޗ#0y8o}șϝL1ߺ빯oa^w6A<]a^1N*_o@=ڍa Q9|cwGuobds\?]~~4>sl|9Y*?;i>-sػQh}};3='yfud>vzvhu 0QEnkp7+4tً m3~gQΛ_oBr]y=9 }Ƽx=W߄zqYO?~}3utB!}橥@/gG4+`O짲o|+Oл)k9Cl9N e~4a~6 c+q_.?ُ~rǟ'>~e[3<5 ussE݇@|Ng >ۏsD?](砋9>g!7A B[yvg~7tGNW2^o=^O1^uQ_ a_rܖ8t< !cz0N2_e7ob+9>kúOMͼ;Oj{9c}óCuA siN>_e>8}HeyAkهg~>o_oTBn}X>/s>گ< /2`|] 3/ߏ7f^ч BOKNO<~O=>bǠC5D=?ƃ>l[|~}Rﭿ/{pw[߾GA&? -'XOBǬ 8M f]N/o SZz]8Gk/o``)8Ͼ?7.?>~Bg{`=Tߵ\c<{+\)O]J_؋ ^%$}]63~֗.#:̐O}B?c]8W>} >`?GU z=~*ȗ~Ybv>K|^,6_Zm>`_nyN]yRQ2>1z>s$,\"zX#G>_sƣky~>p9M?eO;ٗi=zG<[a}s.:r:o_ǘv+oʧu/S}ivl9c]ôCƙזx/F~<gsx2Sȳ~#m|]>5 e~&XzqqLB$ztwMNY_JЗCպ[sy}:t!\ mEi?|3 a q[{6}=ixە炞 \%寿-Yiֽ;~c~YE|߆>8<a}>1Jؙ4|W|Us_'8 w*a{uv[Gi_7vlr]|~?x~e\0y붾Oj8?/004軁yw|p5E3Ck{>-m'Zo<:sT/R~_`Y'Nu٧ t#WyJ󢾚+Cw75Nʱ\y Y~n}og>L#_UG[G>7{N3z#y9qG?e|:^o}oICr:)o <kG)h)xj/_ j_rXkY9zWr^{|n~E24O~k#~Ao_N_`|ݼ~uG~ <;r~J} 3}>AگM=W?}YqWr"[wo7}/=fCx}~b~4KJ7j_ >5d<ۋ~ XO^Q/|fowGЧpֺ^Bi[÷,n`^52[ar泬s M֏O. cCooOVBǰC?kF8_ܬ /T@uYog>0ph~{7|u>H_1ɺ1g==907NC/[w힁3sY౏77#Ma wQ{~O5s=s>挨z'<ǼNlx۹#2DUb zsq}xsx#Osu}#>yb3ss{8!`=ges#0<59q(4|9&3-}fq̺3~ Zq<>Ǹ<Mb| |yx1 Yƽ^Xc5b އ'xX祹)|i'pF{zgbis5 k |gC8038|g~<z \_Ÿ`{~=>24KOABoo{53(:%hZ'g~ B$0c'=ĺs^?0+smfSM4U'8^E:CNLJ  =]5b~qm  8fݓsNI:R8tʲt|gqϹ +1V']? =-_ydAHٞgY'xx 3O6qhB cO3S(>c2~o/BF8tKp|.eqyCjc7ܯËNp$ן 8>l3x21:쟵X+w4ev 2$y=ĺqϓw/q |Sa{5}^o{M=h2=~ "F;1Nf+ԏeu.?F"< ?!{3)e?o\J9~ϦsAF8|+Nf<\Cm= pπk{ 03g sqqoCx|mbhO~7 r|k\/ ]zul^iQAX'a"G?!\ < -ᓬ9 |ϥkR/)wC} f8ksϺ ZƺиE45wl2+ޗ]{ZX8Ě/A6P=Am pv%owN^"qt=CCïkR3y84 |80a-\0 )cR\?! {zrhۭ_ϳw.wCYp|)?9>d7#9,SMAs x? ;GBF}_g9O'S>Q0}ϳ6~?4qh ~Z'˷XcZL,'Ϥg< Mf |?\#$8})I6q_ȯ61: |ƻ7xsSΉp$cI.ż=d>ژ7dj+g!fk 6sϳf^N)NΘrJ9T.?rͨ1SE+hn b=9`X3xOˎT%q_9hqNpMwl'*?r}i.!`z.:>vloB#ʺwq[)?Qq= )홳>Y`~k{fR]Sw)\?UAW}wʱl?e_;SpZKVG7>끮3)sŸ>3xXC50~ z|< r2bNy_(Oױ ɜ?_n\o/,Myǜ'eYة+\ 3}!S H9~?roqum)go9t&tnr@/.q_ƅmIٟ}wh ܂OOܣs):u?lފmyycƼ~~ )i'p.3n8|2hci,~C1>9kMQh6Ṕ"㹓@}fsG&s!Y _0r=[~ǡF4>K9F۝xk)xGk rN6%>r~u8X = >5`Xi֊\'lÙ{RfLŔm9J1I6^1`q<z}58i t'R |NØzR5>ݬk ߼d{-)CZk^}?'SOSWʱ9^̷J9С)gٺd eL*EM< NS 0WS2o)+OUi6 d"tfc&袼&kL%e;r&')<#9垇~l/Ǚ]K)?1.WSHٯ=}ϳ4<0L=s|KC=\zuLTdS)3)O[S)m1ݔs85垙S=1{XR?x"]nmO>WA:hs/222al/yr)R ߄ty:~)^H㾃gR?xw=?xs[3~ MlSE41n$e[2nS+9rn|B/k}̯y<Ơkx']a^,{1ָr_9 MYJ\JyRʵ)绯q ~rqXSz=>/KAΔ6&R;Q8>a"{5x뉟Ny ֱd:x7s N{/CZ)OYG_ʺs?r= |cO͓C#[ƔsWX7座{>çxʽybO937=V s:aeHy'dZٔ{Gó)(oM7Tq4 zΔcS);o}%Xx Zgy.KSλ;6!637?ޫ51G٠nv4į7XƳi[SǪsHױqΝұnt4OkD<O?c˵?/~&jbq-YGZ =tLTӞG`1xg|lm <{3kO4.kr | iqzUGso:aMA϶\̻߭~ͱ|ׯ,nyO7p\ók7N,ӿZ_Ƅ/t4BV(kU_A^9:ս\gH#iu}Af_-Yg(_ _(k\_<ߝ 9hύ<,C~6Ѓ Я+U൙G8_+kW!oM߂nг ^+ R[3%o@րoX}hdF澦Ч?,R/:{\0o#rԏ]a5K:{uw3zيr}뮃?-oq|8MZn? S<uczY^A 7lj|h^AlkWg _(ֻwZi=^PM̿y=ףFO}U¼+y}hF.46C؇U؛uvCky{݈47=_zx-܏]9ZA*R#Tq~N53o3E1o+Ch/V"$mCv\?~h|nfe4G#:A6bO#OSm3دe YϺ&b6ƺ|[z}>Jwv|c7mG74w֣_؅[-^k#؂}T[8n6R.v|=W|+{rd|xF^y[<6MK'qYr:5rm#|]=Y^ڟ-ط6܈y]o?_+i ̻θ-NzV,Wc[#S -x9i"-!ERU<?S4BKt_K\=vy/̭ur忱he|| ȽjoFVC) ~:~t5pl7oïVwrN\;;`8}^.K/;\5iDZS6[f~?w~k;jЛY6=׃G;pfu1 Əm5^~ݎjC~&E襟he5gޫx:~; Uku3p72* 8Vw&HԎ݈_ =WJu/#uytt]Fӌ=7nm,GV+֙wjЫ6&_o>A=n9qK?ӈ,G? co6_W Uȇ9lnл rl٤@_Xw~ yk|{VN߬'nˌ{Xgu;* z}mUgğu֏ [ vx|{|)-ޱRl"W|v-ydз9l _[=35^yb[g}A'Cu&[?l2Ç_iho?QYO{cݠ:!˺v[?i݄Yh~k'(;{E?e+qeފlîYmEۥ?fpI_ )竐gt%zކ<`֌3h4`f]L `и8r38ث;k"-8 6~oodV::?b]q|3X\>l\}_\#UX'.>zmmyJI{?=_ w?\y+} R?AV云Yo^n]ڱg- '}[ПȽҸ b [Mk}}?A dd*I?R\n +7a'~fxA؆nЌ5aXoGq|ݺjaJ>qzFDN2_c r8zrh m0nG?V'9(ݏ"Vu gk!vQz'ƍg}_ߨEuoƕwXWc|+p4c̫ܧm#S+r͸0]ku`m6/Xc K]9?+_u!ʕT=ZSQ3?i3}!k9~e}Msh?:Cy>m[zmk?}ӛcv=5Msf Npl@#o&^7[?~Ze8Cg=;}] >ܷM[5ڟ[+oyfۏj}m]xyb| ~uNOd_ zf8\~z#y} byS7GQN/a[y*{ra`yxxzZ// nn)띛'gGȝ}i??_|Zo32lc^!ڴ;#UKBЃr|/$~~vh-n\aFuvź7r>>º}C76~/'ț!~;m&PCO7k^݌e_\;re1S7ҏggm߭1/Mں~xWo5?g]q\6žoy2uVj/g] S/-#ze\H%W<ުaig&mءv&L ?ڄ]'nl+Gcwr߰~y>`pyU~sC >6p5znߢ/}^:yv\|>b8<Ѽ{|ܼuNe=z:q xk}훳>o?ϧIv[Vyi0Do;CW跐{{3A=ѳG8g<'/U9F]?Vck?biVO^ϛ?o~֧Z#Ç{ho2~ɊG}u;gیc紋e?G>L%zRYOFZl0&j3i~( X<;nH$\;)Q $V}_{RHIr,;r'q3㉧gt\uأN\O=(JդvS%;|{Kbs}w}ߋGƅeٟb>+3[A~Mf|0^72ا~I1N{On=̓wk|݋?yqNЏo]ży{q}C1qT߅~/r~6.Gߗoa\^wQ@XσЩx~_ź߇^߫o܏"o>w̻O_>7Q)؟l?G },?[ݩ8S\zy$}Ŀz}Ejw!?+.?}>XaA~{y\U;=^{?jNɾmY ܧ Ϭ;=DNu~xMVZw}8l>L@;n=Yģ~uv}'͟w}wotCg}Eu YoP^7Pޭiuioݭ}ڿc7>}i|:7Ž63a?ѯ~/d~'xqK泌͇aI|߫?5ϴ => <3OZ{7|ƣ>:^m/i++w{x>yyqXG/tIw!'>xx:_0/fgѣ2̸>{?M}ko7s_ }ۿ~b}}їܩտ}_&Ò1>/?Ob_e/[o SG_ ϵ?G ߉~{{п1:ޔ~~N낌׫_Ⱥkan;v.?ikY!sŧx?{Ɲ3}؍^/}̃n}{[~/&ȉ{@|*3y?x{Ywo{^å%̃Wb}w3aKkK泍ˍG=q}:Ϲ>`16~λss>g}zGNcXG?7zp|<4#?/;d;}M}k/xw?vľ'6~;;_u{AmWۍy=|O;ٗi>|#܏h=O}.w8|z/|b}w?.+c.^ ~q~awp97ꕾ>YCȫpo;H S_*OW>罻n>:={?{kTy1Oe mi7̳kGϸȱ7~ܟ)'g_6È?|W ߼?&׃?`|wxW={[ߍC桍w/C.}G̫]}]z|'z/7^& c_t|];ʯ޻;.[t!]>dfu ߹_{ r_N|NRO}pyw~'.ߗrn~`nOQnY?"uxrcX;|c;{8|Q3e?8pP7慑[}O07ه^?X~qy W>8+)Ccgu{0_zPo} ~} #}3up]ǸC?Ɖ5N61l>wӵOԼ?1h`{<E~׭{qyDy88`OY/Oޮ^֭#GƳSCr@ӼC޷._c j_Nh/G}«^h7l^>#8 oPO_nd\w2O}k[9}=/J׎ FzxOԏOywyƽ[G?jo'qy^d}摑v[;'?*ʧNB+?$o? ~c |pE|Ňx˿[ x֕oT܃Ԥ>w'1~/xN#[ߕ^­׳-&^?ؗ`\ui\v6w_cg{}>v|z|?~!p ]̇akF܏cB=ax7~A/3ٗwwг_Y}'~Í3cXkg~0pݦq'}WbvB/')v]S~y"[/qvw1zx@#-/hxeܡgtqq8y~xkׇ6g>71MpG_l7{?kO|_om?^ܛ}b'WgWyZ? ^Y'<>÷Oa?_=QnKw=\>} ~󟷏~nw{Ht?ߞqk}<*ށ8io ;7>$x8yOn[Co>>xC<7̺GcN~\ ^w1/΀Yxq'$2s}<ܓS/}(C2I4|0x k>[_k3iq43iy_hWg|/{g!ޟ738|Z;~~}Gb~j8Nßz'Ayo\c+ a|/|G qy~ןa)q9 {3ш|YnsAg?|dGX1N3)֫iy ƛMr>>VO0$+C$|4bA<7-tc|#o_!aO WSg=$s.Lf^/p0g>m=~uKǿ`>ï3cB ]Gq>ɺ~Y?<sG? p ϱGg\?:)yz ^?{^O}ȽzygԃrMo>ց|4tEF)?`=4f_q(>Ul9e9σ+@}Jܴ[k7z~yg)'VIP3ŮG б,8^&ۏ= ^+ȩy]>lE8?a1| Hgc ;'iwyIjܷL 7|0/"3? §So2ُm}8-zz 3{cp:7Sy[wCzf)b7g?2 ?>gܡﴟOo283; |6 dyfgq kKoBx+>O|1r+_B/~jq>m,|4R>:ό/GLr}% ӮL_8gn^/tok zyyGyzĿ/24dq,3ߞ}Gc3M?XW\|Cad?tF9~gIhIr& I&O 0f"0߆n_7?= ="ku4xJzӟA/xN`>y_y||_AC0߫OGkY0 "xՇ\_~y7~뛁+wH=xyW/7?c|m>c<'GW<CY])|aj(x?>x͓a۸+Fq| JO;g[09Ƌ|*ꏜby\[4NCϏgq܇{;ElJ>E8r 8vfI)@ ?)S<%nkB_ccG Ƴ^7r s3笓z?9m~FOı}S >+:|GXn77t? =8 |@sˁ7X/z{ISI{t=2i!W]Evv>/C{[ Cniߏ<vfu>38)c'~ _?re>$ qpBOkżQF?~92n^53M[dN8=?\`cF<2AY3n"GH%N|}>Ѻtk?>XyW5`_fY<㜛 =c'X_9 |g8~^y&4r;¸r>? }2y!J Nj~Qj}1 \IGy~cui:!ӳ fz yo)?-9 tuĨw&G ;޾>ȱzBoܧAYu)5 ?':CCO')zDε+YGjS$|#?Yc~о H-7G~ f}ny p7U]yl)d)o]kyC.Q+tN߇\k7#e9Z3-]_@g#77/<}bsx;ځ>igm{R!?!7q 9mּ thgPk^aa|o>k^/SΪGʁ8Nߓ|y![G; XNkkK|$3g9 /yYxR~V/|GuG_rk<3 Bo)R>1> =7+:͢'&z~s7?Do1< pk&}1G ><xi|r`ke]`7}~_t?qǀky [>5b_S]ė~0iyK!r GL3n?p\~Hl}-_߱V4&wuoaz#Ai08?iơ|ciy栏uiф8:tF{f\wOFF9.|: aq~<7>Ϭ;M֯vYֵG Իy~d)ൾ+^e}ÿ`oǵ+ڡ ^;L¯#s~Z҇yΰ.紸n}Syt)o<}ƽ7^0ݬG1.:oL7#^ Q^kqϞs|>'Z׷ƾyzRhۇоbT9a\/*7C/9>pL!99HeLkgu8ޑO90ɾeMU_?DżswRjFyuGKԹżg|"-c{ jןFۯZ#V|ol) xПi1~ @ sbi j|rn_uz}mNK Gt jezV|s}αQ9ZG'?2ѯcuSN38|p߇7 ~~}}fF=A_d|nss|sʟO^7A)?Co{_f~n7DV8Ź{b0i\A] zauqgԏ>2T.9ey7۷> 'Wҡ7?a~j~>7=;! F._@>[GO(G0 \3oOC^S61ojLj^Q>~`|:b |bؾaGLMG7-93+ tw7޲?n?|+]#s7zO2,p 9QA?ٿbי?~<_%>ǂ.(|3~e7+{-[gu"gY:$]ksl>~8>pneB8tVI9tw?qF_< rxS3ޱ~7:|۷k=bk u:B/|h\7m}y>Wy|i΀8Goz9^n sIb=S_[w\3o>˸'T+FqjFV|7=}iؗd)iɗuH r$hž1f3Wi?0.;NƏ5cc]K'C 1~N:W"0ui\G$~A;Ȭ WckŨ7>W[-_(-}/e>yݷ~_$~}$]9wx#ߴowudBпѧr7t9y}}_5:goоsoy9#ȇy^^r>xw<`5i_0(R7W^>#a4(GCCl1m zϧTsx߸L|['Ͽnkyыo8'8κgNҧE~OiM c72|~3:r[[n>O^ qz+F>o>4OyЯurs1kƳ}}{E/}aߦzʽߛzqqy~[|gNX/=Q>I3}_ ߘo0l=}o^wρ'7_3G~5+q8x.B_Eab @/yCwiXӇ~OJ?"^:]"~~~?[ߛy+_[~x87S>޷.c${6XwsXyPqkc9mޘe*!{!]Nr> ~G|j8;ꉳC:؟O|F=ǼUF]I ?1"Ϻk?uq(e_q]蟏>ߓ2oҼ0rz_ocXvM;{yn?y }U9o^}>eQOݷ{ ׵X/y;ӣ?msa=s>ٯvڕn7pZ~F޴G|O1WhgQ}[zzg-_i~9he}*_X.~{`z]|' ~;'c~u$CkP`_b߱Mb3ȉTB>i s)'w}>4?{l-\0zQ{e̟wۿ/ P!~}!~}׾SgCw#?}V[ȃ0;|mn^>^˄I@W᷉Ciѯ?@? =x߼+/M~Y=qW gi0OfiS}wOp1a#~EƷ}e Ngw(gf~QM-uk>*;- U.ЃaWqaU='K拔8>% 0u pt[w+ԖąW/O=i]w^kB3N|k0/<~gg ? O\y.<^Aݧ9új8_ggF>.Rŝ<%hPqƪuQ-{Xip= 5=Y5:$8;qjt6o58e pu=9yg-Baq~k:ڴ>3U_99 .^'y5`yp1^f!|N3^-W5}9HS O{{y{ ؟3(pi最V5~yjN1yQݿz>2qh4ky-O٪^/r4}wyfY^Cm/NQgYSk}_ǏS13y?nq>[Soq<7N?sU59qg?,51 k_>yõYy<[56^ U##5xUkVn{ìm\~=[?[獪ͷρ1y5:~U~|xSU_9yqq~j@{T||jU?_5]|j[$cN1F7= 9ú ޯa:z5_e>iM<[{5]>^5}1π́Yޭ=Z^qUgYd1s{`M?ŘyVQ_i={5wZ=gSUO3W&^ 84<_52jΨ߫)yjhĂ5A:zsFF7chMƭucccתFj,=S_?_Yp`RNw ߇>?~}eҰڞNOsu'>|U̯~zw1? ,(cx~={CgQfOV,HBg?ڍAkฆ$xoL}}jWC4^ؤU背>`~\= ]k4~?ǜcCUcsԩ_|9K\cnc_O0i8k~'Xyjx ,'Sg<ω>oqڗ&OVM xq[Z7o 3~ Я~gz?Y59G^gxG?]up+j:xg7VM7 ]o}&&ς)=Z ^gWK6z/0xyj|2n|K-pRgXk|973=W5e\W}~ϝ٪˙ۧq@腯m~ܛ'鋬E|߿m9Ì1Yuh`/X1DZ8pTgOc |Z<\58 W UC˜doV$c?Xӌ04}AK6_W?s}O^(?Q5Ytd٪ֺ!0ѪԸ=yƚ# }w_cƁU/yż/S4x1?ϏɇI2^,}<>_ٚdzWέ>wg sӼw߬#U|q/4xq&.P5UMxXlhut,sj_W\3G15o|gi~~j`SsU1CsO0Ƹ>3z֟Iuϲs5&`NmkYc४)X[sj91$829LZf8j+ΥUaNWM\5uW>Θ)5Xx8UMZ|l>z9 9%lap1Y>\E98 >3zUM=iX~u-Qvqf(k<<}G&5UM.j|kԸ_5> :Q6U5sUS}jP<:_5<Ǒ> ̟bkz lUm1>\/WM-<>U5AzjrρKc+fdUMo=d}cUSj^l\n|o AM/chQcx }OT ٪-z٪ qߩq<^z5ѪUseܧ8Nn{jjtQ km#G[|j$US[ү3޷>6ͽ6욇XSon,#7LWoTmެdȚOl ׇe9:jS͓W<Ϙ~ VVMaSUcyl|0ϓ$Oж9ߩ3XP-_e]_gX ;Y5}pUèo>j?P59}Җ**<_59 ]?VN5 'Xo bGpZVN3^M9b7&nDGZ\ټ~>ż؟e׀ӼIpe'\0Q5yyCY5>9^59z1_1殟>9s1WM*u|2]yktqGs=:cK={:|00dmcjxAjbTMџU#g󜱗~aޚ5?{|jFc<36dgcg̯W~j;&#_A>S5USRN?T5vB[IkLփ3UӯlUz}Q ~_5]}fsa?3/pw6漟~旫F>$SƃUzσ'U;lӌ[jG?nԙsn?:^P-dm: plUW?U55OUo[σ7a=tMyS>eͻ~9j/T~{jM}zsUS}ykOm[/__cWXd/ )ʇ,Uv=8Lqh.C2[5y`{?si{?Unj|骩5ˬM: ,~ec=]5ŪUQ_a]uؼg GS9UMx ެ^OA`7gQy'FVM>ϼ9Uo+cXwVm>2p̃U㧴xvjgƇx('kj̠5Q5}9_/ج|]_ :wŶ|ꏿxl/{nmԷ?vlG}uo෿~خ]/u[횼p?9v{[/^~n {vGm'o{.]tlSyn_?8o{<~~=zcx=̳'ӵu}]ob/ww N^{vSվhm{6^nߺб=ko׀α5ޗ~xl7ynplwpoeܮ >\<3ϭx|oa\_ۙo7C?~v~FFV߷ױ78w06[f^ӽ|==< O7pvj/xڅ< ,mImQ.X{Xng/[oN/~٭l;^\;Í6 |Ym_[Y>n6oqp>lm~E~UncIfy%ykS~ >7 ^wz2+S^w`7zۭn;>՞&=Vf8w1^%=ubk_$ͼ֭8[{;ԃk|+_ ]v$hWz8W޺>6o=v x<w#[cwޝ=x]}{_YE2Cy {x0MqxQ/q wržJ_?Xz7CQO>wi#{+<@/Bɯ{r}~vQߵnf\|lms<_nמG/:nfro^?S O"W}us[xwYGܘO'8;go/@vZ=1z"1{׷5ḳGv^]dm<v~bn^w$;#>Fp;q\Wv& '+z~:zwOh_D|:?|Y~>vmVvuȣG<77뺮}`'ӏ@?&}M~OoO{w~8[W& m͌G?WKpoKyn]y-O +-;ø~vq1 }5.n~nn '`wwBsq@_s[y"!_|P|nb~B~~%|_\'7[x>ܗP$úSn/s"UXqv}٥~52Oe=;W67?|qyX)zZY_|$o5>6pݼk|z!ʽvK{n|^i|o.{Sw:'oo1ѮvXc]g}ݖeSeo1?*D/+)=9̧C[/ӓI{~ov]8]Y=`62N ]o. 8`Amܥ]SNCy[;kּ!rg>K}f}Fd|+߳/ʭ&nnb >5,G*.n]8jgq~6:۪_a^./]7s>iG?Kvb|c|aa^W~0/1~ȓt9`G:ǮNϬo\K>0P.Nh~U.c^7u̻7?@/`>G.]so<T 9X_c}xuZ\f(2 qk=)A̻kۭru?ƹQ >?m}M`~Q}~ <ۘG?6o"rG?SA_yK?Ƹqw_W>[ld?ߘGΨGGăr`߬W_{)#??tN7BNیy|y^btcWՈSek >#) r~M-x:|mºi>`;օf]CﭛW({76ǞoEG֯tOaߖ: < ]gKm\|#wv1b]< n6_>WoZO؏~_|!wOoWU>~@/s|h|3>_G6/aܺiuyF9_`θǼBqy o>1ȭ\7/zp*w'.y=Ǿ&87ʁ ߅37W[Ux^{eξ;_n|z&icO=~u+ZG+WS;!mćg:(:yϸiuṃ Cyf<A[=ydH0._6M?PH9/C0Xګ^UR\kT|^~_ѮIlO)6>?pF.~/|=[zY@;afPWTA7o|y^`諽_0;飽5eiJ?y>٫`L|N"Ct^I>^_~H83~ÇiG]? B?emM<[߷sx" Oc#<[Kn~j^3y/\qm2ʁvQ x+kȿ˗_U?淶'%_?4,)aW^yjNoLyv?e X5[\>:/?i/Ws(vN }[<܈ۯ!g__[2}oO{dF:d/)wb ~8xC?[#XwIk.4ir1B~pA?/ X10u{skr__/d=ogɼv9#ohoqus/w|Q}Us<n7?\ތs7NTW(|i}׻6їoWϪWgoʟwyN| _ ~oBZیG;uߨ-8HP=Y><"Eþ,?ڧ}qL'e}XL? ,[oݺ.Zl'>#g۶G`syKz|8xo|q|c<3+D+{7UnzE颿!And]9}gWY]/{Y>~:"ѾAWʍܪ~bmcܧqyyQO5>gw<'|G||YOk=8|}uG> q> ]';EyVv[=(h_ӭom2~Mʥкv }~QJ'"]]z]~a>"ǨG%~G0}6ߠ]<'{lqد1ߠܩgxO{|?m8C#7!/ƝߢG<QH]?=͟7ȑ97DZ/ 37׋G}׻cU-&TWƯRxZ=mb+/O/p̯;}a74.̟}5ؗdy$;"橵WIKp7;I7g/[?''ڷc}WJ'a(??6{>M#G'/ث>Oޘg/?Z| Ch]V?!п_Wu?7owz̿Gu_z[}}C 3~oθL|['4"̗g| [9ǡ>3: 2΀OcqvQ>ց;.~jǗOpߠ~ N = %ɺv~>|x5JsP極 F><~|nU7m2Ylocpn _"=O2eܻS!oa7Əׂa#ǹ1)Hx___-s]hwIv1?μvgWE;wVucz<#7b^)mb^m_Ib_qv˺Mô3n=ķѧ`P{a|7lT&M'U'4WN]b5<BV{OƟ`7sKS'B'[eD=}:+id#a_{^8;~#F]E?ys6|OS/|&6߀/Z|b1N77/<7羬{ֱ8{NeߴI{l&Sm'_h/yecߘusٍ?_ノGO ~D;ֱ{g?n?2o._G/I޷$_g^7=?T&* 1Y׺px~B׺EO .b WE^}b݆"~{ֹˬ[WOs~m }W_t\e?tY|Ggyدi~0>x; \viW|_9.Ԏ}=o_uq]ѿg '}N}ׅuoNN)\yofܰ3x8Cx_y|Σ=4O/]~Y?Ǎz_bo]W<EƑ_;oNו,+-o|aߖ7UwꓼI?>pG7[p4_aax\rr>e s{;rǾVPn?._EyHΥ~$ߺ^;]yښ/ʳxp=+8jW29LpoD\"~ԻoMI&Ɨs?$<1)? W9-֎\~q_ן6/(9—Տ==.wiA=&<~pO҅Q/>>=+ɹp]||ݗ-I/ȏ-۠uzzp'E}>||nM}t$?zMHsawsWZʍ|ޕϕ[Ӻ?Js'#k+9g7#Ƀ#9y3؛y|alHM[|yד%sߏqqu@D>R>wK> sa.g;"{z}ct<]>'^zEߦOQWt c Y~bەc7|IGU>6ٝ>yυO(>B)#x2sr-^xO|9o:盝BޙsKȏ 3/EI.S;pV^uXk &aȽ|8!<|~>Sƕw8|3/@1<(+&={i:C"ߣ~rxdK_庈GĵI)Qy VO$>SGz/gu==y?וB'/ſxU_c`z#~\r$Owŧx>JJ}39>\Kݼn<] '_ԝפoWϸo_«zE~ Mx {#_~[%;o-1=|JשxzSwv~ qϺ}_91Ǔ9~\8/ &8wKR<uR+8c(ړ.=ׅy:O^9ε*q,wGAPz^aܥ>Ο=aQ(CKא/O)WUʛv-)kCW$xb<}|rݙ( OZr(\;|/RMy.ґҸ /L;#ê\:qu.<+#sڟoO_:]suGz N nkϦWEmzN}8kO叨s?k\W8Nep]TVoNDG|x?1Hso+嗤zW~t ~~G|3 _Iש|DݒItW>w|^_Q=,>9*\G?φ_!Qʧ=Hr:3g3aB?fsN_g?JB> I^k?~lD<ž1vs-̣Es{7x?[#>b?Q'iވ;;A_[/ɿx'gēI/H'Byߛ)PyH ^ ?Fs朇|^}w~)W=l~C1%giYgGޱ|!OnK0ݡ$aW\ow$Hz"{7ɇQ>Pn i\yN+/F)G䫒ޒcC#M'}W>NjGb^㤯>tzKǰCʧy]=4Q'9/w۹n=7~H+yF \ߞ]ʵ GCr~!<.|ߖ_yt^b1IOE1LW GW=|a"碿-g7IOڕߕ ?s}RpƔNgi; \\M)ߗ_|-קJ+Go+׫7[1oۛK3+s]84݇Kxv+wq?[Ht|)}ޢ!3\7%z3Kgy?%$\O繯E>Nx,qJ/ۦDG&>!>@)/_k9k]I3Z.E_t8_ʷzJ+$xA阿K ]7rܟ/?]ߘ.l޷?7y睉^_}+oJ's{_g+-/)i9'I^{ߤ糟돛:巜70B8ēGR~yqWyjǑ^7/P+aoZzϸV#_ ~A׼@?^O>T}?O]')=(ɭ<[Ƌ~'KK碿)釛7Cp=oCi]I&O]{\WOe/:;Otz+ק~N=W/Ht=Gy 9>)]Dbq:%޸C<طx"~y=IC~(/zNDc9QemiO2/Gr~\8wbIwן%}v\zFM}%c_Nh9ߡO^r?,'_{L )N{p{:2]ԏ1s>G"*sd?z]}IYy>@_}[Pɧ^ zG>KO=/:Lߩ_Gs$ޥr=np= &\s7/}ܗ/*?xH>įb/مJr{cң?ܛ ?(nzR<;~8j7ؽȼoCˆs>D[&{ėwewy^.torq&+~#~rn~zG9ɁvP_ b|?\y_@OJwҞ8O3)bQϲ$3Aw#~9yN[3\Xߡ֥ٗ߳_S<|/\wՒ>]K|Q]_/m꧇t⹘7 ww'dF}G3mOtu-F}繯ߣ=$㍜7ۗ {8!s`]8.}{+9.-pYqo96reŽ%xkӽi_εwYt}ibe_Uzc-/Xpkk.7ˊWwgZvWiI+鸢{e%]S#^V yKܗ4[^u⹄uU\ oUsmqj!K8^]ouzO|ZYUkǗV,8f ⹒5UL.-XQ]5U7#%MK,)qyqZȃܔ`I (9bNt5 %E.exI1|,ͻ"eveΪy9OCj5zJ;nև]xⱤϭ)k<=s]qOb+ӻ-yKӽU|nI1fI鷲xgU8{mR(#XkK+e \~*,֥˃?VKc,h<҆rV$Q’S#X7tyW=xԷwFkNSڔ&C1O CKVs|qV } ~JʘD9][U-RJ,n,po8,%}IeZ,i&ҩԵ©n_flcw.|}trҶk϶"CoRO ҇(yY(|%-rΥg_S)_gY~rYK_⦤w9e*ӱ2ZkצJ_ʃrߒ'KZdF.MUxه',d]xCCs_/yU9⫴ه)q<CTXU-*qUų%T%JV*a'JP8ƛYe<(%|%I'rXvM% Y-ϗcT<8۬cks{U1O7\D%^+mkqv}kƫv|E Wy=׆WKgu2ϥxK=X˜}EqcaUe&U~k ˚JE(K[\Vuy=J[.iiq^oIw縡ϒw_?)atMΰ\ڂү)ѱ3߯(ys"LϰxkNXJ?bm)?+};+Ҙoڍ?x̹XȲپ2V\CҧʺZk6(u-q8/erg|q\CI y2q%Kʾժ4ff_[y2*{T?y'Ik0 S/mk9V?:N(}|V%Ksf+-_JcfeRW4/}R~/"]/I(GJY.y/mW,J9̱j+K^+מ?qʜk[/.'-X>'Vu{%U|I耒>O+}R/\qd 8+r9P@iJ>VۥmӲ~ ŻOSd]ꌒo{OV)'ʵ.-Xҷ)Rm\UqiIrҦd|eoi)c2rXG晜[/U',_Zҡ%f%_/6Uڅ̗Xwx_7/rӳϝ}c9-+/YҾ fJRs|]cU#RW]YK2_l?K.O{dy*<%2~y~"sNLf=Qƣ',yg:\x|>۲Rt+{JY~:}U:/ʼ*=V8ϺL/kU1oJ_黛9f(/Raa]߅~ڛ])k>k|r}7 oSm}M[kj ngk:WփǖiOsǖڦzߎ]ǮklɅn<׾c+?Vc|ec~;qyM=鹆='s2o㵔f9[|Ku54xl%/y~l-^:| ^ҦG<OI<95י`k'_|xXZk)teX*|H.agv?7 WN/n[{k?^br<58^&ݘ<|:zOނr#]~>Kfuz=b]/}ՃA:1_53p:\U@ɏKk]ߪďMp\ϵ-7/Z}? _:ɷy}nr?>p]}<s\ TO]JYr >BπWȁ'y{;έGx?vF~N]L|+MXI7'*1DW$QM?yqԏq=}'9ʯꗐKpzW/υ~D>ʙvk^#+ou[SA862].ɻջ??}{ȕxS/g𩧤?dυ?vW'{ ĺb' _ y8Ӽitt#$G[=zV`e%~g#?i8*wxG{\1φw1ᒏ#3Lc\x־ߴWS3A|9)/38P(xK_%3A/|O8xB?tMNW>cI=I|^|DCˇgw/;yJ'{vO6ǁ) E~/˗|xNqC$Qa~jY'C߱.dwz:/W⅜ YC`ʫ|lܧ$K^QrO|/x }^y|>ߙ!םorӆ/k7L3jU+#5Hi) qv=f<'\C;Fq_( ]>6\|v7ʧy`kv nʃ~rz?O 77į^Lxxȋg)/Vf>/E"MzK>Sdy:[0YzU<'#/GmS:-Z ٞ_|g]+=ru=QI~.1o}t^Lh%}_?G>rȓ{Lrn>|}Qi~!ߪoW5ob'?vCȷڗk>(U"j]#8ٿ3?g\Hyu';`ӼJ 7pS<4>7_xOLϡ䁾G׫./%At]%m귬F~4)/KOcs]]=溥w1iAw0A9u}>žS@W?D\oݮn~| {O5_R o_I'NuF@8޸~ j7;q ~Ok%'ɯ>>E SZϋ>μCS?UߋκHԭ?-׀\Dߔq&5n!sByqSp觇 zu77oyQ/:zg=>z:/'h/9(oh/c_ 6vyGu~?$?>Lz:6N6}s&;+j7|vk㡨㈇e߀m& Cf'agu_#;1謾qI韆= z}=)b-vx|}&uz~lG-g=ohjܘv+oԮZ߉~LY촯 c/O3{)ʛz~G\'svln|<+?7'FxLu#o0K-CD-a7_= L{=?ķ;#>Nj-/@y}^ ?q$@>#+c_8nA/"ڤ_yҺOzwVy?HqȂgu oN .'#J~P#Pj?qCas'?7KyQ&pEkw9TWo"?Ny̿8|>̿g~_̈́/];&f~+;y_ek3$^MGO}]>[Gb2OM+[## ',!~owȓhw_g=&?c^G}澖O>"iTS$w`\d<@㐏$+JK|#Z^~GzU/n[Iw)W_<'^~TUyO# q>{;QŸWyj/&/PڷO9ף3UؿܯG{q$?+ЛK-M~mj&zF 9Q Er#$ICk|wD:?64~F/4/ \(%ѧ^v=,@? s_ҏ8"_u YEg4ԩMw]CkBߠwþ)Q, _y#\GKv4:ӵ_)z"awNjx?cy;QM!^Cdϣ>+b_=I>kTO.?#F<ͱڋC颼7:"/&Ό?fa G+jIiwoBgy&ɟqAƾr?WyNzJy-_vҹor^o\T_d*kڵTG߽}ze6Oꌯ^}Ss]χF=Ku _syYѷ}Y=u" ZOuڕi0}@һʁ:LQ>}\K?x=e=)3W~w]~r}5#n]čRs]#{`_N?:FߟOb;Fq\I/oH#}r<yWįV$=tK+o }ߝBA??GY.l꬇F=|~p=1O|#&&^Cyc(A> ⁤s>D2n6%o ?tw}?r_)A|p?1~MgQW浐WQO~̱| g\My_@O f?]<z{>^Mz_״G,ȯ;Unz?ï2.#;7 NcЬNӁ_.ސ<~s~3or&E| oчzʏ}k_8>tmC?S|L ).o1KH|R>9op%?:cm^~2F[+:$KXKӻXV-UӒt^M%TU _S/-Y<U^Kܖ*'n|7y">K*窪27lq13<%+*^7wn|X}LR&ʿ=*nyz~J~)ef*y:u󗰖< ƪq/-ϟݍ?Wuҍ.˿ ߻})';˫0̊bx|% . r1Utn;^Ny.a+y{%~L̗YeۚV -.^{nes%N3%=;%.6uW2/”um=]7JdW3%&8.:s/MdXὒJcfYc-vvjez?FWxen&ʊj!UU ,nz*`*ygeiw3ꎳ%\NtoM͓a6)(oMd*U]+uh7~ɼ&-SWvxn`1Un+)K]˻_y7Z噒%lyr%gQ>i ٟײ +Jގ|^ɲOxMUB|/uS~JMd.{'u9uf-fgy|vUJ_%̥O;nrMrM?/p1w%21\9}<.L {7yoٍ'̫N|-Ocd|mEe.v[c7*asK[U cnrQ9\t^lO^e[l/zYzԿeS`N*uU)%%n˲WU$+DI0ϖt~U-ty7;MޫSW9.q2gz4ϹǒymYr^+Ӓ4תt??W?SU ihKRm}%f:^U 3e/̗M7y9_-P—s<Ѡ_?ͲV̻YiViލvyzƽe[]2R\|K,o4nYOg3|QnJLA.{,O>Wd8(n}L;gy'M_TUw74OΥu~UמmB{>Deyo;2޿&R^:^.\͵^*lkM.Fގn? KKJJq9krw9|t^|w&yJ|7z%z%zRtɻc]u_).'&qgp~:rxjـw+qjkxJ}wtհ3˱a=NֳWO{mfy`7}7u»ϒt ?N:ݰW]\_ 1.Vww{R|w^گ-7x?hqqb4\\̼wyycyħ3Bŏ݀jotru)rx[s11ͻ^ |\,_\\8M^M_&.ǻˡos.ϹX^_p5Ri~5Ǽ_/Ƌˡ;5JK񡯄D+}bpN:]q%k.G=.KAk3.{bqWbȥ._./7.W.gWՔK9W'B+ɋբߕwtѕ̋bǸ\ /r[~_;Ɗ s.%[9?x~vo~">㛼{g_9c\]'gr+׵<6|\/p9 c+yy㕷.}||t|5+kr|qͅuM}B5+[s{i~&Q`'Kjq῿sP#^i0aBDgraph/data/surveyData.RData0000644000176200001440000001236712774233401015552 0ustar liggesusers]rGv]@7 #  .I7p-dϘ0zKVhlG 돘pgSn6Uʼy??mFD(|:$6Ϳ/}q.bqml>|>\؝3n``{sc m)3a {[ }Oĵy&{ec9Ύ#> }ӆރy$t'kP!N}21mי:xq}@}ρoG)v[/-~g?*L}wSfܦ+8G Wpx36<Bd0vD/EpqoqMO\1ܧy {tUQNԼrĝG/X3# e=4oλmG }my.9?7_ ?a60؛DuAgl8s`^2/ ~'vsN{z1E^5Y?Sa&y];=/tf}3?oc \\)GY\I-QkmE1e,+oڌмN.Zt:[X}jc>aʹȰElmyҳD -}LڷYҲ'aގwsRQs{K{{Q{c~0Cg~T/`d.8AYD5MR_[J{3#i0vvb,ZW<}ϬU .%8 Ө>?ۨpΜoEMZ%e&pF:`кG/sp7jgneF1עdy=4}3)†cVce/] I2_er̤ٳg$x9'O1M%:w;zv1ɪ8p)qc8=VԎn j0,nak\GΟ-ǽ*0<}هjŅ59 ?U[3;geT[IۭX:{~6l-ˉn_H$}sCf׈wOݤqFix p83Zt1ﹴCm,dLO^FctQ/܋}ՇjUdn[5.3}½ 6+5F;=+ CY&*h~ѧg/gLlKY=pV=v 9tʑN|s1+g>rvіϵޙZ~mgigx<}tMs9+sc~< mqqD?GrN?/}Q^~}E񢸝595p-sMeXO&*Mc拮o4'S._Sܾxx.eqQБfW]ϻmG܎Y- }/VX9:>xwh ljΣы}Cǿg,l^/_u8r^Z<)ެ+?*k^xMHqx=Q}9Z }cSk~n1=6Y`|5?fu*ˋ^_5yYyCe0Z4NϷnWgі=ZyuHGz(N3ĩ4&vw'd1ٌx9l= b/fNݬT*] CT'7zяh}%/-qz.;bC~Om}fyDi:/ϪV |sXi3f:rxiO{s1Ga̲N; Xq_a|>2?=_i`fC9`CBY@m"獯I &56 4z`h[%O yfGNe6xlu>~kOu=ȏ-^m15Y-1mh哴&Ǖ˃FcP{$0/wε :3\RC;I_#{'zśg42ysV, _lvYyܟ;á||\s^ kɗbx9$>4I`{:_sG޻/3x>m8 ɔ1axI>Hp:썒3#u+5Fu;3Y}T?]Uc sÓ伬GmpӉ(k>>x [pjKf{͙fx OP׭|q򫥼Un^Y fЋ-pGorpD u.ٔe{{Y{W5l"HqN|D`Mw3L*9}N4+jHg,sҌb4ˉ5{\u]Y[]iZNU2zmFCm3?l\B4'P&O |lp"?ǫoyO\ϬmB:}{5ZnLF#_{;.e+"o|udžSiG/kQI:YSvo zY4UeӼf: rߊ[}sꜲm>[]ߗ#*'+ϭ>u2z3ǏO2ܳP=R'~tjxkcbLg~_NgF[;o?SuBY7j|S&1צ(w}l&4TӘSʮt\SY'./L [t{7=#7L#~$j%JCF+,Vۍ!uځ6<)t=q갛 GS>AzŵwTZ4}} M>Lc2h++Ϲ*u{.cGd+cQk1WSe lEwFʣ,N}WW*Q'] ڄq!|F .g7eO}]}y`lL +Ǟ#gVi/;m-'jkso!/mKvF8d{-ϫ[fN֧r1y#y:xn@_vVhNst5oGTVƃ`ܥ^La Ru[kc5qo>x0=xo⫷1}37[s 80ww|B.=0wKx Npp)ކסz6gc]7{8 ܷ5ܿ H{)4{szz^[ ܿ1 M4ho3|G v xX`+ȹZ}g\Ks"2];GO)`nA7AyT& ~$z.nG?ĸ g+:}`x]}D2Q} nY{T L[[8wޏρ pסC{#j+tvq2`nrs Z1ec>cy YL99t<χzE?_Dߧϼq=(|X&}>~2AݗQby2~5nEA)t8[tOQ-|z=1qz6u"aDl? 3s}1/2 /8oA`_ /0/Z7+x+z;,y9c؄95x)8.浨|(k5 0{!0_o=L Ч/3N_^ވ~<{KX/|gsEX֏Q{-登~w\G_B |˨=e/ق)x}}=kW|x~w}{:bp+8" iZx]3=7k/\`N~yd86^?w>ڟ ~uc߇_AG7 Mc?4:_{|>>t gϰ6z[@XGyy.r)jbn8|cQϻ2QXW1@:8^D5)oAO ͨ1v<0O~{t~\scbA~wim>~}O_~yǧٟ8Ox܃(I؊nBDgraph/man/0000755000176200001440000000000014043535231012334 5ustar liggesusersBDgraph/man/reinis.Rd0000644000176200001440000000174713352750765014142 0ustar liggesusers\name{reinis} \alias{reinis} \docType{data} \title{ Risk factors of coronary heart disease } \description{ The dataset consist of \eqn{6} discrete variables as the potential risk factors of coronary heart disease. The data collected from \eqn{1841} men employed of a car factory in Czechoslovakia (Reinis et al. 1981). } \usage{ data( reinis ) } \format{ The format is a matrix with \eqn{1841} rows (number of individuals) and \eqn{6} column (number of variables). } \references{ Edwards and Havranek (1985). A fast procedure for model search in multidimensional contingency tables, \emph{Biometrika}, 72:339-351 Reinis et al (1981). Prognostic significance of the risk profile in the prevention of coronary heart disease, \emph{Bratis. lek. Listy}, 76:137-150 Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 } \examples{ data( reinis ) summary( reinis ) } \keyword{ datasets } BDgraph/man/covariance.Rd0000644000176200001440000000370513623244012014737 0ustar liggesusers\name{covariance} \alias{covariance} \title{ Estimated covariance matrix } \description{ Provides the estimated covariance matrix. } \usage{ covariance( bdgraph.obj, round = 2 ) } \arguments{ \item{bdgraph.obj}{An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{round}{ A value for rounding all probabilities to the specified number of decimal places. } } \value{ A matrix which corresponds the estimated covariance matrix.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{\code{\link{bdgraph}}, \code{\link{precision}}, \code{\link{plinks}}} \examples{ \dontrun{ # Generating multivariate normal data from a 'circle' graph data.sim <- bdgraph.sim( n = 70, p = 6, graph = "circle", vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) covariance( bdgraph.obj ) # Estimated covariance matrix data.sim $ sigma # True covariance matrix } } \keyword{parameter learning} BDgraph/man/conf.mat.plot.Rd0000644000176200001440000000477114041544657015330 0ustar liggesusers\name{conf.mat.plot} \alias{conf.mat.plot} \title{ Plot Confusion Matrix } \description{ Plot a Confusion Matrix. } \usage{ conf.mat.plot( pred, actual, cutoff = 0.5, conf.level = 0, margin = 1, color = c( "#ff83a8", "#83ff9b" ), ... ) } \arguments{ \item{pred }{ An adjacency matrix corresponding to an estimated graph. It can be an object with \code{S3} class \code{"bdgraph"} from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{actual}{ An adjacency matrix corresponding to the actual graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. It can be a factor, numeric or character vector of responses (true class), typically encoded with 0 (controls) and 1 (cases). Only two classes can be used in a ROC curve. } \item{cutoff}{cutoff value for the case that \code{pred} is vector of probabilites. The default is 0.5. } \item{conf.level}{confidence level used for the confidence rings on the odds ratios. Must be a single nonnegative number less than 1; if set to 0 (the default), confidence rings are suppressed. } \item{margin}{a numeric vector with the margins to equate. Must be one of 1 (the default), 2, or c(1, 2), which corresponds to standardizing the row, column, or both margins in each 2 by 2 table. Only used if std equals "margins". } \item{color}{a vector of length 2 specifying the colors to use for the smaller and larger diagonals of each 2 by 2 table. } \item{\dots }{options to be passed to \code{fourfoldplot}. } } \author{Reza Mohammadi \email{a.mohammadi@uva.nl}} \seealso{ \code{\link{conf.mat}}, \code{\link{compare}}, \code{\link{roc}}, \code{\link{bdgraph}} } \examples{ \dontrun{ set.seed( 100 ) # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) # Running sampling algorithm based on GGMs sample.ggm <- bdgraph( data = data.sim, method = "ggm", iter = 10000 ) # Confusion Matrix for GGM method conf.mat.plot( pred = sample.ggm, actual = data.sim ) } } \keyword{structure learning} BDgraph/man/select.Rd0000644000176200001440000000463313623244012014105 0ustar liggesusers\name{select} \alias{select} \title{ Graph selection } \description{ Provides the selected graph which, based on input, could be a graph with links for which their estimated posterior probabilities are greater than 0.5 (default) or a graph with the highest posterior probability; see examples. %For more specific selection of graphs consult the 'prob' function. } \usage{ select( bdgraph.obj, cut = NULL, vis = FALSE ) } \arguments{ \item{bdgraph.obj}{ A matrix in which each element response to the weight of the links. It can be an object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{cut}{ Threshold for including the links in the selected graph based on the estimated posterior probabilities of the links; see the examples. } \item{vis}{ Visualize the selected graph structure. } } \value{ An adjacency matrix corresponding to the selected graph.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) select( bdgraph.obj ) bdgraph.obj <- bdgraph( data = data.sim, save = TRUE ) select( bdgraph.obj ) select( bdgraph.obj, cut = 0.5, vis = TRUE ) } } \keyword{structure learning} BDgraph/man/trensfer.Rd0000644000176200001440000000225213623517145014463 0ustar liggesusers\name{transfer} \alias{transfer} \title{ transfer for count data } \description{ Transfers count data, by counting the duplicated rows. } \usage{ transfer( r_data ) } \arguments{ \item{r_data}{ An (\eqn{n \times p}{n x p}) \code{matrix} or a \code{data.frame} corresponding to the data (\eqn{n} is the sample size and \eqn{p} is the number of variables). } } \value{ An (\eqn{n \times p+1}) matrix of transferred data, in which the last column is the frequency of duplicated rows. } \references{ Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Adrian Dobra } \seealso{ \code{\link{bdgraph.mpl}}, \code{\link{bdgraph.sim}} } \examples{ # Generating multivariate binary data from a 'random' graph data.sim <- bdgraph.sim( n = 12, p = 4, size = 4, type = "count", cut = 2 ) r_data <- data.sim $ data r_data # Transfer the data transfer( r_data ) } \keyword{data preprocessing} BDgraph/man/print.sim.Rd0000644000176200001440000000310113522542527014550 0ustar liggesusers\name{print.sim} \alias{print.sim} \title{ Print function for \code{S3} class \code{"sim"} } \description{ Prints the information about the type of data, the sample size, the graph type, the number of nodes, number of links and sparsity of the true graph. } \usage{ \method{print}{sim}( x, ... ) } \arguments{ \item{x}{ An object of \code{S3} class \code{"sim"}, from function \code{\link{bdgraph.sim}}. } \item{\dots}{ System reserved (no specific usage). } } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{graph.sim}}, \code{\link{bdgraph.sim}} } \examples{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 20, p = 10, vis = TRUE ) print( data.sim ) } \keyword{print} BDgraph/man/bdgraph.Rd0000644000176200001440000001542213623517145014245 0ustar liggesusers\name{bdgraph} \alias{bdgraph} \title{ Search algorithm in graphical models } \description{ As the main function of the \pkg{BDgraph} package, this function consists of several MCMC sampling algorithms for Bayesian model determination in undirected graphical models. % based on birth-death MCMC method. To speed up the computations, the birth-death MCMC sampling algorithms are implemented in parallel using \pkg{OpenMP} in \code{C++}. } \usage{ bdgraph( data, n = NULL, method = "ggm", algorithm = "bdmcmc", iter = 5000, burnin = iter / 2, not.cont = NULL, g.prior = 0.5, df.prior = 3, g.start = "empty", jump = NULL, save = FALSE, cores = NULL, threshold = 1e-8 ) } \arguments{ \item{data}{ There are two options: (1) an (\eqn{n \times p}) \code{matrix} or a \code{data.frame} corresponding to the data, (2) an (\eqn{p \times p}) covariance matrix as \eqn{S=X'X} which \eqn{X} is the data matrix (\eqn{n} is the sample size and \eqn{p} is the number of variables). It also could be an object of class \code{"sim"}, from function \code{\link{bdgraph.sim}}. The input matrix is automatically identified by checking the symmetry. } \item{n}{The number of observations. It is needed if the \code{"data"} is a covariance matrix.} \item{method}{ A character with two options \code{"ggm"} (default) and \code{"gcgm"}. Option \code{"ggm"} is for Gaussian graphical models based on Gaussianity assumption. Option \code{"gcgm"} is for Gaussian copula graphical models for the data that not follow Gaussianity assumption (e.g. continuous non-Gaussian, count, or mixed dataset). } \item{algorithm}{ A character with two options \code{"bdmcmc"} (default) and \code{"rjmcmc"}. Option \code{"bdmcmc"} is based on birth-death MCMC algorithm. Option \code{"rjmcmc"} is based on reverible jump MCMC algorithm. } \item{iter}{The number of iteration for the sampling algorithm.} \item{burnin}{The number of burn-in iteration for the sampling algorithm.} \item{not.cont}{ For the case \code{method = "gcgm"}, a vector with binary values in which \eqn{1} indicates not continuous variables. } \item{g.prior}{ For determining the prior distribution of each edge in the graph. There are two options: a single value between \eqn{0} and \eqn{1} (e.g. \eqn{0.5} as a noninformative prior) or an (\eqn{p \times p}) matrix with elements between \eqn{0} and \eqn{1}. } \item{df.prior}{ The degree of freedom for G-Wishart distribution, \eqn{W_G(b,D)}, which is a prior distribution of the precision matrix. } \item{g.start}{ Corresponds to a starting point of the graph. It could be an (\eqn{p \times p}) matrix, \code{"empty"} (default), or \code{"full"}. Option \code{"empty"} means the initial graph is an empty graph and \code{"full"} means a full graph. It also could be an object with \code{S3} class \code{"bdgraph"} of \code{R} package \code{\link[BDgraph]{BDgraph}} or the class \code{"ssgraph"} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}; this option can be used to run the sampling algorithm from the last objects of previous run (see examples). } \item{jump}{ It is only for the BDMCMC algorithm (\code{algorithm = "bdmcmc"}). It is for simultaneously updating multiple links at the same time to update graph in the BDMCMC algorithm. } \item{save}{ Logical: if FALSE (default), the adjacency matrices are NOT saved. If TRUE, the adjacency matrices after burn-in are saved. } \item{cores}{ The number of cores to use for parallel execution. The case \code{cores="all"} means all CPU cores to use for parallel execution. %The default is to use "all" CPU cores of the computer. } \item{threshold}{ The threshold value for the convergence of sampling algorithm from G-Wishart for the precision matrix.} } \value{ An object with \code{S3} class \code{"bdgraph"} is returned: \item{p_links}{ An upper triangular matrix which corresponds the estimated posterior probabilities of all possible links. } \item{K_hat}{ The posterior estimation of the precision matrix. } For the case "save = TRUE" is returned: \item{sample_graphs}{ A vector of strings which includes the adjacency matrices of visited graphs after burn-in.} \item{graph_weights}{ A vector which includes the waiting times of visited graphs after burn-in. } \item{all_graphs}{A vector which includes the identity of the adjacency matrices for all iterations after burn-in. It is needed for monitoring the convergence of the BD-MCMC algorithm.} \item{all_weights}{A vector which includes the waiting times for all iterations after burn-in. It is needed for monitoring the convergence of the BD-MCMC algorithm.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. and Dobra A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph.mpl}}, \code{\link{bdgraph.sim}}, \code{\link{summary.bdgraph}}, \code{\link{compare}} } \examples{ \dontrun{ # --- Example 1 # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 20, p = 6, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, iter = 1000 ) summary( bdgraph.obj ) # To compare our result with true graph compare( data.sim, bdgraph.obj, main = c( "Target", "BDgraph" ) ) # Running algorithm with starting points from previous run bdgraph.obj2 <- bdgraph( data = data.sim, g.start = bdgraph.obj ) compare( data.sim, bdgraph.obj, bdgraph.obj2, main = c( "Target", "Frist run", "Second run" ) ) # --- Example 2 # Generating mixed data from a 'scale-free' graph data.sim <- bdgraph.sim( n = 50, p = 6, type = "mixed", graph = "scale-free", vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, method = "gcgm", iter = 10000 ) summary( bdgraph.obj ) compare( data.sim, bdgraph.obj ) } } \keyword{sampling algorithms} \keyword{structure learning} \keyword{iteration} BDgraph/man/link2adj.Rd0000644000176200001440000000357713724415170014341 0ustar liggesusers\name{link2adj} \alias{link2adj} \title{ Extract links from an adjacency matrix } \description{ Extract links from an adjacency matrix or an object of calsses \code{"sim"} from function \code{\link{bdgraph.sim}} and \code{"graph"} from function \code{\link{graph.sim}}.} \usage{ link2adj( link, p = NULL ) } \arguments{ \item{link}{ An (\eqn{2 \times p}) \code{matrix} or a \code{data.frame} corresponding to the links from the graph structure. } \item{p}{The number of nodes of the graph.} } \value{ An adjacency matrix corresponding to a graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{adj2link}}, \code{\link{graph.sim}} } \examples{ # Generating a 'random' graph adj <- graph.sim( p = 6, vis = TRUE ) link <- adj2link( adj ) link2adj( link, p = 6 ) } \keyword{graphs} BDgraph/man/conf.mat.Rd0000644000176200001440000000436114041544700014333 0ustar liggesusers\name{conf.mat} \alias{conf.mat} \title{ Confusion Matrix } \description{ Create a Confusion Matrix. } \usage{ conf.mat( pred, actual, cutoff = 0.5, proportion = FALSE, dnn = c( "Prediction", "Actual" ), ... ) } \arguments{ \item{pred }{ An adjacency matrix corresponding to an estimated graph. It can be an object with \code{S3} class \code{"bdgraph"} from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{actual}{ An adjacency matrix corresponding to the actual graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. It can be a factor, numeric or character vector of responses (true class), typically encoded with 0 (controls) and 1 (cases). Only two classes can be used in a ROC curve. } \item{cutoff}{cutoff value for the case that \code{pred} is vector of probabilites. The default is 0.5. } \item{proportion}{ Logical: FALSE (default) for a confusion matrix with number of cases. TRUE, for a confusion matrix with the proportion of cases. } \item{dnn }{the names to be given to the dimensions in the result (the dimnames names). } \item{\dots }{further arguments to be passed to \code{table}. } } \value{ the results of \code{table} on \code{pred} and \code{actual}. } \author{Reza Mohammadi \email{a.mohammadi@uva.nl}} \seealso{ \code{\link{conf.mat.plot}}, \code{\link{compare}}, \code{\link{roc}}, \code{\link{bdgraph}} } \examples{ \dontrun{ set.seed( 100 ) # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) # Running sampling algorithm based on GGMs sample.ggm <- bdgraph( data = data.sim, method = "ggm", iter = 10000 ) # Confusion Matrix for GGM method conf.mat( pred = sample.ggm, actual = data.sim ) } } \keyword{structure learning} BDgraph/man/plotroc.Rd0000644000176200001440000000642413623244012014310 0ustar liggesusers\name{plotroc} \alias{plotroc} \title{ ROC plot } \description{ Draws the receiver operating characteristic (ROC) curve according to the true graph structure for object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. } \usage{ plotroc( target, est, est2 = NULL, est3 = NULL, est4 = NULL, cut = 20, smooth = FALSE, label = TRUE, main = "ROC Curve" ) } \arguments{ \item{target}{ An adjacency matrix corresponding to the true graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. } \item{est, est2, est3, est4}{ An upper triangular matrix corresponding to the estimated posterior probabilities for all possible links. It can be an object with \code{S3} class \code{"bdgraph"} from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. It can be an object of \code{S3} class \code{"select"}, from the function \code{\link[huge]{huge.select}} of \code{R} package \code{\link[huge]{huge}}. Options \code{est2, est3} and \code{est4} are for comparing two or more different approaches. } \item{cut }{ Number of cut points.} \item{smooth}{ Logical: for smoothing the ROC curve.} \item{label }{ Logical: for adding legend to the ROC plot.} \item{main }{ An overall title for the plot.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{\code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}, \code{\link{compare}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 30, p = 6, size = 7, vis = TRUE ) # Runing sampling algorithm bdgraph.obj <- bdgraph( data = data.sim, iter = 10000 ) # Comparing the results plotroc( data.sim, bdgraph.obj ) # To compare the results based on CGGMs approach bdgraph.obj2 <- bdgraph( data = data.sim, method = "gcgm", iter = 10000 ) # Comparing the resultss plotroc( data.sim, bdgraph.obj, bdgraph.obj2, label = FALSE ) legend( "bottomright", c( "GGMs", "GCGMs" ), lty = c( 1, 2 ), col = c( "black", "red" ) ) } } \keyword{hplot} BDgraph/man/plotcoda.Rd0000644000176200001440000000472713623244012014437 0ustar liggesusers\name{plotcoda} \alias{plotcoda} \title{ Convergence plot } \description{ Visualizes the cumulative occupancy fractions of all possible links in the graph. It can be used for monitoring the convergence of the sampling algorithms, BDMCMC and RJMCMC. } \usage{ plotcoda( bdgraph.obj, thin = NULL, control = TRUE, main = NULL, ... ) } \arguments{ \item{bdgraph.obj}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{thin}{ An option for getting fast result for a cumulative plot according to part of the iteration.} \item{control}{ Logical: if TRUE (default) and the number of nodes is greater than 15, then 100 links randomly is selected for visualization. } \item{main}{ Graphical parameter (see plot). } \item{\dots}{ System reserved (no specific usage). } } \details{ Note that a spending time for this function depends on the number of nodes. %It should be slow for high-dimensional graphs. For fast result, you can choose bigger value for the \code{'thin'} option. } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}, \code{\link{traceplot}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'circle' graph data.sim <- bdgraph.sim( n = 50, p = 6, graph = "circle", vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, iter = 10000, burnin = 0 , save = TRUE ) plotcoda( bdgraph.obj ) } } \keyword{hplot} BDgraph/man/plot.sim.Rd0000644000176200001440000000270413522542151014373 0ustar liggesusers\name{plot.sim} \alias{plot.sim} \title{ Plot function for \code{S3} class \code{"sim"} } \description{ Visualizes structure of the true graph. } \usage{ \method{plot}{sim}( x, ... ) } \arguments{ \item{x}{ An object of \code{S3} class \code{"sim"}, from function \code{\link{bdgraph.sim}}. } \item{\dots}{System reserved (no specific usage).} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{ \link{graph.sim}}, \link{bdgraph.sim} } \examples{ # Generating synthetic multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 10, p = 15 ) plot( data.sim ) } \keyword{hplot} BDgraph/man/gnorm.Rd0000644000176200001440000000433613522545403013756 0ustar liggesusers\name{gnorm} \alias{gnorm} \title{ Normalizing constant for G-Wishart } \description{ Calculates log of the normalizing constant of G-Wishart distribution based on the Monte Carlo method, developed by Atay-Kayis and Massam (2005). } \usage{ gnorm( adj, b = 3, D = diag( ncol( adj ) ), iter = 100 ) } \arguments{ \item{adj}{ The adjacency matrix corresponding to the graph structure. It is an upper triangular matrix in which \eqn{a_{ij}=1}{aij = 1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}{aij = 0}. } \item{b}{ The degree of freedom for G-Wishart distribution, \eqn{W_G(b, D)}. } \item{D}{ The positive definite \eqn{(p \times p)} "scale" matrix for G-Wishart distribution, \eqn{W_G(b,D)}. The default is an identity matrix. } \item{iter}{The number of iteration for the Monte Carlo approximation.} } \details{ Log of the normalizing constant approximation using Monte Carlo method for a G-Wishart distribution, \eqn{K \sim W_G(b, D)}, with density: \deqn{Pr(K) = \frac{1}{I(b, D)} |K| ^ {(b - 2) / 2} \exp \left\{- \frac{1}{2} \mbox{trace}(K \times D)\right\}.} } \value{ Log of the normalizing constant of G-Wishart distribution. } \references{ Atay-Kayis, A. and Massam, H. (2005). A monte carlo method for computing the marginal likelihood in nondecomposable Gaussian graphical models, \emph{Biometrika}, 92(2):317-335 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Uhler, C., et al (2018) Exact formulas for the normalizing constants of Wishart distributions for graphical models, \emph{The Annals of Statistics} 46(1):90-118 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{rgwish}}, \code{\link{rwish}} } \examples{ \dontrun{ # adj: adjacency matrix of graph with 3 nodes and 2 links adj <- matrix( c( 0, 0, 1, 0, 0, 1, 0, 0, 0 ), 3, 3, byrow = TRUE ) gnorm( adj, b = 3, D = diag( 3 ) ) } } \keyword{Wishart} \keyword{iteration} BDgraph/man/precision.Rd0000644000176200001440000000367113623244012014622 0ustar liggesusers\name{precision} \alias{precision} \title{ Estimated precision matrix } \description{ Provides the estimated precision matrix. } \usage{ precision( bdgraph.obj, round = 2 ) } \arguments{ \item{bdgraph.obj}{An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{round}{ A value for rounding all probabilities to the specified number of decimal places. } } \value{ A matrix which corresponds the estimated precision matrix.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{\code{\link{bdgraph}}, \code{\link{covariance}}, \code{\link{plinks}}} \examples{ \dontrun{ # Generating multivariate normal data from a 'circle' graph data.sim <- bdgraph.sim( n = 70, p = 6, graph = "circle", vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) precision( bdgraph.obj ) # Estimated precision matrix data.sim $ K # True precision matrix } } \keyword{parameter learning} BDgraph/man/plot.bdgraph.Rd0000644000176200001440000000427113522542146015217 0ustar liggesusers\name{plot.bdgraph} \alias{plot.bdgraph} \title{ Plot function for \code{S3} class \code{"bdgraph"} } \description{ Visualizes structure of the selected graphs which could be a graph with links for which their estimated posterior probabilities are greater than 0.5 or graph with the highest posterior probability. } \usage{ \method{plot}{bdgraph}( x, cut = 0.5, number.g = NULL, ... ) } \arguments{ \item{x}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. } \item{cut}{ Threshold for including the links in the selected graph based on the estimated posterior probabilities of the links; See the examples. } \item{number.g}{ The number of graphs with the highest probabilities. This option works for the case running function \code{bdgraph()} with option \code{save = TRUE}; See the examples. } \item{\dots}{System reserved (no specific usage).} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) plot( bdgraph.obj ) bdgraph.obj <- bdgraph( data = data.sim, save = TRUE ) plot( bdgraph.obj, number.g = 4 ) plot( bdgraph.obj, cut = 0.4 ) } } \keyword{hplot} BDgraph/man/geneExpression.Rd0000644000176200001440000000152414040077757015636 0ustar liggesusers\name{geneExpression} \alias{geneExpression} \docType{data} \title{ Human gene expression dataset } \description{ The dataset contains human gene expression of \eqn{100} transcripts (with unique Illumina TargetID) measured on \eqn{60} unrelated individuals. } \usage{ data( geneExpression ) } \format{ The format is a matrix with 60 rows (number of individuals) and 100 column (number of transcripts). } \references{ Bhadra, A. and Mallick, B. K. (2013). Joint High Dimensional Bayesian Variable and Covariance Selection with an Application to eQTL Analysis, \emph{Biometrics}, 69(2):447-457. Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138. } \examples{ data( geneExpression ) dim( geneExpression ) head( geneExpression ) } \keyword{ datasets } BDgraph/man/bf.Rd0000644000176200001440000000513213623244012013210 0ustar liggesusers\name{bf} \alias{bf} \title{ Bayes factor between two graphs } \description{ Compute the Bayes factor between the structure of two graphs. } \usage{ bf( num, den, bdgraph.obj, log = TRUE ) } \arguments{ \item{num, den}{ An adjacency matrix corresponding to the true graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. } \item{bdgraph.obj}{An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{log}{ A character value. If TRUE the Bayes factor is given as log(BF). } } \value{ A single numeric value, the Bayes factor of the two graph structures \code{num} and \code{den}.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 } \author{Reza Mohammadi \email{a.mohammadi@uva.nl}} \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}, \code{\link{compare}}, \code{\link{bdgraph.sim}}} \examples{ \dontrun{ # Generating multivariate normal data from a 'circle' graph data.sim <- bdgraph.sim( n = 50, p = 6, graph = "circle", vis = TRUE ) # Running sampling algorithm bdgraph.obj <- bdgraph( data = data.sim ) graph_1 <- graph.sim( p = 6, vis = TRUE ) graph_2 <- graph.sim( p = 6, vis = TRUE ) bf( num = graph_1, den = graph_2, bdgraph.obj = bdgraph.obj ) } } \keyword{structure learning} BDgraph/man/BDgraph-package.Rd0000644000176200001440000001027613717276724015551 0ustar liggesusers\name{BDgraph-package} \alias{BDgraph-package} \alias{BDgraph} \alias{ compute_tp_fp } \alias{ compute_measures } \alias{ get_graph } \alias{ get_g_prior } \alias{ get_g_start } \alias{ get_K_start } \alias{ get_S_n_p } \alias{ get_cores } \alias{ hill_climb_mpl } \alias{ local_mb_hc } \alias{ global_hc } \alias{ log_mpl_disrete } \alias{ hill_climb_mpl_binary } \alias{ local_mb_hc_binary } \alias{ global_hc_binary } \alias{ log_mpl_binary } \alias{ detect_cores } \alias{ sample_ug } \alias{ generate_clique_factors } \alias{ calc_joint_dist } \docType{package} \title{ Bayesian Structure Learning in Graphical Models } \description{ The \code{R} package \pkg{BDgraph} provides statistical tools for Bayesian structure learning in undirected graphical models for continuous, count, binary, and mixed data. The package is implemented the recent improvements in the Bayesian graphical models literature, including Mohammadi and Wit (2015), Mohammadi et al. (2017), Dobra and Mohammadi (2018), and Letac et al. (2018). The computationally intensive tasks of the package are implemented in parallel using \pkg{OpenMP} in \code{C++} and interfaced with \code{R}, to speed up the computations. Besides, the package contains several functions for simulation and visualization, as well as several multivariate datasets taken from the literature. } \section{How to cite this package}{ To cite \pkg{BDgraph} in publications use: \preformatted{ Mohammadi, R. and Wit, E. C. (2019). BDgraph: An R Package for Bayesian Structure Learning in Graphical Models, Journal of Statistical Software, 89(3):1-30. doi:10.18637/jss.v089.i03 } } \author{ Reza Mohammadi \cr Amsterdam Business School \cr University of Amsterdam Maintainer: Reza Mohammadi \email{a.mohammadi@uva.nl} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30. Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A., et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Dobra, A. and Lenkoski, A. (2011). Copula Gaussian graphical models and their application to modeling functional disability data, \emph{The Annals of Applied Statistics}, 5(2A):969-93 Dobra, A., et al. (2011). Bayesian inference for general Gaussian graphical models with application to multivariate lattice data. \emph{Journal of the American Statistical Association}, 106(496):1418-33 Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 Lenkoski, A. (2013). A direct sampler for G-Wishart variates, \emph{Stat}, 2(1):119-28 Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}, \code{\link{bdgraph.sim}}, \code{\link{compare}}, \code{\link{rgwish}} } \examples{ \dontrun{ library( BDgraph ) # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 70, p = 6, size = 7, vis = TRUE ) # Running algorithm based on GGMs bdgraph.obj <- bdgraph( data = data.sim, iter = 5000 ) summary( bdgraph.obj ) # To compare the result with true graph compare( data.sim, bdgraph.obj, main = c( "Target", "BDgraph" ), vis = TRUE ) # Running algorithm based on GGMs and marginal pseudo-likelihood bdgraph.obj_mpl <- bdgraph.mpl( data = data.sim, iter = 5000 ) summary( bdgraph.obj_mpl ) # To compare the results of both algorithms with true graph compare( data.sim, bdgraph.obj, bdgraph.obj_mpl, main = c( "Target", "BDgraph", "BDgraph_mpl" ), vis = TRUE ) } } \keyword{package} BDgraph/man/pgraph.Rd0000644000176200001440000000474313522543030014111 0ustar liggesusers\name{pgraph} \alias{pgraph} \title{ Posterior probabilities of the graphs } \description{ Provides the estimated posterior probabilities for the most likely graphs or a specific graph. } \usage{ pgraph( bdgraph.obj, number.g = 4, adj = NULL ) } \arguments{ \item{bdgraph.obj}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. } \item{number.g}{ The number of graphs with the highest posterior probabilities to be shown. This option is ignored if \code{'adj'} is specified. } \item{adj}{ An adjacency matrix corresponding to a graph structure. It is an upper triangular matrix in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i} and \eqn{j}, otherwise \eqn{a_{ij}=0}. It also can be an object of \code{S3} class \code{"sim"}, from function \code{\link{bdgraph.sim}}. } } \value{ \item{ selected_g }{ the adjacency matrices which corresponding to the graphs with the highest posterior probabilities.} \item{ prob_g }{ A vector of the posterior probabilities of the graphs corresponding to \code{'selected\_g'}.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 6, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, save = TRUE ) # Estimated posterior probability of the true graph pgraph( bdgraph.obj, adj = data.sim ) # Estimated posterior probability of first and second graphs with highest probabilities pgraph( bdgraph.obj, number.g = 2 ) } } \keyword{structure learning} BDgraph/man/roc.Rd0000644000176200001440000001345314041546274013423 0ustar liggesusers\name{roc} \alias{roc} \title{ Build a ROC curve } \description{ This function builds a ROC curve specifically for graph structure learning and returns a \dQuote{roc} object, a list of class \dQuote{roc}. This object can be \code{prin}ted, \code{plot}ted, or passed to the functions \code{\link[pROC:roc]{pROC::roc()}}, \code{\link[pROC:ci]{pROC::ci()}}, \code{\link[pROC:smooth.roc]{pROC::smooth.roc()}} and \code{\link[pROC:coords]{pROC::coords()}}. Additionally, two \code{roc} objects can be compared with \code{\link[pROC:roc.test]{pROC::roc.test()}}. This function is based on the \code{\link[pROC]{roc}} function of \code{R} package \code{pROC}. } \usage{ roc( pred, actual, auc = TRUE, smooth = FALSE, plot = FALSE, ... ) } \arguments{ \item{pred }{ An adjacency matrix corresponding to an estimated graph. It can be an object with \code{S3} class \code{"bdgraph"} from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. It can be a \code{\link{numeric}} or \code{\link{ordered}} vector of the same length than \code{actual}, containing the predicted value of each observation. } \item{actual}{ An adjacency matrix corresponding to the actual graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. It can be a factor, numeric or character vector of responses (true class), typically encoded with 0 (controls) and 1 (cases). Only two classes can be used in a ROC curve. } \item{smooth}{if TRUE, the ROC curve is passed to \code{\link{smooth}} to be smoothed. } \item{auc}{compute the area under the curve (AUC)? If \code{TRUE} (default), additional arguments can be passed to \code{\link[pROC:auc]{pROC::auc()}}. } \item{plot}{plot the ROC curve? If \code{TRUE}, additional arguments can be passed to \code{\link[pROC:plot.roc]{pROC::plot.roc()}}. } \item{\dots}{ further arguments to be passed to \code{\link[pROC:roc]{pROC::roc()}}. } } \value{ If the data contained any \code{NA} value and \code{na.rm=FALSE}, \code{NA} is returned. Otherwise, if \code{smooth=FALSE}, a list of class \dQuote{roc} with the following fields: \item{auc}{if called with \code{auc=TRUE}, a numeric of class \dQuote{auc} as defined in \code{\link[pROC:auc]{pROC::auc()}}. } \item{ci}{if called with \code{ci=TRUE}, a numeric of class \dQuote{ci} as defined in \code{\link[pROC:ci]{pROC::ci()}}. } \item{response}{the response vector. Patients whose response is not \code{\link{\%in\%}} \code{levels} are discarded. If \code{NA} values were removed, a \code{na.action} attribute similar to \code{\link{na.omit}} stores the row numbers. } \item{predictor}{the predictor vector converted to numeric as used to build the ROC curve. Patients whose response is not \code{\link{\%in\%}} \code{levels} are discarded. If \code{NA} values were removed, a \code{na.action} attribute similar to \code{\link{na.omit}} stores the row numbers. } \item{original.predictor, original.response}{the response and predictor vectors as passed in argument.} \item{levels}{the levels of the response as defined in argument.} \item{controls}{the predictor values for the control observations.} \item{cases}{the predictor values for the cases.} \item{percent}{if the sensitivities, specificities and AUC are reported in percent, as defined in argument. } \item{direction}{the direction of the comparison, as defined in argument.} \item{fun.sesp}{the function used to compute sensitivities and specificities. Will be re-used in bootstrap operations.} \item{sensitivities}{the sensitivities defining the ROC curve.} \item{specificities}{the specificities defining the ROC curve.} \item{thresholds}{the thresholds at which the sensitivities and specificities were computed. See below for details. } \item{call}{how the function was called. See \code{\link{match.call}} for more details. } If \code{smooth=TRUE} a list of class \dQuote{smooth.roc} as returned by \code{\link[pROC:smooth]{pROC::smooth()}}, with or without additional elements \code{auc} and \code{ci} (according to the call). } \references{ Tom Fawcett (2006) ``An introduction to ROC analysis''. \emph{Pattern Recognition Letters} \bold{27}, 861--874. DOI: \doi{10.1016/j.patrec.2005.10.010}. Xavier Robin, Natacha Turck, Alexandre Hainard, \emph{et al.} (2011) ``pROC: an open-source package for R and S+ to analyze and compare ROC curves''. \emph{BMC Bioinformatics}, \bold{7}, 77. DOI: \doi{10.1186/1471-2105-12-77}. } \author{Reza Mohammadi \email{a.mohammadi@uva.nl}} \seealso{ \code{\link[pROC:auc]{pROC::auc()}}, \code{\link[pROC:plot.roc]{pROC::plot.roc()}}, \code{\link[pROC:print.roc]{pROC::print.roc()}}, \code{\link{bdgraph}} } \examples{ \dontrun{ set.seed( 100 ) # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) # Running sampling algorithm based on GGMs sample.ggm <- bdgraph( data = data.sim, method = "ggm", iter = 10000 ) # ROC curve for GGM method roc.ggm <- roc( pred = sample.ggm, actual = data.sim, plot = TRUE ) # Running sampling algorithm based on GCGMs sample.gcgm <- bdgraph( data = data.sim, method = "gcgm", iter = 10000 ) # ROC curve for GGM and GCGM methods roc.gcgm <- roc( pred = sample.gcgm, actual = data.sim, plot = TRUE ) ggroc( list( roc.ggm = roc.ggm, roc.gcgm = roc.gcgm ) ) } } \keyword{structure learning} BDgraph/man/summary.bdgraph.Rd0000644000176200001440000000421313464043234015731 0ustar liggesusers\name{summary.bdgraph} \alias{summary.bdgraph} \title{ Summary function for \code{S3} class \code{"bdgraph"} } \description{ Provides a summary of the results for function \code{\link{bdgraph}}. } \usage{ \method{summary}{bdgraph}( object, round = 2, vis = TRUE, ... ) } \arguments{ \item{object}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. } \item{round}{ A value for rounding all probabilities to the specified number of decimal places. } \item{vis}{ Visualize the results. } \item{\dots}{System reserved (no specific usage).} } \value{ \item{selected_g}{The adjacency matrix corresponding to the selected graph which has the highest posterior probability.} \item{p_links}{An upper triangular matrix corresponding to the posterior probabilities of all possible links.} \item{K_hat}{The estimated precision matrix.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) summary( bdgraph.obj ) bdgraph.obj <- bdgraph( data = data.sim, save = TRUE ) summary( bdgraph.obj ) summary( bdgraph.obj, vis = FALSE ) } } BDgraph/man/rmvnorm.Rd0000644000176200001440000000205413522537042014327 0ustar liggesusers\name{rmvnorm} \alias{rmvnorm} \title{ Generate data from the multivariate Normal distribution } \description{ Random generation function from the multivariate Normal distribution with mean equal to \eqn{mean} and covariance matrix \eqn{sigma}. } \usage{ rmvnorm( n = 10, mean = rep( 0, length = ncol( sigma ) ), sigma = diag( length( mean ) ) ) } \arguments{ \item{n}{ Number of observations. } \item{mean}{ Mean vector, default is \eqn{rep( 0, length = ncol( sigma ) )}. } \item{sigma}{ positive definite covariance matrix, default is \eqn{ diag( length( mean ) ) }. } } \value{ A numeric matrix with rows equal to \eqn{n} and columns equal to \eqn{length( mean )}. } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{\code{\link{bdgraph.sim}}, \code{\link{rwish}}, \code{\link{rgwish}} } \examples{ mean <- c( 5, 20 ) sigma <- matrix( c( 4, 2, 2, 5 ), 2, 2 ) # covariance matrix sample <- rmvnorm( n = 500, mean = mean, sigma = sigma ) plot( sample ) } \keyword{ distribution } BDgraph/man/plinks.Rd0000644000176200001440000000406113623244012014121 0ustar liggesusers\name{plinks} \alias{plinks} \title{ Estimated posterior link probabilities } \description{ Provides the estimated posterior link probabilities for all possible links in the graph. } \usage{ plinks( bdgraph.obj, round = 2, burnin = NULL ) } \arguments{ \item{bdgraph.obj}{An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{round}{ A value for rounding all probabilities to the specified number of decimal places. } \item{burnin}{ The number of burn-in iteration to scape. } } \value{ An upper triangular matrix which corresponds the estimated posterior probabilities for all possible links.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{\code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}} \examples{ \dontrun{ # Generating multivariate normal data from a 'circle' graph data.sim <- bdgraph.sim( n = 70, p = 6, graph = "circle", vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, iter = 10000 ) plinks( bdgraph.obj, round = 2 ) } } \keyword{structure learning} BDgraph/man/surveyData.Rd0000644000176200001440000000177213464043234014764 0ustar liggesusers\name{surveyData} \alias{surveyData} \docType{data} \title{ Labor force survey data } \description{ The survey dataset concerns 1002 males in the U.S labor force, described by Hoff (2007). The seven observed variables which have been measured on various scales are as follow: the income (income), degree (degree), the number of children (children), parents income (pincome), parents degree (pdegree), number of parents children (pchildren), and age (age). } \usage{ data( surveyData ) } \format{ The format is a matrix with 1002 rows (number of individuals) and 7 column (number of variables). } \references{ Hoff, P. (2007). Extending the rank likelihood for semiparametric copula estimation, \emph{The Annals of Applied Statistics, 1(1)}, 265-283. Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 } \examples{ data( surveyData ) summary( surveyData ) } \keyword{ datasets } BDgraph/man/graph.sim.Rd0000644000176200001440000000474413523032320014515 0ustar liggesusers\name{graph.sim} \alias{graph.sim} \title{ Graph simulation } \description{ Simulating undirected graph structures, including \code{"random"}, \code{"cluster"}, \code{"scale-free"}, \code{"lattice"}, \code{"hub"}, \code{"star"}, and \code{"circle"}. } \usage{ graph.sim( p = 10, graph = "random", prob = 0.2, size = NULL, class = NULL, vis = FALSE ) } \arguments{ \item{p}{The number of variables (nodes).} \item{graph}{ The undirected graph with options \code{"random"}, \code{"cluster"}, \code{"scale-free"}, \code{"lattice"}, \code{"hub"}, \code{"star"}, and \code{"circle"}. It also could be an adjacency matrix corresponding to a graph structure (an upper triangular matrix in which \eqn{g_{ij}=1} if there is a link between notes \eqn{i} and \eqn{j}, otherwise \eqn{g_{ij}=0}). } \item{prob}{ If \code{graph="random"}, it is the probability that a pair of nodes has a link.} \item{size}{The number of links in the true graph (graph size).} \item{class}{ If \code{graph="cluster"}, it is the number of classes. } \item{vis}{Visualize the true graph structure.} } \value{ The adjacency matrix corresponding to the simulated graph structure, as an object with \code{S3} class \code{"graph"}.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{bdgraph.sim}}, \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ # Generating a 'hub' graph adj <- graph.sim( p = 8, graph = "scale-free" ) plot( adj ) adj } \keyword{ simulation } \keyword{graphs} BDgraph/man/ddweibull.Rd0000644000176200001440000000444014043516601014600 0ustar liggesusers\name{Discrete Weibull} \alias{ddweibull} \alias{pdweibull} \alias{qdweibull} \alias{rdweibull} \title{ The Discrete Weibull Distribution (Type 1) } \description{ Density, distribution function, quantile function and random generation for the discrete Weibull distribution (type I) with parameters \eqn{q} and \eqn{\beta}. } \usage{ ddweibull( x, q = exp( -1 ), beta = 1, zero = TRUE ) pdweibull( x, q = exp( -1 ), beta = 1, zero = TRUE ) qdweibull( p, q = exp( -1 ), beta = 1, zero = TRUE ) rdweibull( n, q = exp( -1 ), beta = 1, zero = TRUE ) } \arguments{ \item{x}{ vector of quantiles.} \item{p}{ vector of probabilities. } \item{q, beta}{ shape and scale parameters, the latter defaulting to 1. } \item{zero}{ logical; if \code{TRUE} (default), the support contains \eqn{0}; \code{FALSE} otherwise. } \item{n}{ number of observations. If \code{length(n) > 1}, the length is taken to be the number required. } } \details{ The discrete Weibull distribution has density given by \deqn{ f(x) = q^{x^\beta} - q^{(x+1)^\beta}, x = 0, 1, 2, \ldots }{ f(x) = q^x^\beta - q^(x+1)^\beta, x = 0, 1, 2, \ldots } And for the case \code{zero} = \code{FALSE}: \deqn{ f(x) = q^{(x-1)^\beta} - q^{x^\beta}, x = 1, 2, \ldots }{ f(x) = q^(x-1)^\beta - q^x^\beta, x = 1, 2, \ldots } Cumulative distribution function \deqn{ F(x) = 1-q^{(x+1)^\beta} }{ F(x) = 1-q^(x+1)^\beta } And for the case \code{zero} = \code{FALSE}, \code{x+1} should replaced by \code{x}. } \value{ \code{ddweibull} gives the density, \code{pdweibull} gives the distribution function, \code{qdweibull} gives the quantile function, and \code{rdweibull} generates random values. } \references{ Nakagawa, T. and Osaki, S. (1975). The Discrete Weibull Distribution. \emph{IEEE Transactions on Reliability}, R-24, 300-301. } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl}, Pariya Behrouzi, Veronica Vinciotti } \examples{ n <- 1000 q <- 0.4 beta <- 0.8 rdw <- rdweibull( n = n, q = q, beta = beta ) plot( prop.table( table( rdw ) ), type = "h", col = "gray50" ) x <- 0:max( rdw ) lines( x, ddweibull( x = x, q = q, beta = beta ), type = "o", col = "blue", lwd = 2 ) hist( pdweibull( x = rdw, q = q, beta = beta ) ) plot( ecdf( rdw ) ) lines( x, pdweibull( x, q = q, beta = beta ), col = "blue", lwd = 2, type = "s" ) } \keyword{distribution} BDgraph/man/bdgraph.npn.Rd0000644000176200001440000000400413532154462015027 0ustar liggesusers\name{bdgraph.npn} \alias{bdgraph.npn} \title{Nonparametric transfer} \description{ Transfers non-Gaussian data to Gaussian. } \usage{ bdgraph.npn( data, npn = "shrinkage", npn.thresh = NULL ) } \arguments{ \item{data}{ An (\eqn{n \times p}{n x p}) \code{matrix} or a \code{data.frame} corresponding to the data (\eqn{n} is the sample size and \eqn{p} is the number of variables). } \item{npn}{ A character with three options \code{"shrinkage"} (default), \code{"truncation"}, and \code{"skeptic"}. Option \code{"shrinkage"} is for the shrunken transformation, option \code{"truncation"} is for the truncated transformation and option \code{"skeptic"} is for the non-paranormal skeptic transformation. For more details see references. } \item{npn.thresh}{ The truncation threshold; it is only for the truncated transformation (\code{npn=} \code{"truncation"}). The default value is \eqn{1/(4n^{1/4} \sqrt{\pi \log(n)})}. } } \value{ An (\eqn{n \times p}) matrix of transferred data, if \code{npn = "shrinkage" or "truncation"}, and a non-paranormal correlation (\eqn{p \times p}) matrix, if \code{npn = "skeptic"}. } \references{ Liu, H., et al (2012). High Dimensional Semiparametric Gaussian Copula Graphical Models, \emph{Annals of Statistics}, 40(4):2293-2326 Zhao, T. and Liu, H. (2012). The \pkg{huge} Package for High-dimensional Undirected Graph Estimation in \code{R}, \emph{Journal of Machine Learning Research}, 13:1059-1062 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{bdgraph.sim}}, \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 6, p = 4, size = 4 ) data <- ( data.sim $ data - 3 ) ^ 4 data # Transfer the data by truncation bdgraph.npn( data, npn = "truncation" ) # Transfer the data by shrunken bdgraph.npn( data, npn = "shrunken" ) # Transfer the data by skeptic bdgraph.npn( data, npn = "skeptic" ) } } \keyword{data preprocessing} BDgraph/man/adj2link.Rd0000644000176200001440000000367713724415143014342 0ustar liggesusers\name{adj2link} \alias{adj2link} \title{ Extract links from an adjacency matrix } \description{ Extract links from an adjacency matrix or an object of calsses \code{"sim"} from function \code{\link{bdgraph.sim}} and \code{"graph"} from function \code{\link{graph.sim}}.} \usage{ adj2link( adj ) } \arguments{ \item{adj}{ An adjacency matrix corresponding to a graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. } } \value{ A matrix corresponding to the extracted links from graph structure.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{link2adj}}, \code{\link{graph.sim}} } \examples{ # Generating a 'random' graph adj <- graph.sim( p = 6, vis = TRUE ) adj2link( adj ) } \keyword{graphs} BDgraph/man/print.bdgraph.Rd0000644000176200001440000000342213522542527015375 0ustar liggesusers\name{print.bdgraph} \alias{print.bdgraph} \title{Print function for \code{S3} class \code{"bdgraph"} } \description{ Prints the information about the selected graph which could be a graph with links for which their estimated posterior probabilities are greater than 0.5 or graph with the highest posterior probability. It provides adjacency matrix, size and posterior probability of the selected graph. } \usage{\method{print}{bdgraph}( x, ... )} \arguments{ \item{x}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. } \item{\dots}{ System reserved (no specific usage). } } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim ) print( bdgraph.obj ) } } \keyword{print} BDgraph/man/bdgraph.sim.Rd0000644000176200001440000001341014043533762015027 0ustar liggesusers\name{bdgraph.sim} \alias{bdgraph.sim} \title{ Graph data simulation } \description{ Simulating multivariate distributions with different types of underlying graph structures, including \code{"random"}, \code{"cluster"}, \code{"scale-free"}, \code{"lattice"}, \code{"hub"}, \code{"star"}, \code{"circle"}, \code{"AR(1)"}, and \code{"AR(2)"}. Based on the underling graph structure, it generates different types of \emph{multivariate} data, including \emph{multivariate Gaussian}, \emph{non-Gaussian}, \emph{count}, \emph{mixed}, \emph{binary}, or \emph{discrete Weibull} data. This function can be used also for only simulating graphs by option \code{n=0}, as a default. } \usage{ bdgraph.sim( p = 10, graph = "random", n = 0, type = "Gaussian", prob = 0.2, size = NULL, mean = 0, class = NULL, cut = 4, b = 3, D = diag( p ), K = NULL, sigma = NULL, q = exp(-1), beta = 1, vis = FALSE ) } \arguments{ \item{p}{The number of variables (nodes).} \item{graph}{The graph structure with options \code{"random"}, \code{"cluster"}, \code{"scale-free"}, \code{"lattice"}, \code{"hub"}, \code{"star"}, \code{"circle"}, \code{"AR(1)"}, and \code{"AR(2)"}. It also could be an adjacency matrix corresponding to a graph structure (an upper triangular matrix in which \eqn{g_{ij}=1} if there is a link between notes \eqn{i} and \eqn{j}, otherwise \eqn{g_{ij}=0}). } \item{n}{The number of samples required. Note that for the case \code{n = 0}, only graph is generated. } \item{type}{Type of data with four options \code{"Gaussian"} (default), \code{"non-Gaussian"}, \code{"count"}, \code{"mixed"}, \code{"binary"}, and \code{"dw"}. For the option \code{"Gaussian"}, data are generated from multivariate normal distribution. For the option \code{"non-Gaussian"}, data are transfered multivariate normal distribution to continuous multivariate non-Gaussian distribution. For the option \code{"count"}, data are transfered from multivariate normal distribution to multivariate count data. For the option \code{"mixed"}, data are transfered from multivariate normal distribution to mixture of 'count', 'ordinal', 'non-Gaussian', 'binary' and 'Gaussian', respectively. For the option \code{"binary"}, data are generated directly from the joint distribution, in this case \eqn{p} must be less than \eqn{17}. For the option \code{"dw"}, data are transfered from multivariate normal distribution to the discrete Weibull distribution with parameters \code{q} and \code{beta}. } \item{prob}{ If \code{graph="random"}, it is the probability that a pair of nodes has a link.} \item{size}{The number of links in the true graph (graph size).} \item{mean}{A vector specifies the mean of the variables.} \item{class}{ If \code{graph="cluster"}, it is the number of classes. } \item{cut}{ If \code{type="count"}, it is the number of categories for simulating count data.} \item{b}{The degree of freedom for G-Wishart distribution, \eqn{W_G(b, D)}.} \item{D}{The positive definite \eqn{(p \times p)} "scale" matrix for G-Wishart distribution, \eqn{W_G(b, D)}. The default is an identity matrix.} \item{K}{ If \code{graph="fixed"}, it is a positive-definite symmetric matrix specifies as a true precision matrix. } \item{sigma}{ If \code{graph="fixed"}, it is a positive-definite symmetric matrix specifies as a true covariance matrix.} \item{q, beta}{ If \code{type="dw"}, they are the parameters of the discrete Weibull distribution with density \deqn{p(x,q,\beta) = q^{x^{\beta}}-q^{(x+1)^{\beta}}, \quad \forall x = \{ 0, 1, 2, \ldots \}. } } \item{vis}{Visualize the true graph structure.} } \value{ An object with \code{S3} class \code{"sim"} is returned: \item{data}{Generated data as an (\eqn{n \times p}{n x p}) matrix.} \item{sigma}{The covariance matrix of the generated data.} \item{K}{The precision matrix of the generated data.} \item{G}{The adjacency matrix corresponding to the true graph structure.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl}, Pariya Behrouzi, Veronica Vinciotti, and Ernst Wit } \seealso{ \code{\link{graph.sim}}, \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( p = 10, n = 50, prob = 0.3, vis = TRUE ) print( data.sim ) # Generating multivariate normal data from a 'hub' graph data.sim <- bdgraph.sim( p = 6, n = 3, graph = "hub", vis = FALSE ) round( data.sim $ data, 2 ) # Generating mixed data from a 'hub' graph data.sim <- bdgraph.sim( p = 8, n = 10, graph = "hub", type = "mixed" ) round( data.sim $ data, 2 ) # Generating only a 'scale-free' graph (with no data) graph.sim <- bdgraph.sim( p = 8, graph = "scale-free" ) plot( graph.sim ) graph.sim $ G } } \keyword{ datagen } \keyword{ simulation } BDgraph/man/churn.Rd0000644000176200001440000000446214040074560013750 0ustar liggesusers\name{churn} \alias{churn} \docType{data} \title{ Churn data set } \description{ The data can be downloaded from IBM Sample Data Sets. Customer \emph{churn} occurs when customers stop doing business with a company, also known as customer attrition. The data set contains \eqn{3333} rows (customers) and \eqn{20} columns (features). The "Churn" column is our target which indicate whether customer churned (left the company) or not. } \usage{ data( churn ) } \format{ The \code{churn} dataset, as a data frame, contains \eqn{3333} rows (customers) and \eqn{20} columns (variables/features). The \eqn{20} variables are: \itemize{ \item \code{State}: Categorical, for the \eqn{50} states and the District of Columbia. \item \code{Account.Length}: count, how long account has been active. \item \code{Area.Code}: Categorical. \item \code{Int.l.Plan}: Categorical, yes or no, international plan. \item \code{VMail.Plan}: Categorical, yes or no, voice mail plan. \item \code{VMail.Message}: Count, number of voice mail messages. \item \code{Day.Mins}: Continuous, minutes customer used service during the day. \item \code{Day.Calls}: Count, total number of calls during the day. \item \code{Day.Charge}: Continuous, total charge during the day. \item \code{Eve.Mins}: Continuous, minutes customer used service during the evening. \item \code{Eve.Calls}: Count, total number of calls during the evening. \item \code{Eve.Charge}: Continuous, total charge during the evening. \item \code{Night.Mins}: Continuous, minutes customer used service during the night. \item \code{Night.Calls}: Count, total number of calls during the night. \item \code{Night.Charge}: Continuous, total charge during the night. \item \code{Intl.Mins}: Continuous, minutes customer used service to make international calls. \item \code{Intl.Calls}: Count, total number of international calls. \item \code{Intl.Charge}: Continuous, total international charge. \item \code{CustServ.Calls}: Count, number of calls to customer service. \item \code{Churn}: Categorical, True or False. Indicator of whether the customer has left the company (True or False). } } \references{ Larose, D. T. and Larose, C. D. (2014). Discovering knowledge in data: an introduction to data mining. \emph{John Wiley & Sons}. } \examples{ data( churn ) summary( churn ) } \keyword{ datasets } BDgraph/man/rgwish.Rd0000644000176200001440000000616013534157726014146 0ustar liggesusers\name{rgwish} \alias{rgwish} \title{Sampling from G-Wishart distribution} \description{ Generates random matrices, distributed according to the G-Wishart distribution with parameters b and D, \eqn{W_G(b, D)} with respect to the graph structure \eqn{G}. Note this fuction works for both non-decomposable and decomposable graphs. } \usage{ rgwish( n = 1, adj = NULL, b = 3, D = NULL, threshold = 1e-8 ) } \arguments{ \item{n}{The number of samples required. } \item{adj}{ The adjacency matrix corresponding to the graph structure which can be non-decomposable or decomposable. It should be an upper triangular matrix in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. \code{adj} could be an object of class \code{"graph"}, from function \code{\link{graph.sim}}. It also could be an object of class \code{"sim"}, from function \code{\link{bdgraph.sim}}. It also could be an object of class \code{"bdgraph"}, from functions \code{\link{bdgraph.mpl}} or \code{\link{bdgraph}}. } \item{b}{The degree of freedom for G-Wishart distribution, \eqn{W_G(b, D)}. } \item{D}{The positive definite \eqn{(p \times p)} "scale" matrix for G-Wishart distribution, \eqn{W_G(b, D)}. The default is an identity matrix.} \item{threshold}{ The threshold value for the convergence of sampling algorithm from G-Wishart.} } \details{ Sampling from G-Wishart distribution, \eqn{K \sim W_G(b, D)}, with density: \deqn{Pr(K) \propto |K| ^ {(b - 2) / 2} \exp \left\{- \frac{1}{2} \mbox{trace}(K \times D)\right\},} which \eqn{b > 2} is the degree of freedom and D is a symmetric positive definite matrix. } \value{ A numeric array, say A, of dimension \eqn{(p \times p \times n)}, where each \eqn{A[,,i]}{A[,,i]} is a positive definite matrix, a realization of the G-Wishart distribution, \eqn{W_G(b, D)}. Note, for the case \eqn{n=1}, the output is a matrix. } \references{ Lenkoski, A. (2013). A direct sampler for G-Wishart variates, \emph{Stat}, 2:119-128 Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{gnorm}}, \code{\link{rwish}} } \examples{ # Generating a 'circle' graph as a non-decomposable graph adj <- graph.sim( p = 5, graph = "circle" ) adj # adjacency of graph with 5 nodes sample <- rgwish( n = 1, adj = adj, b = 3, D = diag( 5 ) ) round( sample, 2 ) sample <- rgwish( n = 5, adj = adj ) round( sample, 2 ) } \keyword{Wishart} \keyword{ distribution } BDgraph/man/bdgraph.mpl.Rd0000644000176200001440000001411613623517145015033 0ustar liggesusers\name{bdgraph.mpl} \alias{bdgraph.mpl} \title{ Search algorithm in graphical models using marginal pseudo-likehlihood } \description{ This function consists of several sampling algorithms for Bayesian model determination in undirected graphical models based on mariginal pseudo-likelihood. % based on birth-death MCMC method. To speed up the computations, the birth-death MCMC sampling algorithms are implemented in parallel using \pkg{OpenMP} in \code{C++}. } \usage{ bdgraph.mpl( data, n = NULL, method = "ggm", transfer = TRUE, algorithm = "bdmcmc", iter = 5000, burnin = iter / 2, g.prior = 0.5, g.start = "empty", jump = NULL, alpha = 0.5, save = FALSE, cores = NULL, operator = "or" ) } \arguments{ \item{data}{ There are two options: (1) an (\eqn{n \times p}) \code{matrix} or a \code{data.frame} corresponding to the data, (2) an (\eqn{p \times p}) covariance matrix as \eqn{S=X'X} which \eqn{X} is the data matrix (\eqn{n} is the sample size and \eqn{p} is the number of variables). It also could be an object of class \code{"sim"}, from function \code{\link{bdgraph.sim}}. The input matrix is automatically identified by checking the symmetry. } \item{n}{The number of observations. It is needed if the \code{"data"} is a covariance matrix.} \item{method}{ A character with two options \code{"ggm"} (default), \code{"dgm"} and \code{"dgm-binary"}. Option \code{"ggm"} is for Gaussian graphical models based on Gaussianity assumption. Option \code{"dgm"} is for discrete graphical models for the count data. Option \code{"dgm-binary"} is for discrete graphical models for the data that are binary. } \item{transfer}{ For only count data which \code{method = "dgm"} or \code{method = "dgm-binary"}. } \item{algorithm}{ A character with two options \code{"bdmcmc"} (default) and \code{"rjmcmc"}. Option \code{"bdmcmc"} is based on birth-death MCMC algorithm. Option \code{"rjmcmc"} is based on reverible jump MCMC algorithm. Option \code{"hc"} is based on hill-climbing algorithm; this algorithm is only for count data which \code{method = "dgm"} or \code{method = "dgm-binary"}. } \item{iter}{ The number of iteration for the sampling algorithm. } \item{burnin}{ The number of burn-in iteration for the sampling algorithm. } \item{g.prior}{ For determining the prior distribution of each edge in the graph. There are two options: a single value between \eqn{0} and \eqn{1} (e.g. \eqn{0.5} as a noninformative prior) or an (\eqn{p \times p}) matrix with elements between \eqn{0} and \eqn{1}. } \item{g.start}{ Corresponds to a starting point of the graph. It could be an (\eqn{p \times p}) matrix, \code{"empty"} (default), or \code{"full"}. Option \code{"empty"} means the initial graph is an empty graph and \code{"full"} means a full graph. It also could be an object with \code{S3} class \code{"bdgraph"} of \code{R} package \code{\link[BDgraph]{BDgraph}} or the class \code{"ssgraph"} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}; this option can be used to run the sampling algorithm from the last objects of previous run (see examples). } \item{jump}{ It is only for the BDMCMC algorithm (\code{algorithm = "bdmcmc"}). It is for simultaneously updating multiple links at the same time to update graph in the BDMCMC algorithm. } \item{alpha}{ Value of the hyper parameter of Dirichlet, which is a prior distribution. } \item{save}{ Logical: if FALSE (default), the adjacency matrices are NOT saved. If TRUE, the adjacency matrices after burn-in are saved. } \item{cores}{ The number of cores to use for parallel execution. The case \code{cores="all"} means all CPU cores to use for parallel execution. %The default is to use "all" CPU cores of the computer. } \item{operator}{ A character with two options \code{"or"} (default) and \code{"and"}. It is for hill-climbing algorithm. } } \value{ An object with \code{S3} class \code{"bdgraph"} is returned: \item{p_links}{ An upper triangular matrix which corresponds the estimated posterior probabilities of all possible links. } For the case "save = TRUE" is returned: \item{sample_graphs}{ A vector of strings which includes the adjacency matrices of visited graphs after burn-in.} \item{graph_weights}{ A vector which includes the waiting times of visited graphs after burn-in. } \item{all_graphs}{A vector which includes the identity of the adjacency matrices for all iterations after burn-in. It is needed for monitoring the convergence of the BD-MCMC algorithm.} \item{all_weights}{A vector which includes the waiting times for all iterations after burn-in. It is needed for monitoring the convergence of the BD-MCMC algorithm.} } \references{ Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 Pensar, J. et al (2017) Marginal pseudo-likelihood learning of discrete Markov network structures, \emph{Bayesian Analysis}, 12(4):1195-215 Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl}, Adrian Dobra, and Johan Pensar } \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.sim}}, \code{\link{summary.bdgraph}}, \code{\link{compare}} } \examples{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 70, p = 5, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph.mpl( data = data.sim, iter = 500 ) summary( bdgraph.obj ) # To compare the result with true graph compare( data.sim, bdgraph.obj, main = c( "Target", "BDgraph" ) ) } \keyword{sampling algorithms} \keyword{structure learning} \keyword{iteration} BDgraph/man/traceplot.Rd0000644000176200001440000000432713623244012014623 0ustar liggesusers\name{traceplot} \alias{traceplot} \title{ Trace plot of graph size } \description{ Trace plot for graph size for the objects of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It is a tool for monitoring the convergence of the sampling algorithms, BDMCMC and RJMCMC. } \usage{ traceplot ( bdgraph.obj, acf = FALSE, pacf = FALSE, main = NULL, ... ) } \arguments{ \item{bdgraph.obj}{ An object of \code{S3} class \code{"bdgraph"}, from function \code{\link{bdgraph}}. It also can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. } \item{acf}{ Visualize the autocorrelation functions for graph size. } \item{pacf}{ Visualize the partial autocorrelations for graph size. } \item{main}{ Graphical parameter (see plot). } \item{\dots}{ System reserved (no specific usage). } } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} and Ernst Wit } \seealso{ \code{\link{plotcoda}}, \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) bdgraph.obj <- bdgraph( data = data.sim, iter = 10000, burnin = 0, save = TRUE ) traceplot( bdgraph.obj ) traceplot( bdgraph.obj, acf = TRUE, pacf = TRUE ) } } \keyword{hplot} BDgraph/man/rwish.Rd0000644000176200001440000000371314043515461013766 0ustar liggesusers\name{rwish} \alias{rwish} \title{ Sampling from Wishart distribution } \description{ Generates random matrices, distributed according to the Wishart distribution with parameters \eqn{b} and \eqn{D}, \eqn{W(b, D)}. } \usage{ rwish( n = 1, p = 2, b = 3, D = diag( p ) ) } \arguments{ \item{n}{ The number of samples required. } \item{p}{ The number of variables (nodes). } \item{b}{ The degree of freedom for Wishart distribution, \eqn{W(b, D)}. } \item{D}{ The positive definite \eqn{(p \times p)} "scale" matrix for Wishart distribution, \eqn{W(b, D)}. The default is an identity matrix. } } \details{ Sampling from Wishart distribution, \eqn{K \sim W(b, D)}, with density: \deqn{Pr(K) \propto |K| ^ {(b - 2) / 2} \exp \left\{- \frac{1}{2} \mbox{trace}(K \times D)\right\},} which \eqn{b > 2} is the degree of freedom and \eqn{D} is a symmetric positive definite matrix. } \value{ A numeric array, say A, of dimension \eqn{(p \times p \times n)}, where each \eqn{A[,,i]}{A[,,i]} is a positive definite matrix, a realization of the Wishart distribution \eqn{W(b, D)}. Note, for the case \eqn{n=1}, the output is a matrix. } \references{ Lenkoski, A. (2013). A direct sampler for G-Wishart variates, \emph{Stat}, 2:119-128 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{gnorm}}, \code{\link{rgwish}} } \examples{ sample <- rwish( n = 3, p = 5, b = 3, D = diag( 5 ) ) round( sample, 2 ) } \keyword{Wishart} \keyword{distribution} BDgraph/man/sparsity.Rd0000644000176200001440000000227413724415062014512 0ustar liggesusers\name{sparsity} \alias{sparsity} \title{ Compute the sparsity of a graph } \description{ Compute the sparsity of a graph (or a network) or an object of calsses \code{"sim"} from function \code{\link{bdgraph.sim}} and \code{"graph"} from function \code{\link{graph.sim}}.} \usage{ sparsity( adj ) } \arguments{ \item{adj}{ An adjacency matrix corresponding to a graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. } } \value{ A value corresponding to the sparsity of a graph.} \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{ \code{\link{graph.sim}}, \code{\link{adj2link}}, \code{\link{link2adj}} } \examples{ # Generating a 'random' graph adj <- graph.sim( p = 10, vis = TRUE ) sparsity( adj ) } \keyword{graphs} BDgraph/man/plot.graph.Rd0000644000176200001440000000460013522542150014700 0ustar liggesusers\name{plot.graph} \alias{plot.graph} \title{ Plot function for \code{S3} class \code{"graph"} } \description{ Visualizes structure of the graph. } \usage{ \method{plot}{graph}( x, cut = 0.5, mode = "undirected", diag = FALSE, main = NULL, vertex.color = "white", vertex.label.color = 'black', ... ) } \arguments{ \item{x}{ An object of \code{S3} class \code{"graph"}, from function \code{\link{graph.sim}}. } \item{cut}{ This option is for the case where input 'x' is the object of class "bdgraph" or "ssgraph". Threshold for including the links in the selected graph based on the estimated posterior probabilities of the links. } \item{mode}{ Type of graph which is according to \code{R} package \code{\link[igraph]{igraph}}.} \item{diag}{ Logical which is according to \code{R} package \code{\link[igraph]{igraph}}.} \item{main}{ Graphical parameter (see plot).} \item{vertex.color}{ The vertex color which is according to \code{R} package \code{\link[igraph]{igraph}}. } \item{vertex.label.color}{ The vertex label color which is according to \code{R} package \code{\link[igraph]{igraph}}. } \item{\dots}{System reserved (no specific usage).} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Mohammadi, A. and Dobra, A. (2017). The \code{R} Package \pkg{BDgraph} for Bayesian Structure Learning in Graphical Models, \emph{ISBA Bulletin}, 24(4):11-16 } \author{ Reza Mohammadi \email{a.mohammadi@uva.nl} } \seealso{\code{\link{graph.sim}}, \code{\link{bdgraph.sim}}} \examples{ # Generating a 'random' graph adj <- graph.sim( p = 10, graph = "random" ) plot( adj ) adj } \keyword{hplot} BDgraph/man/compare.Rd0000644000176200001440000001003313721422633014251 0ustar liggesusers\name{compare} \alias{compare} \title{ Graph structure comparison } \description{ This function provides several measures to assess the performance of the graphical structure learning. } \usage{ compare( target, est, est2 = NULL, est3 = NULL, est4 = NULL, main = NULL, vis = FALSE ) } \arguments{ \item{target}{ An adjacency matrix corresponding to the true graph structure in which \eqn{a_{ij}=1} if there is a link between notes \eqn{i}{i} and \eqn{j}{j}, otherwise \eqn{a_{ij}=0}. It can be an object with \code{S3} class \code{"sim"} from function \code{\link{bdgraph.sim}}. It can be an object with \code{S3} class \code{"graph"} from function \code{\link{graph.sim}}. } \item{est, est2, est3, est4}{ An adjacency matrix corresponding to an estimated graph. It can be an object with \code{S3} class \code{"bdgraph"} from function \code{\link{bdgraph}}. It can be an object of \code{S3} class \code{"ssgraph"}, from the function \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}} of \code{R} package \code{\link[ssgraph:ssgraph]{ssgraph::ssgraph()}}. It can be an object of \code{S3} class \code{"select"}, from the function \code{\link[huge]{huge.select}} of \code{R} package \code{\link[huge]{huge}}. Options \code{est2, est3} and \code{est4} are for comparing two or more different approaches. } \item{main}{ A character vector giving the names for the result table. } \item{vis }{ Visualize the true graph and estimated graph structures. } } \value{ \item{True positive }{ The number of correctly estimated links.} \item{True negative }{ The number of true non-existing links which is correctly estimated.} \item{False positive}{ The number of links which they are not in the true graph, but are incorrectly estimated.} \item{False negative}{ The number of links which they are in the true graph, but are not estimated.} \item{F1-score }{ A weighted average of the \code{"positive predictive"} and \code{"true positive rate"}. The F1-score value reaches its best value at 1 and worst score at 0.} \item{Specificity }{ The Specificity value reaches its best value at 1 and worst score at 0.} \item{Sensitivity }{ The Sensitivity value reaches its best value at 1 and worst score at 0.} \item{MCC }{ The Matthews Correlation Coefficients (MCC) value reaches its best value at 1 and worst score at 0.} } \references{ Mohammadi, R. and Wit, E. C. (2019). \pkg{BDgraph}: An \code{R} Package for Bayesian Structure Learning in Graphical Models, \emph{Journal of Statistical Software}, 89(3):1-30 Mohammadi, A. and Wit, E. C. (2015). Bayesian Structure Learning in Sparse Gaussian Graphical Models, \emph{Bayesian Analysis}, 10(1):109-138 Mohammadi, A. et al (2017). Bayesian modelling of Dupuytren disease by using Gaussian copula graphical models, \emph{Journal of the Royal Statistical Society: Series C}, 66(3):629-645 Letac, G., Massam, H. and Mohammadi, R. (2018). The Ratio of Normalizing Constants for Bayesian Graphical Gaussian Model Selection, \emph{arXiv preprint arXiv:1706.04416v2} Dobra, A. and Mohammadi, R. (2018). Loglinear Model Selection and Human Mobility, \emph{Annals of Applied Statistics}, 12(2):815-845 } \author{Reza Mohammadi \email{a.mohammadi@uva.nl}, Antonio Abbruzzo, and Ivan Vujacic} \seealso{ \code{\link{bdgraph}}, \code{\link{bdgraph.mpl}}, \code{\link{bdgraph.sim}}, \code{\link{plotroc}} } \examples{ \dontrun{ # Generating multivariate normal data from a 'random' graph data.sim <- bdgraph.sim( n = 50, p = 6, size = 7, vis = TRUE ) # Running sampling algorithm based on GGMs sample.ggm <- bdgraph( data = data.sim, method = "ggm", iter = 10000 ) # Comparing the results compare( data.sim, sample.ggm, main = c( "True", "GGM" ), vis = TRUE ) # Running sampling algorithm based on GCGMs sample.gcgm <- bdgraph( data = data.sim, method = "gcgm", iter = 10000 ) # Comparing GGM and GCGM methods compare( data.sim, sample.ggm, sample.gcgm, main = c( "True", "GGM", "GCGM" ), vis = TRUE ) } } \keyword{structure learning} BDgraph/DESCRIPTION0000644000176200001440000000271314043700404013266 0ustar liggesusersPackage: BDgraph Title: Bayesian Structure Learning in Graphical Models using Birth-Death MCMC Version: 2.64 Authors@R: c(person(given = "Reza", family = "Mohammadi", role = c("aut", "cre"), email = "a.mohammadi@uva.nl", comment = c(ORCID = "0000-0001-9538-0648")), person(given = "Ernst", family = "Wit", role = c("aut"), comment = c(ORCID = "0000-0002-3671-9610")), person(given = "Adrian", family = "Dobra", role = c("ctb"), comment = c(ORCID = "0000-0001-7793-2197")) ) Description: Statistical tools for Bayesian structure learning in undirected graphical models for continuous, discrete, and mixed data. The package is implemented the recent improvements in the Bayesian graphical models literature, including Mohammadi and Wit (2015) , Mohammadi and Wit (2019) . URL: https://www.uva.nl/profile/a.mohammadi Imports: igraph Suggests: ssgraph, huge, pROC, ggplot2, tmvtnorm License: GPL (>= 2) Repository: CRAN NeedsCompilation: yes Author: Reza Mohammadi [aut, cre] (), Ernst Wit [aut] (), Adrian Dobra [ctb] () Maintainer: Reza Mohammadi Packaged: 2021-05-02 14:43:37 UTC; reza Date/Publication: 2021-05-03 04:50:12 UTC BDgraph/build/0000755000176200001440000000000014043535231012660 5ustar liggesusersBDgraph/build/vignette.rds0000644000176200001440000000051214043535231015215 0ustar liggesusersuQ]K0>P?g޶,)7tMMs~L(G:\L]}vcw^DZo>GŞ%V INPl rd&jHpU(Ϳ+,jӽɻ5/l1,8NDS:qƒk"dPܯ2'J6MGຬ$ݓ4GfP'Ml1KlJM[-^ޅ)lۅw |^Sg9å:&lwmB?s<&_rV8.`a{_ QBDgraph/build/partial.rdb0000644000176200001440000002404314043535226015014 0ustar liggesusers}k{iz^RBp^ A[-II L#ٙRwI*V0$=8f!w7ˉ{3rxSO]zou5^oK>{>;RTGqۖJulܱîTN,R]̯KOue]OwVҖo食O_5ҔBt1!ݏgGՌYҍT辴W4Q+kw=w`d!D&JeaO4ʈd\_va\za5evsYZZHV7`z$A*}CBv2 [#2~RTҁ2#I؜6i~;GGbsSw E940vRE^Sʦ# 8exSz=oJ*&j(ʚ[k%1gUV6oܤ}o .2Mٹ=&&wpH@`{1FQY7^BSs3c"9`\h'>чG7vm{ԣn''c~u} _Dxy`<[?M&To?kS%Cuv4ՌhyL{7 (7o:?N&t?c6$elWN-su@x{h7 |ӴJ6w"m p#]MF9"j}<|2. \_v70aEZngiCwVEK=RlGJ :Er_ J $etHwf'HO?%<%"\N*\\=w KP]GGcG瀗/>+W÷o3peX ~;j{[&ĕg 5V uEY>WŦ)?M1OI;#[}hhuWEKlW (>~ifWtl^IC (䡣n7JOdޠ`N3 NR,QκZvqP +#g)(COҏ$54naD nݶ߃M)\/gY6N%Jz*q9`Rg#` L||5#UUi!'#'a ,IY9s2UⓈ!`<cob%> ~3ߌ''}/5z"|(b51=E=kI Pr$P h~2.дZ*VkAl 9pȿ4'?oiW_"؊ {O&A:g#? ꠟ./`ώH4|+MpScGi8mp&$^toeDր15 )M-*播Y/U?L6s&\H4lZ5Ӷ'%;Iy8M R䫯;A7U=v  aO_E8PT-up=B}ˈ9sqJѽ69h0^= gC 0{̖~{m~ . b%E~a\/A\q3+0S/!&J  $%_B_ H{/߂# fe[xx*Zc@kyHi 7ŻWN%4'* /u<7"\ AɸRᛩDCjdwky,󔿃D~-YOKU-e楆LeqUj3i8ښ :ֺCCÊj z'*4{be{ȹP?Noqt"hꦣ9ѪGAVu`fJ*r#B7bnN-y 2A\2x x8('-tZ_ƮF>|R~@ MNuw Jw tZw4~Te(:ѯ  M*s InURUAU把$INO(&s׀3bǴIe52A\2.QQ{% $6|.tHhO'Ypo\_l}O.E~=AI?#Qw之\2Mq; 2})hJ2 e #3JU_ٻyI1zO-,u+xp* 1uV;>Q]U2|倏.HqpN;NPCBGS2}վf 4b]N'R=ߪFg&Gb1 I./HKѹ_%M >~# B2ʃ`0mԗa"}/%"''(P\DB|)9-RD\67hK I^Іa] SHP(0%ȴhXek9VSlw*pZ7DflH<Ў9AKmnkT0Wׄ/m;!I[+zx<&e"΃ˏw)*w}I J+ٴiu/c{= єD."o` I=HU7Iw986Dtcꈺ:)پoC"2 T! Nmb]sfHqY/4muu]ioK DaSԅpp0U-r 8txfl~ `=p '728 kK\Ól1˶[~ߊ:wtdo=hH')(RՓjbh7 ̦ohu)w 7FsC+pل00b]+H+^hz v KnTXj [3CѽP|t%6,l &!Wݫm׬:g nK*:l}=@溁@"pA\1lZَJQgV4,YiC[NnUD2H95k9I`p -^ wTDPNA{G7o\~KP3jq[s4OhJb(vaCO kDZ%XnZD_փs#8L P{{bocVtsd#BPdn7(_^1p]#l5[;`4*Y6kTIqe{-!L ;RV6|;^G_BӾc1-yi^"vg7Ճ⊦RL0jf]/~|Doq1Az z :x,G*dw6*d&$)wO2=N3 W2w 8.A!A OWape5}_' <=N3 ZדּKbG9$AO*qNq{< 8\/0'oؒKs QJ`ڦ0'b])v8Ϙj9S + d4p|DDzCjf2ifgjS/:؝xQ*jbPדd9ӈ=fc 1 t_W&Ͱ\NFT΀$d6DLK#7xE4pOJvYJgolb_2k7g`=.egyݙ<^.,ۈ-n#SaIFmG8>(& \L>8;;-5*54_8;CFwX+fغt/V5/EGa>xFiy]LԨ^dik7e嶚Q)^ٳN9ȼ we#|j|CߓB niK'òz_҂ Bt4"SsF+"! gC/0+PCxϵ4{׍\ZPIv`:Bnzg >b!*b栂!CiS^.y6o4۱5tJBV9J2;.4)C|A\H-͡}5. 1 <~ iW?tP x&do2? {1=f oi`⻦O|#; 7Ӫjg|#lW|/ Z;UKWr7Є wx!CMQecU/BP Ȑ X||T[}a)<4U67zEx>WN,mb]ePt4PP \uQMOlCqfYᄌZ:Ռ`r^O d2p\h:)l-27 .n*xys:IOU$ڢb҂fzC?<.TK@y&L wtl2`<GHqI]݋0O -Uw"]wm}YApjbodm? ָ$28ғNO&!{I&>cy5I.Kܯ%y;xu9`p<Ρ&TZwG fgQ]gBsaW5}L94fmhE=A"DžU#kKRJpQbѴJވqwOt -khu{[Uz5dA\I)xjㇶo  .TPE̪EqCʳgSҺ?3Mns 9F09;BPu2xSL7H`H^++W+㝓Dx<#jDp? j+zI1zc,"?%퍽˹W3s /˯og/ڙ{?Vx}f}jizٱoXaQWމ0vLlOLLKO龧%S<5;5_p,7ɍ.ggTҊd*3xGw S3 < ~9:؈E 's}NLd6@q/xt3#y]JdW'UY'Yid o=Gl꺡]v)jX sZ^N~[-'IGD dv[0ҷ*z vYWŅ~i"ZM-p۫@XH+75)Z987pMKv{M܌Ύ|)ՠ=b>Y҅i}g~.\~|5KɛK1|:jqUU׭ae}%KS%SJ8>[ͼ]st xf%B v!x# .IchћaTT#ƒnG[Q&9]GoKMdySmOrHn@fiȸ3("<.6(M/(ӺnVTG/BQ2wa+2wDǀSշim$cA\y#b̍_J}Xr% ׁS+zo7|В JZP.B`Dni߫7* blL4٨멎LA7!*ܵp'p\hs}S{`]+O?I&bNC\V\<ˮ +/u%t4T p|2h0`:xax@ɯ ˶ZY+Q+;eICMC{w^؄JBSktj~PV*j_ro=5f?%H dMt| ' l.`]F ([k׌e^F:s3謻6ƷfLlq3>u\5.rdb 9%p|.8؀㉃3r>m #% #<~FZW b+JWO8 >Օ/!A%(colX&M:ğP|h^nDt0ڿ5]dA\1@}eF3x7$ATO :@;H:uζn d;UWN}N`£BB{aZ6|Ax \N9 JZw Iû%9u6 {)tnYBۼ;Z]zg.Puv>jBbnf{ }k՛C7{F3lhRV{soqhj),+ngnNႣ;eT􇏫7`x':G~CP좥/7E`e8]5/,{=gQ`/[<#]U(-"jaFǏQM +\u nY0YM`փ8f%¾>:Z)dV=zW4/3w 4u/g-Cyb}]͵P,t}a4{T2eg]Bk6C uB˺ 8wA fAd) 斈lJuإu9+C{ )~_:u_Sg`i[ʅLcI1h|KMy&j!\p]즁֔{d?/C+ЗfSu%4 <*Us#USXED)jQ~u_SSxUi{עTo0қ=L_Iyk20T7  \}t|CB[ֆJ5P?k [T6NzhK嚒Yޓ.; S;_zVS@O)F[7PBGlŲ)YPݺ\F-R(C#5]["/~_n-N\mL QOvMpB}//Cf1DЋc{Y1Nj#0 Rmj08FGs ͔O d%K^eg-sv6Y~5ji|)w(+-3AvG?ϮYKr̺͸[F.G/.۹񍥜cVr+W4^bdyv\%{tIJ95eIM=n'M[7_wj|]՟0?8kc"L<:Qϫ̃3(^{HyM]ׯ} o޼y8"lpZ3ޙRV?>fN-_I<&3~C1CuL~ /{~IL~Mn:b#cXm ypGw\O*0p|T&^‹R^_ z[3v̾A.Rg(^+=şBo?:iqØʶVԝG3s>'-LD6h3m==jawS# &~SxbBe18^+8xJyyi K3|>JUBt*0k#͗1V=Aݶu]GbdiB>]4:?MTndp_#hAWBDgraph/src/0000755000176200001440000000000014043535231012350 5ustar liggesusersBDgraph/src/matrix.h0000644000176200001440000001047413621263231014032 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #ifndef matrix_H #define matrix_H #include "util.h" extern "C" { void sub_matrix( double A[], double sub_A[], int sub[], int *p_sub, int *p ); void sub_matrix_upper( double A[], double sub_A[], int sub[], int *p_sub, int *p ); void sub_row_mins( double A[], double sub_A[], int *sub, int *p ); void sub_rows_mins( double A[], double sub_A[], int *row, int *col, int *p ); void sub_cols_mins( double A[], double sub_A[], int *row, int *col, int *p ); void sub_matrices1( double A[], double A12[], double A22[], int *sub, int *p ); void sub_matrices( double A[], double A11[], double A21[], double A22[], int *row, int *col, int *p ); void sub_matrices_inv( double A[], double A11_inv[], double A21[], double A22[], int *row, int *col, int *p ); void inverse( double A[], double A_inv[], int *p ); void inverse_2x2( double B[], double B_inv[] ); void cholesky( double A[], double U[], int *p ); void determinant( double A[], double *det_A, int *p ); void select_edge( double rates[], int *index_selected_edge, double *sum_rates, int *qp ); void select_edge_ts( long double rates[], int *index_selected_edge, long double *sum_rates, int *qp ); void select_multi_edges( double rates[], int index_selected_edges[], int *size_index, double *sum_rates, int *multi_update, int *qp ); void rates_bdmcmc_parallel( double rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double Ds[], double Dsijj[], double sigma[], double K[], int *b, int *p ); void rates_cbdmcmc_parallel( long double rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double r_Ds[], double i_Ds[], double r_sigma[], double i_sigma[], double r_K[], double i_K[], int *b, int *p ); void log_H_ij( double K[], double sigma[], double *log_Hij, int *selected_edge_i, int *selected_edge_j, double Kj12[], double Kj12xK22_inv[], double K12[], double K12xK22_inv[], double K121[], double sigmaj12[], double sigmaj22[], double sigma12[], double sigma22[], double sigma11_inv[], double sigma21xsigma11_inv[], int *dim, int *p1, int *p2, int *jj, double *Dsijj, double *Dsij, double *Dsjj ); void rates_bdmcmc_dmh_parallel( double rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double Ds[], double D[], double sigma[], double K[], double sigma_dmh[], double K_dmh[], int *b, int *p ); // - - - - - - - NEW for Lang codes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // For Hermitian matrix void Hsub_row_mins( double A[], double sub_A[], int *sub, int *p ); void Hsub_rows_mins( double A[], double sub_A[], int *row, int *col, int *p ); void Hsub_matrices1( double A[], double A12[], double A22[], int *sub, int *p ); void Hsub_matrices( double A[], double A11[], double A12[], double A22[], int *row, int *col, int *p ); void cinverse_2x2( double r_B[], double i_B[], double r_B_inv[], double i_B_inv[] ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void scale_free( int *G, int *p ); void transfer_data( int r_data[], int data[], int *n, int *p, int *size_unique_data ); } #endif BDgraph/src/ggm_bd.cpp0000644000176200001440000005565114003231137014301 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" #include "rgwish.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models // for case D = I_p // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double K_hat[], double p_links[], int *b, int *b_star, double Ds[], int *print ) { //omp_set_num_threads( 2 ); int print_c = *print, iteration = *iter, burn_in = *burnin; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double Dsij, sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - allocation for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); vector Dsijj( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } // for calculating the birth/death rates Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] * weight_C; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models // for case D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int i, j, ij, one = 1, dim = *p, pxp = dim * dim; double Dsij, sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); // - - allocation for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; // Counting size of notes int ip; vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); int counter = 0; vector Dsijj( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } // for calculating the birth/death rates Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] * weight_C; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double K_hat[], double p_links[], int *b, int *b_star, double Ds[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int i, j,ij, one = 1, dim = *p, pxp = dim * dim; double Dsij, sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - allocation for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Count size of notes int ip; vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vector index_row( qp ); vector index_col( qp ); int counter = 0; vector Dsijj( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } // for calculating the birth/death rates Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *b, int *b_star, double Ds[], int *multi_update, int *print ) { int print_c = *print, multi_update_C = *multi_update, iteration = *iter, burn_in = *burnin; int count_all_g = *counter_all_g, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int i, j,ij, one = 1, dim = *p, pxp = dim * dim; double Dsij, sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); // - - allocation for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; // Counting size of notes int ip; vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); int counter = 0; vector Dsijj( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } // for calculating the birth/death rates Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } } // End of exturn "C" BDgraph/src/rgwish.cpp0000644000176200001440000003722113714046630014370 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "rgwish.h" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // sampling from Wishart distribution, in which Ts = chol( solve( Ds ) ) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rwish_c( double Ts[], double K[], int *b, int *p ) { int dim = *p, pxp = dim * dim, bK = *b; double alpha = 1.0, beta = 0.0; char transT = 'T', transN = 'N', side = 'R', upper = 'U'; vector psi( pxp, 0.0 ); // - - - Sample values in Psi matrix - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); //#pragma omp parallel for for( int i = 0; i < dim; i++ ) psi[ i * dim + i ] = sqrt( Rf_rgamma( ( bK + dim - i - 1 ) / 2.0, 2.0 ) ); //psi[i * dim + i] = sqrt( rchisq( bK + dim - i - 1 ) ); //#pragma omp parallel for for( int j = 1; j < dim; j++ ) for( int i = 0; i < j; i++ ) psi[ j * dim + i ] = norm_rand(); PutRNGstate(); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // C = psi %*% Ts I used psi = psi %*% Ts // dtrmm (SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB) F77_NAME(dtrmm)( &side, &upper, &transN, &transN, &dim, &dim, &alpha, Ts, &dim, &psi[0], &dim FCONE FCONE FCONE FCONE ); // K = t(C) %*% C // LAPACK function to compute C := alpha * A * B + beta * C F77_NAME(dgemm)( &transT, &transN, &dim, &dim, &dim, &alpha, &psi[0], &dim, &psi[0], &dim, &beta, K, &dim FCONE FCONE ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // G is adjacency matrix which has zero in its diagonal // threshold = 1e-8 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rgwish_c( int G[], double Ts[], double K[], int *b, int *p, double *threshold ) { int info, i, j, l, size_node, one = 1, dim = *p, pxp = dim * dim; double threshold_c = *threshold; double alpha = 1.0, beta = 0.0; char transN = 'N', uplo = 'U'; rwish_c( Ts, K, b, &dim ); vector sigma_start( pxp ); inverse( K, &sigma_start[0], &dim ); vector sigma( sigma_start ); vector sigma_last( pxp ); vector beta_star( dim ); vector sigma_start_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used // double temp, max_diff = 1.0; double mean_diff = 1.0; while( mean_diff > threshold_c ) { memcpy( &sigma_last[0], &sigma[0], sizeof( double ) * pxp ); for( i = 0; i < dim; i++ ) { // Count size of note size_node = 0; for( j = 0; j < dim; j++ ) size_node += G[ j * dim + i ]; if( size_node > 0 ) { l = 0; for( j = 0; j < dim; j++ ) { if( G[ j * dim + i ] ) { sigma_start_N_i[ l ] = sigma_start[ i * dim + j ]; N_i[ l++ ] = j; }else beta_star[ j ] = 0.0; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_matrix( &sigma[0], &sigma_N_i[0], &N_i[0], &size_node, &dim ); // A * X = B for sigma_start_N_i := (sigma_N_i)^{-1} * sigma_start_N_i F77_NAME(dposv)( &uplo, &size_node, &one, &sigma_N_i[0], &size_node, &sigma_start_N_i[0], &size_node, &info FCONE ); for( j = 0; j < size_node; j++ ) beta_star[ N_i[ j ] ] = sigma_start_N_i[ j ]; F77_NAME(dgemm)( &transN, &transN, &dim, &one, &dim, &alpha, &sigma[0], &dim, &beta_star[0], &dim, &beta, &sigma_start_i[0], &dim FCONE FCONE ); for( j = 0; j < i; j++ ) { sigma[ j * dim + i ] = sigma_start_i[ j ]; sigma[ i * dim + j ] = sigma_start_i[ j ]; } for( j = i + 1; j < dim; j++ ) { sigma[ j * dim + i ] = sigma_start_i[ j ]; sigma[ i * dim + j ] = sigma_start_i[ j ]; } }else{ for( j = 0; j < i; j++ ) { sigma[ j * dim + i ] = 0.0; sigma[ i * dim + j ] = 0.0; } for( j = i + 1; j < dim; j++ ) { sigma[ j * dim + i ] = 0.0; sigma[ i * dim + j ] = 0.0; } } } mean_diff = fabs( static_cast( sigma[ 0 ] - sigma_last[ 0 ] ) ); for( i = 1; i < pxp; i++ ) mean_diff += fabs( static_cast( sigma[ i ] - sigma_last[ i ] ) ); mean_diff /= pxp; // max_diff = fabs( static_cast( sigma[ 0 ] - sigma_last[ 0 ] ) ); // for( i = 1; i < pxp; i++ ) // { // temp = fabs( static_cast( sigma[ i ] - sigma_last[ i ] ) ); // if( temp > max_diff ) max_diff = temp; // } } inverse( &sigma[0], K, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // rgwish ONLY for inside of MCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rgwish_sigma( int G[], int size_node[], double Ts[], double K[], double sigma[], int *b_star, int *p, double *threshold, double sigma_start[], double inv_C[], double beta_star[], double sigma_i[], vector &sigma_start_N_i, vector &sigma_N_i, vector &N_i ) { int i, i1, j, ij, ip, l, size_node_i, info, one = 1, dim = *p, pxp = dim * dim, dim1 = dim + 1, bKdim = *b_star + dim - 1; double alpha = 1.0, beta = 0.0; char transT = 'T', transN = 'N', side = 'R', upper = 'U'; // - - STEP 1: sampling from wishart distributions - - - - - - - - - - - - - - - - - - - - - -| // - - Sample values in Psi matrix //GetRNGstate(); #pragma omp parallel for for( i = 0; i < dim; i++ ) sigma_start[ i * dim1 ] = sqrt( Rf_rgamma( ( bKdim - i ) * 0.5, 2.0 ) ); // i * dim1 = i * dim + i //sigma_start[i * dim1] = sqrt( rchisq( bKdim - i ) ); // i * dim1 = i * dim + i #pragma omp parallel for for( j = 1; j < dim; j++ ) for( int i = 0; i < j; i++ ) { sigma_start[ j * dim + i ] = norm_rand(); sigma_start[ i * dim + j ] = 0.0; } //PutRNGstate(); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // C = psi %*% Ts I used psi = psi %*% Ts Now is sigma_start = sigma_start %*% Ts F77_NAME(dtrmm)( &side, &upper, &transN, &transN, &dim, &dim, &alpha, Ts, &dim, &sigma_start[0], &dim FCONE FCONE FCONE FCONE ); side = 'L'; // creating an identity matrix #pragma omp parallel for for( i = 0; i < dim; i++ ) for( int j = 0; j < dim; j++ ) inv_C[ j * dim + i ] = ( i == j ); // op( A )*X = alpha*B, or X*op( A ) = alpha*B, F77_NAME(dtrsm)( &side, &upper, &transN, &transN, &dim, &dim, &alpha, &sigma_start[0], &dim, &inv_C[0], &dim FCONE FCONE FCONE FCONE ); // sigma_start = inv_C %*% t( inv_C ) F77_NAME(dgemm)( &transN, &transT, &dim, &dim, &dim, &alpha, &inv_C[0], &dim, &inv_C[0], &dim, &beta, &sigma_start[0], &dim FCONE FCONE ); memcpy( sigma, &sigma_start[0], sizeof( double ) * pxp ); // double temp, max_diff = 1.0, threshold_c = *threshold; double mean_diff = 1.0, threshold_c = *threshold; int counter = 0; while( ( mean_diff > threshold_c ) and ( counter < 5000 ) ) { counter++; mean_diff = 0.0; for( i = 0; i < dim; i++ ) { ip = i * dim; size_node_i = size_node[ i ]; if( size_node_i > 0 ) { l = 0; for( j = 0; j < dim; j++ ) { ij = ip + j; if( G[ ij ] ) { sigma_start_N_i[ l ] = sigma_start[ ij ]; N_i[ l++ ] = j; } else beta_star[ j ] = 0.0; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_matrix_upper( sigma, &sigma_N_i[0], &N_i[0], &size_node_i, &dim ); // A * X = B for sigma_start_N_i := (sigma_N_i)^{-1} * sigma_start_N_i F77_NAME(dposv)( &upper, &size_node_i, &one, &sigma_N_i[0], &size_node_i, &sigma_start_N_i[0], &size_node_i, &info FCONE ); for( j = 0; j < size_node_i; j++ ) beta_star[ N_i[ j ] ] = sigma_start_N_i[ j ]; // sigma_i = sigma %*% beta_star F77_NAME(dsymv)( &side, &dim, &alpha, sigma, &dim, &beta_star[0], &one, &beta, &sigma_i[0], &one FCONE ); memcpy( sigma + ip, sigma_i, sizeof( double ) * i ); for( j = 0; j < i; j++ ) { ij = j * dim + i; mean_diff += fabs( static_cast( sigma[ ij ] - sigma_i[ j ] ) ); // temp = fabs( static_cast( sigma[ ij ] - sigma_i[ j ] ) ); // max_diff = ( temp > max_diff ) ? temp : max_diff; sigma[ ij ] = sigma_i[ j ]; } i1 = i + 1; memcpy( sigma + ip + i1, sigma_i + i1, sizeof( double ) * ( dim - i1 ) ); for( j = i1; j < dim; j++ ) { ij = j * dim + i; mean_diff += fabs( static_cast( sigma[ ij ] - sigma_i[ j ] ) ); // temp = fabs( static_cast( sigma[ ij ] - sigma_i[ j ] ) ); // max_diff = ( temp > max_diff ) ? temp : max_diff; sigma[ ij ] = sigma_i[ j ]; } }else{ for( j = 0; j < i; j++ ) { ij = j * dim + i; mean_diff += fabs( static_cast( sigma[ ij ] ) ); // temp = fabs( static_cast( sigma[ ij ] ) ); // max_diff = ( temp > max_diff ) ? temp : max_diff; sigma[ ij ] = 0.0; sigma[ ip + j ] = 0.0; } for( j = i + 1; j < dim; j++ ) { ij = j * dim + i; mean_diff += fabs( static_cast( sigma[ ij ] ) ); // temp = fabs( static_cast( sigma[ ij ] ) ); // max_diff = ( temp > max_diff ) ? temp : max_diff; sigma[ ij ] = 0.0; sigma[ ip + j ] = 0.0; } } } mean_diff /= pxp; } memcpy( &sigma_start[0], sigma, sizeof( double ) * pxp ); inverse( &sigma_start[0], K, &dim ); // creating an identity matrix //#pragma omp parallel for //for( i = 0; i < dim; i++ ) // for( int j = 0; j < dim; j++ ) // K[ j * dim + i ] = ( i == j ); // LAPACK function: computes solution to A * X = B, where A is symmetric positive definite matrix //F77_NAME(dposv)( &upper, &dim, &dim, &sigma_start[0], &dim, K, &dim, &info ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Part of function "gnorm" // which is for calculating Normalizing constant of G-Wishart distribution // based on Monto Carlo algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_exp_mc( int G[], int nu[], int *b, double H[], int *check_H, int *mc, int *p, double f_T[] ) { int iter, i, j, ij, h, r, mc_iter = *mc, dim = *p, pxp = dim * dim, b_c = *b; double sumPsi, sumPsiH, sumPsiHi, sumPsiHj; double max_numeric_limits_ld = numeric_limits::max() / 1000; double min_numeric_limits_ld = numeric_limits::min() * 1000; vector psi( pxp, 0.0 ); GetRNGstate(); if( *check_H == 1 ) { for( iter = 0; iter < mc_iter; iter++ ) { for( i = 0; i < dim; i++ ) psi[ i * dim + i ] = sqrt( Rf_rgamma( ( b_c + nu[ i ] ) / 2.0, 2.0 ) ); //psi[i * dim + i] = sqrt( rchisq( b_c + nu[i] ) ); for( i = 0; i < dim - 1; i++ ) for( j = i + 1; j < dim; j++ ) { ij = j * dim + i; //if( G[ij] == 1 ) psi[ij] = rnorm( 0, 1 ); else psi[ij] = 0.0; psi[ ij ] = ( G[ ij ] == 1 ) ? norm_rand() : 0.0; } for( i = 0; i < dim - 1; i++ ) for( j = i + 1; j < dim; j++ ) { ij = j * dim + i; if( G[ ij ] == 0 ) { psi[ ij ] = 0.0; // it's not necessary if( i > 0 ) { sumPsi = 0.0; //sum( psi[ 1 : ( i - 1 ), i ] * psi[ 1 : ( i - 1 ), j ] ) // for( h = 0; h < ( i - 1 ); h++ ) for( h = 0; h < i; h++ ) { if( sumPsi == R_PosInf ) sumPsi = max_numeric_limits_ld; if( sumPsi == R_NegInf ) sumPsi = min_numeric_limits_ld; sumPsi += ( psi[ i * dim + h ] * psi[ j * dim + h ] ); } //psi[i, j] <- - sum( psi[ 1 : ( i - 1 ), i ] * psi[ 1 : ( i - 1 ), j ] ) / psi[i, i] psi[ ij ] = - sumPsi / psi[ i * dim + i ]; } if( psi[ ij ] == R_PosInf ) psi[ ij ] = max_numeric_limits_ld; if( psi[ ij ] == R_NegInf ) psi[ ij ] = min_numeric_limits_ld; //f_T[k] <- f_T[k] + psi[i, j] ^ 2 f_T[ iter ] += ( psi[ ij ] * psi[ ij ] ); } } // checking Inf values if( f_T[ iter ] == R_PosInf ) f_T[ iter ] = max_numeric_limits_ld; } }else{ for( iter = 0; iter < mc_iter; iter++ ) { for( i = 0; i < dim; i++ ) psi[ i * dim + i ] = sqrt( Rf_rgamma( ( b_c + nu[ i ] ) / 2.0, 2.0 ) ); //psi[i * dim + i] = sqrt( rchisq( b_c + nu[i] ) ); for( i = 0; i < dim - 1; i++ ) for( j = i + 1; j < dim; j++ ) { ij = j * dim + i; //if( G[ij] == 1 ) psi[ij] = rnorm( 0, 1 ); elsepsi[ij] = 0.0; psi[ ij ] = ( G[ ij ] == 1 ) ? norm_rand() : 0.0; } for( i = 0; i < dim - 1; i++ ) for( j = i + 1; j < dim; j++ ) { ij = j * dim + i; if( G[ ij ] == 0 ) { //psi[i, j] = - sum( psi[ i, i : ( j - 1 ) ] * H[ i : ( j - 1 ), j ] ) sumPsiH = 0.0; for( h = i; h < j; h++ ) { if( sumPsiH == R_PosInf ) sumPsiH = max_numeric_limits_ld; if( sumPsiH == R_NegInf ) sumPsiH = min_numeric_limits_ld; sumPsiH += ( psi[ h * dim + i ] * H[ j * dim + h ] ); } psi[ ij ] = - sumPsiH; if( i > 0 ) //if( i > 1 ) for( r = 0; r < i; r++ ) //for( r in 1 : ( i - 1 ) ) { //sum( psi[ r, r : i ] * H[ r : i, i ] ) sumPsiHi = 0.0; for( h = r; h < i + 1; h++ ) { if( sumPsiHi == R_PosInf ) sumPsiHi = max_numeric_limits_ld; if( sumPsiHi == R_NegInf ) sumPsiHi = min_numeric_limits_ld; sumPsiHi += ( psi[ h * dim + r ] * H[ i * dim + h ] ); } //sum( psi[ r, r : j ] * H[ r : j, j ] ) ) sumPsiHj = 0.0; for( h = r; h < j + 1; h++ ) sumPsiHj += ( psi[ h * dim + r ] * H[ j * dim + h ] ); //psi[i, j] <- psi[i, j] - ( ( sum( psi[ r, r : i ] * H[ r : i, i ] ) ) * ( sum( psi[ r, r : j ] * H[ r : j, j ] ) ) ) / ( psi[i, i] ) psi[ ij ] -= ( sumPsiHi * sumPsiHj ) / psi[ i * dim + i ]; } if( psi[ ij ] == R_PosInf ) psi[ ij ] = max_numeric_limits_ld; if( psi[ ij ] == R_NegInf ) psi[ ij ] = min_numeric_limits_ld; //f_T[k] <- f_T[k] + psi[i, j] ^ 2 f_T[ iter ] += ( psi[ ij ] * psi[ ij ] ); } } // checking Inf values if( f_T[ iter ] == R_PosInf ) f_T[ iter ] = max_numeric_limits_ld; } } PutRNGstate(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/src/gcgm_DMH.cpp0000644000176200001440000011771713623016626014504 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" #include "rgwish.h" #include "copula.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_bdmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, counter; int ip, i, j, ij, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, sum_rates, weight_C; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; } else { --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_bdmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, counter, size_sample_graph = *size_sample_g; int ip, i, j, ij, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, sum_rates, weight_C; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector char_g( qp ); // char string_g[pp]; vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // - - - - - - - - - - - - - - - - - - - - // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vectorlog_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_bdmcmc_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij, counter; int ip, i, j, ij, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, sum_rates, weight_C; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_bdmcmc_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, multi_update_C = *multi_update, iteration = *iter, burn_in = *burnin, b1 = *b; int count_all_g = *counter_all_g; int selected_edge_i, selected_edge_j, selected_edge_ij, counter, size_sample_graph = *size_sample_g; int ip, i, j, ij, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, sum_rates, weight_C; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector char_g( qp ); // char string_g[pp]; vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // - - - - - - - - - - - - - - - - - - - - int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy(sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_rjmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], int p_links[], int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b; int randomEdge, counter, selected_edge_i, selected_edge_j; int ip, i, j, ij, jj, dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double Dsijj, Dsjj, Dsij, logH_ij, logI_p, Dij, Djj, Dijj, alpha_ij; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj22_inv( p1 * p1 ); vector Kj12xK22_inv( p1 ); vector K12( p2x2 ); // K[e, -e] vector sigma11( 4 ); // sigma[e, e] vector sigma12( p2x2 ); // sigma[e, -e] vector sigma22( p2 * p2 ); // sigma[-e, -e] vector sigma11_inv( 4 ); vector sigma21xsigma11_inv( p2x2 ); vector sigma2112( p2 * p2 ); vector K22_inv( p2 * p2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - STEP 2: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 randomEdge = static_cast( unif_rand() * qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { if( counter == randomEdge ) { selected_edge_i = i; selected_edge_j = j; } counter++; } // - - - - Calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| ij = selected_edge_j * dim + selected_edge_i; jj = selected_edge_j * dim + selected_edge_j; Dsij = Ds[ ij ]; Dsjj = Ds[ jj ]; Dsijj = - Dsij * Dsij / Dsjj; Dij = D[ ij ]; Djj = D[ jj ]; Dijj = - Dij * Dij / Djj; // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); log_H_ij( &K[0], &sigma[0], &logH_ij, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dsijj, &Dsij, &Dsjj ); log_H_ij( &K_dmh[0], &sigma_dmh[0], &logI_p, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dijj, &Dij, &Djj ); alpha_ij = ( G[ ij ] ) ? ( logH_ij - logI_p ) - log_ratio_g_prior[ ij ] : ( logI_p - logH_ij ) + log_ratio_g_prior[ ij ]; // - - - - End calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < alpha_ij ) { G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) { K_hat[ i ] += K[ i ]; p_links[ i ] += G[ i ]; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of main MCMC loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian copula Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_DMH_rjmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, count_all_g = 0; int randomEdge, counter, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int ip, i, j, ij, jj, dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double Dsijj, Dsjj, Dsij, logH_ij, logI_p, Dij, Djj, Dijj, alpha_ij; bool this_one; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj22_inv( p1 * p1 ); vector Kj12xK22_inv( p1 ); vector K12( p2x2 ); // K[e, -e] vector sigma11( 4 ); // sigma[e, e] vector sigma12( p2x2 ); // sigma[e, -e] vector sigma22( p2 * p2 ); // sigma[-e, -e] vector sigma11_inv( 4 ); vector sigma21xsigma11_inv( p2x2 ); vector sigma2112( p2 * p2 ); vector K22_inv( p2 * p2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // STEP 2: selecting edge and calculating alpha // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 randomEdge = static_cast( unif_rand() * qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { if( counter == randomEdge ) { selected_edge_i = i; selected_edge_j = j; } char_g[ counter++ ] = G[ j * dim + i ] + '0'; // adjToString( G, &all_graphs[g], p ); } // - - - - Calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| ij = selected_edge_j * dim + selected_edge_i; jj = selected_edge_j * dim + selected_edge_j; Dsij = Ds[ ij ]; Dsjj = Ds[ jj ]; Dsijj = - Dsij * Dsij / Dsjj; Dij = D[ ij ]; Djj = D[ jj ]; Dijj = - Dij * Dij / Djj; // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); log_H_ij( &K[0], &sigma[0], &logH_ij, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dsijj, &Dsij, &Dsjj ); log_H_ij( &K_dmh[0], &sigma_dmh[0], &logI_p, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dijj, &Dij, &Djj ); //alpha_ij = ( G[ij] ) ? ( logH_ij - logI_p ) : ( logI_p - logH_ij ); alpha_ij = ( G[ ij ] ) ? ( logH_ij - logI_p ) - log_ratio_g_prior[ ij ] : ( logI_p - logH_ij ) + log_ratio_g_prior[ ij ]; // - - - - End calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < alpha_ij ) { G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { for( i = 0; i < pxp ; i++ ) K_hat[ i ] += K[ i ]; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of main MCMC loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy(sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } } // End of exturn "C" BDgraph/src/gm_mpl_bd_dis.cpp0000644000176200001440000027614413623016621015651 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing the Marginal pseudo-likelihood for BINARY data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_binary( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, double *alpha_jl, double *log_alpha_ijl, double *log_alpha_jl, int *n, int vec_fam_conf_count_0[], int vec_fam_conf_count_1[], vector > &mb_conf, int *size_bit ) { int i_hash, counter, i, j, l, size_mb_conf, mb_node_x_lf, node_x_lf = *node * *length_freq_data; double sum_lgamma_fam; *log_mpl_node = 0.0; int fam_conf_count_0 = 0, fam_conf_count_1 = 0; switch( *size_node ) { case 0: for( i = 0; i < *length_freq_data; i++ ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); *log_mpl_node = sum_lgamma_fam - lgammafn_sign( *n + *alpha_jl, NULL ) + *log_alpha_jl - 2 * *log_alpha_ijl; break; case 1: mb_node_x_lf = mb_node[ 0 ] * *length_freq_data; for( l = 0; l < 2; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ mb_node_x_lf + i ] == l ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); //mb_conf_count = fam_conf_count[0] + fam_conf_count[1]; *log_mpl_node += sum_lgamma_fam - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + *alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += 2 * *log_alpha_jl - 4 * *log_alpha_ijl; break; default: int sz = *size_bit; int size_hash = *size_node / sz + 1; vector hash_mb( size_hash, 0 ); // for case i = 0 for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data ] << ( j - i_hash * sz ); } mb_conf[0] = hash_mb; size_mb_conf = 1; if( data[ node_x_lf ] == 0 ) { vec_fam_conf_count_0[ 0 ] = freq_data[ 0 ]; vec_fam_conf_count_1[ 0 ] = 0; }else{ vec_fam_conf_count_1[ 0 ] = freq_data[ 0 ]; vec_fam_conf_count_0[ 0 ] = 0; } int sizeof_hash = size_hash * sizeof hash_mb[ 0 ]; for( i = 1; i < *length_freq_data; i++ ) { //vector hash_mb( size_hash, 0 ); memset( &hash_mb[0], 0, sizeof_hash ); for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data + i ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data + i ] << ( j - i_hash * sz ); } //data_mb[i] = hash_mb; counter = 1; for( j = 0; j < size_mb_conf; j++ ) if( hash_mb == mb_conf[ j ] ) { ( data[ node_x_lf + i ] == 0 ) ? vec_fam_conf_count_0[ j ] += freq_data[ i ] : vec_fam_conf_count_1[ j ] += freq_data[ i ]; counter = 0; break; } if( counter ) { //( data[ node_x_lf + i ] == 0 ) ? vec_fam_conf_count_0[ size_mb_conf ] = freq_data[ i ] : vec_fam_conf_count_1[ size_mb_conf ] = freq_data[ i ]; if( data[ node_x_lf + i ] == 0 ) { vec_fam_conf_count_0[ size_mb_conf ] = freq_data[ i ]; vec_fam_conf_count_1[ size_mb_conf ] = 0; }else{ vec_fam_conf_count_1[ size_mb_conf ] = freq_data[ i ]; vec_fam_conf_count_0[ size_mb_conf ] = 0; } mb_conf[ size_mb_conf++ ] = hash_mb; } } for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score *log_mpl_node += lgammafn_sign( vec_fam_conf_count_0[ l ] + *alpha_ijl, NULL ) + lgammafn_sign( vec_fam_conf_count_1[ l ] + *alpha_ijl, NULL ) - lgammafn_sign( vec_fam_conf_count_0[l] + vec_fam_conf_count_1[l] + *alpha_jl, NULL ); // adding remaining terms *log_mpl_node += size_mb_conf * ( *log_alpha_jl - 2 * *log_alpha_ijl ); break; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Parallel function to compute the Marginal pseudo-likelihood for BINARY data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_binary_parallel( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, double *alpha_jl, double *log_alpha_ijl, double *log_alpha_jl, int *n, vector > &mb_conf, vector > &data_mb, int *size_bit ) { int i, l, size_mb_conf, mb_node_x_lf, node_x_lf = *node * *length_freq_data; double sum_lgamma_fam; *log_mpl_node = 0.0; int fam_conf_count_0 = 0, fam_conf_count_1 = 0; switch( *size_node ) { case 0: for( i = 0; i < *length_freq_data; i++ ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); *log_mpl_node = sum_lgamma_fam - lgammafn_sign( *n + *alpha_jl, NULL ) + *log_alpha_jl - 2 * *log_alpha_ijl; break; case 1: mb_node_x_lf = mb_node[0] * *length_freq_data; for( l = 0; l < 2; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ mb_node_x_lf + i ] == l ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); //mb_conf_count = fam_conf_count[0] + fam_conf_count[1]; *log_mpl_node += sum_lgamma_fam - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + *alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += 2 * *log_alpha_jl - 4 * *log_alpha_ijl; break; default: int sz = *size_bit; int size_hash = *size_node / sz + 1; #pragma omp parallel { int j, i_hash; vector hash_mb( size_hash ); int sizeof_hash = size_hash * sizeof hash_mb[0]; #pragma omp for for( int i = 0; i < *length_freq_data; i++ ) { memset( &hash_mb[0], 0, sizeof_hash ); for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data + i ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data + i ] << ( j - i_hash * sz ); } data_mb[ i ] = hash_mb; } } mb_conf = data_mb; std::sort( mb_conf.begin(), mb_conf.end() ); mb_conf.erase( std::unique( mb_conf.begin(), mb_conf.end() ), mb_conf.end() ); size_mb_conf = mb_conf.size(); for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data_mb[ i ] == mb_conf[ l ] ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; *log_mpl_node += lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ) - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + *alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += size_mb_conf * ( *log_alpha_jl - 2 * *log_alpha_ijl ); break; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing birth-death rates for dgm_mpl_binary method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_gm_mpl_binary( double rates[], double log_ratio_g_prior[], double log_mpl_pro_node_i[], double log_mpl_pro_node_j[], double curr_log_mpl[], int G[], double g_prior[], int index_row[], int index_col[], int *sub_qp, int size_node[], int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, double *alpha_jl, double *log_alpha_ijl, double *log_alpha_jl, int *n, int *p ) { int dim = *p; int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; #pragma omp parallel { int i, j, t, ij, nodexdim, count_mb, size_node_i_new, size_node_j_new; double log_rate; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used int *mb_node_j_new = new int[ dim ]; // For dynamic memory used vector > mb_conf( *length_freq_data ); vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; size_node_j_new = size_node[ j ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; size_node_j_new = size_node[ j ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl_binary( &i, mb_node_i_new, &size_node_i_new, &log_mpl_pro_node_i[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_mpl_binary( &j, mb_node_j_new, &size_node_j_new, &log_mpl_pro_node_j[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_rate = log_mpl_pro_node_i[ counter ] + log_mpl_pro_node_j[ counter ] - curr_log_mpl[ i ] - curr_log_mpl[ j ]; //log_rate = ( G_ij ) ? log_rate - *log_ratio_g_prior : log_rate + *log_ratio_g_prior; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_i_new; delete[] mb_node_j_new; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Local update the birth-death rates for dgm_mpl_binary method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void local_rates_gm_mpl_binary( double rates[], double log_ratio_g_prior[], double log_mpl_pro_node_i[], double log_mpl_pro_node_j[], int *selected_edge_i, int *selected_edge_j, double curr_log_mpl[], int G[], double g_prior[], int size_node[], int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, double *alpha_jl, double *log_alpha_ijl, double *log_alpha_jl, int *n, int *p ) { int dim = *p; int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; #pragma omp parallel { int counter, i, j, t, ij, nodexdim, count_mb, size_node_j_new; double log_rate; int *mb_node_j_new = new int[ dim ]; // For dynamic memory used vector > mb_conf( *length_freq_data ); vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); #pragma omp for for( int ind = 0; ind < *selected_edge_i; ind++ ) { i = ind; j = *selected_edge_i; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { counter = j * ( j - 1 ) / 2 + i; if( G[ ij ] ) { size_node_j_new = size_node[ j ] - 1; if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_j_new = size_node[ j ] + 1; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl_binary( &j, mb_node_j_new, &size_node_j_new, &log_mpl_pro_node_j[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_rate = log_mpl_pro_node_i[ counter ] + log_mpl_pro_node_j[ counter ] - curr_log_mpl[ i ] - curr_log_mpl[ j ]; // log_rate = ( G_ij ) ? log_rate - *log_ratio_g_prior : log_rate + *log_ratio_g_prior; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_j_new; } #pragma omp parallel { int counter, i, j, t, ij, nodexdim, count_mb, size_node_i_new; double log_rate; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used vector > mb_conf( *length_freq_data ); vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); #pragma omp for for( int ind = *selected_edge_i + 1; ind < dim; ind++ ) { i = *selected_edge_i; j = ind; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { counter = j * ( j - 1 ) / 2 + i; if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; } log_mpl_binary( &i, mb_node_i_new, &size_node_i_new, &log_mpl_pro_node_i[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_rate = log_mpl_pro_node_i[ counter ] + log_mpl_pro_node_j[ counter ] - curr_log_mpl[ i ] - curr_log_mpl[ j ]; //log_rate = ( G_ij ) ? log_rate - *log_ratio_g_prior : log_rate + *log_ratio_g_prior; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_i_new; } #pragma omp parallel { int counter, i, j, t, ij, nodexdim, count_mb, size_node_j_new; double log_rate; int *mb_node_j_new = new int[ dim ]; // For dynamic memory used vector > mb_conf( *length_freq_data ); vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); #pragma omp for for( int ind = 0; ind < *selected_edge_j; ind++ ) { i = ind; j = *selected_edge_j; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { counter = j * ( j - 1 ) / 2 + i; if( G[ ij ] ) { size_node_j_new = size_node[ j ] - 1; if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_j_new = size_node[ j ] + 1; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl_binary( &j, mb_node_j_new, &size_node_j_new, &log_mpl_pro_node_j[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_rate = log_mpl_pro_node_i[ counter ] + log_mpl_pro_node_j[ counter ] - curr_log_mpl[ i ] - curr_log_mpl[ j ]; //log_rate = ( G_ij ) ? log_rate - *log_ratio_g_prior : log_rate + *log_ratio_g_prior; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_j_new; } #pragma omp parallel { int counter, i, j, t, ij, nodexdim, count_mb, size_node_i_new; double log_rate; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used vector > mb_conf( *length_freq_data ); vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); #pragma omp for for( int ind = *selected_edge_j + 1; ind < dim; ind++ ) { i = *selected_edge_j; j = ind; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { counter = j * ( j - 1 ) / 2 + i; if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; } log_mpl_binary( &i, mb_node_i_new, &size_node_i_new, &log_mpl_pro_node_i[ counter ], data, freq_data, length_freq_data, alpha_ijl, alpha_jl, log_alpha_ijl, log_alpha_jl, n, &vec_fam_conf_count_0[0], &vec_fam_conf_count_1[0], mb_conf, &size_bit ); log_rate = log_mpl_pro_node_i[ counter ] + log_mpl_pro_node_j[ counter ] - curr_log_mpl[ i ] - curr_log_mpl[ j ]; //log_rate = ( G_ij ) ? log_rate - *log_ratio_g_prior : log_rate + *log_ratio_g_prior; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_i_new; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for binary data with marginal pseudo-likelihood // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_binary_ma( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, double *alpha_ijl, int *n, int *p, double p_links[], int *print ) { int length_freq_data = *length_f_data, print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); vector p_links_Cpp( pxp, 0.0 ); // Counting size of notes vectorsize_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; vector > mb_conf( length_freq_data ); vector > data_mb( length_freq_data ); vectorvec_fam_conf_count_0( length_freq_data ); vectorvec_fam_conf_count_1( length_freq_data ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vectorlog_mpl_pro_node_i( sub_qp ); vectorlog_mpl_pro_node_j( sub_qp ); vector rates( sub_qp ); rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | //rates_gm_mpl_binary( &rates[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, &log_ratio_g_prior, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); //sum_rates = std::accumulate( rates.begin(), rates.end(), 0.0 ); //index_selected_edge = std::distance( rates.begin(), max_element( rates.begin(), rates.end() ) ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( int i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); local_rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, g_prior, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for binary data with marginal pseudo-likelihood // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_binary_map( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, double *alpha_ijl, int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; vector > mb_conf( length_freq_data ); vector > data_mb( length_freq_data ); vectorvec_fam_conf_count_0( length_freq_data ); vectorvec_fam_conf_count_1( length_freq_data ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vectorlog_mpl_pro_node_i( sub_qp ); vectorlog_mpl_pro_node_j( sub_qp ); vector rates( sub_qp ); rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | //rates_gm_mpl_binary( &rates[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, &log_ratio_g_prior, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); //sum_rates = std::accumulate( rates.begin(), rates.end(), 0.0 ); //index_selected_edge = std::distance( rates.begin(), max_element( rates.begin(), rates.end() ) ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); local_rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, g_prior, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_binary_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, double *alpha_ijl, int *n, int *p, double p_links[], int *multi_update, int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); vector p_links_Cpp( pxp, 0.0 ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; vector > mb_conf( length_freq_data ); vector > data_mb( length_freq_data ); vectorvec_fam_conf_count_0( length_freq_data ); vectorvec_fam_conf_count_1( length_freq_data ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); vectorlog_mpl_pro_node_i( sub_qp ); vectorlog_mpl_pro_node_j( sub_qp ); vector rates( sub_qp ); rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | //rates_gm_mpl_binary( &rates[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, &log_ratio_g_prior, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( int i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - - Updating graph based on selected edges - - - - - - - - - - - - - - - - - - - - - - - - - -| for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); local_rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, g_prior, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_binary_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, double *alpha_ijl, int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *multi_update , int *print ) { int length_freq_data = *length_f_data, print_c = *print, multi_update_C = *multi_update; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = *counter_all_g; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); bool this_one; int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; string string_g; vector sample_graphs_C( iteration - burn_in ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; vector > mb_conf( length_freq_data ); vector > data_mb( length_freq_data ); vectorvec_fam_conf_count_0( length_freq_data ); vectorvec_fam_conf_count_1( length_freq_data ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); vectorlog_mpl_pro_node_i( sub_qp ); vectorlog_mpl_pro_node_j( sub_qp ); vector rates( sub_qp ); rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | //rates_gm_mpl_binary( &rates[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, &log_ratio_g_prior, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - Updating graph based on selected edges - - - - - - - - - - - - - - - - - - - - - - - - - - | for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_binary_parallel( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, mb_conf, data_mb, &size_bit ); local_rates_gm_mpl_binary( &rates[0], &log_ratio_g_prior[0], &log_mpl_pro_node_i[0], &log_mpl_pro_node_j[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, g_prior, &size_node[0], data, freq_data, &length_freq_data, alpha_ijl, &alpha_jl, &log_alpha_ijl, &log_alpha_jl, ©_n, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing the Marginal pseudo-likelihood for discrete data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_dis( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, int max_range_nodes[], double *alpha_ijl, int *n ) { int i, j, l, size_mb_conf, mb_node_x_lf, mb_conf_l, mb_conf_count, node_x_lf = *node * *length_freq_data; int max_range_node_j = max_range_nodes[ *node ]; double sum_lgamma_fam; double alpha_jl = ( max_range_node_j + 1 ) * *alpha_ijl; vectorfam_conf_count( max_range_node_j ); vectormb_conf( *length_freq_data ); vectordata_mb( *length_freq_data, 0 ); if( *size_node == 0 ) size_mb_conf = 1; if( *size_node == 1 ) { // data_mb = data[ , mb_node ] mb_node_x_lf = mb_node[0] * *length_freq_data; for( i = 0; i < *length_freq_data; i++ ) data_mb[ i ] = data[ mb_node_x_lf + i ]; //memcpy( &data_mb[0], &data[0] + mb_node_x_lf, sizeof( int ) * *length_freq_data ); size_mb_conf = max_range_nodes[ mb_node[0] ] + 1; // mb_conf = 1:size_mb_conf; for( j = 0; j < size_mb_conf; j++ ) mb_conf[ j ] = j; } if( *size_node > 1 ) { vectorcumprod_mb( *size_node ); cumprod_mb[0] = max_range_nodes[ mb_node[ 0 ] ] + 1; //cumprod_mb = t( t( c( 1, cumprod( max_range_nodes[ mb_node[ 2:length( mb_node ) ] ] ) ) ) ) for( j = 1; j < *size_node; j++ ) cumprod_mb[ j ] = cumprod_mb[ j - 1 ] * ( max_range_nodes[ mb_node[ j ] ] + 1 ); //data_mb = c( data[ , mb_node ] %*% cumprod_mb ) for( i = 0; i < *length_freq_data; i++ ) for( j = 0; j < *size_node; j++ ) data_mb[ i ] += cumprod_mb[ j ] * data[ mb_node[ j ] * *length_freq_data + i ]; // mb_conf = unique( data_mb ) for( i = 0; i < *length_freq_data; i++ ) mb_conf[ i ] = data_mb[ i ]; //memcpy( &mb_conf[0], &data_mb[0], sizeof( int ) * *length_freq_data ); std::sort( mb_conf.begin(), mb_conf.end() ); mb_conf.erase( std::unique( mb_conf.begin(), mb_conf.end() ), mb_conf.end() ); size_mb_conf = mb_conf.size(); } if( *size_node == 0 ) { // n_ijl // for( j in 0:max_range_node_j ) fam_conf_count[ j + 1 ] = sum( freq_data[ ( data[ , node ] == j ) ] ) for( j = 0; j < ( max_range_node_j + 1 ); j++ ) { //fam_conf_count[j] = std::count( &data[0] + node_x_n, &data[0] + node_x_n + *n, j + 1 ); fam_conf_count[ j ] = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ node_x_lf + i ] == j ) fam_conf_count[ j ] += freq_data[ i ]; } sum_lgamma_fam = 0.0; for( j = 0; j < ( max_range_node_j + 1 ); j++ ) sum_lgamma_fam += lgammafn_sign( fam_conf_count[ j ] + *alpha_ijl, NULL ); // log_mpl_node = sum( lgamma( fam_conf_count + alpha ) ) - lgamma( n + alpha_jl ) *log_mpl_node = sum_lgamma_fam - lgammafn_sign( *n + alpha_jl, NULL ); } if( *size_node > 0 ) { *log_mpl_node = 0.0; for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score { //ind = c( ( data_mb == mb_conf[ l ] ) * 1 ) * freq_data # finds positions of MB configuration //mb_conf_count = sum( ind ) # n_jl mb_conf_l = mb_conf[ l ]; // mb_conf_count = std::count( data_mb.begin(), data_mb.end(), mb_conf_l ); mb_conf_count = 0; for( i = 0; i < *length_freq_data; i++ ) if( data_mb[ i ] == mb_conf_l ) mb_conf_count += freq_data[ i ]; // fam_conf_count = node_conf * 0 // for( j in 1:max_range_node_j ) fam_conf_count[j] = sum( ( data[ , node ] == j ) * ind ) for( j = 0; j < ( max_range_node_j + 1 ); j++ ) { fam_conf_count[ j ] = 0; for( i = 0; i < *length_freq_data; i++ ) if( ( data[ node_x_lf + i ] == j ) && ( data_mb[ i ] == mb_conf_l ) ) fam_conf_count[ j ] += freq_data[ i ]; } sum_lgamma_fam = 0.0; for( j = 0; j < ( max_range_node_j + 1 ); j++ ) sum_lgamma_fam += lgammafn_sign( fam_conf_count[ j ] + *alpha_ijl, NULL ); *log_mpl_node += sum_lgamma_fam - lgammafn_sign( mb_conf_count + alpha_jl, NULL ); } } // adding remaining terms //log_mpl_node = log_mpl_node + size_mb_conf * lgamma( alpha_jl ) - size_mb_conf * ( max_range_node_j + 1 ) * lgamma( alpha ) - size_node * log( p ) / 2 # adds the remaining terms *log_mpl_node += ( size_mb_conf * lgammafn_sign( alpha_jl, NULL ) - size_mb_conf * ( max_range_node_j + 1 ) * lgammafn_sign( *alpha_ijl, NULL ) ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing birth-death rates for dgm_mpl method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_gm_mpl_dis( double rates[], double log_ratio_g_prior[], double curr_log_mpl[], int G[], double g_prior[], int index_row[], int index_col[], int *sub_qp, int size_node[], int data[], int freq_data[], int *length_freq_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p ) { int dim = *p; #pragma omp parallel { int i, j, ij, t, nodexdim, count_mb, size_node_i_new, size_node_j_new; double log_mpl_i_new, log_mpl_j_new, log_rate; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used int *mb_node_j_new = new int[ dim ]; // For dynamic memory used #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; ij = j * dim + i; if( ( g_prior[ ij ] != 0.0 ) or ( g_prior[ ij ] != 1.0 ) ) { if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; size_node_j_new = size_node[ j ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; size_node_j_new = size_node[ j ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl_dis( &i, mb_node_i_new, &size_node_i_new, &log_mpl_i_new, data, freq_data, length_freq_data, max_range_nodes, alpha_ijl, n ); log_mpl_dis( &j, mb_node_j_new, &size_node_j_new, &log_mpl_j_new, data, freq_data, length_freq_data, max_range_nodes, alpha_ijl, n ); log_rate = log_mpl_i_new + log_mpl_j_new - curr_log_mpl[ i ] - curr_log_mpl[ j ]; log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] mb_node_i_new; delete[] mb_node_j_new; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_ma( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, double p_links[], int *print ) { int length_freq_data = *length_f_data, print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); // Counting size of notes vectorsize_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_gm_mpl_dis( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); //sum_rates = std::accumulate( rates.begin(), rates.end(), 0.0 ); //index_selected_edge = std::distance( rates.begin(), max_element( rates.begin(), rates.end() ) ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( int i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_map( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_gm_mpl_dis( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); //sum_rates = std::accumulate( rates.begin(), rates.end(), 0.0 ); //index_selected_edge = std::distance( rates.begin(), max_element( rates.begin(), rates.end() ) ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, double p_links[], int *multi_update, int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_gm_mpl_dis( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( int i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_bdmcmc_mpl_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *multi_update , int *print ) { int length_freq_data = *length_f_data, print_c = *print, multi_update_C = *multi_update; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = *counter_all_g; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; string string_g; vector sample_graphs_C( iteration - burn_in ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_gm_mpl_dis( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, g_prior, &index_row[0], &index_col[0], &sub_qp, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing alpha (probability of acceptness) in RJ-MCMC algorithm for dgm_mpl method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_alpha_rjmcmc_gm_mpl_dis( double *log_alpha_ij, double log_ratio_g_prior[], int *i, int *j, double curr_log_mpl[], int G[], int size_node[], int data[], int freq_data[], int *length_freq_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p ) { int t, nodexdim, count_mb, dim = *p, size_node_i_new, size_node_j_new; double log_mpl_i_new, log_mpl_j_new; vectormb_node_i_new( dim ); vectormb_node_j_new( dim ); int ij = *j * dim + *i; if( G[ ij ] ) { size_node_i_new = size_node[ *i ] - 1; size_node_j_new = size_node[ *j ] - 1; if( size_node_i_new > 0 ) { nodexdim = *i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != *j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = *j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != *i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ *i ] + 1; size_node_j_new = size_node[ *j ] + 1; nodexdim = *i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == *j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = *j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == *i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl_dis( i, &mb_node_i_new[0], &size_node_i_new, &log_mpl_i_new, data, freq_data, length_freq_data, max_range_nodes, alpha_ijl, n ); log_mpl_dis( j, &mb_node_j_new[0], &size_node_j_new, &log_mpl_j_new, data, freq_data, length_freq_data, max_range_nodes, alpha_ijl, n ); *log_alpha_ij = log_mpl_i_new + log_mpl_j_new - curr_log_mpl[ *i ] - curr_log_mpl[ *j ]; *log_alpha_ij = ( G[ ij ] ) ? *log_alpha_ij - log_ratio_g_prior[ ij ] : *log_alpha_ij + log_ratio_g_prior[ ij ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_rjmcmc_mpl_ma( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, double p_links[], int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n; int selected_edge, selected_edge_i, selected_edge_j; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double log_alpha_ij; vectorp_links_Cpp( pxp, 0.0 ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of selected edge vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; // - - main loop for RJ-MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc_gm_mpl_dis( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) p_links_Cpp[ i ] += G[ i ]; // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| memcpy( &p_links[0], &p_links_Cpp[0], sizeof( double ) * pxp ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Graphical models for discrete data with marginal pseudo-likelihood // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void dgm_rjmcmc_mpl_map( int *iter, int *burnin, int G[], double g_prior[], int data[], int freq_data[], int *length_f_data, int max_range_nodes[], double *alpha_ijl, int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *print ) { int length_freq_data = *length_f_data, print_c = *print; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = 0; int selected_edge, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double log_alpha_ij; bool this_one; vector char_g( qp ); // char string_g[pp]; string string_g; vector sample_graphs_C( iteration - burn_in ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; // - - main loop for Reversible Jump MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc_gm_mpl_dis( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &size_node[0], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl_dis( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, alpha_ijl, ©_n ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( int i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } } // End of exturn "C" BDgraph/src/rgwish.h0000644000176200001440000000332413621263231014025 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #ifndef rgwish_H #define rgwish_H #include "matrix.h" extern "C" { void rwish_c( double Ts[], double K[], int *b, int *p ); void rgwish_c( int G[], double Ts[], double K[], int *b, int *p, double *threshold ); void rgwish_sigma( int G[], int size_node[], double Ts[], double K[], double sigma[], int *b_star, int *p, double *threshold, double sigma_start[], double inv_C[], double beta_star[], double sigma_i[], vector &sigma_start_N_i, vector &sigma_N_i, vector &N_i ); void log_exp_mc( int G[], int nu[], int *b, double H[], int *check_H, int *mc, int *p, double f_T[] ); } #endif BDgraph/src/copula.cpp0000644000176200001440000002730413623747750014363 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "copula.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing mean for copula function // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_mean( double Z[], double K[], double *mu_ij, double *sigma, int *i, int *j, int *n, int *p ) { int k, dim = *p, number = *n, row = *i, col = *j, jxp = col * dim; double mu = 0.0; for( k = 0; k < col; k++ ) mu += Z[ k * number + row ] * K[ jxp + k ]; for( k = col + 1; k < dim; k++ ) mu += Z[ k * number + row ] * K[ jxp + k ]; *mu_ij = - mu * *sigma; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing bounds for copula function // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_bounds( double Z[], int R[], double *lb, double *ub, int *i, int *j, int *n ) { int kj, col = *j, number = *n, ij = col * number + *i; double low_b = -1e308, upper_b = +1e308; for( int k = 0; k < number; k++ ) { kj = col * number + k; if( R[ kj ] < R[ ij ] ) low_b = max( Z[ kj ], low_b ); else if( R[ kj ] > R[ ij ] ) upper_b = min( Z[ kj ], upper_b ); } *lb = low_b; *ub = upper_b; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // copula for BDMCMC sampling algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void copula( double Z[], double K[], int R[], int not_continuous[], int *n, int *p ) { int number = *n, dim = *p, nxp = number * dim, dimp1 = dim + 1; #pragma omp parallel { double sigma, sd_j, mu_ij, lb, ub, runif_value, pnorm_lb, pnorm_ub; int i, j; #pragma omp for for( int counter = 0; counter < nxp; counter++ ) { j = counter / number; i = counter % number; if( not_continuous[ j ] ) { sigma = 1.0 / K[ j * dimp1 ]; // 1.0 / K[ j * dim + j ]; sd_j = sqrt( sigma ); get_mean( Z, K, &mu_ij, &sigma, &i, &j, &number, &dim ); get_bounds( Z, R, &lb, &ub, &i, &j, &number ); pnorm_lb = Rf_pnorm5( lb, mu_ij, sd_j, TRUE, FALSE ); pnorm_ub = Rf_pnorm5( ub, mu_ij, sd_j, TRUE, FALSE ); //runif_value = runif( pnorm_lb, pnorm_ub ); runif_value = pnorm_lb + unif_rand() * ( pnorm_ub - pnorm_lb ); Z[ counter ] = Rf_qnorm5( runif_value, mu_ij, sd_j, TRUE, FALSE ); } } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // copula - Discrete Weibull for BDMCMC sampling algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void copula_dw( double Z[], double K[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *p ) { int number = *n, dim = *p, nxp = number * dim, dimp1 = dim + 1; #pragma omp parallel { double sigma, sd_j, mu_ij, runif_value, pnorm_lb, pnorm_ub; int i, j; #pragma omp for for( int counter = 0; counter < nxp; counter++ ) { j = counter / number; i = counter % number; sigma = 1.0 / K[ j * dimp1 ]; // 1.0 / K[ j * dim + j ]; sd_j = sqrt( sigma ); get_mean( Z, K, &mu_ij, &sigma, &i, &j, &number, &dim ); pnorm_lb = Rf_pnorm5( lower_bounds[ counter ], mu_ij, sd_j, TRUE, FALSE ); pnorm_ub = Rf_pnorm5( upper_bounds[ counter ], mu_ij, sd_j, TRUE, FALSE ); //runif_value = runif( pnorm_lb, pnorm_ub ); runif_value = pnorm_lb + unif_rand() * ( pnorm_ub - pnorm_lb ); Z[ counter ] = Rf_qnorm5( runif_value, mu_ij, sd_j, TRUE, FALSE ); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // copula - Discrete Weibull for data with missing values // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void copula_dw_NA( double Z[], double K[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *p ) { int number = *n, dim = *p, nxp = number * dim, dimp1 = dim + 1; #pragma omp parallel { double sigma, sd_j, mu_ij, runif_value, pnorm_lb, pnorm_ub; int i, j; #pragma omp for for( int counter = 0; counter < nxp; counter++ ) { j = counter / number; i = counter % number; sigma = 1.0 / K[ j * dimp1 ]; // 1.0 / K[ j * dim + j ]; sd_j = sqrt( sigma ); get_mean( Z, K, &mu_ij, &sigma, &i, &j, &number, &dim ); if( Y[ counter ] != -1000 ) // here NA values have been replaced by -1000 { pnorm_lb = Rf_pnorm5( lower_bounds[ counter ], mu_ij, sd_j, TRUE, FALSE ); pnorm_ub = Rf_pnorm5( upper_bounds[ counter ], mu_ij, sd_j, TRUE, FALSE ); //runif_value = runif( pnorm_lb, pnorm_ub ); runif_value = pnorm_lb + unif_rand() * ( pnorm_ub - pnorm_lb ); Z[ counter ] = Rf_qnorm5( runif_value, mu_ij, sd_j, TRUE, FALSE ); }else Z[ counter ] = mu_ij + norm_rand() * sd_j; // rnorm( mu_ij, sd_j ); } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Calculating Ds = D + S for the copula-Discrete Weibull in BDMCMC sampling algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_Ds_dw( double K[], double Z[], int Y[], double lower_bounds[], double upper_bounds[], double D[], double Ds[], double S[], int *gcgm, int *n, int *p ) { int dim = *p; ( *gcgm == 0 ) ? copula_dw( Z, K, Y, lower_bounds, upper_bounds, n, &dim ) : copula_dw_NA( Z, K, Y, lower_bounds, upper_bounds, n, &dim ); // S <- t(Z) %*% Z; NOTE, I'm using Ds instead of S, for saving memory double alpha = 1.0, beta = 0.0; char transA = 'T', transB = 'N'; F77_NAME(dgemm)( &transA, &transB, &dim, &dim, n, &alpha, Z, n, Z, n, &beta, &S[0], &dim FCONE FCONE ); #pragma omp parallel for for( int i = 0; i < dim * dim; i++ ) Ds[ i ] = D[ i ] + S[ i ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing bounds for copula function for data with missing values // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_bounds_NA( double Z[], int R[], double *lb, double *ub, int *i, int *j, int *n ) { int kj, number = *n, col = *j, ij = col * number + *i; double low_b = -1e308, upper_b = +1e308; for( int k = 0; k < number; k++ ) { kj = col * number + k; if( R[ kj ] != -1000 ) // here NA values have been replaced by -1000 { if( R[ kj ] < R[ ij ] ) low_b = max( Z[ kj ], low_b ); else if( R[ kj ] > R[ ij ] ) upper_b = min( Z[ kj ], upper_b ); } } *lb = low_b; *ub = upper_b; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // copula for data with missing values // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void copula_NA( double Z[], double K[], int R[], int not_continuous[], int *n, int *p ) { int number = *n, dim = *p, nxp = number * dim, dimp1 = dim + 1; #pragma omp parallel { double sigma, sd_j, mu_ij, lb, ub, runif_value, pnorm_lb, pnorm_ub; int i, j; #pragma omp for for( int counter = 0; counter < nxp; counter++ ) { j = counter / number; i = counter % number; if( not_continuous[ j ] ) { sigma = 1.0 / K[ j * dimp1 ]; // 1.0 / K[ j * dim + j ]; sd_j = sqrt( sigma ); get_mean( Z, K, &mu_ij, &sigma, &i, &j, &number, &dim ); if( R[ counter ] != -1000 ) // here NA values have been replaced by -1000 { get_bounds_NA( Z, R, &lb, &ub, &i, &j, &number ); pnorm_lb = Rf_pnorm5( lb, mu_ij, sd_j, TRUE, FALSE ); pnorm_ub = Rf_pnorm5( ub, mu_ij, sd_j, TRUE, FALSE ); //runif_value = runif( pnorm_lb, pnorm_ub ); runif_value = pnorm_lb + unif_rand() * ( pnorm_ub - pnorm_lb ); Z[ counter ] = Rf_qnorm5( runif_value, mu_ij, sd_j, TRUE, FALSE ); }else Z[ counter ] = mu_ij + norm_rand() * sd_j; // rnorm( mu_ij, sd_j ); } } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Calculating Ds = D + S for the BDMCMC sampling algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_Ds( double K[], double Z[], int R[], int not_continuous[], double D[], double Ds[], double S[], int *gcgm, int *n, int *p ) { int dim = *p; ( *gcgm == 0 ) ? copula( Z, K, R, not_continuous, n, &dim ) : copula_NA( Z, K, R, not_continuous, n, &dim ); // S <- t(Z) %*% Z; NOTE, I'm using Ds instead of S, for saving memory double alpha = 1.0, beta = 0.0; char transA = 'T', transB = 'N'; F77_NAME(dgemm)( &transA, &transB, &dim, &dim, n, &alpha, Z, n, Z, n, &beta, &S[0], &dim FCONE FCONE ); #pragma omp parallel for for( int i = 0; i < dim * dim; i++ ) Ds[ i ] = D[ i ] + S[ i ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Calculating Ts = chol( solve( Ds ) ) for the BDMCMC sampling algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void get_Ts( double Ds[], double Ts[], double inv_Ds[], double copy_Ds[], int *p ) { int dim = *p; memcpy( ©_Ds[0], Ds, sizeof( double ) * dim * dim ); inverse( ©_Ds[0], &inv_Ds[0], &dim ); cholesky( &inv_Ds[0], Ts, &dim ); } } // End of exturn "C" BDgraph/src/gcgm_dw_bd.cpp0000644000176200001440000006162113623016625015142 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see .| // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #include "matrix.h" #include "rgwish.h" #include "copula.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void gcgm_dw_bdmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_Ds_dw( K, Z, Y, lower_bounds, upper_bounds, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void gcgm_dw_bdmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; bool this_one; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds_dw( K, Z, Y, lower_bounds, upper_bounds, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Multiple birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void gcgm_dw_bdmcmc_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - for rgwish_sigma - - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds_dw( K, Z, Y, lower_bounds, upper_bounds, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Multiple birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| void gcgm_dw_bdmcmc_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, multi_update_C = *multi_update, iteration = *iter, burn_in = *burnin; int count_all_g = *counter_all_g; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; bool this_one; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds_dw( K, Z, Y, lower_bounds, upper_bounds, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy(sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } } // End of exturn "C" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| BDgraph/src/matrix.cpp0000644000176200001440000013621113621263231014363 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves square sub_matrix B (p_sub x p_sub), dictated by vector sub // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_matrix( double A[], double sub_A[], int sub[], int *p_sub, int *p ) { int i, j, ixp, subixp, psub = *p_sub, pdim = *p; for( i = 0; i < psub; i++ ) { ixp = i * psub; subixp = sub[ i ] * pdim; for( j = 0; j < psub; j++ ) sub_A[ ixp + j ] = A[ subixp + sub[ j ] ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes symmetric matrix A (p x p) and // retrieves upper part of sub_matrix B (p_sub x p_sub), dictated by vector sub // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_matrix_upper( double A[], double sub_A[], int sub[], int *p_sub, int *p ) { int i, j, ixp, subixp, psub = *p_sub, pdim = *p; for( i = 0; i < psub; i++ ) { ixp = i * psub; subixp = sub[ i ] * pdim; for( j = 0; j <= i; j++ ) sub_A[ ixp + j ] = A[ subixp + sub[ j ] ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves vector sub_A which is 'sub' th row of matrix A, minus 'sub' element // Likes A[j, -j] in R // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_row_mins( double A[], double sub_A[], int *sub, int *p ) { int subj = *sub, pdim = *p, subxp = subj * pdim; memcpy( sub_A , A + subxp , sizeof( double ) * subj ); memcpy( sub_A + subj, A + subxp + subj + 1, sizeof( double ) * ( pdim - subj - 1 ) ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves sub_matrix sub_A(2 x p-2) which is sub rows of matrix A, minus two elements // Likes A[(i,j), -(i,j)] in R ONLY FOR SYMMETRIC MATRICES // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_rows_mins( double A[], double sub_A[], int *row, int *col, int *p ) { int i, l = 0, pdim = *p, sub0 = *row, sub1 = *col, sub0p = sub0 * pdim, sub1p = sub1 * pdim; for( i = 0; i < sub0; i++ ) { sub_A[ l++ ] = A[ sub0p + i ]; sub_A[ l++ ] = A[ sub1p + i ]; } for( i = sub0 + 1; i < sub1; i++ ) { sub_A[ l++ ] = A[ sub0p + i ]; sub_A[ l++ ] = A[ sub1p + i ]; } for( i = sub1 + 1; i < pdim; i++ ) { sub_A[ l++ ] = A[ sub0p + i ]; sub_A[ l++ ] = A[ sub1p + i ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves sub_matrix sub_A(p-2 x 2) which is sub cols of matrix A, minus two elements // Likes A[-(i,j), (i,j)] in R // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_cols_mins( double A[], double sub_A[], int *row, int *col, int *p ) { int subi = *row, subj = *col, pdim = *p, p2 = pdim - 2, subixp = subi * pdim, subjxp = subj * pdim; memcpy( sub_A , A + subixp , sizeof( double ) * subi ); memcpy( sub_A + subi , A + subixp + subi + 1, sizeof( double ) * ( subj - subi - 1 ) ); memcpy( sub_A + subj - 1, A + subixp + subj + 1, sizeof( double ) * ( pdim - subj - 1 ) ); memcpy( sub_A + p2 , A + subjxp , sizeof( double ) * subi ); memcpy( sub_A + p2 + subi , A + subjxp + subi + 1, sizeof( double ) * ( subj - subi - 1 ) ); memcpy( sub_A + p2 + subj - 1, A + subjxp + subj + 1, sizeof( double ) * ( pdim - subj - 1 ) ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes symmatric matrix A (p x p) and // retrieves A12(1x(p-1)) and A22((p-1)x(p-1)) // Like A12=A[j, -j], and A22=A[-j, -j] in R // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_matrices1( double A[], double A12[], double A22[], int *sub, int *p ) { int i, ixpdim, ixp1, pdim = *p, p1 = pdim - 1, psub = *sub, subxp = psub * pdim, mpsub = pdim - psub - 1; int size_psub = sizeof( double ) * psub; int size_mpsub = sizeof( double ) * mpsub; memcpy( A12, A + subxp, size_psub ); memcpy( A12 + psub, A + subxp + psub + 1, size_mpsub ); for( i = 0; i < psub; i++ ) { ixpdim = i * pdim; ixp1 = i * p1; memcpy( A22 + ixp1 , A + ixpdim , size_psub ); memcpy( A22 + ixp1 + psub, A + ixpdim + psub + 1, size_mpsub ); } for( i = psub + 1; i < pdim; i++ ) { ixpdim = i * pdim; ixp1 = ( i - 1 ) * p1; memcpy( A22 + ixp1 , A + ixpdim , size_psub ); memcpy( A22 + ixp1 + psub, A + ixpdim + psub + 1, size_mpsub ); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves A11(2x2), A12(2x(p-2)), and A22((p-2)x(p-2)) // Like A11=A[e, e], A12=A[e, -e], and A22=A[-e, -e] in R // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_matrices( double A[], double A11[], double A12[], double A22[], int *row, int *col, int *p ) { int i, j, ixp, ij, pdim = *p, p2 = pdim - 2, sub0 = *row, sub1 = *col; A11[ 0 ] = A[ sub0 * pdim + sub0 ]; A11[ 1 ] = A[ sub0 * pdim + sub1 ]; A11[ 2 ] = A11[ 1 ]; // for symmetric matrices A11[ 3 ] = A[ sub1 * pdim + sub1 ]; for( i = 0; i < sub0; i++ ) { ixp = i * pdim; A12[ i + i ] = A[ ixp + sub0 ]; A12[ i + i + 1 ] = A[ ixp + sub1 ]; for( j = 0; j < sub0; j++ ) A22[ j * p2 + i ] = A[ ixp + j ]; for( j = sub0 + 1; j < sub1; j++ ) { ij = ixp + j; A22[ ( j - 1 ) * p2 + i ] = A[ ij ]; A22[ i * p2 + j - 1 ] = A[ ij ]; } for( j = sub1 + 1; j < pdim; j++ ) { ij = ixp + j; A22[ ( j - 2 ) * p2 + i ] = A[ ij ]; A22[ i * p2 + j - 2 ] = A[ ij ]; } } for( i = sub0 + 1; i < sub1; i++ ) { ixp = i * pdim; A12[ i + i - 2 ] = A[ ixp + sub0 ]; A12[ i + i - 1 ] = A[ ixp + sub1 ]; for( j = sub0 + 1; j < sub1; j++ ) A22[ ( j - 1 ) * p2 + i - 1 ] = A[ ixp + j ]; for( j = sub1 + 1; j < pdim; j++ ) { ij = ixp + j; A22[ ( j - 2 ) * p2 + i - 1 ] = A[ ij ]; A22[ ( i - 1 ) * p2 + j - 2 ] = A[ ij ]; } } for( i = sub1 + 1; i < pdim; i++ ) { ixp = i * pdim; A12[ i + i - 4 ] = A[ ixp + sub0 ]; A12[ i + i - 3 ] = A[ ixp + sub1 ]; for( j = sub1 + 1; j < pdim; j++ ) A22[ ( j - 2 ) * p2 + i - 2 ] = A[ ixp + j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Takes square matrix A (p x p) and // retrieves A11_inv ( 2 x 2 ), A21 ( ( p - 2 ) x 2 ), and A22 ( ( p - 2 ) x ( p - 2 ) ) // Like A11_inv=inv ( A[ e, e ] ), A21 = A[ -e, e ], and A22 = A[ -e, -e ] in R // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void sub_matrices_inv( double A[], double A11_inv[], double A21[], double A22[], int *row, int *col, int *p ) { int i, ixp, ixp2, pdim = *p, p2 = pdim - 2, sub0 = *row, sub1 = *col; int sub0xp = sub0 * pdim, sub1xp = sub1 * pdim, sub0_plus = sub0 + 1, sub1_plus = sub1 + 1; double a11 = A[ sub0 * pdim + sub0 ]; double a12 = A[ sub0 * pdim + sub1 ]; double a22 = A[ sub1 * pdim + sub1 ]; double det_A11 = a11 * a22 - a12 * a12; A11_inv[ 0 ] = a22 / det_A11; A11_inv[ 1 ] = - a12 / det_A11; A11_inv[ 2 ] = A11_inv[ 1 ]; A11_inv[ 3 ] = a11 / det_A11; int size_sub0 = sizeof( double ) * sub0; int size_sub1_sub0 = sizeof( double ) * ( sub1 - sub0_plus ); int size_pdim_sub0 = sizeof( double ) * ( pdim - sub1_plus ); memcpy( A21 , A + sub0xp , size_sub0 ); memcpy( A21 + sub0 , A + sub0xp + sub0_plus, size_sub1_sub0 ); memcpy( A21 + sub1 - 1, A + sub0xp + sub1_plus, size_pdim_sub0 ); memcpy( A21 + p2 , A + sub1xp , size_sub0 ); memcpy( A21 + p2 + sub0 , A + sub1xp + sub0_plus, size_sub1_sub0 ); memcpy( A21 + p2 + sub1 - 1, A + sub1xp + sub1_plus, size_pdim_sub0 ); for( i = 0; i < sub0; i++ ) { ixp = i * pdim; ixp2 = i * p2; memcpy( A22 + ixp2 , A + ixp , size_sub0 ); memcpy( A22 + ixp2 + sub0 , A + ixp + sub0_plus, size_sub1_sub0 ); memcpy( A22 + ixp2 + sub1 - 1, A + ixp + sub1_plus, size_pdim_sub0 ); } for( i = sub0_plus; i < sub1; i++ ) { ixp = i * pdim; ixp2 = ( i - 1 ) * p2; memcpy( A22 + ixp2 , A + ixp , size_sub0 ); memcpy( A22 + ixp2 + sub0 , A + ixp + sub0_plus, size_sub1_sub0 ); memcpy( A22 + ixp2 + sub1 - 1, A + ixp + sub1_plus, size_pdim_sub0 ); } for( i = sub1_plus; i < pdim; i++ ) { ixp = i * pdim; ixp2 = ( i - 2 ) * p2; memcpy( A22 + ixp2 , A + ixp , size_sub0 ); memcpy( A22 + ixp2 + sub0 , A + ixp + sub0_plus, size_sub1_sub0 ); memcpy( A22 + ixp2 + sub1 - 1, A + ixp + sub1_plus, size_pdim_sub0 ); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // inverse function for symmetric positive-definite matrices (p x p) // WARNING: Matrix you pass is overwritten with the result // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void inverse( double A[], double A_inv[], int *p ) { int info, dim = *p; char uplo = 'U'; // creating an identity matrix #pragma omp parallel for for( int i = 0; i < dim; i++ ) for( int j = 0; j < dim; j++ ) A_inv[ j * dim + i ] = ( i == j ); // LAPACK function: computes solution to A * X = B, where A is symmetric positive definite matrix F77_NAME(dposv)( &uplo, &dim, &dim, A, &dim, A_inv, &dim, &info FCONE ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // inverse function for symmetric (2 x 2) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void inverse_2x2( double B[], double B_inv[] ) { double detB = B[ 0 ] * B[ 3 ] - B[ 1 ] * B[ 1 ]; B_inv[ 0 ] = B[ 3 ] / detB; B_inv[ 1 ] = - B[ 1 ] / detB; B_inv[ 2 ] = B_inv[ 1 ]; B_inv[ 3 ] = B[ 0 ] / detB; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Cholesky decomposition of symmetric positive-definite matrix // A = U' %*% U // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void cholesky( double A[], double U[], int *p ) { char uplo = 'U'; int info, dim = *p; memcpy( U, A, sizeof( double ) * dim * dim ); F77_NAME(dpotrf)( &uplo, &dim, U, &dim, &info FCONE ); #pragma omp parallel for for( int i = 0; i < dim; i++ ) for( int j = 0; j < i; j++ ) U[ j * dim + i ] = 0.0; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Determinant of a symmetric possitive-definite matrix ( A ) // > > > > > > > > > WARNING: Matrix you pass is overwritten < < < < < < < < < // For any symmetric PD Matrix A, we have: |A| = |T| ^ 2, where T is cholesky decomposition of A. // Thus, |T| = \prod_{i = 1}^p T_{ii}. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void determinant( double A[], double *det_A, int *p ) { char uplo = 'U'; int info, dim = *p, dim1 = dim + 1; F77_NAME(dpotrf)( &uplo, &dim, &A[0], &dim, &info FCONE ); double result = 1; for( int i = 0; i < dim; i++ ) result *= A[ i * dim1 ]; *det_A = result * result; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // To select an edge for BDMCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void select_edge( double rates[], int *index_selected_edge, double *sum_rates, int *qp ) { int qp_star = *qp; // rates = sum_sort_rates vectorcumulative_rates( qp_star, 0.0 ); cumulative_rates[ 0 ] = rates[ 0 ]; for( int i = 1; i < qp_star; i++ ) cumulative_rates[ i ] = cumulative_rates[ i - 1 ] + rates[ i ]; *sum_rates = cumulative_rates[ qp_star - 1 ]; // GetRNGstate(); double random_value = *sum_rates * unif_rand(); // Rf_runif( 0.0, *sum_rates ); // PutRNGstate(); //int counter = 0; //while( random_value > cumulative_rates[ counter ] ) ++counter; //*index_selected_edge = counter; // To start, find the subscript of the middle position. int lower_bound = 0; int upper_bound = qp_star - 1; int position = upper_bound / 2; // ( lower_bound + upper_bound ) / 2; while( upper_bound - lower_bound > 1 ) { //if ( rates[position] > random_value ) { upper_bound = position; } else { lower_bound = position; } ( cumulative_rates[ position ] > random_value ) ? upper_bound = position : lower_bound = position; position = ( lower_bound + upper_bound ) / 2; } *index_selected_edge = ( cumulative_rates[ position ] < random_value ) ? ++position : position; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // select_edge for bd_for_ts // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void select_edge_ts( long double rates[], int *index_selected_edge, long double *sum_rates, int *qp ) { int qp_star = *qp; // rates = sum_sort_rates vectorcumulative_rates( qp_star, 0.0 ); cumulative_rates[ 0 ] = rates[ 0 ]; for( int i = 1; i < qp_star; i++ ) cumulative_rates[ i ] = cumulative_rates[ i - 1 ] + rates[ i ]; *sum_rates = cumulative_rates[ qp_star - 1 ]; // GetRNGstate(); long double random_value = *sum_rates * unif_rand(); // Rf_runif( 0.0, *sum_rates ); // PutRNGstate(); //int counter = 0; //while( random_value > cumulative_rates[ counter ] ) ++counter; //*index_selected_edge = counter; // To start, find the subscript of the middle position. int lower_bound = 0; int upper_bound = qp_star - 1; int position = upper_bound / 2; // ( lower_bound + upper_bound ) / 2; while( upper_bound - lower_bound > 1 ) { //if ( rates[position] > random_value ) { upper_bound = position; } else { lower_bound = position; } ( cumulative_rates[ position ] > random_value ) ? upper_bound = position : lower_bound = position; position = ( lower_bound + upper_bound ) / 2; } *index_selected_edge = ( cumulative_rates[ position ] < random_value ) ? ++position : position; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // To simultaneously select multiple edges for BDMCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void select_multi_edges( double rates[], int index_selected_edges[], int *size_index, double *sum_rates, int *multi_update, int *qp ) { int i, qp_star = *qp, qp_star_1 = qp_star - 1; // rates = sum_sort_rates vectorcumulative_rates( qp_star, 0.0 ); cumulative_rates[ 0 ] = rates[ 0 ]; for ( int i = 1; i < qp_star; i++ ) cumulative_rates[ i ] = cumulative_rates[ i - 1 ] + rates[ i ]; double max_bound = cumulative_rates[ qp_star_1 ]; // - - - - - - for first edge - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // To start, find the subscript of the middle position. int lower_bound = 0; int upper_bound = qp_star_1; int position = upper_bound / 2; // ( lower_bound + upper_bound ) / 2; //GetRNGstate(); double random_value = max_bound * unif_rand(); //PutRNGstate(); while( upper_bound - lower_bound > 1 ) { //if ( rates[position] > random_value ) { upper_bound = position; } else { lower_bound = position; } ( cumulative_rates[ position ] > random_value ) ? upper_bound = position : lower_bound = position; position = ( lower_bound + upper_bound ) / 2; } if ( cumulative_rates[position] < random_value ) ++position; index_selected_edges[0] = position; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | int counter = 1, same; //GetRNGstate(); for( int it = 0; it < 200 * *multi_update; it++ ) { if( counter == *multi_update ) break; random_value = max_bound * unif_rand(); // To start, find the subscript of the middle position. lower_bound = 0; upper_bound = qp_star_1; position = upper_bound / 2; // ( lower_bound + upper_bound ) / 2; while( upper_bound - lower_bound > 1 ) { // if ( rates[position] > random_value ) { upper_bound = position; } else { lower_bound = position; } ( cumulative_rates[ position ] > random_value ) ? upper_bound = position : lower_bound = position; position = ( lower_bound + upper_bound ) / 2; } if( cumulative_rates[position] < random_value ) ++position; same = 0; for( i = 0; i < counter; i++ ) if( index_selected_edges[ i ] == position ) ++same; if( same == 0 ) index_selected_edges[ counter++ ] = position; } //PutRNGstate(); *size_index = counter; *sum_rates = max_bound; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Parallel Computation for birth-death rates for BD-MCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_bdmcmc_parallel( double rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double Ds[], double Dsijj[], double sigma[], double K[], int *b, int *p ) { int b1 = *b, one = 1, two = 2, dim = *p, p1 = dim - 1, p2 = dim - 2, dim1 = dim + 1, p2x2 = ( dim - 2 ) * 2; double alpha = 1.0, beta = 0.0, alpha1 = -1.0, beta1 = 1.0; char transT = 'T', transN = 'N', sideL = 'L'; #pragma omp parallel { int i, j, k, ij, jj, nu_star; double Dsjj, sum_diag, K022, a11, sigmajj_inv, log_rate; double *K121 = new double[ 4 ]; double *Kj12 = new double[ p1 ]; double *sigmaj12 = new double[ p1 ]; double *sigmaj22 = new double[ p1 * p1 ]; double *Kj12xK22_inv = new double[ p1 ]; double *K21 = new double[ p2x2 ]; double *sigma21 = new double[ p2x2 ]; double *sigma22 = new double[ p2 * p2 ]; double *sigma11_inv = new double[ 4 ]; double *sigma21xsigma11_inv = new double[ p2x2 ]; double *K12xK22_inv = new double[ p2x2 ]; #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; ij = j * dim + i; jj = j * dim1; Dsjj = Ds[ jj ]; sub_matrices1( &sigma[0], &sigmaj12[0], &sigmaj22[0], &j, &dim ); // sigma[-j,-j] - ( sigma[-j, j] %*% sigma[j, -j] ) / sigma[j,j] // Kj22_inv <- sigmaj22 = sigmaj22 - sigmaj12 * sigmaj12 / sigmaj11 sigmajj_inv = - 1.0 / sigma[ jj ]; F77_NAME(dsyr)( &sideL, &p1, &sigmajj_inv, &sigmaj12[0], &one, &sigmaj22[0], &p1 FCONE ); // For (i,j) = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_row_mins( &K[0], &Kj12[0], &j, &dim ); // Kj12 = K[j, -j] Kj12[ i ] = 0.0; // Kj12[1,i] = 0 // Kj12xK22_inv = Kj12 %*% Kj22_inv here sigmaj22 instead of Kj22_inv F77_NAME(dsymv)( &sideL, &p1, &alpha, &sigmaj22[0], &p1, &Kj12[0], &one, &beta, &Kj12xK22_inv[0], &one FCONE ); // K022 = Kj12xK22_inv %*% t(Kj12) K022 = F77_NAME(ddot)( &p1, &Kj12xK22_inv[0], &one, &Kj12[0], &one ); // For (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_cols_mins( &K[0], &K21[0], &i, &j, &dim ); // K21 = K[-e, e] sub_matrices_inv( &sigma[0], &sigma11_inv[0], &sigma21[0], &sigma22[0], &i, &j, &dim ); // sigma21xsigma11_inv = sigma21 %*% sigma11_inv F77_NAME(dgemm)( &transN, &transN, &p2, &two, &two, &alpha, &sigma21[0], &p2, &sigma11_inv[0], &two, &beta, &sigma21xsigma11_inv[0], &p2 FCONE FCONE ); // sigma22 = sigma22 - sigma21xsigma11_inv %*% t( sigma21 ) F77_NAME(dgemm)( &transN, &transT, &p2, &p2, &two, &alpha1, &sigma21xsigma11_inv[0], &p2, &sigma21[0], &p2, &beta1, &sigma22[0], &p2 FCONE FCONE ); // K12xK22_inv = t( K21 ) %*% K22_inv here sigam12 = K22_inv F77_NAME(dgemm)( &transT, &transN, &two, &p2, &p2, &alpha, &K21[0], &p2, &sigma22[0], &p2, &beta, &K12xK22_inv[0], &two FCONE FCONE ); // K121 = K12xK22_inv %*% K21 F77_NAME(dgemm)( &transN, &transN, &two, &two, &p2, &alpha, &K12xK22_inv[0], &two, &K21[0], &p2, &beta, &K121[0], &two FCONE FCONE ); // Finished (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| a11 = K[ i * dim1 ] - K121[ 0 ]; sum_diag = Dsjj * ( K022 - K121[ 3 ] ) - Ds[ ij ] * ( K121[ 1 ] + K121[ 2 ] ); // nu_star = b + sum( Gf[,i] * Gf[,j] ) nu_star = b1; //for( k = 0; k < dim; k++ ) nu_star += G[i * dim + k]; for( k = 0; k < dim; k++ ) nu_star += G[ i * dim + k ] * G[ j * dim + k ]; //nu_star = F77_NAME(ddot)( &dim, &G[0] + ixdim, &one, &G[0] + jxdim, &one ); nu_star = 0.5 * nu_star; log_rate = ( G[ ij ] ) ? 0.5 * log( 2.0 * Dsjj / a11 ) + lgammafn( nu_star + 0.5 ) - lgammafn( nu_star ) - 0.5 * ( Dsijj[ ij ] * a11 + sum_diag ) : 0.5 * log( 0.5 * a11 / Dsjj ) - lgammafn( nu_star + 0.5 ) + lgammafn( nu_star ) + 0.5 * ( Dsijj[ ij ] * a11 + sum_diag ); //log_rate = ( G[ij] ) ? log_rate - log( static_cast( g_prior[ij] / ( 1 - g_prior[ij] ) ) ) : log_rate + log( static_cast( g_prior[ij] / ( 1 - g_prior[ij] ) ) ); log_rate = ( G[ ij ] ) ? log_rate - log_ratio_g_prior[ ij ] : log_rate + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } delete[] K121; delete[] Kj12; delete[] sigmaj12; delete[] sigmaj22; delete[] Kj12xK22_inv; delete[] K21; delete[] sigma21; delete[] sigma22; delete[] sigma11_inv; delete[] sigma21xsigma11_inv; delete[] K12xK22_inv; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Parallel Computation for birth-death rates for complex BD-MCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_cbdmcmc_parallel( long double log_rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double r_Ds[], double i_Ds[], double r_sigma[], double i_sigma[], double r_K[], double i_K[], int *b, int *p ) { int b1 = *b, one = 1, two = 2, dim = *p, p1 = dim - 1, p2 = dim - 2, dim1 = dim + 1, p2x2 = p2 * 2, p2xp2 = p2 * p2; double alpha = 1.0, beta = 0.0, dmone = -1.0; char transT = 'T', transN = 'N'; #pragma omp parallel { int i, j, k, ij, jj, rowCol, nu_star; double r_Dsjj, r_Dsij, i_Dsij, sum_diag, r_K022, i_K022, a11, r_sigmaj11, i_sigmaj11; double coef, epower, I_const, log_rate; double *r_K121 = new double[ 4 ]; double *i_K121 = new double[ 4 ]; double *r_Kj12 = new double[ p1 ]; //K[j,-j] double *i_Kj12 = new double[ p1 ]; double *r_sigmaj12 = new double[ p1 ]; //sigma[j,-j] double *i_sigmaj12 = new double[ p1 ]; double *r_sigmaj22 = new double[ p1 * p1 ]; //sigma[-j,-j] double *i_sigmaj22 = new double[ p1 * p1 ]; double *r_Kj22_inv = new double[ p1 * p1 ]; double *i_Kj22_inv = new double[ p1 * p1 ]; double *i12xi22_j = new double[ p1 ]; double *r12xi22_j = new double[ p1 ]; double *i12xi22 = new double[ p2x2 ]; double *r12xi22 = new double[ p2x2 ]; double *r21xr11 = new double[ p2x2 ]; double *i21xr11 = new double[ p2x2 ]; double *r_K12 = new double[ p2x2 ]; //K[e,-e] double *i_K12 = new double[ p2x2 ]; double *r_sigma11 = new double[ 4 ]; //sigma[e,e] double *i_sigma11 = new double[ 4 ]; double *r_sigma12 = new double[ p2x2 ]; //sigma[e,-e] double *i_sigma12 = new double[ p2x2 ]; double *r_sigma22 = new double[ p2xp2 ]; //sigma[-e,-e] double *i_sigma22 = new double[ p2xp2 ]; double *r_sigma11_inv = new double[ 4 ]; double *i_sigma11_inv = new double[ 4 ]; double *r_sigma2112 = new double[ p2xp2 ]; double *i_sigma2112 = new double[ p2xp2 ]; double *r_K22_inv = new double[ p2xp2 ]; double *i_K22_inv = new double[ p2xp2 ]; double *r_K12xK22_inv = new double[ p2x2 ]; double *i_K12xK22_inv = new double[ p2x2 ]; #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; jj = j * dim1; r_Dsjj = r_Ds[jj]; r_sigmaj11 = r_sigma[ jj ]; // sigma[j, j] i_sigmaj11 = i_sigma[ jj ]; sub_matrices1( &r_sigma[0], &r_sigmaj12[0], &r_sigmaj22[0], &j, &dim ); // sigmaj22 = sigma[-j,-j] Hsub_matrices1( &i_sigma[0], &i_sigmaj12[0], &i_sigmaj22[0], &j, &dim ); // Kj22_inv <- sigmaj22 = sigmaj22 - sigmaj21 * sigmaj12 / sigmaj11 for( int row = 0; row < p1; row++ ) for( int col = 0; col < p1; col++ ) { rowCol = col * p1 + row; r_Kj22_inv[ rowCol ] = r_sigmaj22[rowCol] - (r_sigmaj11*(r_sigmaj12[row]*r_sigmaj12[col] + i_sigmaj12[row]*i_sigmaj12[col]) + i_sigmaj11*(r_sigmaj12[row]*i_sigmaj12[col] - i_sigmaj12[row]*r_sigmaj12[col]))/(r_sigmaj11*r_sigmaj11 + i_sigmaj11*i_sigmaj11); i_Kj22_inv[ rowCol ] = i_sigmaj22[rowCol] - (r_sigmaj11*(r_sigmaj12[row]*i_sigmaj12[col] - i_sigmaj12[row]*r_sigmaj12[col]) - i_sigmaj11*(r_sigmaj12[row]*r_sigmaj12[col] + i_sigmaj12[row]*i_sigmaj12[col]))/(r_sigmaj11*r_sigmaj11 + i_sigmaj11*i_sigmaj11); } ij = j * dim + i; r_Dsij = r_Ds[ ij ]; i_Dsij = i_Ds[ ij ]; // For (i,j) = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_row_mins( &r_K[0], &r_Kj12[0], &j, &dim ); // Kj12 = K[j, -j] Hsub_row_mins( &i_K[0], &i_Kj12[0], &j, &dim ); r_Kj12[ i ] = 0.0; // Kj12[1,i] = 0 i_Kj12[ i ] = 0.0; // Kj12xK22_inv = Kj12 %*% Kj22_inv F77_NAME(dgemm)( &transN, &transN, &one, &p1, &p1, &alpha, &i_Kj12[0], &one, &i_Kj22_inv[0], &p1, &beta, &i12xi22_j[0], &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &p1, &p1, &alpha, &r_Kj12[0], &one, &r_Kj22_inv[0], &p1, &dmone, &i12xi22_j[0], &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &p1, &p1, &alpha, &r_Kj12[0], &one, &i_Kj22_inv[0], &p1, &beta, &r12xi22_j[0], &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &p1, &p1, &alpha, &i_Kj12[0], &one, &r_Kj22_inv[0], &p1, &alpha, &r12xi22_j[0], &one FCONE FCONE ); // K022 <- Kj12 %*% solve( K0[-j, -j] ) %*% t(Kj12) = c F77_NAME(dgemm)( &transN, &transN, &one, &one, &p1, &alpha, &r12xi22_j[0], &one, &i_Kj12[0], &p1, &beta, &r_K022, &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &one, &p1, &alpha, &i12xi22_j[0], &one, &r_Kj12[0], &p1, &alpha, &r_K022, &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &one, &p1, &alpha, &i12xi22_j[0], &one, &i_Kj12[0], &p1, &beta, &i_K022, &one FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &one, &one, &p1, &alpha, &r12xi22_j[0], &one, &r_Kj12[0], &p1, &dmone, &i_K022, &one FCONE FCONE ); // For (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_rows_mins( &r_K[0], &r_K12[0], &i, &j, &dim ); // K12 = K[e, -e] Hsub_rows_mins( &i_K[0], &i_K12[0], &i, &j, &dim ); // K12 = K[e, -e] sub_matrices( &r_sigma[0], &r_sigma11[0], &r_sigma12[0], &r_sigma22[0], &i, &j, &dim ); //r_sigma[e,e], r_sigma[e,-e], r_sigma[-e,-e] Hsub_matrices( &i_sigma[0], &i_sigma11[0], &i_sigma12[0], &i_sigma22[0], &i, &j, &dim ); //i_sigma[e,e], i_sigma[e,-e], i_sigma[-e,-e] // solve( sigma[e, e] ) cinverse_2x2( &r_sigma11[0], &i_sigma11[0], &r_sigma11_inv[0], &i_sigma11_inv[0] ); // sigma21 %*% sigma11_inv = t(sigma12) %*% sigma11_inv F77_NAME(dgemm)( &transT, &transN, &p2, &two, &two, &alpha, &r_sigma12[0], &two, &r_sigma11_inv[0], &two, &beta, &r21xr11[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transT, &transN, &p2, &two, &two, &alpha, &i_sigma12[0], &two, &i_sigma11_inv[0], &two, &alpha, &r21xr11[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transT, &transN, &p2, &two, &two, &alpha, &i_sigma12[0], &two, &r_sigma11_inv[0], &two, &beta, &i21xr11[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transT, &transN, &p2, &two, &two, &alpha, &r_sigma12[0], &two, &i_sigma11_inv[0], &two, &dmone, &i21xr11[0], &p2 FCONE FCONE ); // sigma2112 = sigma21xsigma11_inv %*% sigma12 = sigma[-e,e] %*% solve(sigma[e,e]) %*% sigma[e,-e] F77_NAME(dgemm)( &transN, &transN, &p2, &p2, &two, &alpha, &i21xr11[0], &p2, &i_sigma12[0], &two, &beta, &r_sigma2112[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &p2, &p2, &two, &alpha, &r21xr11[0], &p2, &r_sigma12[0], &two, &dmone, &r_sigma2112[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &p2, &p2, &two, &alpha, &r21xr11[0], &p2, &i_sigma12[0], &two, &beta, &i_sigma2112[0], &p2 FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &p2, &p2, &two, &alpha, &i21xr11[0], &p2, &r_sigma12[0], &two, &alpha, &i_sigma2112[0], &p2 FCONE FCONE ); // solve( K[-e, -e] ) = sigma22 - sigma2112 for( k = 0; k < p2xp2 ; k++ ) { r_K22_inv[ k ] = r_sigma22[ k ] - r_sigma2112[ k ]; i_K22_inv[ k ] = i_sigma22[ k ] - i_sigma2112[ k ]; } // K12 %*% K22_inv F77_NAME(dgemm)( &transN, &transN, &two, &p2, &p2, &alpha, &i_K12[0], &two, &i_K22_inv[0], &p2, &beta, &i12xi22[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &two, &p2, &p2, &alpha, &r_K12[0], &two, &r_K22_inv[0], &p2, &dmone, &i12xi22[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &two, &p2, &p2, &alpha, &r_K12[0], &two, &i_K22_inv[0], &p2, &beta, &r12xi22[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transN, &two, &p2, &p2, &alpha, &i_K12[0], &two, &r_K22_inv[0], &p2, &alpha, &r12xi22[0], &two FCONE FCONE ); // K121 <- K[e, -e] %*% solve( K[-e, -e] ) %*% t(K[e, -e]) F77_NAME(dgemm)( &transN, &transT, &two, &two, &p2, &alpha, &r12xi22[0], &two, &i_K12[0], &two, &beta, &r_K121[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transT, &two, &two, &p2, &alpha, &i12xi22[0], &two, &r_K12[0], &two, &alpha, &r_K121[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transT, &two, &two, &p2, &alpha, &i12xi22[0], &two, &i_K12[0], &two, &beta, &i_K121[0], &two FCONE FCONE ); F77_NAME(dgemm)( &transN, &transT, &two, &two, &p2, &alpha, &r12xi22[0], &two, &r_K12[0], &two, &dmone, &i_K121[0], &two FCONE FCONE ); // Finished (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| nu_star = b1; for( k = 0; k < dim; k++ ) // nu_star = b + sum( Gf[,i] * Gf[,j] ) nu_star += G[ i * dim + k ] * G[ j * dim + k ]; I_const = lgammafn( 0.5 * ( nu_star + 1 ) ) - lgammafn( 0.5 * nu_star ); //I a11 = r_K[i * dim1] - r_K121[0]; //k_ii - k_ii^1 sum_diag = r_Dsjj*(r_K022 - r_K121[3]) - (r_Dsij*r_K121[1] - i_Dsij*i_K121[1]) - (r_Dsij*r_K121[2] + i_Dsij*i_K121[2]); //tr(D*(K0-K1)) coef = ( r_Dsij * r_Dsij + i_Dsij * i_Dsij ) / r_Dsjj; epower = coef * a11 + sum_diag; log_rate = ( G[ij] ) ? I_const + log( r_Dsjj ) - log( a11 ) - epower : log( a11 ) - log( r_Dsjj ) + epower - I_const; //log_rates[counter] += log_rate; // Computer the rate in log space log_rates[counter] += log_rate; } delete[] r_K121; delete[] i_K121; delete[] r_Kj12; delete[] i_Kj12; delete[] r_sigmaj12; delete[] i_sigmaj12; delete[] r_sigmaj22; delete[] i_sigmaj22; delete[] r_Kj22_inv; delete[] i_Kj22_inv; delete[] i12xi22_j; delete[] r12xi22_j; delete[] i12xi22; delete[] r12xi22; delete[] r21xr11; delete[] i21xr11; delete[] r_K12; delete[] i_K12; delete[] r_sigma11; delete[] i_sigma11; delete[] r_sigma12; delete[] i_sigma12; delete[] r_sigma22; delete[] i_sigma22; delete[] r_sigma11_inv; delete[] i_sigma11_inv; delete[] r_sigma2112; delete[] i_sigma2112; delete[] r_K22_inv; delete[] i_K22_inv; delete[] r_K12xK22_inv; delete[] i_K12xK22_inv; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // computing birth/death rate or alpha for element (i,j) // it is for double Metropolis-Hasting algorihtms // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_H_ij( double K[], double sigma[], double *log_Hij, int *selected_edge_i, int *selected_edge_j, double Kj12[], double Kj12xK22_inv[], double K12[], double K12xK22_inv[], double K121[], double sigmaj12[], double sigmaj22[], double sigma12[], double sigma22[], double sigma11_inv[], double sigma21xsigma11_inv[], int *dim, int *p1, int *p2, int *jj, double *Dsijj, double *Dsij, double *Dsjj ) { int one = 1, two = 2; double alpha = 1.0, beta = 0.0, alpha1 = -1.0, beta1 = 1.0; char transT = 'T', transN = 'N', sideL = 'L'; //double sigmaj11 = sigma[*jj]; // sigma[j, j] sub_matrices1( sigma, sigmaj12, sigmaj22, selected_edge_j, dim ); // sigma[-j,-j] - ( sigma[-j, j] %*% sigma[j, -j] ) / sigma[j,j] // Kj22_inv <- sigmaj22 = sigmaj22 - sigmaj12 * sigmaj12 / sigmaj11 double sigmajj_inv = - 1.0 / sigma[ *selected_edge_j * ( *dim + 1 ) ]; F77_NAME(dsyr)( &sideL, p1, &sigmajj_inv, sigmaj12, &one, sigmaj22, p1 FCONE ); // For (i,j) = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_row_mins( K, Kj12, selected_edge_j, dim ); // K12 = K[j, -j] Kj12[ *selected_edge_i ] = 0.0; // K12[1,i] = 0 // Kj12xK22_inv = Kj12 %*% Kj22_inv here sigmaj22 instead of Kj22_inv F77_NAME(dsymv)( &sideL, p1, &alpha, &sigmaj22[0], p1, Kj12, &one, &beta, Kj12xK22_inv, &one FCONE ); // K022 = Kj12xK22_inv %*% t(Kj12) double K022 = F77_NAME(ddot)( p1, Kj12xK22_inv, &one, Kj12, &one ); // For (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_cols_mins( K, K12, selected_edge_i, selected_edge_j, dim ); // K21 = K[-e, e] sub_matrices_inv( sigma, sigma11_inv, sigma12, sigma22, selected_edge_i, selected_edge_j, dim ); // sigma21xsigma11_inv = sigma21 %*% sigma11_inv F77_NAME(dgemm)( &transN, &transN, p2, &two, &two, &alpha, sigma12, p2, sigma11_inv, &two, &beta, sigma21xsigma11_inv, p2 FCONE FCONE ); // sigma22 = sigma22 - sigma21xsigma11_inv %*% t( sigma21 ) F77_NAME(dgemm)( &transN, &transT, p2, p2, &two, &alpha1, sigma21xsigma11_inv, p2, sigma12, p2, &beta1, sigma22, p2 FCONE FCONE ); // K12xK22_inv = t( K21 ) %*% K22_inv here sigam12 = K22_inv F77_NAME(dgemm)( &transT, &transN, &two, p2, p2, &alpha, K12, p2, sigma22, p2, &beta, K12xK22_inv, &two FCONE FCONE ); // K121 = K12xK22_inv %*% K21 F77_NAME(dgemm)( &transN, &transN, &two, &two, p2, &alpha, K12xK22_inv, &two, K12, p2, &beta, K121, &two FCONE FCONE ); // Finished (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| double a11 = K[*selected_edge_i * *dim + *selected_edge_i] - K121[0]; double sum_diag = *Dsjj * ( K022 - K121[3] ) - *Dsij * ( K121[1] + K121[2] ); // Dsijj = Dsii - Dsij * Dsij / Dsjj; //*log_Hij = ( log( static_cast(*Dsjj) ) - log( static_cast(a11) ) + *Dsijj * a11 - sum_diag ) / 2; *log_Hij = 0.5 * ( log( *Dsjj / a11 ) + *Dsijj * a11 - sum_diag ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Parallel Computation for birth-death rates for double BD-MCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_bdmcmc_dmh_parallel( double rates[], double log_ratio_g_prior[], int G[], int index_row[], int index_col[], int *sub_qp, double Ds[], double D[], double sigma[], double K[], double sigma_dmh[], double K_dmh[], int *b, int *p ) { int dim = *p, p1 = dim - 1, p2 = dim - 2, p2x2 = ( dim - 2 ) * 2; #pragma omp parallel { int index_rate_j, i, j, ij, jj; double Dsjj, Dsij, Dsijj, Dij, Dijj, Djj, log_rate; double *K121 = new double[ 4 ]; double *Kj12 = new double[ p1 ]; double *sigmaj12 = new double[ p1 ]; double *sigmaj22 = new double[ p1 * p1 ]; double *Kj12xK22_inv = new double[ p1 ]; double *K21 = new double[ p2x2 ]; double *sigma12 = new double[ p2x2 ]; double *sigma22 = new double[ p2 * p2 ]; double *sigma11_inv = new double[ 4 ]; double *sigma21xsigma11_inv = new double[ p2x2 ]; double *K12xK22_inv = new double[ p2x2 ]; double *K12 = new double[ p2x2 ]; #pragma omp for for( j = 1; j < dim; j++ ) { index_rate_j = ( j * ( j - 1 ) ) / 2; jj = j * dim + j; Dsjj = Ds[ jj ]; Djj = D[ jj ]; for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj = - Dsij * Dsij / Dsjj; Dij = D[ ij ]; Dijj = - Dij * Dij / Djj; double logH_ij, logI_p; log_H_ij( &K[0], &sigma[0], &logH_ij, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dsijj, &Dsij, &Dsjj ); log_H_ij( &K_dmh[0], &sigma_dmh[0], &logI_p, &i, &j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dijj, &Dij, &Djj ); //log_rate = ( G[ ij ] ) ? ( logH_ij - logI_p ) : ( logI_p - logH_ij ); log_rate = ( G[ ij ] ) ? ( logH_ij - logI_p ) - log_ratio_g_prior[ ij ] : ( logI_p - logH_ij ) + log_ratio_g_prior[ ij ]; rates[ index_rate_j + i ] = ( log_rate < 0.0 ) ? exp( log_rate ) : 1.0; } } delete[] K121; delete[] Kj12; delete[] sigmaj12; delete[] sigmaj22; delete[] Kj12xK22_inv; delete[] K21; delete[] sigma12; delete[] sigma22; delete[] sigma11_inv; delete[] sigma21xsigma11_inv; delete[] K12xK22_inv; delete[] K12; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // NEW for Lang codes for Hermitian matrix // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void Hsub_row_mins( double A[], double sub_A[], int *sub, int *p ) { int i, l = 0, subj = *sub, pdim = *p, subxp = subj * pdim; for( i = 0; i < subj; i++ ) sub_A[ l++ ] = -A[ subxp + i ]; for( i = subj + 1; i < pdim; i++ ) sub_A[ l++ ] = -A[ subxp + i ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // For Hermitian matrix // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void Hsub_rows_mins( double A[], double sub_A[], int *row, int *col, int *p ) { int i, l = 0, pdim = *p, sub0 = *row, sub1 = *col, sub0p = sub0 * pdim, sub1p = sub1 * pdim; for( i = 0; i < sub0; i++ ) { sub_A[ l++ ] = -A[ sub0p + i ]; sub_A[ l++ ] = -A[ sub1p + i ]; } for( i = sub0 + 1; i < sub1; i++ ) { sub_A[ l++ ] = -A[ sub0p + i ]; sub_A[ l++ ] = -A[ sub1p + i ]; } for( i = sub1 + 1; i < pdim; i++ ) { sub_A[ l++ ] = -A[ sub0p + i ]; sub_A[ l++ ] = -A[ sub1p + i ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // sub_matrices1 for Hermitian matrix // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void Hsub_matrices1( double A[], double A12[], double A22[], int *sub, int *p ) { int i, ixpdim, pdim = *p, p1 = pdim - 1, psub = *sub, subxp = psub * pdim, mpsub = pdim - psub - 1; for( i = 0; i < psub; i++ ) A12[ i ] = -A[ subxp + i ]; for( i = psub; i < pdim - 1; i++ ) A12[ i ] = -A[ subxp + i + 1 ]; for( i = 0; i < psub; i++ ) { ixpdim = i * pdim; memcpy( A22 + i * p1 , A + ixpdim , sizeof( double ) * psub ); memcpy( A22 + i * p1 + psub, A + ixpdim + psub + 1, sizeof( double ) * mpsub ); } for( i = psub + 1; i < pdim; i++ ) { ixpdim = i * pdim; memcpy( A22 + ( i - 1 ) * p1 , A + ixpdim , sizeof( double ) * psub); memcpy( A22 + ( i - 1 ) * p1 + psub, A + ixpdim + psub + 1, sizeof( double ) * mpsub ); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // sub_matrices for Hermitian matrix // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void Hsub_matrices( double A[], double A11[], double A12[], double A22[], int *row, int *col, int *p ) { int i, i1, i2, ixp, pdim = *p, p2 = pdim - 2, sub0 = *row, sub1 = *col; A11[ 0 ] = A[ sub0 * pdim + sub0 ]; A11[ 1 ] = A[ sub0 * pdim + sub1 ]; A11[ 2 ] = -A11[ 1 ]; // for symmetric matrices A11[ 3 ] = A[ sub1 * pdim + sub1 ]; for( i = 0; i < sub0; i++ ) { ixp = i * pdim; A12[ i + i ] = A[ ixp + sub0 ]; A12[ i + i + 1 ] = A[ ixp + sub1 ]; memcpy( A22 + i * p2, A + ixp, sizeof( double ) * sub0 ); memcpy( A22 + i * p2 + sub0, A + ixp + sub0 + 1, sizeof( double ) * ( sub1 - sub0 - 1 ) ); memcpy( A22 + i * p2 + sub1 - 1, A + ixp + sub1 + 1, sizeof( double ) * ( pdim - sub1 - 1 ) ); } for( i = sub0 + 1; i < sub1; i++ ) { ixp = i * pdim; i1 = i - 1; A12[ i + i - 2 ] = A[ ixp + sub0 ]; A12[ i + i - 1 ] = A[ ixp + sub1 ]; memcpy( A22 + i1 * p2, A + ixp, sizeof( double ) * sub0 ); memcpy( A22 + i1 * p2 + sub0, A + ixp + sub0 + 1, sizeof( double ) * ( sub1 - sub0 - 1 ) ); memcpy( A22 + i1 * p2 + sub1 - 1, A + ixp + sub1 + 1, sizeof( double ) * ( pdim - sub1 - 1 ) ); } for( i = sub1 + 1; i < pdim; i++ ) { ixp = i * pdim; i2 = i - 2; A12[ i + i - 4 ] = A[ ixp + sub0 ]; A12[ i + i - 3 ] = A[ ixp + sub1 ]; memcpy( A22 + i2 * p2, A + ixp, sizeof( double ) * sub0 ); memcpy( A22 + i2 * p2 + sub0, A + ixp + sub0 + 1, sizeof( double ) * ( sub1 - sub0 - 1 ) ); memcpy( A22 + i2 * p2 + sub1 - 1, A + ixp + sub1 + 1, sizeof( double ) * ( pdim - sub1 - 1 ) ); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // inverse function for Hermitian (2 x 2) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void cinverse_2x2( double r_B[], double i_B[], double r_B_inv[], double i_B_inv[] ) { double r_det = r_B[0] * r_B[3] - i_B[0] * i_B[3] - ( r_B[1] * r_B[1] + i_B[1] * i_B[1] ); double i_det = r_B[0] * i_B[3] + i_B[0] * r_B[3]; double mod = r_det * r_det + i_det * i_det; r_B_inv[0] = ( r_B[3] * r_det + i_B[3] * i_det ) / mod; i_B_inv[0] = ( r_det * i_B[3] - r_B[3] * i_det ) / mod; r_B_inv[1] = -( r_B[1] * r_det + i_B[1] * i_det ) / mod; i_B_inv[1] = -( r_det * i_B[1] - r_B[1] * i_det ) / mod; r_B_inv[2] = -( r_B[1] * r_det - i_B[1] * i_det ) / mod; i_B_inv[2] = ( r_det * i_B[1] + r_B[1] * i_det ) / mod; r_B_inv[3] = ( r_B[0] * r_det + i_B[0] * i_det ) / mod; i_B_inv[3] = ( r_det * i_B[0] - r_B[0] * i_det ) / mod; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // For generating scale-free graphs: matrix G (p x p) is an adjacency matrix // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void scale_free( int *G, int *p ) { int i, j, tmp, dim = *p, p0 = 2; double random_value; std::vector size_a( dim ); for( i = 0; i < p0 - 1; i++ ) { G[ i * dim + i + 1 ] = 1; G[ ( i + 1 ) * dim + i ] = 1; } for( i = 0 ; i < p0 ; i++ ) size_a[ i ] = 2; for( i = p0; i < dim; i++ ) size_a[ i ] = 0; int total = 2 * p0; GetRNGstate(); for( i = p0; i < dim; i++ ) { random_value = (double) total * unif_rand(); tmp = 0; j = 0; while( tmp < random_value && j < i ) tmp += size_a[ j++ ]; j--; G[ i * dim + j ] = 1; G[ j * dim + i ] = 1; total += 2; size_a[ j ]++; size_a[ i ]++; } PutRNGstate(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // To transfer the raw discreate data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void transfer_data( int r_data[], int data[], int *n, int *p, int *size_unique_data ) { int i, j, l, counter; // - - tranfer each row of raw data to string - - - - - - - - - - - - - - - - - - - - - - - - - - -| vector char_row( *p ); vectorall_patterns( *n ); string *unique_patterns = new string[ *n ]; for( i = 0; i < *n; i++ ) { for( j = 0; j < *p; j++ ) char_row[ j ] = r_data[ j * *n + i ] + '0'; all_patterns[ i ] = string( char_row.begin(), char_row.end() ); } // - - find the unique string-rows - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | unique_patterns[0] = all_patterns[0]; int length_unique_patterns = 1; for( i = 1; i < *n; i++ ) { counter = 0; //for( j = 0; j < length_unique_patterns; j++ ) //( all_patterns[i] == unique_patterns[j] ) ? j = length_unique_patterns : ++counter; while( ( counter < length_unique_patterns ) and ( all_patterns[ i ] != unique_patterns[ counter ] ) ) ++counter; if( counter == length_unique_patterns ) unique_patterns[ length_unique_patterns++ ] = all_patterns[ i ]; } // - - tranfer the data - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| int which_one = 0; for( l = 0; l < length_unique_patterns; l++ ) { counter = 0; for( i = 0; i < *n; i++ ) if( all_patterns[ i ] == unique_patterns[ l ] ) { counter++; which_one = i; } data[ *p * *n + l ] = counter; for( j = 0; j < *p; j++ ) data[ j * *n + l ] = r_data[ j * *n + which_one ]; } *size_unique_data = length_unique_patterns; delete[] unique_patterns; } BDgraph/src/BDgraph_init.c0000644000176200001440000003371313621507300015052 0ustar liggesusers#include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .C calls */ extern void dgm_bdmcmc_mpl_binary_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_binary_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_binary_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_binary_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_bdmcmc_mpl_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_rjmcmc_mpl_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void dgm_rjmcmc_mpl_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_bdmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_bdmcmc_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_bdmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_bdmcmc_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_bdmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_bdmcmc_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_bdmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_bdmcmc_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_rjmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_DMH_rjmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_dw_bdmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_dw_bdmcmc_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_dw_bdmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_dw_bdmcmc_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_rjmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void gcgm_rjmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_mpl_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_mpl_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_mpl_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_bdmcmc_mpl_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_bdmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_bdmcmc_ma_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_bdmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_bdmcmc_map_multi_update(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_rjmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_DMH_rjmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_rjmcmc_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_rjmcmc_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_rjmcmc_mpl_ma(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void ggm_rjmcmc_mpl_map(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void log_exp_mc(void *, void *, void *, void *, void *, void *, void *, void *); extern void log_mpl_binary_parallel_hc(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void log_mpl_dis(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void omp_set_num_cores(void *); extern void rgwish_c(void *, void *, void *, void *, void *, void *); extern void rwish_c(void *, void *, void *, void *); extern void scale_free(void *, void *); extern void transfer_data(void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"dgm_bdmcmc_mpl_binary_ma", (DL_FUNC) &dgm_bdmcmc_mpl_binary_ma, 12}, {"dgm_bdmcmc_mpl_binary_ma_multi_update", (DL_FUNC) &dgm_bdmcmc_mpl_binary_ma_multi_update, 13}, {"dgm_bdmcmc_mpl_binary_map", (DL_FUNC) &dgm_bdmcmc_mpl_binary_map, 16}, {"dgm_bdmcmc_mpl_binary_map_multi_update", (DL_FUNC) &dgm_bdmcmc_mpl_binary_map_multi_update, 18}, {"dgm_bdmcmc_mpl_ma", (DL_FUNC) &dgm_bdmcmc_mpl_ma, 13}, {"dgm_bdmcmc_mpl_ma_multi_update", (DL_FUNC) &dgm_bdmcmc_mpl_ma_multi_update, 14}, {"dgm_bdmcmc_mpl_map", (DL_FUNC) &dgm_bdmcmc_mpl_map, 17}, {"dgm_bdmcmc_mpl_map_multi_update", (DL_FUNC) &dgm_bdmcmc_mpl_map_multi_update, 19}, {"dgm_rjmcmc_mpl_ma", (DL_FUNC) &dgm_rjmcmc_mpl_ma, 13}, {"dgm_rjmcmc_mpl_map", (DL_FUNC) &dgm_rjmcmc_mpl_map, 17}, {"gcgm_bdmcmc_ma", (DL_FUNC) &gcgm_bdmcmc_ma, 20}, {"gcgm_bdmcmc_ma_multi_update", (DL_FUNC) &gcgm_bdmcmc_ma_multi_update, 21}, {"gcgm_bdmcmc_map", (DL_FUNC) &gcgm_bdmcmc_map, 24}, {"gcgm_bdmcmc_map_multi_update", (DL_FUNC) &gcgm_bdmcmc_map_multi_update, 26}, {"gcgm_DMH_bdmcmc_ma", (DL_FUNC) &gcgm_DMH_bdmcmc_ma, 21}, {"gcgm_DMH_bdmcmc_ma_multi_update", (DL_FUNC) &gcgm_DMH_bdmcmc_ma_multi_update, 22}, {"gcgm_DMH_bdmcmc_map", (DL_FUNC) &gcgm_DMH_bdmcmc_map, 25}, {"gcgm_DMH_bdmcmc_map_multi_update", (DL_FUNC) &gcgm_DMH_bdmcmc_map_multi_update, 27}, {"gcgm_DMH_rjmcmc_ma", (DL_FUNC) &gcgm_DMH_rjmcmc_ma, 21}, {"gcgm_DMH_rjmcmc_map", (DL_FUNC) &gcgm_DMH_rjmcmc_map, 25}, {"gcgm_dw_bdmcmc_ma", (DL_FUNC) &gcgm_dw_bdmcmc_ma, 21}, {"gcgm_dw_bdmcmc_ma_multi_update", (DL_FUNC) &gcgm_dw_bdmcmc_ma_multi_update, 22}, {"gcgm_dw_bdmcmc_map", (DL_FUNC) &gcgm_dw_bdmcmc_map, 25}, {"gcgm_dw_bdmcmc_map_multi_update", (DL_FUNC) &gcgm_dw_bdmcmc_map_multi_update, 27}, {"gcgm_rjmcmc_ma", (DL_FUNC) &gcgm_rjmcmc_ma, 20}, {"gcgm_rjmcmc_map", (DL_FUNC) &gcgm_rjmcmc_map, 24}, {"ggm_bdmcmc_ma", (DL_FUNC) &ggm_bdmcmc_ma, 14}, {"ggm_bdmcmc_ma_multi_update", (DL_FUNC) &ggm_bdmcmc_ma_multi_update, 15}, {"ggm_bdmcmc_map", (DL_FUNC) &ggm_bdmcmc_map, 18}, {"ggm_bdmcmc_map_multi_update", (DL_FUNC) &ggm_bdmcmc_map_multi_update, 20}, {"ggm_bdmcmc_mpl_ma", (DL_FUNC) &ggm_bdmcmc_mpl_ma, 9}, {"ggm_bdmcmc_mpl_ma_multi_update", (DL_FUNC) &ggm_bdmcmc_mpl_ma_multi_update, 10}, {"ggm_bdmcmc_mpl_map", (DL_FUNC) &ggm_bdmcmc_mpl_map, 13}, {"ggm_bdmcmc_mpl_map_multi_update", (DL_FUNC) &ggm_bdmcmc_mpl_map_multi_update, 15}, {"ggm_DMH_bdmcmc_ma", (DL_FUNC) &ggm_DMH_bdmcmc_ma, 16}, {"ggm_DMH_bdmcmc_ma_multi_update", (DL_FUNC) &ggm_DMH_bdmcmc_ma_multi_update, 17}, {"ggm_DMH_bdmcmc_map", (DL_FUNC) &ggm_DMH_bdmcmc_map, 20}, {"ggm_DMH_bdmcmc_map_multi_update", (DL_FUNC) &ggm_DMH_bdmcmc_map_multi_update, 22}, {"ggm_DMH_rjmcmc_ma", (DL_FUNC) &ggm_DMH_rjmcmc_ma, 16}, {"ggm_DMH_rjmcmc_map", (DL_FUNC) &ggm_DMH_rjmcmc_map, 20}, {"ggm_rjmcmc_ma", (DL_FUNC) &ggm_rjmcmc_ma, 14}, {"ggm_rjmcmc_map", (DL_FUNC) &ggm_rjmcmc_map, 18}, {"ggm_rjmcmc_mpl_ma", (DL_FUNC) &ggm_rjmcmc_mpl_ma, 9}, {"ggm_rjmcmc_mpl_map", (DL_FUNC) &ggm_rjmcmc_mpl_map, 13}, {"log_exp_mc", (DL_FUNC) &log_exp_mc, 8}, {"log_mpl_binary_parallel_hc", (DL_FUNC) &log_mpl_binary_parallel_hc, 9}, {"log_mpl_dis", (DL_FUNC) &log_mpl_dis, 10}, {"omp_set_num_cores", (DL_FUNC) &omp_set_num_cores, 1}, {"rgwish_c", (DL_FUNC) &rgwish_c, 6}, {"rwish_c", (DL_FUNC) &rwish_c, 4}, {"scale_free", (DL_FUNC) &scale_free, 2}, {"transfer_data", (DL_FUNC) &transfer_data, 5}, {NULL, NULL, 0} }; void R_init_BDgraph(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } BDgraph/src/ggm_mpl_bd.cpp0000644000176200001440000013621613623016622015155 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing the Marginal pseudo-likelihood // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl( int *node, int mb_node[], int *size_node, double *log_mpl_node, double S[], double S_mb_node[], int *n, int *p ) { int size_node_fa = *size_node + 1, dim = *p, dim1 = dim + 1; double det_S_mb_node, det_S_fa_node; if( *size_node > 0 ) { // S_mb_node = S[ mb_node, mb_node ] sub_matrix_upper( &S[0], &S_mb_node[0], &mb_node[0], size_node, &dim ); if( *size_node > 1 ) determinant( &S_mb_node[0], &det_S_mb_node, size_node ); else det_S_mb_node = S[ mb_node[0] * dim1 ]; // fa_node = c( mb_node, node ) mb_node[ *size_node ] = *node; // S_fa_node = S[fa_node, fa_node] sub_matrix_upper( &S[0], &S_mb_node[0], &mb_node[0], &size_node_fa, &dim ); //det_S_fa_node = det( S_fa_node ) determinant( &S_mb_node[0], &det_S_fa_node, &size_node_fa ); //*log_mpl_node = lgammafn( 0.5 * ( *n + *size_node ) ) - lgammafn( 0.5 * size_node_fa ) - ( 2 * *size_node + 1 ) * log( *n ) * 0.5 - ( *n - 1 ) * ( log( det_S_fa_node ) - log( det_S_mb_node ) ) * 0.5; *log_mpl_node = lgammafn( 0.5 * ( *n + *size_node ) ) - lgammafn( 0.5 * size_node_fa ) - *size_node * log( static_cast( *n ) ) - ( *n - 1 ) * ( log( det_S_fa_node ) - log( det_S_mb_node ) ) * 0.5; }else{ det_S_fa_node = S[ *node * dim1 ]; //*log_mpl_node = lgammafn( 0.5 * *n ) - lgammafn( 0.5 ) - log( *n ) * 0.5 - ( *n - 1 ) * ( log( det_S_fa_node ) ) * 0.5; *log_mpl_node = lgammafn( 0.5 * *n ) - lgammafn( 0.5 ) - ( *n - 1 ) * ( log( det_S_fa_node ) ) * 0.5; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing birth-death rates for all the possible edges for ggm_mpl method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void rates_ggm_mpl( double rates[], double log_ratio_g_prior[], double curr_log_mpl[], int G[], int index_row[], int index_col[], int *sub_qp, int size_node[], double S[], int *n, int *p ) { int dim = *p; #pragma omp parallel { int i, j, ij, t, nodexdim, count_mb, size_node_i_new, size_node_j_new; double log_mpl_i_new, log_mpl_j_new, log_rate_ij; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used int *mb_node_j_new = new int[ dim ]; // For dynamic memory used double *S_mb_node = new double[ dim * dim ]; // For dynamic memory used #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; ij = j * dim + i; if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; size_node_j_new = size_node[ j ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; size_node_j_new = size_node[ j ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl( &i, mb_node_i_new, &size_node_i_new, &log_mpl_i_new, S, S_mb_node, n, &dim ); log_mpl( &j, mb_node_j_new, &size_node_j_new, &log_mpl_j_new, S, S_mb_node, n, &dim ); log_rate_ij = log_mpl_i_new + log_mpl_j_new - curr_log_mpl[ i ] - curr_log_mpl[ j ]; log_rate_ij = ( G[ ij ] ) ? log_rate_ij - log_ratio_g_prior[ ij ] : log_rate_ij + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate_ij < 0.0 ) ? exp( log_rate_ij ) : 1.0; } delete[] mb_node_i_new; delete[] mb_node_j_new; delete[] S_mb_node; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing birth-death rates for all the possible edges for ggm_mpl method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void local_rates_ggm_mpl( double rates[], double log_ratio_g_prior[], int *selected_edge_i, int *selected_edge_j, double curr_log_mpl[], int G[], int index_row[], int index_col[], int *sub_qp, int size_node[], double S[], int *n, int *p ) { int dim = *p; #pragma omp parallel { int i, j, ij, t, nodexdim, count_mb, size_node_i_new, size_node_j_new; double log_mpl_i_new, log_mpl_j_new, log_rate_ij; int *mb_node_i_new = new int[ dim ]; // For dynamic memory used int *mb_node_j_new = new int[ dim ]; // For dynamic memory used double *S_mb_node = new double[ dim * dim ]; // For dynamic memory used #pragma omp for for( int counter = 0; counter < *sub_qp; counter++ ) { i = index_row[ counter ]; j = index_col[ counter ]; ij = j * dim + i; if( ( i == *selected_edge_i ) or ( j == *selected_edge_j ) ) { if( G[ ij ] ) { size_node_i_new = size_node[ i ] - 1; size_node_j_new = size_node[ j ] - 1; if( size_node_i_new > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ i ] + 1; size_node_j_new = size_node[ j ] + 1; nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl( &i, mb_node_i_new, &size_node_i_new, &log_mpl_i_new, S, S_mb_node, n, &dim ); log_mpl( &j, mb_node_j_new, &size_node_j_new, &log_mpl_j_new, S, S_mb_node, n, &dim ); log_rate_ij = log_mpl_i_new + log_mpl_j_new - curr_log_mpl[ i ] - curr_log_mpl[ j ]; log_rate_ij = ( G[ ij ] ) ? log_rate_ij - log_ratio_g_prior[ ij ] : log_rate_ij + log_ratio_g_prior[ ij ]; rates[ counter ] = ( log_rate_ij < 0.0 ) ? exp( log_rate_ij ) : 1.0; } } delete[] mb_node_i_new; delete[] mb_node_j_new; delete[] S_mb_node; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_mpl_ma( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, double p_links[] , int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); // calculating all the birth and death rates rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); // Calculating local birth and death rates local_rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_mpl_map( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g , int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); // calculating all the birth and death rates rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); // Calculating local birth and death rates local_rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_mpl_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, double p_links[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n; int multi_update_C = *multi_update, selected_edge_i, selected_edge_j, selected_edge_ij; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - - Updating graph based on selected edges - - - - - - - - - - - - - - - - - - - - - - - - - -| for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; //curr_log_mpl[ i ] = log_mpl( node = i, mb_node = which( G[ i, ] == 1 ), size_node = sum( G[ i, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_i ], &selected_edge_i, ©_n, &dim ); log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); //curr_log_mpl[ j ] = log_mpl( node = j, mb_node = which( G[ j, ] == 1 ), size_node = sum( G[ j, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_j ], &selected_edge_j, ©_n, &dim ); log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < pxp; i++ ) p_links[ i ] = p_links_Cpp[ i ] / sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_mpl_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *multi_update , int *print ) { int print_c = *print, multi_update_C = *multi_update; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = *counter_all_g; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - - Updating graph based on selected edges - - - - - - - - - - - - - - - - - - - - - - - - - -| for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; //curr_log_mpl[ i ] = log_mpl( node = i, mb_node = which( G[ i, ] == 1 ), size_node = sum( G[ i, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_i ], &selected_edge_i, ©_n, &dim ); log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); //curr_log_mpl[ j ] = log_mpl( node = j, mb_node = which( G[ j, ] == 1 ), size_node = sum( G[ j, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_j ], &selected_edge_j, ©_n, &dim ); log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing alpha (probability of acceptness) in RJ-MCMC algorithm for ggm_mpl method // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_alpha_rjmcmc_ggm_mpl( double *log_alpha_ij, double log_ratio_g_prior[], int *i, int *j, double curr_log_mpl[], int G[], int size_node[], double S[], int *n, int *p ) { int t, nodexdim, dim = *p, count_mb, size_node_i_new, size_node_j_new; double log_mpl_i_new, log_mpl_j_new; vector mb_node_i_new( dim ); // For dynamic memory used vector mb_node_j_new( dim ); // For dynamic memory used vector S_mb_node( dim * dim ); // For dynamic memory used int ij = *j * dim + *i; if( G[ ij ] ) { size_node_i_new = size_node[ *i ] - 1; size_node_j_new = size_node[ *j ] - 1; if( size_node_i_new > 0 ) { nodexdim = *i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != *j ) mb_node_i_new[ count_mb++ ] = t; } if( size_node_j_new > 0 ) { nodexdim = *j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] and t != *i ) mb_node_j_new[ count_mb++ ] = t; } }else{ size_node_i_new = size_node[ *i ] + 1; size_node_j_new = size_node[ *j ] + 1; nodexdim = *i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == *j ) mb_node_i_new[ count_mb++ ] = t; nodexdim = *j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] or t == *i ) mb_node_j_new[ count_mb++ ] = t; } log_mpl( i, &mb_node_i_new[0], &size_node_i_new, &log_mpl_i_new, S, &S_mb_node[0], n, &dim ); log_mpl( j, &mb_node_j_new[0], &size_node_j_new, &log_mpl_j_new, S, &S_mb_node[0], n, &dim ); *log_alpha_ij = log_mpl_i_new + log_mpl_j_new - curr_log_mpl[ *i ] - curr_log_mpl[ *j ]; *log_alpha_ij = ( G[ ij ] ) ? *log_alpha_ij - log_ratio_g_prior[ ij ] : *log_alpha_ij + log_ratio_g_prior[ ij ]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for Bayesian model averaging (MA) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_rjmcmc_mpl_ma( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, double p_links[] , int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n; int selected_edge, selected_edge_i, selected_edge_j; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double log_alpha_ij; vector p_links_Cpp( pxp, 0.0 ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates int qp = dim * ( dim - 1 ) / 2; vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc_ggm_mpl( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &size_node[0], ©S[0], ©_n, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | //curr_log_mpl[ i ] = log_mpl( node = i, mb_node = which( G[ i, ] == 1 ), size_node = sum( G[ i, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_i ], &selected_edge_i, ©_n, &dim ); log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); //curr_log_mpl[ j ] = log_mpl( node = j, mb_node = which( G[ j, ] == 1 ), size_node = sum( G[ j, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_j ], &selected_edge_j, ©_n, &dim ); log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); // - - - Saving result- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) p_links_Cpp[ i ] += G[ i ]; // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| memcpy( &p_links[0], &p_links_Cpp[0], sizeof( double ) * pxp ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_rjmcmc_mpl_map( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g , int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = 0; int selected_edge, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double log_alpha_ij; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); int qp = dim * ( dim - 1 ) / 2; vector char_g( qp ); // char string_g[pp]; // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vectormb_node( dim ); vectorcurr_log_mpl( dim ); vector S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vectorindex_row( qp ); vectorindex_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; // - - main loop for RJ-MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc_ggm_mpl( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, &curr_log_mpl[0], G, &size_node[0], ©S[0], ©_n, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[selected_edge_i * dim + selected_edge_j] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | //curr_log_mpl[ i ] = log_mpl( node = i, mb_node = which( G[ i, ] == 1 ), size_node = sum( G[ i, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_i ], &selected_edge_i, ©_n, &dim ); log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); //curr_log_mpl[ j ] = log_mpl( node = j, mb_node = which( G[ j, ] == 1 ), size_node = sum( G[ j, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_j ], &selected_edge_j, ©_n, &dim ); log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < size_sample_graph; i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } } // End of exturn "C" BDgraph/src/ggm_DMH.cpp0000644000176200001440000011266213623016623014330 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" #include "rgwish.h" using namespace std; extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_bdmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double K_hat[], double p_links[], int *b, int *b_star, double Ds[], double D[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int ip, i, j, ij, counter, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - -| // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_bdmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double Ds[], double D[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int ip, i, j, ij, counter, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // - - - - - - - - - - - - - - // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - -| // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][qp] = '\0'; } *size_sample_g = size_sample_graph; for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_bdmcmc_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double K_hat[], double p_links[], int *b, int *b_star, double Ds[], double D[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int ip, i, j, ij, counter = 0, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // - - - - - - - - - - - - - - int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - -| // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_bdmcmc_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *b, int *b_star, double Ds[], double D[], int *multi_update, int *print ) { int print_c = *print, multi_update_C = *multi_update, iteration = *iter, burn_in = *burnin, b1 = *b; int count_all_g = *counter_all_g, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int ip, i, j, ij, counter = 0, dim = *p, pxp = dim * dim, one = 1; int qp = dim * ( dim - 1 ) / 2; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // - - - - - - - - - - - - - - int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Counting size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - -| // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); rates_bdmcmc_dmh_parallel( &rates[0], &log_ratio_g_prior[0], &G[0], &index_row[0], &index_col[0], &sub_qp, &Ds[0], &D[0], &sigma[0], &K[0], &sigma_dmh[0], &K_dmh[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_rjmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, double K_hat[], int p_links[], int *b, int *b_star, double Ds[], double D[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b; int randomEdge, selected_edge_i, selected_edge_j, ip, i, j, ij, jj, counter; int dim = *p, pxp = dim * dim, p1 = dim - 1, p1xp1 = p1 * p1, p2 = dim - 2, p2xp2 = p2 * p2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double Dsijj, Dsjj, Dsij, logH_ij, logI_p, Dij, Djj, Dijj, alpha_ij; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1xp1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K12( p2x2 ); // K[e, -e] vector sigma12( p2x2 ); // sigma[e, -e] vector sigma22( p2xp2 ); // sigma[-e, -e] vector sigma11_inv( 4 ); vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 randomEdge = static_cast( unif_rand() * qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { if( counter == randomEdge ) { selected_edge_i = i; selected_edge_j = j; } counter++; } // - - - - Calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| ij = selected_edge_j * dim + selected_edge_i; jj = selected_edge_j * dim + selected_edge_j; Dsij = Ds[ ij ]; Dsjj = Ds[ jj ]; Dsijj = - Dsij * Dsij / Dsjj; Dij = D[ ij ]; Djj = D[ jj ]; Dijj = - Dij * Dij / Djj; // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); log_H_ij( &K[0], &sigma[0], &logH_ij, &selected_edge_i, &selected_edge_j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dsijj, &Dsij, &Dsjj ); log_H_ij( &K_dmh[0], &sigma_dmh[0], &logI_p, &selected_edge_i, &selected_edge_j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dijj, &Dij, &Djj ); //alpha_ij = ( G[ij] ) ? ( logH_ij - logI_p ) : ( logI_p - logH_ij ); alpha_ij = ( G[ ij ] ) ? ( logH_ij - logI_p ) - log_ratio_g_prior[ ij ] : ( logI_p - logH_ij ) + log_ratio_g_prior[ ij ]; // - - - - End of calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < alpha_ij ) { G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) { K_hat[ i ] += K[ i ]; p_links[ i ] += G[ i ]; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of main MCMC loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models // Based on Double Metropolis-Hastings // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_DMH_rjmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double Ti[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double Ds[], double D[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, b1 = *b, count_all_g = 0; int randomEdge, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int ip, i, j, ij, jj, counter; int dim = *p, pxp = dim * dim, p1 = dim - 1, p1xp1 = p1 * p1, p2 = dim - 2, p2xp2 = p2 * p2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double Dsijj, Dsjj, Dsij, logH_ij, logI_p, Dij, Djj, Dijj, alpha_ij; bool this_one; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1xp1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K12( p2x2 ); // K[e, -e] vector sigma12( p2x2 ); // sigma[e, -e] vector sigma22( p2xp2 ); // sigma[-e, -e] vector sigma11_inv( 4 ); vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - - - - - - - vector sigma_dmh( pxp ); // for double Metropolis-Hastings vector K_dmh( pxp ); // for double Metropolis-Hastings // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // STEP 1: selecting edge and calculating alpha // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 randomEdge = static_cast( unif_rand() * qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { if( counter == randomEdge ) { selected_edge_i = i; selected_edge_j = j; } char_g[ counter++ ] = G[ j * dim + i ] + '0'; } // - - - - Calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| ij = selected_edge_j * dim + selected_edge_i; jj = selected_edge_j * dim + selected_edge_j; Dsij = Ds[ ij ]; Dsjj = Ds[ jj ]; Dsijj = - Dsij * Dsij / Dsjj; Dij = D[ ij ]; Djj = D[ jj ]; Dijj = - Dij * Dij / Djj; // sampling from K and sigma for double Metropolis-Hastings rgwish_sigma( G, &size_node[0], Ti, &K_dmh[0], &sigma_dmh[0], &b1, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); log_H_ij( &K[0], &sigma[0], &logH_ij, &selected_edge_i, &selected_edge_j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dsijj, &Dsij, &Dsjj ); log_H_ij( &K_dmh[0], &sigma_dmh[0], &logI_p, &selected_edge_i, &selected_edge_j, &Kj12[0], &Kj12xK22_inv[0], &K12[0], &K12xK22_inv[0], &K121[0], &sigmaj12[0], &sigmaj22[0], &sigma12[0], &sigma22[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], &dim, &p1, &p2, &jj, &Dijj, &Dij, &Djj ); //alpha_ij = ( G[ij] ) ? ( logH_ij - logI_p ) : ( logI_p - logH_ij ); alpha_ij = ( G[ ij ] ) ? ( logH_ij - logI_p ) - log_ratio_g_prior[ ij ] : ( logI_p - logH_ij ) + log_ratio_g_prior[ ij ]; // - - - - End of calculating alpha - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < alpha_ij ) { G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - -- STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( i_mcmc >= burn_in ) { for( i = 0; i < pxp ; i++ ) K_hat[ i ] += K[ i ]; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of main MCMC loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } } // End of exturn "C" BDgraph/src/Makevars0000644000176200001440000000020213506630511014036 0ustar liggesusersCXX_STD = CXX11 PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) BDgraph/src/omp_set_num_cores.cpp0000644000176200001440000000260513621263231016576 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "util.h" #ifdef _OPENMP #include #endif extern "C" { void omp_set_num_cores( int *cores ) { #ifdef _OPENMP omp_set_num_threads( *cores ); #else Rprintf( " This OS does not support multi-threading for the BDgraph package \n" ); #endif } } BDgraph/src/Makevars.win0000644000176200001440000000020313373050357014641 0ustar liggesusersCXX_STD = CXX11 PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) BDgraph/src/util.h0000644000176200001440000000161113532241273013477 0ustar liggesusers#ifndef UTIL_H #define UTIL_H #ifdef _OPENMP #include #endif #define USE_FC_LEN_T // For Fortran character strings #include // included by R.h, so define USE_FC_LEN_T early #include #include #include #include #include #include #include #include // for the special values like NA, NaN #include #include #include // std::string, std::to_string #include // for using vector #include // isinf, sqrt #include // for std::numeric_limits::max() #include // for transform function #include // for transform function #include #ifndef FCONE # define FCONE #endif using namespace std; #endif BDgraph/src/gm_mpl_Hill_Climb.cpp0000644000176200001440000003416113621263231016411 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing the Marginal pseudo-likelihood for HC algorithm and binary data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_binary_hc( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, int *n ) { double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); int i_hash, counter, i, j, l, size_mb_conf, mb_node_x_lf, node_x_lf = *node * *length_freq_data; double sum_lgamma_fam; *log_mpl_node = 0.0; int fam_conf_count_0 = 0, fam_conf_count_1 = 0; switch( *size_node ) { case 0: for( i = 0; i < *length_freq_data; i++ ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); *log_mpl_node = sum_lgamma_fam - lgammafn_sign( *n + alpha_jl, NULL ) + log_alpha_jl - 2 * log_alpha_ijl; break; case 1: mb_node_x_lf = mb_node[0] * *length_freq_data; for( l = 0; l < 2; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ mb_node_x_lf + i ] == l ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); //mb_conf_count = fam_conf_count[0] + fam_conf_count[1]; *log_mpl_node += sum_lgamma_fam - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += 2 * log_alpha_jl - 4 * log_alpha_ijl; break; default: int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; int sz = size_bit; vectorvec_fam_conf_count_0( *length_freq_data ); vectorvec_fam_conf_count_1( *length_freq_data ); vector > mb_conf( *length_freq_data ); vector > data_mb( *length_freq_data ); int size_hash = *size_node / sz + 1; vector hash_mb( size_hash, 0 ); // for case i = 0 for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data ] << ( j - i_hash * sz ); } mb_conf[0] = hash_mb; size_mb_conf = 1; if( data[ node_x_lf ] == 0 ) { vec_fam_conf_count_0[0] = freq_data[0]; vec_fam_conf_count_1[0] = 0; }else{ vec_fam_conf_count_1[0] = freq_data[0]; vec_fam_conf_count_0[0] = 0; } int sizeof_hash = size_hash * sizeof hash_mb[0]; for( i = 1; i < *length_freq_data; i++ ) { //vector hash_mb( size_hash, 0 ); memset( &hash_mb[0], 0, sizeof_hash ); for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data + i ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data + i ] << ( j - i_hash * sz ); } //data_mb[i] = hash_mb; counter = 1; for( j = 0; j < size_mb_conf; j++ ) if( hash_mb == mb_conf[ j ] ) { ( data[ node_x_lf + i ] == 0 ) ? vec_fam_conf_count_0[ j ] += freq_data[ i ] : vec_fam_conf_count_1[ j ] += freq_data[ i ]; counter = 0; break; } if( counter ) { //( data[ node_x_lf + i ] == 0 ) ? vec_fam_conf_count_0[ size_mb_conf ] = freq_data[i] : vec_fam_conf_count_1[ size_mb_conf ] = freq_data[i]; if( data[ node_x_lf + i ] == 0 ) { vec_fam_conf_count_0[ size_mb_conf ] = freq_data[ i ]; vec_fam_conf_count_1[ size_mb_conf ] = 0; }else{ vec_fam_conf_count_1[ size_mb_conf ] = freq_data[ i ]; vec_fam_conf_count_0[ size_mb_conf ] = 0; } mb_conf[ size_mb_conf++ ] = hash_mb; } } for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score *log_mpl_node += lgammafn_sign( vec_fam_conf_count_0[l] + *alpha_ijl, NULL ) + lgammafn_sign( vec_fam_conf_count_1[l] + *alpha_ijl, NULL ) - lgammafn_sign( vec_fam_conf_count_0[l] + vec_fam_conf_count_1[l] + alpha_jl, NULL ); // adding remaining terms *log_mpl_node += size_mb_conf * ( log_alpha_jl - 2 * log_alpha_ijl ); break; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Parallel function to compute the Marginal pseudo-likelihood for BINARY data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_binary_parallel_hc( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, double *alpha_ijl, int *n ) { double alpha_jl = 2 * *alpha_ijl; double log_alpha_ijl = lgammafn_sign( *alpha_ijl, NULL ); double log_alpha_jl = lgammafn_sign( alpha_jl, NULL ); int i, l, size_mb_conf, mb_node_x_lf, node_x_lf = *node * *length_freq_data; double sum_lgamma_fam; *log_mpl_node = 0.0; int fam_conf_count_0 = 0, fam_conf_count_1 = 0; switch( *size_node ) { case 0: for( i = 0; i < *length_freq_data; i++ ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); *log_mpl_node = sum_lgamma_fam - lgammafn_sign( *n + alpha_jl, NULL ) + log_alpha_jl - 2 * log_alpha_ijl; break; case 1: mb_node_x_lf = mb_node[0] * *length_freq_data; for( l = 0; l < 2; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ mb_node_x_lf + i ] == l ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; sum_lgamma_fam = lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ); //mb_conf_count = fam_conf_count[0] + fam_conf_count[1]; *log_mpl_node += sum_lgamma_fam - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += 2 * log_alpha_jl - 4 * log_alpha_ijl; break; default: vector > mb_conf( *length_freq_data ); vector > data_mb( *length_freq_data ); int size_bit = sizeof( unsigned long long int ) * CHAR_BIT / 2; int sz = size_bit; int size_hash = *size_node / sz + 1; #pragma omp parallel { int j, i_hash; vector hash_mb( size_hash ); int sizeof_hash = size_hash * sizeof hash_mb[0]; #pragma omp for for( int i = 0; i < *length_freq_data; i++ ) { memset( &hash_mb[0], 0, sizeof_hash ); for( j = 0; j < *size_node; j++ ) { i_hash = j / sz; //hash_mb[ i_hash ] |= data[ mb_node[j] * *length_freq_data + i ] << ( j - i_hash * sz ); hash_mb[ i_hash ] += (unsigned long long)data[ mb_node[ j ] * *length_freq_data + i ] << ( j - i_hash * sz ); } data_mb[ i ] = hash_mb; } } mb_conf = data_mb; std::sort( mb_conf.begin(), mb_conf.end() ); mb_conf.erase( std::unique( mb_conf.begin(), mb_conf.end() ), mb_conf.end() ); size_mb_conf = mb_conf.size(); for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score { fam_conf_count_0 = 0; fam_conf_count_1 = 0; for( i = 0; i < *length_freq_data; i++ ) if( data_mb[ i ] == mb_conf[ l ] ) ( data[ node_x_lf + i ] == 0 ) ? fam_conf_count_0 += freq_data[ i ] : fam_conf_count_1 += freq_data[ i ]; *log_mpl_node += lgammafn_sign( fam_conf_count_0 + *alpha_ijl, NULL ) + lgammafn_sign( fam_conf_count_1 + *alpha_ijl, NULL ) - lgammafn_sign( fam_conf_count_0 + fam_conf_count_1 + alpha_jl, NULL ); } // adding remaining terms *log_mpl_node += size_mb_conf * ( log_alpha_jl - 2 * log_alpha_ijl ); break; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing the Marginal pseudo-likelihood for discrete data // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_mpl_hc_dis( int *node, int mb_node[], int *size_node, double *log_mpl_node, int data[], int freq_data[], int *length_freq_data, int max_range_nodes[], double *alpha_ijl, int *n ) { int i, j, l, size_mb_conf; int mb_node_x_lf, mb_conf_l, mb_conf_count; int node_x_lf = *node * *length_freq_data; double sum_lgamma_fam; vectormb_conf( *length_freq_data ); int max_range_node_j = max_range_nodes[ *node ]; vectorfam_conf_count( max_range_node_j ); double alpha_jl = max_range_node_j * *alpha_ijl; if( *size_node == 0 ) size_mb_conf = 1; vectordata_mb( *length_freq_data, 0 ); if( *size_node == 1 ) { // data_mb = data[ , mb_node ] mb_node_x_lf = mb_node[0] * *length_freq_data; //for( i = 0; i < *length_freq_data; i++ ) data_mb[i] = data[ mb_node_x_lf + i ]; memcpy( &data_mb[0], &data[0] + mb_node_x_lf, sizeof( int ) * *length_freq_data ); size_mb_conf = max_range_nodes[ mb_node[0] ]; // mb_conf = 1:size_mb_conf; for( j = 0; j < size_mb_conf; j++ ) mb_conf[ j ] = j; } if( *size_node > 1 ) { vectorcumprod_mb( *size_node ); cumprod_mb[0] = max_range_nodes[ mb_node[ 0 ] ]; //cumprod_mb = t( t( c( 1, cumprod( max_range_nodes[ mb_node[ 2:length( mb_node ) ] ] ) ) ) ) for( j = 1; j < *size_node; j++ ) cumprod_mb[ j ] = cumprod_mb[ j - 1 ] * max_range_nodes[ mb_node[ j ] ]; //data_mb = c( data[ , mb_node ] %*% cumprod_mb ) for( i = 0; i < *length_freq_data; i++ ) for( j = 0; j < *size_node; j++ ) data_mb[ i ] += cumprod_mb[ j ] * data[ mb_node[ j ] * *length_freq_data + i ]; //mb_conf = unique( data_mb ) //vectormb_conf( *n ); //for( i = 0; i < *length_freq_data; i++ ) mb_conf[i] = data_mb[i]; memcpy( &mb_conf[0], &data_mb[0], sizeof( int ) * *length_freq_data ); std::sort( mb_conf.begin(), mb_conf.end() ); mb_conf.erase( std::unique( mb_conf.begin(), mb_conf.end() ), mb_conf.end() ); size_mb_conf = mb_conf.size(); } if( *size_node == 0 ) { //for( i in 1:max_range_node_j ) fam_conf_count[i] = sum( ( data[ , node ] == i ) * ind ) for( j = 0; j < max_range_node_j; j++ ) { //fam_conf_count[j] = std::count( &data[0] + node_x_n, &data[0] + node_x_n + *n, j + 1 ); fam_conf_count[ j ] = 0; for( i = 0; i < *length_freq_data; i++ ) if( data[ node_x_lf + i ] == j ) fam_conf_count[ j ] += freq_data[ i ]; } sum_lgamma_fam = 0.0; for( j = 0; j < max_range_node_j; j++ ) sum_lgamma_fam += lgammafn( fam_conf_count[ j ] + *alpha_ijl ); *log_mpl_node = sum_lgamma_fam - lgammafn( *n + alpha_jl ); } if( *size_node > 0 ) { *log_mpl_node = 0.0; for( l = 0; l < size_mb_conf; l++ ) // collects the necessary statistics from the data and calculates the score { //ind = c( ( data_mb == mb_conf[ l ] ) * 1 ) # finds positions of MB configuration //mb_conf_count = sum( ind ) # n_jl mb_conf_l = mb_conf[ l ]; //mb_conf_count = std::count( data_mb.begin(), data_mb.end(), mb_conf_l ); mb_conf_count = 0; for( i = 0; i < *length_freq_data; i++ ) if( data_mb[ i ] == mb_conf_l ) mb_conf_count += freq_data[ i ]; //fam_conf_count = node_conf * 0 //for( j in 1:max_range_node_j ) fam_conf_count[j] = sum( ( data[ , node ] == j ) * ind ) for( j = 0; j < max_range_node_j; j++ ) { fam_conf_count[ j ] = 0; for( i = 0; i < *length_freq_data; i++ ) if( ( data[ node_x_lf + i ] == j ) && ( data_mb[ i ] == mb_conf_l ) ) fam_conf_count[ j ] += freq_data[ i ]; } sum_lgamma_fam = 0.0; for( j = 0; j < max_range_node_j; j++ ) sum_lgamma_fam += lgammafn( fam_conf_count[ j ] + *alpha_ijl ); *log_mpl_node += sum_lgamma_fam - lgammafn( mb_conf_count + alpha_jl ); } } // adding remaining terms *log_mpl_node += size_mb_conf * lgammafn( alpha_jl ) - size_mb_conf * max_range_node_j * lgammafn( *alpha_ijl ); } } // End of exturn "C" BDgraph/src/copula.h0000644000176200001440000000436613621507511014016 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #ifndef copula_H #define copula_H #include "matrix.h" extern "C" { void get_mean( double Z[], double K[], double *mu_ij, double *sigma, int *i, int *j, int *n, int *p ); void get_bounds( double Z[], int R[], double *lb, double *ub, int *i, int *j, int *n ); void copula( double Z[], double K[], int R[], int not_continuous[], int *n, int *p ); void copula_dw( double Z[], double K[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *p ); void copula_dw_NA( double Z[], double K[], int Y[], double lower_bounds[], double upper_bounds[], int *n, int *p ); void get_Ds_dw( double K[], double Z[], int Y[], double lower_bounds[], double upper_bounds[], double D[], double Ds[], double S[], int *gcgm, int *n, int *p ); void get_bounds_NA( double Z[], int R[], double *lb, double *ub, int *i, int *j, int *n ); void copula_NA( double Z[], double K[], int R[], int not_continuous[], int *n, int *p ); void get_Ds( double K[], double Z[], int R[], int not_continuous[], double D[], double Ds[], double S[], int *gcgm, int *n, int *p ); void get_Ts( double Ds[], double Ts[], double inv_Ds[], double copy_Ds[], int *p ); } #endif BDgraph/src/gcgm_bd.cpp0000644000176200001440000006205013623016627014447 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" #include "rgwish.h" #include "copula.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_bdmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_bdmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, count_all_g = 0; int index_selected_edge, selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; bool this_one; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting an edge based on birth and death rates select_edge( &rates[0], &index_selected_edge, &sum_rates, &sub_qp ); selected_edge_i = index_row[ index_selected_edge ]; selected_edge_j = index_col[ index_selected_edge ]; // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating G (graph) based on selected edge selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_bdmcmc_ma_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], double p_links[], int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, multi_update_C = *multi_update; int selected_edge_i, selected_edge_j, selected_edge_ij; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); vector p_links_Cpp( pxp, 0.0 ); vector K_hat_Cpp( pxp, 0.0 ); // - - for rgwish_sigma - - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { weight_C = 1.0 / sum_rates; // K_hat_Cpp[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat_Cpp[0], &one ); #pragma omp parallel for for( i = 0; i < pxp ; i++ ) if( G[ i ] ) p_links_Cpp[ i ] += weight_C; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < pxp; i++ ) { p_links[ i ] = p_links_Cpp[ i ] / sum_weights; K_hat[ i ] = K_hat_Cpp[ i ] / sum_weights; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian copula Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_bdmcmc_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *b, int *b_star, double D[], double Ds[], int *multi_update, int *print ) { int print_c = *print, multi_update_C = *multi_update, iteration = *iter, burn_in = *burnin; int count_all_g = *counter_all_g; int counter = 0, ip, i, j, ij, one = 1, dim = *p, pxp = dim * dim; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int qp = dim * ( dim - 1 ) / 2; double Dsij, weight_C, sum_weights = 0.0, sum_rates; bool this_one; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); string string_g; vector sample_graphs_C( iteration - burn_in ); vector char_g( qp ); // char string_g[pp]; vector K121( 4 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector Dsijj( pxp ); int size_index = multi_update_C; vector index_selected_edges( multi_update_C ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of rates vector index_row( qp ); vector index_col( qp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector rates( sub_qp ); vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; Dsij = Ds[ ij ]; Dsijj[ ij ] = Dsij * Dsij / Ds[ j * dim + j ]; } // - - - STEP 2: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_bdmcmc_parallel( &rates[0], &log_ratio_g_prior[0], G, &index_row[0], &index_col[0], &sub_qp, Ds, &Dsijj[0], &sigma[0], &K[0], b, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; //for( i = 0; i < pxp; i++ ) K_hat[i] += K[i] / sum_rates; F77_NAME(daxpy)( &pxp, &weight_C, &K[0], &one, &K_hat[0], &one ); string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Updating graph based on selected edges for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 3: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); } PutRNGstate(); // - - End of main loop for birth-death MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - | #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy(sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; #pragma omp parallel for for( i = 0; i < pxp; i++ ) K_hat[ i ] /= sum_weights; } } // End of exturn "C" BDgraph/src/gm_rj.cpp0000644000176200001440000007220713623016617014167 0ustar liggesusers// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Copyright (C) 2012 - 2020 Reza Mohammadi | // | // This file is part of BDgraph package. | // | // BDgraph is free software: you can redistribute it and/or modify it under | // the terms of the GNU General Public License as published by the Free | // Software Foundation; see . | // | // Maintainer: Reza Mohammadi | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | #include "matrix.h" #include "rgwish.h" #include "copula.h" extern "C" { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Computing alpha (probability of acceptance) in RJ-MCMC algorithm // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void log_alpha_rjmcmc( double *log_alpha_ij, double log_ratio_g_prior[], int *selected_edge_i, int *selected_edge_j, int G[], double Ds[], double sigma[], double sigma21[], double sigma22[], double sigmaj12[], double sigmaj22[], double K[], double K21[], double K121[], double Kj12[], double K12xK22_inv[], double Kj12xK22_inv[], double sigma11_inv[], double sigma21xsigma11_inv[], int *b, int *p ) { int one = 1, two = 2, dim = *p, dim1 = dim + 1, p1 = dim - 1, p2 = dim - 2; double alpha = 1.0, beta = 0.0, alpha1 = -1.0, beta1 = 1.0; char transT = 'T', transN = 'N', sideL = 'L'; int ij = *selected_edge_j * dim + *selected_edge_i; int jj = *selected_edge_j * dim1; double Dsij = Ds[ ij ]; double Dsjj = Ds[ jj ]; sub_matrices1( &sigma[0], &sigmaj12[0], &sigmaj22[0], selected_edge_j, &dim ); // sigma[-j,-j] - ( sigma[-j, j] %*% sigma[j, -j] ) / sigma[j,j] // Kj22_inv <- sigmaj22 = sigmaj22 - sigmaj12 * sigmaj12 / sigmaj11 double sigmajj_inv = - 1.0 / sigma[jj]; F77_NAME(dsyr)( &sideL, &p1, &sigmajj_inv, &sigmaj12[0], &one, &sigmaj22[0], &p1 FCONE ); // For (i,j) = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_row_mins( K, &Kj12[0], selected_edge_j, &dim ); // Kj12 = K[j, -j] Kj12[ *selected_edge_i ] = 0.0; // Kj12[1,i] = 0 // Kj12xK22_inv = Kj12 %*% Kj22_inv here sigmaj22 instead of Kj22_inv F77_NAME(dsymv)( &sideL, &p1, &alpha, &sigmaj22[0], &p1, &Kj12[0], &one, &beta, &Kj12xK22_inv[0], &one FCONE ); // K022 = Kj12xK22_inv %*% t(Kj12) double K022 = F77_NAME(ddot)( &p1, &Kj12xK22_inv[0], &one, &Kj12[0], &one ); // For (i,j) = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sub_cols_mins( K, &K21[0], selected_edge_i, selected_edge_j, &dim ); // K21 = K[-e, e] sub_matrices_inv( &sigma[0], &sigma11_inv[0], &sigma21[0], &sigma22[0], selected_edge_i, selected_edge_j, &dim ); // sigma21xsigma11_inv = sigma21 %*% sigma11_inv F77_NAME(dgemm)( &transN, &transN, &p2, &two, &two, &alpha, &sigma21[0], &p2, &sigma11_inv[0], &two, &beta, &sigma21xsigma11_inv[0], &p2 FCONE FCONE ); // sigma22 = sigma22 - sigma21xsigma11_inv %*% t( sigma21 ) F77_NAME(dgemm)( &transN, &transT, &p2, &p2, &two, &alpha1, &sigma21xsigma11_inv[0], &p2, &sigma21[0], &p2, &beta1, &sigma22[0], &p2 FCONE FCONE ); // K12xK22_inv = t( K21 ) %*% K22_inv here sigam12 = K22_inv F77_NAME(dgemm)( &transT, &transN, &two, &p2, &p2, &alpha, &K21[0], &p2, &sigma22[0], &p2, &beta, &K12xK22_inv[0], &two FCONE FCONE ); // K121 = K12xK22_inv %*% K21 F77_NAME(dgemm)( &transN, &transN, &two, &two, &p2, &alpha, &K12xK22_inv[0], &two, &K21[0], &p2, &beta, &K121[0], &two FCONE FCONE ); // Finished (i,j) = 1- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | double a11 = K[*selected_edge_i * dim1] - K121[0]; double sum_diag = Dsjj * ( K022 - K121[3] ) - Dsij * ( K121[1] + K121[2] ); // nu_star = b + sum( Gf[,i] * Gf[,j] ) int nu_star = *b; for( int k = 0; k < dim; k++ ) nu_star += G[*selected_edge_i * dim + k] * G[*selected_edge_j * dim + k]; nu_star = 0.5 * nu_star; // *log_alpha_ij = 0.5 * ( log( static_cast( 2.0 ) ) + log( static_cast( Dsjj ) ) - log( static_cast( a11 ) ) ) + *log_alpha_ij = - log_ratio_g_prior[ ij ] + 0.5 * log( 2.0 * Dsjj / a11 ) + lgammafn( nu_star + 0.5 ) - lgammafn( nu_star ) - 0.5 * ( Dsij * Dsij * a11 / Dsjj + sum_diag ); if( G[ ij ] == 0 ) *log_alpha_ij = - *log_alpha_ij; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_rjmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double K_hat[], int p_links[], int *b, int *b_star, double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin; int selected_edge, selected_edge_i, selected_edge_j, ip, i, j, ij, counter; int dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double log_alpha_ij; // - - allocation for log_alpha_ij vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K21( p2x2 ); // K[-e, e] vector sigma21( p2x2 ); // sigma[-e, e] vector sigma22( ( dim - 2 ) * ( dim - 2 ) ); // sigma[-e, -e] vector sigma11_inv( 4 ); // inv( sigma[e, e] ) vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of selected edge vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: selecting edge and calculating alpha - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, G, Ds, &sigma[0], &sigma21[0], &sigma22[0], &sigmaj12[0], &sigmaj22[0], &K[0], &K21[0], &K121[0], &Kj12[0], &K12xK22_inv[0], &Kj12xK22_inv[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], b, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) { K_hat[ i ] += K[ i ]; p_links[ i ] += G[ i ]; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of main loop for reversible jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - | } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_rjmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, count_all_g = 0; int selected_edge, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int ip, i, j, ij, counter, dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double log_alpha_ij; string string_g; vector sample_graphs_C( iteration - burn_in ); bool this_one; // - - - allocation for log_alpha_ij vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K21( p2x2 ); // K[-e, e] vector sigma21( p2x2 ); // sigma[-e, e] vector sigma22( ( dim - 2 ) * ( dim - 2 ) ); // sigma[-e, -e] vector sigma11_inv( 4 ); // inv( sigma[e, e] ) vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - - - - - - - - - - - - - vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // STEP 1: selecting edge and calculating alpha // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 1: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, G, Ds, &sigma[0], &sigma21[0], &sigma22[0], &sigmaj12[0], &sigmaj22[0], &K[0], &K21[0], &K121[0], &Kj12[0], &K12xK22_inv[0], &Kj12xK22_inv[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], b, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; for( i = 0; i < pxp ; i++ ) K_hat[ i ] += K[ i ]; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian copula Graphical models // for D = I_p // it is for Bayesian model averaging // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_rjmcmc_ma( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, double K_hat[], int p_links[], int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin; int selected_edge, counter, selected_edge_i, selected_edge_j; int ip, i, j, ij, dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; double log_alpha_ij; // - - allocation for log_alpha_ij vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K21( p2x2 ); // K[-e, e] vector sigma21( p2x2 ); // sigma[-e, e] vector sigma22( ( dim - 2 ) * ( dim - 2 ) ); // sigma[-e, -e] vector sigma11_inv( 4 ); // inv( sigma[e, e] ) vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - - - - - - - - - - - vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of selected edge vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 2: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, G, Ds, &sigma[0], &sigma21[0], &sigma22[0], &sigmaj12[0], &sigmaj22[0], &K[0], &K21[0], &K121[0], &Kj12[0], &K12xK22_inv[0], &Kj12xK22_inv[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], b, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) for( i = 0; i < pxp ; i++ ) { K_hat[ i ] += K[ i ]; p_links[ i ] += G[ i ]; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - - End of main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - | } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Reversible Jump MCMC for Gaussian copula Graphical models // for D = I_p // it is for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void gcgm_rjmcmc_map( int *iter, int *burnin, int G[], double g_prior[], double Ts[], double K[], int *p, double *threshold, double Z[], int R[], int not_continuous[], int *n, int *gcgm, int all_graphs[], double all_weights[], double K_hat[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *b, int *b_star, double D[], double Ds[], int *print ) { int print_c = *print, iteration = *iter, burn_in = *burnin, count_all_g = 0; int selected_edge, counter, selected_edge_i, selected_edge_j, size_sample_graph = *size_sample_g; int ip, i, j, ij, dim = *p, pxp = dim * dim, p1 = dim - 1, p2 = dim - 2, p2x2 = p2 * 2; int qp = dim * ( dim - 1 ) / 2; bool this_one; double log_alpha_ij; string string_g; vector sample_graphs_C( iteration - burn_in ); // - - - allocation for log_alpha_ij vector K121( 4 ); vector Kj12( p1 ); // K[j, -j] vector sigmaj12( p1 ); // sigma[-j, j] vector sigmaj22( p1 * p1 ); // sigma[-j, -j] vector Kj12xK22_inv( p1 ); vector K21( p2x2 ); // K[-e, e] vector sigma21( p2x2 ); // sigma[-e, e] vector sigma22( ( dim - 2 ) * ( dim - 2 ) ); // sigma[-e, -e] vector sigma11_inv( 4 ); // inv( sigma[e, e] ) vector sigma21xsigma11_inv( p2x2 ); vector K12xK22_inv( p2x2 ); // - - for rgwish_sigma - - - - - - - - - vector sigma_start( pxp ); vector inv_C( pxp ); vector beta_star( dim ); vector sigma_i( dim ); vector sigma_start_N_i( dim ); // For dynamic memory used vector sigma_N_i( pxp ); // For dynamic memory used vector N_i( dim ); // For dynamic memory used // - - for copula - - - - - - - - - - - - vector S( pxp ); vector inv_Ds( pxp ); vector copy_Ds( pxp ); // - - - - - - - - - - -- - - - - - - - - vector char_g( qp ); // char string_g[pp]; vector sigma( pxp ); vector copyK( pxp ); memcpy( ©K[0], K, sizeof( double ) * pxp ); inverse( ©K[0], &sigma[0], &dim ); // Count size of notes vector size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { ip = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ ip + j ]; } // For finding the index of selected edge vector index_row( qp ); vector index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // - - Main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| GetRNGstate(); int print_conter = 0; for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc++ ) { if( ( i_mcmc + 1 ) % print_c == 0 ){ ++print_conter; ( print_conter != 20 ) ? Rprintf( "%i%%->", print_conter * 5 ) : Rprintf( " done" ); } // - - - STEP 1: copula - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| get_Ds( K, Z, R, not_continuous, D, Ds, &S[0], gcgm, n, &dim ); get_Ts( Ds, Ts, &inv_Ds[0], ©_Ds[0], &dim ); // - - - STEP 2: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // Randomly selecting one edge: NOTE qp = p * ( p - 1 ) / 2 selected_edge = static_cast( unif_rand() * sub_qp ); selected_edge_i = index_row[ selected_edge ]; selected_edge_j = index_col[ selected_edge ]; // - - - STEP 2: calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| log_alpha_rjmcmc( &log_alpha_ij, &log_ratio_g_prior[0], &selected_edge_i, &selected_edge_j, G, Ds, &sigma[0], &sigma21[0], &sigma22[0], &sigmaj12[0], &sigmaj22[0], &K[0], &K21[0], &K121[0], &Kj12[0], &K12xK22_inv[0], &Kj12xK22_inv[0], &sigma11_inv[0], &sigma21xsigma11_inv[0], b, &dim ); // - - - End of calculating log_alpha_ij - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Selecting an edge and updating G (graph) if( log( static_cast( unif_rand() ) ) < log_alpha_ij ) { ij = selected_edge_j * dim + selected_edge_i; G[ ij ] = 1 - G[ ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ ij ]; if( G[ ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } // - - - STEP 2: Sampling from G-Wishart for new graph - - - - - - - - - - - - - - - - - - - - - - | rgwish_sigma( G, &size_node[0], Ts, K, &sigma[0], b_star, &dim, threshold, &sigma_start[0], &inv_C[0], &beta_star[0], &sigma_i[0], sigma_start_N_i, sigma_N_i, N_i ); // - - - saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; for( i = 0; i < pxp ; i++ ) K_hat[ i ] += K[ i ]; string_g = string( char_g.begin(), char_g.end() ); this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ]++; // += all_weights[count_all_g]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| } PutRNGstate(); // - - End of main loop for Reversible Jump MCMC - - - - - - - - - - - - - - - - - - - - - - - - - | for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy(sample_graphs[ i ], qp, 0); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; } } // End of exturn "C" BDgraph/vignettes/0000755000176200001440000000000014043535231013571 5ustar liggesusersBDgraph/vignettes/vignette.Rnw0000644000176200001440000000066213524225705016117 0ustar liggesusers% \VignetteIndexEntry{An Introduction to the BDgraph Package for Bayesian Graphical Models} % \VignetteKeywords{Bayesian structure learning, Gaussian graphical models, Gaussian copula, Covariance selection, Birth-death process, G-Wishart, BDgraph} % \VignettePackage{BDgraph} \documentclass[a4paper]{article} \usepackage{hyperref} \usepackage{pdfpages} \begin{document} \includepdf[fitpaper=true,pages=-]{BDgraph.pdf} \end{document} BDgraph/vignettes/BDgraph.pdf0000644000176200001440000272713213524226427015620 0ustar liggesusers%PDF-1.5 % 106 0 obj << /Length 3378 /Filter /FlateDecode >> stream xڥr]_Gpj!>ENĉ;!5/*AZM={70Q^yswTh!R*MJZ% vouVO3ofb-~뷴G`{)M_v}`nЩNRB~\Od1Eed7x2t%$0EתPIYة os#*#IyR%RѵIa F{n/z-W{ƣ["7Pr 5|CaZQiE7f:S*w^9>8 ( H !fy7 DV&ɒ :`y*\bFVˣ eЈ˩B`$v>~~cF 4Etrf3燏66D ;۹USU7Ggia=!h`][oXpd:q'2V ۃئ1~m[;Yc `qv`;,+SIVքśXb,[rvdH*n?#HvhCQ%rZpw񋞈%D{O)ƌEr y5 1FxL&T7 dy >Y)X bFA v^L!^.[ ɡTұ<(DILqpPd%$u*VURʺP U˃< BI#5:k1;%2Xa4r3cc0e.Yeyѱы)DdDsa`[m+txDAWEӑ~%fT %AvhlH$Og92=IK&4"x-G&6B瞟/ NX'hE )l'D k0qR>/.HSK9xs62(ziQܱ9ւh^ܮ, 3¯Cqun6/dkBΠ8RƓʺ N#A.z@A*UYy2)N{kl5ETW*9C(Йf% 5%1 %|'6S U V]B䬎L}X}"@uDO36aYGqlyCǞ۔s3]&CΓY")}%AR$EnNKLl<9fE(sսQF<6%5P&eR]i[COҪ(wjdIY8ZDI\PvAxl_8UtC &1!\K+ \uDbxLèVjE@G:p59)>vQσ8 - dޏ<ͤTKwڄ Aq64G Lv5'9aQ#ς‹As Ia!sVm2:R jT!?Жx$>ȝnЄ04 aX !Fprb+ͧ*vfG&QvRH^EMZ#Χ٨F(I? gxTtw;B :;ʐQ+Tls{uT\~&|;Akhw;g:C7P NJ" :zsDi/00 qlC {J~$yxKD)_\95*) 'Uehښgq fa.aDpdђ|]b/W3[? 9NwG6ӻfso" `ů6Թ9')$ oK7vawwi{;dZ=^(̐J wMƞ =h*Kh[R"[o-jԤH3׉wR6Ւ 8=uWsh@io`{ p uM KUCߡvJӑȭƘr_}@{W$2<WYO~ vo g*.$&{u|R'#E$ uHy¸(&nF ?[Cw@ zG_Y6ߛ} gPy4?q9CQg3Tvt6l 2{mF߾y';x틷90I endstream endobj 196 0 obj << /Length 3961 /Filter /FlateDecode >> stream xڭk۶M?M3S;im7u.&x:$*Jv/@P"d<(`],KW՛g/oxJ2)UrǥW7#}x PoU4>#w/=iy^z&z-MmaȲ&`őڱSmG-nb|㵵1@͎&:jB/wGH[R'*R;UZzd>yB- :o8@Wش73um#c]f;T3Djˏ ٚ 2@tsVәfMpvKV'vP/g_+&jk)rG$nN䝀eۚ veQL.!fM l7Sj> N N6;fi4h uNcZkݥQHkw,r@;hR^#|';P5ׄR[PL.@yԖ5DeIf+XWoz`-lȆ$[.F@y%/+g%? : TǮW\*c&rᘊ^GB1yyO,a\:sB.:C>ŒG2P9A?}o<&7UI1['*UE,B6!Miù(۬ fQ eB]צ oXgT]ʱ>Py}\WK0sb\؊$ۆ$qyPlhM S$9Q# `hHQؤt8Oͱ.Ĵ%c틓XB\$ͮϰcZ%MccRuFTjzs ZrpW%O [@ƖEqY'vpg@@ӝ9x0 hU= ɗ x\,oA쇆0.Bz.xhŖ:)yv*6-J7+ԧv{^?|.S,u.uC2C[Bf1%̆wt]]_:J|4샡T } 㫃aͽ?5)Wc˲۲ ̪fyyaA3./P*=S.9yVT-ki2$P8<,nJ5Ob0,O0懯Uoқ/D1'b6(W"]'&POx`d%Ð2q uwJq]mգf˫+ˮe*G(( WWoY Z1kʩPYKlein^V 3t_ $zvU>qdp5D8]] "U<^q팳/ d@f FK_Al9dy~!%f+C"rhqV냌{ ^+ G ƒҁKަ!-kש_5ϐSxoR':p h(G3"./m6QhޣtMAP5I`̾nv,c8(^B 2tҌU[0<y˻Bƹ҇dF\K9'ϔ%鋔O6zvbT=%;qSKK_W7脰L?~ ˠұN/aY{C?t}B¥ *1V(G>WEWbaC($YP 2.^rJ%G #";)<2#\(zd끘΀i{mVE.yB@ۀ'E.x F&w 1\)"(ޛa.pztE 갴{#Z.Y._`^fT@‰ SR*nLqxʼn@<=8I:]t0ܚ]˳|B]UA8z xҳ;IZ9QǼ1VI!kƨ5SAwmUw$Ic(u lH'2f|h=v Dq ev:a\dlH-t|\MYˌ+3%+W÷\َ*7IyK U|eGi%{ i;k p|3* ^1 RJm)͐SJ~A; iedC>7,{{yI]JX,="?_2XPkwW&vmQvJ\};ܶ8US7q\rU^E ߣP~9$Lqz-=RpԔmOg_H#f-Ѭy~?1T.F 1t7f;'oB{'|EF:*UzoxIx_pouM^{"v-RT}w]pU y/: "0jͳYnT endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 814 /Length 2635 /Filter /FlateDecode >> stream xZ[o:~99(&h,@vn[I@{RK괫V0G3\HpDB +N8)  EN*aZa.+C'U NR8@-1x"X"Df!Q" HZ' I9ge;0jps.1 pw$PYaJk'/˗b}ՊemSfߵCү~R]GY7(WӻYYjW写7]{hi gwrծ.;̙^o.vcyzwUvB'ZdRtb$@*>;yve^EK~n(H&@#=mU{}ؔG91Q-˪N>E3|A6~[_?+}(nD{Kݱ{YzO{Uf[5} @Rd2qF|ic.@`}e>;JbgĮ$;d$5FcT/mVeլz՛"w{]v.-uJۮj{^<^jz_o ɇ;Ww.mWRlPuuiV8۲vwSz0Q5H9% JэEG=X<*˫)|1?Q>;` }j\GQ|@@ *>p$7F)Pd̓N9 fJG>9jveonE߷̠ >nS JaW#1̏aR*RtMaRa|GVD5$E&|&ڙA6FPN0rozh--3ip͊'\R\T]W7S1HP8ː5w }wާ髱[1K7|UL|1E*1ED80b:g#6<η021խ>?onx/$i]T$Ff12?'mzNs7RB WDy)> stream xڵZKs8Wrj# 38{w&ޚhT,)%@dٵS);$@7Я&I4xue҉"*ncLLj"N'7S4;8ې 𳇟.eFԄd?E-}ۢ [w+6v8^6py5,)Rl|ˇgӿ*Ykm/`O0f&4#u}Mƅ(Q_NW~n .!90Ey]#+fJ䏘vf9˴4ň$gd\vyFPp[ƈ6TA3oW<4۷G=2.0VqBhMKD.˵ -? <(Ck1U[M;b$QΉnk8V6{ݒOa%K" #6Ou?RURgqjUŨln?,d7P ;Ets{{{sQjދ2)7bo4ӐSXSgEEe'խ5 YQnv;&iQ6levB/_TxMdE%d`ӥ#F|/0BR|^7@4ϔӈĔ|ap& U vgJ7t H#эǧ<;n,?*!pIV~O U)e({K:m[Y0;U͌MpT1aLC @C UMEAL% EF)Av*eb2TIW^_!{`j腩$ nlt(3d/cFDȲ0 `Pa+{ ^Cƭ2nXEOP-{6qo_¼nm,[5,׷kU4H1^\;KEy uc!$稶;]:߸СN\؝(‹Ѵ5y^qf z/$ Y)]%2KUt4 X?M+J$ui, 7lj%v{lS Wף'sk۞ҫ&9v3>M]jW¨3 X'd Da:lT;uFԲmwa:t0:}FG P/ v~ܠxxXkxIaGڎc9ogPe bLSn3"ǭo ~;ޭK R( -*Y٫" nX=\vkv]k APd8a\V`^ָw2mߊm6tpTyӶd]Ygx\3ms{ׂ]Oѷ% (XIIU6~炿qՙ?ˆϢ>@iͪaAҐhSm6`V%}+!_QzѓHGݲU=CVkOZ6a;:!T7$voQ=+ gМ^}^*^ǚb#+!pH]/nx-u% :-IQ%kl^s1'"ˣIN zP,@20|)_Y,FLKiZY}~Nf endstream endobj 228 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Figure_1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 245 0 R /BBox [88.86369 306.2366 636.114 496.7093] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 246 0 R >>/Font << /TT1 247 0 R>> >> /Length 50788 /Filter /FlateDecode >> stream xˮKr_O1yhu!nn"l d1*RY`c9223232?Os>|y???.?/-uF'Gٯ??߯}nߟrcA8}ߗ<|n_||ma3wdRBBd5vDz}y^#v~! AVZE-|I__OFߝ M'Dß>!7 ]oӯ|?.~yo?O`e9]zt}]Ϸǻ]_s=t} $4tny)2^9ݟvv~ˎίyK ;Gmbw߲)wG(.4u<'V~^oŷA*uOpb`/?aO/_{Ҭޟtח\"`}o =>/1|`!d?H~2v3}g$#t3鐟_޿_G|JIJl !K-)[< sq myc,P1Lmv@.ϚDRH6d}EbvfD}f~Tb~ cb@crrU7FJĬYӒϒvFazfݥm\@k0eMbABPs~߮ Vo&)֬V˜Y?̿CFJ#)f]_Ҁ[E y1ތh[sPJ%5-f*K/ԋʤYM֌z|/-75Ca*hWRlcIMKF,\HVRH*v@߷C 5 &D\URƢGRQ"t.e Qsfj<.c"^* (i1,g+y|_ׇ'!)}!eυ-Ԝ_Tc wbP{=<+G{ԹlcH*v@DN때{߸Y2dWNBp&MjԷy<T˜Ď({ɘعw[$HvRRkIjvagJL:<\⤖ 3traaiKJґ{;,߷'')ݱr!RF1-nZ ^qAw栘 KE[R' {㮙W+]]-]E%|*TRlcM Va5Z%& ߷9<~ 7.ӈTK7#]z5簥\?Gù#湜 =\H+57][qU`Z+ԟρ9Ct,,;%57]_" ^1f|,^tcF8 ,ȡL#GR ;WbSpح9A'9 )vT7YۏeeͼS73V1=pt~jU.eXRlcHjn>Kha$^'|EK92_9@!0JrZR󓇰ySn7Ͻ%#"L.ꏤ"$KDZꜟ47^lI՘05W9{prS78M:q/W9M9ܓbYʊ%7-ܱe8אv}<៿L i"g;Sؑ,)vpv[YBZ-rbw8~}>@W배Դ%uk>$mv.5jҹeA{簒Б1Dm,IsvFayyn U&l1E E$xX]hx(Mt`ږ'-{QU*iIMMח3z-j8d6a8ze)#5$:tS}2~ 5Z/Ͻ%rlۘZd}kQÑ&]SC+q9A' )vĖ#f,bG.yNӳo;4]!KvRRHvW7^S. 3vBZ-u8\N'mP"v/ cbɟXQmb`uq=oR<'Ը,S HÝ{>ݣ8@w1.kn'"z` N\*1:=_T4wgswK ]/aW,>[z=n!awTpKsZM Pp(:954EU8vT}]q\vD1XYl~b\Cp?t\}]d 5d!w!i#VU)zux^, 'W֟LNn?_:Vg3&3}P*$ 5.- ̀z^%0ȦTRӒ%ph d]̮Sng$YՅ3.Fؓ ̐Hg=<"ʝ+ .Ǻ𠜰d@OP"i s. +%D):wFi<=FWHzr/+d C=X3]ƽa Ca`uuZL(tT"k'S"k67#: 0YP"?\0(E[ {yĩ❕8.LK fWWXs0wQN'*Zcz:`x&7jLJ+׈pt)U DߡB),',|nй0~ޜV ÑsO0 R$\K7 5OF>2p)cv3UuFRr=N{@X+/7[ݜsȈG´!]3HHb,#܌) ΚU{pףFZ:lԕIa2Xx##ړE940mhV6J Rbe*KVFd ŻgMK#A d.Ĵ۶*;rnH3JWp%JaR[-JAra-|EhA/TbR"kOi Ň/|H(b\(rd{Aԛ E혊x`ܾlH7x:)^FLxUVl/8^^P=&@3)2 ҁM 2\aܦwNa|:.Hq.zC\iR2)Hj]YY+(O[> Fؾ]*3~Kb6}-L\=p]fB\$izr4#]Y luJe))^Bl̿"V,/-y1/\o:ꆑMWqZ`D.p5nG*R$+K^FJ >-5/7[N EFB3ֱ*;B#ċ5AG^^vG1OGԩ&%dt kZF6/)lftvHPŔѱko} H=$iR)f-/#&[*+^h_+xoi i,/erCLҕ%Aą8 _2R2 „|e1)GLҕ/OO/ 7/lbу`+E7GZ{9sādk@ EKadUbUJL_m- WN²D5Ҭ,$Xi1e-~"`= 'olcbR!6͊CHVHbSװ* c R$⾌k1_߶BԝCX|mS:;]PIlF HV V`4)QǨXe7ˁ9vckyF-Y 0+ ;pF1g B{^omp e2R( 'pI,opBDĉ\S[rԭl=~~˰{;`X abu +;6Ҭn]WZJU?WoH eR.VU`E] )@'9x/q W]0A]N}WH)'`I>hIYHJi[GY RS /'9oHRHbmSY"XX딐W̅nzpboX EJ"3GLrh-'Nz|Qs oAQ+['0$++4+Q43J-ZӕXт,웴4Ҵ,$l1MK00m-<z<]=nyz" ^)k1 HVfQjxgC3p2xIIY&;o/ Gkn|+pU0yi]›.Ҽ+KDRɕ 5z8; K)!cLc43/knQ1%#6cR2)cHI14veC R E/z3+)XB'4Ҵ,$l1e,SZr@*^+D`8(e0"|r?!C{)DxH p}p62IK[{ƅt"wѩU`Q@ 0n4?BKB…|;F;>gZΟ\!bR|#g-gxF[몈;bDv$CqT9NbЍ2aZRF ED )2ԥ![*;@Ѹþ qo%A5\BTN:Tx8Ѝ q BLO1Ez,]$N/-HFf(ucp܀E ӥ''Z5z3eq5hyա]];bBuWeJzFZ;]ƶJQ-@XlQYoƼ.pu*U3p"xNd0"%-PoO$nQ|o$ɇx s R7!i!ݞeR'1ܥ5.#)1ֽhd`)?>,1 [68yXj͸4:{AXqSH2O ͪHOI Q}GvR;DVDRNKjv+Ž<E)cpSL pOUR Lݟ6^Tq!wPoμmN49ZW5#, U!_+=Z_5Z2۩8JN/RqD U]9NTwjߓuV.%ˡ</rQ 6~s^V~?Q>3o鷿?o_z+?_G%~?oJU٘y+ }Hȭ^7!z'{ Li%@?PqKi~*In1Rif#^l<,:BRс1qJv$y\Nv*oF}y)Ӹ¼ʏd-̥h!_>~:#M! i<֒=%:BjA!Y:H4:RiKV[ґq u:ڭ넡 ;Y0:v(Hi$UANQ!pL/vhBJ%;-)mBxE-ĺՕ5l@/qC29VhF!ƒwAR4(ٌBQŤA˅H9 fFR1rv1G0Ń8?,LvÐ&s7.HiK7#Zz)WK>-v0-1;آMJ3✘Î4}н"g!.%r|tSp3Z%& =ة7>eA!g.UXXXH &,Bp?ܫ|E4hA/lIy0;?K R ;ZFkf#B6!IY߰3z ;`*G'|nrHdRُ-,gK|Woh.9ԕb/B4(A3yPf KvZR{՗|181I;x՜Scl @hARIjZLSӕ%bj*HhЄ#(3 0865 zԸL#.ڏj H֗ ƾO:ԇ"T,(I1_]فj\5ljn$Kr{QHֹVlaIMKv}+1QGӢXj2ogꉓe2ơ 42&!g},/LBT쀨>$ ;װ!afG>gZ8bU*5mIԷmGa2;K$O<ĉ`*ŕAU&i1MMWi5漨ZԠ:w1#5Yj-qa8r\ 5ġ?xD7ta8+gSMQkAR SԀi2cJdBE 4A]Zj6R*l,iIA%I05),k5KPQÙ^!F+t'YHiKE׎h%e}^nz#15~!‚T3%_|=yQya=tINZlaNK6v}hFnGO;=C\",kaNKjvDixo9E 9j"LH) g$9 Q]p3Z%_/#^膢)|!?TH*n7)FWE 0FȑӔ#>2f IMN׷ixu, 3.uXXjڒ K:z%<$^vѸSX&(QFJE綠@1/nZ ^5wA l+EJ ^RMKjUL8K5)R1EGI 9h5U*iIna\^IޣRBZh *ni톷DD|cw\e1Wm׷uܽ(r! ,| SmgtIOaGLBx8;lynb EBH@\ĩalq%eKj}jsS`vE* BqiΈGu,ј ."5Y(Ԓ ĻK ɿ3qJ)ĺ#KOGJr=Yl*IRNT۷`ωFo#) #Z08c "4tL@ax9VLeDmYQ䙀GJD,;:ɷA<=#]YZuZ6uI RkkB#w E ؛ʜMzX=Fkh'FyA$JiQ0 %]G{#-yv춄j؃BC5/5l"O jzVYIGt0,{71)aIjj(65צ,bu3NM!(]ߒ$PͬLG`)ʀ6d/Plc/-lk@^Zizn8[wge ŋ,L[a3'*YS4s4;=2kc2&qS{ 6H!Se)vhV 7tDpLN`r(d$ېs0&Dzچ~r:9ٔ2 K* HwĚ.9aȺp˜8꡴HB\vG:}fҰ;b|DJݘǙ&@0ʱ1jF7.E 3xR8CsnHs-eM%lL9nPkJe@q4hCX/1Wҕ R"UFbVaLٳLv"L!B8-#T[7dqmS&slIQ*T3PPC3OsB13?@3?P2$f~)eLsz}C1RJ_TKBܼ$!YǫA1fQbY45l Ba7RRm_z aCtHv?KR3bv8 :!]&>`qװYHiM,IΪz0aY,{"HJlIGyM;Q<Ǜ/!wR*jH鵱-Ib,@52&}!.,Ia79p̐mx3ʄu\Ɯ g mT6 ƒ%)ڸybU*t/ٞ*'jL )Ke/.IήoFԐ[97O@3!ˑC(űIۅʅb KGPpfD,i\_ ⚛t,LҋKR6f7p epï&L^͗Gb9)6%;bgeL:0a $#FZU*AMֆW3n͎8>LJ/.us"2%֌˴bQj$%7Q%57KF5 OLrJs~NraJrdgշ,Ggvå8LGnq%")F{H![lI HܴV͌Btc*X s!’%)Y;KfG,@{배tIJvig|XhOrm&Řnxt(S3N"6lIƬϒW9g]8 f jfW6C2Q#'Jp5rrg[R%)Y55K>vQS}yW@S3Ԍd=%&ʦYMplƴvYީhj6RmL$5 ]_Q*jn~9ܑ431#S#R%IXґ`G ,%';xLHn yxLˬs!R%)۸kv^^5cp3BraasԓGvȎ/@U[vߑ&9E/"нfʂ_J55RE)~5tB KjfgĆCd; m:1!u^ JjfUPRJ5ܳEsnN Y lʪoQ#uOIkzS<BZ#%eW}˘-F+S,uXXj$5tmkfG`Βތ !5ctԹlcmWaG܁njSaa}3_>|L6jgar8k*=~RWL i,InD-NG?Jˁ9?HM9Tr$%7># +aMr-Q>T,.D)6/AAͮ-=K+aD5C4:1YHw²f7gkÍ.Bl4tjz-o=鉺/TgL޾'8&q˲?0C] /d6鰒C'с:~Y?JwI[P鮋D&o|7a ;oݕ8ZЕGBv/ %I^?;&vHeB m\0ÆO(*W}ow*Gȓ]0h̨pE|3=,aǺ<~SYG.`e;X(BRG,Wd^` @,]Jpdȕet!yIBR%R׭E՗!Cq Gϯ#LH@!{2T3ey#k:lQI)CZ8{$= !l[P77(O3O*ƈ^h!Ys!yb&hcRӥ\IѠ*hfiY qnn -h!f8tkJvJFάOnSN+!$#T֡40RoWģ;s#`:>.fL9=cX?5MY](9lAaTx}1U_!ZϠC".aWKN$sK퓔e'r4x#% xeէ{q+0fL2V|*<ˑEcCu凑j;V0*칂qU3/#m+;F p;cII$,x,PVo4+KxB2&c xxDȢTh$6~$GfDz8^R>x Q،cTL*E $qfnHaBpz[Uik*pz饞R,KV=Ws(2O-\k &9 {\ODRߝ-a0)zYg:PM|],`xwוz?E'p9XRX A D{)dWY tEZ85*HTa$5 Cba(=WK\Ҏ:΍ɷvU/hF'+ "  c(FNĪΈTK'ޖ4H[CtEe[VuFb4mƶHsHA)՘Fx )6k8ꚛ1uSh$sPDu_b)V&3Fōz!zßJ.&B2 5L)gfjsT1Ʀxq) 3i@ n7lA ȑ`?ňxӈg9c45z$1$[kf6Rm,9Ï̪2[֊ǜ/d=qrff5 %3:#fIkX_UQi%(Ypj])+A#Y{'FM%Lk0w'\(Y57K-cRim FA(;pIIbj`!_oJ2Vʡ.=l׀R"fcV~ b@:!["Fv1.}![.|= b feģIot\ h";Oh~Î3nʓ<\s /AI̪ΈYj, vu&FP6g](FmY 7wYF/pr0^Fo@)0Hi1'VxRPp+nZ ;zVFEDWjPBهKP%X1, ̅r \f}yqX&5bܗ^|UuKIbV]Bdk["CJ&R8"fRVr Jb~RE3sgр"UGb>'א;G (db 2"bN&KM)718&f3 ӂU4{1rK;0#<&CFJy4mAͪj 项!? \l5Xd9)wy{7xHkÛҵY|,*\")Uj.Iq}TZ2BVBe4蔷ROKRվ4-6G ߋaY[laКFT :-80„y77#7↠C="?Nnq YjwbKjniYf֬nnXkMaǦ˷Fgb57%h5܀n@8ͷFnRV?oۍsìF78V(xquk/AMזQk|IYr!@M#3TPt8!ҵmfafϻ(8[NF&gޘەՆL=pEO.`u4$nFĤ'6 !l8$PεS1En6M *nQ\W) qѠԛX,3QjFR6CҢZpW ]Lp89PjT(KIMUw0N RcjMs־1qvȶwA)UԌ$[ԔZn_OĪ*XYVVZMKjj\ݴ39W+a7zGlrw_2Q%e>K YMKjnfkQ,+">Ȑ3ZӖTL}p:Y+axm:XGØJp%; ivk[R%"vZ>OPt(-=:,,5mIN785,;dgɹ7lGYmbˋ:9h6X?mM5( qm)a; !'Tt2SԀN9|57.c6Q#J5 1;+ ncBHۈ&b]iIMMחi5ljQspaJM[RM̎J뗰հ\cfJ:7RݖT쀨i5^g6_; ;KM[RC#,PGvE8&;\WcB8>ff%5;]_"bZp~a氨RW2oq{Z%;-ى}ޫvvxܽ~yHz5TԌ$+ D.5IlREs##L)2FpRV*=/SÛar57\TBV㵀3.nNfSiIƩ/}z&d va1s⤤nMw`G~Ŏ&>X3'-Rr#D g |G5//RlcHJ^eJ^|L g>p& i '"Dbfj;03!AH1>BVܒ.bA7jOӒ]SJ%/͋:}Jǹz Kj^ZP7*+Zd0vW! \<ŽpWB]Ure$%/Y]B[!F c0:Aƒ-bܖFKJiAMLVh(q80ܢ`wLfpN.0pVǔ56̴bƗU.Z%3>n1KlLf7vr$'f^x1M<0Ȳ%3-ꆙ*\k3]y мԴ]Ui_堅Sc-j|Q=Q$2LbFRo mhc?ƬhQDEKq_Ʋ9RjMUE$Gp~B; i`- L"մ%k;`VC ;Qi-Pv}41-(x@Osځm1}!hê@"/VlaK ve5S@07nz$p|xe!e/Sy A3VmT"n0T8G^^8`K,e c/ ^B]GNӂѫNg pbg=Tax\r =xԙS,x$ᭂ]Kefkxo°eyO捣 F}1N\gqLo5GBXdPBrL Nwb ܹ C_k`@))5ubBnR~`N?'Ka'<g|V|!#H)Ѝrج4d6߆+!R ԍPa0Uw6 %Ɉ%:Fl'xaGfI{nRS=u- $@hM /e`̴Bns,/HBʗ؞ Ex6CX8r.F BUEg0 Ejyj $ۘ'Fb~$*zHW T+n~bH*MTz$٤ q Ԑ%3F19YI)^#N"YJeAJ Nu`YNۋ\_XVIzp5a`mbl;T EAΤblcX"'0)VTAT_\aM\$( $2F67Qzz$ "j.dGʄC.9j3Fdg)G -&v4rT Ƽ0_̣*( [&,97qa:2ڣKdMTD 6˧ 8"Q?K4 %wDh Z,h:A(*'(iuE⩨%4d&ex*2Ĭ'|ǡ{y}XXLʔя04s#^)pJxvF2l`=~&ZʲNRPq ##_ QlS<"Z蔘̏%J‡B|0MHXkeG@ ${ph,L?G*FRʽ$f?w7ra~̟4%%ax$E🤃00S{rt*G^V[2j5Meqw)C+<.E1fJq9WƑrMesqc+}J hnquM J4Fs ž.e=~#%-WbbZǂLv( $k)ʴlIo#_4G05l|԰ndXP3. A\ze)QH 퀆F9&%E45]Y"5uvA8~qB-02`/fFm,iIU_" L3̬LiFn vĖTx`\3rC,2C7(hɚh3 pT=RR-vZIss![; iv+IƎ<{nx_͵`Lv8HN8tp0SԀ+(5Ԁzv>]am8XVQ3ZϖT3aIA(_7IS'h"f|ScWRLSӕ%"jZE КB?$~!MM`n`vaKjjipX /Ǫf9a#]0~cYJ An3aH*v@TߴZ^qZ;vmYHXi_IN׷ '+v⍹Vq0c*C;,v촤fKvFaG?9ivqbgbg$; agtjcxD,„mqaX3.q-٘Rzs2qcY57-ɂ  "l,9rT]NM{NTo}u*?"l9`5Z 7sDu2I7 %E ɟB:}ltq/!<܏&\M*]01K-R_>IG|{ԁJh6G?k,R@ݴJ&阾p<wJa0W3X5wj9?.S>Eߡ=J\qI nN!YPyOd)*f(iA) I2#*賷2P5HS&ԈVBI4•BLG n#!K"k,I 2ZlqCt~iL9 ;JBR-7^ ҁ2FRiKR<!ڊFQQR/t7Jϩ1ohD ;;Ra[RmvJaǡS{v .қt%٥OKIWr"KrpZP9S\s HB 4~!$D)h񞙵 $KcAϒN{70}TgAM ͍ʂ:$ߔ 49fKRll14wtK!咽ԦR%E]7@%2Gr. iO?躅Ɋ5w/22 UhQ?wNUهBFQi:G08&駘@.eMM (g&q~xUDf< ̉PZ]{{Vs)|X ￳`LzFJ`Sw?Ru[b(IeddS!(gh>Ғx$J,iaט畇U9y5N! j/%G^@K.$#&^ ǸSz e[Y]*5mIA|9PH[0(:1i@RKjvkmq7Jf'0촤f'pgHVc;lض쀱3]$Wlmg#Yb,IVߣװWERDz19 h LPboW$5R.AԠ15B Cs԰H+J%5-)mIY_ jZEp5ltQ#k!’T3I;j&lq oa;aLjE;>m4Ƃ^%_bGgk郎B;l#-a +kD:Jj,iINחmΩPLpo 2SMVeOB"yFJ%;-EW2&pŬy$+[ԴRt!cSˡšpL0D}H:B$S jxXTfQg"6촤lw7|a8װc71=!'bY.!b2G<țϺƢZ-v 6&vxcS\9jJ%;-;bلmvK9I4;Yd%uki'nO: s#S\a 9 q&瀤bY1$ePݴo|jnq@naƱE!P,/UXYDb N~8j0e.ZX*ߒQYUFg/sr/ijnJ+7zNM5c6lI|Rl fZP7ZU'6y9;' "K%7-pSL(,W*"00B$$iۥtm ZX(),'TBRBw&jTLmf9W,阴,z.=<ܥg k[Gt}+1q+.ˊ9YHTu[.l5 LᘷhA=[ 9tg|&b鵱~$E ^V Ӎ0?IĢZU*I ȁF%fK?nJ34*L45]Y"F1BaFWj;Ix9ܓ@RIMKjjDpF^\OuRd)땚b';rZ+v+Lp8>\Hk5K[R!{z-vtITG#Ԝ3蔾aaiKjvm;<paX{!ڑ !NclcH*v@agv^Fv@H)N)L;#c-R #O,aښ 0qޞ.U ?9yF GG<^!Rb~.C4BbrB_ּOFMj:ʐ]@bX`w4e/S*•tWr"GSe;#KÏgOp^>#d+,cR|)3@jJmƔmXAˁcX\;-b\av*} uj~gavd>B QeND߱TT1=!9ʋrk*A'шvs[mD%nT[;!lYaAϫy׃7m-S.O-D82BK\4Uah3Yf&Lw/::$ļkS@>Hb}*[N &· Ԇ,Tb8bZ£n⸖y{ŔX! ^iCʗ44Rf++VJ -`,bjUUL$F"?eZL2%4<^x/jlL/سZ ^Ъּ4/]YBeT`6Wuz2vFK2KhUy[ xaX* nSbK\`") RnתlxϊQ^_!Q+ 8e,SӁ{)lF N~n )D+АyKRHbEJ+HVNE U)[xM ]YfhRiG$c^#R8gRd`$I^k)R)S'X@EJ+Hdޤ`5:"E^8dِ"&pxT,innEUR)1un|ܐ9 d5б$aůQeb'}3g&BXשQ HZiZZL++^RݏԂrs,i2=U$4+w5(4IaV Lk q\Gx?g  X"9L)V@TY-KaE9-8ee#Sim-ri "`*3N$)5"IK#e,|b,QbEȩJ8j+0б4+?oR(ArMJqIbg"$SXL)5+zIRX&#XQ*bjQ~--HK#m, ZB̘ƪ, ^pD9/ty z1>RFE~Qa-zzHi"1n6pו-^Z70ƅ-h)ASrd^P OTOk4YF-ehplq7k:M^x((eedWeVj񂃬ה3P6qNѤl/%9"購>i~* yb $)]$HӤDeX(5R 0d;MRRF+lvM뺯e Ȁ%2p!k8H3"MJ^197"3㫮aLU򋌼H )NBgߪ{%ҹ#ݭT[19-Sǘ 0~a:g"/w, ⁈|_3sm.!0 }aҁw R-4̎"kרٜJ*6jt s"KRU*ۙ5*󠎸 O `PD17[sN>dN9#Nq>9^Ẓ}Ә)$=#߱^WJ$"φ$_#~(>g0TE'%E%Hh`/ˣ?"Dn+8Y[FYI}etne`A/~JWzd)r YKJՄn2[c {b #'m*8Xy:3kJ3ۈG$@Hų{p)6 ToG+3o8ټ($/T1%KNhَaHԉZ%u3ICh8~eG,Jc[YRG@xHR9M+'t %C0X԰(Һ@#5Tv{<`#j/ c绐%͵9eY#sob8GI#??7~vt#IYzF/GcgNSWP6BbZ,G[ uIC|ZJFb%c>T˔h28F3UICHPUV,W.Qew tX<&h+^y9i뙈9P&,}aID3?% KgIuتj7`$M* d(&V+l* ɉ]6FnMeP7:_ _ppn.'_mWYMԟ,u$L7`w)ejtd1/d0tH*˙0<{Lw'&Br8JHI7pyҙ% d+6&gH"D7 67Ũ3M>ۈ*57CRs󊅢ƽ 3YY6&iZYNd)6fJ"KIOnٓXz8vCKgVk<Ҍ?w2)-v^YiCږf4:T鐔F+ŎWj|Ls!aZFԌY:W:.ٯ!dg [ II#k9/#Er 9oV3I 1e81_IE NytD\9!3e(.^i.XHJEv~"zlxg,.ۚ[Ԡ%4"&\2mJzC =4,^QÔ+j>Z{$Z! 8 R.)[/1ڵgAXWIዜξv"$U30bDp3?kb4;+0vsNܘQ=BTmqHJ ?!n{]G'zDv5ystTYY`5R~ij*3pRx/Ww HzIe83 E W@"-(晗!V5`[?',Ipѫ)姘* , 65LݓZVC*&Fij),j55CRSSEҡR#TjVᾴ, zKW^kon4T INwJ ;S{j&_1t[@kM.kb8x#+v1 {tBvܐ|KS蝹wٚ _zmvWgüx'v [CRS;8> 51eo;dJ#lĊ)Y 8N7`,tW{!Fem0Y(nב +v.{KQ.g"[9# r3swB鬚@N%7ucIjnF~Asn+ōy xb RA,&&7ܩ:;*0fPMb9uM@ 3U͐$ate!pcfLƼDȍ{<Q&9YTTe-v^0Q@^ cS:f~ [u-A),dW0_ {m[ﺵNd+6R57CRq'b/10eA>&hQS59CRX!BP1t0&{e9J)șVv&7[@VTUSRq2YCnbeposRW<0~[Lp.uu޷ѻO }'N3UK$ܿ7% _msp@}ewwC[]8I5*U]Vq<="dA";ICJ ˆ8(ZJ_韮lCR,.*[G㒽IX;8! ʛkJUi0*}xR2Sb^c[@y?*K:Z~%Kw(IU&h6LR1L=&dOh`D, {$ MẎYქ B!ƑN.1ÃTt2oy-*y\ WL֟;AVXERõ'=_Zęr55.z^O2&}åXt^;6 5L&`u 3mB@*GiUȉpHLjwzXK]2KI+eXrb  #\֝Jo\;@6kއ}&i*T9!_2пQ$~T%kj  uMK-? Kq!cvDݼdRl3 djT J 6+ l)􁬚d*)w]4tyexL!߼𫪃lN֛eRNdY+3PƏe+8L}زFVRM=bedP-$R VcCb@o,)JRjbE"_rM1`= /7g4^Đf#в6V8%@̅HSnbAGwۂ$, 9$FR#U3uFnA$f(% R#].! j-} rU8$1#C wbQ\;وh,&Vђ@VfR0kr=P*#η!54K IEgܧaL(v>i* {bTٹB1W#`0TPReC*f)׬xнp"RabʐTҎx&l{Z8 )WzYnTS,`4feHdgUbMa [@T;UސT%yE@l}k΍wp$<+gI +u[uX>51#"RbP )!0RvM]7SSh0#;g56&F|,;yzT,&V>13ET**[!K!lFtH 1"'Ak*jʫc>BLsJԍ~ȋ2r+ksBR"ٜ `S%fӞ$'{ լ nH!U fDILV߭74Sũ 3=cߗg]jLFvU_49ζMC1N,#R43f:0D06u\!Xpo 8d#q˖64Ф%šc `~7pʺH.A88BH*|q* yx r}"XzuƨdO$UY\"r91|R,zZ4dēҒU8Ic˪=dx1pT|u#ADd%~Yw2QƯ.u]@qh-Ƹ܎XB%#UBԵT 73h Ғv8*G jLp/tUˋ/CT_5We.mE:#IT 埬 n.…`' Rp#MSmjTvՅk2._nmPْ67&}pQ@ cw@1n;i=?,)! ģ*]:KMԖSx բPe^ vWA9&8<+=*1GA+Lߌ@by菶`YU_нv?uhdUSg.I/N1v[Lj?@Ec$cI'Yre([O BYI` oMZJPJhRve|C= РdC&L~kN*Uٞ% IXamB꿼w%ٮ >(|E'56^ZwEА#&˅% By_$qVc';kmKK;c͝GAۯ0bLoo%?|wi@$nc+Po7QnX^}hzi>ÉjWDx́gʇGG h@,rr%C]v:z1eOUDKMDwY]ܭFR}#TM-Uć`6,ŶĞb Z'gE$jm:#?,FO^Iƥ]0KFMZ W1hkdzWfXEv; K,Oj,bQ6Z! 8 "C/<+6CtZdWfgwqh$̅q 0hV5B,&y*#o3 3Y;:T$t!ϗ\d 0n&ԌnE!mEtٚ #k3+s 咞0"= l֚Ie;yA*{}o1n v1Dfh7 Xz4ES5?hM j' DsS55CRS3;͊xjt5ԌW/5l+RyrVĚ!;0isPBx܉ XT;lcv[Sg) ,އ;&;YML9fgLvdNVz8_ d0Su=I) ,w;U*")L|oq:^aҤ""1m~yBbSzhBW{<XS3$55#M+:> 1]44[J5 s:?1UF3tc\/T\4X3%;_$mv^fԄ7N^Tt~|b06!;̣||"aքZ^Ryn1MMevL3ԸJ!95"M@ k=$+ 1y%j5L|MTT6+gy`z90Z#`1#.hUՔ,&Vc-S`bd3ۼpw̿5kM2B-腰WbpXP+Y!Ͳ᪆lFV}j绝v6xBC+lZ@ԡeTM̐Tļ⠈a ͂cacxcA7@|!&I6J)ٹTȲnxz9PRbvqKŠ`8F 07dpGG> ն+,&֬]6QFnT0+-jf$D9ѫ[CLleլ$ ѹLa]Xa % tv\~ q[’YR^%6+܂F {vm7l tH*b*] sN\x8Z9fY?Mnٕ3,RTĀ)0h*U@Ylɴ |uXk:$][ :8}8:da&EJX Q *.)GV\F}ڶͅTA9 k [5+CR o8:*!Z&H*>63J*VqUBFȬ1&+N n Dک!X Ņ<p!ڙ Ӡެ8 ]ّd#K51CP3r+bn(%5NBsj-} n8$U1LQY_#uNHoY\$Ұ^6b.H+uT9&TKP's I d2Kf&f`]CRS.B1B [Jb H[ΧK!r2h~Լ0JMkCKRO3.و*CdŸ.zT~4DI&A^ة}SU{6Xr4+NL^AeT 9W:n]hȮUR2۴& !UbmF@kQF m-Y:MZѐS̼-SPMKYT(I*K1pmDAloHZ8 :,AVdQϭZ!"i3px?*hnN<5(,Z5-[Ndd%`0Ŕ)T4\VY!j\Ϟ}0UdaS~HJX$c贩*b2;MiUBߋ:nx(FFeQ!-943@/f}ԢyԈtq- +~C(iHƧڶ×qVi_0,/NŸe#O`fQ=)!@ЊCEcCn,""Q5fmbsTwލ>%)яfzP44b\19(Eed m D1\ eHCh-8ZY7 HjѫGcLIIvѪTt`jr*CFJFNU1ػQg bw1 9i^(`RPnW٦$Q '(!ȊgA) rZ rUL z %\-'VN-I#RF`H$s,&)`U@T#mV-bc*J6OYeg0z-w]'Al)#Z0@:  ¡c dBVk"!i':!p*;7 1e<CqN&Ue,c?]pU #WG|YtDNeRqeyF^y42*H2ͺagEAֺqS*A _HٺQ H92KQH#1Ҽ蒐4yՋ $k;)4MN`бIEۼx`~dty xa_NxHxT|(NȕBr@k]ۄp0?sók|HBFE0Yao巛w?7"ۿn7MTFz<9zap+IkB/G'n7Ctzc0>E1[Up5ƖwY&4~9TX%ܪ. .UfdLL }yN7fΧ͗zwˉ|iB?fc.5S;uH[h |">h76{2_Y-UaP`X{æm'  I Qoe[H'q~wۇwDz}/2U jq8`9掘(xzwiL0^ȷX|qc#_&RJ6o*`tV*wr``Y0ҁMU'Q6nc4UR IPPQA/~#`zCgM7F,9XtZ,Gec\On@ctFp@7Cyn85&yyMi%bn8Dz6FW},}pҎi^=joӯaգ?lm}Ḍ],-L]U̪-~kA KF0))|uUL[WWY4cHO;;kҙTK҃B>f)L?6õ3ewL1:t߿9`戙hcU\?k̅-K\Zzjwal[TXyc>1<__"Ћ1L^#} :ڔ_pKߝtUr;%_Ro.*v,(u-YU*N:^tGy_3v_t9"^^QJɣ@^* Zݫב:UKj^4taI֓G̃M93cŗvLǵY(&q5c=@۞veZ֜ydshPڥiH+pz>],`t板oQd"`Kd,Ӽ/flg_0ej\_qk{Y9bE`G}"FZv죿17(D Kw~c^w``ݷ7 *e4V *5@cS/Vwm=Իͻ_}iՄTPU_8&UɣeI_i%<7 8&k3 (l,btrs>43[jLm"U.^#7xw`7yq͵?͟qta+Č{lqvc se]^ ;q,¸ȭ^J иG%lls뉥2 %BOٸK Bզ[Ή;Αvm3o窱C鸞4-np޷/ Iewod dL+p t f t{XU!rUt:X9ٛ*|0TDTj.$ ﹗*F`Q2eε:8F4V3c~Gu]CZ>6Ja3 l1a6KchI:ckB-c Ns&]s.=+lm\͓{*񅳛2gCJwj"0&"MX?p3Wxxl)f| ckeUM#:`NU2,ݾtƽұd>bl 10>}[Ye ٸ() 8+s7ŒhZ8' 5F9Um=*>Xml hʥA%Q?8bDS[@'Gj㵔0A `*7O۹"4S Lya$Dv J8`WH,QaFA[/Aae2 ߨލqm40cuuAg'?w̑b`t6e]HFL3F׌8l Vn\˥׵6%Vpƌga[Ĩu=@_np:A10c\F֭wI.G zOGnȱ>&+ɤlfAViDui nBL;&; 3*sLZ06"'fcqC7S,ޑt1 9NgS 7Lg8` FFqI >[phyd^ce@p8bD%mȕ&XN(qpN:ґŇx ce,k`"Dgfӱ`н%s2*HüGJхy0Ʌ Kp09 3D^NٜJx'x)4\'3S3btnq/JlՑ(.5fU"*Gu&XL#3IRaV1!I#6e0%eե XfutX>b_Elr` 0HQu-CUa jB[eԗN ~Cg9ls859ViRje+*2*Vf]`TaӖa'&)ǰL3Ѵ"ZZ'|dr-݉kw yM,]hmeΞ*QvJ7ANoFw:Hv *q[F齶YP6!+t_.%j5~PiI̷842f_LtF=!>tb1bŷl,kg^NSqSq0Z=S##&R$]%{U{w |,A%u1 $9Nv A1 '%-, mt [#2Bh녰wFl m!֩| <%H(e?3JQAlV"( }2C=-)mZR{kKuHT8+Dvʯxɧ/2O#\B"vJ#rK+XqFFhAYQWNc]1:U^Kx_Zqhb#tO QkWr~AHaEeH(0[_RMrC8R]:H |+[@\T5 Mw?hSJJ >E4՝QJ|"n,9%w-cE&yX @QyN?[2>ڕkb5fd;x1"ĴʷT* F2ðQ]\0T2"?؍Y2\x]"A<  Q?7j9X3%/II\b>˹ O'~΍\`iϟYZk{.-?9^\{tuLgn|\gTfOȴLPZwo bcU|_P߹|mj W >4(p&sfݚ6 ~TM?n- m6+h)rͧ5/7lqlzTDNgiN'+OlSOt}DYnٸf2-?YT~*Rڿ*% +5OEua6}}4+#?!Ram&퀥+av\1UrwvtηFT;/t3m_\-<3FU먨'wN1[ jj̧ \#r GTEX!0ˮD,`THn,VY|Ҩ͖hXǏKpYx Xo`.wĹ+P+so׳~bC=0h&5 \q'S /)e&ۖ[ 1< Q5>x[MU UY+{P!1 莏 S5i[*s]ɒ4$ZB{K,A{ c[i~8GZ5l[]T!G qH*vR/+Z&Tt>r Y&гqZ/U:0*cw[eĮӘZ[+OILST[MkJ_Q5vB0[vbIJǖ3%cbF|c5dmDQU>"]Ǫ! W:箵Q:"a`h~<6Ue^?)3_JOޓhR]@^NU͌ʯ~ c&k袿ɜ4i`ex.@ ѷ\(]NmxFz\yyBq1=6KM8.6p-,y*%-8ҨϺ0@'#52Zw2lE'/҂i(W׷qcLn0m})8X[u3mfe`R+gq8ϱ% VGFTlCc8p\0{zhn~q I" "valu93e `'ȳBlG1ȞfuyStY7stƧia6Him:m AH_!ӄ5,8B\n@:qdo#GrvYP0 qF}0:ݶa# cq^$0!D .R]AL/lR-wEȁ~jֵ"Y6=8q:SڒMۑlqÁt4MNՠ ҂=+smt#v^4boN+͑\0eUpQDͷp}hm\DKQu1 l޼-ZԻTaϭ%XF7߸ `m 7?e(ϕ߬YK?)R>V pLϵkT?g,cr. l@]7Ai[Fx4l(.ӯsù&6 +W{0܎o.yFGI;Yx`kcE endstream endobj 253 0 obj << /Length 255 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 256 0 obj << /Length 257 0 R /Length1 35792 /Filter /FlateDecode >> stream xԽy|T7~ιw$e&3wld&$dB 7$a H-#ap+I@FuAoUZeVmU[ mu-ϝ>{ W_JdDYy^;Wn NBt]sU칁5W^:WOryKʕYukQ+ګ6\+HG\r]ByU˯x?-ז_ui'[a,#҉[_y@ rѦ~PJFF$ 0? ʼ]ö_d3W B—y#50vDV jހt6X"g6瘤!@tPljv 'H!|@!DB\B/YMvTjeiRMKJ߳gI1 ذ˧nxڴL]}.XQ+~'#%TVj 6JI'F}Ѣ/ ?Cdz{5c9 Ap`>4">pH O Ć8@kns!N C؎ b A<.'a{pq"&ܭO -@; } e(??4Q .HGP}&ҝ@Pj]FH"݃=X{P"pp:Hīr)vmp(Ѧ}noN,&,&&&" ܐS!܀>7 sV%)cb AF>x(@nFCD|=>A&ea12 B/QXk}׳Y\T9qR̀ }ZPjܤQ:lˋ-ζ#JH3nGCٲ2Rl$D,̩ZO5.WC,Y<,SB>?pczV",Z&-(45m6bxyt48ˆpcsp7@26( 7|,~>=lvtG1"Q>t 'I#!}bFq!a=1ҡ޿R+և˯["j.ߊ+l^>Xl5$xߕ$HLq&|%3r7 Z Fhp I1 4B:#$ IDDAHLMԦBj܈hN<8چ owq/p;yh88Z>GK#"gЗу=kߋ"hVh>Y|0p0U"4wO ihV2lӨVEGPx2(eìJnnnBd]B' u~]ޡVYoZgzW\\תRdQK Jsp''hNLLe}ν~ m#4˫ne-[[ѕ}|>apIF!M&T{zz"Q+{Z_<_dfkߙy+S3®̌ŝX[z]u]绑0E7m n$LOZN/Ye`?'$>+!0ۗf&Ԧ>f&X +GչwR &ͻh͇hRCQ(e?-\:]H[OR̶k=woyzV\f~5**]ߚWֽdeۂν+K[+"[=+z]-z{W;o~II]M{dZW 6|񅺦ީ*rLy;,-S+cLX8T4W4&`'o60}zIB=2ĉ֯_#p5oDHߞ~Lc-vQkWOZ:7ٺ͍w4i\}u/ eu=a-oҸ#װp5n Fj fzGȽ.~u9LVBڥ+HBa>܄nBh\؅'"z_~չt\vA.ml}lMao 14BP>c濮d}b x>Ƒ|7сQV]^'~`)!HI_o;pď7k0Ю|dpٳ+Hdq!7%hy? QCf7b%ҟb5#0O'n!wŤ|@Ckn' -d&+J(q;(=B>^2?;Nї7J%+SdML+dr#7\ypqꦣc?K/œInÈ(Z4;LrYɻ4V J8;- j"gq8dYF a5&' h-} ;[;\G0'qU ad!ڶ]x>r.:J($ǛYg,)#C4M b@ܠ3\EM_`úFEp}m.>cCv'%dHN]}BF0z)Ns*{ֶL|<{vizSЋGG]e!ʏSbFm\\,&kj߅>M^%S'-۸s6z~'"ljn?> lON3XRPJ/1!_ jfa%&#D/,-/ٛZTNRdg5 W?Hɷ/wwGKuk>;@hc o Pw U:=_,ձ&¦5\mVB(LAJbVSkf)Ou%=9V65q2^0t9({-##݂Q>܅@A/uj4cך \z!%t-t~Dow{m.=9zׯ1'1;3c,Ҙi 汋pap~;ݣP{Vu@\A.b>=оIkk1Gl bZ@RKjzJ{tPL"0KXGhXj`ʹdn{vYt#Z"IchDxCX4Mt MͣQ "Y9M?gmSLiΐ˰\ne[!>P#te4 ;F$#^t2St3c2B'rDѷ#cEI;)PxA{Ts\GaŠim&C?=ؚw4g "؃OIp\Vo#I!;@WdzIPc ~baex@o!_20kv wUo4"QP[r xXe{L,ǨeP>Du+)ed<x!/{9fxxeI MmdYpgݘ&ud-hm3{G1!>?U< ){{װ lP_n3QR3~ۛ.C#f^ ٥Ӏ f`w%1R ^A2mi Iud<^VZR\F!9( +?alVd4uZ(@.oL3E=(2sf/Gb*z22OF-GWz*Tr==$7Ɗr-"gFNhtəj~RC! yֶ#eo\;ZQN-Kdф ;һR5m {[0LA-V"{RQWu61[KkSsjwkR>,( ytF0z]ZOWc뢸+ qY3(5^iF"g9WkOhcg7r(9h0 㙲2 (8U-VoaH$#H:˻XPo@!3pag,a$e2zŹ k9{Op<gF_tMr嵭mP\{H;t0mgf|k uCDnĂgXF]eM]31fZ:xQߋ{/tĘVU#:=X33wC i${ߥ&_61LC|bV9f&N}AWڦ N{dVDd)2xH:{@r?=͗~{67BopBo_m :e-=ӺzUW#;-צ3dB%_CS$B9|&&Ac"i0l#3y*2]Zד9;,d "t lDjG:E&vmoÂB[>C0-1ڈޅTQՈAMh;V jHLjj)Jlj^ӼziNl?n,^HpB'a20(J15ťȗA)GӏK_Bm wyZ(dGvM 'SU?]55yM?2l{Q:s]=O?X\GI+*'ګggkRj0Ƕvu^Fg/f/ 8^/gPk5/0AK^A/!yXƹc y,dQHYEC@-nE#4(O٭vf|`'@W'hxR@KKO56JxɦU]i7uZLrj̙0v}V~ fo_N:ٯ~:~߫o|!cX!DK2L1<#;(' hw^r8%sԦ+Yn~ܐͪwoӯ>W|_M ?aRźܯ{+(щM $6؜ASp2ؖ٘6;} s‘v;]aHQQ$FEj3_5}sW5M[}|wyx{GŐoh~ٚ6ܙ=AAb7'$(֠4.3=f|u|]q>dL}G}$ո2i5k+dzs#a!3ksfN`Gpq$f`f&Ot8VbM6ۆl;m>̢`/VqtƦF;_4YY@_2i`+~3tI.7yڸElz RBJF UMv/;{V(y|xO{*]qT3~&F{Wz5ks`TTm t!b6 Ţќn6ZZZ_zRoiԑm6l\WLPp"b8Q1?+{=N˘yb U`?Lsa(F%EwFS,=~sJKy,[s7Hݝ}؟'Z2(2Dm8 ECĬEEFyM+h\T  \j0~݈vy|T uqHՆ&Ȕ窩VGC {o~|ÛzdD[`+[} yގ7Pd_3J5.UE@ڭV;D_KYl&<}(}_ҿ (7},|Ha 7X>L;>5$K?lvbbg|]duFŬl z?e ]V>’h`}Xea=eOW -)NJ\RqFiq2Pm|lo{tJ3"mzQ׈{u;.iQ7n9DLL?.O^1pf*}?BIwt)}y.ywy 5X*_F-,:GbzII.!K[m5SN;ņ}5u hO?:ݩ%THU+DTk5]vb:1JcjIpj}WULVVEgN]"RB$0аA_, +J Q˄;0CwktrѰz4=]Orv}z_o`Ct}u%7ko^3F'D]z[gDAyIm<¥5Be*-q]CP-P&x29ŋZ9H֗WjSdqQybO"G/X6/-,7CEl m[hyh hadO IŻywP|lӅtw9Ԟ8qR d.7'RO |^j1)*ЄFE5BVžT֐Xa{`xn>Oiڈn uD Tlp^sq "g4pNcc , ְOƮ-Ku/^ձ^>]|˥"•<羾1N͹_ufkݵ@L56(e4C A,!$ K Dj*mQx#6EEz{0ɭ#r1IGn|&-mx߸6z{ M?{{×_`\1^oP? %9EBTPL>Sҽү%Fic遼^/|K{€s-X^PXYBw,Z-[PqI8F;q1+qqjSrFvFGHȭb[Fn(f بU+~{qq TsuS@tzSlE\D}yE疟K",!N@+EQc@ D)?|WfiO-YZ/\Y. ^|kNIrX X8y J䑼LSzzzה yOkHl4m1 ʂ޺DpiN}A;IпO~]iz%債$l`I_@]׀k lw8`|6;! p`NWoK1;(X@O)Eo/U :o$]uN$FLQJ$}XКAm!d*%.n "IN&bm5Ŭqq@qJ G#P73SڐuڵR`QIG }q|lK}h9|x/(_|t|l >򽿾<>zoQ޶)TT]5|js?ls\{FGE#R#ٳgS*-J塃ǫhXݻ"쇰+`jpA9!P 3 i F+J*8jDX\<~|*)}3v8: 1oƣ~Y3 P- }P$U"AߔP+F}SL1ya0poxghxXaR 1:Cgmpm|ztzs)B9,$Edc.W┋{*΁ K ~ 6Zr[ubmi)1V},. h(%'+|%ux[b1G 9 I߮ߡߣ׼?=#ُ|pz/G=tվp)D9za友>T3 daO&s,&Ra*X d %˽(qkWo{N~ iIrW W}%*C Ax65OzɄr z0%%RDeXC;ChhxHzTՔGX$ls "'a@;+Vs(7s n™chw~Ǣ/!tJsxiH'=NRuQ;D9~ U;rmf*L;u$KP\?'@b1|#16\q}&^}v`Y,KJ cg~#ųl;'Ulcp1,-a긥ȫ¬StW+O+z=7 -[=WBE67ۣ7?E`OFTTN |is@jlH^0Π XFXA8ݎ(<N2Jw鸌Ip C0m߳SU4h zj̙(ՒОaRU RzUӫW>r˩V:U|v!IAH&A皾{o4{ܼG” d/j ֳŊqo9x6fGb"Nx5yt3Fth]}]yy,i56L,m`o7Uiefۖ5RcIYj k S\,-)e*kd Lδ,[`ZdY,-*]m.|5Z_k.N]\{qݒIVd*3J#&ariџ5ăɧ%?,{->p!}7a OKCU~_Ạ/8\QIy/f5n.E5F8EI)"ULd@A#dgkc?f`\@\>QI_keRTf*o J2Y9Z)V@4n`Ge>aMX:5TŒ_VN;y9ZuSg  5kB4.\CLxTVCmҲ>0U:gSaie2.vw@?WAZM[ZL5\.H%G.ø gz8(X̋ESҜ-9xm/LNT-Py N]/hj=S.ú!ې!PHss{xq YZ]LY/5^brjPI_ȡXNfY51mD_,qiHH%C=֚C?dU\: ϪQ>h-꫐ɺsJ>PYt|ieNzcZFrmF@Nk8?']ku%>L:g3<g/E/q@tnghrЍԣi#Js!s`86őÃRZKs0/m,쵩" AKP!j9R-bPj5ߟ-/ŒwTVvI}%>*P mfN7;#*՗@o(5QI|SYr6Ac >]eLo2q1bƷָxKȜVQר}k:5UTr.p <2+<Ԭ؎&H-%;fGtJPBIq!hGԪ+[G@[\g0:ꐃ遦 #D6Jj iI4hhikh$<gfնOji5eiƛM\,شkH"<`LуĔƴFZaf  Fhn`RSzggGHx6 8٨42LVbF]4UVЊͩ,v@yj!4cN@$)!PŧǠik:4'r?,)NofNG4yրS0֚2#i82Yz}J)/5A_ʸљǾluQ{yyKU5[W թECi[_irX_ݴ[ޓ |==! v_0o= a 5f1rȜU oj92qO{>~|' Pjz?ؠ)9k@Z QGx{MNAF =C/ο0 -_UfsQ `Gyq~yTD}5E-:jaxE|Rح}~9/qs0# j4G3٣4艚͒k28HْDvrԢk^n>SG1Ψ#oӪ%^Y0d! OٯG)(d5pb`>{+n͈ܥB-nk dWOU&`N;~m;v-U\^#jkK44=@􎕌'/e~ˇ204#D?֋`_1<@ P/0,j` g y (U8z%IPsR"E"|ܖ[ · @h6j@hU||1LwR< "=FO!I{"׏u?~?X>M=Z6۱ر-M2}2Bި'=#! rNTsS!Khu1(2?v :LhgH}'(f_p}pw!q_pBlN I@ h$) rqt#x(}CrP ChsBc0;M[_U>9`7E"SWM+.{Z-J97W<ęk1 ߂ok[X /zN&ȅ.`Li'YOjoKQ5{"]5JA']Rb²O 198(W+G0^F929uw$Vo!U { YaЄǘ\* sC#RPm6ČS3YNT}K9mRjG9qN.>OpIzƌTL GO͠8ؓM@_Y_Oda\d|@|lgB78gLa@ \Q'_"6^)_' ;gttyfG YXj [2NuՂ崼<(2ム5pq AIicJږʖ9)cɣGKT2YPű"}L"]Ler0r}UƉwD8!E6M@t~gĪ&V`ZIP܇ ^vT<0xObvY ~hi;z2o<DZA2@r>*X'|4:CY| rȽQ%j=wD]wDxzW05E̓g1[=-+LWYxMk+0BTcH9F!=o 쇘O!+ZfA"x)z~Yeʧ:.q- Z<5YڭvtKl@[]{i!}/fCOltt:L0p<Ofylaݚ`'#1_T:SvܔI'I ϑv,snvp~d p8,*3Jb/Q]%E׹6C>?I%qzrL/H8FLqgNlpHZǓ@U GbZZ[- Tc}\lqS0G@PZ?\^焬},ziK~-unI䇈o3Ef"mAp Wyiİ/W&J\ɘk3%jH;a2Ke:F`mJ wM$ |I)5SVu+yQlƽ[a⇗\^fNOHܙf<'P]p0c$i(|oC:bQuqرjŋL ׵/nh  *U%hUʊ2|YkdmMtT d Ņ >tM&sf˴}vmZdSF? q/P&m|Q{U)9{0o;\f8S}X)FkqTu^ءk=gU-DWUgמʘEsFd`\\'J(.XrdM=/ǭEſ^ʮP).nꖥiꜽ51gE[ɆU?ؿ&wwFvft]։`齨o]<4`U0r ۲GOnǒigo%S7L\".#? IױRGaW2ڍz.I=Q^G^0IK=GxΣc>ZLB f0>#TϨUs29CSoPWGH  jUBm)܂_rBWu~תWT'Ρ3;S@kZ5Sx(بZ.U8aeP&I4 !g9Zݐ#9g**'M0IlH!ExX& @SJY2-f+3G노v*zOi>"pEixvXfGBTFj+SV*u`ivdz!#ka|(9UP2XQS[!T ULǪ8Z!VLz7_vpK=]`v9?F]\$Wr U:nPa@ >*'֩V2gJ1ulחg5&N([Uv7L{lgJom3/,#-..]H_RF)9ɝ[/&fVC$ FPqaQRȐz /*-G ȼ"2??`N(>2P{q,;no<2WEBB=RQ]86j< ~[z?'Thf@cEVq \Egs;iv ;@ >W hĢ⃅qgd>WרD#q@?t ޡ(F;9e qVWԴ!V$si$J ɛ@bo!L%MHجsp;*Xb'Ҳɓ'[1M,ٗfO'lp55G#I_&;6e^nJOLcrQ" sJ EYHb۟$,ˆ4j, 4dY ̅5/,KZ`_ L0%@g``,݀bM:¢IJȜRXXYBp%Pι!cJ6p8ldH]q6P׊fʓ̗)I)d"XlFI'*sQs5G=4ܡ i;fNi?@i9D`*w7k44ߨBHl UDm` 깒 z$Ο(q_\ 9G'%8OquNƾshYzY,ٖdGN4Đ8& RbxRڞ{ۻ-[sI0iYn6%g/m[NO.Y;#'ܳ|fF=3@ウA‹'LvG#bm-m%lt!z)joTk]PseEOzEN;}:ŤcS'+&r zpm~Zce}l=u?䶹OFS:&j:üϟkvx=/Z͛i](z}OW$ϬaRE콈a}[D'0QQ?i#oG{ ~?7n(QHQ9 sF ZYS0O4#%x ӁN &Ex"}6A'k0AiMs9\0ϡ1xz7i/Gq=Vn M_mܠclG-b PE&Kg}Pi 0mVw|?6.V8asls< SJ05<[)t}' ww7x{ADHk/^9Ctwmda-*+^b(zQw]2 _ Dz1 (;>s\_LF=)Nx @3m5Rqph$[}0[v9Vc:3D4+ݫi."0b];ȦO /2c8;2gFgGEa7*b\χ"ѩ]YGb'x 9S< juܹikބ?ϊUp~xm3VNtzs{\@A㣴0(r>jJ59\5蹻]ټt#ܰ*2=#Z7t-=j楕~۸J{|o<>҃ܳ/c fA+݂}}F<5G1qv=FBī%>JJ$C"B2lQ"I@@HG"89"֤۝Eh@P>qm`&̾LN{72\~}#e7<8b? &)QZ.``o+Z9ZYY 6i98W3jrDݼoeDH4OVV&u/Pzf­Y",b#/y҅tq9@=>-X]Q]PmXC>x8r0vCD\;;|f 򗗾2`Qڅ2lDvR66h%{_9#w=7}^ꧾn}/?|Sp:aiൂ;ۼV\ɑr7Y`̥xvPtK1epP@U71Ư閮Rk A L..E4hkQdЁh`ςc-W.@/O`rw6edB.<}$q8EՋq /AdKK&~\^IIoVS~eZ|k#R-NOʝXɪ¬R ¸*dBzK!).2`KyR,N3q"/]DӨ%"H@)eKO eE(8\zJ/u0@ Ն#yw7pYSͺ&"m{a#S~gqmlqJu|.v "lV~ Vvw" p>YX#ȮnH1kZ5}Mvn;C ^IϦR)賺(> "-p.' 89]cSڴ&j`b$9H5}US- y5=jmnǚ$ۛ|r;|׀ymWZ&y  ~-3t/MN"*7rNYVb P1\2ڱЄ{W6vq6]ٕiG!"LLg^̛ٷʮ@-?6٬+Pt7v.>\~˛ԗ^,U"f^(^f%՗I-17՗N3:^\V7$B݇b~@S~ԁ! AUb<;3r{.ԅJEa; u͉s9=Ym6>t3s=n1p9u|O>SMҌ6KW. )b.v܄`r]e× :XE8 -qc`m94υbP:1ʃD,e=@tS .1XPL:6ƳDM2<ʋH!r %pˠpFyhFڠ8?tۺzj_QO:q?\zW;n۶d;n{@ q[xfL cO7to̞({u~4,)~,(8іƤ#ǯ ɴH2\y(j$b&S]@xM&$)svr6<*}tsssqfn {z?ř Qj x"xTo)h;]c6uoB}14> ](hw/v9yΖF,FYح*ڝ:@p#SN@66lCH6!mѹF^I_v焯K_u~Ey^~W{)Z}؟9'꟪m&5 |`n3sau1< N NTX}!s Q2P2(I'SS:)5-@T09f0z-3fj^~Uɇqn}ghGsةԨS~J 'mO7h!8.fߛuNi(J&I}Hlh7U{Ej z_Q +󏳾YG<- /b^+7 9ؔt)XsIz13odeDPxG~BR=XzHWo\.gzgET\hSO6P9%eݶDwX=o:R*2}"&Гۉ>!F?X+ccc]GYeͩTse݀rwt U]J+fwhko]rc~ksڮnύ tqc7Z|kS|_)|)\ꐌ]cCx,"ED'JBCH4+!V! Ѣoxj5}c1f^oD 5_A\XoHĝ8ɈcQsz- 1< ְ96rF# 5wVssBNuc]w4wS%0~3+{Ʉk_+{O*Y0%J;h/B N6*L:%X%g9zVb Xr!xnv๑ p5$=ctǃFˁ$KcorHU43o {hK-.2<~)@_8-b gAPu^F-Ņ1"AmҼ ǟT l CC>C9,:'o踧c9 : 7L=n"EHl`_2nvQ_P7xY4X~Zp(] }|ز,ume ݫ#J07t^Eh$]/3 y6З?|~ۆX4욞ײomhy{p":|m>K6FglJ=fsp_ϋd?HS6g)rO:KB"A+!yB5Aזe3ڸf_ 2/ ++ Ayهѿ$LE1XD[v$UҜwfY֭`">pnyڞ凥C!!/_p~^si@JnsFC|m囗tUz(J\햺ni%LvLʴp\dxqjPHã5dďW% 8O˿Cp˹Źiq5)vY*eVRvG7r6ЋtRa_;tA 8@ls=#!Hײ +J)y=H}>;I!uXw+T>5p#f\^zQIh <\H.?N4.O)w"9Tq0s,aQ H֘u:>g=muE'z70&Thۭ(Sm;Y"zmn1bzn=ʽW BHۺ8}pάo=/']V)Z!jqVQ]:d݈_(+/1U\m-2U^B|GF[-@g+Ƌj$7 Np* >/S "X-# ",>C|mۛ pa=p؟9 )oŊ'= ^e#󑦵+Dћ:>0Σ~/&|zpy 80KnE0tx\.N-zǪ`e_d7[oZ]~5SB 3?eي>[G5S]etGk/!T m(gdMyg9CQ+Sm̑]<^ڃ,E1 mɺFx}nnxʁ ? ;vʑ +nȓ{+3rCw{ݶ,m80fm?n<7' LaNgtƲUy§RꏫoUxF?}"jYwY9YO_ch)=)m,$lSw]$eè5yMaf ll.DWxQgǨRHԏ9fKg71IҪR;}+sʌ#IKQ iI'ҘYf $_ apZQZ@G Ճflb&൘s=܄9G0+Lpp)oL;1魘zRx3~Qt€?;RYM薭m>z7-~􎏍m&SW endstream endobj 281 0 obj << /Length 3681 /Filter /FlateDecode >> stream x[YsF~ׯ#Te+[gegGJ(<9H9-$suϘO>xu}QNg ovRIUVQz>З^hL:I)a ꯗX~{ugUuÚJA/.Zˍ_]e*؀&7<.u.eU,M.˩Rlw,W-®~{؆=:km? QJ3/=^NҮp);q?{$;J8P܋x1PcjTPNV >$PWWK Zvġv[UAƂ#feMxG5N|QRHT{! ;lLm H)r u{̮uKUޣӺD*oBvB1_oI[<)9u_9an ǨLeEvGcgLHO^JD@ieUdX]4VxD]>}>k|)8 ~qX y`6^> lɚ3m{k{@`6mB;zͨ~_QĠDǪpGjlhVGrHv!pb\=7ـL6aسL49=1R UTTe΂(mL0}gA.8שB#l5X7NJ[>6F=;;Pky,v8K2CIb`+Dwm~+㓓Q41\0I)s,A]PY[qOSU08AzűpgY>gMD\pT5qVfhN[7pIH~ĖfҹJ֔MK\~<"(MyqH|&)!!:L~.|R}p"L[8qyuX⭇p p#~KP2&].N^6N{3um6 y%n҂P9'臍wN#Ѫ2QA=g#v#: Wjvyv~\JQK6}jIdA^ot޻yL]naNm%vşJT [,^4faByIi@ʪgpҧSlSFg*ӜU!+ OC"~"myg-^?rG`߸mbMYHGƁ(pcFEĝ5A}V=20@GUε̸K&U0~Xly9xxU\f4?'h#T!=ǁ c b[6zf *td$S4@O(۶vtxfQMZ+9GWr^"Yx&Ⱥu |:LZ-#F$<, wHS/".hKTC̲ {wa/k8o69%ǖȳKPHc<"0-QSd8n8PacO sհM@SN4 Ew,~]wBزp^c2⑝C)a' D.e+Wd xm '2G3)^BS|\1E{vˍ҆Kՠ%BՑ;ٰK)fnye!r;x-Q:^OW/^pl]4\d,pʐz6Nͤ!C?{=ePˆ6}uL/%RLpL#eT~="*\eYܗOfixv)a靑3"k߻ @C&1ֹЕ/ÂA =8S.˽K/hc H#j=A<ԚU ݇׬Te"Lu35|:zؖ8#l6T)"֬='8lGk#p!PcEe{p$d><Zc/Le;WWQa6Eʌe\X2=;JK&m󘽁 ~)^<t^:j2:BÚN "l[(7  o`vY>$P&e=Uv(oɋRQ6Z|'5iXo|0L* +#V7?nWPa&H;Ӕxό2@Uxד\[. ߻&Y!mꉂ-4 YyѰ6dx?@7U)Г6W!9C~hǓb/l!_w"m!p> stream xr6_Gzb rLi63w3ӴLJtq%I{.Pi`$sd1)&W___|̔QMш|"ȅ2SQv:Rd .J9gK;ge׳-B=ywOl&+械KL*bww?F'e6PaojF!ȗ +AJxɂ`'&@Sfl`?Vl9BLBTTy%4}BdW u66ǒxЮ|JTVY |1,Ծ^ÿ"ꘗ8ps)MW\YvYrG3열hZxV&HhR[B⛪:hMҏ KYg[/n-YvD=pY+F`YT) 7 rru#cTQ^+ޤ05~V(0QpxߧDp`T t~2dTE.u3&li,y=1;'ƪʖsdkZ NNUh%[O|9I <7ĝmO4m"TyMdE)aiUby<j^]󈿕=J>A^5U)Gzܕ ;xϒ2t^w'I oF8O0_Qal$S<i_Sy2Kx%FFU(Uنkí+nʃ ׶f9rGڱ'[P* J9Uzu5VS)lKG- TS{>d:x!3=[У5ѺTMn*ڮnm9'ӓmSw$xc:Uv}gN60)1\[tyJٷ]N@?<סOK8I̦KAq])z\A a:0r w|l[Gʭ\c{x#UP{vW/ɼ]-G9FX-&x"+Ȓa׺ڱ^mBByC!!ȝs63gwp 4&ǿi%Ia ujzoֺ>C3c #u6w>;,ݝbm$ ceZt0-Hz\lnw{r͐GUҥ,}?"Ƭzᫎxn7Mb *L H- Yt)dQ$ X 0` %S돔Z2m!mkߓ=-mhOqt8gBcmmT:m/W}E;:_#kׄ} vF=LrR֐UO(dn$TEYA9jih1~r0jWM^>xggYްŲ1lmZ j  N8|}oLf:L`D_ץf K~/dG|rTڅɰ;3`3|q%r@8{@;Po騛Gxa.[ڦZSZ=BQj_:,Ra\f6d^sp-لh\|AO ,@rTlSu^~dl#%I-&&5LRC.\=aX!y~ W#ֲhH3Fbݪ( Si$(Co8d ~GU M_RZJc2J!P"Bix/2Ƙoɼve逴1 :]쮑FUJwP71\2@ѫi@ɑH̢/nj/O8~Cc&P7iܕ֏!Tf>8iO6pV;7ZTX em:Rvs\g,)Y|Ke)j>^պBjwu{=ܹrۉ6,GC_ 3.gH4)*WJLش8tq嬖5qDP"  wr,h/:FøC DDǼ mԙ(bQjH-]b{@,767eє7vS)/ڮ)|Q^ X y endstream endobj 212 0 obj << /Type /ObjStm /N 100 /First 913 /Length 3197 /Filter /FlateDecode >> stream x[ms6_oM@`u&/tgr #$ͯgAPNcʍ@b % Bۈ2 Je֡JxQj<$7B+_XI.D3\H&p-?OH\NA RS-H'4 $X0lNPH4ŻBF%q$X0N]x7G&1$G1G/\2:ab .R _sJ8:Y'9 &\$Hٱd5; #\4 xk@N'>!頔fQ ԑ*D,DpP%B >p&dH` 5FD5"!p"ZȜi`&XtL QAxIEn MiBM2 )(4S5R,h6(ņF G~x%TqBl^*&4+A 8B&6+ &4̉; 1cF1k',Eq\XH,wP'W(. 0N95Q3"m'ՋQ=IuzNNjiRUMͤoKSZ*+/^'EGCQ Q{ٲNj_~!<ټ[6 S%#c%F,Ct2@?B-)"IՐNi}8#ݛe.Wm3>r^zL5~9a_py/U^8l(e`T^seqy#z+ymM[.V'xlR3%=h7FDZb}BFI2nUƔT=z0_=.gyuPk)/g_Uմ}p.=QQ[`^9vpW~$}2'^ڴBZI/o)HD$ *]khLtq CV;F="&((5FG'u-FTŒ= )Ba Bp l 8TH7]-.Yn0Q7B."9.*ǒxnBk}2p4W]}2)% *HHV/ӛ]2mݍ<,Aq R/.&uVVd`yNJRN>oPHnDq6d{[8:߬--r!C._D?kr$i<N'1R`Xi(fD4p!*Q+nf D J X`H\V#Lj!ʼ",8hgjƎ, 8S6rucderftDnoLr\܇?id0Tegs>UЊD ;1=vs(??!V$櫓WW6oJ&;?ݓ|I6'0ba.#4pA30)gr<1]73@WA-jo^4EM!T;D3_vTX}bN.Ys8/މp2#p2*]ͳtx9S \~ Tʾ9cF/u)=t,FIjyh3!մi3#kvڦ^rUTwei^P xOӝu6}uN lC΋v`x"Xۗ;}1;mi=;x7ݦQ}>]0/)g4j̬;u5dR}WzR{vg iʷC6O.6_3}kDXJ.ox7~`q WF:?FO6{_zh6yK?߼ų\Di=@lV "ǫ!f.?Wu|/Uxģ{Mf+I!c{CR~c?Okm>rG0,3KO憐G w o=p}M3;:^Ff9}O|yX:xVs$Gdv &;eEc;TRkY3?=SqRX%2-@)Az뽤,!]-ԫFό9,5P!I.e$y\0H01 aa%`sBzSwcfCL> Dt)4@Ն7yZBl,<&PKb4N)xɃMn;xa9u cH9x%>[^! So|`7﷈uFl,s)#۝wŐ^lg|H8Ni `A`61 o'x3C ^Gէ en^} sqkZ]EK\ .pW|NӇ>d9 ~ 2OOa.oE?r\\/܁/܁/܁/A c) ' 'JJJ2'q7q)p8WxhΖǧRGAG0cI&L  ;0>i9;;6|h}tJᖽGCXeøG KƌPmr@sdx|ת(#'KgՈwuۼu{4'n5,{ D>tǘ.mp܃D4Z'#fO``6}xSQw~+굴Wo[*cd}JZ,8eXѐlQBD@ǭ9ϏX0󙸨rD .rDZqYkä#x,(3k`q3|7s>o̦bYFNB3dDX(bv:Y2:$7|vim퇶2ܗTJSJ[JWJ_PX_I ~MQX 06i kf۪ T/Dɇ*y? endstream endobj 335 0 obj << /Length 3510 /Filter /FlateDecode >> stream xis[~?R3&xv;qIDMfj3HH*"e']xIM LJ]/ :މȋ3uʌNg7c{OH&%b| ;LoU䪕u:Ӥg2JPi"w.XXccD)5lVw,/8+׈2 |D>p7̧8NJ+_;zM D6j,mkpimYԫ_8?m=]#-.{߭iyx$Gpb*pKo~#N \D L׍&K2@aўu>"yЧLcqHE&1ERxEZeK}"0VH .QEIǓB&FFv? q @fNP9IYv/Ȝ63ﳟneU]4ײ ܍={U6L1͙KN3n@ie>7M }0;^g eY>y"f[d`N9 tԷWR'9 g1F֡"|/%Z؁+@`\qόs܎<@OHʺldj0gJ DVߺn(tAbLX_{M<1fTlY"^}Q$*4-M @U2$B7 B Ʃ&Ӂ aK~*&zK>֏ *?/ 3$8DwKp챥iu摶TR2PQ!8mI0U1N8lcs-j\PT+).h6N3iU8;AĢp)u.q+>¥Dm,[\yq-{꽖oR.s^&%7RqSszӂLrmY(!EѭB"oNt_cjaeUYob 9Q= \_R\MH[Qf)9n8n iuyC 4M;XU'tM";ȸM_pْISb0Liw`K ,z*q4L+q6~T6!DDYȏlfWݓ_ߴJf:gc`!| K|~ GS4 FtnQ J*GDq'||5dX3 CܺaqptiR >ҩ)<+!8'xǻXуP 'qJ)*m<T?E50K2ԣW'􈼖w@{#Yb81YoTo"GC@cf "Oazz%+ )O\<țғbSX.wFwnum6T @RϹ.B#Ҽ Z= 6rGTt&ue: Hg1's18}-!_..mR &wQjҵ=PL6=;+Fp)VZ= g oQ&&+)G 'SpmЛ9ѵXo;KEmW9PäD?\ +!P@xt>k>-MܳM&;EHy 7I S=ܜ^=hYQ91U Y.p_]!FcZe8U!؛RL `fYl8`?qÜlDbyG]Yl#j:&tNvt ;WެyPVtSvESR(:e>;KiD,|>f4t`PH46 ͜&,pܥCXߦr¯ɡݖMaUt'R1kNY.C0  yE٘b:VAB0;vb,0Z2/ɔ91(/,muݞ(i?+(XT|΂g^ŭ-٩SRip1 o)yKG˜xO 'TiWD80.DZ!_R I5JkF/Pn+ɡr' Sf[iA" "6T{劎ȺtP endstream endobj 372 0 obj << /Length 3907 /Filter /FlateDecode >> stream x\Is7WHULT'vL%UqrhIDG"R~@\$K25M4[>h::ћG_5b8l#LQ8FGx9D>~EOP6 |wS>Y`S,byߞfuwfCMdPPE CL&xq K&5|P-'܌Oj F+uk-ob'8K_T9v]_Yr^,L|ӢcDS|c㟩"FT_N)Q6лĨ8gm_H+OI`#9;JCxUф !85Gp+)]{K@vo ^z?bŖXx"M:R$4}LJqV˜-j ͉ӱ!%Ah5c"$QQk@I¥Qw'ӊ¢ŗQF Q z9H69[pZ'3nExu WMrډ5qHczPY,m N&+D$'Px!Et?Zi qwʮ kvȮ ʱ˼nd)Rf1EMaMQ;ŻgYZw'9P#.KP<`l,#[x0r{ZO{a .˭#H1>@HV7+p(e g@ԳH@0`,ML`k=&=1!'[B j42lR?ZX #"Jiyԏw(/i&) RX,|2`Esz$&1sC 5m d k\9-`cy"A*]xRV'NvemY9=NYU +Eui,_e> F odL<\.q͛Trm~[I5j?abVNaMEAL Ai#N%PtO \t]_%*@[ߌe+׭A]0VYp/V[gؒOOHfTnGJ)"OiSXf'$oxӴy\QyYDfa~Ӏ_燂`#V[e/` g٤q3v3:+2( ѷVDlOGl HX\~;@؈kX{aў\N)0\eXr!5Ԗuŀsx QFQFhV2C7M ӹ ] >Aj$t9&ʆp0Nl %81b /6T> ; p;^j' H)Ե 1apw'3<41;A*0t t %P=3P!v@ ͭH,:p>% Ed:oFSg毰6>[O\ X<^e̳`Ь̶x:c~X|ʪf-'#>\o烽^+&xea{^\ցw?ӎ5dt{)]$It|A|ToP,%jfTE-VI͎oq> |lI$wbhm9YAL"8 rY/\t\|~lځ(]4= "D1G(t H!uwc25*Fy AL}w(\aP܅1;(&*8F(;7)քsumzͯVhA1w=A+Qvٗuitѡ"ԁ-bI=w. ټ!kM{)tK(Wbw+pZтi},}դzhu:OvR'{uw!TӢbAaEJSZhLY a1qaQ; "R"y=zL/H5^N?#c[FWC-mP͆%wul<!,j6: @$#$"cChMBKVih2[clE;C{SM@ykD>` faV},]VgΚeX^AeFeWQ9 .m+LL8ղ`܈gKEP۔P|AaE+SXccw_R,{K{(3Yo;ݔD֋MmmmQj6Jopף5n!LnX\avRuݥm".m)?}|l!۱0Ac:򍅈"*E= L rTT}XZK0m@AU[l{QDS4j XI鰇(ڟPCrI4a)./Чr W9qNr%l@  pyܭlaỸxp3an$%nwpPnV8ݩLھF,< \ t0f-z=ǃ՟ȡ|~՞I㾝֤T:tt)!YKe,}fĈG] :TI1 MkXM_"0aպcўv6;-ƴ3_N.BH;P6M\{WY=*dSs)6r[lƟO2D(]~Um3UMvg%J+Mh YCg|Ӽu0%442sչ?[q4Reġ(bWqs+Q]mw B V!JsqypL<;Rjpk wX(q~JcJSNkn x+GWqfmNL`h=ԉ8؆/S\"6j4GfCpۦ2iBLR 0 4^{6×a=Lɔgv4{8w[0;WPޟ8 k<9Yx-PS7P^k%x;Ձ 㩒$}8eF }?-=6`DU0e3q0 ~65f̢ԢCB Ҥ endstream endobj 398 0 obj << /Length 2932 /Filter /FlateDecode >> stream xZms_|x;8=iNhpNQTyw_p_ɤ#X,>,&ślFLn'NLefKw9RR yv*|6i;dͺ)àWә֪WCQiJ x˜6x&8hSi_.E7)[fgYi vm}y3Mǽw-=g@+%Kjqw(J{?7<ç\T~ )z2]ZF XҼxFl `mn&KTHG[s 1 ӣ!} Rމ9%*!2իWŲ~)5vw:=xsiP#g +dÏ/&$VQY])4cZ=`oyZVY~K/0 ĔnVqӴP>t۠ -ΨLL+ugo00a?>Q%8Y8?qYa;B-(0GvH/S2`9fzǩ}CP,b`ĠDǩl@Z7[hhW ƈ_YpZ0 ,)JcSJJZ+C w`vǺE).1|޷Sd1ǝ 2׎~~Y?t,2B٧-|87Aң6 6É/G_׏T!0Xu([.8`zxQr3UfQE Et3$|u!(: %.}Q U#u!e5>8[ w+9y;|6ОZk(Ӛ=FuaUH`b'Y+"s)MB Eoh !CIfF2ηwEVGo}MIToBLeaDK#Iq]ػu~4Y M]De[B;=1{hWs!wh= bsG7b C?2 dUcc9iJa9XLd7ݬ=K58 a6h N,UiM} _?^7G1ZR*b6˪b$: $tK%O+&pKՇu!3Ց"]2Jgz9-a Py7j ѠpC0ü4X p͕a<ۃ=Iv "d| lntW-W.`iP RzK-emLFRG/~n9o@j_!8+$exf#j#wG`݆qR sù :#Ç>RȢ:0`@5FAzXuQ&WoR !uq+9檽D;ʄPkā&: ;': %RDgd%DN |jNbYZBPEpS{yٶ"]4 ~"@kO7CUk?s ׌KZ?l]op sĆ4(0Bluj猧>2'v:Btk7_#aRESHS6 N2Zs=ͧNyEc,itKK-xeԀEز&a7_ R, gQL$եR+fKYDYj'+d \ĪЩ$"c̕kKㅅ%I{'|~LjY{ca/'-' = CsxA8Z)Nf ֎#rڞsRC) HՔ;Mix q9+VtJPH63H6_/Qu*K~jql/S|pҿji[B%>Jt)V H[9WYG;TG`n$-!ƥ҉f2u+Uu*Pҥ>bD-@ F ԟ:8 }mmBet9#/a7YWxC/0gaNxJ6C%o 9[yw-M".d?~-{^@x3߇>@E6P H |xx&'Qsr@߸1FzHG~lLiצT=cx:aAE\+O9" ccxVrA?rTk~-zS:ê#jMvRSZ&A-R1a"Mj4> Iϛ5-|!Assu +JGL=^F6ug;'&*dHwAtBaVxFMJP :>sgM6f+f=`E'8\tf8^O+/8қLd>L> nƮ*+5*]b}7g>Tga[c Ћ:-1ZxeZjD%.d@wnjDl/9+w 7 9:%ɷ'{N ہ: >Iρ,QuFyV#iXWz{Da`F/]_7 ףG _m endstream endobj 367 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Figure_2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 403 0 R /BBox [211.7608 287.1782 1070.447 594.596] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 404 0 R >>/Font << /TT2 405 0 R/TT3 406 0 R>> >> /Length 10362 /Filter /FlateDecode >> stream x[mW|9w>zc E2>uARtTq[((b}뻭?O0?sFC_ݟU-vkߞɷ N윮H[wI2y>ƭ?v~X:N P?vFħ/=m6Cd%h]Mj1qŸTt؀Len ;:$i/'Kl4@k9d\t Y.VKeo{?#},mcF{{@b^j7KRnhc^Fz% E[75QYNiڧeݙfZ51Kp LڳgJӄ%KlǦ#xgtX}Ť`H{i1{}=;fwXu5솁ujIA|Js4s2؁ {Lv C,rҬɖ.N̸epN3`[Ҕz^Sdk/eN녌eqʾVT;&+K*]`WJSl-Q]j ׾To+wA1w~[ynmֲ ^K'Uv{gyÂ3]k%՚eΗcn cpEnRBGRaZv9GU?u㇣Ǥnհp(61eXH +9WC^AH̲w\ȁߥ/ɯ #Mt1E9ש_Fx\%}',E4ykK !-5]UE?/cq+٠a*x̥aK RgVG&m:a_D~Ϛ_u;̑m|,_/d%s\nf~jvPTbP6nNx`;\?ی +p@=iMԦ8.4ܦc{b~PigV1L؇D{p ;8Kdq /f8tX1k0ǂ{cLj dpQPbgCgdP$ NݜAuF2DNvcʇh'AEl$ H\NG 2J'.o )fr>?H;#rw#|4K[Ҭ 13~iD{[XSS,uHt#&NB⎨ySt[i88#q LnZrl(xpJlavX^ `GQDbX-0x<bw"nlD4a9NoA bboˆydk t"L8a#bC-G >n<4N10Ҁ?iXy6x`q\0 1 R1^ˈ>FF AJiE ұh}ׇ7ZXWꟾ}y] /̧w{'7{g%>H@8hRD'h4%(bOx';;8[/Q1kf~ui4`o12$uz}QG.an1pBs^_3o,o3;}C _bm-;p?<#"A7K2l޽{jgz󫷵qY9`1OܐaX L nTsì=ũ-{hFDmbGc7At;U"fSv s˳ Ԉv6s q%‚qZqgD4;ut#1$x1TIV1'Jt\"b2D8ЧE\Bp `4ȲިM`q oMPWFkw8mW "a\#3 @̷\lC&Y'0vM CەPM]Նy{ӹ7H3liԂyH[!k6|5VTZk.ʹ)^Ǘ1Ge-ePT;PHQ(J%.wZ:rx3Cj5Ob18]!9-ɶ(StH9bi(,h].c/Gy/jsMr\Y ǚ} _C-\[Oma%;|sW2FB] Z;TWSH;+RpH8"(SRp d'{#jm;(~-Z &H09p5̤d$`eLdVWqT;2b?,əl+G&YW2d4C5HX5u& =, iʠ%>͸x m:޵0Z Gi/ԛ w#; XR+ۅU Hbb^is5rXNpvNApݰ` .HvϩT7 \󄅸2I0/S ͠ (ҳ6׈XLD񋩊ѕ V>'޲8K64ҡ?tF,0UtH>tl,5KȘc/4.ȸŨMZ̫3010MxG7a, p\Ѿ4{;L? +)7HbܾqNդs&+=tP"Jy:l?#:O/9o/d+?  i徜)}u;ff9ǐܽT9칅h5&䪲0ɇLnsj"SH!nspƽ9W֯]0{IX-ibx6terٵE+!Zz *;V"TzFv)$h!i X˓ I^K\v[OԐ 񱐕qiriE[%!NA)%7RV -D;L+e:ަ0-]9u"&%)r!m{v1 \&N̳+<'DsgOIO;PIhS !V&ږp̫IɊi$DcmB# 5H Ȥd; t?)wpjy$b8{$3z,sip rD40!l-j%E4\7 qhpX؁42ɬtoBTTZ-4ZJ-n+5& QF$3D;ƾ̓R$|`Hn~r-[By\ELب c1Ce,'l@YW(nL\0d `!t"O> M;g|;H~ !KDϼ3xU_0~^<6/6t&')~nB^ ةHxη<7+T*Q(8z~/ ^JON}wPe^-xij=Y>3{UЍoOE1RR^;tu# %NN $)i梆z[[5>`ƨQZ2-P"Rvq]QSIBxݥp]XpU)hj /Ӌ^=|֗)tO=xpQ9C[labJ? ss\,Ra o[6!NXka%%0rm{!ZqJ-DaEhksazf}[c6P%s}*z[jݚ'6QPGʵ8{ANpnap?EV9Cӣ/d  oXR#0bNnқ<¶Qcdww1crDp6i.?*$A ^ F) δ| hNCH0BzP^8By0ܨRAN EO| G3/ ḣlH2%ю8KEDK:S.:&iyL-cu#ih#OEi:!QgpesHkZ/LDpȖV: ee7VILYp-uZUM\4 G[YɐJÓȘƹg 4'^sf nD5'>Ct q׉=G6=`؉ KM(&fe%E`!X_?"c%`9]f4<V^B뀬VTfbSɟuL.A@F C%K\r=ZF.B5)Hs!P̃[)^b[dBw=$y1jxzi>*)2Lh))ơ=.-ޘ*=.dMQÖ1.k`IqH뽜bk;; .(g|AK~|0ps0o }HOXW5?  r̘Ht>X' 7y{gIquxzF)p)6cICtR9Y./k&B+:a𩡜 Dh%$B9pB4RGV= (6beYhF`5 ɱY2jH5LX<.H΢8(Cd)yM"`6L@GhSq\},"DR%T+%,2tgZjlۈ^#LRIT44hZ V=SR* % j'{Sj״xj#@gE% I*BLJ6b^ %SU.o@wlЅAؠy{`9Ṳpavn53KGJK'sx8+POҖβ qK;%Ө~àJy{\@2KO[(0 :l=~$!aVp!ׁqb("qDX&\٢ڇP$ P(v.PAr9f"բ1JL*z`V0OEOT9bO"[(]$LG GETzJBA`;`zRį HppPvPV&c]( (rIE޴ ( F@E &D# N :WN ǞV*ep$P0j9z"O:m!ǡUg Ȋ`qRlg_ʯUMMֆGc]qh"ƋR<¶J门8h)Eu-@Te`'MgSc)0n`ZdLf/s&EJHlu;5 5P[u p~ A%UrRS` 0ᚚ;onYV DP"tꞀGec7`  9L 7k_b-[wXR&t%Vћew7&EằG%m< FܐaNm`<2_TR/:/bkKo@P SӚp 8N\Px,:i!5"}p|Q|="~1XS Ky6^ OLH +nHYdQ'!Pr-?_䱐8z@ SvAWMI@V vgR5ĈTbΨZt 98 k&aBQYPTd߶m  IQh՝"GLM/rw&K#.F 9w^+&I1,Yղr虘 $kd/p})%3p]ɸ7c ᱁(DMjS6Pξb˶#4=M/!=Smn 3ƥp"> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 413 0 obj << /Length 417 0 R /Filter /FlateDecode >> stream x]Ok0slkD([<1x%B͛7cvjke~V-՞yX WJ55uNdxj0SU %vOz.޼foHS*7OlIQפyνvSF7a#9&lD~YI͚)YTR\ uYu%塬EU2"@H{,!)0&wr<jWHOn,~]gފ endstream endobj 416 0 obj << /Length 419 0 R /Length1 2556 /Filter /FlateDecode >> stream xMV{PT?>>e<>y, weE0*"\"*QJP*Dm4GvH 5mfشĶL#NGGm4V`w2͙9{s~}Ow!1A$B} ,;1] 8|j -Ͱ{; /6? ͱ%`?6;eI{t,I=3S>=?@>m:o\>ߥ~r8xGuu>îi *B#"!$PA8.v}"ep~yLQ|n+=0%€}Kҭ{虛~iљ\j.AF;6%"!W5[JCa0/< 3cBR߰HNE)F xDFb|䈠OX$E5ċM#&?#;z>走 zxϓ^lcm$4j0d6i^d$"mEgTT%$tY Kk0xvNDfK-Z% j۸jm|EMe6;N0M}$h} CV.fRzTέ)Nl2s*lj^V#'5c,jȬ۸oe[KŒК<nơ4*<$nݸ).␻\gwSȈ H4'JcZ!<(`cOdNW @97͎-'띫B|]˕f_VGƖV52ץ O95[dSv1ӭ ?lN2)֨ttk!xW^M]e4Y<ɻTiWqǘ[ȕCF kH:N5ΜFAQ33+|).Wp݊' !d" BRDN (F!2󊦳+yb6qY}~4:2 )j#s֔TǩՕoyYU|a8rhb“DgIvPG!<2!(#1B>lg@r7%)RsEB݀TQCKlixdl󀣬,SNUFWx*'efW}8ϐIw&n h AzʕlY |A*mN`F JNAvE9/o[ZVE+Ԇ ZKXһnWZ2@t*Ԕ$^mY+LoubO K( tsV t@yuBؼJ͛թp8NԑWc*}z)8D8*-Ϟ'@]3!1 t *D TDH(Ry|S2L2Ƭ]1V 9E9ZT&qSAKRMDLs:@ mZ8О'nj@`O w).f([i =;F ۫ پ5aȧS3!oo8]'j=mf70uE-) TU!kh;^DKnɅ>I   ^`ir'%}&w`W9W8s۽e7K͙nGRwSxgx][޽gxvˣP !GaC58'ׇ @ $˛EC d >m_Qs9$C6H1!HH eJk]>bC[:Z|sckėwyR&W]B8Uji/Gǎ>/@Ur:Ͻ7vO7K>{!K1%7$v-v`m=~ lCfL[M(9`:rpM@ 2X jOufG6v|~;߾it5]AgʉLHcˋ< LO縉;fɑYWA[=\L,R&{{$ƜRf+],Ԓf(B.c\=dv[)LLmJmVG.U>`~COnP0k[!J endstream endobj 418 0 obj << /Length 420 0 R /Length1 25020 /Filter /FlateDecode >> stream x |T?~νwLfd$33! (06wK¦XZ- -CX Zkjb-֪o+Eִ {~%yγ{7ߴCGptJ>-!DCW^O{o&D\O!{W]&&g]| ]uP֭)!]sg'GZEZaL kgSTxWjU%|DAtD 2I% Ҭ\#<]a [?>=.|E~7G&z+^.2N>!Vpw,? [\)2(Kvop## 74fzB*uac%UGX?XG) adsxɛcsDeU'Zpx[(:bAo%6JI@rpQ7Ċv?/?_$kx,*tSi axhlŚL?w4D։![v탓 ~. r''1Ͻho[N>k/>.^C~BCFG!|iI??4 i7_ D~fWgқMƙpa,[B(W2p"b#v?~|*&^gaz>bnDrڃ%K V-DB׹9_\unFQfJF܀6`|N,?8Hn? 6񚱒0YY ,*^qWXLhcuk,wa>Dk[jy8IX:x1^OTkxU*mH6x^"=0q J+ha0bebTCAN*Űnq5V#PjGM{L9ӄINhkOjOk56U=AvD;ݣ5jGu i4bebʘTSI=-w 77 'aW _/[Xe>AJ;IlgC=rmȵ!g%=ppCpT{|V4+KԊD@?V#׉) R:. e \N",3S>PKXi8ce*(UW&&Ji)TmjnR9%+JJ핺Rs9\ҼWJGtIz^i} _iłu .uƒ*Yxh篪qV wN$aifup~X.rnp.rVwixbgq O5Vwt䮀 ')^;sOn86˧.Ay5íӐť8I2KR-0qq8zÈ }_67s?Z;-vZ~iӒ@D(!-hp?#rb)m7⾖ܿ) bW"oD,E.ܵ71>N'aҰ>liG(@p?mm6bx~@k* tz%Gp,v*g| GL_t>yDiqk-o"=k(w<3>ZQKmeKB}cm2α85cMe;Vw5 l& fFCznqXjcֱh%icQ$'$Q>Jm|RCX E{0~*Mϲ'G>o Ǟ [˩q?ectXx"5Gq "PWRW{(Vn*?]Gz,4x%(O/hz2(V0j 7Fׇn<dǓe8ʧ[PKttmԭ-]֕].+;ު7z^ ƧOIƮh9צ٦Dq97'P9.kstsrɮqdWN߳o?_G*'=Nq:Ͳ}G; ;]դkpxɲ&:Kܛ͎lG 'Oy st-=Q؟bEe}Gaa]{a}GMp,)P4U;@X5RDj xoӢEX|V t%f}ՄbBU<;}336ޙLxgAVi1kݘ*VbrDI+Eu:1=gzrC>OD$ r/y*9VDk7ME6f>EJZ)x xRҋd/?@.O'ŽTtk/Ӥa1A QSu x58&#Z[K~ sуwh edLn Į@ |Y&`m̽إ12߫xJ;U bz)q:}] 9%RF3݈L,%Wanj81yh1- 6%,)!j:9שCj>U;uc3VQb".ŻşKOJohkVjԭԯoZPj!@RԐzk1!֓v%Wy"-y;@hs_~ ])Cc"#"J:Yh:+;_8.*#ՐG{A%iZS<w/Jtt8;y\7ȔjS?- .r`p/~O_~@{iА®5ӹ`5Ӆz[J᷒Wᷕ/^Um/z3oXq!!,U+t w!a;pDxUtqPەⰸK/IRRZjHWJI/K^>ք5횫4h^5^5گiiўiu=`WoֽA~>=/}nH7 '^qHsŊiu_kEAWNK>%H kʹL'? gH.XxH_O V:H.6;4 \6iؚ4;g)r)ɐ%x >r'tt&kt!@ 45Zz08/Bh A TfM#2 o @+Cߐn!DR\3 AR<_GT$/Q܂9H@yOx5Ψ8_$WO?HZwN6~t2H<=F]~a&)ՀƾHՇS]T0+< dH,?p')@"1a*4ڥņƽfeJyQA=m?(,|;" V6鉐0SHĨcCZ(3Rbˉ7)tbLsMq,LѠD*YUC>7 ;AE,#BݡmջH<*_rSbKCUƞ~Z8.ʺFf հPSSFR|*5Z/PXkoN_QV\'hR%.m_r%LEU{f)-K< e"7eơƑ=z_CDY珅J|iI+!OC׫uJӸZX-jfPhclC⦒۵w iy_cp)w$Z#"Xd8&6ŊZq %zA?ZLc<Â-5,yjRc(R2ܐd#:Ti$x'%QbFHT4NSZSMm6[,dצl鯠;X Z$M 'D970fJ]L'妦&zV%\';I'kg.KYLVfZ-h7Du/ hű..WӴFCb jTTxaQ5 Ud *0]~=Y?̴Eu{ܮ6ShIG*:"E\X9rs#սqOaba3pLRy̤"^Кuq 삧iʩcѿsشluF ۃzV*G;v^U8aSQk(Ut('z2*F#ܞ",>QLj0 G@d ASny|7zG}9og*Oo6eu{J'$xiN9O$ZN`8$bZPiKR@ᐙf!!-ÔPu6GC`1cAGSLmbiUfgbʋ׮ٞ'z oi|SlOOIey7s(I$Je QkfgQ%,uIc9DɊu1$sF(δd,Ib9;a^*:yhgSmԺZmLꪫp1x5?Fi \*X|l8m_ZrW_ܲ \wW+#5Vn<^-uE3EZcYJl2)s\D/J{ѫקx_}kxqh3[ݙ8#j#&I)RH'fowocf;#<XfOUU=^5ydՇߞqӑ^F=Kxn̫W3oyX#E@IHhW v# /3邌דI{qVc z0d%r.tEDDrɈ6ZE6fg\V H=u0~0OٻI-Q^1Wf0DO5 4Yמʎ,{7Yu[ex^ܼ0?%Zjv{WxyŴw+8[ ę&Icź]2UL855Xmo~YGqI #qYB+S$p5NTCtRZ L#:e訮uv8ڀO L&3N'-G P49wj@n\{I& D3%LDaŹֹQApGF"A[k*^ iQt&$ ֘A9HEMAUx1ᄮb'}c:K@كxR@1z>>Θ'U)ULY\Aߔ5b+%FF,xθV :Z S$$Q0vD{oEb!]OvtfWTwے_o}ʶĶ]QTj)_2Zcf,M G|<8鏧OG`wCup ?ದLFF2DG,?y9"g@cQlzp TZH n0E?r/GΕ}UϞ=(gK!?#R3@ PD`I1xt0;Q +qEɁ棓Pe݆e,Abifv/]٬!#+Ǖ-%w0ٻ>%}/zV~{W*rzBccGx2=})0)ߡf@"rDDs~9D(v_K{+eask[\ƹXxdGGȤ8)b}B]\e'f8oh^~tf.]8GN_UDk~:ɏ~ҟP{-NWhVڗ[~eEt'ѹA{tEZPrPeKnwf&VX92* H@2LOpZ"W+qV9:aC0*oϟf UL F^A_D8&>9 ]#dȑȦ1?yP9`$WoJcPc(ab1pɢxZ={ZV7˂)##Ct:`~~'r h'ua;XXlXGۜ|6|8?d*E8i>c,Q;YnÕ[q8Y Vn r~l q xgɂy,[zwI ksun}`DO3QԟЋ^I9I\6WxőHUfbZZ[C3 D2<`|>S1(xu.G ikA-0υ4sGYZ1XI2F#T _62S|T!}YbZ#l_SWxfN0+K]ew]?޿~r.F[t07`)}T} @:?4 /:="].l.ۼH e ;{MCwJ;5yn>]wvUqŚ&_~r⪖k 5w5[t53j(*XԼ;/|\ĻKEU:vGEQcmx&USEn+=`U:=ݪGĎn]u\T;NcG{|#>kXD B҄"V]Tʶb&?K5,g2ږ13V#bl0yi@^e5Z꣚%ddxTbe5Qt "`|A&eyf|\5 5˭;\Tr D@vn3#n>GL+3b(.ȖWXC Xi˖?Co$jܿ : Wdr)99̲y#| FC2~!ϽгY\HX})0ˑ8$D\8?rD9!3x~SXmʪ*+k*EmKqwqExI|qgvwšr9Hzɥ mviobi.YZ@,S]uЪ@-5KdQ% i¢Y{. HVԸFh+dh-qOVUi1Ge26eI\g9U2鉙ĘE`m9騅URH.^vlm/$V#ڒ7467dCh`5_wt쵺5,uuiYztqsy>jߨ9\P-+:I,CҪ:7>ǰ:\^.ܵGYes~/:@pqӁ']': Tn3N荱T"'U3 L`BoőD9Hf39G(Aȇ\]Hy_弿rmxOx_O$WRm\P[G”44P\族J> ;2h>FLԠS֥=a*1"FΛg ΰu|f8`ᡙ`z0q@M7eƆA,xaA5L4oZ00IJ轥!hSE奡Dg4$wF#qѪVDk-56$JivlycQ#8dm|(H"\S>X>T. rʌz˥C"Nu,d&5,Сul@qP Rޯ+ Rؘ[ƋS{016\'k\Z3ӅrPi5fԩ.(2tSE ߕRKVԾ2/#KӶ.OtO/bNc<δMt)fGH A!%¥ȈW4y#"<`N)>"GWqlS(鎬l1\8vuAd|Dk{Ufأؠ]C50 ⨅E``o,|p|zc| ga8| ᆣo4FcC؞Fy1vpVU1ga4C8;,!"kQB6ţd )2㨁 kejk5->K̫&84u5^㥃!wW}6l`s[8MS%T # W1\^s^k֜dp]Z6kVYYӬ[}-S.XiKlT䜲$ @7ҕ_M)>[lru/q-0krP:TH48FN,y+y<ژ5ρ>߽Cɰ:HC)c} jb}0OKWcDUWeuҽw]^wvn72[*ҌՀ|n5[08uW,hqVdk06`쑿B:'tB6GK5Y(zͮ+58.jrΊxR j옪\5i"EʮYU~~$l )V\fō]]7Om^4y䨽nPk癒S]"R-LOb^z)U (Y-dLz+oQF*X^0V$I遞,n.x^@$% ݤ7.. KRʅRF   ̭``wqJevR Q,S$q|fLycz~8`/p+0889J~14YaZvLj~}؍ G _7h1yvR6]Xw_PtlnBMB PqHҐ4*$>Lfռf znvυ D >5sɲai>SzayccG`kZ𭴪wwJty ¯XqmVBWۀW"+4 s< i1 $X,ouЧM&Mƛ79nton ae7 Aٞ pz)a'z>Wmy pO n~y7]y/^;gWz\q#wّ;{nhi~MGg1NZdX+UT,LE,urT17r0"g9EdV"$UgZ9~TĭuZ]Sa©0NPX舠%53uD9BbXed0 1T@Y['N̅ϲ$V֚EE+&cba`,U; @7[i*+ϗҝ):+<+2l5 >h"8-6(= @Ϯ/Mj" < vJn 05Vҵ:>^Sl.kuU M[US3>L7 v1Na^Ś8T? &T? 2IV;_6|u%UlהO8]r4Ekf_rڗIWW&겕O{yu(nSqUk:ĺhcW^+,C3\R!YHxtF|;c@$7 m ŧ0g4 nCʢ{%okwb]bkBLf u!BNx;i+FuZ̔v͐Mۋ{\T`~*.+GMJ0ٶ*ʦ 틒N-+h"&JKq(F2{"S;T-EXRa|!cpX#ʨ"E?;e zjJ4&81sx .v- d>9u}OlR?&]r3N˜SɎ"Qc #u~T 8bcnsQ5ӧ^*xITsx-BW\KH~}S3j[NE$GRChu)e: !:DCqOC~%qTi؅&Bxc+yzwzrThJ]KC|^#he]Bq~lU~E  *-жã8p``@>ztY>zbRRpTl (e4FTVUTkmTQ|hhwWcޖގ{7er4R+%v#H`$|g׭#^Ew#.R +EIKI3]SwZ~G|;h.WsBi.1\82o\ W9Ј$[)HU',V_jP i/:*! Fmm֩xW5;AC$2 ! UHU- 'ן:s>=?6MeS(4KsՄv= uŗ5T5f8V3f~N>cY)p[9 p|X2LvŒR^g/G/C8)ڜlYQ`KVcA8g8?y8MahMx35odg]^}&,yk"Foc^񕗞۴cDj_r?_.;⾩wMgyCIi߼eWs%GKYa%4I?$zn UضB~db':A7,@9]]]ϻ}t 6?vv[VWX酼&y=Tteff+fZ6i˸wZ[1Քó"]UBA*IXA8)qΜsyyҩu}<o7g;LuN`NQ尚ָjWj~K%z%Dt=~q{KKV^Z*z^Zv2 @oq!3U1ɓ ?fT';?wp1&˛K 3G케`Ƶ&zpiF͂<˫p}OQKuRވJ{4Q=jdBB d/+w </1"yps83ǵ^+gLlr1A1&EI!jLFe^xL>t≨>A[t!}bi4&$DVh2E%M+>jOe*Uf>?l=Q0Se@̀M&6p)Pab^:ع`#GA?Hd{@.[:̮k;<0j{ :aNԊq3N| Sy9y}Wvxw0_Rs-t qV|!S$q|.o(zRPՁo÷n|r)ԋ/\,;؟}IuɼW_vkot+?׳hbB/$U endstream endobj 324 0 obj << /Type /ObjStm /N 100 /First 893 /Length 2834 /Filter /FlateDecode >> stream xZms۸_oM&xdn&&8uc7^.a$D/.E]> R-_ǖR +vdЎ[}֢ň6`HDĵQZhe :$N#j`F9=Yt tR L\@' "n47 C$a2 0Ɲ0f`3y*RxH* @u/`w|[ y &LeScV`Lu֣Ï[p%hC5:0t`0bB,eøBĘ E ;j"Cxfx-1AX8X/0 |@㱐|4BB"xbtB ?5GtLOc@@8@Y)`|fL|^$k<:Q$̄;z\,T>Bb0|S΄((hub$ 3+)gS1<ÿϏb'eUXH - `6`HR3BP1ʺhbz{};dbb7A:x ^/NI1M xt>k!b\ $#D>\!t犔֣lM5aJR9i2F s&hi1cjE`*i~XP2x^[[hoI]Hޣ:4Jʛ}MtqoxK=WˬHE)I@FE|P@3K1;PS5YE sIrp)bhCbB `TIPt5dUɶ TA )e![*Dq=bT%l-r -"$d`DdO |8ҡ{KƒE Ur.{{>ʉ."z*[jz>:*!`1<k#u8)]SlT[*v_E%-!hp56hqŹZXלh@[sʜnŷrQ^e_AY+6ʛۙ[F^jog,!N"4|hPću:kMڮu]6tmږ>._m7nRD9\AC:*`nU@otk V6$Wm+i@p6\|8}QZ$\ 88'rrEM]ʥIɧwX8[rڴ՗6؋FQ椌EzC0s/$n|$5.cF6!q[T$C -m"iBXŕUGLè̈́Uh>L;ri|υ"(3hw&|q}ݍfD 3S_M⳦mG\ulK!8QD q@˵WJ9˪Bc*`DG޽h_Uw^ѫq^cw|x.]wu쎯fRcW3+ޤ EuǗ~!ViyNl≶Or ÉM1Ff'0P[_C'DnqNN8 L}Ԕӷ]P|ZAej߯&%W{nPL+:qlEO/R+2ZbiN'FګvaLdb>qE&yMf,H5N62痥'^w۪ݒNFG*FQqv6.c86 ~m ہW%$_&CET̐' (8Iw!mN_Ϟc]-'ff x'D;pTc}Av/yh0ki mgd7 BIߵpQ endstream endobj 446 0 obj << /Length 3919 /Filter /FlateDecode >> stream xْ]_Gn93A$rEvF\XObH\* \<ϟ93u֭,kfb&p/v֗@QBն2JB ([9gTet˯=t8D tr$re@#l20aՆ KnjD+2--b"4c 1Y.~d}6s`bxK@Nhh:$ )RQ2Z(0b`nAUaY]x-x]_MҴy# k&6a=ٻn?{  ߿>BY&`FKҌ:׉8O/!$]"ߑU:WW$[R[aG:0լNws,!̪ 5]R%m S/(Ѡt^Sp dl"78 m3jOpd!FyIBe%\ CWdF@ yx;,@bK0oyЉn@uE!z㉪Uz+/z! 6e0W*EbC bKxt}@俊>Ui/U,7aM$7SȔP/\"MpM46(MǢ CBBcgMMib uQNWѕqQ##]Ҷqo1, )LɽhɺV@;x]WX@HVnZ%6PvlJ(lG͔FX_s_: xܱ,dp`Uh`Z9F'$STJ`ʵM}QBNMӋZaBS=k*ќJ`ukau6fS ,,M+[Y2yqZ6^iH FU0@A(.q2 ÛB I8Xsdvf/A{+F[*KG%kkt9Cʯ`^QLJ4qɜϙ O6mGuB d\kaWɓV/$B)➤^-T[|WCB\.͓%a v,L*J)M- >ɿx{! Cbi?Xz@?Wx&D/y޳3|ꇽ(ҝfdD`dڦhdrލǪ̏OKO4h `?K yPXOK+h@ E}7E&JS0x6bX% зLgo%)ُc]:kڷY[jt:ങgmTlZ) n% *',p'B%N%ND<}vȔ\q&Q^ϓ~J Zzp"-8nW'3[, ˪Qˡmpp`+-!ȿ9۬bdL-KXTMޭhiR)̀/[QX[)NQ(~`qL,RQ,9xqdwEA:s ОBXx4;0zuem+S}URS>Yn0PbrfG .Ϸs R ;!<|̇8 c`ҖǥǙ}_H1͡eX5OMzjHzZV1ضp$i|k[>3jNUcsNP^ieZ!A١3yzonqЉqwZ`.Ӄ~| ChBS:(qGNl3(vMQ@^)*c6Oqf]}q0aL0!e0,LN"DeΧڷ 7Վfפ"VF2Ho+!5[/_~?:af{{+t;xzGJ4P JX+tiVxG ](( ` xkbxCh@{.f QQ.F/)Is wp KK>k& C*`k}Q y@/މi~Hg9:^ۏ>}Ѹ)C~>Kh/g cjK|[+!འ+䑡jO#2!}ZbC9V~7dcA ީvo-g:MÇ+HyU$ 溁4I;|ê:nVjϞ<+ZUBmBkē9Muۋ_epSɿIked3C(;tOj7y<[^Mj*qN !OIvcr!! r>Cm,Y ? k&q}et|n⎟gEXpec=>Zq*U^c&{p .\}6Ybڼ'^$VxG&;AOѕ؎IQN9TD G>nܰ4Mz" 4:w%7F.o;r)3u8zsIÁv@s׻~Ҿ>^vL:R.' JolA3w%K6G(7E6~,}K+ !q`sCi@$wݎ& mbUyhor.ܩonzKڅ;MktrW!KFzH`n?bAAD:\n[zJo=):W,B22O Dԉ" "J "c<4k\.߯??0M endstream endobj 474 0 obj << /Length 3840 /Filter /FlateDecode >> stream xڵ[Y6~_GBTl'lz+G9bG~v7 A؇Q >ͤ=8[YNd!ꢖI%'tjT_/^}-239-5rԦ3a=}u*ӱlhm8SմY̔vܴzz lYM73vmww׵vϛŞmG4J_,=?úW-<.o9+\Lc1D}Փ_4n:&`?=rPydlp=rT{ڦB a*h+97sJ\4`^8gt3$<9?,R' "OB>6Aznχ^H!We&k qUhʔӣ h dV5jv7]҅J+ ULUNJ_T'L+e\E4,l(6;%ԒT.V~;^Xn1o#* QU*V3V-*at,r9BuF~UUvz,W Sƍ>}-:<  nY#Şx>|$ 0iB AWB*EUT>c&c矯0DYlQIo~9vwy`ޢ%Ͽ( e@'XLk"Hrd Tij="PU)^ N>@W֐y%F #6OyWbˈ1WN H "O ة﹪i|ˋ0Odcb:9ӝ̔ -E2u9)rL]"$ "w8k҈5aKx_ #ϖ7Vi$1jHԔ¦XAjFMp2s|H9DOcdHKyٓ! 9$JKQIi{.0j- sr%XdTe͠%f: .v> bv*ɞBcȺ=pLfcXW4lQ?6c sЎߛn| B_)dϜB@K"Ý "R@|Bf`tH>Mz<:Уqnt9eW,u{R &R* ԐLS/{@Q1ϖu4 EE2/7̻ۡ2{Y5%/}d(:K?E A8$4{f <]Jx;ǎ-#Oc'< }kW.NOhIڸ]fnMW„U/rH8Yh*?zM]Vb>Gч yWdq%FSCIFWS$)jW_uxGT&ʯe/be659AE&^cŭ$bMlD /?j!v4O"NB߳Y"I͎ ݛK|AK%1a?`J/hRUBY9L6#I8C '^k3ޓ n^ D)xR 1x~q`dK[IҒ^뾔A`4]/38˽Kf>^򸏤4 }"sI&?wt`OU=1SId]l;|(lM/F#жfzAIߵe}Jѕ㷾vɳ^.>~C֑D>c6-P8ǀRݬbFi{ /_oXU{ш@V@f ρ)ruC4o[_C8J  Ib~.yKvA vKWĿ;F Q$Ϣq12ԧ@~- b QʙWUpX_1ǎ1~K&-U dco=nMZ{6/E{I  ،zV߳a/š1IJ鶃͗w&5~=H>^iw~p&Ixo),DN ʭxI)%UMO#hp]2:ʍ͑.߅؂j#O\f`7ؠ<3 !!X}0m"Ѹ6RUl]Qq]GI |,ђi-^R *8!"ƂVbjƚ?rDЙ*Fsu3~fRxV*-4ZsWPa9E9/}1jⴡ:cHDZ7:}cg ~p!`^xm{ :?"FD9+'̱0“8\fK_.iN. &aeD]M' rrI%:$^&ܕUi)t$˲'?-iJT a YU!X3X|NPSKh Đ"P$WJPB&->jqs9>T0^- ҼW&.u NpRyv y:OQG /Q<x?$? U(|[> stream xڭYoF=ȓ }MŦ-Z/-ˊ(59H-5[29ks_nn|S+gMިۇ+mTLuU*k}v;^ύѳ?5|yM.}bfN2p|[6yV ͔Arj^jn,)yDˋ(/0)}> Eu5Z׳A0)Y]2bU7)LOnD0 A9'k @6=х]Jx;Kd Gd/[mhD+|mYܰyǏG7|%%LEV]CtzB"zF\ Xhɣ bRYaL[ɝ+'䇎)xI:ҽ,y+g?+Q6LD=\4xB $Eq\hp>C> 1yXw|< o >߇I1cy ޒp}Lb9،΂QsD& aN.{6ufr<שuUG"fE?A $(7hI엤´rHQ"[U:Mb6N;yV%HDdfovIjCU%uCEP PA{=س{0 }Ih+ L5 /+k1 M#*L|F:>)!UVĵ (k &Hk#i!k`jAMݞĮeW mp'1c 2YG2.R`-Ji$@tRI `?w>e.[1SsaP֭;lw[%)~a}G voP4{"iskR^ Sp%C(t,{vF7E*Y+ l^9i[fòI=AJa<6:6hІe6_:W{nvy|"gOb"N.Hݤ ļUv-̨:f)}v鱇|oB+e\to%q[Otl`&&>AD}`SaۖH,̍&i7DŶvNαB<?u!!Eǐ"OUjF|mE)u_)2 t&RFE݋+DͨP>ЌZ4#h`Ɉ5[M6h")j+W1hյ=nI7yX / 7/Wpl -*yQ5Ou\ynrt(B؞ a#tLO8G7{"}?z"0sweW"Vי1M_ ą HVuiCkrsܙ)PnJ']*=f iDj^MWV?e iAO`2%qu)K!`h>H{Ql5JA&YTx_%|8^qJ&&6ՙXTk%R\=zF} ȆonРvݯWF,č>e /(C @_"*+E".#klHMJ(J}L?4I}lUAkyvi3^ۆZ ԽD 6)ppk<:e~%5 WHJO-rƊt/MSjG)C6a׃ʇĵθNqkۀ#riBK T$b?3@qa#i44YsiR`mU+;dM8ِnZ1"zQ %wu~2:TH܊}NT,f(xS(FйI2OX,_zSX%-g@ k$4'0U糟=p8Q(L͒kk5S $u_MˆR.[{e-O.VxŰPT j;=u-n>Jr2"\KeC -S 3kC #Rox߽ MxUbC/̂%oHؔz~$[G7thү~'pQSWluk6ΊOaVa޷d8ט{&"զeKK͕M|;YE 2>r)s2B7hH2%h#sG^:^U@};ҲmK"cfwأ7D|{dp^ endstream endobj 515 0 obj << /Length 3424 /Filter /FlateDecode >> stream xَF}B' v7 N{,#q$ْ8a[g[<Ļ }UuUtWO#&uZ22/DZŷ0Ҥ(K؃g_5k^OwBs =*2`jly6<χDu{0_ ŧ#ګ bvCww{MVJ\^w.'u[݇47VEQ o4+c/oք)vD2kVD;j4{>#P85.ɳIgi=~mh!/ɴ(_e͌Q@_qnl|uцDB6I ux ] _ӿG<ÒsО!E+PVVCYYknxo-/úhmE@Kt)T]Bg_w_ɩ>QA($ _)U;N <4/ԡtSɅMqXFSe9 ͅֆ^_<$QFv(=@2ʘ C|x@|qldt8U83!IM}2=j=L+_^Kp5JqՖ;r.t~hG-լfG <biFRH|.,8b_ >Hvjz%4TfC3qiE&m+҄BATRE,"bfQg¥U=7~,*,u|:ݒwKFPk/VZE, 'U&9 K2-ֲlRwD678L3e5+.%ADFlZ !qD!IԜG MkRmj>Y#O%ihC=`;sbYBh-gA 5lH Q$iJGWA2_7ӊV]LC rL VGw\ XRyU""N{Rji7$/klwɵlXrYj(nt߽ rmW y'Rb ۳Sc bmO-iݒÄˊ4Q,I$GǦ$@ HK`_9<.¤i:¡G, 9x#˖.o(Ko(l kKfOf,P8OZQel@pј$Kz[Ws#nT;yU`P-Y ף/h&h[캍1z&yBb=pLܖ,ЖJV.ݠVĖW4R;ps 0v oPڬ#zHJ҆FguL\t8 TTBD2}4qAE#Uogl,2Mau,l{=8 +7}w5G!;l úS"syS꧱AFC*[k|>o=8_{/ },&M%yI$̹Xh?sʎ"y-.Om^kЃ0ڼ䜺|(Quykߚ!4J04@3d*0 ϥ9 L{2 `,Ϯ5i9[Uurքc;HZKX\2NH1%Q^XTW13p'VOfVl8O+u?r/sWAr? H9[bydTo^ARvzlw{-#q {|IYh`kd2?ƐW VK8:Ny8qNPM(w}- 8_q$-BbD_촼#\{裛^\w}-WC)/LR£A'tI{N6TI|X!(T_9<)@}*U~b0 "C\jl"j{"S y4o^oIZ4suU ;8XoƉoZw8M, ӌsܐ ~ f?F?Ę򈂮 8.8NrX{^@SZw^ O﬙+A_7W[f'O@ `h`|:[=Xo`F/g u6_~`2_NuúupQJK.'}R azX f<F G;ˌΪhyC5xjW MRB b5k>CQv{D{.[ ,MRTMgAM&*jNܛC[M+av|gU"m|jmZҪF09ƺuW%t MQI?T; NmDӵ;VHs_LM%>qv)~z9=70Ʒ\|w6^,}$?]_ endstream endobj 422 0 obj << /Type /ObjStm /N 100 /First 908 /Length 2742 /Filter /FlateDecode >> stream x[]o7}ׯ ů (4H.h$Ywwة`<_g p!#dWb8 Q (dD eG(G{.; ѫƉA9bJņQI%#|* )*y0 CyzQdӒx6x΂R`5>? gc*tߜM:ɡQ V̖ǰI包9fX:zFP"@y "& ?iƊ0蚡 "RX,zOP%I feϳ'aF:-,k%q^rY˼gq`1Hb#;g+;z=OSihzX/q ̋WtXUx- , ~~a/Ѱc#3}7ߚi9L,o?7ZS_Vku6O·0lFb}[j3,7isk{lrzϔ"ACr:3mw_7X,1֙Y׺چvLWֵXT\n:ú*﫼򾓿7-|^}8\.UlOp9a4 },tƢb4b߷F\]+l1 ,.f˿rцTtYآ Ћm5>.!=ir\Npp/j2"+E-,rZh:äcq pQ3!a))!Y׭F&u~#g``q,ѣBUkbkȨFP\3IeZd3p=>;|>Gɧf6!qӞi`Kq[90ym"q%-Haצr5[k7 5[ 0I &!Pd!-HPoGeI= $@YWuY#݊i316+2dը11)$Y"헅N^{W f">EA442[ƶv./X;$mpel;$:凼 d=SzTURxђ{Gc*q#W|`rPB UN*ʹr\r/\-b/VXNj븕޲ҵudF”X9$@H x8|w^GaqZ0eTE+VtIHH)-&A4rlF^D׮51VID Gw0K_YKؓ\jPSS1gq,I4QR \M:53m`gYg -ߣ Zoۂ13~OԿm.fbZhfr~ 8S[`Ԙ B)qG=ȴ|5Adgo 59.!bmI!#Ѭo!͚|RHԲ-$_Е5ccڳTNT474VUd]@W#0G_= sqDelA0MvQH{T&L -$ou7` ԙ?(>qj5DP|:lrT{@ 7nnY#AXy4l5@Q0#܇gmr~[H+)'P@*2c]:*}w_^Gb=!'GvĬJ;jyؤ#|9]xpЈT"2@DW ?8$EPqF n`rL-urݰ[Yf'iʡjܘϝ-_tQtJbQ-/@B=8yw]ERE%U:nRZ4"DJ_$d <ԃ>nԐ#koSJDe,xje=Y| &;~C*F?2x\~ScLe8ScOK>W&;bzSةܭ+> stream xZKsW|*"vGrswVFbL G/`0á$+K%ЍFL6YMg.Ͼ{WTUzrŤ\.&otڻfZ?o ww]hw8z=v #w_/;'Ye-pDĴAg89'3aL#nݹ)_ȕB =ol׷4Z\pڎGϑr lƪmT جq,L 4qM be1n$ʥrtƪ ǚ(rL0x)6Jі%5[.Dw*r$Mr@S Қ1T+?C -7B&ŎTqn <(ն@rs6̬{-D[P|IKQCP.v$jV4MMe&5MY oY@1/ړ{3d&` Ֆ_AdMC6_q ,CЂnq4ulq @cA|a StMf؃*;?>GZfWTTO?e>7h7+y+^_7ba' wC/w`u{ʄĚa (o@'gm_;{AKr7OrzgLd^o1jt0.={x|аh7گj$!To/čAZkttD <WoPCìB<E˜\2ұ 85e;=Y5?I{A~6/$-s{g G'eNBm$:\^7vS035\np rо1&=RR#x7vJ6n9^Sc!%|h)?c͟!vh FsKXkC܁ !K$9mٵ$gYe+\F:[2^>@,sۤx"瀝ÐPI$?v^e ۑl!œ,a3`pf<& {yc) H< ";U @pD?5>LrUlYrkw)5=;VUw.]o@`7݈䮂OMlgS2 IlkOT^<#~8 ksQѡ}&DS^na+ð~:$8<1/ЃfYK4Fdv-#A*x"7u|RyS(1͛s%_(*6QPXBW*)5v썰KyR""##'؎ٳxX&hm}mJjJ_%椻MeOQulwzOcimG/5 J3=O+R؋B %l~ ~CqNx|j(cU!rsAXj E]QSlX}j<(kݑgoz/Vcp2WK<FWr}Զ?Ԥ~QmR?#gEJ|FElŏկLdO|[_б}8g9곖1^:H:10 ؕq.!g5^Ja8)<$a~C&QTFBk(cPTʿ`?D aРdBA l4^ChMU~s>9AFߡM}D{W$SHe}ƟEO"DV% ᰦ~K*3#R; B+w{LT^|ՋZiv <Rx ):]JӲo̘]ʙjpIBv;N/gx)cڈwoUjCJIcЀEU{xlc'2 vh}D]-xtP;&tە ,h CdiTDΖ{^:Or|yCb7{xSRڧKa:l,|c "skםS_HyO $bR"Wb ]< G?5} lqǷ"'bB0u@&MG\'}C LpB̻BsDG` Gb4*#\e&:| ؓO?iFC?X,.A9BiW%zIĶV@%YcUnϫ\=߀c1!.KT̥)BPpѩZLK.->7nwQ> stream xڥnG_AD1W^ ]A`+'XPE*ICʫ|}Ӕda4꺺V9Z_|FU#U]٩ըUjTDZlYM8?'jgxQ]5-v2֌~h}u9'݌o&U=-1f|lwǯg8yć0g݂g\pn+6$)a˾81wH2 Gq^ z"T(+;hڅbzkx~-r2z◂39DfQK H .pcx O0 (gYFZyn`n8t-B8tI%Ee Q`Ae ckM.t-i Cav>5MEnc5lb,璧/g>nuE70VG!6}R͖Ol.|.t艹*=-I s)ڲ7PICp,%i3+' k.|7<3VLl~k֦in14b̝1?i%AH`EqE<)g B%H JmjMfB8ЖAALaLxaOC<-q]r ĕxJ)ed |? VUY7#k&6W0~=u6ʀNKpy;qq(l+㖇c.\*'CA +4vܲ!-[ 483d:L4M̂ >zp\sTwmQ6:âp|>)a$|v>ҶH9-痌Qvdb@8Ki+Jmr=i%3إgX2Hñh0 iotfdlfʌՙ&3{a9۳hk55)a*V-*j!"VSĚ#[Z<&gJ}o(&5fSX%c*/FId)eS?& 䔥Ļf5@BRD6/R)*6{J{ZWO:NSaT^=L#korLזdB%hKvGy= YD Ӄy# ܺd<9Šz+Wj0A3GnG!c ߭PY̗٪先Cu϶ 4(G]KqŴ<'-e҄sdlaJX֒AD%N%8^HR99IσJg#_䤊r R%>:i*qe}dH0^n)S3p [hx?u+_i=1g\s.6t(3e3pz/ ìɤ6$VU.ep "r-N' ^sں VRU]ԪJ+vޔ~O^wZd˨p %.>md6Qڤ[`;?We|< l8-qn\^(\GˤЩX5=Nj|xuUdNzfq䣶M\`}tSNpN**jl˥M4hڼ9*L%9s<[@x8!jZ߀sgs6wPzΗQl;v"O}xؠq ה"=0|KB{2{߃}.0';ht-X|H"SQDEy,?$d<*TQUáz8 Qˮ’]xa*qT5>ϩӕ"tiYq_ Ut endstream endobj 541 0 obj << /Length 2177 /Filter /FlateDecode >> stream xZo_qp].CkI>8AAQ'%:Q }k%".r83;Y- ջ-J6j۫EjtM]l[l˷+lO{ZIo h7pI`{,ueӫwz(r"3 .ƆkkbmLxXڑzj[AZM/ /-y6"O=\V@ AC"qE:U UҬKMGJ$3%)MIٔOIPzjB\A)њIZHWJ'$=$)) HOk;EpS=!k\6ʚVvF3f6>13= "\6meذq32vffj3QIAVєIדI=MRzheq!Lf#4eZdN堜T#V)8->Řިt)c@} V5X-3ikddtu&͌Wv&.hfY6ӱ&NN -onx*T N~5Px/oivʭ48?K o'c[( ;1q&6A jC\77~zŌMtvwUdW1ڊNcW=)m0X= HGT+#w\Whݝ#s~jԦatG~9X ,2&b&ȡ3+ S(oqZG/$$pITD)E +@w޸yb"l a.pT%nGbHX8Ymn A/BJ/F3>4= [9TYWUZ 뷳 D W}E|<)@S < 3Sd8oV^ eU," >FT (d}-ӛ=Ju&bK6d`17􇉤n Έͧ;NP*SmD.onz9UJg6& ^14os:D<+ބZa"\DJ&P7]byKi D1S1D jD hAe# @ L@69 Q L3<TUE|SKKu\۵y UAw(&n0cIh֗Y7X(۠?)ЊBFF #Ǜ&(|-]Uz,M6.sI-y>hhBcѢB{ߋ:TV-9VoPnj2sT+'= ĉ;x5Wd᠆8GJgnT<@-Iv ȓLϒOww'*C!YWkD@$(8[U;(oI;0+ ;.hqZ% Xni#i=tRWPAM3`]^K*V %R_DzX5}Åq'G)G!+GF̌^-zrq$QăJS۰d&ھW&~B0~SאJڏ^$Q[ʣ<o߅e&mB@)15. w1oni70\R+Yz%"}w";a>E1oޚ,(q_Zk,VfԢ(HFMeMI,_rzFX0a ?z$0⿐Ax% endstream endobj 548 0 obj << /Length 1462 /Filter /FlateDecode >> stream xXKoFW=QEs|h:-ںJ{pz$Jrj)p~}J]_j3~Ll809ONU8*Bu K0I0_WJ/NAi8J |ٻ 7gFفk[DEfћZWI^r Ӵp*Mu˩Ij:3Ƅkiqó叨Zu%;x{KJbGgI}[eyƿ`xOLb~?(m@V,X֓/(U:!aDg%?&xL~N4sgͷqJ6\avGvNZCJL+bXuM>TwԸ%wLMW_ɿeQċh5hZ< װFi\t2kX)g9H*2")%`!?2SFj7 ѩ֜ JzvFo5ҭm1xID eoyURoE Z.eGy(inYj "CzTP1y'0.Ughopܳx\unjWE< !~.?keoЧ=tCmyG:,ǔW q=>C[p{Y? ve4۱~'MP<p"* T=NÊ*T񡢘#Va+<pM6I+!=ɔǻzuz"^P7đ ySyiW58;As#pq7w,mC%#AojC ko~c|fŲ[TQ0 ~ve}n.xlH&b՞7q}>t@SX9ODEpu1K$tyclo/G*5(ӲYJ",8ovؓ-)gtY"' ixpvCH >wC:i) wA{>h>Nĺ[ mBGF"he|V(L99aNĵ{w4ܽ_a1}~ٴ{~as{e։F'14*kפ@LT%PN 6Qm5=g Sj&˝4Y\VK'//Jv%6Wd`p斘h3T]3z(,fUXVڿgPatXX#˷pΪK-LS-_PԚ(_2F\l<*?h) W'PKm1ie!Z?<_s %TO3xrGjŨp8$+TdSYd"(I4ͭ75o> /ExtGState << >>/ColorSpace << /sRGB 555 0 R >>>> /Length 29426 /Filter /FlateDecode >> stream x6q?W.Ʌ?u_fnf! <DIH0<2*+4C͂atEuGtwtVU_?}w߾[yJ/ߞZ??}ww?'^?;^s [a_'?ů~}?ޏe+嫼[sG᧟|v?~/_~_|Zۿ~_W>{?rt^~RϺqQgUޯ 黷|~~/)γ_}컷olo]>woo*~[[/]l%]fCN&}vc\y=gϷE">ZOf#vg~hD w1M>Y\qj>p~o}c^cKV>G ( Zjm|_S|~+]{{8e*^xΟS܌u> ?;d^mcvx߮7K~́׺^;;>>Ϛy#*etgg< jqw0^Sƾ4736-g$0>o$[ >zEG<`aor[}tR:}k0);v3!\ JJ?V/HZ2q-}L6})0bLm-72}I=:n0>U9J}|fK\.f|-od8V{2S\xGa6d|_u9FJ+K~<|3:)Sl4 R:+yulR)~lj\kj0% 2>x>}>9(9<ۑ(/2\l1b} 2|:۶Fq7NJ{uƛ:)fI)JGF0jEF'n}ddKcbHCiT˓WH=H??s}] W6d76#fxd<ϥQCq^\?t; !Oܖ:J| _J~p}e6ygw7| y~W@xs:vdV]Q:)]d>aO#^R*ݟɖTIV|&7#6c%20w<5Ͽ tqJnq-w9 #P;hxwwu\7}(sw(a>[Hd)97-$q{o;frzwyq 7^m-xȍ[-xj #:N79ea0;atɳaz~Wd1+x^lxޕ/!|gK#9JgK'](= ǛRz(JJ5*)u7_O+xy>[w~J}^[aĈoG7xmeF#-!膽Rka(1U*x>< kLGp\ۓ\4`?azUb̨{gKȘvBsKmȨ(PZIt㟿\ϣtR:!ltǽt)nyt55R:ds{Dx-&KC`? #r9ɫ_b$/itF})T*TBPR܇R')n<+zn1bX n<˝'LC7x4xq(uw<}4]ؽe2;WHŷz:󷾿 >[:)u7>7э7 )9qJJݍut=f atg;;-[?:y"wCO#N;bقaw;RNi`$/ S 3ywH^V?m`$/0yrFJ-e]ܸD$O qّ.ܸϯtnO@7.|mF#m<3t؉A;'vaBA;Թ@ JQB+K^u R#}#y=&DSÀH^tG?[ x/b(14/tGH>[:)HH}h2JG&JX2N7^ƉL|)u77rqFY\ #3!2mO%ObRF9'BJg$,JJg$Oga$/;bFJg$/>@'~%_xNAZ_sqۍ/Ov_x2Fv ϣ4RbtR:x~-wXxTj;,[ᑼ sKyn\7_0)u7.;1tR:|W R:BCdHs-EzG-:1ER5dw >ȘrFh|C}dQ2f$ss!cFFHi[c0:)Hq BJ{<_ؕ&CH-6().yFJmʣ)'L7pӄ0ކ WanAฎ3sgnAco1bpϣwp<.="yg&2H8yw-_!>'o׹EIvFJg$|-< 8Etz~ p UoQ%b2/|w[)mn|9vަ󚾩t'al`vFx35wK}$b(1A4oq)5Z*XCdtO\%1 Xf0sO2;hx}*y9y%wY;B{_!>ܣ+s5'U7Rjt8O:H=0b瘑w<q 7.-ܸ8ȍW?Wȍێ穑W`m',Ŝ<33Mb,!?WR}ܑ~Dv#Jt)mtF=𳥓R2H-!ݸo!32}Ѝ-FJ-}э#$n<[ >C`}Q;R !+o2 8u RwgR>Hޛ:Z(}.)x\Jϫ=[0Z{ zxkNo1bsIiY75u Ra)Fݟ^ %F;2,s.p+`1 ^ %Ɗ=R"y y9NJ{<bɛ3\)tر9y %>.yNzCȍ; aprƣ>[ЍKy!%V(0vw˙KP:2(uzbwpѼBJ%#y#y}-0blA7G[Ѝ^!S(Eɍq㩣c'm5"y%0Jn\ÍsR =:zݫkϯ;XD4F"'5k*09[H^Z2)m\SG#my\;NJ{ k\ҡx+d<;"y;ۯ cyK'x&l;NޡwӺdz !z褴<:FAJ}N^Ff'#0RjؒP3#ӊ dqMw0,0j9on<|G c[0;۱Ǟ<#C~%i /2q1H{+d`$/p-ꂑ1as\`$/p5wH/%%PȍK眉"iMBJ/Bn\| q 7~Va#5"y%w==w%=wЈSktRVמb$/[ݚ Ru[t IBJ%FkCIFv:Z\KVrnɯ5#7nfw6ݿzC`_3RC`_4C{z}; R"yOҕ'Q)9yDj" wCOJJg$OsmB !#֝\H{St@iqqɵ쳲7׋PbDvsbɅwC̓ p[*yC6$C 'V4oZ&È_VgS֊nea@$/G#-֝G#-fj#;"0ztD Itrr*)n\ڭTIWHWך1<aw쁁xYԆ!\Q/#NX\#1ñtF亳F&!TPz)XVsJJo ߄zttClPb,0grG7mY9FJ[(}sN7N>BJϼp$L1bĹ:yG5uw{@xΨwA#?fpQ~ ; v7"y\ #F TIto`c 0V$CΖdRj)n|٩HŻ8!72OZօ%72O#d+@1L.4FsvX|d #(L ȰߩwOFJ= ^0bY70 _yFJ[|WjK'k\}T#7n&-}Rf)pgTW&<#+k6%we|Pcz/uwY$\;c|-Wڹs )2VHĈDsQRV<#3`$/ Al7x7p2v_ĈQ^tٶ 3O.ЍK qq'Bn\bN^OKJ GtFF;Q&#޴ ;Dŋf!3DJEI<7btY`$/[:)qwNb$/?.)s|\2TIF^ɳ5Rjnc5F쑑N'{5<+;VXدsWXbaR{11 c+^,V; !k$jEIݹ#+O^KFJ-m5?@i+d߶b$/=ÀH^`%QTx{l{;yx!@w$ҁ!*^9Ww})]ՠ_ssR\J;2O*R1^SR 縣 *^0;&= cUмTb|x1VŋT"xҝ&e_kGtFȳRϽPRV'H<dzn< rq۲7Yce޹*e+dfTbUWy.ƪx!gjPŋv UⅤ#ܞ_8E;?̠=1W= 3vϓc$/ GGG7}r*tsYFG7CrBJ?x<[!*PR= e \Me 9 QdA/8rZ<UET"&`Pŋ+aҾ2,'cu$R0c ^6HET)usVȍ;s|p قn\b̸%x y2YpPד!*^̶6E`ϳE*^C \nPŋRUJE`"y:4C1ؗ> Ga@$/?r{Pr %7Ƀstˣ)r>[2L'}WRI#b9*^g xاaUȈ⠊cU֠j7*^UB۠BR:#y-|()՗5'oj|)X}<R0dd1"+Ϟ,>^YyE(̓LxGh!(AVŋhӺ_E^*TBVŋ\)T"ρÀH^`H^m3)mQQ:)#3!JdUГKE`R Y/֑PŋWeұ~BJל<tF8EIF^Mn%HH^`px`k0b!Rэa|<)uW>gK'ee~Ay2=)TB=xY/x!E$ UU"W UQ4JpHo"y}1V9 80)m}fn#stR]:)]l!kΖn֓ĈKG#-6/eA0)2\ܸq=05prDȍKO\<)+E'd<ށ2OR= QvJT"χyU8CE`?C`_ x봔*^ߩRŋh(Hi̤Ii/\)q/Ytۛ9A7xM %q+ Mq6(1[}R<W7*USE`!LawRBoɋf()]n,TW1H-?kjH^{>tぽXx;_KQc~4Rbɤxv3)]$vTxKy*^x*^hݫkwFӋĈ*{=RŋÀH^;V0:)϶{3Vc? !Ӎ%x`/ 0Rj*^q_n<#n\W7<T"(k0bXAWŋMTBWŋyWxE*^xӕ*^h۫k߼JJues1RjFEc$/J |g'Ԏ/n<;d|gԎn<ϘIq5?ҕz ̄yRZGAwK)zU"(UEoj21vrsTBWŋ5Wxx% H/{ R[Q:)#g:0xR*ҡT Xz()՘)]5dTȍWc*P<93s\ %FT4ر-}@ {P(E *^vSCHḎ5URqϝU_Z\#yd1bnѫb$/q0 apDTɍk(BJ[UTɍkdJ'ue}y2AS<+dVTxأyQi~Pŋ2"T"JE`~["y*^Z WBhj0:)LަsBJe;IJJuΫnt0D-JX[e | 0<WawUBνoT"*qF xQŋϣwssJJW$o3x_y=He}1%"y=Mn= ^)7x`Oz"0b8ϖFJ[;ttR:(R:bz7e 챋7T9TTdwu[)Uu0;تxy*^X %¨Qŋ>sX92xaE9 FgM)]Y5!TTTU7Rj+>JE7؋Cd(1VtTx`OWx`wܸ՝<(̓zF/{x[/>F/{:0;O/ýO/}7P k'ODP"y=MH`TwGk+w\k߹2O<32Oo<#ˍ*^+:UO %Fd^8OKxaEV6xaE1xا褴?0fT"r} R:VmT*Tw8 %%HAJW=$y>nZx{ƿQ>$C3Rfw=ݸQŋ.zYsA/H1}gSŋ>+D$È1]MK"y}Bu Ii],U!Mȍˮ!3RR-RكbWd&jF/{~EF/lUhuB/ߵI*^^IN6wU <[!VR%'/sb$/`~HEV=~kFnv50ry#qY E)d`ϰ:)YsUc٨E`GsA`gN^éxG*^wvHLť/ [k[Wø#y 0HWV~Mz$T̙[:)1f̓[)]s})X8z()b9N7nmϻ[Z,wX=q{|se֊%ޑ﹥RwFNJ{< #ys:Jl5T"+%cɅ}PAHf`Ʌhd-AFy(oQb<ԁUV(!\褴{}2H}[HuɷzHž>tyFJw}.(PbZȘn-WbŋW@wscŋ}^p2 sDQ o94R0tRcm&lt\ߎnܸE#}Ÿnv>ܸqzxawYgnA/j_#p*^\g!*^빎/ԡT#/u=Z:OH^`9[`$/z%"y-[{n<_Ӗ %F峥{f)Rc&o$ÈYΓ+^,aw(Es _FJ[ޣ+^,o;\-{qICcy.FJg$yŰWŋ"y}vi= o "1tH^Zr}T@;NJ򸹏AJGbEFxɳt{S cy!T"y TIj})5٪p'WEƊ/*{ѽaİOy2%U!7'KI+#diaêx!yG yx!Dw1h3;Dŋ*VŋY^ž^"y} %FD_Wў=/*F_FJ[LC`Y./z^&CVXV"yݫk}@$/p}VHi[Hi:5utRݰ"0V5}F<`H2=3RU0yraxjXbaO%0bX}w_ǴatR䝻+^,%{umIzx|*yx0bXB}whBÊ R*^h^%:RH4HZ]}$aɓRFn"w=ܸŜ7>1bHqmjϖFJ[G2:)n|<C҇AJnaUgl< z-3/wx*cyJXG:VXSfnH^;F1}AJAJGb(1bMuxtKxQ;x|NJ d)]/URXbajA#y c$/"y<#tx`a4Rַ &gn<1H ̓g;hs F#-NJ{X*ktҞJJPRKi? #8RFbp9/xTt} 8{rs|}w.0;Y5}K/ƪxLUu׮< x^i9 %9Γ*^sU x?>Ȓa0o0xvx`_)Hu#yNJ{Dva4t}geҁ1A'X/rpPŋ1v$@/89Uq< zU:U|GUuŨX/rh9 we= sU !7g^ R:#yr9i!7z Rsa)O~_Og͏g#㻿{/](z/=uyfl<'y|0N.vt,|1@Y*MƟ~w\?'^ޯ+N? \$cvC_?y~?}}dٹ??{}~T1:~i6Wr]K\L<Ƹ]XfT$zVm [f&Cz\03/F矌.~ϟlx$_]L. gw]=I?]~u.^To??}D(tW^s7ϙO~N_??_~~U憿W~޾#R-_ώ?_?wǨ1!H{鼘~\u!w޿?c$кW91,R@8)XU^i/X2N߄ioaM Vxqjv{a8Ë(@]x5P˲Ͼ}.$;HZη7<%e:Ͽ`ⅦFh SXqN[ f{Onkj_九iP\|;濻u_OGx̮[~Dw7}Wfq뫬Vw=wW=j`Vxkl}g ^qӞ^o,NaF.qS/>kiYw]H90M&?C}~3#5_ym~ xc/ B+1^οrwaۯj=qzgh]AwRX'>B{>y,͍Ѷ,tGJ?2^l/y*47ݱރ. ޓ]'煮ݠ^l/ԿRF;"v1l>Ğjչr$h/>#;fav?_rA?._QvO(r2h//ϧD1{Vh/ϧD^?Cp}̟wخOn>_@{E3v O_E_T= G>1dqnop wޭ: vւ͆ zA4OyIdLש hԿGvav#i?AZ+oԿH^t:_Tw]V<{@2(r~\l_Vy=ݭGDD,ľ W񸊚[l^WP}h [;u{>y쌫W_2_8/\()tAmw;VٞUWy7Vп^ ]|Y w?=&+W:]֣>[. ۋw?/CnyaW Z߻oܵm`{ʽivn޿社=.^x;ORBmG ^Aj_B+oԿ~wY'=cvVձ`۱PJ+oԿSA_ M' >߂/`\' [F;_P%q^5^ PAꯤߨy]}ċŠRVS; 6>] +&~_l/xJWXcO_!昺ߡ o s =5׽};>-n9 p_aQXԿRF==Մ#RUbgc0ubaa{pVSI|ݪ Z?^>$[Z {ܱBc_s>Xת^+ZطJۋ'zh'Rht|^jotkOPJb{kv&ػ~9_˃=k~+wThUTȻCz Hر wy ܭ 6=[ N׀_ki}4i}!&C@=n`A{_a z +z}tO ͕gxm'_RջU "_5Jgw;\wk;7FwZu`Zv\;_lk}/_sk/I .5@Qgqf], |,L+p>4]C|?,oۨw_u+X;WܨsR>Pw*, zEQb^Qnbœ:C{ \7+v_]j!ߓ`+A{:ZpEu\j$fEZ !J^Fh}Q5v+}}mpA~5XvF2Ob0-`Նvqeta OJݍ?WW6lk0MQ4zPhPiخ/Oz~f~5 ׬yذQF;t|yQDX+C5]df M8gvFKk>Bo@@ګ?'n/Կvl.}1ڥb;5<_\";{k mWK|aU;|aەö+~N b^Z+ԿultA>N|My󄅷*jh_'g zՁ!:pܶu}`) }3RBse0v[=m VϽvw!n?*:QN;t|`c 6jqoqԨ{`rQ2nZuΰ3ضZleA N:vEǬ5/Ru6۱_U/=j/Yg1fWcŹ \($ 'W+hd[W+cg^{QnvkigAu2nuݼzu]w?4lW:Rm lTCl JD5m C|U r@Qau  '~_ 'Խ*47jk.Wvw E{*4{z|yra_4QAڕCkޅ]C/D+oԿQMл6x rM07۪)s]L%Do<1 ߓa]ԽkWL]wm5j@;^m30a{ؿRmueSE}z$w2YGJCaSCPloa31 _y_Jg LHG`^. e&ۍD`XtlԿQ𯳐!<݋Wޭvy({6]{ű^ac;u}Pw lJ.yPXo8pV=h1؉/6SVEo^nUkkεwc&O嶎 ۅ$qaW̷b{7ߩ?8>ΌR03`6C{``힄;t|Baw|+F&}x6wh܉/9ӲSNutx3y:7o`w3XRF;N. *CbmȗF[0%U zW1b]л <G>%]H31XW}0=_uGnAaW}qVcfvq꡾8P_z/N=uv>=$ϧPe$ll@ VIwo?B{?vtVLdԝQ`,oKT~gAteו ~Aw;\Wvp]uc׍ ֍>;~A:|07nTn>t/*X_Tr }Aժ`}aqg2hX`8zwNh? 7<00^}c7Wߜ9M!UʸSScyOs|.1r-[PN.,Wl=[=д`HTPtࠀ7 wC=<;W-.vmxW\qkk\6<)qq }۸:} }x18o018p]4Z}ڴM8|Vz<@ ˵*W slraMUjM<Ճ7U5$ڃuk;'Kk сkի e,r^Mlz ==*?U5,O\A&VҭэgF/; c^{RM\ kQ;^VMo 7lSX6篍_Q{0CXJ,8as%/9 W;&vOq eN8 U!W/>nk4L⅗oҽѣѫåjwQ̽\=񭘣\M\M\ NcWs5665j:dxpQ3Vc֜j&WbĊS wob}Q\ԅu41uLĊ݉mv~|Š@ Utl_;_;z:L\քat|: u0$^$/KaBoڰM+1X0Ou,7WE8P :6\+}J<]]HF7Ey5 >{ݒI\d-w*dpJ3L,_mZ[Fx;b^K2A;ڃ &1U_dt^hטijXi܉WCO̓yY8.c>/Lbi|W_nڬMC뛸O{'wK,ui|m|kuK&q\;$ƇMQLaMX]>89yx:Oė݃(l&NrK6aZfEa=P6fkbX``\%4Ji(aiXzgPmxb 1q~?<Dž!&Ʒ_:s v.&h&:7FC΍sS΍$^; w{G;?(s>x4A|^%N[|oBcMNeÃuk5`\ 0q/bLYϗ ܃ aE5+M1hU#Ɠ}`qDA<Փ,@rܪbp֪ +L5 mL6mU&5LD?Ѷ=a@;Dж=x +BOLNڶ_7nί*J +J +w Ǘ܁.J665RwƇ |Ʌ@}o԰b԰b԰btİ靸Fv~;>׿x,쬯v~~_ubLbx>5> m`۴6>EWIzPrOCV!jkȅBTm";oџ5 MU6hMh2j'SQ0f-ZvJ]HM٢5"5e֔+1W;+ǠY͂IXeZ sˌ I0Wo\8454Eij-JS[9)C[4Tmqeu;q]9m۲$F6K+޾mgmc;1Fwbx2 SS[5esg魚?kݺk}7>-sgٟ༡6j[༡U $Ʒ_V-b]XNyuQ 0kajxpn7n[$ܺ޺j]|xk 015pQWd%Dׄ]Ækb`g7Kذ=k<;ߡ>u>_]_?~:rj׏!<_gܴ=Gܗwl>Mt/a߷u&^S_۟#/CXСO>qMZx}]~@9v>q-r4^{&lȃem){~է?w_yx_|> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 568 0 obj << /Length 1835 /Filter /FlateDecode >> stream xڭYoݿK(# x}%n.4DNDՑM65$%-j3|5"ɛ<$FR&H3ʸIp^I1JgkQbz2!KWiatz;yX>/an2y\u(xQ0)uP3hxwH]d"K+ } s+dqѮQ[AƩK\X! Wp 6TrrRga:n2 xh<{x+y!ۯѷ }=`*g"Qf jAÓS#.?$$zF"Lyq6P2&, ؑuM{#mK^40P)J===4XzP{ P!7![6By!c,V[/抧aLYZmkNՇ8n ۇȴ?Y j,t%D Ml(Bڴ_Hl[ sYƹjE\#ƌ_^ ՒNB^$qz{sD-4՜duۧI0;AJ_ppͳDH&PI}@W i'].m,5 3%ȹ<̹9S0 WҢ^gnЬۨ *'Pd*L']aU6l4YA ʛˮnr:A.G+"+Ð8l>g>oJEciƫwZkѸ*sپcR .Cb؀\E..~0g>>I·3s:$E ~ Ke%>Ԑ9Z*#gU{TZyjά juд!i] .8D\-61GڝHjg)W^^=z}o>w(5BtՊ-s,u蜠ZoZztz)i  =rEOj3H<}vclSջzFjc=х}jml,)(VsH)ˈaLeG쥆DfвPHocLooP蘭K CEmLH[Ins=5z2Yw5O@2g%) )6]W> /ExtGState << >>/ColorSpace << /sRGB 574 0 R >>>> /Length 753 /Filter /FlateDecode >> stream xVMoA q|\CJHi@!!J(IՐ> =ن` ׇ9LAc ~[\߀ T_ e=@^zӃZ-avr:KKsDeXT9^zAZ?k1ޥ"3YYݐyIA4cD`QVD!-%(QE v|"V:e0PJGڢE fSS%6}(LM;F}Z6Uj"CΚcŎ=h>5ɽ[SI[@UfgΦZ\5*o= ӄ=7x+Կa%3f-*t-a]>:x9\CtHq0S endstream endobj 576 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 587 0 obj << /Length 2442 /Filter /FlateDecode >> stream xڝYr}WV # mxSq$HD AYӗ(RA}tf \_v 3Qf\8Dz:W"`?^/9djnxۛڔt& z3Lh cCA1巡*j2T.<0Z'3MŲJ+luj7d ۚ[+l[5fO*^ijlTK sy l QVa]1Ns"r,u%j|هmN)lUnJ'Ywx&ZW!%>˫f'0eUt3N7h;Wy@yl}樻2I= ifFA;U0φTѴ~)J-)Y.,PӴ0%Iʸlm}?|tl so.*)LB+ӿBsp L-aP'@Jˏ˫_9AUe"!; Ue  hwA[/C6W)F?+ހ"XU<1s$۾ :Khد0H S94}U( 'KxFXxhӖ;#2LYycy/V MdtoHV+_:Ne{HUaoR!F1j;qD0{A5=JT򡉤V8X-Ni 鋗dJd´SR -5J53A˸s : %L^POc[y@Ka\Q%ta= 9)+@pYh K+j TXkzU[fG~ϋhb_xYjm3um>s4AӾax62bQ *g@K p/x_Znc/1o4650A%1څCp2ar,p*2VBQ5L5@PGqU 2QP=>>ϗ_$@i/R{D!f'81_P,U&]XȬSѾA.Pb2C#/NJ $-29niW/Zǐ7"T=prtY^'A"3# q;߃}9J*}?Sm^:3/j[E6FHލ:HYv 7J!A_AĴJ\ $@}Ǭ86g h̄fc[9{jDOfMeYq`[Uy~Ǡmdz*PFKV{b }ZD@SihlyԘiI! FL3pAwc /wm yH-~*tw*Fy*i?gV[Lz W!8MAyqD='d$^7u OR)D {艶2(@N CjU!&3&ðH) gXlpWhYY\|窑Ka3#l<֞lzm[oxkK06ZĻUo]S&k 9{[RH20@Aro^c6o4X)/ql}ԁqh{MOZ7UK˺#d ܄Lq[ҷ^UJ0A2 QGT@k=jM4fݗJC} A(Ƹ*$Gn"ڿp<| B,@Oȫ. P0(JwfY^o%}S$ )o:Hg_ČYS[pt)Lߴx%\5|=ߑRw\w9b.j#T#]κچ;y#o9ÈEs/LԸNQ̾?Pu2> /ExtGState << >>/ColorSpace << /sRGB 595 0 R >>>> /Length 220900 /Filter /FlateDecode >> stream xԽM,z73.~?6 $20<%Œ >Zb.9!{Iu|qv\w#պiFV=r~Q|J4 ]珼?2>$|%ǧwօyw܏FwiEQ|d[W#u=t?f ݲu,ϫ{ݫJ~.ν#Ǻ8e5#zDץ[}\sqΟ4LЏ ?(,#dkOj鑟OPt>PMryVY.O,G}Z|L몬\ɏ<ޟw~>h_xU$|엞a'<_>y?rY<9#IyrVgӌv#?wr>?vK~zԞ.XX?iV~Ⱦ~s="|^#?}؟|z%7iXi$?]Qt[FU>۞ϝUzb*xW8B/]%>i.H_g@W]{~X(EWy}V^>?o_ߗYq75t1骫\ߞQ]6(ϵ+z ҧN :Ogi>zjW_{>?OkA|[Y>s?ƺbyWJ_^o4}v>S<ӺW=/iU1nҞѭSy~2SW\@7_FO>7j}Wy\I}~dS߰*՞U*?OV~^߷X~^G'[7U7ЫbKA*wO~hxfXzU͏z}>e%߯B..*Rn飳>ZGeUS_5kzoP>zQ`SӞW]W|>Oe r=4зE\cOP_VJz[y)Uo?^3dκ_?wx/O8ѫ~VCc&v?ϛ˭?u y~nҪ3Yz<]j׭r >uGZ}|t[i=>z=v}u#0/]t__Hr#+^эDO=?]z>v2Ǭ?7l~uyK? IW@G 4oՏ&?^/[_L׆׆n~@w{z;֟I]u}|44]o՟4Ǘ ?|p7?Uoo_ߩz{< So3?_@a<9LQ/|>Y__~'t33Kj3^YzLIjk<]yZo?PT?rtS:znj?~oIG͗Tz{`*'@~%^U:.P߲d~CC6~ ۼzrְkoߗ_/e~cXwjO\WKW׼_RhOΞS̿yk:SY~` 4Y~M,?Ц#?a|7zO /Y~`'t;j@c|trj|ryB7zZ\O/9濗hsׅ~3w/]4߭$'7ճWm璟zGO_z=Sh,.}|zWy+tͷ/]q^PYn'w_ů|\ҴzWs{Zzz%}?\/ Mq}SoWKW]"?\2[u@?4j3k~zV{.>w}0WYU@ï/GXׂn~\~]\,W^hۥۺyRWֻOw1_)乾Ͽ/w]vxX<ҷk==诟h=Gk=Ž~/w2?pqoSϷnWfT{M]g-}ֻ&?pQo\p'/CHS6]|)Bgv?9Ѭwi|%wMzw~ ?YkKKwo5~k?Z>~v{=^nܚ+D|RV}ޯ2t-_hFѶzn? Ͽ4r~M=F?~]Tz;~0^B}hѷ߷x[X3seD糠q<?/?zҷo;~ S:~O'{J^ozE7+IyK[}=??o}?tgCG_ /h.ޏ<?P@zn4//?=}*{U1z=^WX=~tzwۛ7zhu@gf˃S}Ͻ>V{&[K.>ͯ7G~c&|t=MwY?;'Y?yUjK3nVۛu)?Ewt={}@mיxz>p3>]/\}7o)?7szr]{>i=ܟr%?Ey+KKOOygiSߗ{K>.4UrykAUoߪUp̿e_5M~ };?TotUIZ~gҝr'-ݨz}O)?՞Ѓ˪,}~oz{wKc>Ign_R{o[-?Jp4]< ?Kꯗ̧/]5~&=Uoϻt{M.=5`>`[dW%wͿ,?E^oj/~?tjM׫߳mzߪo}-KjϜο0_te?@w]/=/?5 }>WT4i?zu=ϫkBeבuguבoO\OsggٵG= њ???=_ӵӷ^3t9, O_>y>ǧ _ӌܲO~um[<~y~?گK~__Ӗu8mym /Tٱ/?{-ErQ\T関Jy_AJYKlCdAγ;eg3S5q6 ٌg/)d?/C <ݝGhBNAJOYklƳef. [rxSwlU SSd?1R UzւyS3y4CT)Q3JOY[hS٫*=e)A<#9݃g3ًSүlWUz~6Y>eAO {>3ٻ@}/PA3 QОgy@BzxrJn%3BM* z@}:PA1TS(PA9HҠghO Ti#2 UtC* P,Jn5WTi#g U홡lB}JPATS(PA9PҠGhOҠC$4蚣=wPA iB'QAITGPAО*Tiga* :O%ءJ,4賾B}_QО8r* :O%ޡJϳCߡB=C{4PoKCGPAz+4PoKC~uzҠCT4PoEm{ҠCqlUtjCVTiС8Ƈ* :PAƑ>TiСފ*=VTiСqUt8* :OJVTKwCGPA4PoE]TiС@:ZҠ,4PoE~u{h/?^~ҠCUth/?^~@{m :[Q~h/?^~ꭨҠC/?_~@*=tVTiС/?_~@oSZ :[Q/?_~@D~ҠCUz/?0^~`xDꭨCXoXG:Uz뭨ҠC/?0^~`x* :[Q~̗/?0_~`CXoE|̗/?0_~@TiСފ*=v|J>gCPoJ>-Tig*=tPAоgҠ[zD?U~4WPAО-TiЭG=C{* 쟠J>'CPoJ>-Tig*=tPA?A}Gh-Ti#'Ҡ{hOPAо-Ti-G=C{* PAT顣* PA4TiСM)<* {hOPAОJS~4G=B{fPA4?J6}[Ҡ[zD?U~4?* {hO 4vGm~4?JVTiСޖJF?UtjPαފ* :TiСJҠC$4PoEm~4PokPAF?UtJZTiС@:ҠCtG?UtJ~4PoJTiyUtJTiС@;ҠCUբJ@{h/? 4PoEh/?^~@{JVTiС޶h/?^~@{D~ҠCUz/?_~@DCXo/?_~@c>t/?_~@QAz+)/?0^~`ҠCUt/?0^~`xJVT_~`x̗/? )[QAz;_~`|̗UtJ̗/?0_~`|QAz+4Po̗/?0* 쟠J UYoJTi#'Ҡ 4Z=wPA ~4Ti#gz Ut~4B}OPATig*=t4Ti='Ҡ[h-Ti-G=C{* zD?Ut+Ҡ{hOLZg* 쟠JTig* P~4TiС@}GhO 4TiС5ϠsW?j֯z@C}C}:JPuWgљ^ BgV|:k/c#mE'K9ܷ =o֔9e(-B[L/rJOۧw[oY]8Ar20oyn'-so}˜CR o%;N9sVcD[iΩSgO_3}=tZhu;LUOr*9~}o׹z\ʹy}d:m ]ܷCvg5zuXO 9NK[AGrtGv~{W]>)&i^E[s6Fo5\ܷ\LrE oŹS;oUn 77-޹or܈i$_9ݹo~;\VrA[u.h1ΪoKz{rjO9bSJ[u.$osj&wܷs4!&ih_1X},9m:3t[_}w[ٹh:u^vOrߊo/|osBs. 5 t_oZ:ܷ|=tz,3 fK[1羭EG?C۹f9׹osVHkw[qF[q Orߊïv}+%psJ&gܷrߊ rߖ9CfY+oe\NVe9Џp.okqA#-;ܷ[?~uC[xܷVJ[qN,osǝV8ٹo)V7Ǎ3}+W\ǙVJ&e`}[፾˛r:-iFos*Vvu]EYrJs@V:߇ܷz9GYӹsz˹}+侭zx澭wSob98rL[?'8gܷ\frߊo:7N~8ܷR7\o_ji#Vqۚ;sEׇ6ZKHy5>"mM J^~ Ɵ侕xܷ29pO4"8GܷbN~}+ܷ}1^#8ܷ:'r4sߴ1}ۿ'rߊ}+ν$m?ܷҜ'?Pn?o1o}+s}ҹoVt[q o9A侭u=׋'rט!mO~Z*ΓVvΙu-չr:UܷΉ\6sߊs}+΁ 7}뺾rt>y+srߊϡ's}+i m 82}+;7 ?p[qnoڸ{y~gۜmoz}ޒ7]oSBz#9hsV=;sJw@ٹhϳr}[D9ey?o%Uޑ&p}ùo?:S皑V:3oŹ\眑}[0K=~侭Ѭ!)yܷ\Rr;m&z7rU;EۚOso~侭fmok9q|V/grܷ{"5s<>ܷ|o1~\5KrO@ߺ>}+9he}y&m_orܷҝcܷ{'8W7ϟ9mu_̿ɯVL[Ν_9o̿3mDc>йoŹy>ùo}o"07*s[q.s}ܷ=@[q$oߓV^o\-y~ڹoۏM_!~侕orܷIrߖm~s}[yKW@[)e@<˜W=侕KsVXw?UXYڣ o[Wt=}[q[z9kk\hs߼>ܷ¶HyŹo/?PsVp }[s[ SV/7ou:7}+_q[In/~ E[IL%羕9徕ܷT~6>~6@I}s߼ܷș#mm ?yֿ,rz_Z$gLoI}+\侭vWku}+[\>r йo?}+9_侭 g}lBy?ٰstNw;mo;eW}9}}'9-Mo%Mzلγ@cEes~ܷ|s2/\9AN#os2u}:-3uC8-'r2we8m]g:Ͽw.P{t}u|dƯ}^z xZNՏOUکZ?<>asծSӟECTg6C9k13X'󏉜ɮpCVs1ȹ\w\ȹ. r.f,~pVYZ;8D8Ϊ|8 Iම9dFm&p.v\L6\\L ͩhڜْ]$ypRaNn.IXžls8k7Ow}#p0's*컣Ι"$=s8} pX6SlkbuXs8{Nl4SCVpJe_N!N)|>NɴgWs5 SXg1Sqɾ88<9x\ag_ 2:ǩ͙WmHr5}wkߛŜ8 zZg7 9% g-._o8|g ŵ\X,}ap8pLu=,<U85\ pPd3Ys ~;Ca+Cv.w?N>D8YgAj78 /S)Ѿ־;pe2w_o8uN'{_&n/N~8d)7+s8{/N>|h|puc]9g~o_GÁ\ilt4Ǜpᤇ>pV͔CA[pNp8p6ΖjG996STs8aGøߛg Ngml[>5ko'ۃpS8~us8rկ?~g <~2^|7}pvێ^nV]sz{L95r8*N'$IGp8S:[2̽hypWp8Es8}+p +Uo$/p8} p)N2ْ8' 'N2M|^~Sgp=Ip;8)Mpb&yWl'yاm'SIˑHNp]u:9hI'ڻ~y'l͡,c N_.p88]$ߟ ir蟴'30 z^iG7a&i~BpVuur8;9-9WtkgMcۙ>prr{rb{9_dy0#6/sEZgK;s8ߧ\l s8Z>9Űp g83s8u|s8Z^9͙djM'Sp|@G7O9 r|[~='Dߚ)~} $p|OAWOjǫp|R9oi!s5Nts9OYV'}NW35 '{x>Κ?5旴)o.Ypp4_.|ds~p8j> ~ND89\ ~:pGd΍2.}p8kq}Zp8zs8etOV \-ip2 pU%d-{} xp2pG8̪9ɷ99R8ϿUSs84Nf~NfN(s8sUdsp8-J Y6o'{$N.pp8&pd2򓛻I'prxf7s8~o'g[}w^19Wǃprd֘x|hgS*8x~Ϊ\ǿpr6gsyKp2g\ Yϛ5ϳ%d3ާ s8p>dgշp8ag[8j'3?j'{_<*V#N6)֜p.eΦ֜Z#ݜ9f'l{\w8c37Gp8k~q;\rr8s7W:?˯N@3wY}=ا`5wq9=zrdOɛq8&dgdsp8ٜ/Nf9?21s8k~p2=p''oFNf~I2}p?pp9ur8T~@㭾 ~>~dr%8[l{=-z<n.?nl?}dsCp8^0p8Lpp??9pɬG8|Ix}N*s8{ +8\d3m)77kx9=Y댾5;po=x95?_'s4b&y 89L9OG~7> ~~ /ϗp2>l57p><%m? N~{>9IN!)g_I9.qAp8_6x~I~kr8ys<߮dvٚY|9l''s&߮pJ{}@N6Ge{1e?9va[?ߧ9gqs8 ?P}7ÖПo67<069ap᜼p.pns3}ps8Էfn\Vos879[pmަĤ~o8;IG$)Ϝ 83CY ,:A;ΡcP-Ng} =qtJ/?-NС*':A\'薢==B{ :Ou)B Qz[ :O%pCt%pCΡsuF?t5pC$\'? :[:Az[ :NСptw:~\'?pC :;pCG?txpCG?tw:A~\'Po|pCm/?^~@{ :[:~h/?^~pCth/?^~@{:_-\'Po/?_~@:Az+\5/?_~pCXom/?_~@NС 9tvx/? \'Pox/?0^~`pCs/?0^~`x9tVNСΗ/?0_~`|pC|̗/?0_~@NС :u>'pC<}[pCG?~\' {h-NЭG=C{ zD?ނC{ :ANgYouC zD?t~\'wz tQОu=~\'3C z ?:pz YouN='pC QО-N#'pCi Su8\"{HZ*E(M묅7Gٶ0<2V=P<{n:kPMi'\gmz@4:kspƄ<s)a"P JN"KNA64?G+uX':nm^}%@Γd2ݸNbNP$]Vt#CPC:TC:kiNָH&]g-s sK@Uw΂"@`b"/I׹&$];upuK?sq\p}u3~s'qBu&Lԙ !Pgr8Wt&ҙt歃L7L3ALq9? l):gr Y: }d\Rs@űd\@!sd\d:KdY:7%K_,b?CΖtHrNyed%Kgzk,.bg\Y<:;*KZS~ttd\^g孏3K纜M^gg_ҹ8[Y:Wggsug(K߯?g ,DƘtgM:K',WtI{tvv|?tvZSs,!e1_'yGY{JYEId;Kg'W5L>K,Ev>&Kg]g}Ǚ|-Y: 6Y:3g=ʚ.{8[Y:_syt,gQsMʻ@5ttYyϒ&K{3K"Y:gi:Kd^©,St}(;SGY)d|ߏ}I>,u[ },h;g= ~e,_gsgt#g鐑t2gG;K'9ۆ,"t~Ϧ,g1K'qtY:9O%sY:tdylPgB6Y:pVN#GT^ 듳IS<ل?:K'Ug鬼YyY4d$qN,2gc=tr~oI !K'9+,tSYI !K'9,tBIE,ٮ׋,l{i3K'g謼鬼٠=mg$YnO}9Od ?IY;:+/9K,}=ѰI7#Y:8Y:Id餝]5ɒٚ_dIVY:i,Y:pW,,ήY:?O~`gFI2#K'9ˋ,5ǙЮƹU!?DήdCNn?~5t֜lG?Yy;[,Jtǣd$Id;K'OY: g$/ѰYt =7Y:Y:|8+χtY:L9K~l$ˊ,٭I;:+ootGgltpv@n}TI,ĄtRg|,,t\ϝӹ_gpidw8KY:5t},gQ9Kكq6tngŐt,,^Y:tnt8qg8kr;KwN~:KYҩdT[gg퐥)gOgx,B=pǧ)<_q6tvV Y:;+,&wt2,g*g8Y:,8K,Mzj>@1tΪ8k,tdԿ.5,l]t$Y:ZtRv6~ 3>%K'9,u=o?y>,ogz:K',բR,XtaYgΚrzľIde:KY7gbrΚ߱5Cv7K5}ꙥs,XMw5csM,5t旔 C峿YVSK: ,~d\Y4tE֖t}MgΗ9Kζ)K)_ozu}I;g,yIdM;K'e?tq,oI: K'%gl?ىY@κl֙j?{gx~Y: d$g!2t%K'%g8Ydx~Y:z~,+t;K'b,X:+,G:K',DtYHN矝Y:^t끳t5q}wz,tCt<,DvtRq ~Yd$nuNVgtg1;K'glcgn@#K'qt<^qξdGG{Mljt'ٿ7tzANr$Y:aM,d+;&y-9;7=d$wNy>I=,,Lt,w]̿=g,>TgCξd,}_zƓd>Y:ot=ߎpv_P ~㷹?ng Y:z$4Y:y%Kg~~gxY:!Kg~,}I%KwIβ3K,=~&Kg]jOdYyfxY:;Kgݿ}?sNdEFg׷g9,t;g4kh/~ldg,e ϿUo굳tzv_3~,ԝӼޕh~`8[?0J!KK6wg?u6o y?koC}C}:~:8>qHTgmPSӟ1uy|wjl;Tǧ?f;dosoiol. 2LDLfެcf YYu3fpa>bf:)fY.fkSZJ6^mֲ|1k3i3pm>Z0!f-?lְ$I\lys_,f)xdM[tdFGpͺ+ldvКK3a5ККК@h`КAҮКAК-|VК17vӞO`7t=HsPτ{\ՠ/Z3y$f}j< [լ{ (s=`B5_15 #5cNP_1O3#fPE VS,%vY+F'ҬkQ] 8@I!Na4Y(1C3,f-d~~fnO=xffg#iUnfENAgGdnfz[eM,+i\43 ff^l923/!7 Y_#??u%%_݌mfziJз4335x~'lFfyiO\6#>ddI32nFf4#3fd;32̱lFaFf0#c֌L.3#_fd6sipF ~3jF&]2CSfd+fde&2SP$1SII|=/_Ffy%4g45|3j6skP{l& F챁2fd/?ߺ8IwQY g 6ތ5'20Ygi,5c#3x\W32`$|iКfP'Χљ@fdLf`d<~6#"32hY~ZiO~^`difE{|&\7`|5y0/^Ș3#1#Ofd.3P=~fd.Όڌ#32pfd,qcFnj32_032kafd#|V=~>`d6#~M7/?p _ox32i,3p>CK{adFgbX3#s16#~'#s 3k ?16#C"\LA32Z gFGXCk=9fdnG~\ gFf 7ziOfbu.ָؙߛYÄ~ֹ?Y:OFϚYUG{Jad3z#sqk{fd#Fx`dVp&# mFf}afd؃eF002gH8ƌřSfd5zLLzfb&XUxad| ?hFf~~`d=q}f`3x>ad.0#s\1#Sc#/02hOܷ=wG,m=7.\Vߛfdn&&|7yhFf73+m_f^2mf̟̮/02{#?02Med8f32o?4^܁ay327mFㇾyfd.~fd?\_&&3^2~?~`Oҷfbw}'5g*)z?ƀx|gF3#s{{}@]Hhİ/4#ciFӌdzfd~gc9 _/02 /|{~~@o?yl?fdxFL*32^0#Ѐ5_/\3#9Q5#Ù~ h|2̴t#z33->#zZ_a>t32Ɍ Ɍ3jߌ goFIf<`dz̓\f<`d.3-0C4y4#χa=~32fd4Q#Œ fd>CڌL֬;f`8Uϋzy02<32<32L oF0Sfdil% k 6#|fdunF3 6#C?#iFƿ32ߌL2#Ifbτ7#ˌL2}ڸ9̳8G!2g1'{yJ2cTYq}޹CyY헖ywq""5WVFxx5'p(5*^S^CkfcV|3aCx.ɒ:V;f=k7*c}Iéf1A^Zld"rPR^lū1D^s݉~D^s툼^P.!)F^se5"k.5B|kvg((f׊ff1sB^sHk4y=i(|E!򚅜yEB~uq!Yd!Y)5܋ l Iԭ}06Lt}vvٟ.+Cf m >4wz1# 4)A'h65tnA5zp 7 Cg3l&LJ첣kbOnRͤKGg3Kov2Plqlll1MXSfO$l%[qV[q\t6l͇]:X:)f&FRA7iqmVPff2ԪơUg3"M1:ެfxb+nhGjRg3zHTs*;!:kJ]Erv3,1ɐ8iAy!Q_ :TKN)3:@tP^ :]#³c>%[q{tS@tP :'N*tS@t[ :Xnhnj ko'?}؊QcRg-oΦ[ t#t6Φ[t-8{g^@uzyќS:r : 4&P˯Φ=:r:~Q=6AgEuDQ,ʳN+Q>DqrtSaAu"UTOcPڑjjH2:EuϠ:Ĕ}x@u:ɠ:qNTg޴g(1qE}Lܻ7N:CTgz3(NgRTz )!o/r:{tQn*#N_8|Q.:N^;{*@u }.1⯠:=u,1]KL{S[qV\7NO]KL;z:rݠ:>2@%ӫ78㋭^DYb+vG(^Q(Pw$v.Oq|S͡*_Ti>:-Q؊B;{+8{mi=:TnP:7]PƬ_Tgw_TCiiGAub:y=Au8-d@Euz@P@u N#LT!_@u N{D"$+DAu7:T;QvÉv2V\3UT.oPri(IMT%@>:-u-DUAuGgǃFݖ:K )Pg Tg{ѝ׫p(NeKtV\^}M}{OkV.s4Pfj: x GP|AuEuEuDuEuKP6DK"ov>/Pf,?L5iCyUg#zFݔ:.z@s|ii]t&fPT5? M:׉xZ괪N'VEo"hUOMNAuZV_T4-ԯ4ɋ*@>4:giy:T'\PV؊{}l5vEu9N+zoꐊ[5%Q{QQ?Q,SozKt<:$c)QӢ:oEu3YPP.^Wet{$Ew(W'Ձְw'%STeձt8rqKT Duiyq)п<h1QԵ$^PT%Rյ(~Dm':)5X:ATR:^QͰEݡOE<>NcLTUײz)R@u:kQK4˛4Ã84^EuZDsoi4Eu,=!Ӛ~EuAuzP}9_T+R/oA{xr:m /R:P=_ԼN!i] Nmi@uZ4:F;R'4u:MADuZ6R}_TYT'v%}=b>m_44:rˠ:ʠ::MQt9EwDuZԼfzPFiQ:7Eu#z%z WT&Ry:~.jE<`9|PNX:4K:-u07N>ߠ:Q& |WTQ*CTg?vG6ڑw<QO.ձ4Nx(PK-XITDTF +h @PDsAuP7Q@u T%RP;4`PK}4LDuz P|@uyTg (NSӚO}iZ@u,$ԅ _WO8%o-|Ti3Kyuѝy}~T+i@ukDu޿Ʒ~Vt@c?ZT'oPT'P}Es蟆s0ޖ/ci.Q|D<ԗ>OAur0/Ky 7N:O4uz:MNqBT'ӕ%CX d"5Uu2ϛx Qg@u\F{Fl/c:QVD"5D@u,-'ʋ栓:I_;#^:Qfu6a}=Qu::o=oj'p>W~'NӠ:c)IQiNw:x KP?Aur>}g<& {:-u3Owq?(Nw4Jىdug&D@u\iUԧ?]9OK TeJ3\;{6x^Tx@TQz@|@6yN%y6]9Euo4с@mgRT>㉨㡨㷨/l[ v뭢:'?V3xlng^ :ω?&D?Ygi]+q>>5`q>y[|Z~[A|Zc|[źL8Ylڗ!?0gȜY^v7;<#yP5nu!Jg_'t6GgC :::=jΆ ٲl@gL q[6<gΆlVKS'cP ĦрAlx)/qsZ M!ĦbS@l vGĦhNBջD;V@l M9F@l,O 6̿Dl sr=S $jw,m 6cq(i~Mz?MaKSĦX=L"6Ymj"6"6EElƘlc)u{'6HYV\1/bVFL &bSMI;Mؤ@Ħش%&К_ Dl1XNEl\q FĦ`ش"MA!)u}E!477M-Mظ bCz$#bӺL 6d V@~2d)S )urbK"6"6.Iظd%bӪIԁVHnR75_2Ԩ~mJt)[ 6aT&m8TKgHyՆ@X]Ziÿ'džSDj0r:m ؃n տ6hX*@l4̋TS@AlbcuTS>{V"5TF"]i)u8j 7WlSM\"5|gmb~xvӨ"rCui` 3J8@lҖb ;?$&+Ẃؤ]Ħ6~M5EF㻈Ft"6i/+3vxMV]ą" 6El6kQ ')=i".SCb¿׆x~X_ piIDĆjP 6""6l&bcȔDl )uq"bLFEl@x?Ya mDlElOLzfJ]& e̔L BĦ- -L?3Rw~xHM'%fΝ[~\қY?GmA"6W%R3%jp$b#,bC!I&G[K"6 6ilFۅ KI&_"6,DlD_ĆKJ]"9ԙ-bs{}@lDElq"Zm"6ן-4 'b#.bKk"6ig!Ж!b#$bs/bs? Zf xBP>Gx "6؈/2SAI[hDlDEl0'bm+"6i!X"PO"6{|ElEl&[K8؈8a&|VĆŭDlƯ Dl: .BJ]׾3MrߵD<M 6_ؼ{9|&5WS&v?7El4 6͒ 6m b%QF&BDM:-m=/!bsy}?X_j"6j"B'bsh^!bs{ҮC<6⁛'[$x@Mc%n5Rf)u馨XbG6"6]dĦbق4tSAl){ 6EJ]o"+R׫Jud^E"@XURĦ bM鍔7KtSAl:)"6GJ]^) 6SnJ*MM7EĦ2 bfߟJ]'Rza^D<Э bӭbc &g<rB .tSAl:X|^Al㋔|Alzx='ByZ"73Elz)WfC .SAlM7%Ħ2b&ĦkC@lz׿^"9O(DhZ$jGKM`<|%nHM 1i 66X=]"6VKy^="GڵDlG~.bCyDl(Y"4ķ\ 6G1-;%\&6@V(针Mh.⁴ϐRDӍoDp,{I"6wDlXIfLc"6+g#b3E&1xi"6]ĆlL#RH+IĆDl/8\6⁩m%6d2QfhY,b#-bCDlDdAl\_I&SAlZg<[r`P&=Mix b@l~LNe/b#-b3<^y~|DlvOG"7؟?L0!b3_[ΊY~N4Ejy<"6KLyAli,%B<8kxRfiaLfODl؟OfLm9Ʒj]qfxҝ6moJ%bwF.b3? 6b3EWw#b3?"6[ĆDlWbF[f-rxi?$ tl1 `Ӈ u&SM6M:l: 61M6xitj 6}+3:tWtt6XlM`"6]M7~I)M(lk6} NK=8-'<;~7W H'`c##5ljr NBl lnln??h7q԰v$`cDx㝹_iߟ l.8 H8a}56K Z#lx6/`i lms?͠-`c[&K$q6&\$, ذҹC<|l|I ~~/H(1N&"⁩Sg_& %`3I!MƄ uŶ@k-I~:l@ tT8l[鰉66Ja8[eimm˶`|Hp&wF$M&$a_M}}Xuؘ@F@P)6DN'6OM$Ľ/_ ΠY 5#g d31ANSaɄ ؘlac `#fy|z& $߄xHtPwIyBI&&@nHhas 0=:Z/`^τHPȄ:uP#6;2.F&66Hx!.lm*mp$`Wߊm@ DB,ɸ6lzH"!`Mp6 l'Mo6=*/`B _`2e@}ю:$lx!ef< @lNlI  `uZ$0 `M`c%`uB  t66]:l^GĻt>4l 66Z%~ w<봹ca-G~{ok6]  `M8l 6@&aLz.N:+6x K$],ؼ@~3>tx` ؼ@wl+M'F;t7 ؼ׃WNM<ls&l:lKJu @ \)[:kX ` /'n `Iy>"{Mn|`Y?MOU`)?M&CKl:Y6}2~P3cl%6}t 6 t " tC.@ `z6{|c`x|8>|u ܌Xl)xlPxr7/`%M:pq?B t t..`%`/`zM~6`Z,`/`Yx[y1:?j6]@#`M_3tl:C6]/ @su@N66 ^g͈;Olx@_'`$`l%oq4[xSx)o?b~C<&`~M'@l/[@x666ҩC<@Hݮ/`^?l&.`~-E

S2id T^n bk*of,xC+BsRhNR-֟Mf,ja69oQIT4g !Sb LM'Ê把E &s9ۡ/PX܌;O΂jNaBH49?ǰ`M &7ɢnYdF^YMۍWn:Qn:Plu>Kn:9t3l7+y9(6݆N wG8'`n08x`0FEi܄mɜ6KXŒq\dS`'8.~ p 8 ӵd2-0N=0#an5p`ֹ FanaX`N20o,1Vgv%aqn6-ۓv6qs#aY>29r X0ӧZ098=ar Cq%&y<8 CtD`?0Nz0NtM;Ms-6A$ 0V yTqF0*E2C߿g3_iڊl/ 0qf6`' \;-wX\ $@Ki"TcNji8MG00`{ms89$O<`3,Ϸfu>C6 <:|RGq_q[K066.0qXM'aqb.c's۔8>`$6۬a!>lZK?O8I8vs"`axNdqndq>$s ۰v T7'b~&s6'm">a3!aa,av4x~7mQƉqF1ƙF8Sg $m'aGOnaIO'avzLVžMq?qoqH~Na_aƹsoc11>I; 0Nxlf$&#L*|XaJ8?7 mM)63/a|qz6Cšvcݘ\i!h+dcm7dOn#ݰm-5h??>7- K[L~ vcTM# 4Ovotq,ƕ0,bNiy>[#Ob_8O'Cqqoja0m7ϴhv0^hq>,<0N{єE] R~ ] ZܶP 4a8;8’8U0-m8? C o 4 GaF(c|"c|"#<*C!q*0JaaRa;? TWa&lR#+c<(cqaUߚai.0N/0v5aɿwa8OG `Ig `zu=q\¯M~IXp`=ѾxM0a`hO'c,8د[q`x8al P<*a_8۰ |_rq ,qǻ\ 0 4a![pˀkqkwzy8$o'l0_q:vpe8źx88K 4%C56, ݆)6ǯqp 0NӮi?0NfiLx`eqLw؁&b ?P=~`%S=~`o'M7aIt*%mӶM!S?P ajJ1_9#/S_zڦsM!_-ar?ЄmqZ ߟ0 tE P'aga87%y(؈ަަަ)".Eo؍DoV(q F|*N;_Nd-v,K6WCosCo>&OMmH67ܨ+Boss\d&\$|>ӆ697%Ss.Us\ |΢Z,|΂Y,vsɋ9J%;uL};|t"moxs(|D3YϙhLL;ss,|θ֛81>g3猆`&A ղTl1gF>%] ==>sj/#S?c |u'so7|NW'!|5s\i$4 9ǃωs>!">G|N$iɻD>^g紪&V_iE>%|>Us6Fs<#x&z{|W]xz=8d=I>^/sX@|NM&j|bN/ߪs9|lj~|N;sRSϩϩsjAS{d9U^$e9Ϣ,r''͔PQ>Z>bߕfy#ϩϩWu |V^^|?~|qf |9ڃs\e.cqKM}>Q9-ys>5ߚ2Xϒisb/f,|Nc=R>g_/SͿϩ) >RI>SsRӪ2e"~454Vz̗iQs44F>&=>Ȏ">^G((~|NUSͯ'>gȗ~|Nwe9ʅ؟+ˑQer,,'d9>s*ŋRcS)GC y,glȒ(SLMYΐAc,'yd93s|N}ss<|N%_O>o&S-Ss|N5>ϩ9b9uK)f5yWe,9ۮ A,NYNyu}Sr Ͽ̔堸LY9|!T#9s'x|N^ի95> '&Rz{>1ϧ%3 a*˩i(xt(P3  We9f|}fq4s,,cfUix+!Hބx@x`&>;߿h8jLwl88đ9}ǮM>W+3z|NKއ-sד؎9;h/K3>⁌ws*|~^G<|NMOmb-[9z9;|=}}s95yZ⁇STe?9U|N<|N|N|NMff$C|'ߪ$|Nϩ|ҥ.c_V7IOP9bJ99_x>R N>* |N]5VTeB95y䙓>N*OS??[%?F>̠=bu.U">?|>KTs+|N|N5ϩ]YPU-|NU6S&?D<`S\1__>Ԕ[ϩg*/@#s*9)ό2]j+#5>ۆ <Ίs|*y#o|NUmx"x'x"()߉x甇6Α S?s}D

gA{<_>SXϔ)TsjQ>vV|N;|NϩUޅx"M"[(SُϩsQ+n|xqZߔיē;.ӢsX9^>S)%SϩTyE>2kU>6eETy5e9Jgߢ}oJ\ȷϩJ9U> >RE>&99?PwQ.c-S >&?@e>.x"SE*x99d S')(9~%e9%ybR/S̷)d Se56'sJ4vsv/3~u3xSne7W%S`^1tyg}=>ܴg2-?@|N?|2ysS.e*K>$⁢> &?s |NQS(,ɇ}wb9|NQS){q9e9E|NI^&%x%+^gi_>(gy/r)'x$@I)⁒,ʒx$@Q^SM|Nw" G)k)S>(޾|N^< |N8>|N^/:=Q"(K)ɣx9|NY/sS'|NQSs B1zUs|9Oܿ?sK<0y# S2)OD<0甩x ޯxLe:e9|v>g1OgB{< ysʔwx_>(ω_9e) >'9|)>'?|N0)@9"9< a#2ysrB=:| > |N>97>'"S}d9E%|N/y~N#iye(>9E&|nwO9E<OF'/~PQ> ye9 `X>'|N/|N?|N>?9e<x/۸~9e@9e,u?oۗ)Syp_>'S>'}v>'|N/" SH1>'ksJʊ|N>99|ϫ||n)1uƯ,$?B<0ttN|sJW>|N7/S! A>g-ߴ8@4yP9{)]yO9(9E>ty(sJsJSBO9S >'o2^9No"}>PZ>'>?&Ss})a9x)b9|s s'}>O)~tEƳoC#|N9?!D<)S'S@ηշ߹C|=WmPۜyF?{'맹uOzX \gug`I7hj:ur/|^d5k% \g/uW;ӬNY:{3AӄwiJ\Y*;p pfuy٫'jߋ}a9^ Sv(pUJ~ՙH749e;:8CP%Vwra9v{y-lB'o7w}O뜵's<zس0^\e0q9,/s矸Nn9Ǽuz?W%bn^;ufgiyH뜅:{o4uۙg1%pU!9k */ӯ\mu9i<R:@^ePA0plǝ]Q=<&NrzήlϾwtu.uήp|~p iQ\gsvyw8Ӝ8ˌ2qC]]8u66p{\߃tuZَ;\O{Ьs|pݮYS?tpup/8{:;)}pu~lǵL/YSg%u8'=d {-܎"o,: st?5cuv;ұij:|:-ӻz=:-m>?ɾNtuv=َkN2hQ5j9u~(pt+_2>pݎ>pFp%NK|)pcxB:-u+pFsuoDLgM}B:-u0pa?1b">xԍ,gsFoM8%.y,?3ڥ^& )$N'N|"omIMxm:Ϳ}30pfyUpw|\d4ڻꉯLx_iiimp4S4o뜬8ߘ[\đv=,ہssAb}i:; &uNM{O+icGx"H=x"O\9E{OM}a:g|x`;{'ΙߋX !1Y'P'w\ouN|!b<'x, s98 cp^}Ό[|vW\^%p3~5#7Cuvx As[(CRNK`:s8NzX~Ӿz[Cmux{"g9^O=X_#%gG9/5߸:q")pswL|\?HO \d5o:M}ns< nݎ \G<0R' \|pN󾏁p/>!;vmo8yuNxww| \眿8S_+p~sxNι?6mǁiBGι6ma;}}u,pwymN'u(?:>^oa-:x[yoTfղOC󾯁5>1V+ωd}g<W뜶xNY=pz7i/K.griC{z:M\wuk뜶G<n&p>uN[/s_:+ox[<my:+:m?]9ף%s9C9σuy_:gt%Ciuοoyt:~뜶8NAw:-Sy_:%s>|+>ߕG͌Gό.su=p|x9%:9 y_:H)[Yъ-8Iq Mq Nu \~R]On8OJsu[uG37PgPg=#ԙd ԙufIuHC3"xxPGΠ:BI|:Y7;r#Y,#Y u֍&o_+PGdB2|DDVPgPg>PgPg DNVBy:u6QR3͂PGq 2h"q\GөPǬ.: B~" ]B{PgvPPU uͬPXO[P'5uB"!TuE3C"0Bݨ=@#*ԡB uvPgEPl^j@rJx}Kz@rVyxS6: q B 3:7:]+d uPLjZ(^uFyݿPg(@3Jf@ C% 3r#(=8(qL#BQPK ›(UN E̠D۪PF3:)qEKΠB=qDa/BIsEV+D u!P㊿BQϟ8}uBW  uuB\:2 uF5Q@{ cB BP: uF9Q0BD`uv썷I{Wھx LAOО*uf{=0!ԙuBih:HDhuPGWN^o:#: X:pBIFB_:3?Q0OOB)щPg*T@3?LB:(Y:UH_B$b&?-Pgv (7}_L :B uL3,L3L #ԙȏT6HiJ>(g̣PgэPg ԙ)ԙ 089 bzoPgJ4 ͠=#މ B TPg> ~b?YqS3%G"*&zL?6^Pg^(7hG3/ǀb* hDBi/B^HԸpb?o:ΔF!B%APg9>"ԙDB uB:H?)YΏ,uH: ABս>Q0o9DRxaBPRЅPU:Kb΢@BPg)C( PgaPg)|D~!Y ,3,u Y ׮Bs>ș0x`)@V.A{,[ukGPgoWG<BVx`9E,V:.:aPg>=Q0o#Pg@&=D j"K3BΔF3)dPgJ!ԙVPA30PgR\|~>%rV̗,}Pg&D<@ΤBxPgΗ{u\W3)Pg&BS33uR`ߗ@d4X+DB|FΤBB$``޴2BiAt:^:Uδ5Bo|s*oپz =8F7%I8) "ԙTE3-hPgLjE)ԙC L 6*ԙ]' hϮx:ӌo:~KT=pg@iPgF{B8B}lq<HKaM})Z$"؟x`߇9F8RPgoOdEP#DQ%rxD<юxKL",.1NODE':]NG0PK"M!NQNw>PNJT u:C u i_"wuB\:-B.PP uv6iVN#Di$tv;B^<ވzx#謇(EMuP t uzQ@/M4X\NI4uڣ':VSc8:]{|vKBZTNpBӒx%1@{$n"hFuZ+!iGuB(PNJ u i4>:Q@c?ENC`PP=$lB^t*(uKu}B$$"§BN(:VWNbB+*ԱbBB++Uˆx uzA!dP+s̑/SYB:;b{L|tN'wΌ.8Tg0~LPy:C%PE ;aITǼOTI{z箉Au&UDuEuA가#c8+CP1cO#uΝmHt%d] T'ՙZlՙqT,P3 @u& F: 3yAu?:J :30Ʃm3K 3JLLA c0`=TgLPdTg UGBP1TǼPIiPI`P7@u&1):fhLJe/QIQP)@u&~@u06ܽVY 9yJ2-Z Nߟc#t@u::flIi%y R$PLJu긙Ti_ )nT\fKu.KR3KqIXcs:d]&!;1:KuT fXIuXIssN_IurT".P7wh:-w.[ ouJs qN)@u#VTu?⼕%֛T'7#yT'VL긔"Ց\JuZҟ:y4TM^P(ߏ' Cl쥫q{>_N~PfT 9׾Tt-ͼ:mZi@u +IuZҔ{MӤPV {3 lx+JIuTc),ձXJu"05:|AutSmT[m:'NeiFSi)m}ҜWiT'{:uHSb)/N?@ujRnON>@uvP }rBu*f:TzT)TJ:u 0 ήT;Tڊ 7[O\ NBu2Po=IuSY*[ ztJ1lSaPS\S3|&5)JL.1Ib_=1ߤ:q7ξ ֠N R\5|S@u*Kut SmT[}:,T'^:U թ˿KqydT'GPo=JuU'iKszo:.iU*@c3BN}@uthe46ϓ4RT}(N 78>:{Js|R":Ӓ>Qx_^oM_sRo1aP&/iiC*C=`8T'gP _4;T9߆4ť:ʥ:yAua|s@2h*]zKz Ӹ)ՉioRV<W;PӪ:ɰTӊG.Υ +i&NAuӮ7,wJRTg_9q 9ۤ-WKP?(UEKu{pn P}eStzߤ:C=Х.њ+IuxzR3Lw|_:ӡ:|AF.թUyKuCujR#7TJujթ@uCu?PjTgKsz<_NMSa1њW kTTFթn թ@uKPG<ؼSmq,>x[PÙ:zpuN T}њW3'Z*KRjT;T}eP|::`NP|:Bu ּ'Z#: 9Ku PjTR?HuP<~:5Á5&թ?@uJuթ5@ujD=P +N:yT[:NeEN%YS3&ť:5M[9'`5/wPj+#T'wPAu 3T6iCSQx>&ּxҞ'ޟh y_?aRa?Juj}iN:y>jP潏x T'_?T* TT'~/+T'PBu*wRڠP*ߏG=/NBuPJTfx Tms| S VSdPjXTrASTC='1hj @| T6h$Tg&cO|:y|Au|7s} Z:GR=RPBu:]> Q5Tg~w<(OEoRڥ7zNw:wƓw<^q|@uSmRtթWHuaG+:|4y~Ҵ.\oo^N~^P|T6)[܌^IY/#T6(2T)NmR|N^OVd=翕aAY/+T'sP<@u|T 9Ƙz >;끸~Yz`:HsAu S"ZS |NwSC=z{g=@MPj"T'P*z`2x;1Tã:HPj'TթBuaPݱx>Iyx>חzPcb T:հ/N5>ERPj+TTuT^l%*թn=թnթBu*RH(KuNPbTdxMϤ:EZ)=@uX?//)T TT}>QeR NCSRַ:~@uKuKu2&NP z ?~[KumLCu [Ku T()0sKsJ<]P(t'bTQa:9:gw>~jϨh<Ѽ,œXܬ8yܨϨ}R^?r ᨜B *"Ws*g]?r.P9mꨜiTM]TS%WBTQ9>*GiZ]c(TΦz9it o΅qP9?ʙ܃Ed~PTQ9 *gr=@Lv>@LWQ9D\rV>.Q9uFTbrnNP975*sʹYGܜP9;ϣrBLb?rNY ss.;zPQ#C@Smy*g'TiFw9*g?G |1ȹ]qoT8; P9rT?хa*Մ7O s~bCAUy2'VݞRUgzcIE]x*F/r8B3Cp#>2*439>'CP2Y{axt|@s{vQ>g~Η|Le G*gQ5牟dU;3o}9;npǏ?ߑڻHu#K)iNjONsp2)Ty=*+S'Vzٕ*eW?~ު^BqQH@P9xq|s<}T9:_\J\o Ī?VG*/ 󁮺9'C,.ξ*4 ~TDJsg9Yu{rN`sUnQ90>U<\o30| esҹcP9{]rrnJ\Jg_o.rN3a<)|0ۢBs_9?CBΌW1Yue4w*T:;R9LpBfP QCX|BwvY֜*4'>w=]6TQ"Q9{~x}TiVNjzBTʣrh^UDYur@!Tinz*4;zz~ S]5CT2P9{8[.P9UBTNK5*CxjSD=*9* s''}Bj}*4S:yr]ʨ=%TiTS5*TinG=PLO3fe SS9c^s=^s7?*g7g^s9+}U83>?˩qnjO(STr?ծ~T|;TNM*P9xviT> -o*P9Pm31>'S* &WD=P3&h^Uèy5*|^υ<`1~xQʩ]DBP9{?*ʩ9nծTN sOSsΏ|lȊyP95Uq*^rr|DVQ9*Ϗkq~~ *&T9>&}|yU8zˮs> CT*<~Q9=r/w\o8T;>r s\os0Ck0TNͮP95B{(>r[{>@~BߧX-*'Ϸ=/dzTNM%*|1>߯Vw @GsG=-T} so*Ը._KU@]9t@uCP9gҹc>?*O>*g qU0tQP<&G5D=|ALQ9{P9 HQ9ϤvpWTNu`TNuUT% *1**g'T*(*gy>QbNXh>?:z7 g-Zsv<Ӆ]uvT:zRE=Tr˸>*6CTwC1Oqmk*ӅǼ_QK*缍'P9m.P9mvOT;)T˯*g*WS P9@n*|W|~rp1nq<ݎg?q SsCP9*O'9d<*;oD=.RqW~CT70FTwAQ+9x9~0dP@2 s/QW3_ SݥSS96ѽ}Pz`TT؃z@*'rOƃT7%Jz@_zƠp~8DoBx2?RX߆"o?xT:O?P*'1TN֋ =ʆz`p sޟqc>Q95U9g;RP'I= @QߪC弟gy: 'Q9Q9uI=rR1*C߷P9*U733\C=0 ء`s槡ViC4£Tx= T8T:TwCTwaA3x>C32z`*Q9g~\s[%s|9TΙ/Ww̷Q(%[B=pXBTwyC圿}|U7g?o׫tZ7ׇz`5ovT7S.s~G7@ߗ\oUo7*a}`TYzs.z SS9ebP9{ja}  rWw4MPeL'@`%TN}QJb}~>@ *^Ne=b9 ܉z:}X`WT8Gr SUqFT/*P99ʩ*HTNUrSUr~*8Q9y T~֟T9]kP9y oTNETwAs'UNuTN_P9y?s? Ϸ\P4秮4b\3]p DOr58C8\a Ξ7\=J\GסKÆ!r3<X,jb * ةpžpE'\g\g~יrbK}bG b) YX,u>΢kHu:h:\z ׹鏅ܔ+rM: rAm; \64ML QGs ѹA4ݕ{#DvhBtfhPlqWyPlw@m)!: o2u|g_yۆ,C.Yܴ53)Ʋe>!:M Yk,7q&DgDrBtL3Dg&_e#!:M Y,64D3!:K//6^f)M!qYs2J!:+Cbքx0Dg]$s!:K!:NBt܆$Bt&)"DGTjξ|3nL 3mL\g}L7͆,:SYBuV1'rt2 '\gr  YК:'rUh,CV:KY?6[Bt3Btiz?6^ 5#Dg&_M}KO̘F*!:v~BtL7'DgڎGNjf~l=6Dg&M'3=3Ts3>3 љEŪoL6 2Dg љfCt!:<%?b&!=I|Ix^sE0' ۑ:{r1>I416dDΰ]T lghr$onIV#DJ8 A?z&eiʔ3 2S!:Yo %DgCZ۾\/ &Dg !:hyCt,9!:XY6Dg Y]XzrnY~ YD'X|0Dg HJ)ːFBt!ӊ%xHvBtmۇom!DǿooZCt֔D=7D!5QBI޲],c YrBt„,7&Dye!:+[lKJ-- Yg2'v>Ct_Ct,Yl$DgɱY܆?z`YɏXɕX D!:MK. \r+x<p|q*ǷӒx<ŦvTBtCβ%$DgMC{!:P.Bt4t(ꁕ!FibSQCtb<?!:z xzE#a}I?6^&BtzCκ8Ů:=!:ϰ>.,W YP4{-ߏ#6^la"d%#Dg-_oKFΒD%w DgLβE=aN^O q>bNtfJN^_ YBtO'˜mps}[Bt,C4Y Dg<ox~>`H!:P7BtVyN01%(HQ,CYɍ]p#@zGQyaLkHx>˕Kϧsֻ-%׻.uzJp,i4{@!:P0Bt<%"Dgɯy/!_;wι4{ Yl&Dz&,{1D%Ct3C2Dg׋dOԓ6LK3Dg3=_3_fz@!:Ym_љzW<cHO&D'~3Dg>E=?yΈk;/Bmز1'6~4ۍw љ^yϨ`dyCtmQSNGΔS3DŽk|3ń̇|?љrbBt\7D謋}RP\4Ɠ7M, YgBt\5DgCw>CBt!g,Cѱ=e!!:KK~!:0<_ϗ3!:nCt0DgI~rNR\s_p zGb=eh!:Y "D'/Btܘcc!:KGN4d=IΒ,!:y5 )Zַ_,!~~?!Dg}!:kB= G%D'{Bt Yܟ5Dg|F7!Dg?\睯>C I&Dg͂Dή>\̯v/pSo='Py|o~,5t1xouyS@ ѱ^4Dg}!:P Bt YP/}yOrS:8KzIS:Yocdk ѱ7D,CFُ$^NCt%,2Dg-yxBt_ YKN!:ֻ<{{p/1DgAκ,!6$BtCt Y܅zKNBt'n}5Dg\} YC?\'%0d}{:as>ߧqUy>ߧ;}ߧr}ӈ=?~swi'GS=6 p]ן:p<3 T iZ4pF %\q yL!ɼ:{1BmͶl\ yumOt=uNp]sif׹*6]I:4:YHu<_:u"uQuN gJp]\pXmܶus",.:7\ܶkunNpYܶu8~w:-:ip E{^pE6\g=׹lpr:?ryZr! o&4=r]vy<:+9Mp%Wܦu]~sxw]hoܦ/un2:V#׹׹mswswG==wۮ׹m7ܦunvwC=?=ϧy&qƺuq7r?\grssgPppCBuϟ8W%z=H:AmhYS~C{uipEA(Yp}{2v' Ǵ 1quV5ۇI#bY<"^؍Xr\gQ.י'י?Q\-יQuOu3u)$d;>\':3Ls?ô&up6QLnu7^Njnr3=ufD=0YL"~:et=x &)L7y/3cr ׉u|(6wp˨W:-:7: :rr\g,er1@Q E:c0=3I3.377+p>u[ΐuFrΨrXuiFpQ|c9ߘNjz`XuvT댋;\g\%z\?X._N:tX{}~&ꁞi=Q;ξl}pַpa\',\gFٗŸ$ׅ 쮱xa\gtӇb9n:C\gsx8uu-uƔr0 3^u\g'@~:y:CC^azLc9:y~$ 5ΰ >:v'pB7Xpib9nww_9-'}lpB:23lo?q}{.:Оw[hbOrr=G{pnpy\gq qt7RtwYΤF;\g י̗:W$Y3pM=/yupi.QLwL=v"| י>|b鴘O촧u&}u&:yrc!>?\g&u&r}|:4 OO^ יoufKQיմJ;\gVg>ufs_W=o2\gRuיorH3MwLҒ:s~JsyD{\gvKF{AuB3Wp1Glo$SD=F3iE F:DE=|K矕qM/uup3$q>+p<]{?Pu2݇z`ɍ7J[3ў7nO Ӹ:tθ_S :u^33=3>}N:2(fhϛt \g&ga;*Oa;/ӧ:vmξs11?*;oq=LvK 3Xpuz -\gיu3p3M+H_3Fvrri$\g'י/ǹb8-?\\'W:~?:uLP%!/uQV!/il'"Y4q':qw+ru)rR:sX:uLxxurB:~ș:^O:Hz 7+>uWw יMN:S 2\gW;7zLm:?r|:rYMYַvqoo:qi<^p L9<\:y~Lӓ::tvN:}K:t@eup)L}:n&יô!\\g~[p:ί:v{_l>^uδ= l4E:\g:3|* 3h,ΞJjHg/c ;#6&V.6rwq!SINS'Sg?:2u l2u LddԹX#Sǀ2uыtN:gN2u.Nd\Gp8:<= ЫѮW|SZi H6BNa~t9&.99{p̹#s03Ōs ̹F\"s.d"2bDdE2JO H>A:ȜdE$/2E\wdNXUϻx{յٓ0~.2碶@\ܺA$9פsy̹2%V.2D'EN2rtde>2ZJ99oʜ\dFȜ;ʜw Qt]`̹8sɋ̹s}Ό(:9Ȝ/eeg)2*ĻȜ*}щ~^!s=$B\v"s.;Y9=ʜ })v#s ʜbp2T_:W9^9N*dNSsǙi+oezb[qadNMxѕ9{§W̩M!sR STB 1SSADf2veTtê̩J-dND!s̭UT)s!VԢ䉕J'2rP`+r':@;9NfdNaYS2'dNY[Q>!s+s*s w9.dNS7щW fB>9%2to?odNRe 24uk2lj2t%KtC*geNḯ)AdNRW;9ō9ɉ)6+sJ0]SG +dN Os}-+s=v=ȜK L13wqr(o a|Ot(sJJ9NȔ9q7e(3s)o9*s!s.oȜˍ9*s*se-$J]|+s)safs}A\(#s*sȜR >^S}WnOߏ9~|?9Nsdէ2RdNYJ#f[!sߋb'32䉕j2f0OkUĄz}F(>?U7G{̩l1[S#sj3z`+oȔ6ΧȜj<2>J}~_!srS BT;9z[{z۔1-hy]_o@}eNΪ2q# e[U s1>%k"s*+iʜz!92*9/d_S(ZޠI mU" sNjz*9U)̩+uyu(9x@`b~BPM6"US sR2,zz}DTwB@T,9y< sS"sr>̩^_99CTȜSR S=?2TFT6Uz:?AkH:9yBTÐ9+s;= s0'Vޢ7eN5 S DTVB9+s*+yʜj+2ǜxeNeTS AT2l̩C=`0+2,`Nʛ2QT29U̩O@Tِ9u(b9S9ՠdNʣG9dNtAgȜ:>V3(VY|WT6ST%&2|̩ϐ9'd.BD=PIU% 2]t*svneMilTildiE@+g92yB47Ȝ|F z12)#9 2dN}W|Ȝ9'dNy?Xyl,̩!sjʞ;7 s@udN%HASFT7D XyܨUT7ET99NfdN SS ReM[]t sȜz+brV )sc#sC2)Wa|DPȟaȜeNs|dNS @7H)K9MYiv!s:щ`7eh@+ E=\F7~@+Ȝ<9#/:ڥLNtC4?eE=.:99y sxȜN+ʜfp2g~͍9`de)9ndNsqdNkt6਌)9N8dND'^SN!sȜf2u%N dN@Ӛr)FȜ>"s2 Ӕ`Ȝ689͍9\֍9-JleNJ+sm93&:M#sRD'^zr-ax/Ȝ(F2Nf2iٿxm iv^#sKdNziWtV"s~G=Ж>щ>{߯k^O9NrdN3 `щE4e2)?9}B4o9}B4ؐ9MiǏziO*sziJidNʎ08&6 z)39-ONcdNceND=ДGȜfg42'Ȝ'QepLy#shȜA5Q46W42'Ȝ>!si' sI=p+ؕU jCOdN~9`dN[z$dN3G C47(s2,irz9+sb7eN/!sWtȜO s2[!s:92&~)ܿT#dNB'd}3Oʜoeo!sy~2((~)9Btw@bJȜ&dN>@t!dNQ+ug0O vCte'2g/+z3'dNoopξvw@q|>Ȝn)2|: ӻ)ꁞ&dNw'dNtzD=Э'9)m8zەȜnP*22TJYdοqU\2+ѐ9Wx>q sȜ/7Ȝ|9|Cte2+ϑ9ݠFdNCt+9FdNJȜ z+9 sz3(dN'AAȜn}֗Ȝ a.zi9{`d @?e2z#)9+o?+sǏz+!9] JdN̈́C ʜN2gWzOG(s:r[ӑʜx>ȟ9}7z2\HieNgjeNg'eNG+s:_ʜTnMd@'xUL V'eNg>eNʣ 27MȜ(dOeNG*sӛ7ZBOQ\z2W߿9^9zz{v[UyONʑ:C9 9 TmE+s:AʜNʜ^?QtB+9<@g'oeN/JeMke%eןWtvPye=eE@ *z_Qt2'7%Gpt/宱8p?ݡD%ĝ9g҇ppNe+Dps:DBtZK DsX4v/ѡxi*Btkƞ ;T6ԅTH!:.@t\TNTF KtNIcHbifm?2Ӌ:t:(+R''tX}uΪ~IS a Z%UZfhNhSuJZ?NTA9ֹ(,:Q1heX&>H:Bز֩hS C4N'hFqɵsn@T^Zq֩+J<:hv%ϹXR봞);33 Zѐ~'Znj%w:m::(N4Ѝٷ8YBKGt::udhrhg;jqt;uݯAEi7Zdu{vWu=u:uz3}?zj%ss.ɘj%WN'fQLhnZ7'wvmjq:no:nN3j\jVxw}jƾ\jzq5]2(N~:+j\lfGw^N3W c7Zg;'ML[58&Djf Z٫EՁ8:j:{|~X_Z=V>:]oC7Z'GN{8ucnՋɸ<=\j^b5,ZZˈŻqE<3o'Z= ۜԣh=SPަzxZg~ha7[@C@̗:QN9>:vcury[ 5@<;9=?]O9_A4_N3 ߯x> Z'?ost|>9:^Wj9:СuWtfuP7ꁬ7:9Cϟ?SߡuriDw^te.Qvu=E7tHՋʘ;nqBPdZǿu|jNBx~PxSӋ@ql=8Nob>gh?-:zn N7%h9;|Ytu:G:ߋ<jΞhj*GdwZgϿ>q5[%hnNZ:St5 j~GtFjxn7S-PZnNotuF8UfnTN'gT+Zgm}ߧtk{d=zQ-P9t CdZ j}Vӫ3ٝ7;vv ϳ;\-@N[==?sӭoׯE=4o /soMxFtuZ'kYD7-Zy:ٽn5NW'u,u6ojnNZ3Z:mN7 c7Zjn Z'->QxJcZ'oj<Cѝ^}C}Z':c;/?-vuES,Ƭ~ӝn$j~Et5Z=Z:;KjKN7g$:vu[|Qøzm@\?z<~{O=_:9Au3{k=85̯%Z':y@dw+Z'hn.Z N^/:ٝWyjȍGsOUtsM:}Cwh>@x|nsyλts:Q۰>.@G]Dw3?ucx|?WC/cyru?Z#:^OqRD=01W3h|::θu+OQ\|ȝȿG=`NZ'NFM59yh#WUMUS쮠&9Edu?|b>ϛ37ZsL|hu:9juu}h} D=S]:#RuԯjZ:.QsuP9:zJU:ruqZGǧX#G=R:na:,έfx{ܟM::1gNn[u/Z:ujvIG=Ya_/Σ.x|~mj|hjǜꁇZGֹܜ_9j[ry~Jͳ8:7/QuԆjI2j[C=@Sbj]CPjZZ'sw<uujs:SmC=9:2''Pu:3I3,hy`74(((`)HMZg ?MC=nGjhKy`$0 3q}G gw>~ZYs_s.L蜋Tpt]4@ΩtN:~uN!t$:5J:5a  8Ξ?:vQu#n^sLعãD n8gmA\"s.:ؚf 9nss[9|s^ιh_Eld9_vtNsys}{gyМ1Ì4`CvW<B<\l#ʹr..CFd75n)rM "B9)A9f[PN>nA))2r jc(gg|̟D9E^PNA,r KF1BΟs^i?"t7B:#"tp6By:HFF:6âhFE7Br.a%QNqKiP^}`mѤ),r'2gq:O@hڸrlP(&+&2f|̾E-l햤W`_PPS)D9^QNm-ݢ[ rZjC:"#tR)#t#[ G:e[1Ė~F|Fxr{4-a x@9 Mts"-l4ߠ4A9ꢜj(ʩ6UruD8gl@9uz2EQN%OS)E9u|rr|Sp0h-EdjS(ǦXQV/Y%)"\YE9FrD&IQ'b-oN-ތ2H2Ȟ2D<>(&6Q[rGPNnA ʩ6%r*7 D9cϖ^Zޫc~~28߀rD_M}4 A9e( [UQ[e [@9:(ٴ iPbJ̢D&b帅(9_KyF$r"[+PNnʩFr*b}|9^q^z;3D6W<8С# F+GPD;w5BGDiN7.z!Bv2B:tmN3҆f ::_:"B&όa#"teNFCD :q>`#t"/#thJF4:^HsmFc@(VHHDPN5 SvXt~I$DNQ|QNFb(zf=Z*"tDYFS~:Tј:Dx|#t2Bb:x7Bn Re|^й^Cf (#tP iM}z0fO8^A9 ($ z<QNqrPNq~)"PxQd Ɉ(PNr]z`%??{ܰŪ('#@9:(g׍Mh%2RSr:\rhSrc ȅHM_PƢݢF6ʉD9Mr (|S8%R!R($E–ܢ1Q PN SEQBӃ(|N~x|D7W|^ Xt (}=Dj@9Ed)󩢛'/('O|A9n} Sn}d,(t+A9n%)9n>_Qǣ(FD=o |xzPOr_&yo[ݜ9#zbѭ,Q(݊[rrb7QN#"5'MpB/)H""5?#5yXt+6rM#|E9{ͦ1|@7QMSGHPNY4r(@9&PNqKmPN1Sܢ,('PN}|a5( )F rM b(e>(>(>()#'r jʁ(g?O;IMhD9&PNa-BJ(LjsQNmrr rSD=whJ( )Flr(עb (`4((HJQ~^oT(HSQN-rG=QNic(((tQN^PNIc$(<"ҼSlo#BE9M8D9&sPN7('oPNF(ZQ]c}MD9#tE9_*zD)]aC&rD9&Q(zLSEmS式ߌm{<*ڹSʩWP 1YSET{QN5 rs('Nr*r*MAZER !h³ADSEZ#E9y@ʦ #E9 Q#E9yr* j$!(Lj^QNz@9}+ʩPNO@9U$1YS($!R32ºs"式w{~}< ('ߠ豾(VSlD(<}Y<"m1 vpoA+фg$)PN?A9Q񢜒8C= B|S2'6A99Q/vf'OdNSrr~ 2(E99#@9(PNIB=`+($2p _tb~{to/Էyr\+^oDd=z /PN1oe=?PcD9r#)7CPNGbD(ܾ?"B唌HzPNY@9H3PN~PNrHrA9Ey/:('/PNb"(!͸MdδэחB1?)2 @9e1@A9Yrv}@OU('?rlA98P||?@9~rd>(gE85z-b(()n")QN֯2z( 6ND96x󩢝'O2|6E>W<A9(#PN_PǢ?/ٯ'/=?/)l*)T)\S2'{GE9%#6FE9ME9kQNa]Q࢜EJt]rJʱWϋr8ONQNi"J#S2F[1n&|"@9ME9z4Ivr ԈrJFа>D/T#}X @SES(PN prJ Q4 @3D9{,Y~ED (_ )MtgS({mznVf0daxa;2䱄H3ujEEFU黻oE֩C>P !+j(ʙm{zTC9H@9*|ʹh c('rX^(g~' \}~wri(BAj(zs=nH6 [}r<ʙmyJ+;(g ƝsÝ<9;硅 giwGsB?K/a]s[:U9tk9|sTtL7:9^@\TWC\tԇιػIlB$N¡s^ fs":D'7942C93_3^3h)4ghO`xt >oITΠGPΠeAC"!9J'9 ȡQ"@9Ä39&3Ў)8y]E;|vZJ }Bq:jEt. FXa87ANJ̱2Q $s ƒ! fOFpR5CXTt7{'.TkYSah';| 9&qmΗהH`G_?lIEwE@8fI $=$kfWpq ft_KG3Jb U߼1-a7* -fnd¾XZu6聸zv"ZtY!}PfЮfh3u555õbk2(~&mWiZ]bؽ"fzU3fDԌ"3kfe ‹vnV.L38-f\||4^ ьtmf~NɆMjhFz ?L}yg' Ӈ?3JLo&PbALeR;YJ|X$ex)e8 229n{]^a/mA/"1/}ƮwAKwA94B*1Qffug v!Yk'Ԡ.1ȈtAFK 2\:\bҽI3a\zxeswN)`Y+o-34;"mFtWl鶵 l鴳ktZz7:50-z%%_,3OzNDžh:mͿٕ_АuT5LJdV,Kjq,î+a,# Y iGbX}@XF2Rs$~MʰC0,z[U+ؕh9M o4x nem&lSوiDu3,Wﯖ."Vz3ZN[oHӦDph+(-x;Ttc]GT)hQ*2̀QQrEJ SFf? w?EpJRlJ<)ݺ )-+rҭmҝI6 IÄ:qtKģtg#hX FtE~Q>k4 0ePƄtWeB,*v (^"B\r)m1~һ/tGI쉾/t'yru`N=]$xӫvS:ҭ9+YHw2&a#sR~ۺ gA#Ʃ0#΀@F.0^d.Ӿr E8?.*t RmEiGD:eD`"dUǐ* s2## $ږnK&|H, <JtH㋖dbCp-4sҟ4UKP!m^LȬDlsT) #"Bz9,-AxN8 u'WW/~(k _ 3|uQsk9iҭ2vuU.N HEHH/Mrsы镵Aʺ }S~bd-{1*GH#죇 eUy~9Qѭm--q>{ti]c݂/R.PN' HNaGEt_#@屖64>non ~cA1ÇX~[A>+݂2SЎnGd a]W6ѭ.ut3*#nNjۜ$h#F٘a&,2h9mJFTNFsMF5f>әGJp՘Ȃrv5:}4:n0M h9}Ģ崙81cD[K%B*'@_DeN|.khVΘ~Ղ3e!#ЌN;m  fOqqۅel5~7et3tb2x7dtv1fh`naX FH+ ^*0Uѭ.W6T1GyM h9}֔Xx-i~3^llYEOE,^2O be-]Ē{9 %f4LƭXzN}p6ȀZxԢlNLy6ТWDO__3,n! Ģ&Di΀,r"(DW̛#`-"M[Z YYUVOPTE$q*|Sѫ*ZNWkd^~=NW6v"R<=-i J)ԏRtQ8HAQt  ֟`(: E(Oj@iF-Ia'p. 9'#!-4a&cCi hd|/@p->-y7`%J )@^.BDz%&AIHHo"#s#D7}\~x/f >R F"ZN? =7Fx.+Ei6"afa":-c@" >C[ *$ OP>Lzh9# 1 0Ӄ.WP.@ b1hp1t7(;Eqi~,`eZNϳcUhT0Xm=؍0"krø\Pyj\&>9h@0?0XO ٢Qm{46=__gC[=__[[T"-*iv'װEw٣x-z hآڣuR[Tm--=yΰEϳG}uZnQڋߢm}QmQ{4;p-z m{uFEQ{Ɵ-mc`-=e =m>mc>`آ:l=__[T= [A-aG=,k[b12=FXRv եF" *]a S5(l.YQ_]Bsm 3F [8FyNyNsɏC -$A9h}AЀA]Tmؐ(3= mhAtE>hlР \wmПWeP( yGwڠ UGb[.%6oeTPtjTA9J \G mp(NB܆<:E,.σK$/U VIJ \ mxN(\L|6p5ex!]6p(ڠ:k; mop'y ^.hcvb LC:.ڂU%`PphE} LC e6x/cEL fů崻AA G6a&A||q |> ms O.#u*&m0d!|{cEčm0 |SqcE&, K#E $pm E.C#h6vNaO Õ | m0C:%Vh:1m0_ ZN 꺌⟎u*m0؅6KX9k9=B!Sh60m0,Jm0΍#K >B}6po h##QB1>/ m0h;m# ]< hQHZ ޵D{Z6.տHҩgr3|9 ]+N>%6W~4m0O< ӴAQJûw' 6`SѴC G6mi`0;nF>1u(O`v} B'?iNh{A:6phz,60tmϴQNPdڠcrm qyˣ?.< RA*40;H-6`ƴeZ& W2Ե/ʣ+n4h9ʙ6߭wנ4 h`/0 LInڀ VûF]s.l6v46&DqBAgjw!$ 0 axlx.Ѓ]kVFl afm;m0^@.]wڠ[4vNx¡ <@7656!W0im0kQm0xmimm0CxA,¸r`Aჭc*A\hX6ha'hr`m0BJFA+#1/6ɲuf m@5L:G|Fm0mjuaWA:Jmm0BĢH[z@A-5h76՗h6cznRmjVh767V a[*r:2w46+ >hmK4C (s )J׊n@]+0Dhwڂm m<UhzZ6U `LTW6h D/ @LմAf,ڠ F ˠ  \*zw)I Cdgs$_m0#`C@'K h-'0"OyQ {#O]'0 O 5m Ny VIAr0딥p*܈TݰmG N N2!}SN;ɩpo9*½94 ۍ;TT&SvN 58aqTB9,L'S\Pn9_\X*aZP|Ɉ@\Lϳ f3V y V֌#C"Dqmq2r2Ї>,M!nU¿J^?kb:j-ePz#*CE?]b^}A,N%~)\gB,&'tg)Bhb}-sDE!.HB\ 'Ex*"D`!.XF\t=q3pqyLLlD\#B?5 :~ j65LڜE u?E0d;nTq8捔XWAxҥb%B,Fh%fA\Â܈@A\ܦ!KdDٔąs&Dsh;Էr"D~Oxbf+=k<>o?f&b}nbDϘ.'Q˃.@\~`$z7CQR媢)B4 N"F "X Q-REP-RS܅(X"E"UUD^X[-_zInX"UB3Of(.]6< Yى9*ǦVT*8ֺ,ѻ滊c*cQű*5D!VX"J|7SX>Oˁ?Em.="ղ!xӊc a qyuHU˖,RH 5;xK1_ƺcOEMx߲aqo(Fa1\eCcpw|g7=@0_ݐ'|C%xfg.\\ : Ef,I.!^\?:.Z_H\ ٍƱK:)B@'ƕtlҀ| Lc{c] qy)R_Tּ^˳N>z$b9cFc 6V^ltY>3iLv|N>p[A>ϋ|+| ?1A9*|`Bz~:XcZ#z XϬG|>m<ݿ~8L}Ա=˳:fߓB<__|Ǖ]w"˳GxX%b"Y=n^@5fA> z]1e@w=+K/,BXHBֿo YW>t=-AN ~Z>č[c}ť-|M>;mBn7C=F2bEb .mx7F"YS|P c|ȑ<7t}Ď}ȑd{G>=? @瑈o=A E熑H @1B>@(Ɋ7d{8I. #̓h?8v~:qM>67[p%˱%k@?W>p`Z q~7%k`KV2M&亲M @L1Tr~y 2Y!_YuLV;,ɥA|r}&~.t46Y7ݯۀI Q>p۸uXڏy|NV^VNbd) ڿč&I7z_E ?1u h>eͷ(@Pf|leA.~8̰dϗ㞷Y$zy }>W4 NJwb!)+UͷW|kQTz\H+T."S7lEkxz5L侽"TUz~ʣ s\Op>@^@nz̦ܺJ\_)kM/t*J>tA\e'H|{|S XK+\6r\bǧxIU+ `yO{}BXVlJbvk:KG>@6C>2@w|+N&]m"_V~I>` 4cD ېe2oJB>P.f7CC<8o>p61q󾏃|(I~~ !"?lyW~Y=@'!eT&7`eV|,1LD /e&Xϣ֥yyWR\}ޅ*z|VOI Bșuח /1Kȿu=3+/?y9͊OlO04+r<~h"Y_>k-\c(" ZP0͊ϐ"06fno|լUXM#p5+;n@k7LG~i[w6 7}L> @p3 L0lmS}'`}?6Qonb4~YY)K |`7w/|f<]%ԟj|g&={:sK߁ WO:¾_:mra/c}uGX2Vtc5'S#le"=,~sw9.Cx>v"t𹎰o!HgK9¶_ûa/c}aG8X> þ_:Ò헱N~#Y>vu𹏰o!\gK=¶]p=p=#~nv}U"\ 1ö_:ûaG8X5z{X#G:{*u"9ϸ=^^G\3nyWy  ?q=krO>~\::q;# qxӏ9\q=suxuuxu:&Gp#ާG%8$zcb{rL:G܎ys#nc9Zxz1gorqL:GJpGK:[|''c9~\}Ouqg܎y\k=q\O=fSp#>':G|Ous*z1>1>\g}s sO:~\Ϲr9c|;p-~\q=\爏>:G|O9cs|{yp7.\爏kzp#>[:G|̷\؃1ߖsmsT=?|+\爏k|p#>r.uʹ9co1>\爏9:G|Ouol}ηϹ9c}?s&:G|̷uo3 9c}D\gT\爏Yp7|~'|~'s|+\爏~'|~'s|+\g?@O>P?@O> \爏VmO>>@O> \gss|>@9c|j|}:G|̷umO>>@O> \獅1 O>?@O>?@uolq9'K9c|'o1O>?@O>?uol'|`|'|`|lq9[:G|̷O>0>O>0>p#>[:[v|'|`|q:G:[|--->qxs:G܏9p#:p#nc9xs:GO:GO:[|---rsO?~\s̷:G܏9p#n1߂qg<9p#[p#'p->p#[p#[p#S>p#>g:G\z|\q=g>s|\爟vq̷:GϷ:G|O1> 9}9z8us:G|Ou\g܎| s9c|\爏>p#>[:G|̷1ߖ39c|*g>o1ߖ39c-g>s$\爏Ip#>r:G|̷uʙ1 yc:G|̷ϙl1>=g>s|+\爏9p#>uux1 39c}|\爏9p#>[:o,\爏~'|~'s|+\g?@O>P?@O> \爏VmO>P?@O> \獅1 O>>@O>>@uolq9'h|}'h|@ss|>@O>>@9c9O>?@O>?@uo1O>?@O>?@9cş|'|'9 9c|`|'|`|1 O>0>O>0>9cs|;>39}|xuxouus:GO:G\3n<| sĵ8uxs:G܏| s39}9}|9}|9}|̷:G܏9p#nc9xs:G܏9p#n:p#nc9Zxouxuuxouxouus:G|Ouig܏| s39c|g>׹>$z YGMNˏqY YI3g:nQ|4 ogg%-?&ԊP qYpN:K~p%E~ י%ė'\Juo: 3+Q(Vg^Cx՟I*]׿XYU{7꬚cVgJ_{_N&/9|cVg C\r`H5X@t :ꬲw}{ R:*w-!VgPj]j^Z'|8jn|u24jL5:nZ'N jL:*ά^!΅NwjGsp<aD_ՇNp˶~M@u|PdDZ jk6Fs!w@3PUjwGFu~:#:&Mu=}h]Q槃'O~Iu΅-΅JNnZ'Z' ZIγyj^NICQ%~ZieNrkd: u::VV$ZY@yIVϧV)T?jN;kZ'zHjJ:Nr+z:VfY3xV߫vz[j@hUh؅~Uw:3%/7ENjV稕vjVv |7}?P(jDGuvHuRumITm҉NlILI'lI'`I,äl,v&6$>L:M:&&{ꌑGkt`zlNB`oN6۰`Yk(6۔#NbaNr}L:)Nj50F:%0hOtMtycI6`҉N Nzl>mfW t}äcM:ɦ9L: UM:1cҙaxĤ&mI6waQ۟0¤&.0$:Uۤl¤ME3@(3mb/L:Ny<10 O<k"?~žYla|ry|JI'gL:6$00_oݟfZI'up؟O7qi *&I'otbyI'tM~t"d3W&z~2#aI6caI6y`I6a҉NM:s_&tM5tζ&m;ۤm䉹&pY=at:L:~mҩ64פ#ӐM:Nol &u_mI/3M:&CbN`)ao6tt:M:^ؤ qҢSa,mұ&6¤&ߟ&*1k)/&INqg6kN?t&aOIg}IK&x0ߗnҹOL:twt)&wBI;ڤcӂM:6=ؤs5`dyL:Waҙׯ)1L:~u6M:mMtlIɵcұ9?JLx/mؔu}z0G<'Lt.71\lڤs!QI'/&xt!gN-1睈w0睉o?0\O1鄹 |1<ݤ&/̚z^t.gG5nҹ?iҹ L:h0&0aҹlƤ&IL:sduĤ·6L񠳠9ygNt.Ǥ΀6鄉΅+L:k;ۤ6`v NbNyNy5 L6d:&&չ&wIǝmq'}یCluN9[mҹ0s蜍(:gc>( n;ۤc3M:7käN6)uF¬:yäS|=aT'+̚b¬N64L:N6`W5}I$pYqN1=_tlIɳis;y&cұI&?mұI&wI9;9[1dw9&Lggt2&%l6dM>ؤsz*Ǧ ?[_mұ&&˦"&wI'}Iǝma,L:&I>lIkM64`M 6xälj!HtVI'>ۤ^sNȌ`Nz9U @bI'G~t<6|`Ept.L:a x|zla|&l Ot4?ؤ94L:äcsM:_mұy&6ܯYM9̷2+sc:g7q0Yaj6جfxeaҡ3st&Otή9~?9[߷':gäC0ج`ä&IG5tu M:?/MzOt6`Ƅ4laM&M:&'tlrISzt|}6&¤cӠM:M4t~l\gsN4ptl^I|3L:I5L:j5<5.bLͦ4ڤcM:߸o}I& tlYӦ߆9Yדmy]׃I|dC>0l!\M:5I0&G¤3|waұI&_¤ۤ~mtM<6ڤ~ntǤ?&?Ot Ng=ka<~6,D>yl^I~ڤyItI`M:TIg?M:a~!N>wc٤mұ&l¬7tM>ozm鼏6t¤3>&aξt:1o>ڤ|ߴ^I3+oM:a|t4I0p~&mNf4C>smҩ#M9}I}II&Tt*S6TvؔscYbYgh~Ia~I0xI0xI7t<ڤcM:¤h&0tXIj06 |h| N&*L:6kؤcM:7I0ؤaN}lќd"|ftn M)>)؜hN߄IJtn(o&0鰿&cämv!mly?}6Ltc04h"6`)&lyl)6YdcΣ~`ҩ}tNTa:L:&&jO$M:wIVt*M:f$j@z+L:6a٤Sy9qtw"IP0L:c¤CEwt?tä&o¤C&M:7I'LE%ܯ NĿֿ7Si2 "F֭ Op9p9aoΕEwNz4$ fP X,ft.<&h )\ ?,ŹtK!2Ҍ@s*%9W3hChN-̬ 4q3shN#͙+hNhTש;͙uEΠ9M М 4gDGء9f#|3G,@s:ؠ9hN4挤q4g\5 fIМ hXМ4D As9}t@s:19)М=͙Rgb 4LhN'ڛ~*4S3ShN4sY RghQӹN:hN: IМE@sz@s:Ҡ9۵I1hNciOp<3ci4|9-s4;BsZ4R,3b%:ͩEU SQ@MTWͩhj*gFsk@seDhNu6hNu-6h3yȵF@s@T4U7ߺ_Eyl9*S?E-h|s}?9Ϡ 4ahy<%yK1390=93_p~-:gΜ?rGUxΠ1OyeVe!:3VUiZsQ:'9>FAΌ~ԙr=xz@T7K<7 ,T\ SWgq%H"ŕtW|:HΜWk`u n:\ìNBlVVkVVV.53?Y9׆/:ʽkVx)Xfu Vg:R:, Nq-Kx/:%X-Ke<)F?auY X,O:;>ŽOgq՝YٙYyk=_YX{:vjb:~ GVՄ)duJ{ٜI3Nq.Nqm-o k}qm+Nq*N:+),n"6fq.=qS2ޏ)S~ՙ߷L\)-),joΓ`'`u:auʠV'7Nq;NVg^t=*:{0S\?6|:mYSg?lΥ:]RN<XauJTJ|SY\y`u 9YbD@YR^v_`6S]4`u {fuQjXR̞,PhVPbVfk`u )YRޟwH S6S6Sn0:%Dxͷ^L7NzVkau {sfuQ>VpbVyx^7qyY\nVf]B:mV'>?o|_>̒x]Ԟiegu)ڙ)^j43K6G@zV݆)Nl6 ^|?w} :.fus:1K| X V'C:s|3S$oZOj VP<nXr3?Sn:}ՙg!^mfՙXXL V'wXlIV8߄)-ՉV'XRϷ7|6|0|`gu"_ՉN 6Jgqj/߷:Zv)լ fub} 3X&J-NqJXS\[S\ S`h'Xm7륇2{C~;ܺ"y1S%`VVP`VVg;S\; S\k ShWfVvVe|nV7V Ny|~`V)|Yb VԬNɾ+Sy2C>pVV\,4S.,Z1X̮$j`uJ ͛~jJ(+쇚)X:lμ13t7X"`TάN VHyڶN1˗# Vg>Jܴ~U)eՉ Vg:fGNg=iC>`6 Vgb="ߑFVvVPcVgGvVg~ܺ:s}=a'?6|جN1 NάNVϬN1Q"D> 0XIZh<)Ԛ)*2S?jiVVV'[:l|R S\{ 3jz;ՙI+fueVg~ |%|1zxլNYxmVPbVgW~Xyj Qzy?jC>BE>|v(OZ?h}SY{guJ7ڼڈPm^fO5SSzYBk<:%:ՉSQm^ǟY_NXMyW5y~fw|>`vX8 Rm^ ֧+Nif813ϻYλ4x Nfyǧkgu"Չ|V'CX/ՙꔇV'/X_)լ +S\&:q?au|bVPeV'XҘ{>ЈΗ`c'`u'VYau#h' N:ecsoZO`dV)Cՙ)'ՙs<'Ie_`u fuJ7B>yauJ})ڈ)f`u|gVT|<>s?s Sm"hV4_|lN-x3bv];S]>>SeV)SXW)TՉ)N:1T,o1oAbu|gV݄)լ|s,N<7ߺzoyYx:)f`ub~ՉV':Ŭ3gVҬNix>4Sm:o1mV۬C:|bX:ѬYB=Yx}`VYs{<4Y+lVfuwחeu|^cVYϘìNŬN+򁺳:^) | a-euyrE>PD> |2up@~^V+yλἫC[|="`ڬN۬N vy|*xgV'7;:~^V'OXBY~x}dV&۬N~XWՉ)ךxkV'7W:1N?9|9kguJkV+fu<Չ V''XW:9E8:ѝހw=P<(t(t*[D(t:NP S)o0C5Qρ<gT'7¨eFuѡެ]Z!5~#ȝWTЍTg@u|`sVV$=yh S|թTx@uf}y-:#9V@ujTթFt`iȠ:PtnN=QNTgn(ԟ@u @u l*O@uVw`jo"`lCwfPǪ=Z@u{2j2[FuPL3:vFuryѝ9>edJiTgN\ꢣR?PLS:٥:Fu2BD:6Fklk FuKsAuzꨂO:T'DvP mTg^b-s2ʤu|NQxAu ?۔q3:Pz$Cf #?m.bƧ@yVTT' :1չKAu6ΨT'ڃ\Z-CP*1ڊP)syAu.Π:mn柿_Ǡ:W6ZG[~P@uBPmQFMQhdtom،sjTj6ϥ:@:ncTm`D}P˥:QSP1sqTiT',Oh46yQ!VPPknv'hsm=5Kh6h]Ѝh-F?vQVǥv;:YCnZ@]6hPU6\m/k{hhcmCcK:":׉mqhuV8kuQ#h'h{cNbV#kuYkchkuVHkuX(mBYsYs]mvBۼV'6/}qmwT'?Ц7:ւYc ::Zc맵:Zk2)Fl=V@hulAV:mm[-Xc-:lV:?y\n3ƿn3&ŶV㽵:FAu@h6c mƪڌ`-:!O+šW3;s]FF;[kD}Z뾣:.kuV(:їFN6ʃVQcM6&:Q:.Qi:BE_Zd<|IcmPkuBC>hZ*:!VgVob:GFuҼyQ4/ khT,KAuٮT'/N(~򁸿:i-Qi޼>]JUFuitE!VZka%:kĬIwՉGmBs1 gskuy<>UOz^:fz@TՉ T'qcT':W+ѷ NF 7N|^P4T'sPq}:1ހ$:1ꤏV' 2BuPDD:(PZ'Py?0^Fwo~ZZnVǚCku<[;kuVǚ>kuwkƎ@sx|hqkuh'ZXKiQeku.&5v}GuZZ t%{|fkxfe45xgbձZΫCcn|do|@QЊZC+_Z~VZakuV?ku?Yc4ZZSYVgZkա5XhuYC_ƷBFU[qg[qX!`[X68?V:n`58V/ku myڞ.iGչu|2`Qhuh Z#չաUHhuƗ$)EudԆ+a}ZdXN2jV'i":[աdhuРV Z$:V'A|h$k$}aLW?'u|@(Fu^21w4ڨNF"(pbT'Q/aT'33c7䷠/BuRFHN=7|ҨN?R7 | y3Q[| QaT'uB-(Tw~+T'ՙeEuR?:[| ukcnmԌ(H)JNu57ګYmvG@ H@5QQd T'q~bT'mh;I: Iͨ =:($Nj4ͯFuG>@Y}nʤo~˿/o??_7?H>ekl}~??7?~W??W?yÿoow?տ'(zOEDE;~,B_Oo,?oOrE/EeY4lNEe4bMKEess-#$nVdw.Jf;ӬxNc֩)>xą2ɹ;PWc{wqGcBMB]U&ygƫci!i8CL2;)Ϫ.Kǿo՛g1}Q|}QdvjQdvhQ|LrO?}M~IٳnzTe҂2]Y_Ǣ3Ty|:??If9I${*קPĿl|k?0FU&Iq+x2ɜ^T&9O2L2yڷEe3zyEuڧ߷<2uw y/IX$E7]q&}봮lUN*g՛8 2ciLroo:IX$:q4]zqF\ iݿ^2|U&9*__et:׶޷~VVz/⚶o[-@q>9>LLr~E$Hex25x$Y$,lj\Y2o[dU8^-$_es2sLrU7* eVxeu¦e3iՅM @ eP&9](l$GfEU('{l-gyS 8#P#~  K,)P>v1ל"))9Lr¦ K/8f[zaSR&9())R&!+zRR&V7LrINDZz m65\z6KdYLr>\ۢ3>_q&-뽔IjĄ^qrKlLr'St6MMN|uvuIN2IDK䄎2eU^$|2IKSY3ߓXpFLr/o_IL-[~U&׽LLr2CIs.pn?{I܋^m]볷EWTe ?@OٚiX߿RU&+{[tg_;~e$WU;R&>ėRvWK2w_)\4}G[*zIDLr}W$' P2IY{LrR6W]홺~E)e2IT)`22SLrU)T)-T$'ˆ2IBUӾz츪wI磣;S4&Ue{Ӄ.jϞTIQU&ߦ^MtU{( Y~qv^~i{[4?@VU&Zev~6_U&?Vd2z]U|d,s)èY~a*.*ޖ*.*Ư*\z25Ǫ2ɥxޖ_zđ.xov/UI.Cezk$/Ԃ̩#?TU&"?ಱ.)j9~4rbiU~>zW~ެxKz-ZU~i 4+=?+|ѽ]$9E○$GeWe$wѻ"YU9Vެ)kLrYU&>{[tg_RU&yת$Ed[*iשkzo?ߪL_(cR)U$' =2IV$gPƿtz?W/?O.-:)I?T$WBBo?zLrRvP)$~-@}۵8vfFIN*e2ɶsLrPW)JI j`~W ^[+e*e}$&V$ILr4$QLr-]wտ+yӂ6 Z6z$J R&9 ߏ2P)Q&9(#I?I F^~`Pִ292V\)U$~R&9XI+*ekD_~`Pfh*eJLR&9HL_zrG$Lr=z_(GT$w$T$e?2ABE׋/lj¦/ljP6])ۯ2AYdL{Dd|2N{LSQ)R`<¦:'F/`6YIv*emJd#Iv*e7+ezLsDՃ:Xүs5_¦YNYL|߿Wd؟JdIvW+elR&6\ (Y)Բ*OeLT&*?g?2ƷtQ{JF=.=>wIvJdDJdze2JdLR&)ۨIAOdo/STSTIvʠ+ec8+eJd|J`?R&9H(I2AV¦ ZAwO $eie$e+Iv $;eLK_hi K S:UzxAdJd'1R&YmIv2F(tYzOտOi~(ԶozkGZejLzeĮFdg˥wDW{?9l?(((eDFd'1Q&IkIj[KzOGG~sүW/5U&~uʃ_iIGd'Q&٩iIv0Fd'v?_ =<%~yLs,ALs|LszL(($D4$hIk/QT&9Q&IhI}mIvFdgQ&9Q&9`7ƓWW~(o猷{~(x(5$;'7$;>6$=?YտZF^}$;212NbULs,lL(4$=kY~5-]5e1{-LSf((`2Q&yW$:K7=O='oY~@瘏ڣ|`+?܊@'qfWZxV({¦HKjNOV*M ga@O~`$='l#KO/t*?087?uzm&4ooxMSP4A65,.>z)w-=u}t^M~gK]M~AKi~^޳6^S>77ZgM{t{~cKO]/Ow8w6քM߆߲?g_]Y?^SڟѬ?cBZO^ޓ[w=yg={UR]kK4>W=¦.?¦;~h?`?0v3'~z zҝ~7:~X?\?8~@8~@8~@H^0i'7>6¦pV~ǥ~z¦:K&7ԟkf ?q?r?3~~EyecSTO/a$ӿ~n \{!sjJ-k|<7m! |ihlyO|_o.T uzEmw|`rskOvA~`~ĵ[qq?0?~`~:p̏?0?~akfZo}OZ:s[s[KG?t ~5kt -\k#'֠GhOpAОZn=3x =µ}p~\\\O0ޚku{=k?kuxZ\{hOZoF3's3\ko͵o͵tZo}OZog[О[s=kurZo'[u~\[zD?`֡k=ޚk=ޚk̵:O%s\O0ޚk~\{hOS~\OG?`֭F[[D?`֡*kuZkuoZ:s[~\x oo̵t\kСzk :Z\ka}k :OopAV\ka\kС[qAF?zZS~5?k :Z/\kaĵ[qA}@h? 50ފk :h?>~}@qAV\kam?>~}@kt㭸֠x?~@? 50ފk :??~@qAVaa??~?0ފk :?0>~`|qq5v|? 50ފk̏?0?~@\katȍ?0?~`~Z㭸K8Ώ?0?~`~k㭸֠5{ktpA\soZ==B{k ?z35\k#'֠{h -\kx =µ}pA\륣k z0µC{k ghOpAY\kеF=B{k D?t+֠[oZ[KG??}Op.ak D?t+QОZS~5x t~5?Z֟=µ^:֠5?Z.oԭF=C{0µ=B{k :O%֠,50ފktpAD?tJpAV\SoZ/\kСzk :~}֠x+50޶h?>~}@ĵ^zV\kam?>~}@toŵ??~֠x+50??~@ĵ>x?~@?0Roŵ[q?0>~`<Qx+50ގ?0>~`|~ߚ4h-~[߮{ -丛wn ݌]w҂l=y7c?lOnۻe}w3v-d[O8eyl5y5C-r\s˚W3|t_>P>opXIxEV%vIi (g9_u1D{SDPAE*o{UqݑsPسg,qPzLCp/U^#=Gc7{+&ͳ*o+__,њȿ]O ȳoxMtAxV齳Zk#Nru9~;kOr? tDYDU:'$AH9n;LN/:MjsЎ&mȎO> Ӌs69\s Nw`N:N' Tg.H#:wtn@݌J\!Ly{ "t|P1II3Sv5POڒR73͙ u̙.H`*ȿn4ٵqͥU<봝vi;IUx+M圐f4G!副"*g)/I8*'%}Ir*u:mAK9̊IӷrRK+*'C)7Wɮ̊^PE,UxK?N[dNׅY6KDwCTN*ip:Mv-z4ٵuNqT6WNZN:/iskqMigJ+紹͕d !N+ⴹU\봝_H+N3$mT?VqdGJ ~҆I+9mT4R?U!}Oɖ6KNr(]}~s봝5IuΛ9-69is;ed_6ﴹz(]BŃN[H{IpIs&m}I&m%=iskry>iͤͽN%mͿ4u^N[ŜN[H{}ҧ9misk>=I%m/Q9yu*ni4r |)]t%JPĚ_isyL,}MQE4@&{Q9Ku]yD[ ^!*gW:]TISttQ9K4pQ9t6O9:m^N\NSD4k͕iNu\ͭEOJ!mn=?]isi)]p%O'm4=ͭx[8 isŧ6WuOFR9ݜRrUfJ+/i7ҭr]SwoW1^mqɭd{K&tU{t@5*KTN*G4bu?riqN-f I{Ԟ)]duOuCSq:PD/Tκ:_T/~u ݯJJJ[o\is~^is}'Nw'rӝr&Mɖ'*gߌ_G-r5juHZD$m>1﷮NTNfS9KVd3%C,]zydY:}nOoӏDxW~YZϛ.Jg2A&DxE);OTs446D?Tir8/niP9K+mni?:Nɮ⏌^mv:Iii]ri5fY!*gi2P9Kdsv:NuZ=TEWɿ&?_>Q9Ky~Ejk͜ 6t]G㛨=>|/?_EH˕MH~r\ȝ񉴹iN˃isisUMe+6q.w[ͩsV5-lӑ6w擤?_6wͭ׼7tlq#is*i4͕99isF75_" ?isi/6WK\yitۓ.xQ\?ӑI+8m_ mn z~y!m!mHk8m󠻞4/64isid͕dII+4;H[ä~6WNZ~i̤yiskx;Fd>崹<ְ{uisy8 O~`'*zON"mGܙ_6FE\!mNӘ?'m.;݊ܝ&?N[~^~ 45N;ӔHN"m.7_Kdל6F\ƿ;m.;-2YN[\IOH_+]"W}Kd6w7ͭMEWisiͭ]%eW͝iskZߧtƴlHܙO6Igr\&is8M~ HN%m̯H[+=Kd5Kdt&?pͭSAwO^=O?6wcE\N_2;m.fഹ}N$m.&ഹ>rqZ~כ\67sz>'m)]"봹4~@~q?<~j8}?>#m.v洹26_GͯH;isK^;׿H?ta!I[%V/Aw'ItEڜO'm.}O'mn+]"O)]"_䴹8-vo@\q:is%@\qZisx}`>ഹCZ/P% N+ N+NK!m8ir>>@r]ǟ=J N_t\qisX͕;N+N[?у[?P~rUQ isjߝ6WJq@aisY͝f ;Ois޿qyH+'L~d6Ww\qzisI[c iis?#mF!Jr6W'?`费3>6WHw\!]isTtk5I;isN+N"mN+/i}y:}viszH\vis^/rCI$mniuGUeҹ6z B\vz$isy8ߞ9-}oikK{8퇴rw~s[|M?t\?촹W<_t\vis4ly}is?;Mh? ;}=H_:m.; ?ziuh6[UK%is*g_O uO m.g~ᴹ<漟9g8m.S9/8m._6FH\vis99M~`o&TFIPzTϡbzәy"Փ7ՓUDP=*|S=y0B*P=T tS=%7rTS?*l}_Q=ճ&CTOiKzJe?T*5KM#?MAi2U<U=P=vÿ&*iݴGz馔zص;TO;vgNc9vz+g*>WqdzX8TC5|SkzLyMQgTO1D_jT)S=MTOgϮ]7c*TO?6vS=j7ՃkMT_*d+?ܿC$SP=cgOT%T_ u]Ux:'u}RߗH?C$P=9TBTOtkڥiFvLdzdu"?vSՓMqCjP{P=?9Tϡz)2L՝lJg'xfTqBx1ՓYo5cjTP=zCњPtjpTϩBɍMܨ"9;TLsbㅩS)S=c'OHz<zfʇUzLEI${UՓM@T U?'?@?Q=*gjA;S=?1S)4{S=9?TsLpB*PP=}3)ڡ5_k9?T̡S;Pަz~?Su)Nix8UGhgN9TP=Cp*סz|JC43L _\\g~@DPatoh?>~}@"㭈x>~}@t[AA@??~@DPato??~@"㭈x?~@toE?0>~`|K8ގQx;>~`|toE]zv|̏? "(0ފ :̏?0?~`~AAVDХ[ȍ?0?~`~D]zVDPx =B]: "9AAО =@C{j n=x  ~"(DP=o"({ o![ "@=B{Jo!=@F3',"(Z=@C{ DPЭE}AA-DХ 'K0BC{ ghOAA)G?a D?trAAIDO:{tAA-DPС*@]ި[za zD?tJAAYDPat m~"(? 㭈K8޾@]:CF?txE]㭈xF?to DPat DPС@[AAF?t S~"(? :".DPa@DPat[AAF?th? "(0ފ :h?>~}@AAVDPam?>~}@㭈x>~}@? "(0ފ :??~@AAVDPa??~@ :"m?0>~@DХsoE?0>~`|y5VDPa?0>~`|au@ &6 8X4^?0@h<@ko|\tCyM?qN&!O0ПN" >y_ϪFr~9_tY3E싳7St$% lvmtP_v&}-ʪ٤OzXBH {8 '=lgYYOgY[/!giv6b1pHSЋ-~/h뿧]F/3=?ݕY B]8@Mg)kleGϢwg?@O?lWg$uOwOgleYlqJ~~̘?$g-&HJ{TglA|$JCYNYKNySt+RNtϹ2< ԟSpSpʆSNQwpJSN* 3A!gLNY8W$gߢ b{;$=g3ݝ N3|vڼȿQY< f8H4jnKzx}=_pߎQ4Ih #-fI=>UZ ͪȶL% .~fUzD9 zfdͱvNjôĴ @pfd'fٓA*AP(!3#;sf fȺ!\f8OJx2`qҁzYyKf['Vȿdg7C7T̒ w3 12#;gw!so2sKIs#g2q%'tN1x>ZT1݂b-ČA_'"fZu%ufp|0pڔX01 3pt"̺VBp 10V{Z.>iϑ_2{~>]g/B_~/U_Q2˞Nk%\+Q/Z zYR).{:.NG}qȘy -e80Jf.;^gO|!hXr"],"瞜QdA7920.;Tgoa p[x·櫡D櫡ttz-gb#eMli=Yτe=WN+N9Hzr3Qh>!^<@pĖ e2/ gnug,ȲliGCիcDشLV`XCHp,e:D$~e:D +LaWKLʄ\2b 298le&]ȱk% eL_7iV tڳ(kէO39~b}r_'Kdğ Ztz8E$M4+dp) N9Yҡ3e7C37'c 8No2Y&^5 MqW\"nga&gd:C&sa5."n Aͽ5]Rh_R/q_35;NFH y:-5<Y2n,9+Jά@+gACTɚtdӀq̜IќǸ3P& J\ts$Iڈ`%3ݓl4fd-3nvpА0%dȎi"D,Yu7MOO#K&K% R#gF +rdɂ,Zȶp ldTQ5w&ԙ[Cg gv#x-^~\dTDxu$.Vd:~zi YGc&^y.1*Ȓ 9w3tQa @rŇ,YZGyݢCqCaCH# 8h:wZTjk YAq־@B|U" 9v3tCŃ ,A<M_ǵN)' f䉜:W @|Sj {klɊ욯З3ExEd,c@N31Ngc_K21/PG!c8A<94%ccɂJk N.8wA ǹ ū vBqP:Sp cθ%eA84N/ .Djuz8EӄלduZQ 4ƒ9tSsSm `6 qniίWZ: #;fw\^a/8Ȏt:>iJƹ 4֣*).zhIyhI|yg 38 oFfIhp /f]\wy2ׯALƙՙ0N;"z:z:^tgY9;fr+e{"ǧYƠ ëPc\ °Xҡ-S>T:W$p€A 4ůU{ًK^i,vիDxuZͫzW ITGtqZ%b8Aȅ7!.t䋦v[XmdCdAӓ9PA&7-Ip^rŘ),IIilhbq"T4+^1W KR hZ[9X*] /@Ux0"8QqZ%Ji~api.8jpcTp8?bpxAAlgp"} B:8nvO"&&S1IAZt6;%B&N]sWO5sOg'Fٴ*5sY݌{7+oPUe;UI̗W$הȡ$4%Q "`”D!k?I( 1$:R*<" l ρ$EAVu6/:'=2#VEXa]TO1={J+%p Xk0bSZDĢК9I LሪχLB}GKXY`1qA&v%@ G 8h 6)'j'r R؉ XG֑VX]Kϣ wJiS2zkpC{AKrE'6uV źz'@&K;҃`yzүI+Pѓ*z @hWN߱ta =2x_EydRүI{0I0OzTM{Jh}*~b,ˆ8͟u|sB7&D <k#k>-2ϼ6z^iWϏ6IӢ??|_C{ߛz$g~̄0iJyS"Sn#k> ޚvANֽ]vӚf~|in"c~q1&PO4QWwԭ_ )DSxL|<Ňz1gsD$=.o]ߘ߻?^O⽮8o2dե+LE80wE|g~33߳Y/ǃn?"FV{7mRTC5&ԿtÍlބlg~a.#k|SϩG:o+χLpg~sx/do}Y_#㷈U?$utW{%:SǠIkɩPb3 5 %]LɾT/*j-d?WrN,Il6~ -a'0VOxO *vǸ!&0=]D?<o 3)M@4IS{wŚNLDxψ6wM*7oƷ"NgƄ~ N= hj56(d%ֻ񱣧'[?r'{4pz"ekC&IB9'Jz\<oɓ}꜄ʗ?0);=7=P.j ťT{>㭪儦񿢽Y~)[G z0Pi fjuI=?V<oT|aNP3T9P/Ve&_Z#?$0OQ>NSS}u7_ؼo)E麿gș}?'|<93[b&p/~/f?f^o\?yNOլ̣#i"fxez[x =>PGj:>L$OϣSL UsN)j~Aƭ[s=kS/e<{|`LJ~xkfMWS5C7o{<oI| Kz~>yMksۀmPH0_K^5ީVhFcB9S7[ O;~z 9~&oN=u}7E?gm\ ξ_]t?ozߚ?zߚI笿]$o~8ը ~?`T)"߄q60m|2#|b~ɯ?C\]Ȝ\9~6gk;#]x~9'@ӟɽw˷f[dAλ r/-丛 n ݌}l-ߢ>G`b"s^neS8'ENoflm?I0Bpz(W  991oz5= Nl {sRdtk92o:[p7ݕn~goܭ >[͉r3!I`@A LLmt uِH?R@H)rJI l9&аMvM7lOֿOhLU\n&m&9)&rRJ~-J)YmV}'$5>%/I)IŰN)Ih $.$d KO ++Ry)%d<'P}2)%oăz=^_7dSX7Ӵ=.gGߓU2L_׹>*dhUr7Y%#/JGVIz5ˑU]AVɁ*I u%\ ^ݟoYȜ_jМ[lza(:gگ9'O|Nf~b>g&/z Y1Ysf|>g #}ds`MkhÜd>>g0(|N2sx $?$ú9&I~sR7~aS0$9Iռ|k$ם>'q>'c>]sV->'qʙӿ+ fIwo缾~O<{|Nv8{1CsW;|iϡ9y4y|q=qׇq=q=wq=oqﯚ9X9 >[*SOs꧞~ٯ# ץ|績|眴N/5z*9&׹9>|Τ|Lt:c__t^;]+5sxS~O ~|_7W_8|?^|=y2cn|C6cT|]|/9Pͩ߃_9{θ/3مNIdd_tѬCa߫?/?4V<Y~?ίYP*`;]ήONН=y8zgO*<,kV9~1ȿy,Ź+/ـ{N)9ʡPB {ٹ6q 0myj?&x(xDyux_xy<7ϓ^Wxyb)y~'i#9> $@u" ~Ity~9o<sxN^_zx}Rn']3|>xÇ SPUTO<'?xZ~yNxZRWDT /6~x <]y%O o<]d+zGq+zZYq}yp^%C>`}P}XoS S<x$SSo\/ fG>P|/S$#+SmSIB>PoSSlG`cY>v‡O!?[p%"穇 c}SO9 <ϙyS<W<yߐ (|oswxz2LeȓTt<+yyʏﹸJzʗ/2xJ?Jy7o@'w|Ayr|ߓ<_DN>?',>@Ox4q9@zyjx>gx}~N9z;zyy7ii<8yyOxgy5$h<yֽymxz iWi y+5NxVu 93X.EyV\GyZԓ|U<m[r]ݢgPU g/a{g؞Ya{ll=lX3ۣ l#(lӕmޜ=>dc=O^m\a{fA{M!{&8 e=jR3V=MhrzR&3~dPʮ0o탮׺p0e`^^C6YN5; Zbڈ K/;_='K+<З q$_^E9!x X(-#kZ(o)X(@PX(d7K 3wQjZF2KH& Q ƺBd4"uFFƚGd4h$( AFc}!21'2*d4U&2[9#32hGd4S+j]24e4h BFæ29#ayHDFsht )z^")Ja")x"s8(|USy0j8 2_%8J<TE)|uZGuَxeWGST?|Cҙ{oAog 29Z2aVJ +S.ʴ.ZFBt58jNi}5>rVeAUSdS3 NerL2E+|dVGa)1BeZ@e>e|GӴ7V6McIqP죤*TTd3rEQ(t) %uGgߍW^$I7?tɤp^dӢAKηdqHK`%shYT*y%{?))hd ($ÓL_M0&9CX0%rCo&yT܏ʔQ)SdZd^7{9=/;{9}#1}/m"?ȤRrd N.ÍLڒ jd :ŒуL+r'ed^drR.2n -2)? *XPddeea.e@"SF5Q "29 DF9{#AAf"޲ S(4 7HGCYNx9`iviyI"TA5T~LG!?a?a>c>c>&R''\TJCdWxMpȅppcZc91#0#0Ǥ3PH cBAxL Vx|Ǽd9ͳ1/4}Ԋ혗N!;;:mu 1:aD*6N%-_͂s[ `1ː4.(dc"NmdT{rkٛo@. r1J p8oL!Co.Ȩ:fj9CnL nna8o;jÉhc~L|(Cܝnٝ>Gv,ƴ-ԽVc11Cj\L|yiLcjBjldiƕ&&_y~/x/t/p]6d2-l0c?-8B-8B-ɘV8B-ppXKxgW&|3wb8wCbLbƴ0lZHVbéc1!0(_b }1,Ϸ0U>tg.apQ18n9td9mK SQ q9_d)ophW#e l jSQW@ir89 !HHaRbJ\p b>Mn˨bp˨s_FP[ g6\TbRGb)S4H԰,XEt:HJ:HDݗ1$+}RL= (&m(JQQCb*T@1oyOL 'V[Oϋtbbl7f3rZ,6"jbBey٢|b.\NO,DFӏ(DF,kCJ(1I&1d()$H<F + w!$L[$N>b.}<9#N8b 1UIp2b*>\`S8TJ@DL SY"@N' a qnl`9d+ܝx; )ܿMr80|~&@@I??xb0{?rS ~W=? !i)PS)g)aaT¹O(bRRJvx0^N{L 밎8E>$r,ie\De$ydDO4"7V+7Dz631P!Dz79^i^?DV '|?' Geh'|wa{'۟^>c ?ho827Ox{s6 '|?' O|.#@7;hMz+ ? qrNQd&io!@c0@+EPނ##@ 0_T`U&ԃhxY4thx;|X6I}S_mNYEFB3e$67QFRqQFRقPFb)e$6PFl^Iw |diDh> \L ۑ\%2eH֖CoHaH)#Y7͇ޔGFbsme$Ţ`d$E IIQނ(#@FR #)lV)#9h!2r!i>TRe$D"#)_Sϟgi>\SMe$ߟå._{%F I *d$Ql$Ɗ2GVb7G#BFRxJD"*@ī8!@GNڄ "^ "^WcBI_ Hl}V >`Xbz\K$EL"}$n$A$v©VL/dI+؀H^K``I i1 H^3$GAW؂ï|;7qa?Ӡ58ǿOGA }@PI^MIeMI@D>! Y ?ixd_ H4F" i6$G@,$A@,A@ؖR@n4k " Y47|=%HOY^k]?_s*X ":_I:PbF&IxI>III L`[d4EAI"$ý(@)|@@I20P-8Kd7<;m Hr H{>XqJ4# iV# i 4NO4Ζ節Mi! i“HЋEr^yrH tO$&i0)|P@ҭC@ҏ`$9@gͮ]!n!~5>uEݤXII3f$Q`$BmHno$HnX >`?ƊSHzQXi~"WI{)yC@>Ɲ$H]Okw$kﯽ& M79y4ZHX;LI;B4kGcyB@rw$|Hv 7p4Ii0XIS@YqܣDavj$hԏ) iBH qScAgDq4 4# f~$"L$ 6G0s=Ct7דfq)&29> QĆ] HZ%h4qb4.9 Ʋ~͆Hl𤀤U9[R@0! iE&"s ~q13mXBhxnc4\O! Yw%~D@ؐT@r$|3\/" i4\V@Ҝ4H,I.4F@b6$Zj$B@Ҏ|@&k H'`La&Ćl H&hM:%@S@X @MI?6~ HZF@Wy4I;B#F1" iRH5HuH$r$Mv.1$g>A@Ҩ>P@?4PH*f3 H\) i# i # qdJRSN>rc?yR}W$8p! 1R@,xD@Ҏ|Q$W$!xYh8Yp|Uڟ~K)B,=7 +s}ɕiإ4E$ {I^__T@ҫH$( 6t" 4Q@QI2s}H zt( U7cߺ˓*;$*HN<$݆HW@*_|۠I0x$TpېI@@ҏq-$ H:Q$5|@  H.뀀[[+ B@oH5HB$|}E@ҩP@9OS@# V" I(|@!s>dmM<_4Q@rH.Z( Yp\5T@rJKn,JD@!^m`D@r>/2 Ia# s?ty +8@@G@ w( tQ@ҭ4F@ҭiF@ҭSF@ Y[bxO>H:\D@) 5yr! 4V@r?$* HAE8m~H:PIw=?!"q!f|>@@?$]I[F@rK$]~ $ vKaH3># |UIW8_ b" RH<R@tY$( HzH>eWtH$gB@tIxd}|K" 9$kyg_0$ɷD@rSH $g}+8@@\O>@@ҫ–kο:1]:#F@E t* x~dnĹMo$N H6Gd]11_\$?( 9I$]zɺ{eX_| Y_>'~|q[8gD@y_z$N H~W$C|'$]^N}kgz$nHN>w}'5/X~>:1z" 4V@r߰9DIy^d|>y>/2:|'tA,P@:r D:9j0:ѱ1όdʰK2:r0:Sh箿2@:dY)*Qs| Mb:L祙;X1usTŏ΃c:X%b:`:0G`:4@9h‘>0t֑I&3LLG4c:ɑ)Iѡ)S'tN9s1J))өXU0zSob:u}Htt`TGl&%z:t+&LG?%xHb:p$fđNNz=R؂ibV`:M*I3s$ލϑNbNɉK#')9WbK)i;zsѤiJ0(9Av ߯sy@v.0 ;dGхNAi٩z@vt&s$9M$GrU[NU$"KdG))AvDEvTPDv N^(HAd )Ze@vDoYX KP%_$G#>;3/NyDRW$wuEvy27Fx+AdXB SH [";ePRdd'dͿ쬓xcsR;)Dv = Ev [";b +ȎNN*N  ;& ;b";QRSQbIN96)ˑ\Gb 'Nr ;:~ȤN9" ;H'*t";E d0*Sȇ)Hە S>'rB9+VBb<;Ŗ;B bӷN7PS js" &opȭ/S4t@8H,A?u? Fr"W3CD Pb$Iؑ9b猗;E-N!=)& v;ŊMb1Nnukb-? vD*N@))v) vxQxf(Z_YY@C%(;CwO vJ ɉ\`Y9-ד hbwb`xW Zpwj{q.o$!/j҆}~Ɩ.@杼l/eBE{ ?) Ħ9(MBf iG(%uE)Mqbc*bbs&9ĦTnUn9vج &>%unt"6E$L8 6E"IAl r{Rw)xElJaAbSmiƖP"6N 7$vb>XR3ijobs 6ψظ!b~ b W_bI MDMi^OJ%v 6nؔ$<ȶM/R bS3/RRbS6rxgn/bSP؆MĦq,%8 6~"6~"6~"6|{ظ) Mg/ﻈzM)XX[bJLؔ/jSXb͊+1c8> ǧج[8d ұ=|ze_k+p ;aO,g!keҭ}`{ѾUTғ E Hf=zaf} 3BtfV`%׋?z2()uh)V(wRD楇 ;ͤ5k#4zco =N| כ(M͟2wʭl`ciP)Y?ܫ@3afS]dd~˜'6ɛL)k.g<2\ΜEaRy#eJ*|akk`5Y[g}a X` )Iכ X\jo^Ҙu%EW`e$L)jJe )ZeY)73LpIX 7J ,B|z)pM-",,Sna V9e2`~X razX+t)o2ne wa6eʁQt2E9LM,SQ˔L9 +{5{2aeYXA)Me0!L9 +{˔hf/qt~zǰn)8fz?s=ܯ2n ˔.^LQ[,S89 L)2ELXؐ[X() 2k!$sO…a8 ,cdarDg ,s`BeLA,,sg`+ e ja3^˜X72IX指2E8Xf%/+{a?`2GM_Xƣ)auUwvYGiO aZde_<}=0HVajf ,SX֟r~aFejSX Tn2M TUpՐ2a+e G2X2X?>2Lu~ll2m/!'.''ޛxF?'̟xs=O|zPߞiz]֮i}R~i3iW<M[04mN 5,o`4;>GcB4qXPSf]_jsCӴ ~ NӪӴ"v!jK;hZ*)Ek1iXSȚʍ5axз֓5 _Sϻzsa~jÃج06Kcm|(Xk̦Np6uZЦNpkHuR fz66~v6ͺ܏=-m~>F4ɐ=U$%wOXIcmp\O}o4Y_7'Mu{[%FzF腔.~ ԅzX_/[ؒ8c 3^3ojweq}>_8C[ ,:+#0`q xOg.]8,ΠIg QTnЎ_b_rŹ^Ź]8,EYKbGJgmŹ.Y8;88W7kaqcm|{(gw .XF؞H'8bY5؞GS)ӏ'gwǑ颛8MJ]#),Nd8ű=,N9]%gwvb+vbGC{Xn;oX~ɦo8鲝8}x}ǻdR|+w̴An\vi8ű,N?*X]_⬴/G:dq:缲0s^Y9, ze[L/vlaU$hM>{ګtۛh's(8GOSs8sXn1#,{&Cv=_'f~=uU}EOs:>vsht9Epv9Vck9G>GcmsR>ρ;af=(0Ng=_x辄q~:eϟ^gVXϱM}: 9ҩϡGAlK<%~Sz] 9>b>a_6-0:o/65]6J+qڥg?#0iWNl`.;9 Sh&_5wi/,oFXG9: `Ӫ9`v4Z}io8GOƩ8ƩGW|Tc8ՊW` S-Ʃ-ԣɉ_eO`aj)0NUGS)ƩSG]N򁵃ϗ|~+;q*'80NsƩƩCƩCƩƩGw?8*>'~80,0N=뜐LbNH`ms@`JazL T^`j;4߅`WX0q/0Nu<Ʃ8v8ƩG_x3Ҿ\6_89 7TNxq4?V'?sx>nU}κzts\O9 }NCTu\svOHgOr8OƎOD[fgU`|0|>gaG:T}N9lK*8_}NAS,p>Ju9U=+6p8lrR>6B Ob!|8ٞj ؞M"| 4O/\k/οe}腓|f=L=v=ly~a{;`{2`{llO}Ga{لNa= , s_؞eqf=U2la{|e{|e{>o֓aISS%ՊKThҤ6=M za{Ԫ·|"8@!@+SgVDTt~=9@*|`|ٞjEx9@*(`TVۙԣCJ`'PO>硞|WW*`{l^"Smocoٞ*[Se%:q>q>q|Y8%N؞Ze %7&t}z./VS{)E }N9Qrh#zuT$)O+aD }z L-T,s st .}:w 3|^zuM?/sTR=ϋ>ASLN= ~XVIs#Q}Ί!/D3l%hs 6émS$pD!nKQr u'AVJAAG?nE"|~!A D#H@=AAK/DDPߏBgY91PI"I@?9y?%\/KыA  zZ" " # AF%$^%m @AkAD!l!l%T*'D.$JeYDP1?|~ͺDPaP"g:/DP?^M_HIBh~IΛ$xT>S?"?*KCB?DP[uݼAkC.CA9!T {K"DPQWTh#dsS;DY?BG] AH!!BDPyXOCG=c!"謯 _%q7~\Oo|zB}q oA* 7^D7o<"O٥9^wg/Uc>!s]'8AYjAa"VXq*CA+~%ZMb} !V -!"hű=Zq*CBfOb5DЊMb}ⷈ?<7{|UB!V A+xG+Nw4>^q*CK "h]oA8PYgH8T3B Ah  7#4jԮWkG죻 ]S[[5G81j">D",/DPSp  H?j2"5 A H@Ԧ"GdI DPSp ;D-%DP;!Vֵ)Z1Ү\5!"W 񵉠vA+(DЊq"ui}c{'~M!1D~>Dׇ3|ۇ.ChO !BD"h~B5AṪZqA@x| ފ[AM-D~;oB8CAO$|hB&Z/?ܟ"hI|~ΚoNB5A+P'~p~Cϛ+D~_ԩZ+G"h?xͷ].DPS ߧI|}{$|%B%y}Z1vMxo!Z?oS'~  5߮BBJ$X@{|z$;O봣ZAA{~kC8{ K5^U{M=DЊ!|Ոtaf~~2Wr~ ̧!V<|۽A%8[C(̷oBiY!B(uאHI> 1 ԮA+n@k|m'ޛx@o翈ܟTZ1v!ϿO>p>Z1zoA+~$F׿OK>G#rКo/u,!V'ukJ>pJ. A+n|wB"$~|{q ֧uߊКoC$XiM%MMB+<+"IBϛ|` Ub8į +B8!VO>0 穘TC%h O'~sRa߯xp h!X M{I>0$B~MinA~kBeov/b A+B3RA+~4A|`X" !V A+F| i?_"hxͷ+1DЊ_5>4:qADЎ_5+BvZA+>#"h/Fb1DPK?W :?ZqZPw"hG!VH6$V&w/@ !V A+P'~;kB8g?"h} A;{|r b4į[=>[qZy>B'"hŷ AO1|AW!(TbOO7 A}y.C!U_޷}7 6'[~K>0$tC޿Adk&I@A;w7t7>c%y.B%8DL!1"a"~Гse"h-KJoyC&~7J>0$N"C7׻O~o$R|G!K>0$BXB"v|A)D9Oy ?"h"hW71SޯA;~SƯA;~{ƣAmH<q}5J3q}lZq*C83q ~oA;@K-yI|g9GXxgz|Z!V7DЎI>08'uA;~d" zB8M!"hǓxϷSid|@"!_D>@ox6 |;Оo0"'@5;$A&|`譚&^co @8wOyyAC>r& v%]$hEEЕ. A+"h@kÄjA+x".Cx5>!~s}ȃvy@L mJ>b>s=oBx>Ohg!V\9]!v>vwՎ| AD~Dn|@wo|%P>g|z x_Gjfu?)DОO$ş?o~ڱP|B>`EL!bXQ"h7xz?[?&+ # vşR"hG!̷t8:DЎ?DP.t|:DЙ ||7@=_5bTxc%f}>DО 1-B|J>0%X$"*KEf?ē-3߾4=rJ>JܐhA"wA;\_*B:DЎ[|b>η|;?DЙ!'Tr}ԗ*4C"h!DJK C=Pη_ώ%f͗A;\_*C8Pw"hǍv|=_b!v`a>?OKz2`H!o'1ߧ!̷|@أ$?ē*5!L$D.K|!D>~Dޏ2D/b-o_2Jxf?M>07CJ<']}ш>%'yBNyה+Y}!V\$yJ>DЊ#.ef!ڥ,DE> $; yd%t:A;3ח+DЎ+ !yFَB6>ן| !~?Do"s6|C;3ד;DЎo+SO'4<ڱ?$D9υϧ?s^;}_#דm}'\o-T_yC/q="K'<A<&<B*A͎A^f="h\W"h\I!J'!S?M?SO^HR3׃#Y_%F'A&M}$II!A~ߩ$~v} !V'DЪ"hCzn}_!\Bz)]O%Kʏ%E"M}vA "hM.m!v|w]"Q"h53S?DЪ7i3_ /CzA'C"hY_j.I8#DЪ"C]Կr6ԺDv];gqC j]9DЊj]8DPtT=Dнl5t:۱<<@g3T@$vt:t:g<t:@<zNGpcxՑy egeH}tx$(g x ~r ct Ac}x1!5uV A|XCP`!iԼ?1x AMC`t TaC@ A@ Aux=JS_!QФ!Ij/vp !< Y G Aeʟ`CCPy02tT A%CP~b*%0g Aё*)4U1CPc?v@51܎Ot? At!hmX>僶tO AM^uwGp Aס#8F3>cj׏ZS?cvi$!Ȏa CPs|Ԭ|>1CPӈ!#ɛ7 Al?;>b|S:z A?c !R!iL!H AAGO:iZÊ6߿߆"_ z5T5]Q:~XO!he=W X?_54#%/!:tT:_](M A@!㢆KD A3z CPc>q\jZOq!g!So!S/!t0CP}4G ~0u:i·2!~2^f~t. A_CPר!~aE'+/\/`(q A5516p\^nG =o^[ AICЅDCZ C!> Ak,Cp~t4/|1 4(kKCИ1Ԁ|`2 ϣ4vxtktM$|NC4DjJ߿c阢!~c(S:>0vt7_@k0vt!RC:_@+NS!ho`:%+>WCИJo6YO!h>yS!hCЩ4!b>*-gt A㒇I>0.<N=>~qSψ!hQNCЩG4P!0 A>Cи4.0A1䅒\C u^&vhT4&Q4,jON= + A>CFF A|SCЩ4|1C!Hë!߇!<!ƠCЩt ACCЩ48!htGqD其oc(+ AÎF%cĽwy0(4 )!h4WF ACРCA? A'k !hhtx Az?P?&߄1C!l A CZMҗlc(FW A+?1?J륾C3 A4w>O#~~|c_C`!w#tz|@|xy.'91y>!tY/!ֶbxgk]C55a:<2KCto10]cIKCu :h!h};8o\.:jQCWxDCХCХC%O!0!0!~&@~r> ϊ!j)xUytt?!h6eB!*0.1]UNͿ<tit1_C%ߊ!8!䋒\0]i_tQP.7[>1}{J޷70]tttY!Hc1>Gڇ:_C5tQO!z Aa%{|WC%!(!h!hht4`!h/-כg}!70!~txZ A(D>!hCZ']4x_!rN~!h<:'!hh$txd Atc Ak^'[~_:e4  ;!hCа<da|`!htyttxy Dtlt~K11_o߇K!hht5 AyCtJ A?~f!hF'~yb Aj4쇃!~}!1 W4 u1?!JCи4옎!ƥQ'ϓq\w.}19>jZ?<>5 '5>o:~%E>pQ_!hp>!_qTC~'+SO!> Aa:C4_@Cа#?qi$JGp5t.y&q]?C'1Ft@̷Ř7x~r}OCp|33>+ݎO4!~X5_hr44a70 # A CШ!h7vA0?ߺ1ot|y!% A4.o8>B} At AcF< A4t`SCy_0 ~R AjC>!h`44r=|?|}xj1*oCА4| @ոC> O!nw!hT 9ֶf%+]CР!hhLd; Ai|0  A}4: 3c(b?cZO^~w'ֈ}44@a> CY`rNCƳy? 3@  7_O(W>c7~؏o&?؁S.)7ή{icY> įp?/1ۥުoQR"qy83?l4<^HLqԙc}&g>Vy>JԐ>k|wSd9dZg^?Aw3y@|f63W|=S+xϤZgV?>Ua{=gZ(g==b#zֆP=M`zz<^k>t|y^ r|>]Lq]M籘<03uI院3;9VH2@p<`<4ϚyD&<~evzv< ;F;B;uSpG+cx`ZX8TR':\p:ړ`:V(#?\27{ ::ikT 3k;9 3W2l,P!s! 3Ű7TR(arxl$!r 䜗={!lVX {Ϡa kf5g [ FkVk΀A V|(/#s3\yʙ֟;D7@<?Ӝ=4Cg`3ԇy\#9#HA Hs&p4`03/y.%9{I}04% 4gAR @s&33gN =evht 9h'}cCFX#hf##*W>̴8̴a{iFx)\f}?ɃOVGu> PBʼG2o(̋ L}(m7kPAdޡqg6 yOM﫜&p#s UX?8[8F}ptu1f1SS_6#c '1b1pL9pˁ[<ï ǔab_bp=|cj>*NTɁc˿W88SKj88 Tc*1Mz`~U3zd19MNޅcj}8Vڄ_# SYWx8Zj*:qOC)s8>ʅǬǦ4pLUSd 1bXjsj1-pLu4g4lT Ǵӊ?_T;pLkhrՔ 4Ɂc1>vd:cŢ1bIpL8f}x7xrcpLc,IƧv427_m>4aU",X, Ӕo4$1Pv iYSpLiOsYF-cV3\_E16vd5)k11&|Ӛ X):c h&F<|}i 4քo4c.&,~oN3GXMs*`~5d1bFpLK8/\D8Q)(^i1M8 c-|b84x h._8f 9j.cl"ӔG'pte1]pLpL~?1]9pL8;tK1618~Ǭa41P ӕWtaG ('c'p-cpL?Qӑ *ï8+s4_YZ/fIrXg{%HNkLHu/ /ӭRI$A"q"4Q,ӅcC]#',os&ᘶD1\~iK$8-1m D>ЖJ1-apLKNE_1l8'f?p̮i,~Q \o4eH194cxa?2r}~?q=1^Mg R8f_Ex Ӛ2(k1Ǵ*C>PocF/VYRD> ӄKcl'RvpM88fƧŁ1MpL-pL++4c2 X8"K%&Q W! 6_1u D>`)S SOJaz仏o7cwcсc 9>_#ϹzD>P7:z#YpLH8YΎ/j_ (S+U cE|1uoD1\0p%1f1y?c"66W48lM8Y ,iWcrV,io885e3?q=<Ǹ>iO4 cYpL~1Cv t" 8-ج[8 ǴB|1g>p}ᘽ{Xox ӔyǘǸ c[ᘶ~d9)pLSc&ӕ_td16{Y̥ڬ1]8f?xD݄g|m t116|`gЬ2aӬ6D>/ac5g4E6D3]= Ӆcl/c >|!<@YpLy4?tWczh")|ӬG8+Ip;c:vcޟ|'ӟ?@W>]ts1h~\G\O1^Ѭv )pLc pLFtcRc3|>E>Б5 t16w18s^!ө CYKcl*;pL"[Mf1V^pLc&8FypLWo$pL>@181 pLO&~2Q\1]88f\@9"pV813cxᘞpFSp N{+=p16_ \6_8s-9 D>pLoFta3ބ͡c+̇?c0$p{}6`.  ˬhVpL51^Ǹ-?c:-1]8Wa:N1]"pL+_#ӕt1]yp/1]%pLW8z\OO{p>z,r11?} zn 2Rχ.^Bvon]͌.GT]EW]8Wlg.rl.gr&1^=%f뗘yu={5h8WʹˡfZ1V, n2[WmOLtU _i<9~Ӆis9V>֬ 5 hZ$"4-u.ş?'~ ?'~И3S&Q4GOU,c9GՉiRWOguq:K= }CCzl 6G ZCؚot7ч>۠v4Oԑ4_4q\ G{P6GjlNy?_9*8%7t-g)tƃxCm'l7g[H?13>WRN="Ύo:y:G'݉gc*=~T;ֳ6g'=;|`B7iK|v܍|;97rǷo|Zǃc|,=>[;Fos70  @;|`Lsƣ v<= !%|;:#mb4|`<GįG{v"Axvc*a^A; N!vn& 9'~; N,Tz "WA;ց8^Ê ڀ\:q|&3DЉ?DЎy"@{`A'DЉ=>eEzRǧ"JON쿯!z3Jiڴx'b%ihA'~g\ϒq=QQDPb5Jڔ "hMhϷӊ@;vA&D>0LSb+GVA'W\_TL*f:'~Ag#I/Q:}3`d-DPKXA;@"X4K} #C>@DY7$AE>`8z!N~㿯ȗjsj_}[AvAT$JEc'(~-}AկiAܜ "G6 A8=>m$ck?5%~'A~j|߬`"_:o|lDйN|߆:RDЎ!F쿩+"h_"]~A8 ڕRDkA{PtAgrد+C؜jǗОo/ vcA>DPS "hA? A%DЎ!bΉ}q=NۼAwܿ:ߏ b$?w|xO='~7zۜs}D>pqb .(8߯Оo/uA~N(KB3$|gc7gnqL'!mOK}Jq> !;8K' "y ОoC{q@{U XXԬ01:uAW=vJA:b;nC{}?OV0A߈G\?n~AD>$?C5+ D{?jItޏ s?*q~s?:D>%1ԩA ?O\O|j"h9;.{Mb&_?{݅דxϷMSA- v܌$ 1DN|6sljDЎcSjӬ1MA;5j v 8,v<$|[DѩqjE>POq:\jz׉|:j\T{!v t*=V f GhA`}GbA; >"m0$S "hSbhϷG>P+A}~vA5;@j @m"CDP7!O v'}? +*Ȃ:߇:Cߏ|J\txη"h|pǷОo+DЎ!r"A]MV;DЎ,CD>P!0!T|[!8!vAq֎+AYKBh#P| ?3~qs*qT,qTt' =֩'jpA9A:XAg|\y~Sxct3g#%D;oqZ0O%~$DЙ _ƝdϘOОo8|`OA;"h-=>%ADPK23_P?ηgUDЎoRAM"IB5 V:J|,'!t"hq3>A@s"_$ {'8?I:#Կ=C0tt~|`ߟ :3}EtA8&QDߟ@M4+z:_'%gpt X ~k D7DYGbhqH]]"ܽޓXs\x4DЎc<,c(Pc @I4-!A'@߮ 2z2z~^bhM>d>M>y)DЙ&vعojI SAgPWb\?Ԓ"%ERt"\_|z&C>0ݐL1!EA==/zwAgD =\o !Z|@H;t7!y!p=2H"yvP"Jxߪ5?W 4;AC /K1"?-滸 ZAaAg>AAz&3^}?̏A"1BwA3q"'Ɨ r"&vAzu,I><. 'ۥ~gE~kI>`ǍI>x;%C>^ΊA-;<>AHC$ "|xx<C> \O_]NASA-Ұ?3~Vt|#[::A!~"| N>w!"AoD7#7#Ɵ.Ή_Gq=DЇ@ x H "hMC(߃*)މblAu"KԜ RrR}"6yf6FH:"qtY'=* tAu؜?7A$`N`EB _!4[Bhg| $7z^I EJMDPDUDRqA<W0IH-d3 DP2AilW3z#Ӄ)ӢDP:=?-ׇʞAٳ"({A:'+GYS& >כ=OoOÌvbdwLAC%A%  5DP2ADa^?DP2A;PMb)Ytz,Juz b{(/EO"FޟD'%tzBUw NOB|3IBhF@"#>?Ae'tzI )ˠ'8=+ jE3 H8=L Q = NN|Oz8B:ڝ WPǓA9~]"Cy>zjb"&=% '= N$ ?WA"}~M}Μ(EjDE@O!C!7w< "&AD1DI tzv,3>q tz ^?QA{+;NA{.MtDЎ휭N%|+DоG̷wqoA7|7zwSA17a4ᒄ=\=d-EzoCϋ(z_CIVT+ v=;?"xϷ=; A;NbhϷN\t C:Wp :H-z~ tz K xtA|G>p5V$B ǿGϏK"-j'DP$JVA]BhAh~_?D_"vv @KICBIQX= p=1= h noٓӓAP%]B"^(*< =h/$ ~1''xAOX'=tqWBh~oAyt+Zqu8z =b G=tHGP٥#tp8AY#cGPH888a#5:A#({%*pe}Aݞ8z=pCxsO| *pSP}r}#jh8#Dt2eO@leOnLO!ND EAmHܐKGP/!4p/%܊ߖ@TjڿZC7=J8Q?DY.bzD>pt&oJC8t>"d#f#hIGP'_GP@GGC AvHtc 8ґ#:#KhglQq#uꜷAX'xg~}_quu>AܹNy =u BGP8zء'YA ^c GP:p*!ss" 'GP@Ի/8rGP8<oq>pK\q>x# =# % P/8| A?+zGENɞMUB8q ~SV'8?{'!~Μs?8'am~1oQ#: ~Sх#h8С#ߡ#h?/'8N ~K'xAUVGD~IeO8ҹ#[a#({ !=K+Ĝw#(??sG. +Kt{>Dy~%~ype|A]>uCp K΂*!YCtd\A8/t~%++Az&Tup6<| gAOVDg:ԑCOp::pu:0p: P#I\=OOpA]t8 AzA=8d A݊LAS:ґ#(8q||{:y.#K,GОo"| CAx5%ׁ#ޯ #f|#UGP:rp]:jp]78!4bW}>A㏎K'O:18p#("$tZi#tuyAgQӘ| *u$t]o>J#|:A:t #_G ֻ:t*% !#H' +ug<4_Pcd4GGP:m7f=ηӘv?8$jЙo$GD=K'(KyAKGВD}K:#|GG>DЩ1>\IԄ#%S>O>O>?%q#H"YGP<8tZ>8`σ s:$u=:t"]z$r68 AK$:\/ztt4_BAGKA:t4^@GД`"p=33OGOzJG?A tg>%yDd>Rt#O] Z2?dA>:$tIZ<:X| 3A9~$Zq]ԋtp#TGl:@ԿE#z>AAA s=A}>~1s=g)oy:Td::=7%~jLA힀8'oDVL -AN]#sz$:GGPtGP9$p퍨x3#X @uǢGDгzQ%Ȃ xOy =BOgX "hCO"h&X:o0bK!1'~zp4GT*؊ ؆o {% A wDР'DИ'Q=BAMzJK'AA "h가J" "G~^ pzAz$ pe0DЪ:/gEDкѺ%p$4-N%څ@;#Z>A+8K"%q<:xQ"h ̿A+YDP^?DкtDI"hZK(z*uTpt#(TAkA zA9>*T,:p!=˔QGPyt$#,7AeI#JUM0:rT971=bT}qUN u?AG>X{-8z IA%?H*:Dp໐} C<#h#3)zNt@Ae~[z*= GоxH(0:JJO+AUBGPm^O GP8q}AhE&zc(zGPP2tDO}PwrI#8*:J:`pt&E "h DPAkHQDPAKDrDN-*%VqKb"h9C-AzPAG瑐 z$ 忯Єz$!D.:pbHCC;DВPZT H-e"{Q $g "-) 1t@cDC@7*` +d!Ո{|xmHX L )Axq؃"u'E0I 4Kͮ&yΟ=>E!_Aҹ'~~VBM+!&=r$3iL?_C"( -z$0! |>! G":zzXJ=VA=z$ {LC=VB=T I=tXz C"uc'N+!*l$vE|:̗c9D謀r āA=: zY=q<@NlGB|A K"hԂZAzZ8s%3D^IXe(DaDLTt@KMA "_uo8[8[TDHJ5~5~A;@{|Z< "h%aDr8qο$ E!ʼnDrZ>W|%E> "hT|q{8 =td#|*Ub(z4A:v,R:~$`y#t/82AǪ st.EbGп}Tt*V*8%BGAEGPd0AEGP?q>P\_*IDzG:J0Xя#TN ^$qeqpt # Az?DЎD/{W,K8'xY:'%:ʒA#,t-kAHPG$J&A=kGOG^W|s'8~oC!n3/ ^$ q/82_BO:p!Qb#(wAEu !p EO2~/+o~8 :ʔ0 GP>8=(BG!A CGPq=#T8#HGP*GPaJGPYp# ^ ^%q#(AyGP uU 8A;Y=&#V8T%NpUAM*ztzGOGOz'{=<GP^8Nϕ<XBJ!^8T':zPIGP!C?8TqѤ# t u]?DqLbACAIftD#LG J'tI:c #EGAdsAVD[G:pz#:K%NOILOd +tYѮ#:쑮#hN%=+'M9AVy#g$p:p::uIxn}s*_A%GYԨpsBGAͿ#Jb$A#tߤ#H,bLGPQ=]*V*K|`X"Hb| AEGPBGPTxT|?q&z"&@TpH,[Go>D>DΗ X'xy/GPt\G0ҽ:4A\:<qAKDEOyGPY#,T'TTN<T$p:*tCL~3BȐ#:yny|w/-SyA*Q### =@d>pKy}I|]o>#{AAEG~_g>pKȗƇ:B!^t"~ο8ʔ` GP#|8Q2$x$p*8B=rΠ騮#yA#H*/JE>+ΟJEp?='#A:JP%\#ArQь#H*DG:J;[(B8Ay#'|~p# : TTT$xq#AEGG:AC yqVAEGPq#~ : t[)}1@"Q#HGP$^GPC"ч#XA9_#~}#zA{~||#h/K_z#pZGPí|SӉy GPwp(A tC3q,E>Pt*tTt>χ:?ǧ~IGP7| AzaAE"ΡJ8|`G@EGP#Hl*0|-:E#T;A:Jt*GP3y2a\Tt*Ҽ_|*8r#Tt*txT8o+B=GPwq|OŘ||3>ucƧ˘)GA{2fhotCc~q[t"_qxA;qZ$4 }o K '|qNhR'@ %h@@ J @TA tBJ% J@7Jx/^`$ BzZħ8țJK% J DQot@cU⇖C $.)H*R,pjH ͂{fKzth{=-?-, +TU)eyU$@L,x**[ʣ& #@@  \@ @* J t@%> c| -0|ʟ(+H h-RsK_G?9Yzl/Q@bCOgM)[Yb^,%.U }wVtj? 3} }^ ;KV>kaXاt᠀}L} l}']`i&`ہ}+?.]Tu M#l87a_G ϫS. WɱO\S,G[OĵIOtR3F\]Qנv3RxSӻVQ)FT:.?R3lv 4ڡ |?lE{?ڵ/P.܃ǵn~œQvq'?d\OwCCӝ *|D{?/?!.'̄o?M}F{ ?͵|WO|5ڻQM'洰Ofi#ݬOs|i h O[Qx.\46C}OKNWG+ ا5aK#̣GOc3Agy #f7,>u ڿ T5}]O} Zا >ا.ak#(ilf 44}J}Z,4ۏ30w>اY|[r]>m\G^E'qip}>َا]TW[.i Eߧw}}[l[SZ_QӺ}Mاqx#쳿/&|_bX aci;^ G&򁺄OOBا>ru9t50S>F5T}*O%}vq0O?`::`P>bm`JsaJ;Ra S}0OlF dOesSاk 4 T}R?Jy,GF:5?Ss -uVq}R#'?P2???} G]O8[ا}* 4b}b}>ޱOا=EG]n|@x| o`>#X>MXOScBi G ?7R#~"_O@ӖOO?yu@3hժi I=F3?M} '?m CE{F1ޭbE,E_?ODhGqؤ'u{I?9ޠi:n/'f5f16f64^OXOpQOx9J?U?bU? G4a &|OZ}t{Gy'2=Ex'A S?pKSϛiSS^O'#ݘenr K&}z@/GPC5ϫ>Y.NNg 0O2c='׿rgߏE"<0US^g?TOz$ ?4"?49-:"tE?-a|_d>A ~`v޿hVBZԁä$u^F:^O4{xov߭߉vi{Z\OZyЁO ?Qsܯ@*0#ܿ@grE(R+n|}`3#pEӊzh!Rlj3F^UVQwTӊzԁv(h>9_iiMrEC>\irQOG=f;{??Y >|V?m+n)}?Mn\O1R׋YWժq ?Mvy}G>py}G> ̀]Ex]&\?n?o;T,FӀ S~^F ۥ^|b9?zB]|[qW?{>g1F݄yk2H|x|"h^/0ּsmtE#ą Dx| Sۛ bsEL>n(?W\oi/4a~C|FY|3bߞ>g>'>g>+淀-^?:"η"g>OeDO]63K>Oԥ|;I-~;?UM|GLFO+?Oک1P[bKODyuO\O'uB$ ?foRS5߉CpӉ|C?:?M} 4 \ϪiE;>%ԅygg_\O>@|x|TbƧ??O;AOOW?s|?W! ;q!6O>0JBc'ӑ@g#<\obo4a=?-ap@|?Bhgi C qTO/ܣ~{O4i.lRo귛%]1ߢ O.|<W\O>/ZV yCh?q?WOo}C1m3'oWUO?"h|S5OC?OiM86>}?|aE@<|`7Gd~'+? o#&Dӄ-XϤ߃}>KJ#x'{qn]td}{wz},^?^?{Կ8Xџv⸏џ})S,@Š?5ћ@(KJkLg7 Dʭk' E.(_I4'6jƮЛ=ПEh}=& )3GYZrIIL0? gCtNCYW}A霓ՕgQh鳚3l,_|~`>пw` X7ؓg<<y(?r0giރg]!sQSŎo?>*c+>EF|1KNT|И!:WGϮ-򹅈|4jqBǎB>rQW| !ҽ|OلqQ'$OG罟QW|rT򱣄'| E"B>y|ͨ SnD rkC%|%E}y|$ScϮ.w@c}H` G'C B3!|JB9Qԗ"Oa'@"OѰ䓀"Ͼ~!^@>9H _)xvFwVzΦ. |cQO@>uϢU!Cȧ|ps ELȧ QPȧ"Q!}V#z0zOu:@>!EB>U ȧrH&cOޟb݄q5!<$CQEB>$ 7C|_g} DQ| 㟐cHG×ύJ2i&|it`1i(VM!T!79|H 7%i|oO)"!; R|sWVCD E}~=! [B>Scx +|0ϠHJȇl QXdЄzB>7EB>v_B>~B>-2CB>CB> X-c|v h4j|?OHEȧ[tEX@>"T nQ+Ojȧ3_ &nQ2OeNq=|ce\EP] \5u^ \@>WՅ"|KNl \|.4xW!eQ1ϥ(R,4\B @>|.v|[(l"㮔u D>pY s纄T"$^qO e|B=4ԉX "D KjB>B>WD>pUK \iԉ|*^O]E&"4xk!1_#OC>B>=B@'@>]O^gF8 !^xӝ_|l#5t {@>]cObtBs@>OװȧS silM\QϥQ 窿Ů s4\р|.}@>ץ1(!Kcϕ򹆟?%sijCk2\|.O "w K#ϥA)s .8ĻR]kq=@H/ԳKcϕR6ˏg܎@>A S!C7!"v [v>|<i!s/8Ļo!8Ļ5}i؉|f@(P'y"?|nȁ|nN|n@>w{ ?hG>p |r-]D-_B>w҉C"6!c-s:-XB>z=>ޅ| (%y|nc@>E@>E@>JE@>w{ E>pӄF' } DQ߭v<o <ܮ|n Kv}scp|n @>w^oܿFs?"Nu gDg8Q7ҸE}C0pgp#3||FG>0l3\ߏ|`dg 3@>o/ؠQgФHgg<.0|EB>GQ6vO 4 ڨAǧ30 !l Q@g_ ^q^ϸ4DQ߸t"|%:ٵXE>0xC.5Z*|p=3/|Md| |k@>UUg4EQ@>NQgX30T < B?'/aB>HYghLtoPU k|;3ډ|` = |R|`.3+vi;)@B># 1eoB>Ѡx} X!aQ5XB.Q7PL =!A!a1ϰg,5%$g~}!~DQj4iK%򁱄X"KCM&B>"x }=+3H'B>cЌ‰|.!)3|xf@,<@>ӎ@>j̉ D/3v||&b򙎯@>"N "̄"h/3X?"Xg v )ijǧY4D> x3P@>#|FB4f D>0KQ@w@>OE@>&B>t!g'/||3jS*?|"MKg  !4 34 u@>C#ϘB2| |2 ?|r|S& ߀|@ v q=Cyzj\O<@>ѰC> Fx! '; gGg} !/ (Kgp"3|fj|`D>0|&M<|L(% gV!f|`3b|O@>S J g/3 g&d3iR!3|fz"WLZL|;|Bg L! ~?@NG&B>D>0LSgj<CMug, @K|`1<a|'ן@>!\3y`?Z'׃@>~ x|@#OG| '@>B>w!AO|)Og|Z;ƚE|S AS!\b,3ܯyg [gh4S||!1|M10d>Q|`h$"83 33PY a gB17g 4|-Dϰϸ4 v@>Cϸj"|a-W |< z?<gBH|>9m!lhg`jT$$RCCK䆚w`gő?N|^T/*߿mZ| 'y*Ay9)|v'+J|'+j|*+9Ѕ)9Ɋp8Ɋm8y9,U'*_n夶iTNz~ L9iyIsַJI$Jp$ktϢpO%q\֧@{&☥C)jm g]g4?7=i0= A){98H(+س_)Bh9u"w0%)3գ'j3]%]6{j18||{*={jOgw:{|{trHp<:t{p_u=:n{n~q'6=HґޣHkt𞮣'!c=M߀&ޣCπ>xO)^?xO?:2kOYZKfg-ѧg$!{4ZS}?zzz'j+djkyjcڤHHUeP=V{*UF{T l%{?Ok>?<ݩ Juߗ?=VqA)8=PIʉ|RbJU{覺Ǫr=AcUx ^|lCG|ITLO=?=*L=R{&?QEG( u'=U皟Au-ut;>AUlP/svU TOZꩪ,zrgP=UTOUeճǓe%sx(NTO+TOu~VUCT[CT[CTDTNIN^RGqjW'K*Sj"(|Pz*rz**|ՓTOP!P=R=uPWՃZ,)%SbǩVR=*_'/J i@MSZ S zUP=|CTz(TO̧P=UTOU㶠T~)ne SSMv1>CԦξ|x\"RpP=zUP=UuTOE*Փ \BTpzh|Goj|[zITؤzR P=~yWզ(NUP=U JBTz-QCJ$r<'I*VR= "PS6zT_/SNLWT6tYIu/TO̧P=uR=6&Y?+'/TOP=}<٪ߟ=Rr{hm{_U鷺"sG~x^u?=PD{ RcGR>PT٩Sݓl۪;l=ϙTG^u*0=gzR%U|{<1FM=6<]Ƌ)bUP=5TO]RQϯ>TBTf_/JkTP& :>Gg?A4մf}?1R;_GR=ժij5TO ZSNzRSrSݣ@ul{fSݓꢩ*/TߛzlmUW{oFDFUiVP5٪U7Kƴ*D=] ]Sݣ*Iud{T۪[jV_5lU{ګUzyPUElV]jVK UJUwMuO;~_tM/[ӫRV6=Fo٪;[Nu?=PTzeׯx>Z.R<=(*)i ş^MTؚ^uOVuuOTx?_uS{PM{]l={*/w=>{l{Pפ*%=Su~rPSUޡWz^uPOuvWGݳTϫJuϔOׯTKTOA\TgR>P<i>Zu Փ*c/vT@TTyՓWD>@UPLU$E*x=Vj|KԸxT<ߪ{ޏWSx<@MGSu_z욚s{TL)=t꩔.Jx"Փgy‡/SK5-T͕jN<;TT[[z^.TAR=.R=|ASΠz۝@P4wKAEl>0*&yWR=|A8֗R}#G2|!TO .R=aSQK쟏@P>/As:>{9}re_R=~vbߠ"gN<~@|bSZ)OA_$TώRP=LKN7z** ճ~FWL)瓱>ꩪRz,Sаu/P=uH Zcl3zjUJW!z U~UCz*]z-%Sj}KjfWFy<MP=H[պ~TLH[NHTծP=HTKx#ճƋ[7ZC772y]~{^'8%߰p̟p}/Q~s '|qNh53}ë{s'O>7\F:?uu{'8g߰ןpp}/{U ^>837O8qg߰??ޜC|{sA|û2 2}Q%hoO8p}/}{2N7*AU{`'\8o8OUQ%0 U[LAtfSrJt0<;8φS}é4p΃6DYsI֜#FwhӥtN9#2PL#H$D ih?4Σ `V:85ځȂ*ԲL1@k&d$C;)(9f9T3YC92CTM!s8?4*`C~.MrAؙ)o$1LifR4\U@mLj`f歸;)2M?,e΅ełQR@eWAL?2p2f`2{3Bfˈd~(Ӓ@dv?|;2-gֹqt̴>imc1RsӻCLcݼ4P1;[wβLsiEn1ӂbfbtλMgxanBNM0Bafrg-19VCr.#j66D,3JL˟ccڳ83˴v4ؗ-eZeNSeDYKγ۳P:5O9-Q# 29ΚV29v]$,/A]fL]8a'܏T/OV@.`\vx.;8YNOqon1#nöL+ylL2YNPe@%s`Zvsxrz65@g9=G:U6gT@DM0ˤ6eM)2eZ +zޯ;0bɯ; NeZBo~X~%Wz%Wv%@Wre6Aʇ!|[ɇ!|Zɇ!Dhb9b%Va^eڔ=p'hNM8lF*l2 F`*l2UG͝G4ƺ@Tfӳr&۬ؕ>eWJ3e4r.ͨf)U EJ2Rfs9K{![LZqLJp@R RfY*;Q|pI4T90haQf}Q=UɑXN%r e eR2eA"ӁٵfGw= HvH\Q7\X+vrj 5iU|ܹ3I+ފ PnPnmU|#A|bJ\0n,Lnk1+E & ar`&}EeA)[D%hN%d d&kWrVrAY ֋D'@-)5ȴ)E@ SU0 + YNO=AL$Ly?1ySqS#Q(yV\LA?fyS[`+x3!Uxa,ˈ7S5z1^yÖ{ kC2Ax),5]spHx<7c̳ڱ/\F1Q1,S cXUTǰh5AP1<ss?oYOִx`9^ 1}Y68eqLڠ8EqL6`8f"$^Ml;HpCm̳|oS&xڧ(*V?nK[ʳ)ӚVYE9ڤ+ƴq0T,穗YNOwyjqyӦk|>S5- XcZE`knD_>'p24歋YN{4-3Yh[b kZJ|/5Z?6~,wt_ʤ`ƼT:"iU_PW2`XD*/y X<k/bLKŘ$zg^g9J`ԅaSYN!cO:3O _LR~a^y@yӎ^L@/b5xҴn0is.湹T)! `qBQ8D!l,Q  qU$/嶁C ,w%]KC|.67AockL$3eoY_Mȃ,i|t=ʁx#Rc%(-FYi4:irq:ѷ& CH|DAH4Z69X69nhbv\~?tDS]"&&b LMqM 69j$nMTMVy?G vďIԸ$BIgDIgCBI'cmutqӿMES~x8*~,V M -Vkj b.q5>D^@*Nj&f=hb֦J45nvDSϐ4(9iJy4ԉJNrDrt 9iB41kA41[/bUPRM!DkI֕6}ɉM4q-$'O'4yqOӝJ<)'䤕]rҊҘڃ IGre;@45JNxjODHNRHN"^m'Ur?)9)&fSz䤧d% ^m@IIIII&ɉ㵒n9Kd/cHH"h!9i6DrP/+9iS#$'l$~ Mx!LB[L'fS[$'Miq)fZ$'JNv !TBS܃&f)!|4mJNMɑ4TJNY%'MI&%BdHhb|41If5<ք]n,6Yi@`ɉM㔜4L&f6TrMf4+44+}$*9&ȦnJN>|?ηS&!9i6eGrҔ6 9iJ 4'$' 5F&)E-BSij<>?D$'my#hV,"9YO'1tA5>yOMiRd]$|YQ;]D>Д: 9iJ4HNvz45V"d/H~eHx7ISbѤFICmI!9Yϗ$M1~DoHNlR$$'M ɉJNl:%2m R2m 3m UMZ ĬU䐜xYY]UzRW$'`&>L{_616Y3u9YM^0R#%' HNh 8񔜐odJ 9䄿K&eOSЄ+%' MRrbGr2^I6zIN/9^MRr"fDiCɉR6%')9P;%'@r|$b|PrdiJ J\HN."HN.%HN(J %)9Vrr)99Eghbv~INNa$''㗒Ƚ_HNR*Dz]ɉ+q=Ĭ˘Ĭw%'g8)90%'JNX*9,%'EQ*V)i6Y Fɉ%'s 9It1IrҊxL65Fij<Ϙߪ?1 Pr,3)=<àcqȥdW_$'ߓ~4%HNJN' I?HN$'m|'H7%Fͷ$IdMɉJNNc(%'q~.؁$NRr#| &"9"HN#$'%5YS?Dr;rqo~ n$']Iw'%'|I+Crߑ~ ɉWJN$')9>oHN!A<<.[$'}(|@I~q.+=%#ԸM)/_I~xV"8hp}p}(ޏhj|hj|p~dAD>Ծ/nyߦґ?JN<Rrғ,}PCB*9HI)3RM&y*3$'ݦHN'%'ݦHN|tousߏ|_7:Br-oErҭ`Erү]rҭCEr-Dr *n\$'yλ@bt֑SG~R䤟#BrƛQCiHk<;x(9ҒܟVrґ*9]p(?߭&HNM#1q=|I tRry(Iɉ%JNֶP#JI?-+JNz@7̷< >cG̿Q[z%'^%')E|%n+JNz|WWݪS$'$VIJ[BrDɉ!JN:-qx>䤃M+9EF&3?)9) |`Nfwqtє|`̏&߯D ֧)9<7%'#1)q=ոk~Sr"0 g$'M6#f=96EJ'#gCr?)9χ䤥yׇdO+W'b|92@:f;NIJBBrIO$'@O$')9i)|@zT׃%$'{%' I󕜴 =T)!8|3\| p>zISDr^i$ DR^HN JNV\.$'M_Ί4U$'#h@RErҔ 9i8 }HN(?XO䤝JiBrbF&BX䤱?%' ɳf:F> ʤCBѳPI-?rq~r?^7bKRzrynT#9DI3!9IمŅPBzH=֤LIJΐTIJ4ZIeV'FzOPTOϖTOK!eR=-)5?AhiriI4ߐt7ՓR4V|P=-)UȑRָ"_ZzggſGzUYo'iP=-);ciCq=Mj$y|P;ءw RwQ4'=P'Q?c`f!qD ϧ3| ~Ҟ3y^Oz~4N A_%ȟZZW8؟tYg) Z/@Z(|=/ %Ki+z~z囸FH/ ݍgl9g"^s AGBx 'ݢN@\Qh : .t0P  Aq}@ h=6x ̇ @CU Qx"](A&@ M$F_@$$"`tjQϣ ^ @6p԰ 5욂@<¿v}Ls|B:Lqj/@ @ | ڕk(X(bASmy@`*@1 % N+T%DH 6vAr(Nȅ 'A :@b [&@(@ @U}$‚@AzRTS*@9U@ڼqW`RF̷U]LEߪϾ h P-33b?*>@E P3߲q&TJJ"? Py P4A_QWT8(*4*À@ $? Z: @ qA vG_0io? w AGJ$C6J.qWl!dAL*U(RվD>6 PQT|'ARX_y \hNF&Y,PM_`hC d )? 3u*3)n.B3oIgN#uc*{LAE >Q0?vďݜ~Cr`Ȫ}&KXXzPu܍e&7=^g?QC[ͳ_u%tG 3o5P}=;oDO<>p |=6,\]zcGyj{ɞx0z⥓%zYyzy&Pό&6|mKx U'R<Oq ų~A|@~aOPrsH\x/SԲpJW5pJN|x?xTxIhqןOTIJ\~~(K ',P e,u AtP`=)~J=E>Хx>+_x„ 5Q'_(|ޡx s驊!K')Z($K[a215_#)u=_O՘<#.œOOOPw\O)oo+œ7(~Kx7өq''(A|œ;(_^/!OW7œG(ϡx%D>pAUW'?(f ÂORRPγDZv=ωv=OaW]σlyخڟyxl %[|=y{|]{<<[|= gϾ}=lqy=Ƨy==<'~[|{>γv={sp8oS<8p-> gzm| g)p-ޞy^sg]ϳǹ8oS<ޟyxoycom g)pO8osγ8+>6p-yxoy>γ8+)p-yxoysom| g)pW\6p-y^qyxom| 8oo8v|8oS<ǧyxom }soW>0̯|`~l6>ί|`~+_W>0yxom_W>0̯|`~l6>ί|`~s{=>=| _'XW|n-z|gv={>v={>׽sͷ?[o=߂=m]Ϟm{|y_| v={>]Ϟ@m<"h-D+-~OA[=QsͷA[<-ƧA[OAmq{|o׳A[|=DoS-~ϷA[o!^@m6>=m| "m]Ϟ@m]ϹO} ^@mu6||"hDoSA8- ^@m6{>tDomAc ^ϷǞ@m6>{>|DoA[ͷǞ@m6>{>|DoA[ͷ@m6>{>|DoAx x=m| "h6WA[ͷ@m6>_|Do\_\_\_|Do\_\_\_|Do\_\__>|{W>pW>pW>pW>DomA[ͷW>pW>pW>pW>DomA[ͷW>pW>0|`|Am6|;|`|+_z>ߎsoǹϷ+_W>0| - ^|`~+_W>DomA[ͷ+_W>0̯| - ^Ϸ+_W>0̯|`~AϷAm{| |"hD+n| c=]Ϟ@m]ϹOA[|{<빶"hv={>c={ͷA[o!=Bm{|"hv=}o!ޮg {<-ޞ  "hD+| v={>W]Ϟ@m6>=]ϽͷA[|o׳A[Om xAm{z{>"hDcsv=6Bmخg x@m<|D+-۾A[O} xo}=|"DoӱA[=Acom=|"h-Ƨc xoz{>|{DoӹA[ͷAm6ߞ{>|"h-Ƨ xoz{>|{DoӹA[ͷAϷAm6ߞ{>t}W>p}Am6|{}W>p}W>p}W>p}Am6|{}W>p}W>p}W>p}AϷAm6^_\___|Do___|Do___|Do_W>0| W6-|`|+_W>0y>ߎsom_W>0ͽ>=.-3tk8Vڏ'cXmWw>5'~3Ma=4i4*zx)[EӇH}~ūb4&`szcVXoAwAϯA׫-ۃ@~B ~F=C}F>jyQ93h39ES7`{!}na>7|n]`>0"5޴IU^s2GkqR禃|}{O9 sߺwbR-=z[=ށ{+DF `=k򙄿V 7rnT4ɻDύgM37aS 禝 0MwX zvg5xơ)9(S* +g grCB ;*y* `gБ^g'UYoh8au A8_o:/MA0[XP:ynLqhyqy= ~mҠParck|{<Ϊuq{q*`q M&> qfg gv559[T|f9 lg6 ppo&s𛜝3V̪)8D,܍n.љ:*74\3q3KpǺ?6C[S6~6v6f `:ong g3h$f+ ,@6h&?@lƭ!lֹx#\kd"ʬtଉϹ;AEAG]A q+߉4Kgːsr!{{1OCΡC!GK ;jc)~r 4IGc 9pr 5^CNאBC+4䠋MCNԐsi95`8{:*!G嗆;k 9 9 9v֐cG{ 975(6Ӑ"- 9l!!!aȹ{SS 9tJCMGu 9?Ӑsk~jА= 9>r9V4tX`i,c4amYe5q؍CNs<4$i̹B{gtxvz#Ԙ39:b_LGv~DGl%rrEGSPr: 9CN>ƛ CN4Ő.-tz1Cκyt^ۉϸ_͟ ^5p!rK>;߆! CN~r!Shȱ㻆vi CκxD|DѡTCN5ch2CΚކ64!:3 `\aiCcKtKCN;kI!!QCN{Ox!9^bij41QCNS!]eb.@cÐ#Ӑ(!' 9rЈ)|1} 9x0䬲F<]Mt^eoCN$r?!GÜǐrC!!iQOCN#Ӑc!G㜆!GÊ!DŽSCNe!j$AFCNe<ԐMCN~`Ѹ!k)g5G 9ːC4oא֐j ?舽pqmgrҸ!'rz$>c=Y߆:5 c 9rFFbȩCN㬆CN0E>x!bȩ4[r[3ĐS0TS_ 9ŐS1vhȩrr}!%:bW5TS 9? 9i8ŐR 90C>@y 9D>!'r^^ 9Q&_q0F|OjЙa8D>q@CN=^%8^덎iDŐS1hIcx!r!Gc r4jYXB%"ƀC>AC.3QCN@RҘFt 53M̶r4Tjȩ돎صy6?:b/c 14frӘYކZ?H!2hY/舭AVC|`14Vfȩ!g=?ahACz߆>haJ>!g#L;Jcq|ѐc>!j$S/r꩑'WtƐPCNh!FCN=*uq0 ǧ0`ȩ0丟!GCe 9!gŅd#9O}`ȩhȩ1ߌGq=3cf`t|SI#Stoǐ童138g\O|?r4(kYېAWCz 4ޔҘ1hԐS1h`֐RCN4ZCN`!gŅCuyr*K 90x!g! 9Cv 9QC2#'8 #t!>1Bw⁁5}U5Lv; mȩ%0T`r*w 9UZ4E> Fx^1|?o+~Z4܄!D 9^ 9k?$>(/AUCa 9ejx?1 9+Wy0|/ 9y1hX֐t?o?y'1T7 8%\rjox0!R!gox~{r4kȩFcĩ1b 7W\忟1~_pzyraј! 9^ĐS0">zb1Xbȩ?hx!!'דrjÐ!G1CN!gϝl CN!6o 9q(1x!'ןrjcȩϏ!V 4UCu0Ԫ1|CFk 95TO4hhאS4mȩTjCN-0{/c=!' 9 9D 9<`ȩZ>/;'o 9k;1箯CNrr<ŐQ^CNH!p!L ,aYu0~5cY}\OErN 9$ 9ïS5\q=`h!'J1~ҐS؏ҐS 95·54!h4ŐS7 9+րzb!  9a C{ 9+MՀƧyykICN|QCN5؄!gp|[44a)7ICN(!"ACN0<̊1؄!`H֐S4a)73 CN0!hÐS(LѐS4a)1\i9p|idrאƬbxЃ'D4f8EY# 8^ S/h'/q=OE_=aOL]Wc9n/ tAɤL&p2{2y.'20;3 2;03C4+L 3C5A<#p #tT`;# zf@.C ?*'2ͪ:_V04OL #u_Yǿc#Z M@؈ɊX"y f90cE O8Ђ7i:Cۋ<ρ< PC z9}kɎdz? !c 8y8Y# <>< u|g?1~SN`qV܌׊p~ gEfͷSZgͷ;9+58Z *^'0>z7~'~?׏?Njɉ_ 9ف9Pώ$愤a‰_"4i % `;,'3dnwlF|GnIT$P?ώA\C3/gŷϚo ПD>P '!蟕Li;Vzӟq=EiB_0@""C3%ȨP;@y" <7h{`|y#| +F"hS| z9"}CՋiЂVCU5~RH@V$\o"( <AՊ_zA8ߓN"Ȋi h$/"$ؿI"Ȋ9 0ߟD%M"蒘0/VITBU XXS*O"_TlB~L";^B|$$$:D]AT`$y?įs;HI"D.&QsZ1QԨ@jaAΗAU"![ O(Ty^$O%@H"HA9J |6JJ'x T$/DPA1-$T"2y?!r*I$η~" I$_-;DPB"({r{= I7$NHD*L "$5Z@$\8񻘿!rR@"W\S%\O@ rz}*lj G>P*A*LJZ>T ,N_" A qwHLE>P  T*V8C*%t?DPZx~iq \8c?N"ЇA"$B ;"T w#~>%O_AEB "F"(7DкBg\O<A'8x> JP"A EHk~*TJ$Jg|*A@KBEDPF"PA-T8B"4 ,TPK}~?@!p T*!)Zۛ*Ak9*AkĿp&D$ҝoA ewT">DP+EQتWvcd DPs= IyDP(Q\C5*%AIB$f"hvj'9DP{@KN|s{v2~B5) %}A "B"(M|Q DPA"( Nf_!AAAQD~!Z%!AJAȡCDP;$^%Ԭj%Py/&$^ DP;%CC H&%)1 DP;$I|@5$!B$|zI">j/B)#:Po":D/As ֶЛj}'ZNtESTBy#E|%XJ5֗ADP՘DP?AyxAk~fAA͊vDKo/zƧA4o"Ya%fO?*F!Ax!Zj/B)?%'3t`L"hO!Ay*dDP!`sbj`AS Dz$Kyr}#9Dz$~oO 0#.:#.+:\$AC=f-DPhjH>~_-D@$krO`|Ya dFMyDP"I >|A͊pU+O?J!~izJu+!zz"XE۵M?|%$ z|WCAIu6^%JAHˇZmG"?-.% 'Ay? DqDP<*@R"77yDPO'N.ԻDVA= zRAuGA]b"ޅAk4^ 'N~JD>]Bu/A܉~DP??Кo;A]b"^gHuADЊ 'O"@|`3k$:AH|>A|"h{.ԝ ֱY\O]"ޅ"ށACuB<Ay !DP~<Ay @!z']' "ꮯ  % zxM)޼% % % % zAVAADPZ&/>" ]"w :EA|"}'ZI|v "3DPA|"Au{$!@ 9/n9꧄S农w8ޗ[x/){g^e 2wx[8ޗ}Oy;< ?7=% ~nfČ[x<Ϡ\'A#`?3o:ѸxsVo!@9<OZ9㙧ʳ?mdg":Ѹ5lq|_;TL銠w>ɂg9<?*gܙ>"YC7hŏg* 3g@q,ƌ37bgZNCיxs7=21ϴ8`6>Oi^ u&O:S+8P3%ҙL0: =Ǥ ?Lϳs7ɿs&x,:h4 s֑T3iV3%0h\8ƃ`9P9ârIDF7DNYq/"g IWH8rqY8V S[9j9#8A{0A"`Sgg3f 5v8J0Pܨ% 33!)ʜ o )$o0,(<$q-HcG3m rFY+hm,ESn(H)~_s|EAncrܥg+V2]y$Fr8>!w97ʒX46MJtTtpWm(Pn# ܦ(Ke=rƳl^ umH )a#66WncrK[}Z]Ĵ.ޘ*'qy X܆=?rK,^MXMPM=Ancsx6&rRnc|6A Km>TrQ6TJ0ߥܦr}m|>$z;rXFrm}mǤ#61>}60^+nĴ9D]ۀܦQJQWmϭnѕN+N|^(k_ 9merhm2zJK76ۜ^m%&rP vmerQ.6y̷K-J4l5lrE>pL[FZ662Kں-?6X !6MSns^Pns~d>|&]9؟8DmoXZ~e>pd>s9>Wnc~FYrSаUj?m6 2(KMt'd)$!(Kw.QƧ,9xʒrCPzAYxF󍲬;>|鍲| %[,5Q|,VC,>e%P_DY(3(Kt-2te(o*[cR!pʲѕF+F|kCYRʒDṖ@Yjc<eѠ,eւ,TP̗@YeIY(KAYj% %׏,U%ˠ,z\zV,(~k.=۳?ÿo?ǿW-v?/<<o_?Ͽ??_~O???O'@i endstream endobj 597 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 610 0 obj << /Length 3582 /Filter /FlateDecode >> stream xZYs~`e* `ÖyHlUy)Jb+嵣5I<fztunN_)ViJ=SmAiioW֚4/P6~\t5o&"qXT-̈% R2` mmrnq}/>&9>īN.8/' ͕ʏYW)(4Jkp e.U[w.qSI5vU͹/e)FՔg)`t2.jAZ\Ɋ %<,-M.`masDlAcy5d6XRW:X}oDhBU ,L{'BzCyXr%sWR7dVʮ՚惪CkA=ڣ3>j!ˀ:d|,Hd}Mzq,Zq PcYڔ3`Z)`Mkw jҸ>.2?C񽑫Q~kȭ+Y ~El,W|xŴpU1c^Vd^x3>K.EWw!6h eaw8-o 2[9Ր *:,91*p}E6K>>5ok|â-n?!YTaݘ.!Zv4L"*{l$mV&k4[!(,:V$,WlF٦cc,+oi 2~ ,OS< 'č|]7FL;/2{SgR3w-2J䌴 ɬ՟7 pہ .> ^:S عX*%T~bY_,B-]oFEX,dIBmO F:ytNOt>ܗ-"@خu?#G|T p1ve8R:@ va byU^J%O^Tgm,H7˪4{#` l53%i zN GX:**-:D &JqeB=8KSӳ4 5pVf/9xu#t?ސ&1DfVפsgwC"FaCO(4]ZY42O4(rT+>V̞}ۘ8@jCєJ@e[[xRe`WNzJk=Ua"9YK[*Nok9olጨ|KCև,dM'JH1y:A .e}֍lSNTk\•;u0k}S;X1Nu}[:LF!r}My'uctM*Jݘ$G>Ydk)2JlLdH˽߆yڲk8")zv 5=3> stream xZr8}Wq`;S؛T\ΎD;L$+RI4M'oMnv]e$Fq4HoSd-Lhp& ^xmޡD68"XnIh&D:)XYz3$H[tdp&౎;Ix3A'(x(:\+5zrvatP'1֢ㅱl@wrY#4hyH f@FVgFXzj>I,u -lnnϞ=_8pͰ0dV: (u!]AN4N`/#,vC¼0#6gt_YgpݷԷom8测X?c_Ơ w.b?\ .t:a=j$0AK$:>P_-7bQpuD)zJvWY 2<"10Gpqm 0Wã 2_ۅz/ue'#yOXN v1j3ڇ׊A $>!ACX9 /Oơ=%m/UjQJ֫ TKIFEð,)4;'KފzPc&&Aƣp#뀈]uVUk"}J#Ig4ȸBJɏLiƾM}RO}R}rd)ѽEյ$?w2̹ F@@ ?ZD8UgU([4R{2$gFb+l(XIJK*̙ bޑ^-F!9t[lXFx5 l]ULLXW{)&>\A.h3?| rL]\j,ZNXWrv>:d*k5\q[Yk3 76MKhA@.8ڴygi!3?9UJ$pDU  ! lG`gjuɛMS7ŬÉLT홠#9| VEFZ Yow.5& + ~ ?HaB-vM{7I˗pc8pRɁNM|;ymtm?࠯[۷o}߆^ \Ÿu^B!v 0v]_DZz<1C@ESH$iӍ%`z`,hZi2hcefX kg(YiO1Ak'SP6k|];bf(۪ٻ FJ'M}Bv?>~1;@_.EԣCxW4d"BF  5YjLƺL~27z.+4%c3՘ɼW6A,؎nPcU ##<A_p,p-#bVNcrV\ޮީp> stream xڵZYs8~ϯpU1DvgflgwvvIYRIr2 <$Jgk(BPG#utً7i՗B.OC掮n5Տ/@iUsꜼdr?cnw! ^fLUKz$ǁ)z`Uae|iX~U:˵ $W%ͰŌfJ=_Js/\Sn?wo*HNYt)ك S0si=pW`.ÿ* S!!2v:>.#O]\Ih*<(dAiQos7\|+`Al͓4[Vx=W( Kc.%̋(hpk]q UHNϱ/U$oY;G#E?q׸EQxεGcx8YoOɯ:'%G!#.gWD~nids`YL:ʅ  ' JfZb0k<Bw0"H^ 5,qZVP]Ec-\#Њ{eTAVK;Zǧjxkȷ3?t ZzZUWm@ˇTZw!Sc|zPSJN)PJ, u| 69~oD߲|tK:GH;YŹdB8*- ,[-]OIkyRXyo Ojsf@ 5֚zkgCHo J،LUN{C>uG8'Z1* LjkK1% NX6zvhGwQ"j}2nRgn$JcՃ~A48d F(Q F[%mtޫM3ɩPT4U+ (B7賐;AL?[PWPnb0(_+Ք{98$+$abV\6Fó[QBpw$gdrEq#lYφ_|^㛻fZ" ]iz*GM ?7Dcs:2l=27F}<{ IzbI8a=F3j;":ywگ Ћ^!yheU&mĠWVɧ'hUoX4Z|"/d .9 x)T;nɓ"ېWB])s@ڌDc MMw1BG%rOl @]+OE !Ÿ YDƭeMnQU\ }QC1O|AIU fBk)j=p%閻S T2IR8Z$mcO|%KfԤA=^gWu ߐ΂yBǸ]7ͽ 4ap L%Nsth:K;N@g ]5\i6byKs (I=ro.*YQv쫨7`}3U/tY\+$Iθm̝LYNKMɽ7jXW`MڷM#8 #(gѤvRa| |h1lN{™ToM:\7m qhEqKMg\ rc.\D~>݀?\Ȩ:p<~lT6n3/m{-67sO[nm W:&n endstream endobj 645 0 obj << /Length 2772 /Filter /FlateDecode >> stream xZ[o:~0IbE$E] ,pҜMONN[`؊/4~FJd;>(7d޸>yw}n{*ˤT6*V&6Kc{W?V 8W(³瀋.k.Qz%&:rէeEf`DԙV(&1>}À MUo`,XEW'iFƧ_[bӉ*SgJ+M'']:x=VEb qq&Mt2'+^bNrf |THW`5~ǰouTXUo\%tߵ4wɷPṀg}Za>Kvz(Zb)1i &NxƝlth[g97;w]T4jE@+9)vA`=EE,7W'#/1FR;ԿӎPסmajoZ)pU}QaC>+Y5r6>*x \dN@m2UdF*zA`s~Yڣ^:bn5bؘR Cw.\R6e&HL왞uPlG2:G#*8o*! dAdJKf C rAncUs-Y3}Vt<ŸGLe2M  \s®}E~_B~DcXݼe֠w1s.bS7Q!9hVΏyJ=_qN2W*b8}(MB\xӁeq |e:Uf+Nu=NuxG[)WUkЪUɇ;O!WEpa!Mm4놊#t b$5-yȞa`FTv?OGc"Ew[iʀ9Wv_]6z[i4BK'bBLrsibA"n^X9ېٗY\4}i]]WwledsZnn//c@ oXcfWrk}g*a>V|C~BDe^>ɅR`ȉos Lp?AX6a/p:g}wp/X?NmWk)I'Ů㣹-W-44&n g l1q)_u8cj*\0>d/RRvx 5c֐ʟveC9à9@ecƟ.믍KpJ7<B'a jڂ8 Kws@5ĩv:=#Y-p#iujYH-(>X_ӹE8n9p6.w^p翡\ endstream endobj 675 0 obj << /Length1 1766 /Length2 10826 /Length3 0 /Length 11936 /Filter /FlateDecode >> stream xڍP[Ӯw'.-0;-Hpn=!;|UT1ku?P)2ٛ$\̬1yQ + J bیHrr+@ df7vyȺ '/?Nqc7@ korFwt[XG)r- ljl7vپe45ڛA.%Aollld!HpXT@ '7 ƶ*cFYڛ;o)m *+_dG\lljjo`l m@Eɏ..c;?mmMܹ1@RD`V9:\6)Kؙڂ\؟8 dv,ݬ`333Wu;+HF7?6 9@,ȫy:ti~`VlzBv6v\\Av7!3 dCG 2. e}= ?EB^KQEᯊx3q8X@ַ\o-d {Z+cgnko?;vh:k)ؿu-@Or?K:[ Iqۂm<xkZW khEmOm D,ls`gIL bjWeWclv %{g/֐@os)%L06N'6f ?[lgV/ a8,E,2Л?zSx,!nV?(CoT !7Mmg&[[X@7U- _&lݿM_`q); ߔoG/|_V_wms7+2E\7 n!rgLc^rjw}@}DWF$i}uKZx]XKrϓaN+$nDԄw}}4!;er]Q<2:[)m)Z=J/x*$s΅mf3{T6([[Zs%>15~,ނwIQO,/}sr䟔K?vbQve;hN(iH{PH'TR f?SkA1wtw2KL^"7P'wge?>r?/ALfc)[7*~m6(y zr^llgb&NC bsYg!ɹ'.)& 5Rd Zeu4K Φ`pG~x̺gCUEg:䧀(ŕOۮnkǭVUۓ;-[=+ pj w Iz }aRzɭc #~g2[x%#Y/sArCez#*r),9Շe%JvttsJc亱*Sh'֐/%DM0y}U:k#zrVM;F{<,T }3l{"= (iFv>n<)|cs2# .Rɓdͽ:TlnDGH9ExkԐ;@u5pMǗ-`(Ԯ՜aq@ZRQˏkRDJlkY0/`XEWX+l따ΙǒKYZ^/_ډ.gT,)w)*{>pFGsN-;`hjo=bEXH 8.*L9K FEPK\1& |N愌#oOq0?F>CrDsNZ;7uvزYs?–q}0撔'9 s͕wih׈/qv5{؉3lWKGTQN>}C21LsNF_S,⽩6·vHxX1b =L-!#YN1©)~j~>v⩄i ]K£4ztE(9҈;eqF E6Sǒz :S!G+K,cLt)=JM eeGdstNqbꚡ {ess 7]X!Zg:Ǣx,ˆzu.h.ʆ>SVM$ǢV\=@T]_>m/7\-w>^J̖BQz(-9Plǧ?5=wȕ:B7L2-4&ӖX#^ ?:o%[>ns`!T3rFUTP#-?}ԭk{J}$S7&jj]xwRgl~o!JT*~ays_]XG QffQ{&sllq oRX= *C-3<4}vp\] 5Qw,<,՞ɲ_Ohj_ ٘jR!GY84IEqITLr?뚩pŗ믑3W,rA-pȡ}a~]ܣ& luX~v|:_VcqMuYUS}NН"C|pcGa+SlP7TVn@W2OVȱ"q% &N&tB]wl䢌.w,ad׼i[Í1'uX8Ӷ53IWJgzPBx} Egϖk45АvΓs&4GofԃF|^LxCRqwC)r{9}^xZ, \ bofĵ+S:^҄~%RkStz!WYߴQDD^yh:/ȁD0)_! pd~(cg*ѿ"ؖc3hTgd%U83@\[&NWiܪ9)CGֻ!H8˳#JoF10V#}#Z\'0O4W4VptX#A@D#$5u e3@H=^Ȳf׫S\$#$8C,KΟ)!|>j#lWjLH;#8w-+2"TwOe!Z(~M;.ޘ4w'7MRjU?‚vefaU2_mP`p$p(*·B)OS O ]'ƗJ^B?4c0AҼP]Hdpۏa4&~;N9\59ClMLmwnQ#WpnIǷldJᣌ̔8*;7 R}z_ڸ Ezk ;j qZϤ$IQф),8auhkIڍ]?YQ^鞓`CɖBޝ&8QΠP3 (0-u.l"ޔ左  ];ڸ`sX .s4SE'8`YX{VCM 9{*ݥ+ Y0$ZJ}wnFFs$\;YU'MN H;ץ>_ {(Բ㭭R#_B"ůz{ol%߹c.t&r쑶sEC 7#&#`~9>Lk5K Zݽ䣏ƠuWmINhܾ5[{e:z U,nHS~Uc^q/s[ v wd WF RXSv @Fєn4azZ\Jg1t-e2Vxa8䴶nSA|zSRG, ϒFxv.CiGSǙbNXnPeo׵ņ Ş4 d(f" -gvO>?CvTmiJ~9:\!?7G,6mBvBzzXJ^ k dqo: h2s﻾ t20Uzsd꽕w2jQ#B حc2^RliHqJ- !ç,Œe N[DgqZ(L UPˆJ󓠙a%CO28RijĞXDiDFi'܉j_3itg\1$~?0KJnf(Uj`^ts_OQaB8vj>W"[S$ v qutD[D7ug[]+a-$y5^ؿG8.\瑌 #OlƆ> frSk|)aXM ҖN>WAV%_Ü07-rv|YL^#tsd/ι`[^k97PC٘eԣ79ָۍpWHnX+[tܪ6EQWdj $[wOyX!Z3e?c#/oMQ a|ʁ- gKZMf_tA0TM^y}o֣` fRn\.umN1~TqR=QIL օ ~Hx M_7d9'w>r"E֎aպ#M,R~œ!t5TrXou;,Bl ֳhn%B5`wFe\:}>bu܅s?Q8 D<ԮϺ˻ 7nNM }-wN@e˨y8=NFY$*nWuj:к/+53ǰ(K<|>$_&!=| еOZdںĿ?Q|_s,n>yA>j Kf#Hߛ@xecdUպfYMA< }OIixP|YR38um$#U(FE'0_tƞ-%n uɣ1Q_=4 JK0e"|ydna@6Oo$kxNJ3*ed D4v>E/?n#ڦVVEHxR"ڧi=̞ˇƢ.`F'c#9/qpsb7vEIIS%fё DY,T'\JnoApI{P:|`5G<|L8Q4TQSBY}k݈#O Žq1iu^e]4|0/^i^iJv7"hMgBn*}Iލ?_H}$::Թ'T?[~idntd#T_q  ܲʉY`h1N|$$!k:͋ǒܓIw+4~uHtpN⺓^-&@w֬4=]eBST4xRW:|!6 W`_Z}X)q'L;Ժ6oj@^kb0 WYEYn'e)[cRG$jjyɵY$P? ;7yw0!wP΀2Օ ;|)( "f41u}%WItjޣl bɴ~Z^fU9LJ ~!=2䢆J\Jy9MJKKkt63z>oC@)`0J}~ ~Mn8MTy?YXc Df8)F@=fA&'o03 Jg%a# *+yQa_ٌ \xVors鼸E&æؿ* QS~΢(E=C"9騥grB,d*9aJLXs94;VDmĴ:)fRRX337VBxb˜_ ab막]o8_;{&Qd: O3Vr|?)I'lE nn)ͼ7N^i|j bG!Hm.Gkv oʶ},,^CN=sWdN;ϵ8YO+%4?g rY>4<;uɋք @tAg}&|q!kjIHA4TM:amD|``#8n~|+w{`nbڭ4 S?v3M}Uhv# EX!>i$ AQQ?i^ K,>*-glFO(fq*o̘;^.ʼn]b2[8/QUOveGIVS3~CtY rQFas B|p8QaxYB;G ZM'Hx@m_ *nf5F`T- ZK8J ɑ}G<{K3N,Ȇ " ٷE<6L8 '9U*hcmQ::EQI4q5z 'NO7 ׳LRo/`&}L~*c(kw[YKkV䬪D-CBUN9q݄zdy9klMIz%*CQ!fch~1GL~IS@W );`"ȗ>Stx#U3J' Ku 4N,7OXOFK \eO9߃3iItԄ cY$鲼K(7~v4KHsD B9ZP˝U7WnyT;֬% ]eBBP-"P9ZyG)PPd+>7P|G>zN !Z:sf4v .:GAu9c Rt=m;YDhuc. kgvv_H0RijxX*q̷/i]ZH>iTjixż8\[ՓU~9q,.]mXLʑDh{>t7v\ޜ@ꖋ3>-H*tSR@d#"s燪8Onf^"wKNIB*[tGA{4:V˯YvIwaL5" z\0A+gE'S~ؗƂ#HT3}7i1Su:;=Q\c̻ۮHtL[Y-:b|mKqN%P,{yih%#r! g0e”pj-?7_ k`Ύ:SnO^oÜ0UGzֳeH!CsLTx) @O@N ZZ4l+X}`]q &9t>AjLDՕ =aq>!`49g,{/Cff-đ.`{Q[ت39Ȼ$w}C22"MM8L Fy- =N`]TPVef:DxPɿ \i5K /̍[mJxĐe󋳳0`N|eb?O?3*>ƺ'{}pG__gr0܄ mSw zI6SRg%Er;#gh)p=ۑ{X{##Һ)tZ YJqB/Sp?o?BI.ygʉ#d/ox르 };~HYtC<2{.iY3Pj+!Hm>̞]XT'5>ؘ1ͻ/.yO%KkayYtj)PMfzdmj*vƱ˓BgFg'Z_ |dҢQ/v0& >I*1O %fKq$Q* xo986 + 2<׽|yh%̨H%rCsK?~v'Ƈei_\U)PKIaRgaSmk)SO.PX?|MjV61⮒hۨ>~U0Co &L:o 5d"0 )O1QZXuXK BCq";AX3ux\[i2m;١ݜ~SۉwfG>o3[#?X^ Rb/3>@@rzv.K=ꭔ"&Aþ\}*=.Y:ڃm"Tj>,==]'/NIGNim.p?U!fװtJas֘2d 2ߝ;}`KmKOAiKG &h9BdK^K]a#_W_*EB՛Tsr3{%>Дw5$o7Œ^q Iz2AלkX|GVBˁE 3l삖֛FqIܜ;gĞn4J?.KŠ0mllk< to@Fe q2n6>;]wLj$ 1 q80"G[5ͩyF#"^i(uK VΔnKe IObOQ2="=۱O2MOV{%[trJZX)dDs-j.:pڇ};W6^)x_* jИvCj=un6 o8p 5Бt&د|ipWƢ@!lj\% |=u ( "Do55 LBZWj1f߳_G MA@A!@p٢a;zhQL'֏xh@]~?DEo琑8EĖ6pգVAʽ.J7۽ьBWWĽu53#}XкcİgIBKp-΍9>GK<؇>8eoW,-Ba.o$FG3V {Hȝ;M8Ͻ2{>hH]>b!>2 KR% ^U\8lw?SJ(˻`#P],f 1|h ,Ǎ?լgFH%7M}n2٘T 6w;9eTⅯ6S>; \XÄnb~P#Qr_>Y9Ipi_|Rر4%D#J.r&惦(`yugS"$38` A^*=[7'> }.TB2V׎ BJ@fm!#qE%NŒBDmsnU ;(<&.Y<6s䆾7<5QCmpRBگsj32V@8 0ғhQ8  TY~D38`}nHpЏ7 bzp>+zjkH9J{7 HX>UTfCjT-yVj=eCd%rIQ3ⵒJ1m-xVj5{>{ =p}+%FjOkf )=̚^j9GtzG'%'^|ҶOܿi{ 7}nJ;|Z(Ѷ07^ǩl= azfniu>#LQ1nI,Q1"_JP >S¹ 7-$Z.su6ŝ&{JsJmgeyF^M.Fk6%V'vo}hIQh 5ËjWD2[AS*2`{|nű(T]@V83ZeNWgn]d~{*ȱ+K>o ddX,mKu+#K?Šxpz<9-^anya]cB endstream endobj 677 0 obj << /Length1 2014 /Length2 15443 /Length3 0 /Length 16678 /Filter /FlateDecode >> stream xڍePZ ]www08 N ;!8sy﫺Yݫ{ݽj S (`aagbaaTvO tv9! 4q}IA97;+;"ș anmPdȁ. G/gkK+s@cF `f; jt63q(ZO43̬^FՑÃޅ l)Dv]@s_J&Kc[Yˡp0q vf@7s3t#_dnW"kM@&^ k; ࣔ+/ =w&)Qɻs1svtuarK#_i,`.:U3^\[_25܀漛,Nn. 4bu/GNֿ|Aw@?k xw O"xVV+hi'h/~֞=cOfrC䴥D-N11' `ep<& }Jv {AhK >@͟Agd1{y7e[~&v^fO(wRZ]1ɺh"e 4Wv5׸ˮעY;A.=-FV{.3}&vߗt0el7ll~@Ͽr}XQ.N_!n`/f0AL?񿈇 ǩAL"^z?z3/|ޛ_c6d0^{ rsG;lGw)߷P] 运=?Rߥ:`}JXkus_GtO{?{_bfW+g?.w n ۻx)7@El9;>  4_Z4׋x0M Qie2,9w="ä} pME]ݑY&y9iml:s{pD!ȾfV.9'7d"{~iϯ+ {*u\ϕqAe?( Msqɠ]`/=MNc;'z~f2VJ['_V=;V':X7VTMo:_?'䓩raDz[iTNȝiWWfPY61_U-V) TBv%-ݖȽ7;uY)tWi[*tt%=MMmq+s0D- Hr|m&cXc} c W,' 3nLex9Ed!^MpI4,{*>(,EFVtWݍ'H}g_4Ųod_:PNc'$c2)\[Ч&vvtߝy"P'uD?b.$I7pgqlŪ;Oѱ++3`b!|OL ($n@q%Ԏ @\hj/컵:m]:E=1mu&( < `:luN{5C hC&C,0?yOx:;7[gBZdޣ 7^+G]z!x;Jj@N)Z 9yz8XwgzdWU ^kՆ}@qkۻ4taKXEdQSYZzwt=RSj^_ (j$ 4D9t Q,{/w[o -DR̛χubl1/Ÿ+ަP,;c>upF21z@ ;mxgX0nc$vP 0]%e1kfWn~<vc-[) v=.U$owHr_=/BAq-VV^;cjõV&)kߡ4Z.sYsPIr:U^(-4J ;|Ȱõrt`[.YoSWrNA|-mh"3+S|vi0*K|qvhFm`XG] 6g6=ף{(+d?|YcvT DI#ZiwMGu<)ZRp>\uZV7q3 NMNEr#>"W`ɒh* |krkX25E4JkCt odz3,Ȉ=,.Nj#RKh{Y4ŏN|MYֵA@NbO&{g=܈`4p^n oDޞh!{>^Q'_{Oa&S$ϴL ` uwl3ڭH(FnN[>G;[XvӍeM4сdOhZع~ʅ޽DqAO-rU+#f=iqqrIeZe#*n{?(s''3ت"RWɣ%i~74_l&zUa̧v~G5T~ˉM_6<`3#*Di1Y ;m?|W[{ th JbUa*JlJm Eͥz?\ˮ *a כ+EX5\ɠ-i/mJv4sKO?$ #*_[R?sDOUHiLvٗCD:'";CO'N= gBVB2dzlJs&C.~.)Mi+[%* p'GN -I}T0EEv l(I-1k^aT"Ym_Q]rңLALI`*٠>#lhhf5"Z ! aQ(P< . :"4:Uo:VFԀd߳T ςa=b!P`څ5xa O %kutDZ).&Tp9bTQG6۩4 /-{m s¾̃&Đ2IuǮx1UM,E+@Bgbg=AB:yq dԐ)Lz$ZE_O҄CZH$d:eZm`s 'QY;,"_הԇopbW΂L<[y| sQѺ( MoiT)F"2R9A߃Fue:?](_g4l=W|zkN aPDacATY*ض$Q80@м WGYj+sXac6rY!Zcfq)se˙gyWM uȀYmCo/ LJPnIZ p >f\Cg.8T}Jeqr9/LgdOy/!#kOdvo.!I?h|zͰ3~u\Q|t>OojNQyLiF޺7+>MB8+GL@V5wCjt(4ZnQhbf#ʫw9Nٺ8%[׬R(TՋQw'\IJ(EtݻVFO@lvBζLKO&rȨB]zf#LZ H^MGdG;2A6q?cfז25`"yq·L. +.J57`_^iTuSJ\JVªQ9-anP(-{']AL4%BT~*Å}ʌqA#f'B,rH&"QY)a4 R5AQ1Oe  f[ RO颸*U<XU%zN qRMGKkĪe*$?-b(QΤG3TOcw fJg\ \~@aۓp~)%;,`B`86Nny)QE`+?*4ȃ/27쫖6K,IzO۪BT0ɧZaf6nִTU ]uv"W$3וd02)7'CIDs`*^sO1:Fy=/K8d% lҿDDAV VscS)R.L)-;bdy5iMEϟFIj3lYd=Mfern Lط-FЉMuKc7L{;rbnɑeB/2jԸځ.|ӸI}.)qLD[SsP03jfhq u'1z!jG~:Eҍ~ >TɬՒߺ}-Cijwճvgq$yHn.<=-xMV$;ڛtCԩ|-2LETmW4*ߌf.ўF'- B}D(?R]@֜L>jhb !;cՄRy=h?K[1A4(0mh⸅Kp}R%scMEN9{L608`'B2#M_Wx7yXPkV6 W QEII ފ綖R/}6d o~g׾]"I-ger((ٙ KmG}|!:yzXAEAߌtk߈w/HHBדj 'm[ޒTA?L uGxg *I>b_GSsR󁉘- FBU6h~yHr\vqէE$ \u\ӝ!= Ws ahߣU?:Txd|7t=K)'o<>ȒY'"j !2:LΕfQ7 R7L݀zfYV8 T vgf# +JO8*7d_)]%ǘ** :ڗCHDe\dMַ{~ݬ2U&!ԠJ<{ǦMZ]ΤZ1h*xa}(SKo6xӦEAO cZ*Pvdne8llU6l$eY!U] } oo<|\7&O0(=`R*(`o׽d̑":O)BPԈ'.CfuY9h5'KSp!!d-#-]=9W@~'/8AwmS}!?h!A6~Wwpg~$݇ SJ%jd-JƵH0D3_Du3v{EUʇlA lWtu;Tz|+Â= WiJK+CknpŸ?lyD)ARj#7MjŔ.:ΩU~!c 0f S.beJ(:|38?/pu~ЃPwt JXW0srB328C$=_rMi{`ܛ;#=jAF6VXOv{qW6헬o;(ͪZ\٩LV{!.2V%GofG|Q d]zlEYF.wS`|-lBR!Wils!Fqd<ʼܨ;Ӱ}tHO5x+ЕǹA}se-=#ӎ鲥|SbZ̲>MlH;B(&mdܬ4)&yyډ94]Q {5BwaP^@xjo1Bbخ Bc` ovE+3h37bCz_҈_MspS+%;$|jAǶ&c$06CVZO47bkKqlzG:) ?ȣHl D$u|:T?6%Uy]w-Dί>Bk\Bu*͉&z4F>g`~dFܡCR&zy7[]\ N8wUy RCDh˝HSA&ܧk|^SKYS Ă/tlģI-;z+N]Խ6B3y[†c.Q*Ty:+H]uKc>b)r 3J˞=5T!(x U콩_'U4T$%i4M!&4rhYqM$X=ulEۯ# ,[y؇l2$Uȟp5 TBa"L~ tuoC[ດ^B|;CaiL4o[A|4e}a‚v|%stn]yF"ާ. zQ[cvu_AI9."*Cm$&kM9s90a=еC/$D:& +"꼉Tw 'I]61Y s ZD 91qr~4DJ_[qIQ$Ro2}x €geeg:Mj!HoB([џB. 3@)sXyUY{ װѣ&(n9v3.u8ybVIZq Å}~Cf#M.v0+v>,}\q~)0fh7qj0ow 6A@}Gz1 hC' ƖpIm/((|mERjɉMn?P063D!6pFD] 8sԆ 5sk$3ďD( FTB'-,#>BT!M 憘T}kYan-BKky~i* >an-0%VH3h"<$iP~  #pa\`oBų+p" VW጑-EVjtW*]r ٯ <@'Y,(Y"zn]oXxVl[X eӉ|lIRW/̘8:ov4 dS*M%\c77yzmX^fi$L ik%i! dm2B f9.ʲp2n7s6◒RdtRRIe{Z~.uhZюUXr5V1*z)Jca;=X)Ŏش1؉Rب"x3>pvǷ򯉢j`*qvuIp>JGy)qN!ܤ 'z8eY`7ϑS6Q P#:PWW~uԞ4:;Sd3vBu l&0֡>14|rE^(@O05W1@3*@K8fA79|5+7 0AJШ꼞8v|] yxcw"SGgA 0껕1/:ݪra- O>u=V(GvfJ{-?0ԃ$Ns`P p_3f}]s{ SCo 14ƀ._IԘ 6Z8%AD55\N )@}D 0Hv=YJ fc@VڭEDL ׸1B:@3.咑raX3y2ߵ,H3f7j XdÛ<[Ml~m1!4GVb$%߈F?kȄ`n7T4"!@+WS Ce fܱ@ҍ@Ҍ`.ѨPp]Aش??_PHaReuV>  G& UHJO͞祱3I2qg@.ۛ96i]SU5JBTiqWw/o ̣RC". Rl;] Zir_ 6.(+So %5`W䗐3^LNOwc r@!JI>%A 눉01<7+>g'x3mh ]jLǮY`vμ*߬@keM޿  VKׯH-u 1 iD3ohA)i!z$ſesn"}`|+zN}qq}R.8j:P!O,+;KU o]ڹ`kU}ȎlG\ ׾AC9f#+{ƽ:~6NAm]AoWS oc!ewM` B)us_,/tdE>v/X0Dp}ayLS3ڌ}ZXa!Lk-gmRڄ`t`~}_); ^4"] .h8dAI/Ah_3^ZHS tk!2qde+Go<SEC(|P }JsmUFgf`w@7wW=T _`xEH`V)L3p82MOe ;x13OU\/T]hIN{ X—ad,u&;W*4nvmCD1] h?ʊ63juq}"wŝ; k~qUaXm ! O1:T*yH*Q1p˨3quc-f@Td"nd {UkB7aQ!>icxP`߰* Q4rl_PmjPqUL\;,C7 fA5.j "aa\FOq Y Z$,B-Q;tz>@7bab^vS_¾@TSM(&~2Ө2rO3b([3]kc8(64}l. PzN뼂y?ְyB2.3Ȩ/G4exU7Λ!5h ؉ВN鶋KlV?)>DuŮ1m׸)G.KRmV0 HC-Ǵ#fJ~^5=م&$16$Resó+Ōx?"ɾ|SbrE.IS,b -eE05Cyk )xNF1 R/ a#SÁT8S ͮa^mUl`<{ZjQ۝Kȳk y~L>cNyE![Мr`r;| h(ί5YyPIh卥[)V's0ުpAD})ImZM\L7 1P3M9^c>6 ށYA]RuFOϺB;ݛf*Wo=٣ ,t>e :L %C!soeII9@/6 , Jf![ArOF"]72:Pzj]YzItiƯgӜ/&#zPFkRƌdRx.b) O?!ZC75 c56 >=?tNmqdlf3-d{7]aATઍ[Jk7m#ݛH a%2~ endstream endobj 679 0 obj << /Length1 2050 /Length2 14086 /Length3 0 /Length 15326 /Filter /FlateDecode >> stream xڍP\ qwwwww  %ݝ A+9{L[c=ڔʪf s) #+ @\AL †@It5RG˻M=PduXXXXl,, 9$݀f&,Rry??4V^^nvN@Sc{ƶU)JX813393,h@+/Ec;KcBYPY; @Ss{W{3s'UywsL- N6659{-@[s< @c[g{1=o)Owltpqfr2m7ٙۻ8#OdnwO?\{/f@GWsǼ,],,,\sG_y:dxa 0Av6v38z`4u[T7[ ?'@}X,}O}@~2 r_`dd9Y[Go,re-@}({h z\s͟Acd1}b<e$jk_?~c;#'} @`C5b [q1~Q{K,07SZk\eWkl g_W ޷p~ɿ]GJڛ26N.'(qrY)03ك\S| '('Y/ӿY0A<#%Y;Yz_`V*YzgW/}G;3?蝙dX2?;wwJ;% |_w'/?C, Zrkt2'w?dyj].ofПcEpu~ Go-Ԝ3\H?xgG»w-nh{?{=w^SW'7r1707EX^Xׅt׈3NRj2z/;u>&VgtMC[ۑY!y>jm o0Aezai g`HQMdG#[2ѕE9G}Xj.91zsy&Yxd0.pts79o$ ǟًu6b+؜{)u!o0ƦRdqKɆE 6XhD5v%^(m(^3giRljNFn=w aʹL`eBnhaRyfEL\t{=O /|''uմOԦɍGXHsaN50l K?OCYBy}d,b 訶dVk>n'k5*EΦ_tԟ%f! =0E0?\|= y '@o~p+'=!4#+{$_{-jL5K< 衖M`CXNp8B:EFv[ֹ-\ק?2ӀM'kdӳ b9ICB:*mNsE.š4)O|A騞;!80x:Lw?,`h{?{( M?ձ! m;=\OƠ[ŞAnb43))B/1N*+_C]~ F%BʇվpRBK{Mp_:y!eNm>U UclBH0bO΅|eK=Ld9&_ 锟mOƎl+ÐۙK(_ODp&$=~s1ԢSO%(5\(n$;Gπ {[Ռ4ז*yٖenOQa6EapI'{Pܯ~" ,p9`Iʀ5й99,/7+gۅ#Ʀmdn0R~pOG نd#h=;kf`be4Zz%-?gnU{j'(fIvoHP.jݱ] =3d.7f/f͇(%Ɔ2{_쬾[\Rw:f41e-wR2Nû3sSl ʹ WiBtHFV@3v& "O\ŝZEP<)p؉s*-Td%t3 |={[E".Kg0AB$ą7g`K0<Xq{ nTf*q]zl!7@]JXCagCt0}F=9)80sq4N W̍S}GJkp7nQՅ y|"4gQM-[KtN<1}Yiʪ,udizX:D˄mV3`CN9u`ЂlݯG5m w>3wo(q_2 jo>HVH~KwUoMwU9xkn87}ؒ%cx)\! a#U#>Ysa{mތru;]M׃GpX][ <dpS6Ĉ!y)q19UA H7!+/%odZZΐ/ NK Ydtxꢑ #H =;)\oƤWQ;CO/îE&-_~Jwׯ>*lS: vю 3#a-sW1r5x4H1w=Y-*SmSŽc:a;?U2lSu)nrߟ$1K= Ct闡iy?O{{iV(<# 'R7g[ls%6e~-ޑuT4&.`z(|zxu#Jn dJ}极R3L05d{/?|e6p'<ӕ ;8b8 vFb# Lmn3IiғWQ s=L{=oW5Iݨk#v؞"Pz@Z6̡Zsa#a%&؊םyQNQ7iKe*1a)yVc]8veC)刏ey?^s]8t2R4v#5fVTtZ_[.)!dru-jԴ瘙BMqԡ"x9&xv귬_n2cɑsL<.w ڿoYV%zuZEoHҎSojH PI@,5C*)!󪦷0st~lsX|ӯk\z? yoGQ=0+ h>/EUYuO"kIčDhgԦt EY`dqhxmnCwvkq ZA*+-ՕR~f^pa]txsDzըxkA\҉e[%Or~.Nlbc }َ=Ok{I $;ijumj{Pܒ,9(>BbeQgԋL6=C}_w)Mw(MUö;Hw.xxHQ] ղYHN  ]e|nBXJpUa+o$/ N뒅z` x{}~At3:Hݤ;nhLiios 9W~v ~= 2?C 5=Wn@3ۊNaAz1"v)Bgjbcj;Mač`0 ףVBC+q2%)@΁x,m\gLa_f6C=>.'Bex횡8:.8 ȳ$Y7 _hnʥf6&HbwH1d[A~Īn)2̽"^Lj`#GG#H<,S.Ku:]R=kzI] Ϥj#ebqM[Qfq~3?wŝ k;mྫ%3}rF>3:hO&L2z"ݭ2ڄO7ݣ,(pkM;T9uӉH}ϨH[lWGt{ 3`ς_Ș@SOzZ $xuf0Q,=EtsТaahRsˊmE|iVRř[qk}IW/փ㭜5p%ˌ}J"r쌏 o")lQ > LP^Ox8q1 rd͉̪erhxsQO`m#uX).ϔEᷠʶWHu^O]i S|(T mt\ 7 }3Of7D\u66wzq>iJ8iJsUyšcjq@IՑ8ggtACK GMZ I"g]|/p78 &}dK *r%릏0Nou4ygEڠ/) 73 l*Bߤ͉s3v+.үV;#Gz%b6Ē또kڣ }HghT(pTZyt][얀ƿpH` ~2j?0EVB#$5%_hڕRVW22+a-5#k:X~׷ϥzh8+84*0Vt{gg=ݚ=RA!}&(v%SI!X<$Dy]GBKmǜXIWJj#g}r竖MZD+̄<,ew4Ձw]{My~jP7K؁Yg~* 61xF ';Z{ 2ME.܁7h> kNXl)gy&K6a..@ujʤM+ fpu"(c:A`<2 = Q)xjٸzrBvӕMLPǏe %EIm\K,gMDP|_^RvBr=1yC!2(8'8ן:izρۺ+[Q=ܜč.LCmhif TiUd esA;K2c׶(VVҝm>eXl 8L'Ƴ}@,Կ*<  [&$ŷ(h;rW2H ;Ȅ4;6J2=>75Xke:|y RE L(R@3z7rAUC7NओVIa# 1!]Myyw->BS']=Fvdef?i]'jB샿'ͩU~|,$.iu9\ʑeO M07.[%ɦ 4k 7. t  \k/pFw^CiYՐUx'"F{Xu&R@/RuLe0x}'W(;1lbXG&t5y2B(Z}*#(lDQQ#`u>8lT?#AAQ8J#SUx6e_g@g"%.%5DEO Zo95T.=f O:sn_'e0%=⪕NeM1*$(%P vlܱO7į8~ڪ+YҨ teg:)aJuTdږC8"ɍ*~ڐ Gǟ^4WBW6$C/'!,(I trOџÖX}=3ݧ.Z,#Zph!u(280!; T':R&Pꍿؼ^&֐wҮ } UuL[.bGxN&UA'}y *]wP=[op6;_[aMKLIJPcjA<9w:$oB~vX^mQMcNyng-EzboM\MG2R CznP׫ٝz9opLeCMo:#Nj[j\_jb Co''em&5;v|8Sinh&ffY~LQV8ViXXMߍ1bϋ:f qB~:b(zU1M6 45뼿FWG?T=Ee8{#g>*WXrEcSL 86ȤWSsU_1H+cg6.ۭKS_hlVԠbĔdEcC5/#ADzu,z Iu5>^awBѻ89F8YzO`\ΐ6 ӳ1Q8<Й#EkgOX v_ f#}Ǫ|XN?ǭEBO5 'Or)Oҟ%6@Kia?eXS\ly>=^‘viypErȷAr|#Dt@">O4]PnOFi?0s9,&fu<ɨeqP LI۰iƚޢǚTf3=E _W~Y;a#z,\zET!м|IXc, fLa@(O׺vg߳} L }z/=r7>iI5kZhP>+GHM "˟ _ 3KÐ6?.XŘ&rw!X7" AagX P.~ ҵXp'!J5m9\.3)Qr,(8$*{9G㠄e Inp2gL,f戰 Ab }^-~4 ˬFh~ݺ|TBYW4m@1nz'L+PI`Gs2uw$//9ʾ67х aEɭiӺ.Xݛxo_Y7nO vU>aoE.sU6svԠSQ7\v?.21^鮕7, iB9s#l/lhS [Id@uON>ڹCvǓ*1%Xxh$C K w˝yW8ؐsUsO#AP*8җW]ݹu N_ЙJSz0#YHqx Rfltq+-:gcT*v6YMT41Do3~(O_$#},t$8fGE;2KX1 d։ q3q\#*T<t[ גi0%uyT|p9V|?1l2Xq%F2W4E z]g$(Q.8OE8 ږ9$]fU?%*l~EQZ'o%_uXe܉fWT0B H[t4MWׄ>_dܱը۸r^[Y|;G06HF`(@_Gjqi։{ ii̕( @T캤N,F)'ȡ7ges|> mY`a&"D3 AQ?~¢;2/R& VEf%AeKC\qgD'~3w9S|Zk/~2`Sxp{ k}yC!SXWhw! O{7CHޅ!Z+hM[)wUx(kafco.ӥ'sjohGCY{%mMDDn_:\暼Rr/ӳ8!k!l*`FB!Td׫G-Rcv_yWoUֹ矑ю+PdI|PrY?cьY)L̡h.c`=` ƓDGZ]骍 u 7-? QD夾z(90=jai';@Eaxh[0y9嬊..`1N}N>D+p.[|A.y Sedc 5yB))~ip|wݾZl@+] ZoVt#/,Oϛ1?!9NX5pr AxK)o.H/s`Y;%ove,x\.si1(SZW4eG'Y8v^iyEOeﷻo5ho;}ҖZUYtB [J(> \饤z\bn#ᛡI\O_WI»2=e1jmyA\i̍rrM$46^IxwdN'/o*;̭ ~)DigG[!lV[)c,ձdQJVUd;t7|U|f8>C7Q0bl@2UǷ4N͚/2<9zS m|Gtt7R+EVLPۗڻY7{ W7guE[wd4O>>} (3/Wl'k|¤.1ERFI 4@} :ti´-QJ)`S ƌPP>YqAq`@W--\i.Da57[ﺱaF6¬#}Vd2"#C"7^Xv9oQgV#HE{\fz%=rF%Z8_q@As z۶K'DfŚg.AW b Ǿ ZI0]NX{,c9ng"(w }kXm 9Xt$iUp3a2X8]:'̜c4s C_d ^RYٞMWmCt)c ,gp5Qπ&Wk#$M4 KF}p-CrXE׫v@Zy6JV@kC孶sz:^EY?ua7[5sYWTZ*a;+%Č!FUL LLя;K {^ ͊ӞɋvQVP1ȷŠ2SLbO /e% 0*G~z:H#hPO+PYڇ=KYuYt{?[);ֺ 453еDjl|/s yAghzd;A`Z^q\ ^Jj >/kc+R2q[wi§g$ySzh=R^P ȼ.Mh㯛 4 KbA?嶫Fk>hvgF3<+ &}J3xh4:ܦ/ 'r!.:D^T2gEд 9gQVʹn}fHu̽P/§D|' " 3CXﺞ]PCsMi[56]V=5m 'bvġ2 08]8gDЊN6 StW~bM5"$.O;bE d fֿ8Ԁj,2&q>nBh`5 -:Qq5,E䢩3$xu6'[rܔ,fVyH3|՗ZRÝD=D>b[`Jk^=nNVzNsxR>Mù| F%D}AIp4{֚wXHBҗKsvM(aK.>a5kO[gV|х"Nm1;bڊpI٬. 6 XWk]zD|Y)u$^%:zifмc$ |[ѳ )=es#D(2]@X5pT6J%<ڬ6<ߥOrz%G!P~ F [:D>2#- +Rb `EqVl ˎv^/w~;ަ $UoEkOxH[},pyX`-ؚ= rmrQ[b6+j Vj4 mq} pG䛯0"3gé,L<>W-=vˑS$GVIùw<7[t/V= Ƹ7UXMGm)PێbZU. 1,/{XLPScfb9iiz{nAߍ*jS{ g' 0>H;W佖7}w_{'G)+|ݿGwhpU 1j~&(6%v}|o^M !a;cם*1qcA>nۖ,sqe4NRwf$tH{I(3XMX?es(r2gTC1oL99]niKVruRj'(tK*»psi^R-9 bk/E˓FƄ7`4҃VL,@|l+H wqзkY3^زvŎA8IK QY1w$| NŪuW 'GƯ`WS)7afI,/HrWyϙfɆiٵJyZ_?'L01`l;1zUb@DV娬,lz+ ENbĜ\MȜAˇNs2_R$LSs`a\YIKP=T[8p"XhYVo+QfHoF  8plX$.&Az3bMTv-Qw+1}9!\ 911X+܄ӑDԁ(0~2ϲkMX䫝D 4嗃} 6Ki$LJB-}d`CÃ޿c{O"eYrW]Ʉ$td G05HTIEqM:%ãCA `5 N M3 g0'\RqVkRôcֲL~zV5WV{2kCD&[c(ռeq7>#XHcu:e;Rbh#z[䭦4%-[j`y. %w|5⇮W̱O+M\`S ?d%z`9VFVnxpB?ڙX73o2q ! |Bԙ.ɬ[?/VuYOVX?Y IH0є :עɺR_Gbcx'6?߉ԯYcs[ӌQ7cHXK&?_JbhWdQHU_:-״ULd_'> stream xڍw4\o (AzD7GD7`{'BD^!%{-J!?)߽kݻZswgww?Yk8Xt H[ `0?,0]` cD_E ؔ h N =]Aa@P=0%DJ/8ԑC拂;81k pqbyW nAZ#s0@ahrD x{{C\=(.^va0 jІt H{70 ၉D@a(s8` ߻oDp` #{ QGy q@b!^ ]9P a==.Zs"@{~էG0+g7j&`{ԔB0&l04 DE;s )ˌ ca(OXvsp;4` s#@Ɏ11G}s0{%^P$?0{%>?'$E1"it!eG\ӿ*KοKa- -"`;̏7+]o7oᆸ]|0DcP* ]SCC02G8*pTsÕ?v_s#`H '#,;ġC.F70z_a3Czڿ8ed}ֵޑZh k^#4* 9$4沜4˒0NaZ@Ij rO GλwXևl_ܤcw`¶EH7 a=[xm*޵pėq `ݩ|=ziV5h{ɻ'7r]i^;fʆ^-_Grxe$x$Y|W9;0ea jN}aoqTBm5.F9KL] 4\'J+qC_wO%3*ҵ-&{׋ qhd=|jj )Tɼnzn=c9Մ {k &[KC+rZck ڶ*Ei ⨟Ab+[ZI)-~enY6 lhަwy9mӀg% }v~0RYvۆ.[qֵѯ)ףh3>s/I~[Hs{՚:ޡ$ Xgar~lD_2wDLNW6d =-ty+E߃:mY810oAP\a͸ 6cˉdn^lM\/5)\JtIU~o >*w&!6{pJ,Lhp&Djul%I:6Mb.(bj_l]UIaCxU g_n(xPOD j=RG*N'ig)Gr^uv.yݿg aF .ػ[n=as<^{JD{ 1/b8a;ЧlJrM*a2$e! ~9"o@( v"u~ j0VmN05;Jyj3KB!!f)o Yrl{6IVjuY &ȐxːM8>gɻqNqd][ANe7AZZHi\\VNݥt<{B>Ly($0Mq'!yYY4&”5 ӫ}'"VZӰ 7znɖZyB \SLٹcM(maU. $q?ulmXBB87va8ݢ_2꫸З14J!,f-;N[) c P٬U.vK8Ty*4& ǘ HK{fO4is s&^'A}EV'ߛ$н\Hޫ=K*g]TaP_ԚU_O/~L)%Px9J BE*>^{|44mU(M!j l W.Pg inDpŖAhly:*yAvB^ 6gb z6esx9i,z.ÎxNijyEbnX2yw'h oY^=tR WJЍ́]s\RO~liZZQW{4E׸d F x&dɫ8#DN >KOa'L Θ0$mFAsf~{_>?mBۡGZ0a4!VWU)DgQJ9y˰;tNG*E LVqFއ7q[o gó=>2"$>Sy8\%3*i9^9",x&-]W{2U]:FNiS)5d} eo%s!;B1,S oOW&q bGu oE?;?6z!fRF$ǹb̄;TgŭvÆF+z)<!aPIbMaS0J7{a<@ }H{n *NO,1¶a"Z)X%w:LFqBբf޲[=i3bx"G_䙊,_jU{zTaÜ5ʞKnĻ7 l '<{Rx?YM7>nWy)u%楂}FD7۩,AsYʎlQ/3XE~N ,rFgMRw4r+ˣE?@U [|!٦? R:q~wޛwzQPR?u&ѽcJ!4,HQ=~4ˎFH{+D7Tӫw˯"Yݯ,Mn/҉!+J5Ə$ A깹vkYbI-$|T7[Yx8K/J35)&9n}5_)?pIXrk47v [BQ1bBWk.ʲC0FPRENZmTm9nn`B4ikug7]ɍK<*V'8<Oi֌ڻ1D\TQyU+‰dF`PG[ -zNQԆ%}>јkTz[5xH9'˥WZKg=Mva,mkĝKnn&w`ikFZ8;Dychu`68Zs;ɳݤ{{CTU>{=պSo >%⵷W}"%CIѩSlΩ({Q672}=oÑ΄Z=lD<|b⳴_.9$$I`Hl``|i$ ͢[bEe'?`ς W4OOVR*&?Sf˄`oC Q]Â>Y(ʗ*gz19rW#r/#iy+t1ܩ.ZO[9Ѯ/;oRd,`ᢌҦ+?}3銔r߰ [~'\,?/&}~i}Qg1̙l XufL^E uoȿ?Ws. \Z<~KylSqFCW^K6?)QL`2mzN6%c41}>,uD>W K.Pe (zFpJw ЁVFeT-/ $zzQVt|A&rnCX%4f㼃d/C5r|34zNĀ,vT0f  :) -ˍ v2u01w"jPb|qCWtdlyb|!F?g)|#LzF#dj,gײpZ.ԪU{ܟ*5EgۛT K[OuHZ$ rE^">/Z-|.%LɈݣl?q266!g|;ޏVڮ zǠvG;!ɬ\iڡJ$Xܳ-DcUI^'_WBщXY3ϞY-7<&oXɐ`c- *eOdoTOo[2v%湛]/?j/Peyc'_Hf-fc't_ļbJaoәviX|up__lo%;`™ >A^CzqoG \2Ndb:L]Լ焽LzLAPg&1axvN\S?3:w e6:=Ñ2QHMިtiP}wݒeqT'=g]^Qz瘸۩̮a5c8dx6b~m#= 97NŃ܏_}i9.rhG{gjX¬Y'eHzMȃmqz]zA.SCݽ\X&lmSMgŖnԴB'x ;jNJ8PLT˲klS<>uTޔxVG(j74Kx/]+~Fn%ħ&h PTVD))M>Zaǐb}mMLUMEP'WoU#uC O\ύ8_H}fhjpjԸԍ'*LTyN)6(BYj> stream xڍxeXZ. %H 1 HC0HwK !Jtw(RrZZ{ߵ .%DCrxx2j ^//?// s(EpabőE@,69 =U@HX+"!pZy*pE聀Z wDEH;@P n8P_)mHG1 ͍A63 na9s.]`>f A*4!?j;_ѿAa[pG f C jpߠ7 }BBoӟH #/?h_P@^_]CX^@ 0$4ж*g4 wT'a-a$;|j )x^,N nzzDjYͅo]%?ҚNTjhm"}KQfm0" 둈?Z`tzcLx2^eJg".TR 6idfajhvӆ@?WZqÚAIJr }~=7~)1ח.R=,)҈* /$Ȝ{QqNƧ ɚ]޲` >j֓%"']u &0×{᣹Aq葭 긋~:,!RaIɋJe"|`=5ȗ{l Ry4{rocxhSRa?mwq>ٙE*mލF\3 H?/ҹsRu %,J^LA| JePG!Z/uvX+ɼiYMH't5MU-JON@h*`3nus#Kޓ H&N. l#| l3YriJXx C1nZF qrͭSgWv!3kShFDT%Ä Y% @oE5` w![P8TW>w}/Q$h*=tL9a;) WѺkEn)#{SZߓyV"iOGB6P{+15% 3(5[ÔJ'Km/T G2xDݧ11u!INʹRF@"ݡt'veylp =WqZKyN p<WC%#瓱҃}SXbt5_ee ,4%0Kif[Q1E ḰVϣT)p{RuRsgX]>?3r'Acx(\ 8z,޴[t!7"b㍟A6ZruwJbRbTZFF,n @h7ZC2߫y@8iVu"nâvG+a-y_!{s2sSq叱;fau^zeXSd91Z<CVgRݘpyԉ޽P O~C!{J,7))fi:uLÚwۋY%[ZrcdIŋ R.˗fne}IO1asx**XԑoGM` ׋$^WPԸ^`60*y[STGO [N"B^%mYy|2QWHNGٶ6kZf'RN-rv5AFn1;$Tي—ȝ߳#jNfgǤ.d>7jMHb ;G{Bn (n'eO3I+[ Ntׇ"t>g5‹tގ޼gn[e5a-4ۜyBDҧhrr~]?S3Q?LTNՎ剓&];,sOxR[ԯr %q?c@6sZ $f/pgo|v)_ma3\1x L>؃/Q%"~k=3$4eV`zPLsIkKyӉPRfdfݣ>NvEFѼclw3̌Im<.xJzc|0~>5hf'ZixaC^fB@xCDkE c _4pR;VcS^.U|V{g"0/5<Q~`M%Ζv;sOtWsI8Y *{M{B'Xzj*U2b,S0n򥝩89_yxSkAӕWu|gkBLO s0W_#h bD+r"kZ[ҵZ~,V/EZ)ݞ6@1@g2/-2Q>}`gvCi"}嬈DqmWd j>8s=HtԐAgʻVjZH8.\,$\`e0P{܏,^:wآ#5Xte}熋/s͹c@c~{bn2 N۔rq|$9f* St53kxxdե tΔ4˚?zqgwu&gfkeEYMz+t:^JitQ^ 4E<[탂UU Z" / ^,r\pҗFTɩzO)׏o^0GODxun,Jco@H@/S8WM04M8;EiLHc_%_{KjhiN:FVoB:]O/5I6W>kzyyOkvM8t,2<^׏g] I'|\->':ҌVFٽnLt:՘;ĦB+y!w+6Vs끖-maM1['56Պ߬M 3BZ U2M~V[IX+/ 8Jw!R4֦@"?xz fie_Ne=280vkږ|ita j_ OWK# çx\-wJ8B66p+ ku`0۟J;/+HGŃ]Ud!7cT9.4;>Oy>)h{(hM=*.6wׄNq;e|Rx /e3im3uQwm}׵KF:^zϡ<HbwM$=l49Ib>UM~@.d3%Zyo߭4F0-yGN;I"ݱhԺfqə};1-%į&9eeHBliԐZG,}xK01Z諀f&}/N[xxw9\"; yY'ZгC8L6O31rhcLOpŻkM6nOrF$M@./yҔdv)08dѝޝ҃'ͶGPOC}V{b/[4c?ydڵ9m\XVpV ot-\'fO&a !&K@IiiV]0C_yD~+/)0{@fDK rܓ:"|Mp==z+Zck㌋>M= R/J\V R4?8HDke :J iZ86l6Q3'1"#2H# yCi"OCASqcwB4ɟd?5!k,S&T܊6tTmxqI֍ LST.?N"$%=zaewnhR(fOnTLCQ |جBxpX>\NZ<&5]@R̆3mĆ(JN9&:Q{_HE0DL^|[ ?jv\`V#nHb#( ,Eb0KJwp@|Bw[53;=11y Zuc9ⱽvR说B̯vS|J { -GSƾBN< STs/f& 25n:Kkt|dP6apV̚^?3Jt!,/ >SEw'L{GS eP%1V" n/V2LW鋙 W>rj&0ם:ZZҙxrnT> [7#E*?va*CN5@/"wT Ub 4Z4;R#T@)m(5)+L2 ƚ7Ns?";VXU4?KdrY~ǦvMa[}\u5g^Cd}ٶc!IcbI?/*)7<\Mʷ 3}[#Y6@ܩ!9Ln\^: sMZ,׮ɢqLƣgKUM9iMKWXc4*Y[vh3o+v*V,\Ȯ~@%f[sXr 6PDI8:v=9W3"b=օ=X:nj }#}a^P؀h^?9+{̌[Knk}Bd).܃Ad'W]Kg2GӯoCq5% .)muZqViq5[uF6X8Jj2}#ie8ѫt˲'6Yz؇m_.<?_XCM."/aی e_&ʪ]|;B-IIS/E2;ɸie: ~JrҜݐΛ_zMkU6<8O g'&U*sEown5 {D0s W*-a xW[8+CPL@^_"tb=xO-<#HFyy2!JYuxD^}Guuii.qK 䳼qZ4B9Uo4ӄjMIc TֆA=f[V/̀h{3e,rA9R&v* @>JN+#!ew. iC#?<]H̷hȼgUvKQ1kGw%Ro憂90TI8v0)x ٘!3?eBaKB)A|R"WHKX+JUS| zC08bm_!m?XMeKBQwY]>zϙ[imƄٜy8seG~DkG>U?O4kqqU|oK|hoBp4ҊK ّzVذh]Yռbko$C #}Hb>)(0b* t Տsl8h>u}K\}^InZt䷕͚=_/ ѡLyKL"gӬᅎ*t37v[^[8JQhK_|lDmaf=C %.Ѷ9th ((oP_}>&ᙴ]P`h5 #Mrُ;t P4CCrdc9˂"Ƌ9šWRX]5v&;雬Cۍܕvؿ$nKZ4ˋpU);E?Wd7sh}cb]{)ЮJiBg0{$ve(rnGҭ 6+Lb_hOXOxqzfb d@g]KPCMLC,P ~Y1/W}z^X sV%Qgts߫U?lv=R7:̭t.9y\Nu"~vm!}TgV諛f'Kk<^_]78Oס0+E=Ff^ůmɪ|uڹXwӨh/Ð o#_Hi%WhQgش9E.}ls=_t`ϖuaf:>ԗ!ÊTYHJq*2|2T (#Lrva0xHr_E U8.cr r?7*u쒤%Z q'>|,WU1&RL/˨d=Ewtu_)ǚBN}@ҬG:5\~STdx[\IAfaAIcfL1y2I_!r.yV:T-6K?΍K endstream endobj 685 0 obj << /Length1 1623 /Length2 9355 /Length3 0 /Length 10408 /Filter /FlateDecode >> stream xڍweT.VP ܥŋ[  mRHqw(ŭ{Kg}ν?Z<3|ϼk^K(c+aH 78@N]HO+ˏ̬ABxp W&/ BA{:Pq||"⼼~^^q<bPa`W\f9bg??6kv'0b AH{ (@n #+=, rr#잲s< H{p~ 9ngqӥ Ez` \`6`|@ ' x||+w"`5(ƍDr@0D~rA {Ń2}uj8#]]!]Ns?h CO[OދW{|Vlܜya7_{?6;0 +"<r|߇3`{ b qHߎF||5`p~oUxLyE^g6p/GNSCMSv=>@~1_/"w&-J ,~R)/%(ΥW0xxeGKkRtB`1@N_{ !A~\cY8}HV qUxm Hk?]A!0Y;'ߥ>Wf tB½Hw6`? !pW+,m xdA"xF"q8(/Go$v74_Pc/(?_" ?_>/x_}nq!q`kܙIDCypy p}_)+9ɋi񍈋%]G#r^GE3lV|.w]7T[ZL,`6v?juzHUCz 'H"j- 80 sBAF&nG0z+{cj숗ȣ}c:A.X|Cw*%;=Oq{=9ZX#IW-|T:ÆM# LVp+ZЗ3yS**bɣ!) `N7ӴqshkUWb Bf4_KTD ~۰BSfLFugK"o?樶%B泛K&E/9闅aA3 -ct>Aҭ뫀BOQT73η6u)'!$l9$)biŔ([x&%m"/[C'0 `äyIt o~1'i+Bl" -)56&psdKȧO jGG{Iᖡ]_R/CB}WC1I`Hdޮishj?"iGJ.`'PXTAQtnǷ6z=8pB23Fe^vLRÖ̏~{u,y.ap: 4wI!C )щ9T?GʲdkO!"+XHn2;g:LPF"BB(\ zeי:ZʒDpUeak-ojgðD^fҾ]8*rr[}>?1`gC-XF[x1@'6CɎ-Q"PV@YWUjE&a`ZĆKqUvuqkOc3JGjf z' II+ē^22+Z2Nϗ̒9o$eK6R[@:E<7#M+&jA5K+%qfj+T׋Gv.~< :.Lqi3M%_Ǥ ~ 7ܜ2 ms%lߐ7 yQDqu7,=dXN85Z:u>N9c*wvށ́LߺT1]Bf< pfky| ЩU+O.Gk_5͍D?oZ`™>mh~|{.e?6Ы"l|M &gC*($jYR(CZrYƁEq ǯ9E4j2Q0WPa6Z'Bpit]6~ζ;g0v2R܄Xt(_\dPʷ g,2iO@5ˏfғ 1Qؒ e0P)32}w¦T Ft>p2s>wX+-\`ԈPM_}-W`?bJK+~WD?БfJȲv0*)\~l4{ޫʺPƃ-SoA w7}?= ۯYJp*n۵V`Rzlo6*n7I{kB,-qԨGM' E45#$򕐻VLp "eI+j̗2$0i87]0]Y }n&*L"@{u {<ҖCqc2ճLf9a6bgoK2am'ɝ XCCv oDGjvWBi…x}z˘}N&SG4b, |J~8'۠k<;G%|:}9.fY"L|5txʜ!U6)`*;}LK'} ޝotϛ^[rg\'JIO c/NHj*W<3J~)-+zQu2j`~G{Gdmq("{2Ibw)! 9$QD'y9]DmA&,"#t62;[Õ$1 ]Qk<Aq 6#Ko+% %䶯HعYzG08co$ܐU[ O$zDgJ<ᘪzҷFg2׋N4Hp M GpТZnt_tk>]-=Y?W\IKYq>C.G86橫o<_i9}灝zJOONgf/$]µT^mv4m*y\fHoZp&i+[NF !V* 8 |䀰д>w|u%V\zL˱B[u*zPuH}IGPX8 v;wEº+}PLFmBQ]$Kwa?w/ko]>ʹN-v6dHcZm(qdW5:֢P-NJ=ύ"ay׋8=6Q$%w~s݃6zɋʯ*n2?T$I:_5⹶WvK/!'3,?ˁ\!bDոoڊ V NiEjJ% ߶կ?ZI^[xDx$ڐf+ŋGŖj60Qt.+h#AG? EQ\O<Ӹ J3@ .]5z`y q#k<ӭ|KEHln',G_nF '3ڟ>DeQ+axXaB&]_K቏W" 񖱢88_|٨yL[%_}o-VӼ0P nغC6;|VS տaWŧSIY8i;ed.]r2!nCh9Q;0!5NɪV]i]B)w)SmҒ}ތkhz-k˝У'\TM`E8;D U/R}QԘco'K5X>)q-n#"YҊXt%W?Bx%~t7I^HTCwDAC>GCy+N' DǺ]>M4ZOX /eqG䚺0 gp(R,DdPn*zaVp<7ڐavu3|z El̩~00M#"A['6c[|adVk~a+x]5̣ _&~Ւ'fq0bG-R7I17 8(j})ITE'(%>5VO?"L6</4.UoWlBFp`;~R?u;vxe_ۈuRtEVMmJSǮ08~{Yp+4z,.Ao euĔK_Ν i-zGFdHƗ((#BQ :eeTk:%Ęgn}13*q)4\ߣKMhYyO@ nNTdw9 yXI`T6 }}Gwq]i\Ӟeh;+J"uzR>Hn'ވ҄E^Z)x5lJ̜o󋁩tqcԲD4OfS>Vdcrb‰Bd(ɵ!F;RZI'|GFCJ&AYeY)N&lv䎱fK[0E6??ԅ׺wS|ɄeYW~FJoSj=9!#޺Sl V-Fダ< qorb+H{'^_)ɶ{>H$ߒt䉤ȘӰ 4y8^jhEQ^nЎH b.I5MT<0;PU5 q"s8fhq8XN NAXhT5s}ɾxJ6֛<3TJoޙ%;~ּQ~4>25 \Vg5J흹FsDSjhL|#T/LEQ%E;uؗ VI-#Y_n'a n^Dzj բSBsݖw+@4JI+b,\{#6n,VtI[-m5gdvZֳ+299yߒă% oL2ɲaVތ ~u1ҝ [f z$$B@ 8/R%v7ƌL٩6[@[fJK2$wP̶=QLS0t3ly+;-xQОK?W=\è0&.]AaNG_ؒNB_섷Y7 h>wvJ_K\jpcW0 a d6H"J ǚSSmB//rkxН˜ &^7ITOm6E[-3%΃(k?|9+fFU'3?'dn> !-"W&v6<=H^EW1{ssjZZi[Hq>xGIᵪ¤wT5KyjlIL% M"0+04%Lg7ϱEFkݢf&^r57RV=(w.n]tI# C͍PrlL7{БQ~ulgV:Bl桕5w>N'2ܮxC#AŤ&ZN:"Ջ) ((8uk*/Mg*˓ jw

}.%V.)SNgHx[%!jũD7ѭghdezv]/8G_⥖890 `Fh 9 %IW4 S&,{P)0u\eE^ )uvQF3j>6nD&p7>1IӕF|ݳMTPT3ng!#$L#ϛ5!ZS/9KӶ@'uM[ocC j>By{t&B*(R'Q]e{?&9h)"Ԝ{1|&Y,&P6&"\$uY=^gZdێMd]2Ĵj#Yn%Lɤ)@˴9(B~-9VK L9MVҴy}+ަw0L4,'G hu[?_$9z1zFt"|? cZY<"-諤FH skfdV(&Y뮵1O%,->{Ir,v;y00(BFw ϣqIlu;Gp8Y|PhR2.ίD*'`S.Hp" DT3d?EN+?NADmMy 8!2 :T q}yф[o]kFMJ1w0$UKdHD˕f8=a4~f`awuMnvif?z̏ NoF"(-uï RY#_ϽQ<[IޠmQJ'c^Mp%.ѹwR:#`J;cl;ځܓ.OO_Vv/ ZMGWuqpЈeG( mxӾ&C×OK]5u ~ƌ~u5 z-.][ʭ'tK5HtŞ-&R̆#N뜑!_Z)+~9g^Y$ \m.y c #k <* R3j@üB-9DMB .^U$ }DO5^FzK{Il8ҠNpyIL2q-ItVjZnl}BYH쬳Q~q)~N<rs?rcă֖~)D Zo@$H=9-%J _yd+D4l0vop&azmR;n%$k2aIeHl|m̤Q;N1D_؜cxaV>e34|UTlWЊYq"8~}QOlS}" zi3zqjB':] ^-4VT3kZqW@J4 pmhHz>X-q nf)^68()i=Z%S$RB+x KN0jZ~.^'%aEؙ_専8-CK1 endstream endobj 687 0 obj << /Length1 1706 /Length2 7981 /Length3 0 /Length 9054 /Filter /FlateDecode >> stream xڍT]Pb;cbanT$DnAA@S$}}~kݻf}?D%k (a. 7@^C ab҇"!q !nP8LnΦB9jaG ?($w(< n#8 $wq;  fEE9d] nP0! .w;A=8 A+* rq熻Kq. l rn u^ 7 C`w!0[nw:@YN3+]\A0(`uԹNfy ;_J:]sA]P=Lsẘ0[y pY ;wߗ{\Aav?۰p1A{@T~ܙpCA^Q>a!!1 v+4 wݵ A~pAO=w;3Afwx~zS-+QT0Q7_PN p aa>@i G*޻f"`=!l҄I`[漂/YB2U+RpvYpuq']h_W#z"@w w JPo6vC1 ~Κ3цC]\@^;ݽAd A[*p۟'(|pn%M-<08.p^Nwjq!;'El@_A$9A +9E*S' l uwu[ ƿ7espq/Dxo/K{EsxC83pxcmxj^\Ò6^q͸z\`&Ue.&tί)kzNsэfO{u4\2?86!?by!BGݫGٻtcfuWAyH8SM%gOts.%\L.wP=2A=%8'bʯp1>VYL?"H ~2㮔Kޗ& 4c+{pZ.aIlnY2hP~o[J87\C3Bn`󪋕x5E*)!5lDɣ}&SXSFkJ6uJ>6V0CsVGq2:DG!@ĩ+ЕB z3mlhV8G˾m,tRJ>Dy ̓no!tBӹ0_D5G3Y5%dPQ\tk;BwֻЊ}4uTȾvy_d[I? H ,9˅8e+,STeO0k}oWbֶŽ_<$_eW|oA?zao9mʅ  C{}9KwZFmj [uPgMϦѝ?.NqxIyEGϬILœ*+V#C{̺7~|As-,{nB45Oms (g_aTߐgSt?!M#[#8P[xluve5ӣ ZoEA5-[/ŷh{tR.udX\8ngX﫷+8}eGNnz,(.SD0F;ofO.]<1S8(;;df3&0W3kjA?!G ,>T$ ɩ lfjE ?N 7*›LM(-qWΏc1J>GVZmh;jլvX*^{Ro{T0 ut"2Kibʙw*69`dW{S-HzGv|y q'(!&Qu_Ul[ML)1og%5N4l(>l=bel"0k-SBae_Y)KGg Qz=:ǂ]Nc In}ˋ've2+iӫ17?q5j- I}BO?d@"3ermQ`C]֘WE*7]<_c"[=`oJwbOGa5L^x(%ew܃ SDi 1EFVZ:M-JfqȕRFFs(-YP3,ACk7ah<`Vdù@aoLM5,hn󯲦$MJ ]K%cH1qi+&ӥ2&07PO uDa~c/> /D<cLr`tlҔ`#?ӖlLT(i2NfG^qX"'ݳ.\(r5kbGf:'7Dl"/:-^$T@5/5mg?tH W^zzxU~w7plkjA%LÕ$2:J{aIjj!ޝTvR?}v8Xή݊W& na:7z#ng˶aٛkoڨP2clvy݃uѿGcE\{%$tB?V~ֻC; +ub("2r~`{ɝf9w{(rden sl-IzJbPf.v+h یHU>D{6Llp/-r7} I$R]]~}3}l m ɑQ Gn&$ otWyb w;qYL7y.z@H8>ܷ6z 0b"d{}fJ~B^F M:=o7ppdh˵9b+iiߌK$$?kWr*)$v2d- ) =L.b IEg:t9`Ƥs^ԹjX`)7q7i|MjvFj}"U}Ex̏K%:N!Ha_O)YH%ٻq ZsTuD(@_MPڸ`w@6^ rk[}ݜGr涀:\,WO2|;01Yi) f~;AiK?$n7)K12v&yJPiW .59ꉫƮVz?G=lw2FimޣOYLg(u"qI9jѪ&;JMci%.M+Cxu4)ICDfEZ5۴%AkIu3'=D/#E JI64Jz s}aQP"tzE5+TBg$`O?5mMMҧҵ.jzpU?=BeIsA_4S\ $l8,9=yϋ|4P+.|~bgp}(yaЀ!6#DMq˷Ŵ@h{ٷ'" 5F1ǙQ>Z8Q Ml [rj!c+K%wmsu{BO6J[NF- h.S٥CUǘ>z~=57úuw֊xFm6\ is7v7("ɷ蹰0[fچ;{bA?c2{ڍng{•ft&SHגzmGέc璪$0ZMoWgG#a߂f4F#"B/f m383[27cE݌(t  3<Qkm$wZ6{•o$mv|wG Z RLdPycDK$4-K&/Q3d*:N^$Br*$ H38XLa%Y5~l}vGv(bƩR-ZyԜ'sO edn!R6a2幙XZ=1ޚu&h vdynkIn&νZZ 5z܍*dKXٽhS%* %&TT="3em w(j{DJoUg@|t{kb\YTivo7,96i&؇N`=X6/?9HU7[fzȪKF%rdZ5/cnJMr41/_λ)ЦJ¬+"51կK;|M"< IQ~/fT X&S[V(9m|\ Yx./qK5Rڨd5z48\.XQ,ZG=7hr?YP`kO%K׽9؇uQȬ.\jcq)a)JqT(/n`9| \a`||\7c<.^F!V׵9ұE׳ z1) =(d^n iBHwr%^ ZMA:8K[iHJ|q5WN~N[VʿAw* N۾x([5>K]{1.SyO c6Xl$ F4d9}IE!\pqe¦H%_eV#D`/uZ$bm`w՝Brβ5FbT<5Wh}婰j;h,]ns%|Ka 5;Rtj&JD`.2ֿrvOg⯰W,0lzxZ(̞ 3.\P=Lp7Viz1*Z._[S\NlDN]^ yx_M5$4U\궷)ZxKGgQH#vo0UmM[Xxa@+{}RNPFH\\/{5|_G-* 1G#g|$[eo3=,n-MM嗖كup혍JHn͓VAb~S >R-;Q۹z>cYY"I[%reP֕Epqw_Fp+Gp y}ǘaRMv@PB-l!ղwz풔mkm9 3HDiCubĜIL^Lѥ$9!R5!PA|C:9h0 ɕKX \2bbc1ۅ&ZK&4$k5Wj kzǔM1|f*ɱwҨI^;J+~wEvgM/xd`ֽ6XG#]fum2vɱ쏅dC\XnZDZ[&B=;uHT#rE| tb)m'HHF m\`ܥg~-"V~Lkr:W `&$aK$"(Tp9bˉ3uloJ*f6@*KMeYg?= g$D61tޭpϬY2y4ٰZ]K=X Ƹ0oSoן M0s c8{|U^߬S^G5Y, $935҂|3Mƍ.X|M;ĶkvT4 萇 cf:v~?rJANxu\emP\3/Yb}#"f*[pW6ozrx]7]uߨ,lKVrH#U]K:k=ijAfءU7Te%1wh|؛ wBHї(Ѩ|,𘝞R=tmȭ= Z?1V~ηɂnW;adRkCSJ,D&,:=KӋE@4GI{uKe>[pT Xg霈<|)cLTq;w e={RL5ZȆҫ*9`2כme/u͐9}G9'n~-*u endstream endobj 689 0 obj << /Length1 1985 /Length2 14207 /Length3 0 /Length 15434 /Filter /FlateDecode >> stream xڍP\k \u݂'w;s^yjft?{(>*1ٛ% ,̼1f33#33+":lB C h ~߈ vY /@dP`)<@8yPXxx6@vc%- @{ j~K0؁͍֙B[T@'W௒ƶƈHP9Kfov3v6 S󛉋 &#Pr,/=0ݿrdg0J`w0=/1wI[ vftU#_n,ag&fok ;#8 hw92\4@.@sDd@0tM- [/{[@9;}_0&@ ob;o`' 3CdTd]/6V+3~A2v[뿇B_go Pt=ffӷ/1ߌ$]llS7x6.5P[Kkwf H332Kr͔A`SͿ- l ybf?-3~Ff_*c緕}aRovfm+'mM̀O7fx`nAsr q 3Ib0IAl&?$qEo> VSzj޲/y1\LXޢon7?dC@? omiK^o3V ?ol:X\غ-)?Oo9?r+?9s1v-mGY[]{K-!Ͽ}o hsޔ/ت>Vag,+D<_bp3Q-'{I\wI.EQǻk ^_IvE2EV-o}&7(U̫x o`Ct- ~8|>(":4x”+ciNwYp#A -ؖ/n+<4J9Iݶ΃r$bÀL!Se( 1.]d57f`}{@<#O^e2n!ɫɫ!ֹ(f@(\Ӆ) vSNVŁRMpr!řE[ⷪikqs圄~:+ Rd.lrcoN˘?73S]JfO\wxj!0~>/ ӇyC~vO̓};ˍ."pWZHOԄ-c3M`FhZ3ۏ8lo<ܞ6 `,m7-ٟel"g[."{p=OZ}KH/>S4j3R\!:4iOlw5 ;CMVə""^ > ?O b >x$s%И 4.Paai&זb{5Ք6tR +ꛂ7o/_ΈƝ2z,XHֻZԎphW8*`mX^SSKiހ >,c b>5ԬŞ bs*薸vL+z$yi GFOkqU0A–9Hۊx7U3W_W^Dh,TFjU>h9 A(%uB&pc "O CЦ͕&!JsK]Wob)k8O7-"1kkꔛ;2f-(1k]_S||gݗڛ-B̓4GwsJv}Ʉ> F?c{5`U2?YjNE1opJIdNE&9H(sNwǍ<"z7@ii&)I5OuMVէijPz4v8Bm5eaHCt=WehWu бfh(U&9W7)Qt1|#|$ۇ(MCrHqSৎk"$8a~{+▯…NF@a-,88(Vp3:$66|o6+2C(%#G"[^ TReețRqmU1n duq}QxS+81dy(u };*#Tb G_ܒ-L#xVx1^'~YHKɂa)u'VaX^ϳiz8XJ+%e,H.ESyCKr+{ Wh%jv)Pm[}^ַ}We5)H㽂Vy 6x?#3gwBpD"'7H6#)"CYC C)ئpT}?꠻xHzdsb1Ѥ*<@>$|}U:5p.~i>{Sc,C_NkPėe PA;qN0(EHL{-׀J),.FW)ޙmIu% hZ?Zm^=~#Z^3,]iF'W"ΊBUt8WG ~ZIyy m֩G ;X~Ղ'&U쟤8[}ݛ wʉ-~;;hdi˄5E@oItw3i)pG9ʪʿ{B*]Uʖ~n~th;kX#F37wF@[3*txeJ3 c-.^O;'l!@j\@.Q()c AVS ^Weِ3S[|93`c+?%wRaTJA!uMV+d&N]1!W64S'ԪfKS}}=Yr탳yrCAᢞ5}ݮ|:aYXee'#th_@{#6'35sbXueZ07ְAC"y$?PP1oV RlVLz^xrHDy1ZE:uCZ89#tȎ'XGIIXR a 06 Rry> '髂QaL$v&ȴ[](Ji6QkzRF&n 3ɩ. 40j3f϶.`H+^]Z^ bsVFEfw9Ky; YC:lM1ѷ_ n> ,LL &)I+֏L;^SYyqP[ERhG ygR{M8>'~ncN$1w[aߗKgh\Z UO8Cv'_9@:& w)V%eۚ~?Lr/*C~ {<3a c oZVY"}spMe(TY>a" uaϢP񝛇^3g">kV@޸Y N룍f=2A%ENnm2'Yxd 3^ujM]=Z5T74DTt{R>\:rS4EϨOD2[Ϯ1dQ4Hޟeཿ[=%K]4Ճ*7?8Hv|–0EGJ>(4:ND~xcqɲ M\0'ioO+lЖ"^Gh!KՆI>~ɐ'>uY4+u&b3& 66W̙ƾ{IbrzMBdUoSH7Vseh^ `1}蓧]5iGS OS'VZ;DIhT'ߗQfgR m"0I!ܧd綾C #-ɍʥ@ZOa}=.XeޛI6R~L2E,=Uǜ6cSfqrU2 Y ^_ap_5 .fZg'Tg Ҧ atO̷/JaVK[B!B{;0b uc<ēvj%DzѠmT;esHنD)w=;N2†@v3āܑR.ưiΤީ_Ჸ:+l=Ǒf!U:.ZˁkCuxI!5IOv멧iUo[uJ--w/NLu(],>پQR*xh&#o!a v $8la_F 3|]kT<6B&?n& {3ԚʣB_5CzAf?rUItF׭Gv RsUpœOo t٤r`5wX>6S[żb x MmjƝ5 *YoВI]1-G*ZjV *8Bه;PRx'(ܰ0f$"Y]oRo^k)N3*'ԂW9j-'ixcgV(wV:Mk{Ӽ:^czee |%vEya`tD\G9S5E^/TBk4۳&SKҤ#(%"V ~rg"(3VtJ!l$^|&dV'tR?~A5Zvax#ܲ}[åHEv>wY`-{nW@Lp"x)Z#qUI}/sc[KvP/,(f 'rߏu=ZDG8>jm N?H`5 ȴq?ʨżLxd ;Mz'j}4kCEoUl(8o)DD $1V{ |ڃa:o<>;qR2w;-!#+gQد*gwMr') t‚@F%1j</6#gSzxtX}EK/yvI4,_j -]9IdT;%Ndh+~5rkI q!inЧg> $hϾ>8RM^l@:~F+ 4xjWeݟTϔ־*?jUZA{u=X\/݌ P AeلL{P2Hn瑱9eε1.?șJD4#ߦ~d; ~Vl=`v1Άw@1wWm^;8ZZA8qSNyuĭ.>QXhp6Ӳ` >G!Ny'OouIAGjh3uMⳳҙғInRX~5RvH%kYMGƂJs#ff y̠X>Fg6| 19b_וAWё#M{}(TPi+?dT*_y1rf9nX8/LX4[t>dM};x0>MNTqsMeq>&QkyQ8T`kTE 1Pž!PUL3Թy 5'D5B mI\VtϦӡ\&4X*\mJS/:y|Og$Uv4)OE,6',*P rpƋ{bGӬwԐX>Y8= ^J'$|>~uX\Q4<#厊v\چ6THD͂C:6ՙ>[G,><:U^kV ٬$YI=)2#Ȝk?pmfm8amyk\tTw3zvNc}hj Qrw?-U>C:XF,S&phS-? 2_:].̀|[[N7Ǯߧ\#eqN\uԑjRprqasDHy툌Rpsh>͗;5f]_Ŭ}?Ȧ!AVbYnvEƷ(~ jwUݻ`L~wכ_L5Έ,p: ~4g Ypӄe/+b$ T[e,bZ!i} $qXIF g1o1pÕYSyPJըOv'=G [a.imYukK#~i[9QTrAU^G"5H4eO {}?NJ?k$c>!sj~nؗշ;d {u8j &0`L^`yL 9؝wGQNK.+^L?M\ʢ3*HiO+EMnIc.1&(ho;t`wBɶJ}Wy4"mb̯ZSԽ1aSh:x9͒ u!nh1K?NHu*T7  +gV5GSɎa?n-)zvwr.~ G=#L ;`:X/!7 X&uښ7Znvo4\XP7$ +ӢgZJUq|+m-R{@@kȃɏ =StEf^*Y0O(cֻUh.8L@R O[ 9`$ehhznP)y{ lϦqWOaM"d>_L:aoz ~k!?n4Sfn|ќ_p|2P>PnX)'5;(xRA|tm_E@(<2`QԂT!ϟG\#IR;M7clʎQ;Sx=D~0d=KH>ʑTóQ-Z!y "(l&[JuRRfR'l0||fRQ)ufiw) (DGK2b|(B8_몁nǤ{ze'ԊDAW VzdI0 t )Ƿw;yDLG IOCr_}>2vHjyj=JD&.%z1ĠV(NRҧM^Ӣ4;#V8 SHT^Eũ6(Ծ;R!2??%E[2C;/B:9PU<_m3B}|l}Ew:9ԃIXEFn*#ʹ/j~/6~ria(1gUe]>jl E2>"U#dG3ñNE] K;cuƤ Ɵ^($eMx}%S=r0Jŭ7Vî90FÛf0GKahrtX>8XsVF|7#}]D MUF;<KQWt,=޶-_ngKbE1+>>kS! f'&z{ՎnV6N314XE3#@ʥCio8H)\~_EG@;ܠ͐.?bgS[@H^> re3wA/CXNv8H۰DS6Xs}$&9ׁivzML(t3'hz4w5=ƱTE`_IΝ^rrK-Y|Rμs!PNr'Kqid8nxPS<{j+|x?hRqyQA3J9=(VAzΘkr)'t?WVR/K%Ss4_Snd;С>~JwX@*7p<'}4=u6ǾB+1>RDNoF7)pNz> + ĕrx/|'M#|~ELS(=sJ} a5p)q%Vԓ#!zD$ȶ081 ?_~/#;ݽ!+B`\"cH߭9H}%=j"7vļG'N,?j gj)o._[ԫP$%|N?6w~͞h3zlњ5\MԈt2@( 驕bG@:O-Y Dj8ib}הN%bh%-?vdle;..NC\yK̛9>N7H8 r*FÓNbmZǍ[CSvx)Gtm։TuS ŠK9vyG, \c"2=\ܾKˬd>I_o6OaȬ.*&a7C 7d& ĬۯYr%oYszA2g]6Y^ "֝U;[L +>gZMnH|"rDZTZ@q-/rt^]J;ә\eL4& HcۛU|tr 0/}Z AL!샬6je~=B..U х rL{P􃎙Ȧٗܜ@ь~7vP%J:FCxZzn7a!%mo/cCsI˘0\!)0r'Cf˞ *Rc C^jfSF3H_|7Oq2!vgMRNb$S'<zt%}ᘼYf[;V|[:Bb* EخS(>OddN*c2).b'}G27|xEZ^ wѧ+b(@# y#ΜJNɞlq8Ku&X{͂YGFJwQsnZ͎b]e iT-wF(S{YnQdF ĺo") Cbk/@Aq TCy`&ălkL_JMsƨbob G# P7ܑw;Vg^hg@nݍY_J r7#{ ^XZA)(v(w.%"텏pS!`s0 jb˭f@u~Rw]Ls3! 9J~x`̅ >qgMn&v},6U,B6L"n Sd $>2uȁqYlT+)kxBL R% "Z'2H[W,5ro @Ulүm&k!ń|DA@Gw3I i좄1hPfn)cx8 RIܸX..9tԎnI@.{ )ZO^?6H`(gLRW|Gcc{p;J;|{GjvhJT0%߻$Kg2Y=p6l#ͶDc',SQ}9<^~¥ pABq$3"%/<ޛz4I)OƞjȞ% _<ti|2e]gcյ/3%zK@1⹘אg̘L|mvZ`AYНX``!cT^5!Cy4ἧo&7K_`Q ]3 9|LS4/i}BIՉ`Wha{a__N _62LanĮ>}@VU8l .Ap1W&'"tևk̖)K: beh.R/Oz=ap. G˕7Eq5<|oXP*zChe3΍&'޿ΙJ0Hz ~^1 \l/$|/yIs_arw.sW VD;>ϲNR/<:x >XPgMdpHЫ>S!|iumHת5W )9P6*<+ /+d5޳T0hm"QKVIYbOO[&^ I=럓 sgb MX~t9 Ul +)&ku0Yx|F"Jw[DHzQrI44FJ{bo$L^_J'^, <xTPvKɽ,Z~NqUlq 2]`-ThhwOVu+ëkL!oVhy -;dZZ2Wb\He(*-(seuJy#:h?$/Hq7'%8!*VgyՎfϑX%oφ&U`% v. ŧ<+ə9m.rA=* KiV'd >8xp=,3#݇L 㔭ʹucDl-iufZ8sn"̨)ĄRʺZةωSUV3[ГߓFr6Fv)P YJY&-BK2 ?څ`Q͏0 LhV@#o. gEXgOcD7ZR*%zRwt)v7?@D"E"f uN{I/ĂyqkV&١/:')w`W*@ad8Vٽo O endstream endobj 691 0 obj << /Length1 1400 /Length2 6287 /Length3 0 /Length 7242 /Filter /FlateDecode >> stream xڍtTo7(݌ A4m hA)SAj4!!(HJ(%H <9W_}}>7/* ea1<@ ֖"@8/1&5=(rPG!NQH @L &-/&#ā@9 tPH:pp d~T]h!G+"0BAp?R+:b0n"WAI@8 p50@ 3/GoxCpNႀ‘O$ u?κ &"t%B CP@:.p=# a!.(\< p~wT ܀n˯Eݲ&ru#1d@Pܵ٬3+#0_Cp(4 TvZ-6xe?\\x5 Osf%(;k.4+vSs?:z_caЦ]cwI'\TMxf)j%><}Ha}FTj{foҖdt:^ՔfҳʙbפrW]B>F[EepU8#K<0̢kAv)ڿ_ Gpo¬ʢ%_ɥf嘊R'&My:5\ڕ-y<ƴ7q{.%~gs;hSB0xC[+12Q]~o, Qw`__ǿizWAZ@eȐxF;* \Md;R;8{!a]&:WOKv!YWuZc^?ܻųYA|qͩW'mBg ބj KQ-2ǟ>޺~O~|Bb,ߠfG+aKLr]26x>{RϘfw{0\+ Odo]JR!OtPɴ<6gEf/A缵Z*tEćZr<9N&Jۋm=6_[g=wnR{D#2/Ƥ: /\y{S<~6mwҩ.bn͝ N\J|w ub_ne2Uxj=v`8 ˩-p6]nʔp]t[( Z\)О2૰LfN[)u]QXoډQO1Uw| ,vދ(<靎/ɏl& U;ħܕ$ %P8cC9yjzíis#Bmh>5|Z)b-qMe6WjUI><TfVzʮOޞPS"iV&HN456rW:x1A'5eKJed\jq\Fh vFGTbJdrp8dyP`{-ɄmfI]jIj`Ӱ@>I)+<鯆kJ#f6\]&1sB_,䐨Em213}[㱨rHB13vgCwDk_b`Ii[4)#_#G?x#GE.؝r& F}ӭwT-}=Ӿ)7x\z|Km gιޟQSUN\ w@Z^ 'SBw6|ốEcMUw2 }1%;NOىMHrf5!| ]2FʣPHč9gBCѹYu8#[ ) X I Ot'C_Ϩx?AfO|@۳Ύm4&΅ y=4řf#W1 9gYQW5ۊXOg7:c 2LXx NLgR]j+0`o IlqBO}L R*^Rv}gseDu+o&r"uϢoLl >\bz#/8{ tt.5oy]6Ho"6aĀsU Ep=1{؏+m]mҏ_>J|||ll'*$SPI*1 ٠WON3qm <>Ljxt5#{ ؔzR^7mi9qt{r6:O,o۝&o+xj%yۗI0Tmm}-~&SbK{B]dӋ~tLfEjߛ_ݐ컝|NS= =䙧<*h#U s6M۔(Z8Wң8:d"#'E...M?F ?x֬xBS!E%<[W`h<@R=V$Hx <83/z=>O8͈2oto EAݛ!y\̙>>G) Y7wx;#(б K%Z#l6Č1=psj(O<7ХZ!he(L_Dn%k*鶭ھM@:`Q5aY׹wߛAdZB{V6]eL uN%BGص2>m]Q\2y'7=]{'O$8pc5v`,(^;6 (?LfOp\hg ȇȺ?M]upUhYVGx`DԂ2%Rx~n3 Le9vXRgc 6STNmpdR1 uu{ΐe֏8U*؛);0D@ycV1}s[%yʖ:QznyKGm\eRLN?n~4 {jy\ +ksBЗ>d)Ӆ;u̕ǂu7 A O2n( ,P 3t6:a#Ljq͎tuѮ mF#D55lSz/6\xv׻ծTQuKeb "bMԖ\$͎(L `T+!cnQ.:kz:+EIQ"un+!rTXPPx5So}玅\m=+alf߬KZ^ F4700?S?N(%,M]%VTax:M#jć]glYshɋ/5&CQ4aW3 i&pQxTj4J>>cRr6/g:vXfS5Xx˰R#!lhF[O"_(I,;- |Q |7^gxK#`R &^w?&c!9d:~cgFgo!o>ZOIPm'4(-}ZlnJ +lY;w0-96lV{^^z]ȑ&wLc EFSWvIUR}b*wASoa |~iɴGx.VQo hdu*vϘޱm,n#"DmdUN },G6 ꞴJ\>*t k}7/n趦*7{AX  %Wk{^Evs/Z)h6ҙ]pY奫y1Y2S${^D&I@,iT)/A'eSVLApv5m{BDRDǴ.r>! B[Vngʎ>Za#<@x}vEVUwq*Õ㮐-R;>mt+ I6ҫN zjPoypj^iH7R `p[x[cӐZ.TR4Z]ophjeZG/ɴz!WyG!Iͷ[4vq7Ep)FU Gus\ FVW<44[6_bCC__T֣zC;ypۻ+C28c|_Mfow]x\Z%hfY1-4x]^&V\@k)[(t'p=zn|Wsm{,]4xg͹cq2yϼ?, Ma \f٧as+^l~ jICt ;%+c - S|IJǿ?' endstream endobj 693 0 obj << /Length1 1627 /Length2 9212 /Length3 0 /Length 10282 /Filter /FlateDecode >> stream xڍT.Lxq()ݵK$@kqw+ Pܥŋ(љ3sZ|gs}@R]j B@.a AˌvC! q6Y1N (;< 0P@ %@0@ao P(C!` f)gPΏ;ZP+{0(EpaNNOOO3f+ iha`75wu380:v?P' x48[! w5 9@[Ig௳9G2 xCl6N`* A`| dG &_]09<Z a듵w[=77zB|6kMXpB]J<0ق>.AAM m~yloo~<;ߎF@ C0a4mďf0zQ^P?/<퓖z|ٹy|\ x\7K_ep(S_ `k:^L([0pqY=~GTɻ;9fq흼 xT;qԠsP}Sww_8 RG5y9x/VvjOYs_Ba,.={.q\o ~Cb=x|8`? @)Ǟ6P7/m  AH7zYYgߖ߽qZ >2GrB.NG*ߐqfGrc:H+w7ǓCs{0ADBCۮ=ٷ>"e^p.1CM%k,Tʛ9tK^̟n6P7z^SR[&=\e}/e\ufFFZ.k":9ʜCg$0`DJ;!ʈC[FHp8fhGb(K#>$Q#d-^Ld)6~h~Ebij+,Դg _)+K<$}Q2:((K[K'$d9?y^&O&@;L :K sKU)&8_ L+0< n08QDe#MYC ܔ]/%㪸2 .UIK2Yg|uCZ«]Q|\S{jZϞL_X]D烩Ӧ ֧4UݰTJbI\"D#8Hj 2WZ_.=^渍{1c7B/tvu sUw^qEs cPlGP9U&^wI;\ھ .SgGOMǎ$ck.o#y9zyA`K*!fR!wy>]m9j͓t1a5MU+fO2]P;4i\E}+uE:i.9O7^$ s=1V|ONo&ǔ&tERELnP|#\D+Ot6-w!-X<?>p{te4K-EF*T4kMH:psiFevx.~{X}Ux;~ǽG*Y(X)qF{% :>FZZ.7߿`Zkh]WDz=2wp0CRԯ {a礰fp=YqҘKfZ8DRӄN\8wq$lIjf8%rQˑMϫss p 9QnR<3YاaNݼNZ78^\JLvqXC4n$S ;Ac!{&NysV,`R*?t' &ȡ]zs'灠{fYVĜD#|tO1ǜ6ao Xt#WGmq e}6uhүZ.d>{yDv0M꛳3OkG۫ T7rnT;7#ES98#:z;β淽jOmg.r35w*w99hI߄6zaPD;[]``@ 0wQ.)VaЩ'b>b?u7ㆰaS >|ۄ/`$4'\o2m|VmA(-&M_CF8K5Tv$[` ;Ց.Moߍ*p6Ji~!th}$"8]2NDsS?:ݼ8څXu^U?T([G%{o* W80Db@g"+Ai ]!sh&e'ҮZ4g"I8or.$sҒ5`uΗ-Y\rqP>TNoTCZ kcz|~# mE1|n\ZBŖ7_u1rz;{!g]»7tBD$Y9 X'mq;CwzP`͍z[q>xǵ6e0R5 FQLyxܝg'[CjdFe?JmFoC%w$dosI%İӚ7[1.43o7Si oskvcͼ*#Ō݃P!jG煍3tx%x$ue\%bw7d8n %!d'z&ķ\ :<ȎhCS`-bb睒eXnd ]B{a/pF_ KVC^ӖтUcb;Cm$$N2oAޔܻg5lDŽޔ y_6@D:|JvH̫&m4uEhyeum^V}ŦXQA85\WTڃV\k EE"_.S/`MLFR^ ÞFs{ 4F:uN9J1L,,ɳ)#nPXZYۇMrᷗ3|g= 3Mml '!pKmbh'ٚԩ\ZK\i {DS}~vE(yMfͩO?TYXH̄ ՟m oo?J>Y&xȣP^*BwubhޙЕ$O>-ўN}%?7#~FFRө";@wx՟ =G 1qD9A.߁)Li@[jSj ٫:OLnݜTY`*0nRNY0ScMA [^+?2e6-8 |mtGfZQV#=gT$zVL&{Hd :KP=Lҙ'1n>=)o,#Պ])ilC(}>\DQE(" vZ= 24)ܝ(Q*M|'vN;-Npٕx81U5yT;٦N#$,yi/>ſtQ6.ٺy[ ֭ |5v0k-3g^fzgvՄ0ȦᏔ|QV#A0fy0D|jJ෫_o)=Dm/.q Nj_r+T0.f ),#I1,:/ҹ.pzZ$ CfK~ѻ!!OpqYf+9qh;hwӎJ T5Φt}s%vnVQ]w!WAm~)';th䞥.Fbb]`=}]QCb38g}É;T̳p[*^X|Sϫ Tac}Jw(2;})NJEOrCgM) WzuR2rwOI"[)K>X1~]J+@4$|kV.az{#S^Jل7O٤ԨlRܥ ںIJėNm}Q 2ER&;}^V1qY:';p>1p|1&r񌹼=pݤ\ wi?adU,u]y@JzǮ^[ìdCsCmNNɚE\: E#GzǧBO𾻠>,&^vi,N=OE99{%G}@AnUtۉһL0E[ތr dq3o]9$XpyR֫{MՈ.|7{?wl"@OW~ʝDAf 9B8s#?-A`JØz5Xܔz'넱;i8jyI P0]a Tv :''k?&9C4k=)!QaJmOA\u)_6"`wj|ê s>S27 9D'CZ-x޹UOR^lfNcs ̼.^w0ژr'Ϗ˃ Wa.kbWL,A08qZ]ůlV^Yggɒxvl+0WmpykNKH"*iL&^0f]Qi/Ģ?VͰJe!ȋE2={>I^ef[et͟5I]O [I]ȜhT##>@md"w|L )NT1I20fOH6VBWT="\9jDR!ߟ!Vm$7 NIVC&p\'I[^[o=JN.'ә)YԈ7_RTTx{ֱ=ky "޼iB5 XHN%sy˽{۷NG䒐i kL>~Sz55 Vmن$vrReVCB<&ۣ#6,l]vU)wijKT!RZ6'%*5+% `<9B8z]EmxE9!qs<޽^+0&&MS1ĒKD1pR͚tL8!v.)[fP?#!_=?Fd OH27Jj԰^ȩ&\cdn~ݚ p> xi5 ,UP-NG)*vr1w=:)ߌY"w(OزԮ I-X$3+Ŭ2:(#P(pCzTw+"4vUIc5zI姳dqJ)w endstream endobj 695 0 obj << /Length1 2778 /Length2 24326 /Length3 0 /Length 25891 /Filter /FlateDecode >> stream xڌP\ "-h]74ONpwv; {ֵ&'VT67۹330D唙LL LL,䪖.6ՁNΖv<:\@21#@ `aab01qމ ffi cHE<,-\@i@eB `;@dibd3rڂ2TM,.Łݝ֙\nbP:܀?lTOPtGbon6&@;g) JP(81ǀY`fi(2xL8ۃ܌,mAbnV wy&N. Ζ6Jdv@;g?,&{23Yk;{w;3K;S?E:0Y:ḿ.v&&&NnV0`^/%1_o{ pqrz_ 04q-ߢ@0hN&1hLl<5_F-EYui*NDMgag0Y2N hdoJٙa j{}Ԁ%oZ muؙL@W_.6O%]mlGmdkioҺ@tvTM-]mVtv6mTmGl,퀊Ζ+zhtZ&֠G3h%.S~37sb,#''#OxАA ESǿ`gr;(;Q`yCF7`{CƏELF7 `/$lm,F7 `zClF7"'@dC r Ec`T1IXXA{7"@dUzUb@Z k!_"n;7| 42% FTHj@^&o\Lm@ CGgC߲0șZΠoAkѼd#g^qt[P /Z ;Ƃ-8s{W o@te T_ _j:ȀG *M zzo ;oCe5yۤ WY)?B{ee{SojVkWgͅ7. 'g.*_aq|[n6POm^8ffPoiAo&F '_{ ꣋_AH f#/ (Tt7qu__4_7 nw&H^tjs}@It#<~e#յѳqSLXsRˣϓAn $VDpmzU=gG@k&io\Ȋw}%ˣsJ{2O%?բtϐg@Ҡ]x\L}x%=f-`Z-Seq%!F9Hƞ.*X_h+ De=KFr]COb;ηd@0%~?NbuqfeA$K55LdFˇ%$-.:ա~/wC ]?3|ЉXY U2ѩxOeV>6T3o>b|/7fPm^8_;\\Z~4 9g-RX?TxQ VI$žkMJgwb(B=wÙzZK{I$A}HPH/Mi>桽E{P̦*gpv倯 i‘۳=pƤ"nĶ (cOt%Rbr}2|a>z b=UBXXj3߯Ɛg-C 5zWQ%9M<2MmSiOA<~ObѸ.\:c~28N C`D_L&[@:m%@_[qRʯ۩N.&v7đD@)~ze%\R6, vNv:j(O&`|5)Y?TRnL #KT2@-ֈJIQxsBqTÓOLvI'^E2#ϛ'źR '| W0e/6핯~!smb[zal}}UUg17(+.E>6Y+~;I%$^F_'WCt5Q0(t:IiO¹?Bru=667b [ܪ'=H5'botdž"`qeF)X͓+nGq\Xzq\ҾpФ"u#Nrw $aPLn^u),ގhzޖJT^W1#|IfnB@ŃˑXg6:cԠPSb.{{ہ!L͵M=u@A846O=32B)l'Υ58RQ0ʥ;E1tUe] esԓCݜ9RdʲbDȶWAc6'vŘi107'q='˦\#K0,_ ;zhpm oH'i&8t l$X*X0}jW*6Վ mH;rߪn\`s%`$$M6A~^Ձ-{mC)/%[P໯NnEep.4&b 2ƃ*asI+My᪍aT}.e&)F0v^- ,Wb:PW]i FFBP`Pްk*# : 1ʯ˿!D" #~c߮cCec^ѕd4bBR^ZN|w\4- xUc+h4Hn^P #4O1p2\Ҟm/<\ ^{ M۷TdJu:7,1q6se`b]y]:EG廃eRAh|B_g2LF-rQ^S!".IkH*oӼyG36T QW/eݏ iZ# sЃK ; %bD?Zl c*%+nMĵL*rshG;sSn"8-i' :O_$5 A!fhPx!Ͱh׸(p(~EG[e,4,R JUJ)YT}/15ȓ3 U!WoጭUN;q*xԺC?rV/|@,] S| ?.1%bZ&sE2^\[IhEjqÅ!?\7 dv  F㩎wYp: oūMI]R;Sv;NzgFȳT=0]t*%yɸ80(l=+-q#܆o4"e{E El:=j ke԰}|wqRR_hѷCftv,F!`dgNI Zr>ʨT~y+,âև_B vN) ~حv"+o2dlHS9Oij=>74jG#̓[ KG*H=ߒntA [!'[)AY dO Vy&h9%XnTV@&ozhc^'Gu tp~Njِ°R۳F5nSbwR.sq}ckHìmr.W2˔իdWx3_Z.O?U٬d5rvo{<Bz* /Xe<᛿zC2$ucN:&q6FD=UThobH'aOXnK M=[7*3g\?Q 2Qlw.x>p&b"j]ω֖pe7Ȁ_d.|DqaAxوݺ`\\nn(&MgVbmAFP't.woIB憗:}ݎpu-TKײ՝˶hZN ĮoxbL a W.%qt[F%C[:3]_aUqepQ{Ue4v͇(lAxD;yJymz.DӤǂ,Kl ]m;νE+Lg|w"/؉?nz'sn%._1s"p)Br<яyx]P'F9^{FhVUCBy}({?`vœcRh+m""Ne(!e uE݆)gC%n#-Oi0瞕7Bh[ׂIzM]Ĺ։JA|\m,)xi4yedc+L͘Ltd^!$$Lr P_IeC4 sz*1< w- x`W9:HX{AMeN%-JPVH?iK;Z`іSsv8jTTP?.T~ye~/6Aysrs/m.!;GGY&񒿡XXn"^+XE@nAHOpG5\u>woq.&=Yw껨S v3Dj^B//Tt4xd}[DH=d>SW\G`:lZ4U`[8 d:#7 %@Jpn(MA</}B>֩Gڶ~f=PA`Ǎө5mXH|]",pert=n<՟!Y9U;*M'CwY2 \Ƨ֥ݧeAjSvлZlZ}b>Xe2@;t5fDTv>o}%CBΧԴiI}8zR7@4mZ>Lf`yDd8m5ˡwůh}^ЪT =V>YCOxˁ>^ BŊh/\H #Ԟ mFN#zz\Rx O#oL `;/?[1;[-x6H*mЍ"[`R f xX>"|2|dN$,S%1P %샤yY Rt ~궐Uc>R"F[TC*v-h[[}!˗3}Q- #,햗dT[=ۅdr:QxdF"G8\8G 7s"~FJVMuMGŘ2dWQhpN)=^&ȋf@˲x5t;߂V'5rYA""7 ɫU ݃S3?u~VؼVW9-m{&돠_ |{mQms+v66<Vti-5M,}E|T\-Er e`Mn*~ڍ~+ ?s_|Gʁ%v3߻&Bd%wB4 BVvPuF-+K͍dGGV쐨.lT^vTgc8+y*y.\3c_dHbC= m3ᦘ_y_z5D%!#ouP(h"C ޙ'q E9-gLjDBێ Ð}aaDn#V;%`(+^^EJc4tL)+EiqO䓞B]Aey+R4ӖRx'sBt\22.d?طIIױiHG&c p,W6n=u}OɶPjvÛx̜,r 0?kA8ܽs\ϤIIzm_Fw?L;=~U:wB25E.if}'i4k]{n~0XK~WSZfO#r3|Y~;(D |06^_BTة]v%vAQ0Ido0uK;r_`ݷVTL z9,9}I4wפP.gT5͐̓r{2ޟRӓB]6E~\k aKC<"Khzy2NmLyq[+>ybE͎`MvOذmPH榱ץ$Te@>u}LxϏ&LO#ך`9Y>82csL= XC [p[R Ut#;/D 1zc(/–.Ȝ mO,1CFra)[;!@o郵]?:Lm-4}~p#O4| D,Z3\=gGeplo:a$ SůRqȳ93Q LrW:xy[(Q#:a0 ?xDB $V1`[M~֯7aQL~gF e ;ՀRep Cy8}H“Bu~y`nU㑎uXӦ{8/ j|PXOIlS2/*pNnBw\΃5V;`BYC{TAB/u].=ˌh]l¿Ն^ ޕP]R%{ԗ=."<'ښAZސ^nޢai'ȩ g^K:E ҫӿfCySq;Ō[E(vdu!&3M*M4[W6WH)C=~E$ th%۳]_(7ݲ +| {A(ҧ[2ol*eD6h$ZEu.zWO8gʯضzP7sccuRDi[&Y a8ue,%La~̚}R*/GpWE-g( tPNf8dϐ_r9>oZ 2sT6ý/} C\Ga$,WPjvH;nGޡ%JIiïwDO*s?AcͫY'(7E̤K:z`))/wj͹iH` $?"LC\[{>2Fmʛ0!M,B7P%} 9ΰ 9}Uor!WHk;4vWRm\yz ]!&bo.HC(I;AKMlưL҄QhqOgtϊE| Bq!rj+Q 9{^Qi[*ٜ҅ _PJ& *J~ 'I'V*~P?k,ACC zGJ5^+LG3o=[0&Qն,eBSBwjdzO.vf6BfJ+{3%}=|Yͬqt<:FK>F >[U~nFWS[K̊JUs/Գ=~N_B{ H|h_8onޫ1ԏ`>Rۓڛ[9EG*aMZ-]V[>Ũrō!Ɉw}fxoY7:c>Kh/^LpCdTxz^rDxN͊%{Oǩg63{Mo^E}NevI;͐D/bgH[[ 'ES˔F7®bCyxEx %/ -~b>RWx.6 %k*\[:BGnbOSE,LC q/_NpCUdh9xr6MzyfN1 G]!:{K*U[E;8pEvH<]K2e{~m矛x$}ttKNw$U]&9SCX6`oUNBzdf+IPVQ=UՠRlPl2-8]ɠ@z6WwQ{.4ڻG4=eÃ&Dq{eўe:#A?X*ɳĴ.Ѻ oBSO_Usbq7/bh=XHSM#\cg*Tt|=I-*VI_d+8%?qO֏a K.QlOe OM!z'T@O04r*揱<\y;GZ쵸Ki8$-10Nr'xhC;aQm-MXK {%LõFܥ +Úrq/#ΧҵRbRhp.b?1$c!z2|@lGY_3PAk)en\\sðq=j+QIXZ=-,JU , f_= vzظ0aY>ma1X,ך9scb_+am:(@c\T`(#IޓUF*O TXA^>"4[a +zaÅ}0a޻Qqa̕^X~C5Ha0GE=fqVbrZoa_?193V/4oБ?DpD,tk؂Y\`Vǫ)bd3u鼄:ib_8Ak([+#k{|9SIEKTŸ43*S4樃*0dJd٭'@jD;acWp uHg Y!IY;X W͓ڔT~7}g=,F}fQ;`?RQtF㹗j+BHoy_qEZt". NAzP'7FR,rNy.C +0 $01mCp|O]ݜ?$&$aR]:x}-[g>ʈYmrZF*kɭ؃r~R?Oպg((숯ː:%V9MzZWy( KAweGÊo9eAo_'E(C% [5y *UڦZ":uS;08_Iۤy$wF3dž-mၝ=lOWeDA HP]XvK7vB|~NM7<M߫] =Иxq닋7~kcCňnħNR^y,Ny]xbi.>}FT=^v)'Lj 09$/2APqE9{ՍZOZ?K6GvuY+eȎ3+Zc:zP E a m|$q/_2,R7SQH0fcraDY؍ծӰ>kM‹Q+ >j_r}Ҏǻ<@nqR-)>opEt"}4='vd@ Obe;.jGvFL0r{yAf8;y O±Tfa3$6EΉiɹ|<" 0j8s\5slQ. Ꮇih%ȂsweaV0Fas:l+kB%3axN/v`Cfr62!v'Im|u\/(KwZw4AF`\p`prZDjcPMPd׵ $K.m≓k} 9YR$$e^x' e"k ƅ >ӣ]傮 ,iKGO[Z!v&2-+C^"ЬW"*,d!bn͔K lw\;<^2&ez> p@,GyO'`Ń[)aQV7A߫U U OĹA'"ת.rS_RV'ii-ѻl1Mi#s; q/UpP(JDZ[/,cM`$(ɅM|2SZR1+w;BxE)]5 qǥMde}eޅ&4#Xq͚ f{;L)6^ؑdaSޞsA>w링!"3^ѳCC|EM Ffv"EW%qK~ز=ݖyl14Pm|•p4M$+ ִ5[a?}81i&%N4a%PWxVs gܝkJK=w4PK3r:.Xワ}2$jCx0 \oևacUI]2+Ze۸56zP]G\3X`i&ʊcON\oAV֬G)kޝ6䨭c0*!"i=?#o0z>&v""lcT_ `rZO F/BnwYECѯ |zSUǤDe'Y)REhBy Y =fP} 6`|EyIE `㼉 80 :v[6W/^MpQP+Gg*xHB(G,ν5/?x>L( 9R3Jy/2 ۠q8fঌ@HǺI|rYM]sy1<%K IobUՈ~QͿ^drת|· .淚^Gi{:=#Gi1 b4%*y +pK}g^;j.:{!u=A <m5+`{s_YKуMG77a;w߸sض2z|i|~2 imɊ3RD3% ehV+oUu?P_-:9RY^7wc}Nl[$Ǡ UDi^,r{b5""=-=kS0.N?l|( @2z-GЭs}uZ}tqv+~=/V햎zsQY[+д=)POE9w ơґJ(~(Di;@`C%0gLQf<4ֻNj R\Y/ sN^Ms::boU~2[I6ƝKV<"⭸@ W5Z T-FUU%ap(A\q v- #18N;;0gNw00#X3S=s`H!ׄaw}Z.k %A&ԉ]a7T\Eޢ?y: g|E8kjґ,|n7ѥqˣAWT*SR6#c P%?+cϖ03oN;: 6\p]ko'b =>k8{сQE2"팵sюV i[Z۶q Ky5D4^΢*_3M5ǝh374u<ҍV`4{}%6lVclV3YiB}iLU ZmMVѮׁHPw^3Т:-_] 07(hh=+)T) dw19_2$eBFM&@PbmWg7$ o:=.jHY&CuL V?BfhYȩo!'~K^iKD J"Y"rO20k> 9U$+-?y 07b9c/7nXz<;n'eoc5 ,c\aNPC\+1re&K.)udiT*M֜'[hRZBKQuf.{ꉒ̀:zL6.Q܌ *9y_c GYZWjO x\ZM 6Hz{R?k-7]Co{iCuD|YL .Sv`n f SY)ʖ%s-&s:xIT'Znkhh?%bysZRi̾cz":kvUĀ?-cOdmאl5l#Ub^v ~Oa/y|NkךQ|2}Ð 2 YՏj/1MLT3 E*-Z;0+(p Uȋ'~5[|gp$a'f;.fm/5>/RʖHqɯV f}B̡$C\6h'%ݣ<9%[؏1G#1e8(y[A3_ KWeגn=>\o̕>̴̜N4ҼSxI$s,jP.@ql3fuBZMQ? ֟P=j $\IIa"6vd0El;;gk1;`_^W-9_E+DXl5] Ȇ5Zd?\&H_9{0qܺJ[ĭy3I ?G,l~3SiУq442d?BA^sW. ~I/N9t:@@=SS3|.8*տ Y;K+1wfkD@źW)0vnʾ/R;Eb<«y䈑3`W?]ҋh8Tv!^ /^t]j˒~Qb#Pmsݒ E,1b 3SxRv1d U8=.hQ_<PO 27\,?AO ӑ["/X#1Ã~. /+bQ,I9 m< K⇛Dz v E3?44)\a$s= iQá/x )#J[â Ќ%Į^q%}2a]Նkg ̾fRZx0а(yl.yYXilcxYk&!y2A/&)"ʓnH@5o:`B$-M-"b$vLQ^uZ4) A}Ai̊aT5D/DK8IM~C E/O|ML"#5p4EEEUjؘ.T\÷nD3LsR`l5v6Պ8 4a((f$3#e@J6.O`ߙz:,aX.EPۡrmk_]OGQk/G=>7ԥGwt0Dq@wzz0/|I?ZߕRȷ8\ўn*{xNNvz>5zTUy8>Lp5.Sj@ءn؀}3pg9*~6@3puXljQjhb)OF kH]dhj9tjn7#RW<=WkNVԖᾨ;wNUbypW8aah]A8ԟ6VBE\Y,u H7T}߶~PofU%!&4I^R{C="z;td^kF)$O,]%Ϝ0KVZHvQ ,qE'îǝ"NjgCֵ13XsHWN &t9*.0¦͍o&_ q8SӒA'}yȯwlZ~{˓bc62H 62kJCp͋lz&J޹7Ul6]47@]nWamŘ;6{6 Wٟ)D߳yܦho[2 л0DɈw4b=[ 8dx輘$q%o9 (#\K$8$*lisXih# !q\gk̢<Ԝu}2!e|4_qG adN#F _l4a[wҙΐ+Dž S KneB)C=KCҡ( {2-Ճ8=]${î"#c)F 1CͪrȚ`%2 >lvA;'R8b;:ι\Ds%>H 3dqC=1UL冾力jAG$fK쒫And=o+;=[>|TNNQ qfbP!Ԩ@m󞠔U%mY,XrL'aJWP&K썡h=6KmߵVzeW"¸dGd;Ag+ǒKuS:tӊC,l38wZ5D])g'nC$o WyoCNI15A|4Z^ Hv=E [~@-C<_Já qFwx`8ݕ ( HN_b_A X_wĆSݫC=rEؘbH#N B&o'Alkǡi{2bЗ/Ԩ=4 -d)@~'%HIU{Uiݝ=n,Lw071jALB|a1UvˑGdA~>X\R!oo@8/ '^b>KG&_T99>N8T*RjQ@jS ~Sgk-A7D뻷#E͜_&uZX1Gm1N_VH?|U0:b-{Zԩfyqs}Պm2šu MW;f/vHDSl?ĥ.B66YXf ؗ%/_b\8&ʢ{.!s w(1a%(`fϸ65l֑;?1y}_D/X)x}ݹR?hW׊wYؿog݃ )2k]7¹< 0:iO}Q1 (b$@34FzT(&ty8|c !Yމvðm Ձn&,³kqpOVГ`Mz ҈QG(zmwtܰ$uV7 ;[;dK o|/ɽW[s`obY>\LNjP\գJ.Ks-xˑYn/t2mZ:^Մ ML$ @יUY R0ܹP^9?pcyWY|]#J$i27%Jr*ucv5 man3#}Xlwh Ȇ:QT7ʐ5\:x{PSz'J Qt 798nwNbd4)|ZHĩCz C%zZsfɥGI*EBd= 5w[p>f=Sc)LߟFsoIܨ`,S6'bJ04E!'/|([seЅ 4媐*D,BoʔtեmHD"b@$Va0VƘ|׾DAn?dI.{΅ TL(%=ER) qƝH-D$MZ7GQ <ڊU?/>QGCN@"Jl^1ɦRq}Qھ]mt}Slj>*Db;[Y,.aw=!-Ht.Lag˙!sطo@Bl%A"=1S;5&0ۛ."2A#oOпDBvirXPew*7@%Ԏin>1ۙ>-LgC,g9+5 ]k1 3[4QcHOǽ(%c go'I76tJ$8@S%0iCNy$]QAy$|8Nb(`[l:< J퐋9/L  ֕7 KBԟ~(2cq6˻H|8ӶC`T\V'$a8 Idi"N :8P An]ggIՍ,|3K!4LȌ=LLzٌKc,Ư8gZHk'w*Un>'_%gcz+&mQ^!*FSgc\1]yzmj3<{:cw 4Qd&S?F!.? SA [OdxK>N_yDГťAZiBi6쐎*}y"k4`w=>?`鹿j2?AQ+#l ڃ4|zzfeY gMfܕ9ȘMoJIC+FvG~U*tvU"z'cJxjjT}Ӛma"$S F'e(2/\j(42DV[;-& d8< ̽x`"õ%:?ʅ]4DI23&&t?&"`lɣ&Auq`VRmuc9+ .bxb$2ZZsX7# n(/B;%G#jE|Bճj{s=Ҝ'>71\=3B ľ#t3Ip,7V!GI¾v4LTM~|Ϥ)cwcDs8+qY-\(u?+z^~$yEjBMmM-jڈ=1 vftsч|8C?-9+@:Fy[vGĎ2]:*KC?!BXj&c}|N>(Z44&s =UA ZB/KmVbZnʝ0Kl^.4#B yN(H2?7$BUὰ-zmWOR;k.tŃ2j- endstream endobj 697 0 obj << /Length1 1358 /Length2 5919 /Length3 0 /Length 6855 /Filter /FlateDecode >> stream xڍWT} F%1L`cni AZ)R i) $}s| ej!t QHid.$@ j Rah8hCiA03#$%`eD+ p@P5(<!d eE~Խ`h8A00/BF(`a?B(c0(qq???1"(c0.ݘ5`#@b h CaCz bW 83 Ez <p{&:bFA2x _L0]8n;(=u(+ aM U V GjB0=,"en0 @`.+% @!QWB +4Q8pG'aͣ8<0Ɂ-$ۨ n* $ *JH`$@pgS*@!\?}ھ_31X@oۃAP .E?`==k~'!`I`?Mm`jscS8p>:p/y0S CG`ԃ! F ?Sj#H_쒐@hbM&`!\h_<> Ţ^(KHשZzZyw rtE~tqO_ FOМ&Z%؇:NrS`D_{}r9~0uVdIDѤBO'/-u҃˃c|kW,3'Y^ J{ ׿(2',H*Jݝ_}mq1Ix֓UNд}:ה\b- yz#G]kf&w⑕j3{Dam#d$p)^-;[!yI;m2N<1IK oT BK,blbxSef:G5{؊j ?ҥ -xW:Kbra#՝P8.hu26vafs䜬=]ʹJD|eudB$4ky&@Wj.$); {0-*́YJY1(}7vW+Fc߱vpK`}uF{+ff&$_~뫂I|5p#f&(,+>m|>$F77NAlDknf;8H U 2)˗yAйNF(Ys&:zŅMY EI\lgS>o*lnL^f%SùDoTZ" z!d&5h&S]Hژ +,ӣ޽bk5!/m;mA#2Iaط7jhQ\8NJn)'wD2r߁ywFYxՒmA?u:v}ciLUnNuvYBF]zC0N<%$=7D^NZLyX|!% ~Տ[Uɸ8$&wdINGd_ޛ'SIqdzP 2P`^\浪jf>n(wt5>C9YϜ78㳲}ZK2F2ϸ[LL2z N4T4<Go_RwsD^~7骝&}7@^tpbT\#sim3s\h<= " #& &>'tC$Ie<)j?ᚈLC VO7̪~3+s!?(q{JT&m7iw_ JMoVcv'"Ԍ @ŝ2#xΐA]>Ab,&}|Yy-ha'HH>P5aֲbO6?y̅eNpgA3+$JWG qJqZ:ɷ!Td~!c7dN1r]aNe:-ݳ*8\2WaJ^ro{3K~;ͷwjʳ6~cp3oYשڠu|lȌ޿l2O|idUh"\ި#tſj[芠$}rQwʒUy%b>NJK&y778t#/nD͍)j%\J˦^9oa6UBy M lAGYoJY56-5pR~˺CksvIѮCޢGb0G;f[';]hBc BMt6_oCLƏGG4h=HGDtGDF;*RfU61y86*|iQgbW%s>ü3}Ltƫ'S<[#mUR1~y BJ{5?{%ao9>-.YQ?Ud )]^r'4)/75Ƨ]L8) )Un ZԌ);ܢ3j^ݿGz)G d @JA&{\.d6ln˂9e.d*F1]-luO>~}U}@3bBcQ: Z?jR'8{Z}"6˒uNrɈd];@ ,wJ<G-Y93g^~^DYJG%ݥZwڐH'_$ˉ&s;IJÑZ[Tċ̋oޯ6vn+N ]k:}\Q]1a\!k<:tcCG^g5VRD"j~o<н{#9+䐕ԏx}g[ڰ}`Ŋˑo`~{n2'&HН&Ně4^5x]zmr!%UGMZm1 bD@صzm>PG/ oX=ge>9h)8F{r =C\Fז!1(8+&بjXقO'_6 }+>!{R8 ds iQ#H3nϤkJ?A;ݓ9HU8Z:~cdBj(7߿ oyuJ:hBk^A>SgÃs7YRtdiTAz"='ԍmr@>2XggX#$˺/_م} xbnBLz -J͝ (^l'4"eaY̌4-_UNLBIj5=̓u*i=!!=UIMRg&/x8/>l|Q[ã6}(Xd7KvEO}:)%>qEg35ñ'bN[i\|YZbK/=v1Rgwێ>|:4 uZiFtyۺ4ӝ1ݾz.k)qE06D]7H_]$9bM92!2 Rz{91g߮SduֹU#BcfSZ@Ho 8a 巿Z_3L endstream endobj 699 0 obj << /Length1 1471 /Length2 6724 /Length3 0 /Length 7718 /Filter /FlateDecode >> stream xڍtTk/%tR=tJ400C "% HIJK(ߨ=;kݻf<ٿ5u`8 Ȫi?s21BPID^ B 19iT\ ?($ , Aj8 $ wt"`dED9K B؂7Z%WVq[Qݝ wy p l` \:0n\&-F$Xa.HW p14 7py vYZA0O`  'e 7 @NPU3W#ìd`W~rg%=y~wy9[C`VֿJruуA\rY !00 +,`K[_u=adގpG5/vgWV[VKl ;C<ƼH~Lܲàn.V=\B.>A^W <;&W*ì?"_? }ֿ Xp$cn+ki_Q|\Z_C r@=#@r_ >W5῵ra6п[iB5`P wZ(. /Sei\.H>VC+ap_'(9;7N>M*L9NO5Hݻ=j{Bf66ݿ.֋2 ,bʵȜ`Dp`zLNgѩsEz\L{-VtP2RQР3{lVy8]R<2M:nzmk;4cfeA'UZnVJp(O}"$Q3% 3AQ١m'ė}zTL5gG&Uҝj*Ͼhse%~)T>do+ONT~b`ӵ/5%"@{M3ÅCi9RG[O2ZBԣ?=a8V$6JHZ31V66AI.9 KA lPQ_ڻ*u{x4jn%Lm=9'Zy^1#2Dq*+\o^ (7;(~>WՋW%uAFJC\Kٜ NzY5oڝCBX\sݮ[;tK2&—eD>7a)<AUmvwq%55v< ΦVUa#DlhuoᡒqIM6ЦQEQ{r*D(?K{-纹º?H("`r,SSYy K\;WlcOh"w^{u‹ g+K[l,@+n}F ǹI[oӿ8έ!~{`UcG!@f\sa6e /5B[ޣXyv#9 6tV u=ts(P&Z =F J/#|3p%09#u©Kю.BN\XHnr{b}G.uS0һ3Ή73?cb<;ʳ1=m2{Uʛmz[!6@v}mUKB1q&p s82 ڥS֟j:EđvwcE-{0ya =^HX=:t&T ,- ~#lr'*Wav"uD~yyR|Au +C֋9-yWk&۬ ب2Y- (]QMGʕhlQ( s*EߩiIYLO&eC6_' (Q>ƠC_WlOc+%{[ƶlìx@WLJ05ȹҷ`cJ 46޿˾0` )ԱVO"Iv2ƩbA[8Aiou t c  ؂@;ͅKx -HPJ;Mh'0s1O*;T:$e:>[!/tz΢}) 6P@5 8 #ISC#n!RgN"< |+3+)͸=z3uOlMWǮ4 l/t9U x^p:B7uV\()jOGËqFk{r2N,${~Ϛeե@=U7O1ԴA'iEYðbm 7b#&q_NrzHܠ?+-#H)JRc(.EtqrO1sg3lr߲RANWi%V:Ei[F[ InЦ'곐JO5 }9/ܙ/T,ΖGP^i1ϔ4wL64kSX3O̩<p;2ao3bJA"<+RD2=3[?5:e9.;l{EK I&QYu)躖V;NY 涀3И::n}dfˌ=ʇC):e0CG^{TIoel S~v0ږks%i 0ٙ*V-qWT^[6l>)N8fg`G ɬ >ffxqP+JU%Oьuѕer- ? WϢfzJ8%r<{:|4<>2#Қu8 ݋U5k =A+懲 Oe#Ri%ęqؤ+P;4˔NmgIced)aZ]2`oTz ߢ }wt1kf+T~ GZ_5 ۃyA {̼?F)> ͫ5~6u!-41'QXw{'hn4zX2>h @m&Mj탷*Øfz/cҸu[Bɧw!2yw| ,=˨Tgq(~?oђsږ3[[eUAdϫvm1)G:.1cXveL3W]N*ՙq5/ :?Qn`) |H'DF/l|:c-L$HoE>!thyBF䁐j3`;بR_20Fg8 7 ؊tw)DlxD T'=Z SXKGLrG1d!Mabv/KwY/Dj]['ƾ1Fa)qzqnŒ_z0 'gi.ayprjZ~A{m*п(" k/m[BhXe?So*AlZb ETZD ajqP,xW4B՝]eI JW{!^fPR(9IpKMVuKVdxW::`0:g.]sdnT}\J;afmLR*_\FX=SΡZ xY(V@d Wŷzw:UA"Y,i QFW[;1.lKOeCY(4'Zޕ:UY Q#GƲ50H"_ y>Nya7n`Xs&TnҢ0 Ѫ'% Xg7 wU[S$k(Γt  D(h`Eg!ɶV;C̀_ɤ))EDg%Ԇ _Z rkc3/%+< ~B5P_ԥ_qϭ+Qwaid5Pe+;MLѢl ys?n5uuXݩdB}0&Cp "*,xLRvZQgu>9ٻc2˵6\VZ>u]`Zޗ$w?Lr&^]L]!2Hɻ|30H>6xLU}8MlRcJ|\ }]2c"<;/}SB혋cPpåKIyV{;Ȱq̒ R.5א=qY}PC"V Ф7Qݳ6 Cm^6sqGsSw\^2$cy(?H`yR ,l”THGܞgTh4)]YsyPp i4V8Og١z;V'ZhfQ nvu;RVs4 ZaDDIu\IڗOlv贱P+gjofJﲵ h^UL+Ώ=^}G;.:PyZ.Z9jڸR"*$L8!4cC $&63p L{M*y4QZrj}@1 VN?n@b? ޚĿAB .+L'%.qh:+> stream xڍTZ6L# 0twww4 1 !4JtIwwH -z{oZ3g?yYCO&eC06.vNa^sn X?2P% =Aew'_K@)/CT k!`:  =eh`rBA֖`% aQsdtvc@ęX =@zm[:4ƎNе@laP pYnO`  p2Vˀh\\w 5 lAN@*; 6tr<[zX, n X>wwnP ̍ Ca,8;07ɂ@맩{sVG0݂ T B7f899@Wڞwp]o%o~_ ?f@TYV@;џ`_CA^'q89>qv0S6RQf?*iiG <;%*8*iJ*g{1KX iL?.BG鏖t9y;j uUڀܝW|)?CɃ6 _T `N 0Pظ89GU֎OOK)B-џIr= `Ԟ?E}|kS'/W <[;߀T?S5n@}BCxBճ;84 h0  q i"d6Hcb]BMf Z^I%t,c\{T%Q<^{b}~ױC^ 4r6]_~MXo<{j{?- nkT`dы~Xf1# ܯBel{UC\wE1$dl=Ӽ49dnη-*4amo)8FgESf{s LAf]‘~@/TP<2UFGkK?1>%T&J5i"佳";Kkb$/h9u3U2-ipUdb5q )-ַ>N1$w+V=Qׇ؅$Ou'HRrImqg̐Kc5nנ͵=T(ΐ>b?|3M!lK,$vR <4leڇ;>nA[gQd z[Dzb1X}4;[=/Ky ܍%U]T :lZ_?%ٮ@CZ!ykEvگ3EzJ [se(wkSZr;։_y*{i\Um3p >4Tl l$Z-pKY>gfۚ\Ufw?Yt6],vS7y`vKM;8Tk[:Mbنx&SGyZhfM cL2Ķ_":~Asŗ}{[%.B=$ ?`g埧Qtsz>YS=ellE3wohbCcVU ]wF >IysW۲Ji8XM,m'=p{M?. ɒyBØnYOM yCj>`Aq/\d!gvv(׫PVT()0L.ٍeVrnʨ//D<(e'lX) *o$ fq/({wG$գ8ijUK23(#KSɨc^FE>'š G"΅: R%{$%QX/v ǐh lq5Bs 6T˺:lḨxǛws֊X=ڻCYgM.i a.bsu1Y& U"wHҹJya]@ c0;ѥq_TD?'7wkM׫[&ynh蹤 8)<h$d#*d6f;UUɓGVׂFwȜ(YK4TjdheՍ~k/%m>("EzǺK?QŌB2l5[zX/}YNM`Z4x#^Y,mذ̋"[OSÖews*HkEZxW[/^p^漮}3ҡaWH $TZfh)mM'՜6_0<6z xf[=FahڪSU}-^W[%Nv݁վ fŏ]C~&hh'c*hNtB oos؁ƦmƓIdkľc%p*a"5ޒ!j5XZ!)GwG~xXVܯ Lݑ|SSHtF8: s7פ j^, lt߰g}u,!}Ē>%IޥyS/H]A/&J#e-Gqw+EΞ /2+2E~]QTv+I|M /& J>5 ](R}׌Am4-,7Ӫ6o'Qj.Iku^nnWcWqBQC$< Gx!o#_?>g+I1^ O` DBM%f>E=S3:3(UtZ[ !/E/o+'(W03z\6K83ixUr-Z!E*D& K:A'`ha\U"wW>QH]¨EO~ʔUCH MncOަ̚qR3 &%B̙0x>H~:(o>* 3l1=]rѯfь# n>;dۍ,mZV.}2L0ѵl7<{$C$A# ]=[K<]X0"=ܹ-tq}(rl!syFac-yWQebde/!07zjǶ"tBHdП-PjGԜfze$e;{:o淆0w QvԢh939ۣ5isAW TLZ"p;jG=9| ׫ ÕxDxc6.Xw#:w.h=iq 8zkPULwJ@wVmT&^r ޝ%<^bM_ZCX*V*W~!Ε|Cۓ 3/1^&Y41.cSGc` y\𭥳kּSzu6zC&KĞ7'yZi|`٦KRL(Ѐhf%pJeٮR+^1 -̪5x֑܋3pB fDFIGc[T& ^! s>*Q$ I̢/㙻2B )~l\n/ )yKcPseSt ( WT—\)}B Vuv54u Il`$=<j#:qщF)픩uFBZjOT#}3˾òKkq\\RbiQġ7jANՐg|Ќs!e2c TA+n6N _iΪقV }z6gU2Y6Q9N($Irؔ> @UϽ~mLGn m`=m 1[܈;ė^aVҚ6 &cY:|M3Bߑ%4͟A <Ģ/u<QZ_Xp㫝fԒ+7to>1H@n+1+#3p!R\n,ϛ{&"9 kP[oR }G-̂ h7Bp{ |vO&')μGp*NJ&KAhnRO˩^Cy5Y90!є©/Б6M%DWeƹSJy p3#)#Ց9`G%q@$Dy {hvޭv'贇 g/B{ 07ra>Y P.͔qxnhfn'إjpkJFkV3^!LSS)kgn<#n(|e5R'd XP#e= +PitIi Kn"ǁ< ;L"wbJjv39%a;j>l˪gg¨Z[%#\&Cunpkbژt%9w! [/g-ƨZB/닙N {~@|1 $/^4.OKЎ(DJG b{•v\yp^/@y/<|+7 Zt6u+Eݛo{`ޔEHy-lVUd^\7։XhQ*yCFxr4MOeV,(HT}tEz}%"b "WNxVVtd c''USa+%QI|.{n|NI n(߽_ X1j-wUZӲj\@_&x2;#}{ܾfzxBj}[Wq"Y*cY'ݦvO\TiB4T{ wVC)σT& tơsĜCvٻIdG%y@\(Ac !Ǯw&ڃg 3=f#$_a_g%T3hh[UP%o|!~ۃW-dӄ$e5B& 6qC9,Pz|r;O9H`z$M_2K8ϙ zXۻ ]C"KUR\H/7"_OR@J}w}d+2V-稿kw*%Anud$N[23z(LzkJ|R/xYIJth.J/̲=&n/πp|=;.SQjt$UrMwa7yč٨ #;Y ,},(,\=+F/z -kiB\ʮKo![e%| Ѱ(tOfB?ĩ [﫮;Na vO\0ufB+9;w bֳC_ ?GYh`jQMk$ɲu{jP2q4R7w<Sm)Ot[dݛŊL^*S/C9)Uߙ@ie|gAb`{ x.quTxy<+Ak: ϒ4TL:^ԭvbBZk jVfy,ߩ0c;l 7Tƫtnxh]ѨJ?agH%nuY4qWD.KahJ0٤j<,2tmR'r@a/]Ƚ!|.ݏ`;\<-Gwy+gXv4g#O5JB + ڵ]8+1jн4uEY-p,OkqG{8W NAjͥBbAy i%l-d9. endstream endobj 703 0 obj << /Length1 1824 /Length2 12141 /Length3 0 /Length 13282 /Filter /FlateDecode >> stream xڍP\ր%i-wqw';=C {p_߫j7|9Ƃ$URe55J822U?XXؙXX))@V)5` ߿,@C7㛡 ࣓`ca- a 23>)m 3sǷPo*=ſ_\{nU\NVhG~^j̘EsMwPz2roK;x>q(XE(pLءpqqZZ;Ley  q=}ʼnV(@ rD,e? @;u čԍvQxphd, =t]`SN$մrT0fږrt$',^xhU'uD U\0ML Z1ts(.@OŀwVu^[F jڷ@TG32S!WH[j![OmX1K~M/&U`觋x`0boݫob8I[3mk+p2x)]y}~m]t ٩ ABNG Bz~\;\c6+ m4ź>p8 حdIQ!3ͬjA.e[.q#2N.[S O|S]ROl3. H`Wh-$mq=W=(Ybj* j#;Å^RN=8Q3߆+qvS)[@Eގ!o—@Ml0(ɺѼIv_L=na>v&a'w5'@aCσU5B5;g=mk|<͸Ga86߬~p/@(ɛ7JB~<!5êonC3)nhj|zܹ{@Mo@.zy礱sM(\ ͏B궶 ⮕4 O^+lvlC&("[X~e&z)=8&<\R/m^}3-૚: :H_71~ o(Z eV!8HVig2 OO$ryW6ܶX,W:ϵyQ@_tܰ䨣,U@mT=K<_8,lѦ p*i1e(9$/7'+Eo:;bq_ >́oo9d &)yB`DОT&>jf5x[k#= 冠͘伍a6OE_Z{lM+stt$6)&dNဦO>/Љb{J+zJOU k~4ʑSBfgUp2Vj4e*[<&M~} .`Ǹa{^;ܢԨ_wh=͒@R&:Dؤ^,JWߜ.{g2DZ\JIμFm[B&0ǐIZ8{--&j:R^\Fˊ>H"V?ckSo_]pР=J ѫ:]O'Z`m&0KPBo^RD>w*:[0x]VzZ.em^wV0qs!#yIN}I9Aq<b\Ɲkdj_6l9šF5$bl.͎ O1ߐŸGpF}t'O?Xj?exvgC5f~:yfxнDWXVp*rEk"UDUTNN|ɦ0w½|4:1R}[/ 39 3JD3 Ԋ1v+5*߶:.\eZܾn$6 hoƕ LY=g@bW/UKS&qtf ]#vX$[ V{]؂]lb6J\doYEFZ1m{rQЪ݆t^\Ok!("s!/7J_*/Չߧ::eԴJϭ컝oo(ghRQֽ͊rrO9V G %;]}ط1p'<ƍ"N wD Gɼշrm":mu*/2<6<,%PmzpX'ktO 5Ăk`QDzlJ@w `E>>;;:ylix|b`K"rdC :U!9кt"7LFKq[զA0Psrq{+'l\BwԐ=C~ bf,XI6܂ڲeo5 ?Pw<\;-10Tnɗx,Na5R^<(or׶|lHrC~Cf06_d'""ʬ˄>=Lg68^뾓{xiZa~׉vNdm-2=vFm2"  O@CZ؁=}8FlpJ7hU {IW`LN@v9#j+6zyE.$o+ӷ񤵝>sF1ʩfR3~ Bq< ջx>$W^Wz)?x&Żw԰#1 QD'm,;J`GƂ|iٟe`!<!D`鸒Y93Izv}Nu6~.Š!OkP>3}m Ɲ/jQ Qkb ShAvrT/Tyږ)/ƹ5~ sk xJV!9rzbɌ*` ڡ0å+umҳ_STSg]"j%fYȻ}ʬ*mJ#:C7F'J4ڸ0R ^r߾du!ee Ƭcmje碌дb/[>݆9q6BOA>b e`8=?v8Al@u2e-!?qg2>I>{i=\U=xaE(dWuHsD YC{N^"(EGjU*]yКWX?91k6 ^w +ѱ.UlO3. +^lnB'k|.%Sc]N)!~*sɃnYLO'y n.T WG\q%x>]Yy j^Mߊ/ GỸ N*IόObD7'jmLjW̹Mh!{@Ǝ} GN#6Wcb.SC0ߑMzhwh;4>fJ#T!4Z|WN)cF#ay,vE&;h".^>l(lFRt;n=KHM>oƸL<0a_{nQeHGf~}!CVhzG0H(E^R ND0Q4bxULl܉;$c\(R߄F,K%сv4bx] ]g l2:6mְWh΀fd;j~1kY/`WW1-R9Ftf}7r7bs=n#Z;HYOudOI"Έ[;:S3p1Wn5BZBy"򀐲WH6DCj\4:^ Dy'hw1M7~-6 FʕvIS/^¤;-Yܤ8GJXNϡ>E!ʖ{  cj8]Xh$$e&ͱ}Y̰xP~;?$2E X_! /,x*È&:5 @.}+ȷoJ ۩Q'ew},Rb7uz"3]{ ױwsOP*"m0Devcl0׍m/ζ,R#,23]\n u4eI r"X 5ú/ir?"u@ q]_ ֠8 U&GcGS)D\y%]Db3餄Ys򹪼%4a(ˊޫFb7[)<s&J.K^ lX2\G0c2jPC؇M/byEMvwp[)3J2"ϭHIB)C ߯Dq`'yHҔJ猃w`:LS"A ̖fv aR^?W%`d 2]Ukge"?߇a+ c!}TZRn }!\1'wY]㎋u3\bng'^k;D?,SeQjTF߱Xҫ $9~CS{JśIP?H9C9wFh0.Z$u~5I'"MilN@!{,‚g?N.!mAG2PZHet\I4&|. a6dGY;dsXM||XN1нos>(Jd)'}va%a\Wɴ6A' Ѧnfc6I#:rc%_@˜O-z+6_dɊvs[_E",頴SoWcJ#PDJS 巟:emVfjmfM:.L2˒wKHU_r/MWGnŠFB~ڂL4;8 ń;UfT#T>]0 [`DHRyb Ώ,xD{b2ivJ^Ԟ*Bޚ :Vm&+Ph¸8_ЭH ]xwtޑőRe pڰy~4Q* _ ?>׻1tB9xɟ(,LC#ÐCb-GaW#GäI/ gy63FoXZ5{c'!_*o^ޑT,$y;i-' Dde,X<_e+lό}_!4 "?gda۹ˍ`4/Q%m3 3ay[/MZt'ωAVG۟v?s8?g77]KVAa<|OC~CaXlđ\_o+~GDCN)Wu%'i ~d{WۖkQ"$|C_dPmWMeީ\ X}XK vR<۱& mbbBh>j: +^t媍seĐbDltOL`%c2GV'y'0Bq@Jt6`"5,5޳ҹPZ”y׻?(_'{<о\GEt7$c/}%"WB4HOjS~vF=97yx&F˱V}40kX +$(ȮI/*a\l,`2XlH9#mV\?̑\d qmꫜ C3DɮCd^5lIιo=Լ[v܏EsЙS[/V;>|1oohf IOGi|-ZI: \< G]f'ÇB.]N9]#I;܈9 }k!!_7#X2"|y )t ICOQ3hOGF 91lR.q,/+*:>{áPP\IrcT@]hq\B YhvnȪ]#b>9Vk!` -g5^T&#e*[J^ ,8奿r2|iaXT.Ax*?x[xu"hwjO'%]? J`P׸Ax/p;;7(rb{`#ʶ{sEŠ;v&7b;;_!Ni\cX9)><ocU$ & G 4c{؉h۹4n~u(xR*Ι*z*]Y/hw-DCq>Aiڏj bX(s]&>Z}(`JkˠMpsi"|_֎Xh)d~fVoɫvZBа]Á^()XbfOÚ r蝂 31s7(jӧR 6byNM2&Դ?S֎2w~B<-ډ@|-FԍZzuzjKzq:] &~WPzR`c .EƌA~a9hÆXMnb.nҏ,4uT. H γ[j6Au<-C'^CF|/| *JF٥aK_I7'}g\^AT/YͲϼWeVfw. L8  Px5̶|ωv"rxߛ8;>drè#hD\(p[K&RJj I<euCs-V~ /JSaR3DÒeBV[9/`4B@ӶJAVϐgYQf_K{5xi3x֟#')1`&&VU^fƁrQ箧⁙*~˂X22fG6؟l*c14mdY S Kd~l[3ҳib 3[ &[#|vqTՕxm$wȅ'H_ɤ4`h-zĚc.åC>bl@ݠt3KcT#2Zxbt;4(å.,yFAfU ;H„T͇ 7vFa>Q9(囵Vz@OEٰ8Qah!6c7rq{ok^7pId]<#¿ 1 -4 3R2O^%*N&u,pE(MڔeksIyj<&6jfb:z=--Ҥ9 tC8sW0젅rZ8j(0~OVy4ѫ;=&4./}yixF@y*!(S[ BmŐ%ϫ/7AtuFtO%U괒lg{V: wwWz.:9LeDUz닻T^VT 3tB9 +!;ϧ/Uc>}fr?[LEDmVutIՏ ?f_f|rQkG  2oB;t.(;PֳQ!TIBݲWVެUaqb7c#:~MMm_dY +k)I2ܯ91]rvL)irB] _Bf;˩H3Ӟί0g |R? lB@8Siv[?6G*G67У."y9:yʜlY]B] pRmSà /`{%h40Y sݓԇ]cDma>yPY\B\ @S@?nDQlIAjH!J|K]& 89V'p|:S$}zQ0*8#%pۮ#Z}[K"b sb5XK`t_~VsONHou*X\f)mD mwXXEBڌQi!cK endstream endobj 614 0 obj << /Type /ObjStm /N 100 /First 916 /Length 5167 /Filter /FlateDecode >> stream x\YsG~ǙPwDŽfb(HeQcK"[$dPa|Y $A7VvYGfeuFF5Aƹ&Lq:4A'jMt*jԒl :7:(G1Ԣbtc -1TרP`Rc"ĨIܬP q]QXQ&ǧY *5֨DG=p,j4cR@%atq#@N6$Thrėk!.٬ {@1M!Kӫ@ridxnG`GMA|A|>ZC%$p:!HSk @.<6 끬ib"MaihRP4! =I 4CIЃD=<~&b QM }@8I:cBA(JV~*b`%U+ ~U&1%v j`]+4(B$m mQR@)C4  qHYI#Fv$1e<]>FH^h=I=&Ia !#:D@HU=5D!2i`t.ݽ=hba/_m4%<~?lܽt:^/7$4 1r!S>]n޴<݋5oŃMib\j;+d:=iU@'brAq̷!YwPXc *ӹZ®Lj݇Rnjw?XhuBmvm2O,Dy_}y|2y~dp~P <5-7TPj'd5@1@cBQ(eOƲwV"zzS K| 0Oc^&+08@ۈ e)Rњ ;z8|th#Zk,lBm"<ڸr$f˵1y3YHLhM -'fE>q7#F7e+X4O-ks4hWr*[ْyVr47/++93;dklC @ E`e>}KvtLDrpQd20)kuN @ŠɔE#҉mwB.|o%ԙ;i;cV!X8KقA*jst>qmap3 pps7`ۡQ1Z;@S;l}BRÆ: Ho8\g ]B^Ѳtv֩5G5tZ:97X`86hO'h=#5tb4Í jB5bmtP9wYWaZ2.KȒz"BlZ}{~989j`k7b<NZY[l:.ɏPs%5ٗkhCیkHí Z$њ+Mh]6-!ۈq3Z1|+uzoWo EےDYMҡM2\Fj5M(#B GɱEHJ`Yd@jTJUj=5=PBPrheZi]&ٹһU.ZQ`fEWOo(ߤe@O)n-a],#*u.(c؞ 7#Db>YB@]' uBgaKΨN\U,Gy VY9UWhQ}z@ӘVGrZ6r"cpmE2I"D^%B_>pӑ+/Z.E yjmkx `oTN%E5ˍj!x-ae7.FX<)`D;N)Hf6"8 ^[aw2M$9Z5IH ߓY D$)?ܺ\JEgyD?'TXѲr~B'oI'#^)ٹ=Nb"%SFYK4k#طt6iF~r%"ڸrq}|KvFגҗBrϥP0HY-d,' >OyXP ,r<@Rgrx3pK+IbХ$)H ڴo7RFEe5gVug)rg CZK?AvjHK. \P #TNbXL"YE cSΚ@- JY(LaDa g𚱖SL@WJ~j萌vJ7)˘U)s4" ^T3MJdQr"#t> 69F 5w \L-Q-Z*5OB{+^}UvNvhN%g٫=v;HfXLw 1݆;N lk"۩<kq[w̞%"ֽttʌH)-ū\ŸTd%u.).%r*:*R/'OCWb5zK/_=:gVU<lK\VBBoT: /F.Ȗݙ$R2$[rdDEZ Ջ9xQ %JNjrV$\bvE,a9 ,bZ|j&|r זr^3ӧcaL;[c O(R_RsaQyejeA !y9,^M0/#0Qɖ̡F~EQf~KO/(78bߔj9O˽yjiIq1tdT/qrZ [sO';ÞMk2_!Ayp~x|:l0ӟ/ץc &}_^w{=~tO݋Gtîn؍nܝwnͺ_e ϟ,|%^~Dz |(2ݎ A"%xR?gǾ{?ɜB6gó!6b|ӣ?1Z#uT)Qga0_A~"L4O8?BFR(r\bFt 1a.hVoVXIzV~߳gy}daR 71͝dGea{ ϱʚ݆ϟ=y.:b" լ{|.S^b߭<y~Cns$![uVUQJW3jug˛wr7Ng|x[?{vA=<Ǔh8= _+7n>q78= lu~|=)ӵ*g}ɚ*ڍ+i3vGwl_  |nOkYG {W.uկOx ئXӷ$׊+d`y!3nF+Zݖ"P}Mwf~\y+œ/)SsWy>(/G[=?0'C@X21^bwShtpv$d898}??0a?gG$a*]f>sW9.?z7b; < K48}t"գ??~DjX\Kt%DFKHnl<l5<+QQ /1Xb+j bGWQy sXlZEuK n𫒩8j+7O"?k/r#Μ/$ʞ$+EǪPn?gZ` endstream endobj 705 0 obj << /Length1 2351 /Length2 15245 /Length3 0 /Length 16632 /Filter /FlateDecode >> stream xڍveT\[.ݥpwݫpw !Xpw :}ON~QcTշkι75: $&PTW`gqq RSkXفH@.֎Бp>UrvvN;;]L=EZ L2ك\MnV {pDsS;5\нrss`ed1weqtgxZY@ W%S{ű R4]-Rwp4uv W*@VV?YvY;`am(K)y1L)ڹ:M=LL J % 0 ]]\Y\/7`% 7WĿ`23:8z:@J;j:X;d?G |fcc_,2b+_Bu:9:,-@D_WSO#Dvv `v@| 7w@ ܄>3.U[NMJR;z|9v^?Z':X8/?@9/%Gpt݀25_^?$ng/ Q4Lnaw78(:j=Ŋ ʺB,\<>vṶ&>k@*3;gN\/C .l~@9؁,Sb<`NUR8ٹILhn fo7V7+?n \? >zILϟ|@._̘ۿv8xkד#./8 ԇv׊y2Ѽ{s'BeW·-#*K2f%\ H$i/ %Ex^Inm0)?#H9yŝ.z#NɽCge8"Ҋ/Uq) ͍t` @i~Cj>UՅi20(0.VaF[+=h%/ TOxt?% *nG4? [8eC'O9PLwA'V2}ryNFyfe0gzgM(abREH,iGOZɄܽ%K$7}OvBE!U ĄoDT G)ClI) }N6S]/3z} Ie:>ӍbUTBbSK? I/gAU=8ևM;'gC2~mz}obtޝ0H"30UZ%}lBKNHɏI6yeOJ܏IgR5(M,3X(k+ 25u037F~lGGCEQ@$`c݈Ix"kϔKx'9L-(roj,cԯ̊{"Ec+7 tMj|VA}55 կݡ3 ݩ, %HYA6g%eoJ]mğE_FƺRf@Xtُ[ŠO#5BȈTL2V \u,ROTC :\V#̅I:f?н٫nTREKe%Ǩ|>ʲZzA/"e kqZteU PKƕlRhJx E5\饢K+kP߱SłH麝6OVt_75ng*udxd}bE06Gp* 㒇aƒ f$ ~yyܖJ&ݗ8K2ҝu+9)F-g? [%OO^ӤOM>\p/ 0ߏmMHl3qqxӞWl<Ա"_hMߗ탑uFua- AY_? ٨9˄c QUl_2iGeM/i0T%*e=6)X 5!:сIy>,0FnM\u]d;! h)'\,g%U͋Ԓ<%U0B:qtZ'7as1#h~x$MMh.ES+CŜ"BjDղnU$0RĞA"`*6נ3%(Yهq:6i>}qgD"b8O2dGyc[s翉d3puL`]uysοGl"^4{6XUl#"'5%y Ee3{,.TȺ5V67S6Q&OViп5t'~o;rCf`n?noj^h 4,5[îs3ʐעr4!XB?4c|dz쫊Fi+)b+_itT5GQ.j|5*+8S18Ge2W 8L.Gfl&ڀF;va9*lB".<bտ<׈bp ~j~vA2P}h^9+ҐU#8R~<|Hg^J\ؕHDCrfj/W{W.HP}aـ%7[i :wāoou T~WfEث&R/KG=n*}k2;M_<451S)[DcTdc.z&%|1/ISܷ}+#cgZ6ԛuĽID 9xir ,25`w\d6+T<,+!eC$Yqr"js&AeY,9E IWdsE BZA-3^+NI#}h&оw5[dސ& Н=dބ=͚ޢ׃ETNV+Ґ%|č- y>4L~1QWt8r&HT%AY6= OiZ}ƹP.iz7wYapb;sZq:#!򵚬B92)'1iL~nìk>\e<() ;9zr/n0;y/8PiGIv(TY)uɬΠnqbC)"W)=[psm.ʿ^qUɺLI^&??n?ec~Q5dEa kWD1alh$v w]Eݪ %e \8Eu[6E-+)jo`x&̶,lvFQdWUg>.}T_C<`x;EFÂidwd7}OgW/r_ܸ㢒^F\?[OI޳pyʤt_$`I, ^zRutZ`s}|A{O'_Ja>8ղ|~^b#{qv e?WK{1+<]RKWPBj*:Ha2#|\KFxd!ȧ7[BXA#Tid*D/zW!K>_Pmceߵ~){/ũ 웗mȼ]cG0cECr>a f$)kI-Y,TF'F붙,98%8I vg,i׆n^DYpĜXn|M~n2yXӂib'ZW3~2''v+"xJxzFK(]X fNg="{J3k3/BuOl,sRkd9 9{|Feal J3l`]z> D-.2{rR M4]Qq־Z|z(d#u*T܂#]ftϗE"|_K~!cJgEK85o '}ZⰌva"nS |T.o ?1q$ `y]OG} /~$H0y^0)Ayۋ\ٹgo&W5Ź8)vC|? ,``W-ELβ 4٧\7h{a'_ d49,=.I & ڐ~DMo;%G77ήiV20 x*{}nS*NܹS$n1CMj%uaх˧Gk J<׷5"6qWN(}#az`*s=}%pZ γaK 'MHz^ufZ"!F(}to7JvvJ7DYx:c DY'aA+݋9%ٚ brTJJ%]7H_9-4™7*P@!wJHgKgGuK &ŸBp2h'RPk L6+TVC ܒ1=#HI,h#N.{G]>.KG踑x[7`4F]Tծ,sʛC mz=n`[5?)($UÈa2kqAF\#.L~Q_.{zT:TiByi˝[+N\\1Wл G迒aX. k\X@ C{}o0c}DvF޸mEqsZ~o)YO!Ծ:s"Dr'oŝgKx:PcEHU_Ջb%&I<*k9u uXV"}yكF<(8k.+BT&r=/T!7`Gw6{ѿМRrFqIE(+H(XU\ bA-u4)(:fSNn!M(L>>FMp6QsŚs#3e+UlJa ˩>؟R Bóty 5'UbϻW,/WE|F{= ϯ\!%GA3r6&sMXB%T/\2!~zzT&rj ZaÁwSRkJ+N<թ&4 E}ou❺"`?%Hٹ\8U㤛WTMԺSUӽԲ?tJ[V5\ܤݯ5Dv[>͌!0khEV]ԅB_[:_,2BFefj7GL/i͏IF)yoҞҠ;ՠiEQi}O-K ~|}s> J TWt9roOa 簕PmZrJC%@#L?&[BY;|õ%hLni!/t9RBcl&lnﻞurF&\y>**[ ]橿Œy*Y-KՐz Q7!Oh`j.$@e,sk68B.y 4- a[YAg 39J$! xyǰ2E3_ +Iv3> z@]  SF}'g~-{0>f]lŸ^Q*{efC6Du(cNYqI Y$#Zѕ?R#>IҠf *%l%CܖH +?7袶 so d\-AqcoƭK*%Kj(߫Gh,\0n1,4`bNS^cO#(&`Is $/|@71N`SBD7+wOJ4ih,&v #V4;r+]bP,mJv7ԛoadJ쓸Y'2G/&ϣɭ2HzMBV~|p޸,L2N'LkJ4B~ۧc ȇ*C8^:OlSCEO/tF^2ݦi0B.pU7=#.!H>Ovw<_;n!"'VImۯ!b8c;| {߉hX 2 ?/.y3Ԫ18k-kX$u:Q{%ڈd_.msMxޒurn~GOL!yLUBì{꽿pQpG8۫ ug]1BƯu 0n0b/#dm]f2McALuUl4}ۿ * 8S? ,z-U|uNAb^˲ d3o[k#fboPUÍ-[£RoQ$ԶRhjeȘyr1[稫lOvkBwya<"WZ>w$O\+I'DkCxaBVljy֖/ƹeޗ7(H1H䖊&IWj ~_$g{>ڕJhE"ls)2mȾq6c A0q=*9QcK_H*nkBU@ŝԫܽfc8m# :5v3Ti/Hۄg}%l%lx mGdf{~o^BhOqf߲?ټ0+{ B~_5![jG_8^\}\X|1;pN{FEyVC":[6R*36|E_V-M ,N4Na|vQ|5®8QKv[`t%NՀV_,Ghldw{fG) weQd.|=LAQ;M!wJ² ɧB\fXG!OXB ݳ.Kl۫ \1N(pÄ3i.66%VsY!1ZUش!B? DHJ׹^@Sgnyל[wkX`O7K"LC?8Ϲm11o"R|)o .6'5/O@_ߝˎĄd"Hew/1, !Gq.;6ǜE38S=5=BLEt=""_/jGivr7Q/7͒k1Ksa6Fz=c/ߖ_2T 2B#+-?qݩ4\#gp#%8 44emIVՑAI!P8#:s,b ®їA)̯-ň8XvU} zw ."s\|fW%+,^*pG - ˡqOgм_Gd昁L=Xk 1ƒH&5ɧ6cZ6]0nF?#sQpL0c !uyPFt@t"=PBAHJ:b;>NzdGG  ;V 텳+Wb9wd$ޒ:Pl;QzT5wӏFE9k' XAG W?{(Ȍcw7L+z$IDpv;8^NJ-k:+֟:ݝLL ј[K =RNy8u?9YT.onKzgi ꭺsg\̍%eAړ>gˉSJԧI*T8Iݬ66z )9V0r`rd=-Na+ Ytată L p \._\Ktj ޘffض6τ<2*ʓtb7kBɲEz$S[ UDiE ? U<$OgQR3-`4Ij%qN[G-e*SJZS8<}/+>OQ,Nѩ|*)Q?`j f+uJM xb#Ї*Şh,:`nAD Gi/ԫcdo"׀\%FN.jjN{SLD0¨Jjż4)\Q^uYTo-7kYJN%$c:K7ZQRĖ>:RGMe~iyC~y"5X&:b6חCx|BmOz΄{]Alo ӑGH_Ӎ-d j,n+[_{e2;!gC2OblaXJ(DQ~ Wm!Ǵ'Nw}0dei3>(Ұ2üĥo%r{H/^>1q֜<zwύfSfvK.H "n^ƍPbi|ɵ-OQkYMep B64;ލ' ˏ<&HYnw!B_:BXI9?p' @D 9[-*94KSU52~BAv,_} teIE$%wpqw G xWd$!$-$SAW< 74"!OES֎嗏 oG;9$SiL0lQm)01>\E"c$q(~dK|, ~q̠ȁe |Q` &ጞ&%g-e{ǂ,)8^(f-sisR e^E@T$ s3̏br#H3=[ZX)V?Qq:%GU.y3vq:`Q,%4I*xE@G %j컲`hsv1c} [))J7VJ1)ު]tA\"4MH'&ыj>@Dq&ʶ뻫tyJ9-Y͓Akƾn4h!*N\,oQ+a%(IE=H E<"/|J~OB!B__ G~cxXX)͖b?m qyREKr/BߋBs}oz vɢn!ٖȽrM"Q̍Ԑaq S #;j_5o FrѸlt$^x8[/qG-,I \+*_~TfXm߃JOtfJ((GOD %( @ӥ ͊6D#c":)dDͲɈA}j`,w$9eKΧc 13wxBkӣ;Zm T]j?Supl$p]4e 54$j[#?~(ZS!f(?iRg.8PE!6hWG|z[1n#g+>cIeF!/.i* z`~$ѕ@}n rJwB jcfyq$}CmFg(;mrewֆ~,ewIT˭+`KD-=FNӹ]:I"gDEO= kH.n P++Yh">O<7L8+1IR8GqSE:Ih>!͵d=R+n~"Tmq5sP{q& lvtv^>r~*}bo3 “|-,ۥ-z*mpZQTE"I1Œs`POMy bRJ*ruS Xh_? ֡T6W]e?~Ę-#nJ 7V٥rznB{tWPH[$cg:r't 9rVsbF `Wv3pz}~Hd 5eH Iin1ݛHcx>UQ(*Bj{S鴉0#F5^uxY03 W <2:uY4H ҐJ$}∻iv$|TѱL2YYj8EgR(w 49WXCUU;,) `cufh)zASsuQ"xXܭ]|D: 8h P5J2}/CcVZyg 6q#Ky;9[d2Nחшw;xtv"e7X9?w*zޙ_1R*z9˒*#~ƢoU>:튳UHX8?P1jhMk9.態)-mSUjͽNQOU ʧOEqZe1M [|Nls+s\Kdݩ"*RV= }~د9Q :?Y* \M/v]S٬6(m tp(98TG}WȞ{ W۫ ?'!)xTQŚu_r!qDߕ3}cNX9 +1hbn@FUGQF~ƘKd5 Z.$ sԉՖ@.*Snő6)&yݰ _| ~N>$!|C\O6\z,ɼ~+'7UM^^tÛؕ!v0D`skw{ r/0|6Lnmؒe3n64#c˂~?h1_(ca([Iu]͈ULk6 8%Bf yI;7)}pMbQ*FJdJy4R?#<{/`HqKײ~#0E沣|(T]:6EUϺdZWJVŹ^Uk+IGٵ'hL +3Qs8ˀCjvWP TOԢ[]66}衚.L og\!RѵbS(.<9C;Ѝ'V<qO1M2>?BU`ٗ,[q0qڊMP*w#9qfGY'nG=X;~:bsiP!r!/rD7C$l/'r z*dLcVդ&-# wLI ,4/*Qk endstream endobj 708 0 obj << /Length1 1401 /Length2 6170 /Length3 0 /Length 7122 /Filter /FlateDecode >> stream xڍwT6RuܬxTT Wm ~7o?z 7͌+Mmœ*Oz.}o~n%bsTp]ڮ7Y{$bpԟkۼ5#x&Q6 MsA~7BoqK^ ىס#64cO0 kZ)_οjBJl@11c-\Vz #<곉9q),C_` =w"K}`dWjew|Uz_|&PEɋ+$ ~ڼ`~q1͆aM6z],$\ 5k>2OJ}I/؆II )z)~z%>kI6~i\L|/K+84 I _\[Y BC'>+hJ}RUjԹįCm`# DS*_޹GxoY|{$[b8H)᷁MN~ƶMeDZ6o{6X-͔}7u1q7pd=آFN k{]D8Bz0sZGzntm+a6Ş-o^YVa[5QXnr)/"c ď =[ZsV8[&7]:sONZ?;88Fpg6~%\~+]rڨӀr\ [8NUGpEM O/Ox~LLzTwڙ146{H4JV5rR-~.XRX٥9$[rK 9x32ۚᴉ8S*QQc:(`-hE4|͚&&#g.v,J)۞zRV16[QgmC״0%|u'c 6^k$IaT-bCM08J'UCYM Sxr,t]@xWy~f}%{`;ǻ4/m4 f<`TAĎ Ҽ3[d[w+Qn3 Ki7u%{s0/7D5Z7]&W ւ$]a3N/Z_Il>c:_z 'c2R ZdOb_kXueF+YիJF0a\,?9+ghh>| 7nWP]Vx&X\\K륤la5׆Aaamp gdִCW}St] .R1c䚜E"Ong̢9R#_xu\UY:{kgIAK&Zv| ]SڏڕĤiB IsM+N \'j;Ï$vn0N ?,ٿ>8ɑ1ӾE1̥A>#]7yJqKy1 / J'/Ned&I6 sswݟ/ =q_ O\2Gⴆz}0<9 E =eۦ2y.~`J̕Kw{n54uΜ֏6YX;+O#iMM^&vsx(AL8p}7 g9-v'Dة~$tƗ{NXMQ{T"*Y pqq|%3‡uڌ,tqWX*6M"hа[D}H|]e?uqcf?/yqso}q9oxl> Emɩ `3 ~e.<])*&(D=k5lYa}Mڬd}3 (dRIDꢣ>YQqulo<26'JWhT^I E& (mdݩ_,@ ϺS^>CLFmŒ%v3 e {B1< cT!{^J_u^R̴pή%9( ._a6tae:[Z;i֗oi-5?kJ`DPb:!1Mr4sՒ[L}ޝ($!՝/AńQ oU3Ce&-g[ncM#޺u>kd.U#y ˬQjU&ڢ{Ԁd:Ajh:{>PF2I&sJX}'Q$KH(AiafnM_Qv{-U~P27m ʺqy^:`T%̉7iqgUicc 8P.i{#n(fMR5AgᵳMA?72{zq.TOXVGOdY[2ݽcJ/j|2A>,K{?Ve.ikqк2UbX/S?Hk':oD`(C35Zg~^%X]z3ۮP몏O;Hɪ-U>%jؤV48۲D)a_Lz /?%v+- Bm~łB 1\&0 :vci8V071 9[GUf% -ձ,$ ~.RxKzR uRh| إy_UܹP+u7&eNþh3 >F}L$yF) w*QUty11V38 .<,7MJe}:T&r/Z0Mx, ȒW刧lJ75*i߅ WW"J ŗ#- ~M/ 0qlDdAcU]ʿvE&?&V0$f|A8LWsF:S e#x?U; ^Ƈypw C@ydch죅cm ~̛TIٞgny4`/gvIwvV#s0Yى{n\|JwsN,4/2tqTm"os&$ Ș9MnMȣ&jg&N?gZxW@^S"l1A%Z}<(BR>h&Sύ]Β`Za }SPcW.IX£L>Rv$wR3 &qfVc!!d.V~TFoBF}wd,(+XlHΨ;T%[ő%w6|%UvPNysy%Iw_ѯV-@bN3y\i{߹}c]~,N Qus I\0+tQJo\|e~sB`ёuzGWh iq-탉 [j˩nmdHX+){H4MQsl#"]gưBP[cCoŠg3b9#'( )&x?YVp5IM0\fyZZL,2xxe"X ~U5R .$|PwU+%~sJxevOGRjx&iLc$#`f^Bů2lIvGQ~ Uwo@7Ypy02ŸCJ"u1gf+T“߉N Y8%'6zVD`s1O#%zKmOyH>"%gu5bY<{>Gc_X<v^WСQ 38m#ۙ{Y 鞽Z˶ckv7JD2_(N7݋ %VJFBGPRZbf 3&yyWú]S_ Ǐh[`psy!8n_cWVDハV@?k6< /)jߩMt^]|Y˨%j\o^mSK2ٮi)$8’ڦc~LHS9[ϙʦ3Jo-^QѫI˧6y\cg9 g;gw`K]|煒HNf6Ûit .޾r64%JpH0HҮ L`k`];7fJj](zuʮ =?C; q2c_w~p%寮kG ROa xVu)AG* |ДM(ռpS8NJy,׏x2bLj!Vt2!Z1@Cc8 it(DshzAOĶla@eM9b˅}Wyq x5b34do-Љ::|[8[ _oSs&Wi_3s髌CӖϗH {?E FU](k-G=AiO=kT6eBVƙK&ҁ=\pRAECJ6K7<:q/x5Ǔm!8]ؤFC1NNb 1@,|CJ )B$n1:B<$aY}a4K{26E0!A^z{&TOeǺ\xm/p+]'n g%եW^*s9v.jTGhډQ![yl >7`g Eڹ$SfMryᖶ&eҟ5.TRvX}PJFXKNHlBP9.3ZoUz7m mM e ZL3>S`c|p>$O5t~_`+)3]-5/|3>GR__3s{3?wa~ endstream endobj 710 0 obj << /Length1 1381 /Length2 5936 /Length3 0 /Length 6878 /Filter /FlateDecode >> stream xڍwX>!C 0J;G+1ƀQ҈ Ғ]M8q<{:|E'o h>A~$PQ VA a~HnG;v؍a(w8!E ؔ h Rjx8%$A $*A<@m~s+"]}Pp{4_@N(PPBBw8PC!6sTB`$C+*) qqGex^pCyl@\``:vh/ Pば@PNgDp`tq |{UG{y/ xB w>ݡ(+ڝkH_i0UDhw(>{iGUw+ ˜ah(D܀0o>N_fHWf?Ce ecmECf۫IDA@APLTDzG: _Fճ4S$\Ab rCG Qs?Sw鿲dT<8D? OhA jC0[{$Z aazp4a78g8tz`B@adu113č\a%3Tc$+0IڰHl$~e-c^( U444fhQ3Ho-kl: Epd/>Y~Ϊ)p H*!1E{7 M,$rxEvf:*ŃM۶wc/ _sąΒ|5S5Kmu~ƌ=t` M͉4D zTs8a.GÄO!tHxd)B3gNOkJijH'&lF 嫡 /ҙ-X-?@@ 0$ ~LJˀ_XN)\JB훗,ݥy%Zb`6 _K T@%׳YFFf^9a?Es4RrJ]|0,~gyDpL XmgvW5jQ:&^QPO鄲wmN~ԧ),xϤˬ>JۨGZMTxطWEŢ7kh"Ljp_=xxI Ȫ]&e.~@ieI^8MƔ&LK>a+SIiheGO蛐jAvMOM1Q7aͬr8#o 58)b²83[] b$ʶ y9u}iy]3Pa)$JeXطqwdP'[M2/+KB)L^P",euPZO^煩OwayzIvb`oq_uߨOZ$($eJyj8%3pQXc6~v ټEh6 &ZsE)5_LG}*4>/Z 7Zdpuze1Mُw'oUn>).ZEв,%m=I@Hϊ7 Yd(O(w QOMO[Ac]7=|}<(dDSP7WUJ1@h7]$zT#wiT/Mpj޶oy#wTDiT$?L 󢂚y]a=2;ѧJԍU9Օ+L[@by g1V@#Ƀ2S%Jo,YgڭRrjvLE(aKL]7=[Fl.D4qÉ!P2QvMVg ~2yl=W=CH¸KkT`Z*akguDibA̋F-_83XXNHo6߭Y|Wdi.⑒RDcQ*PkIDU6 z5Sij.zjji_s~{qg~*qaA\>msy㵠 0ᚄķecl8ʃW(U2,8>XK'1~8sȸCRE꣠Wc @O"1Ss1jc5a R O+捖I +.m21)J}u{]4+fKnp}6(aNE,w2FSNvׂ/srX9Uf_hn0]|;qQ=]9}{]ijA5ys-́k0q93ȝ穂,A/8<³VdĴ2`5~-ާJ?X>dP$D q+M--LhY2)H- :W[9b Ӓ {\l~:sd~+£O^AuHAF#y=$ fzs2lWQo64.=Un&3GoUh, V.۷]dxmed4iO<ܩAMz+^^ |Ѫ4W7eu1;<2<&݌9|şp 3U{Vⷌ'RxIkxfZ<56=I!*k }84'=UcX"L<"-n Y[#3ɗz3' hAɳn$/k4eΪ6.IgE@ԺTKš~~8 0E-2X?Nyw[hea%3ntpոΏm\PE)kwlxWMEэPE9SBq+'F 'T}ȳdH.kq^Ys vByÌ6%qd>imܵBؽίVRG ,4w(Kd1$Tv|#cpR7',d,r 'gLO4\xžLyZʩIe  nGb&j!.z}ƛU(,h_--$0fDfocfaY)kMQ>JһOAɚ:/&iTGdSUn (6HVi>EkD {$UpYLgӄMȥ^;cc:ptA؍Kw/dݲ4C*Y͓ 󪓱TFz3 V26m*c0O➒@R'OH1} EVv_>n!,bUm͠0!ҾSksKSiRۀ/f dо5EFh@m7;ŰݼB_fIOAZ#|̈fY|$J<ߙa`6HV$els|2|g)mvMVˋ 2(ARIǟ ^*epm.;dB?_X^?㪍 QЦϹfJm ` FДM#On>ۢs?8Rng/'WI/I cv7;?7 /ް8F$Yn=Ͳ)="14\xt}ON~)?Sm&ueyR ̍R !\W4jZ97_IEN[ J~ -i|onQLYgCI|ѳBcŸ7X)9;VthvUfnUohMGUe5#/WmOr2 㟅h $i 'x;!ZK.l(ΰL\wNWi6ξ[!GS<ѐdG|E,[%Q:;GxjK]tх'w}6RY?/Rx~8Ǣ9JAdfv,ٽk@*'k40  * &o6EjLٶ#1hZabjc/ 7T3v5}L̅BR x2`0RPv%$,cםk[BRN Eh|YB@[xBHH{]yl.w2*mz\Kþ&ϭE? =eBUPz9u;D'm:/o-gbZ-8rۨbb?M<_ƖJ?Zg >:D尢hS`GbDMAb&*K˓4TKt*]]dXф5nߧ"R:ZZXDCZܔk}fkWJڼ1_ʎi=S$AJK7 /OoP'np◛z!_ukzÁ7_! Տ,Y,̈́!o(fytwt O_2Q } . -JY 5KfQ&Lwa!qe$.hlb7v٦';IjYàw)?$e3)vNKVw{RӗfS[OB-F&'_2?o472p8*r K:ؖ0G`2%itq` F:qE}N!~oZ,umо낵 {S׾ $H@dr"fK2HNWS SHEUKJ鿀f}urDv:V9 rny.[gD]| endstream endobj 712 0 obj << /Length1 1746 /Length2 8597 /Length3 0 /Length 9738 /Filter /FlateDecode >> stream xڍT6H:In`06`CAnN~gl纟iԵKŹr0(9;@ZEˀɍMO F@@G8# dHC p q qr9929 d̜vKǦٻ9<}0Y0~$퀎` 3(@ a Cf0`` ?!D{!v3;8;J FX4p3eر` -b #]@G2;@KQfaع@`og3   @MN`A-A0bf4]@NR``{We0;; U hǟk @=@`%WN:PPQO$fDx9x@šWm7{ooك=Bl3ptzy[_ ` @́V`(?ё0<G+I?.ߌ A!n>bUu%UI?[[)%sx<<pqqy^n*BA0"Wra7* \ @q?E+s@~0?-uB @X]%36HB~8.vZ\׾AP: u 89G\2 [-GR ܡ故Z,-7/ yHJKo28ء0 9b:X>/ďT^p #\,!0Rp!ianfa sp#G3 B #9o aj:,[4 '_ ځN̐G<Ⱦ@tGD^k2Zٚ# ;ÁW#"8A/?iL{㐧 ]s0 @JI +a1=iR-˞ &O{R^[JRFI?vi['jP6B3bכ *̻ko 4IHɬ=74t+WQRuFP߀Z#ȾE,.~I9U+ &"{&k086eAR81,.akޖ>:+UijCN50iѬSJtoO¬*+,Q.R*x h$*¢+e ͱ'ׯ#bE!}_ICAz""rz"u46+N/KCϷ?t'b>6(^~&eCT):L'}4[ %ghuys gPRT $}' l oM^;'MPPscnLvCׅ//b{1R~KR?t|L_e"o.뎲%kB !a >k {(S>w1&n*}D;&2 ̇G6K/)7b:v Ͽp] X7ٮS=)q7K > J'hFTOVl=$aN:Is`zV`*$|6sBˌgCr?L=F"NAOlUf^wit]XMss~xWMSᄌ*/blkhK'ks[Z4+,0;0mS }a&JzTbZW¶}Di9< WScBHbz!0#fuՄ9F{㣯ù6-['0lIT>)Q…\gBfYjth+mU11s/~$7i`{wf#ɯS%(Go%;Y<#}fiSl8H|5_OP.Bt͝-} +&GNäuYjA[7(:87{ar5@ WƘбftswyiqZzOb vU0_`6fC϶mQf-wotPWݏSݛ("CݿUϩK8nybdgqH|H`ܪdZoҝ:Y/zWQ=v_r6=`,y1(`xҝX|D~}B0г)LuV8e 7I B6(نW(hGTrXjv' \E`ȱ#:N~ݺG϶z{<;,ڸiEum&9YIŞ~hN'eC;Tzɇ#»9'%A! Y0qtJM̦B@& }՜r[1"|ax^9vz(2fж|q",2$a,]"FX(;X3Uo`=J.V,\&Dxᡙ#]{U8ʺa~^>?g-xRlZ!_pE=CucO91\|IsRpiɥk[Z:nSIt'-/ZygVC8euӬ~ynBэc;vga=Fd~c)-ZJq>rTCN TP ]o /)SP#lY<[8C%㬺+XvPt φ$晱k[ScG^Ȁ "_hN/|LGIzW7p4uu;)3" {WS}&xRH嵾ςMje/V)iSK(ϟ~1wTQc?c;_k}@1(vWֺH+y^9M#H &XTV>)ѐ{2VŽα1LSIbnM;EcD*]r;1}Ov O ]iL϶SDܮ3Tp0vz zPC!!̤*>Z? uS E,&QT}(On=EGzک*ܝ+aM+vcۇ Әj_3M#ebj_PE&סיbJzyG^^㢭KomVz<8GMr܅ε:mHp0kiA;H)lIA\+le!@yLuš)M1L+ T\u- }.}&idxlo>')̝ꒋ۟b'7=V_m ȂWUV5jDS0 <&q_amaL&%D{T~zHK cU/*-( 'Ӈ`yeGiA#CerG|&:XcB1A)WJ= +'fW_QϦ ?l߿1^/.C BM"e\~ nBұ*XSx{vlv?^@z<?z$.dblǹ5 ޗ}сOmm |Ύ潕wZAH;DY]靸(_>+S⼱dC( X[BOҍG{4PƒG*;4j'KLB*ˠ5"JV!h=y][DSfJ5~Z;u Έ:c( ~7]زeN,e#*[* ')Q]PY,gxBpRQ$#-YeU1S-#R$;.v1J h}+׸V>=m$qMq^@$׸כ6p]6^l8س^5~ mit# j8|Mr)z[1uJR#q%m|;s֭N`YHWF>5>ji%j5 P:1@7uh{/K ${Ut z{87r->6v~(m4n ~v7RSr5SOG7=u[n=?tVcK[A#XMʜB|@8Q"s6W(]è)>WN4b <7ݭL0O>hPnTMYUi{iF湋Xj]KV:L $]*Em̃0{"[ t. Ç<)0Gz*m{;륹%O뜰Sdq׬*ᅆ䘏 /RnjTWjAe\b1P|Wى_> ܺ]"`[rOˆ?{iѧ5Oh\g{Q+tS<-~^,j7g6  _fgGwE%W{pܔjђ $!v:̶&37V wqAipQ~(q @9"72~Fs$b;~@QHӔAíU-ׇSgrBV:BQtQo5<)^2/ـ"=P1lJQreNcH}%&G "=X6,mQ1Z6XE~u[czTIy)Ɵ;ޓFE~E5jU/=hB01T+EQCHG0,J9EP1M>Nm,ʳoV$.Z zF owpȣJ yv⬿WN!a*iVc׾ZΈ$Nyk" 6OiQrhݼF0?=jh"/c̍z,a&OXFWk2Lrx'%t@0R„\g+1?kj1n~;阣Aō`,;t(8} dp稲pF0ef&|dt*/2J>yl藧[6z1lrM/ "5n4l/Il9^x|벂 P CiH[ Q6B/({uOR\ b/?_DшIXh`ՒAs#w>>e^w *F^/L2h[֥$YI=ƞɿ5mӺsE1ˆNّWff̙xe0/ULbڰ9jc<$7ZF/'xuOwPG/k)m}3ׁ+g/P|^lhRkGQRtn|!rWrv2s:Fhjx/ۇ~܁X<߀(T:C7 48\SG]vpd&5b(rD Yz"4H>=`eGž)=;;n *0-z+_|ާ>N{\##ƴ.W|R\>!q8Țg0XNiqʫ#MPсdHnLPAJ4YESh0a-{UӿǷ{`T6V-);+UDėxrͬDL/|ZaG U<#;id~ůYSyfv9/Ct ;k/ܵfBg2\ɍBX˖I.d ƒ^{yK"]珨m?v99R'?9W2&<_a7%U?-\wVGY.{˻9bw{Io/}yQwP0Cul_9M̖ޠVz>d(H kߝk`^P~&o8"]x_Ƶl8mdwCKlIp`V@t~T^ܷ己'/…LC_@/,Rw ?W u h> stream xڍvT6)%2Ftw`l6E:A:E%%SIA A)ix{=;g~=b3Ra*($F  % (!2c`a.'B/' bJ B4`QXB,)D@ Q2%7 4PHK wr`#ׁP@<$@q!7:@(8 r@QNw>p3yzà_t ؟ʀ$\#g8nr@ȀG81SWKB$`8HZBBL|7s6 QGl # CxO/XP6Dp G':99c X@>~ B{ªڊZZ*}/ @H $-&4@RJ(z,@qUG:v_ {?3 +Z?_ov W;!/7f A`n򿩦?; ½mU@{tjY,h/ 88Qצ0=Ղˆ]/Wo =W适Z3q GªID\#[a 5Q$* 5Ѯ)82Aa7Տ'ۧ_?rpĮo``0Icǭ' L>BKQ =g-L7> d>~8QvG~6udz7,v<ɦaݢ+ 숊- ۾cƹ0ien7|57{{E 5TIT0k&1%fk4q)HM`g,As!j̜oA@)ˠXoIUR^k.0| %$vnZ_ƻ$sE~jwHB.13 57Q4l;dJDKWj}LL5Oh*d DJTNӴ+:˔ޫvK NJǘF͓hvEE<g^9q'`/T69#qFu T)'1[quVB[9wtNz8xvz}5~)ut7t7C'r4d첮je~O5EYs$dYؼ}Zn͓/^TVth,ڄM: "8>[ЏcI]1޶b5dYQ\ƏڏEm%h1QdTV+=(q_W7xsGZd7HTL16i_ ؋,Yjx+\[1g+zқiP`\yô:ϚTbʉk_%65 8RzO&= `jmG=)?ӔMP4\&m:GcJD!7L0RQ *qlZ|@E?x8NѝPU/ZWIJ&(%qL~yp2>Cn{D(PiU{4G&z!7;y`1" pOb(EgNMp[zC}"k~U[C9~( } ~gUe<|ԭT(] md^+ᇩܙts"MxzC'Nuz eJ UԩLJLKoCoں{|Ɉ=jj&bYcxήA<@o^FgX3rM2"/=:ٷ=g;O .C&z5)}Aj" u49NkpMpʊָxQQ_&õ0\Xf|齀9oce} P!棦9mzj:Nl+8-B/ igYL2JUv lVfV:ʟ%,kټ&a2s0Bnx*9Ainly_Tbh8>lhk}X꿒(XT>^eիd7fUֶ ״DOBL#=5'_K]l.þvss_ ZQu1v OvVC\/=_40OCwCf?ݓ:`AUy'%3s~;'F3-JJ'L\kcܥvSI(FH*7@@/$e-PbڙD&$4Ң٣?ŃP%ڧ|Pj>3E6pE%Z:gLʒ7يB"CV^Z;3DJr幀ONNzCUg>N=VmgS D|wZhy[c9DjN}L||GG ]Ad{jz2)geA%jx9.x@pXgL{,4TYRwd9i';R޲wx p"kM_X{6TC{^9kVbv<{Y+7Jg0Ӿ݀:$l֬KᚇuO,J3;GBMji,Փ ӁTa!+X5KZ%EF`y:Sܠ8wwI>F3*5 V(5'l?Oy>c𑜚R2ԃGlG=D $;^,\zPoV୉6S6( QaV"ib㫤\=B'tM rtI:}>Ws<'[; ֙ǂ7{ 6(H %IħuB"*CZIW&9.~kAiau]rnłA%'XbM717v#X86P谳 ^o78?yllnzr8Ƽ2Q?o[R]PҟCd#3 Py }$u2I-9[r,5˪Nf ❺Z| kd$FIP4ȖLh*BrpR:s8km,rWn{b(O#yBf̅h+[N|kYPi~׭YuGaJNvo{;h5kD̈́VO Al4:F7r$i!|1*A4Qm@7-b:,(&0[{ids*s%H_H5ᤏy)LlQBeKA.Ql_ZE߬ƮRǘ_80,B:cA|HsS'r B2+LjC_jxp3f 湫CURrvf;WK u3s~H <͘Ջx +K{I^ :7ivxS!W?K u 6:Ѡ?mD/È:.TyZC$'/SH( *l ْܘO+ \3ѝZ"wHbcW<oFkxgN%EZm48f߸M_+xJyt-}*O8{W$ bÔ0Jsʐ7ws> 1>-gql&4}.%'?j2f*G`[܈mHz3`Xo5V=%Q8'L`w0ؤlMxyfT&xER?1a+^Ro@>QsIr,iܧBIaC+؂yfK|o}{i؈WfY(]Ui'[zJQƂO3!6Gѡ$0{9v2_q0ZEʺ8AI##:ctF.Goúqzg.X=UOp+lp;nY4>v04P&y?kn'RNFA"P KJ..?u% 9D`]8i&,FHObDa Ȩ6o1ԂMϭ,\(d ww#VI7YBTj0 )+NIt[K.З~sG8۳'l-Oܔ44/UM)Nח >ſT9pӈ>zR7ORde.ճ-Q,HVs5W>h&§aBhBi%I,$rly>i#/OPxAEcFc\%VQ_iq0G(sTH¢Bk^3|6}-yRiNHuh g!$ǯMOݬ(J::5^=6╙~]dmWGK0ZR8|h«O;Cڇwb52|*72ay1+ʣsW㴚Ur/;.|?>7~QEwRwtTjksNc$K]Qroyz%/c,Ia)2ȶ1aSmlspA+_L۞W9!"ȗz-TVЕϝr]m_WVI7|qP-l{9s@M&FE,>hY/> ]Zvlދ؜zǵbw΍ƝuڗZfKwk$[UZy/E ^[vY,$?棧Yonږ$5{flBEܱl<)#?=QwOWf wLXU't9!'Mޛ.=^Sjkj.)ya=O!*j&>x;,/? 33֡Vv\˽˻ZWNw9D4E6k&935͌Jbe^ݰkķհ̾E1qxy~D!T]p*`~As\Gq?W)EɲNtѺ=eppD(ޭ롡܉ס{|' zJ#Me. KyH@OQH{} zfqדi`ʣ:PZccQ|1ml!Lg ۖ ϥ7B'O(ڍIį #-yBnX1KqvQ oܻٙǥљ)1J6$P xnBC.YmQA`ݝ--Qok-TFnV )wd;Aڬx7*R'g^4+%mH[o [հ|"`#A=CF3Fi צHZs endstream endobj 716 0 obj << /Length1 1559 /Length2 7199 /Length3 0 /Length 8252 /Filter /FlateDecode >> stream xڍT-LH{w^C1$J/HQtDIEH}Q9c72FZ^kϹlh¯pj h~a!PHHT@HHn CCP$ A 1#@ow(PXBFXRFH("$$7}`@}EUH \n$t @}0y#4A@`PJpɹў2`]PujxәhCMNh_0 0dxH @m='k6@a ; < vG!0`0!9lc= DP0_- *:QQ_S! k;:jS jE@`P4P\HZBBLB .ʛ{B=@'L`D}@4߁@G t:TP?k#a~@F{@_l1rDC}Z /* K%%.c jÝ@?Ō% w{j@FH\?nHww{"`D@?Շ:¼=7c wƈ_XL@HCi04dfC (د%$?1 ncWA8򙈸DB9`;PcHGo%4&1@~PP{% 00g.,,tCP`B`" @ݡNEHoӔ ` `/1&0=`po?펆yb T H$obFUA!ID6MDi2/A-IV]1h.z74ǼT;O7~5:}:gӖ:޵˟wv etD;K.<1Kz|j1y).VZxՂZ:&cNc@?Vmgʆ, 66‰%4ӝ/2?twvTJGQQ0'Q?ѩGaqNMb{1 I7|@rnUGM "'_t(d~B*)!I6Wfeg%~և%2}_c(wUVQF)[BM*9?fZ]nY ;+%O3֓s_,veZM3ش $vWs?.*kK^oxmF>g5eBTv?Q|qZTtMvtLEzq_gTsPh[Y/h<5M0sL5{2o>⢃#-C|̑ɵhU2gl'R&BgwH"Rh ).TIJn62c qR\ Dme]j|כydŸ|M%?8 Qh6 zg WoB%jj f 8U|pEmO|'Rd922 ertDFl&2Hdj!IӜ!mWmqJJ^j@ qN|ڲɍ^/p#t|D_ԲxJ*Df8wh܍MZw-t.ݺ}*3> |\AE35ҵqAo>,XX69Le@*`Ӱx{eTd,$G@i!\4?t[~bK&\/6S\!lQqma>7Byqڒ߮#8þ5KL[RlXyY+ob;%o9L,:{‘Ҥ} i}UGEtXɽ7^FbZ0B, :[ [yQ⥢ 圎=|=?2[mP&Qjam竪NuVDьEAs)@:b 2t֛}@Lv̟WJ܍q%2O7bg:in}B4uez8EQv,:@\Xo=3eKqsOQ%`%lJw= j/^Oqqa ?=BX`ӽ Q^~@Ҽb+M%0lO_MDbJ!"Lnst<92P҃u 1B@k;6l]PY`9YbTq(Se;]7omD[h%rsƱTЫjl}j4 3Ɨ=!Tߤ: Qų2ܧ,/%%X;7=8e F1xtI~Ѝd#N^k&UZhuut74dj=8&Nrd[6ү)d/]y= ׷HvU,@rv:5XȭIl۷+=IzN27Q7 Za@>+*'9kҔ,{ŴokoQ|oN )Qӆ'I`4\qפy~qnm^ Fg=@CBۦwr$Aw~Z0"=#T=dRtXd^1 uxB!T:uq͙ MW;#޾"!qݟ'VQ/(Ǧ#\'_鬼^<Ļ+nE*E!k0ĉA'm}Zlˏ5G #Jǂ18[vxk>kx<^xkq`!,kx (c(`|^bCT!Stvf\r}5-^l9eQDt'?fY+3 [!k[?P:{x;v Wlr(g Hp@3/:W`q6P-9y?L?=f@ ^Iej%&:($/"K@eۡc}, fDz1wmH}lۿ!]E3k7ڻ/ƎJiLU<7"8葮yCzS:O)*-u”W1ceWs5E-}FY+'^uT9D-g Sk+rcMσX|zL?)=ojH0Pp9y]BMKM⻌>lL˸G1zßQdԋgI,Ijˮͥџy)L'*efeGIW_E!L@獙b'wiYaW>V*w-e'7tD.IHȦ7hd9Yh@ ;$jQ'&Y]3܀9 n%`!xMKak ]iyaMn.74yvW |.((xs-"-s.{x;cWY6$*ިr3cHPP7)'Rs{`"] HLXs;S*0'"SZɉ+!듔Fw׆ÔpgP#nXb2a=R.{OTbI1cYTJ C;uI@CfC@EbO*T2/9y:d HZJ}Ǿ^$/RHﳋ#{YY⅐R)OH "mPbvfen%Se*?-{2C v3Ļ';q*Va"[(W-+m}b)yO _yhvJ@FqU{{O~~R]Ҥb<!͠hzްxPTg@jC5ϟq+mPe),ɧ1 WvٱKgS-+GSBZl7Y/ؘ%"u:ϭ;RCvG\B[gE9)+N (<:9>\&Sj/*AtilpL y[S)lOe׵,_卬FW ڞ-M"R3W xڒRyW()Xm) h LkC4[R eNI~:ΗTcL~e?+{kkGn9dV]wsӷsz!=j+#ӎnG| z?%n ;ZFd:Sq?nV儢E}Z2$EZu8&q}$lkqSܤ(73TI+bXtaet?0O :rz?C[ib>Grl BL Tg2 IaWǤ[Њfc/7*H No:ޡ6YB]wYFo 5aT5~Pa7jېyzޚ2b kʮO)XuMzׄ}SC v6n8(7`e)[6 k|51X>6wm#-ɨ!x`u(ѫRTxuow1.^oF@ȦwS:ݲ뼁2O.js#)Wq&;$&6jk_! 5RZUW*E씁OokV?nn.l I V&1iq<.RC:y9pi~;(B|3Ǜc/f><Vyz h/z񽎄Uw g|«'hʖ[[^S |Y)d=iC}lsn9[Q3y~HC/OC"4Fh/lIKwdm"w/cƪ5)>>7uQDžDT0p/V<fp, գF~{欎UKz|tO )wmx<ݚ[O<+#>(ny4qAᵫ5ٮ^"!)OhqpB&H9٠O?68FԩR"YԍG i%LT< ' zv5X==D}e&8[;.4Tޡ(i[߃ťV(m?{GGLy;ڼ6<+5htao =DOmQi}Umn3爹klԟk:t;'ҲV 5n Z7"d ^/ݟTJ/[h\^B<ó Ef4?Y(󓑽ȃ24-v';O[bKDg%{`+6k4YUӡxA!0 wj=}># xt8cERJ3 ¹-!#YP7EI-+`Hql\=vT,_Uғ/]-wGg ,&xю${6-+mqaA.x@L`<*+C>oWˬ$z!ٷDW!;#ή$ӝ ⍆\h}w՝`E$WWK{z[?T|4㣻MhY:8}Kf}\naWE-'%oי󚒕ִYʗd+}/d!-ÄKMSe:ܕ9:l|F7\Aş1WKN /;n=njU~  l,J"m ">KQ>4|)l芔 p@yFƅ9L)v+I$m;v xtڞ.S;?52&L%>";*W}/)=L~.;^<1ع*Ew]K%޹:㖅S\wvNYn{ [Y>Ig?O}ڃ1C"~+@#c-8LRzigeЖ/cv$a}3s pc q!žޓ}%'2w@VmK7E+B8Z6ue+uv,!2 CbaY{\JutO#:~x/giKj'WQ"Ҁڊ endstream endobj 718 0 obj << /Length1 2292 /Length2 19514 /Length3 0 /Length 20865 /Filter /FlateDecode >> stream xڌP[ #-$64h<n=x 3gfr{}?k7*1H։ *&`bbedbbAP;Y#G98lya!2rz9d̬ffN&&  xbF.`S<#@H!jg6pzO _a odyhbd P3'5=hdh`.@Cp;YT@ )/#п1"R,+T̜\@75dlk reJAm@wš omldbbgcod5AE 9F'7'z_F֎voF.F`k#7nV17?G##/¼YTdW}b`[݁>\+[;W[ 3_4L iۼANv&&&..3fb+=_Jo<fo4@^`3?DOG#O"Dff) ` 2"&6~6avu@-m-ySRD ``ag038>7uWwo}O./ c)ؽM.@guؙL~?\M_Q_V$lm/=?z#-&m vj^]y)j޶Am%n S%S\}ۂ0o^LLGd&VohKzۡ+nkbgײs <߶am\ofv,;(oAA'3(R+(2[v?-]zˮeW/b*[v?-]zˠ_zAoMt&vo _?,_?x=[ H!?X`7 Xol(Y?Bj@?l޽ߊ~{zlAf1[?]`{Maso?;۽-?FOB g3w|g8:Y8qDou;cos|+d,o:[$ߩgMZ;# LLxZV}mwe5†wv#벫/wɚ 1;~!KkpŚ3m/Y~˶ښc6 ^ M`>5/GPvj,2kpzkHL4q}J0 VR1=$x3^*@ yOp0M%㈪ oąNyTto7ҳ L7c-}^v¦|Vv⮒ɏH= G_3eUN9&dL}SRg4ApӋn@|6XwTkFB A ;$:$#1~2" LyP>!*OpM/z4 $CzBW!ȑA>$2{9]4o yR&MhO_gJ#|YqDM?7n ~ x<%Zgi&Wń!xg7*M >] Qm*v&WW)F gj,*B@\r;Az}rέj"}lTΌ@6O3$4raю_ ,q.tB5mޙr1-4o${L:cZ.xJ^m,^y{9ءS]Q=g{ʰJS }ʊ"޸2B}7gJg;I,N9f+gYTtvB| e|_FvRW񺨬e2ybCQRzb-o4t⤙6JCYV~ xX;9QH"&g֜e/y/îĘgɢr]Ťޜ[57d+f>s ƴhBcS(WP "m, j_<5oIa#q,R%Ön6["O; ea+p\RSj.D;O{2k@(K!ҠÅ ~=duTl.H [0)/./%V{#¶L B]Inq{,>GɃ}sk RH+yēc>.c Lݙ:whg{tƏS? /?8@9}q*c#b'%ylS\ߣ<,M"nHD iKbnn,E+p_$8nPG8ձ.QqhGw'k}+7P~QVk"Ab[$|ܗVdybj.:'Mj 2DϓngvP_jQӰc V[ej;H$4+g- M2jj=pǓɅBrJ3Uvįj5-jz F[=$cJ/d{,WB**^%;5%Mǹ_6ٵVtۥf{?OQ5=?.6IWUx97pǀ.Cb1;>6 O!Q.Yhf>4*Cƫ\EYp6iŕDQFeg^~^bb> h/Er7ˇ(W%5fM7 W^DvW05q)OW3 >Z65a*/n *խ 5Y$)E:Y#/2P3/;\s~~we-x_3TI[Rr|p5°pWJyOmizf~ ֹR~٪

ǜxPǰMBԄx4\J6ܴׯm$U5(Tf݂]Cestfn)a& i={='#a~(`&IȃϪ$w\80o;<=U| FϨGq|Ug>*s\tvTdcKxl<"6yu;§nBIHG"K8%$smN5?7=u8dSzrIntѓeګ>ٷ +);^L2<@Rt,iOETb=۝[Py.x 44[uHqYEP0<)>kyj1Fʑxm<kK@nTa%4fuFX]8T#nb:|@+Zi/o&@wLa>!졚ղ3MYkcN/P6ྗVJCWM^pAͦ,+X)GJ3`Ɗ8YhdM9otSXzF~֜E)6~ X6}r1a~w&Q"֧6[` ɵqVuϽדZ}p6۳@at3jvK,bbI'K> I#HYYb~"[o"-&vNGb)SPK(ۚv:k/Pn/>I=k|*p:[(Vm$Vz[c/;}[ךXZ9ս[^t¨R ^@:KH,Zc@vM'>Mtv:v]8^K1ᕩjk 8)0!+pD=T!+I0:=Y6Гr'J6~uB>]lsXCWȢ_'p~"oNNh*{|њ#c]뱪;?n*V%!]t9#ֲ͇mц#XPn*nTf0^fIÛ~jc~g%Z>xSA9Qx+nJ0qMAc mCϾq 4?*Qk$v|bz2}CwIU^4ǕV^ud⫀\gliA㫴=:Gvtrw.^%+; 長*$U$maVx #?Mc}DWB R_a(-/66IcU%8h+m^m7B?jO-+Ȼu)U!Pf oEP$x7~BZ%l v2#&pg`g$D j}%icA*X@6;䵫-E³ۼHi1P~."`w'?wVȴQ:#` U(x6 Qbb4f*ןgԗ8܎fѫ3V!S,F^YKh9rR(rm.mqE2Hn Bh~AM+@}y$̉GFAN-]B5~fEi,G8,\yw)J\ OgT]P&D4OVY;{T&H̶CcdKK\4EdRcV?_g0<|ְFi\FRP(4rbKVNTU CuSW׽7uN%?$ nRVEI!Ō; F`ŋ-)&{Ne5c/"wVNBmY>|$Uh//)^,#&=?q(h:/yKyNEmRpjYŚKsl^Qǩaf<{*qp'!v JMH,)aA&϶%T@|戏ՑO>ueیL t2lGj*OHmI{1+v7bD:2(+y['41g=sÎ=iggJ~Ui|mheO2,Uw G,T@3A]OZ53LU?jw:`VOe=Y5?<|#ÐO) Zs:m9D5$H3M xob2@Ք }#P2~rfp_ޒ2,gܕXʕuZ/wœ:^=촹#fZ}e!o8Vo (G. pq8>tM M/I&"o5u^hoLcn{Cҥ$g-$kW_ߗ⧛)Ӱ7Iu@|jU1: tѹ_y&%2Y!//-!تTu˕\_1ه3)xrǃ_r{[=h Y]E~m]>Ac.kxI޻ͨۆ]t`NC)T^lJB 3毭"Q:tlo*@=-Ulǘʁv̺4>O w DDyE:8 MbFqhVjy(^l7(\2AhlZgf0Kc*0 eM'JrE'\anJ̟'Y?|Mчlܙs.$x\S~oYsÀe[ )];1zʐC?.0ʇN |ԖIB_BDaoHu6fuRw=y&R m`{JcٽqBC裳̄I\d.YN9QHzZ>LӅdC {$Tk"휕uAP&Y삐7P{[=Hu a C*ƋDa9 !Di;rbRENN:+|l=ǞE$x|q%2o<7=5"4a{,Y|~UĬ|&U <<ٰ0f" J$>}>%çUwnI~6\i\C?.<Ն J7vNr o0QTDmC-4{Ib M /d n9rc {l]E-{_x}bL$揈Df`è&0fJoxTF }p w=;|>H%{S} pE}L#3 ~|-ːǻ}1;eUs (Tf(?^EatQfz>X+x8YYpd#vXm,Pk#${o/pb JTzN!FkYp#->o6 "EhN6_8 PofLRy3\.Nn_Wl}bMӽJt"hvwE 52b@b6|Z!].Jy#ӟ~O~u(2m%mt7T}DPUicOSe&Ђ&칖`v7{C5qV6Q;a3eKƐM8>zcpyW*~0(jڋ܍[)~[ЖnqiݐמU]9`F:Ο+ 12"K )b ̏U?l@ᮘעҳqF 9Ye$4s~LhQ5G[y/[ast~ JK3eM<Ϊωl:SNc1gG vKW~UDO;}&s 3hq:;M,.)ըaLd?p'|m9W~3cz?`17N͔nN!=Sb="~g Zٝ0>NJ9z(7@@g#%ڇ"v:*cQUh{,v6w~Ԫ3G.Z.!O]' XZt({#}ON4ގx{})ľT=RY4-k)<)%KZsOfUu._}h~q\ F|ZGtjlJSo嬋 {֔},\I0aH\Ի Ѧl+Cc!z g<7$Z/p-'SZDVA>yTG#߶ije h@рk~EPNr'V?/vH8p榶{C>=;r i[57b. yߞdgDp( Gn'3XSuHq"|^8PJpK.!-F9b#u<0"K8h;ŭGrܘ "iP.AG7 ݑ / OoHo)Ҩg&it?rȓ83~PmoW|r+,/! GY{eQS!:duD%C0хB/XP DthD;ŢOh4֧ж&' ;Z|=pȞ{c^!>rEe,i Uoy,=>HN{k!C9QDw>}Pk &vOf+'*?J0 q_C2d[H X;c f$Zg b`.s3搽P_(Up<߽@1xXAҢD]EAYGg@ A:]?vWqﳎq 7Oc>9ZrutRAb▛$pq g1Ш8bsؽJ0uT[lBKP}Lzl>UYq[7R=QԘ=Ҕ)@[ %GWu$ZM̵q%znJa-j@Kp]bq N9s\AVV̍i֐U_ЂʀOºv^uuDBղE- 8Z$REQ_cr C,^vdᔚ<K3v؍92+kc{P#O%yM[Ug+kM?>;@TkE~A{E\\t*5ku59hTZ%I1@&ςR쉔 ]p p$RTh=k~dL yQ$ ۗPfZueD3ѓQ%2x8ޢh?Izݍwyv򃁹ER{S2cqYNf9" ')Bom?s{ ERV@Q]W;z.Cgkޟ1#Ʃ> GsU )&y'hV9HhuV>bOpMkPHk jx1KCW͜|r&Ŕ-N8?4pBwWhW9$qKU]꧋뵒Pɷpem.1{c.B562N7*̳םc ]#v;xQն8KN=mSϭd{ g ??1Z #8gNOT9r ?I'e."$!`\*Xl*&-oR(gaMZM\{MM"]U1,C?a\+~C ߩ^LFQݖZb&P2rIJ#޷s(=An0 3Z>{EpTzaӡ'AW*}lZ!/GqJ19{L]xzNlWT9LQF~\0hN =z̴3PߵD A)O.{N2˭ج5=;i ~]ޣWaxTgH>6GgT]kFr@h+b dIxw˙݌oEdC`aSFbA4BZH$т~"ZE(9?uj=IEo 4OG Ty* )yckd6pR٭Apx9oYir9{7Xᆘ-3h<\aZM4G"5Y|=^_7 ICKUw3w#Fy8 " sI_s*A!0U& %xGAՃC}쨋 }NGoȚѽ\Wm:IEAC|%Sm+z2[rqBy ?Sd;*H0a9 %u 됓[Hޱv]ҼAl/BJf' 7kUb ^JgBk$>ҒBTb\|& IKZVu}V~^I ̪f ,<\4~GL 1v@gKP.?Sͪr.><vLb&͈|Α@R/WW擙G{Zaɫ4Jf eԋ (ʸn蠅',dP P*nE0P Þ~Uaua f7Z#Ba'ɇ^St2z}[YPlz6qLǂ-.rhDf!z:lޙx돥UVa]#('LR-E0DIXC(,PbszĮ!;9pd{Na.ޠqEC.} ȕ();|܄3N\`q@S#\*hnSF> Lz̛Y5<^t_UE<++ߦ J×KS|Y?Xzhq >}PM*2>Yqe"NšFSkKޑląN(Q4 {.5œMP0V5[q|*`?/ܵkEO&r"4!uHmQ;5~ym5#pS0ۥgP6(> w!CTPw04:7Cdc7L1'6zۥ|DU˖6:Q:x ]0ߏ,}eLnoCڐ٫[q27kN|GWͬ?|qQ*\ѡmÉW~^]}{6őN[j(,+~egZwlը>rk$N6AJPg/ГmygkfdZԼU`$OR'K@F컶y3u˅3Wch@ t]vR-KdGS1-['~Zθk_]%<+(L*77Zp(3cpaR׃-VW׏8FO"3:.Pjg GBtc DZ??'Kmvo">3vKDVdb!yaA6tBmDx5ƻťfѿ@='볁Z}u#9Q,J|j"֧qU+JDdyD+4eTטܰwRsި/B˨%0_4Z-Ēm-Є}p灯V##[LC=ߟTP"4&ǡyޕ5mѓ-HD_Oۅ T\;Wc d2.v!rO1ҁe* ~4N X2_y g'ZGyuD̾:eIh?Vmں]b&)0A|!ƞPz6RLS,9 ["MΓᗋ~i S]^=D)B"VM^hKW'{_!Se~t'lчt6v 0[\ۅwspPp*W}eYL2ܣŗ"J)+".yڒbA!F45wtya9qG%~'BM"E,dfNl`렂t_̝^VRa504!s^ D 4EI '-y fG% bNK17@^6uRFnvP;l,yIBr Mr``iGE7O ^S5A6vWX'IY19btma A H.He|ԃa%قh{0t 3|\dtQX\mkvVrK&8F!Ne7 WEB; U.^)vvfu11ȤXT8ӞVk:'D3RЦژ:r?G{C`='{^Tw52&) 0QDɟ%Qm% g6(ҾzN{n^^&J  tLJȶްϭ MVJҟ0P;OTȴكwG_@,wYsr1gҔ*.p( ÐZVQ kE |Y`LbU!{`QI+O%p0rIcK)X؃B`cZG ׽5z`yFtHm=XjDԢݎ6! Ec>.3NEnU7 DJv&_3=9t80m* XƢQ|K4-z͹AܑH~_Jr)&*5FFoIЀ_A2XE%UulBxpifTʁG'KY(Vw6ms>ޑ+ ժߗe8%p^gM *Ih}\\ IA^NP"q|nCU*r! d'Xo8OH8 PhYԑB{7gOOew*EyIf;ϲ6؀H'Egm=. ddUW+3=t[R}ߓ?a#tA͡Oea:UYx6C~eqěpHOmQ=Ș*ɈO!U_7nk[^NLzȝR{85בzQQ=QƖ.v"5{ּp7kꚆ%z/cc}#piO0 uWjzH/_c{%!#x+#àDo4jj/PCA4SZ)RbC~/8@6y!摨ib ))͈ A~Ðq+`͏@B{~./h*@la.2Hcxa:sBVkL`"$11~:_?4#lx yzO3:$ͻa4eeLC*bie<{ً]~XvgoqFD6mjItFpoq|Fe"Uo1{\y!U<|fI='p{ehw񉜂|%]v3V@=j+idi>7, $5݀?F`ԏPSNjg {?$^LgD, gZK7~"o%i}xKmp>Ɯ3Z7Sg $\["ݧw\,V:U޹_c(AIDթUe 4>`!=Nށr&Ov? +7\W۰QOcQ Ӗ9c62N4Bx%MГ^йnHPA9MPa^ d^hMb(`T3 $q7(OВV63NI@o'X{ 71R,5:Iتq%uaCfr1»qWC8,$nC[DSK7'\ ݄R N(r+\fhdL\q *кZXV(ewSo"STU&T$J )E#{x ebHԚŷ f<,Y1\;w=Xͳ«?hW D-14Pi$oeR`>*1jlJP!)l6Ouk(꯶unbwxU#ľ.gΗY@LBGXWI> ͉ $ñ$jh۞%vs*}![84T| )c9(dcbaY̩`mbq=OE#sXM5_IB^=LB`g3́)%c0!˶xc*Q[PՂ][xAwrQeH/KqXoh:C}H/g< nL+NIĺD j y`гR/0!$? endstream endobj 720 0 obj << /Length1 1745 /Length2 11024 /Length3 0 /Length 12133 /Filter /FlateDecode >> stream xڍPҀ|p 2CpwHp݂ܝww'-}-`^{ ,bS4 H(iʱs@NV V9 {5,/ '˫LP Ȼ9<@ !I ifmPbC gZ k|01ytكL%+kF3;?!\\YMY!N"wk+:22@wk(M+k w'U`gm;AN 9E_̀p{i XXہ*Ҋ..&vΐW7k;W?K7HL^;?g3'kgVgk?zd#1K% 3IZ;^ݓ˵C! km:i]ArۼPY\@ r<̬HS_o   `nm0YZQ*Yůd;?N9lW̦^JBZ-W).xpX8@N/7qTMsOn Xʐt} 7qߔuoEҮvv2ћ[ym:.[y5ku@֮W+b b`׉fabr%vZY55ɵ7;k0Hl 뒙پ"ί CW l1c8y&NN&(׉xn9a!..}'?.&/C6&_eC\6O`S^uKdKcƱr,X^tz}xY _۱فn._Zÿ5ӿ5L]yG3W'Gυ{/(2CY ԇ#qgB￈B#E䶯$!twY =uVhk%@oa3#|YѕcOKטlnIpU}4#!C!5VMǬh0c1Qo8`B:>uԈ锣qx7+L.o{z3AӑH7b 477 AW! #B_Xێvd9F利' ^6dvbáL*U<̲Ňwrja9$'9 eDC:hmI)*8E5M7 ?L$JqcT}-0w =SC.tYh*ʴ?Ȱ(:XW&vD= e^3:^쵨IlNȥ"`2N˕HG>L~Vg4KG(VGdrl >TlFר9)/s~H] ( w2Yj0GQ7q.JƲF\L#(1[2w!10ob硻)iA#OZXXAOx ^RZ(vl_cA`STJɟj P$w \$\͎eEr!1zQ=ME{rh؋3z$c?τd,j\_ѳQ'?L 2s/_n#'5!lJnJ#H(}9 y[.;yW$ã7~.l̅:6Wz1ʕdM4{pQMBxRY>,RwBIl $J(&Kf7bH?A6DNr:mzDdtTJ_Zz/v&?w}䐓Z?~pZ%(⁶K=Hj% EuY &)fX5K 9oֲF-橈U pk F(0|'~zmPxtZ_U:LmujP;2^~~د %=:J>BfSSlLHЖbHꏏRO7 A[G5DAprSЗlZꮕ/çeWc|D-cAypHgXGh="Hl`Frvzi8ZJ!aHX.g(bQ!~rM雝ou8snI=(s+]%~#?mB1F֖,U cN7$R%xo6]7ҤElG嗐[y<}3'>ZV2) d\W| cflU*Ɯex$}W ؠ*pMj;M56z{y'E((6u-2QzSKvNunrbcl(v¤:L$ X"֮E+zXol=ҡ`bG KTf1'M(≋yK_ܐCY6ʍOFpvWk]/ ˗fExٺF_A1"ؔߺo;hr!ֲ.D3Ղg >>-c/!(JRo/%_7k?8P<]avzWG1a- ĩI-q\sK>ڐp94Ewrt^>SzOϮxsmO_R;T {ZQEO'E_{{9$+@mV#ډ̣RG9ɢ̝x/#XBI< exl27ag#n$4ȅ(> e+{.8L6[LP>3 ';XHr.yǫ_oIr} \&8 q@ʸ elx4g?LGR,Cl_X[ ax[RD ֌݈X@5oL}燢@Ι[Smgb&g<,^^42FGVqAS=Ju-=1qFAQ/. m6"ŷg}O fB1Ty:C3tlSbx`Ȱou f'ZiZn-ɘd'YCʐ^jxvoq%b>nO`yax)->^V8 ΛYP(ǟmҿ t(Vwק:r<0<{ cc48ՍOjLXXϕ GRWq}^t5&RfwuY<2% GFa7jJciWB1GB׾a_}F*M& ֑wC-} ~ (ouxM3R:6EprD ۄB,,:@snŢk&"pri_~f E_`dW'afflpѻtEui,gj&6Fr_z>mWcE8׏m`4r:*~E= էcxdzSߡP~mE˩0~,Lownj ʡ"]E.U>xv`dg;V_ZbcOA̋NpMX3{hځ|q ՂYנNH!}2?s%ld{]Pd$8h^K1X y).4_٦NgL1rn dhOtS?`|mBS[|QP7IkZAb^!DJM[xkBC4.ge6 FDRP[{^kNA5ⷐKp螆 LJm ^BKql wx;fw`\w,xDjmTõΪ}n8SJƌ\]]*p^'S-jCT6!]&)3O孛0PӂT+ho׿2IJRl1#ҳ]U_6qaY{`mr;Np6SNHA(^ *zAJ4Eq{w*fsyet F.9Q*qsD#FCZK  to#sQda \3bzx\Z #D`M[&WOJq-@!3^JپOXߣwL%gWpT30L- ,lI } GlO C5N--pHp:WqXrNݨ%c, n!< .#?9QJ+\ddK>Q?VwH~wr{PomwDҔfV!+hxaq+ZSGvP%cszcGWKƁ7"wh[X„:lG!' ͧӓHǷűXفD5;)gn m|4ScSц"N;5_4TScXYi䐷qn,_UcnW }Gp VDI\>ă H& ۣ| 9WX.Rk]LO0l8LU>3"+Rw}EFX׌%׊ڥ grWr>c^T1N H-@d7?c򐪔镴& _cqU$CK"0{ [\|V|o|ƭ#dIXL$+}9\#{)5ëU+/.\+ZJjE=t6N}*Gt&\OwB̙k衵8ϙ >d[{)E[Ә,xXH` 9DB Z+΍DۼLaVDZ/ingWNEDEY7/Ԅ* @]^7LX>x41%G[JIU`h,Z.U Z]6oנ"dKIiLa"oV"S$gw;YLzPH :56z=ۈ Q'x TaRGv/:ɨ'rzX獍rYṄg3}uWwigJԢE(0MF33Sp\t@čsmFowtZvt9 sUj~mҺ:;R]RjjJv>Z/ej$J|s,҉Ӄn919ؑic:g{wEɠj:w챽L}*+S]}­o۱V:]jn,FrXEa [ɪ|3\HQu6p/[5H3Ja=ОN #k=:NlXb{K=51(0ADr;A /ai@3zO9Bzy4 O=VV D/][=%%[f{G*#@A h[ʮZ _1T;4a2iB Ym4`w2cxќO)7.eWCzfU&+ tlq0%FMLO|\r4AVq:/2:"),(p|-~[JkGs3%~بK7ӟn5H=EV%&uyzйlu:;sZʌh8 3w?wD ľiPqj)#vCIh%#q U2P>gܢ% {;.S ɘܶb"f6Ef(j;I3ȁіtJgNr#US0bH&Գ 5B$^x]z8 VD3c{+,?6ET _.cݜy?YDYV+kF0暱{u庸NTm*' !6N**}{%i}ĈCa!^O-Bڛ%KGL3ڝoE4:P"$oP{|LU;[qJ0 AwOZU98#BniRٗT=G'K"|Ν8>+3S2o$:׳عV zljv-I#jֈ(vd 'C q> >q?кUQn +";3(l_)5ܕ)L3j- n{<WJPOI]O2\LJc<:n/e!$E3MF|~)u J^pz$|U Qh'1]W*H*]R$,"nQ=3M0~߬ *5iw|BcUILuxaPZYGJL(4,ӳ+Nwḻةh7˧; !6.6P'3Rdhbpq7rZ4j^-' >q }2r&XMuq!r}P\-jљVrq(--1O'oD`7XNxbC" ~KnG:. 4P+2MBֺkKH$ȧn)bO 7p?Jkv z)=b!m6qeaa=ZtE[k=s#~L5,B6Q$Ts*$ })$/m]kg̙Tw6!qSv&m(E~+ΉW I_:ʬ߿LXJO<˟7@B9]\/_V#jU(i%Zk_SeC[AM aQ"W]waHgV(2]@Oq)Cc]u9 o#kŊ1r.) zNc. (p^ix;|%*]uU,ڥW]ʍ#tdJxV_RWPUyXOfG"t,p8YM?'Оl#vSNyv?~ljnXXq淆_w3t@)-Sڍ5hWg ҙckȍEm\rjo@h3L Luo^_Nb0L_ܛC8TRSwCY}ԕz"5ZiճNQdy 3͏G%b~ K?P;b0 zB0{$O aԽ[%AdEb+4T]ym& D-"oR \ape)}_ L#Yv-4&,ԙ\ Z9ѹ2HXE%)(![5P&eVQń&ķwjfd1xpbN[W+IKXCUNj--SşM`Pq8c c:!*&FΕyjĕ  H& Mq=% pԜ'>m72]y5`R[pO6m`qʊfl`= wfLGoMF;Z+VЈ|uoG'&DdI 1ey/FHbyXRn?]:%EvUiQo|%[#LZƄ.<9׬!áA"k3jo1iZӅĽ97 OM^[=LhK^ wj- \jyOQ NZr{%.|NV2 L.)w!RfeL% n"M6[*rOe2RŇtalFVgn1DnT pWn($4_|93Bt|2l'RAJտآ[YeݢULU&l $9}vw*$IT:s >gI[Վ^P~Jo"ps EwTO٘($!3=#}_/"YZKn^]ci5~?w"=zW1cM'o*LǴor\WQI'2#є-̈JY;H00QqsP?~ׇDnJY6@A"J9Ic/R<FW, ~rQtQ@ea[c2 7EP|4ʨ(.L wr`^I> _rbJ6><je Z`g/{EO -jmQ*z!ORGx3Ĩp>DCaJ bqe*9<aEڙ1htǘ{KOnx2*%DHSұ@wZlg>P<*Y^@zN(S\r.f?yV RN"iqrcj WNw?XgӘ ֧;Äk})XũO7+mgT[+,g#Ō d6o Q?H?^h2 >[7TmRҚ3.}!z³R k595FGqE>Gp.Tc&[΋>-`2ۜ7pDE> "92bQA,~F@7J)3/'2,UjTI6MW^]Ԍ~O5YxP?c̻Nt`HeEMӑ+AƵyr}O-3?E&'@L;x,Y01q evFLN1}w &&n//="tw[A|S:$ ~4glUVHrwSZn >tdbq%@Ͳ7xAv^ܑu+5yzսLƂ2Usjf(N/RN~U]JRPGYи0i7> stream xڌP c5 -8 !8 ww  \}ޚ*f֧{uLEI(`W`cr0#RQi\m#Ri]@X;M\2 W=@`gge a2(2.T^ K+WpКxvAf&EW+8-@ tV,,&v.Ζ W+4U2@OïT +&@X` 2ڻ]́pv@hc0ipxd`]=]&غ8MM@&`DU& F€,io.`gwuAh?kca_d7 s7GM{PV bee`@O3+hx9V%Y_>.&@O"D669` #- 賂Ǐ _ 3wmH2SJ11O'o?,𔵷p,K%t[ gb5a<e$fk??z;?usx6?4_ xD-mm$E 4WY=kg { 诛t2.[f7s0kع&&^IbX\.pu~ gĿ "?"X#^F|+E7bHF߈"F|8ҿS7bF 8oΠJ34ĺ+3qei:?8gUf/3s%I !` ?I; ]t-@Kg7kpXe? {? w7f,#s]\o2`gQqs?8qqY;)?\+l`b_Gw. <\lM\NdqrqD:\=pp=h?]l@p<pP? 8Hߜa?3?77߯@' qiL ĺ6ZȃiwBhjW;gɹ.*+xF4y}u[Zd縥.[jQn+)܁ɂcѺ~b& =g'_ N9\'7^T/Xw}Ҟu+c {UHO3L1L?ú2c{]bL3 p|`t?VE@IO}96M#v"S\.J >O;I__AyOzү%H!kWؑuCJrsaPm3{,̵I}}--&50'?lEX=.^Y=O2S7TDt4tF,U| 4W.^8?z{x7x&Mrb6Z)BMdL)X.ΰ[1n:W ۿ6*{4Ǡd}8j:xw 39$)U8R;RKey[Pv /?Hrun,R Jl ES~EeTZ|IAxJps+ZlW-1%j 1n^#CUѵa5AԘ [?uįwN\/X3=O.ʐ6 x*6{5Vb;YEav*sa)9,`pRa;9|W& cZ~.pZ{5/jmmӗg;>µ2DqR_yDp5xDWUP#>Eˌ0Bujjuu%H[Wd 7"O%<1f2sn'()ٻ]fGR별#M6_H(GRT>"̌B'ν(T9}6Prm{_%Pz>gS+T5-Ԛ$򚊻5AG9>1N:%uXs–*9<ӴEeK Ao~p ϗ=N!pYdPl]y,9"e[yWLو"7EIz|*= 2 `j]0>`Cy;4͑5ˊj4bWz{tQXlayB( U~KKS;_;Q̤x&ڪc{{+U(6_0-'!̇SXW上PTHei^LǻI;ѹ!\ﵑL3\0|cC TwDjx[5R0U\|W?7Ŏ)WDjhi ^K 4BquA0h!b6&$3.Zt7JaLMK AAߚEy%ȯx!ͮ*>gC|W'&p:@ *ͭ.QmIiؒRxqEV"_ 匩V*XK_ЈLDDi0Ah ϣ5.fxYC#V^&h}Ι@C19kOց6 vm@d;s@ 8M9%rQ&1` g7b^faB`,>.u(B<}#ӂKh:S7vW/^1Pw(L͏Cc[rpd]e/ytY GKGI(|_*L+5`]e_ҳB:~ z31@:ȧڨs qw^d4b' O>?k=|CP^Ydh:(C" ҿ+Nl|C Y/ȳSV sfdCIC&WjVgnMW>Ҝ9MxNwN,[)},H˅t.݆<-M%=?;0v!}So㳀|b=-n# GU2ϟ tXm|w£ybv0WAf߬6>_cxUk$M u#Kve}8+{d A(ɷL[`H^(ZI>3eT8nN20ndzӬCBKz[>g#*arL}G7#V߻s'/B5x't( >@%=񿕏~~I Əg:]/eh!6vAN[I''YV̴.1b3-4R|E2Q@ r hramNuZG1A1BQh7 / ŇD2o MQ:lܔ8M~Aڂlֻ-g du}`Da}"OMRA~v[}dt9:$GܨFdaZU 0ۇ.Zp ;_B3& g~N 6˙zZ]]v^ 2&{z',v.0&FK.:+ \adːHNwFp`d݊.Aښ#|H߉r[A~g &s>1 ,f,Ar; 6#u7W z*Dv&c ݩaLIVjxgZ[f$3#voe3GOAR8:u^ (gxɸc0nfPr7U&QcUyr,0d{O$#dXNI@uOPj7SR۬51K<{Os6pE2g^F m`M9Ŀ;i-Z_m]HCEL8$of}3ԤS SZ|댟IkΗ"9ϺdšY5Mf>#nk8D EWT-Oyz;*ɑ6DM^?JUؔ"սPLm'\_cO(kFѕޥހ+պ?b~5S`R"4-SF%>h0kqoB9Kҭ R߽086G /4㚗q~^8b5fEgpGi<+r_i,C9gdF#>pq8u[d&ۇش묙)@wDּ޻qom Qj_AlQKvץ>)"xhfp~_c28])7}FMWHhn~(Qu;ϡ܏~ʇ z-FZ_O ra8cIp j7QQQJBR?iwSwjއM( M+8iG_TVeQ'W}ueͧ$MWs8݌U48OCdxs4$/paۡY#4Lų7\w=|POE.? ͐BŦ*2PQ[o& >Jҁyoy M*JA(w o!ATcPN:W9eGt(c~ɹv q.x-e!)_ FVʳ)D+6ry$nü[;|S8`)Iۥa$YN Pp) cCN=˒]Q=[Ÿ+岍.bMsKm_ugykfF6HeܛՓ]}c9#VEsNXd̗D} gI&>{Ӛ!D$ 1jN$e4%h{  ZV @ CQ1Fz F'֡ĕ/I\U4JhTp ш#!ͳg%&ȟok&1gg%. w}z#$ř{=1گ5 qB'jM9 /orhͬK9 -9GpD:Lf|G[#o>\``b,툹oxaplgLP0vyw{*Li"eh* o~CyikcHTB @;gaf]6+t6uJXB6=@frzP 1kaI,޷o!5\ɷL~<sKLݙxͲ╱>lC-izu;pHiۤm_@\Joi<zPP w1kɓ!'L-3[ Ce*C?O7I[|هCX\O-z\ EM=dP=[6ۗuRZz2 {cG` +_Jա: xϺr68.-4 a{|MPckbۮu.+ ~=A{JgZl^8éfY}?\.1v%Tr[ڪ(x}@OJʔd?(cVҊ$\%D4сWn%8ٮE=Y튎_LVlOn|CQo8 hDgX_ Ϳ=Mz;eGH=yjX$ r w.y>?`}bВc?ryZv>*s=ų]~̏,ah-Bٯ ʟΨ8(Z8` W?l3zgmHCqG݉ MlfL^ $>\6}Օc˫%h09eN_Xj* +1,'#%M\a='~2C}<j}81T`a2'm@ b/m UvzB}4slm17b?kT| =h$71dЛAE;"dRsYG 0L"1IQ:6*j\B)CIMAt1;ӣB)Bxf~^4o.~?8'RRЋ\CM*֐fz`h&6FΖ,'t B|+㐚'[u @,|0ssQ1YT?.[(#^ab%~xRrhu5h7|t*u1ٖm[c%)WaClcCDxZx]KB%fDq;~>)q1Cd~Lk 7ƃ3pam$?2Z~`Y!V:VJ#"GmmKɵE?MJ+ClW~ࢿk1S%3K.l)R$J*] eYf$Q܋M;GM Z. 2l~- ]y/d'RaO!sAp(K(c_DjNQ!:9r=jǟRc"Eq#EIr_T=FF#`"xpS7-*9W`|fzڋ\i%\[/-Wز6CH`o vܭ )ЗHnb9IF9UQ=*D~-0)p~ևQӠb >Qs()UUdkO_+/?c+6[N}IGUVC󰛣fmwB>D$ۓRLŸqVPIE0fϧYӯ1ş;RxJ7ZD9:N3B]RfSV c J{sz\&dLzΝc?,RF!1vYG?h["[fӤ$-_M}A >Bg̉<^O7d7-M[Y<_ >49h/&ea``R]k` Q:+-}aq}%g4ɓ'Y:ށTLĺ݁FPk/!;UFUFbMXY<պ=wFxÚzq"qA`_fhm ׾z.U9,g@k*OY)jtrDGR!v77bR6VX}+}p^mgI>b0=qapx=ŎQx73J _3hGk2!%QΌ\'#\҄0TC*YWmpC*v1b'0$& ET b pW`N%Llchdn/lsnXV6^XoDp5o]Kp_6&Bgsb +sFs''L@yPm%QI\Wn,β%AJ4}5zɹJ|?eiy^2z]C'YQwۂ 7]>eݍC:(dP"R  >.#TWX\ _ X5ÓElkeg{8:wꂪXj&Hi y1( K%\6.9uY^1^j)`(&uqmܦN~f $"+cF9r hK[TYY<{8+y>7ۡݴ z)>"*6qwp߿ rp*>DF3G˟Qz_kKd[+fi1j&"S-G^T꡽j\Rٙnm3%CSf(F) LxI;L+-?"]0?T_?bw8# xuJ2ëޖNBn4ty* .{˥Kȏ/踹TGR#_zjG|z|g(Tf2d=8%1f3qqlXTc=-WV,:VJ*CHj}W/#RWf|Ԋ~JO1+i`Sn* ѣXR^a,7%,١!A!y_O:ь,5w18G y5 P}9٫SϘ/O$QMAU9942y]4Kx˛uk>5UB[>9Qz1X"n "A?>Z)}/v/]qQ7Awz.ىNz5ZO3Vgï_~2`H $xTl6S8ӭ1O0m.7}!{Pj f㳲cR\.3zM^(ghثF%R-t܄fK|gL5UW|qJ_ġ9eꗄZR'D`1A5yY=9l!븖Rey(אhOǴKra@NmO4G3Y(v?Xyr^ b+*$gXbS(~ &{RJ2#_KOxsLk/Xvaޜ}lxpB`FX5ĺT,m4o u)qnbpW׵"=QE|KϝOѝ,=LK\ 37'Ēh `SfGۦ8 Y`r$pU95/2nի*Z [u$PgL7JhIR{m?c6yXI>jkl& *^# %B[l)@gQߠkQ Hw m;10Y&P7)̞~W2ﵜ\z^XW!/]麿H )e^I<$XȭQv?WE8/@a3s !U#,~h(n:aCdB^"c@^ KHP!` Cţt]OW{QCo ,fjR?Պ]O$RQ0cfNK+z^5>,\ƤRQ[ EJvA"uoF+@Jצ.b /:TncϻaGAj,]_?+`lt f8\W'A:X5GK3@>/r[Rܨh0+16ЂQ1\o3ZcMG9o~-Mݛ "j1Łlr垳#L&+9F\+ffvӏtASE*!WQ{/ɯHޛQlgN4s@T5/vȅ‘|P9uE}wLpԜmlJ/HmE r:pmMpL)3z0h1ڈ 쒅z=1TX$%TS˜ژ8SKң~YnYۻmxFk >[ V+lI \:듄^7G󋳫/mpN ->:um]Q Qqic&Dw [HD4j֓d6"x * NJCنI չGH9ۈܳ@D,Ko. ƵP/o){oT&EG-VvBVǶ1ZAחq=!LN{ZoYB>LEk1@zeb(̶ot>r=3i*.?-Ȃ\G=3`X9a u.Qz`RE9Y!O0z}a9E_OGkXP9uByl n59 r}+alt~%WNu@ -ٻd ˁPgxKx\ĨjqR!h2~~~,Y{#n&ct.Z9ۊ?vW6p{~Rk6 _ ŰU),̻Dui"Z;5OwZ!]0w%-txK_V^V5gy),KLBGQ ^flc*g7]\IKӻ(*g[Rp4=EAyVUxx0KXU%*^a83c((_ztnS>")GRz"`xOz%!)Unn!C2}/%Qe[ fQ"nژԺ'\y* d&fe_ڍyl-A^jQ};|pAT$ RLrY%wku JD_[,^TBs1e.*(+Tyo؎LQ^0+trSy*ޗKF32 Euq +I?IMKtGݺ:l_knIΓH]KƖ6cy!b}mrM w'W( U8M~0FHM|!n_hh(HOD,Sܾ5CGnXGJ dcnchwZ̕>!w3KU8]tKuTޮuȑohpIG$&^ϯ|* /mB㢓+3Ox >R&5FEE뫎d_Z" ˕S wq٪;2G3[L{7Cѿ!G5hL-e z6sI=>#ڶr3c/.׫!Z%<]G2? Sgg{J[oґq7eAv|/ {5x0;B,=a10>hy|ArDX576rSA:kmˠ ۜIy`UFP,hz>S^~wAEt#_,g;4uC)ۚȡീ)F%R{roeF;@ 폇۴WABaRyiɸmB$L2.l(zƢx[BzUۼlH! s+.yt~w$Qrv"nY2lM4==Eـ8]~bOx&46nCP݉)Aw0`2gLN_)C '똬{Ĵod\^sg~ͩ8_lk1~ ?挩m|)0sl]!xTh¢iqHJ_x; Q?~q"d&'mod9u~{`_sdb|obp@2@kt tUJSc_XYS$rO˧?GpfCf(bX|ie%0]1juKE U0}ShǧX XtnRZsw.)yeXz?$lG h AQcQ):Cy  >C#@X~٩ӳ!8#nl1qdp`8a1Dy: o9D˕I㏌p{r<2~~,UdCHo!m{fBĽpQSvMPgtٕ3MNRM_e- b.S6#QVd0NqnӧGT>؟;(O Ro&}glQVuhţLQA!^FgV~mz#j8\@ 51UDjE& !Gx?,9+$As|t2-rYN ft /-2 ( .hjFjFPHO1Қ!;֝|ID,mvPqG/4?CE?*5-N`)$2gNr#}yCd)%-!1,Ɲ2kAt-i0bZ>:$%2'{))_ܮF"3$A"\2݊ v*]Muu=V_0]\r\d2DrLN5[X͜;Zp^ N,g۶)?6$+mkm8sI5BdsH̯BEsq3E\!pP=+IK^D͞6>0~wb<]m J& ;Ls6j1ee!#> _fsueQZb'*j'Xكzˮq4cN? .6/j0#tYoΫ W<:;E nǿ -{H/ӚWIfOֳ5g"ooVg@h; GyC>%I!M7ϰZ8h+|w:mCrĒb=Z;0P],8dʔES#v: XTSAr|g'1/d<; (Ky/)ZRe dӐVY0oj}&s40SBMO &> dYީ(vD}d ToNkl~qS9NY7rCXt}/m%8ĵN1=:\n*'a ־#gHOX,9uarg%wz`&b4m$Φx枿ya-6h DI,2 Kq8SKEiDrաfۅ'PfRΫ3ɱ|P.t.rXB"3nRLEvwqf+HiGkHk`P!~*C\yAMSWA }{9.ՏpUB|K世xT ٧ 䋁w En -{V|Ey%}o[2n饾2%)E_OY[sbkEԩdUu.D74u׊?&,Y ddRx "W4[|U1g6W%DDno'_\1%?0ߞI5ZShp@-;R=8^/ ' ahl&Y9jB=\3A/-r*)}N;m .!NƉN!tʆ)>iG6qaWSͨUiB5%v[WL )ڍxtMmNmMյ\Gm0AX@M-}L3^USH%gV+Qy@(_:|@Ʈ~6M",щXTާD~KDŽs墨YBt[ME/}UjAᕭ+WZ;[ ̷i%ol~1s 1ëa y#r_gLŒ쇐?<L2J/+0*oKeqYuV8ܨL9/ h8`N TRɤ GPF*G8x,VY;$tWRB4nA:!-x (;w?&]>LMf/UKYa-i^߾bm@/ CyT@nvSҌ!묌Nk)N6۩tC786cBKTj% #vesntNȿ۵0wIgԱ kH[@cPT;BGNVViJ,a7U,L'48M-jӣ9٦?̉ bOd2, f}7(l>D f,GO"ܷVSQƼf+qLq =xyjY*1. )L3g;{ MN[6;k8xwuZw Kź ga#[]\n a?ϣ&G<ɣ}8 N?AǻŃ GРzoBx=RcUV=;gVN2r47b (#̆4i(qI$ %,8]B(˕מ endstream endobj 724 0 obj << /Length1 1320 /Length2 1579 /Length3 0 /Length 2433 /Filter /FlateDecode >> stream xڍS 8Ty؍Fl[Rwj&dЊ9fΘscB!]\RdZK(T+TeI%-/e my9"os6 ]07FT*LIFF.?IF)C8J`'tNb(X-XִT*SV8Axj $#GL !||c YY0wl,A "Z2婀PP8`0^:\Dt8ٟ+Aĸ,E)0ĘQ#&(.%sB$02P$>6x21e=`wI "}҅8`R4+K:PT |bxHS#Ř6hH)\"#n\"hpq (StB 'db$lH0B')^l/_ɖ?ids :SXxCduGX1Q.1%Orx@L籼000DMT&K|h7]UQ'YL(Ob,’yLO;7FCLJH]\M0}Q.S D)HT tba4xp8 b82<1 IK*xTP8gI2=|#`.>ƵRm<@nn]58<7ٺ8Gwo?'=d_oNzdKzXq=jҒڊ}4jK޽" BJ85Af9fafpYAƲ˽j {4--e-K RxvQ#͠G[f0Jּ5A٨YqX`iJ?.V<&k}ܖ=wrY/Czve57lߒIa_]R>'>p;sLsTmS4rSֹ~cuۖĎ;[tyU<;OllܨN uk)R$T)ZvNe.uk=z/ u{}xSqaK V>j$7+-X>'5_9]HR3/3kș%z:uڷ1Jo,vD{˭#lrnc/N,e6ikZ8얜qt#Ld RG/L:6xX~֖*{ ru[s7AϦSvw b΍Y;kmv*<{)ى{l{p;W9Է`~6S;ΈjrEZח'MydGwj[,߲_'UNN :0₄kSXͷ=z0s M*٨99Em͗/ر E%hSN&G]6mq{*JgG.N[Jorz1{2 \>f˒!hOZYbv]Re֎m Ůy6EY~cz wD_t$q݅߈gK pSg/*msL~~{4#oAY__E2ҁ9\Mkf1].KZsstv_yH,UsL6>Cz )kS%g szZq*̦Sv}U?346~upͫ+il=ΈLXRR`W3dU( V jL?cX+I?4e==br8u_nDyr7uϦy&t*] s?7w8\yxUn)ͩHfݴ˾Kǻm_2_P5bT8[Voy)w&SIxR<//V1 UtETe+_68PW-4ZN,ʬ/[U>`~%V ^7ױylpWl/f^KJnlbCNZDsՉ^5<76Dtˡi~|#ze 9cn+ﻵI/N)i%?ޫ8Ԥ+cwv5*jo1)_).Yk~a.>'ȊQ^{Qq2>s|8GW{~7ʸ2 endstream endobj 726 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 763 0 obj << /Author( Ernst C. Wit, Second Author )/Title( BDgraph: An R Package for Bayesian Structure Learning in Graphical Models )/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords(Bayesian structure learning, Gaussian graphical models, Gaussian copula, Covariance selection, Birth-death process, Markov chain Monte Carlo, G-Wishart, BDgraph, R) /CreationDate (D:20190812111047+02'00') /ModDate (D:20190812111047+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) kpathsea version 6.2.3) >> endobj 707 0 obj << /Type /ObjStm /N 93 /First 840 /Length 4277 /Filter /FlateDecode >> stream xڭZr8}WqSS6AVmm/'dl';IHrAH4ynP*S:R,D בHdRcRLB^)>+fS9xIL$WBHQ lHI!WxИ{KISl ~` XϨh"R=(#rm=r.&y.|do|xyд'>W?GV9"'D%舜u2_WmG yUdrΗ;FԫdD Q"tSrFKrA.yMɘܐ7ܑ{L$[b2%lsF_xIfd|dmr2'\ǥɂ,:% DdHJ2:uԳzʍʵΓlJMAd>-IN R$_I)Iȵ&嗌lg|%w]ًʋP0}vTp7߽m AEfW&konh:20##3ٽj"va`M`궅=ܼ}e<œOU>y6m l֓?81UBگ62Y/T2Ji53e3$@Rl ],ǾHV M m>_. 061և0|KIiS`+P-7߾|4=AN^ۦb=45kMKT9% &S*)L3Ӆ߽yvqWŁmCq͕8w c0>gmNkF׆|nqZOx9غoնIm5UyYG$I,0gͬfsDTMVosL O'pjwhwIPd&Yw3۫ܜ_|m|w:KXqdI1'E9P8s(v$l1}ow$XhzG5``Z1ڍ.r6e:ɦI:[lt ?Vß}`}TWT8 -o e)8V$/JN#r8ȇdZ. ˇewîyu͟5~}Wg}51/7l|֘u*С{zPb"+M@ٛ7z?:S8K {緬;'_quǃ=r/00~ǝ1 Xkޗzz??0R?꥞Z܇rS~;H}3I;7+4>D|q|i77'h:޳um7^^=Bр^ 7 ߟ^=?{+ox1\g R:۽뚏vf]ֹC֚=VtG{crNȭ%=vLA/kveU]ԃmm>dϧ\p6xe01[Q_'S8'UG#c¯~ǫGs!&xu+V$YmIn-)*z *xAu =:Y ̒ZGUV%o62IQIϖcLϮւl&% '^$ gOV5CVi7?8Ri_K/p*߮l*5Cس5U4L 6ƌ <p5Uxuy:w->7tspq0YRTogmkF= 0ORF̌ T BFڃ  цkH x>p&8D Vbraٿ7iFdr WQ_mii_Qrrd}:C>ѷ\ A_7 P ah 3` 棙o@8u#$N R.@E?!G(|g205-9wzWigM}dSݓ+t__ ~ ;rMe6O&yKPB< |$RĊT*ORkZ/dYƥ4.ZCu tfe)gL cMdr@ =vGN5xCGv#~Pu fwf,H(l o8 7^UF,9~1`z&0nq85gQ6;%eFF͹M32z?>Orxo5˳II [%906z|z>>,Oʅ3aBNά Nd <&nM6MCUZԓ"E0jZ{OR۵ v.-~-u†i<|* sHr1ߗ+8kn{US&E &&NT 𠟭m߷EW(wNZ6|:/%ZufOy J]_MP,@s m?I{j-hk&e'zSеh %Uf֛2jASDZ$)Lrds^exq堲iweMIʆ`ԟ:̞;(p'}_#3zYŨ}6IF!5Pgous zP&8AT2L {:B8[w4:]qq||LZOD7wl9+/xMuQ3d[|9A ئhbs!-uvrDQku]-t~9bճ /Iag^Bͯ$ <875EC68BE5E33FD56521007B7C831693>] /Length 1815 /Filter /FlateDecode >> stream x%Kh]U:Ϧ9}7mҦiGnMII4)lKH:*8( Eg EEZEADIQ`;X{{{~$矤I&M$D$H,9]"f /$fTɭ!f "wvM`v#lis$<0ar[i. ɝ'"4[F3Anͥ\Fm`Y6\ VNk:=@O04> \3TUGUS9Ug e$>pa (8'%I|pb*-@+߮$|l?8mciX 2H4@*EDX*Gav]d h ,yp\c`LK2WW103>=x<8;~U,wlcci pgd\pb\ _\p]eElEGDqD,iyP<:mGHSbGh>Xbv癄BC Ms[2xžbcvYƇw#ލx7݈}"8b#;-YPԑ䬲****-y|[ŬqYC-lfF5fIdDI<N|OF<Gƌ3b̈1#֋}fQ4dl1I6W?H%J|[w@ ` Wvоm̀=`qu#UDr"nA4ҵYGny4']Xިhly h3{{]K'X ւu lfl@7p=yBs|B}`?8 (x ܨGTi $8N3` ~[6CY0b5Go9r1c.\s92C}Q\ ҎҎҎ_,K.:eBi\&\>0cA8 8VqXűc*U89 zӯi,q 3;]ܖ HHHC|<8q7vihHÀ7hrqc?_ӌ@ * 6 lZ"_Kp{Ȫ-Bd~>W9/k钠KV+̷;C+nQ, =g]V@A&d\3l͌kJq fO8jE]lvO-vX^c"ZqQ΀!0 ΂A'H+~p 2uVy-w nCV@ Lf(DH/zv~|ʀb@ t 쁲 (VuRҊԓ#L2jU":lp](PY5n@@M5 4P@ 6P0b4Q+u蜕TtJo肕袕~hM?+֏MXK.Y|.[ßMZW)Q4muEWA-j/KZx_MV;`թoͰ+/(iշV+*ZvE%lZUl7rQ&G\e:6(%GQrD%(zK@=ruҫ^F#c#G=rFsݱf*zKn endstream endobj startxref 763459 %%EOF BDgraph/R/0000755000176200001440000000000014043535231011762 5ustar liggesusersBDgraph/R/plotroc.R0000644000176200001440000001312613716773560013611 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # To plot ROC curve | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plotroc = function( target, est, est2 = NULL, est3 = NULL, est4 = NULL, cut = 20, smooth = FALSE, label = TRUE, main = "ROC Curve" ) { if( is.matrix( target ) ) { if( ( sum( target == 0 ) + sum( target == 1 ) ) != ( nrow( target ) ^ 2 ) ) stop( "Elements of 'target' must be 0 or 1." ) G = target } if( inherits( target, "sim" ) ) G <- unclass( target $ G ) if( inherits( target, "graph" ) ) G <- unclass( target ) G[ lower.tri( G, diag = TRUE ) ] = 0 output_tp_fp = compute_tp_fp( G = G, est = est, cut = cut, smooth = smooth ) fp = output_tp_fp $ fp tp = output_tp_fp $ tp # graphics::par( mar = c( 3.8, 4.2, 1.8, 1 ) ) graphics::plot( NA, type = "l", col = "black", cex.lab = 1.3, cex.main = 2, cex.axis = 1.2, main = main, xlab = "False Postive Rate", ylab = "True Postive Rate", ylim = c( 0, 1 ), xlim = c( 0, 1 ) ) graphics::points( x = fp, y = tp, type = "l", col = 1, lty = 1, lw = 2 ) if( ( length( label ) == 1 ) && ( label == TRUE ) ) label = c( "est" ) if( !is.null( est2 ) ) { output_tp_fp = compute_tp_fp( G = G, est = est2, cut = cut, smooth = smooth ) fp_2 = output_tp_fp $ fp tp_2 = output_tp_fp $ tp graphics::points( x = fp_2, y = tp_2, type = "l", col = 2, lty = 2, lw = 2 ) if( ( length( label ) == 1 ) && ( label != FALSE ) ) label = c( label, "est2" ) } if( !is.null( est3 ) ) { output_tp_fp = compute_tp_fp( G = G, est = est3, cut = cut, smooth = smooth ) fp_3 = output_tp_fp $ fp tp_3 = output_tp_fp $ tp graphics::points( x = fp_3, y = tp_3, type = "l", col = 3, lty = 3, lw = 2 ) if( ( length( label ) == 2 ) ) label = c( label, "est3" ) } if( !is.null( est4 ) ) { output_tp_fp = compute_tp_fp( G = G, est = est4, cut = cut, smooth = smooth ) fp_4 = output_tp_fp $ fp tp_4 = output_tp_fp $ tp graphics::points( x = fp_4, y = tp_4, type = "l", col = 4, lty = 4, lw = 2 ) if( ( length( label ) == 3 ) ) label = c( label, "est3" ) } if( any( label != FALSE ) ) graphics::legend( "bottomright", label, lty = 1:length( label ), col = 1:length( label ), lwd = c( 2, 2 ), cex = 1.5 ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Function to compute tp (true possitive) and fp (false possitive) for ROC plot ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | compute_tp_fp = function( G, est, cut, smooth ) { p = nrow( G ) upper_G = G[ upper.tri( G ) ] sum_edges = sum( upper_G ) sum_no_dges = p * ( p - 1 ) / 2 - sum_edges if( ( inherits( est, "bdgraph" ) ) | ( inherits( est, "ssgraph" ) ) ) { p_links = est $ p_links if( is.null( p_links ) ) p_links = BDgraph::plinks( est, round = 15 ) } if( is.matrix( est ) ) { if( any( est < 0 ) || any( est > 1 ) ) stop( " Elements of 'est' must be between ( 0, 1 )." ) p_links = est } if( !inherits( est, "huge" ) ) { tp = c( 1, rep( 0, cut ) ) fp = tp cut_points = ( 0 : cut ) / cut for( i in 2 : cut ) { # checking for cut pints est_G = matrix( 0, p, p ) est_G[ p_links > cut_points[ i ] ] = 1 upper_est_G = est_G[ upper.tri( est_G ) ] tp[ i ] = sum( ( upper_G == 1 ) * ( upper_est_G == 1 ) ) / sum_edges fp[ i ] = sum( ( upper_G == 0 ) * ( upper_est_G == 1 ) ) / sum_no_dges } } if( inherits( est, "huge" ) ) { path = est $ path tp = numeric( length( path ) ) fp = tp for( i in 1 : length( path ) ) { est_G = as.matrix( path[[ i ]] ) upper_est_G = est_G[ upper.tri( est_G ) ] tp[ i ] = sum( ( upper_G == 1 ) * ( upper_est_G == 1 ) ) / sum_edges fp[ i ] = sum( ( upper_G == 0 ) * ( upper_est_G == 1 ) ) / sum_no_dges } tp = c( tp, 1 ) fp = c( fp, 1 ) } if ( smooth == TRUE ) { fit = stats::smooth.spline( x = fp, y = tp ) fp = c( 0, fit $ x ) tp = c( 0, fit $ y ) } return( list( tp = tp, fp = fp ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/get_things.R0000644000176200001440000002257213716772742014270 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Get graph from class objects "sim", "graph", "bdgraph", "ssgraph", or "select" ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_graph = function( obj_G, cut = 0.5 ) { if( is.matrix( obj_G ) ) { if( nrow( obj_G ) != ncol( obj_G ) ) stop( "Adjacency matrix must be squere." ) if( ( sum( obj_G == 0 ) + sum( obj_G == 1 ) ) != ( ncol( obj_G ) ^ 2 ) ) stop( "Elements of matrix must be 0 or 1." ) G = unclass( obj_G ) }else{ if( inherits( obj_G, "sim" ) ) G <- unclass( obj_G $ G ) if( inherits( obj_G, "graph" ) ) G <- unclass( obj_G ) if( ( inherits( obj_G, "bdgraph" ) ) | ( inherits( obj_G, "ssgraph" ) ) ) G <- BDgraph::select( obj_G, cut = cut ) if( inherits( obj_G, "select" ) ) G <- obj_G $ refit G = as.matrix( G ) } return( G ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_g_prior = function( g.prior, p ) { if( is.data.frame( g.prior ) ) g.prior <- data.matrix( g.prior ) if( inherits( g.prior, "dtCMatrix" ) ) g.prior = as.matrix( g.prior ) if( ( inherits( g.prior, "bdgraph" ) ) | ( inherits( g.prior, "ssgraph" ) ) ) g.prior <- BDgraph::plinks( g.prior ) if( inherits( g.prior, "sim" ) ) { K = as.matrix( g.prior $ K ) g.prior = abs( K / diag( K ) ) } if( !is.matrix( g.prior ) ) { if( ( g.prior <= 0 ) | ( g.prior >= 1 ) ) stop( " 'g.prior' must be between 0 and 1." ) g.prior = matrix( g.prior, p, p ) }else{ if( ( nrow( g.prior ) != p ) | ( ncol( g.prior ) != p ) ) stop( " 'g.prior' and 'data' have non-conforming size." ) if( any( g.prior < 0 ) || any( g.prior > 1 ) ) stop( " Elements of 'g.prior', as a matrix, must be between 0 and 1." ) } g.prior[ lower.tri( g.prior, diag = TRUE ) ] <- 0 g.prior = g.prior + t( g.prior ) return( g.prior ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_g_start = function( g.start, g_prior, p ) { if( is.matrix( g.start ) ) { if( ( sum( g.start == 0 ) + sum( g.start == 1 ) ) != ( p ^ 2 ) ) stop( " Elements of 'g.start', as a matrix, must be 0 or 1." ) G = g.start } if( inherits( g.start, "sim" ) ) G <- unclass( g.start $ G ) if( inherits( g.start, "graph" ) ) G <- unclass( g.start ) if( ( inherits( g.start, "bdgraph" ) ) | ( inherits( g.start, "ssgraph" ) ) ) G <- g.start $ last_graph if( ( inherits( g.start, "character" ) ) && ( g.start == "empty" ) ) G = matrix( 0, p, p ) if( ( inherits( g.start, "character" ) ) && ( g.start == "full" ) ) G = matrix( 1, p, p ) if( ( nrow( G ) != p ) | ( ncol( G ) != p ) ) stop( " 'g.start' and 'data' have non-conforming size." ) G[ g_prior == 1 ] = 1 G[ g_prior == 0 ] = 0 G[ lower.tri( G, diag( TRUE ) ) ] <- 0 G = G + t( G ) return( G = G ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_K_start = function( G, g.start, Ts, b_star, threshold ) { p = ncol( G ) if( ( inherits( g.start, "bdgraph" ) ) | ( inherits( g.start, "ssgraph" ) ) ) K <- g.start $ last_K if( inherits( g.start, "sim" ) ) K <- g.start $ K if( ( !inherits( g.start, "bdgraph" ) ) && ( !inherits( g.start, "ssgraph" ) ) && ( !inherits( g.start, "sim" ) ) ) { K = G result = .C( "rgwish_c", as.integer(G), as.double(Ts), K = as.double(K), as.integer(b_star), as.integer(p), as.double(threshold), PACKAGE = "BDgraph" ) K = matrix ( result $ K, p, p ) } return( K = K ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_S_n_p = function( data, method, n, not.cont = NULL ) { if( inherits( data, "sim" ) ) { not.cont <- data $ not.cont # Do not change the order of these links data <- data $ data } if( !is.matrix( data ) & !is.data.frame( data ) ) stop( " Data must be a matrix or dataframe." ) if( is.data.frame( data ) ) data <- data.matrix( data ) if( any( is.na( data ) ) ) { if( method == "dw" ) stop( " 'bdgraph.dw()' does not deal with missing values." ) if( method == "ggm" ) stop( " 'ggm' method does not deal with missing values. You could choose option method = gcgm." ) gcgm_NA = 1 }else{ gcgm_NA = 0 } if( isSymmetric( data ) ) { if( method == "gcgm" ) stop( " method='gcgm' requires all data." ) if( method == "dw" ) stop( " method='dw' requires all data." ) if( is.null( n ) ) stop( " Please specify the number of observations 'n'." ) } p <- ncol( data ) if( p < 3 ) stop( " Number of variables/nodes ('p') must be more than 2." ) if( is.null( n ) ) n <- nrow( data ) if( method == "ggm" ) { if( isSymmetric( data ) ) { cat( "Input is identified as the covariance matrix. \n" ) S <- data }else{ S <- t( data ) %*% data } } if( method == "gcgm" ) { if( is.null( not.cont ) ) { not.cont = c( rep( 1, p ) ) for( j in 1:p ) if( length( unique( data[ , j ] ) ) > min( n / 2 ) ) not.cont[ j ] = 0 }else{ if( !is.vector( not.cont ) ) stop( " 'not.cont' must be a vector with length of number of variables." ) if( length( not.cont ) != p ) stop( " 'not.cont' must be a vector with length of number of variables." ) if( ( sum( not.cont == 0 ) + sum( not.cont == 1 ) ) != p ) stop( " Elements of 'not.cont', as a vector, must be 0 or 1." ) } R <- 0 * data for( j in 1:p ) if( not.cont[ j ] ) R[ , j ] = match( data[ , j ], sort( unique( data[ , j ] ) ) ) R[ is.na( R ) ] = -1000 # dealing with missing values # copula for continuous non-Gaussian data if( ( gcgm_NA == 0 ) && ( min( apply( R, 2, max ) ) > ( n - 5 * n / 100 ) ) ) { # copula transfer data = stats::qnorm( apply( data, 2, rank ) / ( n + 1 ) ) data = t( ( t( data ) - apply( data, 2, mean ) ) / apply( data, 2, stats::sd ) ) method = "ggm" }else{ # for non-Gaussian data Z <- stats::qnorm( apply( data, 2, rank, ties.method = "random" ) / ( n + 1 ) ) Zfill <- matrix( stats::rnorm( n * p ), n, p ) # for missing values Z[ is.na( data ) ] <- Zfill[ is.na( data ) ] # for missing values Z <- t( ( t( Z ) - apply( Z, 2, mean ) ) / apply( Z, 2, stats::sd ) ) S <- t( Z ) %*% Z } } if( method == "dw" ) { if( is.null( not.cont ) ) { not.cont = c( rep( 1, p ) ) }else{ if( !is.vector( not.cont ) ) stop( " 'not.cont' must be a vector with length of number of variables." ) if( length( not.cont ) != p ) stop( " 'not.cont' must be a vector with length of number of variables." ) if( ( sum( not.cont == 0 ) + sum( not.cont == 1 ) ) != p ) stop( " Elements of 'not.cont', as a vector, must be 0 or 1." ) } # for non-Gaussian data Z <- stats::qnorm( apply( data, 2, rank, ties.method = "random" ) / ( n + 1 ) ) Zfill <- matrix( stats::rnorm( n * p ), n, p ) # for missing values Z[ is.na( data ) ] <- Zfill[ is.na( data ) ] # for missing values Z <- t( ( t( Z ) - apply( Z, 2, mean ) ) / apply( Z, 2, stats::sd ) ) S <- t( Z ) %*% Z } if( method == "ggm" ) list_out = list( method = method, S = S, n = n, p = p, colnames_data = colnames( data ) ) if( method == "gcgm" ) list_out = list( method = method, S = S, n = n, p = p, colnames_data = colnames( data ), not.cont = not.cont, R = R, Z = Z, data = data, gcgm_NA = gcgm_NA ) if( method == "dw" ) list_out = list( method = method, S = S, n = n, p = p, colnames_data = colnames( data ), not.cont = not.cont, Z = Z, data = data, gcgm_NA = gcgm_NA ) return( list_out ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/bdgraph.sim.R0000644000176200001440000003742114043535124014313 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Data generator according to the graph structure | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | bdgraph.sim = function( p = 10, graph = "random", n = 0, type = "Gaussian", prob = 0.2, size = NULL, mean = 0, class = NULL, cut = 4, b = 3, D = diag(p), K = NULL, sigma = NULL, q = exp(-1), beta = 1, vis = FALSE ) { if( p < 2 ) stop( " 'p' must be more than 1." ) if( ( prob < 0 ) | ( prob > 1 ) ) stop( " Value of 'prob' must be between ( 0, 1 )." ) if( cut < 2 ) stop( " Value of 'cut' must be more than 1." ) if( b <= 2 ) stop( " Value of 'b' must be more than 2." ) if( inherits( graph, "graph" ) ) graph = unclass( graph ) if( is.matrix( graph ) & is.matrix( K ) ) if( nrow( graph ) != nrow( K ) ) stop( " Matrices 'graph' and 'K' have non-conforming size." ) if( !is.null( size ) ) if( ( size < 0 ) | ( size > ( p * ( p - 1 ) / 2 ) ) ) stop( " Value of 'size' must be between ( 0, p*(p-1)/2 )." ) if( is.matrix( K ) ) { if( !isSymmetric( K ) ) stop( " Matrix 'K' must be positive definite." ) graph <- "fixed" p <- nrow( K ) } if( type == "normal" ) type = "Gaussian" if( type == "non-normal" ) type = "non-Gaussian" if( type == "discrete" ) type = "count" if( ( type == "count" ) & ( cut == 2 ) ) type = "binary" if( is.matrix( graph ) ) { if( !isSymmetric( graph ) ) stop( "Matrix 'graph' must be symmetric" ) p = nrow( graph ) if( ( sum( graph == 1 ) + sum( graph == 0 ) ) != ( p * p ) ) stop( "Elements of 'graph', as a matrix, must be 0 or 1." ) G <- graph graph <- "fixed" } # - - build the graph structure - - - - - - - - - - - - - - - - - - - - - -| if( sum( graph == c( "fixed", "AR1", "AR2", "circle" ) ) == 0 ) G <- BDgraph::graph.sim( p = p, graph = graph, prob = prob, size = size, class = class ) if( graph == "AR1" ) { sigma = matrix( 0, p, p ) for( i in 1 : ( p - 1 ) ) for( j in ( i + 1 ) : p ) sigma[ i, j ] = ( 0.7 ) ^ abs( i - j ) sigma = sigma + t( sigma ) + diag( p ) K = solve( sigma ) G = 1 * ( abs( K ) > 0.02 ) } if( graph == "AR2" ) { K = stats::toeplitz( c( 1, 0.5, 0.25, rep( 0, p - 3 ) ) ) G = 1 * ( abs( K ) > 0.02 ) } if( graph == "circle" ) { K <- stats::toeplitz( c( 1, 0.5, rep( 0, p - 2 ) ) ) K[ 1, p ] <- 0.4 K[ p, 1 ] <- 0.4 G = 1 * ( abs( K ) > 0.02 ) } # - - generate multivariate data according to the graph structure - - - - -| if( n != 0 ) { if( !is.null( sigma ) ) K <- solve( sigma ) if( is.matrix( K ) ) { G = 1 * ( abs( K ) > 0.02 ) diag( G ) = 0 # if( is.null( sigma ) ) sigma <- solve( K ) if( is.null( sigma ) ) sigma = stats::cov2cor( solve( K ) ) }else{ # - - Generate precision matrix according to the graph structure - | if( !isSymmetric( D ) ) stop( " Matrix 'D' must be positive definite." ) Ti = chol( solve( D ) ) diag( G ) = 0 K = matrix( 0, p, p ) threshold = 1e-8 # for "rgwish_c" function in C++ result = .C( "rgwish_c", as.integer(G), as.double(Ti), K = as.double(K), as.integer(b), as.integer(p), as.double(threshold), PACKAGE = "BDgraph" ) K = matrix( result $ K, p, p ) # sigma = solve( K ) sigma = stats::cov2cor( solve( K ) ) } # - - generate multivariate normal data - - - - - - - - - - - - - - - -| d <- BDgraph::rmvnorm( n = n, mean = mean, sigma = sigma ) # - - generate multivariate mixed data - - - - - - - - - - - - - - - - | not.cont = numeric( p ) if( type == "mixed" ) { # generating mixed data which are 'count', 'ordinal', 'non-Gaussian', # 'binary', and 'Gaussian', respectively. ps = floor( p / 5 ) # generating count data col_number <- c( 1:ps ) prob <- stats::pnorm( d[, col_number] ) d[ , col_number ] <- stats::qpois( p = prob, lambda = 10 ) not.cont[ 1:ps ] = 1 # generating ordinal data col_number <- c( ( ps + 1 ):( 2 * ps ) ) prob <- stats::pnorm( d[ , col_number ] ) d[ , col_number ] <- stats::qpois( p = prob, lambda = 2 ) not.cont[ c( ( ps + 1 ):( 2 * ps ) ) ] = 1 # generating non-Guassian data col_number <- c( ( 2 * ps + 1 ):( 3 * ps ) ) prob <- stats::pnorm( d[ , col_number ] ) d[,col_number] <- stats::qexp( p = prob, rate = 10 ) # for binary data col_number <- c( ( 3 * ps + 1 ):( 4 * ps ) ) prob <- stats::pnorm( d[ , col_number ] ) d[ , col_number ] <- stats::qbinom( p = prob, size = 1, prob = 0.5 ) not.cont[ c( ( 3 * ps + 1 ):( 4 * ps ) ) ] = 1 } # - - generate multivariate continuous non-Gaussian data - - - - - - - | if( type == "non-Gaussian" ) { # generating multivariate continuous non-Gaussian data prob <- stats::pnorm( d ) d <- stats::qexp( p = prob, rate = 10 ) } # - - generate multivariate count data - - - - - - - - - - - - - - - - | if( type == "count" ) { not.cont[ 1:p ] = 1 runif_m <- matrix( stats::runif( cut * p ), nrow = p, ncol = cut ) marginals <- apply( runif_m, 1, function( x ) { stats::qnorm( cumsum( x / sum( x ) )[ -length( x ) ] ) } ) if( cut == 2 ) marginals = matrix( marginals, nrow = 1, ncol = p ) for( j in 1:p ) { breaks <- c( min( d[ , j ] ) - 1, marginals[ , j ], max( d[ , j ] ) + 1 ) d[ , j ] <- as.integer( cut( d[ , j ], breaks = breaks, right = FALSE ) ) } d = d - 1 } if( type == "binary" ) { not.cont[ 1:p ] = 1 if( p > 16 ) stop( "For type 'binary', number of nodes (p) must be less than 16." ) ## Generate clique factors clique_factors = generate_clique_factors( ug = G ) d = sample_ug( n = n, ug = G, clique_factors = clique_factors ) d = d - 1 } if( type == "dw" ) { if( ( is.matrix( q ) == FALSE ) & ( is.matrix( beta ) == FALSE) ) #q and beta can be a vector or a number { if( length( q ) == 1 ) q = rep( q, time = p ) if( length( beta ) == 1 ) beta = rep( beta, time = p ) if( length( q ) != p ) stop( " Length of vector 'q' has non-conforming size with 'p'. " ) if( length( beta ) != p ) stop( " Length of vector 'beta' has non-conforming size with 'p'. " ) not.cont[ 1:p ] = 1 Y_data <- matrix( c( 0, 1 ), nrow = n, ncol = p ) while( any( apply( Y_data, 2, function( x ) { all( x %in% 0:1 ) } ) ) == TRUE ) ##detect binary variables { #d <- BDgraph::rmvnorm( n = n, mean = mean, sigma = sigma ) d <- tmvtnorm::rtmvnorm( n = n, mean = rep( mean, p ), sigma = sigma, lower = rep( -5, length = p ), upper = rep( 5, length = p ) ) # STEP 2: Generate Continuous Weibull with (q, beta) - - - - - - - -| #shape.c <- beta #scale.c <- exp( -log( -log( q ) ) / beta ) #for( j in 1 : p ) Y_data[ , j ] <- stats::qweibull( stats::pnorm( d[ , j ] ), shape = shape.c[ j ] , scale = scale.c[ j ] ) for( j in 1 : p ) Y_data[ , j ] = BDgraph::qdweibull( stats::pnorm( d[ , j ] ), q = q[ j ], beta = beta[ j ] , zero = TRUE ) #d = Y # STEP 3: Transform from Continuous Weibull to Discrete Weibull - -| #Y_data = floor( Y_data ) cat( "any binary variable", any( apply( Y_data, 2, function( x ) { all( x %in% 0 : 1 ) } ) ), "\n" ) #if(any( apply(Y_data, 2, function(x) { all(x %in% 0:1) })) == TRUE) tmvtnorm::rtmvnorm( n = n, mean = rep(mean, p), sigma = sigma, lower = rep(-5, length = p), upper = rep(5, length = p)) } d = Y_data } if( ( is.matrix( q ) == TRUE ) & ( is.matrix( beta ) == TRUE ) ) # q and beta come from regression { d <- matrix( 0, nrow = n, ncol = p ) Z <- tmvtnorm::rtmvnorm( n = n, mean = rep( mean, p ), sigma = sigma, lower = rep( -3, length = p ), upper = rep( 3, length = p ) ) pnorm_Z <- stats::pnorm( Z ) for( j in 1:p ) d[ ,j ] <- BDgraph::qdweibull( pnorm_Z[ ,j ], q = q[ , j ], beta = beta[ , j ] , zero = TRUE ) } } if( type == "NB" ) { not.cont[ 1:p ] = 1 Y.star <- matrix( c( 0, 1 ), nrow = n, ncol = p ) while ( any( apply( Y.star, 2, function( x ) { all( x %in% 0:1 ) } ) ) == TRUE ) ##detect binary variables { d <- tmvtnorm::rtmvnorm( n = n, mean = rep( mean, p ), sigma = sigma, lower = rep( -5, length = p ), upper = rep( 5, length = p ) ) mu <- stats::runif( n = p, min = 0.5, max = 5 ) size <- stats::runif( n = p, min = 0.1, max = 3 ) for(j in 1 : p ) Y.star[ , j ] <- stats::qnbinom( stats::pnorm( d[ , j ] ), size = size[ j ], mu = mu[ j ], lower.tail = TRUE, log.p = FALSE ) # cat( "any binary variables ", any( apply( Y , 2, function( x ) { all( x %in% 0:1 ) }) ) , "\n" ) } d = Y.star } } # - - Saving the result - - - - - - - - - - - - - - - - - - - - - - - - - -| if( n != 0 ) { if( type != "dw" ){ simulation <- list( G = G, graph = graph, data = d, sigma = sigma, K = K, type = type, not.cont = not.cont ) }else{ simulation <- list( G = G, graph = graph, data = d, sigma = sigma, K = K, type = type, not.cont = not.cont, shape.d = beta, scale.d = q ) } }else{ simulation <- list( G = G, graph = graph ) } # - - graph visualization - - - - - - - - - - - - - - - - - - - - - - - - -| if( vis == TRUE ) BDgraph::plot.graph( G, main = "Graph structure" ) class( simulation ) <- "sim" return( simulation ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Print function for simulation data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | print.sim = function( x, ... ) { p <- ncol( x $ G ) if( is.null( x $ type ) ) { cat( paste( " graph generated by bdgraph.sim" ), fill = TRUE ) cat( paste( " Graph type =", x $ graph ), fill = TRUE ) cat( paste( " Number of nodes =", p ), fill = TRUE ) cat( paste( " Graph size =", sum( x $ G ) / 2 ), fill = TRUE ) cat( paste( " Sparsity =", round( sum( x $ G ) / ( p * ( p - 1 ) ), 4) ), fill = TRUE ) }else{ cat( paste( " Data generated by bdgraph.sim" ), fill = TRUE ) cat( paste( " Data type =", x $ type ), fill = TRUE ) cat( paste( " Sample size =", nrow( x $ data ) ), fill = TRUE ) cat( paste( " Graph type =", x $ graph ), fill = TRUE ) cat( paste( " Number of nodes =", p ), fill = TRUE ) cat( paste( " Graph size =", sum( x $ G ) / 2 ), fill = TRUE ) cat( paste( " Sparsity =", round( sum( x $ G ) / ( p * ( p - 1 ) ), 4) ), fill = TRUE ) } } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # plot for class "sim" from bdgraph.sim function ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plot.sim = function( x, ... ) { BDgraph::plot.graph( x, ... ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Function for exact sampling from binary data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sample_ug = function( n = 1, ug = diag( 3 ), clique_factors = NULL ) { p = ncol( ug ) # p smaller than 17 check if( p > 16 ) stop( "number of nodes must be smaller than 16." ) ug[ lower.tri( ug, diag = TRUE ) ] = 0 if( is.null( clique_factors ) ) clique_factors = generate_clique_factors( ug ) prob = calc_joint_dist( ug, clique_factors ) noc = length( prob ) ind = sample( 1:noc, n, replace = TRUE, prob = prob ) oc = sapply( 1:noc, function( x ){ as.integer( intToBits( x ) ) } ) oc = 2 - t( oc[ 1:p, ] ) data = oc[ ind, ] return( data ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | generate_clique_factors = function( ug ) { ug[ lower.tri( ug, diag = TRUE ) ] = 0 p = ncol( ug ) edges = which( ug == 1, arr.ind = T ) a = igraph::make_undirected_graph( c( t( edges ) ), p ) cliques = igraph::max_cliques( a ) clique_factors = vector( 'list', length( cliques ) ) for ( i in 1:length( cliques ) ) { clq = cliques[[i]] clique_factors[[i]] = stats::runif( 2 ^ length( clq ) ) } return( clique_factors ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | calc_joint_dist = function( ug, clique_factors ) { p = ncol( ug ) oc = sapply( 1:( 2 ^ p ), function( x ){ as.integer( intToBits( x ) ) } ) oc = 2 - t( oc[ 1:p, ] ) edges = which( ug == 1, arr.ind = T ) a = igraph::make_undirected_graph( c( t( edges ) ), p ) joint_dist = rep( 1, 2 ^ p ) cliques = igraph::max_cliques( a ) for ( i in 1:length( cliques ) ) { clq = cliques[[i]] k = length( clq ) temp = sapply( 1:( 2 ^ k ), function( x ){ as.integer( intToBits( x ) ) } ) clq_oc = 2 - t( temp[1:k, ] ) clq_factor = clique_factors[[i]] for ( j in 1:nrow( clq_oc ) ) { oc_col_clq = oc[ , clq ] if( is.null( dim( oc_col_clq ) ) ) oc_col_clq = matrix( oc_col_clq, nrow = length( oc_col_clq ), ncol = 1 ) ind = apply( oc_col_clq, 1, identical, clq_oc[ j, ] ) joint_dist[ind] = joint_dist[ ind ] * clq_factor[ j ] } } joint_dist = joint_dist / sum( joint_dist ) return( joint_dist ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/link2adj.R0000644000176200001440000000342713716772361013626 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Creating an adjacency matrix based on links | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | link2adj = function( link, p = NULL ) { if( !is.matrix( link ) & !is.data.frame( link ) ) stop( " Input 'link' must be a matrix or dataframe." ) if( is.data.frame( link ) ) link <- data.matrix( link ) if( ncol( link ) != 2 ) stop( " Input 'link' must have only 2 columns." ) if( nrow( link ) < 1 ) stop( " Input 'link' must have at least one row." ) if( !is.null( p ) ) if( max( link ) > p ) stop( " Value of 'p' is not matched with input 'link'." ) if( is.null( p ) ) p = max( link ) adj = matrix( 0, p, p ) for( i in 1:nrow( link ) ) adj[ link[ i, 1 ], link[ i, 2 ] ] = 1 return( adj ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/rwish.R0000644000176200001440000000406313716771663013265 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Sampling from Wishart distribution | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | rwish = function( n = 1, p = 2, b = 3, D = diag( p ) ) { if( p < 1 ) stop( "'p' must be more than or equal with 1." ) if( b <= 2 ) stop( "For Wishart distribution parameter 'b' must be more than 2." ) if( !isSymmetric( D ) ) stop( "Matrix 'D' must be positive definite." ) if( n < 1 ) stop( "'n' must be more than or equal with 1." ) if( ncol( D ) != p ) stop( "'p' and 'D' have non-conforming size." ) Ti = chol( solve( D ) ) K = matrix( 0, p, p ) if( n > 1 ) { samples = array( 0, c( p, p, n ) ) for ( i in 1 : n ) { result = .C( "rwish_c", as.double(Ti), K = as.double(K), as.integer(b), as.integer(p), PACKAGE = "BDgraph" ) samples[,,i] = matrix( result $ K, p, p ) } }else{ result = .C( "rwish_c", as.double(Ti), K = as.double(K), as.integer(b), as.integer(p), PACKAGE = "BDgraph" ) samples = matrix( result $ K, p, p ) } return( samples ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/hill_climb_binary.R0000644000176200001440000002250113716772407015565 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # A divide-and-conquer type greedy hill climb algorithm # for undirected graphcial models with dicrete data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # The Hill-Climb algorithm ( function "hill_climb_mpl" ) consists for two part: # PART 1: Local Marginal Pseudo-likelihood optimization to discovers the Markov # blanket of each node ( function "local_mb_hc" ). # PART 2: Neighborhood search algorithm for global Marginal Pseudo-likelihood # optimization ( function "global_hc" ). # See "Marginal pseudo-likelihood learning of Markov network structures" by # Pensar et al. for more details. ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # INPUT: * data (n x p) matrix, as a count dataset with n observations and p variables. # The outcome space of each variable must be in the form 0, 1, ..., r. # * alpha: The parameter of the prior distribution # OUTPUT: * selected_G - adjacency matrix for the selected graph ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | hill_climb_mpl_binary = function( data, freq_data, n, alpha = 0.5, operator = "or" ) { p = ncol( data ) G = matrix( 0, p, p ) for( i in 1:p ) { mes = paste( c( " PART 1: Local search for node ", i ), collapse = "" ) cat( mes, "\r" ) utils::flush.console() mb_i = local_mb_hc_binary( node = i, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) G[mb_i, i] = 1 } G_local = matrix( 0, p, p ) if( operator == "or" ) G_local[ ( G + t( G ) ) > 0 ] = 1 if( operator == "and" ) G_local = G * t( G ) if( sum( G_local ) != 0 ) { selected_G = global_hc_binary( G_local = G_local, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) }else{ selected_G = G_local } return( selected_G ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Local Marginal Pseudo-likelihood optimization to discovers the Markov # blanket of each node ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | local_mb_hc_binary = function( node, data, freq_data, p, n, alpha = 0.5 ) { temp = seq_len( p ) mb_potential = temp[ - node ] l_mb_potential = p - 1 mb_hat = numeric() log_prob_mb_hat = log_mpl_binary( node, mb_hat, data, freq_data, p, n, alpha = alpha ) cont = TRUE while( cont == TRUE ) { cont = FALSE log_prob_mb_candidates = numeric( l_mb_potential ) for( i in seq_len( l_mb_potential ) ) log_prob_mb_candidates[i] = log_mpl_binary( node = node, mb_node = c( mb_hat, mb_potential[i] ), data = data, freq_data = freq_data, p = p, n = p, alpha = alpha ) log_prob_mb_candidate_top = max( log_prob_mb_candidates ) if( log_prob_mb_candidate_top > log_prob_mb_hat ) { mb_cand_top_loc = which.max( log_prob_mb_candidates ) mb_hat = c( mb_hat, mb_potential[ mb_cand_top_loc ] ) mb_potential = mb_potential[ - mb_cand_top_loc ] l_mb_potential = l_mb_potential - 1 log_prob_mb_hat = log_prob_mb_candidate_top cont = TRUE } length_mb_hat = length( mb_hat ) if( ( length_mb_hat > 2 ) & ( cont == TRUE ) ) { delete = TRUE while( delete == TRUE ) { delete = FALSE log_prob_mb_candidates = numeric( length_mb_hat ) for( i in 1:length_mb_hat ) log_prob_mb_candidates[i] = log_mpl_binary( node = node, mb_node = mb_hat[ -i ], data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) log_prob_mb_candidate_top = max( log_prob_mb_candidates ) if( log_prob_mb_candidate_top > log_prob_mb_hat ) { mb_cand_top_loc = which.max( log_prob_mb_candidates ) mb_hat = mb_hat[ - mb_cand_top_loc ] length_mb_hat = length( mb_hat ) log_prob_mb_hat = log_prob_mb_candidate_top if( length_mb_hat > 2 ) delete = TRUE } } } } return( mb_hat ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Neighborhood search algorithm for global Marginal Pseudo-likelihood optimization ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | global_hc_binary = function( G_local, data, freq_data, p, n, alpha = 0.5 ) { print( "PART 2, running global search algorithm." ) ug = matrix( 0, p, p ) n_edges = sum( G_local ) / 2 temp = which( G_local == 1, arr.ind = T ) edges = temp[temp[, 1] < temp[, 2], ] curr_scores = numeric( p ) for( i in 1:p ) curr_scores[i] = log_mpl_binary( node = i, which( ug[i, ] == 1 ), data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change_imp = matrix( 0, n_edges, 2 ) edge_change = matrix( TRUE, n_edges, 2 ) cont = TRUE while( cont == TRUE ) { cont = FALSE edge_change_ind = which( edge_change[, 1] == TRUE ) for( i in 1:length( edge_change_ind ) ) { edge = edges[edge_change_ind[i], ] node = edge[1] mb = which( ug[node, ] == 1 ) if( ug[ edge[1], edge[2] ] == 0 ) { swoe1 = curr_scores[node] mb = c( mb, edge[2] ) swe1 = log_mpl_binary( node = node, mb, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change_imp[edge_change_ind[i], 1] = swe1 - swoe1; edge_change[edge_change_ind[i], 1] = FALSE }else{ swe1 = curr_scores[node] mb = mb[ mb != edge[2] ] swoe1 = log_mpl_binary( node = node, mb, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change_imp[edge_change_ind[i], 1] = swoe1 - swe1; edge_change[edge_change_ind[i], 1] = FALSE } } edge_change_ind = which( edge_change[, 2] == 1 ) for( i in 1:length( edge_change_ind ) ) { edge = edges[edge_change_ind[i], ] node = edge[2] mb = which( ug[node, ] == 1 ) if( ug[edge[1], edge[2]] == 0 ) { swoe2 = curr_scores[node] mb = c( mb, edge[1] ) swe2 = log_mpl_binary( node = node, mb, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change_imp[edge_change_ind[i], 2] = swe2 - swoe2; edge_change[edge_change_ind[i], 2] = FALSE }else{ swe2 = curr_scores[node] mb = mb[mb != edge[1]] swoe2 = log_mpl_binary( node = node, mb, data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change_imp[edge_change_ind[i], 2] = swoe2 - swe2; edge_change[edge_change_ind[i], 2] = FALSE } } imp = apply( edge_change_imp, 1, sum ) max_imp = max( imp ) max_imp_loc = which.max( imp ) if( max_imp > 0 ) { edge = edges[max_imp_loc, ] if( ug[edge[1], edge[2]] == 0 ) { ug[edge[1], edge[2]] = 1 ug[edge[2], edge[1]] = 1 }else{ ug[edge[1], edge[2]] = 0 ug[edge[2], edge[1]] = 0 } curr_scores[edge[1]] = log_mpl_binary( node = edge[1], which( ug[edge[1], ] == 1 ), data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) curr_scores[edge[2]] = log_mpl_binary( node = edge[2], which( ug[edge[2], ] == 1 ), data = data, freq_data = freq_data, p = p, n = n, alpha = alpha ) edge_change[edges[, 1] == edge[1]|edges[, 1] == edge[2], 1] = TRUE edge_change[edges[, 2] == edge[1]|edges[, 2] == edge[2], 2] = TRUE cont = TRUE } } return( ug ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing the Marginal pseudo-likelihood for count data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | log_mpl_binary = function( node, mb_node, data, freq_data, p, n, alpha = 0.5 ) { mb_node = as.vector( mb_node ) alpha_ijl = alpha length_freq_data = length( freq_data ) size_node = length( mb_node ) node = node - 1 mb_node = mb_node - 1 log_mpl_node = 0.0 result = .C( "log_mpl_binary_parallel_hc", as.integer(node), as.integer(mb_node), as.integer(size_node), log_mpl_node = as.double(log_mpl_node), as.integer(data), as.integer(freq_data), as.integer(length_freq_data), as.double(alpha_ijl), as.integer(n), PACKAGE = "BDgraph" ) log_mpl_node = result $ log_mpl_node return( log_mpl_node ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/transfer.R0000644000176200001440000000340113623516431013733 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # For count data: to transfer raw data for the algorithm | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | transfer = function( r_data ) { if( inherits( r_data, "sim" ) ) r_data <- r_data $ data n = dim( r_data )[ 1 ] p = dim( r_data )[ 2 ] data = matrix( 0, nrow = n, ncol = p + 1 ) size_unique_data = 0 result = .C( "transfer_data", as.integer(r_data), data = as.integer(data), as.integer(n), as.integer(p), size_unique_data = as.integer(size_unique_data), PACKAGE = "BDgraph" ) size_unique_data = result $ size_unique_data label = colnames( r_data ) if( is.null( label ) ) label = 1:p data = matrix ( result $ data, n, p + 1, dimnames = list( NULL, c( label, "ferq" ) ) ) data = data[ (1:size_unique_data), ] return( data ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/roc.R0000644000176200001440000000377314041520110012666 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Reports the measures to assess the performance of estimated graphs | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | roc = function( pred, actual, auc = TRUE, smooth = FALSE, plot = FALSE, ... ) { if( is.matrix( actual ) ) if( ( sum( actual == 0 ) + sum( actual == 1 ) ) != ( nrow( actual ) ^ 2 ) ) stop( "Elements of matrix 'actual' must be 0 or 1." ) if( inherits( actual, "sim" ) ) actual = actual $ G response = actual[ upper.tri( actual ) ] if( is.matrix( pred ) ) if( any( pred < 0 ) || any( pred > 1 ) ) stop( " Elements of matrix 'pred' must be between ( 0, 1 )." ) if( ( inherits( pred, "bdgraph" ) ) | ( inherits( pred, "ssgraph" ) ) ) { pred = pred $ p_links if( is.null( pred ) ) pred = BDgraph::plinks( pred, round = 15 ) } predictor = pred[ upper.tri( pred ) ] pROC::roc( response = response, predictor = predictor, levels = c( 0, 1 ), quiet = T, smooth = smooth, plot = plot, ... ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/rgwish.R0000644000176200001440000000564013716773556013441 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Sampling from G-Wishart distribution | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | rgwish = function( n = 1, adj = NULL, b = 3, D = NULL, threshold = 1e-8 ) { if( b <= 2 ) stop( "Value of parameter 'b' must be more than 2." ) if( is.null( adj ) ) stop( "Adjacency matrix must be determined." ) if( is.matrix( adj ) ) G <- unclass( adj ) # if( inherits( adj, "graph" ) ) G <- unclass( adj ) if( inherits( adj, "sim" ) ) G <- unclass( adj $ G ) if( inherits( adj, "bdgraph" ) ) G <- BDgraph::select( adj ) if( inherits( adj, "ssgraph" ) ) G <- BDgraph::select( adj ) if( ( sum( G == 0 ) + sum( G == 1 ) ) != ( nrow( G ) ^ 2 ) ) stop( " Elements of matrix 'adj' must be 0 or 1." ) G <- as.matrix( G ) diag( G ) <- 0 if( !isSymmetric( G ) ) { G[ lower.tri( G ) ] <- 0 G <- G + t( G ) } p <- nrow( G ) if( p < 1 ) stop( "'p' must be more than or equal with 1." ) if( is.null( D ) ) D <- diag( p ) if( !isSymmetric( D ) ) stop( "Matrix 'D' must be positive definite matrix." ) if( nrow( D ) != p ) stop( "Dimension of matrix G and D must be the same." ) if( p == 1 ) return( rwish( n = n, p = p, b = b, D = D ) ) if( sum( G ) == ( p * ( p - 1 ) ) ) return( rwish( n = n, p = p, b = b, D = D ) ) Ti = chol( solve( D ) ) K = matrix( 0, p, p ) if( n > 1 ) { samples = array( 0, c( p, p, n ) ) for( i in 1 : n ) { result = .C( "rgwish_c", as.integer(G), as.double(Ti), K = as.double(K), as.integer(b), as.integer(p), as.double(threshold), PACKAGE = "BDgraph" ) samples[ , , i ] = matrix( result $ K, p, p ) } }else{ result = .C( "rgwish_c", as.integer(G), as.double(Ti), K = as.double(K), as.integer(b), as.integer(p), as.double(threshold), PACKAGE = "BDgraph" ) samples = matrix( result $ K, p, p ) } return( samples ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/bf.R0000644000176200001440000000462213621263401012476 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing the Bayes factor between two graph structures | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | bf = function( num, den, bdgraph.obj, log = TRUE ) { G_1 = BDgraph::get_graph( num ) G_2 = BDgraph::get_graph( den ) if( ( inherits( bdgraph.obj, "bdgraph" ) ) | ( inherits( bdgraph.obj, "ssgraph" ) ) ) { p_links = bdgraph.obj $ p_links if( is.null( p_links ) ) p_links = BDgraph::plinks( bdgraph.obj, round = 15 ) min_plinks = 1 - p_links p_links[ p_links == 0 ] = .Machine $ double.xmin min_plinks[ min_plinks == 0 ] = .Machine $ double.xmin g1_min_g2 = G_1 - G_2 upper_plinks = p_links[ upper.tri( p_links ) ] upper_min_plinks = min_plinks[ upper.tri( min_plinks ) ] upper_g1_min_g2 = g1_min_g2[ upper.tri( g1_min_g2 ) ] log_vec_bf = 0 * upper_plinks log_vec_bf[ upper_g1_min_g2 == 1 ] = upper_plinks[ upper_g1_min_g2 == 1 ] / upper_min_plinks[ upper_g1_min_g2 == 1 ] log_vec_bf[ upper_g1_min_g2 == -1 ] = upper_min_plinks[ upper_g1_min_g2 == -1 ] / upper_plinks[ upper_g1_min_g2 == -1 ] log_vec_bf = log_vec_bf[ log_vec_bf != 0 ] if( log == TRUE ) { bf = sum( log( log_vec_bf ) ) }else{ bf = prod( log_vec_bf ) } } return( bf ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/detect_cores.R0000644000176200001440000000544013621263401014551 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | get_cores = function( cores = NULL ) { num_machine_cores = BDgraph::detect_cores() if( is.null( cores ) ) cores = num_machine_cores - 1 if( cores == "all" ) cores = num_machine_cores .C( "omp_set_num_cores", as.integer( cores ), PACKAGE = "BDgraph" ) return( cores ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | detect_cores = function( all.tests = FALSE, logical = TRUE ) { if( .Platform $ OS.type == "windows" ) { if( logical ) { res <- Sys.getenv( "NUMBER_OF_PROCESSORS", "1" ) as.numeric( res ) }else{ x = system( "WMIC CPU Get DeviceID,NumberOfCores", intern = TRUE ) sum( utils::read.table( text = x, header = TRUE ) $ NumberOfCores ) } }else{ systems = list( linux = if( logical ) "grep processor /proc/cpuinfo 2>/dev/null | wc -l" else "cat /proc/cpuinfo | grep 'cpu cores'| uniq | cut -f2 -d:", darwin = if( logical ) "/usr/sbin/sysctl -n hw.logicalcpu 2>/dev/null" else "/usr/sbin/sysctl -n hw.physicalcpu 2>/dev/null", solaris = if( logical ) "/usr/sbin/psrinfo -v | grep 'Status of.*processor' | wc -l" else "/bin/kstat -p -m cpu_info | grep :core_id | cut -f2 | uniq | wc -l", freebsd = "/sbin/sysctl -n hw.ncpu 2>/dev/null", openbsd = "/sbin/sysctl -n hw.ncpu 2>/dev/null", irix = c( "hinv | grep Processors | sed 's: .*::'", "hinv | grep '^Processor '| wc -l" ) ) for( i in seq( systems ) ) { if( all.tests || length( grep( paste0( "^", names( systems )[i] ), R.version $ os ) ) ) for( cmd in systems[i] ) { a = try( suppressWarnings( system( cmd, TRUE ) ), silent = TRUE ) if( inherits( a, "try-error" ) ) next a <- gsub( "^ +", "", a[1] ) if( length( grep( "^[1-9]", a ) ) ) return( as.integer( a ) ) } } NA_integer_ } } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/sparsity.R0000644000176200001440000000250213724415574013776 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Compute the sparsity of an adjacency matrix | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | sparsity = function( adj ) { G = BDgraph::get_graph( adj ) p = ncol( G ) sum_E = sum( adj ) / 2 D = p * ( p - 1 ) / 2 sparsity_g = sum_E / D return( sparsity_g ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/plotcoda.R0000644000176200001440000000701413716772255013733 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # To check the convergency of the BDMCMC algorithm | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plotcoda = function( bdgraph.obj, thin = NULL, control = TRUE, main = NULL, ... ) { if( ( inherits( bdgraph.obj, "bdgraph" ) ) | ( inherits( bdgraph.obj, "ssgraph" ) ) ) { if( is.null( bdgraph.obj $ all_graphs ) ) stop( " 'bdgraph.obj' must be an object of function 'bdgraph()' or 'ssgraph()' with option save = TRUE." ) if( is.null( bdgraph.obj $ all_graphs ) ) stop( " 'bdgraph.obj' must be an object of function 'bdgraph()' or 'ssgraph()' with option save = TRUE." ) }else{ stop( "'bdgraph.obj' must be an object of functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) } if( is.null( thin ) ) thin = ceiling( length( bdgraph.obj $ all_graphs ) / 1000 ) if( !is.numeric( thin ) ) stop( " 'thin' must be an number" ) if( is.matrix( thin ) ) stop( " 'thin' must be an number" ) sample_graphs = bdgraph.obj $ sample_graphs p = nrow( bdgraph.obj $ last_graph ) qp = p * ( p - 1 ) / 2 all_weights = bdgraph.obj $ all_weights all_graphs = bdgraph.obj $ all_graphs allG_new = all_graphs[ c( thin * ( 1 : floor( length( all_graphs ) / thin ) ) ) ] all_weights_new = all_weights[ c( thin * ( 1 : floor( length( all_weights ) / thin ) ) ) ] length_allG_new = length( allG_new ) result = matrix( 0, qp, length_allG_new ) vec_result = 0 * result[ , 1] for ( g in 1 : length_allG_new ) { mes = paste( c( "Calculation ... in progress : ", floor( 100 * g / length_allG_new ), "%" ), collapse = "" ) cat(mes, "\r") utils::flush.console() which_edge = which( unlist( strsplit( as.character( sample_graphs[ allG_new[g] ] ), "" ) ) == 1 ) vec_result[which_edge] = vec_result[which_edge] + all_weights_new[g] result[ ,g] = vec_result / sum( all_weights_new[ c( 1 : g ) ] ) } if ( control ) if ( p > 15 ) { randomLinks = sample( x = 1:qp, size = ( qp - 100 ), replace = FALSE ) result[ randomLinks, ] = 0 } mes = paste( c( "Calculation ... done. " ), collapse = "" ) cat( mes, "\r" ) cat( "\n" ) utils::flush.console() graphics::matplot( x = thin * ( 1 : length_allG_new ), y = t( result ), type = "l", lty = 1, col = 1, xlab = "Iteration", ylab = "Posterior link probability", cex.lab = 1.3, cex.axis = 1.2 ) if ( is.null( main ) ) main = "Trace of the Posterior Probabilities of the Links." graphics::title( main = main, cex.main = 1.2 ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/pgraph.R0000644000176200001440000000454113716772302013402 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing the probability of all possible graphs or one specific graph | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | pgraph = function( bdgraph.obj, number.g = 4, adj = NULL ) { if( !is.null( bdgraph.obj $ p_links ) ) stop( "It needs object of 'bdgraph' with option save = TRUE." ) sample_graphs = bdgraph.obj $ sample_graphs graph_weights = bdgraph.obj $ graph_weights sort_gWeights = sort( graph_weights, decreasing = TRUE ) if( is.null( adj ) ) { p <- nrow( bdgraph.obj $ last_graph ) list_g <- list() vec_g <- c( rep( 0, p * ( p - 1 ) / 2 ) ) for ( i in 1 : number.g ) { vec_g <- 0 * vec_g indG_i = sample_graphs[ which( graph_weights == sort_gWeights[ i ] ) ] vec_g[ which( unlist( strsplit( as.character( indG_i ), "" ) ) == 1 ) ] <- 1 list_g[[i]] <- matrix( 0, p, p ) list_g[[i]][ upper.tri( list_g[[i]] ) ] <- vec_g #list_g[[i]] <- Matrix::Matrix( list_g[[i]], sparse = TRUE ) } return( list( selected_g = list_g, prob_g = sort_gWeights[ 1 : number.g ] / sum( graph_weights ) ) ) }else{ if ( inherits( adj, "sim" ) ) G <- as.matrix( adj $ G ) if ( inherits( adj, "graph" ) ) G <- unclass( adj ) indG = paste( G[ upper.tri( G ) ], collapse = '' ) wh = which( sample_graphs == indG ) prob_g = ifelse( length( wh ) == 0, 0, graph_weights[ wh ] / sum( graph_weights ) ) return( prob_g ) } } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/adj2link.R0000644000176200001440000000264113716773335013625 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Extract links from an adjacency matrix | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | adj2link = function( adj ) { G = BDgraph::get_graph( adj ) if( sum( G ) == 0 ) print( " 'adj' has no link. " ) p = ncol( G ) links = vector() for( i in 1:p ) for( j in 1:p ) if( G[ i, j ] == 1 ) links = rbind( links, c( i, j ) ) return( links ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/gnorm.R0000644000176200001440000000655713716773564013267 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # To compute the normalizing constant of G-Wishart distribution based on | # Monte Carlo algorithm according to below paper | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Atay-Kayis & Massam (2005). A monte carlo method for computing the | # marginal likelihood in nondecomposable Gaussian graphical models, Biometrika| ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | gnorm = function( adj, b = 3, D = diag( ncol( adj ) ), iter = 100 ) { if ( b < 3 ) stop( "Parameter 'b' must be more than 2." ) if( is.null( adj ) ) stop( "Adjacency matrix must be determined." ) G <- unclass( adj ) G <- as.matrix( G ) p <- nrow( G ) if( p != ncol( G ) ) stop( "Adjacency matrix must be a square matrix." ) if( ( sum( G == 0 ) + sum( G == 1 ) ) != ( nrow( G ) ^ 2 ) ) stop( " Elements of matrix 'G' must be 0 or 1." ) G[ lower.tri( G, diag = TRUE ) ] <- 0 Ti = chol( solve( D ) ) H = Ti / t( matrix( rep( diag( Ti ), p ), p, p ) ) check_H = identical( H, diag( p ) ) * 1 nu = rowSums( G ) size_graph = sum( G ) # For the case, G is a full graph if( size_graph == ( p * ( p - 1 ) / 2 ) ) { logIg = ( size_graph / 2 ) * log( pi ) + ( p * ( b + p - 1 ) / 2 ) * log( 2 ) + sum( lgamma( ( b + nu ) / 2 ) ) - ( ( b + p - 1 ) / 2 ) * log( det( D ) ) } # For the case, G is an empty graph if( size_graph == 0 ) logIg = ( p * b / 2 ) * log( 2 ) + p * lgamma( b / 2 ) - ( b / 2 ) * sum( log( diag( D ) ) ) if( ( size_graph != ( p * ( p - 1 ) / 2 ) ) & ( size_graph != 0 ) ) { # For the case G is NOT full graph # - - Monte Carlo glorithm which is implemented in C++ - - - - - - - -| f_T = c( rep( 0, iter ) ) result = .C( "log_exp_mc", as.integer( G ), as.integer( nu ), as.integer( b ), as.double( H ), as.integer( check_H ), as.integer( iter ), as.integer( p ), f_T = as.double( f_T ), PACKAGE = "BDgraph" ) f_T = c( result $ f_T ) log_Ef_T = log( mean( exp( - f_T / 2 ) ) ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| c_dT = ( size_graph / 2 ) * log( pi ) + ( p * b / 2 + size_graph ) * log( 2 ) + sum( lgamma( ( b + nu ) / 2 ) ) + sum( ( b + nu + colSums( G ) ) * log( diag( Ti ) ) ) logIg = c_dT + log_Ef_T } return( logIg ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/precision.R0000644000176200001440000000310613716772117014114 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing estimated percision matrix | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | precision = function( bdgraph.obj, round = 2 ) { if( ( !inherits( bdgraph.obj, "bdgraph" ) ) && ( !inherits( bdgraph.obj, "ssgraph" ) ) ) stop( "'bdgraph.obj' must be an object from functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) K_hat = bdgraph.obj $ K_hat if( is.null( K_hat ) ) stop( " Input 'object' must be from functions 'bdgraph()' or 'ssgraph()'." ) return( round( K_hat, round ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/bdgraph.mpl.R0000644000176200001440000003351013716773263014324 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # BDMCMC algorithm for graphical models based on marginal pseudo-likelihood ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | bdgraph.mpl = function( data, n = NULL, method = "ggm", transfer = TRUE, algorithm = "bdmcmc", iter = 5000, burnin = iter / 2, g.prior = 0.5, g.start = "empty", jump = NULL, alpha = 0.5, save = FALSE, cores = NULL, operator = "or" ) { if( iter < burnin ) stop( " Number of iteration must be more than number of burn-in." ) burnin = floor( burnin ) cores = BDgraph::get_cores( cores = cores ) if( inherits( data, "sim" ) ) data <- data $ data colnames_data = colnames( data ) if( !is.matrix( data ) & !is.data.frame( data ) ) stop( " Data should be a matrix or dataframe." ) if( is.data.frame( data ) ) data <- data.matrix( data ) if( any( is.na( data ) ) ) stop( " This method does not deal with missing values. You could try bdgraph() function with option method = gcgm." ) p <- ncol( data ) if( p < 3 ) stop( " Number of variables/nodes ('p') must be more than 2." ) if( is.null( n ) ) n <- nrow( data ) if( method == "ggm" ) { if( isSymmetric( data ) ) { if ( is.null( n ) ) stop( " Please specify the number of observations 'n'." ) cat( " Input is identified as the covariance matrix. \n" ) S <- data }else{ S <- t( data ) %*% data } } if( ( method == "dgm" ) || ( method == "dgm-binary" ) ) { if( transfer == TRUE ) data = transfer( r_data = data ) p = ncol( data ) - 1 freq_data = data[ , p + 1 ] data = data[ , -( p + 1 ) ] n = sum( freq_data ) max_range_nodes = apply( data, 2, max ) max_range_nodes = max_range_nodes + 1 length_f_data = length( freq_data ) } if( method == "dgm-binary" ) if( ( min( data ) != 0 ) || ( max( data ) != 1 ) ) stop( " For the case 'method = dgm-binary', data must be binary 0 or 1" ) g_prior = BDgraph::get_g_prior( g.prior = g.prior, p = p ) G = BDgraph::get_g_start( g.start = g.start, g_prior = g_prior, p = p ) if( save == TRUE ) { qp1 = ( p * ( p - 1 ) / 2 ) + 1 string_g = paste( c( rep( 0, qp1 ) ), collapse = '' ) sample_graphs = c( rep ( string_g, iter - burnin ) ) # vector of numbers like "10100" graph_weights = c( rep ( 1, iter - burnin ) ) # waiting time for every state all_graphs = c( rep ( 0, iter - burnin ) ) # vector of numbers like "10100" all_weights = c( rep ( 1, iter - burnin ) ) # waiting time for every state size_sample_g = 0 }else{ p_links = matrix( 0, p, p ) } if( ( save == TRUE ) && ( p > 50 & iter > 20000 ) ) { cat( " WARNING: Memory needs to run this function is around " ) print( ( iter - burnin ) * utils::object.size( string_g ), units = "auto" ) } last_graph = matrix( 0, p, p ) if( ( is.null( jump ) ) && ( p > 10 & iter > ( 5000 / p ) ) ) jump = floor( p / 10 ) if( is.null( jump ) ) jump = 1 if( ( p < 10 ) && ( jump > 1 ) ) cat( " WARNING: the value of jump should be 1. " ) if( jump > min( p, sqrt( p * 11 ) ) ) cat( " WARNING: the value of jump should be smaller. " ) if( algorithm != "hc" ) cat( paste( c( iter, " MCMC sampling ... in progress: \n" ), collapse = "" ) ) print = floor( iter / 20 ) # - - - main BDMCMC algorithms implemented in C++ - - - - - - - - - - - - -| if( save == TRUE ) { if( ( method == "ggm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "ggm_rjmcmc_mpl_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "ggm_bdmcmc_mpl_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { counter_all_g = 0 result = .C( "ggm_bdmcmc_mpl_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "dgm_rjmcmc_mpl_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "dgm_bdmcmc_mpl_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm-binary" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "dgm_bdmcmc_mpl_binary_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.double(alpha), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { counter_all_g = 0 result = .C( "dgm_bdmcmc_mpl_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm-binary" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { counter_all_g = 0 result = .C( "dgm_bdmcmc_mpl_binary_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.double(alpha), as.integer(n), as.integer(p), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } }else{ if( ( method == "ggm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "ggm_rjmcmc_mpl_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "ggm_bdmcmc_mpl_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { result = .C( "ggm_bdmcmc_mpl_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(S), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "dgm_rjmcmc_mpl_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "dgm_bdmcmc_mpl_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm-binary" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "dgm_bdmcmc_mpl_binary_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.double(alpha), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { result = .C( "dgm_bdmcmc_mpl_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "dgm-binary" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { result = .C( "dgm_bdmcmc_mpl_binary_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.integer(data), as.integer(freq_data), as.integer(length_f_data), as.double(alpha), as.integer(n), as.integer(p), p_links = as.double(p_links), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( algorithm != "hc" ) { last_graph = matrix( result $ G, p, p ) colnames( last_graph ) = colnames_data[1:p] if( save == TRUE ) { size_sample_g = result $ size_sample_g sample_graphs = result $ sample_graphs[ 1 : size_sample_g ] graph_weights = result $ graph_weights[ 1 : size_sample_g ] all_graphs = result $ all_graphs + 1 all_weights = result $ all_weights if( ( algorithm != "rjmcmc" ) & ( jump != 1 ) ) { all_weights = all_weights[ 1 : ( result $ counter_all_g ) ] all_graphs = all_graphs[ 1 : ( result $ counter_all_g ) ] } output = list( sample_graphs = sample_graphs, graph_weights = graph_weights, all_graphs = all_graphs, all_weights = all_weights, last_graph = last_graph ) }else{ p_links = matrix( result $ p_links, p, p ) if( algorithm == "rjmcmc" ) p_links = p_links / ( iter - burnin ) p_links[ lower.tri( p_links ) ] = 0 colnames( p_links ) = colnames_data[1:p] output = list( p_links = p_links, last_graph = last_graph ) } }else{ if( method == "dgm" ) selected_graph = hill_climb_mpl( data = data, freq_data = freq_data, n = n, max_range_nodes = max_range_nodes, alpha = alpha, operator = operator ) if( method == "dgm-binary" ) selected_graph = hill_climb_mpl_binary( data = data, freq_data = freq_data, n = n, alpha = alpha, operator = operator ) colnames( selected_graph ) = colnames_data[ 1:p ] output = selected_graph } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| class( output ) = "bdgraph" return( output ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/bdgraph.npn.R0000644000176200001440000000451013716773222014320 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Non-parametric transfer function for non-normal data | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | bdgraph.npn = function( data, npn = "shrinkage", npn.thresh = NULL ) { if( inherits( data, "sim" ) ) data <- data $ data if( !is.matrix( data ) & !is.data.frame( data ) ) stop( "Data must be a matrix or dataframe." ) if( is.data.frame( data ) ) data = data.matrix( data ) if( any( is.na( data ) ) ) stop( "Data must contain no missing data." ) n <- nrow( data ) # - - - shrinkage transfer - - - - - - - - - - - - - - - - - - - - - - - - | if( npn == "shrinkage" ) { data = stats::qnorm( apply( data, 2, rank ) / ( n + 1 ) ) #data = data / stats::sd( data[ , 1 ] ) data = t( ( t( data ) - apply( data, 2, mean ) ) / apply( data, 2, stats::sd ) ) } # - - - truncation transfer - - - - - - - - - - - - - - - - - - - - - - - -| if( npn == "truncation" ) { if( is.null( npn.thresh ) ) npn.thresh = 0.25 * ( n ^ ( -0.25 ) ) * ( pi * log( n ) ) ^ ( -0.5 ) data = stats::qnorm( pmin( pmax( apply( data, 2, rank ) / n, npn.thresh ), 1 - npn.thresh ) ) data = data / stats::sd( data[ , 1 ] ) } # - - - skeptic transfer - - - - - - - - - - - - - - - - - - - - - - - - - | if( npn == "skeptic" ) data = 2 * sin( pi / 6 * stats::cor( data, method = "spearman" ) ) return( data ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/ddweibull.R0000644000176200001440000000541314043516145014066 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # The Discrete Weibull Distribution ( Type 1 ) | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ddweibull = function( x, q = exp( -1 ), beta = 1, zero = TRUE ) { if( any( x != floor( x ) ) ) stop( " 'x' must be integer" ) if( max( q ) > 1 | min( q ) < 0 ) stop( " 'q' must be between 0 and 1" ) if( min( beta ) <= 0 ) stop( " 'beta' must be positive" ) if( zero == FALSE ) x = x - 1 return( q ^ x ^ beta - q ^ ( x + 1 ) ^ beta ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | pdweibull = function( x, q = exp( -1 ), beta = 1, zero = TRUE ) { if( max( q ) > 1 | min( q ) < 0 ) stop( " 'q' must be between 0 and 1" ) if( min( beta ) <= 0 ) stop( " 'beta' must be positive" ) if( zero == FALSE ) x = x - 1 return( 1 - q ^ ( x + 1 ) ^ beta ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | qdweibull = function( p, q = exp( -1 ), beta = 1, zero = TRUE ) { if( max( q ) > 1 | min( q ) < 0 ) stop( " 'q' must be between 0 and 1" ) if( min( beta ) <= 0 ) stop( " 'beta' must be positive" ) if( zero ) ceiling( ( log( 1 - p ) / log( q ) ) ^ ( 1 / beta ) - 1 ) else ceiling( ( log( 1 - p ) / log( q ) ) ^ ( 1 / beta ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | rdweibull = function( n, q = exp( -1 ), beta = 1, zero = TRUE ) { if( max( q ) > 1 | min( q ) < 0 ) stop( " 'q' must be between 0 and 1" ) if( min( beta ) <= 0 ) stop( " 'beta' must be positive" ) r_unif = stats::runif( n ) if( zero ) ceiling( ( log( 1 - r_unif ) / log( q ) ) ^ ( 1 / beta ) ) - 1 else ceiling( ( log( 1 - r_unif ) / log( q ) ) ^ ( 1 / beta ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/plinks.R0000644000176200001440000000561513716772266013435 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing posterior probabilities of all possible links | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plinks = function( bdgraph.obj, round = 2, burnin = NULL ) { if( ( !inherits( bdgraph.obj, "bdgraph" ) ) && ( !inherits( bdgraph.obj, "ssgraph" ) ) ) stop( "'bdgraph.obj' must be an object from functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) if( inherits( bdgraph.obj, "bdgraph" ) ) { if( is.null( bdgraph.obj $ sample_graphs ) ) { p_links = bdgraph.obj $ p_links }else{ p <- nrow( bdgraph.obj $ last_graph ) vec_G <- numeric( length = ( p * ( p - 1 ) / 2 ) ) sample_graphs <- bdgraph.obj $ sample_graphs graph_weights <- bdgraph.obj $ graph_weights if( is.null( burnin ) ) { for( i in 1 : length( sample_graphs ) ) { inp <- which( unlist( strsplit( as.character( sample_graphs[ i ] ), "" ) ) == 1 ) vec_G[ inp ] <- vec_G[ inp ] + graph_weights[ i ] } sum_graph_weights = sum( graph_weights ) }else{ all_graphs <- bdgraph.obj $ all_graphs all_weights <- bdgraph.obj $ all_weights sum_graph_weights <- 0 for( i in ( burnin + 1 ) : length( all_graphs ) ) { inp <- which( unlist( strsplit( as.character( sample_graphs[ all_graphs[ i ] ] ), "" ) ) == 1 ) vec_G[ inp ] <- vec_G[ inp ] + all_weights[ i ] sum_graph_weights <- sum_graph_weights + all_weights[ i ] } } label <- colnames( bdgraph.obj $ last_graph ) p_links <- matrix( 0, p, p, dimnames = list( label, label ) ) p_links[ upper.tri( p_links ) ] <- vec_G / sum_graph_weights } } if( inherits( bdgraph.obj, "ssgraph" ) ) p_links = bdgraph.obj $ p_links return( round( p_links, round ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/traceplot.R0000644000176200001440000000713513716771560014125 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Plot of graph size to check the convergency of BDMCMC algorithm | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | traceplot = function( bdgraph.obj, acf = FALSE, pacf = FALSE, main = NULL, ... ) { if( ( inherits( bdgraph.obj, "bdgraph" ) ) | ( inherits( bdgraph.obj, "ssgraph" ) ) ) { if( is.null( bdgraph.obj $ all_graphs ) ) stop( "'bdgraph.obj' must be an object of function 'bdgraph()' or 'ssgraph()' with option save = TRUE." ) if( is.null( bdgraph.obj $ all_graphs ) ) stop( "'bdgraph.obj' must be an object of function 'bdgraph()' or 'ssgraph()' with option save = TRUE." ) }else{ stop( "'bdgraph.obj' must be an object of functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) } sample_graphs = bdgraph.obj $ sample_graphs all_graphs = bdgraph.obj $ all_graphs graph_weights = bdgraph.obj $ graph_weights sizesample_graphs = sapply( sample_graphs, function(x) length( which( unlist( strsplit( as.character(x), "" ) ) == 1 ) ) ) sizeall_graphs = sizesample_graphs[ all_graphs ] which_G_max = which( max( graph_weights ) == graph_weights ) size_selected_g = sizeall_graphs[ which_G_max ] if( is.null( main ) ) main = "Trace of graph size" x_vec = 1 : length( all_graphs ) if ( acf == FALSE & pacf == FALSE ) { graphics::plot( x = x_vec, sizeall_graphs, type = "l", main = main, cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2, ylab = "Graph size", xlab = "Iteration", ... ) graphics::abline( h = size_selected_g, col = "red" ) } if ( acf == TRUE & pacf == TRUE ) { op = graphics::par( mfrow = c( 2, 2 ), pty = "s" ) graphics::plot( x = x_vec, sizeall_graphs, type = "l", main = main, ylab = "Graph size", xlab = "Iteration", ... ) graphics::abline( h = size_selected_g, col = "red" ) acf( sizeall_graphs, main = "ACF for graph size" ) pacf( sizeall_graphs, main = "PACF for graph size" ) graphics::par( op ) } if ( acf == TRUE & pacf == FALSE ) { op <- graphics::par( mfrow = c( 1, 2 ), pty = "s" ) graphics::plot( x = x_vec, sizeall_graphs, type = "l", main = main, ylab = "Graph size", xlab = "Iteration", ... ) graphics::abline( h = size_selected_g, col = "red" ) acf( sizeall_graphs, main = "ACF for graph size" ) graphics::par( op ) } if ( acf == FALSE & pacf == TRUE ) { op <- graphics::par( mfrow = c( 1, 2 ), pty = "s" ) graphics::plot( x = x_vec, sizeall_graphs, type = "l", main = main, ylab = "Graph size", xlab = "Iteration", ... ) graphics::abline( h = size_selected_g, col = "red" ) pacf( sizeall_graphs, main = "PAIC for graph size" ) graphics::par( op ) } } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/rmvnorm.R0000644000176200001440000000363614042467652013627 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Data generator from multivarate normal distribution | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | rmvnorm = function( n = 10, mean = rep( 0, length = ncol( sigma ) ), sigma = diag( length( mean ) ) ) { if( !isSymmetric( sigma, tol = sqrt( .Machine $ double.eps ), check.attributes = FALSE ) ) stop( " 'sigma' must be a symmetric matrix." ) sigma = as.matrix( sigma ) p = nrow( sigma ) if( length( mean ) == 1 ) mean <- rep( mean, p ) if( length( mean ) != nrow( sigma ) ) stop( " 'mean' and 'sigma' have non-conforming size." ) # - - generate multivariate normal data - - - - - - - - - - - - - - - - - -| chol_sig = chol( sigma ) z = matrix( stats::rnorm( p * n ), p, n ) data = t( chol_sig ) %*% z + mean data = t( data ) if( n == 1 ) data = as.vector( data ) return( data ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/bdgraph.R0000644000176200001440000006743014003035044013517 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Main function of BDgraph package: BDMCMC algorithm for graphical models | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | bdgraph = function( data, n = NULL, method = "ggm", algorithm = "bdmcmc", iter = 5000, burnin = iter / 2, not.cont = NULL, g.prior = 0.5, df.prior = 3, g.start = "empty", jump = NULL, save = FALSE, cores = NULL, threshold = 1e-8 ) { if( df.prior < 3 ) stop( " 'prior.df' must be >= 3." ) if( iter < burnin ) stop( " Number of iteration must be more than number of burn-in." ) burnin <- floor( burnin ) cores = BDgraph::get_cores( cores = cores ) list_S_n_p = BDgraph::get_S_n_p( data = data, method = method, n = n, not.cont = not.cont ) S = list_S_n_p $ S n = list_S_n_p $ n p = list_S_n_p $ p method = list_S_n_p $ method colnames_data = list_S_n_p $ colnames_data if( method == "gcgm" ) { not.cont = list_S_n_p $ not.cont R = list_S_n_p $ R Z = list_S_n_p $ Z data = list_S_n_p $ data gcgm_NA = list_S_n_p $ gcgm_NA } b = df.prior b_star = b + n D = diag( p ) Ds = D + S Ts = chol( solve( Ds ) ) Ti = chol( solve( D ) ) # only for double Metropolic-Hastings algorithms g_prior = BDgraph::get_g_prior( g.prior = g.prior, p = p ) G = BDgraph::get_g_start( g.start = g.start, g_prior = g_prior, p = p ) K = BDgraph::get_K_start( G = G, g.start = g.start, Ts = Ts, b_star = b_star, threshold = threshold ) if( save == TRUE ) { qp1 = ( p * ( p - 1 ) / 2 ) + 1 string_g = paste( c( rep( 0, qp1 ) ), collapse = '' ) sample_graphs = c( rep ( string_g, iter - burnin ) ) # vector of numbers like "10100" graph_weights = c( rep ( 0, iter - burnin ) ) # waiting time for every state all_graphs = c( rep ( 0, iter - burnin ) ) # vector of numbers like "10100" all_weights = c( rep ( 1, iter - burnin ) ) # waiting time for every state size_sample_g = 0 }else{ p_links = matrix( 0, p, p ) } if( ( save == TRUE ) && ( p > 50 & iter > 20000 ) ) { cat( " WARNING: Memory needs to run this function is around. " ) print( ( iter - burnin ) * utils::object.size( string_g ), units = "auto" ) } K_hat = matrix( 0, p, p ) last_graph = K_hat last_K = K_hat if( ( is.null( jump ) ) && ( p > 10 & iter > ( 5000 / p ) ) ) jump = floor( p / 10 ) if( is.null( jump ) ) jump = 1 if( ( p < 10 ) && ( jump > 1 ) ) cat( " WARNING: the value of jump should be 1. " ) if( jump > min( p, sqrt( p * 11 ) ) ) cat( " WARNING: the value of jump should be smaller. " ) cat( paste( c( iter, " MCMC sampling ... in progress: \n" ), collapse = "" ) ) print = floor( iter / 20 ) # - - main BDMCMC algorithms implemented in C++ - - - - - - - - - - - - - | if( save == TRUE ) { if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "ggm_bdmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { counter_all_g = 0 result = .C( "ggm_bdmcmc_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "ggm_rjmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { not_continuous = not.cont result = .C( "gcgm_bdmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { not_continuous = not.cont counter_all_g = 0 result = .C( "gcgm_bdmcmc_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "rjmcmc" ) ) { not_continuous = not.cont result = .C( "gcgm_rjmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } # for Double Metropolis-Hasting if( ( method == "ggm" ) && ( algorithm == "bd-dmh" ) && ( jump == 1 ) ) { result = .C( "ggm_DMH_bdmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bd-dmh" ) && ( jump != 1 ) ) { counter_all_g = 0 result = .C( "ggm_DMH_bdmcmc_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "rj-dmh" ) ) { result = .C( "ggm_DMH_rjmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bd-dmh" ) && ( jump == 1 ) ) { not_continuous = not.cont result = .C( "gcgm_DMH_bdmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bd-dmh" ) && ( jump != 1 ) ) { not_continuous = not.cont counter_all_g = 0 result = .C( "gcgm_DMH_bdmcmc_map_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), counter_all_g = as.integer(counter_all_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "rj-dmh" ) ) { not_continuous = not.cont result = .C( "gcgm_DMH_rjmcmc_map", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), all_graphs = as.integer(all_graphs), all_weights = as.double(all_weights), K_hat = as.double(K_hat), sample_graphs = as.character(sample_graphs), graph_weights = as.double(graph_weights), size_sample_g = as.integer(size_sample_g), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } }else{ if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { result = .C( "ggm_bdmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { result = .C( "ggm_bdmcmc_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "rjmcmc" ) ) { result = .C( "ggm_rjmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.integer(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bdmcmc" ) && ( jump == 1 ) ) { not_continuous = not.cont result = .C( "gcgm_bdmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bdmcmc" ) && ( jump != 1 ) ) { not_continuous = not.cont result = .C( "gcgm_bdmcmc_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "rjmcmc" ) ) { not_continuous = not.cont result = .C( "gcgm_rjmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.integer(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } # for Double Metropolis-Hasting if( ( method == "ggm" ) && ( algorithm == "bd-dmh" ) && ( jump == 1 ) ) { result = .C( "ggm_DMH_bdmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "bd-dmh" ) && ( jump != 1 ) ) { result = .C( "ggm_DMH_bdmcmc_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "ggm" ) && ( algorithm == "rj-dmh" ) ) { result = .C( "ggm_DMH_rjmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), K_hat = as.double(K_hat), p_links = as.integer(p_links), as.integer(b), as.integer(b_star), as.double(Ds), as.double(D), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bd-dmh" ) && ( jump == 1 ) ) { not_continuous = not.cont result = .C( "gcgm_DMH_bdmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "bd-dmh" ) && ( jump != 1 ) ) { not_continuous = not.cont result = .C( "gcgm_DMH_bdmcmc_ma_multi_update", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.double(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(jump), as.integer(print), PACKAGE = "BDgraph" ) } if( ( method == "gcgm" ) && ( algorithm == "rj-dmh" ) ) { not_continuous = not.cont result = .C( "gcgm_DMH_rjmcmc_ma", as.integer(iter), as.integer(burnin), G = as.integer(G), as.double(g_prior), as.double(Ts), as.double(Ti), K = as.double(K), as.integer(p), as.double(threshold), as.double(Z), as.integer(R), as.integer(not_continuous), as.integer(n), as.integer(gcgm_NA), K_hat = as.double(K_hat), p_links = as.integer(p_links), as.integer(b), as.integer(b_star), as.double(D), as.double(Ds), as.integer(print), PACKAGE = "BDgraph" ) } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| K_hat = matrix( result $ K_hat, p, p, dimnames = list( colnames_data, colnames_data ) ) last_graph = matrix( result $ G , p, p, dimnames = list( colnames_data, colnames_data ) ) last_K = matrix( result $ K , p, p ) if( save == TRUE ) { if( algorithm == "rjmcmc" ) K_hat = K_hat / ( iter - burnin ) size_sample_g = result $ size_sample_g sample_graphs = result $ sample_graphs[ 1 : size_sample_g ] graph_weights = result $ graph_weights[ 1 : size_sample_g ] all_graphs = result $ all_graphs + 1 all_weights = result $ all_weights if( ( algorithm != "rjmcmc" ) & ( jump != 1 ) ) { all_weights = all_weights[ 1 : ( result $ counter_all_g ) ] all_graphs = all_graphs[ 1 : ( result $ counter_all_g ) ] } output = list( sample_graphs = sample_graphs, graph_weights = graph_weights, K_hat = K_hat, all_graphs = all_graphs, all_weights = all_weights, last_graph = last_graph, last_K = last_K ) }else{ p_links = matrix( result $ p_links, p, p, dimnames = list( colnames_data, colnames_data ) ) if( ( algorithm == "rjmcmc" ) | ( algorithm == "rj-dmh" ) ) { p_links = p_links / ( iter - burnin ) K_hat = K_hat / ( iter - burnin ) } p_links[ lower.tri( p_links ) ] = 0 output = list( p_links = p_links, K_hat = K_hat, last_graph = last_graph, last_K = last_K ) } class( output ) = "bdgraph" return( output ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Summary for "bdgraph" boject | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | summary.bdgraph = function( object, round = 2, vis = TRUE, ... ) { K_hat = object $ K_hat p_links = object $ p_links if( is.null( p_links ) ) p_links = BDgraph::plinks( object ) selected_g = BDgraph::select( p_links, cut = 0.5 ) if( vis == TRUE ) { if( !is.null( object $ graph_weights ) ) op = graphics::par( mfrow = c( 2, 2 ), pty = "s", omi = c( 0.1, 0.1, 0.1, 0.1 ), mai = c( 0.3, 0.3, 0.3, 0.3 ) ) # - - - plot selected graph sub_g = "Graph with edge posterior probability > 0.5" BDgraph::plot.graph( selected_g, main = "Selected graph", sub = sub_g, ... ) if( !is.null( object $ graph_weights ) ) { sample_graphs = object $ sample_graphs graph_weights = object $ graph_weights sum_gWeights = sum( graph_weights ) # - - - plot posterior distribution of graph graph_prob = graph_weights / sum_gWeights graphics::plot( x = 1 : length( graph_weights ), y = graph_prob, type = "h", col = "gray60", main = "Posterior probability of graphs", ylab = "Pr(graph|data)", xlab = "graph", ylim = c( 0, max( graph_prob ) ) ) # - - - plot posterior distribution of graph size sizesample_graphs = sapply( sample_graphs, function( x ) length( which( unlist( strsplit( as.character( x ), "" ) ) == 1 ) ) ) xx <- unique( sizesample_graphs ) weightsg <- vector() for( i in 1 : length( xx ) ) weightsg[ i ] <- sum( graph_weights[ which( sizesample_graphs == xx[ i ] ) ] ) prob_zg = weightsg / sum_gWeights graphics::plot( x = xx, y = prob_zg, type = "h", col = "gray10", main = "Posterior probability of graphs size", ylab = "Pr(graph size|data)", xlab = "Graph size", ylim = c( 0, max( prob_zg ) ) ) # - - - plot trace of graph size all_graphs = object $ all_graphs sizeall_graphs = sizesample_graphs[ all_graphs ] graphics::plot( x = 1 : length( all_graphs ), sizeall_graphs, type = "l", col = "gray40", main = "Trace of graph size", ylab = "Graph size", xlab = "Iteration" ) graphics::par( op ) } } if( is.null( K_hat ) ) return( list( selected_g = selected_g, p_links = round( p_links, round ) ) ) else return( list( selected_g = selected_g, p_links = round( p_links, round ), K_hat = round( K_hat, round ) ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Plot function for "bdgraph" boject | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plot.bdgraph = function( x, cut = 0.5, number.g = NULL, ... ) { if( is.null( number.g ) ) { BDgraph::plot.graph( x, cut = cut, sub = paste0( "Edge posterior probability = ", cut ), ... ) }else{ if( is.null( x $ all_graphs ) ) stop( " 'x' must be an object of function 'bdgraph()' with option save = TRUE." ) sample_graphs = x $ sample_graphs graph_weights = x $ graph_weights prob_G = graph_weights / sum( graph_weights ) sort_prob_G = sort( prob_G, decreasing = TRUE ) p = nrow( x $ last_graph ) label = colnames( x $ last_graph ) list_G = replicate( number.g, matrix( 0, p, p, dimnames = list( label, label ) ), simplify = FALSE ) vec_G = c( rep( 0, p * ( p - 1 ) / 2 ) ) if( number.g == 2 ) op <- graphics::par( mfrow = c( 1, 2 ), pty = "s" ) if( number.g > 2 & number.g < 7 ) op <- graphics::par( mfrow = c( 2, number.g %% 2 + trunc( number.g / 2 ) ), pty = "s" ) for( i in 1 : number.g ) { if( number.g > 6 ) grDevices::dev.new() indG_i <- sample_graphs[ which( prob_G == sort_prob_G[i] )[1] ] vec_G <- 0 * vec_G vec_G[ which( unlist( strsplit( as.character(indG_i), "" ) ) == 1 ) ] <- 1 list_G[[i]][ upper.tri( list_G[[i]] ) ] <- vec_G main = ifelse( i == 1, "Graph with highest probability", paste( c( i, "th graph" ), collapse = "" ) ) sub = paste( c( "Posterior probability = ", round( sort_prob_G[i], 6 ) ), collapse = "" ) BDgraph::plot.graph( list_G[[i]], main = main, sub = sub, ... ) } if( number.g > 1 & number.g < 7 ) graphics::par( op ) } } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Print function for "bdgraph" boject | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | print.bdgraph = function( x, ... ) { p_links = x $ p_links if( is.null( p_links ) ) p_links = BDgraph::plinks( x ) selected_g = BDgraph::select( p_links, cut = 0.5 ) cat( paste( "\n Adjacency matrix of selected graph \n" ), fill = TRUE ) print( selected_g ) cat( paste( "\n Edge posterior probability of the links \n" ), fill = TRUE ) print( round( p_links, 2 ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/select.R0000644000176200001440000000643713716771603013411 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # To select the graph in which the edge posterior probabilities are more # than "cut" value OR if cut is NULL to select the best graph ( graph with # the highest posterior probability ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | select = function( bdgraph.obj, cut = NULL, vis = FALSE ) { if( is.matrix( bdgraph.obj ) ) { if( any( bdgraph.obj < 0 ) || any( bdgraph.obj > 1 ) ) stop( " Values of 'bdgraph.obj' must be between 0 and 1." ) p_links = unclass( bdgraph.obj ) p = ncol( p_links ) }else{ if( ( !inherits( bdgraph.obj, "bdgraph" ) ) && ( !inherits( bdgraph.obj, "ssgraph" ) ) ) stop( "'bdgraph.obj' must be a matrix or an object from functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) if( ( inherits( bdgraph.obj, "bdgraph" ) ) | ( inherits( bdgraph.obj, "ssgraph" ) ) ) p_links = bdgraph.obj $ p_links if( inherits( bdgraph.obj, "bdgraph" ) ) p = ncol( bdgraph.obj $ last_graph ) if( inherits( bdgraph.obj, "ssgraph" ) ) p = ncol( bdgraph.obj $ K_hat ) } if( ( is.null( p_links ) ) && ( is.null( cut ) ) ) { sample_graphs <- bdgraph.obj $ sample_graphs graph_weights <- bdgraph.obj $ graph_weights indG_max <- sample_graphs[ which( graph_weights == max( graph_weights ) )[1] ] vec_G <- c( rep( 0, p * ( p - 1 ) / 2 ) ) vec_G[ which( unlist( strsplit( as.character( indG_max ), "" ) ) == 1 ) ] <- 1 dimlab <- colnames( bdgraph.obj $ last_graph ) selected_g <- matrix( 0, p, p, dimnames = list( dimlab, dimlab ) ) selected_g[ upper.tri( selected_g ) ] <- vec_G }else{ if( is.null( cut ) ) cut = 0.5 if( ( cut < 0 ) || ( cut > 1 ) ) stop( " Value of 'cut' must be between 0 and 1." ) if( is.null( p_links ) ) p_links = BDgraph::plinks( bdgraph.obj, round = 10 ) selected_g = 0 * p_links selected_g[ p_links > cut ] = 1 selected_g[ p_links <= cut ] = 0 } if( vis ) { main = ifelse( is.null( cut ), "Graph with highest posterior probability.", paste( c( "Graph with links posterior probabilities > ", cut ), collapse = "" ) ) BDgraph::plot.graph( selected_g, main = main ) } return( selected_g ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/graph.sim.R0000644000176200001440000001554113716773367014027 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Graph generator | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | graph.sim = function( p = 10, graph = "random", prob = 0.2, size = NULL, class = NULL, vis = FALSE ) { if( p < 2 ) stop( "'p' must be more than 1." ) if( ( sum( prob < 0 ) + sum( prob > 1 ) ) != 0 ) stop( "'prob' must be between 0 and 1." ) G <- matrix( 0, p, p ) # - - build the graph structure - - - - - - - - - - - - - - - - - - - - - | if( graph == "random" ) { if( is.null( size ) ) { G[ upper.tri( G ) ] <- stats::rbinom( p * ( p - 1 ) / 2, 1, prob ) }else{ if( size < 0 | size > p * ( p - 1 ) / 2 ) stop( "Graph size must be between zero and p*(p-1)/2." ) smp <- sample( 1 : ( p * ( p - 1 ) / 2 ), size, replace = FALSE ) G[ upper.tri( G ) ][smp] <- 1 } } if( graph == "cluster" ) { # partition variables if( is.null( class ) ) { #class = NULL if( !is.null( size ) ) class = length( size ) if( length( prob ) > 1 ) class = length( prob ) if( is.null( class ) ) class = max( 2, ceiling( p / 20 ) ) #if( !is.null( size ) ) class <- length( size ) else class <- max( 2, ceiling( p / 20 ) ) } g.large <- p %% class g.small <- class - g.large n.small <- floor( p / class ) n.large <- n.small + 1 vp <- c( rep( n.small, g.small ), rep( n.large, g.large ) ) if( is.null( size ) ) { if( length( prob ) != class ) prob = rep( prob, class ) for( i in 1 : class ) { tmp <- if( i == 1 ) ( 1 : vp[ 1 ] ) else ( ( sum( vp[ 1 : ( i - 1 ) ] ) + 1 ) : sum( vp[ 1 : i ] ) ) gg <- matrix( 0, vp[ i ], vp[ i ] ) gg[ upper.tri( gg ) ] <- stats::rbinom( vp[ i ] * ( vp[ i ] - 1 ) / 2, 1, prob[ i ] ) G[ tmp, tmp ] <- gg } }else{ if( class != length( size ) ) stop( " Number of graph sizes is not match with number of clusters." ) if( sum( size ) < 0 | sum( size ) > p * ( p - 1 ) / 2 ) stop( " Total graph sizes must be between zero and p*(p-1)/2." ) for( i in 1 : class ) { tmp <- if( i == 1 ) ( 1 : vp[1] ) else ( ( sum( vp[1 : (i-1)] ) + 1 ) : sum( vp[1:i] ) ) gg <- matrix( 0, vp[i], vp[i] ) smp <- sample( 1 : ( vp[i] * (vp[i] - 1) / 2 ), size[i], replace = FALSE ) gg[upper.tri(gg)][smp] <- 1 G[tmp, tmp] <- gg } } } if( graph == "scale-free" ) { resultGraph = .C( "scale_free", G = as.integer(G), as.integer(p), PACKAGE = "BDgraph" ) G = matrix( resultGraph $ G, p, p ) #j = sample( 1:p, 1 ) #for( i in ( c( 1:p )[ -j ] ) ) { G[ i, j ] = 1; G[ j, i ] = 1 } } if( ( graph == "lattice" ) | ( graph == "grid" ) ) { if( is.null( size ) ) { length_row = round( sqrt( p ) ) length_col = round( sqrt( p ) ) }else{ if( length( size ) == 1 ) { length_row = size length_col = size }else{ length_row = size[ 1 ] length_col = size[ 2 ] } } for( row in 1:length_row ) { for( col in 1:length_col ) { if( ( row != length_row ) & ( col != length_col ) ) G[ col + ( row - 1 ) * length_col, c( col + ( row - 1 ) * length_col + 1, col + row * length_col ) ] = 1 if( ( row == length_row ) & ( col != length_col ) ) G[ col + ( row - 1 ) * length_col, col + ( row - 1 ) * length_col + 1 ] = 1 if( ( row != length_row ) & ( col == length_col ) ) G[ col + ( row - 1 ) * length_col, col + row * length_col ] = 1 } } } if( graph == "hub" ) { if( is.null( size ) ) size = ceiling( p / 20 ) if( size < 0 | size > ( p - 1 ) ) stop( "Number of hubs (size) must be between zero and (p-1)" ) hub = sample( 1:p, size = size, replace = FALSE ) for( i in 1:size ) { G[ hub[ i ], ] <- 1 G[ , hub[ i ] ] <- 1 } } if( graph == "star" ) { hub = sample( 1:p, size = 1, replace = FALSE ) G[ hub, ] <- 1 G[ , hub ] <- 1 } if( graph == "circle" ) { if( p < 3 ) stop( "For 'circle' graph, 'p' must be more than 2." ) G <- stats::toeplitz( c( 0, 1, rep( 0, p - 2 ) ) ) G[ 1, p ] <- 1 } G[ lower.tri( G, diag = TRUE ) ] = 0 G = G + t( G ) # - - graph visualization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( vis == TRUE ) BDgraph::plot.graph( G, main = "Graph structure" ) class( G ) <- "graph" return( G ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # plot for class "graph" from graph.sim function ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | plot.graph = function( x, cut = 0.5, mode = "undirected", diag = FALSE, main = NULL, vertex.color = "white", vertex.label.color = 'black', ... ) { #if( is.null( main ) ) main = "Graph structure" #vertex.size = ifelse( p < 20, 15, 2 ) graph = BDgraph::get_graph( x, cut = cut ) graph_ig <- igraph::graph.adjacency( graph, mode = mode, diag = diag ) igraph::plot.igraph( graph_ig, main = main, vertex.color = vertex.color, vertex.label.color = vertex.label.color, ... ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/conf.mat.plot.R0000644000176200001440000000267114041543545014602 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of 'BDgraph' package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Plot a Confusion Matrix ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | conf.mat.plot = function( pred, actual, cutoff = 0.5, conf.level = 0, margin = 1, color = c( "#ff83a8", "#83ff9b" ), ... ) { conf_mat = BDgraph::conf.mat( pred = pred, actual = actual, cutoff = cutoff ) graphics::fourfoldplot( conf_mat, conf.level = conf.level, margin = margin, color = color, ... ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/covariance.R0000644000176200001440000000317513621263401014223 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing estimated percision matrix | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | covariance = function( bdgraph.obj, round = 2 ) { if( ( !inherits( bdgraph.obj, "bdgraph" ) ) && ( !inherits( bdgraph.obj, "ssgraph" ) ) ) stop( "Input 'bdgraph.obj' must be an object from functions 'bdgraph()', 'bdgraph.mpl()', or 'ssgraph()'." ) K_hat = bdgraph.obj $ K_hat if( is.null( K_hat ) ) stop( " Input 'bdgraph.obj' must be an object from functions 'bdgraph()' or 'ssgraph()'." ) cov = solve( K_hat ) return( round( cov, round ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/conf.mat.R0000644000176200001440000000445514041543417013625 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2021 Reza Mohammadi | # | # This file is part of 'BDgraph' package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Create a Confusion Matrix ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | conf.mat = function( pred, actual, cutoff = 0.5, proportion = FALSE, dnn = c( "Prediction", "Actual" ), ... ) { if( is.matrix( actual ) ) if( ( sum( actual == 0 ) + sum( actual == 1 ) ) != ( nrow( actual ) ^ 2 ) ) stop( "Elements of matrix 'actual' must be 0 or 1." ) if( inherits( actual, "sim" ) ) actual = actual $ G if( is.matrix( pred ) ) if( any( pred < 0 ) || any( pred > 1 ) ) stop( " Elements of matrix 'pred' must be between ( 0, 1 )." ) if( ( inherits( pred, "bdgraph" ) ) | ( inherits( pred, "ssgraph" ) ) ) { pred = pred $ p_links if( is.null( pred ) ) pred = BDgraph::plinks( pred, round = 15 ) } pred = pred[ upper.tri( pred ) ] actual = actual[ upper.tri( actual ) ] if( length( pred ) != length( actual ) ) stop( "prod & actual must have the same length" ) if( ( cutoff < 0 ) || ( cutoff > 1 ) ) stop( " Value of 'cutoff' must be between 0 and 1." ) pred = ifelse( pred >= cutoff, 1, 0 ) conf_mat = table( pred, actual, dnn = dnn, ... ) if( proportion == TRUE ){ conf_mat = round( conf_mat / sum( conf_mat ), 3 ) } return( conf_mat ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/compare.R0000644000176200001440000001062413716773002013544 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Reports the measures to assess the performance of estimated graphs | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | compare = function( target, est, est2 = NULL, est3 = NULL, est4 = NULL, main = NULL, vis = FALSE ) { G = BDgraph::get_graph( target ) est = BDgraph::get_graph( est ) p = ncol( G ) result = matrix( 1, 8, 2 ) result[ 1 , 1 ] = sum( G[ upper.tri( G ) == 1 ] ) result[ 2 , 1 ] = p * ( p - 1 ) / 2 - result[ 1, 1 ] result[ c( 3, 4 ), 1 ] = 0 result[ , 2 ] = compute_measures( G = G, est_G = est ) if( !is.null( est2 ) ) { est2 = BDgraph::get_graph( est2 ) result = cbind( result, compute_measures( G = G, est_G = est2 ) ) } if( !is.null( est3 ) ) { est3 = BDgraph::get_graph( est3 ) result = cbind( result, compute_measures( G = G, est_G = est3 ) ) } if( !is.null( est4 ) ) { est4 = BDgraph::get_graph( est4 ) result = cbind( result, compute_measures( G = G, est_G = est4 ) ) } result[ is.na( result ) ] = 0 if( is.null( main ) ) { main = c( "Target", "estimate1" ) if( !is.null( est2 ) ) main = c( main, "estimate2" ) if( !is.null( est3 ) ) main = c( main, "estimate3" ) if( !is.null( est4 ) ) main = c( main, "estimate4" ) } colnames( result ) <- main rownames( result ) <- c( "true positive", "true negative", "false positive", "false negative", "F1-score", "specificity", "sensitivity", "MCC" ) if( vis == TRUE ) { row_plot = ifelse( is.null( est2 ), 1, 2 ) op = graphics::par( mfrow = c( row_plot, 2 ), pty = "s", omi = c( 0.3, 0.3, 0.3, 0.3 ), mai = c( 0.3, 0.3, 0.3, 0.3 ) ) BDgraph::plot.graph( G , main = main[1] ) BDgraph::plot.graph( est, main = main[2] ) if( !is.null( est2 ) ) BDgraph::plot.graph( est2, main = main[3] ) if( !is.null( est3 ) ) BDgraph::plot.graph( est3, main = main[4] ) if( !is.null( est4 ) ) BDgraph::plot.graph( est4, main = main[5] ) graphics::par( op ) } return( round( result, 3 ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # To compare measures the performance of estimated graphs based on true graph ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | compute_measures = function( G, est_G ) { if( sum( dim( G ) == dim( est_G ) ) != 2 ) stop( " 'target' and 'est' have non-conforming size." ) upper_G = G[ upper.tri( G ) ] upper_est_G = est_G[ upper.tri( est_G ) ] tp = sum( ( upper_G == 1 ) * ( upper_est_G == 1 ) ) # True Positive tn = sum( ( upper_G == 0 ) * ( upper_est_G == 0 ) ) # True Negative fp = sum( ( upper_G == 0 ) * ( upper_est_G == 1 ) ) # False Positive fn = sum( ( upper_G == 1 ) * ( upper_est_G == 0 ) ) # False Negative # harmonic mean of precision and recall, called F-measure or balanced F-score F1score = ( 2 * tp ) / ( 2 * tp + fp + fn ) specificity = tn / ( tn + fp ) sensitivity = tp / ( tp + fn ) # Matthews Correlation Coefficients (MCC) mcc = ( ( tp * tn ) - ( fp * fn ) ) / ( sqrt( ( tp + fp ) * ( tp + fn ) ) * sqrt( ( tn + fp ) * ( tn + fn ) ) ) return( c( tp, tn, fp, fn, F1score, specificity, sensitivity, mcc ) ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/R/hill_climb_algorithm.R0000644000176200001440000002312113623516431016254 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Copyright (C) 2012 - 2020 Reza Mohammadi | # | # This file is part of BDgraph package. | # | # BDgraph is free software: you can redistribute it and/or modify it under | # the terms of the GNU General Public License as published by the Free | # Software Foundation; see .| # | # Maintainer: Reza Mohammadi | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # A divide-and-conquer type greedy hill climb algorithm | # for undirected graphcial models and count data. | ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # The Hill-Climb algorithm (function "hill_climb_mpl") consists for two part: # PART 1: Local Marginal Pseudo-likelihood optimization to discovers the # Markov blanket of each node ( function "local_mb_hc" ). # PART 2: Neighborhood search algorithm for global Marginal Pseudo-likelihood # optimization ( function "global_hc" ). # See "Marginal pseudo-likelihood learning of Markov network structures" by # Pensar et al. for more details. ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # INPUT: * data ( n x p ) matrix, as a count dataset with n observations and p variables. # The outcome space of each variable must be in the form 0, 1, ..., r. # * alpha: The parameter of the prior distribution # OUTPUT: * selected_G - adjacency matrix for the selected graph ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | hill_climb_mpl = function( data, freq_data, n, max_range_nodes, alpha = 0.5, operator = "or" ) { p = ncol( data ) G = matrix( 0, p, p ) for( i in 1:p ) { mes = paste( c( " PART 1: Local search for node ", i ), collapse = "" ) cat( mes, "\r" ) utils::flush.console() mb_i = local_mb_hc( node = i, data = data, freq_data = freq_data, max_range_nodes = max_range_nodes, p = p, n = n, alpha = alpha ) G[mb_i, i] = 1 } G_local = matrix( 0, p, p ) if( operator == "or" ) G_local[ ( G + t( G ) ) > 0 ] = 1 if( operator == "and" ) G_local = G * t( G ) if( sum( G_local ) != 0 ) { selected_G = global_hc( G_local = G_local, data = data, freq_data = freq_data, max_range_nodes = max_range_nodes, p = p, n = n, alpha = alpha ) }else{ selected_G = G_local } return( selected_G ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Local Marginal Pseudo-likelihood optimization to discovers the Markov # blanket of each node ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | local_mb_hc = function( node, data, freq_data, max_range_nodes, p, n, alpha = 0.5 ) { temp = seq_len( p ) mb_potential = temp[ - node ] l_mb_potential = p - 1 mb_hat = numeric() log_prob_mb_hat = log_mpl_disrete( node, mb_hat, data, freq_data, max_range_nodes, p, n, alpha = alpha ) cont = TRUE while( cont == TRUE ) { cont = FALSE log_prob_mb_candidates = numeric( l_mb_potential ) for( i in seq_len( l_mb_potential ) ) log_prob_mb_candidates[i] = log_mpl_disrete( node = node, mb_node = c( mb_hat, mb_potential[i] ), data = data, freq_data = freq_data, max_range_nodes = max_range_nodes, p = p, n = p, alpha = alpha ) log_prob_mb_candidate_top = max( log_prob_mb_candidates ) if( log_prob_mb_candidate_top > log_prob_mb_hat ) { mb_cand_top_loc = which.max( log_prob_mb_candidates ) mb_hat = c( mb_hat, mb_potential[ mb_cand_top_loc ] ) mb_potential = mb_potential[ - mb_cand_top_loc ] l_mb_potential = l_mb_potential - 1 log_prob_mb_hat = log_prob_mb_candidate_top cont = TRUE } length_mb_hat = length( mb_hat ) if( ( length_mb_hat > 2 ) & ( cont == TRUE ) ) { delete = TRUE while( delete == TRUE ) { delete = FALSE log_prob_mb_candidates = numeric( length_mb_hat ) for( i in 1:length_mb_hat ) log_prob_mb_candidates[i] = log_mpl_disrete( node = node, mb_node = mb_hat[ -i ], data = data, freq_data = freq_data, max_range_nodes = max_range_nodes, p = p, n = n, alpha = alpha ) log_prob_mb_candidate_top = max( log_prob_mb_candidates ) if( log_prob_mb_candidate_top > log_prob_mb_hat ) { mb_cand_top_loc = which.max( log_prob_mb_candidates ) mb_hat = mb_hat[ - mb_cand_top_loc ] length_mb_hat = length( mb_hat ) log_prob_mb_hat = log_prob_mb_candidate_top if( length_mb_hat > 2 ) delete = TRUE } } } } return( mb_hat ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Neighborhood search algorithm for global Marginal Pseudo-likelihood optimization ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | global_hc = function( G_local, data, freq_data, max_range_nodes, p, n, alpha = 0.5 ) { print( "PART 2, running global search algorithm" ) ug = matrix( 0, p, p ) n_edges = sum( G_local ) / 2 temp = which( G_local == 1, arr.ind = T ) edges = temp[temp[, 1] < temp[, 2], ] curr_scores = numeric( p ) for( i in 1:p ) curr_scores[ i ] = log_mpl_disrete( i, which( ug[i, ] == 1 ), data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change_imp = matrix( 0, n_edges, 2 ) edge_change = matrix( TRUE, n_edges, 2 ) cont = TRUE while( cont == TRUE ) { cont = FALSE edge_change_ind = which( edge_change[, 1 ] == TRUE ) for( i in 1:length( edge_change_ind ) ) { edge = edges[ edge_change_ind[ i ], ] node = edge[ 1 ] mb = which( ug[node, ] == 1 ) if( ug[ edge[ 1 ], edge[ 2 ] ] == 0 ) { swoe1 = curr_scores[ node ] mb = c( mb, edge[ 2 ] ) swe1 = log_mpl_disrete( node, mb, data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change_imp[ edge_change_ind[ i ], 1 ] = swe1 - swoe1; edge_change[ edge_change_ind[ i ], 1 ] = FALSE }else{ swe1 = curr_scores[ node ] mb = mb[ mb != edge[ 2 ] ] swoe1 = log_mpl_disrete( node, mb, data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change_imp[ edge_change_ind[ i ], 1 ] = swoe1 - swe1; edge_change[ edge_change_ind[ i ], 1 ] = FALSE } } edge_change_ind = which( edge_change[ , 2 ] == 1 ) for( i in 1:length( edge_change_ind ) ) { edge = edges[ edge_change_ind[ i ], ] node = edge[ 2 ] mb = which( ug[ node, ] == 1 ) if( ug[ edge[ 1 ], edge[ 2 ] ] == 0 ) { swoe2 = curr_scores[ node ] mb = c( mb, edge[ 1 ] ) swe2 = log_mpl_disrete( node, mb, data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change_imp[ edge_change_ind[ i ], 2 ] = swe2 - swoe2; edge_change[ edge_change_ind[ i ], 2 ] = FALSE }else{ swe2 = curr_scores[ node ] mb = mb[ mb != edge[ 1 ] ] swoe2 = log_mpl_disrete( node, mb, data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change_imp[ edge_change_ind[ i ], 2 ] = swoe2 - swe2; edge_change[ edge_change_ind[ i ], 2 ] = FALSE } } imp = apply( edge_change_imp, 1, sum ) max_imp = max( imp ) max_imp_loc = which.max( imp ) if( max_imp > 0 ) { edge = edges[max_imp_loc, ] if( ug[edge[1], edge[2]] == 0 ) { ug[edge[1], edge[2]] = 1 ug[edge[2], edge[1]] = 1 }else{ ug[edge[1], edge[2]] = 0 ug[edge[2], edge[1]] = 0 } curr_scores[edge[1]] = log_mpl_disrete( edge[1], which( ug[edge[1], ] == 1 ), data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) curr_scores[edge[2]] = log_mpl_disrete( edge[2], which( ug[edge[2], ] == 1 ), data = data, freq_data = freq_data, max_range_nodes, p = p, n = n, alpha = alpha ) edge_change[edges[, 1] == edge[1]|edges[, 1] == edge[2], 1] = TRUE edge_change[edges[, 2] == edge[1]|edges[, 2] == edge[2], 2] = TRUE cont = TRUE } } return( ug ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Computing the Marginal pseudo-likelihood for count data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | log_mpl_disrete = function( node, mb_node, data, freq_data, max_range_nodes, p, n, alpha = 0.5 ) { length_freq_data = length( freq_data ) size_node = length( mb_node ) node = node - 1 mb_node = mb_node - 1 log_mpl_node = 0.0 result = .C( "log_mpl_dis", as.integer(node), as.integer(mb_node), as.integer(size_node), log_mpl_node = as.double(log_mpl_node), as.integer(data), as.integer(freq_data), as.integer(length_freq_data), as.integer(max_range_nodes), as.double(alpha), as.integer(n), PACKAGE = "BDgraph" ) log_mpl_node = result $ log_mpl_node return( log_mpl_node ) } ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/NEWS.md0000644000176200001440000001363214043516325012667 0ustar liggesusers# **BDgraph** ![](https://www.r-pkg.org/badges/version/BDgraph) ![](https://www.r-pkg.org/badges/last-release/BDgraph) ![](https://cranlogs.r-pkg.org/badges/BDgraph) ![](https://cranlogs.r-pkg.org/badges/grand-total/BDgraph) ## **BDgraph** NEWS ### **BDgraph** Version 2.64 * Function `roc()` is added to the package. * Function `conf.mat()` is added to the package. * Function `conf.mat.plot()` is added to the package. * Function `sparsity()` is added to the package. * Functions `ddweibull()`, `pdweibull()`, `qdweibull()`, `rdweibull()` are added to the package. ### **BDgraph** Version 2.63 * In functions `bdgraph()`, `bdgraph.mpl()`, and `bdgraph.ts()`, option `print` is removed. * In function `bdgraph.sim()` option `type="dw"` is added. * In function `bdgraph.sim()` option `type="discrete"` is changed to `type="count"`. * Bug fixed for `gnorm()` function. * `README` is added to the package. ### **BDgraph** Version 2.62 * Bug fixed related to the class function; class(.) == * ### **BDgraph** Version 2.61 * Bug fixed related to the C stack by Fortran functions. * Function `bf()` is added to the package. * Function `adj2link()` is added to the package. * Function `link2adj()` is added to the package. * Function `bdgraph.ts()` is removed. ### **BDgraph** Version 2.60 * Function `precision()` is added to the package. * Function `covariance()` is added to the package. ### **BDgraph** Version 2.58 * Bug fixed for `compare()` function. * Function `get_graph()` is added to the package and used inside function `compare()`. * Functions `get_g_prior()`, `get_g_start()`, `get_S_n_p()`, `get_K_start()`, and `get_cores()` are added to the package and used inside function `bdgraph()`. ### **BDgraph** Version 2.57 * In the function `compare()` option `est4` is added. ### **BDgraph** Version 2.56 * In the functions `rgwish()`, `rgcwish()` and `gnorm()`, option `adj.g` is changed to `adj`. * In function `compare()`, option `sim.obj` is changed to `target`. * In function `compare()`, option `bdgraph.obj` is changed to `est`. * In function `compare()`, option `bdgraph.obj2` is changed to `est2`. * In function `compare()`, option `bdgraph.obj3` is changed to `est3`. * In function `plotroc()`, option `sim.obj` is changed to `target`. * In function `plotroc()`, option `bdgraph.obj` is changed to `est`. * In function `plotroc()`, option `bdgraph.obj2` is changed to `est2`. * In function `plotroc()`, option `bdgraph.obj3` is changed to `est3`. * In function `plotroc()`, option `bdgraph.obj4` is changed to `est4`. * Bug fixed for `bdgraph()` function with option `method = gcgm`. * Functions `summary.bdgraph`, `plot.bdgraph`, and `print.bdgraph` are modified. ### **BDgraph** Version 2.53 * Files `configure` and `configure.ac` are removed and files `Makevars` and `Makevars.win` are modified accordingly. * In functions `bdgraph()`, `bdgraph.mpl()`, and `bdgraph.ts()` option `save.all` is changed to `save`. * In functions `bdgraph()` and `bdgraph.mpl()`, option `multi.update` is changed to `jump`. * In functions `bdgraph()` and `bdgraph.ts()`, option `prior.df` is changed to `df.prior`. * In the function `pgraph()`, option `adj_g` is changed to `adj`. ### **BDgraph** Version 2.52 * Option `threshold` is added to function `rgwish()`. * Option `threshold` is added to function `bdgraph()`. * Option `not.cont` is added to function `bdgraph()`. * In function `compare()`, option `colnames` is changed to `main`. * In functions `bdgraph()` and `bdgraph.mpl()`, option `g.space` is removed. Instead user can use option `g.prior`. * Bug fixed for `bdgraph.ts()` function. * Data set `churn` is added. ### **BDgraph** Version 2.51 * Bug fixed for functions `rgwish()` and `rcgwish()`. * vignette is added to the package. ### **BDgraph** Version 2.47 * Function `graph.sim` is added to the package. * Function `plot.graph` is added to the package. ### **BDgraph** Version 2.46 * Function `rmvnorm` is added to the package. ### **BDgraph** Version 2.44 * Functions `bdgraph.ts`, `rcwish`, and `rcgwish` are added to the package. ### **BDgraph** Version 2.42 * Function `local_rates_ggm_mpl` in cpp is added for bdgraph.mpl function. * `configure` and `configure.ac` are added to the package for Makevars file. * Functions `bdgraph.ts`, `rcwish`, and `rcgwish` are removed from the package. ### **BDgraph** Version 2.41 * Option `dgm-binary` is added to function `bdgraph()` which is for running Hill-Climbing algorihtm for binary data. * `configure` and `configure.ac` are added to configure checks of C++ codes. ### **BDgraph** Version 2.38 * Function `bdgraph.mpl()` is added to the package, which is based on Marginal Pseudo-Likelihood estimation. * In the algorithm `gcgm`, step `copula` are implimented in parallel using OpenMP in C++. * Function `bdgraph.ts` is implimented in parallel using OpenMP in C++. * New reference related to the ratio of normalizing constant is added to manual. ### **BDgraph** Version 2.40 * Option `g.prior` is added to function `bdgraph()`, for prior distribution of the graph. * Option `cores` is added to function `bdgraph()`, for determining the number of cores to use for parallel execution. * Function `transfer()` is added to the package. ### **BDgraph** Version 2.36 * The BDMCMC algorithms are implimented in parallel using OpenMP in C++. ### **BDgraph** Version 2.28 * The Title in Description is changed. * Functions `bdgraph.ts()`, `rgcwish()`, and `rcwish()` are added to the package. ### **BDgraph** Version 2.24 * Function `phat()` is changed to `plinks()`. * Function `prob()` is changed to `pgraph()`. * Function `log_Ig()` is changed to `gnorm()`. ### **BDgraph** Version 2.23 * Function `I.g()` is chenged to `log_Ig()` and it is implemented in C++. ### **BDgraph** Version 2.20 * Reversible jump MCMC algorithm is added to the `bdgraph()` fonction. ### **BDgraph** Version 2.19 * The Title in Description is changed. * Function `I.g` is added. BDgraph/MD50000644000176200001440000001232114043700405012065 0ustar liggesusers2599a1077132fa8cec8613164f79df4d *DESCRIPTION 417569232c4fa655bf9a778e13ff3e9d *NAMESPACE 981571bed4581caf36c474ca4dc5a7e7 *NEWS.md d426c105dcca42ea80682b2133b4cfe0 *R/adj2link.R a869ac8d6730245c56199ea9c949d808 *R/bdgraph.R 172b472b72e756dd392ea02d83510035 *R/bdgraph.mpl.R 3067b392c29018fc3f43c3e83ed32a60 *R/bdgraph.npn.R d284030babb51bbc8474e1a797b6fe4e *R/bdgraph.sim.R cd97014559d6d022dba7c627ac7ed1ae *R/bf.R 1945bff9d69ef554c37933061c9d896c *R/compare.R 768a51b01a25c0e45f5c8d508f3a9ce8 *R/conf.mat.R 906925f18f7f64e95ae0a9a458433e6b *R/conf.mat.plot.R c5842e802f5b4a3af875ab37f508d659 *R/covariance.R 918140e3b876addf34f3593c3d11a55c *R/ddweibull.R 7fe98e17a060f4ed75b1e29a225bb433 *R/detect_cores.R 2a9fba6b6d50cb58ac2e19f56d2bbda9 *R/get_things.R f20a9673000ea75feaf22322d49c92df *R/gnorm.R 5090683feda4e68ff53872a861418846 *R/graph.sim.R 4689556b75333dc802adc1843032cc91 *R/hill_climb_algorithm.R 773982aa933576cd43ec62294946594f *R/hill_climb_binary.R 87358778cb78c137832538f37ebb9c14 *R/link2adj.R fe740e2410ec9e81188fcc18a0d7659c *R/pgraph.R 0c467aef0d4e40b4a2bded483648bbb7 *R/plinks.R 8d4061bb3242e3796d8f97505bebba26 *R/plotcoda.R 29d51309a0ae9d6a2c63de8624dd32de *R/plotroc.R 4cab27a026931ddeb2ff66ba3a7a4590 *R/precision.R 94077688e434b457a74ea2565c9fc253 *R/rgwish.R e3b1fd90665e7cb3cfde1262973fa1f3 *R/rmvnorm.R 8de87c04622596091399160255f4fad5 *R/roc.R cdb98692037e75e803009214eef771d2 *R/rwish.R c413e382d197868db4903aede0579a05 *R/select.R d575b36097908d3e0156db8049057c42 *R/sparsity.R 92a2d74c7474c147c3791c840e948c23 *R/traceplot.R 37735b18cec18553621c1931ee863e36 *R/transfer.R 24544d918be293962ddaa6490b73e636 *README.md 5a1c0006f5901feda2ead61fdd4e72b8 *THANKS bccb873223adf44f937144d027d630dc *build/partial.rdb 694310dff1bd4be3c503c4d23ea4566b *build/vignette.rds a8af6b231090f28d23f13c2422e5a59c *data/churn.RData 3b1d0087898f992dd8a92ec5ed672ce3 *data/geneExpression.RData c46b8604d16fd48a5cbc11ac2edc6ae0 *data/reinis.RData 4db46ea2b4302923b4d6cdf84b6e2e67 *data/surveyData.RData a8d9f8d04015dba73da0d18aafca78f6 *inst/CITATION d7828f461d88518433ae3055fdf2a195 *inst/TODO 97c18a6959dc26f7026ce277050dfac6 *inst/doc/BDgraph_examples.R 805a49b23148683b1955e2ec9ef78419 *inst/doc/vignette.Rnw 7951a486c94d118622868f4584c9cf3c *inst/doc/vignette.pdf 9f12c97555d1b4db91314084d230234a *man/BDgraph-package.Rd c5b4b68f7fb5208fd9ceb963e36a4ac0 *man/adj2link.Rd 0948b5aca4ede110612f7a7aea6a8796 *man/bdgraph.Rd ff3aae2cbf0f672a790de0995e6446dd *man/bdgraph.mpl.Rd b454cf789db96ad7f5969b4f1e3fd013 *man/bdgraph.npn.Rd ccf383d9222d9db434ec1cf6aaf98551 *man/bdgraph.sim.Rd 5fa7dc23947c85ae102b96450367d262 *man/bf.Rd dfb24d0d4e49948fc50185c0ba3ae76f *man/churn.Rd 82de5a5b331be4b3d4476766719f0f37 *man/compare.Rd bdb909df1834fb83dabf35691e1bd547 *man/conf.mat.Rd 612e0980a5cc8f49280721bd7cec1170 *man/conf.mat.plot.Rd 94a02b215c33951346ae6c89a371355f *man/covariance.Rd ade676c54741d2e1a96af1ec6aca4ff8 *man/ddweibull.Rd 50afba76ced2e6eb14d5af30c8821c70 *man/geneExpression.Rd b6c1e76366ba9d93e0732d979c5f7009 *man/gnorm.Rd f9f72e5c92a99e64fc26e9a9bb30a942 *man/graph.sim.Rd 55f2ab782d54f0614c75a8fa2c215250 *man/link2adj.Rd f2f2468430d9f7a4f55470a389412ab3 *man/pgraph.Rd 8f2fbeff11426a8a937b2fd5bac790ab *man/plinks.Rd 747ff0bf4f8756e44e5b0949fcaafe41 *man/plot.bdgraph.Rd bc830347f915e0aebe11a05fcba9e18a *man/plot.graph.Rd 9397df51dbafe014f4bfe476c98f0026 *man/plot.sim.Rd e08a7975e5a31c9032ff6d0e1a447434 *man/plotcoda.Rd 46dc525b554a16283f887bde918571b5 *man/plotroc.Rd 864bbadcfe34b5b9bdbfe3ee2a54d8f9 *man/precision.Rd eb09456ee7427510207e219a6d962cc4 *man/print.bdgraph.Rd 83fbaa72be8f20711a44f824c5ff20e3 *man/print.sim.Rd 97d437df4cfa4e903b022d9cceb2a8a6 *man/reinis.Rd d917dd608a1647b9bc16ca5133a53777 *man/rgwish.Rd 13a38dfec2b51611e6fac0716c5dc6eb *man/rmvnorm.Rd fc8f20281f74c58aee6ba1e155558d2e *man/roc.Rd 571ad284dcb8b254e66410a64814665b *man/rwish.Rd 7d3ad5bc404640b413ba9e3891e72ce1 *man/select.Rd 02955f9d9c25593fd123c5546165ada7 *man/sparsity.Rd b0bd1b7a1f8bb9d6a6b4f619f0fcd3de *man/summary.bdgraph.Rd e780323cad339159ea49aae5d7f3ace1 *man/surveyData.Rd 6f002e0d9ebaeb8950212b16a590b131 *man/traceplot.Rd 3a41fe9e0f616a0b5ff85a67068d5200 *man/trensfer.Rd 18fed81e2d25021fadb2205936ca980d *src/BDgraph_init.c 15570717c2f61f5db63cfdedb447668e *src/Makevars 56c4d0d96659f0be8a7e7036dabd5277 *src/Makevars.win ee1b1012de31cec1aa466573042dad85 *src/copula.cpp cb55d7bd3d81dbd0ee01af5486843e41 *src/copula.h 17fcce7a29445984b764ec14c5f2899f *src/gcgm_DMH.cpp 9513c59ad4d3108a2013dd5776ef93c2 *src/gcgm_bd.cpp aee7632636d29dba2dfe43663e5a0413 *src/gcgm_dw_bd.cpp 95dc32995ff561fc02786bed3750549a *src/ggm_DMH.cpp c760812eef01fe52bd6b7e26fe81c4e9 *src/ggm_bd.cpp 62519fede0e700ccd39184cd92da5450 *src/ggm_mpl_bd.cpp b45c04e2b54e822bc6e7bf6a4914c0c1 *src/gm_mpl_Hill_Climb.cpp 338b27566f6e29d02c12cd4bec0ffac5 *src/gm_mpl_bd_dis.cpp 6cbd63962213a55757dd86751454ed51 *src/gm_rj.cpp b8c753b2472ae5d9a5b26f8ae8b14fe3 *src/matrix.cpp d854c6ac567ced622b8758e548590dde *src/matrix.h 6d4ee211d579f6ec506f7dff6865ea93 *src/omp_set_num_cores.cpp f60d48e8f7fa0eaf1b63330189bed863 *src/rgwish.cpp 32bf946fa498dadf1374b4f85fca6a2b *src/rgwish.h 696494cfedb3e3edcdef3d92f55189ce *src/util.h 1b4808706a25fc9d18f6814cad711cea *vignettes/BDgraph.pdf 805a49b23148683b1955e2ec9ef78419 *vignettes/vignette.Rnw BDgraph/inst/0000755000176200001440000000000014043535231012536 5ustar liggesusersBDgraph/inst/doc/0000755000176200001440000000000014043535231013303 5ustar liggesusersBDgraph/inst/doc/vignette.Rnw0000644000176200001440000000066213524225705015631 0ustar liggesusers% \VignetteIndexEntry{An Introduction to the BDgraph Package for Bayesian Graphical Models} % \VignetteKeywords{Bayesian structure learning, Gaussian graphical models, Gaussian copula, Covariance selection, Birth-death process, G-Wishart, BDgraph} % \VignettePackage{BDgraph} \documentclass[a4paper]{article} \usepackage{hyperref} \usepackage{pdfpages} \begin{document} \includepdf[fitpaper=true,pages=-]{BDgraph.pdf} \end{document} BDgraph/inst/doc/BDgraph_examples.R0000644000176200001440000001166013522535770016650 0ustar liggesusers## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Some examples for the BDgraph package ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( !require( "BDgraph" ) ) install.packages( "BDgraph" ) ## Loading the "BDgraph" package library( "BDgraph" ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Example 1: Sampling from G-Wishart distribution ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | adj <- matrix( c( 0, 0, 1, 0, 0, 0, 1, 0, 0 ), 3, 3 ) adj # adjacency matrix # Sampling from G-Wishart distribution with parameters b and D sample <- rgwish( n = 1, adj = adj, b = 3, D = diag( 3 ) ) round( sample, 2 ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Example 2: An example on simulated data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Generating multivariate Gaussian data based on a 'scale-free' graph structure data.sim <- bdgraph.sim( n = 60, p = 8, graph = "scale-free", type = "Gaussian" ) round( head( data.sim $ data, 4 ), 2 ) # Running the BDMCMC sampling algorithm for Gaussian graphical models (ggm) sample.bdmcmc <- bdgraph( data = data.sim, method = "ggm", algorithm = "bdmcmc", iter = 5000, save = TRUE ) summary( sample.bdmcmc ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Running the RJMCMC sampling algorithm for Gaussian graphical models (ggm) sample.rjmcmc <- bdgraph( data = data.sim, method = "ggm", algorithm = "rjmcmc", iter = 5000, save = TRUE ) plotroc( data.sim, sample.bdmcmc, sample.rjmcmc, smooth = TRUE, label = FALSE ) legend( "bottomright", c( "BDMCMC", "RJMCMC" ), lty = 1:2, col = c( 1, 4 ), lwd = c( 2, 2 ), cex = 1.5 ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Comparing the performance of the BDMCMC and RJMCMC algorithms compare( data.sim, sample.bdmcmc, sample.rjmcmc, main = c( "Target", "BDMCMC", "RJMCMC" ) ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Example 3: Application to labor force survey data ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | data( "surveyData", package = "BDgraph" ) # Loading the labor force survey dataset head( surveyData, 5 ) ## The data is stored in an integer matrix with the ordinal variables ## already having suitable scores assigned. Alternatively also a ## data.frame where ordinal variables are coded as factors could be ## bused and might be preferable. # Running the BDMCMC sampling algorithm for Gaussian copula graphical models (gcgm) sample.bdmcmc <- bdgraph( data = surveyData, method = "gcgm", iter = 10000, burnin = 7000 ) summary(sample.bdmcmc) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | # Example 4: Application to human gene expression ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | data( "geneExpression", package = "BDgraph" ) # Loading the human gene expression dataset dim( geneExpression ) # Running the BDMCMC sampling algorithm for Gaussian copula graphical models (gcgm) sample.bdmcmc <- bdgraph( data = geneExpression, method = "gcgm", g.prior = 0.1, iter = 10000, burnin = 7000 ) ## - - - - Figure 8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| if( !require( "Matrix" ) ) install.packages( "Matrix" ) library( "Matrix" ) p_links <- Matrix( plinks( sample.bdmcmc ) ) image( p_links + t( p_links ), useAbs = F, col.regions = grey( seq( 1, 0, length = 256 ) ), xlab = NULL, ylab = NULL, sub = NULL, lwd = 0.01, main = "Posterior Probabilities of all Links" ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | selected_graph <- select( sample.bdmcmc, cut = 0.5 ) colnames( selected_graph ) <- substr( colnames( geneExpression ), 1, 7 ) # for removing nodes without links nodes_size <- apply( selected_graph + t( selected_graph ), 2, sum ) nodes_size_zero <- which( nodes_size == 0 ) selected_graph <- selected_graph[ -nodes_size_zero, -nodes_size_zero ] plot.graph( selected_graph, layout = igraph::layout.fruchterman.reingold, edge.color = "gray20", vertex.color = "red", vertex.size = 2, vertex.label.font = 1, vertex.label.color = "gray50", vertex.label.dist = 0.15, margin = -0.05 , edge.arrow.width = 5 ) ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | BDgraph/inst/doc/vignette.pdf0000644000176200001440000272172514043535231015643 0ustar liggesusers%PDF-1.5 % 9 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3D%+ ҁi$Z endstream endobj 7 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F49 16 0 R /F54 19 0 R /F15 22 0 R /F63 25 0 R /F70 28 0 R /F72 31 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3378 /Filter /FlateDecode >> stream xڥr]_Gpj!>ENĉ;!5/*AZM={70Q^yswTh!R*MJZ% vouVO3ofb-~뷴G`{)M_v}`nЩNRB~\Od1Eed7x2t%$0EתPIYة os#*#IyR%RѵIa F{n/z-W{ƣ["7Pr 5|CaZQiE7f:S*w^9>8 ( H !fy7 DV&ɒ :`y*\bFVˣ eЈ˩B`$v>~~cF 4Etrf3燏66D ;۹USU7Ggia=!h`][oXpd:q'2V ۃئ1~m[;Yc `qv`;,+SIVքśXb,[rvdH*n?#HvhCQ%rZpw񋞈%D{O)ƌEr y5 1FxL&T7 dy >Y)X bFA v^L!^.[ ɡTұ<(DILqpPd%$u*VURʺP U˃< BI#5:k1;%2Xa4r3cc0e.Yeyѱы)DdDsa`[m+txDAWEӑ~%fT %AvhlH$Og92=IK&4"x-G&6B瞟/ NX'hE )l'D k0qR>/.HSK9xs62(ziQܱ9ւh^ܮ, 3¯Cqun6/dkBΠ8RƓʺ N#A.z@A*UYy2)N{kl5ETW*9C(Йf% 5%1 %|'6S U V]B䬎L}X}"@uDO36aYGqlyCǞ۔s3]&CΓY")}%AR$EnNKLl<9fE(sսQF<6%5P&eR]i[COҪ(wjdIY8ZDI\PvAxl_8UtC &1!\K+ \uDbxLèVjE@G:p59)>vQσ8 - dޏ<ͤTKwڄ Aq64G Lv5'9aQ#ς‹As Ia!sVm2:R jT!?Жx$>ȝnЄ04 aX !Fprb+ͧ*vfG&QvRH^EMZ#Χ٨F(I? gxTtw;B :;ʐQ+Tls{uT\~&|;Akhw;g:C7P NJ" :zsDi/00 qlC {J~$yxKD)_\95*) 'Uehښgq fa.aDpdђ|]b/W3[? 9NwG6ӻfso" `ů6Թ9')$ oK7vawwi{;dZ=^(̐J wMƞ =h*Kh[R"[o-jԤH3׉wR6Ւ 8=uWsh@io`{ p uM KUCߡvJӑȭƘr_}@{W$2<WYO~ vo g*.$&{u|R'#E$ uHy¸(&nF ?[Cw@ zG_Y6ߛ} gPy4?q9CQg3Tvt6l 2{mF߾y';x틷90I endstream endobj 47 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3T%+ ҁ8i  endstream endobj 44 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 2 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F54 19 0 R /F70 28 0 R /F72 31 0 R /F94 60 0 R /F25 63 0 R /F49 16 0 R /F95 66 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3961 /Filter /FlateDecode >> stream xڭk۶M?M3S;im7u.&x:$*Jv/@P"d<(`],KW՛g/oxJ2)UrǥW7#}x PoU4>#w/=iy^z&z-MmaȲ&`őڱSmG-nb|㵵1@͎&:jB/wGH[R'*R;UZzd>yB- :o8@Wش73um#c]f;T3Djˏ ٚ 2@tsVәfMpvKV'vP/g_+&jk)rG$nN䝀eۚ veQL.!fM l7Sj> N N6;fi4h uNcZkݥQHkw,r@;hR^#|';P5ׄR[PL.@yԖ5DeIf+XWoz`-lȆ$[.F@y%/+g%? : TǮW\*c&rᘊ^GB1yyO,a\:sB.:C>ŒG2P9A?}o<&7UI1['*UE,B6!Miù(۬ fQ eB]צ oXgT]ʱ>Py}\WK0sb\؊$ۆ$qyPlhM S$9Q# `hHQؤt8Oͱ.Ĵ%c틓XB\$ͮϰcZ%MccRuFTjzs ZrpW%O [@ƖEqY'vpg@@ӝ9x0 hU= ɗ x\,oA쇆0.Bz.xhŖ:)yv*6-J7+ԧv{^?|.S,u.uC2C[Bf1%̆wt]]_:J|4샡T } 㫃aͽ?5)Wc˲۲ ̪fyyaA3./P*=S.9yVT-ki2$P8<,nJ5Ob0,O0懯Uoқ/D1'b6(W"]'&POx`d%Ð2q uwJq]mգf˫+ˮe*G(( WWoY Z1kʩPYKlein^V 3t_ $zvU>qdp5D8]] "U<^q팳/ d@f FK_Al9dy~!%f+C"rhqV냌{ ^+ G ƒҁKަ!-kש_5ϐSxoR':p h(G3"./m6QhޣtMAP5I`̾nv,c8(^B 2tҌU[0<y˻Bƹ҇dF\K9'ϔ%鋔O6zvbT=%;qSKK_W7脰L?~ ˠұN/aY{C?t}B¥ *1V(G>WEWbaC($YP 2.^rJ%G #";)<2#\(zd끘΀i{mVE.yB@ۀ'E.x F&w 1\)"(ޛa.pztE 갴{#Z.Y._`^fT@‰ SR*nLqxʼn@<=8I:]t0ܚ]˳|B]UA8z xҳ;IZ9QǼ1VI!kƨ5SAwmUw$Ic(u lH'2f|h=v Dq ev:a\dlH-t|\MYˌ+3%+W÷\َ*7IyK U|eGi%{ i;k p|3* ^1 RJm)͐SJ~A; iedC>7,{{yI]JX,="?_2XPkwW&vmQvJ\};ܶ8US7q\rU^E ߣP~9$Lqz-=RpԔmOg_H#f-Ѭy~?1T.F 1t7f;'oB{'|EF:*UzoxIx_pouM^{"v-RT}w]pU y/: "0jͳYnT endstream endobj 82 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3L%+ ҁ8i5 endstream endobj 79 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 3 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F54 19 0 R /F70 28 0 R /F63 25 0 R /F94 60 0 R /F96 86 0 R /F72 31 0 R >> /XObject << /Im1 87 0 R >>/ProcSet [ /PDF /Text ] >> /Length 2928 /Filter /FlateDecode >> stream xڵZKs8Wrj# 38{w&ޚhT,)%@dٵS);$@7Я&I4xue҉"*ncLLj"N'7S4;8ې 𳇟.eFԄd?E-}ۢ [w+6v8^6py5,)Rl|ˇgӿ*Ykm/`O0f&4#u}Mƅ(Q_NW~n .!90Ey]#+fJ䏘vf9˴4ň$gd\vyFPp[ƈ6TA3oW<4۷G=2.0VqBhMKD.˵ -? <(Ck1U[M;b$QΉnk8V6{ݒOa%K" #6Ou?RURgqjUŨln?,d7P ;Ets{{{sQjދ2)7bo4ӐSXSgEEe'խ5 YQnv;&iQ6levB/_TxMdE%d`ӥ#F|/0BR|^7@4ϔӈĔ|ap& U vgJ7t H#эǧ<;n,?*!pIV~O U)e({K:m[Y0;U͌MpT1aLC @C UMEAL% EF)Av*eb2TIW^_!{`j腩$ nlt(3d/cFDȲ0 `Pa+{ ^Cƭ2nXEOP-{6qo_¼nm,[5,׷kU4H1^\;KEy uc!$稶;]:߸СN\؝(‹Ѵ5y^qf z/$ Y)]%2KUt4 X?M+J$ui, 7lj%v{lS Wף'sk۞ҫ&9v3>M]jW¨3 X'd Da:lT;uFԲmwa:t0:}FG P/ v~ܠxxXkxIaGڎc9ogPe bLSn3"ǭo ~;ޭK R( -*Y٫" nX=\vkv]k APd8a\V`^ָw2mߊm6tpTyӶd]Ygx\3ms{ׂ]Oѷ% (XIIU6~炿qՙ?ˆϢ>@iͪaAҐhSm6`V%}+!_QzѓHGݲU=CVkOZ6a;:!T7$voQ=+ gМ^}^*^ǚb#+!pH]/nx-u% :-IQ%kl^s1'"ˣIN zP,@20|)_Y,FLKiZY}~Nf endstream endobj 87 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Figure_1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 90 0 R /BBox [ 88.86369 306.2366 636.114 496.7093] /Resources << /ProcSet [/PDF/Text] /ColorSpace << /Cs1 91 0 R >> /Font << /TT1 92 0 R >> >> /Length 50788 /Filter /FlateDecode >> stream xˮKr_O1yhu!nn"l d1*RY`c9223232?Os>|y???.?/-uF'Gٯ??߯}nߟrcA8}ߗ<|n_||ma3wdRBBd5vDz}y^#v~! AVZE-|I__OFߝ M'Dß>!7 ]oӯ|?.~yo?O`e9]zt}]Ϸǻ]_s=t} $4tny)2^9ݟvv~ˎίyK ;Gmbw߲)wG(.4u<'V~^oŷA*uOpb`/?aO/_{Ҭޟtח\"`}o =>/1|`!d?H~2v3}g$#t3鐟_޿_G|JIJl !K-)[< sq myc,P1Lmv@.ϚDRH6d}EbvfD}f~Tb~ cb@crrU7FJĬYӒϒvFazfݥm\@k0eMbABPs~߮ Vo&)֬V˜Y?̿CFJ#)f]_Ҁ[E y1ތh[sPJ%5-f*K/ԋʤYM֌z|/-75Ca*hWRlcIMKF,\HVRH*v@߷C 5 &D\URƢGRQ"t.e Qsfj<.c"^* (i1,g+y|_ׇ'!)}!eυ-Ԝ_Tc wbP{=<+G{ԹlcH*v@DN때{߸Y2dWNBp&MjԷy<T˜Ď({ɘعw[$HvRRkIjvagJL:<\⤖ 3traaiKJґ{;,߷'')ݱr!RF1-nZ ^qAw栘 KE[R' {㮙W+]]-]E%|*TRlcM Va5Z%& ߷9<~ 7.ӈTK7#]z5簥\?Gù#湜 =\H+57][qU`Z+ԟρ9Ct,,;%57]_" ^1f|,^tcF8 ,ȡL#GR ;WbSpح9A'9 )vT7YۏeeͼS73V1=pt~jU.eXRlcHjn>Kha$^'|EK92_9@!0JrZR󓇰ySn7Ͻ%#"L.ꏤ"$KDZꜟ47^lI՘05W9{prS78M:q/W9M9ܓbYʊ%7-ܱe8אv}<៿L i"g;Sؑ,)vpv[YBZ-rbw8~}>@W배Դ%uk>$mv.5jҹeA{簒Б1Dm,IsvFayyn U&l1E E$xX]hx(Mt`ږ'-{QU*iIMMח3z-j8d6a8ze)#5$:tS}2~ 5Z/Ͻ%rlۘZd}kQÑ&]SC+q9A' )vĖ#f,bG.yNӳo;4]!KvRRHvW7^S. 3vBZ-u8\N'mP"v/ cbɟXQmb`uq=oR<'Ը,S HÝ{>ݣ8@w1.kn'"z` N\*1:=_T4wgswK ]/aW,>[z=n!awTpKsZM Pp(:954EU8vT}]q\vD1XYl~b\Cp?t\}]d 5d!w!i#VU)zux^, 'W֟LNn?_:Vg3&3}P*$ 5.- ̀z^%0ȦTRӒ%ph d]̮Sng$YՅ3.Fؓ ̐Hg=<"ʝ+ .Ǻ𠜰d@OP"i s. +%D):wFi<=FWHzr/+d C=X3]ƽa Ca`uuZL(tT"k'S"k67#: 0YP"?\0(E[ {yĩ❕8.LK fWWXs0wQN'*Zcz:`x&7jLJ+׈pt)U DߡB),',|nй0~ޜV ÑsO0 R$\K7 5OF>2p)cv3UuFRr=N{@X+/7[ݜsȈG´!]3HHb,#܌) ΚU{pףFZ:lԕIa2Xx##ړE940mhV6J Rbe*KVFd ŻgMK#A d.Ĵ۶*;rnH3JWp%JaR[-JAra-|EhA/TbR"kOi Ň/|H(b\(rd{Aԛ E혊x`ܾlH7x:)^FLxUVl/8^^P=&@3)2 ҁM 2\aܦwNa|:.Hq.zC\iR2)Hj]YY+(O[> Fؾ]*3~Kb6}-L\=p]fB\$izr4#]Y luJe))^Bl̿"V,/-y1/\o:ꆑMWqZ`D.p5nG*R$+K^FJ >-5/7[N EFB3ֱ*;B#ċ5AG^^vG1OGԩ&%dt kZF6/)lftvHPŔѱko} H=$iR)f-/#&[*+^h_+xoi i,/erCLҕ%Aą8 _2R2 „|e1)GLҕ/OO/ 7/lbу`+E7GZ{9sādk@ EKadUbUJL_m- WN²D5Ҭ,$Xi1e-~"`= 'olcbR!6͊CHVHbSװ* c R$⾌k1_߶BԝCX|mS:;]PIlF HV V`4)QǨXe7ˁ9vckyF-Y 0+ ;pF1g B{^omp e2R( 'pI,opBDĉ\S[rԭl=~~˰{;`X abu +;6Ҭn]WZJU?WoH eR.VU`E] )@'9x/q W]0A]N}WH)'`I>hIYHJi[GY RS /'9oHRHbmSY"XX딐W̅nzpboX EJ"3GLrh-'Nz|Qs oAQ+['0$++4+Q43J-ZӕXт,웴4Ҵ,$l1MK00m-<z<]=nyz" ^)k1 HVfQjxgC3p2xIIY&;o/ Gkn|+pU0yi]›.Ҽ+KDRɕ 5z8; K)!cLc43/knQ1%#6cR2)cHI14veC R E/z3+)XB'4Ҵ,$l1e,SZr@*^+D`8(e0"|r?!C{)DxH p}p62IK[{ƅt"wѩU`Q@ 0n4?BKB…|;F;>gZΟ\!bR|#g-gxF[몈;bDv$CqT9NbЍ2aZRF ED )2ԥ![*;@Ѹþ qo%A5\BTN:Tx8Ѝ q BLO1Ez,]$N/-HFf(ucp܀E ӥ''Z5z3eq5hyա]];bBuWeJzFZ;]ƶJQ-@XlQYoƼ.pu*U3p"xNd0"%-PoO$nQ|o$ɇx s R7!i!ݞeR'1ܥ5.#)1ֽhd`)?>,1 [68yXj͸4:{AXqSH2O ͪHOI Q}GvR;DVDRNKjv+Ž<E)cpSL pOUR Lݟ6^Tq!wPoμmN49ZW5#, U!_+=Z_5Z2۩8JN/RqD U]9NTwjߓuV.%ˡ</rQ 6~s^V~?Q>3o鷿?o_z+?_G%~?oJU٘y+ }Hȭ^7!z'{ Li%@?PqKi~*In1Rif#^l<,:BRс1qJv$y\Nv*oF}y)Ӹ¼ʏd-̥h!_>~:#M! i<֒=%:BjA!Y:H4:RiKV[ґq u:ڭ넡 ;Y0:v(Hi$UANQ!pL/vhBJ%;-)mBxE-ĺՕ5l@/qC29VhF!ƒwAR4(ٌBQŤA˅H9 fFR1rv1G0Ń8?,LvÐ&s7.HiK7#Zz)WK>-v0-1;آMJ3✘Î4}н"g!.%r|tSp3Z%& =ة7>eA!g.UXXXH &,Bp?ܫ|E4hA/lIy0;?K R ;ZFkf#B6!IY߰3z ;`*G'|nrHdRُ-,gK|Woh.9ԕb/B4(A3yPf KvZR{՗|181I;x՜Scl @hARIjZLSӕ%bj*HhЄ#(3 0865 zԸL#.ڏj H֗ ƾO:ԇ"T,(I1_]فj\5ljn$Kr{QHֹVlaIMKv}+1QGӢXj2ogꉓe2ơ 42&!g},/LBT쀨>$ ;װ!afG>gZ8bU*5mIԷmGa2;K$O<ĉ`*ŕAU&i1MMWi5漨ZԠ:w1#5Yj-qa8r\ 5ġ?xD7ta8+gSMQkAR SԀi2cJdBE 4A]Zj6R*l,iIA%I05),k5KPQÙ^!F+t'YHiKE׎h%e}^nz#15~!‚T3%_|=yQya=tINZlaNK6v}hFnGO;=C\",kaNKjvDixo9E 9j"LH) g$9 Q]p3Z%_/#^膢)|!?TH*n7)FWE 0FȑӔ#>2f IMN׷ixu, 3.uXXjڒ K:z%<$^vѸSX&(QFJE綠@1/nZ ^5wA l+EJ ^RMKjUL8K5)R1EGI 9h5U*iIna\^IޣRBZh *ni톷DD|cw\e1Wm׷uܽ(r! ,| SmgtIOaGLBx8;lynb EBH@\ĩalq%eKj}jsS`vE* BqiΈGu,ј ."5Y(Ԓ ĻK ɿ3qJ)ĺ#KOGJr=Yl*IRNT۷`ωFo#) #Z08c "4tL@ax9VLeDmYQ䙀GJD,;:ɷA<=#]YZuZ6uI RkkB#w E ؛ʜMzX=Fkh'FyA$JiQ0 %]G{#-yv춄j؃BC5/5l"O jzVYIGt0,{71)aIjj(65צ,bu3NM!(]ߒ$PͬLG`)ʀ6d/Plc/-lk@^Zizn8[wge ŋ,L[a3'*YS4s4;=2kc2&qS{ 6H!Se)vhV 7tDpLN`r(d$ېs0&Dzچ~r:9ٔ2 K* HwĚ.9aȺp˜8꡴HB\vG:}fҰ;b|DJݘǙ&@0ʱ1jF7.E 3xR8CsnHs-eM%lL9nPkJe@q4hCX/1Wҕ R"UFbVaLٳLv"L!B8-#T[7dqmS&slIQ*T3PPC3OsB13?@3?P2$f~)eLsz}C1RJ_TKBܼ$!YǫA1fQbY45l Ba7RRm_z aCtHv?KR3bv8 :!]&>`qװYHiM,IΪz0aY,{"HJlIGyM;Q<Ǜ/!wR*jH鵱-Ib,@52&}!.,Ia79p̐mx3ʄu\Ɯ g mT6 ƒ%)ڸybU*t/ٞ*'jL )Ke/.IήoFԐ[97O@3!ˑC(űIۅʅb KGPpfD,i\_ ⚛t,LҋKR6f7p epï&L^͗Gb9)6%;bgeL:0a $#FZU*AMֆW3n͎8>LJ/.us"2%֌˴bQj$%7Q%57KF5 OLrJs~NraJrdgշ,Ggvå8LGnq%")F{H![lI HܴV͌Btc*X s!’%)Y;KfG,@{배tIJvig|XhOrm&Řnxt(S3N"6lIƬϒW9g]8 f jfW6C2Q#'Jp5rrg[R%)Y55K>vQS}yW@S3Ԍd=%&ʦYMplƴvYީhj6RmL$5 ]_Q*jn~9ܑ431#S#R%IXґ`G ,%';xLHn yxLˬs!R%)۸kv^^5cp3BraasԓGvȎ/@U[vߑ&9E/"нfʂ_J55RE)~5tB KjfgĆCd; m:1!u^ JjfUPRJ5ܳEsnN Y lʪoQ#uOIkzS<BZ#%eW}˘-F+S,uXXj$5tmkfG`Βތ !5ctԹlcmWaG܁njSaa}3_>|L6jgar8k*=~RWL i,InD-NG?Jˁ9?HM9Tr$%7># +aMr-Q>T,.D)6/AAͮ-=K+aD5C4:1YHw²f7gkÍ.Bl4tjz-o=鉺/TgL޾'8&q˲?0C] /d6鰒C'с:~Y?JwI[P鮋D&o|7a ;oݕ8ZЕGBv/ %I^?;&vHeB m\0ÆO(*W}ow*Gȓ]0h̨pE|3=,aǺ<~SYG.`e;X(BRG,Wd^` @,]Jpdȕet!yIBR%R׭E՗!Cq Gϯ#LH@!{2T3ey#k:lQI)CZ8{$= !l[P77(O3O*ƈ^h!Ys!yb&hcRӥ\IѠ*hfiY qnn -h!f8tkJvJFάOnSN+!$#T֡40RoWģ;s#`:>.fL9=cX?5MY](9lAaTx}1U_!ZϠC".aWKN$sK퓔e'r4x#% xeէ{q+0fL2V|*<ˑEcCu凑j;V0*칂qU3/#m+;F p;cII$,x,PVo4+KxB2&c xxDȢTh$6~$GfDz8^R>x Q،cTL*E $qfnHaBpz[Uik*pz饞R,KV=Ws(2O-\k &9 {\ODRߝ-a0)zYg:PM|],`xwוz?E'p9XRX A D{)dWY tEZ85*HTa$5 Cba(=WK\Ҏ:΍ɷvU/hF'+ "  c(FNĪΈTK'ޖ4H[CtEe[VuFb4mƶHsHA)՘Fx )6k8ꚛ1uSh$sPDu_b)V&3Fōz!zßJ.&B2 5L)gfjsT1Ʀxq) 3i@ n7lA ȑ`?ňxӈg9c45z$1$[kf6Rm,9Ï̪2[֊ǜ/d=qrff5 %3:#fIkX_UQi%(Ypj])+A#Y{'FM%Lk0w'\(Y57K-cRim FA(;pIIbj`!_oJ2Vʡ.=l׀R"fcV~ b@:!["Fv1.}![.|= b feģIot\ h";Oh~Î3nʓ<\s /AI̪ΈYj, vu&FP6g](FmY 7wYF/pr0^Fo@)0Hi1'VxRPp+nZ ;zVFEDWjPBهKP%X1, ̅r \f}yqX&5bܗ^|UuKIbV]Bdk["CJ&R8"fRVr Jb~RE3sgр"UGb>'א;G (db 2"bN&KM)718&f3 ӂU4{1rK;0#<&CFJy4mAͪj 项!? \l5Xd9)wy{7xHkÛҵY|,*\")Uj.Iq}TZ2BVBe4蔷ROKRվ4-6G ߋaY[laКFT :-80„y77#7↠C="?Nnq YjwbKjniYf֬nnXkMaǦ˷Fgb57%h5܀n@8ͷFnRV?oۍsìF78V(xquk/AMזQk|IYr!@M#3TPt8!ҵmfafϻ(8[NF&gޘەՆL=pEO.`u4$nFĤ'6 !l8$PεS1En6M *nQ\W) qѠԛX,3QjFR6CҢZpW ]Lp89PjT(KIMUw0N RcjMs־1qvȶwA)UԌ$[ԔZn_OĪ*XYVVZMKjj\ݴ39W+a7zGlrw_2Q%e>K YMKjnfkQ,+">Ȑ3ZӖTL}p:Y+axm:XGØJp%; ivk[R%"vZ>OPt(-=:,,5mIN785,;dgɹ7lGYmbˋ:9h6X?mM5( qm)a; !'Tt2SԀN9|57.c6Q#J5 1;+ ncBHۈ&b]iIMMחi5ljQspaJM[RM̎J뗰հ\cfJ:7RݖT쀨i5^g6_; ;KM[RC#,PGvE8&;\WcB8>ff%5;]_"bZp~a氨RW2oq{Z%;-ى}ޫvvxܽ~yHz5TԌ$+ D.5IlREs##L)2FpRV*=/SÛar57\TBV㵀3.nNfSiIƩ/}z&d va1s⤤nMw`G~Ŏ&>X3'-Rr#D g |G5//RlcHJ^eJ^|L g>p& i '"Dbfj;03!AH1>BVܒ.bA7jOӒ]SJ%/͋:}Jǹz Kj^ZP7*+Zd0vW! \<ŽpWB]Ure$%/Y]B[!F c0:Aƒ-bܖFKJiAMLVh(q80ܢ`wLfpN.0pVǔ56̴bƗU.Z%3>n1KlLf7vr$'f^x1M<0Ȳ%3-ꆙ*\k3]y мԴ]Ui_堅Sc-j|Q=Q$2LbFRo mhc?ƬhQDEKq_Ʋ9RjMUE$Gp~B; i`- L"մ%k;`VC ;Qi-Pv}41-(x@Osځm1}!hê@"/VlaK ve5S@07nz$p|xe!e/Sy A3VmT"n0T8G^^8`K,e c/ ^B]GNӂѫNg pbg=Tax\r =xԙS,x$ᭂ]Kefkxo°eyO捣 F}1N\gqLo5GBXdPBrL Nwb ܹ C_k`@))5ubBnR~`N?'Ka'<g|V|!#H)Ѝrج4d6߆+!R ԍPa0Uw6 %Ɉ%:Fl'xaGfI{nRS=u- $@hM /e`̴Bns,/HBʗ؞ Ex6CX8r.F BUEg0 Ejyj $ۘ'Fb~$*zHW T+n~bH*MTz$٤ q Ԑ%3F19YI)^#N"YJeAJ Nu`YNۋ\_XVIzp5a`mbl;T EAΤblcX"'0)VTAT_\aM\$( $2F67Qzz$ "j.dGʄC.9j3Fdg)G -&v4rT Ƽ0_̣*( [&,97qa:2ڣKdMTD 6˧ 8"Q?K4 %wDh Z,h:A(*'(iuE⩨%4d&ex*2Ĭ'|ǡ{y}XXLʔя04s#^)pJxvF2l`=~&ZʲNRPq ##_ QlS<"Z蔘̏%J‡B|0MHXkeG@ ${ph,L?G*FRʽ$f?w7ra~̟4%%ax$E🤃00S{rt*G^V[2j5Meqw)C+<.E1fJq9WƑrMesqc+}J hnquM J4Fs ž.e=~#%-WbbZǂLv( $k)ʴlIo#_4G05l|԰ndXP3. A\ze)QH 퀆F9&%E45]Y"5uvA8~qB-02`/fFm,iIU_" L3̬LiFn vĖTx`\3rC,2C7(hɚh3 pT=RR-vZIss![; iv+IƎ<{nx_͵`Lv8HN8tp0SԀ+(5Ԁzv>]am8XVQ3ZϖT3aIA(_7IS'h"f|ScWRLSӕ%"jZE КB?$~!MM`n`vaKjjipX /Ǫf9a#]0~cYJ An3aH*v@TߴZ^qZ;vmYHXi_IN׷ '+v⍹Vq0c*C;,v촤fKvFaG?9ivqbgbg$; agtjcxD,„mqaX3.q-٘Rzs2qcY57-ɂ  "l,9rT]NM{NTo}u*?"l9`5Z 7sDu2I7 %E ɟB:}ltq/!<܏&\M*]01K-R_>IG|{ԁJh6G?k,R@ݴJ&阾p<wJa0W3X5wj9?.S>Eߡ=J\qI nN!YPyOd)*f(iA) I2#*賷2P5HS&ԈVBI4•BLG n#!K"k,I 2ZlqCt~iL9 ;JBR-7^ ҁ2FRiKR<!ڊFQQR/t7Jϩ1ohD ;;Ra[RmvJaǡS{v .қt%٥OKIWr"KrpZP9S\s HB 4~!$D)h񞙵 $KcAϒN{70}TgAM ͍ʂ:$ߔ 49fKRll14wtK!咽ԦR%E]7@%2Gr. iO?躅Ɋ5w/22 UhQ?wNUهBFQi:G08&駘@.eMM (g&q~xUDf< ̉PZ]{{Vs)|X ￳`LzFJ`Sw?Ru[b(IeddS!(gh>Ғx$J,iaט畇U9y5N! j/%G^@K.$#&^ ǸSz e[Y]*5mIA|9PH[0(:1i@RKjvkmq7Jf'0촤f'pgHVc;lض쀱3]$Wlmg#Yb,IVߣװWERDz19 h LPboW$5R.AԠ15B Cs԰H+J%5-)mIY_ jZEp5ltQ#k!’T3I;j&lq oa;aLjE;>m4Ƃ^%_bGgk郎B;l#-a +kD:Jj,iINחmΩPLpo 2SMVeOB"yFJ%;-EW2&pŬy$+[ԴRt!cSˡšpL0D}H:B$S jxXTfQg"6촤lw7|a8װc71=!'bY.!b2G<țϺƢZ-v 6&vxcS\9jJ%;-;bلmvK9I4;Yd%uki'nO: s#S\a 9 q&瀤bY1$ePݴo|jnq@naƱE!P,/UXYDb N~8j0e.ZX*ߒQYUFg/sr/ijnJ+7zNM5c6lI|Rl fZP7ZU'6y9;' "K%7-pSL(,W*"00B$$iۥtm ZX(),'TBRBw&jTLmf9W,阴,z.=<ܥg k[Gt}+1q+.ˊ9YHTu[.l5 LᘷhA=[ 9tg|&b鵱~$E ^V Ӎ0?IĢZU*I ȁF%fK?nJ34*L45]Y"F1BaFWj;Ix9ܓ@RIMKjjDpF^\OuRd)땚b';rZ+v+Lp8>\Hk5K[R!{z-vtITG#Ԝ3蔾aaiKjvm;<paX{!ڑ !NclcH*v@agv^Fv@H)N)L;#c-R #O,aښ 0qޞ.U ?9yF GG<^!Rb~.C4BbrB_ּOFMj:ʐ]@bX`w4e/S*•tWr"GSe;#KÏgOp^>#d+,cR|)3@jJmƔmXAˁcX\;-b\av*} uj~gavd>B QeND߱TT1=!9ʋrk*A'шvs[mD%nT[;!lYaAϫy׃7m-S.O-D82BK\4Uah3Yf&Lw/::$ļkS@>Hb}*[N &· Ԇ,Tb8bZ£n⸖y{ŔX! ^iCʗ44Rf++VJ -`,bjUUL$F"?eZL2%4<^x/jlL/سZ ^Ъּ4/]YBeT`6Wuz2vFK2KhUy[ xaX* nSbK\`") RnתlxϊQ^_!Q+ 8e,SӁ{)lF N~n )D+АyKRHbEJ+HVNE U)[xM ]YfhRiG$c^#R8gRd`$I^k)R)S'X@EJ+Hdޤ`5:"E^8dِ"&pxT,innEUR)1un|ܐ9 d5б$aůQeb'}3g&BXשQ HZiZZL++^RݏԂrs,i2=U$4+w5(4IaV Lk q\Gx?g  X"9L)V@TY-KaE9-8ee#Sim-ri "`*3N$)5"IK#e,|b,QbEȩJ8j+0б4+?oR(ArMJqIbg"$SXL)5+zIRX&#XQ*bjQ~--HK#m, ZB̘ƪ, ^pD9/ty z1>RFE~Qa-zzHi"1n6pו-^Z70ƅ-h)ASrd^P OTOk4YF-ehplq7k:M^x((eedWeVj񂃬ה3P6qNѤl/%9"購>i~* yb $)]$HӤDeX(5R 0d;MRRF+lvM뺯e Ȁ%2p!k8H3"MJ^197"3㫮aLU򋌼H )NBgߪ{%ҹ#ݭT[19-Sǘ 0~a:g"/w, ⁈|_3sm.!0 }aҁw R-4̎"kרٜJ*6jt s"KRU*ۙ5*󠎸 O `PD17[sN>dN9#Nq>9^Ẓ}Ә)$=#߱^WJ$"φ$_#~(>g0TE'%E%Hh`/ˣ?"Dn+8Y[FYI}etne`A/~JWzd)r YKJՄn2[c {b #'m*8Xy:3kJ3ۈG$@Hų{p)6 ToG+3o8ټ($/T1%KNhَaHԉZ%u3ICh8~eG,Jc[YRG@xHR9M+'t %C0X԰(Һ@#5Tv{<`#j/ c绐%͵9eY#sob8GI#??7~vt#IYzF/GcgNSWP6BbZ,G[ uIC|ZJFb%c>T˔h28F3UICHPUV,W.Qew tX<&h+^y9i뙈9P&,}aID3?% KgIuتj7`$M* d(&V+l* ɉ]6FnMeP7:_ _ppn.'_mWYMԟ,u$L7`w)ejtd1/d0tH*˙0<{Lw'&Br8JHI7pyҙ% d+6&gH"D7 67Ũ3M>ۈ*57CRs󊅢ƽ 3YY6&iZYNd)6fJ"KIOnٓXz8vCKgVk<Ҍ?w2)-v^YiCږf4:T鐔F+ŎWj|Ls!aZFԌY:W:.ٯ!dg [ II#k9/#Er 9oV3I 1e81_IE NytD\9!3e(.^i.XHJEv~"zlxg,.ۚ[Ԡ%4"&\2mJzC =4,^QÔ+j>Z{$Z! 8 R.)[/1ڵgAXWIዜξv"$U30bDp3?kb4;+0vsNܘQ=BTmqHJ ?!n{]G'zDv5ystTYY`5R~ij*3pRx/Ww HzIe83 E W@"-(晗!V5`[?',Ipѫ)姘* , 65LݓZVC*&Fij),j55CRSSEҡR#TjVᾴ, zKW^kon4T INwJ ;S{j&_1t[@kM.kb8x#+v1 {tBvܐ|KS蝹wٚ _zmvWgüx'v [CRS;8> 51eo;dJ#lĊ)Y 8N7`,tW{!Fem0Y(nב +v.{KQ.g"[9# r3swB鬚@N%7ucIjnF~Asn+ōy xb RA,&&7ܩ:;*0fPMb9uM@ 3U͐$ate!pcfLƼDȍ{<Q&9YTTe-v^0Q@^ cS:f~ [u-A),dW0_ {m[ﺵNd+6R57CRq'b/10eA>&hQS59CRX!BP1t0&{e9J)șVv&7[@VTUSRq2YCnbeposRW<0~[Lp.uu޷ѻO }'N3UK$ܿ7% _msp@}ewwC[]8I5*U]Vq<="dA";ICJ ˆ8(ZJ_韮lCR,.*[G㒽IX;8! ʛkJUi0*}xR2Sb^c[@y?*K:Z~%Kw(IU&h6LR1L=&dOh`D, {$ MẎYქ B!ƑN.1ÃTt2oy-*y\ WL֟;AVXERõ'=_Zęr55.z^O2&}åXt^;6 5L&`u 3mB@*GiUȉpHLjwzXK]2KI+eXrb  #\֝Jo\;@6kއ}&i*T9!_2пQ$~T%kj  uMK-? Kq!cvDݼdRl3 djT J 6+ l)􁬚d*)w]4tyexL!߼𫪃lN֛eRNdY+3PƏe+8L}زFVRM=bedP-$R VcCb@o,)JRjbE"_rM1`= /7g4^Đf#в6V8%@̅HSnbAGwۂ$, 9$FR#U3uFnA$f(% R#].! j-} rU8$1#C wbQ\;وh,&Vђ@VfR0kr=P*#η!54K IEgܧaL(v>i* {bTٹB1W#`0TPReC*f)׬xнp"RabʐTҎx&l{Z8 )WzYnTS,`4feHdgUbMa [@T;UސT%yE@l}k΍wp$<+gI +u[uX>51#"RbP )!0RvM]7SSh0#;g56&F|,;yzT,&V>13ET**[!K!lFtH 1"'Ak*jʫc>BLsJԍ~ȋ2r+ksBR"ٜ `S%fӞ$'{ լ nH!U fDILV߭74Sũ 3=cߗg]jLFvU_49ζMC1N,#R43f:0D06u\!Xpo 8d#q˖64Ф%šc `~7pʺH.A88BH*|q* yx r}"XzuƨdO$UY\"r91|R,zZ4dēҒU8Ic˪=dx1pT|u#ADd%~Yw2QƯ.u]@qh-Ƹ܎XB%#UBԵT 73h Ғv8*G jLp/tUˋ/CT_5We.mE:#IT 埬 n.…`' Rp#MSmjTvՅk2._nmPْ67&}pQ@ cw@1n;i=?,)! ģ*]:KMԖSx բPe^ vWA9&8<+=*1GA+Lߌ@by菶`YU_нv?uhdUSg.I/N1v[Lj?@Ec$cI'Yre([O BYI` oMZJPJhRve|C= РdC&L~kN*Uٞ% IXamB꿼w%ٮ >(|E'56^ZwEА#&˅% By_$qVc';kmKK;c͝GAۯ0bLoo%?|wi@$nc+Po7QnX^}hzi>ÉjWDx́gʇGG h@,rr%C]v:z1eOUDKMDwY]ܭFR}#TM-Uć`6,ŶĞb Z'gE$jm:#?,FO^Iƥ]0KFMZ W1hkdzWfXEv; K,Oj,bQ6Z! 8 "C/<+6CtZdWfgwqh$̅q 0hV5B,&y*#o3 3Y;:T$t!ϗ\d 0n&ԌnE!mEtٚ #k3+s 咞0"= l֚Ie;yA*{}o1n v1Dfh7 Xz4ES5?hM j' DsS55CRS3;͊xjt5ԌW/5l+RyrVĚ!;0isPBx܉ XT;lcv[Sg) ,އ;&;YML9fgLvdNVz8_ d0Su=I) ,w;U*")L|oq:^aҤ""1m~yBbSzhBW{<XS3$55#M+:> 1]44[J5 s:?1UF3tc\/T\4X3%;_$mv^fԄ7N^Tt~|b06!;̣||"aքZ^Ryn1MMevL3ԸJ!95"M@ k=$+ 1y%j5L|MTT6+gy`z90Z#`1#.hUՔ,&Vc-S`bd3ۼpw̿5kM2B-腰WbpXP+Y!Ͳ᪆lFV}j绝v6xBC+lZ@ԡeTM̐Tļ⠈a ͂cacxcA7@|!&I6J)ٹTȲnxz9PRbvqKŠ`8F 07dpGG> ն+,&֬]6QFnT0+-jf$D9ѫ[CLleլ$ ѹLa]Xa % tv\~ q[’YR^%6+܂F {vm7l tH*b*] sN\x8Z9fY?Mnٕ3,RTĀ)0h*U@Ylɴ |uXk:$][ :8}8:da&EJX Q *.)GV\F}ڶͅTA9 k [5+CR o8:*!Z&H*>63J*VqUBFȬ1&+N n Dک!X Ņ<p!ڙ Ӡެ8 ]ّd#K51CP3r+bn(%5NBsj-} n8$U1LQY_#uNHoY\$Ұ^6b.H+uT9&TKP's I d2Kf&f`]CRS.B1B [Jb H[ΧK!r2h~Լ0JMkCKRO3.و*CdŸ.zT~4DI&A^ة}SU{6Xr4+NL^AeT 9W:n]hȮUR2۴& !UbmF@kQF m-Y:MZѐS̼-SPMKYT(I*K1pmDAloHZ8 :,AVdQϭZ!"i3px?*hnN<5(,Z5-[Ndd%`0Ŕ)T4\VY!j\Ϟ}0UdaS~HJX$c贩*b2;MiUBߋ:nx(FFeQ!-943@/f}ԢyԈtq- +~C(iHƧڶ×qVi_0,/NŸe#O`fQ=)!@ЊCEcCn,""Q5fmbsTwލ>%)яfzP44b\19(Eed m D1\ eHCh-8ZY7 HjѫGcLIIvѪTt`jr*CFJFNU1ػQg bw1 9i^(`RPnW٦$Q '(!ȊgA) rZ rUL z %\-'VN-I#RF`H$s,&)`U@T#mV-bc*J6OYeg0z-w]'Al)#Z0@:  ¡c dBVk"!i':!p*;7 1e<CqN&Ue,c?]pU #WG|YtDNeRqeyF^y42*H2ͺagEAֺqS*A _HٺQ H92KQH#1Ҽ蒐4yՋ $k;)4MN`бIEۼx`~dty xa_NxHxT|(NȕBr@k]ۄp0?sók|HBFE0Yao巛w?7"ۿn7MTFz<9zap+IkB/G'n7Ctzc0>E1[Up5ƖwY&4~9TX%ܪ. .UfdLL }yN7fΧ͗zwˉ|iB?fc.5S;uH[h |">h76{2_Y-UaP`X{æm'  I Qoe[H'q~wۇwDz}/2U jq8`9掘(xzwiL0^ȷX|qc#_&RJ6o*`tV*wr``Y0ҁMU'Q6nc4UR IPPQA/~#`zCgM7F,9XtZ,Gec\On@ctFp@7Cyn85&yyMi%bn8Dz6FW},}pҎi^=joӯaգ?lm}Ḍ],-L]U̪-~kA KF0))|uUL[WWY4cHO;;kҙTK҃B>f)L?6õ3ewL1:t߿9`戙hcU\?k̅-K\Zzjwal[TXyc>1<__"Ћ1L^#} :ڔ_pKߝtUr;%_Ro.*v,(u-YU*N:^tGy_3v_t9"^^QJɣ@^* Zݫב:UKj^4taI֓G̃M93cŗvLǵY(&q5c=@۞veZ֜ydshPڥiH+pz>],`t板oQd"`Kd,Ӽ/flg_0ej\_qk{Y9bE`G}"FZv죿17(D Kw~c^w``ݷ7 *e4V *5@cS/Vwm=Իͻ_}iՄTPU_8&UɣeI_i%<7 8&k3 (l,btrs>43[jLm"U.^#7xw`7yq͵?͟qta+Č{lqvc se]^ ;q,¸ȭ^J иG%lls뉥2 %BOٸK Bզ[Ή;Αvm3o窱C鸞4-np޷/ Iewod dL+p t f t{XU!rUt:X9ٛ*|0TDTj.$ ﹗*F`Q2eε:8F4V3c~Gu]CZ>6Ja3 l1a6KchI:ckB-c Ns&]s.=+lm\͓{*񅳛2gCJwj"0&"MX?p3Wxxl)f| ckeUM#:`NU2,ݾtƽұd>bl 10>}[Ye ٸ() 8+s7ŒhZ8' 5F9Um=*>Xml hʥA%Q?8bDS[@'Gj㵔0A `*7O۹"4S Lya$Dv J8`WH,QaFA[/Aae2 ߨލqm40cuuAg'?w̑b`t6e]HFL3F׌8l Vn\˥׵6%Vpƌga[Ĩu=@_np:A10c\F֭wI.G zOGnȱ>&+ɤlfAViDui nBL;&; 3*sLZ06"'fcqC7S,ޑt1 9NgS 7Lg8` FFqI >[phyd^ce@p8bD%mȕ&XN(qpN:ґŇx ce,k`"Dgfӱ`н%s2*HüGJхy0Ʌ Kp09 3D^NٜJx'x)4\'3S3btnq/JlՑ(.5fU"*Gu&XL#3IRaV1!I#6e0%eե XfutX>b_Elr` 0HQu-CUa jB[eԗN ~Cg9ls859ViRje+*2*Vf]`TaӖa'&)ǰL3Ѵ"ZZ'|dr-݉kw yM,]hmeΞ*QvJ7ANoFw:Hv *q[F齶YP6!+t_.%j5~PiI̷842f_LtF=!>tb1bŷl,kg^NSqSq0Z=S##&R$]%{U{w |,A%u1 $9Nv A1 '%-, mt [#2Bh녰wFl m!֩| <%H(e?3JQAlV"( }2C=-)mZR{kKuHT8+Dvʯxɧ/2O#\B"vJ#rK+XqFFhAYQWNc]1:U^Kx_Zqhb#tO QkWr~AHaEeH(0[_RMrC8R]:H |+[@\T5 Mw?hSJJ >E4՝QJ|"n,9%w-cE&yX @QyN?[2>ڕkb5fd;x1"ĴʷT* F2ðQ]\0T2"?؍Y2\x]"A<  Q?7j9X3%/II\b>˹ O'~΍\`iϟYZk{.-?9^\{tuLgn|\gTfOȴLPZwo bcU|_P߹|mj W >4(p&sfݚ6 ~TM?n- m6+h)rͧ5/7lqlzTDNgiN'+OlSOt}DYnٸf2-?YT~*Rڿ*% +5OEua6}}4+#?!Ram&퀥+av\1UrwvtηFT;/t3m_\-<3FU먨'wN1[ jj̧ \#r GTEX!0ˮD,`THn,VY|Ҩ͖hXǏKpYx Xo`.wĹ+P+so׳~bC=0h&5 \q'S /)e&ۖ[ 1< Q5>x[MU UY+{P!1 莏 S5i[*s]ɒ4$ZB{K,A{ c[i~8GZ5l[]T!G qH*vR/+Z&Tt>r Y&гqZ/U:0*cw[eĮӘZ[+OILST[MkJ_Q5vB0[vbIJǖ3%cbF|c5dmDQU>"]Ǫ! W:箵Q:"a`h~<6Ue^?)3_JOޓhR]@^NU͌ʯ~ c&k袿ɜ4i`ex.@ ѷ\(]NmxFz\yyBq1=6KM8.6p-,y*%-8ҨϺ0@'#52Zw2lE'/҂i(W׷qcLn0m})8X[u3mfe`R+gq8ϱ% VGFTlCc8p\0{zhn~q I" "valu93e `'ȳBlG1ȞfuyStY7stƧia6Him:m AH_!ӄ5,8B\n@:qdo#GrvYP0 qF}0:ݶa# cq^$0!D .R]AL/lR-wEȁ~jֵ"Y6=8q:SڒMۑlqÁt4MNՠ ҂=+smt#v^4boN+͑\0eUpQDͷp}hm\DKQu1 l޼-ZԻTaϭ%XF7߸ `m 7?e(ϕ߬YK?)R>V pLϵkT?g,cr. l@]7Ai[Fx4l(.ӯsù&6 +W{0܎o.yFGI;Yx`kcE endstream endobj 98 0 obj << /Length 100 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 101 0 obj << /Length 102 0 R /Length1 35792 /Filter /FlateDecode >> stream xԽy|T7~ιw$e&3wld&$dB 7$a H-#ap+I@FuAoUZeVmU[ mu-ϝ>{ W_JdDYy^;Wn NBt]sU칁5W^:WOryKʕYukQ+ګ6\+HG\r]ByU˯x?-ז_ui'[a,#҉[_y@ rѦ~PJFF$ 0? ʼ]ö_d3W B—y#50vDV jހt6X"g6瘤!@tPljv 'H!|@!DB\B/YMvTjeiRMKJ߳gI1 ذ˧nxڴL]}.XQ+~'#%TVj 6JI'F}Ѣ/ ?Cdz{5c9 Ap`>4">pH O Ć8@kns!N C؎ b A<.'a{pq"&ܭO -@; } e(??4Q .HGP}&ҝ@Pj]FH"݃=X{P"pp:Hīr)vmp(Ѧ}noN,&,&&&" ܐS!܀>7 sV%)cb AF>x(@nFCD|=>A&ea12 B/QXk}׳Y\T9qR̀ }ZPjܤQ:lˋ-ζ#JH3nGCٲ2Rl$D,̩ZO5.WC,Y<,SB>?pczV",Z&-(45m6bxyt48ˆpcsp7@26( 7|,~>=lvtG1"Q>t 'I#!}bFq!a=1ҡ޿R+և˯["j.ߊ+l^>Xl5$xߕ$HLq&|%3r7 Z Fhp I1 4B:#$ IDDAHLMԦBj܈hN<8چ owq/p;yh88Z>GK#"gЗу=kߋ"hVh>Y|0p0U"4wO ihV2lӨVEGPx2(eìJnnnBd]B' u~]ޡVYoZgzW\\תRdQK Jsp''hNLLe}ν~ m#4˫ne-[[ѕ}|>apIF!M&T{zz"Q+{Z_<_dfkߙy+S3®̌ŝX[z]u]绑0E7m n$LOZN/Ye`?'$>+!0ۗf&Ԧ>f&X +GչwR &ͻh͇hRCQ(e?-\:]H[OR̶k=woyzV\f~5**]ߚWֽdeۂν+K[+"[=+z]-z{W;o~II]M{dZW 6|񅺦ީ*rLy;,-S+cLX8T4W4&`'o60}zIB=2ĉ֯_#p5oDHߞ~Lc-vQkWOZ:7ٺ͍w4i\}u/ eu=a-oҸ#װp5n Fj fzGȽ.~u9LVBڥ+HBa>܄nBh\؅'"z_~չt\vA.ml}lMao 14BP>c濮d}b x>Ƒ|7сQV]^'~`)!HI_o;pď7k0Ю|dpٳ+Hdq!7%hy? QCf7b%ҟb5#0O'n!wŤ|@Ckn' -d&+J(q;(=B>^2?;Nї7J%+SdML+dr#7\ypqꦣc?K/œInÈ(Z4;LrYɻ4V J8;- j"gq8dYF a5&' h-} ;[;\G0'qU ad!ڶ]x>r.:J($ǛYg,)#C4M b@ܠ3\EM_`úFEp}m.>cCv'%dHN]}BF0z)Ns*{ֶL|<{vizSЋGG]e!ʏSbFm\\,&kj߅>M^%S'-۸s6z~'"ljn?> lON3XRPJ/1!_ jfa%&#D/,-/ٛZTNRdg5 W?Hɷ/wwGKuk>;@hc o Pw U:=_,ձ&¦5\mVB(LAJbVSkf)Ou%=9V65q2^0t9({-##݂Q>܅@A/uj4cך \z!%t-t~Dow{m.=9zׯ1'1;3c,Ҙi 汋pap~;ݣP{Vu@\A.b>=оIkk1Gl bZ@RKjzJ{tPL"0KXGhXj`ʹdn{vYt#Z"IchDxCX4Mt MͣQ "Y9M?gmSLiΐ˰\ne[!>P#te4 ;F$#^t2St3c2B'rDѷ#cEI;)PxA{Ts\GaŠim&C?=ؚw4g "؃OIp\Vo#I!;@WdzIPc ~baex@o!_20kv wUo4"QP[r xXe{L,ǨeP>Du+)ed<x!/{9fxxeI MmdYpgݘ&ud-hm3{G1!>?U< ){{װ lP_n3QR3~ۛ.C#f^ ٥Ӏ f`w%1R ^A2mi Iud<^VZR\F!9( +?alVd4uZ(@.oL3E=(2sf/Gb*z22OF-GWz*Tr==$7Ɗr-"gFNhtəj~RC! yֶ#eo\;ZQN-Kdф ;һR5m {[0LA-V"{RQWu61[KkSsjwkR>,( ytF0z]ZOWc뢸+ qY3(5^iF"g9WkOhcg7r(9h0 㙲2 (8U-VoaH$#H:˻XPo@!3pag,a$e2zŹ k9{Op<gF_tMr嵭mP\{H;t0mgf|k uCDnĂgXF]eM]31fZ:xQߋ{/tĘVU#:=X33wC i${ߥ&_61LC|bV9f&N}AWڦ N{dVDd)2xH:{@r?=͗~{67BopBo_m :e-=ӺzUW#;-צ3dB%_CS$B9|&&Ac"i0l#3y*2]Zד9;,d "t lDjG:E&vmoÂB[>C0-1ڈޅTQՈAMh;V jHLjj)Jlj^ӼziNl?n,^HpB'a20(J15ťȗA)GӏK_Bm wyZ(dGvM 'SU?]55yM?2l{Q:s]=O?X\GI+*'ګggkRj0Ƕvu^Fg/f/ 8^/gPk5/0AK^A/!yXƹc y,dQHYEC@-nE#4(O٭vf|`'@W'hxR@KKO56JxɦU]i7uZLrj̙0v}V~ fo_N:ٯ~:~߫o|!cX!DK2L1<#;(' hw^r8%sԦ+Yn~ܐͪwoӯ>W|_M ?aRźܯ{+(щM $6؜ASp2ؖ٘6;} s‘v;]aHQQ$FEj3_5}sW5M[}|wyx{GŐoh~ٚ6ܙ=AAb7'$(֠4.3=f|u|]q>dL}G}$ո2i5k+dzs#a!3ksfN`Gpq$f`f&Ot8VbM6ۆl;m>̢`/VqtƦF;_4YY@_2i`+~3tI.7yڸElz RBJF UMv/;{V(y|xO{*]qT3~&F{Wz5ks`TTm t!b6 Ţќn6ZZZ_zRoiԑm6l\WLPp"b8Q1?+{=N˘yb U`?Lsa(F%EwFS,=~sJKy,[s7Hݝ}؟'Z2(2Dm8 ECĬEEFyM+h\T  \j0~݈vy|T uqHՆ&Ȕ窩VGC {o~|ÛzdD[`+[} yގ7Pd_3J5.UE@ڭV;D_KYl&<}(}_ҿ (7},|Ha 7X>L;>5$K?lvbbg|]duFŬl z?e ]V>’h`}Xea=eOW -)NJ\RqFiq2Pm|lo{tJ3"mzQ׈{u;.iQ7n9DLL?.O^1pf*}?BIwt)}y.ywy 5X*_F-,:GbzII.!K[m5SN;ņ}5u hO?:ݩ%THU+DTk5]vb:1JcjIpj}WULVVEgN]"RB$0аA_, +J Q˄;0CwktrѰz4=]Orv}z_o`Ct}u%7ko^3F'D]z[gDAyIm<¥5Be*-q]CP-P&x29ŋZ9H֗WjSdqQybO"G/X6/-,7CEl m[hyh hadO IŻywP|lӅtw9Ԟ8qR d.7'RO |^j1)*ЄFE5BVžT֐Xa{`xn>Oiڈn uD Tlp^sq "g4pNcc , ְOƮ-Ku/^ձ^>]|˥"•<羾1N͹_ufkݵ@L56(e4C A,!$ K Dj*mQx#6EEz{0ɭ#r1IGn|&-mx߸6z{ M?{{×_`\1^oP? %9EBTPL>Sҽү%Fic遼^/|K{€s-X^PXYBw,Z-[PqI8F;q1+qqjSrFvFGHȭb[Fn(f بU+~{qq TsuS@tzSlE\D}yE疟K",!N@+EQc@ D)?|WfiO-YZ/\Y. ^|kNIrX X8y J䑼LSzzzה yOkHl4m1 ʂ޺DpiN}A;IпO~]iz%債$l`I_@]׀k lw8`|6;! p`NWoK1;(X@O)Eo/U :o$]uN$FLQJ$}XКAm!d*%.n "IN&bm5Ŭqq@qJ G#P73SڐuڵR`QIG }q|lK}h9|x/(_|t|l >򽿾<>zoQ޶)TT]5|js?ls\{FGE#R#ٳgS*-J塃ǫhXݻ"쇰+`jpA9!P 3 i F+J*8jDX\<~|*)}3v8: 1oƣ~Y3 P- }P$U"AߔP+F}SL1ya0poxghxXaR 1:Cgmpm|ztzs)B9,$Edc.W┋{*΁ K ~ 6Zr[ubmi)1V},. h(%'+|%ux[b1G 9 I߮ߡߣ׼?=#ُ|pz/G=tվp)D9za友>T3 daO&s,&Ra*X d %˽(qkWo{N~ iIrW W}%*C Ax65OzɄr z0%%RDeXC;ChhxHzTՔGX$ls "'a@;+Vs(7s n™chw~Ǣ/!tJsxiH'=NRuQ;D9~ U;rmf*L;u$KP\?'@b1|#16\q}&^}v`Y,KJ cg~#ųl;'Ulcp1,-a긥ȫ¬StW+O+z=7 -[=WBE67ۣ7?E`OFTTN |is@jlH^0Π XFXA8ݎ(<N2Jw鸌Ip C0m߳SU4h zj̙(ՒОaRU RzUӫW>r˩V:U|v!IAH&A皾{o4{ܼG” d/j ֳŊqo9x6fGb"Nx5yt3Fth]}]yy,i56L,m`o7Uiefۖ5RcIYj k S\,-)e*kd Lδ,[`ZdY,-*]m.|5Z_k.N]\{qݒIVd*3J#&ariџ5ăɧ%?,{->p!}7a OKCU~_Ạ/8\QIy/f5n.E5F8EI)"ULd@A#dgkc?f`\@\>QI_keRTf*o J2Y9Z)V@4n`Ge>aMX:5TŒ_VN;y9ZuSg  5kB4.\CLxTVCmҲ>0U:gSaie2.vw@?WAZM[ZL5\.H%G.ø gz8(X̋ESҜ-9xm/LNT-Py N]/hj=S.ú!ې!PHss{xq YZ]LY/5^brjPI_ȡXNfY51mD_,qiHH%C=֚C?dU\: ϪQ>h-꫐ɺsJ>PYt|ieNzcZFrmF@Nk8?']ku%>L:g3<g/E/q@tnghrЍԣi#Js!s`86őÃRZKs0/m,쵩" AKP!j9R-bPj5ߟ-/ŒwTVvI}%>*P mfN7;#*՗@o(5QI|SYr6Ac >]eLo2q1bƷָxKȜVQר}k:5UTr.p <2+<Ԭ؎&H-%;fGtJPBIq!hGԪ+[G@[\g0:ꐃ遦 #D6Jj iI4hhikh$<gfնOji5eiƛM\,شkH"<`LуĔƴFZaf  Fhn`RSzggGHx6 8٨42LVbF]4UVЊͩ,v@yj!4cN@$)!PŧǠik:4'r?,)NofNG4yրS0֚2#i82Yz}J)/5A_ʸљǾluQ{yyKU5[W թECi[_irX_ݴ[ޓ |==! v_0o= a 5f1rȜU oj92qO{>~|' Pjz?ؠ)9k@Z QGx{MNAF =C/ο0 -_UfsQ `Gyq~yTD}5E-:jaxE|Rح}~9/qs0# j4G3٣4艚͒k28HْDvrԢk^n>SG1Ψ#oӪ%^Y0d! OٯG)(d5pb`>{+n͈ܥB-nk dWOU&`N;~m;v-U\^#jkK44=@􎕌'/e~ˇ204#D?֋`_1<@ P/0,j` g y (U8z%IPsR"E"|ܖ[ · @h6j@hU||1LwR< "=FO!I{"׏u?~?X>M=Z6۱ر-M2}2Bި'=#! rNTsS!Khu1(2?v :LhgH}'(f_p}pw!q_pBlN I@ h$) rqt#x(}CrP ChsBc0;M[_U>9`7E"SWM+.{Z-J97W<ęk1 ߂ok[X /zN&ȅ.`Li'YOjoKQ5{"]5JA']Rb²O 198(W+G0^F929uw$Vo!U { YaЄǘ\* sC#RPm6ČS3YNT}K9mRjG9qN.>OpIzƌTL GO͠8ؓM@_Y_Oda\d|@|lgB78gLa@ \Q'_"6^)_' ;gttyfG YXj [2NuՂ崼<(2ム5pq AIicJږʖ9)cɣGKT2YPű"}L"]Ler0r}UƉwD8!E6M@t~gĪ&V`ZIP܇ ^vT<0xObvY ~hi;z2o<DZA2@r>*X'|4:CY| rȽQ%j=wD]wDxzW05E̓g1[=-+LWYxMk+0BTcH9F!=o 쇘O!+ZfA"x)z~Yeʧ:.q- Z<5YڭvtKl@[]{i!}/fCOltt:L0p<Ofylaݚ`'#1_T:SvܔI'I ϑv,snvp~d p8,*3Jb/Q]%E׹6C>?I%qzrL/H8FLqgNlpHZǓ@U GbZZ[- Tc}\lqS0G@PZ?\^焬},ziK~-unI䇈o3Ef"mAp Wyiİ/W&J\ɘk3%jH;a2Ke:F`mJ wM$ |I)5SVu+yQlƽ[a⇗\^fNOHܙf<'P]p0c$i(|oC:bQuqرjŋL ׵/nh  *U%hUʊ2|YkdmMtT d Ņ >tM&sf˴}vmZdSF? q/P&m|Q{U)9{0o;\f8S}X)FkqTu^ءk=gU-DWUgמʘEsFd`\\'J(.XrdM=/ǭEſ^ʮP).nꖥiꜽ51gE[ɆU?ؿ&wwFvft]։`齨o]<4`U0r ۲GOnǒigo%S7L\".#? IױRGaW2ڍz.I=Q^G^0IK=GxΣc>ZLB f0>#TϨUs29CSoPWGH  jUBm)܂_rBWu~תWT'Ρ3;S@kZ5Sx(بZ.U8aeP&I4 !g9Zݐ#9g**'M0IlH!ExX& @SJY2-f+3G노v*zOi>"pEixvXfGBTFj+SV*u`ivdz!#ka|(9UP2XQS[!T ULǪ8Z!VLz7_vpK=]`v9?F]\$Wr U:nPa@ >*'֩V2gJ1ulחg5&N([Uv7L{lgJom3/,#-..]H_RF)9ɝ[/&fVC$ FPqaQRȐz /*-G ȼ"2??`N(>2P{q,;no<2WEBB=RQ]86j< ~[z?'Thf@cEVq \Egs;iv ;@ >W hĢ⃅qgd>WרD#q@?t ޡ(F;9e qVWԴ!V$si$J ɛ@bo!L%MHجsp;*Xb'Ҳɓ'[1M,ٗfO'lp55G#I_&;6e^nJOLcrQ" sJ EYHb۟$,ˆ4j, 4dY ̅5/,KZ`_ L0%@g``,݀bM:¢IJȜRXXYBp%Pι!cJ6p8ldH]q6P׊fʓ̗)I)d"XlFI'*sQs5G=4ܡ i;fNi?@i9D`*w7k44ߨBHl UDm` 깒 z$Ο(q_\ 9G'%8OquNƾshYzY,ٖdGN4Đ8& RbxRڞ{ۻ-[sI0iYn6%g/m[NO.Y;#'ܳ|fF=3@ウA‹'LvG#bm-m%lt!z)joTk]PseEOzEN;}:ŤcS'+&r zpm~Zce}l=u?䶹OFS:&j:üϟkvx=/Z͛i](z}OW$ϬaRE콈a}[D'0QQ?i#oG{ ~?7n(QHQ9 sF ZYS0O4#%x ӁN &Ex"}6A'k0AiMs9\0ϡ1xz7i/Gq=Vn M_mܠclG-b PE&Kg}Pi 0mVw|?6.V8asls< SJ05<[)t}' ww7x{ADHk/^9Ctwmda-*+^b(zQw]2 _ Dz1 (;>s\_LF=)Nx @3m5Rqph$[}0[v9Vc:3D4+ݫi."0b];ȦO /2c8;2gFgGEa7*b\χ"ѩ]YGb'x 9S< juܹikބ?ϊUp~xm3VNtzs{\@A㣴0(r>jJ59\5蹻]ټt#ܰ*2=#Z7t-=j楕~۸J{|o<>҃ܳ/c fA+݂}}F<5G1qv=FBī%>JJ$C"B2lQ"I@@HG"89"֤۝Eh@P>qm`&̾LN{72\~}#e7<8b? &)QZ.``o+Z9ZYY 6i98W3jrDݼoeDH4OVV&u/Pzf­Y",b#/y҅tq9@=>-X]Q]PmXC>x8r0vCD\;;|f 򗗾2`Qڅ2lDvR66h%{_9#w=7}^ꧾn}/?|Sp:aiൂ;ۼV\ɑr7Y`̥xvPtK1epP@U71Ư閮Rk A L..E4hkQdЁh`ςc-W.@/O`rw6edB.<}$q8EՋq /AdKK&~\^IIoVS~eZ|k#R-NOʝXɪ¬R ¸*dBzK!).2`KyR,N3q"/]DӨ%"H@)eKO eE(8\zJ/u0@ Ն#yw7pYSͺ&"m{a#S~gqmlqJu|.v "lV~ Vvw" p>YX#ȮnH1kZ5}Mvn;C ^IϦR)賺(> "-p.' 89]cSڴ&j`b$9H5}US- y5=jmnǚ$ۛ|r;|׀ymWZ&y  ~-3t/MN"*7rNYVb P1\2ڱЄ{W6vq6]ٕiG!"LLg^̛ٷʮ@-?6٬+Pt7v.>\~˛ԗ^,U"f^(^f%՗I-17՗N3:^\V7$B݇b~@S~ԁ! AUb<;3r{.ԅJEa; u͉s9=Ym6>t3s=n1p9u|O>SMҌ6KW. )b.v܄`r]e× :XE8 -qc`m94υbP:1ʃD,e=@tS .1XPL:6ƳDM2<ʋH!r %pˠpFyhFڠ8?tۺzj_QO:q?\zW;n۶d;n{@ q[xfL cO7to̞({u~4,)~,(8іƤ#ǯ ɴH2\y(j$b&S]@xM&$)svr6<*}tsssqfn {z?ř Qj x"xTo)h;]c6uoB}14> ](hw/v9yΖF,FYح*ڝ:@p#SN@66lCH6!mѹF^I_v焯K_u~Ey^~W{)Z}؟9'꟪m&5 |`n3sau1< N NTX}!s Q2P2(I'SS:)5-@T09f0z-3fj^~Uɇqn}ghGsةԨS~J 'mO7h!8.fߛuNi(J&I}Hlh7U{Ej z_Q +󏳾YG<- /b^+7 9ؔt)XsIz13odeDPxG~BR=XzHWo\.gzgET\hSO6P9%eݶDwX=o:R*2}"&Гۉ>!F?X+ccc]GYeͩTse݀rwt U]J+fwhko]rc~ksڮnύ tqc7Z|kS|_)|)\ꐌ]cCx,"ED'JBCH4+!V! Ѣoxj5}c1f^oD 5_A\XoHĝ8ɈcQsz- 1< ְ96rF# 5wVssBNuc]w4wS%0~3+{Ʉk_+{O*Y0%J;h/B N6*L:%X%g9zVb Xr!xnv๑ p5$=ctǃFˁ$KcorHU43o {hK-.2<~)@_8-b gAPu^F-Ņ1"AmҼ ǟT l CC>C9,:'o踧c9 : 7L=n"EHl`_2nvQ_P7xY4X~Zp(] }|ز,ume ݫ#J07t^Eh$]/3 y6З?|~ۆX4욞ײomhy{p":|m>K6FglJ=fsp_ϋd?HS6g)rO:KB"A+!yB5Aזe3ڸf_ 2/ ++ Ayهѿ$LE1XD[v$UҜwfY֭`">pnyڞ凥C!!/_p~^si@JnsFC|m囗tUz(J\햺ni%LvLʴp\dxqjPHã5dďW% 8O˿Cp˹Źiq5)vY*eVRvG7r6ЋtRa_;tA 8@ls=#!Hײ +J)y=H}>;I!uXw+T>5p#f\^zQIh <\H.?N4.O)w"9Tq0s,aQ H֘u:>g=muE'z70&Thۭ(Sm;Y"zmn1bzn=ʽW BHۺ8}pάo=/']V)Z!jqVQ]:d݈_(+/1U\m-2U^B|GF[-@g+Ƌj$7 Np* >/S "X-# ",>C|mۛ pa=p؟9 )oŊ'= ^e#󑦵+Dћ:>0Σ~/&|zpy 80KnE0tx\.N-zǪ`e_d7[oZ]~5SB 3?eي>[G5S]etGk/!T m(gdMyg9CQ+Sm̑]<^ڃ,E1 mɺFx}nnxʁ ? ;vʑ +nȓ{+3rCw{ݶ,m80fm?n<7' LaNgtƲUy§RꏫoUxF?}"jYwY9YO_ch)=)m,$lSw]$eè5yMaf ll.DWxQgǨRHԏ9fKg71IҪR;}+sʌ#IKQ iI'ҘYf $_ apZQZ@G Ճflb&൘s=܄9G0+Lpp)oL;1魘zRx3~Qt€?;RYM薭m>z7-~􎏍m&SW endstream endobj 106 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3\%+ ҁ8i^ endstream endobj 103 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 4 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F63 25 0 R /F94 60 0 R /F96 86 0 R /F72 31 0 R /F49 16 0 R /F22 110 0 R /F25 63 0 R /F23 113 0 R /F26 116 0 R /F20 119 0 R /F28 122 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3681 /Filter /FlateDecode >> stream x[YsF~ׯ#Te+[gegGJ(<9H9-$suϘO>xu}QNg ovRIUVQz>З^hL:I)a ꯗX~{ugUuÚJA/.Zˍ_]e*؀&7<.u.eU,M.˩Rlw,W-®~{؆=:km? QJ3/=^NҮp);q?{$;J8P܋x1PcjTPNV >$PWWK Zvġv[UAƂ#feMxG5N|QRHT{! ;lLm H)r u{̮uKUޣӺD*oBvB1_oI[<)9u_9an ǨLeEvGcgLHO^JD@ieUdX]4VxD]>}>k|)8 ~qX y`6^> lɚ3m{k{@`6mB;zͨ~_QĠDǪpGjlhVGrHv!pb\=7ـL6aسL49=1R UTTe΂(mL0}gA.8שB#l5X7NJ[>6F=;;Pky,v8K2CIb`+Dwm~+㓓Q41\0I)s,A]PY[qOSU08AzűpgY>gMD\pT5qVfhN[7pIH~ĖfҹJ֔MK\~<"(MyqH|&)!!:L~.|R}p"L[8qyuX⭇p p#~KP2&].N^6N{3um6 y%n҂P9'臍wN#Ѫ2QA=g#v#: Wjvyv~\JQK6}jIdA^ot޻yL]naNm%vşJT [,^4faByIi@ʪgpҧSlSFg*ӜU!+ OC"~"myg-^?rG`߸mbMYHGƁ(pcFEĝ5A}V=20@GUε̸K&U0~Xly9xxU\f4?'h#T!=ǁ c b[6zf *td$S4@O(۶vtxfQMZ+9GWr^"Yx&Ⱥu |:LZ-#F$<, wHS/".hKTC̲ {wa/k8o69%ǖȳKPHc<"0-QSd8n8PacO sհM@SN4 Ew,~]wBزp^c2⑝C)a' D.e+Wd xm '2G3)^BS|\1E{vˍ҆Kՠ%BՑ;ٰK)fnye!r;x-Q:^OW/^pl]4\d,pʐz6Nͤ!C?{=ePˆ6}uL/%RLpL#eT~="*\eYܗOfixv)a靑3"k߻ @C&1ֹЕ/ÂA =8S.˽K/hc H#j=A<ԚU ݇׬Te"Lu35|:zؖ8#l6T)"֬='8lGk#p!PcEe{p$d><Zc/Le;WWQa6Eʌe\X2=;JK&m󘽁 ~)^<t^:j2:BÚN "l[(7  o`vY>$P&e=Uv(oɋRQ6Z|'5iXo|0L* +#V7?nWPa&H;Ӕxό2@Uxד\[. ߻&Y!mꉂ-4 YyѰ6dx?@7U)Г6W!9C~hǓb/l!_w"m!p> stream x3T0BC]=CeUegHl$TT@3B%+ ҁ8i endstream endobj 133 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 5 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F22 110 0 R /F63 25 0 R /F26 116 0 R /F23 113 0 R /F25 63 0 R /F34 140 0 R /F20 119 0 R /F28 122 0 R /F72 31 0 R /F54 19 0 R /F94 60 0 R /F27 143 0 R /F102 146 0 R /F70 28 0 R /F95 66 0 R >> /ProcSet [ /PDF /Text ] >> /Length 4027 /Filter /FlateDecode >> stream xr6_Gzb rLi63w3ӴLJtq%I{.Pi`$sd1)&W___|̔QMш|"ȅ2SQv:Rd .J9gK;ge׳-B=ywOl&+械KL*bww?F'e6PaojF!ȗ +AJxɂ`'&@Sfl`?Vl9BLBTTy%4}BdW u66ǒxЮ|JTVY |1,Ծ^ÿ"ꘗ8ps)MW\YvYrG3열hZxV&HhR[B⛪:hMҏ KYg[/n-YvD=pY+F`YT) 7 rru#cTQ^+ޤ05~V(0QpxߧDp`T t~2dTE.u3&li,y=1;'ƪʖsdkZ NNUh%[O|9I <7ĝmO4m"TyMdE)aiUby<j^]󈿕=J>A^5U)Gzܕ ;xϒ2t^w'I oF8O0_Qal$S<i_Sy2Kx%FFU(Uنkí+nʃ ׶f9rGڱ'[P* J9Uzu5VS)lKG- TS{>d:x!3=[У5ѺTMn*ڮnm9'ӓmSw$xc:Uv}gN60)1\[tyJٷ]N@?<סOK8I̦KAq])z\A a:0r w|l[Gʭ\c{x#UP{vW/ɼ]-G9FX-&x"+Ȓa׺ڱ^mBByC!!ȝs63gwp 4&ǿi%Ia ujzoֺ>C3c #u6w>;,ݝbm$ ceZt0-Hz\lnw{r͐GUҥ,}?"Ƭzᫎxn7Mb *L H- Yt)dQ$ X 0` %S돔Z2m!mkߓ=-mhOqt8gBcmmT:m/W}E;:_#kׄ} vF=LrR֐UO(dn$TEYA9jih1~r0jWM^>xggYްŲ1lmZ j  N8|}oLf:L`D_ץf K~/dG|rTڅɰ;3`3|q%r@8{@;Po騛Gxa.[ڦZSZ=BQj_:,Ra\f6d^sp-لh\|AO ,@rTlSu^~dl#%I-&&5LRC.\=aX!y~ W#ֲhH3Fbݪ( Si$(Co8d ~GU M_RZJc2J!P"Bix/2Ƙoɼve逴1 :]쮑FUJwP71\2@ѫi@ɑH̢/nj/O8~Cc&P7iܕ֏!Tf>8iO6pV;7ZTX em:Rvs\g,)Y|Ke)j>^պBjwu{=ܹrۉ6,GC_ 3.gH4)*WJLش8tq嬖5qDP"  wr,h/:FøC DDǼ mԙ(bQjH-]b{@,767eє7vS)/ڮ)|Q^ X y endstream endobj 156 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3R%+ ҁ8i endstream endobj 153 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 6 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F63 25 0 R /F22 110 0 R /F26 116 0 R /F20 119 0 R /F107 160 0 R /F23 113 0 R /F25 63 0 R /F24 163 0 R /F95 66 0 R /F94 60 0 R /F102 146 0 R /F28 122 0 R /F54 19 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3510 /Filter /FlateDecode >> stream xis[~?R3&xv;qIDMfj3HH*"e']xIM LJ]/ :މȋ3uʌNg7c{OH&%b| ;LoU䪕u:Ӥg2JPi"w.XXccD)5lVw,/8+׈2 |D>p7̧8NJ+_;zM D6j,mkpimYԫ_8?m=]#-.{߭iyx$Gpb*pKo~#N \D L׍&K2@aўu>"yЧLcqHE&1ERxEZeK}"0VH .QEIǓB&FFv? q @fNP9IYv/Ȝ63ﳟneU]4ײ ܍={U6L1͙KN3n@ie>7M }0;^g eY>y"f[d`N9 tԷWR'9 g1F֡"|/%Z؁+@`\qόs܎<@OHʺldj0gJ DVߺn(tAbLX_{M<1fTlY"^}Q$*4-M @U2$B7 B Ʃ&Ӂ aK~*&zK>֏ *?/ 3$8DwKp챥iu摶TR2PQ!8mI0U1N8lcs-j\PT+).h6N3iU8;AĢp)u.q+>¥Dm,[\yq-{꽖oR.s^&%7RqSszӂLrmY(!EѭB"oNt_cjaeUYob 9Q= \_R\MH[Qf)9n8n iuyC 4M;XU'tM";ȸM_pْISb0Liw`K ,z*q4L+q6~T6!DDYȏlfWݓ_ߴJf:gc`!| K|~ GS4 FtnQ J*GDq'||5dX3 CܺaqptiR >ҩ)<+!8'xǻXуP 'qJ)*m<T?E50K2ԣW'􈼖w@{#Yb81YoTo"GC@cf "Oazz%+ )O\<țғbSX.wFwnum6T @RϹ.B#Ҽ Z= 6rGTt&ue: Hg1's18}-!_..mR &wQjҵ=PL6=;+Fp)VZ= g oQ&&+)G 'SpmЛ9ѵXo;KEmW9PäD?\ +!P@xt>k>-MܳM&;EHy 7I S=ܜ^=hYQ91U Y.p_]!FcZe8U!؛RL `fYl8`?qÜlDbyG]Yl#j:&tNvt ;WެyPVtSvESR(:e>;KiD,|>f4t`PH46 ͜&,pܥCXߦr¯ɡݖMaUt'R1kNY.C0  yE٘b:VAB0;vb,0Z2/ɔ91(/,muݞ(i?+(XT|΂g^ŭ-٩SRip1 o)yKG˜xO 'TiWD80.DZ!_R I5JkF/Pn+ɡr' Sf[iA" "6T{劎ȺtP endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 885 /Length 5568 /Filter /FlateDecode >> stream x!8䮸++^K"4F F-JB{t%tzQU"E%*'* 'ƊJ$ :a(l%LN k8`x:hM^ 3ɞh'8 LZ@u4Fb.F#'|Z#|Г7 NX!:*(6YNa"(BɧEԩH0_L$ `xBcDJ*C#JieE00hfIBI0`0X ^&'^c&BJpLECC0<'WB + \@bb#;8:4 qnЦ2 o=5I uFf 5a"޽"{h&3ثBÉ6"i`-# )tP zA[1, x@ylDQ!"CcdŷdC!gb}hr9Ǟ0&aۓUB~xxm`>Qz#7>/?^6B>ϛy1_5R$;ϛbݍ%l*xLx%7գ覃GfXtx͗+q$~lW_x1\`Ү {p՗g- '^Y\Xuj5qSwv~.ڹz*,&tXz<_6vu!.`]לKuz U#nwzT=*ӌzaTTixWwP0nIJbvB\v Xh.މE }k%t]^5Sk|3cA wR:{DgUI?S /fSO+^>|5zNO] DZtKZwwS|q0d+flj.jd:aG0mZb>@`_v'X;x,]{-߫ V c| cQ0qXxWb {0 7B"l0@#azE<bX[`a ,+: aps$M{74bțFmx @@mR+L1U +F Q6 ]}M. $Gdho,]1if`4\CJ'đEmTd :A$a ZF(d"h-&A-.G2Kphlr E5SRNq `Y/z2KxU] Xo)*.87B!^LCUт0r_ cm$4iH @M.J>,.OR H(0!Rt,S"©%tSKP9OyTmri% fK!MR[8&MެM.yР3=Ch'b;h+He|ଔK "H+LЎS꾬+;Uj T@L$SfHh"#btz~ ͖{r P?+R`E425"/Ȑs>n\+k4>?nSJ$L2:\i_2%EɄ6&eX^j]Ci| "B'R1cg \ܩ ܂K7t KCv-{h*;e-ӊҡ;7FrQj'bCveU3;W9[ZE~#Ԍy[mV>F,R`+"j"&nմ{|"!*DS5w1vǤ"J. iEBO&X$Nc8p$$x}@+G`HJS,J< .]Ks\3Z-ӻ/+`)P朂._c6G,Apo i#Y5s4֕O|z|._ȗ+ˉ乼-[939 yRZQfWz "G6]3 ,9"O@O3O7&(n p\5^h ^>5<;ȳ)d4z^5 3LN*&z4Yɧ~rZ//nKS(Z6)ԀO\q׆~~8`cx=;6O:}|SEvy܊mg wp Aq6,TJzrC8\, Ot"^s,!|&ʇBEű55OhE2Nz:2(*Bzʦ\4j7A%Zl/x-Ā۶ Cua> cӶ7pcnaW|:X5X} 7D"o%bacX!3-Zmpz &E yMațm͒:^*vv2:(E7CT9ovD.݌-)=8=Cv$fa(̼)1 .@o 8͉,h@`GATR)r&NZr,^|P` EGӂd|BꗦÖgC[?:0|d1 Bd6x%r <SnA+uҶis*J9Lg7&rGQ1;س^h"+//Z֧ˆlQu-O ~ѡbMʹ㬜7UBr߃ sg_vuV^ [yߐ!o(@Ր [;HbD]Z;6H͊mf&z]skBEFqۮ970en'~oid7a3L6aU&Jkp^cI6}wMς~*]/]9 ~N=SN },vDR"Ljw7L!ѷ`!IE,Z\ !٧ Z >ΦEqx!|dt-2WIþvjq# ȱINsX~ ? RR`r G_鴽\$t)4&@@H6] [RQB?J&GS(L-b8E4sęDXMvЁ0>,f*.(&SDS6J E0P7K&[X:hAK2#Yi-B^GC]uJwR2dw~PT]H֒Kh EQxdٯv#􋼣 @l)\|tAah`OKNz,՛EbşE _yyK:R\`$td#=o9Pe .)kD"Wf*r0*2Qs;B@Z*TհO? ^#8cGO EB3Y'7IvnVrݚe!4bܮevRhgp~>TBLG>6)yERw|jPF¡ |l.1`(卞*|ztxC{-f+eZ.L5ZȢ%pSRLi,BS:=sz|6e)}%ᔃ)eyveeoIȏ@mNV9`/t짚?92W>sL^fw?Fc>Q/q@k5o(wQޚO5 > ]HZ׸f(Kvx"-Qo8m #S;>GPSVkr= VKLlx4Ckw5t m4#׻&{΍o=nah O^qZ\OK8\^Hm]0薋OQ"סZoRF~|wti1DuL1XR!=mcl/#kc5 h96u ݉&/٧'.HUTwcUOTio^0_޼KmP͞u3#ma[Whv϶4i{ Xw]J=Sm6ag ax7w^$5]Ҳݚn &@ 1Z)~(7ZCEn+*__TI2TI3y泶wHTa,vnf;y6y8|G`ƒmR=B(=B.,V]W"仱ݏEΎ \|vrne(wny}ܖYW\1®_M;pGy*Wr/@vkDoC_h䛦*iO?-= ^)[v#/} endstream endobj 172 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3@%+ ҁ8i endstream endobj 169 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 7 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F22 110 0 R /F23 113 0 R /F28 122 0 R /F26 116 0 R /F25 63 0 R /F20 119 0 R /F63 25 0 R /F34 140 0 R /F21 177 0 R /F24 163 0 R /F27 143 0 R /F72 31 0 R /F107 160 0 R /F54 19 0 R /F70 28 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3907 /Filter /FlateDecode >> stream x\Is7WHULT'vL%UqrhIDG"R~@\$K25M4[>h::ћG_5b8l#LQ8FGx9D>~EOP6 |wS>Y`S,byߞfuwfCMdPPE CL&xq K&5|P-'܌Oj F+uk-ob'8K_T9v]_Yr^,L|ӢcDS|c㟩"FT_N)Q6лĨ8gm_H+OI`#9;JCxUф !85Gp+)]{K@vo ^z?bŖXx"M:R$4}LJqV˜-j ͉ӱ!%Ah5c"$QQk@I¥Qw'ӊ¢ŗQF Q z9H69[pZ'3nExu WMrډ5qHczPY,m N&+D$'Px!Et?Zi qwʮ kvȮ ʱ˼nd)Rf1EMaMQ;ŻgYZw'9P#.KP<`l,#[x0r{ZO{a .˭#H1>@HV7+p(e g@ԳH@0`,ML`k=&=1!'[B j42lR?ZX #"Jiyԏw(/i&) RX,|2`Esz$&1sC 5m d k\9-`cy"A*]xRV'NvemY9=NYU +Eui,_e> F odL<\.q͛Trm~[I5j?abVNaMEAL Ai#N%PtO \t]_%*@[ߌe+׭A]0VYp/V[gؒOOHfTnGJ)"OiSXf'$oxӴy\QyYDfa~Ӏ_燂`#V[e/` g٤q3v3:+2( ѷVDlOGl HX\~;@؈kX{aў\N)0\eXr!5Ԗuŀsx QFQFhV2C7M ӹ ] >Aj$t9&ʆp0Nl %81b /6T> ; p;^j' H)Ե 1apw'3<41;A*0t t %P=3P!v@ ͭH,:p>% Ed:oFSg毰6>[O\ X<^e̳`Ь̶x:c~X|ʪf-'#>\o烽^+&xea{^\ցw?ӎ5dt{)]$It|A|ToP,%jfTE-VI͎oq> |lI$wbhm9YAL"8 rY/\t\|~lځ(]4= "D1G(t H!uwc25*Fy AL}w(\aP܅1;(&*8F(;7)քsumzͯVhA1w=A+Qvٗuitѡ"ԁ-bI=w. ټ!kM{)tK(Wbw+pZтi},}դzhu:OvR'{uw!TӢbAaEJSZhLY a1qaQ; "R"y=zL/H5^N?#c[FWC-mP͆%wul<!,j6: @$#$"cChMBKVih2[clE;C{SM@ykD>` faV},]VgΚeX^AeFeWQ9 .m+LL8ղ`܈gKEP۔P|AaE+SXccw_R,{K{(3Yo;ݔD֋MmmmQj6Jopף5n!LnX\avRuݥm".m)?}|l!۱0Ac:򍅈"*E= L rTT}XZK0m@AU[l{QDS4j XI鰇(ڟPCrI4a)./Чr W9qNr%l@  pyܭlaỸxp3an$%nwpPnV8ݩLھF,< \ t0f-z=ǃ՟ȡ|~՞I㾝֤T:tt)!YKe,}fĈG] :TI1 MkXM_"0aպcўv6;-ƴ3_N.BH;P6M\{WY=*dSs)6r[lƟO2D(]~Um3UMvg%J+Mh YCg|Ӽu0%442sչ?[q4Reġ(bWqs+Q]mw B V!JsqypL<;Rjpk wX(q~JcJSNkn x+GWqfmNL`h=ԉ8؆/S\"6j4GfCpۦ2iBLR 0 4^{6×a=Lɔgv4{8w[0;WPޟ8 k<9Yx-PS7P^k%x;Ձ 㩒$}8eF }?-=6`DU0e3q0 ~65f̢ԢCB Ҥ endstream endobj 183 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3P%+ ҁ8i endstream endobj 180 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 8 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F22 110 0 R /F25 63 0 R /F20 119 0 R /F49 16 0 R /F63 25 0 R /F23 113 0 R /F26 116 0 R /F28 122 0 R >> /XObject << /Im2 185 0 R >>/ProcSet [ /PDF /Text ] >> /Length 2932 /Filter /FlateDecode >> stream xZms_|x;8=iNhpNQTyw_p_ɤ#X,>,&ślFLn'NLefKw9RR yv*|6i;dͺ)àWә֪WCQiJ x˜6x&8hSi_.E7)[fgYi vm}y3Mǽw-=g@+%Kjqw(J{?7<ç\T~ )z2]ZF XҼxFl `mn&KTHG[s 1 ӣ!} Rމ9%*!2իWŲ~)5vw:=xsiP#g +dÏ/&$VQY])4cZ=`oyZVY~K/0 ĔnVqӴP>t۠ -ΨLL+ugo00a?>Q%8Y8?qYa;B-(0GvH/S2`9fzǩ}CP,b`ĠDǩl@Z7[hhW ƈ_YpZ0 ,)JcSJJZ+C w`vǺE).1|޷Sd1ǝ 2׎~~Y?t,2B٧-|87Aң6 6É/G_׏T!0Xu([.8`zxQr3UfQE Et3$|u!(: %.}Q U#u!e5>8[ w+9y;|6ОZk(Ӛ=FuaUH`b'Y+"s)MB Eoh !CIfF2ηwEVGo}MIToBLeaDK#Iq]ػu~4Y M]De[B;=1{hWs!wh= bsG7b C?2 dUcc9iJa9XLd7ݬ=K58 a6h N,UiM} _?^7G1ZR*b6˪b$: $tK%O+&pKՇu!3Ց"]2Jgz9-a Py7j ѠpC0ü4X p͕a<ۃ=Iv "d| lntW-W.`iP RzK-emLFRG/~n9o@j_!8+$exf#j#wG`݆qR sù :#Ç>RȢ:0`@5FAzXuQ&WoR !uq+9檽D;ʄPkā&: ;': %RDgd%DN |jNbYZBPEpS{yٶ"]4 ~"@kO7CUk?s ׌KZ?l]op sĆ4(0Bluj猧>2'v:Btk7_#aRESHS6 N2Zs=ͧNyEc,itKK-xeԀEز&a7_ R, gQL$եR+fKYDYj'+d \ĪЩ$"c̕kKㅅ%I{'|~LjY{ca/'-' = CsxA8Z)Nf ֎#rڞsRC) HՔ;Mix q9+VtJPH63H6_/Qu*K~jql/S|pҿji[B%>Jt)V H[9WYG;TG`n$-!ƥ҉f2u+Uu*Pҥ>bD-@ F ԟ:8 }mmBet9#/a7YWxC/0gaNxJ6C%o 9[yw-M".d?~-{^@x3߇>@E6P H |xx&'Qsr@߸1FzHG~lLiצT=cx:aAE\+O9" ccxVrA?rTk~-zS:ê#jMvRSZ&A-R1a"Mj4> Iϛ5-|!Assu +JGL=^F6ug;'&*dHwAtBaVxFMJP :>sgM6f+f=`E'8\tf8^O+/8қLd>L> nƮ*+5*]b}7g>Tga[c Ћ:-1ZxeZjD%.d@wnjDl/9+w 7 9:%ɷ'{N ہ: >Iρ,QuFyV#iXWz{Da`F/]_7 ףG _m endstream endobj 185 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Figure_2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 186 0 R /BBox [ 211.7608 287.1782 1070.447 594.596] /Resources << /ProcSet [/PDF/Text] /ColorSpace << /Cs1 187 0 R >> /Font << /TT2 188 0 R /TT3 189 0 R >> >> /Length 10362 /Filter /FlateDecode >> stream x[mW|9w>zc E2>uARtTq[((b}뻭?O0?sFC_ݟU-vkߞɷ N윮H[wI2y>ƭ?v~X:N P?vFħ/=m6Cd%h]Mj1qŸTt؀Len ;:$i/'Kl4@k9d\t Y.VKeo{?#},mcF{{@b^j7KRnhc^Fz% E[75QYNiڧeݙfZ51Kp LڳgJӄ%KlǦ#xgtX}Ť`H{i1{}=;fwXu5솁ujIA|Js4s2؁ {Lv C,rҬɖ.N̸epN3`[Ҕz^Sdk/eN녌eqʾVT;&+K*]`WJSl-Q]j ׾To+wA1w~[ynmֲ ^K'Uv{gyÂ3]k%՚eΗcn cpEnRBGRaZv9GU?u㇣Ǥnհp(61eXH +9WC^AH̲w\ȁߥ/ɯ #Mt1E9ש_Fx\%}',E4ykK !-5]UE?/cq+٠a*x̥aK RgVG&m:a_D~Ϛ_u;̑m|,_/d%s\nf~jvPTbP6nNx`;\?ی +p@=iMԦ8.4ܦc{b~PigV1L؇D{p ;8Kdq /f8tX1k0ǂ{cLj dpQPbgCgdP$ NݜAuF2DNvcʇh'AEl$ H\NG 2J'.o )fr>?H;#rw#|4K[Ҭ 13~iD{[XSS,uHt#&NB⎨ySt[i88#q LnZrl(xpJlavX^ `GQDbX-0x<bw"nlD4a9NoA bboˆydk t"L8a#bC-G >n<4N10Ҁ?iXy6x`q\0 1 R1^ˈ>FF AJiE ұh}ׇ7ZXWꟾ}y] /̧w{'7{g%>H@8hRD'h4%(bOx';;8[/Q1kf~ui4`o12$uz}QG.an1pBs^_3o,o3;}C _bm-;p?<#"A7K2l޽{jgz󫷵qY9`1OܐaX L nTsì=ũ-{hFDmbGc7At;U"fSv s˳ Ԉv6s q%‚qZqgD4;ut#1$x1TIV1'Jt\"b2D8ЧE\Bp `4ȲިM`q oMPWFkw8mW "a\#3 @̷\lC&Y'0vM CەPM]Նy{ӹ7H3liԂyH[!k6|5VTZk.ʹ)^Ǘ1Ge-ePT;PHQ(J%.wZ:rx3Cj5Ob18]!9-ɶ(StH9bi(,h].c/Gy/jsMr\Y ǚ} _C-\[Oma%;|sW2FB] Z;TWSH;+RpH8"(SRp d'{#jm;(~-Z &H09p5̤d$`eLdVWqT;2b?,əl+G&YW2d4C5HX5u& =, iʠ%>͸x m:޵0Z Gi/ԛ w#; XR+ۅU Hbb^is5rXNpvNApݰ` .HvϩT7 \󄅸2I0/S ͠ (ҳ6׈XLD񋩊ѕ V>'޲8K64ҡ?tF,0UtH>tl,5KȘc/4.ȸŨMZ̫3010MxG7a, p\Ѿ4{;L? +)7HbܾqNդs&+=tP"Jy:l?#:O/9o/d+?  i徜)}u;ff9ǐܽT9칅h5&䪲0ɇLnsj"SH!nspƽ9W֯]0{IX-ibx6terٵE+!Zz *;V"TzFv)$h!i X˓ I^K\v[OԐ 񱐕qiriE[%!NA)%7RV -D;L+e:ަ0-]9u"&%)r!m{v1 \&N̳+<'DsgOIO;PIhS !V&ږp̫IɊi$DcmB# 5H Ȥd; t?)wpjy$b8{$3z,sip rD40!l-j%E4\7 qhpX؁42ɬtoBTTZ-4ZJ-n+5& QF$3D;ƾ̓R$|`Hn~r-[By\ELب c1Ce,'l@YW(nL\0d `!t"O> M;g|;H~ !KDϼ3xU_0~^<6/6t&')~nB^ ةHxη<7+T*Q(8z~/ ^JON}wPe^-xij=Y>3{UЍoOE1RR^;tu# %NN $)i梆z[[5>`ƨQZ2-P"Rvq]QSIBxݥp]XpU)hj /Ӌ^=|֗)tO=xpQ9C[labJ? ss\,Ra o[6!NXka%%0rm{!ZqJ-DaEhksazf}[c6P%s}*z[jݚ'6QPGʵ8{ANpnap?EV9Cӣ/d  oXR#0bNnқ<¶Qcdww1crDp6i.?*$A ^ F) δ| hNCH0BzP^8By0ܨRAN EO| G3/ ḣlH2%ю8KEDK:S.:&iyL-cu#ih#OEi:!QgpesHkZ/LDpȖV: ee7VILYp-uZUM\4 G[YɐJÓȘƹg 4'^sf nD5'>Ct q׉=G6=`؉ KM(&fe%E`!X_?"c%`9]f4<V^B뀬VTfbSɟuL.A@F C%K\r=ZF.B5)Hs!P̃[)^b[dBw=$y1jxzi>*)2Lh))ơ=.-ޘ*=.dMQÖ1.k`IqH뽜bk;; .(g|AK~|0ps0o }HOXW5?  r̘Ht>X' 7y{gIquxzF)p)6cICtR9Y./k&B+:a𩡜 Dh%$B9pB4RGV= (6beYhF`5 ɱY2jH5LX<.H΢8(Cd)yM"`6L@GhSq\},"DR%T+%,2tgZjlۈ^#LRIT44hZ V=SR* % j'{Sj״xj#@gE% I*BLJ6b^ %SU.o@wlЅAؠy{`9Ṳpavn53KGJK'sx8+POҖβ qK;%Ө~àJy{\@2KO[(0 :l=~$!aVp!ׁqb("qDX&\٢ڇP$ P(v.PAr9f"բ1JL*z`V0OEOT9bO"[(]$LG GETzJBA`;`zRį HppPvPV&c]( (rIE޴ ( F@E &D# N :WN ǞV*ep$P0j9z"O:m!ǡUg Ȋ`qRlg_ʯUMMֆGc]qh"ƋR<¶J门8h)Eu-@Te`'MgSc)0n`ZdLf/s&EJHlu;5 5P[u p~ A%UrRS` 0ᚚ;onYV DP"tꞀGec7`  9L 7k_b-[wXR&t%Vћew7&EằG%m< FܐaNm`<2_TR/:/bkKo@P SӚp 8N\Px,:i!5"}p|Q|="~1XS Ky6^ OLH +nHYdQ'!Pr-?_䱐8z@ SvAWMI@V vgR5ĈTbΨZt 98 k&aBQYPTd߶m  IQh՝"GLM/rw&K#.F 9w^+&I1,Yղr虘 $kd/p})%3p]ɸ7c ᱁(DMjS6Pξb˶#4=M/!=Smn 3ƥp"> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 196 0 obj << /Length 200 0 R /Filter /FlateDecode >> stream x]Ok0slkD([<1x%B͛7cvjke~V-՞yX WJ55uNdxj0SU %vOz.޼foHS*7OlIQפyνvSF7a#9&lD~YI͚)YTR\ uYu%塬EU2"@H{,!)0&wr<jWHOn,~]gފ endstream endobj 199 0 obj << /Length 202 0 R /Length1 2556 /Filter /FlateDecode >> stream xMV{PT?>>e<>y, weE0*"\"*QJP*Dm4GvH 5mfشĶL#NGGm4V`w2͙9{s~}Ow!1A$B} ,;1] 8|j -Ͱ{; /6? ͱ%`?6;eI{t,I=3S>=?@>m:o\>ߥ~r8xGuu>îi *B#"!$PA8.v}"ep~yLQ|n+=0%€}Kҭ{虛~iљ\j.AF;6%"!W5[JCa0/< 3cBR߰HNE)F xDFb|䈠OX$E5ċM#&?#;z>走 zxϓ^lcm$4j0d6i^d$"mEgTT%$tY Kk0xvNDfK-Z% j۸jm|EMe6;N0M}$h} CV.fRzTέ)Nl2s*lj^V#'5c,jȬ۸oe[KŒК<nơ4*<$nݸ).␻\gwSȈ H4'JcZ!<(`cOdNW @97͎-'띫B|]˕f_VGƖV52ץ O95[dSv1ӭ ?lN2)֨ttk!xW^M]e4Y<ɻTiWqǘ[ȕCF kH:N5ΜFAQ33+|).Wp݊' !d" BRDN (F!2󊦳+yb6qY}~4:2 )j#s֔TǩՕoyYU|a8rhb“DgIvPG!<2!(#1B>lg@r7%)RsEB݀TQCKlixdl󀣬,SNUFWx*'efW}8ϐIw&n h AzʕlY |A*mN`F JNAvE9/o[ZVE+Ԇ ZKXһnWZ2@t*Ԕ$^mY+LoubO K( tsV t@yuBؼJ͛թp8NԑWc*}z)8D8*-Ϟ'@]3!1 t *D TDH(Ry|S2L2Ƭ]1V 9E9ZT&qSAKRMDLs:@ mZ8О'nj@`O w).f([i =;F ۫ پ5aȧS3!oo8]'j=mf70uE-) TU!kh;^DKnɅ>I   ^`ir'%}&w`W9W8s۽e7K͙nGRwSxgx][޽gxvˣP !GaC58'ׇ @ $˛EC d >m_Qs9$C6H1!HH eJk]>bC[:Z|sckėwyR&W]B8Uji/Gǎ>/@Ur:Ͻ7vO7K>{!K1%7$v-v`m=~ lCfL[M(9`:rpM@ 2X jOufG6v|~;߾it5]AgʉLHcˋ< LO縉;fɑYWA[=\L,R&{{$ƜRf+],Ԓf(B.c\=dv[)LLmJmVG.U>`~COnP0k[!J endstream endobj 201 0 obj << /Length 203 0 R /Length1 25020 /Filter /FlateDecode >> stream x |T?~νwLfd$33! (06wK¦XZ- -CX Zkjb-֪o+Eִ {~%yγ{7ߴCGptJ>-!DCW^O{o&D\O!{W]&&g]| ]uP֭)!]sg'GZEZaL kgSTxWjU%|DAtD 2I% Ҭ\#<]a [?>=.|E~7G&z+^.2N>!Vpw,? [\)2(Kvop## 74fzB*uac%UGX?XG) adsxɛcsDeU'Zpx[(:bAo%6JI@rpQ7Ċv?/?_$kx,*tSi axhlŚL?w4D։![v탓 ~. r''1Ͻho[N>k/>.^C~BCFG!|iI??4 i7_ D~fWgқMƙpa,[B(W2p"b#v?~|*&^gaz>bnDrڃ%K V-DB׹9_\unFQfJF܀6`|N,?8Hn? 6񚱒0YY ,*^qWXLhcuk,wa>Dk[jy8IX:x1^OTkxU*mH6x^"=0q J+ha0bebTCAN*Űnq5V#PjGM{L9ӄINhkOjOk56U=AvD;ݣ5jGu i4bebʘTSI=-w 77 'aW _/[Xe>AJ;IlgC=rmȵ!g%=ppCpT{|V4+KԊD@?V#׉) R:. e \N",3S>PKXi8ce*(UW&&Ji)TmjnR9%+JJ핺Rs9\ҼWJGtIz^i} _iłu .uƒ*Yxh篪qV wN$aifup~X.rnp.rVwixbgq O5Vwt䮀 ')^;sOn86˧.Ay5íӐť8I2KR-0qq8zÈ }_67s?Z;-vZ~iӒ@D(!-hp?#rb)m7⾖ܿ) bW"oD,E.ܵ71>N'aҰ>liG(@p?mm6bx~@k* tz%Gp,v*g| GL_t>yDiqk-o"=k(w<3>ZQKmeKB}cm2α85cMe;Vw5 l& fFCznqXjcֱh%icQ$'$Q>Jm|RCX E{0~*Mϲ'G>o Ǟ [˩q?ectXx"5Gq "PWRW{(Vn*?]Gz,4x%(O/hz2(V0j 7Fׇn<dǓe8ʧ[PKttmԭ-]֕].+;ު7z^ ƧOIƮh9צ٦Dq97'P9.kstsrɮqdWN߳o?_G*'=Nq:Ͳ}G; ;]դkpxɲ&:Kܛ͎lG 'Oy st-=Q؟bEe}Gaa]{a}GMp,)P4U;@X5RDj xoӢEX|V t%f}ՄbBU<;}336ޙLxgAVi1kݘ*VbrDI+Eu:1=gzrC>OD$ r/y*9VDk7ME6f>EJZ)x xRҋd/?@.O'ŽTtk/Ӥa1A QSu x58&#Z[K~ sуwh edLn Į@ |Y&`m̽إ12߫xJ;U bz)q:}] 9%RF3݈L,%Wanj81yh1- 6%,)!j:9שCj>U;uc3VQb".ŻşKOJohkVjԭԯoZPj!@RԐzk1!֓v%Wy"-y;@hs_~ ])Cc"#"J:Yh:+;_8.*#ՐG{A%iZS<w/Jtt8;y\7ȔjS?- .r`p/~O_~@{iА®5ӹ`5Ӆz[J᷒Wᷕ/^Um/z3oXq!!,U+t w!a;pDxUtqPەⰸK/IRRZjHWJI/K^>ք5횫4h^5^5گiiўiu=`WoֽA~>=/}nH7 '^qHsŊiu_kEAWNK>%H kʹL'? gH.XxH_O V:H.6;4 \6iؚ4;g)r)ɐ%x >r'tt&kt!@ 45Zz08/Bh A TfM#2 o @+Cߐn!DR\3 AR<_GT$/Q܂9H@yOx5Ψ8_$WO?HZwN6~t2H<=F]~a&)ՀƾHՇS]T0+< dH,?p')@"1a*4ڥņƽfeJyQA=m?(,|;" V6鉐0SHĨcCZ(3Rbˉ7)tbLsMq,LѠD*YUC>7 ;AE,#BݡmջH<*_rSbKCUƞ~Z8.ʺFf հPSSFR|*5Z/PXkoN_QV\'hR%.m_r%LEU{f)-K< e"7eơƑ=z_CDY珅J|iI+!OC׫uJӸZX-jfPhclC⦒۵w iy_cp)w$Z#"Xd8&6ŊZq %zA?ZLc<Â-5,yjRc(R2ܐd#:Ti$x'%QbFHT4NSZSMm6[,dצl鯠;X Z$M 'D970fJ]L'妦&zV%\';I'kg.KYLVfZ-h7Du/ hű..WӴFCb jTTxaQ5 Ud *0]~=Y?̴Eu{ܮ6ShIG*:"E\X9rs#սqOaba3pLRy̤"^Кuq 삧iʩcѿsشluF ۃzV*G;v^U8aSQk(Ut('z2*F#ܞ",>QLj0 G@d ASny|7zG}9og*Oo6eu{J'$xiN9O$ZN`8$bZPiKR@ᐙf!!-ÔPu6GC`1cAGSLmbiUfgbʋ׮ٞ'z oi|SlOOIey7s(I$Je QkfgQ%,uIc9DɊu1$sF(δd,Ib9;a^*:yhgSmԺZmLꪫp1x5?Fi \*X|l8m_ZrW_ܲ \wW+#5Vn<^-uE3EZcYJl2)s\D/J{ѫקx_}kxqh3[ݙ8#j#&I)RH'fowocf;#<XfOUU=^5ydՇߞqӑ^F=Kxn̫W3oyX#E@IHhW v# /3邌דI{qVc z0d%r.tEDDrɈ6ZE6fg\V H=u0~0OٻI-Q^1Wf0DO5 4Yמʎ,{7Yu[ex^ܼ0?%Zjv{WxyŴw+8[ ę&Icź]2UL855Xmo~YGqI #qYB+S$p5NTCtRZ L#:e訮uv8ڀO L&3N'-G P49wj@n\{I& D3%LDaŹֹQApGF"A[k*^ iQt&$ ֘A9HEMAUx1ᄮb'}c:K@كxR@1z>>Θ'U)ULY\Aߔ5b+%FF,xθV :Z S$$Q0vD{oEb!]OvtfWTwے_o}ʶĶ]QTj)_2Zcf,M G|<8鏧OG`wCup ?ದLFF2DG,?y9"g@cQlzp TZH n0E?r/GΕ}UϞ=(gK!?#R3@ PD`I1xt0;Q +qEɁ棓Pe݆e,Abifv/]٬!#+Ǖ-%w0ٻ>%}/zV~{W*rzBccGx2=})0)ߡf@"rDDs~9D(v_K{+eask[\ƹXxdGGȤ8)b}B]\e'f8oh^~tf.]8GN_UDk~:ɏ~ҟP{-NWhVڗ[~eEt'ѹA{tEZPrPeKnwf&VX92* H@2LOpZ"W+qV9:aC0*oϟf UL F^A_D8&>9 ]#dȑȦ1?yP9`$WoJcPc(ab1pɢxZ={ZV7˂)##Ct:`~~'r h'ua;XXlXGۜ|6|8?d*E8i>c,Q;YnÕ[q8Y Vn r~l q xgɂy,[zwI ksun}`DO3QԟЋ^I9I\6WxőHUfbZZ[C3 D2<`|>S1(xu.G ikA-0υ4sGYZ1XI2F#T _62S|T!}YbZ#l_SWxfN0+K]ew]?޿~r.F[t07`)}T} @:?4 /:="].l.ۼH e ;{MCwJ;5yn>]wvUqŚ&_~r⪖k 5w5[t53j(*XԼ;/|\ĻKEU:vGEQcmx&USEn+=`U:=ݪGĎn]u\T;NcG{|#>kXD B҄"V]Tʶb&?K5,g2ږ13V#bl0yi@^e5Z꣚%ddxTbe5Qt "`|A&eyf|\5 5˭;\Tr D@vn3#n>GL+3b(.ȖWXC Xi˖?Co$jܿ : Wdr)99̲y#| FC2~!ϽгY\HX})0ˑ8$D\8?rD9!3x~SXmʪ*+k*EmKqwqExI|qgvwšr9Hzɥ mviobi.YZ@,S]uЪ@-5KdQ% i¢Y{. HVԸFh+dh-qOVUi1Ge26eI\g9U2鉙ĘE`m9騅URH.^vlm/$V#ڒ7467dCh`5_wt쵺5,uuiYztqsy>jߨ9\P-+:I,CҪ:7>ǰ:\^.ܵGYes~/:@pqӁ']': Tn3N荱T"'U3 L`BoőD9Hf39G(Aȇ\]Hy_弿rmxOx_O$WRm\P[G”44P\族J> ;2h>FLԠS֥=a*1"FΛg ΰu|f8`ᡙ`z0q@M7eƆA,xaA5L4oZ00IJ轥!hSE奡Dg4$wF#qѪVDk-56$JivlycQ#8dm|(H"\S>X>T. rʌz˥C"Nu,d&5,Сul@qP Rޯ+ Rؘ[ƋS{016\'k\Z3ӅrPi5fԩ.(2tSE ߕRKVԾ2/#KӶ.OtO/bNc<δMt)fGH A!%¥ȈW4y#"<`N)>"GWqlS(鎬l1\8vuAd|Dk{Ufأؠ]C50 ⨅E``o,|p|zc| ga8| ᆣo4FcC؞Fy1vpVU1ga4C8;,!"kQB6ţd )2㨁 kejk5->K̫&84u5^㥃!wW}6l`s[8MS%T # W1\^s^k֜dp]Z6kVYYӬ[}-S.XiKlT䜲$ @7ҕ_M)>[lru/q-0krP:TH48FN,y+y<ژ5ρ>߽Cɰ:HC)c} jb}0OKWcDUWeuҽw]^wvn72[*ҌՀ|n5[08uW,hqVdk06`쑿B:'tB6GK5Y(zͮ+58.jrΊxR j옪\5i"EʮYU~~$l )V\fō]]7Om^4y䨽nPk癒S]"R-LOb^z)U (Y-dLz+oQF*X^0V$I遞,n.x^@$% ݤ7.. KRʅRF   ̭``wqJevR Q,S$q|fLycz~8`/p+0889J~14YaZvLj~}؍ G _7h1yvR6]Xw_PtlnBMB PqHҐ4*$>Lfռf znvυ D >5sɲai>SzayccG`kZ𭴪wwJty ¯XqmVBWۀW"+4 s< i1 $X,ouЧM&Mƛ79nton ae7 Aٞ pz)a'z>Wmy pO n~y7]y/^;gWz\q#wّ;{nhi~MGg1NZdX+UT,LE,urT17r0"g9EdV"$UgZ9~TĭuZ]Sa©0NPX舠%53uD9BbXed0 1T@Y['N̅ϲ$V֚EE+&cba`,U; @7[i*+ϗҝ):+<+2l5 >h"8-6(= @Ϯ/Mj" < vJn 05Vҵ:>^Sl.kuU M[US3>L7 v1Na^Ś8T? &T? 2IV;_6|u%UlהO8]r4Ekf_rڗIWW&겕O{yu(nSqUk:ĺhcW^+,C3\R!YHxtF|;c@$7 m ŧ0g4 nCʢ{%okwb]bkBLf u!BNx;i+FuZ̔v͐Mۋ{\T`~*.+GMJ0ٶ*ʦ 틒N-+h"&JKq(F2{"S;T-EXRa|!cpX#ʨ"E?;e zjJ4&81sx .v- d>9u}OlR?&]r3N˜SɎ"Qc #u~T 8bcnsQ5ӧ^*xITsx-BW\KH~}S3j[NE$GRChu)e: !:DCqOC~%qTi؅&Bxc+yzwzrThJ]KC|^#he]Bq~lU~E  *-жã8p``@>ztY>zbRRpTl (e4FTVUTkmTQ|hhwWcޖގ{7er4R+%v#H`$|g׭#^Ew#.R +EIKI3]SwZ~G|;h.WsBi.1\82o\ W9Ј$[)HU',V_jP i/:*! Fmm֩xW5;AC$2 ! UHU- 'ן:s>=?6MeS(4KsՄv= uŗ5T5f8V3f~N>cY)p[9 p|X2LvŒR^g/G/C8)ڜlYQ`KVcA8g8?y8MahMx35odg]^}&,yk"Foc^񕗞۴cDj_r?_.;⾩wMgyCIi߼eWs%GKYa%4I?$zn UضB~db':A7,@9]]]ϻ}t 6?vv[VWX酼&y=Tteff+fZ6i˸wZ[1Քó"]UBA*IXA8)qΜsyyҩu}<o7g;LuN`NQ尚ָjWj~K%z%Dt=~q{KKV^Z*z^Zv2 @oq!3U1ɓ ?fT';?wp1&˛K 3G케`Ƶ&zpiF͂<˫p}OQKuRވJ{4Q=jdBB d/+w </1"yps83ǵ^+gLlr1A1&EI!jLFe^xL>t≨>A[t!}bi4&$DVh2E%M+>jOe*Uf>?l=Q0Se@̀M&6p)Pab^:ع`#GA?Hd{@.[:̮k;<0j{ :aNԊq3N| Sy9y}Wvxw0_Rs-t qV|!S$q|.o(zRPՁo÷n|r)ԋ/\,;؟}IuɼW_vkot+?׳hbB/$U endstream endobj 207 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3H%+ ҁ8i endstream endobj 204 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 9 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F22 110 0 R /F23 113 0 R /F25 63 0 R /F26 116 0 R /F20 119 0 R /F63 25 0 R /F34 140 0 R /F28 122 0 R /F98 211 0 R /F102 146 0 R /F72 31 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3919 /Filter /FlateDecode >> stream xْ]_Gn93A$rEvF\XObH\* \<ϟ93u֭,kfb&p/v֗@QBն2JB ([9gTet˯=t8D tr$re@#l20aՆ KnjD+2--b"4c 1Y.~d}6s`bxK@Nhh:$ )RQ2Z(0b`nAUaY]x-x]_MҴy# k&6a=ٻn?{  ߿>BY&`FKҌ:׉8O/!$]"ߑU:WW$[R[aG:0լNws,!̪ 5]R%m S/(Ѡt^Sp dl"78 m3jOpd!FyIBe%\ CWdF@ yx;,@bK0oyЉn@uE!z㉪Uz+/z! 6e0W*EbC bKxt}@俊>Ui/U,7aM$7SȔP/\"MpM46(MǢ CBBcgMMib uQNWѕqQ##]Ҷqo1, )LɽhɺV@;x]WX@HVnZ%6PvlJ(lG͔FX_s_: xܱ,dp`Uh`Z9F'$STJ`ʵM}QBNMӋZaBS=k*ќJ`ukau6fS ,,M+[Y2yqZ6^iH FU0@A(.q2 ÛB I8Xsdvf/A{+F[*KG%kkt9Cʯ`^QLJ4qɜϙ O6mGuB d\kaWɓV/$B)➤^-T[|WCB\.͓%a v,L*J)M- >ɿx{! Cbi?Xz@?Wx&D/y޳3|ꇽ(ҝfdD`dڦhdrލǪ̏OKO4h `?K yPXOK+h@ E}7E&JS0x6bX% зLgo%)ُc]:kڷY[jt:ങgmTlZ) n% *',p'B%N%ND<}vȔ\q&Q^ϓ~J Zzp"-8nW'3[, ˪Qˡmpp`+-!ȿ9۬bdL-KXTMޭhiR)̀/[QX[)NQ(~`qL,RQ,9xqdwEA:s ОBXx4;0zuem+S}URS>Yn0PbrfG .Ϸs R ;!<|̇8 c`ҖǥǙ}_H1͡eX5OMzjHzZV1ضp$i|k[>3jNUcsNP^ieZ!A١3yzonqЉqwZ`.Ӄ~| ChBS:(qGNl3(vMQ@^)*c6Oqf]}q0aL0!e0,LN"DeΧڷ 7Վfפ"VF2Ho+!5[/_~?:af{{+t;xzGJ4P JX+tiVxG ](( ` xkbxCh@{.f QQ.F/)Is wp KK>k& C*`k}Q y@/މi~Hg9:^ۏ>}Ѹ)C~>Kh/g cjK|[+!འ+䑡jO#2!}ZbC9V~7dcA ީvo-g:MÇ+HyU$ 溁4I;|ê:nVjϞ<+ZUBmBkē9Muۋ_epSɿIked3C(;tOj7y<[^Mj*qN !OIvcr!! r>Cm,Y ? k&q}et|n⎟gEXpec=>Zq*U^c&{p .\}6Ybڼ'^$VxG&;AOѕ؎IQN9TD G>nܰ4Mz" 4:w%7F.o;r)3u8zsIÁv@s׻~Ҿ>^vL:R.' JolA3w%K6G(7E6~,}K+ !q`sCi@$wݎ& mbUyhor.ܩonzKڅ;MktrW!KFzH`n?bAAD:\n[zJo=):W,B22O Dԉ" "J "c<4k\.߯??0M endstream endobj 217 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3X%+ ҁ8i endstream endobj 214 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 10 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F63 25 0 R /F22 110 0 R /F107 160 0 R /F25 63 0 R /F20 119 0 R /F23 113 0 R /F26 116 0 R /F28 122 0 R /F27 143 0 R /F102 146 0 R /F72 31 0 R /F54 19 0 R /F49 16 0 R /F94 60 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3840 /Filter /FlateDecode >> stream xڵ[Y6~_GBTl'lz+G9bG~v7 A؇Q >ͤ=8[YNd!ꢖI%'tjT_/^}-239-5rԦ3a=}u*ӱlhm8SմY̔vܴzz lYM73vmww׵vϛŞmG4J_,=?úW-<.o9+\Lc1D}Փ_4n:&`?=rPydlp=rT{ڦB a*h+97sJ\4`^8gt3$<9?,R' "OB>6Aznχ^H!We&k qUhʔӣ h dV5jv7]҅J+ ULUNJ_T'L+e\E4,l(6;%ԒT.V~;^Xn1o#* QU*V3V-*at,r9BuF~UUvz,W Sƍ>}-:<  nY#Şx>|$ 0iB AWB*EUT>c&c矯0DYlQIo~9vwy`ޢ%Ͽ( e@'XLk"Hrd Tij="PU)^ N>@W֐y%F #6OyWbˈ1WN H "O ة﹪i|ˋ0Odcb:9ӝ̔ -E2u9)rL]"$ "w8k҈5aKx_ #ϖ7Vi$1jHԔ¦XAjFMp2s|H9DOcdHKyٓ! 9$JKQIi{.0j- sr%XdTe͠%f: .v> bv*ɞBcȺ=pLfcXW4lQ?6c sЎߛn| B_)dϜB@K"Ý "R@|Bf`tH>Mz<:Уqnt9eW,u{R &R* ԐLS/{@Q1ϖu4 EE2/7̻ۡ2{Y5%/}d(:K?E A8$4{f <]Jx;ǎ-#Oc'< }kW.NOhIڸ]fnMW„U/rH8Yh*?zM]Vb>Gч yWdq%FSCIFWS$)jW_uxGT&ʯe/be659AE&^cŭ$bMlD /?j!v4O"NB߳Y"I͎ ݛK|AK%1a?`J/hRUBY9L6#I8C '^k3ޓ n^ D)xR 1x~q`dK[IҒ^뾔A`4]/38˽Kf>^򸏤4 }"sI&?wt`OU=1SId]l;|(lM/F#жfzAIߵe}Jѕ㷾vɳ^.>~C֑D>c6-P8ǀRݬbFi{ /_oXU{ш@V@f ρ)ruC4o[_C8J  Ib~.yKvA vKWĿ;F Q$Ϣq12ԧ@~- b QʙWUpX_1ǎ1~K&-U dco=nMZ{6/E{I  ،zV߳a/š1IJ鶃͗w&5~=H>^iw~p&Ixo),DN ʭxI)%UMO#hp]2:ʍ͑.߅؂j#O\f`7ؠ<3 !!X}0m"Ѹ6RUl]Qq]GI |,ђi-^R *8!"ƂVbjƚ?rDЙ*Fsu3~fRxV*-4ZsWPa9E9/}1jⴡ:cHDZ7:}cg ~p!`^xm{ :?"FD9+'̱0“8\fK_.iN. &aeD]M' rrI%:$^&ܕUi)t$˲'?-iJT a YU!X3X|NPSKh Đ"P$WJPB&->jqs9>T0^- ҼW&.u NpRyv y:OQG /Q<x?$? U(|[> stream x3T0BC]=CeUegHl$TT@3%+ ҁ8i7 endstream endobj 219 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 11 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F95 66 0 R /F94 60 0 R /F22 110 0 R /F25 63 0 R /F72 31 0 R /F70 28 0 R /F54 19 0 R /F49 16 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3837 /Filter /FlateDecode >> stream xڭYoF=ȓ }MŦ-Z/-ˊ(59H-5[29ks_nn|S+gMިۇ+mTLuU*k}v;^ύѳ?5|yM.}bfN2p|[6yV ͔Arj^jn,)yDˋ(/0)}> Eu5Z׳A0)Y]2bU7)LOnD0 A9'k @6=х]Jx;Kd Gd/[mhD+|mYܰyǏG7|%%LEV]CtzB"zF\ Xhɣ bRYaL[ɝ+'䇎)xI:ҽ,y+g?+Q6LD=\4xB $Eq\hp>C> 1yXw|< o >߇I1cy ޒp}Lb9،΂QsD& aN.{6ufr<שuUG"fE?A $(7hI엤´rHQ"[U:Mb6N;yV%HDdfovIjCU%uCEP PA{=س{0 }Ih+ L5 /+k1 M#*L|F:>)!UVĵ (k &Hk#i!k`jAMݞĮeW mp'1c 2YG2.R`-Ji$@tRI `?w>e.[1SsaP֭;lw[%)~a}G voP4{"iskR^ Sp%C(t,{vF7E*Y+ l^9i[fòI=AJa<6:6hІe6_:W{nvy|"gOb"N.Hݤ ļUv-̨:f)}v鱇|oB+e\to%q[Otl`&&>AD}`SaۖH,̍&i7DŶvNαB<?u!!Eǐ"OUjF|mE)u_)2 t&RFE݋+DͨP>ЌZ4#h`Ɉ5[M6h")j+W1hյ=nI7yX / 7/Wpl -*yQ5Ou\ynrt(B؞ a#tLO8G7{"}?z"0sweW"Vי1M_ ą HVuiCkrsܙ)PnJ']*=f iDj^MWV?e iAO`2%qu)K!`h>H{Ql5JA&YTx_%|8^qJ&&6ՙXTk%R\=zF} ȆonРvݯWF,č>e /(C @_"*+E".#klHMJ(J}L?4I}lUAkyvi3^ۆZ ԽD 6)ppk<:e~%5 WHJO-rƊt/MSjG)C6a׃ʇĵθNqkۀ#riBK T$b?3@qa#i44YsiR`mU+;dM8ِnZ1"zQ %wu~2:TH܊}NT,f(xS(FйI2OX,_zSX%-g@ k$4'0U糟=p8Q(L͒kk5S $u_MˆR.[{e-O.VxŰPT j;=u-n>Jr2"\KeC -S 3kC #Rox߽ MxUbC/̂%oHؔz~$[G7thү~'pQSWluk6ΊOaVa޷d8ט{&"զeKK͕M|;YE 2>r)s2B7hH2%h#sG^:^U@};ҲmK"cfwأ7D|{dp^ endstream endobj 227 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3T%+ ҁ8i` endstream endobj 224 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 12 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F22 110 0 R /F72 31 0 R /F25 63 0 R /F28 122 0 R /F23 113 0 R /F20 119 0 R /F95 66 0 R /F94 60 0 R /F49 16 0 R /F54 19 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3424 /Filter /FlateDecode >> stream xَF}B' v7 N{,#q$ْ8a[g[<Ļ }UuUtWO#&uZ22/DZŷ0Ҥ(K؃g_5k^OwBs =*2`jly6<χDu{0_ ŧ#ګ bvCww{MVJ\^w.'u[݇47VEQ o4+c/oք)vD2kVD;j4{>#P85.ɳIgi=~mh!/ɴ(_e͌Q@_qnl|uцDB6I ux ] _ӿG<ÒsО!E+PVVCYYknxo-/úhmE@Kt)T]Bg_w_ɩ>QA($ _)U;N <4/ԡtSɅMqXFSe9 ͅֆ^_<$QFv(=@2ʘ C|x@|qldt8U83!IM}2=j=L+_^Kp5JqՖ;r.t~hG-լfG <biFRH|.,8b_ >Hvjz%4TfC3qiE&m+҄BATRE,"bfQg¥U=7~,*,u|:ݒwKFPk/VZE, 'U&9 K2-ֲlRwD678L3e5+.%ADFlZ !qD!IԜG MkRmj>Y#O%ihC=`;sbYBh-gA 5lH Q$iJGWA2_7ӊV]LC rL VGw\ XRyU""N{Rji7$/klwɵlXrYj(nt߽ rmW y'Rb ۳Sc bmO-iݒÄˊ4Q,I$GǦ$@ HK`_9<.¤i:¡G, 9x#˖.o(Ko(l kKfOf,P8OZQel@pј$Kz[Ws#nT;yU`P-Y ף/h&h[캍1z&yBb=pLܖ,ЖJV.ݠVĖW4R;ps 0v oPڬ#zHJ҆FguL\t8 TTBD2}4qAE#Uogl,2Mau,l{=8 +7}w5G!;l úS"syS꧱AFC*[k|>o=8_{/ },&M%yI$̹Xh?sʎ"y-.Om^kЃ0ڼ䜺|(Quykߚ!4J04@3d*0 ϥ9 L{2 `,Ϯ5i9[Uurքc;HZKX\2NH1%Q^XTW13p'VOfVl8O+u?r/sWAr? H9[bydTo^ARvzlw{-#q {|IYh`kd2?ƐW VK8:Ny8qNPM(w}- 8_q$-BbD_촼#\{裛^\w}-WC)/LR£A'tI{N6TI|X!(T_9<)@}*U~b0 "C\jl"j{"S y4o^oIZ4suU ;8XoƉoZw8M, ӌsܐ ~ f?F?Ę򈂮 8.8NrX{^@SZw^ O﬙+A_7W[f'O@ `h`|:[=Xo`F/g u6_~`2_NuúupQJK.'}R azX f<F G;ˌΪhyC5xjW MRB b5k>CQv{D{.[ ,MRTMgAM&*jNܛC[M+av|gU"m|jmZҪF09ƺuW%t MQI?T; NmDӵ;VHs_LM%>qv)~z9=70Ʒ\|w6^,}$?]_ endstream endobj 232 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3L%+ ҁ8i endstream endobj 229 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 13 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F94 60 0 R /F49 16 0 R /F95 66 0 R /F54 19 0 R /F22 110 0 R /F20 119 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3109 /Filter /FlateDecode >> stream xZKsW|*"vGrswVFbL G/`0á$+K%ЍFL6YMg.Ͼ{WTUzrŤ\.&otڻfZ?o ww]hw8z=v #w_/;'Ye-pDĴAg89'3aL#nݹ)_ȕB =ol׷4Z\pڎGϑr lƪmT جq,L 4qM be1n$ʥrtƪ ǚ(rL0x)6Jі%5[.Dw*r$Mr@S Қ1T+?C -7B&ŎTqn <(ն@rs6̬{-D[P|IKQCP.v$jV4MMe&5MY oY@1/ړ{3d&` Ֆ_AdMC6_q ,CЂnq4ulq @cA|a StMf؃*;?>GZfWTTO?e>7h7+y+^_7ba' wC/w`u{ʄĚa (o@'gm_;{AKr7OrzgLd^o1jt0.={x|аh7گj$!To/čAZkttD <WoPCìB<E˜\2ұ 85e;=Y5?I{A~6/$-s{g G'eNBm$:\^7vS035\np rо1&=RR#x7vJ6n9^Sc!%|h)?c͟!vh FsKXkC܁ !K$9mٵ$gYe+\F:[2^>@,sۤx"瀝ÐPI$?v^e ۑl!œ,a3`pf<& {yc) H< ";U @pD?5>LrUlYrkw)5=;VUw.]o@`7݈䮂OMlgS2 IlkOT^<#~8 ksQѡ}&DS^na+ð~:$8<1/ЃfYK4Fdv-#A*x"7u|RyS(1͛s%_(*6QPXBW*)5v썰KyR""##'؎ٳxX&hm}mJjJ_%椻MeOQulwzOcimG/5 J3=O+R؋B %l~ ~CqNx|j(cU!rsAXj E]QSlX}j<(kݑgoz/Vcp2WK<FWr}Զ?Ԥ~QmR?#gEJ|FElŏկLdO|[_б}8g9곖1^:H:10 ؕq.!g5^Ja8)<$a~C&QTFBk(cPTʿ`?D aРdBA l4^ChMU~s>9AFߡM}D{W$SHe}ƟEO"DV% ᰦ~K*3#R; B+w{LT^|ՋZiv <Rx ):]JӲo̘]ʙjpIBv;N/gx)cڈwoUjCJIcЀEU{xlc'2 vh}D]-xtP;&tە ,h CdiTDΖ{^:Or|yCb7{xSRڧKa:l,|c "skםS_HyO $bR"Wb ]< G?5} lqǷ"'bB0u@&MG\'}C LpB̻BsDG` Gb4*#\e&:| ؓO?iFC?X,.A9BiW%zIĶV@%YcUnϫ\=߀c1!.KT̥)BPpѩZLK.->7nwQ> stream x3T0BC]=CeUegHl$TT@3\%+ ҁ8i endstream endobj 235 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 14 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F95 66 0 R /F94 60 0 R /F49 16 0 R /F54 19 0 R /F22 110 0 R /F70 28 0 R >> /ProcSet [ /PDF /Text ] >> /Length 2663 /Filter /FlateDecode >> stream xڥnG_AD1W^ ]A`+'XPE*ICʫ|}Ӕda4꺺V9Z_|FU#U]٩ըUjTDZlYM8?'jgxQ]5-v2֌~h}u9'݌o&U=-1f|lwǯg8yć0g݂g\pn+6$)a˾81wH2 Gq^ z"T(+;hڅbzkx~-r2z◂39DfQK H .pcx O0 (gYFZyn`n8t-B8tI%Ee Q`Ae ckM.t-i Cav>5MEnc5lb,璧/g>nuE70VG!6}R͖Ol.|.t艹*=-I s)ڲ7PICp,%i3+' k.|7<3VLl~k֦in14b̝1?i%AH`EqE<)g B%H JmjMfB8ЖAALaLxaOC<-q]r ĕxJ)ed |? VUY7#k&6W0~=u6ʀNKpy;qq(l+㖇c.\*'CA +4vܲ!-[ 483d:L4M̂ >zp\sTwmQ6:âp|>)a$|v>ҶH9-痌Qvdb@8Ki+Jmr=i%3إgX2Hñh0 iotfdlfʌՙ&3{a9۳hk55)a*V-*j!"VSĚ#[Z<&gJ}o(&5fSX%c*/FId)eS?& 䔥Ļf5@BRD6/R)*6{J{ZWO:NSaT^=L#korLזdB%hKvGy= YD Ӄy# ܺd<9Šz+Wj0A3GnG!c ߭PY̗٪先Cu϶ 4(G]KqŴ<'-e҄sdlaJX֒AD%N%8^HR99IσJg#_䤊r R%>:i*qe}dH0^n)S3p [hx?u+_i=1g\s.6t(3e3pz/ ìɤ6$VU.ep "r-N' ^sں VRU]ԪJ+vޔ~O^wZd˨p %.>md6Qڤ[`;?We|< l8-qn\^(\GˤЩX5=Nj|xuUdNzfq䣶M\`}tSNpN**jl˥M4hڼ9*L%9s<[@x8!jZ߀sgs6wPzΗQl;v"O}xؠq ה"=0|KB{2{߃}.0';ht-X|H"SQDEy,?$d<*TQUáz8 Qˮ’]xa*qT5>ϩӕ"tiYq_ Ut endstream endobj 243 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3B%+ ҁ8i endstream endobj 240 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 15 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F94 60 0 R /F95 66 0 R >> /ProcSet [ /PDF /Text ] >> /Length 2177 /Filter /FlateDecode >> stream xZo_qp].CkI>8AAQ'%:Q }k%".r83;Y- ջ-J6j۫EjtM]l[l˷+lO{ZIo h7pI`{,ueӫwz(r"3 .ƆkkbmLxXڑzj[AZM/ /-y6"O=\V@ AC"qE:U UҬKMGJ$3%)MIٔOIPzjB\A)њIZHWJ'$=$)) HOk;EpS=!k\6ʚVvF3f6>13= "\6meذq32vffj3QIAVєIדI=MRzheq!Lf#4eZdN堜T#V)8->Řިt)c@} V5X-3ikddtu&͌Wv&.hfY6ӱ&NN -onx*T N~5Px/oivʭ48?K o'c[( ;1q&6A jC\77~zŌMtvwUdW1ڊNcW=)m0X= HGT+#w\Whݝ#s~jԦatG~9X ,2&b&ȡ3+ S(oqZG/$$pITD)E +@w޸yb"l a.pT%nGbHX8Ymn A/BJ/F3>4= [9TYWUZ 뷳 D W}E|<)@S < 3Sd8oV^ eU," >FT (d}-ӛ=Ju&bK6d`17􇉤n Έͧ;NP*SmD.onz9UJg6& ^14os:D<+ބZa"\DJ&P7]byKi D1S1D jD hAe# @ L@69 Q L3<TUE|SKKu\۵y UAw(&n0cIh֗Y7X(۠?)ЊBFF #Ǜ&(|-]Uz,M6.sI-y>hhBcѢB{ߋ:TV-9VoPnj2sT+'= ĉ;x5Wd᠆8GJgnT<@-Iv ȓLϒOww'*C!YWkD@$(8[U;(oI;0+ ;.hqZ% Xni#i=tRWPAM3`]^K*V %R_DzX5}Åq'G)G!+GF̌^-zrq$QăJS۰d&ھW&~B0~SאJڏ^$Q[ʣ<o߅e&mB@)15. w1oni70\R+Yz%"}w";a>E1oޚ,(q_Zk,VfԢ(HFMeMI,_rzFX0a ?z$0⿐Ax% endstream endobj 248 0 obj << /Length 62 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3%+ ҁ8i endstream endobj 245 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 16 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F94 60 0 R /F95 66 0 R >> /XObject << /Im3 250 0 R >>/ProcSet [ /PDF /Text ] >> /Length 1462 /Filter /FlateDecode >> stream xXKoFW=QEs|h:-ںJ{pz$Jrj)p~}J]_j3~Ll809ONU8*Bu K0I0_WJ/NAi8J |ٻ 7gFفk[DEfћZWI^r Ӵp*Mu˩Ij:3Ƅkiqó叨Zu%;x{KJbGgI}[eyƿ`xOLb~?(m@V,X֓/(U:!aDg%?&xL~N4sgͷqJ6\avGvNZCJL+bXuM>TwԸ%wLMW_ɿeQċh5hZ< װFi\t2kX)g9H*2")%`!?2SFj7 ѩ֜ JzvFo5ҭm1xID eoyURoE Z.eGy(inYj "CzTP1y'0.Ughopܳx\unjWE< !~.?keoЧ=tCmyG:,ǔW q=>C[p{Y? ve4۱~'MP<p"* T=NÊ*T񡢘#Va+<pM6I+!=ɔǻzuz"^P7đ ySyiW58;As#pq7w,mC%#AojC ko~c|fŲ[TQ0 ~ve}n.xlH&b՞7q}>t@SX9ODEpu1K$tyclo/G*5(ӲYJ",8ovؓ-)gtY"' ixpvCH >wC:i) wA{>h>Nĺ[ mBGF"he|V(L99aNĵ{w4ܽ_a1}~ٴ{~as{e։F'14*kפ@LT%PN 6Qm5=g Sj&˝4Y\VK'//Jv%6Wd`p斘h3T]3z(,fUXVڿgPatXX#˷pΪK-LS-_PԚ(_2F\l<*?h) W'PKm1ie!Z?<_s %TO3xrGjŨp8$+TdSYd"(I4ͭ75o> /ExtGState << >> /ColorSpace << /sRGB 256 0 R >> >> /Length 29426 /Filter /FlateDecode >> stream x6q?W.Ʌ?u_fnf! <DIH0<2*+4C͂atEuGtwtVU_?}w߾[yJ/ߞZ??}ww?'^?;^s [a_'?ů~}?ޏe+嫼[sG᧟|v?~/_~_|Zۿ~_W>{?rt^~RϺqQgUޯ 黷|~~/)γ_}컷olo]>woo*~[[/]l%]fCN&}vc\y=gϷE">ZOf#vg~hD w1M>Y\qj>p~o}c^cKV>G ( Zjm|_S|~+]{{8e*^xΟS܌u> ?;d^mcvx߮7K~́׺^;;>>Ϛy#*etgg< jqw0^Sƾ4736-g$0>o$[ >zEG<`aor[}tR:}k0);v3!\ JJ?V/HZ2q-}L6})0bLm-72}I=:n0>U9J}|fK\.f|-od8V{2S\xGa6d|_u9FJ+K~<|3:)Sl4 R:+yulR)~lj\kj0% 2>x>}>9(9<ۑ(/2\l1b} 2|:۶Fq7NJ{uƛ:)fI)JGF0jEF'n}ddKcbHCiT˓WH=H??s}] W6d76#fxd<ϥQCq^\?t; !Oܖ:J| _J~p}e6ygw7| y~W@xs:vdV]Q:)]d>aO#^R*ݟɖTIV|&7#6c%20w<5Ͽ tqJnq-w9 #P;hxwwu\7}(sw(a>[Hd)97-$q{o;frzwyq 7^m-xȍ[-xj #:N79ea0;atɳaz~Wd1+x^lxޕ/!|gK#9JgK'](= ǛRz(JJ5*)u7_O+xy>[w~J}^[aĈoG7xmeF#-!膽Rka(1U*x>< kLGp\ۓ\4`?azUb̨{gKȘvBsKmȨ(PZIt㟿\ϣtR:!ltǽt)nyt55R:ds{Dx-&KC`? #r9ɫ_b$/itF})T*TBPR܇R')n<+zn1bX n<˝'LC7x4xq(uw<}4]ؽe2;WHŷz:󷾿 >[:)u7>7э7 )9qJJݍut=f atg;;-[?:y"wCO#N;bقaw;RNi`$/ S 3ywH^V?m`$/0yrFJ-e]ܸD$O qّ.ܸϯtnO@7.|mF#m<3t؉A;'vaBA;Թ@ JQB+K^u R#}#y=&DSÀH^tG?[ x/b(14/tGH>[:)HH}h2JG&JX2N7^ƉL|)u77rqFY\ #3!2mO%ObRF9'BJg$,JJg$Oga$/;bFJg$/>@'~%_xNAZ_sqۍ/Ov_x2Fv ϣ4RbtR:x~-wXxTj;,[ᑼ sKyn\7_0)u7.;1tR:|W R:BCdHs-EzG-:1ER5dw >ȘrFh|C}dQ2f$ss!cFFHi[c0:)Hq BJ{<_ؕ&CH-6().yFJmʣ)'L7pӄ0ކ WanAฎ3sgnAco1bpϣwp<.="yg&2H8yw-_!>'o׹EIvFJg$|-< 8Etz~ p UoQ%b2/|w[)mn|9vަ󚾩t'al`vFx35wK}$b(1A4oq)5Z*XCdtO\%1 Xf0sO2;hx}*y9y%wY;B{_!>ܣ+s5'U7Rjt8O:H=0b瘑w<q 7.-ܸ8ȍW?Wȍێ穑W`m',Ŝ<33Mb,!?WR}ܑ~Dv#Jt)mtF=𳥓R2H-!ݸo!32}Ѝ-FJ-}э#$n<[ >C`}Q;R !+o2 8u RwgR>Hޛ:Z(}.)x\Jϫ=[0Z{ zxkNo1bsIiY75u Ra)Fݟ^ %F;2,s.p+`1 ^ %Ɗ=R"y y9NJ{<bɛ3\)tر9y %>.yNzCȍ; aprƣ>[ЍKy!%V(0vw˙KP:2(uzbwpѼBJ%#y#y}-0blA7G[Ѝ^!S(Eɍq㩣c'm5"y%0Jn\ÍsR =:zݫkϯ;XD4F"'5k*09[H^Z2)m\SG#my\;NJ{ k\ҡx+d<;"y;ۯ cyK'x&l;NޡwӺdz !z褴<:FAJ}N^Ff'#0RjؒP3#ӊ dqMw0,0j9on<|G c[0;۱Ǟ<#C~%i /2q1H{+d`$/p-ꂑ1as\`$/p5wH/%%PȍK眉"iMBJ/Bn\| q 7~Va#5"y%w==w%=wЈSktRVמb$/[ݚ Ru[t IBJ%FkCIFv:Z\KVrnɯ5#7nfw6ݿzC`_3RC`_4C{z}; R"yOҕ'Q)9yDj" wCOJJg$OsmB !#֝\H{St@iqqɵ쳲7׋PbDvsbɅwC̓ p[*yC6$C 'V4oZ&È_VgS֊nea@$/G#-֝G#-fj#;"0ztD Itrr*)n\ڭTIWHWך1<aw쁁xYԆ!\Q/#NX\#1ñtF亳F&!TPz)XVsJJo ߄zttClPb,0grG7mY9FJ[(}sN7N>BJϼp$L1bĹ:yG5uw{@xΨwA#?fpQ~ ; v7"y\ #F TIto`c 0V$CΖdRj)n|٩HŻ8!72OZօ%72O#d+@1L.4FsvX|d #(L ȰߩwOFJ= ^0bY70 _yFJ[|WjK'k\}T#7n&-}Rf)pgTW&<#+k6%we|Pcz/uwY$\;c|-Wڹs )2VHĈDsQRV<#3`$/ Al7x7p2v_ĈQ^tٶ 3O.ЍK qq'Bn\bN^OKJ GtFF;Q&#޴ ;Dŋf!3DJEI<7btY`$/[:)qwNb$/?.)s|\2TIF^ɳ5Rjnc5F쑑N'{5<+;VXدsWXbaR{11 c+^,V; !k$jEIݹ#+O^KFJ-m5?@i+d߶b$/=ÀH^`%QTx{l{;yx!@w$ҁ!*^9Ww})]ՠ_ssR\J;2O*R1^SR 縣 *^0;&= cUмTb|x1VŋT"xҝ&e_kGtFȳRϽPRV'H<dzn< rq۲7Yce޹*e+dfTbUWy.ƪx!gjPŋv UⅤ#ܞ_8E;?̠=1W= 3vϓc$/ GGG7}r*tsYFG7CrBJ?x<[!*PR= e \Me 9 QdA/8rZ<UET"&`Pŋ+aҾ2,'cu$R0c ^6HET)usVȍ;s|p قn\b̸%x y2YpPד!*^̶6E`ϳE*^C \nPŋRUJE`"y:4C1ؗ> Ga@$/?r{Pr %7Ƀstˣ)r>[2L'}WRI#b9*^g xاaUȈ⠊cU֠j7*^UB۠BR:#y-|()՗5'oj|)X}<R0dd1"+Ϟ,>^YyE(̓LxGh!(AVŋhӺ_E^*TBVŋ\)T"ρÀH^`H^m3)mQQ:)#3!JdUГKE`R Y/֑PŋWeұ~BJל<tF8EIF^Mn%HH^`px`k0b!Rэa|<)uW>gK'ee~Ay2=)TB=xY/x!E$ UU"W UQ4JpHo"y}1V9 80)m}fn#stR]:)]l!kΖn֓ĈKG#-6/eA0)2\ܸq=05prDȍKO\<)+E'd<ށ2OR= QvJT"χyU8CE`?C`_ x봔*^ߩRŋh(Hi̤Ii/\)q/Ytۛ9A7xM %q+ Mq6(1[}R<W7*USE`!LawRBoɋf()]n,TW1H-?kjH^{>tぽXx;_KQc~4Rbɤxv3)]$vTxKy*^x*^hݫkwFӋĈ*{=RŋÀH^;V0:)϶{3Vc? !Ӎ%x`/ 0Rj*^q_n<#n\W7<T"(k0bXAWŋMTBWŋyWxE*^xӕ*^h۫k߼JJues1RjFEc$/J |g'Ԏ/n<;d|gԎn<ϘIq5?ҕz ̄yRZGAwK)zU"(UEoj21vrsTBWŋ5Wxx% H/{ R[Q:)#g:0xR*ҡT Xz()՘)]5dTȍWc*P<93s\ %FT4ر-}@ {P(E *^vSCHḎ5URqϝU_Z\#yd1bnѫb$/q0 apDTɍk(BJ[UTɍkdJ'ue}y2AS<+dVTxأyQi~Pŋ2"T"JE`~["y*^Z WBhj0:)LަsBJe;IJJuΫnt0D-JX[e | 0<WawUBνoT"*qF xQŋϣwssJJW$o3x_y=He}1%"y=Mn= ^)7x`Oz"0b8ϖFJ[;ttR:(R:bz7e 챋7T9TTdwu[)Uu0;تxy*^X %¨Qŋ>sX92xaE9 FgM)]Y5!TTTU7Rj+>JE7؋Cd(1VtTx`OWx`wܸ՝<(̓zF/{x[/>F/{:0;O/ýO/}7P k'ODP"y=MH`TwGk+w\k߹2O<32Oo<#ˍ*^+:UO %Fd^8OKxaEV6xaE1xا褴?0fT"r} R:VmT*Tw8 %%HAJW=$y>nZx{ƿQ>$C3Rfw=ݸQŋ.zYsA/H1}gSŋ>+D$È1]MK"y}Bu Ii],U!Mȍˮ!3RR-RكbWd&jF/{~EF/lUhuB/ߵI*^^IN6wU <[!VR%'/sb$/`~HEV=~kFnv50ry#qY E)d`ϰ:)YsUc٨E`GsA`gN^éxG*^wvHLť/ [k[Wø#y 0HWV~Mz$T̙[:)1f̓[)]s})X8z()b9N7nmϻ[Z,wX=q{|se֊%ޑ﹥RwFNJ{< #ys:Jl5T"+%cɅ}PAHf`Ʌhd-AFy(oQb<ԁUV(!\褴{}2H}[HuɷzHž>tyFJw}.(PbZȘn-WbŋW@wscŋ}^p2 sDQ o94R0tRcm&lt\ߎnܸE#}Ÿnv>ܸqzxawYgnA/j_#p*^\g!*^빎/ԡT#/u=Z:OH^`9[`$/z%"y-[{n<_Ӗ %F峥{f)Rc&o$ÈYΓ+^,aw(Es _FJ[ޣ+^,o;\-{qICcy.FJg$yŰWŋ"y}vi= o "1tH^Zr}T@;NJ򸹏AJGbEFxɳt{S cy!T"y TIj})5٪p'WEƊ/*{ѽaİOy2%U!7'KI+#diaêx!yG yx!Dw1h3;Dŋ*VŋY^ž^"y} %FD_Wў=/*F_FJ[LC`Y./z^&CVXV"yݫk}@$/p}VHi[Hi:5utRݰ"0V5}F<`H2=3RU0yraxjXbaO%0bX}w_ǴatR䝻+^,%{umIzx|*yx0bXB}whBÊ R*^h^%:RH4HZ]}$aɓRFn"w=ܸŜ7>1bHqmjϖFJ[G2:)n|<C҇AJnaUgl< z-3/wx*cyJXG:VXSfnH^;F1}AJAJGb(1bMuxtKxQ;x|NJ d)]/URXbajA#y c$/"y<#tx`a4Rַ &gn<1H ̓g;hs F#-NJ{X*ktҞJJPRKi? #8RFbp9/xTt} 8{rs|}w.0;Y5}K/ƪxLUu׮< x^i9 %9Γ*^sU x?>Ȓa0o0xvx`_)Hu#yNJ{Dva4t}geҁ1A'X/rpPŋ1v$@/89Uq< zU:U|GUuŨX/rh9 we= sU !7g^ R:#yr9i!7z Rsa)O~_Og͏g#㻿{/](z/=uyfl<'y|0N.vt,|1@Y*MƟ~w\?'^ޯ+N? \$cvC_?y~?}}dٹ??{}~T1:~i6Wr]K\L<Ƹ]XfT$zVm [f&Cz\03/F矌.~ϟlx$_]L. gw]=I?]~u.^To??}D(tW^s7ϙO~N_??_~~U憿W~޾#R-_ώ?_?wǨ1!H{鼘~\u!w޿?c$кW91,R@8)XU^i/X2N߄ioaM Vxqjv{a8Ë(@]x5P˲Ͼ}.$;HZη7<%e:Ͽ`ⅦFh SXqN[ f{Onkj_九iP\|;濻u_OGx̮[~Dw7}Wfq뫬Vw=wW=j`Vxkl}g ^qӞ^o,NaF.qS/>kiYw]H90M&?C}~3#5_ym~ xc/ B+1^οrwaۯj=qzgh]AwRX'>B{>y,͍Ѷ,tGJ?2^l/y*47ݱރ. ޓ]'煮ݠ^l/ԿRF;"v1l>Ğjչr$h/>#;fav?_rA?._QvO(r2h//ϧD1{Vh/ϧD^?Cp}̟wخOn>_@{E3v O_E_T= G>1dqnop wޭ: vւ͆ zA4OyIdLש hԿGvav#i?AZ+oԿH^t:_Tw]V<{@2(r~\l_Vy=ݭGDD,ľ W񸊚[l^WP}h [;u{>y쌫W_2_8/\()tAmw;VٞUWy7Vп^ ]|Y w?=&+W:]֣>[. ۋw?/CnyaW Z߻oܵm`{ʽivn޿社=.^x;ORBmG ^Aj_B+oԿ~wY'=cvVձ`۱PJ+oԿSA_ M' >߂/`\' [F;_P%q^5^ PAꯤߨy]}ċŠRVS; 6>] +&~_l/xJWXcO_!昺ߡ o s =5׽};>-n9 p_aQXԿRF==Մ#RUbgc0ubaa{pVSI|ݪ Z?^>$[Z {ܱBc_s>Xת^+ZطJۋ'zh'Rht|^jotkOPJb{kv&ػ~9_˃=k~+wThUTȻCz Hر wy ܭ 6=[ N׀_ki}4i}!&C@=n`A{_a z +z}tO ͕gxm'_RջU "_5Jgw;\wk;7FwZu`Zv\;_lk}/_sk/I .5@Qgqf], |,L+p>4]C|?,oۨw_u+X;WܨsR>Pw*, zEQb^Qnbœ:C{ \7+v_]j!ߓ`+A{:ZpEu\j$fEZ !J^Fh}Q5v+}}mpA~5XvF2Ob0-`Նvqeta OJݍ?WW6lk0MQ4zPhPiخ/Oz~f~5 ׬yذQF;t|yQDX+C5]df M8gvFKk>Bo@@ګ?'n/Կvl.}1ڥb;5<_\";{k mWK|aU;|aەö+~N b^Z+ԿultA>N|My󄅷*jh_'g zՁ!:pܶu}`) }3RBse0v[=m VϽvw!n?*:QN;t|`c 6jqoqԨ{`rQ2nZuΰ3ضZleA N:vEǬ5/Ru6۱_U/=j/Yg1fWcŹ \($ 'W+hd[W+cg^{QnvkigAu2nuݼzu]w?4lW:Rm lTCl JD5m C|U r@Qau  '~_ 'Խ*47jk.Wvw E{*4{z|yra_4QAڕCkޅ]C/D+oԿQMл6x rM07۪)s]L%Do<1 ߓa]ԽkWL]wm5j@;^m30a{ؿRmueSE}z$w2YGJCaSCPloa31 _y_Jg LHG`^. e&ۍD`XtlԿQ𯳐!<݋Wޭvy({6]{ű^ac;u}Pw lJ.yPXo8pV=h1؉/6SVEo^nUkkεwc&O嶎 ۅ$qaW̷b{7ߩ?8>ΌR03`6C{``힄;t|Baw|+F&}x6wh܉/9ӲSNutx3y:7o`w3XRF;N. *CbmȗF[0%U zW1b]л <G>%]H31XW}0=_uGnAaW}qVcfvq꡾8P_z/N=uv>=$ϧPe$ll@ VIwo?B{?vtVLdԝQ`,oKT~gAteו ~Aw;\Wvp]uc׍ ֍>;~A:|07nTn>t/*X_Tr }Aժ`}aqg2hX`8zwNh? 7<00^}c7Wߜ9M!UʸSScyOs|.1r-[PN.,Wl=[=д`HTPtࠀ7 wC=<;W-.vmxW\qkk\6<)qq }۸:} }x18o018p]4Z}ڴM8|Vz<@ ˵*W slraMUjM<Ճ7U5$ڃuk;'Kk сkի e,r^Mlz ==*?U5,O\A&VҭэgF/; c^{RM\ kQ;^VMo 7lSX6篍_Q{0CXJ,8as%/9 W;&vOq eN8 U!W/>nk4L⅗oҽѣѫåjwQ̽\=񭘣\M\M\ NcWs5665j:dxpQ3Vc֜j&WbĊS wob}Q\ԅu41uLĊ݉mv~|Š@ Utl_;_;z:L\քat|: u0$^$/KaBoڰM+1X0Ou,7WE8P :6\+}J<]]HF7Ey5 >{ݒI\d-w*dpJ3L,_mZ[Fx;b^K2A;ڃ &1U_dt^hטijXi܉WCO̓yY8.c>/Lbi|W_nڬMC뛸O{'wK,ui|m|kuK&q\;$ƇMQLaMX]>89yx:Oė݃(l&NrK6aZfEa=P6fkbX``\%4Ji(aiXzgPmxb 1q~?<Dž!&Ʒ_:s v.&h&:7FC΍sS΍$^; w{G;?(s>x4A|^%N[|oBcMNeÃuk5`\ 0q/bLYϗ ܃ aE5+M1hU#Ɠ}`qDA<Փ,@rܪbp֪ +L5 mL6mU&5LD?Ѷ=a@;Dж=x +BOLNڶ_7nί*J +J +w Ǘ܁.J665RwƇ |Ʌ@}o԰b԰b԰btİ靸Fv~;>׿x,쬯v~~_ubLbx>5> m`۴6>EWIzPrOCV!jkȅBTm";oџ5 MU6hMh2j'SQ0f-ZvJ]HM٢5"5e֔+1W;+ǠY͂IXeZ sˌ I0Wo\8454Eij-JS[9)C[4Tmqeu;q]9m۲$F6K+޾mgmc;1Fwbx2 SS[5esg魚?kݺk}7>-sgٟ༡6j[༡U $Ʒ_V-b]XNyuQ 0kajxpn7n[$ܺ޺j]|xk 015pQWd%Dׄ]Ækb`g7Kذ=k<;ߡ>u>_]_?~:rj׏!<_gܴ=Gܗwl>Mt/a߷u&^S_۟#/CXСO>qMZx}]~@9v>q-r4^{&lȃem){~է?w_yx_|> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 262 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3@%+ ҁ8i endstream endobj 259 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 17 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F94 60 0 R /F72 31 0 R /F22 110 0 R /F95 66 0 R /F49 16 0 R /F63 25 0 R /F92 266 0 R >> /XObject << /Im4 267 0 R >>/ProcSet [ /PDF /Text ] >> /Length 1835 /Filter /FlateDecode >> stream xڭYoݿK(# x}%n.4DNDՑM65$%-j3|5"ɛ<$FR&H3ʸIp^I1JgkQbz2!KWiatz;yX>/an2y\u(xQ0)uP3hxwH]d"K+ } s+dqѮQ[AƩK\X! Wp 6TrrRga:n2 xh<{x+y!ۯѷ }=`*g"Qf jAÓS#.?$$zF"Lyq6P2&, ؑuM{#mK^40P)J===4XzP{ P!7![6By!c,V[/抧aLYZmkNՇ8n ۇȴ?Y j,t%D Ml(Bڴ_Hl[ sYƹjE\#ƌ_^ ՒNB^$qz{sD-4՜duۧI0;AJ_ppͳDH&PI}@W i'].m,5 3%ȹ<̹9S0 WҢ^gnЬۨ *'Pd*L']aU6l4YA ʛˮnr:A.G+"+Ð8l>g>oJEciƫwZkѸ*sپcR .Cb؀\E..~0g>>I·3s:$E ~ Ke%>Ԑ9Z*#gU{TZyjά juд!i] .8D\-61GڝHjg)W^^=z}o>w(5BtՊ-s,u蜠ZoZztz)i  =rEOj3H<}vclSջzFjc=х}jml,)(VsH)ˈaLeG쥆DfвPHocLooP蘭K CEmLH[Ins=5z2Yw5O@2g%) )6]W> /ExtGState << >> /ColorSpace << /sRGB 273 0 R >> >> /Length 753 /Filter /FlateDecode >> stream xVMoA q|\CJHi@!!J(IՐ> =ن` ׇ9LAc ~[\߀ T_ e=@^zӃZ-avr:KKsDeXT9^zAZ?k1ޥ"3YYݐyIA4cD`QVD!-%(QE v|"V:e0PJGڢE fSS%6}(LM;F}Z6Uj"CΚcŎ=h>5ɽ[SI[@UfgΦZ\5*o= ӄ=7x+Կa%3f-*t-a]>:x9\CtHq0S endstream endobj 275 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 279 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3P%+ ҁ8i endstream endobj 276 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 18 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F72 31 0 R /F63 25 0 R /F94 60 0 R /F54 19 0 R >> /XObject << /Im5 281 0 R >>/ProcSet [ /PDF /Text ] >> /Length 2442 /Filter /FlateDecode >> stream xڝYr}WV # mxSq$HD AYӗ(RA}tf \_v 3Qf\8Dz:W"`?^/9djnxۛڔt& z3Lh cCA1巡*j2T.<0Z'3MŲJ+luj7d ۚ[+l[5fO*^ijlTK sy l QVa]1Ns"r,u%j|هmN)lUnJ'Ywx&ZW!%>˫f'0eUt3N7h;Wy@yl}樻2I= ifFA;U0φTѴ~)J-)Y.,PӴ0%Iʸlm}?|tl so.*)LB+ӿBsp L-aP'@Jˏ˫_9AUe"!; Ue  hwA[/C6W)F?+ހ"XU<1s$۾ :Khد0H S94}U( 'KxFXxhӖ;#2LYycy/V MdtoHV+_:Ne{HUaoR!F1j;qD0{A5=JT򡉤V8X-Ni 鋗dJd´SR -5J53A˸s : %L^POc[y@Ka\Q%ta= 9)+@pYh K+j TXkzU[fG~ϋhb_xYjm3um>s4AӾax62bQ *g@K p/x_Znc/1o4650A%1څCp2ar,p*2VBQ5L5@PGqU 2QP=>>ϗ_$@i/R{D!f'81_P,U&]XȬSѾA.Pb2C#/NJ $-29niW/Zǐ7"T=prtY^'A"3# q;߃}9J*}?Sm^:3/j[E6FHލ:HYv 7J!A_AĴJ\ $@}Ǭ86g h̄fc[9{jDOfMeYq`[Uy~Ǡmdz*PFKV{b }ZD@SihlyԘiI! FL3pAwc /wm yH-~*tw*Fy*i?gV[Lz W!8MAyqD='d$^7u OR)D {艶2(@N CjU!&3&ðH) gXlpWhYY\|窑Ka3#l<֞lzm[oxkK06ZĻUo]S&k 9{[RH20@Aro^c6o4X)/ql}ԁqh{MOZ7UK˺#d ܄Lq[ҷ^UJ0A2 QGT@k=jM4fݗJC} A(Ƹ*$Gn"ڿp<| B,@Oȫ. P0(JwfY^o%}S$ )o:Hg_ČYS[pt)Lߴx%\5|=ߑRw\w9b.j#T#]κچ;y#o9ÈEs/LԸNQ̾?Pu2> /ExtGState << >> /ColorSpace << /sRGB 285 0 R >> >> /Length 220900 /Filter /FlateDecode >> stream xԽM,z73.~?6 $20<%Œ >Zb.9!{Iu|qv\w#պiFV=r~Q|J4 ]珼?2>$|%ǧwօyw܏FwiEQ|d[W#u=t?f ݲu,ϫ{ݫJ~.ν#Ǻ8e5#zDץ[}\sqΟ4LЏ ?(,#dkOj鑟OPt>PMryVY.O,G}Z|L몬\ɏ<ޟw~>h_xU$|엞a'<_>y?rY<9#IyrVgӌv#?wr>?vK~zԞ.XX?iV~Ⱦ~s="|^#?}؟|z%7iXi$?]Qt[FU>۞ϝUzb*xW8B/]%>i.H_g@W]{~X(EWy}V^>?o_ߗYq75t1骫\ߞQ]6(ϵ+z ҧN :Ogi>zjW_{>?OkA|[Y>s?ƺbyWJ_^o4}v>S<ӺW=/iU1nҞѭSy~2SW\@7_FO>7j}Wy\I}~dS߰*՞U*?OV~^߷X~^G'[7U7ЫbKA*wO~hxfXzU͏z}>e%߯B..*Rn飳>ZGeUS_5kzoP>zQ`SӞW]W|>Oe r=4зE\cOP_VJz[y)Uo?^3dκ_?wx/O8ѫ~VCc&v?ϛ˭?u y~nҪ3Yz<]j׭r >uGZ}|t[i=>z=v}u#0/]t__Hr#+^эDO=?]z>v2Ǭ?7l~uyK? IW@G 4oՏ&?^/[_L׆׆n~@w{z;֟I]u}|44]o՟4Ǘ ?|p7?Uoo_ߩz{< So3?_@a<9LQ/|>Y__~'t33Kj3^YzLIjk<]yZo?PT?rtS:znj?~oIG͗Tz{`*'@~%^U:.P߲d~CC6~ ۼzrְkoߗ_/e~cXwjO\WKW׼_RhOΞS̿yk:SY~` 4Y~M,?Ц#?a|7zO /Y~`'t;j@c|trj|ryB7zZ\O/9濗hsׅ~3w/]4߭$'7ճWm璟zGO_z=Sh,.}|zWy+tͷ/]q^PYn'w_ů|\ҴzWs{Zzz%}?\/ Mq}SoWKW]"?\2[u@?4j3k~zV{.>w}0WYU@ï/GXׂn~\~]\,W^hۥۺyRWֻOw1_)乾Ͽ/w]vxX<ҷk==诟h=Gk=Ž~/w2?pqoSϷnWfT{M]g-}ֻ&?pQo\p'/CHS6]|)Bgv?9Ѭwi|%wMzw~ ?YkKKwo5~k?Z>~v{=^nܚ+D|RV}ޯ2t-_hFѶzn? Ͽ4r~M=F?~]Tz;~0^B}hѷ߷x[X3seD糠q<?/?zҷo;~ S:~O'{J^ozE7+IyK[}=??o}?tgCG_ /h.ޏ<?P@zn4//?=}*{U1z=^WX=~tzwۛ7zhu@gf˃S}Ͻ>V{&[K.>ͯ7G~c&|t=MwY?;'Y?yUjK3nVۛu)?Ewt={}@mיxz>p3>]/\}7o)?7szr]{>i=ܟr%?Ey+KKOOygiSߗ{K>.4UrykAUoߪUp̿e_5M~ };?TotUIZ~gҝr'-ݨz}O)?՞Ѓ˪,}~oz{wKc>Ign_R{o[-?Jp4]< ?Kꯗ̧/]5~&=Uoϻt{M.=5`>`[dW%wͿ,?E^oj/~?tjM׫߳mzߪo}-KjϜο0_te?@w]/=/?5 }>WT4i?zu=ϫkBeבuguבoO\OsggٵG= њ???=_ӵӷ^3t9, O_>y>ǧ _ӌܲO~um[<~y~?گK~__Ӗu8mym /Tٱ/?{-ErQ\T関Jy_AJYKlCdAγ;eg3S5q6 ٌg/)d?/C <ݝGhBNAJOYklƳef. [rxSwlU SSd?1R UzւyS3y4CT)Q3JOY[hS٫*=e)A<#9݃g3ًSүlWUz~6Y>eAO {>3ٻ@}/PA3 QОgy@BzxrJn%3BM* z@}:PA1TS(PA9HҠghO Ti#2 UtC* P,Jn5WTi#g U홡lB}JPATS(PA9PҠGhOҠC$4蚣=wPA iB'QAITGPAО*Tiga* :O%ءJ,4賾B}_QО8r* :O%ޡJϳCߡB=C{4PoKCGPAz+4PoKC~uzҠCT4PoEm{ҠCqlUtjCVTiС8Ƈ* :PAƑ>TiСފ*=VTiСqUt8* :OJVTKwCGPA4PoE]TiС@:ZҠ,4PoE~u{h/?^~ҠCUth/?^~@{m :[Q~h/?^~ꭨҠC/?_~@*=tVTiС/?_~@oSZ :[Q/?_~@D~ҠCUz/?0^~`xDꭨCXoXG:Uz뭨ҠC/?0^~`x* :[Q~̗/?0_~`CXoE|̗/?0_~@TiСފ*=v|J>gCPoJ>-Tig*=tPAоgҠ[zD?U~4WPAО-TiЭG=C{* 쟠J>'CPoJ>-Tig*=tPA?A}Gh-Ti#'Ҡ{hOPAо-Ti-G=C{* PAT顣* PA4TiСM)<* {hOPAОJS~4G=B{fPA4?J6}[Ҡ[zD?U~4?* {hO 4vGm~4?JVTiСޖJF?UtjPαފ* :TiСJҠC$4PoEm~4PokPAF?UtJZTiС@:ҠCtG?UtJ~4PoJTiyUtJTiС@;ҠCUբJ@{h/? 4PoEh/?^~@{JVTiС޶h/?^~@{D~ҠCUz/?_~@DCXo/?_~@c>t/?_~@QAz+)/?0^~`ҠCUt/?0^~`xJVT_~`x̗/? )[QAz;_~`|̗UtJ̗/?0_~`|QAz+4Po̗/?0* 쟠J UYoJTi#'Ҡ 4Z=wPA ~4Ti#gz Ut~4B}OPATig*=t4Ti='Ҡ[h-Ti-G=C{* zD?Ut+Ҡ{hOLZg* 쟠JTig* P~4TiС@}GhO 4TiС5ϠsW?j֯z@C}C}:JPuWgљ^ BgV|:k/c#mE'K9ܷ =o֔9e(-B[L/rJOۧw[oY]8Ar20oyn'-so}˜CR o%;N9sVcD[iΩSgO_3}=tZhu;LUOr*9~}o׹z\ʹy}d:m ]ܷCvg5zuXO 9NK[AGrtGv~{W]>)&i^E[s6Fo5\ܷ\LrE oŹS;oUn 77-޹or܈i$_9ݹo~;\VrA[u.h1ΪoKz{rjO9bSJ[u.$osj&wܷs4!&ih_1X},9m:3t[_}w[ٹh:u^vOrߊo/|osBs. 5 t_oZ:ܷ|=tz,3 fK[1羭EG?C۹f9׹osVHkw[qF[q Orߊïv}+%psJ&gܷrߊ rߖ9CfY+oe\NVe9Џp.okqA#-;ܷ[?~uC[xܷVJ[qN,osǝV8ٹo)V7Ǎ3}+W\ǙVJ&e`}[፾˛r:-iFos*Vvu]EYrJs@V:߇ܷz9GYӹsz˹}+侭zx澭wSob98rL[?'8gܷ\frߊo:7N~8ܷR7\o_ji#Vqۚ;sEׇ6ZKHy5>"mM J^~ Ɵ侕xܷ29pO4"8GܷbN~}+ܷ}1^#8ܷ:'r4sߴ1}ۿ'rߊ}+ν$m?ܷҜ'?Pn?o1o}+s}ҹoVt[q o9A侭u=׋'rט!mO~Z*ΓVvΙu-չr:UܷΉ\6sߊs}+΁ 7}뺾rt>y+srߊϡ's}+i m 82}+;7 ?p[qnoڸ{y~gۜmoz}ޒ7]oSBz#9hsV=;sJw@ٹhϳr}[D9ey?o%Uޑ&p}ùo?:S皑V:3oŹ\眑}[0K=~侭Ѭ!)yܷ\Rr;m&z7rU;EۚOso~侭fmok9q|V/grܷ{"5s<>ܷ|o1~\5KrO@ߺ>}+9he}y&m_orܷҝcܷ{'8W7ϟ9mu_̿ɯVL[Ν_9o̿3mDc>йoŹy>ùo}o"07*s[q.s}ܷ=@[q$oߓV^o\-y~ڹoۏM_!~侕orܷIrߖm~s}[yKW@[)e@<˜W=侕KsVXw?UXYڣ o[Wt=}[q[z9kk\hs߼>ܷ¶HyŹo/?PsVp }[s[ SV/7ou:7}+_q[In/~ E[IL%羕9徕ܷT~6>~6@I}s߼ܷș#mm ?yֿ,rz_Z$gLoI}+\侭vWku}+[\>r йo?}+9_侭 g}lBy?ٰstNw;mo;eW}9}}'9-Mo%Mzلγ@cEes~ܷ|s2/\9AN#os2u}:-3uC8-'r2we8m]g:Ͽw.P{t}u|dƯ}^z xZNՏOUکZ?<>asծSӟECTg6C9k13X'󏉜ɮpCVs1ȹ\w\ȹ. r.f,~pVYZ;8D8Ϊ|8 Iම9dFm&p.v\L6\\L ͩhڜْ]$ypRaNn.IXžls8k7Ow}#p0's*컣Ι"$=s8} pX6SlkbuXs8{Nl4SCVpJe_N!N)|>NɴgWs5 SXg1Sqɾ88<9x\ag_ 2:ǩ͙WmHr5}wkߛŜ8 zZg7 9% g-._o8|g ŵ\X,}ap8pLu=,<U85\ pPd3Ys ~;Ca+Cv.w?N>D8YgAj78 /S)Ѿ־;pe2w_o8uN'{_&n/N~8d)7+s8{/N>|h|puc]9g~o_GÁ\ilt4Ǜpᤇ>pV͔CA[pNp8p6ΖjG996STs8aGøߛg Ngml[>5ko'ۃpS8~us8rկ?~g <~2^|7}pvێ^nV]sz{L95r8*N'$IGp8S:[2̽hypWp8Es8}+p +Uo$/p8} p)N2ْ8' 'N2M|^~Sgp=Ip;8)Mpb&yWl'yاm'SIˑHNp]u:9hI'ڻ~y'l͡,c N_.p88]$ߟ ir蟴'30 z^iG7a&i~BpVuur8;9-9WtkgMcۙ>prr{rb{9_dy0#6/sEZgK;s8ߧ\l s8Z>9Űp g83s8u|s8Z^9͙djM'Sp|@G7O9 r|[~='Dߚ)~} $p|OAWOjǫp|R9oi!s5Nts9OYV'}NW35 '{x>Κ?5旴)o.Ypp4_.|ds~p8j> ~ND89\ ~:pGd΍2.}p8kq}Zp8zs8etOV \-ip2 pU%d-{} xp2pG8̪9ɷ99R8ϿUSs84Nf~NfN(s8sUdsp8-J Y6o'{$N.pp8&pd2򓛻I'prxf7s8~o'g[}w^19Wǃprd֘x|hgS*8x~Ϊ\ǿpr6gsyKp2g\ Yϛ5ϳ%d3ާ s8p>dgշp8ag[8j'3?j'{_<*V#N6)֜p.eΦ֜Z#ݜ9f'l{\w8c37Gp8k~q;\rr8s7W:?˯N@3wY}=ا`5wq9=zrdOɛq8&dgdsp8ٜ/Nf9?21s8k~p2=p''oFNf~I2}p?pp9ur8T~@㭾 ~>~dr%8[l{=-z<n.?nl?}dsCp8^0p8Lpp??9pɬG8|Ix}N*s8{ +8\d3m)77kx9=Y댾5;po=x95?_'s4b&y 89L9OG~7> ~~ /ϗp2>l57p><%m? N~{>9IN!)g_I9.qAp8_6x~I~kr8ys<߮dvٚY|9l''s&߮pJ{}@N6Ge{1e?9va[?ߧ9gqs8 ?P}7ÖПo67<069ap᜼p.pns3}ps8Էfn\Vos879[pmަĤ~o8;IG$)Ϝ 83CY ,:A;ΡcP-Ng} =qtJ/?-NС*':A\'薢==B{ :Ou)B Qz[ :O%pCt%pCΡsuF?t5pC$\'? :[:Az[ :NСptw:~\'?pC :;pCG?txpCG?tw:A~\'Po|pCm/?^~@{ :[:~h/?^~pCth/?^~@{:_-\'Po/?_~@:Az+\5/?_~pCXom/?_~@NС 9tvx/? \'Pox/?0^~`pCs/?0^~`x9tVNСΗ/?0_~`|pC|̗/?0_~@NС :u>'pC<}[pCG?~\' {h-NЭG=C{ zD?ނC{ :ANgYouC zD?t~\'wz tQОu=~\'3C z ?:pz YouN='pC QО-N#'pCi Su8\"{HZ*E(M묅7Gٶ0<2V=P<{n:kPMi'\gmz@4:kspƄ<s)a"P JN"KNA64?G+uX':nm^}%@Γd2ݸNbNP$]Vt#CPC:TC:kiNָH&]g-s sK@Uw΂"@`b"/I׹&$];upuK?sq\p}u3~s'qBu&Lԙ !Pgr8Wt&ҙt歃L7L3ALq9? l):gr Y: }d\Rs@űd\@!sd\d:KdY:7%K_,b?CΖtHrNyed%Kgzk,.bg\Y<:;*KZS~ttd\^g孏3K纜M^gg_ҹ8[Y:Wggsug(K߯?g ,DƘtgM:K',WtI{tvv|?tvZSs,!e1_'yGY{JYEId;Kg'W5L>K,Ev>&Kg]g}Ǚ|-Y: 6Y:3g=ʚ.{8[Y:_syt,gQsMʻ@5ttYyϒ&K{3K"Y:gi:Kd^©,St}(;SGY)d|ߏ}I>,u[ },h;g= ~e,_gsgt#g鐑t2gG;K'9ۆ,"t~Ϧ,g1K'qtY:9O%sY:tdylPgB6Y:pVN#GT^ 듳IS<ل?:K'Ug鬼YyY4d$qN,2gc=tr~oI !K'9+,tSYI !K'9,tBIE,ٮ׋,l{i3K'g謼鬼٠=mg$YnO}9Od ?IY;:+/9K,}=ѰI7#Y:8Y:Id餝]5ɒٚ_dIVY:i,Y:pW,,ήY:?O~`gFI2#K'9ˋ,5ǙЮƹU!?DήdCNn?~5t֜lG?Yy;[,Jtǣd$Id;K'OY: g$/ѰYt =7Y:Y:|8+χtY:L9K~l$ˊ,٭I;:+ootGgltpv@n}TI,ĄtRg|,,t\ϝӹ_gpidw8KY:5t},gQ9Kكq6tngŐt,,^Y:tnt8qg8kr;KwN~:KYҩdT[gg퐥)gOgx,B=pǧ)<_q6tvV Y:;+,&wt2,g*g8Y:,8K,Mzj>@1tΪ8k,tdԿ.5,l]t$Y:ZtRv6~ 3>%K'9,u=o?y>,ogz:K',բR,XtaYgΚrzľIde:KY7gbrΚ߱5Cv7K5}ꙥs,XMw5csM,5t旔 C峿YVSK: ,~d\Y4tE֖t}MgΗ9Kζ)K)_ozu}I;g,yIdM;K'e?tq,oI: K'%gl?ىY@κl֙j?{gx~Y: d$g!2t%K'%g8Ydx~Y:z~,+t;K'b,X:+,G:K',DtYHN矝Y:^t끳t5q}wz,tCt<,DvtRq ~Yd$nuNVgtg1;K'glcgn@#K'qt<^qξdGG{Mljt'ٿ7tzANr$Y:aM,d+;&y-9;7=d$wNy>I=,,Lt,w]̿=g,>TgCξd,}_zƓd>Y:ot=ߎpv_P ~㷹?ng Y:z$4Y:y%Kg~~gxY:!Kg~,}I%KwIβ3K,=~&Kg]jOdYyfxY:;Kgݿ}?sNdEFg׷g9,t;g4kh/~ldg,e ϿUo굳tzv_3~,ԝӼޕh~`8[?0J!KK6wg?u6o y?koC}C}:~:8>qHTgmPSӟ1uy|wjl;Tǧ?f;dosoiol. 2LDLfެcf YYu3fpa>bf:)fY.fkSZJ6^mֲ|1k3i3pm>Z0!f-?lְ$I\lys_,f)xdM[tdFGpͺ+ldvКK3a5ККК@h`КAҮКAК-|VК17vӞO`7t=HsPτ{\ՠ/Z3y$f}j< [լ{ (s=`B5_15 #5cNP_1O3#fPE VS,%vY+F'ҬkQ] 8@I!Na4Y(1C3,f-d~~fnO=xffg#iUnfENAgGdnfz[eM,+i\43 ff^l923/!7 Y_#??u%%_݌mfziJз4335x~'lFfyiO\6#>ddI32nFf4#3fd;32̱lFaFf0#c֌L.3#_fd6sipF ~3jF&]2CSfd+fde&2SP$1SII|=/_Ffy%4g45|3j6skP{l& F챁2fd/?ߺ8IwQY g 6ތ5'20Ygi,5c#3x\W32`$|iКfP'Χљ@fdLf`d<~6#"32hY~ZiO~^`difE{|&\7`|5y0/^Ș3#1#Ofd.3P=~fd.Όڌ#32pfd,qcFnj32_032kafd#|V=~>`d6#~M7/?p _ox32i,3p>CK{adFgbX3#s16#~'#s 3k ?16#C"\LA32Z gFGXCk=9fdnG~\ gFf 7ziOfbu.ָؙߛYÄ~ֹ?Y:OFϚYUG{Jad3z#sqk{fd#Fx`dVp&# mFf}afd؃eF002gH8ƌřSfd5zLLzfb&XUxad| ?hFf~~`d=q}f`3x>ad.0#s\1#Sc#/02hOܷ=wG,m=7.\Vߛfdn&&|7yhFf73+m_f^2mf̟̮/02{#?02Med8f32o?4^܁ay327mFㇾyfd.~fd?\_&&3^2~?~`Oҷfbw}'5g*)z?ƀx|gF3#s{{}@]Hhİ/4#ciFӌdzfd~gc9 _/02 /|{~~@o?yl?fdxFL*32^0#Ѐ5_/\3#9Q5#Ù~ h|2̴t#z33->#zZ_a>t32Ɍ Ɍ3jߌ goFIf<`dz̓\f<`d.3-0C4y4#χa=~32fd4Q#Œ fd>CڌL֬;f`8Uϋzy02<32<32L oF0Sfdil% k 6#|fdunF3 6#C?#iFƿ32ߌL2#Ifbτ7#ˌL2}ڸ9̳8G!2g1'{yJ2cTYq}޹CyY헖ywq""5WVFxx5'p(5*^S^CkfcV|3aCx.ɒ:V;f=k7*c}Iéf1A^Zld"rPR^lū1D^s݉~D^s툼^P.!)F^se5"k.5B|kvg((f׊ff1sB^sHk4y=i(|E!򚅜yEB~uq!Yd!Y)5܋ l Iԭ}06Lt}vvٟ.+Cf m >4wz1# 4)A'h65tnA5zp 7 Cg3l&LJ첣kbOnRͤKGg3Kov2Plqlll1MXSfO$l%[qV[q\t6l͇]:X:)f&FRA7iqmVPff2ԪơUg3"M1:ެfxb+nhGjRg3zHTs*;!:kJ]Erv3,1ɐ8iAy!Q_ :TKN)3:@tP^ :]#³c>%[q{tS@tP :'N*tS@t[ :Xnhnj ko'?}؊QcRg-oΦ[ t#t6Φ[t-8{g^@uzyќS:r : 4&P˯Φ=:r:~Q=6AgEuDQ,ʳN+Q>DqrtSaAu"UTOcPڑjjH2:EuϠ:Ĕ}x@u:ɠ:qNTg޴g(1qE}Lܻ7N:CTgz3(NgRTz )!o/r:{tQn*#N_8|Q.:N^;{*@u }.1⯠:=u,1]KL{S[qV\7NO]KL;z:rݠ:>2@%ӫ78㋭^DYb+vG(^Q(Pw$v.Oq|S͡*_Ti>:-Q؊B;{+8{mi=:TnP:7]PƬ_Tgw_TCiiGAub:y=Au8-d@Euz@P@u N#LT!_@u N{D"$+DAu7:T;QvÉv2V\3UT.oPri(IMT%@>:-u-DUAuGgǃFݖ:K )Pg Tg{ѝ׫p(NeKtV\^}M}{OkV.s4Pfj: x GP|AuEuEuDuEuKP6DK"ov>/Pf,?L5iCyUg#zFݔ:.z@s|ii]t&fPT5? M:׉xZ괪N'VEo"hUOMNAuZV_T4-ԯ4ɋ*@>4:giy:T'\PV؊{}l5vEu9N+zoꐊ[5%Q{QQ?Q,SozKt<:$c)QӢ:oEu3YPP.^Wet{$Ew(W'Ձְw'%STeձt8rqKT Duiyq)п<h1QԵ$^PT%Rյ(~Dm':)5X:ATR:^QͰEݡOE<>NcLTUײz)R@u:kQK4˛4Ã84^EuZDsoi4Eu,=!Ӛ~EuAuzP}9_T+R/oA{xr:m /R:P=_ԼN!i] Nmi@uZ4:F;R'4u:MADuZ6R}_TYT'v%}=b>m_44:rˠ:ʠ::MQt9EwDuZԼfzPFiQ:7Eu#z%z WT&Ry:~.jE<`9|PNX:4K:-u07N>ߠ:Q& |WTQ*CTg?vG6ڑw<QO.ձ4Nx(PK-XITDTF +h @PDsAuP7Q@u T%RP;4`PK}4LDuz P|@uyTg (NSӚO}iZ@u,$ԅ _WO8%o-|Ti3Kyuѝy}~T+i@ukDu޿Ʒ~Vt@c?ZT'oPT'P}Es蟆s0ޖ/ci.Q|D<ԗ>OAur0/Ky 7N:O4uz:MNqBT'ӕ%CX d"5Uu2ϛx Qg@u\F{Fl/c:QVD"5D@u,-'ʋ栓:I_;#^:Qfu6a}=Qu::o=oj'p>W~'NӠ:c)IQiNw:x KP?Aur>}g<& {:-u3Owq?(Nw4Jىdug&D@u\iUԧ?]9OK TeJ3\;{6x^Tx@TQz@|@6yN%y6]9Euo4с@mgRT>㉨㡨㷨/l[ v뭢:'?V3xlng^ :ω?&D?Ygi]+q>>5`q>y[|Z~[A|Zc|[źL8Ylڗ!?0gȜY^v7;<#yP5nu!Jg_'t6GgC :::=jΆ ٲl@gL q[6<gΆlVKS'cP ĦрAlx)/qsZ M!ĦbS@l vGĦhNBջD;V@l M9F@l,O 6̿Dl sr=S $jw,m 6cq(i~Mz?MaKSĦX=L"6Ymj"6"6EElƘlc)u{'6HYV\1/bVFL &bSMI;Mؤ@Ħش%&К_ Dl1XNEl\q FĦ`ش"MA!)u}E!477M-Mظ bCz$#bӺL 6d V@~2d)S )urbK"6"6.Iظd%bӪIԁVHnR75_2Ԩ~mJt)[ 6aT&m8TKgHyՆ@X]Ziÿ'džSDj0r:m ؃n տ6hX*@l4̋TS@AlbcuTS>{V"5TF"]i)u8j 7WlSM\"5|gmb~xvӨ"rCui` 3J8@lҖb ;?$&+Ẃؤ]Ħ6~M5EF㻈Ft"6i/+3vxMV]ą" 6El6kQ ')=i".SCb¿׆x~X_ piIDĆjP 6""6l&bcȔDl )uq"bLFEl@x?Ya mDlElOLzfJ]& e̔L BĦ- -L?3Rw~xHM'%fΝ[~\қY?GmA"6W%R3%jp$b#,bC!I&G[K"6 6ilFۅ KI&_"6,DlD_ĆKJ]"9ԙ-bs{}@lDElq"Zm"6ן-4 'b#.bKk"6ig!Ж!b#$bs/bs? Zf xBP>Gx "6؈/2SAI[hDlDEl0'bm+"6i!X"PO"6{|ElEl&[K8؈8a&|VĆŭDlƯ Dl: .BJ]׾3MrߵD<M 6_ؼ{9|&5WS&v?7El4 6͒ 6m b%QF&BDM:-m=/!bsy}?X_j"6j"B'bsh^!bs{ҮC<6⁛'[$x@Mc%n5Rf)u馨XbG6"6]dĦbق4tSAl){ 6EJ]o"+R׫Jud^E"@XURĦ bM鍔7KtSAl:)"6GJ]^) 6SnJ*MM7EĦ2 bfߟJ]'Rza^D<Э bӭbc &g<rB .tSAl:X|^Al㋔|Alzx='ByZ"73Elz)WfC .SAlM7%Ħ2b&ĦkC@lz׿^"9O(DhZ$jGKM`<|%nHM 1i 66X=]"6VKy^="GڵDlG~.bCyDl(Y"4ķ\ 6G1-;%\&6@V(针Mh.⁴ϐRDӍoDp,{I"6wDlXIfLc"6+g#b3E&1xi"6]ĆlL#RH+IĆDl/8\6⁩m%6d2QfhY,b#-bCDlDdAl\_I&SAlZg<[r`P&=Mix b@l~LNe/b#-b3<^y~|DlvOG"7؟?L0!b3_[ΊY~N4Ejy<"6KLyAli,%B<8kxRfiaLfODl؟OfLm9Ʒj]qfxҝ6moJ%bwF.b3? 6b3EWw#b3?"6[ĆDlWbF[f-rxi?$ tl1 `Ӈ u&SM6M:l: 61M6xitj 6}+3:tWtt6XlM`"6]M7~I)M(lk6} NK=8-'<;~7W H'`c##5ljr NBl lnln??h7q԰v$`cDx㝹_iߟ l.8 H8a}56K Z#lx6/`i lms?͠-`c[&K$q6&\$, ذҹC<|l|I ~~/H(1N&"⁩Sg_& %`3I!MƄ uŶ@k-I~:l@ tT8l[鰉66Ja8[eimm˶`|Hp&wF$M&$a_M}}Xuؘ@F@P)6DN'6OM$Ľ/_ ΠY 5#g d31ANSaɄ ؘlac `#fy|z& $߄xHtPwIyBI&&@nHhas 0=:Z/`^τHPȄ:uP#6;2.F&66Hx!.lm*mp$`Wߊm@ DB,ɸ6lzH"!`Mp6 l'Mo6=*/`B _`2e@}ю:$lx!ef< @lNlI  `uZ$0 `M`c%`uB  t66]:l^GĻt>4l 66Z%~ w<봹ca-G~{ok6]  `M8l 6@&aLz.N:+6x K$],ؼ@~3>tx` ؼ@wl+M'F;t7 ؼ׃WNM<ls&l:lKJu @ \)[:kX ` /'n `Iy>"{Mn|`Y?MOU`)?M&CKl:Y6}2~P3cl%6}t 6 t " tC.@ `z6{|c`x|8>|u ܌Xl)xlPxr7/`%M:pq?B t t..`%`/`zM~6`Z,`/`Yx[y1:?j6]@#`M_3tl:C6]/ @su@N66 ^g͈;Olx@_'`$`l%oq4[xSx)o?b~C<&`~M'@l/[@x666ҩC<@Hݮ/`^?l&.`~-E

S2id T^n bk*of,xC+BsRhNR-֟Mf,ja69oQIT4g !Sb LM'Ê把E &s9ۡ/PX܌;O΂jNaBH49?ǰ`M &7ɢnYdF^YMۍWn:Qn:Plu>Kn:9t3l7+y9(6݆N wG8'`n08x`0FEi܄mɜ6KXŒq\dS`'8.~ p 8 ӵd2-0N=0#an5p`ֹ FanaX`N20o,1Vgv%aqn6-ۓv6qs#aY>29r X0ӧZ098=ar Cq%&y<8 CtD`?0Nz0NtM;Ms-6A$ 0V yTqF0*E2C߿g3_iڊl/ 0qf6`' \;-wX\ $@Ki"TcNji8MG00`{ms89$O<`3,Ϸfu>C6 <:|RGq_q[K066.0qXM'aqb.c's۔8>`$6۬a!>lZK?O8I8vs"`axNdqndq>$s ۰v T7'b~&s6'm">a3!aa,av4x~7mQƉqF1ƙF8Sg $m'aGOnaIO'avzLVžMq?qoqH~Na_aƹsoc11>I; 0Nxlf$&#L*|XaJ8?7 mM)63/a|qz6Cšvcݘ\i!h+dcm7dOn#ݰm-5h??>7- K[L~ vcTM# 4Ovotq,ƕ0,bNiy>[#Ob_8O'Cqqoja0m7ϴhv0^hq>,<0N{єE] R~ ] ZܶP 4a8;8’8U0-m8? C o 4 GaF(c|"c|"#<*C!q*0JaaRa;? TWa&lR#+c<(cqaUߚai.0N/0v5aɿwa8OG `Ig `zu=q\¯M~IXp`=ѾxM0a`hO'c,8د[q`x8al P<*a_8۰ |_rq ,qǻ\ 0 4a![pˀkqkwzy8$o'l0_q:vpe8źx88K 4%C56, ݆)6ǯqp 0NӮi?0NfiLx`eqLw؁&b ?P=~`%S=~`o'M7aIt*%mӶM!S?P ajJ1_9#/S_zڦsM!_-ar?ЄmqZ ߟ0 tE P'aga87%y(؈ަަަ)".Eo؍DoV(q F|*N;_Nd-v,K6WCosCo>&OMmH67ܨ+Boss\d&\$|>ӆ697%Ss.Us\ |΢Z,|΂Y,vsɋ9J%;uL};|t"moxs(|D3YϙhLL;ss,|θ֛81>g3猆`&A ղTl1gF>%] ==>sj/#S?c |u'so7|NW'!|5s\i$4 9ǃωs>!">G|N$iɻD>^g紪&V_iE>%|>Us6Fs<#x&z{|W]xz=8d=I>^/sX@|NM&j|bN/ߪs9|lj~|N;sRSϩϩsjAS{d9U^$e9Ϣ,r''͔PQ>Z>bߕfy#ϩϩWu |V^^|?~|qf |9ڃs\e.cqKM}>Q9-ys>5ߚ2Xϒisb/f,|Nc=R>g_/SͿϩ) >RI>SsRӪ2e"~454Vz̗iQs44F>&=>Ȏ">^G((~|NUSͯ'>gȗ~|Nwe9ʅ؟+ˑQer,,'d9>s*ŋRcS)GC y,glȒ(SLMYΐAc,'yd93s|N}ss<|N%_O>o&S-Ss|N5>ϩ9b9uK)f5yWe,9ۮ A,NYNyu}Sr Ͽ̔堸LY9|!T#9s'x|N^ի95> '&Rz{>1ϧ%3 a*˩i(xt(P3  We9f|}fq4s,,cfUix+!Hބx@x`&>;߿h8jLwl88đ9}ǮM>W+3z|NKއ-sד؎9;h/K3>⁌ws*|~^G<|NMOmb-[9z9;|=}}s95yZ⁇STe?9U|N<|N|N|NMff$C|'ߪ$|Nϩ|ҥ.c_V7IOP9bJ99_x>R N>* |N]5VTeB95y䙓>N*OS??[%?F>̠=bu.U">?|>KTs+|N|N5ϩ]YPU-|NU6S&?D<`S\1__>Ԕ[ϩg*/@#s*9)ό2]j+#5>ۆ <Ίs|*y#o|NUmx"x'x"()߉x甇6Α S?s}D

gA{<_>SXϔ)TsjQ>vV|N;|NϩUޅx"M"[(SُϩsQ+n|xqZߔיē;.ӢsX9^>S)%SϩTyE>2kU>6eETy5e9Jgߢ}oJ\ȷϩJ9U> >RE>&99?PwQ.c-S >&?@e>.x"SE*x99d S')(9~%e9%ybR/S̷)d Se56'sJ4vsv/3~u3xSne7W%S`^1tyg}=>ܴg2-?@|N?|2ysS.e*K>$⁢> &?s |NQS(,ɇ}wb9|NQS){q9e9E|NI^&%x%+^gi_>(gy/r)'x$@I)⁒,ʒx$@Q^SM|Nw" G)k)S>(޾|N^< |N8>|N^/:=Q"(K)ɣx9|NY/sS'|NQSs B1zUs|9Oܿ?sK<0y# S2)OD<0甩x ޯxLe:e9|v>g1OgB{< ysʔwx_>(ω_9e) >'9|)>'?|N0)@9"9< a#2ysrB=:| > |N>97>'"S}d9E%|N/y~N#iye(>9E&|nwO9E<OF'/~PQ> ye9 `X>'|N/|N?|N>?9e<x/۸~9e@9e,u?oۗ)Syp_>'S>'}v>'|N/" SH1>'ksJʊ|N>99|ϫ||n)1uƯ,$?B<0ttN|sJW>|N7/S! A>g-ߴ8@4yP9{)]yO9(9E>ty(sJsJSBO9S >'o2^9No"}>PZ>'>?&Ss})a9x)b9|s s'}>O)~tEƳoC#|N9?!D<)S'S@ηշ߹C|=WmPۜyF?{'맹uOzX \gug`I7hj:ur/|^d5k% \g/uW;ӬNY:{3AӄwiJ\Y*;p pfuy٫'jߋ}a9^ Sv(pUJ~ՙH749e;:8CP%Vwra9v{y-lB'o7w}O뜵's<zس0^\e0q9,/s矸Nn9Ǽuz?W%bn^;ufgiyH뜅:{o4uۙg1%pU!9k */ӯ\mu9i<R:@^ePA0plǝ]Q=<&NrzήlϾwtu.uήp|~p iQ\gsvyw8Ӝ8ˌ2qC]]8u66p{\߃tuZَ;\O{Ьs|pݮYS?tpup/8{:;)}pu~lǵL/YSg%u8'=d {-܎"o,: st?5cuv;ұij:|:-ӻz=:-m>?ɾNtuv=َkN2hQ5j9u~(pt+_2>pݎ>pFp%NK|)pcxB:-u+pFsuoDLgM}B:-u0pa?1b">xԍ,gsFoM8%.y,?3ڥ^& )$N'N|"omIMxm:Ϳ}30pfyUpw|\d4ڻꉯLx_iiimp4S4o뜬8ߘ[\đv=,ہssAb}i:; &uNM{O+icGx"H=x"O\9E{OM}a:g|x`;{'ΙߋX !1Y'P'w\ouN|!b<'x, s98 cp^}Ό[|vW\^%p3~5#7Cuvx As[(CRNK`:s8NzX~Ӿz[Cmux{"g9^O=X_#%gG9/5߸:q")pswL|\?HO \d5o:M}ns< nݎ \G<0R' \|pN󾏁p/>!;vmo8yuNxww| \眿8S_+p~sxNι?6mǁiBGι6ma;}}u,pwymN'u(?:>^oa-:x[yoTfղOC󾯁5>1V+ωd}g<W뜶xNY=pz7i/K.griC{z:M\wuk뜶G<n&p>uN[/s_:+ox[<my:+:m?]9ף%s9C9σuy_:gt%Ciuοoyt:~뜶8NAw:-Sy_:%s>|+>ߕG͌Gό.su=p|x9%:9 y_:H)[Yъ-8Iq Mq Nu \~R]On8OJsu[uG37PgPg=#ԙd ԙufIuHC3"xxPGΠ:BI|:Y7;r#Y,#Y u֍&o_+PGdB2|DDVPgPg>PgPg DNVBy:u6QR3͂PGq 2h"q\GөPǬ.: B~" ]B{PgvPPU uͬPXO[P'5uB"!TuE3C"0Bݨ=@#*ԡB uvPgEPl^j@rJx}Kz@rVyxS6: q B 3:7:]+d uPLjZ(^uFyݿPg(@3Jf@ C% 3r#(=8(qL#BQPK ›(UN E̠D۪PF3:)qEKΠB=qDa/BIsEV+D u!P㊿BQϟ8}uBW  uuB\:2 uF5Q@{ cB BP: uF9Q0BD`uv썷I{Wھx LAOО*uf{=0!ԙuBih:HDhuPGWN^o:#: X:pBIFB_:3?Q0OOB)щPg*T@3?LB:(Y:UH_B$b&?-Pgv (7}_L :B uL3,L3L #ԙȏT6HiJ>(g̣PgэPg ԙ)ԙ 089 bzoPgJ4 ͠=#މ B TPg> ~b?YqS3%G"*&zL?6^Pg^(7hG3/ǀb* hDBi/B^HԸpb?o:ΔF!B%APg9>"ԙDB uB:H?)YΏ,uH: ABս>Q0o9DRxaBPRЅPU:Kb΢@BPg)C( PgaPg)|D~!Y ,3,u Y ׮Bs>ș0x`)@V.A{,[ukGPgoWG<BVx`9E,V:.:aPg>=Q0o#Pg@&=D j"K3BΔF3)dPgJ!ԙVPA30PgR\|~>%rV̗,}Pg&D<@ΤBxPgΗ{u\W3)Pg&BS33uR`ߗ@d4X+DB|FΤBB$``޴2BiAt:^:Uδ5Bo|s*oپz =8F7%I8) "ԙTE3-hPgLjE)ԙC L 6*ԙ]' hϮx:ӌo:~KT=pg@iPgF{B8B}lq<HKaM})Z$"؟x`߇9F8RPgoOdEP#DQ%rxD<юxKL",.1NODE':]NG0PK"M!NQNw>PNJT u:C u i_"wuB\:-B.PP uv6iVN#Di$tv;B^<ވzx#謇(EMuP t uzQ@/M4X\NI4uڣ':VSc8:]{|vKBZTNpBӒx%1@{$n"hFuZ+!iGuB(PNJ u i4>:Q@c?ENC`PP=$lB^t*(uKu}B$$"§BN(:VWNbB+*ԱbBB++Uˆx uzA!dP+s̑/SYB:;b{L|tN'wΌ.8Tg0~LPy:C%PE ;aITǼOTI{z箉Au&UDuEuA가#c8+CP1cO#uΝmHt%d] T'ՙZlՙqT,P3 @u& F: 3yAu?:J :30Ʃm3K 3JLLA c0`=TgLPdTg UGBP1TǼPIiPI`P7@u&1):fhLJe/QIQP)@u&~@u06ܽVY 9yJ2-Z Nߟc#t@u::flIi%y R$PLJu긙Ti_ )nT\fKu.KR3KqIXcs:d]&!;1:KuT fXIuXIssN_IurT".P7wh:-w.[ ouJs qN)@u#VTu?⼕%֛T'7#yT'VL긔"Ց\JuZҟ:y4TM^P(ߏ' Cl쥫q{>_N~PfT 9׾Tt-ͼ:mZi@u +IuZҔ{MӤPV {3 lx+JIuTc),ձXJu"05:|AutSmT[m:'NeiFSi)m}ҜWiT'{:uHSb)/N?@ujRnON>@uvP }rBu*f:TzT)TJ:u 0 ήT;Tڊ 7[O\ NBu2Po=IuSY*[ ztJ1lSaPS\S3|&5)JL.1Ib_=1ߤ:q7ξ ֠N R\5|S@u*Kut SmT[}:,T'^:U թ˿KqydT'GPo=JuU'iKszo:.iU*@c3BN}@uthe46ϓ4RT}(N 78>:{Js|R":Ӓ>Qx_^oM_sRo1aP&/iiC*C=`8T'gP _4;T9߆4ť:ʥ:yAua|s@2h*]zKz Ӹ)ՉioRV<W;PӪ:ɰTӊG.Υ +i&NAuӮ7,wJRTg_9q 9ۤ-WKP?(UEKu{pn P}eStzߤ:C=Х.њ+IuxzR3Lw|_:ӡ:|AF.թUyKuCujR#7TJujթ@uCu?PjTgKsz<_NMSa1њW kTTFթn թ@uKPG<ؼSmq,>x[PÙ:zpuN T}њW3'Z*KRjT;T}eP|::`NP|:Bu ּ'Z#: 9Ku PjTR?HuP<~:5Á5&թ?@uJuթ5@ujD=P +N:yT[:NeEN%YS3&ť:5M[9'`5/wPj+#T'wPAu 3T6iCSQx>&ּxҞ'ޟh y_?aRa?Juj}iN:y>jP潏x T'_?T* TT'~/+T'PBu*wRڠP*ߏG=/NBuPJTfx Tms| S VSdPjXTrASTC='1hj @| T6h$Tg&cO|:y|Au|7s} Z:GR=RPBu:]> Q5Tg~w<(OEoRڥ7zNw:wƓw<^q|@uSmRtթWHuaG+:|4y~Ҵ.\oo^N~^P|T6)[܌^IY/#T6(2T)NmR|N^OVd=翕aAY/+T'sP<@u|T 9Ƙz >;끸~Yz`:HsAu S"ZS |NwSC=z{g=@MPj"T'P*z`2x;1Tã:HPj'TթBuaPݱx>Iyx>חzPcb T:հ/N5>ERPj+TTuT^l%*թn=թnթBu*RH(KuNPbTdxMϤ:EZ)=@uX?//)T TT}>QeR NCSRַ:~@uKuKu2&NP z ?~[KumLCu [Ku T()0sKsJ<]P(t'bTQa:9:gw>~jϨh<Ѽ,œXܬ8yܨϨ}R^?r ᨜B *"Ws*g]?r.P9mꨜiTM]TS%WBTQ9>*GiZ]c(TΦz9it o΅qP9?ʙ܃Ed~PTQ9 *gr=@Lv>@LWQ9D\rV>.Q9uFTbrnNP975*sʹYGܜP9;ϣrBLb?rNY ss.;zPQ#C@Smy*g'TiFw9*g?G |1ȹ]qoT8; P9rT?хa*Մ7O s~bCAUy2'VݞRUgzcIE]x*F/r8B3Cp#>2*439>'CP2Y{axt|@s{vQ>g~Η|Le G*gQ5牟dU;3o}9;npǏ?ߑڻHu#K)iNjONsp2)Ty=*+S'Vzٕ*eW?~ު^BqQH@P9xq|s<}T9:_\J\o Ī?VG*/ 󁮺9'C,.ξ*4 ~TDJsg9Yu{rN`sUnQ90>U<\o30| esҹcP9{]rrnJ\Jg_o.rN3a<)|0ۢBs_9?CBΌW1Yue4w*T:;R9LpBfP QCX|BwvY֜*4'>w=]6TQ"Q9{~x}TiVNjzBTʣrh^UDYur@!Tinz*4;zz~ S]5CT2P9{8[.P9UBTNK5*CxjSD=*9* s''}Bj}*4S:yr]ʨ=%TiTS5*TinG=PLO3fe SS9c^s=^s7?*g7g^s9+}U83>?˩qnjO(STr?ծ~T|;TNM*P9xviT> -o*P9Pm31>'S* &WD=P3&h^Uèy5*|^υ<`1~xQʩ]DBP9{?*ʩ9nծTN sOSsΏ|lȊyP95Uq*^rr|DVQ9*Ϗkq~~ *&T9>&}|yU8zˮs> CT*<~Q9=r/w\o8T;>r s\os0Ck0TNͮP95B{(>r[{>@~BߧX-*'Ϸ=/dzTNM%*|1>߯Vw @GsG=-T} so*Ը._KU@]9t@uCP9gҹc>?*O>*g qU0tQP<&G5D=|ALQ9{P9 HQ9ϤvpWTNu`TNuUT% *1**g'T*(*gy>QbNXh>?:z7 g-Zsv<Ӆ]uvT:zRE=Tr˸>*6CTwC1Oqmk*ӅǼ_QK*缍'P9m.P9mvOT;)T˯*g*WS P9@n*|W|~rp1nq<ݎg?q SsCP9*O'9d<*;oD=.RqW~CT70FTwAQ+9x9~0dP@2 s/QW3_ SݥSS96ѽ}Pz`TT؃z@*'rOƃT7%Jz@_zƠp~8DoBx2?RX߆"o?xT:O?P*'1TN֋ =ʆz`p sޟqc>Q95U9g;RP'I= @QߪC弟gy: 'Q9Q9uI=rR1*C߷P9*U733\C=0 ء`s槡ViC4£Tx= T8T:TwCTwaA3x>C32z`*Q9g~\s[%s|9TΙ/Ww̷Q(%[B=pXBTwyC圿}|U7g?o׫tZ7ׇz`5ovT7S.s~G7@ߗ\oUo7*a}`TYzs.z SS9ebP9{ja}  rWw4MPeL'@`%TN}QJb}~>@ *^Ne=b9 ܉z:}X`WT8Gr SUqFT/*P99ʩ*HTNUrSUr~*8Q9y T~֟T9]kP9y oTNETwAs'UNuTN_P9y?s? Ϸ\P4秮4b\3]p DOr58C8\a Ξ7\=J\GסKÆ!r3<X,jb * ةpžpE'\g\g~יrbK}bG b) YX,u>΢kHu:h:\z ׹鏅ܔ+rM: rAm; \64ML QGs ѹA4ݕ{#DvhBtfhPlqWyPlw@m)!: o2u|g_yۆ,C.Yܴ53)Ʋe>!:M Yk,7q&DgDrBtL3Dg&_e#!:M Y,64D3!:K//6^f)M!qYs2J!:+Cbքx0Dg]$s!:K!:NBt܆$Bt&)"DGTjξ|3nL 3mL\g}L7͆,:SYBuV1'rt2 '\gr  YК:'rUh,CV:KY?6[Bt3Btiz?6^ 5#Dg&_M}KO̘F*!:v~BtL7'DgڎGNjf~l=6Dg&M'3=3Ts3>3 љEŪoL6 2Dg љfCt!:<%?b&!=I|Ix^sE0' ۑ:{r1>I416dDΰ]T lghr$onIV#DJ8 A?z&eiʔ3 2S!:Yo %DgCZ۾\/ &Dg !:hyCt,9!:XY6Dg Y]XzrnY~ YD'X|0Dg HJ)ːFBt!ӊ%xHvBtmۇom!DǿooZCt֔D=7D!5QBI޲],c YrBt„,7&Dye!:+[lKJ-- Yg2'v>Ct_Ct,Yl$DgɱY܆?z`YɏXɕX D!:MK. \r+x<p|q*ǷӒx<ŦvTBtCβ%$DgMC{!:P.Bt4t(ꁕ!FibSQCtb<?!:z xzE#a}I?6^&BtzCκ8Ů:=!:ϰ>.,W YP4{-ߏ#6^la"d%#Dg-_oKFΒD%w DgLβE=aN^O q>bNtfJN^_ YBtO'˜mps}[Bt,C4Y Dg<ox~>`H!:P7BtVyN01%(HQ,CYɍ]p#@zGQyaLkHx>˕Kϧsֻ-%׻.uzJp,i4{@!:P0Bt<%"Dgɯy/!_;wι4{ Yl&Dz&,{1D%Ct3C2Dg׋dOԓ6LK3Dg3=_3_fz@!:Ym_љzW<cHO&D'~3Dg>E=?yΈk;/Bmز1'6~4ۍw љ^yϨ`dyCtmQSNGΔS3DŽk|3ń̇|?љrbBt\7D謋}RP\4Ɠ7M, YgBt\5DgCw>CBt!g,Cѱ=e!!:KK~!:0<_ϗ3!:nCt0DgI~rNR\s_p zGb=eh!:Y "D'/Btܘcc!:KGN4d=IΒ,!:y5 )Zַ_,!~~?!Dg}!:kB= G%D'{Bt Yܟ5Dg|F7!Dg?\睯>C I&Dg͂Dή>\̯v/pSo='Py|o~,5t1xouyS@ ѱ^4Dg}!:P Bt YP/}yOrS:8KzIS:Yocdk ѱ7D,CFُ$^NCt%,2Dg-yxBt_ YKN!:ֻ<{{p/1DgAκ,!6$BtCt Y܅zKNBt'n}5Dg\} YC?\'%0d}{:as>ߧqUy>ߧ;}ߧr}ӈ=?~swi'GS=6 p]ן:p<3 T iZ4pF %\q yL!ɼ:{1BmͶl\ yumOt=uNp]sif׹*6]I:4:YHu<_:u"uQuN gJp]\pXmܶus",.:7\ܶkunNpYܶu8~w:-:ip E{^pE6\g=׹lpr:?ryZr! o&4=r]vy<:+9Mp%Wܦu]~sxw]hoܦ/un2:V#׹׹mswswG==wۮ׹m7ܦunvwC=?=ϧy&qƺuq7r?\grssgPppCBuϟ8W%z=H:AmhYS~C{uipEA(Yp}{2v' Ǵ 1quV5ۇI#bY<"^؍Xr\gQ.י'י?Q\-יQuOu3u)$d;>\':3Ls?ô&up6QLnu7^Njnr3=ufD=0YL"~:et=x &)L7y/3cr ׉u|(6wp˨W:-:7: :rr\g,er1@Q E:c0=3I3.377+p>u[ΐuFrΨrXuiFpQ|c9ߘNjz`XuvT댋;\g\%z\?X._N:tX{}~&ꁞi=Q;ξl}pַpa\',\gFٗŸ$ׅ 쮱xa\gtӇb9n:C\gsx8uu-uƔr0 3^u\g'@~:y:CC^azLc9:y~$ 5ΰ >:v'pB7Xpib9nww_9-'}lpB:23lo?q}{.:Оw[hbOrr=G{pnpy\gq qt7RtwYΤF;\g י̗:W$Y3pM=/yupi.QLwL=v"| י>|b鴘O촧u&}u&:yrc!>?\g&u&r}|:4 OO^ יoufKQיմJ;\gVg>ufs_W=o2\gRuיorH3MwLҒ:s~JsyD{\gvKF{AuB3Wp1Glo$SD=F3iE F:DE=|K矕qM/uup3$q>+p<]{?Pu2݇z`ɍ7J[3ў7nO Ӹ:tθ_S :u^33=3>}N:2(fhϛt \g&ga;*Oa;/ӧ:vmξs11?*;oq=LvK 3Xpuz -\gיu3p3M+H_3Fvrri$\g'י/ǹb8-?\\'W:~?:uLP%!/uQV!/il'"Y4q':qw+ru)rR:sX:uLxxurB:~ș:^O:Hz 7+>uWw יMN:S 2\gW;7zLm:?r|:rYMYַvqoo:qi<^p L9<\:y~Lӓ::tvN:}K:t@eup)L}:n&יô!\\g~[p:ί:v{_l>^uδ= l4E:\g:3|* 3h,ΞJjHg/c ;#6&V.6rwq!SINS'Sg?:2u l2u LddԹX#Sǀ2uыtN:gN2u.Nd\Gp8:<= ЫѮW|SZi H6BNa~t9&.99{p̹#s03Ōs ̹F\"s.d"2bDdE2JO H>A:ȜdE$/2E\wdNXUϻx{յٓ0~.2碶@\ܺA$9פsy̹2%V.2D'EN2rtde>2ZJ99oʜ\dFȜ;ʜw Qt]`̹8sɋ̹s}Ό(:9Ȝ/eeg)2*ĻȜ*}щ~^!s=$B\v"s.;Y9=ʜ })v#s ʜbp2T_:W9^9N*dNSsǙi+oezb[qadNMxѕ9{§W̩M!sR STB 1SSADf2veTtê̩J-dND!s̭UT)s!VԢ䉕J'2rP`+r':@;9NfdNaYS2'dNY[Q>!s+s*s w9.dNS7щW fB>9%2to?odNRe 24uk2lj2t%KtC*geNḯ)AdNRW;9ō9ɉ)6+sJ0]SG +dN Os}-+s=v=ȜK L13wqr(o a|Ot(sJJ9NȔ9q7e(3s)o9*s!s.oȜˍ9*s*se-$J]|+s)safs}A\(#s*sȜR >^S}WnOߏ9~|?9Nsdէ2RdNYJ#f[!sߋb'32䉕j2f0OkUĄz}F(>?U7G{̩l1[S#sj3z`+oȔ6ΧȜj<2>J}~_!srS BT;9z[{z۔1-hy]_o@}eNΪ2q# e[U s1>%k"s*+iʜz!92*9/d_S(ZޠI mU" sNjz*9U)̩+uyu(9x@`b~BPM6"US sR2,zz}DTwB@T,9y< sS"sr>̩^_99CTȜSR S=?2TFT6Uz:?AkH:9yBTÐ9+s;= s0'Vޢ7eN5 S DTVB9+s*+yʜj+2ǜxeNeTS AT2l̩C=`0+2,`Nʛ2QT29U̩O@Tِ9u(b9S9ՠdNʣG9dNtAgȜ:>V3(VY|WT6ST%&2|̩ϐ9'd.BD=PIU% 2]t*svneMilTildiE@+g92yB47Ȝ|F z12)#9 2dN}W|Ȝ9'dNy?Xyl,̩!sjʞ;7 s@udN%HASFT7D XyܨUT7ET99NfdN SS ReM[]t sȜz+brV )sc#sC2)Wa|DPȟaȜeNs|dNS @7H)K9MYiv!s:щ`7eh@+ E=\F7~@+Ȝ<9#/:ڥLNtC4?eE=.:99y sxȜN+ʜfp2g~͍9`de)9ndNsqdNkt6਌)9N8dND'^SN!sȜf2u%N dN@Ӛr)FȜ>"s2 Ӕ`Ȝ689͍9\֍9-JleNJ+sm93&:M#sRD'^zr-ax/Ȝ(F2Nf2iٿxm iv^#sKdNziWtV"s~G=Ж>щ>{߯k^O9NrdN3 `щE4e2)?9}B4o9}B4ؐ9MiǏziO*sziJidNʎ08&6 z)39-ONcdNceND=ДGȜfg42'Ȝ'QepLy#shȜA5Q46W42'Ȝ>!si' sI=p+ؕU jCOdN~9`dN[z$dN3G C47(s2,irz9+sb7eN/!sWtȜO s2[!s:92&~)ܿT#dNB'd}3Oʜoeo!sy~2((~)9Btw@bJȜ&dN>@t!dNQ+ug0O vCte'2g/+z3'dNoopξvw@q|>Ȝn)2|: ӻ)ꁞ&dNw'dNtzD=Э'9)m8zەȜnP*22TJYdοqU\2+ѐ9Wx>q sȜ/7Ȝ|9|Cte2+ϑ9ݠFdNCt+9FdNJȜ z+9 sz3(dN'AAȜn}֗Ȝ a.zi9{`d @?e2z#)9+o?+sǏz+!9] JdN̈́C ʜN2gWzOG(s:r[ӑʜx>ȟ9}7z2\HieNgjeNg'eNG+s:_ʜTnMd@'xUL V'eNg>eNʣ 27MȜ(dOeNG*sӛ7ZBOQ\z2W߿9^9zz{v[UyONʑ:C9 9 TmE+s:AʜNʜ^?QtB+9<@g'oeN/JeMke%eןWtvPye=eE@ *z_Qt2'7%Gpt/宱8p?ݡD%ĝ9g҇ppNe+Dps:DBtZK DsX4v/ѡxi*Btkƞ ;T6ԅTH!:.@t\TNTF KtNIcHbifm?2Ӌ:t:(+R''tX}uΪ~IS a Z%UZfhNhSuJZ?NTA9ֹ(,:Q1heX&>H:Bز֩hS C4N'hFqɵsn@T^Zq֩+J<:hv%ϹXR봞);33 Zѐ~'Znj%w:m::(N4Ѝٷ8YBKGt::udhrhg;jqt;uݯAEi7Zdu{vWu=u:uz3}?zj%ss.ɘj%WN'fQLhnZ7'wvmjq:no:nN3j\jVxw}jƾ\jzq5]2(N~:+j\lfGw^N3W c7Zg;'ML[58&Djf Z٫EՁ8:j:{|~X_Z=V>:]oC7Z'GN{8ucnՋɸ<=\j^b5,ZZˈŻqE<3o'Z= ۜԣh=SPަzxZg~ha7[@C@̗:QN9>:vcury[ 5@<;9=?]O9_A4_N3 ߯x> Z'?ost|>9:^Wj9:СuWtfuP7ꁬ7:9Cϟ?SߡuriDw^te.Qvu=E7tHՋʘ;nqBPdZǿu|jNBx~PxSӋ@ql=8Nob>gh?-:zn N7%h9;|Ytu:G:ߋ<jΞhj*GdwZgϿ>q5[%hnNZ:St5 j~GtFjxn7S-PZnNotuF8UfnTN'gT+Zgm}ߧtk{d=zQ-P9t CdZ j}Vӫ3ٝ7;vv ϳ;\-@N[==?sӭoׯE=4o /soMxFtuZ'kYD7-Zy:ٽn5NW'u,u6ojnNZ3Z:mN7 c7Zjn Z'->QxJcZ'oj<Cѝ^}C}Z':c;/?-vuES,Ƭ~ӝn$j~Et5Z=Z:;KjKN7g$:vu[|Qøzm@\?z<~{O=_:9Au3{k=85̯%Z':y@dw+Z'hn.Z N^/:ٝWyjȍGsOUtsM:}Cwh>@x|nsyλts:Q۰>.@G]Dw3?ucx|?WC/cyru?Z#:^OqRD=01W3h|::θu+OQ\|ȝȿG=`NZ'NFM59yh#WUMUS쮠&9Edu?|b>ϛ37ZsL|hu:9juu}h} D=S]:#RuԯjZ:.QsuP9:zJU:ruqZGǧX#G=R:na:,έfx{ܟM::1gNn[u/Z:ujvIG=Ya_/Σ.x|~mj|hjǜꁇZGֹܜ_9j[ry~Jͳ8:7/QuԆjI2j[C=@Sbj]CPjZZ'sw<uujs:SmC=9:2''Pu:3I3,hy`74(((`)HMZg ?MC=nGjhKy`$0 3q}G gw>~ZYs_s.L蜋Tpt]4@ΩtN:~uN!t$:5J:5a  8Ξ?:vQu#n^sLعãD n8gmA\"s.:ؚf 9nss[9|s^ιh_Eld9_vtNsys}{gyМ1Ì4`CvW<B<\l#ʹr..CFd75n)rM "B9)A9f[PN>nA))2r jc(gg|̟D9E^PNA,r KF1BΟs^i?"t7B:#"tp6By:HFF:6âhFE7Br.a%QNqKiP^}`mѤ),r'2gq:O@hڸrlP(&+&2f|̾E-l햤W`_PPS)D9^QNm-ݢ[ rZjC:"#tR)#t#[ G:e[1Ė~F|Fxr{4-a x@9 Mts"-l4ߠ4A9ꢜj(ʩ6UruD8gl@9uz2EQN%OS)E9u|rr|Sp0h-EdjS(ǦXQV/Y%)"\YE9FrD&IQ'b-oN-ތ2H2Ȟ2D<>(&6Q[rGPNnA ʩ6%r*7 D9cϖ^Zޫc~~28߀rD_M}4 A9e( [UQ[e [@9:(ٴ iPbJ̢D&b帅(9_KyF$r"[+PNnʩFr*b}|9^q^z;3D6W<8С# F+GPD;w5BGDiN7.z!Bv2B:tmN3҆f ::_:"B&όa#"teNFCD :q>`#t"/#thJF4:^HsmFc@(VHHDPN5 SvXt~I$DNQ|QNFb(zf=Z*"tDYFS~:Tј:Dx|#t2Bb:x7Bn Re|^й^Cf (#tP iM}z0fO8^A9 ($ z<QNqrPNq~)"PxQd Ɉ(PNr]z`%??{ܰŪ('#@9:(g׍Mh%2RSr:\rhSrc ȅHM_PƢݢF6ʉD9Mr (|S8%R!R($E–ܢ1Q PN SEQBӃ(|N~x|D7W|^ Xt (}=Dj@9Ed)󩢛'/('O|A9n} Sn}d,(t+A9n%)9n>_Qǣ(FD=o |xzPOr_&yo[ݜ9#zbѭ,Q(݊[rrb7QN#"5'MpB/)H""5?#5yXt+6rM#|E9{ͦ1|@7QMSGHPNY4r(@9&PNqKmPN1Sܢ,('PN}|a5( )F rM b(e>(>(>()#'r jʁ(g?O;IMhD9&PNa-BJ(LjsQNmrr rSD=whJ( )Flr(עb (`4((HJQ~^oT(HSQN-rG=QNic(((tQN^PNIc$(<"ҼSlo#BE9M8D9&sPN7('oPNF(ZQ]c}MD9#tE9_*zD)]aC&rD9&Q(zLSEmS式ߌm{<*ڹSʩWP 1YSET{QN5 rs('Nr*r*MAZER !h³ADSEZ#E9y@ʦ #E9 Q#E9yr* j$!(Lj^QNz@9}+ʩPNO@9U$1YS($!R32ºs"式w{~}< ('ߠ豾(VSlD(<}Y<"m1 vpoA+фg$)PN?A9Q񢜒8C= B|S2'6A99Q/vf'OdNSrr~ 2(E99#@9(PNIB=`+($2p _tb~{to/Էyr\+^oDd=z /PN1oe=?PcD9r#)7CPNGbD(ܾ?"B唌HzPNY@9H3PN~PNrHrA9Ey/:('/PNb"(!͸MdδэחB1?)2 @9e1@A9Yrv}@OU('?rlA98P||?@9~rd>(gE85z-b(()n")QN֯2z( 6ND96x󩢝'O2|6E>W<A9(#PN_PǢ?/ٯ'/=?/)l*)T)\S2'{GE9%#6FE9ME9kQNa]Q࢜EJt]rJʱWϋr8ONQNi"J#S2F[1n&|"@9ME9z4Ivr ԈrJFа>D/T#}X @SES(PN prJ Q4 @3D9{,Y~ED (_ )MtgS({mznVf0daxa;2䱄H3ujEEFU黻oE֩C>P !+j(ʙm{zTC9H@9*|ʹh c('rX^(g~' \}~wri(BAj(zs=nH6 [}r<ʙmyJ+;(g ƝsÝ<9;硅 giwGsB?K/a]s[:U9tk9|sTtL7:9^@\TWC\tԇιػIlB$N¡s^ fs":D'7942C93_3^3h)4ghO`xt >oITΠGPΠeAC"!9J'9 ȡQ"@9Ä39&3Ў)8y]E;|vZJ }Bq:jEt. FXa87ANJ̱2Q $s ƒ! fOFpR5CXTt7{'.TkYSah';| 9&qmΗהH`G_?lIEwE@8fI $=$kfWpq ft_KG3Jb U߼1-a7* -fnd¾XZu6聸zv"ZtY!}PfЮfh3u555õbk2(~&mWiZ]bؽ"fzU3fDԌ"3kfe ‹vnV.L38-f\||4^ ьtmf~NɆMjhFz ?L}yg' Ӈ?3JLo&PbALeR;YJ|X$ex)e8 229n{]^a/mA/"1/}ƮwAKwA94B*1Qffug v!Yk'Ԡ.1ȈtAFK 2\:\bҽI3a\zxeswN)`Y+o-34;"mFtWl鶵 l鴳ktZz7:50-z%%_,3OzNDžh:mͿٕ_АuT5LJdV,Kjq,î+a,# Y iGbX}@XF2Rs$~MʰC0,z[U+ؕh9M o4x nem&lSوiDu3,Wﯖ."Vz3ZN[oHӦDph+(-x;Ttc]GT)hQ*2̀QQrEJ SFf? w?EpJRlJ<)ݺ )-+rҭmҝI6 IÄ:qtKģtg#hX FtE~Q>k4 0ePƄtWeB,*v (^"B\r)m1~һ/tGI쉾/t'yru`N=]$xӫvS:ҭ9+YHw2&a#sR~ۺ gA#Ʃ0#΀@F.0^d.Ӿr E8?.*t RmEiGD:eD`"dUǐ* s2## $ږnK&|H, <JtH㋖dbCp-4sҟ4UKP!m^LȬDlsT) #"Bz9,-AxN8 u'WW/~(k _ 3|uQsk9iҭ2vuU.N HEHH/Mrsы镵Aʺ }S~bd-{1*GH#죇 eUy~9Qѭm--q>{ti]c݂/R.PN' HNaGEt_#@屖64>non ~cA1ÇX~[A>+݂2SЎnGd a]W6ѭ.ut3*#nNjۜ$h#F٘a&,2h9mJFTNFsMF5f>әGJp՘Ȃrv5:}4:n0M h9}Ģ崙81cD[K%B*'@_DeN|.khVΘ~Ղ3e!#ЌN;m  fOqqۅel5~7et3tb2x7dtv1fh`naX FH+ ^*0Uѭ.W6T1GyM h9}֔Xx-i~3^llYEOE,^2O be-]Ē{9 %f4LƭXzN}p6ȀZxԢlNLy6ТWDO__3,n! Ģ&Di΀,r"(DW̛#`-"M[Z YYUVOPTE$q*|Sѫ*ZNWkd^~=NW6v"R<=-i J)ԏRtQ8HAQt  ֟`(: E(Oj@iF-Ia'p. 9'#!-4a&cCi hd|/@p->-y7`%J )@^.BDz%&AIHHo"#s#D7}\~x/f >R F"ZN? =7Fx.+Ei6"afa":-c@" >C[ *$ OP>Lzh9# 1 0Ӄ.WP.@ b1hp1t7(;Eqi~,`eZNϳcUhT0Xm=؍0"krø\Pyj\&>9h@0?0XO ٢Qm{46=__gC[=__[[T"-*iv'װEw٣x-z hآڣuR[Tm--=yΰEϳG}uZnQڋߢm}QmQ{4;p-z m{uFEQ{Ɵ-mc`-=e =m>mc>`آ:l=__[T= [A-aG=,k[b12=FXRv եF" *]a S5(l.YQ_]Bsm 3F [8FyNyNsɏC -$A9h}AЀA]Tmؐ(3= mhAtE>hlР \wmПWeP( yGwڠ UGb[.%6oeTPtjTA9J \G mp(NB܆<:E,.σK$/U VIJ \ mxN(\L|6p5ex!]6p(ڠ:k; mop'y ^.hcvb LC:.ڂU%`PphE} LC e6x/cEL fů崻AA G6a&A||q |> ms O.#u*&m0d!|{cEčm0 |SqcE&, K#E $pm E.C#h6vNaO Õ | m0C:%Vh:1m0_ ZN 꺌⟎u*m0؅6KX9k9=B!Sh60m0,Jm0΍#K >B}6po h##QB1>/ m0h;m# ]< hQHZ ޵D{Z6.տHҩgr3|9 ]+N>%6W~4m0O< ӴAQJûw' 6`SѴC G6mi`0;nF>1u(O`v} B'?iNh{A:6phz,60tmϴQNPdڠcrm qyˣ?.< RA*40;H-6`ƴeZ& W2Ե/ʣ+n4h9ʙ6߭wנ4 h`/0 LInڀ VûF]s.l6v46&DqBAgjw!$ 0 axlx.Ѓ]kVFl afm;m0^@.]wڠ[4vNx¡ <@7656!W0im0kQm0xmimm0CxA,¸r`Aჭc*A\hX6ha'hr`m0BJFA+#1/6ɲuf m@5L:G|Fm0mjuaWA:Jmm0BĢH[z@A-5h76՗h6cznRmjVh767V a[*r:2w46+ >hmK4C (s )J׊n@]+0Dhwڂm m<UhzZ6U `LTW6h D/ @LմAf,ڠ F ˠ  \*zw)I Cdgs$_m0#`C@'K h-'0"OyQ {#O]'0 O 5m Ny VIAr0딥p*܈TݰmG N N2!}SN;ɩpo9*½94 ۍ;TT&SvN 58aqTB9,L'S\Pn9_\X*aZP|Ɉ@\Lϳ f3V y V֌#C"Dqmq2r2Ї>,M!nU¿J^?kb:j-ePz#*CE?]b^}A,N%~)\gB,&'tg)Bhb}-sDE!.HB\ 'Ex*"D`!.XF\t=q3pqyLLlD\#B?5 :~ j65LڜE u?E0d;nTq8捔XWAxҥb%B,Fh%fA\Â܈@A\ܦ!KdDٔąs&Dsh;Էr"D~Oxbf+=k<>o?f&b}nbDϘ.'Q˃.@\~`$z7CQR媢)B4 N"F "X Q-REP-RS܅(X"E"UUD^X[-_zInX"UB3Of(.]6< Yى9*ǦVT*8ֺ,ѻ滊c*cQű*5D!VX"J|7SX>Oˁ?Em.="ղ!xӊc a qyuHU˖,RH 5;xK1_ƺcOEMx߲aqo(Fa1\eCcpw|g7=@0_ݐ'|C%xfg.\\ : Ef,I.!^\?:.Z_H\ ٍƱK:)B@'ƕtlҀ| Lc{c] qy)R_Tּ^˳N>z$b9cFc 6V^ltY>3iLv|N>p[A>ϋ|+| ?1A9*|`Bz~:XcZ#z XϬG|>m<ݿ~8L}Ա=˳:fߓB<__|Ǖ]w"˳GxX%b"Y=n^@5fA> z]1e@w=+K/,BXHBֿo YW>t=-AN ~Z>č[c}ť-|M>;mBn7C=F2bEb .mx7F"YS|P c|ȑ<7t}Ď}ȑd{G>=? @瑈o=A E熑H @1B>@(Ɋ7d{8I. #̓h?8v~:qM>67[p%˱%k@?W>p`Z q~7%k`KV2M&亲M @L1Tr~y 2Y!_YuLV;,ɥA|r}&~.t46Y7ݯۀI Q>p۸uXڏy|NV^VNbd) ڿč&I7z_E ?1u h>eͷ(@Pf|leA.~8̰dϗ㞷Y$zy }>W4 NJwb!)+UͷW|kQTz\H+T."S7lEkxz5L侽"TUz~ʣ s\Op>@^@nz̦ܺJ\_)kM/t*J>tA\e'H|{|S XK+\6r\bǧxIU+ `yO{}BXVlJbvk:KG>@6C>2@w|+N&]m"_V~I>` 4cD ېe2oJB>P.f7CC<8o>p61q󾏃|(I~~ !"?lyW~Y=@'!eT&7`eV|,1LD /e&Xϣ֥yyWR\}ޅ*z|VOI Bșuח /1Kȿu=3+/?y9͊OlO04+r<~h"Y_>k-\c(" ZP0͊ϐ"06fno|լUXM#p5+;n@k7LG~i[w6 7}L> @p3 L0lmS}'`}?6Qonb4~YY)K |`7w/|f<]%ԟj|g&={:sK߁ WO:¾_:mra/c}uGX2Vtc5'S#le"=,~sw9.Cx>v"t𹎰o!HgK9¶_ûa/c}aG8X> þ_:Ò헱N~#Y>vu𹏰o!\gK=¶]p=p=#~nv}U"\ 1ö_:ûaG8X5z{X#G:{*u"9ϸ=^^G\3nyWy  ?q=krO>~\::q;# qxӏ9\q=suxuuxu:&Gp#ާG%8$zcb{rL:G܎ys#nc9Zxz1gorqL:GJpGK:[|''c9~\}Ouqg܎y\k=q\O=fSp#>':G|Ous*z1>1>\g}s sO:~\Ϲr9c|;p-~\q=\爏>:G|O9cs|{yp7.\爏kzp#>[:G|̷\؃1ߖsmsT=?|+\爏k|p#>r.uʹ9co1>\爏9:G|Ouol}ηϹ9c}?s&:G|̷uo3 9c}D\gT\爏Yp7|~'|~'s|+\爏~'|~'s|+\g?@O>P?@O> \爏VmO>>@O> \gss|>@9c|j|}:G|̷umO>>@O> \獅1 O>?@O>?@uolq9'K9c|'o1O>?@O>?uol'|`|'|`|lq9[:G|̷O>0>O>0>p#>[:[v|'|`|q:G:[|--->qxs:G܏9p#:p#nc9xs:GO:GO:[|---rsO?~\s̷:G܏9p#n1߂qg<9p#[p#'p->p#[p#[p#S>p#>g:G\z|\q=g>s|\爟vq̷:GϷ:G|O1> 9}9z8us:G|Ou\g܎| s9c|\爏>p#>[:G|̷1ߖ39c|*g>o1ߖ39c-g>s$\爏Ip#>r:G|̷uʙ1 yc:G|̷ϙl1>=g>s|+\爏9p#>uux1 39c}|\爏9p#>[:o,\爏~'|~'s|+\g?@O>P?@O> \爏VmO>P?@O> \獅1 O>>@O>>@uolq9'h|}'h|@ss|>@O>>@9c9O>?@O>?@uo1O>?@O>?@9cş|'|'9 9c|`|'|`|1 O>0>O>0>9cs|;>39}|xuxouus:GO:G\3n<| sĵ8uxs:G܏| s39}9}|9}|9}|̷:G܏9p#nc9xs:G܏9p#n:p#nc9Zxouxuuxouxouus:G|Ouig܏| s39c|g>׹>$z YGMNˏqY YI3g:nQ|4 ogg%-?&ԊP qYpN:K~p%E~ י%ė'\Juo: 3+Q(Vg^Cx՟I*]׿XYU{7꬚cVgJ_{_N&/9|cVg C\r`H5X@t :ꬲw}{ R:*w-!VgPj]j^Z'|8jn|u24jL5:nZ'N jL:*ά^!΅NwjGsp<aD_ՇNp˶~M@u|PdDZ jk6Fs!w@3PUjwGFu~:#:&Mu=}h]Q槃'O~Iu΅-΅JNnZ'Z' ZIγyj^NICQ%~ZieNrkd: u::VV$ZY@yIVϧV)T?jN;kZ'zHjJ:Nr+z:VfY3xV߫vz[j@hUh؅~Uw:3%/7ENjV稕vjVv |7}?P(jDGuvHuRumITm҉NlILI'lI'`I,äl,v&6$>L:M:&&{ꌑGkt`zlNB`oN6۰`Yk(6۔#NbaNr}L:)Nj50F:%0hOtMtycI6`҉N Nzl>mfW t}äcM:ɦ9L: UM:1cҙaxĤ&mI6waQ۟0¤&.0$:Uۤl¤ME3@(3mb/L:Ny<10 O<k"?~žYla|ry|JI'gL:6$00_oݟfZI'up؟O7qi *&I'otbyI'tM~t"d3W&z~2#aI6caI6y`I6a҉NM:s_&tM5tζ&m;ۤm䉹&pY=at:L:~mҩ64פ#ӐM:Nol &u_mI/3M:&CbN`)ao6tt:M:^ؤ qҢSa,mұ&6¤&ߟ&*1k)/&INqg6kN?t&aOIg}IK&x0ߗnҹOL:twt)&wBI;ڤcӂM:6=ؤs5`dyL:Waҙׯ)1L:~u6M:mMtlIɵcұ9?JLx/mؔu}z0G<'Lt.71\lڤs!QI'/&xt!gN-1睈w0睉o?0\O1鄹 |1<ݤ&/̚z^t.gG5nҹ?iҹ L:h0&0aҹlƤ&IL:sduĤ·6L񠳠9ygNt.Ǥ΀6鄉΅+L:k;ۤ6`v NbNyNy5 L6d:&&չ&wIǝmq'}یCluN9[mҹ0s蜍(:gc>( n;ۤc3M:7käN6)uF¬:yäS|=aT'+̚b¬N64L:N6`W5}I$pYqN1=_tlIɳis;y&cұI&?mұI&wI9;9[1dw9&Lggt2&%l6dM>ؤsz*Ǧ ?[_mұ&&˦"&wI'}Iǝma,L:&I>lIkM64`M 6xälj!HtVI'>ۤ^sNȌ`Nz9U @bI'G~t<6|`Ept.L:a x|zla|&l Ot4?ؤ94L:äcsM:_mұy&6ܯYM9̷2+sc:g7q0Yaj6جfxeaҡ3st&Otή9~?9[߷':gäC0ج`ä&IG5tu M:?/MzOt6`Ƅ4laM&M:&'tlrISzt|}6&¤cӠM:M4t~l\gsN4ptl^I|3L:I5L:j5<5.bLͦ4ڤcM:߸o}I& tlYӦ߆9Yדmy]׃I|dC>0l!\M:5I0&G¤3|waұI&_¤ۤ~mtM<6ڤ~ntǤ?&?Ot Ng=ka<~6,D>yl^I~ڤyItI`M:TIg?M:a~!N>wc٤mұ&l¬7tM>ozm鼏6t¤3>&aξt:1o>ڤ|ߴ^I3+oM:a|t4I0p~&mNf4C>smҩ#M9}I}II&Tt*S6TvؔscYbYgh~Ia~I0xI0xI7t<ڤcM:¤h&0tXIj06 |h| N&*L:6kؤcM:7I0ؤaN}lќd"|ftn M)>)؜hN߄IJtn(o&0鰿&cämv!mly?}6Ltc04h"6`)&lyl)6YdcΣ~`ҩ}tNTa:L:&&jO$M:wIVt*M:f$j@z+L:6a٤Sy9qtw"IP0L:c¤CEwt?tä&o¤C&M:7I'LE%ܯ NĿֿ7Si2 "F֭ Op9p9aoΕEwNz4$ fP X,ft.<&h )\ ?,ŹtK!2Ҍ@s*%9W3hChN-̬ 4q3shN#͙+hNhTש;͙uEΠ9M М 4gDGء9f#|3G,@s:ؠ9hN4挤q4g\5 fIМ hXМ4D As9}t@s:19)М=͙Rgb 4LhN'ڛ~*4S3ShN4sY RghQӹN:hN: IМE@sz@s:Ҡ9۵I1hNciOp<3ci4|9-s4;BsZ4R,3b%:ͩEU SQ@MTWͩhj*gFsk@seDhNu6hNu-6h3yȵF@s@T4U7ߺ_Eyl9*S?E-h|s}?9Ϡ 4ahy<%yK1390=93_p~-:gΜ?rGUxΠ1OyeVe!:3VUiZsQ:'9>FAΌ~ԙr=xz@T7K<7 ,T\ SWgq%H"ŕtW|:HΜWk`u n:\ìNBlVVkVVV.53?Y9׆/:ʽkVx)Xfu Vg:R:, Nq-Kx/:%X-Ke<)F?auY X,O:;>ŽOgq՝YٙYyk=_YX{:vjb:~ GVՄ)duJ{ٜI3Nq.Nqm-o k}qm+Nq*N:+),n"6fq.=qS2ޏ)S~ՙ߷L\)-),joΓ`'`u:auʠV'7Nq;NVg^t=*:{0S\?6|:mYSg?lΥ:]RN<XauJTJ|SY\y`u 9YbD@YR^v_`6S]4`u {fuQjXR̞,PhVPbVfk`u )YRޟwH S6S6Sn0:%Dxͷ^L7NzVkau {sfuQ>VpbVyx^7qyY\nVf]B:mV'>?o|_>̒x]Ԟiegu)ڙ)^j43K6G@zV݆)Nl6 ^|?w} :.fus:1K| X V'C:s|3S$oZOj VP<nXr3?Sn:}ՙg!^mfՙXXL V'wXlIV8߄)-ՉV'XRϷ7|6|0|`gu"_ՉN 6Jgqj/߷:Zv)լ fub} 3X&J-NqJXS\[S\ S`h'Xm7륇2{C~;ܺ"y1S%`VVP`VVg;S\; S\k ShWfVvVe|nV7V Ny|~`V)|Yb VԬNɾ+Sy2C>pVV\,4S.,Z1X̮$j`uJ ͛~jJ(+쇚)X:lμ13t7X"`TάN VHyڶN1˗# Vg>Jܴ~U)eՉ Vg:fGNg=iC>`6 Vgb="ߑFVvVPcVgGvVg~ܺ:s}=a'?6|جN1 NάNVϬN1Q"D> 0XIZh<)Ԛ)*2S?jiVVV'[:l|R S\{ 3jz;ՙI+fueVg~ |%|1zxլNYxmVPbVgW~Xyj Qzy?jC>BE>|v(OZ?h}SY{guJ7ڼڈPm^fO5SSzYBk<:%:ՉSQm^ǟY_NXMyW5y~fw|>`vX8 Rm^ ֧+Nif813ϻYλ4x Nfyǧkgu"Չ|V'CX/ՙꔇV'/X_)լ +S\&:q?au|bVPeV'XҘ{>ЈΗ`c'`u'VYau#h' N:ecsoZO`dV)Cՙ)'ՙs<'Ie_`u fuJ7B>yauJ})ڈ)f`u|gVT|<>s?s Sm"hV4_|lN-x3bv];S]>>SeV)SXW)TՉ)N:1T,o1oAbu|gV݄)լ|s,N<7ߺzoyYx:)f`ub~ՉV':Ŭ3gVҬNix>4Sm:o1mV۬C:|bX:ѬYB=Yx}`VYs{<4Y+lVfuwחeu|^cVYϘìNŬN+򁺳:^) | a-euyrE>PD> |2up@~^V+yλἫC[|="`ڬN۬N vy|*xgV'7;:~^V'OXBY~x}dV&۬N~XWՉ)ךxkV'7W:1N?9|9kguJkV+fu<Չ V''XW:9E8:ѝހw=P<(t(t*[D(t:NP S)o0C5Qρ<gT'7¨eFuѡެ]Z!5~#ȝWTЍTg@u|`sVV$=yh S|թTx@uf}y-:#9V@ujTթFt`iȠ:PtnN=QNTgn(ԟ@u @u l*O@uVw`jo"`lCwfPǪ=Z@u{2j2[FuPL3:vFuryѝ9>edJiTgN\ꢣR?PLS:٥:Fu2BD:6Fklk FuKsAuzꨂO:T'DvP mTg^b-s2ʤu|NQxAu ?۔q3:Pz$Cf #?m.bƧ@yVTT' :1չKAu6ΨT'ڃ\Z-CP*1ڊP)syAu.Π:mn柿_Ǡ:W6ZG[~P@uBPmQFMQhdtom،sjTj6ϥ:@:ncTm`D}P˥:QSP1sqTiT',Oh46yQ!VPPknv'hsm=5Kh6h]Ѝh-F?vQVǥv;:YCnZ@]6hPU6\m/k{hhcmCcK:":׉mqhuV8kuQ#h'h{cNbV#kuYkchkuVHkuX(mBYsYs]mvBۼV'6/}qmwT'?Ц7:ւYc ::Zc맵:Zk2)Fl=V@hulAV:mm[-Xc-:lV:?y\n3ƿn3&ŶV㽵:FAu@h6c mƪڌ`-:!O+šW3;s]FF;[kD}Z뾣:.kuV(:їFN6ʃVQcM6&:Q:.Qi:BE_Zd<|IcmPkuBC>hZ*:!VgVob:GFuҼyQ4/ khT,KAuٮT'/N(~򁸿:i-Qi޼>]JUFuitE!VZka%:kĬIwՉGmBs1 gskuy<>UOz^:fz@TՉ T'qcT':W+ѷ NF 7N|^P4T'sPq}:1ހ$:1ꤏV' 2BuPDD:(PZ'Py?0^Fwo~ZZnVǚCku<[;kuVǚ>kuwkƎ@sx|hqkuh'ZXKiQeku.&5v}GuZZ t%{|fkxfe45xgbձZΫCcn|do|@QЊZC+_Z~VZakuV?ku?Yc4ZZSYVgZkա5XhuYC_ƷBFU[qg[qX!`[X68?V:n`58V/ku myڞ.iGչu|2`Qhuh Z#չաUHhuƗ$)EudԆ+a}ZdXN2jV'i":[աdhuРV Z$:V'A|h$k$}aLW?'u|@(Fu^21w4ڨNF"(pbT'Q/aT'33c7䷠/BuRFHN=7|ҨN?R7 | y3Q[| QaT'uB-(Tw~+T'ՙeEuR?:[| ukcnmԌ(H)JNu57ګYmvG@ H@5QQd T'q~bT'mh;I: Iͨ =:($Nj4ͯFuG>@Y}nʤo~˿/o??_7?H>ekl}~??7?~W??W?yÿoow?տ'(zOEDE;~,B_Oo,?oOrE/EeY4lNEe4bMKEess-#$nVdw.Jf;ӬxNc֩)>xą2ɹ;PWc{wqGcBMB]U&ygƫci!i8CL2;)Ϫ.Kǿo՛g1}Q|}QdvjQdvhQ|LrO?}M~IٳnzTe҂2]Y_Ǣ3Ty|:??If9I${*קPĿl|k?0FU&Iq+x2ɜ^T&9O2L2yڷEe3zyEuڧ߷<2uw y/IX$E7]q&}봮lUN*g՛8 2ciLroo:IX$:q4]zqF\ iݿ^2|U&9*__et:׶޷~VVz/⚶o[-@q>9>LLr~E$Hex25x$Y$,lj\Y2o[dU8^-$_es2sLrU7* eVxeu¦e3iՅM @ eP&9](l$GfEU('{l-gyS 8#P#~  K,)P>v1ל"))9Lr¦ K/8f[zaSR&9())R&!+zRR&V7LrINDZz m65\z6KdYLr>\ۢ3>_q&-뽔IjĄ^qrKlLr'St6MMN|uvuIN2IDK䄎2eU^$|2IKSY3ߓXpFLr/o_IL-[~U&׽LLr2CIs.pn?{I܋^m]볷EWTe ?@OٚiX߿RU&+{[tg_;~e$WU;R&>ėRvWK2w_)\4}G[*zIDLr}W$' P2IY{LrR6W]홺~E)e2IT)`22SLrU)T)-T$'ˆ2IBUӾz츪wI磣;S4&Ue{Ӄ.jϞTIQU&ߦ^MtU{( Y~qv^~i{[4?@VU&Zev~6_U&?Vd2z]U|d,s)èY~a*.*ޖ*.*Ư*\z25Ǫ2ɥxޖ_zđ.xov/UI.Cezk$/Ԃ̩#?TU&"?ಱ.)j9~4rbiU~>zW~ެxKz-ZU~i 4+=?+|ѽ]$9E○$GeWe$wѻ"YU9Vެ)kLrYU&>{[tg_RU&yת$Ed[*iשkzo?ߪL_(cR)U$' =2IV$gPƿtz?W/?O.-:)I?T$WBBo?zLrRvP)$~-@}۵8vfFIN*e2ɶsLrPW)JI j`~W ^[+e*e}$&V$ILr4$QLr-]wտ+yӂ6 Z6z$J R&9 ߏ2P)Q&9(#I?I F^~`Pִ292V\)U$~R&9XI+*ekD_~`Pfh*eJLR&9HL_zrG$Lr=z_(GT$w$T$e?2ABE׋/lj¦/ljP6])ۯ2AYdL{Dd|2N{LSQ)R`<¦:'F/`6YIv*emJd#Iv*e7+ezLsDՃ:Xүs5_¦YNYL|߿Wd؟JdIvW+elR&6\ (Y)Բ*OeLT&*?g?2ƷtQ{JF=.=>wIvJdDJdze2JdLR&)ۨIAOdo/STSTIvʠ+ec8+eJd|J`?R&9H(I2AV¦ ZAwO $eie$e+Iv $;eLK_hi K S:UzxAdJd'1R&YmIv2F(tYzOտOi~(ԶozkGZejLzeĮFdg˥wDW{?9l?(((eDFd'1Q&IkIj[KzOGG~sүW/5U&~uʃ_iIGd'Q&٩iIv0Fd'v?_ =<%~yLs,ALs|LszL(($D4$hIk/QT&9Q&IhI}mIvFdgQ&9Q&9`7ƓWW~(o猷{~(x(5$;'7$;>6$=?YտZF^}$;212NbULs,lL(4$=kY~5-]5e1{-LSf((`2Q&yW$:K7=O='oY~@瘏ڣ|`+?܊@'qfWZxV({¦HKjNOV*M ga@O~`$='l#KO/t*?087?uzm&4ooxMSP4A65,.>z)w-=u}t^M~gK]M~AKi~^޳6^S>77ZgM{t{~cKO]/Ow8w6քM߆߲?g_]Y?^SڟѬ?cBZO^ޓ[w=yg={UR]kK4>W=¦.?¦;~h?`?0v3'~z zҝ~7:~X?\?8~@8~@8~@H^0i'7>6¦pV~ǥ~z¦:K&7ԟkf ?q?r?3~~EyecSTO/a$ӿ~n \{!sjJ-k|<7m! |ihlyO|_o.T uzEmw|`rskOvA~`~ĵ[qq?0?~`~:p̏?0?~akfZo}OZ:s[s[KG?t ~5kt -\k#'֠GhOpAОZn=3x =µ}p~\\\O0ޚku{=k?kuxZ\{hOZoF3's3\ko͵o͵tZo}OZog[О[s=kurZo'[u~\[zD?`֡k=ޚk=ޚk̵:O%s\O0ޚk~\{hOS~\OG?`֭F[[D?`֡*kuZkuoZ:s[~\x oo̵t\kСzk :Z\ka}k :OopAV\ka\kС[qAF?zZS~5?k :Z/\kaĵ[qA}@h? 50ފk :h?>~}@qAV\kam?>~}@kt㭸֠x?~@? 50ފk :??~@qAVaa??~?0ފk :?0>~`|qq5v|? 50ފk̏?0?~@\katȍ?0?~`~Z㭸K8Ώ?0?~`~k㭸֠5{ktpA\soZ==B{k ?z35\k#'֠{h -\kx =µ}pA\륣k z0µC{k ghOpAY\kеF=B{k D?t+֠[oZ[KG??}Op.ak D?t+QОZS~5x t~5?Z֟=µ^:֠5?Z.oԭF=C{0µ=B{k :O%֠,50ފktpAD?tJpAV\SoZ/\kСzk :~}֠x+50޶h?>~}@ĵ^zV\kam?>~}@toŵ??~֠x+50??~@ĵ>x?~@?0Roŵ[q?0>~`<Qx+50ގ?0>~`|~ߚ4h-~[߮{ -丛wn ݌]w҂l=y7c?lOnۻe}w3v-d[O8eyl5y5C-r\s˚W3|t_>P>opXIxEV%vIi (g9_u1D{SDPAE*o{UqݑsPسg,qPzLCp/U^#=Gc7{+&ͳ*o+__,њȿ]O ȳoxMtAxV齳Zk#Nru9~;kOr? tDYDU:'$AH9n;LN/:MjsЎ&mȎO> Ӌs69\s Nw`N:N' Tg.H#:wtn@݌J\!Ly{ "t|P1II3Sv5POڒR73͙ u̙.H`*ȿn4ٵqͥU<봝vi;IUx+M圐f4G!副"*g)/I8*'%}Ir*u:mAK9̊IӷrRK+*'C)7Wɮ̊^PE,UxK?N[dNׅY6KDwCTN*ip:Mv-z4ٵuNqT6WNZN:/iskqMigJ+紹͕d !N+ⴹU\봝_H+N3$mT?VqdGJ ~҆I+9mT4R?U!}Oɖ6KNr(]}~s봝5IuΛ9-69is;ed_6ﴹz(]BŃN[H{IpIs&m}I&m%=iskry>iͤͽN%mͿ4u^N[ŜN[H{}ҧ9misk>=I%m/Q9yu*ni4r |)]t%JPĚ_isyL,}MQE4@&{Q9Ku]yD[ ^!*gW:]TISttQ9K4pQ9t6O9:m^N\NSD4k͕iNu\ͭEOJ!mn=?]isi)]p%O'm4=ͭx[8 isŧ6WuOFR9ݜRrUfJ+/i7ҭr]SwoW1^mqɭd{K&tU{t@5*KTN*G4bu?riqN-f I{Ԟ)]duOuCSq:PD/Tκ:_T/~u ݯJJJ[o\is~^is}'Nw'rӝr&Mɖ'*gߌ_G-r5juHZD$m>1﷮NTNfS9KVd3%C,]zydY:}nOoӏDxW~YZϛ.Jg2A&DxE);OTs446D?Tir8/niP9K+mni?:Nɮ⏌^mv:Iii]ri5fY!*gi2P9Kdsv:NuZ=TEWɿ&?_>Q9Ky~Ejk͜ 6t]G㛨=>|/?_EH˕MH~r\ȝ񉴹iN˃isisUMe+6q.w[ͩsV5-lӑ6w擤?_6wͭ׼7tlq#is*i4͕99isF75_" ?isi/6WK\yitۓ.xQ\?ӑI+8m_ mn z~y!m!mHk8m󠻞4/64isid͕dII+4;H[ä~6WNZ~i̤yiskx;Fd>崹<ְ{uisy8 O~`'*zON"mGܙ_6FE\!mNӘ?'m.;݊ܝ&?N[~^~ 45N;ӔHN"m.7_Kdל6F\ƿ;m.;-2YN[\IOH_+]"W}Kd6w7ͭMEWisiͭ]%eW͝iskZߧtƴlHܙO6Igr\&is8M~ HN%m̯H[+=Kd5Kdt&?pͭSAwO^=O?6wcE\N_2;m.fഹ}N$m.&ഹ>rqZ~כ\67sz>'m)]"봹4~@~q?<~j8}?>#m.v洹26_GͯH;isK^;׿H?ta!I[%V/Aw'ItEڜO'm.}O'mn+]"O)]"_䴹8-vo@\q:is%@\qZisx}`>ഹCZ/P% N+ N+NK!m8ir>>@r]ǟ=J N_t\qisX͕;N+N[?у[?P~rUQ isjߝ6WJq@aisY͝f ;Ois޿qyH+'L~d6Ww\qzisI[c iis?#mF!Jr6W'?`费3>6WHw\!]isTtk5I;isN+N"mN+/i}y:}viszH\vis^/rCI$mniuGUeҹ6z B\vz$isy8ߞ9-}oikK{8퇴rw~s[|M?t\?촹W<_t\vis4ly}is?;Mh? ;}=H_:m.; ?ziuh6[UK%is*g_O uO m.g~ᴹ<漟9g8m.S9/8m._6FH\vis99M~`o&TFIPzTϡbzәy"Փ7ՓUDP=*|S=y0B*P=T tS=%7rTS?*l}_Q=ճ&CTOiKzJe?T*5KM#?MAi2U<U=P=vÿ&*iݴGz馔zص;TO;vgNc9vz+g*>WqdzX8TC5|SkzLyMQgTO1D_jT)S=MTOgϮ]7c*TO?6vS=j7ՃkMT_*d+?ܿC$SP=cgOT%T_ u]Ux:'u}RߗH?C$P=9TBTOtkڥiFvLdzdu"?vSՓMqCjP{P=?9Tϡz)2L՝lJg'xfTqBx1ՓYo5cjTP=zCњPtjpTϩBɍMܨ"9;TLsbㅩS)S=c'OHz<zfʇUzLEI${UՓM@T U?'?@?Q=*gjA;S=?1S)4{S=9?TsLpB*PP=}3)ڡ5_k9?T̡S;Pަz~?Su)Nix8UGhgN9TP=Cp*סz|JC43L _\\g~@DPatoh?>~}@"㭈x>~}@t[AA@??~@DPato??~@"㭈x?~@toE?0>~`|K8ގQx;>~`|toE]zv|̏? "(0ފ :̏?0?~`~AAVDХ[ȍ?0?~`~D]zVDPx =B]: "9AAО =@C{j n=x  ~"(DP=o"({ o![ "@=B{Jo!=@F3',"(Z=@C{ DPЭE}AA-DХ 'K0BC{ ghOAA)G?a D?trAAIDO:{tAA-DPС*@]ި[za zD?tJAAYDPat m~"(? 㭈K8޾@]:CF?txE]㭈xF?to DPat DPС@[AAF?t S~"(? :".DPa@DPat[AAF?th? "(0ފ :h?>~}@AAVDPam?>~}@㭈x>~}@? "(0ފ :??~@AAVDPa??~@ :"m?0>~@DХsoE?0>~`|y5VDPa?0>~`|au@ &6 8X4^?0@h<@ko|\tCyM?qN&!O0ПN" >y_ϪFr~9_tY3E싳7St$% lvmtP_v&}-ʪ٤OzXBH {8 '=lgYYOgY[/!giv6b1pHSЋ-~/h뿧]F/3=?ݕY B]8@Mg)kleGϢwg?@O?lWg$uOwOgleYlqJ~~̘?$g-&HJ{TglA|$JCYNYKNySt+RNtϹ2< ԟSpSpʆSNQwpJSN* 3A!gLNY8W$gߢ b{;$=g3ݝ N3|vڼȿQY< f8H4jnKzx}=_pߎQ4Ih #-fI=>UZ ͪȶL% .~fUzD9 zfdͱvNjôĴ @pfd'fٓA*AP(!3#;sf fȺ!\f8OJx2`qҁzYyKf['Vȿdg7C7T̒ w3 12#;gw!so2sKIs#g2q%'tN1x>ZT1݂b-ČA_'"fZu%ufp|0pڔX01 3pt"̺VBp 10V{Z.>iϑ_2{~>]g/B_~/U_Q2˞Nk%\+Q/Z zYR).{:.NG}qȘy -e80Jf.;^gO|!hXr"],"瞜QdA7920.;Tgoa p[x·櫡D櫡ttz-gb#eMli=Yτe=WN+N9Hzr3Qh>!^<@pĖ e2/ gnug,ȲliGCիcDشLV`XCHp,e:D$~e:D +LaWKLʄ\2b 298le&]ȱk% eL_7iV tڳ(kէO39~b}r_'Kdğ Ztz8E$M4+dp) N9Yҡ3e7C37'c 8No2Y&^5 MqW\"nga&gd:C&sa5."n Aͽ5]Rh_R/q_35;NFH y:-5<Y2n,9+Jά@+gACTɚtdӀq̜IќǸ3P& J\ts$Iڈ`%3ݓl4fd-3nvpА0%dȎi"D,Yu7MOO#K&K% R#gF +rdɂ,Zȶp ldTQ5w&ԙ[Cg gv#x-^~\dTDxu$.Vd:~zi YGc&^y.1*Ȓ 9w3tQa @rŇ,YZGyݢCqCaCH# 8h:wZTjk YAq־@B|U" 9v3tCŃ ,A<M_ǵN)' f䉜:W @|Sj {klɊ욯З3ExEd,c@N31Ngc_K21/PG!c8A<94%ccɂJk N.8wA ǹ ū vBqP:Sp cθ%eA84N/ .Djuz8EӄלduZQ 4ƒ9tSsSm `6 qniίWZ: #;fw\^a/8Ȏt:>iJƹ 4֣*).zhIyhI|yg 38 oFfIhp /f]\wy2ׯALƙՙ0N;"z:z:^tgY9;fr+e{"ǧYƠ ëPc\ °Xҡ-S>T:W$p€A 4ůU{ًK^i,vիDxuZͫzW ITGtqZ%b8Aȅ7!.t䋦v[XmdCdAӓ9PA&7-Ip^rŘ),IIilhbq"T4+^1W KR hZ[9X*] /@Ux0"8QqZ%Ji~api.8jpcTp8?bpxAAlgp"} B:8nvO"&&S1IAZt6;%B&N]sWO5sOg'Fٴ*5sY݌{7+oPUe;UI̗W$הȡ$4%Q "`”D!k?I( 1$:R*<" l ρ$EAVu6/:'=2#VEXa]TO1={J+%p Xk0bSZDĢК9I LሪχLB}GKXY`1qA&v%@ G 8h 6)'j'r R؉ XG֑VX]Kϣ wJiS2zkpC{AKrE'6uV źz'@&K;҃`yzүI+Pѓ*z @hWN߱ta =2x_EydRүI{0I0OzTM{Jh}*~b,ˆ8͟u|sB7&D <k#k>-2ϼ6z^iWϏ6IӢ??|_C{ߛz$g~̄0iJyS"Sn#k> ޚvANֽ]vӚf~|in"c~q1&PO4QWwԭ_ )DSxL|<Ňz1gsD$=.o]ߘ߻?^O⽮8o2dե+LE80wE|g~33߳Y/ǃn?"FV{7mRTC5&ԿtÍlބlg~a.#k|SϩG:o+χLpg~sx/do}Y_#㷈U?$utW{%:SǠIkɩPb3 5 %]LɾT/*j-d?WrN,Il6~ -a'0VOxO *vǸ!&0=]D?<o 3)M@4IS{wŚNLDxψ6wM*7oƷ"NgƄ~ N= hj56(d%ֻ񱣧'[?r'{4pz"ekC&IB9'Jz\<oɓ}꜄ʗ?0);=7=P.j ťT{>㭪儦񿢽Y~)[G z0Pi fjuI=?V<oT|aNP3T9P/Ve&_Z#?$0OQ>NSS}u7_ؼo)E麿gș}?'|<93[b&p/~/f?f^o\?yNOլ̣#i"fxez[x =>PGj:>L$OϣSL UsN)j~Aƭ[s=kS/e<{|`LJ~xkfMWS5C7o{<oI| Kz~>yMksۀmPH0_K^5ީVhFcB9S7[ O;~z 9~&oN=u}7E?gm\ ξ_]t?ozߚ?zߚI笿]$o~8ը ~?`T)"߄q60m|2#|b~ɯ?C\]Ȝ\9~6gk;#]x~9'@ӟɽw˷f[dAλ r/-丛 n ݌}l-ߢ>G`b"s^neS8'ENoflm?I0Bpz(W  991oz5= Nl {sRdtk92o:[p7ݕn~goܭ >[͉r3!I`@A LLmt uِH?R@H)rJI l9&аMvM7lOֿOhLU\n&m&9)&rRJ~-J)YmV}'$5>%/I)IŰN)Ih $.$d KO ++Ry)%d<'P}2)%oăz=^_7dSX7Ӵ=.gGߓU2L_׹>*dhUr7Y%#/JGVIz5ˑU]AVɁ*I u%\ ^ݟoYȜ_jМ[lza(:gگ9'O|Nf~b>g&/z Y1Ysf|>g #}ds`MkhÜd>>g0(|N2sx $?$ú9&I~sR7~aS0$9Iռ|k$ם>'q>'c>]sV->'qʙӿ+ fIwo缾~O<{|Nv8{1CsW;|iϡ9y4y|q=qׇq=q=wq=oqﯚ9X9 >[*SOs꧞~ٯ# ץ|績|眴N/5z*9&׹9>|Τ|Lt:c__t^;]+5sxS~O ~|_7W_8|?^|=y2cn|C6cT|]|/9Pͩ߃_9{θ/3مNIdd_tѬCa߫?/?4V<Y~?ίYP*`;]ήONН=y8zgO*<,kV9~1ȿy,Ź+/ـ{N)9ʡPB {ٹ6q 0myj?&x(xDyux_xy<7ϓ^Wxyb)y~'i#9> $@u" ~Ity~9o<sxN^_zx}Rn']3|>xÇ SPUTO<'?xZ~yNxZRWDT /6~x <]y%O o<]d+zGq+zZYq}yp^%C>`}P}XoS S<x$SSo\/ fG>P|/S$#+SmSIB>PoSSlG`cY>v‡O!?[p%"穇 c}SO9 <ϙyS<W<yߐ (|oswxz2LeȓTt<+yyʏﹸJzʗ/2xJ?Jy7o@'w|Ayr|ߓ<_DN>?',>@Ox4q9@zyjx>gx}~N9z;zyy7ii<8yyOxgy5$h<yֽymxz iWi y+5NxVu 93X.EyV\GyZԓ|U<m[r]ݢgPU g/a{g؞Ya{ll=lX3ۣ l#(lӕmޜ=>dc=O^m\a{fA{M!{&8 e=jR3V=MhrzR&3~dPʮ0o탮׺p0e`^^C6YN5; Zbڈ K/;_='K+<З q$_^E9!x X(-#kZ(o)X(@PX(d7K 3wQjZF2KH& Q ƺBd4"uFFƚGd4h$( AFc}!21'2*d4U&2[9#32hGd4S+j]24e4h BFæ29#ayHDFsht )z^")Ja")x"s8(|USy0j8 2_%8J<TE)|uZGuَxeWGST?|Cҙ{oAog 29Z2aVJ +S.ʴ.ZFBt58jNi}5>rVeAUSdS3 NerL2E+|dVGa)1BeZ@e>e|GӴ7V6McIqP죤*TTd3rEQ(t) %uGgߍW^$I7?tɤp^dӢAKηdqHK`%shYT*y%{?))hd ($ÓL_M0&9CX0%rCo&yT܏ʔQ)SdZd^7{9=/;{9}#1}/m"?ȤRrd N.ÍLڒ jd :ŒуL+r'ed^drR.2n -2)? *XPddeea.e@"SF5Q "29 DF9{#AAf"޲ S(4 7HGCYNx9`iviyI"TA5T~LG!?a?a>c>c>&R''\TJCdWxMpȅppcZc91#0#0Ǥ3PH cBAxL Vx|Ǽd9ͳ1/4}Ԋ혗N!;;:mu 1:aD*6N%-_͂s[ `1ː4.(dc"NmdT{rkٛo@. r1J p8oL!Co.Ȩ:fj9CnL nna8o;jÉhc~L|(Cܝnٝ>Gv,ƴ-ԽVc11Cj\L|yiLcjBjldiƕ&&_y~/x/t/p]6d2-l0c?-8B-8B-ɘV8B-ppXKxgW&|3wb8wCbLbƴ0lZHVbéc1!0(_b }1,Ϸ0U>tg.apQ18n9td9mK SQ q9_d)ophW#e l jSQW@ir89 !HHaRbJ\p b>Mn˨bp˨s_FP[ g6\TbRGb)S4H԰,XEt:HJ:HDݗ1$+}RL= (&m(JQQCb*T@1oyOL 'V[Oϋtbbl7f3rZ,6"jbBey٢|b.\NO,DFӏ(DF,kCJ(1I&1d()$H<F + w!$L[$N>b.}<9#N8b 1UIp2b*>\`S8TJ@DL SY"@N' a qnl`9d+ܝx; )ܿMr80|~&@@I??xb0{?rS ~W=? !i)PS)g)aaT¹O(bRRJvx0^N{L 밎8E>$r,ie\De$ydDO4"7V+7Dz631P!Dz79^i^?DV '|?' Geh'|wa{'۟^>c ?ho827Ox{s6 '|?' O|.#@7;hMz+ ? qrNQd&io!@c0@+EPނ##@ 0_T`U&ԃhxY4thx;|X6I}S_mNYEFB3e$67QFRqQFRقPFb)e$6PFl^Iw |diDh> \L ۑ\%2eH֖CoHaH)#Y7͇ޔGFbsme$Ţ`d$E IIQނ(#@FR #)lV)#9h!2r!i>TRe$D"#)_Sϟgi>\SMe$ߟå._{%F I *d$Ql$Ɗ2GVb7G#BFRxJD"*@ī8!@GNڄ "^ "^WcBI_ Hl}V >`Xbz\K$EL"}$n$A$v©VL/dI+؀H^K``I i1 H^3$GAW؂ï|;7qa?Ӡ58ǿOGA }@PI^MIeMI@D>! Y ?ixd_ H4F" i6$G@,$A@,A@ؖR@n4k " Y47|=%HOY^k]?_s*X ":_I:PbF&IxI>III L`[d4EAI"$ý(@)|@@I20P-8Kd7<;m Hr H{>XqJ4# iV# i 4NO4Ζ節Mi! i“HЋEr^yrH tO$&i0)|P@ҭC@ҏ`$9@gͮ]!n!~5>uEݤXII3f$Q`$BmHno$HnX >`?ƊSHzQXi~"WI{)yC@>Ɲ$H]Okw$kﯽ& M79y4ZHX;LI;B4kGcyB@rw$|Hv 7p4Ii0XIS@YqܣDavj$hԏ) iBH qScAgDq4 4# f~$"L$ 6G0s=Ct7דfq)&29> QĆ] HZ%h4qb4.9 Ʋ~͆Hl𤀤U9[R@0! iE&"s ~q13mXBhxnc4\O! Yw%~D@ؐT@r$|3\/" i4\V@Ҝ4H,I.4F@b6$Zj$B@Ҏ|@&k H'`La&Ćl H&hM:%@S@X @MI?6~ HZF@Wy4I;B#F1" iRH5HuH$r$Mv.1$g>A@Ҩ>P@?4PH*f3 H\) i# i # qdJRSN>rc?yR}W$8p! 1R@,xD@Ҏ|Q$W$!xYh8Yp|Uڟ~K)B,=7 +s}ɕiإ4E$ {I^__T@ҫH$( 6t" 4Q@QI2s}H zt( U7cߺ˓*;$*HN<$݆HW@*_|۠I0x$TpېI@@ҏq-$ H:Q$5|@  H.뀀[[+ B@oH5HB$|}E@ҩP@9OS@# V" I(|@!s>dmM<_4Q@rH.Z( Yp\5T@rJKn,JD@!^m`D@r>/2 Ia# s?ty +8@@G@ w( tQ@ҭ4F@ҭiF@ҭSF@ Y[bxO>H:\D@) 5yr! 4V@r?$* HAE8m~H:PIw=?!"q!f|>@@?$]I[F@rK$]~ $ vKaH3># |UIW8_ b" RH<R@tY$( HzH>eWtH$gB@tIxd}|K" 9$kyg_0$ɷD@rSH $g}+8@@\O>@@ҫ–kο:1]:#F@E t* x~dnĹMo$N H6Gd]11_\$?( 9I$]zɺ{eX_| Y_>'~|q[8gD@y_z$N H~W$C|'$]^N}kgz$nHN>w}'5/X~>:1z" 4V@r߰9DIy^d|>y>/2:|'tA,P@:r D:9j0:ѱ1όdʰK2:r0:Sh箿2@:dY)*Qs| Mb:L祙;X1usTŏ΃c:X%b:`:0G`:4@9h‘>0t֑I&3LLG4c:ɑ)Iѡ)S'tN9s1J))өXU0zSob:u}Htt`TGl&%z:t+&LG?%xHb:p$fđNNz=R؂ibV`:M*I3s$ލϑNbNɉK#')9WbK)i;zsѤiJ0(9Av ߯sy@v.0 ;dGхNAi٩z@vt&s$9M$GrU[NU$"KdG))AvDEvTPDv N^(HAd )Ze@vDoYX KP%_$G#>;3/NyDRW$wuEvy27Fx+AdXB SH [";ePRdd'dͿ쬓xcsR;)Dv = Ev [";b +ȎNN*N  ;& ;b";QRSQbIN96)ˑ\Gb 'Nr ;:~ȤN9" ;H'*t";E d0*Sȇ)Hە S>'rB9+VBb<;Ŗ;B bӷN7PS js" &opȭ/S4t@8H,A?u? Fr"W3CD Pb$Iؑ9b猗;E-N!=)& v;ŊMb1Nnukb-? vD*N@))v) vxQxf(Z_YY@C%(;CwO vJ ɉ\`Y9-ד hbwb`xW Zpwj{q.o$!/j҆}~Ɩ.@杼l/eBE{ ?) Ħ9(MBf iG(%uE)Mqbc*bbs&9ĦTnUn9vج &>%unt"6E$L8 6E"IAl r{Rw)xElJaAbSmiƖP"6N 7$vb>XR3ijobs 6ψظ!b~ b W_bI MDMi^OJ%v 6nؔ$<ȶM/R bS3/RRbS6rxgn/bSP؆MĦq,%8 6~"6~"6~"6|{ظ) Mg/ﻈzM)XX[bJLؔ/jSXb͊+1c8> ǧج[8d ұ=|ze_k+p ;aO,g!keҭ}`{ѾUTғ E Hf=zaf} 3BtfV`%׋?z2()uh)V(wRD楇 ;ͤ5k#4zco =N| כ(M͟2wʭl`ciP)Y?ܫ@3afS]dd~˜'6ɛL)k.g<2\ΜEaRy#eJ*|akk`5Y[g}a X` )Iכ X\jo^Ҙu%EW`e$L)jJe )ZeY)73LpIX 7J ,B|z)pM-",,Sna V9e2`~X razX+t)o2ne wa6eʁQt2E9LM,SQ˔L9 +{5{2aeYXA)Me0!L9 +{˔hf/qt~zǰn)8fz?s=ܯ2n ˔.^LQ[,S89 L)2ELXؐ[X() 2k!$sO…a8 ,cdarDg ,s`BeLA,,sg`+ e ja3^˜X72IX指2E8Xf%/+{a?`2GM_Xƣ)auUwvYGiO aZde_<}=0HVajf ,SX֟r~aFejSX Tn2M TUpՐ2a+e G2X2X?>2Lu~ll2m/!'.''ޛxF?'̟xs=O|zPߞiz]֮i}R~i3iW<M[04mN 5,o`4;>GcB4qXPSf]_jsCӴ ~ NӪӴ"v!jK;hZ*)Ek1iXSȚʍ5axз֓5 _Sϻzsa~jÃج06Kcm|(Xk̦Np6uZЦNpkHuR fz66~v6ͺ܏=-m~>F4ɐ=U$%wOXIcmp\O}o4Y_7'Mu{[%FzF腔.~ ԅzX_/[ؒ8c 3^3ojweq}>_8C[ ,:+#0`q xOg.]8,ΠIg QTnЎ_b_rŹ^Ź]8,EYKbGJgmŹ.Y8;88W7kaqcm|{(gw .XF؞H'8bY5؞GS)ӏ'gwǑ颛8MJ]#),Nd8ű=,N9]%gwvb+vbGC{Xn;oX~ɦo8鲝8}x}ǻdR|+w̴An\vi8ű,N?*X]_⬴/G:dq:缲0s^Y9, ze[L/vlaU$hM>{ګtۛh's(8GOSs8sXn1#,{&Cv=_'f~=uU}EOs:>vsht9Epv9Vck9G>GcmsR>ρ;af=(0Ng=_x辄q~:eϟ^gVXϱM}: 9ҩϡGAlK<%~Sz] 9>b>a_6-0:o/65]6J+qڥg?#0iWNl`.;9 Sh&_5wi/,oFXG9: `Ӫ9`v4Z}io8GOƩ8ƩGW|Tc8ՊW` S-Ʃ-ԣɉ_eO`aj)0NUGS)ƩSG]N򁵃ϗ|~+;q*'80NsƩƩCƩCƩƩGw?8*>'~80,0N=뜐LbNH`ms@`JazL T^`j;4߅`WX0q/0Nu<Ʃ8v8ƩG_x3Ҿ\6_89 7TNxq4?V'?sx>nU}κzts\O9 }NCTu\svOHgOr8OƎOD[fgU`|0|>gaG:T}N9lK*8_}NAS,p>Ju9U=+6p8lrR>6B Ob!|8ٞj ؞M"| 4O/\k/οe}腓|f=L=v=ly~a{;`{2`{llO}Ga{لNa= , s_؞eqf=U2la{|e{|e{>o֓aISS%ՊKThҤ6=M za{Ԫ·|"8@!@+SgVDTt~=9@*|`|ٞjEx9@*(`TVۙԣCJ`'PO>硞|WW*`{l^"Smocoٞ*[Se%:q>q>q|Y8%N؞Ze %7&t}z./VS{)E }N9Qrh#zuT$)O+aD }z L-T,s st .}:w 3|^zuM?/sTR=ϋ>ASLN= ~XVIs#Q}Ί!/D3l%hs 6émS$pD!nKQr u'AVJAAG?nE"|~!A D#H@=AAK/DDPߏBgY91PI"I@?9y?%\/KыA  zZ" " # AF%$^%m @AkAD!l!l%T*'D.$JeYDP1?|~ͺDPaP"g:/DP?^M_HIBh~IΛ$xT>S?"?*KCB?DP[uݼAkC.CA9!T {K"DPQWTh#dsS;DY?BG] AH!!BDPyXOCG=c!"謯 _%q7~\Oo|zB}q oA* 7^D7o<"O٥9^wg/Uc>!s]'8AYjAa"VXq*CA+~%ZMb} !V -!"hű=Zq*CBfOb5DЊMb}ⷈ?<7{|UB!V A+xG+Nw4>^q*CK "h]oA8PYgH8T3B Ah  7#4jԮWkG죻 ]S[[5G81j">D",/DPSp  H?j2"5 A H@Ԧ"GdI DPSp ;D-%DP;!Vֵ)Z1Ү\5!"W 񵉠vA+(DЊq"ui}c{'~M!1D~>Dׇ3|ۇ.ChO !BD"h~B5AṪZqA@x| ފ[AM-D~;oB8CAO$|hB&Z/?ܟ"hI|~ΚoNB5A+P'~p~Cϛ+D~_ԩZ+G"h?xͷ].DPS ߧI|}{$|%B%y}Z1vMxo!Z?oS'~  5߮BBJ$X@{|z$;O봣ZAA{~kC8{ K5^U{M=DЊ!|Ոtaf~~2Wr~ ̧!V<|۽A%8[C(̷oBiY!B(uאHI> 1 ԮA+n@k|m'ޛx@o翈ܟTZ1v!ϿO>p>Z1zoA+~$F׿OK>G#rКo/u,!V'ukJ>pJ. A+n|wB"$~|{q ֧uߊКoC$XiM%MMB+<+"IBϛ|` Ub8į +B8!VO>0 穘TC%h O'~sRa߯xp h!X M{I>0$B~MinA~kBeov/b A+B3RA+~4A|`X" !V A+F| i?_"hxͷ+1DЊ_5>4:qADЎ_5+BvZA+>#"h/Fb1DPK?W :?ZqZPw"hG!VH6$V&w/@ !V A+P'~;kB8g?"h} A;{|r b4į[=>[qZy>B'"hŷ AO1|AW!(TbOO7 A}y.C!U_޷}7 6'[~K>0$tC޿Adk&I@A;w7t7>c%y.B%8DL!1"a"~Гse"h-KJoyC&~7J>0$N"C7׻O~o$R|G!K>0$BXB"v|A)D9Oy ?"h"hW71SޯA;~SƯA;~{ƣAmH<q}5J3q}lZq*C83q ~oA;@K-yI|g9GXxgz|Z!V7DЎI>08'uA;~d" zB8M!"hǓxϷSid|@"!_D>@ox6 |;Оo0"'@5;$A&|`譚&^co @8wOyyAC>r& v%]$hEEЕ. A+"h@kÄjA+x".Cx5>!~s}ȃvy@L mJ>b>s=oBx>Ohg!V\9]!v>vwՎ| AD~Dn|@wo|%P>g|z x_Gjfu?)DОO$ş?o~ڱP|B>`EL!bXQ"h7xz?[?&+ # vşR"hG!̷t8:DЎ?DP.t|:DЙ ||7@=_5bTxc%f}>DО 1-B|J>0%X$"*KEf?ē-3߾4=rJ>JܐhA"wA;\_*B:DЎ[|b>η|;?DЙ!'Tr}ԗ*4C"h!DJK C=Pη_ώ%f͗A;\_*C8Pw"hǍv|=_b!v`a>?OKz2`H!o'1ߧ!̷|@أ$?ē*5!L$D.K|!D>~Dޏ2D/b-o_2Jxf?M>07CJ<']}ш>%'yBNyה+Y}!V\$yJ>DЊ#.ef!ڥ,DE> $; yd%t:A;3ח+DЎ+ !yFَB6>ן| !~?Do"s6|C;3ד;DЎo+SO'4<ڱ?$D9υϧ?s^;}_#דm}'\o-T_yC/q="K'<A<&<B*A͎A^f="h\W"h\I!J'!S?M?SO^HR3׃#Y_%F'A&M}$II!A~ߩ$~v} !V'DЪ"hCzn}_!\Bz)]O%Kʏ%E"M}vA "hM.m!v|w]"Q"h53S?DЪ7i3_ /CzA'C"hY_j.I8#DЪ"C]Կr6ԺDv];gqC j]9DЊj]8DPtT=Dнl5t:۱<<@g3T@$vt:t:g<t:@<zNGpcxՑy egeH}tx$(g x ~r ct Ac}x1!5uV A|XCP`!iԼ?1x AMC`t TaC@ A@ Aux=JS_!QФ!Ij/vp !< Y G Aeʟ`CCPy02tT A%CP~b*%0g Aё*)4U1CPc?v@51܎Ot? At!hmX>僶tO AM^uwGp Aס#8F3>cj׏ZS?cvi$!Ȏa CPs|Ԭ|>1CPӈ!#ɛ7 Al?;>b|S:z A?c !R!iL!H AAGO:iZÊ6߿߆"_ z5T5]Q:~XO!he=W X?_54#%/!:tT:_](M A@!㢆KD A3z CPc>q\jZOq!g!So!S/!t0CP}4G ~0u:i·2!~2^f~t. A_CPר!~aE'+/\/`(q A5516p\^nG =o^[ AICЅDCZ C!> Ak,Cp~t4/|1 4(kKCИ1Ԁ|`2 ϣ4vxtktM$|NC4DjJ߿c阢!~c(S:>0vt7_@k0vt!RC:_@+NS!ho`:%+>WCИJo6YO!h>yS!hCЩ4!b>*-gt A㒇I>0.<N=>~qSψ!hQNCЩG4P!0 A>Cи4.0A1䅒\C u^&vhT4&Q4,jON= + A>CFF A|SCЩ4|1C!Hë!߇!<!ƠCЩt ACCЩ48!htGqD其oc(+ AÎF%cĽwy0(4 )!h4WF ACРCA? A'k !hhtx Az?P?&߄1C!l A CZMҗlc(FW A+?1?J륾C3 A4w>O#~~|c_C`!w#tz|@|xy.'91y>!tY/!ֶbxgk]C55a:<2KCto10]cIKCu :h!h};8o\.:jQCWxDCХCХC%O!0!0!~&@~r> ϊ!j)xUytt?!h6eB!*0.1]UNͿ<tit1_C%ߊ!8!䋒\0]i_tQP.7[>1}{J޷70]tttY!Hc1>Gڇ:_C5tQO!z Aa%{|WC%!(!h!hht4`!h/-כg}!70!~txZ A(D>!hCZ']4x_!rN~!h<:'!hh$txd Atc Ak^'[~_:e4  ;!hCа<da|`!htyttxy Dtlt~K11_o߇K!hht5 AyCtJ A?~f!hF'~yb Aj4쇃!~}!1 W4 u1?!JCи4옎!ƥQ'ϓq\w.}19>jZ?<>5 '5>o:~%E>pQ_!hp>!_qTC~'+SO!> Aa:C4_@Cа#?qi$JGp5t.y&q]?C'1Ft@̷Ř7x~r}OCp|33>+ݎO4!~X5_hr44a70 # A CШ!h7vA0?ߺ1ot|y!% A4.o8>B} At AcF< A4t`SCy_0 ~R AjC>!h`44r=|?|}xj1*oCА4| @ոC> O!nw!hT 9ֶf%+]CР!hhLd; Ai|0  A}4: 3c(b?cZO^~w'ֈ}44@a> CY`rNCƳy? 3@  7_O(W>c7~؏o&?؁S.)7ή{icY> įp?/1ۥުoQR"qy83?l4<^HLqԙc}&g>Vy>JԐ>k|wSd9dZg^?Aw3y@|f63W|=S+xϤZgV?>Ua{=gZ(g==b#zֆP=M`zz<^k>t|y^ r|>]Lq]M籘<03uI院3;9VH2@p<`<4ϚyD&<~evzv< ;F;B;uSpG+cx`ZX8TR':\p:ړ`:V(#?\27{ ::ikT 3k;9 3W2l,P!s! 3Ű7TR(arxl$!r 䜗={!lVX {Ϡa kf5g [ FkVk΀A V|(/#s3\yʙ֟;D7@<?Ӝ=4Cg`3ԇy\#9#HA Hs&p4`03/y.%9{I}04% 4gAR @s&33gN =evht 9h'}cCFX#hf##*W>̴8̴a{iFx)\f}?ɃOVGu> PBʼG2o(̋ L}(m7kPAdޡqg6 yOM﫜&p#s UX?8[8F}ptu1f1SS_6#c '1b1pL9pˁ[<ï ǔab_bp=|cj>*NTɁc˿W88SKj88 Tc*1Mz`~U3zd19MNޅcj}8Vڄ_# SYWx8Zj*:qOC)s8>ʅǬǦ4pLUSd 1bXjsj1-pLu4g4lT Ǵӊ?_T;pLkhrՔ 4Ɂc1>vd:cŢ1bIpL8f}x7xrcpLc,IƧv427_m>4aU",X, Ӕo4$1Pv iYSpLiOsYF-cV3\_E16vd5)k11&|Ӛ X):c h&F<|}i 4քo4c.&,~oN3GXMs*`~5d1bFpLK8/\D8Q)(^i1M8 c-|b84x h._8f 9j.cl"ӔG'pte1]pLpL~?1]9pL8;tK1618~Ǭa41P ӕWtaG ('c'p-cpL?Qӑ *ï8+s4_YZ/fIrXg{%HNkLHu/ /ӭRI$A"q"4Q,ӅcC]#',os&ᘶD1\~iK$8-1m D>ЖJ1-apLKNE_1l8'f?p̮i,~Q \o4eH194cxa?2r}~?q=1^Mg R8f_Ex Ӛ2(k1Ǵ*C>PocF/VYRD> ӄKcl'RvpM88fƧŁ1MpL-pL++4c2 X8"K%&Q W! 6_1u D>`)S SOJaz仏o7cwcсc 9>_#ϹzD>P7:z#YpLH8YΎ/j_ (S+U cE|1uoD1\0p%1f1y?c"66W48lM8Y ,iWcrV,io885e3?q=<Ǹ>iO4 cYpL~1Cv t" 8-ج[8 ǴB|1g>p}ᘽ{Xox ӔyǘǸ c[ᘶ~d9)pLSc&ӕ_td16{Y̥ڬ1]8f?xD݄g|m t116|`gЬ2aӬ6D>/ac5g4E6D3]= Ӆcl/c >|!<@YpLy4?tWczh")|ӬG8+Ip;c:vcޟ|'ӟ?@W>]ts1h~\G\O1^Ѭv )pLc pLFtcRc3|>E>Б5 t16w18s^!ө CYKcl*;pL"[Mf1V^pLc&8FypLWo$pL>@181 pLO&~2Q\1]88f\@9"pV813cxᘞpFSp N{+=p16_ \6_8s-9 D>pLoFta3ބ͡c+̇?c0$p{}6`.  ˬhVpL51^Ǹ-?c:-1]8Wa:N1]"pL+_#ӕt1]yp/1]%pLW8z\OO{p>z,r11?} zn 2Rχ.^Bvon]͌.GT]EW]8Wlg.rl.gr&1^=%f뗘yu={5h8WʹˡfZ1V, n2[WmOLtU _i<9~Ӆis9V>֬ 5 hZ$"4-u.ş?'~ ?'~И3S&Q4GOU,c9GՉiRWOguq:K= }CCzl 6G ZCؚot7ч>۠v4Oԑ4_4q\ G{P6GjlNy?_9*8%7t-g)tƃxCm'l7g[H?13>WRN="Ύo:y:G'݉gc*=~T;ֳ6g'=;|`B7iK|v܍|;97rǷo|Zǃc|,=>[;Fos70  @;|`Lsƣ v<= !%|;:#mb4|`<GįG{v"Axvc*a^A; N!vn& 9'~; N,Tz "WA;ց8^Ê ڀ\:q|&3DЉ?DЎy"@{`A'DЉ=>eEzRǧ"JON쿯!z3Jiڴx'b%ihA'~g\ϒq=QQDPb5Jڔ "hMhϷӊ@;vA&D>0LSb+GVA'W\_TL*f:'~Ag#I/Q:}3`d-DPKXA;@"X4K} #C>@DY7$AE>`8z!N~㿯ȗjsj_}[AvAT$JEc'(~-}AկiAܜ "G6 A8=>m$ck?5%~'A~j|߬`"_:o|lDйN|߆:RDЎ!F쿩+"h_"]~A8 ڕRDkA{PtAgrد+C؜jǗОo/ vcA>DPS "hA? A%DЎ!bΉ}q=NۼAwܿ:ߏ b$?w|xO='~7zۜs}D>pqb .(8߯Оo/uA~N(KB3$|gc7gnqL'!mOK}Jq> !;8K' "y ОoC{q@{U XXԬ01:uAW=vJA:b;nC{}?OV0A߈G\?n~AD>$?C5+ D{?jItޏ s?*q~s?:D>%1ԩA ?O\O|j"h9;.{Mb&_?{݅דxϷMSA- v܌$ 1DN|6sljDЎcSjӬ1MA;5j v 8,v<$|[DѩqjE>POq:\jz׉|:j\T{!v t*=V f GhA`}GbA; >"m0$S "hSbhϷG>P+A}~vA5;@j @m"CDP7!O v'}? +*Ȃ:߇:Cߏ|J\txη"h|pǷОo+DЎ!r"A]MV;DЎ,CD>P!0!T|[!8!vAq֎+AYKBh#P| ?3~qs*qT,qTt' =֩'jpA9A:XAg|\y~Sxct3g#%D;oqZ0O%~$DЙ _ƝdϘOОo8|`OA;"h-=>%ADPK23_P?ηgUDЎoRAM"IB5 V:J|,'!t"hq3>A@s"_$ {'8?I:#Կ=C0tt~|`ߟ :3}EtA8&QDߟ@M4+z:_'%gpt X ~k D7DYGbhqH]]"ܽޓXs\x4DЎc<,c(Pc @I4-!A'@߮ 2z2z~^bhM>d>M>y)DЙ&vعojI SAgPWb\?Ԓ"%ERt"\_|z&C>0ݐL1!EA==/zwAgD =\o !Z|@H;t7!y!p=2H"yvP"Jxߪ5?W 4;AC /K1"?-滸 ZAaAg>AAz&3^}?̏A"1BwA3q"'Ɨ r"&vAzu,I><. 'ۥ~gE~kI>`ǍI>x;%C>^ΊA-;<>AHC$ "|xx<C> \O_]NASA-Ұ?3~Vt|#[::A!~"| N>w!"AoD7#7#Ɵ.Ή_Gq=DЇ@ x H "hMC(߃*)މblAu"KԜ RrR}"6yf6FH:"qtY'=* tAu؜?7A$`N`EB _!4[Bhg| $7z^I EJMDPDUDRqA<W0IH-d3 DP2AilW3z#Ӄ)ӢDP:=?-ׇʞAٳ"({A:'+GYS& >כ=OoOÌvbdwLAC%A%  5DP2ADa^?DP2A;PMb)Ytz,Juz b{(/EO"FޟD'%tzBUw NOB|3IBhF@"#>?Ae'tzI )ˠ'8=+ jE3 H8=L Q = NN|Oz8B:ڝ WPǓA9~]"Cy>zjb"&=% '= N$ ?WA"}~M}Μ(EjDE@O!C!7w< "&AD1DI tzv,3>q tz ^?QA{+;NA{.MtDЎ휭N%|+DоG̷wqoA7|7zwSA17a4ᒄ=\=d-EzoCϋ(z_CIVT+ v=;?"xϷ=; A;NbhϷN\t C:Wp :H-z~ tz K xtA|G>p5V$B ǿGϏK"-j'DP$JVA]BhAh~_?D_"vv @KICBIQX= p=1= h noٓӓAP%]B"^(*< =h/$ ~1''xAOX'=tqWBh~oAyt+Zqu8z =b G=tHGP٥#tp8AY#cGPH888a#5:A#({%*pe}Aݞ8z=pCxsO| *pSP}r}#jh8#Dt2eO@leOnLO!ND EAmHܐKGP/!4p/%܊ߖ@TjڿZC7=J8Q?DY.bzD>pt&oJC8t>"d#f#hIGP'_GP@GGC AvHtc 8ґ#:#KhglQq#uꜷAX'xg~}_quu>AܹNy =u BGP8zء'YA ^c GP:p*!ss" 'GP@Ի/8rGP8<oq>pK\q>x# =# % P/8| A?+zGENɞMUB8q ~SV'8?{'!~Μs?8'am~1oQ#: ~Sх#h8С#ߡ#h?/'8N ~K'xAUVGD~IeO8ҹ#[a#({ !=K+Ĝw#(??sG. +Kt{>Dy~%~ype|A]>uCp K΂*!YCtd\A8/t~%++Az&Tup6<| gAOVDg:ԑCOp::pu:0p: P#I\=OOpA]t8 AzA=8d A݊LAS:ґ#(8q||{:y.#K,GОo"| CAx5%ׁ#ޯ #f|#UGP:rp]:jp]78!4bW}>A㏎K'O:18p#("$tZi#tuyAgQӘ| *u$t]o>J#|:A:t #_G ֻ:t*% !#H' +ug<4_Pcd4GGP:m7f=ηӘv?8$jЙo$GD=K'(KyAKGВD}K:#|GG>DЩ1>\IԄ#%S>O>O>?%q#H"YGP<8tZ>8`σ s:$u=:t"]z$r68 AK$:\/ztt4_BAGKA:t4^@GД`"p=33OGOzJG?A tg>%yDd>Rt#O] Z2?dA>:$tIZ<:X| 3A9~$Zq]ԋtp#TGl:@ԿE#z>AAA s=A}>~1s=g)oy:Td::=7%~jLA힀8'oDVL -AN]#sz$:GGPtGP9$p퍨x3#X @uǢGDгzQ%Ȃ xOy =BOgX "hCO"h&X:o0bK!1'~zp4GT*؊ ؆o {% A wDР'DИ'Q=BAMzJK'AA "h가J" "G~^ pzAz$ pe0DЪ:/gEDкѺ%p$4-N%څ@;#Z>A+8K"%q<:xQ"h ̿A+YDP^?DкtDI"hZK(z*uTpt#(TAkA zA9>*T,:p!=˔QGPyt$#,7AeI#JUM0:rT971=bT}qUN u?AG>X{-8z IA%?H*:Dp໐} C<#h#3)zNt@Ae~[z*= GоxH(0:JJO+AUBGPm^O GP8q}AhE&zc(zGPP2tDO}PwrI#8*:J:`pt&E "h DPAkHQDPAKDrDN-*%VqKb"h9C-AzPAG瑐 z$ 忯Єz$!D.:pbHCC;DВPZT H-e"{Q $g "-) 1t@cDC@7*` +d!Ո{|xmHX L )Axq؃"u'E0I 4Kͮ&yΟ=>E!_Aҹ'~~VBM+!&=r$3iL?_C"( -z$0! |>! G":zzXJ=VA=z$ {LC=VB=T I=tXz C"uc'N+!*l$vE|:̗c9D謀r āA=: zY=q<@NlGB|A K"hԂZAzZ8s%3D^IXe(DaDLTt@KMA "_uo8[8[TDHJ5~5~A;@{|Z< "h%aDr8qο$ E!ʼnDrZ>W|%E> "hT|q{8 =td#|*Ub(z4A:v,R:~$`y#t/82AǪ st.EbGп}Tt*V*8%BGAEGPd0AEGP?q>P\_*IDzG:J0Xя#TN ^$qeqpt # Az?DЎD/{W,K8'xY:'%:ʒA#,t-kAHPG$J&A=kGOG^W|s'8~oC!n3/ ^$ q/82_BO:p!Qb#(wAEu !p EO2~/+o~8 :ʔ0 GP>8=(BG!A CGPq=#T8#HGP*GPaJGPYp# ^ ^%q#(AyGP uU 8A;Y=&#V8T%NpUAM*ztzGOGOz'{=<GP^8Nϕ<XBJ!^8T':zPIGP!C?8TqѤ# t u]?DqLbACAIftD#LG J'tI:c #EGAdsAVD[G:pz#:K%NOILOd +tYѮ#:쑮#hN%=+'M9AVy#g$p:p::uIxn}s*_A%GYԨpsBGAͿ#Jb$A#tߤ#H,bLGPQ=]*V*K|`X"Hb| AEGPBGPTxT|?q&z"&@TpH,[Go>D>DΗ X'xy/GPt\G0ҽ:4A\:<qAKDEOyGPY#,T'TTN<T$p:*tCL~3BȐ#:yny|w/-SyA*Q### =@d>pKy}I|]o>#{AAEG~_g>pKȗƇ:B!^t"~ο8ʔ` GP#|8Q2$x$p*8B=rΠ騮#yA#H*/JE>+ΟJEp?='#A:JP%\#ArQь#H*DG:J;[(B8Ay#'|~p# : TTT$xq#AEGG:AC yqVAEGPq#~ : t[)}1@"Q#HGP$^GPC"ч#XA9_#~}#zA{~||#h/K_z#pZGPí|SӉy GPwp(A tC3q,E>Pt*tTt>χ:?ǧ~IGP7| AzaAE"ΡJ8|`G@EGP#Hl*0|-:E#T;A:Jt*GP3y2a\Tt*Ҽ_|*8r#Tt*txT8o+B=GPwq|OŘ||3>ucƧ˘)GA{2fhotCc~q[t"_qxA;qZ$4 }o K '|qNhR'@ %h@@ J @TA tBJ% J@7Jx/^`$ BzZħ8țJK% J DQot@cU⇖C $.)H*R,pjH ͂{fKzth{=-?-, +TU)eyU$@L,x**[ʣ& #@@  \@ @* J t@%> c| -0|ʟ(+H h-RsK_G?9Yzl/Q@bCOgM)[Yb^,%.U }wVtj? 3} }^ ;KV>kaXاt᠀}L} l}']`i&`ہ}+?.]Tu M#l87a_G ϫS. WɱO\S,G[OĵIOtR3F\]Qנv3RxSӻVQ)FT:.?R3lv 4ڡ |?lE{?ڵ/P.܃ǵn~œQvq'?d\OwCCӝ *|D{?/?!.'̄o?M}F{ ?͵|WO|5ڻQM'洰Ofi#ݬOs|i h O[Qx.\46C}OKNWG+ ا5aK#̣GOc3Agy #f7,>u ڿ T5}]O} Zا >ا.ak#(ilf 44}J}Z,4ۏ30w>اY|[r]>m\G^E'qip}>َا]TW[.i Eߧw}}[l[SZ_QӺ}Mاqx#쳿/&|_bX aci;^ G&򁺄OOBا>ru9t50S>F5T}*O%}vq0O?`::`P>bm`JsaJ;Ra S}0OlF dOesSاk 4 T}R?Jy,GF:5?Ss -uVq}R#'?P2???} G]O8[ا}* 4b}b}>ޱOا=EG]n|@x| o`>#X>MXOScBi G ?7R#~"_O@ӖOO?yu@3hժi I=F3?M} '?m CE{F1ޭbE,E_?ODhGqؤ'u{I?9ޠi:n/'f5f16f64^OXOpQOx9J?U?bU? G4a &|OZ}t{Gy'2=Ex'A S?pKSϛiSS^O'#ݘenr K&}z@/GPC5ϫ>Y.NNg 0O2c='׿rgߏE"<0US^g?TOz$ ?4"?49-:"tE?-a|_d>A ~`v޿hVBZԁä$u^F:^O4{xov߭߉vi{Z\OZyЁO ?Qsܯ@*0#ܿ@grE(R+n|}`3#pEӊzh!Rlj3F^UVQwTӊzԁv(h>9_iiMrEC>\irQOG=f;{??Y >|V?m+n)}?Mn\O1R׋YWժq ?Mvy}G>py}G> ̀]Ex]&\?n?o;T,FӀ S~^F ۥ^|b9?zB]|[qW?{>g1F݄yk2H|x|"h^/0ּsmtE#ą Dx| Sۛ bsEL>n(?W\oi/4a~C|FY|3bߞ>g>'>g>+淀-^?:"η"g>OeDO]63K>Oԥ|;I-~;?UM|GLFO+?Oک1P[bKODyuO\O'uB$ ?foRS5߉CpӉ|C?:?M} 4 \ϪiE;>%ԅygg_\O>@|x|TbƧ??O;AOOW?s|?W! ;q!6O>0JBc'ӑ@g#<\obo4a=?-ap@|?Bhgi C qTO/ܣ~{O4i.lRo귛%]1ߢ O.|<W\O>/ZV yCh?q?WOo}C1m3'oWUO?"h|S5OC?OiM86>}?|aE@<|`7Gd~'+? o#&Dӄ-XϤ߃}>KJ#x'{qn]td}{wz},^?^?{Կ8Xџv⸏џ})S,@Š?5ћ@(KJkLg7 Dʭk' E.(_I4'6jƮЛ=ПEh}=& )3GYZrIIL0? gCtNCYW}A霓ՕgQh鳚3l,_|~`>пw` X7ؓg<<y(?r0giރg]!sQSŎo?>*c+>EF|1KNT|И!:WGϮ-򹅈|4jqBǎB>rQW| !ҽ|OلqQ'$OG罟QW|rT򱣄'| E"B>y|ͨ SnD rkC%|%E}y|$ScϮ.w@c}H` G'C B3!|JB9Qԗ"Oa'@"OѰ䓀"Ͼ~!^@>9H _)xvFwVzΦ. |cQO@>uϢU!Cȧ|ps ELȧ QPȧ"Q!}V#z0zOu:@>!EB>U ȧrH&cOޟb݄q5!<$CQEB>$ 7C|_g} DQ| 㟐cHG×ύJ2i&|it`1i(VM!T!79|H 7%i|oO)"!; R|sWVCD E}~=! [B>Scx +|0ϠHJȇl QXdЄzB>7EB>v_B>~B>-2CB>CB> X-c|v h4j|?OHEȧ[tEX@>"T nQ+Ojȧ3_ &nQ2OeNq=|ce\EP] \5u^ \@>WՅ"|KNl \|.4xW!eQ1ϥ(R,4\B @>|.v|[(l"㮔u D>pY s纄T"$^qO e|B=4ԉX "D KjB>B>WD>pUK \iԉ|*^O]E&"4xk!1_#OC>B>=B@'@>]O^gF8 !^xӝ_|l#5t {@>]cObtBs@>OװȧS silM\QϥQ 窿Ů s4\р|.}@>ץ1(!Kcϕ򹆟?%sijCk2\|.O "w K#ϥA)s .8ĻR]kq=@H/ԳKcϕR6ˏg܎@>A S!C7!"v [v>|<i!s/8Ļo!8Ļ5}i؉|f@(P'y"?|nȁ|nN|n@>w{ ?hG>p |r-]D-_B>w҉C"6!c-s:-XB>z=>ޅ| (%y|nc@>E@>E@>JE@>w{ E>pӄF' } DQ߭v<o <ܮ|n Kv}scp|n @>w^oܿFs?"Nu gDg8Q7ҸE}C0pgp#3||FG>0l3\ߏ|`dg 3@>o/ؠQgФHgg<.0|EB>GQ6vO 4 ڨAǧ30 !l Q@g_ ^q^ϸ4DQ߸t"|%:ٵXE>0xC.5Z*|p=3/|Md| |k@>UUg4EQ@>NQgX30T < B?'/aB>HYghLtoPU k|;3ډ|` = |R|`.3+vi;)@B># 1eoB>Ѡx} X!aQ5XB.Q7PL =!A!a1ϰg,5%$g~}!~DQj4iK%򁱄X"KCM&B>"x }=+3H'B>cЌ‰|.!)3|xf@,<@>ӎ@>j̉ D/3v||&b򙎯@>"N "̄"h/3X?"Xg v )ijǧY4D> x3P@>#|FB4f D>0KQ@w@>OE@>&B>t!g'/||3jS*?|"MKg  !4 34 u@>C#ϘB2| |2 ?|r|S& ߀|@ v q=Cyzj\O<@>ѰC> Fx! '; gGg} !/ (Kgp"3|fj|`D>0|&M<|L(% gV!f|`3b|O@>S J g/3 g&d3iR!3|fz"WLZL|;|Bg L! ~?@NG&B>D>0LSgj<CMug, @K|`1<a|'ן@>!\3y`?Z'׃@>~ x|@#OG| '@>B>w!AO|)Og|Z;ƚE|S AS!\b,3ܯyg [gh4S||!1|M10d>Q|`h$"83 33PY a gB17g 4|-Dϰϸ4 v@>Cϸj"|a-W |< z?<gBH|>9m!lhg`jT$$RCCK䆚w`gő?N|^T/*߿mZ| 'y*Ay9)|v'+J|'+j|*+9Ѕ)9Ɋp8Ɋm8y9,U'*_n夶iTNz~ L9iyIsַJI$Jp$ktϢpO%q\֧@{&☥C)jm g]g4?7=i0= A){98H(+س_)Bh9u"w0%)3գ'j3]%]6{j18||{*={jOgw:{|{trHp<:t{p_u=:n{n~q'6=HґޣHkt𞮣'!c=M߀&ޣCπ>xO)^?xO?:2kOYZKfg-ѧg$!{4ZS}?zzz'j+djkyjcڤHHUeP=V{*UF{T l%{?Ok>?<ݩ Juߗ?=VqA)8=PIʉ|RbJU{覺Ǫr=AcUx ^|lCG|ITLO=?=*L=R{&?QEG( u'=U皟Au-ut;>AUlP/svU TOZꩪ,zrgP=UTOUeճǓe%sx(NTO+TOu~VUCT[CT[CTDTNIN^RGqjW'K*Sj"(|Pz*rz**|ՓTOP!P=R=uPWՃZ,)%SbǩVR=*_'/J i@MSZ S zUP=|CTz(TO̧P=UTOU㶠T~)ne SSMv1>CԦξ|x\"RpP=zUP=UuTOE*Փ \BTpzh|Goj|[zITؤzR P=~yWզ(NUP=U JBTz-QCJ$r<'I*VR= "PS6zT_/SNLWT6tYIu/TO̧P=uR=6&Y?+'/TOP=}<٪ߟ=Rr{hm{_U鷺"sG~x^u?=PD{ RcGR>PT٩Sݓl۪;l=ϙTG^u*0=gzR%U|{<1FM=6<]Ƌ)bUP=5TO]RQϯ>TBTf_/JkTP& :>Gg?A4մf}?1R;_GR=ժij5TO ZSNzRSrSݣ@ul{fSݓꢩ*/TߛzlmUW{oFDFUiVP5٪U7Kƴ*D=] ]Sݣ*Iud{T۪[jV_5lU{ګUzyPUElV]jVK UJUwMuO;~_tM/[ӫRV6=Fo٪;[Nu?=PTzeׯx>Z.R<=(*)i ş^MTؚ^uOVuuOTx?_uS{PM{]l={*/w=>{l{Pפ*%=Su~rPSUޡWz^uPOuvWGݳTϫJuϔOׯTKTOA\TgR>P<i>Zu Փ*c/vT@TTyՓWD>@UPLU$E*x=Vj|KԸxT<ߪ{ޏWSx<@MGSu_z욚s{TL)=t꩔.Jx"Փgy‡/SK5-T͕jN<;TT[[z^.TAR=.R=|ASΠz۝@P4wKAEl>0*&yWR=|A8֗R}#G2|!TO .R=aSQK쟏@P>/As:>{9}re_R=~vbߠ"gN<~@|bSZ)OA_$TώRP=LKN7z** ճ~FWL)瓱>ꩪRz,Sаu/P=uH Zcl3zjUJW!z U~UCz*]z-%Sj}KjfWFy<MP=H[պ~TLH[NHTծP=HTKx#ճƋ[7ZC772y]~{^'8%߰p̟p}/Q~s '|qNh53}ë{s'O>7\F:?uu{'8g߰ןpp}/{U ^>837O8qg߰??ޜC|{sA|û2 2}Q%hoO8p}/}{2N7*AU{`'\8o8OUQ%0 U[LAtfSrJt0<;8φS}é4p΃6DYsI֜#FwhӥtN9#2PL#H$D ih?4Σ `V:85ځȂ*ԲL1@k&d$C;)(9f9T3YC92CTM!s8?4*`C~.MrAؙ)o$1LifR4\U@mLj`f歸;)2M?,e΅ełQR@eWAL?2p2f`2{3Bfˈd~(Ӓ@dv?|;2-gֹqt̴>imc1RsӻCLcݼ4P1;[wβLsiEn1ӂbfbtλMgxanBNM0Bafrg-19VCr.#j66D,3JL˟ccڳ83˴v4ؗ-eZeNSeDYKγ۳P:5O9-Q# 29ΚV29v]$,/A]fL]8a'܏T/OV@.`\vx.;8YNOqon1#nöL+ylL2YNPe@%s`Zvsxrz65@g9=G:U6gT@DM0ˤ6eM)2eZ +zޯ;0bɯ; NeZBo~X~%Wz%Wv%@Wre6Aʇ!|[ɇ!|Zɇ!Dhb9b%Va^eڔ=p'hNM8lF*l2 F`*l2UG͝G4ƺ@Tfӳr&۬ؕ>eWJ3e4r.ͨf)U EJ2Rfs9K{![LZqLJp@R RfY*;Q|pI4T90haQf}Q=UɑXN%r e eR2eA"ӁٵfGw= HvH\Q7\X+vrj 5iU|ܹ3I+ފ PnPnmU|#A|bJ\0n,Lnk1+E & ar`&}EeA)[D%hN%d d&kWrVrAY ֋D'@-)5ȴ)E@ SU0 + YNO=AL$Ly?1ySqS#Q(yV\LA?fyS[`+x3!Uxa,ˈ7S5z1^yÖ{ kC2Ax),5]spHx<7c̳ڱ/\F1Q1,S cXUTǰh5AP1<ss?oYOִx`9^ 1}Y68eqLڠ8EqL6`8f"$^Ml;HpCm̳|oS&xڧ(*V?nK[ʳ)ӚVYE9ڤ+ƴq0T,穗YNOwyjqyӦk|>S5- XcZE`knD_>'p24歋YN{4-3Yh[b kZJ|/5Z?6~,wt_ʤ`ƼT:"iU_PW2`XD*/y X<k/bLKŘ$zg^g9J`ԅaSYN!cO:3O _LR~a^y@yӎ^L@/b5xҴn0is.湹T)! `qBQ8D!l,Q  qU$/嶁C ,w%]KC|.67AockL$3eoY_Mȃ,i|t=ʁx#Rc%(-FYi4:irq:ѷ& CH|DAH4Z69X69nhbv\~?tDS]"&&b LMqM 69j$nMTMVy?G vďIԸ$BIgDIgCBI'cmutqӿMES~x8*~,V M -Vkj b.q5>D^@*Nj&f=hb֦J45nvDSϐ4(9iJy4ԉJNrDrt 9iB41kA41[/bUPRM!DkI֕6}ɉM4q-$'O'4yqOӝJ<)'䤕]rҊҘڃ IGre;@45JNxjODHNRHN"^m'Ur?)9)&fSz䤧d% ^m@IIIII&ɉ㵒n9Kd/cHH"h!9i6DrP/+9iS#$'l$~ Mx!LB[L'fS[$'Miq)fZ$'JNv !TBS܃&f)!|4mJNMɑ4TJNY%'MI&%BdHhb|41If5<ք]n,6Yi@`ɉM㔜4L&f6TrMf4+44+}$*9&ȦnJN>|?ηS&!9i6eGrҔ6 9iJ 4'$' 5F&)E-BSij<>?D$'my#hV,"9YO'1tA5>yOMiRd]$|YQ;]D>Д: 9iJ4HNvz45V"d/H~eHx7ISbѤFICmI!9Yϗ$M1~DoHNlR$$'M ɉJNl:%2m R2m 3m UMZ ĬU䐜xYY]UzRW$'`&>L{_616Y3u9YM^0R#%' HNh 8񔜐odJ 9䄿K&eOSЄ+%' MRrbGr2^I6zIN/9^MRr"fDiCɉR6%')9P;%'@r|$b|PrdiJ J\HN."HN.%HN(J %)9Vrr)99Eghbv~INNa$''㗒Ƚ_HNR*Dz]ɉ+q=Ĭ˘Ĭw%'g8)90%'JNX*9,%'EQ*V)i6Y Fɉ%'s 9It1IrҊxL65Fij<Ϙߪ?1 Pr,3)=<àcqȥdW_$'ߓ~4%HNJN' I?HN$'m|'H7%Fͷ$IdMɉJNNc(%'q~.؁$NRr#| &"9"HN#$'%5YS?Dr;rqo~ n$']Iw'%'|I+Crߑ~ ɉWJN$')9>oHN!A<<.[$'}(|@I~q.+=%#ԸM)/_I~xV"8hp}p}(ޏhj|hj|p~dAD>Ծ/nyߦґ?JN<Rrғ,}PCB*9HI)3RM&y*3$'ݦHN'%'ݦHN|tousߏ|_7:Br-oErҭ`Erү]rҭCEr-Dr *n\$'yλ@bt֑SG~R䤟#BrƛQCiHk<;x(9ҒܟVrґ*9]p(?߭&HNM#1q=|I tRry(Iɉ%JNֶP#JI?-+JNz@7̷< >cG̿Q[z%'^%')E|%n+JNz|WWݪS$'$VIJ[BrDɉ!JN:-qx>䤃M+9EF&3?)9) |`Nfwqtє|`̏&߯D ֧)9<7%'#1)q=ոk~Sr"0 g$'M6#f=96EJ'#gCr?)9χ䤥yׇdO+W'b|92@:f;NIJBBrIO$'@O$')9i)|@zT׃%$'{%' I󕜴 =T)!8|3\| p>zISDr^i$ DR^HN JNV\.$'M_Ί4U$'#h@RErҔ 9i8 }HN(?XO䤝JiBrbF&BX䤱?%' ɳf:F> ʤCBѳPI-?rq~r?^7bKRzrynT#9DI3!9IمŅPBzH=֤LIJΐTIJ4ZIeV'FzOPTOϖTOK!eR=-)5?AhiriI4ߐt7ՓR4V|P=-)UȑRָ"_ZzggſGzUYo'iP=-);ciCq=Mj$y|P;ءw RwQ4'=P'Q?c`f!qD ϧ3| ~Ҟ3y^Oz~4N A_%ȟZZW8؟tYg) Z/@Z(|=/ %Ki+z~z囸FH/ ݍgl9g"^s AGBx 'ݢN@\Qh : .t0P  Aq}@ h=6x ̇ @CU Qx"](A&@ M$F_@$$"`tjQϣ ^ @6p԰ 5욂@<¿v}Ls|B:Lqj/@ @ | ڕk(X(bASmy@`*@1 % N+T%DH 6vAr(Nȅ 'A :@b [&@(@ @U}$‚@AzRTS*@9U@ڼqW`RF̷U]LEߪϾ h P-33b?*>@E P3߲q&TJJ"? Py P4A_QWT8(*4*À@ $? Z: @ qA vG_0io? w AGJ$C6J.qWl!dAL*U(RվD>6 PQT|'ARX_y \hNF&Y,PM_`hC d )? 3u*3)n.B3oIgN#uc*{LAE >Q0?vďݜ~Cr`Ȫ}&KXXzPu܍e&7=^g?QC[ͳ_u%tG 3o5P}=;oDO<>p |=6,\]zcGyj{ɞx0z⥓%zYyzy&Pό&6|mKx U'R<Oq ų~A|@~aOPrsH\x/SԲpJW5pJN|x?xTxIhqןOTIJ\~~(K ',P e,u AtP`=)~J=E>Хx>+_x„ 5Q'_(|ޡx s驊!K')Z($K[a215_#)u=_O՘<#.œOOOPw\O)oo+œ7(~Kx7өq''(A|œ;(_^/!OW7œG(ϡx%D>pAUW'?(f ÂORRPγDZv=ωv=OaW]σlyخڟyxl %[|=y{|]{<<[|= gϾ}=lqy=Ƨy==<'~[|{>γv={sp8oS<8p-> gzm| g)p-ޞy^sg]ϳǹ8oS<ޟyxoycom g)pO8osγ8+>6p-yxoy>γ8+)p-yxoysom| g)pW\6p-y^qyxom| 8oo8v|8oS<ǧyxom }soW>0̯|`~l6>ί|`~+_W>0yxom_W>0̯|`~l6>ί|`~s{=>=| _'XW|n-z|gv={>v={>׽sͷ?[o=߂=m]Ϟm{|y_| v={>]Ϟ@m<"h-D+-~OA[=QsͷA[<-ƧA[OAmq{|o׳A[|=DoS-~ϷA[o!^@m6>=m| "m]Ϟ@m]ϹO} ^@mu6||"hDoSA8- ^@m6{>tDomAc ^ϷǞ@m6>{>|DoA[ͷǞ@m6>{>|DoA[ͷ@m6>{>|DoAx x=m| "h6WA[ͷ@m6>_|Do\_\_\_|Do\_\_\_|Do\_\__>|{W>pW>pW>pW>DomA[ͷW>pW>pW>pW>DomA[ͷW>pW>0|`|Am6|;|`|+_z>ߎsoǹϷ+_W>0| - ^|`~+_W>DomA[ͷ+_W>0̯| - ^Ϸ+_W>0̯|`~AϷAm{| |"hD+n| c=]Ϟ@m]ϹOA[|{<빶"hv={>c={ͷA[o!=Bm{|"hv=}o!ޮg {<-ޞ  "hD+| v={>W]Ϟ@m6>=]ϽͷA[|o׳A[Om xAm{z{>"hDcsv=6Bmخg x@m<|D+-۾A[O} xo}=|"DoӱA[=Acom=|"h-Ƨc xoz{>|{DoӹA[ͷAm6ߞ{>|"h-Ƨ xoz{>|{DoӹA[ͷAϷAm6ߞ{>t}W>p}Am6|{}W>p}W>p}W>p}Am6|{}W>p}W>p}W>p}AϷAm6^_\___|Do___|Do___|Do_W>0| W6-|`|+_W>0y>ߎsom_W>0ͽ>=.-3tk8Vڏ'cXmWw>5'~3Ma=4i4*zx)[EӇH}~ūb4&`szcVXoAwAϯA׫-ۃ@~B ~F=C}F>jyQ93h39ES7`{!}na>7|n]`>0"5޴IU^s2GkqR禃|}{O9 sߺwbR-=z[=ށ{+DF `=k򙄿V 7rnT4ɻDύgM37aS 禝 0MwX zvg5xơ)9(S* +g grCB ;*y* `gБ^g'UYoh8au A8_o:/MA0[XP:ynLqhyqy= ~mҠParck|{<Ϊuq{q*`q M&> qfg gv559[T|f9 lg6 ppo&s𛜝3V̪)8D,܍n.љ:*74\3q3KpǺ?6C[S6~6v6f `:ong g3h$f+ ,@6h&?@lƭ!lֹx#\kd"ʬtଉϹ;AEAG]A q+߉4Kgːsr!{{1OCΡC!GK ;jc)~r 4IGc 9pr 5^CNאBC+4䠋MCNԐsi95`8{:*!G嗆;k 9 9 9v֐cG{ 975(6Ӑ"- 9l!!!aȹ{SS 9tJCMGu 9?Ӑsk~jА= 9>r9V4tX`i,c4amYe5q؍CNs<4$i̹B{gtxvz#Ԙ39:b_LGv~DGl%rrEGSPr: 9CN>ƛ CN4Ő.-tz1Cκyt^ۉϸ_͟ ^5p!rK>;߆! CN~r!Shȱ㻆vi CκxD|DѡTCN5ch2CΚކ64!:3 `\aiCcKtKCN;kI!!QCN{Ox!9^bij41QCNS!]eb.@cÐ#Ӑ(!' 9rЈ)|1} 9x0䬲F<]Mt^eoCN$r?!GÜǐrC!!iQOCN#Ӑc!G㜆!GÊ!DŽSCNe!j$AFCNe<ԐMCN~`Ѹ!k)g5G 9ːC4oא֐j ?舽pqmgrҸ!'rz$>c=Y߆:5 c 9rFFbȩCN㬆CN0E>x!bȩ4[r[3ĐS0TS_ 9ŐS1vhȩrr}!%:bW5TS 9? 9i8ŐR 90C>@y 9D>!'r^^ 9Q&_q0F|OjЙa8D>q@CN=^%8^덎iDŐS1hIcx!r!Gc r4jYXB%"ƀC>AC.3QCN@RҘFt 53M̶r4Tjȩ돎صy6?:b/c 14frӘYކZ?H!2hY/舭AVC|`14Vfȩ!g=?ahACz߆>haJ>!g#L;Jcq|ѐc>!j$S/r꩑'WtƐPCNh!FCN=*uq0 ǧ0`ȩ0丟!GCe 9!gŅd#9O}`ȩhȩ1ߌGq=3cf`t|SI#Stoǐ童138g\O|?r4(kYېAWCz 4ޔҘ1hԐS1h`֐RCN4ZCN`!gŅCuyr*K 90x!g! 9Cv 9QC2#'8 #t!>1Bw⁁5}U5Lv; mȩ%0T`r*w 9UZ4E> Fx^1|?o+~Z4܄!D 9^ 9k?$>(/AUCa 9ejx?1 9+Wy0|/ 9y1hX֐t?o?y'1T7 8%\rjox0!R!gox~{r4kȩFcĩ1b 7W\忟1~_pzyraј! 9^ĐS0">zb1Xbȩ?hx!!'דrjÐ!G1CN!gϝl CN!6o 9q(1x!'ןrjcȩϏ!V 4UCu0Ԫ1|CFk 95TO4hhאS4mȩTjCN-0{/c=!' 9 9D 9<`ȩZ>/;'o 9k;1箯CNrr<ŐQ^CNH!p!L ,aYu0~5cY}\OErN 9$ 9ïS5\q=`h!'J1~ҐS؏ҐS 95·54!h4ŐS7 9+րzb!  9a C{ 9+MՀƧyykICN|QCN5؄!gp|[44a)7ICN(!"ACN0<̊1؄!`H֐S4a)73 CN0!hÐS(LѐS4a)1\i9p|idrאƬbxЃ'D4f8EY# 8^ S/h'/q=OE_=aOL]Wc9n/ tAɤL&p2{2y.'20;3 2;03C4+L 3C5A<#p #tT`;# zf@.C ?*'2ͪ:_V04OL #u_Yǿc#Z M@؈ɊX"y f90cE O8Ђ7i:Cۋ<ρ< PC z9}kɎdz? !c 8y8Y# <>< u|g?1~SN`qV܌׊p~ gEfͷSZgͷ;9+58Z *^'0>z7~'~?׏?Njɉ_ 9ف9Pώ$愤a‰_"4i % `;,'3dnwlF|GnIT$P?ώA\C3/gŷϚo ПD>P '!蟕Li;Vzӟq=EiB_0@""C3%ȨP;@y" <7h{`|y#| +F"hS| z9"}CՋiЂVCU5~RH@V$\o"( <AՊ_zA8ߓN"Ȋi h$/"$ؿI"Ȋ9 0ߟD%M"蒘0/VITBU XXS*O"_TlB~L";^B|$$$:D]AT`$y?įs;HI"D.&QsZ1QԨ@jaAΗAU"![ O(Ty^$O%@H"HA9J |6JJ'x T$/DPA1-$T"2y?!r*I$η~" I$_-;DPB"({r{= I7$NHD*L "$5Z@$\8񻘿!rR@"W\S%\O@ rz}*lj G>P*A*LJZ>T ,N_" A qwHLE>P  T*V8C*%t?DPZx~iq \8c?N"ЇA"$B ;"T w#~>%O_AEB "F"(7DкBg\O<A'8x> JP"A EHk~*TJ$Jg|*A@KBEDPF"PA-T8B"4 ,TPK}~?@!p T*!)Zۛ*Ak9*AkĿp&D$ҝoA ewT">DP+EQتWvcd DPs= IyDP(Q\C5*%AIB$f"hvj'9DP{@KN|s{v2~B5) %}A "B"(M|Q DPA"( Nf_!AAAQD~!Z%!AJAȡCDP;$^%Ԭj%Py/&$^ DP;%CC H&%)1 DP;$I|@5$!B$|zI">j/B)#:Po":D/As ֶЛj}'ZNtESTBy#E|%XJ5֗ADP՘DP?AyxAk~fAA͊vDKo/zƧA4o"Ya%fO?*F!Ax!Zj/B)?%'3t`L"hO!Ay*dDP!`sbj`AS Dz$Kyr}#9Dz$~oO 0#.:#.+:\$AC=f-DPhjH>~_-D@$krO`|Ya dFMyDP"I >|A͊pU+O?J!~izJu+!zz"XE۵M?|%$ z|WCAIu6^%JAHˇZmG"?-.% 'Ay? DqDP<*@R"77yDPO'N.ԻDVA= zRAuGA]b"ޅAk4^ 'N~JD>]Bu/A܉~DP??Кo;A]b"^gHuADЊ 'O"@|`3k$:AH|>A|"h{.ԝ ֱY\O]"ޅ"ށACuB<Ay !DP~<Ay @!z']' "ꮯ  % zxM)޼% % % % zAVAADPZ&/>" ]"w :EA|"}'ZI|v "3DPA|"Au{$!@ 9/n9꧄S农w8ޗ[x/){g^e 2wx[8ޗ}Oy;< ?7=% ~nfČ[x<Ϡ\'A#`?3o:ѸxsVo!@9<OZ9㙧ʳ?mdg":Ѹ5lq|_;TL銠w>ɂg9<?*gܙ>"YC7hŏg* 3g@q,ƌ37bgZNCיxs7=21ϴ8`6>Oi^ u&O:S+8P3%ҙL0: =Ǥ ?Lϳs7ɿs&x,:h4 s֑T3iV3%0h\8ƃ`9P9ârIDF7DNYq/"g IWH8rqY8V S[9j9#8A{0A"`Sgg3f 5v8J0Pܨ% 33!)ʜ o )$o0,(<$q-HcG3m rFY+hm,ESn(H)~_s|EAncrܥg+V2]y$Fr8>!w97ʒX46MJtTtpWm(Pn# ܦ(Ke=rƳl^ umH )a#66WncrK[}Z]Ĵ.ޘ*'qy X܆=?rK,^MXMPM=Ancsx6&rRnc|6A Km>TrQ6TJ0ߥܦr}m|>$z;rXFrm}mǤ#61>}60^+nĴ9D]ۀܦQJQWmϭnѕN+N|^(k_ 9merhm2zJK76ۜ^m%&rP vmerQ.6y̷K-J4l5lrE>pL[FZ662Kں-?6X !6MSns^Pns~d>|&]9؟8DmoXZ~e>pd>s9>Wnc~FYrSаUj?m6 2(KMt'd)$!(Kw.QƧ,9xʒrCPzAYxF󍲬;>|鍲| %[,5Q|,VC,>e%P_DY(3(Kt-2te(o*[cR!pʲѕF+F|kCYRʒDṖ@Yjc<eѠ,eւ,TP̗@YeIY(KAYj% %׏,U%ˠ,z\zV,(~k.=۳?ÿo?ǿW-v?/<<o_?Ͽ??_~O???O'@i endstream endobj 287 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 291 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3H%+ ҁ8i endstream endobj 288 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 19 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F72 31 0 R /F63 25 0 R /F94 60 0 R /F92 266 0 R /F70 28 0 R /F54 19 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3582 /Filter /FlateDecode >> stream xZYs~`e* `ÖyHlUy)Jb+嵣5I<fztunN_)ViJ=SmAiioW֚4/P6~\t5o&"qXT-̈% R2` mmrnq}/>&9>īN.8/' ͕ʏYW)(4Jkp e.U[w.qSI5vU͹/e)FՔg)`t2.jAZ\Ɋ %<,-M.`masDlAcy5d6XRW:X}oDhBU ,L{'BzCyXr%sWR7dVʮ՚惪CkA=ڣ3>j!ˀ:d|,Hd}Mzq,Zq PcYڔ3`Z)`Mkw jҸ>.2?C񽑫Q~kȭ+Y ~El,W|xŴpU1c^Vd^x3>K.EWw!6h eaw8-o 2[9Ր *:,91*p}E6K>>5ok|â-n?!YTaݘ.!Zv4L"*{l$mV&k4[!(,:V$,WlF٦cc,+oi 2~ ,OS< 'č|]7FL;/2{SgR3w-2J䌴 ɬ՟7 pہ .> ^:S عX*%T~bY_,B-]oFEX,dIBmO F:ytNOt>ܗ-"@خu?#G|T p1ve8R:@ va byU^J%O^Tgm,H7˪4{#` l53%i zN GX:**-:D &JqeB=8KSӳ4 5pVf/9xu#t?ސ&1DfVפsgwC"FaCO(4]ZY42O4(rT+>V̞}ۘ8@jCєJ@e[[xRe`WNzJk=Ua"9YK[*Nok9olጨ|KCև,dM'JH1y:A .e}֍lSNTk\•;u0k}S;X1Nu}[:LF!r}My'uctM*Jݘ$G>Ydk)2JlLdH˽߆yڲk8")zv 5=3> stream x3T0BC]=CeUegHl$TT@3X%+ ҁ8i8 endstream endobj 294 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 20 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F15 22 0 R /F91 51 0 R /F75 54 0 R /F93 57 0 R /F72 31 0 R /F63 25 0 R /F94 60 0 R /F92 266 0 R /F70 28 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3435 /Filter /FlateDecode >> stream xڵZYs8~ϯpU1DvgflgwvvIYRIr2 <$Jgk(BPG#utً7i՗B.OC掮n5Տ/@iUsꜼdr?cnw! ^fLUKz$ǁ)z`Uae|iX~U:˵ $W%ͰŌfJ=_Js/\Sn?wo*HNYt)ك S0si=pW`.ÿ* S!!2v:>.#O]\Ih*<(dAiQos7\|+`Al͓4[Vx=W( Kc.%̋(hpk]q UHNϱ/U$oY;G#E?q׸EQxεGcx8YoOɯ:'%G!#.gWD~nids`YL:ʅ  ' JfZb0k<Bw0"H^ 5,qZVP]Ec-\#Њ{eTAVK;Zǧjxkȷ3?t ZzZUWm@ˇTZw!Sc|zPSJN)PJ, u| 69~oD߲|tK:GH;YŹdB8*- ,[-]OIkyRXyo Ojsf@ 5֚zkgCHo J،LUN{C>uG8'Z1* LjkK1% NX6zvhGwQ"j}2nRgn$JcՃ~A48d F(Q F[%mtޫM3ɩPT4U+ (B7賐;AL?[PWPnb0(_+Ք{98$+$abV\6Fó[QBpw$gdrEq#lYφ_|^㛻fZ" ]iz*GM ?7Dcs:2l=27F}<{ IzbI8a=F3j;":ywگ Ћ^!yheU&mĠWVɧ'hUoX4Z|"/d .9 x)T;nɓ"ېWB])s@ڌDc MMw1BG%rOl @]+OE !Ÿ YDƭeMnQU\ }QC1O|AIU fBk)j=p%閻S T2IR8Z$mcO|%KfԤA=^gWu ߐ΂yBǸ]7ͽ 4ap L%Nsth:K;N@g ]5\i6byKs (I=ro.*YQv쫨7`}3U/tY\+$Iθm̝LYNKMɽ7jXW`MڷM#8 #(gѤvRa| |h1lN{™ToM:\7m qhEqKMg\ rc.\D~>݀?\Ȩ:p<~lT6n3/m{-67sO[nm W:&n endstream endobj 302 0 obj << /Length 63 /Filter /FlateDecode >> stream x3T0BC]=CeUegHl$TT@3D%+ ҁ8ia endstream endobj 299 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/private/var/folders/pw/sll03fs14wb1trg4nyg1gcyh0000gn/T/RtmpHVgIm1/Rbuild229b5eedf1a1/BDgraph/vignettes/BDgraph.pdf) /PTEX.PageNumber 21 /PTEX.InfoDict 13 0 R /BBox [0 0 595.276 841.89] /Resources << /Font << /F75 54 0 R /F15 22 0 R /F70 28 0 R /F93 57 0 R /F72 31 0 R /F94 60 0 R /F63 25 0 R /F54 19 0 R /F92 266 0 R /F49 16 0 R >> /ProcSet [ /PDF /Text ] >> /Length 2772 /Filter /FlateDecode >> stream xZ[o:~0IbE$E] ,pҜMONN[`؊/4~FJd;>(7d޸>yw}n{*ˤT6*V&6Kc{W?V 8W(³瀋.k.Qz%&:rէeEf`DԙV(&1>}À MUo`,XEW'iFƧ_[bӉ*SgJ+M'']:x=VEb qq&Mt2'+^bNrf |THW`5~ǰouTXUo\%tߵ4wɷPṀg}Za>Kvz(Zb)1i &NxƝlth[g97;w]T4jE@+9)vA`=EE,7W'#/1FR;ԿӎPסmajoZ)pU}QaC>+Y5r6>*x \dN@m2UdF*zA`s~Yڣ^:bn5bؘR Cw.\R6e&HL왞uPlG2:G#*8o*! dAdJKf C rAncUs-Y3}Vt<ŸGLe2M  \s®}E~_B~DcXݼe֠w1s.bS7Q!9hVΏyJ=_qN2W*b8}(MB\xӁeq |e:Uf+Nu=NuxG[)WUkЪUɇ;O!WEpa!Mm4놊#t b$5-yȞa`FTv?OGc"Ew[iʀ9Wv_]6z[i4BK'bBLrsibA"n^X9ېٗY\4}i]]WwledsZnn//c@ oXcfWrk}g*a>V|C~BDe^>ɅR`ȉos Lp?AX6a/p:g}wp/X?NmWk)I'Ů㣹-W-44&n g l1q)_u8cj*\0>d/RRvx 5c֐ʟveC9à9@ecƟ.믍KpJ7<B'a jڂ8 Kws@5ĩv:=#Y-p#iujYH-(>X_ӹE8n9p6.w^p翡\ endstream endobj 304 0 obj << /Length1 1766 /Length2 10826 /Length3 0 /Length 11936 /Filter /FlateDecode >> stream xڍP[Ӯw'.-0;-Hpn=!;|UT1ku?P)2ٛ$\̬1yQ + J bیHrr+@ df7vyȺ '/?Nqc7@ korFwt[XG)r- ljl7vپe45ڛA.%Aollld!HpXT@ '7 ƶ*cFYڛ;o)m *+_dG\lljjo`l m@Eɏ..c;?mmMܹ1@RD`V9:\6)Kؙڂ\؟8 dv,ݬ`333Wu;+HF7?6 9@,ȫy:ti~`VlzBv6v\\Av7!3 dCG 2. e}= ?EB^KQEᯊx3q8X@ַ\o-d {Z+cgnko?;vh:k)ؿu-@Or?K:[ Iqۂm<xkZW khEmOm D,ls`gIL bjWeWclv %{g/֐@os)%L06N'6f ?[lgV/ a8,E,2Л?zSx,!nV?(CoT !7Mmg&[[X@7U- _&lݿM_`q); ߔoG/|_V_wms7+2E\7 n!rgLc^rjw}@}DWF$i}uKZx]XKrϓaN+$nDԄw}}4!;er]Q<2:[)m)Z=J/x*$s΅mf3{T6([[Zs%>15~,ނwIQO,/}sr䟔K?vbQve;hN(iH{PH'TR f?SkA1wtw2KL^"7P'wge?>r?/ALfc)[7*~m6(y zr^llgb&NC bsYg!ɹ'.)& 5Rd Zeu4K Φ`pG~x̺gCUEg:䧀(ŕOۮnkǭVUۓ;-[=+ pj w Iz }aRzɭc #~g2[x%#Y/sArCez#*r),9Շe%JvttsJc亱*Sh'֐/%DM0y}U:k#zrVM;F{<,T }3l{"= (iFv>n<)|cs2# .Rɓdͽ:TlnDGH9ExkԐ;@u5pMǗ-`(Ԯ՜aq@ZRQˏkRDJlkY0/`XEWX+l따ΙǒKYZ^/_ډ.gT,)w)*{>pFGsN-;`hjo=bEXH 8.*L9K FEPK\1& |N愌#oOq0?F>CrDsNZ;7uvزYs?–q}0撔'9 s͕wih׈/qv5{؉3lWKGTQN>}C21LsNF_S,⽩6·vHxX1b =L-!#YN1©)~j~>v⩄i ]K£4ztE(9҈;eqF E6Sǒz :S!G+K,cLt)=JM eeGdstNqbꚡ {ess 7]X!Zg:Ǣx,ˆzu.h.ʆ>SVM$ǢV\=@T]_>m/7\-w>^J̖BQz(-9Plǧ?5=wȕ:B7L2-4&ӖX#^ ?:o%[>ns`!T3rFUTP#-?}ԭk{J}$S7&jj]xwRgl~o!JT*~ays_]XG QffQ{&sllq oRX= *C-3<4}vp\] 5Qw,<,՞ɲ_Ohj_ ٘jR!GY84IEqITLr?뚩pŗ믑3W,rA-pȡ}a~]ܣ& luX~v|:_VcqMuYUS}NН"C|pcGa+SlP7TVn@W2OVȱ"q% &N&tB]wl䢌.w,ad׼i[Í1'uX8Ӷ53IWJgzPBx} Egϖk45АvΓs&4GofԃF|^LxCRqwC)r{9}^xZ, \ bofĵ+S:^҄~%RkStz!WYߴQDD^yh:/ȁD0)_! pd~(cg*ѿ"ؖc3hTgd%U83@\[&NWiܪ9)CGֻ!H8˳#JoF10V#}#Z\'0O4W4VptX#A@D#$5u e3@H=^Ȳf׫S\$#$8C,KΟ)!|>j#lWjLH;#8w-+2"TwOe!Z(~M;.ޘ4w'7MRjU?‚vefaU2_mP`p$p(*·B)OS O ]'ƗJ^B?4c0AҼP]Hdpۏa4&~;N9\59ClMLmwnQ#WpnIǷldJᣌ̔8*;7 R}z_ڸ Ezk ;j qZϤ$IQф),8auhkIڍ]?YQ^鞓`CɖBޝ&8QΠP3 (0-u.l"ޔ左  ];ڸ`sX .s4SE'8`YX{VCM 9{*ݥ+ Y0$ZJ}wnFFs$\;YU'MN H;ץ>_ {(Բ㭭R#_B"ůz{ol%߹c.t&r쑶sEC 7#&#`~9>Lk5K Zݽ䣏ƠuWmINhܾ5[{e:z U,nHS~Uc^q/s[ v wd WF RXSv @Fєn4azZ\Jg1t-e2Vxa8䴶nSA|zSRG, ϒFxv.CiGSǙbNXnPeo׵ņ Ş4 d(f" -gvO>?CvTmiJ~9:\!?7G,6mBvBzzXJ^ k dqo: h2s﻾ t20Uzsd꽕w2jQ#B حc2^RliHqJ- !ç,Œe N[DgqZ(L UPˆJ󓠙a%CO28RijĞXDiDFi'܉j_3itg\1$~?0KJnf(Uj`^ts_OQaB8vj>W"[S$ v qutD[D7ug[]+a-$y5^ؿG8.\瑌 #OlƆ> frSk|)aXM ҖN>WAV%_Ü07-rv|YL^#tsd/ι`[^k97PC٘eԣ79ָۍpWHnX+[tܪ6EQWdj $[wOyX!Z3e?c#/oMQ a|ʁ- gKZMf_tA0TM^y}o֣` fRn\.umN1~TqR=QIL օ ~Hx M_7d9'w>r"E֎aպ#M,R~œ!t5TrXou;,Bl ֳhn%B5`wFe\:}>bu܅s?Q8 D<ԮϺ˻ 7nNM }-wN@e˨y8=NFY$*nWuj:к/+53ǰ(K<|>$_&!=| еOZdںĿ?Q|_s,n>yA>j Kf#Hߛ@xecdUպfYMA< }OIixP|YR38um$#U(FE'0_tƞ-%n uɣ1Q_=4 JK0e"|ydna@6Oo$kxNJ3*ed D4v>E/?n#ڦVVEHxR"ڧi=̞ˇƢ.`F'c#9/qpsb7vEIIS%fё DY,T'\JnoApI{P:|`5G<|L8Q4TQSBY}k݈#O Žq1iu^e]4|0/^i^iJv7"hMgBn*}Iލ?_H}$::Թ'T?[~idntd#T_q  ܲʉY`h1N|$$!k:͋ǒܓIw+4~uHtpN⺓^-&@w֬4=]eBST4xRW:|!6 W`_Z}X)q'L;Ժ6oj@^kb0 WYEYn'e)[cRG$jjyɵY$P? ;7yw0!wP΀2Օ ;|)( "f41u}%WItjޣl bɴ~Z^fU9LJ ~!=2䢆J\Jy9MJKKkt63z>oC@)`0J}~ ~Mn8MTy?YXc Df8)F@=fA&'o03 Jg%a# *+yQa_ٌ \xVors鼸E&æؿ* QS~΢(E=C"9騥grB,d*9aJLXs94;VDmĴ:)fRRX337VBxb˜_ ab막]o8_;{&Qd: O3Vr|?)I'lE nn)ͼ7N^i|j bG!Hm.Gkv oʶ},,^CN=sWdN;ϵ8YO+%4?g rY>4<;uɋք @tAg}&|q!kjIHA4TM:amD|``#8n~|+w{`nbڭ4 S?v3M}Uhv# EX!>i$ AQQ?i^ K,>*-glFO(fq*o̘;^.ʼn]b2[8/QUOveGIVS3~CtY rQFas B|p8QaxYB;G ZM'Hx@m_ *nf5F`T- ZK8J ɑ}G<{K3N,Ȇ " ٷE<6L8 '9U*hcmQ::EQI4q5z 'NO7 ׳LRo/`&}L~*c(kw[YKkV䬪D-CBUN9q݄zdy9klMIz%*CQ!fch~1GL~IS@W );`"ȗ>Stx#U3J' Ku 4N,7OXOFK \eO9߃3iItԄ cY$鲼K(7~v4KHsD B9ZP˝U7WnyT;֬% ]eBBP-"P9ZyG)PPd+>7P|G>zN !Z:sf4v .:GAu9c Rt=m;YDhuc. kgvv_H0RijxX*q̷/i]ZH>iTjixż8\[ՓU~9q,.]mXLʑDh{>t7v\ޜ@ꖋ3>-H*tSR@d#"s燪8Onf^"wKNIB*[tGA{4:V˯YvIwaL5" z\0A+gE'S~ؗƂ#HT3}7i1Su:;=Q\c̻ۮHtL[Y-:b|mKqN%P,{yih%#r! g0e”pj-?7_ k`Ύ:SnO^oÜ0UGzֳeH!CsLTx) @O@N ZZ4l+X}`]q &9t>AjLDՕ =aq>!`49g,{/Cff-đ.`{Q[ت39Ȼ$w}C22"MM8L Fy- =N`]TPVef:DxPɿ \i5K /̍[mJxĐe󋳳0`N|eb?O?3*>ƺ'{}pG__gr0܄ mSw zI6SRg%Er;#gh)p=ۑ{X{##Һ)tZ YJqB/Sp?o?BI.ygʉ#d/ox르 };~HYtC<2{.iY3Pj+!Hm>̞]XT'5>ؘ1ͻ/.yO%KkayYtj)PMfzdmj*vƱ˓BgFg'Z_ |dҢQ/v0& >I*1O %fKq$Q* xo986 + 2<׽|yh%̨H%rCsK?~v'Ƈei_\U)PKIaRgaSmk)SO.PX?|MjV61⮒hۨ>~U0Co &L:o 5d"0 )O1QZXuXK BCq";AX3ux\[i2m;١ݜ~SۉwfG>o3[#?X^ Rb/3>@@rzv.K=ꭔ"&Aþ\}*=.Y:ڃm"Tj>,==]'/NIGNim.p?U!fװtJas֘2d 2ߝ;}`KmKOAiKG &h9BdK^K]a#_W_*EB՛Tsr3{%>Дw5$o7Œ^q Iz2AלkX|GVBˁE 3l삖֛FqIܜ;gĞn4J?.KŠ0mllk< to@Fe q2n6>;]wLj$ 1 q80"G[5ͩyF#"^i(uK VΔnKe IObOQ2="=۱O2MOV{%[trJZX)dDs-j.:pڇ};W6^)x_* jИvCj=un6 o8p 5Бt&د|ipWƢ@!lj\% |=u ( "Do55 LBZWj1f߳_G MA@A!@p٢a;zhQL'֏xh@]~?DEo琑8EĖ6pգVAʽ.J7۽ьBWWĽu53#}XкcİgIBKp-΍9>GK<؇>8eoW,-Ba.o$FG3V {Hȝ;M8Ͻ2{>hH]>b!>2 KR% ^U\8lw?SJ(˻`#P],f 1|h ,Ǎ?լgFH%7M}n2٘T 6w;9eTⅯ6S>; \XÄnb~P#Qr_>Y9Ipi_|Rر4%D#J.r&惦(`yugS"$38` A^*=[7'> }.TB2V׎ BJ@fm!#qE%NŒBDmsnU ;(<&.Y<6s䆾7<5QCmpRBگsj32V@8 0ғhQ8  TY~D38`}nHpЏ7 bzp>+zjkH9J{7 HX>UTfCjT-yVj=eCd%rIQ3ⵒJ1m-xVj5{>{ =p}+%FjOkf )=̚^j9GtzG'%'^|ҶOܿi{ 7}nJ;|Z(Ѷ07^ǩl= azfniu>#LQ1nI,Q1"_JP >S¹ 7-$Z.su6ŝ&{JsJmgeyF^M.Fk6%V'vo}hIQh 5ËjWD2[AS*2`{|nű(T]@V83ZeNWgn]d~{*ȱ+K>o ddX,mKu+#K?Šxpz<9-^anya]cB endstream endobj 305 0 obj << /Length1 2014 /Length2 15443 /Length3 0 /Length 16678 /Filter /FlateDecode >> stream xڍePZ ]www08 N ;!8sy﫺Yݫ{ݽj S (`aagbaaTvO tv9! 4q}IA97;+;"ș anmPdȁ. G/gkK+s@cF `f; jt63q(ZO43̬^FՑÃޅ l)Dv]@s_J&Kc[Yˡp0q vf@7s3t#_dnW"kM@&^ k; ࣔ+/ =w&)Qɻs1svtuarK#_i,`.:U3^\[_25܀漛,Nn. 4bu/GNֿ|Aw@?k xw O"xVV+hi'h/~֞=cOfrC䴥D-N11' `ep<& }Jv {AhK >@͟Agd1{y7e[~&v^fO(wRZ]1ɺh"e 4Wv5׸ˮעY;A.=-FV{.3}&vߗt0el7ll~@Ͽr}XQ.N_!n`/f0AL?񿈇 ǩAL"^z?z3/|ޛ_c6d0^{ rsG;lGw)߷P] 运=?Rߥ:`}JXkus_GtO{?{_bfW+g?.w n ۻx)7@El9;>  4_Z4׋x0M Qie2,9w="ä} pME]ݑY&y9iml:s{pD!ȾfV.9'7d"{~iϯ+ {*u\ϕqAe?( Msqɠ]`/=MNc;'z~f2VJ['_V=;V':X7VTMo:_?'䓩raDz[iTNȝiWWfPY61_U-V) TBv%-ݖȽ7;uY)tWi[*tt%=MMmq+s0D- Hr|m&cXc} c W,' 3nLex9Ed!^MpI4,{*>(,EFVtWݍ'H}g_4Ųod_:PNc'$c2)\[Ч&vvtߝy"P'uD?b.$I7pgqlŪ;Oѱ++3`b!|OL ($n@q%Ԏ @\hj/컵:m]:E=1mu&( < `:luN{5C hC&C,0?yOx:;7[gBZdޣ 7^+G]z!x;Jj@N)Z 9yz8XwgzdWU ^kՆ}@qkۻ4taKXEdQSYZzwt=RSj^_ (j$ 4D9t Q,{/w[o -DR̛χubl1/Ÿ+ަP,;c>upF21z@ ;mxgX0nc$vP 0]%e1kfWn~<vc-[) v=.U$owHr_=/BAq-VV^;cjõV&)kߡ4Z.sYsPIr:U^(-4J ;|Ȱõrt`[.YoSWrNA|-mh"3+S|vi0*K|qvhFm`XG] 6g6=ף{(+d?|YcvT DI#ZiwMGu<)ZRp>\uZV7q3 NMNEr#>"W`ɒh* |krkX25E4JkCt odz3,Ȉ=,.Nj#RKh{Y4ŏN|MYֵA@NbO&{g=܈`4p^n oDޞh!{>^Q'_{Oa&S$ϴL ` uwl3ڭH(FnN[>G;[XvӍeM4сdOhZع~ʅ޽DqAO-rU+#f=iqqrIeZe#*n{?(s''3ت"RWɣ%i~74_l&zUa̧v~G5T~ˉM_6<`3#*Di1Y ;m?|W[{ th JbUa*JlJm Eͥz?\ˮ *a כ+EX5\ɠ-i/mJv4sKO?$ #*_[R?sDOUHiLvٗCD:'";CO'N= gBVB2dzlJs&C.~.)Mi+[%* p'GN -I}T0EEv l(I-1k^aT"Ym_Q]rңLALI`*٠>#lhhf5"Z ! aQ(P< . :"4:Uo:VFԀd߳T ςa=b!P`څ5xa O %kutDZ).&Tp9bTQG6۩4 /-{m s¾̃&Đ2IuǮx1UM,E+@Bgbg=AB:yq dԐ)Lz$ZE_O҄CZH$d:eZm`s 'QY;,"_הԇopbW΂L<[y| sQѺ( MoiT)F"2R9A߃Fue:?](_g4l=W|zkN aPDacATY*ض$Q80@м WGYj+sXac6rY!Zcfq)se˙gyWM uȀYmCo/ LJPnIZ p >f\Cg.8T}Jeqr9/LgdOy/!#kOdvo.!I?h|zͰ3~u\Q|t>OojNQyLiF޺7+>MB8+GL@V5wCjt(4ZnQhbf#ʫw9Nٺ8%[׬R(TՋQw'\IJ(EtݻVFO@lvBζLKO&rȨB]zf#LZ H^MGdG;2A6q?cfז25`"yq·L. +.J57`_^iTuSJ\JVªQ9-anP(-{']AL4%BT~*Å}ʌqA#f'B,rH&"QY)a4 R5AQ1Oe  f[ RO颸*U<XU%zN qRMGKkĪe*$?-b(QΤG3TOcw fJg\ \~@aۓp~)%;,`B`86Nny)QE`+?*4ȃ/27쫖6K,IzO۪BT0ɧZaf6nִTU ]uv"W$3וd02)7'CIDs`*^sO1:Fy=/K8d% lҿDDAV VscS)R.L)-;bdy5iMEϟFIj3lYd=Mfern Lط-FЉMuKc7L{;rbnɑeB/2jԸځ.|ӸI}.)qLD[SsP03jfhq u'1z!jG~:Eҍ~ >TɬՒߺ}-Cijwճvgq$yHn.<=-xMV$;ڛtCԩ|-2LETmW4*ߌf.ўF'- B}D(?R]@֜L>jhb !;cՄRy=h?K[1A4(0mh⸅Kp}R%scMEN9{L608`'B2#M_Wx7yXPkV6 W QEII ފ綖R/}6d o~g׾]"I-ger((ٙ KmG}|!:yzXAEAߌtk߈w/HHBדj 'm[ޒTA?L uGxg *I>b_GSsR󁉘- FBU6h~yHr\vqէE$ \u\ӝ!= Ws ahߣU?:Txd|7t=K)'o<>ȒY'"j !2:LΕfQ7 R7L݀zfYV8 T vgf# +JO8*7d_)]%ǘ** :ڗCHDe\dMַ{~ݬ2U&!ԠJ<{ǦMZ]ΤZ1h*xa}(SKo6xӦEAO cZ*Pvdne8llU6l$eY!U] } oo<|\7&O0(=`R*(`o׽d̑":O)BPԈ'.CfuY9h5'KSp!!d-#-]=9W@~'/8AwmS}!?h!A6~Wwpg~$݇ SJ%jd-JƵH0D3_Du3v{EUʇlA lWtu;Tz|+Â= WiJK+CknpŸ?lyD)ARj#7MjŔ.:ΩU~!c 0f S.beJ(:|38?/pu~ЃPwt JXW0srB328C$=_rMi{`ܛ;#=jAF6VXOv{qW6헬o;(ͪZ\٩LV{!.2V%GofG|Q d]zlEYF.wS`|-lBR!Wils!Fqd<ʼܨ;Ӱ}tHO5x+ЕǹA}se-=#ӎ鲥|SbZ̲>MlH;B(&mdܬ4)&yyډ94]Q {5BwaP^@xjo1Bbخ Bc` ovE+3h37bCz_҈_MspS+%;$|jAǶ&c$06CVZO47bkKqlzG:) ?ȣHl D$u|:T?6%Uy]w-Dί>Bk\Bu*͉&z4F>g`~dFܡCR&zy7[]\ N8wUy RCDh˝HSA&ܧk|^SKYS Ă/tlģI-;z+N]Խ6B3y[†c.Q*Ty:+H]uKc>b)r 3J˞=5T!(x U콩_'U4T$%i4M!&4rhYqM$X=ulEۯ# ,[y؇l2$Uȟp5 TBa"L~ tuoC[ດ^B|;CaiL4o[A|4e}a‚v|%stn]yF"ާ. zQ[cvu_AI9."*Cm$&kM9s90a=еC/$D:& +"꼉Tw 'I]61Y s ZD 91qr~4DJ_[qIQ$Ro2}x €geeg:Mj!HoB([џB. 3@)sXyUY{ װѣ&(n9v3.u8ybVIZq Å}~Cf#M.v0+v>,}\q~)0fh7qj0ow 6A@}Gz1 hC' ƖpIm/((|mERjɉMn?P063D!6pFD] 8sԆ 5sk$3ďD( FTB'-,#>BT!M 憘T}kYan-BKky~i* >an-0%VH3h"<$iP~  #pa\`oBų+p" VW጑-EVjtW*]r ٯ <@'Y,(Y"zn]oXxVl[X eӉ|lIRW/̘8:ov4 dS*M%\c77yzmX^fi$L ik%i! dm2B f9.ʲp2n7s6◒RdtRRIe{Z~.uhZюUXr5V1*z)Jca;=X)Ŏش1؉Rب"x3>pvǷ򯉢j`*qvuIp>JGy)qN!ܤ 'z8eY`7ϑS6Q P#:PWW~uԞ4:;Sd3vBu l&0֡>14|rE^(@O05W1@3*@K8fA79|5+7 0AJШ꼞8v|] yxcw"SGgA 0껕1/:ݪra- O>u=V(GvfJ{-?0ԃ$Ns`P p_3f}]s{ SCo 14ƀ._IԘ 6Z8%AD55\N )@}D 0Hv=YJ fc@VڭEDL ׸1B:@3.咑raX3y2ߵ,H3f7j XdÛ<[Ml~m1!4GVb$%߈F?kȄ`n7T4"!@+WS Ce fܱ@ҍ@Ҍ`.ѨPp]Aش??_PHaReuV>  G& UHJO͞祱3I2qg@.ۛ96i]SU5JBTiqWw/o ̣RC". Rl;] Zir_ 6.(+So %5`W䗐3^LNOwc r@!JI>%A 눉01<7+>g'x3mh ]jLǮY`vμ*߬@keM޿  VKׯH-u 1 iD3ohA)i!z$ſesn"}`|+zN}qq}R.8j:P!O,+;KU o]ڹ`kU}ȎlG\ ׾AC9f#+{ƽ:~6NAm]AoWS oc!ewM` B)us_,/tdE>v/X0Dp}ayLS3ڌ}ZXa!Lk-gmRڄ`t`~}_); ^4"] .h8dAI/Ah_3^ZHS tk!2qde+Go<SEC(|P }JsmUFgf`w@7wW=T _`xEH`V)L3p82MOe ;x13OU\/T]hIN{ X—ad,u&;W*4nvmCD1] h?ʊ63juq}"wŝ; k~qUaXm ! O1:T*yH*Q1p˨3quc-f@Td"nd {UkB7aQ!>icxP`߰* Q4rl_PmjPqUL\;,C7 fA5.j "aa\FOq Y Z$,B-Q;tz>@7bab^vS_¾@TSM(&~2Ө2rO3b([3]kc8(64}l. PzN뼂y?ְyB2.3Ȩ/G4exU7Λ!5h ؉ВN鶋KlV?)>DuŮ1m׸)G.KRmV0 HC-Ǵ#fJ~^5=م&$16$Resó+Ōx?"ɾ|SbrE.IS,b -eE05Cyk )xNF1 R/ a#SÁT8S ͮa^mUl`<{ZjQ۝Kȳk y~L>cNyE![Мr`r;| h(ί5YyPIh卥[)V's0ުpAD})ImZM\L7 1P3M9^c>6 ށYA]RuFOϺB;ݛf*Wo=٣ ,t>e :L %C!soeII9@/6 , Jf![ArOF"]72:Pzj]YzItiƯgӜ/&#zPFkRƌdRx.b) O?!ZC75 c56 >=?tNmqdlf3-d{7]aATઍ[Jk7m#ݛH a%2~ endstream endobj 306 0 obj << /Length1 2050 /Length2 14086 /Length3 0 /Length 15326 /Filter /FlateDecode >> stream xڍP\ qwwwww  %ݝ A+9{L[c=ڔʪf s) #+ @\AL †@It5RG˻M=PduXXXXl,, 9$݀f&,Rry??4V^^nvN@Sc{ƶU)JX813393,h@+/Ec;KcBYPY; @Ss{W{3s'UywsL- N6659{-@[s< @c[g{1=o)Owltpqfr2m7ٙۻ8#OdnwO?\{/f@GWsǼ,],,,\sG_y:dxa 0Av6v38z`4u[T7[ ?'@}X,}O}@~2 r_`dd9Y[Go,re-@}({h z\s͟Acd1}b<e$jk_?~c;#'} @`C5b [q1~Q{K,07SZk\eWkl g_W ޷p~ɿ]GJڛ26N.'(qrY)03ك\S| '('Y/ӿY0A<#%Y;Yz_`V*YzgW/}G;3?蝙dX2?;wwJ;% |_w'/?C, Zrkt2'w?dyj].ofПcEpu~ Go-Ԝ3\H?xgG»w-nh{?{=w^SW'7r1707EX^Xׅt׈3NRj2z/;u>&VgtMC[ۑY!y>jm o0Aezai g`HQMdG#[2ѕE9G}Xj.91zsy&Yxd0.pts79o$ ǟًu6b+؜{)u!o0ƦRdqKɆE 6XhD5v%^(m(^3giRljNFn=w aʹL`eBnhaRyfEL\t{=O /|''uմOԦɍGXHsaN50l K?OCYBy}d,b 訶dVk>n'k5*EΦ_tԟ%f! =0E0?\|= y '@o~p+'=!4#+{$_{-jL5K< 衖M`CXNp8B:EFv[ֹ-\ק?2ӀM'kdӳ b9ICB:*mNsE.š4)O|A騞;!80x:Lw?,`h{?{( M?ձ! m;=\OƠ[ŞAnb43))B/1N*+_C]~ F%BʇվpRBK{Mp_:y!eNm>U UclBH0bO΅|eK=Ld9&_ 锟mOƎl+ÐۙK(_ODp&$=~s1ԢSO%(5\(n$;Gπ {[Ռ4ז*yٖenOQa6EapI'{Pܯ~" ,p9`Iʀ5й99,/7+gۅ#Ʀmdn0R~pOG نd#h=;kf`be4Zz%-?gnU{j'(fIvoHP.jݱ] =3d.7f/f͇(%Ɔ2{_쬾[\Rw:f41e-wR2Nû3sSl ʹ WiBtHFV@3v& "O\ŝZEP<)p؉s*-Td%t3 |={[E".Kg0AB$ą7g`K0<Xq{ nTf*q]zl!7@]JXCagCt0}F=9)80sq4N W̍S}GJkp7nQՅ y|"4gQM-[KtN<1}Yiʪ,udizX:D˄mV3`CN9u`ЂlݯG5m w>3wo(q_2 jo>HVH~KwUoMwU9xkn87}ؒ%cx)\! a#U#>Ysa{mތru;]M׃GpX][ <dpS6Ĉ!y)q19UA H7!+/%odZZΐ/ NK Ydtxꢑ #H =;)\oƤWQ;CO/îE&-_~Jwׯ>*lS: vю 3#a-sW1r5x4H1w=Y-*SmSŽc:a;?U2lSu)nrߟ$1K= Ct闡iy?O{{iV(<# 'R7g[ls%6e~-ޑuT4&.`z(|zxu#Jn dJ}极R3L05d{/?|e6p'<ӕ ;8b8 vFb# Lmn3IiғWQ s=L{=oW5Iݨk#v؞"Pz@Z6̡Zsa#a%&؊םyQNQ7iKe*1a)yVc]8veC)刏ey?^s]8t2R4v#5fVTtZ_[.)!dru-jԴ瘙BMqԡ"x9&xv귬_n2cɑsL<.w ڿoYV%zuZEoHҎSojH PI@,5C*)!󪦷0st~lsX|ӯk\z? yoGQ=0+ h>/EUYuO"kIčDhgԦt EY`dqhxmnCwvkq ZA*+-ՕR~f^pa]txsDzըxkA\҉e[%Or~.Nlbc }َ=Ok{I $;ijumj{Pܒ,9(>BbeQgԋL6=C}_w)Mw(MUö;Hw.xxHQ] ղYHN  ]e|nBXJpUa+o$/ N뒅z` x{}~At3:Hݤ;nhLiios 9W~v ~= 2?C 5=Wn@3ۊNaAz1"v)Bgjbcj;Mač`0 ףVBC+q2%)@΁x,m\gLa_f6C=>.'Bex횡8:.8 ȳ$Y7 _hnʥf6&HbwH1d[A~Īn)2̽"^Lj`#GG#H<,S.Ku:]R=kzI] Ϥj#ebqM[Qfq~3?wŝ k;mྫ%3}rF>3:hO&L2z"ݭ2ڄO7ݣ,(pkM;T9uӉH}ϨH[lWGt{ 3`ς_Ș@SOzZ $xuf0Q,=EtsТaahRsˊmE|iVRř[qk}IW/փ㭜5p%ˌ}J"r쌏 o")lQ > LP^Ox8q1 rd͉̪erhxsQO`m#uX).ϔEᷠʶWHu^O]i S|(T mt\ 7 }3Of7D\u66wzq>iJ8iJsUyšcjq@IՑ8ggtACK GMZ I"g]|/p78 &}dK *r%릏0Nou4ygEڠ/) 73 l*Bߤ͉s3v+.үV;#Gz%b6Ē또kڣ }HghT(pTZyt][얀ƿpH` ~2j?0EVB#$5%_hڕRVW22+a-5#k:X~׷ϥzh8+84*0Vt{gg=ݚ=RA!}&(v%SI!X<$Dy]GBKmǜXIWJj#g}r竖MZD+̄<,ew4Ձw]{My~jP7K؁Yg~* 61xF ';Z{ 2ME.܁7h> kNXl)gy&K6a..@ujʤM+ fpu"(c:A`<2 = Q)xjٸzrBvӕMLPǏe %EIm\K,gMDP|_^RvBr=1yC!2(8'8ן:izρۺ+[Q=ܜč.LCmhif TiUd esA;K2c׶(VVҝm>eXl 8L'Ƴ}@,Կ*<  [&$ŷ(h;rW2H ;Ȅ4;6J2=>75Xke:|y RE L(R@3z7rAUC7NओVIa# 1!]Myyw->BS']=Fvdef?i]'jB샿'ͩU~|,$.iu9\ʑeO M07.[%ɦ 4k 7. t  \k/pFw^CiYՐUx'"F{Xu&R@/RuLe0x}'W(;1lbXG&t5y2B(Z}*#(lDQQ#`u>8lT?#AAQ8J#SUx6e_g@g"%.%5DEO Zo95T.=f O:sn_'e0%=⪕NeM1*$(%P vlܱO7į8~ڪ+YҨ teg:)aJuTdږC8"ɍ*~ڐ Gǟ^4WBW6$C/'!,(I trOџÖX}=3ݧ.Z,#Zph!u(280!; T':R&Pꍿؼ^&֐wҮ } UuL[.bGxN&UA'}y *]wP=[op6;_[aMKLIJPcjA<9w:$oB~vX^mQMcNyng-EzboM\MG2R CznP׫ٝz9opLeCMo:#Nj[j\_jb Co''em&5;v|8Sinh&ffY~LQV8ViXXMߍ1bϋ:f qB~:b(zU1M6 45뼿FWG?T=Ee8{#g>*WXrEcSL 86ȤWSsU_1H+cg6.ۭKS_hlVԠbĔdEcC5/#ADzu,z Iu5>^awBѻ89F8YzO`\ΐ6 ӳ1Q8<Й#EkgOX v_ f#}Ǫ|XN?ǭEBO5 'Or)Oҟ%6@Kia?eXS\ly>=^‘viypErȷAr|#Dt@">O4]PnOFi?0s9,&fu<ɨeqP LI۰iƚޢǚTf3=E _W~Y;a#z,\zET!м|IXc, fLa@(O׺vg߳} L }z/=r7>iI5kZhP>+GHM "˟ _ 3KÐ6?.XŘ&rw!X7" AagX P.~ ҵXp'!J5m9\.3)Qr,(8$*{9G㠄e Inp2gL,f戰 Ab }^-~4 ˬFh~ݺ|TBYW4m@1nz'L+PI`Gs2uw$//9ʾ67х aEɭiӺ.Xݛxo_Y7nO vU>aoE.sU6svԠSQ7\v?.21^鮕7, iB9s#l/lhS [Id@uON>ڹCvǓ*1%Xxh$C K w˝yW8ؐsUsO#AP*8җW]ݹu N_ЙJSz0#YHqx Rfltq+-:gcT*v6YMT41Do3~(O_$#},t$8fGE;2KX1 d։ q3q\#*T<t[ גi0%uyT|p9V|?1l2Xq%F2W4E z]g$(Q.8OE8 ږ9$]fU?%*l~EQZ'o%_uXe܉fWT0B H[t4MWׄ>_dܱը۸r^[Y|;G06HF`(@_Gjqi։{ ii̕( @T캤N,F)'ȡ7ges|> mY`a&"D3 AQ?~¢;2/R& VEf%AeKC\qgD'~3w9S|Zk/~2`Sxp{ k}yC!SXWhw! O{7CHޅ!Z+hM[)wUx(kafco.ӥ'sjohGCY{%mMDDn_:\暼Rr/ӳ8!k!l*`FB!Td׫G-Rcv_yWoUֹ矑ю+PdI|PrY?cьY)L̡h.c`=` ƓDGZ]骍 u 7-? QD夾z(90=jai';@Eaxh[0y9嬊..`1N}N>D+p.[|A.y Sedc 5yB))~ip|wݾZl@+] ZoVt#/,Oϛ1?!9NX5pr AxK)o.H/s`Y;%ove,x\.si1(SZW4eG'Y8v^iyEOeﷻo5ho;}ҖZUYtB [J(> \饤z\bn#ᛡI\O_WI»2=e1jmyA\i̍rrM$46^IxwdN'/o*;̭ ~)DigG[!lV[)c,ձdQJVUd;t7|U|f8>C7Q0bl@2UǷ4N͚/2<9zS m|Gtt7R+EVLPۗڻY7{ W7guE[wd4O>>} (3/Wl'k|¤.1ERFI 4@} :ti´-QJ)`S ƌPP>YqAq`@W--\i.Da57[ﺱaF6¬#}Vd2"#C"7^Xv9oQgV#HE{\fz%=rF%Z8_q@As z۶K'DfŚg.AW b Ǿ ZI0]NX{,c9ng"(w }kXm 9Xt$iUp3a2X8]:'̜c4s C_d ^RYٞMWmCt)c ,gp5Qπ&Wk#$M4 KF}p-CrXE׫v@Zy6JV@kC孶sz:^EY?ua7[5sYWTZ*a;+%Č!FUL LLя;K {^ ͊ӞɋvQVP1ȷŠ2SLbO /e% 0*G~z:H#hPO+PYڇ=KYuYt{?[);ֺ 453еDjl|/s yAghzd;A`Z^q\ ^Jj >/kc+R2q[wi§g$ySzh=R^P ȼ.Mh㯛 4 KbA?嶫Fk>hvgF3<+ &}J3xh4:ܦ/ 'r!.:D^T2gEд 9gQVʹn}fHu̽P/§D|' " 3CXﺞ]PCsMi[56]V=5m 'bvġ2 08]8gDЊN6 StW~bM5"$.O;bE d fֿ8Ԁj,2&q>nBh`5 -:Qq5,E䢩3$xu6'[rܔ,fVyH3|՗ZRÝD=D>b[`Jk^=nNVzNsxR>Mù| F%D}AIp4{֚wXHBҗKsvM(aK.>a5kO[gV|х"Nm1;bڊpI٬. 6 XWk]zD|Y)u$^%:zifмc$ |[ѳ )=es#D(2]@X5pT6J%<ڬ6<ߥOrz%G!P~ F [:D>2#- +Rb `EqVl ˎv^/w~;ަ $UoEkOxH[},pyX`-ؚ= rmrQ[b6+j Vj4 mq} pG䛯0"3gé,L<>W-=vˑS$GVIùw<7[t/V= Ƹ7UXMGm)PێbZU. 1,/{XLPScfb9iiz{nAߍ*jS{ g' 0>H;W佖7}w_{'G)+|ݿGwhpU 1j~&(6%v}|o^M !a;cם*1qcA>nۖ,sqe4NRwf$tH{I(3XMX?es(r2gTC1oL99]niKVruRj'(tK*»psi^R-9 bk/E˓FƄ7`4҃VL,@|l+H wqзkY3^زvŎA8IK QY1w$| NŪuW 'GƯ`WS)7afI,/HrWyϙfɆiٵJyZ_?'L01`l;1zUb@DV娬,lz+ ENbĜ\MȜAˇNs2_R$LSs`a\YIKP=T[8p"XhYVo+QfHoF  8plX$.&Az3bMTv-Qw+1}9!\ 911X+܄ӑDԁ(0~2ϲkMX䫝D 4嗃} 6Ki$LJB-}d`CÃ޿c{O"eYrW]Ʉ$td G05HTIEqM:%ãCA `5 N M3 g0'\RqVkRôcֲL~zV5WV{2kCD&[c(ռeq7>#XHcu:e;Rbh#z[䭦4%-[j`y. %w|5⇮W̱O+M\`S ?d%z`9VFVnxpB?ڙX73o2q ! |Bԙ.ɬ[?/VuYOVX?Y IH0є :עɺR_Gbcx'6?߉ԯYcs[ӌQ7cHXK&?_JbhWdQHU_:-״ULd_'> stream xڍw4\o (AzD7GD7`{'BD^!%{-J!?)߽kݻZswgww?Yk8Xt H[ `0?,0]` cD_E ؔ h N =]Aa@P=0%DJ/8ԑC拂;81k pqbyW nAZ#s0@ahrD x{{C\=(.^va0 jІt H{70 ၉D@a(s8` ߻oDp` #{ QGy q@b!^ ]9P a==.Zs"@{~էG0+g7j&`{ԔB0&l04 DE;s )ˌ ca(OXvsp;4` s#@Ɏ11G}s0{%^P$?0{%>?'$E1"it!eG\ӿ*KοKa- -"`;̏7+]o7oᆸ]|0DcP* ]SCC02G8*pTsÕ?v_s#`H '#,;ġC.F70z_a3Czڿ8ed}ֵޑZh k^#4* 9$4沜4˒0NaZ@Ij rO GλwXևl_ܤcw`¶EH7 a=[xm*޵pėq `ݩ|=ziV5h{ɻ'7r]i^;fʆ^-_Grxe$x$Y|W9;0ea jN}aoqTBm5.F9KL] 4\'J+qC_wO%3*ҵ-&{׋ qhd=|jj )Tɼnzn=c9Մ {k &[KC+rZck ڶ*Ei ⨟Ab+[ZI)-~enY6 lhަwy9mӀg% }v~0RYvۆ.[qֵѯ)ףh3>s/I~[Hs{՚:ޡ$ Xgar~lD_2wDLNW6d =-ty+E߃:mY810oAP\a͸ 6cˉdn^lM\/5)\JtIU~o >*w&!6{pJ,Lhp&Djul%I:6Mb.(bj_l]UIaCxU g_n(xPOD j=RG*N'ig)Gr^uv.yݿg aF .ػ[n=as<^{JD{ 1/b8a;ЧlJrM*a2$e! ~9"o@( v"u~ j0VmN05;Jyj3KB!!f)o Yrl{6IVjuY &ȐxːM8>gɻqNqd][ANe7AZZHi\\VNݥt<{B>Ly($0Mq'!yYY4&”5 ӫ}'"VZӰ 7znɖZyB \SLٹcM(maU. $q?ulmXBB87va8ݢ_2꫸З14J!,f-;N[) c P٬U.vK8Ty*4& ǘ HK{fO4is s&^'A}EV'ߛ$н\Hޫ=K*g]TaP_ԚU_O/~L)%Px9J BE*>^{|44mU(M!j l W.Pg inDpŖAhly:*yAvB^ 6gb z6esx9i,z.ÎxNijyEbnX2yw'h oY^=tR WJЍ́]s\RO~liZZQW{4E׸d F x&dɫ8#DN >KOa'L Θ0$mFAsf~{_>?mBۡGZ0a4!VWU)DgQJ9y˰;tNG*E LVqFއ7q[o gó=>2"$>Sy8\%3*i9^9",x&-]W{2U]:FNiS)5d} eo%s!;B1,S oOW&q bGu oE?;?6z!fRF$ǹb̄;TgŭvÆF+z)<!aPIbMaS0J7{a<@ }H{n *NO,1¶a"Z)X%w:LFqBբf޲[=i3bx"G_䙊,_jU{zTaÜ5ʞKnĻ7 l '<{Rx?YM7>nWy)u%楂}FD7۩,AsYʎlQ/3XE~N ,rFgMRw4r+ˣE?@U [|!٦? R:q~wޛwzQPR?u&ѽcJ!4,HQ=~4ˎFH{+D7Tӫw˯"Yݯ,Mn/҉!+J5Ə$ A깹vkYbI-$|T7[Yx8K/J35)&9n}5_)?pIXrk47v [BQ1bBWk.ʲC0FPRENZmTm9nn`B4ikug7]ɍK<*V'8<Oi֌ڻ1D\TQyU+‰dF`PG[ -zNQԆ%}>јkTz[5xH9'˥WZKg=Mva,mkĝKnn&w`ikFZ8;Dychu`68Zs;ɳݤ{{CTU>{=պSo >%⵷W}"%CIѩSlΩ({Q672}=oÑ΄Z=lD<|b⳴_.9$$I`Hl``|i$ ͢[bEe'?`ς W4OOVR*&?Sf˄`oC Q]Â>Y(ʗ*gz19rW#r/#iy+t1ܩ.ZO[9Ѯ/;oRd,`ᢌҦ+?}3銔r߰ [~'\,?/&}~i}Qg1̙l XufL^E uoȿ?Ws. \Z<~KylSqFCW^K6?)QL`2mzN6%c41}>,uD>W K.Pe (zFpJw ЁVFeT-/ $zzQVt|A&rnCX%4f㼃d/C5r|34zNĀ,vT0f  :) -ˍ v2u01w"jPb|qCWtdlyb|!F?g)|#LzF#dj,gײpZ.ԪU{ܟ*5EgۛT K[OuHZ$ rE^">/Z-|.%LɈݣl?q266!g|;ޏVڮ zǠvG;!ɬ\iڡJ$Xܳ-DcUI^'_WBщXY3ϞY-7<&oXɐ`c- *eOdoTOo[2v%湛]/?j/Peyc'_Hf-fc't_ļbJaoәviX|up__lo%;`™ >A^CzqoG \2Ndb:L]Լ焽LzLAPg&1axvN\S?3:w e6:=Ñ2QHMިtiP}wݒeqT'=g]^Qz瘸۩̮a5c8dx6b~m#= 97NŃ܏_}i9.rhG{gjX¬Y'eHzMȃmqz]zA.SCݽ\X&lmSMgŖnԴB'x ;jNJ8PLT˲klS<>uTޔxVG(j74Kx/]+~Fn%ħ&h PTVD))M>Zaǐb}mMLUMEP'WoU#uC O\ύ8_H}fhjpjԸԍ'*LTyN)6(BYj> stream xڍxeXZ. %H 1 HC0HwK !Jtw(RrZZ{ߵ .%DCrxx2j ^//?// s(EpabőE@,69 =U@HX+"!pZy*pE聀Z wDEH;@P n8P_)mHG1 ͍A63 na9s.]`>f A*4!?j;_ѿAa[pG f C jpߠ7 }BBoӟH #/?h_P@^_]CX^@ 0$4ж*g4 wT'a-a$;|j )x^,N nzzDjYͅo]%?ҚNTjhm"}KQfm0" 둈?Z`tzcLx2^eJg".TR 6idfajhvӆ@?WZqÚAIJr }~=7~)1ח.R=,)҈* /$Ȝ{QqNƧ ɚ]޲` >j֓%"']u &0×{᣹Aq葭 긋~:,!RaIɋJe"|`=5ȗ{l Ry4{rocxhSRa?mwq>ٙE*mލF\3 H?/ҹsRu %,J^LA| JePG!Z/uvX+ɼiYMH't5MU-JON@h*`3nus#Kޓ H&N. l#| l3YriJXx C1nZF qrͭSgWv!3kShFDT%Ä Y% @oE5` w![P8TW>w}/Q$h*=tL9a;) WѺkEn)#{SZߓyV"iOGB6P{+15% 3(5[ÔJ'Km/T G2xDݧ11u!INʹRF@"ݡt'veylp =WqZKyN p<WC%#瓱҃}SXbt5_ee ,4%0Kif[Q1E ḰVϣT)p{RuRsgX]>?3r'Acx(\ 8z,޴[t!7"b㍟A6ZruwJbRbTZFF,n @h7ZC2߫y@8iVu"nâvG+a-y_!{s2sSq叱;fau^zeXSd91Z<CVgRݘpyԉ޽P O~C!{J,7))fi:uLÚwۋY%[ZrcdIŋ R.˗fne}IO1asx**XԑoGM` ׋$^WPԸ^`60*y[STGO [N"B^%mYy|2QWHNGٶ6kZf'RN-rv5AFn1;$Tي—ȝ߳#jNfgǤ.d>7jMHb ;G{Bn (n'eO3I+[ Ntׇ"t>g5‹tގ޼gn[e5a-4ۜyBDҧhrr~]?S3Q?LTNՎ剓&];,sOxR[ԯr %q?c@6sZ $f/pgo|v)_ma3\1x L>؃/Q%"~k=3$4eV`zPLsIkKyӉPRfdfݣ>NvEFѼclw3̌Im<.xJzc|0~>5hf'ZixaC^fB@xCDkE c _4pR;VcS^.U|V{g"0/5<Q~`M%Ζv;sOtWsI8Y *{M{B'Xzj*U2b,S0n򥝩89_yxSkAӕWu|gkBLO s0W_#h bD+r"kZ[ҵZ~,V/EZ)ݞ6@1@g2/-2Q>}`gvCi"}嬈DqmWd j>8s=HtԐAgʻVjZH8.\,$\`e0P{܏,^:wآ#5Xte}熋/s͹c@c~{bn2 N۔rq|$9f* St53kxxdե tΔ4˚?zqgwu&gfkeEYMz+t:^JitQ^ 4E<[탂UU Z" / ^,r\pҗFTɩzO)׏o^0GODxun,Jco@H@/S8WM04M8;EiLHc_%_{KjhiN:FVoB:]O/5I6W>kzyyOkvM8t,2<^׏g] I'|\->':ҌVFٽnLt:՘;ĦB+y!w+6Vs끖-maM1['56Պ߬M 3BZ U2M~V[IX+/ 8Jw!R4֦@"?xz fie_Ne=280vkږ|ita j_ OWK# çx\-wJ8B66p+ ku`0۟J;/+HGŃ]Ud!7cT9.4;>Oy>)h{(hM=*.6wׄNq;e|Rx /e3im3uQwm}׵KF:^zϡ<HbwM$=l49Ib>UM~@.d3%Zyo߭4F0-yGN;I"ݱhԺfqə};1-%į&9eeHBliԐZG,}xK01Z諀f&}/N[xxw9\"; yY'ZгC8L6O31rhcLOpŻkM6nOrF$M@./yҔdv)08dѝޝ҃'ͶGPOC}V{b/[4c?ydڵ9m\XVpV ot-\'fO&a !&K@IiiV]0C_yD~+/)0{@fDK rܓ:"|Mp==z+Zck㌋>M= R/J\V R4?8HDke :J iZ86l6Q3'1"#2H# yCi"OCASqcwB4ɟd?5!k,S&T܊6tTmxqI֍ LST.?N"$%=zaewnhR(fOnTLCQ |جBxpX>\NZ<&5]@R̆3mĆ(JN9&:Q{_HE0DL^|[ ?jv\`V#nHb#( ,Eb0KJwp@|Bw[53;=11y Zuc9ⱽvR说B̯vS|J { -GSƾBN< STs/f& 25n:Kkt|dP6apV̚^?3Jt!,/ >SEw'L{GS eP%1V" n/V2LW鋙 W>rj&0ם:ZZҙxrnT> [7#E*?va*CN5@/"wT Ub 4Z4;R#T@)m(5)+L2 ƚ7Ns?";VXU4?KdrY~ǦvMa[}\u5g^Cd}ٶc!IcbI?/*)7<\Mʷ 3}[#Y6@ܩ!9Ln\^: sMZ,׮ɢqLƣgKUM9iMKWXc4*Y[vh3o+v*V,\Ȯ~@%f[sXr 6PDI8:v=9W3"b=օ=X:nj }#}a^P؀h^?9+{̌[Knk}Bd).܃Ad'W]Kg2GӯoCq5% .)muZqViq5[uF6X8Jj2}#ie8ѫt˲'6Yz؇m_.<?_XCM."/aی e_&ʪ]|;B-IIS/E2;ɸie: ~JrҜݐΛ_zMkU6<8O g'&U*sEown5 {D0s W*-a xW[8+CPL@^_"tb=xO-<#HFyy2!JYuxD^}Guuii.qK 䳼qZ4B9Uo4ӄjMIc TֆA=f[V/̀h{3e,rA9R&v* @>JN+#!ew. iC#?<]H̷hȼgUvKQ1kGw%Ro憂90TI8v0)x ٘!3?eBaKB)A|R"WHKX+JUS| zC08bm_!m?XMeKBQwY]>zϙ[imƄٜy8seG~DkG>U?O4kqqU|oK|hoBp4ҊK ّzVذh]Yռbko$C #}Hb>)(0b* t Տsl8h>u}K\}^InZt䷕͚=_/ ѡLyKL"gӬᅎ*t37v[^[8JQhK_|lDmaf=C %.Ѷ9th ((oP_}>&ᙴ]P`h5 #Mrُ;t P4CCrdc9˂"Ƌ9šWRX]5v&;雬Cۍܕvؿ$nKZ4ˋpU);E?Wd7sh}cb]{)ЮJiBg0{$ve(rnGҭ 6+Lb_hOXOxqzfb d@g]KPCMLC,P ~Y1/W}z^X sV%Qgts߫U?lv=R7:̭t.9y\Nu"~vm!}TgV諛f'Kk<^_]78Oס0+E=Ff^ůmɪ|uڹXwӨh/Ð o#_Hi%WhQgش9E.}ls=_t`ϖuaf:>ԗ!ÊTYHJq*2|2T (#Lrva0xHr_E U8.cr r?7*u쒤%Z q'>|,WU1&RL/˨d=Ewtu_)ǚBN}@ҬG:5\~STdx[\IAfaAIcfL1y2I_!r.yV:T-6K?΍K endstream endobj 309 0 obj << /Length1 1623 /Length2 9355 /Length3 0 /Length 10408 /Filter /FlateDecode >> stream xڍweT.VP ܥŋ[  mRHqw(ŭ{Kg}ν?Z<3|ϼk^K(c+aH 78@N]HO+ˏ̬ABxp W&/ BA{:Pq||"⼼~^^q<bPa`W\f9bg??6kv'0b AH{ (@n #+=, rr#잲s< H{p~ 9ngqӥ Ez` \`6`|@ ' x||+w"`5(ƍDr@0D~rA {Ń2}uj8#]]!]Ns?h CO[OދW{|Vlܜya7_{?6;0 +"<r|߇3`{ b qHߎF||5`p~oUxLyE^g6p/GNSCMSv=>@~1_/"w&-J ,~R)/%(ΥW0xxeGKkRtB`1@N_{ !A~\cY8}HV qUxm Hk?]A!0Y;'ߥ>Wf tB½Hw6`? !pW+,m xdA"xF"q8(/Go$v74_Pc/(?_" ?_>/x_}nq!q`kܙIDCypy p}_)+9ɋi񍈋%]G#r^GE3lV|.w]7T[ZL,`6v?juzHUCz 'H"j- 80 sBAF&nG0z+{cj숗ȣ}c:A.X|Cw*%;=Oq{=9ZX#IW-|T:ÆM# LVp+ZЗ3yS**bɣ!) `N7ӴqshkUWb Bf4_KTD ~۰BSfLFugK"o?樶%B泛K&E/9闅aA3 -ct>Aҭ뫀BOQT73η6u)'!$l9$)biŔ([x&%m"/[C'0 `äyIt o~1'i+Bl" -)56&psdKȧO jGG{Iᖡ]_R/CB}WC1I`Hdޮishj?"iGJ.`'PXTAQtnǷ6z=8pB23Fe^vLRÖ̏~{u,y.ap: 4wI!C )щ9T?GʲdkO!"+XHn2;g:LPF"BB(\ zeי:ZʒDpUeak-ojgðD^fҾ]8*rr[}>?1`gC-XF[x1@'6CɎ-Q"PV@YWUjE&a`ZĆKqUvuqkOc3JGjf z' II+ē^22+Z2Nϗ̒9o$eK6R[@:E<7#M+&jA5K+%qfj+T׋Gv.~< :.Lqi3M%_Ǥ ~ 7ܜ2 ms%lߐ7 yQDqu7,=dXN85Z:u>N9c*wvށ́LߺT1]Bf< pfky| ЩU+O.Gk_5͍D?oZ`™>mh~|{.e?6Ы"l|M &gC*($jYR(CZrYƁEq ǯ9E4j2Q0WPa6Z'Bpit]6~ζ;g0v2R܄Xt(_\dPʷ g,2iO@5ˏfғ 1Qؒ e0P)32}w¦T Ft>p2s>wX+-\`ԈPM_}-W`?bJK+~WD?БfJȲv0*)\~l4{ޫʺPƃ-SoA w7}?= ۯYJp*n۵V`Rzlo6*n7I{kB,-qԨGM' E45#$򕐻VLp "eI+j̗2$0i87]0]Y }n&*L"@{u {<ҖCqc2ճLf9a6bgoK2am'ɝ XCCv oDGjvWBi…x}z˘}N&SG4b, |J~8'۠k<;G%|:}9.fY"L|5txʜ!U6)`*;}LK'} ޝotϛ^[rg\'JIO c/NHj*W<3J~)-+zQu2j`~G{Gdmq("{2Ibw)! 9$QD'y9]DmA&,"#t62;[Õ$1 ]Qk<Aq 6#Ko+% %䶯HعYzG08co$ܐU[ O$zDgJ<ᘪzҷFg2׋N4Hp M GpТZnt_tk>]-=Y?W\IKYq>C.G86橫o<_i9}灝zJOONgf/$]µT^mv4m*y\fHoZp&i+[NF !V* 8 |䀰д>w|u%V\zL˱B[u*zPuH}IGPX8 v;wEº+}PLFmBQ]$Kwa?w/ko]>ʹN-v6dHcZm(qdW5:֢P-NJ=ύ"ay׋8=6Q$%w~s݃6zɋʯ*n2?T$I:_5⹶WvK/!'3,?ˁ\!bDոoڊ V NiEjJ% ߶կ?ZI^[xDx$ڐf+ŋGŖj60Qt.+h#AG? EQ\O<Ӹ J3@ .]5z`y q#k<ӭ|KEHln',G_nF '3ڟ>DeQ+axXaB&]_K቏W" 񖱢88_|٨yL[%_}o-VӼ0P nغC6;|VS տaWŧSIY8i;ed.]r2!nCh9Q;0!5NɪV]i]B)w)SmҒ}ތkhz-k˝У'\TM`E8;D U/R}QԘco'K5X>)q-n#"YҊXt%W?Bx%~t7I^HTCwDAC>GCy+N' DǺ]>M4ZOX /eqG䚺0 gp(R,DdPn*zaVp<7ڐavu3|z El̩~00M#"A['6c[|adVk~a+x]5̣ _&~Ւ'fq0bG-R7I17 8(j})ITE'(%>5VO?"L6</4.UoWlBFp`;~R?u;vxe_ۈuRtEVMmJSǮ08~{Yp+4z,.Ao euĔK_Ν i-zGFdHƗ((#BQ :eeTk:%Ęgn}13*q)4\ߣKMhYyO@ nNTdw9 yXI`T6 }}Gwq]i\Ӟeh;+J"uzR>Hn'ވ҄E^Z)x5lJ̜o󋁩tqcԲD4OfS>Vdcrb‰Bd(ɵ!F;RZI'|GFCJ&AYeY)N&lv䎱fK[0E6??ԅ׺wS|ɄeYW~FJoSj=9!#޺Sl V-Fダ< qorb+H{'^_)ɶ{>H$ߒt䉤ȘӰ 4y8^jhEQ^nЎH b.I5MT<0;PU5 q"s8fhq8XN NAXhT5s}ɾxJ6֛<3TJoޙ%;~ּQ~4>25 \Vg5J흹FsDSjhL|#T/LEQ%E;uؗ VI-#Y_n'a n^Dzj բSBsݖw+@4JI+b,\{#6n,VtI[-m5gdvZֳ+299yߒă% oL2ɲaVތ ~u1ҝ [f z$$B@ 8/R%v7ƌL٩6[@[fJK2$wP̶=QLS0t3ly+;-xQОK?W=\è0&.]AaNG_ؒNB_섷Y7 h>wvJ_K\jpcW0 a d6H"J ǚSSmB//rkxН˜ &^7ITOm6E[-3%΃(k?|9+fFU'3?'dn> !-"W&v6<=H^EW1{ssjZZi[Hq>xGIᵪ¤wT5KyjlIL% M"0+04%Lg7ϱEFkݢf&^r57RV=(w.n]tI# C͍PrlL7{БQ~ulgV:Bl桕5w>N'2ܮxC#AŤ&ZN:"Ջ) ((8uk*/Mg*˓ jw

}.%V.)SNgHx[%!jũD7ѭghdezv]/8G_⥖890 `Fh 9 %IW4 S&,{P)0u\eE^ )uvQF3j>6nD&p7>1IӕF|ݳMTPT3ng!#$L#ϛ5!ZS/9KӶ@'uM[ocC j>By{t&B*(R'Q]e{?&9h)"Ԝ{1|&Y,&P6&"\$uY=^gZdێMd]2Ĵj#Yn%Lɤ)@˴9(B~-9VK L9MVҴy}+ަw0L4,'G hu[?_$9z1zFt"|? cZY<"-諤FH skfdV(&Y뮵1O%,->{Ir,v;y00(BFw ϣqIlu;Gp8Y|PhR2.ίD*'`S.Hp" DT3d?EN+?NADmMy 8!2 :T q}yф[o]kFMJ1w0$UKdHD˕f8=a4~f`awuMnvif?z̏ NoF"(-uï RY#_ϽQ<[IޠmQJ'c^Mp%.ѹwR:#`J;cl;ځܓ.OO_Vv/ ZMGWuqpЈeG( mxӾ&C×OK]5u ~ƌ~u5 z-.][ʭ'tK5HtŞ-&R̆#N뜑!_Z)+~9g^Y$ \m.y c #k <* R3j@üB-9DMB .^U$ }DO5^FzK{Il8ҠNpyIL2q-ItVjZnl}BYH쬳Q~q)~N<rs?rcă֖~)D Zo@$H=9-%J _yd+D4l0vop&azmR;n%$k2aIeHl|m̤Q;N1D_؜cxaV>e34|UTlWЊYq"8~}QOlS}" zi3zqjB':] ^-4VT3kZqW@J4 pmhHz>X-q nf)^68()i=Z%S$RB+x KN0jZ~.^'%aEؙ_専8-CK1 endstream endobj 310 0 obj << /Length1 1706 /Length2 7981 /Length3 0 /Length 9054 /Filter /FlateDecode >> stream xڍT]Pb;cbanT$DnAA@S$}}~kݻf}?D%k (a. 7@^C ab҇"!q !nP8LnΦB9jaG ?($w(< n#8 $wq;  fEE9d] nP0! .w;A=8 A+* rq熻Kq. l rn u^ 7 C`w!0[nw:@YN3+]\A0(`uԹNfy ;_J:]sA]P=Lsẘ0[y pY ;wߗ{\Aav?۰p1A{@T~ܙpCA^Q>a!!1 v+4 wݵ A~pAO=w;3Afwx~zS-+QT0Q7_PN p aa>@i G*޻f"`=!l҄I`[漂/YB2U+RpvYpuq']h_W#z"@w w JPo6vC1 ~Κ3цC]\@^;ݽAd A[*p۟'(|pn%M-<08.p^Nwjq!;'El@_A$9A +9E*S' l uwu[ ƿ7espq/Dxo/K{EsxC83pxcmxj^\Ò6^q͸z\`&Ue.&tί)kzNsэfO{u4\2?86!?by!BGݫGٻtcfuWAyH8SM%gOts.%\L.wP=2A=%8'bʯp1>VYL?"H ~2㮔Kޗ& 4c+{pZ.aIlnY2hP~o[J87\C3Bn`󪋕x5E*)!5lDɣ}&SXSFkJ6uJ>6V0CsVGq2:DG!@ĩ+ЕB z3mlhV8G˾m,tRJ>Dy ̓no!tBӹ0_D5G3Y5%dPQ\tk;BwֻЊ}4uTȾvy_d[I? H ,9˅8e+,STeO0k}oWbֶŽ_<$_eW|oA?zao9mʅ  C{}9KwZFmj [uPgMϦѝ?.NqxIyEGϬILœ*+V#C{̺7~|As-,{nB45Oms (g_aTߐgSt?!M#[#8P[xluve5ӣ ZoEA5-[/ŷh{tR.udX\8ngX﫷+8}eGNnz,(.SD0F;ofO.]<1S8(;;df3&0W3kjA?!G ,>T$ ɩ lfjE ?N 7*›LM(-qWΏc1J>GVZmh;jլvX*^{Ro{T0 ut"2Kibʙw*69`dW{S-HzGv|y q'(!&Qu_Ul[ML)1og%5N4l(>l=bel"0k-SBae_Y)KGg Qz=:ǂ]Nc In}ˋ've2+iӫ17?q5j- I}BO?d@"3ermQ`C]֘WE*7]<_c"[=`oJwbOGa5L^x(%ew܃ SDi 1EFVZ:M-JfqȕRFFs(-YP3,ACk7ah<`Vdù@aoLM5,hn󯲦$MJ ]K%cH1qi+&ӥ2&07PO uDa~c/> /D<cLr`tlҔ`#?ӖlLT(i2NfG^qX"'ݳ.\(r5kbGf:'7Dl"/:-^$T@5/5mg?tH W^zzxU~w7plkjA%LÕ$2:J{aIjj!ޝTvR?}v8Xή݊W& na:7z#ng˶aٛkoڨP2clvy݃uѿGcE\{%$tB?V~ֻC; +ub("2r~`{ɝf9w{(rden sl-IzJbPf.v+h یHU>D{6Llp/-r7} I$R]]~}3}l m ɑQ Gn&$ otWyb w;qYL7y.z@H8>ܷ6z 0b"d{}fJ~B^F M:=o7ppdh˵9b+iiߌK$$?kWr*)$v2d- ) =L.b IEg:t9`Ƥs^ԹjX`)7q7i|MjvFj}"U}Ex̏K%:N!Ha_O)YH%ٻq ZsTuD(@_MPڸ`w@6^ rk[}ݜGr涀:\,WO2|;01Yi) f~;AiK?$n7)K12v&yJPiW .59ꉫƮVz?G=lw2FimޣOYLg(u"qI9jѪ&;JMci%.M+Cxu4)ICDfEZ5۴%AkIu3'=D/#E JI64Jz s}aQP"tzE5+TBg$`O?5mMMҧҵ.jzpU?=BeIsA_4S\ $l8,9=yϋ|4P+.|~bgp}(yaЀ!6#DMq˷Ŵ@h{ٷ'" 5F1ǙQ>Z8Q Ml [rj!c+K%wmsu{BO6J[NF- h.S٥CUǘ>z~=57úuw֊xFm6\ is7v7("ɷ蹰0[fچ;{bA?c2{ڍng{•ft&SHגzmGέc璪$0ZMoWgG#a߂f4F#"B/f m383[27cE݌(t  3<Qkm$wZ6{•o$mv|wG Z RLdPycDK$4-K&/Q3d*:N^$Br*$ H38XLa%Y5~l}vGv(bƩR-ZyԜ'sO edn!R6a2幙XZ=1ޚu&h vdynkIn&νZZ 5z܍*dKXٽhS%* %&TT="3em w(j{DJoUg@|t{kb\YTivo7,96i&؇N`=X6/?9HU7[fzȪKF%rdZ5/cnJMr41/_λ)ЦJ¬+"51կK;|M"< IQ~/fT X&S[V(9m|\ Yx./qK5Rڨd5z48\.XQ,ZG=7hr?YP`kO%K׽9؇uQȬ.\jcq)a)JqT(/n`9| \a`||\7c<.^F!V׵9ұE׳ z1) =(d^n iBHwr%^ ZMA:8K[iHJ|q5WN~N[VʿAw* N۾x([5>K]{1.SyO c6Xl$ F4d9}IE!\pqe¦H%_eV#D`/uZ$bm`w՝Brβ5FbT<5Wh}婰j;h,]ns%|Ka 5;Rtj&JD`.2ֿrvOg⯰W,0lzxZ(̞ 3.\P=Lp7Viz1*Z._[S\NlDN]^ yx_M5$4U\궷)ZxKGgQH#vo0UmM[Xxa@+{}RNPFH\\/{5|_G-* 1G#g|$[eo3=,n-MM嗖كup혍JHn͓VAb~S >R-;Q۹z>cYY"I[%reP֕Epqw_Fp+Gp y}ǘaRMv@PB-l!ղwz풔mkm9 3HDiCubĜIL^Lѥ$9!R5!PA|C:9h0 ɕKX \2bbc1ۅ&ZK&4$k5Wj kzǔM1|f*ɱwҨI^;J+~wEvgM/xd`ֽ6XG#]fum2vɱ쏅dC\XnZDZ[&B=;uHT#rE| tb)m'HHF m\`ܥg~-"V~Lkr:W `&$aK$"(Tp9bˉ3uloJ*f6@*KMeYg?= g$D61tޭpϬY2y4ٰZ]K=X Ƹ0oSoן M0s c8{|U^߬S^G5Y, $935҂|3Mƍ.X|M;ĶkvT4 萇 cf:v~?rJANxu\emP\3/Yb}#"f*[pW6ozrx]7]uߨ,lKVrH#U]K:k=ijAfءU7Te%1wh|؛ wBHї(Ѩ|,𘝞R=tmȭ= Z?1V~ηɂnW;adRkCSJ,D&,:=KӋE@4GI{uKe>[pT Xg霈<|)cLTq;w e={RL5ZȆҫ*9`2כme/u͐9}G9'n~-*u endstream endobj 168 0 obj << /Type /ObjStm /N 100 /First 877 /Length 2655 /Filter /FlateDecode >> stream xYkoF_16F`EP 4Ǯ&vR%ZVRT#Y"-9f@aSܹ9PZ^2pLZ{`*cZH5.Ncpw 9Z2ƅ+\ 3HMW1E0 twh@\A&L ASSA(QAͮzzJw홒#P)vNK=%S^^>GY%^V$} l>D8Fav@ou;u7 K!5?(? @ެE#Sdi4m*|9!%i"=&J^~;77gOa6}}>i7ϊzU%>/4#Z=!ْer+w[twOp.V%-dBD??v~"U:>ﴞ ){S*-M[_1K~E'ú+KYq /usWK=;HSfvBE4(qKLy*ZK7A4!uvQa`ESbi ӈQ_bT ed>A>Ȑ1d30oAu`*Gh5 UX@>!ܽDVUS,RMK&\x&**PH 4oA=*Gԩ2@] ԩf5$ؠ5ؔ\'WT8E**Ur fV*eVi('"5&T"jT#Q k L*hXSuyD5EtC`ϢzDuEܣѸe׼ܼ %f6l8Hg%ǣ7MtvZ`B |5Q]={>:WX9szswFtmYgېVgA_Ooo+TľZٲDCv@nWv>āh nr4z3N+_/B;aҋN[m"񫭍SFy[NV/1f!bt MMp$(B{i>K< V|(5?7A|we7- H H$ |J0g5@t͊D`@;$-IOTpgMVT?O y%C@_*2?E ">Zfm4hkVi! 1Ԁٷ18b!5YEBjC{)N/hc a͜0u՞7_'70ʬ,ZsK͸Lyq4Jʊ,h_}F< ~햫UQ#R\dH!uRѻGs˟Rc6g4@asY]: b[ج vX(UEa_+155u lT;U*/z1_>߲:9?A/NW>$\,z>ΆøŸe$? W\_@Z endstream endobj 311 0 obj << /Length1 1985 /Length2 14207 /Length3 0 /Length 15434 /Filter /FlateDecode >> stream xڍP\k \u݂'w;s^yjft?{(>*1ٛ% ,̼1f33#33+":lB C h ~߈ vY /@dP`)<@8yPXxx6@vc%- @{ j~K0؁͍֙B[T@'W௒ƶƈHP9Kfov3v6 S󛉋 &#Pr,/=0ݿrdg0J`w0=/1wI[ vftU#_n,ag&fok ;#8 hw92\4@.@sDd@0tM- [/{[@9;}_0&@ ob;o`' 3CdTd]/6V+3~A2v[뿇B_go Pt=ffӷ/1ߌ$]llS7x6.5P[Kkwf H332Kr͔A`SͿ- l ybf?-3~Ff_*c緕}aRovfm+'mM̀O7fx`nAsr q 3Ib0IAl&?$qEo> VSzj޲/y1\LXޢon7?dC@? omiK^o3V ?ol:X\غ-)?Oo9?r+?9s1v-mGY[]{K-!Ͽ}o hsޔ/ت>Vag,+D<_bp3Q-'{I\wI.EQǻk ^_IvE2EV-o}&7(U̫x o`Ct- ~8|>(":4x”+ciNwYp#A -ؖ/n+<4J9Iݶ΃r$bÀL!Se( 1.]d57f`}{@<#O^e2n!ɫɫ!ֹ(f@(\Ӆ) vSNVŁRMpr!řE[ⷪikqs圄~:+ Rd.lrcoN˘?73S]JfO\wxj!0~>/ ӇyC~vO̓};ˍ."pWZHOԄ-c3M`FhZ3ۏ8lo<ܞ6 `,m7-ٟel"g[."{p=OZ}KH/>S4j3R\!:4iOlw5 ;CMVə""^ > ?O b >x$s%И 4.Paai&זb{5Ք6tR +ꛂ7o/_ΈƝ2z,XHֻZԎphW8*`mX^SSKiހ >,c b>5ԬŞ bs*薸vL+z$yi GFOkqU0A–9Hۊx7U3W_W^Dh,TFjU>h9 A(%uB&pc "O CЦ͕&!JsK]Wob)k8O7-"1kkꔛ;2f-(1k]_S||gݗڛ-B̓4GwsJv}Ʉ> F?c{5`U2?YjNE1opJIdNE&9H(sNwǍ<"z7@ii&)I5OuMVէijPz4v8Bm5eaHCt=WehWu бfh(U&9W7)Qt1|#|$ۇ(MCrHqSৎk"$8a~{+▯…NF@a-,88(Vp3:$66|o6+2C(%#G"[^ TReețRqmU1n duq}QxS+81dy(u };*#Tb G_ܒ-L#xVx1^'~YHKɂa)u'VaX^ϳiz8XJ+%e,H.ESyCKr+{ Wh%jv)Pm[}^ַ}We5)H㽂Vy 6x?#3gwBpD"'7H6#)"CYC C)ئpT}?꠻xHzdsb1Ѥ*<@>$|}U:5p.~i>{Sc,C_NkPėe PA;qN0(EHL{-׀J),.FW)ޙmIu% hZ?Zm^=~#Z^3,]iF'W"ΊBUt8WG ~ZIyy m֩G ;X~Ղ'&U쟤8[}ݛ wʉ-~;;hdi˄5E@oItw3i)pG9ʪʿ{B*]Uʖ~n~th;kX#F37wF@[3*txeJ3 c-.^O;'l!@j\@.Q()c AVS ^Weِ3S[|93`c+?%wRaTJA!uMV+d&N]1!W64S'ԪfKS}}=Yr탳yrCAᢞ5}ݮ|:aYXee'#th_@{#6'35sbXueZ07ְAC"y$?PP1oV RlVLz^xrHDy1ZE:uCZ89#tȎ'XGIIXR a 06 Rry> '髂QaL$v&ȴ[](Ji6QkzRF&n 3ɩ. 40j3f϶.`H+^]Z^ bsVFEfw9Ky; YC:lM1ѷ_ n> ,LL &)I+֏L;^SYyqP[ERhG ygR{M8>'~ncN$1w[aߗKgh\Z UO8Cv'_9@:& w)V%eۚ~?Lr/*C~ {<3a c oZVY"}spMe(TY>a" uaϢP񝛇^3g">kV@޸Y N룍f=2A%ENnm2'Yxd 3^ujM]=Z5T74DTt{R>\:rS4EϨOD2[Ϯ1dQ4Hޟeཿ[=%K]4Ճ*7?8Hv|–0EGJ>(4:ND~xcqɲ M\0'ioO+lЖ"^Gh!KՆI>~ɐ'>uY4+u&b3& 66W̙ƾ{IbrzMBdUoSH7Vseh^ `1}蓧]5iGS OS'VZ;DIhT'ߗQfgR m"0I!ܧd綾C #-ɍʥ@ZOa}=.XeޛI6R~L2E,=Uǜ6cSfqrU2 Y ^_ap_5 .fZg'Tg Ҧ atO̷/JaVK[B!B{;0b uc<ēvj%DzѠmT;esHنD)w=;N2†@v3āܑR.ưiΤީ_Ჸ:+l=Ǒf!U:.ZˁkCuxI!5IOv멧iUo[uJ--w/NLu(],>پQR*xh&#o!a v $8la_F 3|]kT<6B&?n& {3ԚʣB_5CzAf?rUItF׭Gv RsUpœOo t٤r`5wX>6S[żb x MmjƝ5 *YoВI]1-G*ZjV *8Bه;PRx'(ܰ0f$"Y]oRo^k)N3*'ԂW9j-'ixcgV(wV:Mk{Ӽ:^czee |%vEya`tD\G9S5E^/TBk4۳&SKҤ#(%"V ~rg"(3VtJ!l$^|&dV'tR?~A5Zvax#ܲ}[åHEv>wY`-{nW@Lp"x)Z#qUI}/sc[KvP/,(f 'rߏu=ZDG8>jm N?H`5 ȴq?ʨżLxd ;Mz'j}4kCEoUl(8o)DD $1V{ |ڃa:o<>;qR2w;-!#+gQد*gwMr') t‚@F%1j</6#gSzxtX}EK/yvI4,_j -]9IdT;%Ndh+~5rkI q!inЧg> $hϾ>8RM^l@:~F+ 4xjWeݟTϔ־*?jUZA{u=X\/݌ P AeلL{P2Hn瑱9eε1.?șJD4#ߦ~d; ~Vl=`v1Άw@1wWm^;8ZZA8qSNyuĭ.>QXhp6Ӳ` >G!Ny'OouIAGjh3uMⳳҙғInRX~5RvH%kYMGƂJs#ff y̠X>Fg6| 19b_וAWё#M{}(TPi+?dT*_y1rf9nX8/LX4[t>dM};x0>MNTqsMeq>&QkyQ8T`kTE 1Pž!PUL3Թy 5'D5B mI\VtϦӡ\&4X*\mJS/:y|Og$Uv4)OE,6',*P rpƋ{bGӬwԐX>Y8= ^J'$|>~uX\Q4<#厊v\چ6THD͂C:6ՙ>[G,><:U^kV ٬$YI=)2#Ȝk?pmfm8amyk\tTw3zvNc}hj Qrw?-U>C:XF,S&phS-? 2_:].̀|[[N7Ǯߧ\#eqN\uԑjRprqasDHy툌Rpsh>͗;5f]_Ŭ}?Ȧ!AVbYnvEƷ(~ jwUݻ`L~wכ_L5Έ,p: ~4g Ypӄe/+b$ T[e,bZ!i} $qXIF g1o1pÕYSyPJըOv'=G [a.imYukK#~i[9QTrAU^G"5H4eO {}?NJ?k$c>!sj~nؗշ;d {u8j &0`L^`yL 9؝wGQNK.+^L?M\ʢ3*HiO+EMnIc.1&(ho;t`wBɶJ}Wy4"mb̯ZSԽ1aSh:x9͒ u!nh1K?NHu*T7  +gV5GSɎa?n-)zvwr.~ G=#L ;`:X/!7 X&uښ7Znvo4\XP7$ +ӢgZJUq|+m-R{@@kȃɏ =StEf^*Y0O(cֻUh.8L@R O[ 9`$ehhznP)y{ lϦqWOaM"d>_L:aoz ~k!?n4Sfn|ќ_p|2P>PnX)'5;(xRA|tm_E@(<2`QԂT!ϟG\#IR;M7clʎQ;Sx=D~0d=KH>ʑTóQ-Z!y "(l&[JuRRfR'l0||fRQ)ufiw) (DGK2b|(B8_몁nǤ{ze'ԊDAW VzdI0 t )Ƿw;yDLG IOCr_}>2vHjyj=JD&.%z1ĠV(NRҧM^Ӣ4;#V8 SHT^Eũ6(Ծ;R!2??%E[2C;/B:9PU<_m3B}|l}Ew:9ԃIXEFn*#ʹ/j~/6~ria(1gUe]>jl E2>"U#dG3ñNE] K;cuƤ Ɵ^($eMx}%S=r0Jŭ7Vî90FÛf0GKahrtX>8XsVF|7#}]D MUF;<KQWt,=޶-_ngKbE1+>>kS! f'&z{ՎnV6N314XE3#@ʥCio8H)\~_EG@;ܠ͐.?bgS[@H^> re3wA/CXNv8H۰DS6Xs}$&9ׁivzML(t3'hz4w5=ƱTE`_IΝ^rrK-Y|Rμs!PNr'Kqid8nxPS<{j+|x?hRqyQA3J9=(VAzΘkr)'t?WVR/K%Ss4_Snd;С>~JwX@*7p<'}4=u6ǾB+1>RDNoF7)pNz> + ĕrx/|'M#|~ELS(=sJ} a5p)q%Vԓ#!zD$ȶ081 ?_~/#;ݽ!+B`\"cH߭9H}%=j"7vļG'N,?j gj)o._[ԫP$%|N?6w~͞h3zlњ5\MԈt2@( 驕bG@:O-Y Dj8ib}הN%bh%-?vdle;..NC\yK̛9>N7H8 r*FÓNbmZǍ[CSvx)Gtm։TuS ŠK9vyG, \c"2=\ܾKˬd>I_o6OaȬ.*&a7C 7d& ĬۯYr%oYszA2g]6Y^ "֝U;[L +>gZMnH|"rDZTZ@q-/rt^]J;ә\eL4& HcۛU|tr 0/}Z AL!샬6je~=B..U х rL{P􃎙Ȧٗܜ@ь~7vP%J:FCxZzn7a!%mo/cCsI˘0\!)0r'Cf˞ *Rc C^jfSF3H_|7Oq2!vgMRNb$S'<zt%}ᘼYf[;V|[:Bb* EخS(>OddN*c2).b'}G27|xEZ^ wѧ+b(@# y#ΜJNɞlq8Ku&X{͂YGFJwQsnZ͎b]e iT-wF(S{YnQdF ĺo") Cbk/@Aq TCy`&ălkL_JMsƨbob G# P7ܑw;Vg^hg@nݍY_J r7#{ ^XZA)(v(w.%"텏pS!`s0 jb˭f@u~Rw]Ls3! 9J~x`̅ >qgMn&v},6U,B6L"n Sd $>2uȁqYlT+)kxBL R% "Z'2H[W,5ro @Ulүm&k!ń|DA@Gw3I i좄1hPfn)cx8 RIܸX..9tԎnI@.{ )ZO^?6H`(gLRW|Gcc{p;J;|{GjvhJT0%߻$Kg2Y=p6l#ͶDc',SQ}9<^~¥ pABq$3"%/<ޛz4I)OƞjȞ% _<ti|2e]gcյ/3%zK@1⹘אg̘L|mvZ`AYНX``!cT^5!Cy4ἧo&7K_`Q ]3 9|LS4/i}BIՉ`Wha{a__N _62LanĮ>}@VU8l .Ap1W&'"tևk̖)K: beh.R/Oz=ap. G˕7Eq5<|oXP*zChe3΍&'޿ΙJ0Hz ~^1 \l/$|/yIs_arw.sW VD;>ϲNR/<:x >XPgMdpHЫ>S!|iumHת5W )9P6*<+ /+d5޳T0hm"QKVIYbOO[&^ I=럓 sgb MX~t9 Ul +)&ku0Yx|F"Jw[DHzQrI44FJ{bo$L^_J'^, <xTPvKɽ,Z~NqUlq 2]`-ThhwOVu+ëkL!oVhy -;dZZ2Wb\He(*-(seuJy#:h?$/Hq7'%8!*VgyՎfϑX%oφ&U`% v. ŧ<+ə9m.rA=* KiV'd >8xp=,3#݇L 㔭ʹucDl-iufZ8sn"̨)ĄRʺZةωSUV3[ГߓFr6Fv)P YJY&-BK2 ?څ`Q͏0 LhV@#o. gEXgOcD7ZR*%zRwt)v7?@D"E"f uN{I/ĂyqkV&١/:')w`W*@ad8Vٽo O endstream endobj 313 0 obj << /Length1 1400 /Length2 6287 /Length3 0 /Length 7242 /Filter /FlateDecode >> stream xڍtTo7(݌ A4m hA)SAj4!!(HJ(%H <9W_}}>7/* ea1<@ ֖"@8/1&5=(rPG!NQH @L &-/&#ā@9 tPH:pp d~T]h!G+"0BAp?R+:b0n"WAI@8 p50@ 3/GoxCpNႀ‘O$ u?κ &"t%B CP@:.p=# a!.(\< p~wT ܀n˯Eݲ&ru#1d@Pܵ٬3+#0_Cp(4 TvZ-6xe?\\x5 Osf%(;k.4+vSs?:z_caЦ]cwI'\TMxf)j%><}Ha}FTj{foҖdt:^ՔfҳʙbפrW]B>F[EepU8#K<0̢kAv)ڿ_ Gpo¬ʢ%_ɥf嘊R'&My:5\ڕ-y<ƴ7q{.%~gs;hSB0xC[+12Q]~o, Qw`__ǿizWAZ@eȐxF;* \Md;R;8{!a]&:WOKv!YWuZc^?ܻųYA|qͩW'mBg ބj KQ-2ǟ>޺~O~|Bb,ߠfG+aKLr]26x>{RϘfw{0\+ Odo]JR!OtPɴ<6gEf/A缵Z*tEćZr<9N&Jۋm=6_[g=wnR{D#2/Ƥ: /\y{S<~6mwҩ.bn͝ N\J|w ub_ne2Uxj=v`8 ˩-p6]nʔp]t[( Z\)О2૰LfN[)u]QXoډQO1Uw| ,vދ(<靎/ɏl& U;ħܕ$ %P8cC9yjzíis#Bmh>5|Z)b-qMe6WjUI><TfVzʮOޞPS"iV&HN456rW:x1A'5eKJed\jq\Fh vFGTbJdrp8dyP`{-ɄmfI]jIj`Ӱ@>I)+<鯆kJ#f6\]&1sB_,䐨Em213}[㱨rHB13vgCwDk_b`Ii[4)#_#G?x#GE.؝r& F}ӭwT-}=Ӿ)7x\z|Km gιޟQSUN\ w@Z^ 'SBw6|ốEcMUw2 }1%;NOىMHrf5!| ]2FʣPHč9gBCѹYu8#[ ) X I Ot'C_Ϩx?AfO|@۳Ύm4&΅ y=4řf#W1 9gYQW5ۊXOg7:c 2LXx NLgR]j+0`o IlqBO}L R*^Rv}gseDu+o&r"uϢoLl >\bz#/8{ tt.5oy]6Ho"6aĀsU Ep=1{؏+m]mҏ_>J|||ll'*$SPI*1 ٠WON3qm <>Ljxt5#{ ؔzR^7mi9qt{r6:O,o۝&o+xj%yۗI0Tmm}-~&SbK{B]dӋ~tLfEjߛ_ݐ컝|NS= =䙧<*h#U s6M۔(Z8Wң8:d"#'E...M?F ?x֬xBS!E%<[W`h<@R=V$Hx <83/z=>O8͈2oto EAݛ!y\̙>>G) Y7wx;#(б K%Z#l6Č1=psj(O<7ХZ!he(L_Dn%k*鶭ھM@:`Q5aY׹wߛAdZB{V6]eL uN%BGص2>m]Q\2y'7=]{'O$8pc5v`,(^;6 (?LfOp\hg ȇȺ?M]upUhYVGx`DԂ2%Rx~n3 Le9vXRgc 6STNmpdR1 uu{ΐe֏8U*؛);0D@ycV1}s[%yʖ:QznyKGm\eRLN?n~4 {jy\ +ksBЗ>d)Ӆ;u̕ǂu7 A O2n( ,P 3t6:a#Ljq͎tuѮ mF#D55lSz/6\xv׻ծTQuKeb "bMԖ\$͎(L `T+!cnQ.:kz:+EIQ"un+!rTXPPx5So}玅\m=+alf߬KZ^ F4700?S?N(%,M]%VTax:M#jć]glYshɋ/5&CQ4aW3 i&pQxTj4J>>cRr6/g:vXfS5Xx˰R#!lhF[O"_(I,;- |Q |7^gxK#`R &^w?&c!9d:~cgFgo!o>ZOIPm'4(-}ZlnJ +lY;w0-96lV{^^z]ȑ&wLc EFSWvIUR}b*wASoa |~iɴGx.VQo hdu*vϘޱm,n#"DmdUN },G6 ꞴJ\>*t k}7/n趦*7{AX  %Wk{^Evs/Z)h6ҙ]pY奫y1Y2S${^D&I@,iT)/A'eSVLApv5m{BDRDǴ.r>! B[Vngʎ>Za#<@x}vEVUwq*Õ㮐-R;>mt+ I6ҫN zjPoypj^iH7R `p[x[cӐZ.TR4Z]ophjeZG/ɴz!WyG!Iͷ[4vq7Ep)FU Gus\ FVW<44[6_bCC__T֣zC;ypۻ+C28c|_Mfow]x\Z%hfY1-4x]^&V\@k)[(t'p=zn|Wsm{,]4xg͹cq2yϼ?, Ma \f٧as+^l~ jICt ;%+c - S|IJǿ?' endstream endobj 314 0 obj << /Length1 1627 /Length2 9212 /Length3 0 /Length 10282 /Filter /FlateDecode >> stream xڍT.Lxq()ݵK$@kqw+ Pܥŋ(љ3sZ|gs}@R]j B@.a AˌvC! q6Y1N (;< 0P@ %@0@ao P(C!` f)gPΏ;ZP+{0(EpaNNOOO3f+ iha`75wu380:v?P' x48[! w5 9@[Ig௳9G2 xCl6N`* A`| dG &_]09<Z a듵w[=77zB|6kMXpB]J<0ق>.AAM m~yloo~<;ߎF@ C0a4mďf0zQ^P?/<퓖z|ٹy|\ x\7K_ep(S_ `k:^L([0pqY=~GTɻ;9fq흼 xT;qԠsP}Sww_8 RG5y9x/VvjOYs_Ba,.={.q\o ~Cb=x|8`? @)Ǟ6P7/m  AH7zYYgߖ߽qZ >2GrB.NG*ߐqfGrc:H+w7ǓCs{0ADBCۮ=ٷ>"e^p.1CM%k,Tʛ9tK^̟n6P7z^SR[&=\e}/e\ufFFZ.k":9ʜCg$0`DJ;!ʈC[FHp8fhGb(K#>$Q#d-^Ld)6~h~Ebij+,Դg _)+K<$}Q2:((K[K'$d9?y^&O&@;L :K sKU)&8_ L+0< n08QDe#MYC ܔ]/%㪸2 .UIK2Yg|uCZ«]Q|\S{jZϞL_X]D烩Ӧ ֧4UݰTJbI\"D#8Hj 2WZ_.=^渍{1c7B/tvu sUw^qEs cPlGP9U&^wI;\ھ .SgGOMǎ$ck.o#y9zyA`K*!fR!wy>]m9j͓t1a5MU+fO2]P;4i\E}+uE:i.9O7^$ s=1V|ONo&ǔ&tERELnP|#\D+Ot6-w!-X<?>p{te4K-EF*T4kMH:psiFevx.~{X}Ux;~ǽG*Y(X)qF{% :>FZZ.7߿`Zkh]WDz=2wp0CRԯ {a礰fp=YqҘKfZ8DRӄN\8wq$lIjf8%rQˑMϫss p 9QnR<3YاaNݼNZ78^\JLvqXC4n$S ;Ac!{&NysV,`R*?t' &ȡ]zs'灠{fYVĜD#|tO1ǜ6ao Xt#WGmq e}6uhүZ.d>{yDv0M꛳3OkG۫ T7rnT;7#ES98#:z;β淽jOmg.r35w*w99hI߄6zaPD;[]``@ 0wQ.)VaЩ'b>b?u7ㆰaS >|ۄ/`$4'\o2m|VmA(-&M_CF8K5Tv$[` ;Ց.Moߍ*p6Ji~!th}$"8]2NDsS?:ݼ8څXu^U?T([G%{o* W80Db@g"+Ai ]!sh&e'ҮZ4g"I8or.$sҒ5`uΗ-Y\rqP>TNoTCZ kcz|~# mE1|n\ZBŖ7_u1rz;{!g]»7tBD$Y9 X'mq;CwzP`͍z[q>xǵ6e0R5 FQLyxܝg'[CjdFe?JmFoC%w$dosI%İӚ7[1.43o7Si oskvcͼ*#Ō݃P!jG煍3tx%x$ue\%bw7d8n %!d'z&ķ\ :<ȎhCS`-bb睒eXnd ]B{a/pF_ KVC^ӖтUcb;Cm$$N2oAޔܻg5lDŽޔ y_6@D:|JvH̫&m4uEhyeum^V}ŦXQA85\WTڃV\k EE"_.S/`MLFR^ ÞFs{ 4F:uN9J1L,,ɳ)#nPXZYۇMrᷗ3|g= 3Mml '!pKmbh'ٚԩ\ZK\i {DS}~vE(yMfͩO?TYXH̄ ՟m oo?J>Y&xȣP^*BwubhޙЕ$O>-ўN}%?7#~FFRө";@wx՟ =G 1qD9A.߁)Li@[jSj ٫:OLnݜTY`*0nRNY0ScMA [^+?2e6-8 |mtGfZQV#=gT$zVL&{Hd :KP=Lҙ'1n>=)o,#Պ])ilC(}>\DQE(" vZ= 24)ܝ(Q*M|'vN;-Npٕx81U5yT;٦N#$,yi/>ſtQ6.ٺy[ ֭ |5v0k-3g^fzgvՄ0ȦᏔ|QV#A0fy0D|jJ෫_o)=Dm/.q Nj_r+T0.f ),#I1,:/ҹ.pzZ$ CfK~ѻ!!OpqYf+9qh;hwӎJ T5Φt}s%vnVQ]w!WAm~)';th䞥.Fbb]`=}]QCb38g}É;T̳p[*^X|Sϫ Tac}Jw(2;})NJEOrCgM) WzuR2rwOI"[)K>X1~]J+@4$|kV.az{#S^Jل7O٤ԨlRܥ ںIJėNm}Q 2ER&;}^V1qY:';p>1p|1&r񌹼=pݤ\ wi?adU,u]y@JzǮ^[ìdCsCmNNɚE\: E#GzǧBO𾻠>,&^vi,N=OE99{%G}@AnUtۉһL0E[ތr dq3o]9$XpyR֫{MՈ.|7{?wl"@OW~ʝDAf 9B8s#?-A`JØz5Xܔz'넱;i8jyI P0]a Tv :''k?&9C4k=)!QaJmOA\u)_6"`wj|ê s>S27 9D'CZ-x޹UOR^lfNcs ̼.^w0ژr'Ϗ˃ Wa.kbWL,A08qZ]ůlV^Yggɒxvl+0WmpykNKH"*iL&^0f]Qi/Ģ?VͰJe!ȋE2={>I^ef[et͟5I]O [I]ȜhT##>@md"w|L )NT1I20fOH6VBWT="\9jDR!ߟ!Vm$7 NIVC&p\'I[^[o=JN.'ә)YԈ7_RTTx{ֱ=ky "޼iB5 XHN%sy˽{۷NG䒐i kL>~Sz55 Vmن$vrReVCB<&ۣ#6,l]vU)wijKT!RZ6'%*5+% `<9B8z]EmxE9!qs<޽^+0&&MS1ĒKD1pR͚tL8!v.)[fP?#!_=?Fd OH27Jj԰^ȩ&\cdn~ݚ p> xi5 ,UP-NG)*vr1w=:)ߌY"w(OزԮ I-X$3+Ŭ2:(#P(pCzTw+"4vUIc5zI姳dqJ)w endstream endobj 315 0 obj << /Length1 2778 /Length2 24326 /Length3 0 /Length 25891 /Filter /FlateDecode >> stream xڌP\ "-h]74ONpwv; {ֵ&'VT67۹330D唙LL LL,䪖.6ՁNΖv<:\@21#@ `aab01qމ ffi cHE<,-\@i@eB `;@dibd3rڂ2TM,.Łݝ֙\nbP:܀?lTOPtGbon6&@;g) JP(81ǀY`fi(2xL8ۃ܌,mAbnV wy&N. Ζ6Jdv@;g?,&{23Yk;{w;3K;S?E:0Y:ḿ.v&&&NnV0`^/%1_o{ pqrz_ 04q-ߢ@0hN&1hLl<5_F-EYui*NDMgag0Y2N hdoJٙa j{}Ԁ%oZ muؙL@W_.6O%]mlGmdkioҺ@tvTM-]mVtv6mTmGl,퀊Ζ+zhtZ&֠G3h%.S~37sb,#''#OxАA ESǿ`gr;(;Q`yCF7`{CƏELF7 `/$lm,F7 `zClF7"'@dC r Ec`T1IXXA{7"@dUzUb@Z k!_"n;7| 42% FTHj@^&o\Lm@ CGgC߲0șZΠoAkѼd#g^qt[P /Z ;Ƃ-8s{W o@te T_ _j:ȀG *M zzo ;oCe5yۤ WY)?B{ee{SojVkWgͅ7. 'g.*_aq|[n6POm^8ffPoiAo&F '_{ ꣋_AH f#/ (Tt7qu__4_7 nw&H^tjs}@It#<~e#յѳqSLXsRˣϓAn $VDpmzU=gG@k&io\Ȋw}%ˣsJ{2O%?բtϐg@Ҡ]x\L}x%=f-`Z-Seq%!F9Hƞ.*X_h+ De=KFr]COb;ηd@0%~?NbuqfeA$K55LdFˇ%$-.:ա~/wC ]?3|ЉXY U2ѩxOeV>6T3o>b|/7fPm^8_;\\Z~4 9g-RX?TxQ VI$žkMJgwb(B=wÙzZK{I$A}HPH/Mi>桽E{P̦*gpv倯 i‘۳=pƤ"nĶ (cOt%Rbr}2|a>z b=UBXXj3߯Ɛg-C 5zWQ%9M<2MmSiOA<~ObѸ.\:c~28N C`D_L&[@:m%@_[qRʯ۩N.&v7đD@)~ze%\R6, vNv:j(O&`|5)Y?TRnL #KT2@-ֈJIQxsBqTÓOLvI'^E2#ϛ'źR '| W0e/6핯~!smb[zal}}UUg17(+.E>6Y+~;I%$^F_'WCt5Q0(t:IiO¹?Bru=667b [ܪ'=H5'botdž"`qeF)X͓+nGq\Xzq\ҾpФ"u#Nrw $aPLn^u),ގhzޖJT^W1#|IfnB@ŃˑXg6:cԠPSb.{{ہ!L͵M=u@A846O=32B)l'Υ58RQ0ʥ;E1tUe] esԓCݜ9RdʲbDȶWAc6'vŘi107'q='˦\#K0,_ ;zhpm oH'i&8t l$X*X0}jW*6Վ mH;rߪn\`s%`$$M6A~^Ձ-{mC)/%[P໯NnEep.4&b 2ƃ*asI+My᪍aT}.e&)F0v^- ,Wb:PW]i FFBP`Pްk*# : 1ʯ˿!D" #~c߮cCec^ѕd4bBR^ZN|w\4- xUc+h4Hn^P #4O1p2\Ҟm/<\ ^{ M۷TdJu:7,1q6se`b]y]:EG廃eRAh|B_g2LF-rQ^S!".IkH*oӼyG36T QW/eݏ iZ# sЃK ; %bD?Zl c*%+nMĵL*rshG;sSn"8-i' :O_$5 A!fhPx!Ͱh׸(p(~EG[e,4,R JUJ)YT}/15ȓ3 U!WoጭUN;q*xԺC?rV/|@,] S| ?.1%bZ&sE2^\[IhEjqÅ!?\7 dv  F㩎wYp: oūMI]R;Sv;NzgFȳT=0]t*%yɸ80(l=+-q#܆o4"e{E El:=j ke԰}|wqRR_hѷCftv,F!`dgNI Zr>ʨT~y+,âև_B vN) ~حv"+o2dlHS9Oij=>74jG#̓[ KG*H=ߒntA [!'[)AY dO Vy&h9%XnTV@&ozhc^'Gu tp~Njِ°R۳F5nSbwR.sq}ckHìmr.W2˔իdWx3_Z.O?U٬d5rvo{<Bz* /Xe<᛿zC2$ucN:&q6FD=UThobH'aOXnK M=[7*3g\?Q 2Qlw.x>p&b"j]ω֖pe7Ȁ_d.|DqaAxوݺ`\\nn(&MgVbmAFP't.woIB憗:}ݎpu-TKײ՝˶hZN ĮoxbL a W.%qt[F%C[:3]_aUqepQ{Ue4v͇(lAxD;yJymz.DӤǂ,Kl ]m;νE+Lg|w"/؉?nz'sn%._1s"p)Br<яyx]P'F9^{FhVUCBy}({?`vœcRh+m""Ne(!e uE݆)gC%n#-Oi0瞕7Bh[ׂIzM]Ĺ։JA|\m,)xi4yedc+L͘Ltd^!$$Lr P_IeC4 sz*1< w- x`W9:HX{AMeN%-JPVH?iK;Z`іSsv8jTTP?.T~ye~/6Aysrs/m.!;GGY&񒿡XXn"^+XE@nAHOpG5\u>woq.&=Yw껨S v3Dj^B//Tt4xd}[DH=d>SW\G`:lZ4U`[8 d:#7 %@Jpn(MA</}B>֩Gڶ~f=PA`Ǎө5mXH|]",pert=n<՟!Y9U;*M'CwY2 \Ƨ֥ݧeAjSvлZlZ}b>Xe2@;t5fDTv>o}%CBΧԴiI}8zR7@4mZ>Lf`yDd8m5ˡwůh}^ЪT =V>YCOxˁ>^ BŊh/\H #Ԟ mFN#zz\Rx O#oL `;/?[1;[-x6H*mЍ"[`R f xX>"|2|dN$,S%1P %샤yY Rt ~궐Uc>R"F[TC*v-h[[}!˗3}Q- #,햗dT[=ۅdr:QxdF"G8\8G 7s"~FJVMuMGŘ2dWQhpN)=^&ȋf@˲x5t;߂V'5rYA""7 ɫU ݃S3?u~VؼVW9-m{&돠_ |{mQms+v66<Vti-5M,}E|T\-Er e`Mn*~ڍ~+ ?s_|Gʁ%v3߻&Bd%wB4 BVvPuF-+K͍dGGV쐨.lT^vTgc8+y*y.\3c_dHbC= m3ᦘ_y_z5D%!#ouP(h"C ޙ'q E9-gLjDBێ Ð}aaDn#V;%`(+^^EJc4tL)+EiqO䓞B]Aey+R4ӖRx'sBt\22.d?طIIױiHG&c p,W6n=u}OɶPjvÛx̜,r 0?kA8ܽs\ϤIIzm_Fw?L;=~U:wB25E.if}'i4k]{n~0XK~WSZfO#r3|Y~;(D |06^_BTة]v%vAQ0Ido0uK;r_`ݷVTL z9,9}I4wפP.gT5͐̓r{2ޟRӓB]6E~\k aKC<"Khzy2NmLyq[+>ybE͎`MvOذmPH榱ץ$Te@>u}LxϏ&LO#ך`9Y>82csL= XC [p[R Ut#;/D 1zc(/–.Ȝ mO,1CFra)[;!@o郵]?:Lm-4}~p#O4| D,Z3\=gGeplo:a$ SůRqȳ93Q LrW:xy[(Q#:a0 ?xDB $V1`[M~֯7aQL~gF e ;ՀRep Cy8}H“Bu~y`nU㑎uXӦ{8/ j|PXOIlS2/*pNnBw\΃5V;`BYC{TAB/u].=ˌh]l¿Ն^ ޕP]R%{ԗ=."<'ښAZސ^nޢai'ȩ g^K:E ҫӿfCySq;Ō[E(vdu!&3M*M4[W6WH)C=~E$ th%۳]_(7ݲ +| {A(ҧ[2ol*eD6h$ZEu.zWO8gʯضzP7sccuRDi[&Y a8ue,%La~̚}R*/GpWE-g( tPNf8dϐ_r9>oZ 2sT6ý/} C\Ga$,WPjvH;nGޡ%JIiïwDO*s?AcͫY'(7E̤K:z`))/wj͹iH` $?"LC\[{>2Fmʛ0!M,B7P%} 9ΰ 9}Uor!WHk;4vWRm\yz ]!&bo.HC(I;AKMlưL҄QhqOgtϊE| Bq!rj+Q 9{^Qi[*ٜ҅ _PJ& *J~ 'I'V*~P?k,ACC zGJ5^+LG3o=[0&Qն,eBSBwjdzO.vf6BfJ+{3%}=|Yͬqt<:FK>F >[U~nFWS[K̊JUs/Գ=~N_B{ H|h_8onޫ1ԏ`>Rۓڛ[9EG*aMZ-]V[>Ũrō!Ɉw}fxoY7:c>Kh/^LpCdTxz^rDxN͊%{Oǩg63{Mo^E}NevI;͐D/bgH[[ 'ES˔F7®bCyxEx %/ -~b>RWx.6 %k*\[:BGnbOSE,LC q/_NpCUdh9xr6MzyfN1 G]!:{K*U[E;8pEvH<]K2e{~m矛x$}ttKNw$U]&9SCX6`oUNBzdf+IPVQ=UՠRlPl2-8]ɠ@z6WwQ{.4ڻG4=eÃ&Dq{eўe:#A?X*ɳĴ.Ѻ oBSO_Usbq7/bh=XHSM#\cg*Tt|=I-*VI_d+8%?qO֏a K.QlOe OM!z'T@O04r*揱<\y;GZ쵸Ki8$-10Nr'xhC;aQm-MXK {%LõFܥ +Úrq/#ΧҵRbRhp.b?1$c!z2|@lGY_3PAk)en\\sðq=j+QIXZ=-,JU , f_= vzظ0aY>ma1X,ך9scb_+am:(@c\T`(#IޓUF*O TXA^>"4[a +zaÅ}0a޻Qqa̕^X~C5Ha0GE=fqVbrZoa_?193V/4oБ?DpD,tk؂Y\`Vǫ)bd3u鼄:ib_8Ak([+#k{|9SIEKTŸ43*S4樃*0dJd٭'@jD;acWp uHg Y!IY;X W͓ڔT~7}g=,F}fQ;`?RQtF㹗j+BHoy_qEZt". NAzP'7FR,rNy.C +0 $01mCp|O]ݜ?$&$aR]:x}-[g>ʈYmrZF*kɭ؃r~R?Oպg((숯ː:%V9MzZWy( KAweGÊo9eAo_'E(C% [5y *UڦZ":uS;08_Iۤy$wF3dž-mၝ=lOWeDA HP]XvK7vB|~NM7<M߫] =Иxq닋7~kcCňnħNR^y,Ny]xbi.>}FT=^v)'Lj 09$/2APqE9{ՍZOZ?K6GvuY+eȎ3+Zc:zP E a m|$q/_2,R7SQH0fcraDY؍ծӰ>kM‹Q+ >j_r}Ҏǻ<@nqR-)>opEt"}4='vd@ Obe;.jGvFL0r{yAf8;y O±Tfa3$6EΉiɹ|<" 0j8s\5slQ. Ꮇih%ȂsweaV0Fas:l+kB%3axN/v`Cfr62!v'Im|u\/(KwZw4AF`\p`prZDjcPMPd׵ $K.m≓k} 9YR$$e^x' e"k ƅ >ӣ]傮 ,iKGO[Z!v&2-+C^"ЬW"*,d!bn͔K lw\;<^2&ez> p@,GyO'`Ń[)aQV7A߫U U OĹA'"ת.rS_RV'ii-ѻl1Mi#s; q/UpP(JDZ[/,cM`$(ɅM|2SZR1+w;BxE)]5 qǥMde}eޅ&4#Xq͚ f{;L)6^ؑdaSޞsA>w링!"3^ѳCC|EM Ffv"EW%qK~ز=ݖyl14Pm|•p4M$+ ִ5[a?}81i&%N4a%PWxVs gܝkJK=w4PK3r:.Xワ}2$jCx0 \oևacUI]2+Ze۸56zP]G\3X`i&ʊcON\oAV֬G)kޝ6䨭c0*!"i=?#o0z>&v""lcT_ `rZO F/BnwYECѯ |zSUǤDe'Y)REhBy Y =fP} 6`|EyIE `㼉 80 :v[6W/^MpQP+Gg*xHB(G,ν5/?x>L( 9R3Jy/2 ۠q8fঌ@HǺI|rYM]sy1<%K IobUՈ~QͿ^drת|· .淚^Gi{:=#Gi1 b4%*y +pK}g^;j.:{!u=A <m5+`{s_YKуMG77a;w߸sض2z|i|~2 imɊ3RD3% ehV+oUu?P_-:9RY^7wc}Nl[$Ǡ UDi^,r{b5""=-=kS0.N?l|( @2z-GЭs}uZ}tqv+~=/V햎zsQY[+д=)POE9w ơґJ(~(Di;@`C%0gLQf<4ֻNj R\Y/ sN^Ms::boU~2[I6ƝKV<"⭸@ W5Z T-FUU%ap(A\q v- #18N;;0gNw00#X3S=s`H!ׄaw}Z.k %A&ԉ]a7T\Eޢ?y: g|E8kjґ,|n7ѥqˣAWT*SR6#c P%?+cϖ03oN;: 6\p]ko'b =>k8{сQE2"팵sюV i[Z۶q Ky5D4^΢*_3M5ǝh374u<ҍV`4{}%6lVclV3YiB}iLU ZmMVѮׁHPw^3Т:-_] 07(hh=+)T) dw19_2$eBFM&@PbmWg7$ o:=.jHY&CuL V?BfhYȩo!'~K^iKD J"Y"rO20k> 9U$+-?y 07b9c/7nXz<;n'eoc5 ,c\aNPC\+1re&K.)udiT*M֜'[hRZBKQuf.{ꉒ̀:zL6.Q܌ *9y_c GYZWjO x\ZM 6Hz{R?k-7]Co{iCuD|YL .Sv`n f SY)ʖ%s-&s:xIT'Znkhh?%bysZRi̾cz":kvUĀ?-cOdmאl5l#Ub^v ~Oa/y|NkךQ|2}Ð 2 YՏj/1MLT3 E*-Z;0+(p Uȋ'~5[|gp$a'f;.fm/5>/RʖHqɯV f}B̡$C\6h'%ݣ<9%[؏1G#1e8(y[A3_ KWeגn=>\o̕>̴̜N4ҼSxI$s,jP.@ql3fuBZMQ? ֟P=j $\IIa"6vd0El;;gk1;`_^W-9_E+DXl5] Ȇ5Zd?\&H_9{0qܺJ[ĭy3I ?G,l~3SiУq442d?BA^sW. ~I/N9t:@@=SS3|.8*տ Y;K+1wfkD@źW)0vnʾ/R;Eb<«y䈑3`W?]ҋh8Tv!^ /^t]j˒~Qb#Pmsݒ E,1b 3SxRv1d U8=.hQ_<PO 27\,?AO ӑ["/X#1Ã~. /+bQ,I9 m< K⇛Dz v E3?44)\a$s= iQá/x )#J[â Ќ%Į^q%}2a]Նkg ̾fRZx0а(yl.yYXilcxYk&!y2A/&)"ʓnH@5o:`B$-M-"b$vLQ^uZ4) A}Ai̊aT5D/DK8IM~C E/O|ML"#5p4EEEUjؘ.T\÷nD3LsR`l5v6Պ8 4a((f$3#e@J6.O`ߙz:,aX.EPۡrmk_]OGQk/G=>7ԥGwt0Dq@wzz0/|I?ZߕRȷ8\ўn*{xNNvz>5zTUy8>Lp5.Sj@ءn؀}3pg9*~6@3puXljQjhb)OF kH]dhj9tjn7#RW<=WkNVԖᾨ;wNUbypW8aah]A8ԟ6VBE\Y,u H7T}߶~PofU%!&4I^R{C="z;td^kF)$O,]%Ϝ0KVZHvQ ,qE'îǝ"NjgCֵ13XsHWN &t9*.0¦͍o&_ q8SӒA'}yȯwlZ~{˓bc62H 62kJCp͋lz&J޹7Ul6]47@]nWamŘ;6{6 Wٟ)D߳yܦho[2 л0DɈw4b=[ 8dx輘$q%o9 (#\K$8$*lisXih# !q\gk̢<Ԝu}2!e|4_qG adN#F _l4a[wҙΐ+Dž S KneB)C=KCҡ( {2-Ճ8=]${î"#c)F 1CͪrȚ`%2 >lvA;'R8b;:ι\Ds%>H 3dqC=1UL冾力jAG$fK쒫And=o+;=[>|TNNQ qfbP!Ԩ@m󞠔U%mY,XrL'aJWP&K썡h=6KmߵVzeW"¸dGd;Ag+ǒKuS:tӊC,l38wZ5D])g'nC$o WyoCNI15A|4Z^ Hv=E [~@-C<_Já qFwx`8ݕ ( HN_b_A X_wĆSݫC=rEؘbH#N B&o'Alkǡi{2bЗ/Ԩ=4 -d)@~'%HIU{Uiݝ=n,Lw071jALB|a1UvˑGdA~>X\R!oo@8/ '^b>KG&_T99>N8T*RjQ@jS ~Sgk-A7D뻷#E͜_&uZX1Gm1N_VH?|U0:b-{Zԩfyqs}Պm2šu MW;f/vHDSl?ĥ.B66YXf ؗ%/_b\8&ʢ{.!s w(1a%(`fϸ65l֑;?1y}_D/X)x}ݹR?hW׊wYؿog݃ )2k]7¹< 0:iO}Q1 (b$@34FzT(&ty8|c !Yމvðm Ձn&,³kqpOVГ`Mz ҈QG(zmwtܰ$uV7 ;[;dK o|/ɽW[s`obY>\LNjP\գJ.Ks-xˑYn/t2mZ:^Մ ML$ @יUY R0ܹP^9?pcyWY|]#J$i27%Jr*ucv5 man3#}Xlwh Ȇ:QT7ʐ5\:x{PSz'J Qt 798nwNbd4)|ZHĩCz C%zZsfɥGI*EBd= 5w[p>f=Sc)LߟFsoIܨ`,S6'bJ04E!'/|([seЅ 4媐*D,BoʔtեmHD"b@$Va0VƘ|׾DAn?dI.{΅ TL(%=ER) qƝH-D$MZ7GQ <ڊU?/>QGCN@"Jl^1ɦRq}Qھ]mt}Slj>*Db;[Y,.aw=!-Ht.Lag˙!sطo@Bl%A"=1S;5&0ۛ."2A#oOпDBvirXPew*7@%Ԏin>1ۙ>-LgC,g9+5 ]k1 3[4QcHOǽ(%c go'I76tJ$8@S%0iCNy$]QAy$|8Nb(`[l:< J퐋9/L  ֕7 KBԟ~(2cq6˻H|8ӶC`T\V'$a8 Idi"N :8P An]ggIՍ,|3K!4LȌ=LLzٌKc,Ư8gZHk'w*Un>'_%gcz+&mQ^!*FSgc\1]yzmj3<{:cw 4Qd&S?F!.? SA [OdxK>N_yDГťAZiBi6쐎*}y"k4`w=>?`鹿j2?AQ+#l ڃ4|zzfeY gMfܕ9ȘMoJIC+FvG~U*tvU"z'cJxjjT}Ӛma"$S F'e(2/\j(42DV[;-& d8< ̽x`"õ%:?ʅ]4DI23&&t?&"`lɣ&Auq`VRmuc9+ .bxb$2ZZsX7# n(/B;%G#jE|Bճj{s=Ҝ'>71\=3B ľ#t3Ip,7V!GI¾v4LTM~|Ϥ)cwcDs8+qY-\(u?+z^~$yEjBMmM-jڈ=1 vftsч|8C?-9+@:Fy[vGĎ2]:*KC?!BXj&c}|N>(Z44&s =UA ZB/KmVbZnʝ0Kl^.4#B yN(H2?7$BUὰ-zmWOR;k.tŃ2j- endstream endobj 316 0 obj << /Length1 1358 /Length2 5919 /Length3 0 /Length 6855 /Filter /FlateDecode >> stream xڍWT} F%1L`cni AZ)R i) $}s| ej!t QHid.$@ j Rah8hCiA03#$%`eD+ p@P5(<!d eE~Խ`h8A00/BF(`a?B(c0(qq???1"(c0.ݘ5`#@b h CaCz bW 83 Ez <p{&:bFA2x _L0]8n;(=u(+ aM U V GjB0=,"en0 @`.+% @!QWB +4Q8pG'aͣ8<0Ɂ-$ۨ n* $ *JH`$@pgS*@!\?}ھ_31X@oۃAP .E?`==k~'!`I`?Mm`jscS8p>:p/y0S CG`ԃ! F ?Sj#H_쒐@hbM&`!\h_<> Ţ^(KHשZzZyw rtE~tqO_ FOМ&Z%؇:NrS`D_{}r9~0uVdIDѤBO'/-u҃˃c|kW,3'Y^ J{ ׿(2',H*Jݝ_}mq1Ix֓UNд}:ה\b- yz#G]kf&w⑕j3{Dam#d$p)^-;[!yI;m2N<1IK oT BK,blbxSef:G5{؊j ?ҥ -xW:Kbra#՝P8.hu26vafs䜬=]ʹJD|eudB$4ky&@Wj.$); {0-*́YJY1(}7vW+Fc߱vpK`}uF{+ff&$_~뫂I|5p#f&(,+>m|>$F77NAlDknf;8H U 2)˗yAйNF(Ys&:zŅMY EI\lgS>o*lnL^f%SùDoTZ" z!d&5h&S]Hژ +,ӣ޽bk5!/m;mA#2Iaط7jhQ\8NJn)'wD2r߁ywFYxՒmA?u:v}ciLUnNuvYBF]zC0N<%$=7D^NZLyX|!% ~Տ[Uɸ8$&wdINGd_ޛ'SIqdzP 2P`^\浪jf>n(wt5>C9YϜ78㳲}ZK2F2ϸ[LL2z N4T4<Go_RwsD^~7骝&}7@^tpbT\#sim3s\h<= " #& &>'tC$Ie<)j?ᚈLC VO7̪~3+s!?(q{JT&m7iw_ JMoVcv'"Ԍ @ŝ2#xΐA]>Ab,&}|Yy-ha'HH>P5aֲbO6?y̅eNpgA3+$JWG qJqZ:ɷ!Td~!c7dN1r]aNe:-ݳ*8\2WaJ^ro{3K~;ͷwjʳ6~cp3oYשڠu|lȌ޿l2O|idUh"\ި#tſj[芠$}rQwʒUy%b>NJK&y778t#/nD͍)j%\J˦^9oa6UBy M lAGYoJY56-5pR~˺CksvIѮCޢGb0G;f[';]hBc BMt6_oCLƏGG4h=HGDtGDF;*RfU61y86*|iQgbW%s>ü3}Ltƫ'S<[#mUR1~y BJ{5?{%ao9>-.YQ?Ud )]^r'4)/75Ƨ]L8) )Un ZԌ);ܢ3j^ݿGz)G d @JA&{\.d6ln˂9e.d*F1]-luO>~}U}@3bBcQ: Z?jR'8{Z}"6˒uNrɈd];@ ,wJ<G-Y93g^~^DYJG%ݥZwڐH'_$ˉ&s;IJÑZ[Tċ̋oޯ6vn+N ]k:}\Q]1a\!k<:tcCG^g5VRD"j~o<н{#9+䐕ԏx}g[ڰ}`Ŋˑo`~{n2'&HН&Ně4^5x]zmr!%UGMZm1 bD@صzm>PG/ oX=ge>9h)8F{r =C\Fז!1(8+&بjXقO'_6 }+>!{R8 ds iQ#H3nϤkJ?A;ݓ9HU8Z:~cdBj(7߿ oyuJ:hBk^A>SgÃs7YRtdiTAz"='ԍmr@>2XggX#$˺/_م} xbnBLz -J͝ (^l'4"eaY̌4-_UNLBIj5=̓u*i=!!=UIMRg&/x8/>l|Q[ã6}(Xd7KvEO}:)%>qEg35ñ'bN[i\|YZbK/=v1Rgwێ>|:4 uZiFtyۺ4ӝ1ݾz.k)qE06D]7H_]$9bM92!2 Rz{91g߮SduֹU#BcfSZ@Ho 8a 巿Z_3L endstream endobj 317 0 obj << /Length1 1471 /Length2 6724 /Length3 0 /Length 7718 /Filter /FlateDecode >> stream xڍtTk/%tR=tJ400C "% HIJK(ߨ=;kݻf<ٿ5u`8 Ȫi?s21BPID^ B 19iT\ ?($ , Aj8 $ wt"`dED9K B؂7Z%WVq[Qݝ wy p l` \:0n\&-F$Xa.HW p14 7py vYZA0O`  'e 7 @NPU3W#ìd`W~rg%=y~wy9[C`VֿJruуA\rY !00 +,`K[_u=adގpG5/vgWV[VKl ;C<ƼH~Lܲàn.V=\B.>A^W <;&W*ì?"_? }ֿ Xp$cn+ki_Q|\Z_C r@=#@r_ >W5῵ra6п[iB5`P wZ(. /Sei\.H>VC+ap_'(9;7N>M*L9NO5Hݻ=j{Bf66ݿ.֋2 ,bʵȜ`Dp`zLNgѩsEz\L{-VtP2RQР3{lVy8]R<2M:nzmk;4cfeA'UZnVJp(O}"$Q3% 3AQ١m'ė}zTL5gG&Uҝj*Ͼhse%~)T>do+ONT~b`ӵ/5%"@{M3ÅCi9RG[O2ZBԣ?=a8V$6JHZ31V66AI.9 KA lPQ_ڻ*u{x4jn%Lm=9'Zy^1#2Dq*+\o^ (7;(~>WՋW%uAFJC\Kٜ NzY5oڝCBX\sݮ[;tK2&—eD>7a)<AUmvwq%55v< ΦVUa#DlhuoᡒqIM6ЦQEQ{r*D(?K{-纹º?H("`r,SSYy K\;WlcOh"w^{u‹ g+K[l,@+n}F ǹI[oӿ8έ!~{`UcG!@f\sa6e /5B[ޣXyv#9 6tV u=ts(P&Z =F J/#|3p%09#u©Kю.BN\XHnr{b}G.uS0һ3Ή73?cb<;ʳ1=m2{Uʛmz[!6@v}mUKB1q&p s82 ڥS֟j:EđvwcE-{0ya =^HX=:t&T ,- ~#lr'*Wav"uD~yyR|Au +C֋9-yWk&۬ ب2Y- (]QMGʕhlQ( s*EߩiIYLO&eC6_' (Q>ƠC_WlOc+%{[ƶlìx@WLJ05ȹҷ`cJ 46޿˾0` )ԱVO"Iv2ƩbA[8Aiou t c  ؂@;ͅKx -HPJ;Mh'0s1O*;T:$e:>[!/tz΢}) 6P@5 8 #ISC#n!RgN"< |+3+)͸=z3uOlMWǮ4 l/t9U x^p:B7uV\()jOGËqFk{r2N,${~Ϛeե@=U7O1ԴA'iEYðbm 7b#&q_NrzHܠ?+-#H)JRc(.EtqrO1sg3lr߲RANWi%V:Ei[F[ InЦ'곐JO5 }9/ܙ/T,ΖGP^i1ϔ4wL64kSX3O̩<p;2ao3bJA"<+RD2=3[?5:e9.;l{EK I&QYu)躖V;NY 涀3И::n}dfˌ=ʇC):e0CG^{TIoel S~v0ږks%i 0ٙ*V-qWT^[6l>)N8fg`G ɬ >ffxqP+JU%Oьuѕer- ? WϢfzJ8%r<{:|4<>2#Қu8 ݋U5k =A+懲 Oe#Ri%ęqؤ+P;4˔NmgIced)aZ]2`oTz ߢ }wt1kf+T~ GZ_5 ۃyA {̼?F)> ͫ5~6u!-41'QXw{'hn4zX2>h @m&Mj탷*Øfz/cҸu[Bɧw!2yw| ,=˨Tgq(~?oђsږ3[[eUAdϫvm1)G:.1cXveL3W]N*ՙq5/ :?Qn`) |H'DF/l|:c-L$HoE>!thyBF䁐j3`;بR_20Fg8 7 ؊tw)DlxD T'=Z SXKGLrG1d!Mabv/KwY/Dj]['ƾ1Fa)qzqnŒ_z0 'gi.ayprjZ~A{m*п(" k/m[BhXe?So*AlZb ETZD ajqP,xW4B՝]eI JW{!^fPR(9IpKMVuKVdxW::`0:g.]sdnT}\J;afmLR*_\FX=SΡZ xY(V@d Wŷzw:UA"Y,i QFW[;1.lKOeCY(4'Zޕ:UY Q#GƲ50H"_ y>Nya7n`Xs&TnҢ0 Ѫ'% Xg7 wU[S$k(Γt  D(h`Eg!ɶV;C̀_ɤ))EDg%Ԇ _Z rkc3/%+< ~B5P_ԥ_qϭ+Qwaid5Pe+;MLѢl ys?n5uuXݩdB}0&Cp "*,xLRvZQgu>9ٻc2˵6\VZ>u]`Zޗ$w?Lr&^]L]!2Hɻ|30H>6xLU}8MlRcJ|\ }]2c"<;/}SB혋cPpåKIyV{;Ȱq̒ R.5א=qY}PC"V Ф7Qݳ6 Cm^6sqGsSw\^2$cy(?H`yR ,l”THGܞgTh4)]YsyPp i4V8Og١z;V'ZhfQ nvu;RVs4 ZaDDIu\IڗOlv贱P+gjofJﲵ h^UL+Ώ=^}G;.:PyZ.Z9jڸR"*$L8!4cC $&63p L{M*y4QZrj}@1 VN?n@b? ޚĿAB .+L'%.qh:+> stream xڍTZ6L# 0twww4 1 !4JtIwwH -z{oZ3g?yYCO&eC06.vNa^sn X?2P% =Aew'_K@)/CT k!`:  =eh`rBA֖`% aQsdtvc@ęX =@zm[:4ƎNе@laP pYnO`  p2Vˀh\\w 5 lAN@*; 6tr<[zX, n X>wwnP ̍ Ca,8;07ɂ@맩{sVG0݂ T B7f899@Wڞwp]o%o~_ ?f@TYV@;џ`_CA^'q89>qv0S6RQf?*iiG <;%*8*iJ*g{1KX iL?.BG鏖t9y;j uUڀܝW|)?CɃ6 _T `N 0Pظ89GU֎OOK)B-џIr= `Ԟ?E}|kS'/W <[;߀T?S5n@}BCxBճ;84 h0  q i"d6Hcb]BMf Z^I%t,c\{T%Q<^{b}~ױC^ 4r6]_~MXo<{j{?- nkT`dы~Xf1# ܯBel{UC\wE1$dl=Ӽ49dnη-*4amo)8FgESf{s LAf]‘~@/TP<2UFGkK?1>%T&J5i"佳";Kkb$/h9u3U2-ipUdb5q )-ַ>N1$w+V=Qׇ؅$Ou'HRrImqg̐Kc5nנ͵=T(ΐ>b?|3M!lK,$vR <4leڇ;>nA[gQd z[Dzb1X}4;[=/Ky ܍%U]T :lZ_?%ٮ@CZ!ykEvگ3EzJ [se(wkSZr;։_y*{i\Um3p >4Tl l$Z-pKY>gfۚ\Ufw?Yt6],vS7y`vKM;8Tk[:Mbنx&SGyZhfM cL2Ķ_":~Asŗ}{[%.B=$ ?`g埧Qtsz>YS=ellE3wohbCcVU ]wF >IysW۲Ji8XM,m'=p{M?. ɒyBØnYOM yCj>`Aq/\d!gvv(׫PVT()0L.ٍeVrnʨ//D<(e'lX) *o$ fq/({wG$գ8ijUK23(#KSɨc^FE>'š G"΅: R%{$%QX/v ǐh lq5Bs 6T˺:lḨxǛws֊X=ڻCYgM.i a.bsu1Y& U"wHҹJya]@ c0;ѥq_TD?'7wkM׫[&ynh蹤 8)<h$d#*d6f;UUɓGVׂFwȜ(YK4TjdheՍ~k/%m>("EzǺK?QŌB2l5[zX/}YNM`Z4x#^Y,mذ̋"[OSÖews*HkEZxW[/^p^漮}3ҡaWH $TZfh)mM'՜6_0<6z xf[=FahڪSU}-^W[%Nv݁վ fŏ]C~&hh'c*hNtB oos؁ƦmƓIdkľc%p*a"5ޒ!j5XZ!)GwG~xXVܯ Lݑ|SSHtF8: s7פ j^, lt߰g}u,!}Ē>%IޥyS/H]A/&J#e-Gqw+EΞ /2+2E~]QTv+I|M /& J>5 ](R}׌Am4-,7Ӫ6o'Qj.Iku^nnWcWqBQC$< Gx!o#_?>g+I1^ O` DBM%f>E=S3:3(UtZ[ !/E/o+'(W03z\6K83ixUr-Z!E*D& K:A'`ha\U"wW>QH]¨EO~ʔUCH MncOަ̚qR3 &%B̙0x>H~:(o>* 3l1=]rѯfь# n>;dۍ,mZV.}2L0ѵl7<{$C$A# ]=[K<]X0"=ܹ-tq}(rl!syFac-yWQebde/!07zjǶ"tBHdП-PjGԜfze$e;{:o淆0w QvԢh939ۣ5isAW TLZ"p;jG=9| ׫ ÕxDxc6.Xw#:w.h=iq 8zkPULwJ@wVmT&^r ޝ%<^bM_ZCX*V*W~!Ε|Cۓ 3/1^&Y41.cSGc` y\𭥳kּSzu6zC&KĞ7'yZi|`٦KRL(Ѐhf%pJeٮR+^1 -̪5x֑܋3pB fDFIGc[T& ^! s>*Q$ I̢/㙻2B )~l\n/ )yKcPseSt ( WT—\)}B Vuv54u Il`$=<j#:qщF)픩uFBZjOT#}3˾òKkq\\RbiQġ7jANՐg|Ќs!e2c TA+n6N _iΪقV }z6gU2Y6Q9N($Irؔ> @UϽ~mLGn m`=m 1[܈;ė^aVҚ6 &cY:|M3Bߑ%4͟A <Ģ/u<QZ_Xp㫝fԒ+7to>1H@n+1+#3p!R\n,ϛ{&"9 kP[oR }G-̂ h7Bp{ |vO&')μGp*NJ&KAhnRO˩^Cy5Y90!є©/Б6M%DWeƹSJy p3#)#Ց9`G%q@$Dy {hvޭv'贇 g/B{ 07ra>Y P.͔qxnhfn'إjpkJFkV3^!LSS)kgn<#n(|e5R'd XP#e= +PitIi Kn"ǁ< ;L"wbJjv39%a;j>l˪gg¨Z[%#\&Cunpkbژt%9w! [/g-ƨZB/닙N {~@|1 $/^4.OKЎ(DJG b{•v\yp^/@y/<|+7 Zt6u+Eݛo{`ޔEHy-lVUd^\7։XhQ*yCFxr4MOeV,(HT}tEz}%"b "WNxVVtd c''USa+%QI|.{n|NI n(߽_ X1j-wUZӲj\@_&x2;#}{ܾfzxBj}[Wq"Y*cY'ݦvO\TiB4T{ wVC)σT& tơsĜCvٻIdG%y@\(Ac !Ǯw&ڃg 3=f#$_a_g%T3hh[UP%o|!~ۃW-dӄ$e5B& 6qC9,Pz|r;O9H`z$M_2K8ϙ zXۻ ]C"KUR\H/7"_OR@J}w}d+2V-稿kw*%Anud$N[23z(LzkJ|R/xYIJth.J/̲=&n/πp|=;.SQjt$UrMwa7yč٨ #;Y ,},(,\=+F/z -kiB\ʮKo![e%| Ѱ(tOfB?ĩ [﫮;Na vO\0ufB+9;w bֳC_ ?GYh`jQMk$ɲu{jP2q4R7w<Sm)Ot[dݛŊL^*S/C9)Uߙ@ie|gAb`{ x.quTxy<+Ak: ϒ4TL:^ԭvbBZk jVfy,ߩ0c;l 7Tƫtnxh]ѨJ?agH%nuY4qWD.KahJ0٤j<,2tmR'r@a/]Ƚ!|.ݏ`;\<-Gwy+gXv4g#O5JB + ڵ]8+1jн4uEY-p,OkqG{8W NAjͥBbAy i%l-d9. endstream endobj 319 0 obj << /Length1 1824 /Length2 12141 /Length3 0 /Length 13282 /Filter /FlateDecode >> stream xڍP\ր%i-wqw';=C {p_߫j7|9Ƃ$URe55J822U?XXؙXX))@V)5` ߿,@C7㛡 ࣓`ca- a 23>)m 3sǷPo*=ſ_\{nU\NVhG~^j̘EsMwPz2roK;x>q(XE(pLءpqqZZ;Ley  q=}ʼnV(@ rD,e? @;u čԍvQxphd, =t]`SN$մrT0fږrt$',^xhU'uD U\0ML Z1ts(.@OŀwVu^[F jڷ@TG32S!WH[j![OmX1K~M/&U`觋x`0boݫob8I[3mk+p2x)]y}~m]t ٩ ABNG Bz~\;\c6+ m4ź>p8 حdIQ!3ͬjA.e[.q#2N.[S O|S]ROl3. H`Wh-$mq=W=(Ybj* j#;Å^RN=8Q3߆+qvS)[@Eގ!o—@Ml0(ɺѼIv_L=na>v&a'w5'@aCσU5B5;g=mk|<͸Ga86߬~p/@(ɛ7JB~<!5êonC3)nhj|zܹ{@Mo@.zy礱sM(\ ͏B궶 ⮕4 O^+lvlC&("[X~e&z)=8&<\R/m^}3-૚: :H_71~ o(Z eV!8HVig2 OO$ryW6ܶX,W:ϵyQ@_tܰ䨣,U@mT=K<_8,lѦ p*i1e(9$/7'+Eo:;bq_ >́oo9d &)yB`DОT&>jf5x[k#= 冠͘伍a6OE_Z{lM+stt$6)&dNဦO>/Љb{J+zJOU k~4ʑSBfgUp2Vj4e*[<&M~} .`Ǹa{^;ܢԨ_wh=͒@R&:Dؤ^,JWߜ.{g2DZ\JIμFm[B&0ǐIZ8{--&j:R^\Fˊ>H"V?ckSo_]pР=J ѫ:]O'Z`m&0KPBo^RD>w*:[0x]VzZ.em^wV0qs!#yIN}I9Aq<b\Ɲkdj_6l9šF5$bl.͎ O1ߐŸGpF}t'O?Xj?exvgC5f~:yfxнDWXVp*rEk"UDUTNN|ɦ0w½|4:1R}[/ 39 3JD3 Ԋ1v+5*߶:.\eZܾn$6 hoƕ LY=g@bW/UKS&qtf ]#vX$[ V{]؂]lb6J\doYEFZ1m{rQЪ݆t^\Ok!("s!/7J_*/Չߧ::eԴJϭ컝oo(ghRQֽ͊rrO9V G %;]}ط1p'<ƍ"N wD Gɼշrm":mu*/2<6<,%PmzpX'ktO 5Ăk`QDzlJ@w `E>>;;:ylix|b`K"rdC :U!9кt"7LFKq[զA0Psrq{+'l\BwԐ=C~ bf,XI6܂ڲeo5 ?Pw<\;-10Tnɗx,Na5R^<(or׶|lHrC~Cf06_d'""ʬ˄>=Lg68^뾓{xiZa~׉vNdm-2=vFm2"  O@CZ؁=}8FlpJ7hU {IW`LN@v9#j+6zyE.$o+ӷ񤵝>sF1ʩfR3~ Bq< ջx>$W^Wz)?x&Żw԰#1 QD'm,;J`GƂ|iٟe`!<!D`鸒Y93Izv}Nu6~.Š!OkP>3}m Ɲ/jQ Qkb ShAvrT/Tyږ)/ƹ5~ sk xJV!9rzbɌ*` ڡ0å+umҳ_STSg]"j%fYȻ}ʬ*mJ#:C7F'J4ڸ0R ^r߾du!ee Ƭcmje碌дb/[>݆9q6BOA>b e`8=?v8Al@u2e-!?qg2>I>{i=\U=xaE(dWuHsD YC{N^"(EGjU*]yКWX?91k6 ^w +ѱ.UlO3. +^lnB'k|.%Sc]N)!~*sɃnYLO'y n.T WG\q%x>]Yy j^Mߊ/ GỸ N*IόObD7'jmLjW̹Mh!{@Ǝ} GN#6Wcb.SC0ߑMzhwh;4>fJ#T!4Z|WN)cF#ay,vE&;h".^>l(lFRt;n=KHM>oƸL<0a_{nQeHGf~}!CVhzG0H(E^R ND0Q4bxULl܉;$c\(R߄F,K%сv4bx] ]g l2:6mְWh΀fd;j~1kY/`WW1-R9Ftf}7r7bs=n#Z;HYOudOI"Έ[;:S3p1Wn5BZBy"򀐲WH6DCj\4:^ Dy'hw1M7~-6 FʕvIS/^¤;-Yܤ8GJXNϡ>E!ʖ{  cj8]Xh$$e&ͱ}Y̰xP~;?$2E X_! /,x*È&:5 @.}+ȷoJ ۩Q'ew},Rb7uz"3]{ ױwsOP*"m0Devcl0׍m/ζ,R#,23]\n u4eI r"X 5ú/ir?"u@ q]_ ֠8 U&GcGS)D\y%]Db3餄Ys򹪼%4a(ˊޫFb7[)<s&J.K^ lX2\G0c2jPC؇M/byEMvwp[)3J2"ϭHIB)C ߯Dq`'yHҔJ猃w`:LS"A ̖fv aR^?W%`d 2]Ukge"?߇a+ c!}TZRn }!\1'wY]㎋u3\bng'^k;D?,SeQjTF߱Xҫ $9~CS{JśIP?H9C9wFh0.Z$u~5I'"MilN@!{,‚g?N.!mAG2PZHet\I4&|. a6dGY;dsXM||XN1нos>(Jd)'}va%a\Wɴ6A' Ѧnfc6I#:rc%_@˜O-z+6_dɊvs[_E",頴SoWcJ#PDJS 巟:emVfjmfM:.L2˒wKHU_r/MWGnŠFB~ڂL4;8 ń;UfT#T>]0 [`DHRyb Ώ,xD{b2ivJ^Ԟ*Bޚ :Vm&+Ph¸8_ЭH ]xwtޑőRe pڰy~4Q* _ ?>׻1tB9xɟ(,LC#ÐCb-GaW#GäI/ gy63FoXZ5{c'!_*o^ޑT,$y;i-' Dde,X<_e+lό}_!4 "?gda۹ˍ`4/Q%m3 3ay[/MZt'ωAVG۟v?s8?g77]KVAa<|OC~CaXlđ\_o+~GDCN)Wu%'i ~d{WۖkQ"$|C_dPmWMeީ\ X}XK vR<۱& mbbBh>j: +^t媍seĐbDltOL`%c2GV'y'0Bq@Jt6`"5,5޳ҹPZ”y׻?(_'{<о\GEt7$c/}%"WB4HOjS~vF=97yx&F˱V}40kX +$(ȮI/*a\l,`2XlH9#mV\?̑\d qmꫜ C3DɮCd^5lIιo=Լ[v܏EsЙS[/V;>|1oohf IOGi|-ZI: \< G]f'ÇB.]N9]#I;܈9 }k!!_7#X2"|y )t ICOQ3hOGF 91lR.q,/+*:>{áPP\IrcT@]hq\B YhvnȪ]#b>9Vk!` -g5^T&#e*[J^ ,8奿r2|iaXT.Ax*?x[xu"hwjO'%]? J`P׸Ax/p;;7(rb{`#ʶ{sEŠ;v&7b;;_!Ni\cX9)><ocU$ & G 4c{؉h۹4n~u(xR*Ι*z*]Y/hw-DCq>Aiڏj bX(s]&>Z}(`JkˠMpsi"|_֎Xh)d~fVoɫvZBа]Á^()XbfOÚ r蝂 31s7(jӧR 6byNM2&Դ?S֎2w~B<-ډ@|-FԍZzuzjKzq:] &~WPzR`c .EƌA~a9hÆXMnb.nҏ,4uT. H γ[j6Au<-C'^CF|/| *JF٥aK_I7'}g\^AT/YͲϼWeVfw. L8  Px5̶|ωv"rxߛ8;>drè#hD\(p[K&RJj I<euCs-V~ /JSaR3DÒeBV[9/`4B@ӶJAVϐgYQf_K{5xi3x֟#')1`&&VU^fƁrQ箧⁙*~˂X22fG6؟l*c14mdY S Kd~l[3ҳib 3[ &[#|vqTՕxm$wȅ'H_ɤ4`h-zĚc.åC>bl@ݠt3KcT#2Zxbt;4(å.,yFAfU ;H„T͇ 7vFa>Q9(囵Vz@OEٰ8Qah!6c7rq{ok^7pId]<#¿ 1 -4 3R2O^%*N&u,pE(MڔeksIyj<&6jfb:z=--Ҥ9 tC8sW0젅rZ8j(0~OVy4ѫ;=&4./}yixF@y*!(S[ BmŐ%ϫ/7AtuFtO%U괒lg{V: wwWz.:9LeDUz닻T^VT 3tB9 +!;ϧ/Uc>}fr?[LEDmVutIՏ ?f_f|rQkG  2oB;t.(;PֳQ!TIBݲWVެUaqb7c#:~MMm_dY +k)I2ܯ91]rvL)irB] _Bf;˩H3Ӟί0g |R? lB@8Siv[?6G*G67У."y9:yʜlY]B] pRmSà /`{%h40Y sݓԇ]cDma>yPY\B\ @S@?nDQlIAjH!J|K]& 89V'p|:S$}zQ0*8#%pۮ#Z}[K"b sb5XK`t_~VsONHou*X\f)mD mwXXEBڌQi!cK endstream endobj 320 0 obj << /Length1 2351 /Length2 15245 /Length3 0 /Length 16632 /Filter /FlateDecode >> stream xڍveT\[.ݥpwݫpw !Xpw :}ON~QcTշkι75: $&PTW`gqq RSkXفH@.֎Бp>UrvvN;;]L=EZ L2ك\MnV {pDsS;5\нrss`ed1weqtgxZY@ W%S{ű R4]-Rwp4uv W*@VV?YvY;`am(K)y1L)ڹ:M=LL J % 0 ]]\Y\/7`% 7WĿ`23:8z:@J;j:X;d?G |fcc_,2b+_Bu:9:,-@D_WSO#Dvv `v@| 7w@ ܄>3.U[NMJR;z|9v^?Z':X8/?@9/%Gpt݀25_^?$ng/ Q4Lnaw78(:j=Ŋ ʺB,\<>vṶ&>k@*3;gN\/C .l~@9؁,Sb<`NUR8ٹILhn fo7V7+?n \? >zILϟ|@._̘ۿv8xkד#./8 ԇv׊y2Ѽ{s'BeW·-#*K2f%\ H$i/ %Ex^Inm0)?#H9yŝ.z#NɽCge8"Ҋ/Uq) ͍t` @i~Cj>UՅi20(0.VaF[+=h%/ TOxt?% *nG4? [8eC'O9PLwA'V2}ryNFyfe0gzgM(abREH,iGOZɄܽ%K$7}OvBE!U ĄoDT G)ClI) }N6S]/3z} Ie:>ӍbUTBbSK? I/gAU=8ևM;'gC2~mz}obtޝ0H"30UZ%}lBKNHɏI6yeOJ܏IgR5(M,3X(k+ 25u037F~lGGCEQ@$`c݈Ix"kϔKx'9L-(roj,cԯ̊{"Ec+7 tMj|VA}55 կݡ3 ݩ, %HYA6g%eoJ]mğE_FƺRf@Xtُ[ŠO#5BȈTL2V \u,ROTC :\V#̅I:f?н٫nTREKe%Ǩ|>ʲZzA/"e kqZteU PKƕlRhJx E5\饢K+kP߱SłH麝6OVt_75ng*udxd}bE06Gp* 㒇aƒ f$ ~yyܖJ&ݗ8K2ҝu+9)F-g? [%OO^ӤOM>\p/ 0ߏmMHl3qqxӞWl<Ա"_hMߗ탑uFua- AY_? ٨9˄c QUl_2iGeM/i0T%*e=6)X 5!:сIy>,0FnM\u]d;! h)'\,g%U͋Ԓ<%U0B:qtZ'7as1#h~x$MMh.ES+CŜ"BjDղnU$0RĞA"`*6נ3%(Yهq:6i>}qgD"b8O2dGyc[s翉d3puL`]uysοGl"^4{6XUl#"'5%y Ee3{,.TȺ5V67S6Q&OViп5t'~o;rCf`n?noj^h 4,5[îs3ʐעr4!XB?4c|dz쫊Fi+)b+_itT5GQ.j|5*+8S18Ge2W 8L.Gfl&ڀF;va9*lB".<bտ<׈bp ~j~vA2P}h^9+ҐU#8R~<|Hg^J\ؕHDCrfj/W{W.HP}aـ%7[i :wāoou T~WfEث&R/KG=n*}k2;M_<451S)[DcTdc.z&%|1/ISܷ}+#cgZ6ԛuĽID 9xir ,25`w\d6+T<,+!eC$Yqr"js&AeY,9E IWdsE BZA-3^+NI#}h&оw5[dސ& Н=dބ=͚ޢ׃ETNV+Ґ%|č- y>4L~1QWt8r&HT%AY6= OiZ}ƹP.iz7wYapb;sZq:#!򵚬B92)'1iL~nìk>\e<() ;9zr/n0;y/8PiGIv(TY)uɬΠnqbC)"W)=[psm.ʿ^qUɺLI^&??n?ec~Q5dEa kWD1alh$v w]Eݪ %e \8Eu[6E-+)jo`x&̶,lvFQdWUg>.}T_C<`x;EFÂidwd7}OgW/r_ܸ㢒^F\?[OI޳pyʤt_$`I, ^zRutZ`s}|A{O'_Ja>8ղ|~^b#{qv e?WK{1+<]RKWPBj*:Ha2#|\KFxd!ȧ7[BXA#Tid*D/zW!K>_Pmceߵ~){/ũ 웗mȼ]cG0cECr>a f$)kI-Y,TF'F붙,98%8I vg,i׆n^DYpĜXn|M~n2yXӂib'ZW3~2''v+"xJxzFK(]X fNg="{J3k3/BuOl,sRkd9 9{|Feal J3l`]z> D-.2{rR M4]Qq־Z|z(d#u*T܂#]ftϗE"|_K~!cJgEK85o '}ZⰌva"nS |T.o ?1q$ `y]OG} /~$H0y^0)Ayۋ\ٹgo&W5Ź8)vC|? ,``W-ELβ 4٧\7h{a'_ d49,=.I & ڐ~DMo;%G77ήiV20 x*{}nS*NܹS$n1CMj%uaх˧Gk J<׷5"6qWN(}#az`*s=}%pZ γaK 'MHz^ufZ"!F(}to7JvvJ7DYx:c DY'aA+݋9%ٚ brTJJ%]7H_9-4™7*P@!wJHgKgGuK &ŸBp2h'RPk L6+TVC ܒ1=#HI,h#N.{G]>.KG踑x[7`4F]Tծ,sʛC mz=n`[5?)($UÈa2kqAF\#.L~Q_.{zT:TiByi˝[+N\\1Wл G迒aX. k\X@ C{}o0c}DvF޸mEqsZ~o)YO!Ծ:s"Dr'oŝgKx:PcEHU_Ջb%&I<*k9u uXV"}yكF<(8k.+BT&r=/T!7`Gw6{ѿМRrFqIE(+H(XU\ bA-u4)(:fSNn!M(L>>FMp6QsŚs#3e+UlJa ˩>؟R Bóty 5'UbϻW,/WE|F{= ϯ\!%GA3r6&sMXB%T/\2!~zzT&rj ZaÁwSRkJ+N<թ&4 E}ou❺"`?%Hٹ\8U㤛WTMԺSUӽԲ?tJ[V5\ܤݯ5Dv[>͌!0khEV]ԅB_[:_,2BFefj7GL/i͏IF)yoҞҠ;ՠiEQi}O-K ~|}s> J TWt9roOa 簕PmZrJC%@#L?&[BY;|õ%hLni!/t9RBcl&lnﻞurF&\y>**[ ]橿Œy*Y-KՐz Q7!Oh`j.$@e,sk68B.y 4- a[YAg 39J$! xyǰ2E3_ +Iv3> z@]  SF}'g~-{0>f]lŸ^Q*{efC6Du(cNYqI Y$#Zѕ?R#>IҠf *%l%CܖH +?7袶 so d\-AqcoƭK*%Kj(߫Gh,\0n1,4`bNS^cO#(&`Is $/|@71N`SBD7+wOJ4ih,&v #V4;r+]bP,mJv7ԛoadJ쓸Y'2G/&ϣɭ2HzMBV~|p޸,L2N'LkJ4B~ۧc ȇ*C8^:OlSCEO/tF^2ݦi0B.pU7=#.!H>Ovw<_;n!"'VImۯ!b8c;| {߉hX 2 ?/.y3Ԫ18k-kX$u:Q{%ڈd_.msMxޒurn~GOL!yLUBì{꽿pQpG8۫ ug]1BƯu 0n0b/#dm]f2McALuUl4}ۿ * 8S? ,z-U|uNAb^˲ d3o[k#fboPUÍ-[£RoQ$ԶRhjeȘyr1[稫lOvkBwya<"WZ>w$O\+I'DkCxaBVljy֖/ƹeޗ7(H1H䖊&IWj ~_$g{>ڕJhE"ls)2mȾq6c A0q=*9QcK_H*nkBU@ŝԫܽfc8m# :5v3Ti/Hۄg}%l%lx mGdf{~o^BhOqf߲?ټ0+{ B~_5![jG_8^\}\X|1;pN{FEyVC":[6R*36|E_V-M ,N4Na|vQ|5®8QKv[`t%NՀV_,Ghldw{fG) weQd.|=LAQ;M!wJ² ɧB\fXG!OXB ݳ.Kl۫ \1N(pÄ3i.66%VsY!1ZUش!B? DHJ׹^@Sgnyל[wkX`O7K"LC?8Ϲm11o"R|)o .6'5/O@_ߝˎĄd"Hew/1, !Gq.;6ǜE38S=5=BLEt=""_/jGivr7Q/7͒k1Ksa6Fz=c/ߖ_2T 2B#+-?qݩ4\#gp#%8 44emIVՑAI!P8#:s,b ®їA)̯-ň8XvU} zw ."s\|fW%+,^*pG - ˡqOgм_Gd昁L=Xk 1ƒH&5ɧ6cZ6]0nF?#sQpL0c !uyPFt@t"=PBAHJ:b;>NzdGG  ;V 텳+Wb9wd$ޒ:Pl;QzT5wӏFE9k' XAG W?{(Ȍcw7L+z$IDpv;8^NJ-k:+֟:ݝLL ј[K =RNy8u?9YT.onKzgi ꭺsg\̍%eAړ>gˉSJԧI*T8Iݬ66z )9V0r`rd=-Na+ Ytată L p \._\Ktj ޘffض6τ<2*ʓtb7kBɲEz$S[ UDiE ? U<$OgQR3-`4Ij%qN[G-e*SJZS8<}/+>OQ,Nѩ|*)Q?`j f+uJM xb#Ї*Şh,:`nAD Gi/ԫcdo"׀\%FN.jjN{SLD0¨Jjż4)\Q^uYTo-7kYJN%$c:K7ZQRĖ>:RGMe~iyC~y"5X&:b6חCx|BmOz΄{]Alo ӑGH_Ӎ-d j,n+[_{e2;!gC2OblaXJ(DQ~ Wm!Ǵ'Nw}0dei3>(Ұ2üĥo%r{H/^>1q֜<zwύfSfvK.H "n^ƍPbi|ɵ-OQkYMep B64;ލ' ˏ<&HYnw!B_:BXI9?p' @D 9[-*94KSU52~BAv,_} teIE$%wpqw G xWd$!$-$SAW< 74"!OES֎嗏 oG;9$SiL0lQm)01>\E"c$q(~dK|, ~q̠ȁe |Q` &ጞ&%g-e{ǂ,)8^(f-sisR e^E@T$ s3̏br#H3=[ZX)V?Qq:%GU.y3vq:`Q,%4I*xE@G %j컲`hsv1c} [))J7VJ1)ު]tA\"4MH'&ыj>@Dq&ʶ뻫tyJ9-Y͓Akƾn4h!*N\,oQ+a%(IE=H E<"/|J~OB!B__ G~cxXX)͖b?m qyREKr/BߋBs}oz vɢn!ٖȽrM"Q̍Ԑaq S #;j_5o FrѸlt$^x8[/qG-,I \+*_~TfXm߃JOtfJ((GOD %( @ӥ ͊6D#c":)dDͲɈA}j`,w$9eKΧc 13wxBkӣ;Zm T]j?Supl$p]4e 54$j[#?~(ZS!f(?iRg.8PE!6hWG|z[1n#g+>cIeF!/.i* z`~$ѕ@}n rJwB jcfyq$}CmFg(;mrewֆ~,ewIT˭+`KD-=FNӹ]:I"gDEO= kH.n P++Yh">O<7L8+1IR8GqSE:Ih>!͵d=R+n~"Tmq5sP{q& lvtv^>r~*}bo3 “|-,ۥ-z*mpZQTE"I1Œs`POMy bRJ*ruS Xh_? ֡T6W]e?~Ę-#nJ 7V٥rznB{tWPH[$cg:r't 9rVsbF `Wv3pz}~Hd 5eH Iin1ݛHcx>UQ(*Bj{S鴉0#F5^uxY03 W <2:uY4H ҐJ$}∻iv$|TѱL2YYj8EgR(w 49WXCUU;,) `cufh)zASsuQ"xXܭ]|D: 8h P5J2}/CcVZyg 6q#Ky;9[d2Nחшw;xtv"e7X9?w*zޙ_1R*z9˒*#~ƢoU>:튳UHX8?P1jhMk9.態)-mSUjͽNQOU ʧOEqZe1M [|Nls+s\Kdݩ"*RV= }~د9Q :?Y* \M/v]S٬6(m tp(98TG}WȞ{ W۫ ?'!)xTQŚu_r!qDߕ3}cNX9 +1hbn@FUGQF~ƘKd5 Z.$ sԉՖ@.*Snő6)&yݰ _| ~N>$!|C\O6\z,ɼ~+'7UM^^tÛؕ!v0D`skw{ r/0|6Lnmؒe3n64#c˂~?h1_(ca([Iu]͈ULk6 8%Bf yI;7)}pMbQ*FJdJy4R?#<{/`HqKײ~#0E沣|(T]:6EUϺdZWJVŹ^Uk+IGٵ'hL +3Qs8ˀCjvWP TOԢ[]66}衚.L og\!RѵbS(.<9C;Ѝ'V<qO1M2>?BU`ٗ,[q0qڊMP*w#9qfGY'nG=X;~:bsiP!r!/rD7C$l/'r z*dLcVդ&-# wLI ,4/*Qk endstream endobj 321 0 obj << /Length1 1401 /Length2 6170 /Length3 0 /Length 7122 /Filter /FlateDecode >> stream xڍwT6RuܬxTT Wm ~7o?z 7͌+Mmœ*Oz.}o~n%bsTp]ڮ7Y{$bpԟkۼ5#x&Q6 MsA~7BoqK^ ىס#64cO0 kZ)_οjBJl@11c-\Vz #<곉9q),C_` =w"K}`dWjew|Uz_|&PEɋ+$ ~ڼ`~q1͆aM6z],$\ 5k>2OJ}I/؆II )z)~z%>kI6~i\L|/K+84 I _\[Y BC'>+hJ}RUjԹįCm`# DS*_޹GxoY|{$[b8H)᷁MN~ƶMeDZ6o{6X-͔}7u1q7pd=آFN k{]D8Bz0sZGzntm+a6Ş-o^YVa[5QXnr)/"c ď =[ZsV8[&7]:sONZ?;88Fpg6~%\~+]rڨӀr\ [8NUGpEM O/Ox~LLzTwڙ146{H4JV5rR-~.XRX٥9$[rK 9x32ۚᴉ8S*QQc:(`-hE4|͚&&#g.v,J)۞zRV16[QgmC״0%|u'c 6^k$IaT-bCM08J'UCYM Sxr,t]@xWy~f}%{`;ǻ4/m4 f<`TAĎ Ҽ3[d[w+Qn3 Ki7u%{s0/7D5Z7]&W ւ$]a3N/Z_Il>c:_z 'c2R ZdOb_kXueF+YիJF0a\,?9+ghh>| 7nWP]Vx&X\\K륤la5׆Aaamp gdִCW}St] .R1c䚜E"Ong̢9R#_xu\UY:{kgIAK&Zv| ]SڏڕĤiB IsM+N \'j;Ï$vn0N ?,ٿ>8ɑ1ӾE1̥A>#]7yJqKy1 / J'/Ned&I6 sswݟ/ =q_ O\2Gⴆz}0<9 E =eۦ2y.~`J̕Kw{n54uΜ֏6YX;+O#iMM^&vsx(AL8p}7 g9-v'Dة~$tƗ{NXMQ{T"*Y pqq|%3‡uڌ,tqWX*6M"hа[D}H|]e?uqcf?/yqso}q9oxl> Emɩ `3 ~e.<])*&(D=k5lYa}Mڬd}3 (dRIDꢣ>YQqulo<26'JWhT^I E& (mdݩ_,@ ϺS^>CLFmŒ%v3 e {B1< cT!{^J_u^R̴pή%9( ._a6tae:[Z;i֗oi-5?kJ`DPb:!1Mr4sՒ[L}ޝ($!՝/AńQ oU3Ce&-g[ncM#޺u>kd.U#y ˬQjU&ڢ{Ԁd:Ajh:{>PF2I&sJX}'Q$KH(AiafnM_Qv{-U~P27m ʺqy^:`T%̉7iqgUicc 8P.i{#n(fMR5AgᵳMA?72{zq.TOXVGOdY[2ݽcJ/j|2A>,K{?Ve.ikqк2UbX/S?Hk':oD`(C35Zg~^%X]z3ۮP몏O;Hɪ-U>%jؤV48۲D)a_Lz /?%v+- Bm~łB 1\&0 :vci8V071 9[GUf% -ձ,$ ~.RxKzR uRh| إy_UܹP+u7&eNþh3 >F}L$yF) w*QUty11V38 .<,7MJe}:T&r/Z0Mx, ȒW刧lJ75*i߅ WW"J ŗ#- ~M/ 0qlDdAcU]ʿvE&?&V0$f|A8LWsF:S e#x?U; ^Ƈypw C@ydch죅cm ~̛TIٞgny4`/gvIwvV#s0Yى{n\|JwsN,4/2tqTm"os&$ Ș9MnMȣ&jg&N?gZxW@^S"l1A%Z}<(BR>h&Sύ]Β`Za }SPcW.IX£L>Rv$wR3 &qfVc!!d.V~TFoBF}wd,(+XlHΨ;T%[ő%w6|%UvPNysy%Iw_ѯV-@bN3y\i{߹}c]~,N Qus I\0+tQJo\|e~sB`ёuzGWh iq-탉 [j˩nmdHX+){H4MQsl#"]gưBP[cCoŠg3b9#'( )&x?YVp5IM0\fyZZL,2xxe"X ~U5R .$|PwU+%~sJxevOGRjx&iLc$#`f^Bů2lIvGQ~ Uwo@7Ypy02ŸCJ"u1gf+T“߉N Y8%'6zVD`s1O#%zKmOyH>"%gu5bY<{>Gc_X<v^WСQ 38m#ۙ{Y 鞽Z˶ckv7JD2_(N7݋ %VJFBGPRZbf 3&yyWú]S_ Ǐh[`psy!8n_cWVDハV@?k6< /)jߩMt^]|Y˨%j\o^mSK2ٮi)$8’ڦc~LHS9[ϙʦ3Jo-^QѫI˧6y\cg9 g;gw`K]|煒HNf6Ûit .޾r64%JpH0HҮ L`k`];7fJj](zuʮ =?C; q2c_w~p%寮kG ROa xVu)AG* |ДM(ռpS8NJy,׏x2bLj!Vt2!Z1@Cc8 it(DshzAOĶla@eM9b˅}Wyq x5b34do-Љ::|[8[ _oSs&Wi_3s髌CӖϗH {?E FU](k-G=AiO=kT6eBVƙK&ҁ=\pRAECJ6K7<:q/x5Ǔm!8]ؤFC1NNb 1@,|CJ )B$n1:B<$aY}a4K{26E0!A^z{&TOeǺ\xm/p+]'n g%եW^*s9v.jTGhډQ![yl >7`g Eڹ$SfMryᖶ&eҟ5.TRvX}PJFXKNHlBP9.3ZoUz7m mM e ZL3>S`c|p>$O5t~_`+)3]-5/|3>GR__3s{3?wa~ endstream endobj 322 0 obj << /Length1 1381 /Length2 5936 /Length3 0 /Length 6878 /Filter /FlateDecode >> stream xڍwX>!C 0J;G+1ƀQ҈ Ғ]M8q<{:|E'o h>A~$PQ VA a~HnG;v؍a(w8!E ؔ h Rjx8%$A $*A<@m~s+"]}Pp{4_@N(PPBBw8PC!6sTB`$C+*) qqGex^pCyl@\``:vh/ Pば@PNgDp`tq |{UG{y/ xB w>ݡ(+ڝkH_i0UDhw(>{iGUw+ ˜ah(D܀0o>N_fHWf?Ce ecmECf۫IDA@APLTDzG: _Fճ4S$\Ab rCG Qs?Sw鿲dT<8D? OhA jC0[{$Z aazp4a78g8tz`B@adu113č\a%3Tc$+0IڰHl$~e-c^( U444fhQ3Ho-kl: Epd/>Y~Ϊ)p H*!1E{7 M,$rxEvf:*ŃM۶wc/ _sąΒ|5S5Kmu~ƌ=t` M͉4D zTs8a.GÄO!tHxd)B3gNOkJijH'&lF 嫡 /ҙ-X-?@@ 0$ ~LJˀ_XN)\JB훗,ݥy%Zb`6 _K T@%׳YFFf^9a?Es4RrJ]|0,~gyDpL XmgvW5jQ:&^QPO鄲wmN~ԧ),xϤˬ>JۨGZMTxطWEŢ7kh"Ljp_=xxI Ȫ]&e.~@ieI^8MƔ&LK>a+SIiheGO蛐jAvMOM1Q7aͬr8#o 58)b²83[] b$ʶ y9u}iy]3Pa)$JeXطqwdP'[M2/+KB)L^P",euPZO^煩OwayzIvb`oq_uߨOZ$($eJyj8%3pQXc6~v ټEh6 &ZsE)5_LG}*4>/Z 7Zdpuze1Mُw'oUn>).ZEв,%m=I@Hϊ7 Yd(O(w QOMO[Ac]7=|}<(dDSP7WUJ1@h7]$zT#wiT/Mpj޶oy#wTDiT$?L 󢂚y]a=2;ѧJԍU9Օ+L[@by g1V@#Ƀ2S%Jo,YgڭRrjvLE(aKL]7=[Fl.D4qÉ!P2QvMVg ~2yl=W=CH¸KkT`Z*akguDibA̋F-_83XXNHo6߭Y|Wdi.⑒RDcQ*PkIDU6 z5Sij.zjji_s~{qg~*qaA\>msy㵠 0ᚄķecl8ʃW(U2,8>XK'1~8sȸCRE꣠Wc @O"1Ss1jc5a R O+捖I +.m21)J}u{]4+fKnp}6(aNE,w2FSNvׂ/srX9Uf_hn0]|;qQ=]9}{]ijA5ys-́k0q93ȝ穂,A/8<³VdĴ2`5~-ާJ?X>dP$D q+M--LhY2)H- :W[9b Ӓ {\l~:sd~+£O^AuHAF#y=$ fzs2lWQo64.=Un&3GoUh, V.۷]dxmed4iO<ܩAMz+^^ |Ѫ4W7eu1;<2<&݌9|şp 3U{Vⷌ'RxIkxfZ<56=I!*k }84'=UcX"L<"-n Y[#3ɗz3' hAɳn$/k4eΪ6.IgE@ԺTKš~~8 0E-2X?Nyw[hea%3ntpոΏm\PE)kwlxWMEэPE9SBq+'F 'T}ȳdH.kq^Ys vByÌ6%qd>imܵBؽίVRG ,4w(Kd1$Tv|#cpR7',d,r 'gLO4\xžLyZʩIe  nGb&j!.z}ƛU(,h_--$0fDfocfaY)kMQ>JһOAɚ:/&iTGdSUn (6HVi>EkD {$UpYLgӄMȥ^;cc:ptA؍Kw/dݲ4C*Y͓ 󪓱TFz3 V26m*c0O➒@R'OH1} EVv_>n!,bUm͠0!ҾSksKSiRۀ/f dо5EFh@m7;ŰݼB_fIOAZ#|̈fY|$J<ߙa`6HV$els|2|g)mvMVˋ 2(ARIǟ ^*epm.;dB?_X^?㪍 QЦϹfJm ` FДM#On>ۢs?8Rng/'WI/I cv7;?7 /ް8F$Yn=Ͳ)="14\xt}ON~)?Sm&ueyR ̍R !\W4jZ97_IEN[ J~ -i|onQLYgCI|ѳBcŸ7X)9;VthvUfnUohMGUe5#/WmOr2 㟅h $i 'x;!ZK.l(ΰL\wNWi6ξ[!GS<ѐdG|E,[%Q:;GxjK]tх'w}6RY?/Rx~8Ǣ9JAdfv,ٽk@*'k40  * &o6EjLٶ#1hZabjc/ 7T3v5}L̅BR x2`0RPv%$,cםk[BRN Eh|YB@[xBHH{]yl.w2*mz\Kþ&ϭE? =eBUPz9u;D'm:/o-gbZ-8rۨbb?M<_ƖJ?Zg >:D尢hS`GbDMAb&*K˓4TKt*]]dXф5nߧ"R:ZZXDCZܔk}fkWJڼ1_ʎi=S$AJK7 /OoP'np◛z!_ukzÁ7_! Տ,Y,̈́!o(fytwt O_2Q } . -JY 5KfQ&Lwa!qe$.hlb7v٦';IjYàw)?$e3)vNKVw{RӗfS[OB-F&'_2?o472p8*r K:ؖ0G`2%itq` F:qE}N!~oZ,umо낵 {S׾ $H@dr"fK2HNWS SHEUKJ鿀f}urDv:V9 rny.[gD]| endstream endobj 323 0 obj << /Length1 1746 /Length2 8597 /Length3 0 /Length 9738 /Filter /FlateDecode >> stream xڍT6H:In`06`CAnN~gl纟iԵKŹr0(9;@ZEˀɍMO F@@G8# dHC p q qr9929 d̜vKǦٻ9<}0Y0~$퀎` 3(@ a Cf0`` ?!D{!v3;8;J FX4p3eر` -b #]@G2;@KQfaع@`og3   @MN`A-A0bf4]@NR``{We0;; U hǟk @=@`%WN:PPQO$fDx9x@šWm7{ooك=Bl3ptzy[_ ` @́V`(?ё0<G+I?.ߌ A!n>bUu%UI?[[)%sx<<pqqy^n*BA0"Wra7* \ @q?E+s@~0?-uB @X]%36HB~8.vZ\׾AP: u 89G\2 [-GR ܡ故Z,-7/ yHJKo28ء0 9b:X>/ďT^p #\,!0Rp!ianfa sp#G3 B #9o aj:,[4 '_ ځN̐G<Ⱦ@tGD^k2Zٚ# ;ÁW#"8A/?iL{㐧 ]s0 @JI +a1=iR-˞ &O{R^[JRFI?vi['jP6B3bכ *̻ko 4IHɬ=74t+WQRuFP߀Z#ȾE,.~I9U+ &"{&k086eAR81,.akޖ>:+UijCN50iѬSJtoO¬*+,Q.R*x h$*¢+e ͱ'ׯ#bE!}_ICAz""rz"u46+N/KCϷ?t'b>6(^~&eCT):L'}4[ %ghuys gPRT $}' l oM^;'MPPscnLvCׅ//b{1R~KR?t|L_e"o.뎲%kB !a >k {(S>w1&n*}D;&2 ̇G6K/)7b:v Ͽp] X7ٮS=)q7K > J'hFTOVl=$aN:Is`zV`*$|6sBˌgCr?L=F"NAOlUf^wit]XMss~xWMSᄌ*/blkhK'ks[Z4+,0;0mS }a&JzTbZW¶}Di9< WScBHbz!0#fuՄ9F{㣯ù6-['0lIT>)Q…\gBfYjth+mU11s/~$7i`{wf#ɯS%(Go%;Y<#}fiSl8H|5_OP.Bt͝-} +&GNäuYjA[7(:87{ar5@ WƘбftswyiqZzOb vU0_`6fC϶mQf-wotPWݏSݛ("CݿUϩK8nybdgqH|H`ܪdZoҝ:Y/zWQ=v_r6=`,y1(`xҝX|D~}B0г)LuV8e 7I B6(نW(hGTrXjv' \E`ȱ#:N~ݺG϶z{<;,ڸiEum&9YIŞ~hN'eC;Tzɇ#»9'%A! Y0qtJM̦B@& }՜r[1"|ax^9vz(2fж|q",2$a,]"FX(;X3Uo`=J.V,\&Dxᡙ#]{U8ʺa~^>?g-xRlZ!_pE=CucO91\|IsRpiɥk[Z:nSIt'-/ZygVC8euӬ~ynBэc;vga=Fd~c)-ZJq>rTCN TP ]o /)SP#lY<[8C%㬺+XvPt φ$晱k[ScG^Ȁ "_hN/|LGIzW7p4uu;)3" {WS}&xRH嵾ςMje/V)iSK(ϟ~1wTQc?c;_k}@1(vWֺH+y^9M#H &XTV>)ѐ{2VŽα1LSIbnM;EcD*]r;1}Ov O ]iL϶SDܮ3Tp0vz zPC!!̤*>Z? uS E,&QT}(On=EGzک*ܝ+aM+vcۇ Әj_3M#ebj_PE&סיbJzyG^^㢭KomVz<8GMr܅ε:mHp0kiA;H)lIA\+le!@yLuš)M1L+ T\u- }.}&idxlo>')̝ꒋ۟b'7=V_m ȂWUV5jDS0 <&q_amaL&%D{T~zHK cU/*-( 'Ӈ`yeGiA#CerG|&:XcB1A)WJ= +'fW_QϦ ?l߿1^/.C BM"e\~ nBұ*XSx{vlv?^@z<?z$.dblǹ5 ޗ}сOmm |Ύ潕wZAH;DY]靸(_>+S⼱dC( X[BOҍG{4PƒG*;4j'KLB*ˠ5"JV!h=y][DSfJ5~Z;u Έ:c( ~7]زeN,e#*[* ')Q]PY,gxBpRQ$#-YeU1S-#R$;.v1J h}+׸V>=m$qMq^@$׸כ6p]6^l8س^5~ mit# j8|Mr)z[1uJR#q%m|;s֭N`YHWF>5>ji%j5 P:1@7uh{/K ${Ut z{87r->6v~(m4n ~v7RSr5SOG7=u[n=?tVcK[A#XMʜB|@8Q"s6W(]è)>WN4b <7ݭL0O>hPnTMYUi{iF湋Xj]KV:L $]*Em̃0{"[ t. Ç<)0Gz*m{;륹%O뜰Sdq׬*ᅆ䘏 /RnjTWjAe\b1P|Wى_> ܺ]"`[rOˆ?{iѧ5Oh\g{Q+tS<-~^,j7g6  _fgGwE%W{pܔjђ $!v:̶&37V wqAipQ~(q @9"72~Fs$b;~@QHӔAíU-ׇSgrBV:BQtQo5<)^2/ـ"=P1lJQreNcH}%&G "=X6,mQ1Z6XE~u[czTIy)Ɵ;ޓFE~E5jU/=hB01T+EQCHG0,J9EP1M>Nm,ʳoV$.Z zF owpȣJ yv⬿WN!a*iVc׾ZΈ$Nyk" 6OiQrhݼF0?=jh"/c̍z,a&OXFWk2Lrx'%t@0R„\g+1?kj1n~;阣Aō`,;t(8} dp稲pF0ef&|dt*/2J>yl藧[6z1lrM/ "5n4l/Il9^x|벂 P CiH[ Q6B/({uOR\ b/?_DшIXh`ՒAs#w>>e^w *F^/L2h[֥$YI=ƞɿ5mӺsE1ˆNّWff̙xe0/ULbڰ9jc<$7ZF/'xuOwPG/k)m}3ׁ+g/P|^lhRkGQRtn|!rWrv2s:Fhjx/ۇ~܁X<߀(T:C7 48\SG]vpd&5b(rD Yz"4H>=`eGž)=;;n *0-z+_|ާ>N{\##ƴ.W|R\>!q8Țg0XNiqʫ#MPсdHnLPAJ4YESh0a-{UӿǷ{`T6V-);+UDėxrͬDL/|ZaG U<#;id~ůYSyfv9/Ct ;k/ܵfBg2\ɍBX˖I.d ƒ^{yK"]珨m?v99R'?9W2&<_a7%U?-\wVGY.{˻9bw{Io/}yQwP0Cul_9M̖ޠVz>d(H kߝk`^P~&o8"]x_Ƶl8mdwCKlIp`V@t~T^ܷ己'/…LC_@/,Rw ?W u h> stream xڍvT6)%2Ftw`l6E:A:E%%SIA A)ix{=;g~=b3Ra*($F  % (!2c`a.'B/' bJ B4`QXB,)D@ Q2%7 4PHK wr`#ׁP@<$@q!7:@(8 r@QNw>p3yzà_t ؟ʀ$\#g8nr@ȀG81SWKB$`8HZBBL|7s6 QGl # CxO/XP6Dp G':99c X@>~ B{ªڊZZ*}/ @H $-&4@RJ(z,@qUG:v_ {?3 +Z?_ov W;!/7f A`n򿩦?; ½mU@{tjY,h/ 88Qצ0=Ղˆ]/Wo =W适Z3q GªID\#[a 5Q$* 5Ѯ)82Aa7Տ'ۧ_?rpĮo``0Icǭ' L>BKQ =g-L7> d>~8QvG~6udz7,v<ɦaݢ+ 숊- ۾cƹ0ien7|57{{E 5TIT0k&1%fk4q)HM`g,As!j̜oA@)ˠXoIUR^k.0| %$vnZ_ƻ$sE~jwHB.13 57Q4l;dJDKWj}LL5Oh*d DJTNӴ+:˔ޫvK NJǘF͓hvEE<g^9q'`/T69#qFu T)'1[quVB[9wtNz8xvz}5~)ut7t7C'r4d첮je~O5EYs$dYؼ}Zn͓/^TVth,ڄM: "8>[ЏcI]1޶b5dYQ\ƏڏEm%h1QdTV+=(q_W7xsGZd7HTL16i_ ؋,Yjx+\[1g+zқiP`\yô:ϚTbʉk_%65 8RzO&= `jmG=)?ӔMP4\&m:GcJD!7L0RQ *qlZ|@E?x8NѝPU/ZWIJ&(%qL~yp2>Cn{D(PiU{4G&z!7;y`1" pOb(EgNMp[zC}"k~U[C9~( } ~gUe<|ԭT(] md^+ᇩܙts"MxzC'Nuz eJ UԩLJLKoCoں{|Ɉ=jj&bYcxήA<@o^FgX3rM2"/=:ٷ=g;O .C&z5)}Aj" u49NkpMpʊָxQQ_&õ0\Xf|齀9oce} P!棦9mzj:Nl+8-B/ igYL2JUv lVfV:ʟ%,kټ&a2s0Bnx*9Ainly_Tbh8>lhk}X꿒(XT>^eիd7fUֶ ״DOBL#=5'_K]l.þvss_ ZQu1v OvVC\/=_40OCwCf?ݓ:`AUy'%3s~;'F3-JJ'L\kcܥvSI(FH*7@@/$e-PbڙD&$4Ң٣?ŃP%ڧ|Pj>3E6pE%Z:gLʒ7يB"CV^Z;3DJr幀ONNzCUg>N=VmgS D|wZhy[c9DjN}L||GG ]Ad{jz2)geA%jx9.x@pXgL{,4TYRwd9i';R޲wx p"kM_X{6TC{^9kVbv<{Y+7Jg0Ӿ݀:$l֬KᚇuO,J3;GBMji,Փ ӁTa!+X5KZ%EF`y:Sܠ8wwI>F3*5 V(5'l?Oy>c𑜚R2ԃGlG=D $;^,\zPoV୉6S6( QaV"ib㫤\=B'tM rtI:}>Ws<'[; ֙ǂ7{ 6(H %IħuB"*CZIW&9.~kAiau]rnłA%'XbM717v#X86P谳 ^o78?yllnzr8Ƽ2Q?o[R]PҟCd#3 Py }$u2I-9[r,5˪Nf ❺Z| kd$FIP4ȖLh*BrpR:s8km,rWn{b(O#yBf̅h+[N|kYPi~׭YuGaJNvo{;h5kD̈́VO Al4:F7r$i!|1*A4Qm@7-b:,(&0[{ids*s%H_H5ᤏy)LlQBeKA.Ql_ZE߬ƮRǘ_80,B:cA|HsS'r B2+LjC_jxp3f 湫CURrvf;WK u3s~H <͘Ջx +K{I^ :7ivxS!W?K u 6:Ѡ?mD/È:.TyZC$'/SH( *l ْܘO+ \3ѝZ"wHbcW<oFkxgN%EZm48f߸M_+xJyt-}*O8{W$ bÔ0Jsʐ7ws> 1>-gql&4}.%'?j2f*G`[܈mHz3`Xo5V=%Q8'L`w0ؤlMxyfT&xER?1a+^Ro@>QsIr,iܧBIaC+؂yfK|o}{i؈WfY(]Ui'[zJQƂO3!6Gѡ$0{9v2_q0ZEʺ8AI##:ctF.Goúqzg.X=UOp+lp;nY4>v04P&y?kn'RNFA"P KJ..?u% 9D`]8i&,FHObDa Ȩ6o1ԂMϭ,\(d ww#VI7YBTj0 )+NIt[K.З~sG8۳'l-Oܔ44/UM)Nח >ſT9pӈ>zR7ORde.ճ-Q,HVs5W>h&§aBhBi%I,$rly>i#/OPxAEcFc\%VQ_iq0G(sTH¢Bk^3|6}-yRiNHuh g!$ǯMOݬ(J::5^=6╙~]dmWGK0ZR8|h«O;Cڇwb52|*72ay1+ʣsW㴚Ur/;.|?>7~QEwRwtTjksNc$K]Qroyz%/c,Ia)2ȶ1aSmlspA+_L۞W9!"ȗz-TVЕϝr]m_WVI7|qP-l{9s@M&FE,>hY/> ]Zvlދ؜zǵbw΍ƝuڗZfKwk$[UZy/E ^[vY,$?棧Yonږ$5{flBEܱl<)#?=QwOWf wLXU't9!'Mޛ.=^Sjkj.)ya=O!*j&>x;,/? 33֡Vv\˽˻ZWNw9D4E6k&935͌Jbe^ݰkķհ̾E1qxy~D!T]p*`~As\Gq?W)EɲNtѺ=eppD(ޭ롡܉ס{|' zJ#Me. KyH@OQH{} zfqדi`ʣ:PZccQ|1ml!Lg ۖ ϥ7B'O(ڍIį #-yBnX1KqvQ oܻٙǥљ)1J6$P xnBC.YmQA`ݝ--Qok-TFnV )wd;Aڬx7*R'g^4+%mH[o [հ|"`#A=CF3Fi צHZs endstream endobj 325 0 obj << /Length1 1559 /Length2 7199 /Length3 0 /Length 8252 /Filter /FlateDecode >> stream xڍT-LH{w^C1$J/HQtDIEH}Q9c72FZ^kϹlh¯pj h~a!PHHT@HHn CCP$ A 1#@ow(PXBFXRFH("$$7}`@}EUH \n$t @}0y#4A@`PJpɹў2`]PujxәhCMNh_0 0dxH @m='k6@a ; < vG!0`0!9lc= DP0_- *:QQ_S! k;:jS jE@`P4P\HZBBLB .ʛ{B=@'L`D}@4߁@G t:TP?k#a~@F{@_l1rDC}Z /* K%%.c jÝ@?Ō% w{j@FH\?nHww{"`D@?Շ:¼=7c wƈ_XL@HCi04dfC (د%$?1 ncWA8򙈸DB9`;PcHGo%4&1@~PP{% 00g.,,tCP`B`" @ݡNEHoӔ ` `/1&0=`po?펆yb T H$obFUA!ID6MDi2/A-IV]1h.z74ǼT;O7~5:}:gӖ:޵˟wv etD;K.<1Kz|j1y).VZxՂZ:&cNc@?Vmgʆ, 66‰%4ӝ/2?twvTJGQQ0'Q?ѩGaqNMb{1 I7|@rnUGM "'_t(d~B*)!I6Wfeg%~և%2}_c(wUVQF)[BM*9?fZ]nY ;+%O3֓s_,veZM3ش $vWs?.*kK^oxmF>g5eBTv?Q|qZTtMvtLEzq_gTsPh[Y/h<5M0sL5{2o>⢃#-C|̑ɵhU2gl'R&BgwH"Rh ).TIJn62c qR\ Dme]j|כydŸ|M%?8 Qh6 zg WoB%jj f 8U|pEmO|'Rd922 ertDFl&2Hdj!IӜ!mWmqJJ^j@ qN|ڲɍ^/p#t|D_ԲxJ*Df8wh܍MZw-t.ݺ}*3> |\AE35ҵqAo>,XX69Le@*`Ӱx{eTd,$G@i!\4?t[~bK&\/6S\!lQqma>7Byqڒ߮#8þ5KL[RlXyY+ob;%o9L,:{‘Ҥ} i}UGEtXɽ7^FbZ0B, :[ [yQ⥢ 圎=|=?2[mP&Qjam竪NuVDьEAs)@:b 2t֛}@Lv̟WJ܍q%2O7bg:in}B4uez8EQv,:@\Xo=3eKqsOQ%`%lJw= j/^Oqqa ?=BX`ӽ Q^~@Ҽb+M%0lO_MDbJ!"Lnst<92P҃u 1B@k;6l]PY`9YbTq(Se;]7omD[h%rsƱTЫjl}j4 3Ɨ=!Tߤ: Qų2ܧ,/%%X;7=8e F1xtI~Ѝd#N^k&UZhuut74dj=8&Nrd[6ү)d/]y= ׷HvU,@rv:5XȭIl۷+=IzN27Q7 Za@>+*'9kҔ,{ŴokoQ|oN )Qӆ'I`4\qפy~qnm^ Fg=@CBۦwr$Aw~Z0"=#T=dRtXd^1 uxB!T:uq͙ MW;#޾"!qݟ'VQ/(Ǧ#\'_鬼^<Ļ+nE*E!k0ĉA'm}Zlˏ5G #Jǂ18[vxk>kx<^xkq`!,kx (c(`|^bCT!Stvf\r}5-^l9eQDt'?fY+3 [!k[?P:{x;v Wlr(g Hp@3/:W`q6P-9y?L?=f@ ^Iej%&:($/"K@eۡc}, fDz1wmH}lۿ!]E3k7ڻ/ƎJiLU<7"8葮yCzS:O)*-u”W1ceWs5E-}FY+'^uT9D-g Sk+rcMσX|zL?)=ojH0Pp9y]BMKM⻌>lL˸G1zßQdԋgI,Ijˮͥџy)L'*efeGIW_E!L@獙b'wiYaW>V*w-e'7tD.IHȦ7hd9Yh@ ;$jQ'&Y]3܀9 n%`!xMKak ]iyaMn.74yvW |.((xs-"-s.{x;cWY6$*ިr3cHPP7)'Rs{`"] HLXs;S*0'"SZɉ+!듔Fw׆ÔpgP#nXb2a=R.{OTbI1cYTJ C;uI@CfC@EbO*T2/9y:d HZJ}Ǿ^$/RHﳋ#{YY⅐R)OH "mPbvfen%Se*?-{2C v3Ļ';q*Va"[(W-+m}b)yO _yhvJ@FqU{{O~~R]Ҥb<!͠hzްxPTg@jC5ϟq+mPe),ɧ1 WvٱKgS-+GSBZl7Y/ؘ%"u:ϭ;RCvG\B[gE9)+N (<:9>\&Sj/*AtilpL y[S)lOe׵,_卬FW ڞ-M"R3W xڒRyW()Xm) h LkC4[R eNI~:ΗTcL~e?+{kkGn9dV]wsӷsz!=j+#ӎnG| z?%n ;ZFd:Sq?nV儢E}Z2$EZu8&q}$lkqSܤ(73TI+bXtaet?0O :rz?C[ib>Grl BL Tg2 IaWǤ[Њfc/7*H No:ޡ6YB]wYFo 5aT5~Pa7jېyzޚ2b kʮO)XuMzׄ}SC v6n8(7`e)[6 k|51X>6wm#-ɨ!x`u(ѫRTxuow1.^oF@ȦwS:ݲ뼁2O.js#)Wq&;$&6jk_! 5RZUW*E씁OokV?nn.l I V&1iq<.RC:y9pi~;(B|3Ǜc/f><Vyz h/z񽎄Uw g|«'hʖ[[^S |Y)d=iC}lsn9[Q3y~HC/OC"4Fh/lIKwdm"w/cƪ5)>>7uQDžDT0p/V<fp, գF~{欎UKz|tO )wmx<ݚ[O<+#>(ny4qAᵫ5ٮ^"!)OhqpB&H9٠O?68FԩR"YԍG i%LT< ' zv5X==D}e&8[;.4Tޡ(i[߃ťV(m?{GGLy;ڼ6<+5htao =DOmQi}Umn3爹klԟk:t;'ҲV 5n Z7"d ^/ݟTJ/[h\^B<ó Ef4?Y(󓑽ȃ24-v';O[bKDg%{`+6k4YUӡxA!0 wj=}># xt8cERJ3 ¹-!#YP7EI-+`Hql\=vT,_Uғ/]-wGg ,&xю${6-+mqaA.x@L`<*+C>oWˬ$z!ٷDW!;#ή$ӝ ⍆\h}w՝`E$WWK{z[?T|4㣻MhY:8}Kf}\naWE-'%oי󚒕ִYʗd+}/d!-ÄKMSe:ܕ9:l|F7\Aş1WKN /;n=njU~  l,J"m ">KQ>4|)l芔 p@yFƅ9L)v+I$m;v xtڞ.S;?52&L%>";*W}/)=L~.;^<1ع*Ew]K%޹:㖅S\wvNYn{ [Y>Ig?O}ڃ1C"~+@#c-8LRzigeЖ/cv$a}3s pc q!žޓ}%'2w@VmK7E+B8Z6ue+uv,!2 CbaY{\JutO#:~x/giKj'WQ"Ҁڊ endstream endobj 326 0 obj << /Length1 2292 /Length2 19514 /Length3 0 /Length 20865 /Filter /FlateDecode >> stream xڌP[ #-$64h<n=x 3gfr{}?k7*1H։ *&`bbedbbAP;Y#G98lya!2rz9d̬ffN&&  xbF.`S<#@H!jg6pzO _a odyhbd P3'5=hdh`.@Cp;YT@ )/#п1"R,+T̜\@75dlk reJAm@wš omldbbgcod5AE 9F'7'z_F֎voF.F`k#7nV17?G##/¼YTdW}b`[݁>\+[;W[ 3_4L iۼANv&&&..3fb+=_Jo<fo4@^`3?DOG#O"Dff) ` 2"&6~6avu@-m-ySRD ``ag038>7uWwo}O./ c)ؽM.@guؙL~?\M_Q_V$lm/=?z#-&m vj^]y)j޶Am%n S%S\}ۂ0o^LLGd&VohKzۡ+nkbgײs <߶am\ofv,;(oAA'3(R+(2[v?-]zˮeW/b*[v?-]zˠ_zAoMt&vo _?,_?x=[ H!?X`7 Xol(Y?Bj@?l޽ߊ~{zlAf1[?]`{Maso?;۽-?FOB g3w|g8:Y8qDou;cos|+d,o:[$ߩgMZ;# LLxZV}mwe5†wv#벫/wɚ 1;~!KkpŚ3m/Y~˶ښc6 ^ M`>5/GPvj,2kpzkHL4q}J0 VR1=$x3^*@ yOp0M%㈪ oąNyTto7ҳ L7c-}^v¦|Vv⮒ɏH= G_3eUN9&dL}SRg4ApӋn@|6XwTkFB A ;$:$#1~2" LyP>!*OpM/z4 $CzBW!ȑA>$2{9]4o yR&MhO_gJ#|YqDM?7n ~ x<%Zgi&Wń!xg7*M >] Qm*v&WW)F gj,*B@\r;Az}rέj"}lTΌ@6O3$4raю_ ,q.tB5mޙr1-4o${L:cZ.xJ^m,^y{9ءS]Q=g{ʰJS }ʊ"޸2B}7gJg;I,N9f+gYTtvB| e|_FvRW񺨬e2ybCQRzb-o4t⤙6JCYV~ xX;9QH"&g֜e/y/îĘgɢr]Ťޜ[57d+f>s ƴhBcS(WP "m, j_<5oIa#q,R%Ön6["O; ea+p\RSj.D;O{2k@(K!ҠÅ ~=duTl.H [0)/./%V{#¶L B]Inq{,>GɃ}sk RH+yēc>.c Lݙ:whg{tƏS? /?8@9}q*c#b'%ylS\ߣ<,M"nHD iKbnn,E+p_$8nPG8ձ.QqhGw'k}+7P~QVk"Ab[$|ܗVdybj.:'Mj 2DϓngvP_jQӰc V[ej;H$4+g- M2jj=pǓɅBrJ3Uvįj5-jz F[=$cJ/d{,WB**^%;5%Mǹ_6ٵVtۥf{?OQ5=?.6IWUx97pǀ.Cb1;>6 O!Q.Yhf>4*Cƫ\EYp6iŕDQFeg^~^bb> h/Er7ˇ(W%5fM7 W^DvW05q)OW3 >Z65a*/n *խ 5Y$)E:Y#/2P3/;\s~~we-x_3TI[Rr|p5°pWJyOmizf~ ֹR~٪

ǜxPǰMBԄx4\J6ܴׯm$U5(Tf݂]Cestfn)a& i={='#a~(`&IȃϪ$w\80o;<=U| FϨGq|Ug>*s\tvTdcKxl<"6yu;§nBIHG"K8%$smN5?7=u8dSzrIntѓeګ>ٷ +);^L2<@Rt,iOETb=۝[Py.x 44[uHqYEP0<)>kyj1Fʑxm<kK@nTa%4fuFX]8T#nb:|@+Zi/o&@wLa>!졚ղ3MYkcN/P6ྗVJCWM^pAͦ,+X)GJ3`Ɗ8YhdM9otSXzF~֜E)6~ X6}r1a~w&Q"֧6[` ɵqVuϽדZ}p6۳@at3jvK,bbI'K> I#HYYb~"[o"-&vNGb)SPK(ۚv:k/Pn/>I=k|*p:[(Vm$Vz[c/;}[ךXZ9ս[^t¨R ^@:KH,Zc@vM'>Mtv:v]8^K1ᕩjk 8)0!+pD=T!+I0:=Y6Гr'J6~uB>]lsXCWȢ_'p~"oNNh*{|њ#c]뱪;?n*V%!]t9#ֲ͇mц#XPn*nTf0^fIÛ~jc~g%Z>xSA9Qx+nJ0qMAc mCϾq 4?*Qk$v|bz2}CwIU^4ǕV^ud⫀\gliA㫴=:Gvtrw.^%+; 長*$U$maVx #?Mc}DWB R_a(-/66IcU%8h+m^m7B?jO-+Ȼu)U!Pf oEP$x7~BZ%l v2#&pg`g$D j}%icA*X@6;䵫-E³ۼHi1P~."`w'?wVȴQ:#` U(x6 Qbb4f*ןgԗ8܎fѫ3V!S,F^YKh9rR(rm.mqE2Hn Bh~AM+@}y$̉GFAN-]B5~fEi,G8,\yw)J\ OgT]P&D4OVY;{T&H̶CcdKK\4EdRcV?_g0<|ְFi\FRP(4rbKVNTU CuSW׽7uN%?$ nRVEI!Ō; F`ŋ-)&{Ne5c/"wVNBmY>|$Uh//)^,#&=?q(h:/yKyNEmRpjYŚKsl^Qǩaf<{*qp'!v JMH,)aA&϶%T@|戏ՑO>ueیL t2lGj*OHmI{1+v7bD:2(+y['41g=sÎ=iggJ~Ui|mheO2,Uw G,T@3A]OZ53LU?jw:`VOe=Y5?<|#ÐO) Zs:m9D5$H3M xob2@Ք }#P2~rfp_ޒ2,gܕXʕuZ/wœ:^=촹#fZ}e!o8Vo (G. pq8>tM M/I&"o5u^hoLcn{Cҥ$g-$kW_ߗ⧛)Ӱ7Iu@|jU1: tѹ_y&%2Y!//-!تTu˕\_1ه3)xrǃ_r{[=h Y]E~m]>Ac.kxI޻ͨۆ]t`NC)T^lJB 3毭"Q:tlo*@=-Ulǘʁv̺4>O w DDyE:8 MbFqhVjy(^l7(\2AhlZgf0Kc*0 eM'JrE'\anJ̟'Y?|Mчlܙs.$x\S~oYsÀe[ )];1zʐC?.0ʇN |ԖIB_BDaoHu6fuRw=y&R m`{JcٽqBC裳̄I\d.YN9QHzZ>LӅdC {$Tk"휕uAP&Y삐7P{[=Hu a C*ƋDa9 !Di;rbRENN:+|l=ǞE$x|q%2o<7=5"4a{,Y|~UĬ|&U <<ٰ0f" J$>}>%çUwnI~6\i\C?.<Ն J7vNr o0QTDmC-4{Ib M /d n9rc {l]E-{_x}bL$揈Df`è&0fJoxTF }p w=;|>H%{S} pE}L#3 ~|-ːǻ}1;eUs (Tf(?^EatQfz>X+x8YYpd#vXm,Pk#${o/pb JTzN!FkYp#->o6 "EhN6_8 PofLRy3\.Nn_Wl}bMӽJt"hvwE 52b@b6|Z!].Jy#ӟ~O~u(2m%mt7T}DPUicOSe&Ђ&칖`v7{C5qV6Q;a3eKƐM8>zcpyW*~0(jڋ܍[)~[ЖnqiݐמU]9`F:Ο+ 12"K )b ̏U?l@ᮘעҳqF 9Ye$4s~LhQ5G[y/[ast~ JK3eM<Ϊωl:SNc1gG vKW~UDO;}&s 3hq:;M,.)ըaLd?p'|m9W~3cz?`17N͔nN!=Sb="~g Zٝ0>NJ9z(7@@g#%ڇ"v:*cQUh{,v6w~Ԫ3G.Z.!O]' XZt({#}ON4ގx{})ľT=RY4-k)<)%KZsOfUu._}h~q\ F|ZGtjlJSo嬋 {֔},\I0aH\Ի Ѧl+Cc!z g<7$Z/p-'SZDVA>yTG#߶ije h@рk~EPNr'V?/vH8p榶{C>=;r i[57b. yߞdgDp( Gn'3XSuHq"|^8PJpK.!-F9b#u<0"K8h;ŭGrܘ "iP.AG7 ݑ / OoHo)Ҩg&it?rȓ83~PmoW|r+,/! GY{eQS!:duD%C0хB/XP DthD;ŢOh4֧ж&' ;Z|=pȞ{c^!>rEe,i Uoy,=>HN{k!C9QDw>}Pk &vOf+'*?J0 q_C2d[H X;c f$Zg b`.s3搽P_(Up<߽@1xXAҢD]EAYGg@ A:]?vWqﳎq 7Oc>9ZrutRAb▛$pq g1Ш8bsؽJ0uT[lBKP}Lzl>UYq[7R=QԘ=Ҕ)@[ %GWu$ZM̵q%znJa-j@Kp]bq N9s\AVV̍i֐U_ЂʀOºv^uuDBղE- 8Z$REQ_cr C,^vdᔚ<K3v؍92+kc{P#O%yM[Ug+kM?>;@TkE~A{E\\t*5ku59hTZ%I1@&ςR쉔 ]p p$RTh=k~dL yQ$ ۗPfZueD3ѓQ%2x8ޢh?Izݍwyv򃁹ER{S2cqYNf9" ')Bom?s{ ERV@Q]W;z.Cgkޟ1#Ʃ> GsU )&y'hV9HhuV>bOpMkPHk jx1KCW͜|r&Ŕ-N8?4pBwWhW9$qKU]꧋뵒Pɷpem.1{c.B562N7*̳םc ]#v;xQն8KN=mSϭd{ g ??1Z #8gNOT9r ?I'e."$!`\*Xl*&-oR(gaMZM\{MM"]U1,C?a\+~C ߩ^LFQݖZb&P2rIJ#޷s(=An0 3Z>{EpTzaӡ'AW*}lZ!/GqJ19{L]xzNlWT9LQF~\0hN =z̴3PߵD A)O.{N2˭ج5=;i ~]ޣWaxTgH>6GgT]kFr@h+b dIxw˙݌oEdC`aSFbA4BZH$т~"ZE(9?uj=IEo 4OG Ty* )yckd6pR٭Apx9oYir9{7Xᆘ-3h<\aZM4G"5Y|=^_7 ICKUw3w#Fy8 " sI_s*A!0U& %xGAՃC}쨋 }NGoȚѽ\Wm:IEAC|%Sm+z2[rqBy ?Sd;*H0a9 %u 됓[Hޱv]ҼAl/BJf' 7kUb ^JgBk$>ҒBTb\|& IKZVu}V~^I ̪f ,<\4~GL 1v@gKP.?Sͪr.><vLb&͈|Α@R/WW擙G{Zaɫ4Jf eԋ (ʸn蠅',dP P*nE0P Þ~Uaua f7Z#Ba'ɇ^St2z}[YPlz6qLǂ-.rhDf!z:lޙx돥UVa]#('LR-E0DIXC(,PbszĮ!;9pd{Na.ޠqEC.} ȕ();|܄3N\`q@S#\*hnSF> Lz̛Y5<^t_UE<++ߦ J×KS|Y?Xzhq >}PM*2>Yqe"NšFSkKޑląN(Q4 {.5œMP0V5[q|*`?/ܵkEO&r"4!uHmQ;5~ym5#pS0ۥgP6(> w!CTPw04:7Cdc7L1'6zۥ|DU˖6:Q:x ]0ߏ,}eLnoCڐ٫[q27kN|GWͬ?|qQ*\ѡmÉW~^]}{6őN[j(,+~egZwlը>rk$N6AJPg/ГmygkfdZԼU`$OR'K@F컶y3u˅3Wch@ t]vR-KdGS1-['~Zθk_]%<+(L*77Zp(3cpaR׃-VW׏8FO"3:.Pjg GBtc DZ??'Kmvo">3vKDVdb!yaA6tBmDx5ƻťfѿ@='볁Z}u#9Q,J|j"֧qU+JDdyD+4eTטܰwRsި/B˨%0_4Z-Ēm-Є}p灯V##[LC=ߟTP"4&ǡyޕ5mѓ-HD_Oۅ T\;Wc d2.v!rO1ҁe* ~4N X2_y g'ZGyuD̾:eIh?Vmں]b&)0A|!ƞPz6RLS,9 ["MΓᗋ~i S]^=D)B"VM^hKW'{_!Se~t'lчt6v 0[\ۅwspPp*W}eYL2ܣŗ"J)+".yڒbA!F45wtya9qG%~'BM"E,dfNl`렂t_̝^VRa504!s^ D 4EI '-y fG% bNK17@^6uRFnvP;l,yIBr Mr``iGE7O ^S5A6vWX'IY19btma A H.He|ԃa%قh{0t 3|\dtQX\mkvVrK&8F!Ne7 WEB; U.^)vvfu11ȤXT8ӞVk:'D3RЦژ:r?G{C`='{^Tw52&) 0QDɟ%Qm% g6(ҾzN{n^^&J  tLJȶްϭ MVJҟ0P;OTȴكwG_@,wYsr1gҔ*.p( ÐZVQ kE |Y`LbU!{`QI+O%p0rIcK)X؃B`cZG ׽5z`yFtHm=XjDԢݎ6! Ec>.3NEnU7 DJv&_3=9t80m* XƢQ|K4-z͹AܑH~_Jr)&*5FFoIЀ_A2XE%UulBxpifTʁG'KY(Vw6ms>ޑ+ ժߗe8%p^gM *Ih}\\ IA^NP"q|nCU*r! d'Xo8OH8 PhYԑB{7gOOew*EyIf;ϲ6؀H'Egm=. ddUW+3=t[R}ߓ?a#tA͡Oea:UYx6C~eqěpHOmQ=Ș*ɈO!U_7nk[^NLzȝR{85בzQQ=QƖ.v"5{ּp7kꚆ%z/cc}#piO0 uWjzH/_c{%!#x+#àDo4jj/PCA4SZ)RbC~/8@6y!摨ib ))͈ A~Ðq+`͏@B{~./h*@la.2Hcxa:sBVkL`"$11~:_?4#lx yzO3:$ͻa4eeLC*bie<{ً]~XvgoqFD6mjItFpoq|Fe"Uo1{\y!U<|fI='p{ehw񉜂|%]v3V@=j+idi>7, $5݀?F`ԏPSNjg {?$^LgD, gZK7~"o%i}xKmp>Ɯ3Z7Sg $\["ݧw\,V:U޹_c(AIDթUe 4>`!=Nށr&Ov? +7\W۰QOcQ Ӗ9c62N4Bx%MГ^йnHPA9MPa^ d^hMb(`T3 $q7(OВV63NI@o'X{ 71R,5:Iتq%uaCfr1»qWC8,$nC[DSK7'\ ݄R N(r+\fhdL\q *кZXV(ewSo"STU&T$J )E#{x ebHԚŷ f<,Y1\;w=Xͳ«?hW D-14Pi$oeR`>*1jlJP!)l6Ouk(꯶unbwxU#ľ.gΗY@LBGXWI> ͉ $ñ$jh۞%vs*}![84T| )c9(dcbaY̩`mbq=OE#sXM5_IB^=LB`g3́)%c0!˶xc*Q[PՂ][xAwrQeH/KqXoh:C}H/g< nL+NIĺD j y`гR/0!$? endstream endobj 327 0 obj << /Length1 1745 /Length2 11024 /Length3 0 /Length 12133 /Filter /FlateDecode >> stream xڍPҀ|p 2CpwHp݂ܝww'-}-`^{ ,bS4 H(iʱs@NV V9 {5,/ '˫LP Ȼ9<@ !I ifmPbC gZ k|01ytكL%+kF3;?!\\YMY!N"wk+:22@wk(M+k w'U`gm;AN 9E_̀p{i XXہ*Ҋ..&vΐW7k;W?K7HL^;?g3'kgVgk?zd#1K% 3IZ;^ݓ˵C! km:i]ArۼPY\@ r<̬HS_o   `nm0YZQ*Yůd;?N9lW̦^JBZ-W).xpX8@N/7qTMsOn Xʐt} 7qߔuoEҮvv2ћ[ym:.[y5ku@֮W+b b`׉fabr%vZY55ɵ7;k0Hl 뒙پ"ί CW l1c8y&NN&(׉xn9a!..}'?.&/C6&_eC\6O`S^uKdKcƱr,X^tz}xY _۱فn._Zÿ5ӿ5L]yG3W'Gυ{/(2CY ԇ#qgB￈B#E䶯$!twY =uVhk%@oa3#|YѕcOKטlnIpU}4#!C!5VMǬh0c1Qo8`B:>uԈ锣qx7+L.o{z3AӑH7b 477 AW! #B_Xێvd9F利' ^6dvbáL*U<̲Ňwrja9$'9 eDC:hmI)*8E5M7 ?L$JqcT}-0w =SC.tYh*ʴ?Ȱ(:XW&vD= e^3:^쵨IlNȥ"`2N˕HG>L~Vg4KG(VGdrl >TlFר9)/s~H] ( w2Yj0GQ7q.JƲF\L#(1[2w!10ob硻)iA#OZXXAOx ^RZ(vl_cA`STJɟj P$w \$\͎eEr!1zQ=ME{rh؋3z$c?τd,j\_ѳQ'?L 2s/_n#'5!lJnJ#H(}9 y[.;yW$ã7~.l̅:6Wz1ʕdM4{pQMBxRY>,RwBIl $J(&Kf7bH?A6DNr:mzDdtTJ_Zz/v&?w}䐓Z?~pZ%(⁶K=Hj% EuY &)fX5K 9oֲF-橈U pk F(0|'~zmPxtZ_U:LmujP;2^~~د %=:J>BfSSlLHЖbHꏏRO7 A[G5DAprSЗlZꮕ/çeWc|D-cAypHgXGh="Hl`Frvzi8ZJ!aHX.g(bQ!~rM雝ou8snI=(s+]%~#?mB1F֖,U cN7$R%xo6]7ҤElG嗐[y<}3'>ZV2) d\W| cflU*Ɯex$}W ؠ*pMj;M56z{y'E((6u-2QzSKvNunrbcl(v¤:L$ X"֮E+zXol=ҡ`bG KTf1'M(≋yK_ܐCY6ʍOFpvWk]/ ˗fExٺF_A1"ؔߺo;hr!ֲ.D3Ղg >>-c/!(JRo/%_7k?8P<]avzWG1a- ĩI-q\sK>ڐp94Ewrt^>SzOϮxsmO_R;T {ZQEO'E_{{9$+@mV#ډ̣RG9ɢ̝x/#XBI< exl27ag#n$4ȅ(> e+{.8L6[LP>3 ';XHr.yǫ_oIr} \&8 q@ʸ elx4g?LGR,Cl_X[ ax[RD ֌݈X@5oL}燢@Ι[Smgb&g<,^^42FGVqAS=Ju-=1qFAQ/. m6"ŷg}O fB1Ty:C3tlSbx`Ȱou f'ZiZn-ɘd'YCʐ^jxvoq%b>nO`yax)->^V8 ΛYP(ǟmҿ t(Vwק:r<0<{ cc48ՍOjLXXϕ GRWq}^t5&RfwuY<2% GFa7jJciWB1GB׾a_}F*M& ֑wC-} ~ (ouxM3R:6EprD ۄB,,:@snŢk&"pri_~f E_`dW'afflpѻtEui,gj&6Fr_z>mWcE8׏m`4r:*~E= էcxdzSߡP~mE˩0~,Lownj ʡ"]E.U>xv`dg;V_ZbcOA̋NpMX3{hځ|q ՂYנNH!}2?s%ld{]Pd$8h^K1X y).4_٦NgL1rn dhOtS?`|mBS[|QP7IkZAb^!DJM[xkBC4.ge6 FDRP[{^kNA5ⷐKp螆 LJm ^BKql wx;fw`\w,xDjmTõΪ}n8SJƌ\]]*p^'S-jCT6!]&)3O孛0PӂT+ho׿2IJRl1#ҳ]U_6qaY{`mr;Np6SNHA(^ *zAJ4Eq{w*fsyet F.9Q*qsD#FCZK  to#sQda \3bzx\Z #D`M[&WOJq-@!3^JپOXߣwL%gWpT30L- ,lI } GlO C5N--pHp:WqXrNݨ%c, n!< .#?9QJ+\ddK>Q?VwH~wr{PomwDҔfV!+hxaq+ZSGvP%cszcGWKƁ7"wh[X„:lG!' ͧӓHǷűXفD5;)gn m|4ScSц"N;5_4TScXYi䐷qn,_UcnW }Gp VDI\>ă H& ۣ| 9WX.Rk]LO0l8LU>3"+Rw}EFX׌%׊ڥ grWr>c^T1N H-@d7?c򐪔镴& _cqU$CK"0{ [\|V|o|ƭ#dIXL$+}9\#{)5ëU+/.\+ZJjE=t6N}*Gt&\OwB̙k衵8ϙ >d[{)E[Ә,xXH` 9DB Z+΍DۼLaVDZ/ingWNEDEY7/Ԅ* @]^7LX>x41%G[JIU`h,Z.U Z]6oנ"dKIiLa"oV"S$gw;YLzPH :56z=ۈ Q'x TaRGv/:ɨ'rzX獍rYṄg3}uWwigJԢE(0MF33Sp\t@čsmFowtZvt9 sUj~mҺ:;R]RjjJv>Z/ej$J|s,҉Ӄn919ؑic:g{wEɠj:w챽L}*+S]}­o۱V:]jn,FrXEa [ɪ|3\HQu6p/[5H3Ja=ОN #k=:NlXb{K=51(0ADr;A /ai@3zO9Bzy4 O=VV D/][=%%[f{G*#@A h[ʮZ _1T;4a2iB Ym4`w2cxќO)7.eWCzfU&+ tlq0%FMLO|\r4AVq:/2:"),(p|-~[JkGs3%~بK7ӟn5H=EV%&uyzйlu:;sZʌh8 3w?wD ľiPqj)#vCIh%#q U2P>gܢ% {;.S ɘܶb"f6Ef(j;I3ȁіtJgNr#US0bH&Գ 5B$^x]z8 VD3c{+,?6ET _.cݜy?YDYV+kF0暱{u庸NTm*' !6N**}{%i}ĈCa!^O-Bڛ%KGL3ڝoE4:P"$oP{|LU;[qJ0 AwOZU98#BniRٗT=G'K"|Ν8>+3S2o$:׳عV zljv-I#jֈ(vd 'C q> >q?кUQn +";3(l_)5ܕ)L3j- n{<WJPOI]O2\LJc<:n/e!$E3MF|~)u J^pz$|U Qh'1]W*H*]R$,"nQ=3M0~߬ *5iw|BcUILuxaPZYGJL(4,ӳ+Nwḻةh7˧; !6.6P'3Rdhbpq7rZ4j^-' >q }2r&XMuq!r}P\-jљVrq(--1O'oD`7XNxbC" ~KnG:. 4P+2MBֺkKH$ȧn)bO 7p?Jkv z)=b!m6qeaa=ZtE[k=s#~L5,B6Q$Ts*$ })$/m]kg̙Tw6!qSv&m(E~+ΉW I_:ʬ߿LXJO<˟7@B9]\/_V#jU(i%Zk_SeC[AM aQ"W]waHgV(2]@Oq)Cc]u9 o#kŊ1r.) zNc. (p^ix;|%*]uU,ڥW]ʍ#tdJxV_RWPUyXOfG"t,p8YM?'Оl#vSNyv?~ljnXXq淆_w3t@)-Sڍ5hWg ҙckȍEm\rjo@h3L Luo^_Nb0L_ܛC8TRSwCY}ԕz"5ZiճNQdy 3͏G%b~ K?P;b0 zB0{$O aԽ[%AdEb+4T]ym& D-"oR \ape)}_ L#Yv-4&,ԙ\ Z9ѹ2HXE%)(![5P&eVQń&ķwjfd1xpbN[W+IKXCUNj--SşM`Pq8c c:!*&FΕyjĕ  H& Mq=% pԜ'>m72]y5`R[pO6m`qʊfl`= wfLGoMF;Z+VЈ|uoG'&DdI 1ey/FHbyXRn?]:%EvUiQo|%[#LZƄ.<9׬!áA"k3jo1iZӅĽ97 OM^[=LhK^ wj- \jyOQ NZr{%.|NV2 L.)w!RfeL% n"M6[*rOe2RŇtalFVgn1DnT pWn($4_|93Bt|2l'RAJտآ[YeݢULU&l $9}vw*$IT:s >gI[Վ^P~Jo"ps EwTO٘($!3=#}_/"YZKn^]ci5~?w"=zW1cM'o*LǴor\WQI'2#є-̈JY;H00QqsP?~ׇDnJY6@A"J9Ic/R<FW, ~rQtQ@ea[c2 7EP|4ʨ(.L wr`^I> _rbJ6><je Z`g/{EO -jmQ*z!ORGx3Ĩp>DCaJ bqe*9<aEڙ1htǘ{KOnx2*%DHSұ@wZlg>P<*Y^@zN(S\r.f?yV RN"iqrcj WNw?XgӘ ֧;Äk})XũO7+mgT[+,g#Ō d6o Q?H?^h2 >[7TmRҚ3.}!z³R k595FGqE>Gp.Tc&[΋>-`2ۜ7pDE> "92bQA,~F@7J)3/'2,UjTI6MW^]Ԍ~O5YxP?c̻Nt`HeEMӑ+AƵyr}O-3?E&'@L;x,Y01q evFLN1}w &&n//="tw[A|S:$ ~4glUVHrwSZn >tdbq%@Ͳ7xAv^ܑu+5yzսLƂ2Usjf(N/RN~U]JRPGYи0i7> stream xڌP c5 -8 !8 ww  \}ޚ*f֧{uLEI(`W`cr0#RQi\m#Ri]@X;M\2 W=@`gge a2(2.T^ K+WpКxvAf&EW+8-@ tV,,&v.Ζ W+4U2@OïT +&@X` 2ڻ]́pv@hc0ipxd`]=]&غ8MM@&`DU& F€,io.`gwuAh?kca_d7 s7GM{PV bee`@O3+hx9V%Y_>.&@O"D669` #- 賂Ǐ _ 3wmH2SJ11O'o?,𔵷p,K%t[ gb5a<e$fk??z;?usx6?4_ xD-mm$E 4WY=kg { 诛t2.[f7s0kع&&^IbX\.pu~ gĿ "?"X#^F|+E7bHF߈"F|8ҿS7bF 8oΠJ34ĺ+3qei:?8gUf/3s%I !` ?I; ]t-@Kg7kpXe? {? w7f,#s]\o2`gQqs?8qqY;)?\+l`b_Gw. <\lM\NdqrqD:\=pp=h?]l@p<pP? 8Hߜa?3?77߯@' qiL ĺ6ZȃiwBhjW;gɹ.*+xF4y}u[Zd縥.[jQn+)܁ɂcѺ~b& =g'_ N9\'7^T/Xw}Ҟu+c {UHO3L1L?ú2c{]bL3 p|`t?VE@IO}96M#v"S\.J >O;I__AyOzү%H!kWؑuCJrsaPm3{,̵I}}--&50'?lEX=.^Y=O2S7TDt4tF,U| 4W.^8?z{x7x&Mrb6Z)BMdL)X.ΰ[1n:W ۿ6*{4Ǡd}8j:xw 39$)U8R;RKey[Pv /?Hrun,R Jl ES~EeTZ|IAxJps+ZlW-1%j 1n^#CUѵa5AԘ [?uįwN\/X3=O.ʐ6 x*6{5Vb;YEav*sa)9,`pRa;9|W& cZ~.pZ{5/jmmӗg;>µ2DqR_yDp5xDWUP#>Eˌ0Bujjuu%H[Wd 7"O%<1f2sn'()ٻ]fGR별#M6_H(GRT>"̌B'ν(T9}6Prm{_%Pz>gS+T5-Ԛ$򚊻5AG9>1N:%uXs–*9<ӴEeK Ao~p ϗ=N!pYdPl]y,9"e[yWLو"7EIz|*= 2 `j]0>`Cy;4͑5ˊj4bWz{tQXlayB( U~KKS;_;Q̤x&ڪc{{+U(6_0-'!̇SXW上PTHei^LǻI;ѹ!\ﵑL3\0|cC TwDjx[5R0U\|W?7Ŏ)WDjhi ^K 4BquA0h!b6&$3.Zt7JaLMK AAߚEy%ȯx!ͮ*>gC|W'&p:@ *ͭ.QmIiؒRxqEV"_ 匩V*XK_ЈLDDi0Ah ϣ5.fxYC#V^&h}Ι@C19kOց6 vm@d;s@ 8M9%rQ&1` g7b^faB`,>.u(B<}#ӂKh:S7vW/^1Pw(L͏Cc[rpd]e/ytY GKGI(|_*L+5`]e_ҳB:~ z31@:ȧڨs qw^d4b' O>?k=|CP^Ydh:(C" ҿ+Nl|C Y/ȳSV sfdCIC&WjVgnMW>Ҝ9MxNwN,[)},H˅t.݆<-M%=?;0v!}So㳀|b=-n# GU2ϟ tXm|w£ybv0WAf߬6>_cxUk$M u#Kve}8+{d A(ɷL[`H^(ZI>3eT8nN20ndzӬCBKz[>g#*arL}G7#V߻s'/B5x't( >@%=񿕏~~I Əg:]/eh!6vAN[I''YV̴.1b3-4R|E2Q@ r hramNuZG1A1BQh7 / ŇD2o MQ:lܔ8M~Aڂlֻ-g du}`Da}"OMRA~v[}dt9:$GܨFdaZU 0ۇ.Zp ;_B3& g~N 6˙zZ]]v^ 2&{z',v.0&FK.:+ \adːHNwFp`d݊.Aښ#|H߉r[A~g &s>1 ,f,Ar; 6#u7W z*Dv&c ݩaLIVjxgZ[f$3#voe3GOAR8:u^ (gxɸc0nfPr7U&QcUyr,0d{O$#dXNI@uOPj7SR۬51K<{Os6pE2g^F m`M9Ŀ;i-Z_m]HCEL8$of}3ԤS SZ|댟IkΗ"9ϺdšY5Mf>#nk8D EWT-Oyz;*ɑ6DM^?JUؔ"սPLm'\_cO(kFѕޥހ+պ?b~5S`R"4-SF%>h0kqoB9Kҭ R߽086G /4㚗q~^8b5fEgpGi<+r_i,C9gdF#>pq8u[d&ۇش묙)@wDּ޻qom Qj_AlQKvץ>)"xhfp~_c28])7}FMWHhn~(Qu;ϡ܏~ʇ z-FZ_O ra8cIp j7QQQJBR?iwSwjއM( M+8iG_TVeQ'W}ueͧ$MWs8݌U48OCdxs4$/paۡY#4Lų7\w=|POE.? ͐BŦ*2PQ[o& >Jҁyoy M*JA(w o!ATcPN:W9eGt(c~ɹv q.x-e!)_ FVʳ)D+6ry$nü[;|S8`)Iۥa$YN Pp) cCN=˒]Q=[Ÿ+岍.bMsKm_ugykfF6HeܛՓ]}c9#VEsNXd̗D} gI&>{Ӛ!D$ 1jN$e4%h{  ZV @ CQ1Fz F'֡ĕ/I\U4JhTp ш#!ͳg%&ȟok&1gg%. w}z#$ř{=1گ5 qB'jM9 /orhͬK9 -9GpD:Lf|G[#o>\``b,툹oxaplgLP0vyw{*Li"eh* o~CyikcHTB @;gaf]6+t6uJXB6=@frzP 1kaI,޷o!5\ɷL~<sKLݙxͲ╱>lC-izu;pHiۤm_@\Joi<zPP w1kɓ!'L-3[ Ce*C?O7I[|هCX\O-z\ EM=dP=[6ۗuRZz2 {cG` +_Jա: xϺr68.-4 a{|MPckbۮu.+ ~=A{JgZl^8éfY}?\.1v%Tr[ڪ(x}@OJʔd?(cVҊ$\%D4сWn%8ٮE=Y튎_LVlOn|CQo8 hDgX_ Ϳ=Mz;eGH=yjX$ r w.y>?`}bВc?ryZv>*s=ų]~̏,ah-Bٯ ʟΨ8(Z8` W?l3zgmHCqG݉ MlfL^ $>\6}Օc˫%h09eN_Xj* +1,'#%M\a='~2C}<j}81T`a2'm@ b/m UvzB}4slm17b?kT| =h$71dЛAE;"dRsYG 0L"1IQ:6*j\B)CIMAt1;ӣB)Bxf~^4o.~?8'RRЋ\CM*֐fz`h&6FΖ,'t B|+㐚'[u @,|0ssQ1YT?.[(#^ab%~xRrhu5h7|t*u1ٖm[c%)WaClcCDxZx]KB%fDq;~>)q1Cd~Lk 7ƃ3pam$?2Z~`Y!V:VJ#"GmmKɵE?MJ+ClW~ࢿk1S%3K.l)R$J*] eYf$Q܋M;GM Z. 2l~- ]y/d'RaO!sAp(K(c_DjNQ!:9r=jǟRc"Eq#EIr_T=FF#`"xpS7-*9W`|fzڋ\i%\[/-Wز6CH`o vܭ )ЗHnb9IF9UQ=*D~-0)p~ևQӠb >Qs()UUdkO_+/?c+6[N}IGUVC󰛣fmwB>D$ۓRLŸqVPIE0fϧYӯ1ş;RxJ7ZD9:N3B]RfSV c J{sz\&dLzΝc?,RF!1vYG?h["[fӤ$-_M}A >Bg̉<^O7d7-M[Y<_ >49h/&ea``R]k` Q:+-}aq}%g4ɓ'Y:ށTLĺ݁FPk/!;UFUFbMXY<պ=wFxÚzq"qA`_fhm ׾z.U9,g@k*OY)jtrDGR!v77bR6VX}+}p^mgI>b0=qapx=ŎQx73J _3hGk2!%QΌ\'#\҄0TC*YWmpC*v1b'0$& ET b pW`N%Llchdn/lsnXV6^XoDp5o]Kp_6&Bgsb +sFs''L@yPm%QI\Wn,β%AJ4}5zɹJ|?eiy^2z]C'YQwۂ 7]>eݍC:(dP"R  >.#TWX\ _ X5ÓElkeg{8:wꂪXj&Hi y1( K%\6.9uY^1^j)`(&uqmܦN~f $"+cF9r hK[TYY<{8+y>7ۡݴ z)>"*6qwp߿ rp*>DF3G˟Qz_kKd[+fi1j&"S-G^T꡽j\Rٙnm3%CSf(F) LxI;L+-?"]0?T_?bw8# xuJ2ëޖNBn4ty* .{˥Kȏ/踹TGR#_zjG|z|g(Tf2d=8%1f3qqlXTc=-WV,:VJ*CHj}W/#RWf|Ԋ~JO1+i`Sn* ѣXR^a,7%,١!A!y_O:ь,5w18G y5 P}9٫SϘ/O$QMAU9942y]4Kx˛uk>5UB[>9Qz1X"n "A?>Z)}/v/]qQ7Awz.ىNz5ZO3Vgï_~2`H $xTl6S8ӭ1O0m.7}!{Pj f㳲cR\.3zM^(ghثF%R-t܄fK|gL5UW|qJ_ġ9eꗄZR'D`1A5yY=9l!븖Rey(אhOǴKra@NmO4G3Y(v?Xyr^ b+*$gXbS(~ &{RJ2#_KOxsLk/Xvaޜ}lxpB`FX5ĺT,m4o u)qnbpW׵"=QE|KϝOѝ,=LK\ 37'Ēh `SfGۦ8 Y`r$pU95/2nի*Z [u$PgL7JhIR{m?c6yXI>jkl& *^# %B[l)@gQߠkQ Hw m;10Y&P7)̞~W2ﵜ\z^XW!/]麿H )e^I<$XȭQv?WE8/@a3s !U#,~h(n:aCdB^"c@^ KHP!` Cţt]OW{QCo ,fjR?Պ]O$RQ0cfNK+z^5>,\ƤRQ[ EJvA"uoF+@Jצ.b /:TncϻaGAj,]_?+`lt f8\W'A:X5GK3@>/r[Rܨh0+16ЂQ1\o3ZcMG9o~-Mݛ "j1Łlr垳#L&+9F\+ffvӏtASE*!WQ{/ɯHޛQlgN4s@T5/vȅ‘|P9uE}wLpԜmlJ/HmE r:pmMpL)3z0h1ڈ 쒅z=1TX$%TS˜ژ8SKң~YnYۻmxFk >[ V+lI \:듄^7G󋳫/mpN ->:um]Q Qqic&Dw [HD4j֓d6"x * NJCنI չGH9ۈܳ@D,Ko. ƵP/o){oT&EG-VvBVǶ1ZAחq=!LN{ZoYB>LEk1@zeb(̶ot>r=3i*.?-Ȃ\G=3`X9a u.Qz`RE9Y!O0z}a9E_OGkXP9uByl n59 r}+alt~%WNu@ -ٻd ˁPgxKx\ĨjqR!h2~~~,Y{#n&ct.Z9ۊ?vW6p{~Rk6 _ ŰU),̻Dui"Z;5OwZ!]0w%-txK_V^V5gy),KLBGQ ^flc*g7]\IKӻ(*g[Rp4=EAyVUxx0KXU%*^a83c((_ztnS>")GRz"`xOz%!)Unn!C2}/%Qe[ fQ"nژԺ'\y* d&fe_ڍyl-A^jQ};|pAT$ RLrY%wku JD_[,^TBs1e.*(+Tyo؎LQ^0+trSy*ޗKF32 Euq +I?IMKtGݺ:l_knIΓH]KƖ6cy!b}mrM w'W( U8M~0FHM|!n_hh(HOD,Sܾ5CGnXGJ dcnchwZ̕>!w3KU8]tKuTޮuȑohpIG$&^ϯ|* /mB㢓+3Ox >R&5FEE뫎d_Z" ˕S wq٪;2G3[L{7Cѿ!G5hL-e z6sI=>#ڶr3c/.׫!Z%<]G2? Sgg{J[oґq7eAv|/ {5x0;B,=a10>hy|ArDX576rSA:kmˠ ۜIy`UFP,hz>S^~wAEt#_,g;4uC)ۚȡീ)F%R{roeF;@ 폇۴WABaRyiɸmB$L2.l(zƢx[BzUۼlH! s+.yt~w$Qrv"nY2lM4==Eـ8]~bOx&46nCP݉)Aw0`2gLN_)C '똬{Ĵod\^sg~ͩ8_lk1~ ?挩m|)0sl]!xTh¢iqHJ_x; Q?~q"d&'mod9u~{`_sdb|obp@2@kt tUJSc_XYS$rO˧?GpfCf(bX|ie%0]1juKE U0}ShǧX XtnRZsw.)yeXz?$lG h AQcQ):Cy  >C#@X~٩ӳ!8#nl1qdp`8a1Dy: o9D˕I㏌p{r<2~~,UdCHo!m{fBĽpQSvMPgtٕ3MNRM_e- b.S6#QVd0NqnӧGT>؟;(O Ro&}glQVuhţLQA!^FgV~mz#j8\@ 51UDjE& !Gx?,9+$As|t2-rYN ft /-2 ( .hjFjFPHO1Қ!;֝|ID,mvPqG/4?CE?*5-N`)$2gNr#}yCd)%-!1,Ɲ2kAt-i0bZ>:$%2'{))_ܮF"3$A"\2݊ v*]Muu=V_0]\r\d2DrLN5[X͜;Zp^ N,g۶)?6$+mkm8sI5BdsH̯BEsq3E\!pP=+IK^D͞6>0~wb<]m J& ;Ls6j1ee!#> _fsueQZb'*j'Xكzˮq4cN? .6/j0#tYoΫ W<:;E nǿ -{H/ӚWIfOֳ5g"ooVg@h; GyC>%I!M7ϰZ8h+|w:mCrĒb=Z;0P],8dʔES#v: XTSAr|g'1/d<; (Ky/)ZRe dӐVY0oj}&s40SBMO &> dYީ(vD}d ToNkl~qS9NY7rCXt}/m%8ĵN1=:\n*'a ־#gHOX,9uarg%wz`&b4m$Φx枿ya-6h DI,2 Kq8SKEiDrաfۅ'PfRΫ3ɱ|P.t.rXB"3nRLEvwqf+HiGkHk`P!~*C\yAMSWA }{9.ՏpUB|K世xT ٧ 䋁w En -{V|Ey%}o[2n饾2%)E_OY[sbkEԩdUu.D74u׊?&,Y ddRx "W4[|U1g6W%DDno'_\1%?0ߞI5ZShp@-;R=8^/ ' ahl&Y9jB=\3A/-r*)}N;m .!NƉN!tʆ)>iG6qaWSͨUiB5%v[WL )ڍxtMmNmMյ\Gm0AX@M-}L3^USH%gV+Qy@(_:|@Ʈ~6M",щXTާD~KDŽs墨YBt[ME/}UjAᕭ+WZ;[ ̷i%ol~1s 1ëa y#r_gLŒ쇐?<L2J/+0*oKeqYuV8ܨL9/ h8`N TRɤ GPF*G8x,VY;$tWRB4nA:!-x (;w?&]>LMf/UKYa-i^߾bm@/ CyT@nvSҌ!묌Nk)N6۩tC786cBKTj% #vesntNȿ۵0wIgԱ kH[@cPT;BGNVViJ,a7U,L'48M-jӣ9٦?̉ bOd2, f}7(l>D f,GO"ܷVSQƼf+qLq =xyjY*1. )L3g;{ MN[6;k8xwuZw Kź ga#[]\n a?ϣ&G<ɣ}8 N?AǻŃ GРzoBx=RcUV=;gVN2r47b (#̆4i(qI$ %,8]B(˕מ endstream endobj 329 0 obj << /Length1 1320 /Length2 1579 /Length3 0 /Length 2433 /Filter /FlateDecode >> stream xڍS 8Ty؍Fl[Rwj&dЊ9fΘscB!]\RdZK(T+TeI%-/e my9"os6 ]07FT*LIFF.?IF)C8J`'tNb(X-XִT*SV8Axj $#GL !||c YY0wl,A "Z2婀PP8`0^:\Dt8ٟ+Aĸ,E)0ĘQ#&(.%sB$02P$>6x21e=`wI "}҅8`R4+K:PT |bxHS#Ř6hH)\"#n\"hpq (StB 'db$lH0B')^l/_ɖ?ids :SXxCduGX1Q.1%Orx@L籼000DMT&K|h7]UQ'YL(Ob,’yLO;7FCLJH]\M0}Q.S D)HT tba4xp8 b82<1 IK*xTP8gI2=|#`.>ƵRm<@nn]58<7ٺ8Gwo?'=d_oNzdKzXq=jҒڊ}4jK޽" BJ85Af9fafpYAƲ˽j {4--e-K RxvQ#͠G[f0Jּ5A٨YqX`iJ?.V<&k}ܖ=wrY/Czve57lߒIa_]R>'>p;sLsTmS4rSֹ~cuۖĎ;[tyU<;OllܨN uk)R$T)ZvNe.uk=z/ u{}xSqaK V>j$7+-X>'5_9]HR3/3kș%z:uڷ1Jo,vD{˭#lrnc/N,e6ikZ8얜qt#Ld RG/L:6xX~֖*{ ru[s7AϦSvw b΍Y;kmv*<{)ى{l{p;W9Է`~6S;ΈjrEZח'MydGwj[,߲_'UNN :0₄kSXͷ=z0s M*٨99Em͗/ر E%hSN&G]6mq{*JgG.N[Jorz1{2 \>f˒!hOZYbv]Re֎m Ůy6EY~cz wD_t$q݅߈gK pSg/*msL~~{4#oAY__E2ҁ9\Mkf1].KZsstv_yH,UsL6>Cz )kS%g szZq*̦Sv}U?346~upͫ+il=ΈLXRR`W3dU( V jL?cX+I?4e==br8u_nDyr7uϦy&t*] s?7w8\yxUn)ͩHfݴ˾Kǻm_2_P5bT8[Voy)w&SIxR<//V1 UtETe+_68PW-4ZN,ʬ/[U>`~%V ^7ױylpWl/f^KJnlbCNZDsՉ^5<76Dtˡi~|#ze 9cn+ﻵI/N)i%?ޫ8Ԥ+cwv5*jo1)_).Yk~a.>'ȊQ^{Qq2>s|8GW{~7ʸ2 endstream endobj 330 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 339 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20210502164337+02'00') /ModDate (D:20210502164337+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) kpathsea version 6.2.3) >> endobj 312 0 obj << /Type /ObjStm /N 50 /First 420 /Length 2100 /Filter /FlateDecode >> stream xڭYms8ίf:9ْ_gnn&o!}0S۴M=XiKfʒ}Vfmv!ZpΉ<26qyHO|""~L0sesr!d>ԄWogrE<-0-0y! u D"MZPlZX eriw8q,a!ZHq8#>Zx``EHr$Aܰ8|7*z9`#eqEg`=ntWz@'ysZ3?ug~^ B88ETƔ$3}ش\@iу|,Q$lݕwREϊ(i"Ⱦ Bo 7(zD mSzF>!>G"t>NDLDhLs:_]ҥtB3'Q>-fR|EǞ׎aZd/w߽*2fUȃrw[NDK4񰭌 1j]9@ñ A m;-=f픠C`4 Ccm d/B>8$O.踤s1YLTl )]1WΟG$l?%;M6b'SU'NΞ3P&tY AS_E" )\&~_V"/beb2JMGK~T[/汆X>W;R!ALn{Hί%zX..zҶfq^_ֻ`=#g)SR)E5A%yGίn@b=@;Uuu鈒>yP">ҙ|$mҧeU*UI4USNrAfI~.PamCmfAue{t l\p"B̿[P۬YCOUȬ[-@dgp.QਣQ4uPeX('WO102Xa$C?J&"^&tK+Zi%(Y*K(ꤙ -yT}hV5rO ǩƈoƈ_v*t*oTE<E|F&=btpxYĔ'-Otj^Pp<̃~] ƫZzuM( gԶޞWh'L6v޽n'dS%NbʼDmm}|xuv 15-L]9IVQ.S}QzU釷򂜏㸈 nɅ,2饻6v-6ˬoW q;]?vݦg!Qȼ;NBVit~:lWe%ʶƅnBL-$;Ⱦ,XmqI &dwbr LU€xMEt%~&߈\zOr*pb&PP.U?Gu8$K1{*`|uk9뾷~Z\#P-W]_6c8(+L>,}ڷHPK#^^,^,Z{e~HaUǩxrĘc3L 0=KUYSE$?1~U5dվ#9+fkze+o/[eˁ;'弽rN:v0Uأ[\QL9wW(B^J-p&H8orq*[˥XUWy endstream endobj 340 0 obj << /Type /XRef /Index [0 341] /Size 341 /W [1 3 1] /Root 338 0 R /Info 339 0 R /ID [<4539FF0430D4D9E26DD27BBF020268A4> <4539FF0430D4D9E26DD27BBF020268A4>] /Length 912 /Filter /FlateDecode >> stream x%]he~}ͩss+ۦݖNeˆ *(tRt x VR>$$( :2>u;?>}][d)مB#a wվfv,:1l-ր*P4dj^% PeV`Grem<;ޱ kPYX8͊Xe޶ ؂uzL_HwlM60 kt8 ڱJ kv -/)3^ }Ohvlw;]`+ X^]Sfu豨x?x%c`Xpؽ`'<`:lƽ=eMMV]xLqymj S "rQ7 x֊j#XقJ>if>%v )xjOҋsXB[aGa&?*2`QW)obwh9 Kf}ɕs2 3UY,|eTbZgqzD~K5.6Y&N7qGG4NM\VlxQͤϞWlx =7Z|󊌦Kk;9NnUuSū-~Z'=?yY7!qT+YD$#H,7&<)RO햛a0T#`Ynz7==4NEMXqu^ ?=Yv"AShδ߲՜,9Ce7W