wz+^kgΫ%Msݝ){/#AG|mPKy/o/*Ez=cTIs}}oEHx}n)e i Tb@T*UvTۧBHtRDNj$^]5+ C3A* $ nI}ճwtyP{E>p;{mǻuP Aܽ\}Ŭ/gח]_WZ>wECm˯jh}>unپ7}_w3뾽N eJшvc'ޗ}}u

^Ys:O_N>Y袊D>@-{v}צHv7o6+mk-ZZ$*_L"F|3_o%Y=}-ĕp7>{(O_{ҕ _^|y=}[}˴MMmn㷾پ) ]<eW}ܷip_as=SϤtiI}/.Vkz<d;FY}O[{ͫo];oK/O_{PSWqLݞش7}wmw!]7]Yu]sOnos39}˝^gl[sv_n*o|no|n\jwXm`}{>v+]Hn}S۹ݞU}o۷٫}Tfvq{kPs_{#v|=nxjO|]H }^睻i_z,i}u衹{MZd/au{wwgoϷݼ}]kWq7 1͝a6;wza5ٖw=NTf7jzw=[vws\Ӷ%_y_Vջs=#wWmvro,vzwGE3 7{}h PD7ݺ{׀v۳csJz}/{U6\ܳzTI ( Z- hl>앳@ҁUoƙT+^=tvt {ns{| sDs,D =;מXpwPNyұ;)= }{=붗gC«nn{B:r[ճ{ٵ6&m]{ t[l{=]_jKUֈ˰uzGxTy9Ͻ -gV`٩ۮ7pvz!1SWv=/۠AJ(T+]q:Om|p]>H(p9EV B J 2aNe編ū846@ R4}>WDS!mc*,jLXJ ݐQ! $!FZ %hP"B)P (Z!H$$(PQ"Jhd h"bi%(A"i(() 8R *DJH袤 ]qaȌ,+10p2H/0(JZ T IVbjPFJQXRBF$h9 KJP%(L$JBRBPg?C2 eB$IC/mALKr XPRیh( 9&C@ppo`2 0:{ %:{7^y2X8/oۋE\%ab]5m /0h& %CM%D4BRH'\2XңH#@R  ȁ?i;R* (!b3zGMu"d4IAQTEDTԕ%PD?ӝ`U"$nF0R>U(Da|qa%CAŔ$'T5H9(dBPD*U$JSJ't&,,T$2qBC )A@)E T)Gђd VBi*Um`Nm@`Ƞ0ҥ+M(S!Gy"$(j0'D %)$) *DȒ%[+fWnNk*@'w[͒#'~"!<w;%쳒bY>ʡw>ndūYɼ7ci.5IC+wӞ 2>r MX=zނyM!3c5FI4SBRԙ{>UzIۼkbѡmbK+QxghqcL3e':(5+*t:W| mg˹9Mort_7+3:j?3yp8ѲDŽcw{MS֯۵<㭫h ZITiOm>.nզ+d_6{X<[Q3C6BJ[o7 zҍY[hI$^oM+ K%|wzwtta~Zl(O*y/r8jnEF9^ܩ!pU ~+QPA@6 s讹MLB6=A.;j҉K"t ~4)Ҵ]]R\PeBTtCi|G6,,wGCH#4(Q&9BସɾUkzagjL F~Ȭ!+ZTCʜ'Wȋ\DrץQ%Я<i;QN"uջsizB796wy zRT@JϠ9N[&GV&z.7_[1BCHAۄNPGC Kh (6]L*|Gag}TfPF#kz1͉<+L [czi]PYg}<،!M-3ywz߿y({&m TTN yt/ w}Re73-_L2.@Liٰ\\kx¤btr;"frsZA 9в˳oVhִ ,H[T,[f ^*#]([0(qc. hlQNb9¼̚bBͩC#/xw2e[V]G r9iDzϦq`X)m{FO:W[&w}@V*rȉIe[UD{E#-IΖ9w++{TȞR-&Ȼ)zl&HD6tUMQQ6 l%f~V{tjԴ׶Sx沝 [푈2a{C=M={L1ɟ$Em5*4+9;BkLex38!Fn;"h-ek').])eJ4x#+#Kʥw,y܊v.lvscva"%SeeE'>̓)o*@gT؝u]lZHP#5L:,۩~Cyߧl\J#6ϼ׎0%)$5YF8ؤ^Yr-Q7i4GYسY&fѮk'uYc釢Me a!Q{Dhnza\L9%Ou)y}_?k|>{h%KY2ZU3Qk*DIY$ǀĶ 6 cd>fs(t~wBDQw ~|I#dG?ØyǾלdȹ /cI"S1'ѷzTt7Ub˔Arִik{BK۸>_eG2.|yz1bmwm ED_"h*Jj]%A֏ ^WFʵn=GR.}1SѷT+{[?[7mq享]QLH2OûoVĴ>;,.Zgz-x虦ծ3hQ_;V2hFz[<6Nj玲Ν_*8fP'us:bZ<]uknU.@k ۲hß0NeuGk۫IWZ3eByPK.|X#9QX/74|6VFZkc}]\8 Aus[,C~ylgІ=a+8LDŽ:^pܢ X;[* `L.2!ؚ\9Ÿ93fوP5>",xR>jjң+{| W0TI?:_|<ǻM=~G63g|Տ/DX2~=76<ԯ#/7z}-ף#yADӫZʗڽ9pڷAX틩g?7Ni|ߧfss\1%/pLE==vuPօek苊lm>L/+PU!&Sw4O,ThdT|۳3~?bR647^O=bvȍİ#OfƷs1/6ba=2ӏBsu9:S?w8/X64LsRٷ94O;-f izٝ`${ބ(3.r11 2d&q,0EbX[*ĝ]'^iF0$. ֱz}ו_z,35/,s-Lyʐp\fgl³[CܚO;2*wp OlWnL&[#'XLTB|iM4]uRJόwr+4k߿%*[Vfl(ݓs۹j|I*j[CϨi+*桁6fmݯ~&irœ#z'DxV#=U~͹_ӳWl2P ZIZ|O:c=U RLݖ(Bt (FN_կYՏtOϣ-fIԉ#vs*T&|RN ~,kS_QEM:5OxuO)U=;"FU<Q->ܤ jz!VUR M?S9A>w_f_4.c-D(s9]̱TyAL8/"rg /3,n-Rsê<y͏W Ra3<) Fs.mUUGӲ27쎡ӓoS F2Dʒ*8M\ھʹjM BR M7{G5NE20; txk\nUfU2t`q]Ƭ:hԉ; 3z5hEY3\3:s!nHN^}7ʝTAjټ7T.bX-G* ,@i?˜ ó#Q:w`p.QxVWV ED|t #('pC{4j@~^W/3B暯alqXь@՝ oi}rHA)9":3"@{)WyF dKt Τv716>q;f塒OߝvnQm.j&okdEj,S Ƙ[<S=gvj !t-ra;iu o_wjf{Օ<{kU 4@!|("> ]*T[N?iw˷4YKYж;Cub|&6xC0V%nplA=h: Z"ΰ9Vw,98êToi ,i$sTc\tr4d^(3_'-3)M-[.y~dy޼Y7:ӣL HvѾyviQC)L7XpxamaYc9v = {o]ʮsBA`,l]P;_qR5 Є5K7=az\$.#6ƹ=":[}V!5$K~x40Y.tt.Q]nji3Ȥjî31qYAĢ؆H(GWԨW1Le){;^ &"w2Fxw}3o3IZ~ַ=ls sL{{+gX^=~_Mo7ߧMZf- q1*R1|:V/B ,&x)ǬD)@Lޖo1t[˨L/fwGBWG9fN9ݜ`A &ll.|q]f(p8& qԗbɣ瓱o^>I0ў$|֧)'k5.kU%Z#ڳ^C=kESB7|]մ&=_9vR?\Flj$+6]=:ڭœe"۽ml /i")& ]4gG: <=ŞrC;ϪNfJgdҳODs$\\̊:k٢Y{G&Tբ6g]ҹNK+o[W"9L^R5’$Qw˕o״hvϚhe<ɺy;?VQ.\;\d5M6l9?SԪ*_j5"kcyƲLef/jeC_YkgYi5;~D|}~h ^~Dt$7+q; OvwH>Eq9C+jI $c™ 8fZWK92tǫ^S- .}9!@9]˯5!ga6Hd4{*~}nZrI] ^^M~;˶InI秂\[:9tLT,RՓtUS2]8Fɶ}H=D17N&MrE1rBj*˛َ|"L/ه{"c7l&*!^fx>~_e|g^W)wtK%b-6pra+j-ٴV~5e:Njp O ]0QL]7Cu| ; |:D7X1(#"I=w>'ϮmVSTιڪRJN|hVcͥwG Ͼ^f˻b~3&fmnEfn*ƶXR9hVFTlL {@"[a8.Uze/T?^|@kU9"Ah:20H{k8 B [yHtOBqJ~N‰i I_wo?,qt3,C,ߜv$Fh!O(O;ET!AЯ1qiO;,M40hl0^/NBϞP:DbdSknӧ}89O.ּ ؝ߜGφo]{N]IfF>,|*T< BimI4dxO<]u#v~˥]Kem̡hQX~w"2l7;ZAt5e r1%YEt:M Tdž;rBE&#^UzyS/5|q?X^!찪08ciAL\vA%sRS{F+i_Ūf;T]QVUOe|l6[;TzOfK"dSBTέ;ҩλ*uv l)]:գ^0UYaxp%1tmO)W;ۢf{G;Y]E7Θa~;c}dȞ0$$ xϻm*>}b'I5w=@]*;^S7|#$Rb7YoζBz-ɢIZ(Z,֊}UtM-agg٣Y[⯇e} q*s2ٗ5HI)T [8B<g[ύq=8n=f,Re7w}A*2H|V8q`P2#<_[,U7Q?nhO%Qs8r72"?}WrWlMF ~vz瓶j͚TzO:ٝ!>o*"_bjNymE,\NnݭkZ) {/P?vrݺBqSh9a-z37 wk/Ӻoܞ/>74Ŷ()JR6uhI,$MD:=gwwAO()~#Eq _i^\k*n}nxe _>͔E³ѝϝA?[Um_pM3 /7X 58[| .ŽԉM@USD^E7!GH}a"eNJ~+/bkJįDn ?#__3|2+AH错̊S F cWD$H"A'g$7+~s ]a1)'DCA>7XMvA>ZwZߦ?F> )˝,!_z\ AOG*Uك ߻3P5 +|=o=b 9GuOw_gy +QUH""x~zlş3ZӖE2`i˸b_/7&HQQmشvGP!yTG(ެgo 7# n_u-̓3}D9wcY䑽kQaMѕ673xnj\E%ozaoa+] ˿BQZ3eTU_'>}݃e89s:D_ba *&f `b Vec1j! b **D xxNɞ+A ) &UE  LìªBDJ$œ$$ $B`aZִMYBOe{Zr01a5浭fppR9#N8FB8r15m>:(c άJ&I2d $HJVAAღqؗ,(Lϣ&9Sff( 2Ri""0k!**, q 2)7dÁSDNFAE`mX#反[2[ `%,H˨2S"&AdZւj3oJr%e4DPF]^rׯ+Ғ^?U<<On"ȿ3V!TAjҟ&53?aصJ??99 0?g)BzGycM 릅UD-JlG)hm*䭷{w|QCL{\Q8}8*iQYZL2SӁa7~|?|N c olve\ڔv %S7,Ho/42cI~`')( P>0+hHAGbf|뛥B߅Dzwr0|$>5 uCMyDH1Jc2MfHIv-/?-a^@eH#Afs%;[4A)H($218Y?f}x2qO=᧧ݵgj?;H ek{o:,j}B-NY:;W:J6TN12E$nUc}v|>́U|J4&JAz*WYJ{)yɏ<Ǣ4ł|'v̋a`F^s a"L9ÉE2#x?9Aa(l`<̔n]\gL5C8Rcد],)ו79WԪ+.kײ')en}Q0PLxF}-I+ $ ԕcBE?=IG|ސBѮiblv1TӔdV~]U7G4hneD':覄e>3G̥ѫV}U=eE߳{~qZ!y j <',D&rj& 1jDu&'W_ݽNgO6ɪyQ&tAW9tQT`2~ ֿ| TzUs^%$l$OL/eK Q77ON%wƈ'kƙ'V[q;. sN(MTM/V~%9 R)3i ltH zm3;#K,C^2Ov":gW|93w(Q(Џ]~Ns&SɌ}Mqs=Yz)1Jh}QyH\WϿ=m4m;b^sn;tP#+=ӛ|!|.DhO^:aWWHYƓVk_qp~&e |긩Gp<<{[Kt eƟ$cC@zQ]'O2QR{=^Hr(˥J+ʜ^/ 4oIjX;Q?D۪:v8qj+o&y -~'֏Fҙ; |R:٫(>?.m03e9Z+ؓ%vfocn+mu8U?_z|4pYlM[-octMj͗g~>iEdWr#8|;},KTaVj3VÑIXSTW'fzxirGg8hN_}w7:NHlQo^}zoZ=6;fxNjߟ/{aO=gg'<9Ϩ1nɛ;V|NkrlsdTQD6N<;2{&_)J+c#R, q(Z$!aA,2I2B \!lbUExi}64Wtc ] * wӬj 3 |.w4ڥi CTe#[4Loc<=);Y콭Mkq~QrU?v>&YR*@MVeE/\WY;:bH"*iB(j" Jh`JXf LTAATS,BQPAAQMD hi("b$aCQRAJF)!X $(H DIQE 5$Y%DNYss)0*L $BeAKNbu*9HRUS( RA @#1"rT 1 HE% JA+1PE)2LSGӆ,ıC3 &bh JO.b)< 2U)U9D H0T)D(X2""h%)dP4YcPLTkr&]Y OmEPEMREQMA4j"RQTĩDD#K!E T! IdTT0E%G9%R5Fr& K ihJ|YPJ,Q̕HUVL\SS$KA@$[7s₟5~)$nl!e7"rxRz />bF@=|cïX }f͙W26jZəAT)OtGb P(X$J d4#BQIASPLPLQAl)AdI"5- H T(R2 ;-OӘ̴y˟՞|E @EQHHPҌH́HRLM3 eAA! A0P0DD( \>XAʊ!aSyBL0KDTEE0D1PPRIIBRR4eB @P3(PQE@|蔠)(( jVB V%e5U)GhI/ٜHcuwMX(cP)S dqy!D1$T^|Og.NȂ (Hp$*2i!H&,LhOeHDvc/筽;} Okk23yX è,y! TDDGv@|,c}v͞l~/2o;q\@Z gBB:'u ^DxMglmhtP}5Hϓ0c`uD|HЋ@ 7?ꡜsyi?WaXf4o UGqׅ~*G3m³Ig(ll<pIhم9&1ʭdR!\C0x'vK9ԋT!,T茨L3 'kzq>cx}>rI9W c%PnxgY) ?ei#ӟ?vlfjD'# *b32s#2c,$mBBH`ێBBHܑ4!222K 2Ȭݧ~CA7zr`AHe2-KfQeفdMdh:pv4&9Rs|3tdDVȣ"/ C>R>C0S$H$Ӄ؆f#'+̋ xb8I=T`RkȯG;BW=P`U@e]/ޯ~3<%(K1S\kT$.Q% Pm5LF0t7b^0u#96ԅV-RD chRZ*7C!hAvHa)rr펐J*KƳK51T 2B:sM/!b|[BKT!QQ31@QTLEEfU1.1Cx9fα.. aw2cbcC,q ,\2!,krI:`I!mCd|-8)N$4QJrH-jYNiMH% KY8@UE&H,8ba1HdKEDY`@F8|kB&  RWSPX$(23+! [9tZ 1 2 e,)Rd32)fk$T f&Ff,$yq\*)JՒDQGf[`Ȭ 0`315$N p1H&NH)I .0fS0:fjA23 ' 2E=0>HQaHhvi '200ɣ ,MXDEfAH5Fb5!Uv>V`R#f=_pѮ |  A3j}ҝިm\ {>j CΡ-JOO?4PMtj8j(F"R j Qp~ns4ՠƚSMF2$W41Q2}?x>A<# }MQ ɢBdԿdH+IN4}ĩE@RJ)`JU]q6}ܵA7H@PLd>rōW_bf'R`WeH؝$WtkU@*:ّk2NXs.~ju`,h,rDŽ> kV d_/ݰ;]tA9Zlu s[ J Cly;+>OK[nSLlt ,Hπ1O͵L'% #=5Mk8:uE3zu9eX" /A㘰wtH:I_nM7)zڛB|]T;Y/Ʈr:l(f"C]EŦ-)T]c9̙i| q=܃(zhq&d7B "j|qb(%mq'hK42CO7aì4,m 㠪tbOrΈfBT:8F[DDPRTR( E(DDDD|ڽFyOd^~B0ygaAgsQk=VJ*Q_~82ݖ,g;8%vr=({UXKuntzeވL;H> a-j8Ta_T4IDHW;/Ys?#Ã%2`ҶWě4)ƚC& ںH`4uaNMGܸ+Y-kIվRɝi3Mcz\H#%rTl+TQI2\D(]Nj4,T(zI J 3+ ujPPq\@c淒B&Q,C|7X3'nߟWbDp͒.p{nS1#VИӁ"!M}|Gpȭ7qI1eg $=-KebwU hܭ5測6UTfNMߌ[?Bf@='#0=XCVeK~\ʊ9ǴT3dELJTb) !I"@`[i9ZV= =hFT0S4!6$4PsWXc4i}=AQ!{| sӅ:uTC soa5!*DDIDrN}AF(T&Kch썏*$lk7sD2dC0Q3=a@ҧ| !Wn>.wz+1E׮%{5|)0 K4ݾLŷ^`&k3ffg*3 P֚j|HQm{mDt)ie zLMpMYL7JOs8!R) ޜ[xqS$h `Mz4R"~PD4)h>=UtYsJr$]kkvEӺKvWe'1"N͍h $z]z:|MvCw%4hPQOj8ʰ7Z>͙.sQSt>w?l2[#2jH9N D4F̶6#]^1^㍩Wr ݊XlE*Iy& đ =é@ $4F 0htv> ˫ETw2mNA,(ٸϪ*+dXޞ\Lhnxx9"%&7D@erO$)Cmד(l:K}a*~_8\q׍-C^ FQ?)59Wc,2v{ǟ_1* \ W25Npt3 (UH1pmitFGz㞣ݑQU'%A=Fҁ7ԢoNMj{,@'w.9ϰ"=P9<{;êoAIy/4,>~q-luL.No}A$ȃ'B hJ:EWf|kg>ބb4ދ/^V Zr{/Lm<-I$Iģk|O幉 l\/cvNoNHu@ %5e W>t}g*iEŐ~Wzpmkx(P:\8`ʗ9ʝEռ!~w>AP0<QNqefi7RPP3 (aPQQAZ#@Z׵}>><jN]WAvXyAd/X.E\Rtmo(F) ESzp,)6MqpSɡtV6/xNuؒIЂIe>L,רq򕊉ÿ3&if3z*[JI}mKȖ$ H7@APH\Gs9geARC|5_O9;bJز wEc$ߪ´AzBvUU1`8)=!ϡBzw›=+>yW捄E=^j- xa u7J ࠡ.}>Xkb39z;PЁH@;HXʍ $v p{8gz >c9[ؐEFNqT/>F6~K%RTʚ4ӼZp(s3mqIdAߦxS]V>W8/ǽOp[]V(Lݗcw7WŶ˃ĉ4 YOVnRO|jW8i"Q \hh> C L])?J_ryw$|۵Q ߧ "Z`mu.6 JG__cG9PW:cFn']±*@o8}UEUSY醕f3xwHE'6SM&eC天ů=KB0Ԑrj@lu)Cz"6KG^1YǘYA*6jlXcf.D2m!%Π='IC7|_AR>򻕅_ Ztm7L [xUSL⪙)V UOANQ:#bdȚCM;~'D{ k0dT2J *AdM2 ,n3/$8Y}CLKi_<=dҍ8E1֩ubIT7G{LsZ9CT9G*#XMjpt;"g&yZ[vSƻnur&5r\\U^FԈ9&RJO3#ü$dKwٌ> 2RI`DSLJCrauUuУ!|(ƞ„Q)rEU۸:Mvp ΂djv0{C< q;1e Ip̃f&uܞKS"⵭m3.A%9Aզ!C8fdڡFcȉcVԦW+6\;S1aɱxdSb5IEJ3Zp::6)F4Qe9"9*(d:CrSVy4瑓}zC>3^!PǖN3ϫo?]0d~˜ysWpD+J.u{}6`rrD.+OG 7sM[T-30Aꨢ}]%rWjAY#jK6BTVuafG9p͠[YO=;B gfVUaj? a 4K^Ia?MY#2i1s'jM?MP ʄ`RZ/::rN0O+l_Qeu@8y:{pϚ~WaHã{9oH}UsQoTɼfp**]?q؇ش?5pUvJ|Q?T[(T !b>;$x1`ßIA؄ ?/VGK_^l"+JXg"k];OC%SbÙ|ρ3Ns}l6#!qqT+#gH1PIz 2Or(0u n={ ʍJ8dL[v;O7*4D{C!V}5pHmXLl ݕs75DAGrr%4GQ"}u=u';ek.Ξ#3.ZW7#mJ.I}D~H鞧JU_sQekALWѮ5vBX(=+^̴.%0~LAщ:t^pc~X`nt8$K0"-2hoD7TpٓJo錞iG)I!AB e|}B%%Ǜg)cݩLi/EAP:DWgڧ`>ȠX{X?2A߉lh>Ym K8>`߷~Z忨1kq4ȅ"BfvLZxc)QX43gm~;1Weөu9H0iF˪B舉WG &*&R~tcXut[<͒~]W^"!4UP?K>}KgD ?qJ'^ T=2S)e=!0E2%<&ۓ=oْAgCP0"fqH.PECyr5xɓl:AJWfp ) Q: |R0T lТ,4yk4ד $ iόV=?ltz;'Bp˟m9 طFCq ?2P* u;|M>A6?~'1vdӄe1'6Lvcl(ilӌwMlGu^%(*dCK-gC>{i7UIR}2(%me((GȚ^lL0Ŋʿ;wRdOԫH=d'[E"޾SET\w˽ `,K JBk`O^= =j"}%pnK~F(A6,I洖; y9blT5eo#?`^s?r]'Fs`FjfR;[,!NWXTI!ԙq:DyD/c!EP V.=&TTMD+4ֽ* a뢁бlOB#rI+oǁy {4x2{͖ގdCsRtABWJl-Ya?O4^;<-^( vCYf+ٶ߳ _`/LX N \1.a(+ے h9slZgT~ ?o .JsQE%+0GcϭmT @0* - Z/%;4:g#*\ٝwon*M%yGP4O>:S _ rrLCXzFB_*329*z͡\`xOp:Uz\]>ĝwy\Qvl2L&`}TVaT}\W_'=N ~sTACǪ2rEozH,-x ²X؊enrX F t֊'ieD|$Ȇf]LKϮ(尸u1450@aQr"`BC $a9$o%|u ձً>\:z̓](PBwL-i~k6͘fB4cc$S|T0,&93MقNbgqٰ y:9a)8q;Ĭ¨2Ru|$-; M6@Gk"e:[f;Bow\H0ݣf,+CP J 0i\at+_'=lU7mta !\q Q."-;Y+e̞-cc K&R3Tg- +AS V2){n1/ )v`&M=p}kڏTg: 6wj72NAW37 +ۯ%I9"xz]⦐fں! nYv=xH5=0vr(h6 aP^'M9̪):8 jӀ^,IL΅8K+P]M}a0iFz Ei"A`qR&3u W%U+ʼWlοI"$xdOFJp2̂fGPyάր b C[*!j`ڥD~[_~sٱE1UKR|]xkߊ }1JI0rs=5smϮ}=UiJ30XLUwEo(I!ylM}t:yk]JCglntoϾb,oK/_54 (6ބ,1B$Lډc~ 6,^n*7>^%=f7+go2VS/\XɲLe /w]Wmr+mAu0222bxpfT@L偭iL&.N$TQ xM:98kFbENw#}5EjҢh ȼغ ܪʛ~k~~;:':zqll˶w@qtv2 t7_)ZB;̎'ޓDBjIx\ T`:zign*pxu If(QjȄn*y*, ^ w#UuAUAo/ˁbu4!,b*r3X! #UKd#[iJ)[Ϡ~ 6 RO "EI1uN\cVݾۀ񂡐 LMH%|~{2;]1TXww> v=ħ(O OBqe3ON @< BXSp5 |d(q̤2 q0L ?57Y>wcuy9_Uϟ_M ΄? -Tqg;s{>>yh yC$}>(3l𿃭Gcc]2q&Bn&K HAPm~:)al(T*\JMD䒢cJ#s1%zs=䪪՜;f\\kUEwzquGMStwUT\< [\t1%!@ٳ׽pM[*9^nAwDy߇_WNizYV>;!L|Y/H0N?+gQfoo?u)4AC|5/'q@ia^HbLN{J1et$Kʕ$M!Flcc>S{ߎBPFғ8<~ ɒ*Ӝ $#zgD~78i9[iEE3-p:Rcqj֡HU9/)JoZTQo1"O*G3Cg5b] QRUzj32-VP'wv}xpys驌WoDOcpʎ29@UPu{evͳO[5Tec؝uPtys9Qb1k7QE -,pz\/ыvC^v'쌝WW7.^Pǃ땅#jպ+V,xq#'.RV6:` %s5i<{UnE5I󳔟N#* OFɣ#Jjzq,KnrzqXF#be)a FU\Ƶ#bld|HCY.Z1gC˛PPohyags+Znڥhuj1*G2f/ "8$R[sůaqȯqXZryڛ;ua5xfo:='OΏ5\x(8h}RC5&Ljm].;Ci FmQdXV4dd@;Đ7FؒX}68FW2ȝgN8P~qTg8cޅwF&t&CA;S.1FfaHNg8Z~ Vؔ#-m3T3x|`AȄH+ᗵaEWsoG#_gJm}oc|ߥVuI}ׄ_\OV[ݻިHI5?@xQICjץd]|RS^CσvecO]⽣oD7a|)J?})VQ-;ޚ'6(']]Ga-zGMHgk< :=gU79tEԢ}s|e&qРb)P1!reI]xcljӵQϜB/9,V ~z{ʳVŵ΄1,Hi%(<~+J9IG>ӆ 9L2ͷjsR~l̍&*Qr[5Ķ#7(Xc9!깨ݤ(M_^m1SԽCk'|?h}WυiKgSdQ]S.}t#=[]hU9Ĥ&luOiH}}!ES1^k]D~a> '42?],"׻bUW+ b!{A9NT}Fc|,d[r:: 71gyMbwC-]9͗+5l2 ufK;D`>_ Xg]!vY=\^{ZfKBoXY\^);D閥UW8׾&Z!GGotڝN5nLJZVګT9k!N sޔ3ž"/Gss&cyXe?w92=V(h$52bX]2@_57MOo_jnVƊH7.{q ,.N;,M?Ya$+cN0)4I*>RfzEtQ_Os N*mƌ8#)]t &|Ē*$7fӚ#bfLZ =Mcĭӹ`<~¶BE+2Y kN70spWm_Pr;|cΞM3ց"NU7fs,=_߁N"kb.BVG /~uǏ]_r=={KydSOǂ jaP:obB;a$G'&Bjz6 D4|t)]T^suSmnoNe;J˪xinBvvlfu$*Z We۫|L07pԄԍޕӷ>sV3K3 g!*nH])YQWDj3ڡZ&,Gz^͌\k ]/FT]~rEK:7q.KyN&+ J}Tk\}N^">'S , >wG>?@lqzgЁ)F|3W̅9gӟ =q%צiΡ*@-o^n,NЩC|M |baYԸ ~J4X}F[ZYpjb%Y[tG9g+Uy\9|GUU ,(q^} %^+'uWg0~ 7!=akbz=0T'`a'f˔z-Gߞ_imE?y&7P(#HzG:ӗcfChmion}/Vg'|UthF}~͸~Aw9*lhd=8f *H/Pj؉3i sV,UC#~j{jc7eЗ6E_о6N,xBfP$+TH7[& *su;R3Ȏqox`Cn…BΧnٴP;5bE Y.8X)Cq/v'z`D 롔^'ߩF+[dI~H!Vd $@#ʎgg?Q[dE8OPn餧S-7YadUzQOT"a=ŽOIf]&y֥4,_b, F+JřGL3kL55(a td-݅Lt 1:ᗧΦ+=N߂~j=Vw` 0_,T>{F]j_՟_oVgZf.ތU~[lǦsF,mJmwxU7އ}˷oèjWhEC#`Cumle-z?LMNiA6l|3 }HaÉʯV㡦_*Fm|qK#3R*3@:6dx{(ZB슙`!6EaW3m1)/֖rto7BQC >'Ҕ4R=1P]FN) ,>4  XR+r@^]HyAF[`.3Gf$: Cb\9r9eX­SPez:&GjJ߭iBFw\i4,Jc"0 !@0*Ϫk—prWU:QTe[4j\$Ǩ˷Sn(B^ʪ74{4Dmldq&6p8P/.c v1(q:5ϱL&&!2.K1oy^CLy1^>_3Y̘oٙe}T<Ƿjatx{6rKjLBX-3EDZxRD|ߥj>'Q&vhgNԉe5&jWP.Ѩn{M~N1p0WGOQ$Xe dC#ǙRðU0sL5|3+KYȽj#SL/æE&,F]W|ãqj9 e(3.iR4kI~D/Ey澍)>M%A8'9W>gjeB)d{j(Ӟ"_Ϛl+rL MCbMYMhxPSEbP\[nR|_6iM ̞m2^ ɫ;&S~^(IM{}\\ 0o*ggi 7t 6'`M>[^F!R5BXUCԂlٰڲ=p̢-Rs5ǓwScQKHfDq.҄4J_C,'XՠFTMGMhG@q{ g'cy>~n0)|A#<=zG5 y4/,FDH |慴⼿ <̌UvQE1NC]g̀ߵ3be9k?as͎Lb0mR4{#z@E*EdCJw0J [p WtrfG45ͧx{5}H.9F:D?/k ڪqўFOYq/$-,۽qOfkbNM}o&P?Wg=z.ÓOzz`#4FmDAF|qiP].o*љ:ȿ7&n/8sd$Y/uE>r?vɸ\UzS$II]ReV7T/9aM`v g_NbcK$ WζR#>܍>3Ckᯇy!_KaQˎA: R4՛'rRt\?EU;½Sr"]nZm}6ѝ>@|&7Dȃh!{~8C9p>*tqwaV\J"Jt)ʩ:樢u=;gc\ÇR; RۛpLR)޶7[uw_i*}3Z o=zyJO8^c|Z,1[KUbjHRy,vսi+RD9[s>P4cjX#qNcDF-Ju+u~ף$ڛlmzմ5:VFFxFsQ$9^Fɚ P jxLdqs] lDRO1d7kJHq)tb~<$׿^{1M_}ShzxEUx荃WC4b$2b،~{#7'V_)p)A^PL(<0ߤz $!6֯dbhi>lAo "!NJS%1<{3@NSmqgapm3R|;区$Kwf|[l]$J&"2##ó>x[{"26$m6m)l>&'mv ~pTȚi'$N ;_(D[UTvZ(f ̈́2MwzBIN!ˠ Tr̍4ǓCi>Sqĵz`Q-䰚z&MºOVV}Ĉz]T~#*$X|UÌbdںV8<RiCm=Y=2ʡ OE}8:1d $1hª;{@/CcE*j 3E5+!\ P**3##^ eH[; /FJnA||Ol'S׎w >y,[wa~ŧx>|/Zn"I1%)DK™Xz3ƪk~ %+Oc<۪ݭZ{*}y5ꪦ"L3O)cRersIr<8Q˒% 'uEeM\N؎O3M*8ݹY" boݏ4a<`4J9'6LSӝ·*eDfj DѕbՉѥ?SK6xD"k޴kGQK߱Ii; wK+w +7NB \Eyd4\L?x{YFmWZHo'ck#XfoV6rb먷uRM*/Ax䍶F-WGIhgp bՕNw.8/[?&b %#h5-QB IhUDUa-E*Ǿ;ެq(@r0݌~ m)6Je Vk9bAxޝzhET#?w|"<`KLy?ޚ#\,t;5p;:^[GIjխ}Ga|bۢ}tU޾!D"!gT-YtX}dHL0D3* ~ˤUKbUE <>L!^2ӘݪN)vG!@8gvbW7ZE3oޘ7}~0cԷI~>5ifա[l(g͆+-I܈U lK()ENBkɴr`Wq<;B-;/$J'㸬,tZ 1mlj,axqiK kqsIj'w [-=Ҝ3Y+71WW/5V0llz0+CKe𵼿 x󱴽ŧz[~cYGVb%^Tf+`; 2sM_a 5+K Ns L(p*J:i 6:H!ɰBgA0IEt9t'8ĤN؊'­mo#ݼO GK%!y""OM~%6z/ Sv ǔ3kFJ`qYMՔ LL&Z1.f25ns#L۴,$szx3ޤWl/]0`3}bAK|qzeC/op 8Y' ]%OG%0::˙GUE-<뮺=:$VM*#7Mzsgp29en$cDי3F~`EU$ >8x$s0tYCrIڑ{o=/Rvsaæؾ]ôԓQ!¬+mI2FBA2ed7roh!:[}Jׅ8 Mi `nW˶f72k}^|[\=knׅ 3o/T]sw_MxUx?}DC^/-Ƙ!M0}x.-7Нx4`]+*ĻA0ʜl嘺e0kkgr$u n IBW}nrŞvc3Ug(+h]xa-cxL͓#~FXivf4B1(CfKݤOѸi_Bu_[?I軗vfĢ]ҳv\8RoYxp=0y&>sck;m4[ku3PW M<&~x|rxVXNhjjJcau;)Q`R' dd p=r ynYx,/ڈjZL o}KfM7iiugTɏglŌtdI:Ufo1p[a!3}s|+h0kT"7̬&;33ͳOZxPPpC$]J(tUe{$::Og{;;%d ixBqz2cԭ!&5<|1칟@|Snx9÷D,3"E:PID浦-ѭ_"ޚ{$e+k=/ZgZH!F MD1rv_n7:"/Gߎ7񾉣x8g 9N׆1oM=;֎g6BouP[vP_{,/wI<_dnIG6zO@E(ߡ Z)eJYG?Of c`ãQi|gah㖿rt}(\œ #Ӻ$ jf_ދT2J{Ejt3ǖDoc;zx v[HFE{̴(g'D ? Lehنhvר.r' ?+֥^-SԹ!lEH-ObTR([hIiU #9Rg ՑZرkM  MRb4/l#{϶׌tMfJkrxjşl *H2#%CD._k/ Ydu.UZhvGxV碶Y L;r*(FIˊN=T-Wa kH:R=C}>$~vpUĭ+N-lS6Dqtx/,-/eݙ"{CES-g Sf3۵:7spW5Q4V^#xD|՟Mzia,0@8$xAeΊK ,Q/Dƍ:5U]xk   |y#ovIQߜdv@tUL.[b_NE+V̢ /щHSuFgvݗs=4r:(J@Ou!dBU"B*6}Gf$ŧc,P=z Ֆn}?9 .MF% +u3EJ$Mo&֦P]xP;vGٺ+pvSI"|0h$*H*9[=8]]@:w2’r@m)ͰQt[[^a N]AB_s~+XLV,k<~<,CXWU\lGvLfL]z|QDb3g| Jy)"~+\H#G([Y9]<=p) xZlM~~ʪYzܨ#jt\IޗR =I@U՚; BnjW ;^ͱ~9SI9ig4g1# %|#}tO!FUGy>s03mXgXOK1lR&96r]3+Z:Ȑ|.A[e1HI!HQLZ gD4~sblKR#G]IЪq xۡRYyrhi:X3zhMȎ,'8/X/%+N ]2yYyRS,CG@MdVUEFэ)jV{!z pZæoTƢ}kI~Ыwݽ`aZˆ3[G.QPW3_V(frgu) kvgWAJsDuŲ/ހjӓH ,gIvULP~dX,cz( f3L%Jt9_I(2(*j" 僩4,&1ث([D1l$is"%018Iخ\a41lB H 0>B]c8k1N@i-Y :+dP]7"Ji7 78caqP-"0`d+h!B^9M[uT- }$\ؖ޶#WGlV۷gP e6ƣ띧 g yI ngk{7[-y4[m/mv]"`;j$^ aN+*M9κ1X6+6bseL|isgH3C([e_6\$q1ӱ'n1\c/o=ZlH|b/N׏<1ş6 Bخ;kV2[M:2knĵVxf1 ";x|ruh<# &*5ʫm|_" mX+EU;jEtYB{T q h v_c}tsUF-|k<:-U ̝2cwn|r&:`Kގ7X9nV@_N:KNmJf灙N;䧁t[K[Z'knoWOO9}7Q͠K%дc1=/W5+^*_kY]bԛq21ۡh6&k:E~<9 -k9ݺa}2F8s֜Fh]n鱇#lPm}Nzwq5EtNt~|^zx^m, 9*Y"h\W5w?6As0ZsPu eXIemlotsMmct߾wm{u;H/aź6Im'阢k_U{>,unzH6*kv;=Olw+5d }glbu}\ar[U@A U_Lҡ.`r$h8$F]9 fB_!co'{]*/Ĺ6Jg.n8PճݦLH'p.W7br1Uz}p_gp;m9TmP80I[=s=8ı봦ݛs&kŔFo4V!M5=Q 4-'GL_Nw}zpŸϔȱVv|\-~{jq ]0C/eke#S*lR: kb3K}N*=4DLZg2gD3@bEBK^fƽ\@"-(וf\+}Ia&dg6"1hz6dBp*Вä~8yJ/<XNiŷx;T/XgZ|ufukl#Fcq#ɳ F{OcD3]_wza-t _ڭc6h\ןcUnvQYLܴw-ăYɨ~l\44YǷyww% _cݛO-wS}> /:Dvf-ZgTiGL?f~$!u6žF*klE^%nO Oߘj!3i-|N4 /z.ڲj S0C":5Є0S:`Yio/k&9C߆]fKemս+'Ðfj4"y_X%ϻ?[Gr.Z@'Ƈ1k* Εqy%C}>ҽ2'ݍ\WWG^4 zjVB/L'Mvr4p␊РՌD m&[ u9aA6Ѧ3⸐&fk;1vKF+H8.*~#!y;l#C=jM\)SGFuSP+QGPz-:l<٪B#lFr\Ш~ݬLX5\[ɧC~Jpռ*#[=>9 KTSr1Q4iT9I^XB/zy+MEuʓNG6Xx]8L}+dY,|lo)v=8GOV TxI|)tT-Ib&cW<QssJ!QINú>i_&e8hYHTieQ'p%U3ZB9<}1xBJX_GAɴѠK-N'?~ j2?'ŊƓI)v"b$Mo1=?jiA{ͪ}':^5Qcb)S-up(Ǝ6k}usww[q"rX&ϴz[-tc޹-zy"EuTintk_>QYptي5E2Ub:_;-?գZ/1ǵPuo Wb3>ο[ l) Q\k@YB>>s |qkPX{g"[MsWȽ׎>nq1FJ _0U7a[O;/BƵ+_[ TOwMj/ș84,;oPz llHѷmZi1hqLP}=1[pR!mn{=[._; G^zW阚.UR#֘(ITWOta3g6>ZMZК_j$!X|`粑v媏"E|u~GZ÷yQsCnЬ9})QZ.sA.UAaQ!{Q ,Uf+x>r\jѳHk`QܼQ&-ԻX~.Y]ݮ'{~?3d˖bm]TWr %: NF3ʅeʮ/+ '*xDcR!*eG8G!9@<9vI'$}\Vz_k>{H~cLA~s!wGh$wQ ;kaBuӽHUlm7e/UUX n,|yU|ILrzoLokaتXÞ7ي~9iiQZ:`CI<>zz'(Gw_o| $}OK) e"9D&cF|0;bo j~;/>z3*ut>G ||!p3 } ŒǶ Tr1ˏoיVvt3U\dKbo\Xy/_ oh۷oׅ,D0UR(DJ|z]5ņ-NEya  9Ϸiwd!~jgEbJ RfsjYsN oASCFE!:Flol~[M\!pň Qnzk,F-VbgWS'TrUGAaʖRP%|/k-X| ]H-~.PɨݺErC荸UY3qϒ珓} lF&lO-R~]y7?'ۗϞ]6~r|=C#'?>}gbŽeU&yΞZ}\p–4 \=gŠ*sʘ3[eB{Eɠu%mvh;W9t8z>K,UU7_F[zƚү4_NY)75#//aڅ?7?NPJ>T:]cGEUJ Esf〇kJ)Y"F&QڿCzwN}ZY'@9πvX&?:yo&/ljZ"Jp9 GhIwGd0,3ىv~'O2f.e )选wy&JT5 ue;?'6:W9;Ki񿳷RS{40Jylh y;g_52E'r$0l 4vBwTT:nYNs>Oe?sCLR,_<A;ٶ)oox:vO~}tݩ_7S_@*z0*HP>O7/z |/b ՇJy42 ‚,reP17FMAIӈSF_yug>ؘOAakr1S>*+-Zn7He+# T Q]iOFE8LO N)ݎIۍSTR:ijUUm:aBC PGU;E^XEϠ~K=ʗ2Z=9QW"IqRGcz3 :2tboƴ¬fXWn*nNNz &El`3'g :a!J֔ODD۳hn"uѲc6fb۟"v?׌4l޺ {uAӋ;DbMԮn̷غ&|-j4bp%fQV .WcuZ? lgK\g_ZTGR)mXAm'Gs`?YUQ Q@T$?趇?,XjO?ɛyLDGꆗCNQ BRR D _0(Cܳ+1xăxܥ?X:X^p"jJ (* +Rd1L,Kr ˍ8fg`"<4C @R$AҮNAF@ŲD`\e(aJAI*WPDPԚ"( Z(ޓLqPŐdY)9(044vfvUT@@0O5!Cn"^1`b)Mܧ(]Du2VaK@ˆCeHddK)LNIԿawRxx#1b D'͉?3AjL/N!1Ĥ)Hhg8aQ\1hfnJrqytUg#y}7nh ٗїM_?cIġw<=hu^}˚\Umh]VtLȥ@<0_ڔBFGQ͍9w $r{K%?3Gf~ %\Uw2(lomǖX]4~bT|$a5$uJ5WYvo7Ns:C\a7 A+nQ4*Q@XB  $jf8S3"m9kL{oZ=Ɔxg~-z Оa%'^| ~LkTdڈE%c:&VBGkG녦3ӹ}0'U w&_՘'O^ꓻ^dtwzDE")M鿦)vv,q4tJNCĔ#rr'ɐ=)Ig m(n?ٸ[Yԑjb{3oU/RTeH%SQDt[eEkoL+[˩޾Va}nJTsdr!Mm6MS&d4L>}t9j Bضj(+KʿϷ{ j8s|xX=rb?oQl6L+Bxpwpُ4Hkgj`X7Yd]@9<0e2*ح ?l/dp "\b Y.2%24@LPĂ"C +(w^JS C$^ ZMNw櫕ҳ*6{05.ΖyPNEۯm J5LvuWNqj! !3hx%o DWV$#`&cڂČ#"$4hXC*@0Wە|E5Ch;3ZAaH+` "X "'%J1ICzWD%E']KFr?<?d m̬/jPZ'@_yacOw?9.Q RDrh_H$Z0R)T-jEىiiS鳠CX $͓c(VDڑL # k $H"54/ C9r3J,1p֮sti*KzD% ]\P 34tӢSV~y/Z?VMEJh m5Ke&UB5o(66-d1c%ʪi&h~:q-HQ< H!3pᣬ1ۦeeKetJ8R;ePW0Z3Q 4ҮI/|.[7,&Br. dfɱ5Q`yΩl"s f8Xx#ZŭRV"2%S&7ՠ1j6Crw͚8VfmcrZj~or$\n&`AՊn*J3 3ui۬ihemm o|e+N-Ӧ-5!&LߍP̆H"rEGrf 2aYe0˘6&ˇQ-wLm,ԡ-*):j.1@)4cAȊ8SfM0Y~4gD9jTZCM)Tco*ѧhs!A9K6ַ`349jV"Ot69dγW03hETpSC5ᚙs%EiwE.&9 z y07xd!d^/Zv!T2  ^fHwr8M9 [J6ޤ{Zph{p͖du<$Ua.0 ::]r**r*ʪ3&wI) 8֚[YiI4&0oLYbLWRqRUFٙ%3YkPm蔱샭kݒGLf23SM̃n⛒H4uxQĀlǸnX܈8fJcD§ndfNjXkXa1Mvae7fO1z[l3#I5QTTTT+#O/g]@n7¹vvd:!IJWJZ7ыF{3CDx@1)8$Ci*.m(xo CNmaXٜ8Z5TٺI]3<`C\ʽڅV ˏ1k.u1CR6F^bƫ;vf fFx;00AwxBV|zx80Ӵ" [kv-JjIPwM"T!8.]ƞ4iΧ𖍱ģ"{wzCNfZ&aa]왼S lѻY޴#ZZV_ i3%2Nyp6Ԓ;ˍP7/^VsgNU: 6C:ׯNz7&}=duư!͍2 /iq ,TJBiųs=g0UJ(!;-24.zC4:ML dݸ}78 T)f&θPPJU*<$@"+BU,LyE Ɏp ʩa~ȅ"F(qQ\^4NOo_ERA?'tow25x뽓d˃G|CŌ=yCD O1q2ZE0^b#jh3_ ,s'Dtv5 b)&I`5JFuѡVp0Pm!އ4ܧf3<˛ 9oè~&$E^L8`t2UvcHbF؎<dp`\j& Cj;d #C`͌h$1R1+;bZq%Ca׀@ I"YD/!0C2bO֊ن渽˽b{μGBi F =UF"vt%pEAbZq>翏f0Ci, "Ad;i2byV^jhrAD!Fd`#m3`勭vow kY5F׊`Uf5HO~ք2@`Ovy4b 50け @BqUf4068hpGAR[m: -Q8e77\ksvD3 `gh(wAɗiwe_U$8U/ TWΆNJI\dkfi:6u 3[֛#R&HX V};K|),s4afH?҅ JB GpL|b+=u9,B}Ԉ >fs|܍k+.3E5Z7"Y}!DOAG08Q+9s0,̨18pU!O6NAOI32!.XKG"}`5L*i086}#` 0^CddY!-8`A4.B2;$7Zrk.0f a=wIs#ٸa4Ӎ(3L}p ӂSFaL#釜h },y4F&0+*Ϊ[ر. /os0 >0* Q^ iHJko5ـd0Dpog NFMĮ"l`SQ`#S?\! VA _ٿF`y:h(RN2ÈN6%Jb2 ߼@$CP`?R =oQa0Q7Qd|ӿY4Kgqqކ¹n姮KX*q%P_ϙ?/gxԾTez{؂.u>=k+xʙUr&\މ)Bm~Mzf8Y$#9ܹ1#]1<© Tpbi8~[zάH^F_c&( h? Ǜa /$$ %``!`%\  "ADToZ噾:l9jB:}]ѦﬨVT& @W_K9 M r?azvƁljrQ/Yq؝^2Ip[iCv<XS JNF"0Z=2>#Q0u">?j DE?W~.×{WTڧ}OO%m HQ+wV"A$cc$]IzlB;zՉF}Em,m@Ax4oG_~WrjF9mYf$ T[vg=utY‰ϝV3YTɯdl]kjď~褆$O<gzwDe U-,6mTU5kވ-~78:O9x/ĢA׳vLeSG"hfXQgG1yхVDsC1- ;yAM3F2ro{.kFn\p'!m':J{uN5ިnwƾT }S}m9NYy]Ӥ8ʠTI~Ӫ6O_\h~ 9tv#ï|ud88r^*2*ʌ¯ZpywT1IB*T(<5|!xT|;qφ6)QʮNXޗ0Q=Ɓ}=<]VNط=`AƊL xEӧI9U|g7+JN¢Ynr-d{Y|Hʸ_W*Nҟ7qrQ5Tr?.pgV־cyܞNFg}\W}ԟQ}Ů]Մ;;tr"C5?9)~VKb^/= &Tp~ P`QFS:);:i ?Ӗ~6S~9AZCP<o *3|'nxۻzWk\1<]ܺ,}]u#:wBftE0g'|"}3a*0 0q[ɲe߷`>z7݅+2s#ECﳇ>j~zx;T=0 * T"Z> &C#ܫa1[:V=/T? whWpY ?!*#&RJm=[a;.A8Bmuj}RF/H y(}^:9?wqeU2_vsLeK$,x.YAcz~*( WeII ZڦL5 f`bH}a BԃO,M=ݰ[;:~j 2Gh|x{Y;}qhڃ;ߗ^9k@$I#\B ` Ti B% JWDw@P" w^mSH/)v9$z"WǠ_ccbq|Gm{[Ga$ 'Qe8LX>( odz"iuy 49>>9gjT靈aEȄX)> \l>Nr~I)HlV64~WO;?\e`I=>AA?ZR'/jqPMDqD7P˶$rDHtk_!rʾ7i#MV?(T8=E-0y\i{y~Kz@ic l#ɤ!5 |R:=1-4TwPsF!J'c.L,}_ &L՜G'կYζp/Al>|N|!3)N*ZHM&nUUeUUTmFmMh8H<ɒG,vkF7%RkY4O/o7rm$tI!$Y|8G3UQמQUZ,̫);:NnRֻu>Gy+~&NIߪ`ZgM M׀" X`֗2*Z1E MdҵSIH%Lxot̗27&ZKe`QN7҄]4'tJc]s*a!!pn?k|vU*ƿ@UORq ʑ֤[1zIR&E"79q!2W?t=<SN9ʩ7[z8)­Ok,0" GF#WH!D],eU";b)|u4T$u0k脠Vm0;|?E1wࣶ+4Xnut)0攅uu8ypD ?! X@; #Uˎ7p(>ݠ`@_GҐL|EVb蜦 {vH& L?I֣OR~xpL=ԾyztP/^vI7n=J1]~?L\ L`ƏqT6jg}FJ/b7A6ҷWrlFzr2˃6Wߓ )K.U,`SfBn_ǟmNQ6q[h >^Hn ,zCs)D$ ]9 ]]a47U'A4B6r,8ٙ+IḺeTϺwdn7RRe9@s?.MO*mW'Okx!ʱjj'T7\m.;!5ڔ[@ -௃I#6\F=37яImp$d/\"ޥ6SJ[Ȕo'jBK:ϵp3MlA_4;l1sJ2>]1q 4Y (ZO'-Y *o_{1|8)YSCW/*Ǚov(rwd2XHӫ[ԡGATGH=زBCXL4Ьy9.VKҵzPhYƦ^@q?PT\Umġ[lp͆\ o4ik(NʧC`9dGF`4gȴ$C*z<'orw[ƴNbB !/E]]Cx3Sw:.^C\,TEf_-%I"kRS|gpO*];6=xg5.@PQ<@rJ& ͇<3JXsҸ=С9]3n$j"ہ8Z[na!![t$*q'󟆾3d }-@DP/Q'mi+*¡MJ~g~v"-8< ⏐吜F,;D]Zwq%\_Nj+g2am}*|?yB&a"pɩ;y 7ؙMZ !"(KK)ỷh̒v~:R酺Ze3iVG!0nΈh'˭0Ӟm=4=p6MI"kQDDMql[l3.f(ȉ#:٣'i"|)-so<r1g0rO/Tc*Ȟhvxbs%$ES=(ߟGwO;*;H€ٯy/*grwx_7,ʙ=Gdjꮺ{\{M;CF.@o 68bnI)z*4ejXǫHzTT:AMyG&n[?N&٧ymVsgNDNzOY`]>s=;'9T4O*z\q_4wYOh騐<RE&4Oz(Z zƄ2 Y!o 'I lJ2O.㋉)}OBno]"JWF|u (r*\w=^SkAXdH/'{TtrApA^<}~扖/wiz!'=]LTəo ;EWI88!61o0SjIe#IKf.&Σv?=^?+Uʪ=gĕ`lG*W?m)}g^}|yrpqF+=Vޗf0oxA 0"@<ȴ[Nm{'|`@tQTk?zJyg֕(P2R[&Q1aCUJ&0m8[k{ o Se1{MFuUIdq?[~U:2SԒ ygy w߯mC}*F|כfdx41^WK \X&|yKVide_4_ R)ڡRC3 $R]i+74sVݖ[.v5:Z&IAåu l|ݏt4 p@QxZ %4QggCL̼G;tעn5!_I;&98og*abMVFNR1SȐG# %k" XOo{o|jQgJI>i-v~;yQsU0g.? d2$(I*aV9_ e''ScZY2!=p&b/UwC՗z/]yto$YR<*+?QT7_0'y9!AKu6吿突:-(egZEX RJpt?VgOg-fM1LĄ#>f:Z+. i@MoBDٌo(0 V.6}+1T4bU+* 0ylLGO(7z EE; I:6Dkp% 59?o_­WNj;N8!!F>r#, 04xY( 3 6k{S_}">ccDcT)}ih#`+5ǟ;k2!*9! w~C7aPjK @x+?;/ d޲.4Cj $T "8x'9^׃#dD@P J!:)+d'"Պ(vڣ_<[0seA4-:_ZMt#ef a)jis2X<;lD-T80o*'%D2o:u~bl.a-'B'iז8M?Eh~JC/Aro/Gk|UtXtm=zqB&1bWl_q \&EWH^`;$6i  z1QBQjCO8.]X)`scj##q\dyA ґxsS&S<43pf˚ BH۽ckLlLW q&g3?/LFNUgo|.s̡>e7Ҭ3 iܢ*Rqf-~ʥ/Z9>,I:DI %'SsP&i%ID:TPp㮾SXW1\ |&n+텠_+#AS0sWS$hKyBt42ȎPz &~yȟgb1E>@ #r"'aCR~^}n_f~m΋MltT^фz-quD w}+kb͈e*tg!1GI(I(O,$1}jrN/$.QMjӮTX3J2pqˑǪZg =yNg &$^ʝe;wSvz n6CTC,9N*D]FQv}<8?3~QbF?5L"J">bIa5٭G~Œ,1 \;9%OjݒͅRs>7Vohli.V=0hM4H ,L 4YrY>Ow,Ee5q"=ɚC^#.E_1O|'_f} DꀧEd,u>M|D"km6B%!Ad2BG^A ov@@:ó1y I kF@qOgZb! 0U8e^qv&ftY%U(2.R55mas*Ӈ<6lQ>DP!{=\Nܡ-UT'=ЖXM3GN :79)F-nhgϗ6uavGjuU%.u)Muw΂՘Y?1|Ot]u("ٿ0&ʆqB fG6RL3yrș*%\4哤.z""5rv&ǁ c↍z[$B#`T⭘VC3O?ġ HK?m tth\GGz;tUD6Jdw v#E~FՖppi3FG<2»C<EUzgt4|C05%)?~D~>O ,9Է PҐM.D"j" ~^6GO@⍸GI_Wsh=}eHHLLOOh^-tOvA[?uP 5=^jۛ:zH#|B-v sҞwʹ=Ȳqݗ{-Μwtt5= ϝ(OXv֬qIh}䧍60wfn렄/|@-,Bȏ:8pnIVT;wsn2W@(|-G{^4 ic5%"Ǩkڡl[\EiR3?"~ /Gsz(Ԧ頻p\9>kOg()XQt=_.GkR2 ?]bLs)7eCQGAXnKIT*Q2o6ǩJ+oNM}9 T[-[sA7QDQPX 9U{aC+=A Q٪pj`kA)W%A .ǟِ3b1r*$/TTaT=84c* BzsۙvsO}Sk嗯Y-P@-g,5j&dm ]˖\7- KRFJߖ,lw% 0iZ"2&ctC벗N+CP+Z 8ǓND[(nB) ;9/Dl@&G}HǿTUa=X{=ykv~%fxzi%=ɘ۽22X93sawwr_5?QnPB@`a $J]]N~:㬉Ç+ɎT  /U:=A =P9߽(0&C5~xB .["9uLGO,\"^Mlv *s"P%LH[:g%xX8Zx\$*-, -׿Jx}cI6}Srz=ΈNQWĝAxk}3xv'ټk0h(Wond<-$:3]΢N}+u %F>qEsy<9kTu &B>Gÿw~=O"?wyRX[ R0U/ipFU <"Dp\LxZ@kmQ(l&ob&vr$9LFFVV]YӜ;qM =Bsl@UMXaAWKfoExAt@S!ٳʬEJ7(o IڎMUB{kۛŖ78&!qN\La6Ui9*h L֬no:}FkRis|Krl>YvHf,3UUD|߭ Zhf7Zq1`Cgid"?mmy |/֛W>2dLê̓Yz)Ey&džwΈl " f0szyлN{SR\Hs/ ZhẄ0?@0#~E~E-͘\c'&4r{2x+v~QjٷS_2{ ; RNBo$BV,<}׿K7b^,6`F:*bP7kbw++vi Tԭ\&c aKgk!uΈY\zgRR˕l%\IQ{m<{`W**cY[\)],_w˜΢f;'G*7~E)X\:5ncXQ9'~%&V g:gԣrӺy9O4W ,ݶn6/dDǀDq0?F1s?layCSVONnSU`OзqG~.H31CϡCoeRDĹS[=yUEg-T9,Iv?78P~(+}y.os#A*4 rgjH EhOC H-߶%|/8n56eyYfFP)#DIpAA E̻r~g4Pj zQUGz)򝧪d☣]n= 9 -TqP/h|l/n,hO쳧O`HOyʏ =-iοvpht41$9ad@5A$G 7rEKR5 OO:A6Bq)Αk;UF# `D#PkFpkM 2&3Fagl\>V{"3 Dh$=rT1b'g0ϫ2Oa<Y[_,F`6ػ PÖPާr'A.R Ea+d,h\ 9~ofG oo?<2!ͼDJXevoN3:gq/ˑZ(J/;^MD!$>@mxCv?ы{7JboC&ܬZwJ>37Js Ϸ ʦ vfi:{O]vjƾ>t`8IFK@ı{ ?>fHPQL&ƻYŜW3[;T]n9?cCc=|qǟgW+V+淌bS W=̘JE~ݹ kf+>/0_mp'O,clH;Tًq۶3Sk9g:.%~^Kxy4t~?<"TxX] /ӎ)?ӚpE $ 7xQ_$ѥh3Gܻ|;&BދmmKi"0|Xc8ߞdzkRas`̪G%hq툼9MʈhWͫSJw^RN<#rAmm K<7醞IGHI]qt:}yD}}9R񯻿\ 6lDoֵ)}9 kr9<*1jI1bqeVGYS{R{0zfȳ6дJgѭ2ٶ9Ihߋ9f޶ ζc)Lu}ݶ6yc'MϞyX} pm>3a6af+-γ QSgF{UWץYW4n|g\t̓44Q-mЄbUц3er (#L]~"e]ӟW렯-*9X3p?fҁM/^P>HbJi$(=~D)%Lk̉՚$. *BBԚT ?"pn`rJZgl6t C4jԊ\N (k3&mlXg+dY*̽mto! :nMYx=-kۿ"o33 < ;']D+M yKIזm y>OV=iTCᵾ\+72hcJ%JtZxh ,=<+'2xM. ,@RTTQM-(" SQTW*"~sBgGt`a9* m~N7'~+e33״9s{1[1g9s9sUUg9sTs+9sپ1bՋ11g)g9lZֵ&L'^͘X޶y!ftCMU$IVeUUV}^KV^kyך^kii:[&EȮZn}s/Eeޡ~eRj]SxV.% eB++[&J+?ձ^rRhߖ!I$I*U^޲3V|>oFv#dfڳ5W|xN̜ z 2V ~1u?_DfCJ(F('?Δ }[Zx3<pYWxVMJ?by2IA^z!-%eIC$GI5Er\| 2V@ꤨ){9+oJIuLX%Jq'xm2(p^"%l)%ɔ)Ԝ\oUvTYm9vC D\u5VeQyD4l;?lhȢ((M'̇'*7]Ӂ4P\_6Zu'TL4^Ͼd}|=/$VAJ 4ǟUoɇ :|}Np=dO OJ>QmCZxUE_K9>ibg׋x-ˡΫ~0**|;'qM)6A'd*誵O}397|_2WNES?mPoW]⟋\^R &OO eNO&mS%3kãEx4L8Cp}mZT%}z2]c -g_vvdLc~sCf%x>  8?d֙xgtnp,C g ~NδQ='&VUܲ\ [XKpORj_")K`7W63)ߙߙ076"},p*(OE([=sƒ{y^_qq>cRUUU\܊( ,_Nk{ְQT¡M 5?gKfwNE<7BϤWĸDR^ׄBua:&K1mZc7|r!<чMY &~XrΚx)%2Mvt?gT:ߨǪHOI\D:TLPKHGaQRb5BET0UPR;0oSwaY>[ ݗ[G ˎ˜Iag/Gf8nv_ele,l\b_h/\ܖK%h!\f6ffc:) , 1! c cMaE̮%2E=n?D  _4G'w8k<[ZW?/ys &U%UDe1FaEQMYQD,0JAfeVCk% KG|8}e;>G9Chs QA=tN\,wLO;U kۛvZM%J'CCY| [9 2F 0?TPbQQ˹&2u7GpHrc&yOsJ%%-33o0DPc׹v3Pn?21-~_u~.?&y$fur{)_<(((CBqa\x]-UVixl/$tܳX~. %Ld=v/c%ir*W۲ȱ[RjTDa,FXL:^¿Y3sEAyt-mf CLWB6PѾV !j26^q-8l{턝{І"nU~Ά5He/$nVx 9)LUe-;6)B|QouI":%^QĆfsy>d= '`@k̐y!)'z[ńW{6.I_B.3pI:gNzU+/qڵe zJߞS,1`rtq8/[t^lD̵P㥵7J,ȟeB(?shwD%DqQ5F4 Bc dh [4J7X63qQ b-iđB6ADy"DƜ@`mbQQ 1 4hޣ{[= ə#z{~iasn4 xQLXLW iJիKCE{yKؗp6 $`(&2sDE[ѣXQaFfQEIh&elhF2&Ǣ c Bkf1zwZ8EEf3 f9DTUQEULmUHM(4`W!MLRRh%ݨ3D|J@Nߠ `CB}TyozhpdEpH*E0aibTnA|xSg|vXhe.0r*Oء꽝EC hi F yPB2 4R@ !@3T4̭KV"hGʒ3~knM|=OKƘs]a#:Y1r:>ԑ} WVP>.]]wtzaAtUX Tok, <6*5~9bwM[B(?1~jp,eO*79Za!3s=qt%K?5bQ;џnKdPqb P0>burZ<pH ӹg@:Fix&"N]G-#p/uL9Cb\hqЍ.Y4BvEíL~q0OZw?`_aɺ#)%$`jvs:l䈲D/t`p]8%R;,YFKSgx;CAL Kz%u۞**!Ɏ8q#QpT}"5qӾֈ}QmjzwVMx2;8+ۙ'[kaO0Q;^uӎpw3YE8Ez9̪bΗSM=p{A]l_/V8j Z:P1_Eu꣪y pvI {(4ypbP#߈J`!:|ǽv@MQ"BEmq~1`fa!qd!iwr@2^oHmNF/ \`PhtgX9M4Ӧ6Y~] !6fV-cqŸ8Bit壧?(`Sl“aҎфdA) GVWwNKbcc:yR!h"ީ6k؎C "kE4A;T&.I>g9e2|߹A }e//$ R9Devgώo*ԻFrJk:ArS0R<`>JpGOҰ}4d̤(grLZ% @u,Z2߬];f l<3?[*CS4~I|faK;G>z_PWÐrFdu Զ[bf TWY6D!07o< $t,J&rC83dS5/`խ"Pm  iӏǧ/mc!?Qp8~>}WN%`srog8z˚ Ioݜe)k܆bO(LDS ƪ8vn V"$2Io#"}xm$K燣sa+w ŏȔH8*-ShkR@N%ȕg| v>X~m(2._=N^|~mpIӟPoHqqgx]oQRHeTQD^uM`{7v2jT+!1vG??<qMC@lYq_ƞWbJVkz]p>5yU;f0_L14K":W{ޏs6{<)FTLEEF}?\0U\7.kC]GE.pWӥPC"|)LlJ**T*h?NCy'RW{ZHή]7M]hC5Q'q .DƞJW 50jGxD@TUz;Ň{|X8*# jnCQM̊> |6(6ӡE $ X45W♲oM_ځdy@8*kw͒iGLa5u TGVtf%C\/IC(3%S8=,*ha&=N+Lj6f}]Z*n wm`a l|U ܗPv\ *~b)TQr p3(ތmZRqE4' #삢:w!uxf9'Uús-- +Ĭݝ{E'pc=?m JUg1g O /u )ʧh]D(SX?2$a,֓_q)Ďvi%~r=?߬TBoͺ<(8E9&s1'r,I̫COn:QKP"(:ރq0ܓ2@ R,D$QB 2L#Ib%ʆZI3{20PK &1J( V"@4C CA|n?ׅͬ!C{5el8c *}+?F~(7r4:o^s6J.Z97qw(Ph`zZ y AАpC癃ȯew333uũDJ"%>N4jBU enƾk^ܐN pmm{>vGZbv4%|̳ }?Dd]Ev?aZI&W ^oePc~IZeLlN<< ;5|V./o^ѣ#wȽ$lXw|>y{?B;i+y(je7R >C%B@7lT28@mUdDDBQ SuH bi: @*T JZ`l,Z"߄:ϔSuõѥÑ%u>LJS8ί.DIP=BzŕfsV ZYeqw*[K\]fi=PZ6?W]R?kuu9P3ĩFX |<=i7Am5f4)r8[(e?D}.u$Y-?9!$_ek4yMnIѣ#YTp .c-qQ㚞CƓvvӃPO䄰 ?[mzdH 2QQ%Xg%u w;#v#F0$ע%>pi6_{3 Q7y 1&;=Wrd:lPk7)%`"ZZ$QHLb8ЂE [bDLdL!a]&HzW'OIQ?s'x?kBRJ]~IvA"N{"y"FD&=pyse75.$VŁuh՜cPQGn0or|پ+xs}phNoŎ\ cPJ"0Ӆ1dEg #/3wmғ `K&aYI[ҬNQܨg;E r}w҆\X&Bp2z`oL5zvZr,Lz31T?@GdShһ;wFh_.y? `YakPbwNqЯ- %Yњ",PZ|2X9mЮyIUAfM):6~f3s_*'oqǟn+7d_5)ro~$'fjmƈ 7} bo,6{gAj9TW 2melJ%>sOϔD'ʨ! X(~zا. OMH\ bs|vYZɗL\<Ȝ?+9S-vy -t^ߟ|/P[a"а-!|'.FŐ>.uo)Q߻[Oէ^iQ_(.?vWY~"jb9L/ݑ=+?'7ce{6q'bS" @LCp* :]xAqPI({UDB{4ik.u]jZC10(@s\۟/ҁHgGSIwEvL~j|1yYP|ډ r8>NxT$z2`?Fq/_[swb+_cYBըswzfC]򞱇zMW&r}W|m}47A7@KePv4x &$f%Qp ATyJ埆RzfEr-#v):#vlv2Սy&|ƧチjlU# |4bcmȏ?bMT~:ZXΖ\ ;8FVCm ńH(B ,+iF)JbE"d 6% I̾шxHPE)RHMYO]_j|;`}":@45u6F4Ubwq?*JsC)fpy#sV~hc+X1Ɍ+33 E4r, ,"ClE5^FobnE],Ac: )p=2<dS6r䛪Sr0v&Ehd+#xV&}Ь]YHcQ!"I> ?$C<5bϐ=^h~u{:OOcgN>s(ce4T*TOܩQ("\)\r?hQ?v:ډ>(q?~o~1`̼<^"Y4HdY KD&~-[NqDQ/o-s5 q3:|09I"!Ьbړiqo/qT'M "X`cR$ߌΪQoY۝bAfa a6Ĭ aӊaJ,GQԍ ̝$aJ~42KT 4,rzsUm7?gDS 5_~ $/iP8aa+0!51Q1"c  *"P Jb h&_1_sldH2w7^ G'5Jv7P$ Me#pfTDXXBYgDʂ. #59 pVTL:s[ ,v}A{,g9jKiWCD,Yls2={?gڙxL_e2DuIQ(/gR&kQ)/E@XOM3@d?S[&6$2/4Ñ,QDj1(Lx 29y񅨜(h]Yȉ S.Az$N_ĭ~liGKL 2ǐq ,&CL@qk_&grs-F*dǺb #٠Q$ꛔ8]iW|nV+H Nz 9vAu¯%rXQ_,W0(,8hњ~:)7gfVjh&cyp*Uv^sU{QH(dxWJ]7dmqA Sl|yif)zu؉ۆ{-i (}8)۫s> 5 @슗{1q!e]tieݡ^D0oӉ|vzEP A(u2 ߃ojHLsi^{>Q ;wc7ǣ>k fAn!.{͏*Rhs,ot_׽P6R۰dqu$RU~4'w寐/9sPw=A1>4UL=Ξn?v~rorMNCLP_ ߧ)Et&6í!!AئYɫObi\B̓7n'K8ع'y6,"ilc h ͵i=PA<Oq>R~|o P]$P|cb/Ng!Xzo L9[DSpv>0UoMo}.:} =3vO7ʩާAlcY )o+53G>]XI(4a>,+2FYw$2R;Zpz_btktu*"foI[AT= Kɔx!k, F#p7,N=?.! G/MxYN p:u (P51M,}w*nsvխJ0q0:f\XVٛ o-`aVݤ8̉0ξ14t_{E(6B*&eDr":콝Ԧ!lX۪ˈ-*' $V̍$̺I٢!]Hu8zvp&,$!7æ;>貵ɩ+k P6)VD֓BH}]-'&mBFlw?_31]GZoLPy TK ?fNqHHaUQEAl~V "On&!. אXEwT."i(dUPoO3ǝy>sLG  T5 E$D'?`wǵ4wz;[,dA3f颉:^d$!qOt"]7Ad7>VqH(UvY*"";ʈ~lw't]0iM28L:*tUh4"./Z8l)=0ŽYdl}GCl??0!r&XwSDCA'TcԈg %KIEP!A@`@℅XM5Cq/!rʧ$G<+_;3|fQT3L_3t)ȹE;b&ZMk6PN=և,0Ȳj**0 $Jl0đx5^E @ gn1mn2F’X写f6L԰lV/w&`b!#V 41ITPDaOHMADQP\)=!1Am5^U(gP]bZ* QOюj>.?dT%WҝLTZVFZPTH !!Mύ6`uR@7 9 |O 4k>/B7ċ0mODEn/^ɢ(w`b%Sv yP<+/kZLw$A^W͹_:z4 uM67v[pҼp"Ďto{Khea#vnNcCA࢓0k4ʂ)T'!Ђ7;,- ; =!=vF,aXt\V XG=6bQuqpʅD إCQBöan@y !$V>6)AȈD((b%^ oasg?sCB   ;9Xh=+kg--xB")Q;P䊁ثvG՛E܅+U]ì5 iM$y@|&n<^CԀv/o:Pv|~gBkUX)˃?v[% w }0_g|:)8u1>Pnt ln օZl\6 4VstDw% : %R/ 7z_ь[hw(y_%xG=ï*ψq{KÆy y0`9;:)K}dA%-"DczXjZECQyA!܏xU vOth#Q=uU8A"ed>e `o!뗝 Z]YKEjBJN4"}Hv(b:: Zy8 $ݢ/5zMM GMZ%H }[͹7r/rف耑=-()$ρ8=M~LgoyͲ )^-B2Kѝ΀sU{2FUVE*$ ~]C  FhV.{;POF( ]`'",5]1:!\aƦ&p`G ;)ysJb)2_ԿFz "", eiC o=A};OK*j!;cY_Z6NѢH i CGcls¶8HHoDDzOD*ZGo~* Gi$:@h'hTeA*PM .ހ@jW\u zx_W]f". C`d!# A '&2H7ts>ߨ 覀̄GXM<6XcM)KCP&иRm$*3t8T86ډAGEe{(,+^;Qsb8M"[o /y&ЉĨOV &jN`FæTZ]w ?]?7H ea^^,ӷ@i}9w\β,ȌijywJIA_椭z'LMgkbRpSH`X$̂),0l(\`l酤iiy`1ዑ.Z!Y(cH!$ [a,/J]MtOg/ϫOIJ-BLXL.EKX=)C1"`R!(I%J<ގV*A]RAPFrhJBRv6KsϺȩ!ran_F$Z@u`H'lEH|1L} @gO!iNL"Gd-I3 sWD]WqUsX!iz!N;~i#Th7XFţxps H`"aDc:.h%eB05"L^qi[ MQD3*)$P'K!0}KG]FjG$Uc) $ vʸ21 އf bBmǀ_ 6&Gۖvvk?j!f6}C]nz 1,gmv]7ҰA5EA$LTTTL 8zB,21H`3:[if쎏~v, vÓA@.A_hfrO<)RD (JbzPPN[ƢᙛmORX攠<7v=Y{}~wVEKĈ:et[I Fu"Q;MZb Ls u#Ш ˎf3;~c}[mkGKil3Yڨnx;.hTBi4aB -[``NF>/pK͊q7>v7ssyO\ G̃^f)!!##h%xMn%|Ma*0 lCH?7 灱G((4h"R8Gr7m&HqCb;bȅЊjkS]uv'뭦lb%1}g˵SD4ؼ^j_jT;M2E{{ÿpd!`%ȡ:@=v.-,mXTh9&6j6 aK#=|p=b^\CJG'V095!9T]ᇡ4!A`iب-lrH2/[4{5,bl,Kh>ln'.Pz(ǐ@1V _@#A D:|xǤ|&zDVY8\ mi/fɛ0rEܸ!@M›(s0"ᄀ NaiY ]&474訚"\S;lycq EàaP'|B4H,D(g@KxKJj6 U!K郡X4 !8ɹ0`##U]uGO4;+DA Ď3T=ƔNX Spq\V3IBž( cKsI}wT7%@H{jQARh۹qSgI<"! ۴qvİG*HhRmQh.Zū/77%7L`A3{Dn*yNgĩI4(0;(\ Z H92lLrFVteEf4 #2hʚj26Dx7:&†)B J5`<Q6=Cvƽ"[d5™ )*Ф0+%lTJ8vv/XOd,Ah684Ixbc80~Ѡ+x]/q ?ɼBZ4!8.X*d&K4CK-"?@F Bm"H$ C- |3 .0Wd3bB!oeaUUQFqT88RR"!:aHw(LaBf0iPVKބ.p H4DB@L*#X_/BUHzXQs0";.N0Ffn̈5Y@0Pb&7FzCВ]T0Q`:C]@"Ȁz,̩2n]#|v oi\ .Běr*egni%@Εk>\{-gEC$H'Ad ^PF:GHTZUa >2usq4 Ě SU/%Y(;͝՚~O.ciB3uP0$$1lwDVfUU};j 7¢"8vʪJ[YlcQnBHcrFHVDclr6dP$M׃U^^qBէQŀ Ȝ&`Bd1)=)?Pwmmc6*4RVvxB 'U^BQNCyS$+Uo)&`#+GC4lD(NӜrlp;5g&pW㱈 m4dSJ3ˤ-9؁q XX`RfxWMbߦ[89*BɤrB4-A19+ECqy=PUC8o1|!b+?1 'IJyz/6S x(),F[Zb fdh h $(d&XI"SF`c!g3ғB(aI `QUSjU r< ë»!i^s3rZ$S[Oh'cls<:ziC%_aȞ* 5_&\R[^";L8tdZR D{èl (e6,FK.l3ib;#vq,D( O*Ӄ{VU`lX-h7 p^)BAt 5p#[C&#W!ȱA'ar3hk9a<;p_ O:{8lT`s=:m |T=ʑ;@]S[*^ ( cxc  [P(QTw+;όIoZ c*Q0U+Ahl6(Ӽ s0j|<17 &Yo@k7tQ<1oݶ$btҡAEn~;HIB,^uHI8</po/r1DG1e,dtfH6mWd`}rd blpB00$"kaI͐D8U Q"HHJAD ʙBPo!󢝈=(։,M1zOY\G r6TFfFA| r01@e $FIFMbM7`bTk'jD#LM łThb1$`0jb;$;W{W~.x*\Z8O̅HxCO_W?@g 7sHI!h "]wxJ+X;L1 ?:f0@ &-jgl`XWvôIjgY?ݛP!Lю[SmF/>rPcy{* 5g8fB؀7́8FFs>ջt|66o @&䳫Z\" q8'ƪmʳqJY99!}dTd- tX*MZӰ]ǃ#w}YK8 "p,HBQB^N$iQֱ(a=0k %.Q@.]FBmDZ95H~SD,I]らXF3ȤEDQ;Y఺O0N7 AKGz1/zY|Lx{QX{vIbX*Y2rэ~kbrF$[½H3˛=0z&j>T鍘oK4AO5zWO%Dժ8pHN$ Žlpuj̵*Řj(si>X<É~HG@>C(!19 ħiGw|d}ۚP/(DD>u|iOli.ncˮ)64pl`x57%GO^w4_0M0#5wZVbnF$fd$; D 02c ѽ4jDZ O 0᣶30ɳ"uNВ@$X/CaEDW̨S}2tÝ3n-u4tcMi;sH.8njE2#n`=8NL/Ǎ.uHd@N$Xf`Pr-64`*Z1bYG u~-{&a~-ۏ*y #t|wTsUU8!"Q"Ale(ȥdnbp0&fDe &1NN*0 JI= 2$$''A!2LTOw,HEJI*B, M6UCQ=sI) ATE3KWM_+"܂jpsDT\:YJA2 Ԉt%7-û:1y.e3D\5qʀnaltb%xgA@.AqA`&gzM Q ü2&B."yU%0 7Fg5:\Msr{/!{Bh)!coa/j}dA,492^~qH!H"fS@"+(5Ȫ'2lwtIAzPD K/ysίѵ L6I4dUR͖6 oUfD!<>63 $ $?ϣY2;)vuERڕNp\˫`t `@7Պ7Zl>GLkMD 2S0Q60p!N'ALƍ ̒c; ㏵98iD3ڠ R(XGob>>9Q8/E8r=h*tS}`6XWX 1+7'EQEUUX LC֜ e&Ä8# SlC1 (/tcCGA]w3rDZ1*hLKnfw!оwz!`n21#$(9P;BxR5}}'壟?$o/âHY2~$#Jo9QYBTWJ+@ ,wBI1ܮHGvE<G>ݾb!ȷ%X(#.DLD6> nu 6Mr)PANxrZ$yIx.`|o lU"X\_|s4UWq"^13}Q yӹtgϸ1ϼdpiFhO8VY@LWtۑ`D& MI2a7q"@fHWRchfp!Pf$r2QwɍL2܏`٘}vu~h!e-4=jA܈_-*We6U,8{xmy =foX4 asI J\|0Hall3'`g@K(AȁR6v%GiT0zI)=u=* /Q9#S:A xY,0,9.O6UKXH*h:T>a^b<|󟬡*4r2Ƹnv [Tmmŏ 6  R!7t u Fr&(7 vj\ Q`ybII#U1Ysz"O-*_M @à#Pn H[D0'Nskc-CB E,,*1D =ܒ0 Z֗ };M HkLݘ9p`1"A̳"q}G+ 4z7./!UtIR `s7 UJ~6\/,Ibt\VmpKez|5D@0K ef/Wh"b42AFij@{728b&^.ZGwmZCמ^eEV,>G>o[0ݑе/Raر3'<$cLf 8wfYc5Bh)DwIyrmg͡4nМW0e]kc{#kbr{X%UUAXLaA4Ga T՛SH /]^2?2TfJ]4=ҡ鳅p8Db'Y0hea c m^ 2k>34}Jlc?:iOYA/% qmT^ɉݍp:Q+ڴ$bDS`{h<Ø}3FE~Bj6WHdKy]dkp:˦ԈbAE1BM1IhyZS+Y>ok6{Ts!a'jRdtF$]~s /np(P3z@JNUr;>|m7CPKCލI]=Hn{qm9Hd!C+nbV&>'tQ|H#׼*<ܵ!MSay1 fǖ& .o2~Xq]`"ZM{ӱhjH {S~=.}KjA sZ@R MGEPFgW] {JbBq~2,32 95-F̏;O&GhhG聡҇G*؛~T8/`sR(`G-~7}Ni~;x Gf`aYKӁ,kgcۥM<&".P^Mў]SX 9 [hg>}DWpц74C4#jX 9\hMgKeSY3hB@e!Oeb mDXBD>4kaYһ2I+00A|iySB:"tnv6D쿜vnag09J( ǡh/,LK@7`~9l:u7 2Q ]w0z6 eptuZ3<\\v$E`8A@ 6#CJZ #ߏ}8Z^[>ȶD 2N6BtD΂őRuA9x.x*(Xb(s 4IvwB+GEЂ <8l("[Dǰr:E DWG(4Le  (@O~i~cNr}T8r >5F/#$4DM \ƄFd!(\ 5*$ rPzuID3`4a+{Z1ShBc|3ZF<)4JZ@AQ80ߧi4 ~)i$;`eKNWYH}§ hz24ayt)HS~D4 wK{Ő iB'4 h V"p3Vв~#i0;$$$Ӫ|@/no7!጑}2Zn)(My"t|@rC!GI"%CŰozA!:RUUmͪyH]Œk<ߨ\>|PPw,$CCQ}-8Z?xCPp/%&9( tux!&5<|1w{& ۠M)'yDC:>C]^8.D|QмuOpj[c4SGC$D&AfgզZl9NB =SPD x@ btBC3Tx ,xFs>Q@ƋOd4=˖ЅVw2 xZ[F^ qOn}X|*#uiH~j0='adtqҹK YQZ&GpP0nN'אrcߡQWhv;HßcaѐVAq){.EhTQ+S(9W1rPz204 =vnu,b; - аoqpK$fYY?ԙ&S;feʻJB-a"Dy0#s)xCل|fܷ#NG kCvCl+(a#(~Fr7A$,10 6V)qSna7 RAr$$H"D&Py9ڸ= ` !* o"Mm7&iD/@qY  k?vxoReDZrFH]IA,Td! \͏@/Bgv\2Ȣl2kgqϟFOK| THnTHI\8l9FxlI(s9[\鹳}Gbk~N)b!1R+@PQKVRBB9es _duiQ4˗}rϻawjX|CʪG*)Hܣ *h?KcP.>*4NFez̋a)ĕNr.T3ӗb?e,CunDGBɎ[X`;"$ayM LPO'93PHIpA=Gy:c]Y4Yiveo<ؙ?Ǔ]Z?ʦؒDbFugb<~_Zs|xMVyab=uEҡk)nJa^jjW~OM`#z E",TeN3iD{78lƤFqQri/'S iPx{NwMɛv՞ꆿ_-E9\v7GӪh}25'a$e'Wj{\+W}J gG÷ggq ~sOvh̿=&qԟg﷛*Jn,Knj@Vz3a9 #qyY8S¼Owļ/7Tꫲi;-%_cT<ѷ"x/Ź6tT/K3vIϒej}s,/)9҃tBΓUO?3v}p~8H0w#BFUC~&~Z+6%-X*}њbcF&%NGSO#[G?6hS*:HKw&:7G,U:v-u?NZ5U룲M|6:k(茣%e0YadSMn 2݃Okӛ;:~\ZWRTdganIj$*w5d؉YPݙ/Uwh!)')\8zAuwCIH8``aW2"spƚ}+fϓ<2!~v{tb/>2ݑ̟vw6{KSKKF䲥2Y*odúw!.A>㓋DS-V*"n2>/m29I[tgָ:/Ry.ߛ30Qs|ĕ Kz향Io+lȔ31f}~mv;PJHSD&2Uq{^(Q܇4toPDEO {ʘ-}0ԝyFQ3)t>7-fsQ,[e~*'k&҆u3K2{v̙!HR}9 QWHKT nS^ÉO_dO;m篫ɳ'7[cygf:IѝDOWC9S2 L3J/’Qj;?t9'mg/{YXM~BcԱͥ£!d,L ϐ?PRRu)"xRIXF~~/U`p*"#AkDH'gͲL([MAJ{TDPgF"b rh9k40Ɂhn5_{c?e6viPKPuI2#PCojm)/.GA@1 `Q^/+3Q?AU'HDH&xyB9P& .gF,\`t4? @eQB1pDQD ~bDH~~??YۭG2I^ҊfXAEy>oUUo9 >"@ ,%Ȅ>vr-$`ԑt pRD!y8}KZ(h!—TNo N81X}#ڥ4P0C\Ωn_/*l>H)ެMF79tF^!Q{ uc 1ܔ) zV9`Cȗ+Nb;*VH]sO(N-k]Gf3&d̕=:d&؛>s dUM kXZJvI8$$/ckzsCq5b<&f@d! k).vYښx$9Da]"!EYߧdM U33{΀!Bc'ITUR+1l@q.zƻS|KX=ǘ <SWC/r`FSm!F&KLW{OManC;?O ;ل;>#'"TS>JDB̝_7DD2A?!z`INqTaAk JP?I{Ɍ~W<ʪ==A:+]Y׶[B$c1؇2Gs? o\MboHH@- ع1EZI|p#N4AՆfTQ1b ⠸́E_&a U҉*%W{ Yn:)O/:J/jJ7")ܐjuvj f=s7Ȍ;I'?vG9EF5+!|H hm͙qnh)svhjdC m@ˁv4:d=!Jlwĩ c,,9AZ, 5Z,{3d7HBr=rv̠ÒZ.8N#zݛkZαaHijw:0ls -X09$ztte0Ey@פ=Z ջ`n xȘHu>ӯ -53(rHFBܪȁ r8lOoV)Ho+Kcd/+Ĉ {L)fCǠN^!y6z]m߫ zv["y} >7h(cʿriOS7Y%FD"7*ORrDs~cbJbSI #0560)**?m~0 a:ԅ/ q =FAb !3h}nvc %_U/❠t} }wE<HP68ZoH,+)(V|b"s{`ǎkc[fnIs;C P< %50y, EATQV#yzRT!A Ӟr ӚP,!0 @<A8rpk45Tu\ޗϜ2g4qB_ӯ. 'S7=s߆f٬kѴTƋ,AL L z34n=WN`c0l, 2 3J$ TBK8]QVpvp8MiGŸ;V %>^4AȄa @ي@:,C o"G磣8Fӕ7$$!dԀ1*:OEbܼL*ȳ;̝1МvGd@&Ί * iHW:ƄS#.ob>1p'<$3-LDLBጳ$nރ:):w=\v^G|.\)rnQ2B攧$.4oUIBF6uAJQ JSDEPӞ ۠SМA8ER<@@^^}RhDzS]؊t?wn[ρqQBI*h)|/nv2I=q(,p:6CAYs lpfwQ XbYAY;(|;d[E8UUd7:.P|f' e.L**ЯYؼC'궓Gߟ)P`=7]BUU{KvzZ}1y|7\CA]>wI"4!ӣ6agdf4/kLh5wclgU'y *ξ !fFAZ4Q- S&孙ѡ+KIr@,f$,CĉS1s$;?ˢB2riIЇF̒t}rʚ f%LKTs4:A"8Lۇ!Q :t쪦$)((*ɮr2t H/Q5QQ`+TkSkPm ,6bqHH<I! ~3G_"q& %^T:`H7{!ٖbG9&pnlQ2 7E"'vZjȢ(ȬaCjA6oDr#֮'C0?HwxellFKX 0}FX[og*'i||{:B mDH(xi5{ݯMQu_poH0 .U"S&S5|8|ӿǢ*|r|62*L@(c!m 6)(,'#|{:OkUEZ4'폨i֐$`>0ltYuXwb*3vp" P"&/0Lmn F 7SUUݘUaeTUU3blan`RAT;&Ox/B*";0|7[ #cm2Gj# T~㢇 166Janc[IܦR'  `@DD Z \VڋqinPn'(%6xf<)NT$& k0|M): yׅij%HA4 |U1 88F9rWӘΘltw4# ^2N2C߰Lgu9gEPiF1D82U\3* $q-DeѼ/4<&q։ k/-geܺ$X_0t>HNBRxrF~!/Ta |sݰM15UTD,g4/ cy{LJ)2 )Hr('Ew=Ģ#z;"{;64U@JEfraUm@WhW&L"EDDhSQLU(4d%t6a,%uHZsNd/ 9=H ",ͬZMSF;A&aXib*u;a^dhHh"ePT#20{ài;ڨp,25SDX+T,` w$LKܧ;?\Hp ǀi]X pCz]ҞO!IQW<硪Cؐă0hTf$iǼ@8t:lKXAr=34I=) i i^/Zmt~7ӆˣޢlЪMe)ؓf>IzK@պanjSg#a@cm.sY)/Nt!HMJGhrȐ8HL&{H~L䃙Z 0MUfiARIىVXLAuK uO] } p9R@p 8m38&@?rV/tC6E$]PV#<&L>wyaw~Ku`;f ѯxh4E.xR~k^EHD8#jVO ;DOR>[xA~/hWǜ,s+K{: "KYaI埏+C۔ó4cDW;"FG 9IA#FdT= uLpilIu|0¿엔ty$E;aDA#UFUxYOčU,# rfE]ri٢ `EZoLUK\pk֨/DوLA䖷 kQjkCȿGX=.HzOpŬ%MH-DKM+01F*:]4SC@ӎH{>-ozu霏Kσ.U#`!HqRY/ũ 9&ހm 5>VeUiJR/ct[LԙŅ:6sXIxbh"nɶNf/0 Zp>cyx  I sm1- C4%zLs ~00d'=[Aw2KpH$\rtiCYھ>5UZvLDIGcTdd8q&DĄt9_A͉̹swDA-O&㚵FJQi4dfh#!a5aYDL#$Jfxw. b,b(ծSonj 9p,`D;#@yrY!O#E^@>20A;$@DsKcTU o*)  !ra)0UU$O`b!I`}zh BGE''GAk1tJZB~aq3)n9BCpPH@^0A|p 0vC5r<b{% bx@RJx4FhHV"ZB̪ްZWѶG\DF>f[JFB! i0 6`0ZåP3X#E}EdCހ<6@D)3U RMI@'C|߻a UH`ʣrB$-︸$H7gee,B8 +"V xl`ACsKA8@ۅ[a0S$=gqk`O4 e*IG61G~çxZ!O%CG3 юԤJP{MA!e5 SB*J8$PNΥ!uڑyf%w5[KO:CBe"Zb 4MLWQ1H"ʶXCK *ɦqD"2m|Sp3ӥ%Gg69/h=hf\[1kRGQfHAHjǬ8|*k qԸf ZHad-s-„T9AàsňGب+OEֳa xX 'j Dڟ!J{B 03bhPh9x!`V߄ )כ9[a$OA|CRUk2gژa$q<̧ #0) =l:ea9yp`Y0e)#hcaZb.UpeIL||{b$X"V ;Q ɀB?@HlOd$dlo>kzKavփO'd;a' PZ¥&(hdn$~5^jl9ˍ]vA8%ݕePa "8h@8|ǚ[*-aܧv;LT?MA1#,"34&\ +rn 6AO,+Y8N@><)ĤӸniϐIsVk?^|W>+88Mg%酘w&e +2,7hc%ńL?6sB鰣uopk>s۳܅ij 2D0DKIH5 E+! "*6 @y4;ON:WiUp 4ƌh`"f=i-1V1F1N–9ZPhgދ5@D17PZvK1l\ٵZASmX}h/*ma4to;g%=vBق> AAFC ĜJPn ƭ!@wf f!j$5HRqT=ځB$B$)^P gNc'Hiۣ6yG[i]ҏjIb`UmhӶ,m|}L:;LT:7_/".a#⁾mvZ.6/*ԉF 3iA0z0}I3$=h DPy,sO j=82d+BvPQ^YToqy\0$?UHPh*D2dJPbG}[Amր]`)yLR!v+HffgBVӳF L@KzQ2J vCdb8#e5A+JL oH5 ֒0^aV\&A<z6#H>z466Hh@kNb"亓h(??<9μuթ.kk>veޓk>uddY9G1ЏHyQPH}=╤MߎCu %Bk߅>RmMm/~}@R1!߂"h`:S֨A؍| '#',O9 =}rcd죐F#8F[>V !|ڵiibQ yB@A/ @`A|6:b|?&(\#2q2)!2&}<=&a͗_\ "̖ )(fq2k5K02rJ&3 k 0 :I V2h8a@[Ϻh炪8L8Q9hfE`351ōѨjJDB0)̂P ] \R&D#$*:hlF>i@/m^B/48|)HB_|>; !1PO? q9c69vm7TSSK 2@ub%,$h4'7*bgg" 4"YW C2pCk hFKb8B #dR(LІũ8z% BE@I 1uSR$pjatS2bgXmlQ'{=2٬mqRm%5רŤY6h5n֋`8Ӎh BTޑ Ka*jdq|UъCl:*m FJ$J!"*3"N#ZB:jħ2Ĵ+U-CE6QձW LZb# x&.`jŇņi,MMC4Һũa L a:D<@xF91vF|2%:/ ((1R٠94Q "': ]*(? Ń ^Ta ̻,0}Pn!#@=OqC$h j Cf WIJaOF7͉Z9[w^$⥭Ѥ}.i٦D3t| / DaPѬwV a)36h,gIVXcc`Q~/g tPr?rP\_4v~tGL'b_ũ) \a %3ǟ0Q;dтw `R?ܾzqƓM_'~2"_U^҆Hw3I4 ds~0*j5!?)E3ddzbhC4|9s ĸ=6^&w@KRv4T.Dz3d~0H4~2WO #9m6le,`0+Ɨ,r_GS RG/^F $!eY>Qq*J A?UJwg2}_ն3x B62 $z*ŢW%O%Gtr9' (O7>֝D4p4k9 C_WHܲs"Q 8G +g ^qyN˅D|ǣZ6=V}Zeg19`(%S$ ) vda#EH#H&4RRHԋJ_єD㝓 ^ x&sZpPJ LTr*ϱ(ؽL "r tx0|OyFh:\GNG,;)AS:Sbd™SM\ p!&6̄$uup ~7E"q*^1{ q|F5w0 =c"#'lLGd/}}`n=.9ƳzX{9/˜1Y 轭ۍ![ZGT66f9i7tcHڶ1,̂$H*qnhKoxs3# E1dP Pd Fz9,$57y}>$ 8a/ėKƛKlPXTtSj-$2 R=iMu94\d}D!s 3U/vd@Gw?:vdE0GЎ\ |+C ;;yӔ) $mIKs?գۿ@ }2yÀY] %DR+B3<&>CgK$p@qc4ˈN8cCs9301B$"CT`4 Bf FRiMS6 DS ;qb3Y|/~6ݑQ +] L"Ã)C>)@6pFBd1+Er۷w`{uB!٭lvBSn Cǹ H3A 9EVf1aS١Xٹ y0AHh,AC%BbxǪLd̊+c?m*W5$&rU.80E8d-}aKFdzv ׺DPvrmJ2[HIz.;zv34>3H}5>#!>'wk@K]Cc[?;<4~QoБ^cxtQDBA'_Op+ZD:0!<4KqPݷxd̄w :4CY!LRS#$1KF84VP4YCpa)m Q% i#B(8`XFN󦨠jvh=a}ހu8;;B"" 7rԽJctU18;CĢ4O:t>hB|=ZRހwM@d懮k<|=N9xDE0,+LMb RdCa "P#"#Um\&, rXC$Z8~ψ- =87ɠ`@g) Dۣ>BA J@AWD _BoF1 3 X+̫SaGY-.YB2$#) po:k]'aݸN"i5ZAAXa$oqrh $T^geQ!=ٝE|)X)CS_ta7(p$Z@t/*A<.)[ɽ{CTa&1[l-G`c:,e=͖5%Ee[2 {ˢb~gvK o, 7z2̈M_8 h)TŞX\u !FXEu31Td)*T 9] (l= ~J c>jCh;)J>(:DϼЏgEEC]njL@Ό6Tzt'X?2+IԇqXVs<ZPGe"HiNK8|)MGkz"4فhz5R1|iTI>SaN YD4f+u4LicDlƀ:ZB ȷPADr6 7&J2|V%4Gd鎷s)^[fB@Hf844`qqĦWԎ(o9P⬳*- ?سX @80$\#UΤ/_Tkoo ҉Na¤Qy#`&Q4:X8.)b9dM "j{ J=;*ZA*2dzx#qLaAme10d;qQAm8PGW5r(vd (0s.]ޖ ?$JFcop9t=B5kc,:2QJpY2)H^F Q0ߏ7l=`^NYle@@;{|RQA&GDJ": xrFYTgcFf$44±1;3 Aa aN2a1JD%SZ"l22(s 0CF`dM eƲ6ˑ c1 LX)V @!2BqWПD~KDlg>^ul~|XC jDCi+d`4G&X׍ ]]mŲ8!o2zj&p勤ҌDL}ÆHK7 wG\NO:;d{6 o0.DA0TUY  ʯ_KAWPD0*Fs>\[!j,*{BWD$_ȃA[z\40`jO~>(J_lgA'*QTQq}d\Yt .dBV! %Ɛ4c ՘xy4n{1N>1ADR@SĉKЇ˳XS5P1,A3QhCV6NxɩWؕˠf-M6Ѩ_vu*bPOUltP~I!!ľDϣqdƨ}eD~W J&Q/D x揎\7$Bq]h(0*k9|EEˆ {x%18/:gaׅQ/4Epl}[@a+ꀪ4UgzV^+w6!]UgPӚe_lqUa7iƱ-KbY4H] hZ]64;.Dކz~:a(kXgfF{@̱U9S h6cƲѰl BZ/< 3-.o|q4K;lhީ91m79R鮧ͮmW9m>nJbE1ʌ/ JYч̸P)Ng ѺVg3|!"fAW5zKXeR7Az"!! bI3=:pp4@BPH/k D  P,OJ k0mF4&}ﳘ|8 !ͶeTGrq#AOdz#4ly!}6V# ܡǨ3r\ +9)"lUWhB(+U޿fIL3:xXL|嬷ox,7.BF㮑\`vf@Q4.!0`c:T(aJu`VdLL@Es_YFWQ%`3D*c}k&;G -+]D]^:/c_\,$g|P4l`L)Q(B r|3Z90-# DW_'YIْ}'y>7'< y? =dzߡ'ɧGmg'@d~ۅ9I*y>Sw5[Yp0GOϗwWOGb{8gݶs~19wMRN&ܳeɄWlrR]ٓf̻6O=7d SfõdUfK o%bx[b߾8%PΒR&+ yG0neV7B vĘA!?E5w`FO{<0#EQQ*r)(L""Y?0NnzxiI!2:qœ"y(ɪ(rMQC@(?hN?~Ws> Z),Q%0@x$Gj04k*{ZC9 x) $Q46A$m6q [AmkMe`Ze pP:,aTjɃX:yL@z+2ڣ֩GzpvRkֹiv<6hSm {͡!0LӰ..(uh1Fm"w6oAqO͘Rc9ݠPFmTaX.V1]V(E=Bv7 P3޲I$IS zd#f z Ϛ;O ?s HHNI`x!)$0_YK%HsX-->^g63؄ K^З(Uz"\&Ch2۰{ָ<2ImqF%d.)yw[{$ʒQϝ_J+xpT/VuŖ"vE4`1Kř{ ΐrPoTUFrdluG"8h8/ h賸 )Հtl2R*(шs2czfciw>r<#%;fQHL{ 掑5ލ+Z 52JDɔ*Qb(;:4c *xMÃ*A0 :U*q&a:w5 l|fK \;XjCd^s"6 YyKHUSj2U1-6}HJ;F58&GHPZ_C1-Z6f2DE: 畓amۄ$l2P.,tL説vgWg,Iɓ3^!b2#9`K(`08^.QS(3Y#ESiܖma ۜ K EdČɶĖLqCDEo lͮEnEpH$V"8P `!; J * ]M05ʀm&)}6H΃H13FZ鱹1z$ a1bB R͝k$e:aYȀ- &jk)XCcɯ&Շ ! |7  i0' qIE:o],)u+Юrؽe63UdM((lV#2MNMhHdq^gY獭kgY-=DqXky4ܧM,p|BqBw;?  !cu &b{y)(l)sk5;x;,ncG iHm6 8m32+ PݠSCKog^6#)~w0n2'^F8wX5OYALvb­11`ܴ*Ȕ39_ Q J9ƺbwcftLw;l)$Rf@E֓V],M#m8v v=2Y4P#bɹ]WGMYrfJ,ʱYi|m< SlnxAɶ#&'HjF:bXöT8%D2z gaѲf+ge$ӡ5l.9 <}Z hGfK֪< $rx6ԁybRv u0KJ`FO:nn3gѬA+ l>-ׁף; a#RKߑY9A 3ۚKՓb86)%]WSVjp Izq[g]h G=p2:( ΍7@G~zl-,qGk$CUZ=qRasr#SaζD3LÙbtgG`^n(0Zl50RdR>bն0F6|TeT[Z-η{_un3S kntW5S ]8.A_LqrK3WʣN`󇉻D"q|+SvkN֨0pL[8:qESߗx-:+%e~8x^ {T=q")]oZJAVE(`mSa2#wr5aW@i7q vC3pW: Tj,&oXh20巾9"YaErfwmr+޺ G85ru2ڭYX{dL`KafR.KN2#\RJ5!/M}B'S1|]UZ~`!ͥmS"%A~ˠZ g:Wq@8p:=hL-K< .aa(-*4iMr22aG/8xɞZ#li? ``1UΨrl;Qmn6)2p6vm/Iف=F&Vf:sND#;,o6B8T]0#;0Bd +1$},zQ&21H(S:Hjnjb{ ǿMưpnpH3n;lx倄܌6:*,=jo*!^ N%P|gL=7yI!h_ -ȠZ FiU )`\4@4Mn\7,$H v/TDQEQQvue<M״A,uSAR7Fʛ K Ӟ sqcERP`֤`m̚P؛b QUQU%] Y3KG dۓM5lwrvF@``:7au "Ą\dۖ!Ej;Ep@@)&$I ĄݼKK 7!][*d*M=vT1x|CQh<lzް;1KW]ˆJS kF]d4fJZ(0vr{`*bKH"!JBHDzt#!RQdއʙBSJU %DLBQQ M=2{O2 ii? R$Dn y ]@ñ#@-8eRDX'Ryd:/nN!7~f }>pXZQ̗ٚT:Hr(ַDNp3xkJ쮄A/6i׼=',3ҼZlf9kHB2&qP) " ċݮ^y9qApQE1Abp@fcuĆ ( (b XF&ӦTzOx©x ꉂ=yCC2`=a}2zWVOn h+F30eZfbT֛ѩQɬZ)ïBջuF0ҥ5i8,bXc5Y>& `+Cw!'[!G3~[4cP9tL;v1h2DN΅ @H#a؄Pb8=ƚpJYMd/|F7tnbՋD;fUjFWVEOv{k:"4Mm]66-G.. QJvqJQw10v\-;vYM$T&^[:vl5kU]-pDcy71Sd18:Xiˈ`d韲ҍl>-ZE Rt5E*bHTN-2 v`;\gTJ}Cks$)gKv2K(Zu]l X(2;"qA%3uE XSf7m\ojq3NN:KVep\-yylK˃4Ξs2BG3qTLMqӂdHZ+ƭ"xn9USI72h,2&DH$Cy"CztaU\Ff8'f:jZm2k7]˜mC s[l]\yKۑ+ /0A3K\n4 e416-*n5m1Ѽ _6L_t1P,ߧ6NKKq.9x;0JOU/>̌*S.ݑ\| qnf]n.CwC.aݜwűIz wɱR˵S`HTMis@2178Mb(Ԃ6`\%E"{CF91%4KJ bX&xEK,Ƞ CH#EGDb/FI6l C4 /W0(ʔiT):o:z}W- `C1t #LHϱ8:4>?说 wcBQ  G 4<C"LlAyX7APtP4 ?gy2rRd;ٹٷӳ%J?aȸl¸4̵aEhՀDۇCJS4?b ip7Үx{`oz"k>}]/E; !ٻIFnKY If }Ԕ$ @ ʽ*FQ oq`0:/q̀eB(Uxvu;GȊ` TJA@5|(hn]P57p0")Ăiv |+ 2=볻[ǸR-Aaƍ DQ%FF7cV=#UkHlcH- *n2%m6DCPlѬ hjf1SVQ6ɢAۭ@bN-dqxj1!r1""ヾa8hjc[%hvPľbSn%DtRG 03C? Ka1u6gI'SE!+,6e.v;D:d"G:MV Xut*k ){(w(`4OO%܀}$;7G+jX;frq0l!M.Z.yb hУm!6JL6b4!lM3 iv9fNok+vt&gMm:NrAS;E9H$r`x#4ٝ=<$Nz4S 8>(r!bz(H@&,1hތI )gx'#`'Z{P F?NV-ЃG䑑dI i0 244Wk5RѴȰ $-F(#p""!d B4 LEϼm(ڂ&CUb ѐ=$-Qs-vJPA1._8ã&"=ŋ;Q(XAL+1@L抡R!(QMYI|I1 lW4FHqemIR4%{YUkU^IH5)?ѩr!gncT"{Nwcm,6m^jaѵfm+܃CղJwe15*MS*5$0p w5Wke+Ѥ;CU tY$b3-CYLďRd#u}aìlXr !;[oU:pM5[i)F DhRF![CqZ`$k\:m N6yWbkSxs=*J!6&t)kbtf$Ak&N Η]ȃK6eM{ܘuQG5*hI^rV1˛e#Yn}ob< Qh&n9BEu"fE\ $@9 R%=j-#;%'X_;Mʯ][܇5]$*H}fn b%ǵ lt~=8%cx-B5)Uc#;f*p2#EڋAJq6X @/4TPҬТ*] I`X@r R)\qP`m_bo51 ؝wT^ur$W_rlI@(b1vz>֓5'Ml-HK5QcC}uTG$R5C4&.Rfqי1օ׃=1Zn"8DH6$$79 άŝ;X.q~ѣ 8ۄmн8%RA.윎Ūݸ~J[ ;P"y7Z%"9%H͘./ЯU!"6dAsY\"EhC8ABG't5gy&5uy Iۂ8juQۡXsΠfVN8fn`&ES:Y-GL@`qPsOenisBQ]Z`:P)잖l}U-g SD ؛ 0)y7ܽ'wmu+4d7+\.xIXv(vɸU:KQN F"mHiDcYKC ~Z<;,!)8hPTICg$F8דMϒmL{j;v#ow|FSF+uÔ~D3 :1Қ,e$W5~J40B03[#BN!Xn SӝmCKfu p'&F m;F,ml HDFH+A<*FԴ] ?nώ.xwNJ~!bQҊl**y>NWLY.w$" i6 LZAV*~HԥeUg#bH/G'#ކEp@F,0b_ɤ^ihHy k$tec2#0 MD;ޡshݑGXGU ZmI@dx !0 b.J@dX(6XKd`m˘ah'd;#{҇l"xQDF=EbI @gb%,_cm~zSŒupZ18V"͘i҂attLj44Ё"Bl5_Q{GTYC;nC@,Nkbް],̹ͶE\ L˜|P?ߡ;(4Dc=m'8U}iIP/Ltu5 XFjɗCeIaeۂٸI1ŭml>p6kA='Q3Dѡ5L10&' o54a$CRZq}>"$jjhmOSg*Y7UeE6SAA1eVHߞڬ5`~| oDg1;'ƀ8\jrcFZFzȆ6"%!D`OZ(Uþs&uF`*9yϋD+{&s8vG(##po5[9 `r lR2:*8H/AI-̹! /NH&!1"Lɕ!7P[:ia"ijNB S"3Xm4Ϙg2묄4j!ohIKfVxoDȶ53}Oe<$wP`LBV`R*2L `0 XEdف*afA H`Ϳ:xSz`t3h!JB&f a(ipzGwf8Q Kt^c</"Cë3LuךǤyP鏯S?f^oD6Exzyx9z7sZϐ&zrK%cژp|N|`G!cv}bfX탳^_ =ڇuH)>L%ʃW,@ZNT7HT ABm~^߅(E9Si(j* D0Ը3Au+'NtHDNUT8Ll677.!Ad(B44aCD>(Z!ET"Okqp7ވ& aYeY(1 1S7elt7s[~y`BnYc T(/rh#WDBDD`xd941HqXaXLAJF=  nn"=  i;  1"nT`0Th\Q6c%QEGsXK`@mVűhw~C,OmOMHQ{/vt 8cVg}jS}b68{(+T 3wW/C5ܸYvv HFX#;4sOl.@vf0GC =&I* B5w/#qɬ̆G8'Ku$YByc6p ΨynѩXIB} Xų卩k9~^t-g?o 4CfFCoXXAߝ+X,Qג:Y7]V(ݠDq?(:=PE-btG/|!O2VFw<DOI@kΫVnKt \Cl!oi CUeEEj>'"9B4.J ԅRS\|k C;EІ ! Cً1ovg9 2eR6i{8VBnpz3ah9--,uDzC#9RlR'{R%E|Ϛ=}1ݗnk܁5!áO^6GNAIG"3'h"ɺMqaDݩ}.sۈR4@0vCE#Q!j~"Iw %Q ú*2DɁ Vp9`֙jryGPwskEAL~>L &qϾ U_'H&d%s1ět*i\mDcL!*^Yb11߮ǓZj"D3 9fD\>"w.A*` LrLH/Dt_&U=pypǽ:{̀y!$@?OmO}~N4 8b?Fpirm_QICD?BĢ4ߑOmCthcXa2=Tc5^KL~%D4R L}ǵdZ-2|Xq "ۆX~l,+`3BH$$R|" IH7#u;76. QGhٖÂ`D=y0\bu8vf7ʹcWS8e7ѽ] lm[AFN6#jJap1<2ecc|S릘<֋;ZH8{8qmIߥ,6s=gK$ \$cnW$;=z4I ڳBY 8M*=M% !!f֣b{ MM7Yic+x4q7$n*c@qAjb,l99u++М:p∄gh/__<fz[!*7lfFccSlPhb a[¦nlllHThdQ8  T#M$dC ޖt U !|N$⨕L ,-Jf f D &97!޹aAĄ#-n >'Pu 8 ! %PCKĥ&7*Qݮ;// &iwԶ%fu)K$Ta/z9r-Ȱ78%&ai*?B X ^il\Z #.XtZCdhrGޭ.-XGN{qBdEh8O(@MDi Ȑ`1 XLY?9E]#${r6tSGGja"~* I-K0ŨKZ$#ʑ By {6a{ŚbٜY5:D6V(6j3- (2!K%XT븻B 2hLj'2` Kc`LH.`JLP0 {bGpXo">ϩW, f}/5?i|ɲٱǏ@'DGKG(鷖iJM` PNQ: aنa2a?8* 3"vBº6! QC~^:λDo p)I0E!$Ģt> /)F&1(rr$lD6tck B9P@#nƫ(t@AcjRw ӛM ,o+SiIG _g`@5 ` L`B\ffeFAp3iK>y8@2ˤX0d,A0T9#"ns$O/oZ[dC7tNg%%/6@l&AH'!@vgU _,s OoqQ !Vl\a)C1ʩU*&c\ČI1( !F8R!2T8F pvjcqT kB|4+p<'@&@rYaؚ.>@jF &I q!5:-LBRfLҎUGp8N@h$fmZ?ÊP96VzR'"CFOsJ61422'u2R#dR0 2"*K4itSSDq4p#N$""-A'f,"f\cdPMDhj(7Q@acPQ&Pe#*hp[ I6iQV* *Ah ] "qLqFbn) +N Xk i9JfYysaJr^ +JWR:Li*Y"@RJX$(oQǧ Fsm ,rD\b̥kDLHBA@}D0^)3q!B@s.39څfWY>@N1dJBb@ JW;< i| VL$@r!)Nøz*MT;`9 Qkm!9.iU?"%D4]yt Ye)JeHar=RPjPu% 44 P ()T-Z vNrϕג:xו*Q+1Ǯ7ݫ!?F /:䭣4J1vѣȷ X?帮?; ?@*E7?"hciyl\.@ P+AH 4 IIQHĭTBE!ABR JP@ @D.HJ4дR(4 PPA0R0*R)HQH!A$ T JČJRRP#MP#EPU$P%$KE)AM̉R 04*QK@&BE!H4C.K@@+ai3 :!!ZqsH_ie:s33334IEE$"F)ZAJJLkz`n(!@Nf A@DzB?5Q$5Q_uBt'W&n BQ)iQ *(h i5UQT4TQHEC2A@¬DTARL$0E2+I0DLBDD^f ЁMA!(PACp{^fk&Kia PA0DPEQxa@@ҭ֘_MG +=Ejo~N7@'g畭k"=Cd_ɦw N1BEHZ ADL͂3 ^!+硓C7;u8!Nm{QBADLj&d йF=ZO0@aQA4m9KnƪNqmO0o{ww9 thSCշhd9ގʩ<'yU2E@nz/SdáJ_Ej?BI(A`mz 0yI)\a6Eh(zh&**0<==<2=sUI4 O?t S@ߤʥ +MAÁ taL ZM1IDi(ygO8އ^RcM/A!G΅[:/Yc!Cu^Õ "3|4 >xb+3iH (s]@Q90HPo"L B鈊kDԐHE1cJ0I !4R- P 40R%1%@@P,@ %Bԙ/d| hɶ50SzHCgC(F0ԝf B$8I˂.6q J*F "$ 0,4IESD"J(K,CTG;%g=^=M DtLiTE8eIR% 7 a䂁d]FL'IoӲf5*T!e z;)(Dpm^@%N8yN!7|*k!@t: =me4 f`aV5GiBb.'3@φ^aYs4kXfд5,x'p $ 2*21|l ҉%Of%fwZ}^YLXfClEtJ˕ qmMif1fYd`Cll!?4ZbdD![itڮGV*QdPL$hWQ3 460lLi2kvKtze:(7xw&-9s8UK0۷ 92Yt,#rcBV<7uRo pdW8-5g,Rjͬ4WE01fHLi\qWV\eyuq9'cy὘FhұU,|gqti䣃9$8nݧ3#->7i`R㺧YRO$6f%y K@l胔Q;;:ז1q}|mi`m^ĆEw"ϣQT|sxK7܏ 6;&F`UYY,%!Xi[{BK %JңAJ ђmb*U`&j?JA_A/3DDUUUUUUUDT|Wϳ/E$UOwO'y@^BpzC*L"{P(~HB  R) #!(2$F \эC䛑G u C9XH-(Q0 H%f9 BPjPh!I1B%P0"`DҘˈ4qyKM D*4 +LNm؄SIH 8:f?\2 -S<;nxD-'؜DB.!1<0t(u,C:GA24ֲE ,pKDn ĀT3 O| 3SXlN@d@_,٤Ӳk ZFds.]TفPZ[TeΆ\уq6#}'ARsnqӮt7&Ldmv&fsd L"Z/7bY)i>$4#H klMT&(q#h|} ?<4B :N|mǨ'l+릃#?n*~yi(b$JZJ) )di(*(&LCTBQP2@RRP4P(J2!!B5qACT@SĈ!Ja6xKB@EL4$JQS %"HXVQ(g BfJbX$" HZV& I'7 :?=AaQy졵ѣHf@R(o Ln49$o&H 5;IC++IKTEI!H4PALٸMp9 C""""YIh[4!>wǯ\!~p7 j"S㒀L8_{%fQBdDD&104} A--HXOj Y* Hb Va"d$1`"h@%eU $HB31P , i!VZZ()m`J*dF4 RH0'tx#R6AR`R~uͼyzd3-g<a̾z$$=hMJ* vTbaEF][ GͰ˼JwB\qVu0 HIMDCeL `xCqtHϘAIB,L1J9kk&O4nR-/ߕ!u- $jD(WcX.2 @tG1[\NωXF4axӒ@Z v&np0 C? 1334SF(&+ QLhp%xCArv)[to#\c"2U`d~IM2 CGP/O`mO~pH jp#־b K4Tq91\ |.li6É(ڤXTUTR3*'KAh ^H퐴ǦͥXmj m 4?uuyxMh^hs'Og-¯3FhȁKAΑ $4~+Va(d'74t 0"DRZC?.=@ZJ MNVy`\1I'l* .6,^ˎsH"U,D)̲)Œ9HJ̴aF9a2MB˄Tʘ$!pe@W*U2cYQs: gC9O&TAf.-A+(^T,9h;'PܖCMv>IaEd-3نa k3a1_NbɧO,AAIT%Do7D}OR'IJ O,?a@6sNw*TE#R:#QcDq AD&H {v+H /x@}'ko[;(//c J1Zȷ_"Hl9>Qi7 QyuqӦkm$ r>]8 ZYJ )&b"*Y ")*N/NXqtT74:r)I3<1J@ ,nDJt@ Á;v`0#1XF|~C8z,pApvht ;;xi1j(1RUEjcVE@V6BDWS:%MmH*N8li`iVKd(en$W;jd# Cp"bf4њ@,5ewgҘ6quN l1:$LȁCڏCV!r:(xZ{4 l$SbV'2"cZb2!cӃZ2QB HŨ"Ke@d<! ƘŅY8eDaFYI8f8%Blj>dRDgL#lo!b{6Y8k-J,_6Me)q dr*c=6Nma]J6@m,31q@dl;FcglwdH9'z7&0*}:x<IkM9t+l45Qj.ۃ5Uԇ„s0fDz!qrH'۰Q9H94Q-0* 9rJM![x2 $VL AH"\CsQBf`Ȇ1DOrQdL)Pbm8eZ=y=mZl!2hvsngzBySvk CJqPЦA B( ,6 `AwHʰ NI!pDI::/y lϑ aA0DP4΃П`)!|QQS%ztp](Ë`Ft[CU #QJQMHPm5W20/Jܺn2g<~#jbtf徧B^?4LHݬ̍Y§PFȐ2}Sns`'>ĻӬb,' imwo$K ljTBV8&WI6'te,yH4B@is(ٽ^ cH2iWAI9]O-2UO\2͑#*p`Ԁv%L32Ph[ņhHr+.l10%PR!H*"< / &%6zCPuOTQS_*D y1FG0="Asl!ڡj{ԭٝО}(Hh!ՅG;r!d2L0Š)P8ܜ22DC҉6B X>y |{1BnM40z7Hւ>kM{k:#odTM adu `Dy"^ ],Atoé uzB#x@YPqS 2mlb4 3OM( 0>l  u4 5  ' >Nu*q]`$ PA.cPds~8g CL! 1&JmUc#E &#<8R`>o :-RFFyN ,&|p,c(ăb,H ydSPB =;$ Jy('3@S8-F!0O +J|+ `V41j(H,z *G2s1 s'C"*35Mk%`bB& IZ@@&`T%Q$V"ZhJ`h7xF; 2 ǞI x蛬|OSS"d[9OD 1Fz:ߦm4`=r&0.wa䕢HЩMf1l蠸衏_FThsK-oRRTKJ4'8 ВC5__͂͝5ϵD]r'J'nVeC #/x`7edzQFJ?4:w"8 q$vBe;֘H)TtPs_SBMy*`h迶Aj(7>=W^VL^PH"ZC䣍$ç=T"NB'PP:sj=d &~ϋ{"(&[ c;?gGqƴ4idۨrmWu+ piC(b vs,#S9zqZh&--'+`P_)H|Q4}C>T9LAzYͯ^Q8%3#8ÒOXuQ{yȳ&B X( # i(!Y4~w26`^3c=3 J)>˝@?s!BH?a/⢃3cr̓p$l.D_|PvuiSrd\W3! .DIV꯲K1_ĐqҀn/fWfj5h6J,̬<|Ye5@$ ҇Ǣ#?ON QӘ3bC 9fob@Xqd1}=ZE2/m$X c1# uXV )A㝳3C~ٕׯ<&r\!=?P!D]x}Jm▦?ޠ<ѭuQ/dv E@UCP$Dƈ N dϥMB|&yW^d:2gB`ܤ Q WnEZ/LP>?uC|e ܷpieC ` fޔ_vӀdF2"2# kFd4V,QNkFƒcdce1VaRm4jFSj0uCkdەB1 *"C&+`O\F 7) 5$Ө3,s1DT\&<V1@h"ExRAjT;ْ BH  ʐh"C@;~O{ df BtNfG(&o.IBd1%ș=._A_Fuי7!h{z"Ypq_uhP#=HDA;#n4bʡ&x&Q %'suh$xO%p`f@lע'r%tk@H{z{헖il0Vv.8:C!:)'4ą#H nb`P).#3eG 3o~(ryЀLdp+V-Y0i@d !!.J*Q0H J6Ng3iAZ %V!Hh"|sS YK@FFd>;Aܡ"lJ#GK HHa&uJ "C.6 :Yhn]B}^3P]&-2_oS R^^y$f.u8͕*8K }r-6m7D'`Z4Dț#rژ X˭&\ԉ‘7$ZZwWWuu9ё4Bco 鶂i$%S}1J%Lb'f+q .(l-y#Rēu;āѾNɫDFC.!:DJ8r4`w)܅@I }S V&8bceT%%cZ650e5qդ JSɿ|huy7Mu A@ajҎqk>$!/v!dL"E8$&>#8؛r@J|@m6&aʉոP.)rE5*Bf~{349ݙkw]~$ 8r DNc+ϙ*1`bXވGBd%y)" x%ZGDR&4iPP#c4Fճ>LWeo|RmS\3jep $LqX{.XRifAkkZK JxiL×l+ 0`;7n5BP*-/HpxfbS M$@nˎf@ARKAw˜6Ͱ+h7zhH=c!D4Vf H81GGYQr7x15h#`{WMt舦/B1TLd}lLcXVH0e)DR&8jZK 5P!9 ?p[TWasG,@$F8hQ/g)p20 WBd(ۃ2T1uX`vƴ8US).,r խ 81$B2(0]Xh#$10I &Mb$J9 Z{L0 0!ȪTyYb/)6 ͕O!s D]`#3> g&YB?4C=Ng{&cAjX)T@eqFOֳ%6|6ә!b#|3 0#XK@M2 vm7&Ʀ+Z@,ZFg/$vpz}k}y0IZeH @@Y@S/"O4FW): hV!b''+>P*kJ~lh@ztкݱ8S[Nyhzh(/(!/y"L&'~y,5:j;C^IJL|iZZv.4[GzP4> fZthljF45Xj6NER460W*`yjXʆ,hQfTZ-qr J -[‘ bs8q0llI,q818qIYPr!paPQiA5MFVu3ɖBJX>MdshLYVDwBF(wHDJrz߭ji:j,P8ya05Zxa¬|hAF fꕴ)7UaӟNRXD4ANauѨ0 k5H i)h*܆"ւD FلYa>Ke wJL!L J`@xDT#[Cj,anĹ$9Xm$F*b?n>Ca"( DHƜ֌% XQ"쵅ȷ/dsQI2L@42 -%$ejZ2-{2.a*qyqU&h:,"ӏl^ؖPp(ycQNfTkzN$n٢Prn%:F(bqdIV!9je7WR Ӑz1+7Efy*bF$L$`60e Jڂ[~-4 wj=6ѽё}6({Z5zn=tT~!"Rgjd& af C%-fm+X2G[oN vcv8 `nMRBvG|]I\L>Pn>7NI:+ }H~e=zPDZzmPL9 JD6*8;[-)֝T6/c;0) {>Yr(bD \ZtNˌԙ3t(_ޖ(|A|V-2?Ͽx˅[ ALU@P0 Qn623*k0Z0tV=RT7@ [cHL& -nJ X-oP}gwbO"Q2Ei4Aʊ(!Q ҪdnQ#VCT5?6+l+""֠.䋌a 4z 7Jሔ4ȇ`0uUGq$_ұAp- ڨأҲB*JH* fĚ4ë sld4ih!b#dfY: PeI&܀WXq5p D0RHpJXX :h A cfahd"CaLdF K@&A5G wV6AX+1hiȍCDeIAIɌ0C,GS86ƉʈƨAEd kjp"TƠgMY3 DQ 44R e 1 #%D H y-W H6[Tol*jlLq**QNEV(V@0J\H J B҄KĂo1hD) r5K4ADBJQ (" 2d<93UC(EE#yEUQT ; 0T@9,5>O;Q)j;D@*:bd!Y0ڣ^ -^h yH=|s?@KM/e<ǣt4w/s@Ȫ^Q˸C5Ddd *jQù3lW1ڵ n p㎵9/… 2w\-Y/x:2CIbd zͻP5$"A4w\)m5=D"0>91g2A%`BӡD H P#PTRJP"d-4Gp:iZR `R!X#@F8`$ΏY6vAF…~@ 1۴Q Wؚ s6ʃhh>׋e*J6- FhfG흉p 8wfd( :p);w_@od0o[8͘oMBoWiJQdiS@F\%LI!R0$G"RT`3! H jE ᥏R+u4;Eb׏=t({YӍ"$Hiƚ]f%'}^5z* Y! ! RDvAbMMq@d c3zf9(f^){4uA#$H_NN=0¹IS<@QyNZhztz+љ } X< v];CnblWCGC 9_X}l>C,h -q 'Q:A@1E@P TRP1vNJ\g>rJ4(>7qת9 TADC$*XvkmD|'׸Rm[)hdA\0.cDe j :6*CBE!iG Q7tddj64Bm > ׇg3r^u;CR<9oG VQi!BBk}iӥvuQ $, +@44 L@4P *,2HL-r5!:,";U?GCUe]$Uf2b80l]Rd8LCT匵:,4NCLf A, $ mf&Ai"$ 35 aI9aTCUPɓ?86l)y1&Q4"5hX;u"#1Ï (0l4n9)l{J0#mdb̭TAq1fG%Gy9l $%4C4'a @ QW t†n qROd*j9-#J:}nFRKC%` }IfDp-*PC]ԣWNDgd*'FF0@{zpv"r 6C2-_l` D>:j`,`=OC }um>OSS'ˎ0AG[{J Ǭ[SiGXodˋ,c<.-mcgs.5aSnq0$x ҔP5wp.h'Yèf@mʩU *IXH.M ) aa%'~! H7X*ת0 G|if `NZv 01HD?X(`8g4SDHML}a, #2PZ.?}! 7"0 iM-H /=94mH 5-aQV tv:c͔J L̥(vjCA A:|n;LXcB;P3nCw=q<*Hwˡn6[ 0k%]}*M>$-@;}7#WŲ5=5{N8:q+87ok>S,4aD 8]x"e{߳XI.h 0;RH@۠ եu])1Mn; 8 td'X.&Z6[/{Zߕ trb_@4m brяO馧=%KE]0p$Re #X ," n#@` 8bo67BlO|m}>w*AǮ)Ae#?WǥBVۛM%V}Vʔ 2K@8 ;9 bd"s>pJC` L2NKnN*bi}1Ij07@inY9eFzo%01;O߰rgnNdM`uW|\1p~rVeA3 30#C,N0 P-yL PPBpY q ((B.˦!HH@& `MM)JQ1 U0D*̀X ( YHQX%WG }p#"HylpHJ;|$DW $W8cyrxC$b Mn (3H'o>" @`TW1N0Lĕ=5PMB;GFWzo0SX䏲Hb*sÃΜ:a!"BJS@1AdP4,ԋB"yH " Q<)Nkދl>%5lDҎ|Wf8HvE0?V{hl"]HMŕ-w:_VWs A@R0@3 dHPB$("@DC) dw 6C\ȧd(&(@PJbhu$10f:5LКC899DA0R1,%$*PM(Ds0B X PJRBHV VAi )R%iF||vAMRD@)B- O&@I8qdLAg.t02 0Lj7*NhJ$$Ld' j)\) HՄ ,@d*ҁP0nC)wa&Q&aQ$dYoǟWHBtwDYqci@*!ܙ0Jtd f YaXQ[F<[p!mCJŚDe40P$~FƌaXc::C-6()HJPJL%% @̡Pa% @ ޮ,e'h>KFc؋hAGX||r16GP٘HMTA IDRP'08oOoˍ%bJNw<] '1rT TK@R +ߟFDN IP%}jQENJq`k䎅b}p{s[DADTP|Ѹt":s5̷|v5+ズEnr|)a^BK'<7 tY+K4ڢ(13k<}<\ְ Ja}ctcsY MCʵgYjz$OT xqHq½@DD$((X"B""@<j|*~rx_!/: b%a6=$zös)+)P3D=%I`\FQSD@qه]5ognrs `Z5DtsVv\)\,Fqp9h!ȞFIǥhX! R.4L@C$w:I0\[û c dV*0w(d鮥!"[Kx^i3[Q} }u<QDESa3m[Q@M0'0HCQ"A֭>%^~lZ+c906L@>,B%Zaz", ~m4E RDrsE,U#̿(S"YE_ %HΤM?0wSԇ*]B]Ƚ"^K9#p<JD\HA!tKn  0t:H|ep @KYdAWUposxJwa_GxybrT>rB0:Ȣ^$LO)!$|/9y 1<<-yiů䈃@G"貖> kK:b?,6aD[B{?]<&dEA(kz@vJ%" d:@hG K ޹~~ %aJnyBߊ`eNRa8®E Qى(iNrd9éR]XZ ^\ * appends would cause several memory allocations. As long as * TCL_MIN_GROWTH is a reasonable size, we can avoid that behavior. * * The growth algorithm can be tuned by adjusting the following parameters: * * TCL_MIN_GROWTH Additional space, in bytes, to allocate when * the double allocation has failed. Default is * 1024 (1 kilobyte). See tclInt.h. */ #ifndef TCL_MIN_UNICHAR_GROWTH #define TCL_MIN_UNICHAR_GROWTH TCL_MIN_GROWTH/sizeof(Tcl_UniChar) #endif static void GrowStringBuffer( Tcl_Obj *objPtr, int needed, int flag) { /* * Pre-conditions: * objPtr->typePtr == &tclStringType * needed > stringPtr->allocated * flag || objPtr->bytes != NULL */ String *stringPtr = GET_STRING(objPtr); char *ptr = NULL; int attempt; if (objPtr->bytes == tclEmptyStringRep) { objPtr->bytes = NULL; } if (flag == 0 || stringPtr->allocated > 0) { attempt = 2 * needed; if (attempt >= 0) { ptr = attemptckrealloc(objPtr->bytes, attempt + 1); } if (ptr == NULL) { /* * Take care computing the amount of modest growth to avoid * overflow into invalid argument values for attempt. */ unsigned int limit = INT_MAX - needed; unsigned int extra = needed - objPtr->length + TCL_MIN_GROWTH; int growth = (int) ((extra > limit) ? limit : extra); attempt = needed + growth; ptr = attemptckrealloc(objPtr->bytes, attempt + 1); } } if (ptr == NULL) { /* * First allocation - just big enough; or last chance fallback. */ attempt = needed; ptr = ckrealloc(objPtr->bytes, attempt + 1); } objPtr->bytes = ptr; stringPtr->allocated = attempt; } static void GrowUnicodeBuffer( Tcl_Obj *objPtr, int needed) { /* * Pre-conditions: * objPtr->typePtr == &tclStringType * needed > stringPtr->maxChars * needed < STRING_MAXCHARS */ String *ptr = NULL, *stringPtr = GET_STRING(objPtr); int attempt; if (stringPtr->maxChars > 0) { /* * Subsequent appends - apply the growth algorithm. */ attempt = 2 * needed; if (attempt >= 0 && attempt <= STRING_MAXCHARS) { ptr = stringAttemptRealloc(stringPtr, attempt); } if (ptr == NULL) { /* * Take care computing the amount of modest growth to avoid * overflow into invalid argument values for attempt. */ unsigned int limit = STRING_MAXCHARS - needed; unsigned int extra = needed - stringPtr->numChars + TCL_MIN_UNICHAR_GROWTH; int growth = (int) ((extra > limit) ? limit : extra); attempt = needed + growth; ptr = stringAttemptRealloc(stringPtr, attempt); } } if (ptr == NULL) { /* * First allocation - just big enough; or last chance fallback. */ attempt = needed; ptr = stringRealloc(stringPtr, attempt); } stringPtr = ptr; stringPtr->maxChars = attempt; SET_STRING(objPtr, stringPtr); } /* *---------------------------------------------------------------------- * * Tcl_NewStringObj -- * * This function is normally called when not debugging: i.e., when * TCL_MEM_DEBUG is not defined. It creates a new string object and * initializes it from the byte pointer and length arguments. * * When TCL_MEM_DEBUG is defined, this function just returns the result * of calling the debugging version Tcl_DbNewStringObj. * * Results: * A newly created string object is returned that has ref count zero. * * Side effects: * The new object's internal string representation will be set to a copy * of the length bytes starting at "bytes". If "length" is negative, use * bytes up to the first NUL byte; i.e., assume "bytes" points to a * C-style NUL-terminated string. The object's type is set to NULL. An * extra NUL is added to the end of the new object's byte array. * *---------------------------------------------------------------------- */ #ifdef TCL_MEM_DEBUG #undef Tcl_NewStringObj Tcl_Obj * Tcl_NewStringObj( const char *bytes, /* Points to the first of the length bytes * used to initialize the new object. */ int length) /* The number of bytes to copy from "bytes" * when initializing the new object. If * negative, use bytes up to the first NUL * byte. */ { return Tcl_DbNewStringObj(bytes, length, "unknown", 0); } #else /* if not TCL_MEM_DEBUG */ Tcl_Obj * Tcl_NewStringObj( const char *bytes, /* Points to the first of the length bytes * used to initialize the new object. */ int length) /* The number of bytes to copy from "bytes" * when initializing the new object. If * negative, use bytes up to the first NUL * byte. */ { Tcl_Obj *objPtr; if (length < 0) { length = (bytes? strlen(bytes) : 0); } TclNewStringObj(objPtr, bytes, length); return objPtr; } #endif /* TCL_MEM_DEBUG */ /* *---------------------------------------------------------------------- * * Tcl_DbNewStringObj -- * * This function is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new string objects. It is the * same as the Tcl_NewStringObj function above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its * caller. This simplifies debugging since then the [memory active] * command will report the correct file name and line number when * reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this function just returns the * result of calling Tcl_NewStringObj. * * Results: * A newly created string object is returned that has ref count zero. * * Side effects: * The new object's internal string representation will be set to a copy * of the length bytes starting at "bytes". If "length" is negative, use * bytes up to the first NUL byte; i.e., assume "bytes" points to a * C-style NUL-terminated string. The object's type is set to NULL. An * extra NUL is added to the end of the new object's byte array. * *---------------------------------------------------------------------- */ #ifdef TCL_MEM_DEBUG Tcl_Obj * Tcl_DbNewStringObj( const char *bytes, /* Points to the first of the length bytes * used to initialize the new object. */ int length, /* The number of bytes to copy from "bytes" * when initializing the new object. If * negative, use bytes up to the first NUL * byte. */ const char *file, /* The name of the source file calling this * function; used for debugging. */ int line) /* Line number in the source file; used for * debugging. */ { Tcl_Obj *objPtr; if (length < 0) { length = (bytes? strlen(bytes) : 0); } TclDbNewObj(objPtr, file, line); TclInitStringRep(objPtr, bytes, length); return objPtr; } #else /* if not TCL_MEM_DEBUG */ Tcl_Obj * Tcl_DbNewStringObj( const char *bytes, /* Points to the first of the length bytes * used to initialize the new object. */ int length, /* The number of bytes to copy from "bytes" * when initializing the new object. If * negative, use bytes up to the first NUL * byte. */ const char *file, /* The name of the source file calling this * function; used for debugging. */ int line) /* Line number in the source file; used for * debugging. */ { return Tcl_NewStringObj(bytes, length); } #endif /* TCL_MEM_DEBUG */ /* *--------------------------------------------------------------------------- * * Tcl_NewUnicodeObj -- * * This function is creates a new String object and initializes it from * the given Unicode String. If the Utf String is the same size as the * Unicode string, don't duplicate the data. * * Results: * The newly created object is returned. This object will have no initial * string representation. The returned object has a ref count of 0. * * Side effects: * Memory allocated for new object and copy of Unicode argument. * *--------------------------------------------------------------------------- */ Tcl_Obj * Tcl_NewUnicodeObj( const Tcl_UniChar *unicode, /* The unicode string used to initialize the * new object. */ int numChars) /* Number of characters in the unicode * string. */ { Tcl_Obj *objPtr; TclNewObj(objPtr); SetUnicodeObj(objPtr, unicode, numChars); return objPtr; } /* *---------------------------------------------------------------------- * * Tcl_GetCharLength -- * * Get the length of the Unicode string from the Tcl object. * * Results: * Pointer to unicode string representing the unicode object. * * Side effects: * Frees old internal rep. Allocates memory for new "String" internal * rep. * *---------------------------------------------------------------------- */ int Tcl_GetCharLength( Tcl_Obj *objPtr) /* The String object to get the num chars * of. */ { String *stringPtr; int numChars; /* * Optimize the case where we're really dealing with a bytearray object * without string representation; we don't need to convert to a string to * perform the get-length operation. */ if (TclIsPureByteArray(objPtr)) { int length; (void) Tcl_GetByteArrayFromObj(objPtr, &length); return length; } /* * OK, need to work with the object as a string. */ SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); numChars = stringPtr->numChars; /* * If numChars is unknown, compute it. */ if (numChars == -1) { TclNumUtfChars(numChars, objPtr->bytes, objPtr->length); stringPtr->numChars = numChars; #if COMPAT if (numChars < objPtr->length) { /* * Since we've just computed the number of chars, and not all UTF * chars are 1-byte long, go ahead and populate the unicode * string. */ FillUnicodeRep(objPtr); } #endif } return numChars; } /* *---------------------------------------------------------------------- * * Tcl_GetUniChar -- * * Get the index'th Unicode character from the String object. The index * is assumed to be in the appropriate range. * * Results: * Returns the index'th Unicode character in the Object. * * Side effects: * Fills unichar with the index'th Unicode character. * *---------------------------------------------------------------------- */ Tcl_UniChar Tcl_GetUniChar( Tcl_Obj *objPtr, /* The object to get the Unicode charater * from. */ int index) /* Get the index'th Unicode character. */ { String *stringPtr; /* * Optimize the case where we're really dealing with a bytearray object * without string representation; we don't need to convert to a string to * perform the indexing operation. */ if (TclIsPureByteArray(objPtr)) { unsigned char *bytes = Tcl_GetByteArrayFromObj(objPtr, NULL); return (Tcl_UniChar) bytes[index]; } /* * OK, need to work with the object as a string. */ SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode == 0) { /* * If numChars is unknown, compute it. */ if (stringPtr->numChars == -1) { TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length); } if (stringPtr->numChars == objPtr->length) { return (Tcl_UniChar) objPtr->bytes[index]; } FillUnicodeRep(objPtr); stringPtr = GET_STRING(objPtr); } return stringPtr->unicode[index]; } /* *---------------------------------------------------------------------- * * Tcl_GetUnicode -- * * Get the Unicode form of the String object. If the object is not * already a String object, it will be converted to one. If the String * object does not have a Unicode rep, then one is create from the UTF * string format. * * Results: * Returns a pointer to the object's internal Unicode string. * * Side effects: * Converts the object to have the String internal rep. * *---------------------------------------------------------------------- */ Tcl_UniChar * Tcl_GetUnicode( Tcl_Obj *objPtr) /* The object to find the unicode string * for. */ { return Tcl_GetUnicodeFromObj(objPtr, NULL); } /* *---------------------------------------------------------------------- * * Tcl_GetUnicodeFromObj -- * * Get the Unicode form of the String object with length. If the object * is not already a String object, it will be converted to one. If the * String object does not have a Unicode rep, then one is create from the * UTF string format. * * Results: * Returns a pointer to the object's internal Unicode string. * * Side effects: * Converts the object to have the String internal rep. * *---------------------------------------------------------------------- */ Tcl_UniChar * Tcl_GetUnicodeFromObj( Tcl_Obj *objPtr, /* The object to find the unicode string * for. */ int *lengthPtr) /* If non-NULL, the location where the string * rep's unichar length should be stored. If * NULL, no length is stored. */ { String *stringPtr; SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode == 0) { FillUnicodeRep(objPtr); stringPtr = GET_STRING(objPtr); } if (lengthPtr != NULL) { *lengthPtr = stringPtr->numChars; } return stringPtr->unicode; } /* *---------------------------------------------------------------------- * * Tcl_GetRange -- * * Create a Tcl Object that contains the chars between first and last of * the object indicated by "objPtr". If the object is not already a * String object, convert it to one. The first and last indices are * assumed to be in the appropriate range. * * Results: * Returns a new Tcl Object of the String type. * * Side effects: * Changes the internal rep of "objPtr" to the String type. * *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_GetRange( Tcl_Obj *objPtr, /* The Tcl object to find the range of. */ int first, /* First index of the range. */ int last) /* Last index of the range. */ { Tcl_Obj *newObjPtr; /* The Tcl object to find the range of. */ String *stringPtr; /* * Optimize the case where we're really dealing with a bytearray object * without string representation; we don't need to convert to a string to * perform the substring operation. */ if (TclIsPureByteArray(objPtr)) { unsigned char *bytes = Tcl_GetByteArrayFromObj(objPtr, NULL); return Tcl_NewByteArrayObj(bytes+first, last-first+1); } /* * OK, need to work with the object as a string. */ SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode == 0) { /* * If numChars is unknown, compute it. */ if (stringPtr->numChars == -1) { TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length); } if (stringPtr->numChars == objPtr->length) { newObjPtr = Tcl_NewStringObj(objPtr->bytes + first, last-first+1); /* * Since we know the char length of the result, store it. */ SetStringFromAny(NULL, newObjPtr); stringPtr = GET_STRING(newObjPtr); stringPtr->numChars = newObjPtr->length; return newObjPtr; } FillUnicodeRep(objPtr); stringPtr = GET_STRING(objPtr); } return Tcl_NewUnicodeObj(stringPtr->unicode + first, last-first+1); } /* *---------------------------------------------------------------------- * * Tcl_SetStringObj -- * * Modify an object to hold a string that is a copy of the bytes * indicated by the byte pointer and length arguments. * * Results: * None. * * Side effects: * The object's string representation will be set to a copy of the * "length" bytes starting at "bytes". If "length" is negative, use bytes * up to the first NUL byte; i.e., assume "bytes" points to a C-style * NUL-terminated string. The object's old string and internal * representations are freed and the object's type is set NULL. * *---------------------------------------------------------------------- */ void Tcl_SetStringObj( Tcl_Obj *objPtr, /* Object whose internal rep to init. */ const char *bytes, /* Points to the first of the length bytes * used to initialize the object. */ int length) /* The number of bytes to copy from "bytes" * when initializing the object. If negative, * use bytes up to the first NUL byte.*/ { if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_SetStringObj"); } /* * Set the type to NULL and free any internal rep for the old type. */ TclFreeIntRep(objPtr); /* * Free any old string rep, then set the string rep to a copy of the * length bytes starting at "bytes". */ TclInvalidateStringRep(objPtr); if (length < 0) { length = (bytes? strlen(bytes) : 0); } TclInitStringRep(objPtr, bytes, length); } /* *---------------------------------------------------------------------- * * Tcl_SetObjLength -- * * This function changes the length of the string representation of an * object. * * Results: * None. * * Side effects: * If the size of objPtr's string representation is greater than length, * then it is reduced to length and a new terminating null byte is stored * in the strength. If the length of the string representation is greater * than length, the storage space is reallocated to the given length; a * null byte is stored at the end, but other bytes past the end of the * original string representation are undefined. The object's internal * representation is changed to "expendable string". * *---------------------------------------------------------------------- */ void Tcl_SetObjLength( Tcl_Obj *objPtr, /* Pointer to object. This object must not * currently be shared. */ int length) /* Number of bytes desired for string * representation of object, not including * terminating null byte. */ { String *stringPtr; if (length < 0) { /* * Setting to a negative length is nonsense. This is probably the * result of overflowing the signed integer range. */ Tcl_Panic("Tcl_SetObjLength: negative length requested: " "%d (integer overflow?)", length); } if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_SetObjLength"); } if (objPtr->bytes && objPtr->length == length) { return; } SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (objPtr->bytes != NULL) { /* * Change length of an existing string rep. */ if (length > stringPtr->allocated) { /* * Need to enlarge the buffer. */ if (objPtr->bytes == tclEmptyStringRep) { objPtr->bytes = ckalloc(length + 1); } else { objPtr->bytes = ckrealloc(objPtr->bytes, length + 1); } stringPtr->allocated = length; } objPtr->length = length; objPtr->bytes[length] = 0; /* * Invalidate the unicode data. */ stringPtr->numChars = -1; stringPtr->hasUnicode = 0; } else { /* * Changing length of pure unicode string. */ stringCheckLimits(length); if (length > stringPtr->maxChars) { stringPtr = stringRealloc(stringPtr, length); SET_STRING(objPtr, stringPtr); stringPtr->maxChars = length; } /* * Mark the new end of the unicode string */ stringPtr->numChars = length; stringPtr->unicode[length] = 0; stringPtr->hasUnicode = 1; /* * Can only get here when objPtr->bytes == NULL. No need to invalidate * the string rep. */ } } /* *---------------------------------------------------------------------- * * Tcl_AttemptSetObjLength -- * * This function changes the length of the string representation of an * object. It uses the attempt* (non-panic'ing) memory allocators. * * Results: * 1 if the requested memory was allocated, 0 otherwise. * * Side effects: * If the size of objPtr's string representation is greater than length, * then it is reduced to length and a new terminating null byte is stored * in the strength. If the length of the string representation is greater * than length, the storage space is reallocated to the given length; a * null byte is stored at the end, but other bytes past the end of the * original string representation are undefined. The object's internal * representation is changed to "expendable string". * *---------------------------------------------------------------------- */ int Tcl_AttemptSetObjLength( Tcl_Obj *objPtr, /* Pointer to object. This object must not * currently be shared. */ int length) /* Number of bytes desired for string * representation of object, not including * terminating null byte. */ { String *stringPtr; if (length < 0) { /* * Setting to a negative length is nonsense. This is probably the * result of overflowing the signed integer range. */ return 0; } if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_AttemptSetObjLength"); } if (objPtr->bytes && objPtr->length == length) { return 1; } SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (objPtr->bytes != NULL) { /* * Change length of an existing string rep. */ if (length > stringPtr->allocated) { /* * Need to enlarge the buffer. */ char *newBytes; if (objPtr->bytes == tclEmptyStringRep) { newBytes = attemptckalloc(length + 1); } else { newBytes = attemptckrealloc(objPtr->bytes, length + 1); } if (newBytes == NULL) { return 0; } objPtr->bytes = newBytes; stringPtr->allocated = length; } objPtr->length = length; objPtr->bytes[length] = 0; /* * Invalidate the unicode data. */ stringPtr->numChars = -1; stringPtr->hasUnicode = 0; } else { /* * Changing length of pure unicode string. */ if (length > STRING_MAXCHARS) { return 0; } if (length > stringPtr->maxChars) { stringPtr = stringAttemptRealloc(stringPtr, length); if (stringPtr == NULL) { return 0; } SET_STRING(objPtr, stringPtr); stringPtr->maxChars = length; } /* * Mark the new end of the unicode string. */ stringPtr->unicode[length] = 0; stringPtr->numChars = length; stringPtr->hasUnicode = 1; /* * Can only get here when objPtr->bytes == NULL. No need to invalidate * the string rep. */ } return 1; } /* *--------------------------------------------------------------------------- * * Tcl_SetUnicodeObj -- * * Modify an object to hold the Unicode string indicated by "unicode". * * Results: * None. * * Side effects: * Memory allocated for new "String" internal rep. * *--------------------------------------------------------------------------- */ void Tcl_SetUnicodeObj( Tcl_Obj *objPtr, /* The object to set the string of. */ const Tcl_UniChar *unicode, /* The unicode string used to initialize the * object. */ int numChars) /* Number of characters in the unicode * string. */ { if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_SetUnicodeObj"); } TclFreeIntRep(objPtr); SetUnicodeObj(objPtr, unicode, numChars); } static int UnicodeLength( const Tcl_UniChar *unicode) { int numChars = 0; if (unicode) { while (numChars >= 0 && unicode[numChars] != 0) { numChars++; } } stringCheckLimits(numChars); return numChars; } static void SetUnicodeObj( Tcl_Obj *objPtr, /* The object to set the string of. */ const Tcl_UniChar *unicode, /* The unicode string used to initialize the * object. */ int numChars) /* Number of characters in the unicode * string. */ { String *stringPtr; if (numChars < 0) { numChars = UnicodeLength(unicode); } /* * Allocate enough space for the String structure + Unicode string. */ stringCheckLimits(numChars); stringPtr = stringAlloc(numChars); SET_STRING(objPtr, stringPtr); objPtr->typePtr = &tclStringType; stringPtr->maxChars = numChars; memcpy(stringPtr->unicode, unicode, numChars * sizeof(Tcl_UniChar)); stringPtr->unicode[numChars] = 0; stringPtr->numChars = numChars; stringPtr->hasUnicode = 1; TclInvalidateStringRep(objPtr); stringPtr->allocated = 0; } /* *---------------------------------------------------------------------- * * Tcl_AppendLimitedToObj -- * * This function appends a limited number of bytes from a sequence of * bytes to an object, marking any limitation with an ellipsis. * * Results: * None. * * Side effects: * The bytes at *bytes are appended to the string representation of * objPtr. * *---------------------------------------------------------------------- */ void Tcl_AppendLimitedToObj( Tcl_Obj *objPtr, /* Points to the object to append to. */ const char *bytes, /* Points to the bytes to append to the * object. */ int length, /* The number of bytes available to be * appended from "bytes". If < 0, then all * bytes up to a NUL byte are available. */ int limit, /* The maximum number of bytes to append to * the object. */ const char *ellipsis) /* Ellipsis marker string, appended to the * object to indicate not all available bytes * at "bytes" were appended. */ { String *stringPtr; int toCopy = 0; if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_AppendLimitedToObj"); } if (length < 0) { length = (bytes ? strlen(bytes) : 0); } if (length == 0) { return; } if (length <= limit) { toCopy = length; } else { if (ellipsis == NULL) { ellipsis = "..."; } toCopy = (bytes == NULL) ? limit : Tcl_UtfPrev(bytes+limit+1-strlen(ellipsis), bytes) - bytes; } /* * If objPtr has a valid Unicode rep, then append the Unicode conversion * of "bytes" to the objPtr's Unicode rep, otherwise append "bytes" to * objPtr's string rep. */ SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode && stringPtr->numChars > 0) { AppendUtfToUnicodeRep(objPtr, bytes, toCopy); } else { AppendUtfToUtfRep(objPtr, bytes, toCopy); } if (length <= limit) { return; } stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode && stringPtr->numChars > 0) { AppendUtfToUnicodeRep(objPtr, ellipsis, strlen(ellipsis)); } else { AppendUtfToUtfRep(objPtr, ellipsis, strlen(ellipsis)); } } /* *---------------------------------------------------------------------- * * Tcl_AppendToObj -- * * This function appends a sequence of bytes to an object. * * Results: * None. * * Side effects: * The bytes at *bytes are appended to the string representation of * objPtr. * *---------------------------------------------------------------------- */ void Tcl_AppendToObj( Tcl_Obj *objPtr, /* Points to the object to append to. */ const char *bytes, /* Points to the bytes to append to the * object. */ int length) /* The number of bytes to append from "bytes". * If < 0, then append all bytes up to NUL * byte. */ { Tcl_AppendLimitedToObj(objPtr, bytes, length, INT_MAX, NULL); } /* *---------------------------------------------------------------------- * * Tcl_AppendUnicodeToObj -- * * This function appends a Unicode string to an object in the most * efficient manner possible. Length must be >= 0. * * Results: * None. * * Side effects: * Invalidates the string rep and creates a new Unicode string. * *---------------------------------------------------------------------- */ void Tcl_AppendUnicodeToObj( Tcl_Obj *objPtr, /* Points to the object to append to. */ const Tcl_UniChar *unicode, /* The unicode string to append to the * object. */ int length) /* Number of chars in "unicode". */ { String *stringPtr; if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_AppendUnicodeToObj"); } if (length == 0) { return; } SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); /* * If objPtr has a valid Unicode rep, then append the "unicode" to the * objPtr's Unicode rep, otherwise the UTF conversion of "unicode" to * objPtr's string rep. */ if (stringPtr->hasUnicode #if COMPAT && stringPtr->numChars > 0 #endif ) { AppendUnicodeToUnicodeRep(objPtr, unicode, length); } else { AppendUnicodeToUtfRep(objPtr, unicode, length); } } /* *---------------------------------------------------------------------- * * Tcl_AppendObjToObj -- * * This function appends the string rep of one object to another. * "objPtr" cannot be a shared object. * * Results: * None. * * Side effects: * The string rep of appendObjPtr is appended to the string * representation of objPtr. * *---------------------------------------------------------------------- */ void Tcl_AppendObjToObj( Tcl_Obj *objPtr, /* Points to the object to append to. */ Tcl_Obj *appendObjPtr) /* Object to append. */ { String *stringPtr; int length, numChars, appendNumChars = -1; const char *bytes; /* * Special case: second object is standard-empty is fast case. We know * that appending nothing to anything leaves that starting anything... */ if (appendObjPtr->bytes == tclEmptyStringRep) { return; } /* * Handle append of one bytearray object to another as a special case. * Note that we only do this when the objects don't have string reps; if * it did, then appending the byte arrays together could well lose * information; this is a special-case optimization only. */ if ((TclIsPureByteArray(objPtr) || objPtr->bytes == tclEmptyStringRep) && TclIsPureByteArray(appendObjPtr)) { /* * You might expect the code here to be * * bytes = Tcl_GetByteArrayFromObj(appendObjPtr, &length); * TclAppendBytesToByteArray(objPtr, bytes, length); * * and essentially all of the time that would be fine. However, * it would run into trouble in the case where objPtr and * appendObjPtr point to the same thing. That may never be a * good idea. It seems to violate Copy On Write, and we don't * have any tests for the situation, since making any Tcl commands * that call Tcl_AppendObjToObj() do that appears impossible * (They honor Copy On Write!). For the sake of extensions that * go off into that realm, though, here's a more complex approach * that can handle all the cases. */ /* Get lengths */ int lengthSrc; (void) Tcl_GetByteArrayFromObj(objPtr, &length); (void) Tcl_GetByteArrayFromObj(appendObjPtr, &lengthSrc); /* Grow buffer enough for the append */ TclAppendBytesToByteArray(objPtr, NULL, lengthSrc); /* Reset objPtr back to the original value */ Tcl_SetByteArrayLength(objPtr, length); /* * Now do the append knowing that buffer growth cannot cause * any trouble. */ TclAppendBytesToByteArray(objPtr, Tcl_GetByteArrayFromObj(appendObjPtr, NULL), lengthSrc); return; } /* * Must append as strings. */ SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); /* * If objPtr has a valid Unicode rep, then get a Unicode string from * appendObjPtr and append it. */ if (stringPtr->hasUnicode #if COMPAT && stringPtr->numChars > 0 #endif ) { /* * If appendObjPtr is not of the "String" type, don't convert it. */ if (appendObjPtr->typePtr == &tclStringType) { Tcl_UniChar *unicode = Tcl_GetUnicodeFromObj(appendObjPtr, &numChars); AppendUnicodeToUnicodeRep(objPtr, unicode, numChars); } else { bytes = TclGetStringFromObj(appendObjPtr, &length); AppendUtfToUnicodeRep(objPtr, bytes, length); } return; } /* * Append to objPtr's UTF string rep. If we know the number of characters * in both objects before appending, then set the combined number of * characters in the final (appended-to) object. */ bytes = TclGetStringFromObj(appendObjPtr, &length); numChars = stringPtr->numChars; if ((numChars >= 0) && (appendObjPtr->typePtr == &tclStringType)) { String *appendStringPtr = GET_STRING(appendObjPtr); appendNumChars = appendStringPtr->numChars; } AppendUtfToUtfRep(objPtr, bytes, length); if (numChars >= 0 && appendNumChars >= 0 #if COMPAT && appendNumChars == length #endif ) { stringPtr->numChars = numChars + appendNumChars; } } /* *---------------------------------------------------------------------- * * AppendUnicodeToUnicodeRep -- * * This function appends the contents of "unicode" to the Unicode rep of * "objPtr". objPtr must already have a valid Unicode rep. * * Results: * None. * * Side effects: * objPtr's internal rep is reallocated. * *---------------------------------------------------------------------- */ static void AppendUnicodeToUnicodeRep( Tcl_Obj *objPtr, /* Points to the object to append to. */ const Tcl_UniChar *unicode, /* String to append. */ int appendNumChars) /* Number of chars of "unicode" to append. */ { String *stringPtr; int numChars; if (appendNumChars < 0) { appendNumChars = UnicodeLength(unicode); } if (appendNumChars == 0) { return; } SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); /* * If not enough space has been allocated for the unicode rep, reallocate * the internal rep object with additional space. First try to double the * required allocation; if that fails, try a more modest increase. See the * "TCL STRING GROWTH ALGORITHM" comment at the top of this file for an * explanation of this growth algorithm. */ numChars = stringPtr->numChars + appendNumChars; stringCheckLimits(numChars); if (numChars > stringPtr->maxChars) { int offset = -1; /* * Protect against case where unicode points into the existing * stringPtr->unicode array. Force it to follow any relocations due to * the reallocs below. */ if (unicode && unicode >= stringPtr->unicode && unicode <= stringPtr->unicode + stringPtr->maxChars) { offset = unicode - stringPtr->unicode; } GrowUnicodeBuffer(objPtr, numChars); stringPtr = GET_STRING(objPtr); /* * Relocate unicode if needed; see above. */ if (offset >= 0) { unicode = stringPtr->unicode + offset; } } /* * Copy the new string onto the end of the old string, then add the * trailing null. */ if (unicode) { memmove(stringPtr->unicode + stringPtr->numChars, unicode, appendNumChars * sizeof(Tcl_UniChar)); } stringPtr->unicode[numChars] = 0; stringPtr->numChars = numChars; stringPtr->allocated = 0; TclInvalidateStringRep(objPtr); } /* *---------------------------------------------------------------------- * * AppendUnicodeToUtfRep -- * * This function converts the contents of "unicode" to UTF and appends * the UTF to the string rep of "objPtr". * * Results: * None. * * Side effects: * objPtr's internal rep is reallocated. * *---------------------------------------------------------------------- */ static void AppendUnicodeToUtfRep( Tcl_Obj *objPtr, /* Points to the object to append to. */ const Tcl_UniChar *unicode, /* String to convert to UTF. */ int numChars) /* Number of chars of "unicode" to convert. */ { String *stringPtr = GET_STRING(objPtr); numChars = ExtendStringRepWithUnicode(objPtr, unicode, numChars); if (stringPtr->numChars != -1) { stringPtr->numChars += numChars; } #if COMPAT /* * Invalidate the unicode rep. */ stringPtr->hasUnicode = 0; #endif } /* *---------------------------------------------------------------------- * * AppendUtfToUnicodeRep -- * * This function converts the contents of "bytes" to Unicode and appends * the Unicode to the Unicode rep of "objPtr". objPtr must already have a * valid Unicode rep. numBytes must be non-negative. * * Results: * None. * * Side effects: * objPtr's internal rep is reallocated. * *---------------------------------------------------------------------- */ static void AppendUtfToUnicodeRep( Tcl_Obj *objPtr, /* Points to the object to append to. */ const char *bytes, /* String to convert to Unicode. */ int numBytes) /* Number of bytes of "bytes" to convert. */ { String *stringPtr; if (numBytes == 0) { return; } ExtendUnicodeRepWithString(objPtr, bytes, numBytes, -1); TclInvalidateStringRep(objPtr); stringPtr = GET_STRING(objPtr); stringPtr->allocated = 0; } /* *---------------------------------------------------------------------- * * AppendUtfToUtfRep -- * * This function appends "numBytes" bytes of "bytes" to the UTF string * rep of "objPtr". objPtr must already have a valid String rep. * numBytes must be non-negative. * * Results: * None. * * Side effects: * objPtr's internal rep is reallocated. * *---------------------------------------------------------------------- */ static void AppendUtfToUtfRep( Tcl_Obj *objPtr, /* Points to the object to append to. */ const char *bytes, /* String to append. */ int numBytes) /* Number of bytes of "bytes" to append. */ { String *stringPtr; int newLength, oldLength; if (numBytes == 0) { return; } /* * Copy the new string onto the end of the old string, then add the * trailing null. */ if (objPtr->bytes == NULL) { objPtr->length = 0; } oldLength = objPtr->length; newLength = numBytes + oldLength; if (newLength < 0) { Tcl_Panic("max size for a Tcl value (%d bytes) exceeded", INT_MAX); } stringPtr = GET_STRING(objPtr); if (newLength > stringPtr->allocated) { int offset = -1; /* * Protect against case where unicode points into the existing * stringPtr->unicode array. Force it to follow any relocations due to * the reallocs below. */ if (bytes && bytes >= objPtr->bytes && bytes <= objPtr->bytes + objPtr->length) { offset = bytes - objPtr->bytes; } /* * TODO: consider passing flag=1: no overalloc on first append. This * would make test stringObj-8.1 fail. */ GrowStringBuffer(objPtr, newLength, 0); /* * Relocate bytes if needed; see above. */ if (offset >= 0) { bytes = objPtr->bytes + offset; } } /* * Invalidate the unicode data. */ stringPtr->numChars = -1; stringPtr->hasUnicode = 0; if (bytes) { memmove(objPtr->bytes + oldLength, bytes, numBytes); } objPtr->bytes[newLength] = 0; objPtr->length = newLength; } /* *---------------------------------------------------------------------- * * Tcl_AppendStringsToObjVA -- * * This function appends one or more null-terminated strings to an * object. * * Results: * None. * * Side effects: * The contents of all the string arguments are appended to the string * representation of objPtr. * *---------------------------------------------------------------------- */ void Tcl_AppendStringsToObjVA( Tcl_Obj *objPtr, /* Points to the object to append to. */ va_list argList) /* Variable argument list. */ { if (Tcl_IsShared(objPtr)) { Tcl_Panic("%s called with shared object", "Tcl_AppendStringsToObj"); } while (1) { const char *bytes = va_arg(argList, char *); if (bytes == NULL) { break; } Tcl_AppendToObj(objPtr, bytes, -1); } } /* *---------------------------------------------------------------------- * * Tcl_AppendStringsToObj -- * * This function appends one or more null-terminated strings to an * object. * * Results: * None. * * Side effects: * The contents of all the string arguments are appended to the string * representation of objPtr. * *---------------------------------------------------------------------- */ void Tcl_AppendStringsToObj( Tcl_Obj *objPtr, ...) { va_list argList; va_start(argList, objPtr); Tcl_AppendStringsToObjVA(objPtr, argList); va_end(argList); } /* *---------------------------------------------------------------------- * * Tcl_AppendFormatToObj -- * * This function appends a list of Tcl_Obj's to a Tcl_Obj according to * the formatting instructions embedded in the format string. The * formatting instructions are inspired by sprintf(). Returns TCL_OK when * successful. If there's an error in the arguments, TCL_ERROR is * returned, and an error message is written to the interp, if non-NULL. * * Results: * A standard Tcl result. * * Side effects: * None. * *---------------------------------------------------------------------- */ int Tcl_AppendFormatToObj( Tcl_Interp *interp, Tcl_Obj *appendObj, const char *format, int objc, Tcl_Obj *const objv[]) { const char *span = format, *msg, *errCode; int numBytes = 0, objIndex = 0, gotXpg = 0, gotSequential = 0; int originalLength, limit; static const char *mixedXPG = "cannot mix \"%\" and \"%n$\" conversion specifiers"; static const char *const badIndex[2] = { "not enough arguments for all format specifiers", "\"%n$\" argument index out of range" }; static const char *overflow = "max size for a Tcl value exceeded"; if (Tcl_IsShared(appendObj)) { Tcl_Panic("%s called with shared object", "Tcl_AppendFormatToObj"); } TclGetStringFromObj(appendObj, &originalLength); limit = INT_MAX - originalLength; /* * Format string is NUL-terminated. */ while (*format != '\0') { char *end; int gotMinus, gotHash, gotZero, gotSpace, gotPlus, sawFlag; int width, gotPrecision, precision, useShort, useWide, useBig; int newXpg, numChars, allocSegment = 0, segmentLimit, segmentNumBytes; Tcl_Obj *segment; Tcl_UniChar ch; int step = Tcl_UtfToUniChar(format, &ch); format += step; if (ch != '%') { numBytes += step; continue; } if (numBytes) { if (numBytes > limit) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } Tcl_AppendToObj(appendObj, span, numBytes); limit -= numBytes; numBytes = 0; } /* * Saw a % : process the format specifier. * * Step 0. Handle special case of escaped format marker (i.e., %%). */ step = Tcl_UtfToUniChar(format, &ch); if (ch == '%') { span = format; numBytes = step; format += step; continue; } /* * Step 1. XPG3 position specifier */ newXpg = 0; if (isdigit(UCHAR(ch))) { int position = strtoul(format, &end, 10); if (*end == '$') { newXpg = 1; objIndex = position - 1; format = end + 1; step = Tcl_UtfToUniChar(format, &ch); } } if (newXpg) { if (gotSequential) { msg = mixedXPG; errCode = "MIXEDSPECTYPES"; goto errorMsg; } gotXpg = 1; } else { if (gotXpg) { msg = mixedXPG; errCode = "MIXEDSPECTYPES"; goto errorMsg; } gotSequential = 1; } if ((objIndex < 0) || (objIndex >= objc)) { msg = badIndex[gotXpg]; errCode = gotXpg ? "INDEXRANGE" : "FIELDVARMISMATCH"; goto errorMsg; } /* * Step 2. Set of flags. */ gotMinus = gotHash = gotZero = gotSpace = gotPlus = 0; sawFlag = 1; do { switch (ch) { case '-': gotMinus = 1; break; case '#': gotHash = 1; break; case '0': gotZero = 1; break; case ' ': gotSpace = 1; break; case '+': gotPlus = 1; break; default: sawFlag = 0; } if (sawFlag) { format += step; step = Tcl_UtfToUniChar(format, &ch); } } while (sawFlag); /* * Step 3. Minimum field width. */ width = 0; if (isdigit(UCHAR(ch))) { width = strtoul(format, &end, 10); format = end; step = Tcl_UtfToUniChar(format, &ch); } else if (ch == '*') { if (objIndex >= objc - 1) { msg = badIndex[gotXpg]; errCode = gotXpg ? "INDEXRANGE" : "FIELDVARMISMATCH"; goto errorMsg; } if (TclGetIntFromObj(interp, objv[objIndex], &width) != TCL_OK) { goto error; } if (width < 0) { width = -width; gotMinus = 1; } objIndex++; format += step; step = Tcl_UtfToUniChar(format, &ch); } if (width > limit) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } /* * Step 4. Precision. */ gotPrecision = precision = 0; if (ch == '.') { gotPrecision = 1; format += step; step = Tcl_UtfToUniChar(format, &ch); } if (isdigit(UCHAR(ch))) { precision = strtoul(format, &end, 10); format = end; step = Tcl_UtfToUniChar(format, &ch); } else if (ch == '*') { if (objIndex >= objc - 1) { msg = badIndex[gotXpg]; errCode = gotXpg ? "INDEXRANGE" : "FIELDVARMISMATCH"; goto errorMsg; } if (TclGetIntFromObj(interp, objv[objIndex], &precision) != TCL_OK) { goto error; } /* * TODO: Check this truncation logic. */ if (precision < 0) { precision = 0; } objIndex++; format += step; step = Tcl_UtfToUniChar(format, &ch); } /* * Step 5. Length modifier. */ useShort = useWide = useBig = 0; if (ch == 'h') { useShort = 1; format += step; step = Tcl_UtfToUniChar(format, &ch); } else if (ch == 'l') { format += step; step = Tcl_UtfToUniChar(format, &ch); if (ch == 'l') { useBig = 1; format += step; step = Tcl_UtfToUniChar(format, &ch); #ifndef TCL_WIDE_INT_IS_LONG } else { useWide = 1; #endif } } format += step; span = format; /* * Step 6. The actual conversion character. */ segment = objv[objIndex]; numChars = -1; if (ch == 'i') { ch = 'd'; } switch (ch) { case '\0': msg = "format string ended in middle of field specifier"; errCode = "INCOMPLETE"; goto errorMsg; case 's': if (gotPrecision) { numChars = Tcl_GetCharLength(segment); if (precision < numChars) { segment = Tcl_GetRange(segment, 0, precision - 1); numChars = precision; Tcl_IncrRefCount(segment); allocSegment = 1; } } break; case 'c': { char buf[TCL_UTF_MAX]; int code, length; if (TclGetIntFromObj(interp, segment, &code) != TCL_OK) { goto error; } length = Tcl_UniCharToUtf(code, buf); segment = Tcl_NewStringObj(buf, length); Tcl_IncrRefCount(segment); allocSegment = 1; break; } case 'u': if (useBig) { msg = "unsigned bignum format is invalid"; errCode = "BADUNSIGNED"; goto errorMsg; } case 'd': case 'o': case 'x': case 'X': case 'b': { short s = 0; /* Silence compiler warning; only defined and * used when useShort is true. */ long l; Tcl_WideInt w; mp_int big; int toAppend, isNegative = 0; if (useBig) { if (Tcl_GetBignumFromObj(interp, segment, &big) != TCL_OK) { goto error; } isNegative = (mp_cmp_d(&big, 0) == MP_LT); } else if (useWide) { if (Tcl_GetWideIntFromObj(NULL, segment, &w) != TCL_OK) { Tcl_Obj *objPtr; if (Tcl_GetBignumFromObj(interp,segment,&big) != TCL_OK) { goto error; } mp_mod_2d(&big, (int) CHAR_BIT*sizeof(Tcl_WideInt), &big); objPtr = Tcl_NewBignumObj(&big); Tcl_IncrRefCount(objPtr); Tcl_GetWideIntFromObj(NULL, objPtr, &w); Tcl_DecrRefCount(objPtr); } isNegative = (w < (Tcl_WideInt) 0); } else if (TclGetLongFromObj(NULL, segment, &l) != TCL_OK) { if (Tcl_GetWideIntFromObj(NULL, segment, &w) != TCL_OK) { Tcl_Obj *objPtr; if (Tcl_GetBignumFromObj(interp,segment,&big) != TCL_OK) { goto error; } mp_mod_2d(&big, (int) CHAR_BIT * sizeof(long), &big); objPtr = Tcl_NewBignumObj(&big); Tcl_IncrRefCount(objPtr); TclGetLongFromObj(NULL, objPtr, &l); Tcl_DecrRefCount(objPtr); } else { l = Tcl_WideAsLong(w); } if (useShort) { s = (short) l; isNegative = (s < (short) 0); } else { isNegative = (l < (long) 0); } } else if (useShort) { s = (short) l; isNegative = (s < (short) 0); } else { isNegative = (l < (long) 0); } segment = Tcl_NewObj(); allocSegment = 1; segmentLimit = INT_MAX; Tcl_IncrRefCount(segment); if ((isNegative || gotPlus || gotSpace) && (useBig || ch=='d')) { Tcl_AppendToObj(segment, (isNegative ? "-" : gotPlus ? "+" : " "), 1); segmentLimit -= 1; } if (gotHash) { switch (ch) { case 'o': Tcl_AppendToObj(segment, "0", 1); segmentLimit -= 1; precision--; break; case 'x': case 'X': Tcl_AppendToObj(segment, "0x", 2); segmentLimit -= 2; break; case 'b': Tcl_AppendToObj(segment, "0b", 2); segmentLimit -= 2; break; } } switch (ch) { case 'd': { int length; Tcl_Obj *pure; const char *bytes; if (useShort) { pure = Tcl_NewIntObj((int) s); } else if (useWide) { pure = Tcl_NewWideIntObj(w); } else if (useBig) { pure = Tcl_NewBignumObj(&big); } else { pure = Tcl_NewLongObj(l); } Tcl_IncrRefCount(pure); bytes = TclGetStringFromObj(pure, &length); /* * Already did the sign above. */ if (*bytes == '-') { length--; bytes++; } toAppend = length; /* * Canonical decimal string reps for integers are composed * entirely of one-byte encoded characters, so "length" is the * number of chars. */ if (gotPrecision) { if (length < precision) { segmentLimit -= precision - length; } while (length < precision) { Tcl_AppendToObj(segment, "0", 1); length++; } gotZero = 0; } if (gotZero) { length += Tcl_GetCharLength(segment); if (length < width) { segmentLimit -= width - length; } while (length < width) { Tcl_AppendToObj(segment, "0", 1); length++; } } if (toAppend > segmentLimit) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } Tcl_AppendToObj(segment, bytes, toAppend); Tcl_DecrRefCount(pure); break; } case 'u': case 'o': case 'x': case 'X': case 'b': { Tcl_WideUInt bits = (Tcl_WideUInt) 0; Tcl_WideInt numDigits = (Tcl_WideInt) 0; int length, numBits = 4, base = 16, index = 0, shift = 0; Tcl_Obj *pure; char *bytes; if (ch == 'u') { base = 10; } else if (ch == 'o') { base = 8; numBits = 3; } else if (ch == 'b') { base = 2; numBits = 1; } if (useShort) { unsigned short us = (unsigned short) s; bits = (Tcl_WideUInt) us; while (us) { numDigits++; us /= base; } } else if (useWide) { Tcl_WideUInt uw = (Tcl_WideUInt) w; bits = uw; while (uw) { numDigits++; uw /= base; } } else if (useBig && big.used) { int leftover = (big.used * DIGIT_BIT) % numBits; mp_digit mask = (~(mp_digit)0) << (DIGIT_BIT-leftover); numDigits = 1 + (((Tcl_WideInt) big.used * DIGIT_BIT) / numBits); while ((mask & big.dp[big.used-1]) == 0) { numDigits--; mask >>= numBits; } if (numDigits > INT_MAX) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } } else if (!useBig) { unsigned long ul = (unsigned long) l; bits = (Tcl_WideUInt) ul; while (ul) { numDigits++; ul /= base; } } /* * Need to be sure zero becomes "0", not "". */ if ((numDigits == 0) && !((ch == 'o') && gotHash)) { numDigits = 1; } pure = Tcl_NewObj(); Tcl_SetObjLength(pure, (int) numDigits); bytes = TclGetString(pure); toAppend = length = (int) numDigits; while (numDigits--) { int digitOffset; if (useBig && big.used) { if (index < big.used && (size_t) shift < CHAR_BIT*sizeof(Tcl_WideUInt) - DIGIT_BIT) { bits |= ((Tcl_WideUInt) big.dp[index++]) << shift; shift += DIGIT_BIT; } shift -= numBits; } digitOffset = (int) (bits % base); if (digitOffset > 9) { bytes[numDigits] = 'a' + digitOffset - 10; } else { bytes[numDigits] = '0' + digitOffset; } bits /= base; } if (useBig) { mp_clear(&big); } if (gotPrecision) { if (length < precision) { segmentLimit -= precision - length; } while (length < precision) { Tcl_AppendToObj(segment, "0", 1); length++; } gotZero = 0; } if (gotZero) { length += Tcl_GetCharLength(segment); if (length < width) { segmentLimit -= width - length; } while (length < width) { Tcl_AppendToObj(segment, "0", 1); length++; } } if (toAppend > segmentLimit) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } Tcl_AppendObjToObj(segment, pure); Tcl_DecrRefCount(pure); break; } } break; } case 'e': case 'E': case 'f': case 'g': case 'G': { #define MAX_FLOAT_SIZE 320 char spec[2*TCL_INTEGER_SPACE + 9], *p = spec; double d; int length = MAX_FLOAT_SIZE; char *bytes; if (Tcl_GetDoubleFromObj(interp, segment, &d) != TCL_OK) { /* TODO: Figure out ACCEPT_NAN here */ goto error; } *p++ = '%'; if (gotMinus) { *p++ = '-'; } if (gotHash) { *p++ = '#'; } if (gotZero) { *p++ = '0'; } if (gotSpace) { *p++ = ' '; } if (gotPlus) { *p++ = '+'; } if (width) { p += sprintf(p, "%d", width); if (width > length) { length = width; } } if (gotPrecision) { *p++ = '.'; p += sprintf(p, "%d", precision); if (precision > INT_MAX - length) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } length += precision; } /* * Don't pass length modifiers! */ *p++ = (char) ch; *p = '\0'; segment = Tcl_NewObj(); allocSegment = 1; if (!Tcl_AttemptSetObjLength(segment, length)) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } bytes = TclGetString(segment); if (!Tcl_AttemptSetObjLength(segment, sprintf(bytes, spec, d))) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } break; } default: if (interp != NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("bad field specifier \"%c\"", ch)); Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADTYPE", NULL); } goto error; } switch (ch) { case 'E': case 'G': case 'X': { Tcl_SetObjLength(segment, Tcl_UtfToUpper(TclGetString(segment))); } } if (width>0 && numChars<0) { numChars = Tcl_GetCharLength(segment); } if (!gotMinus && width>0) { if (numChars < width) { limit -= width - numChars; } while (numChars < width) { Tcl_AppendToObj(appendObj, (gotZero ? "0" : " "), 1); numChars++; } } Tcl_GetStringFromObj(segment, &segmentNumBytes); if (segmentNumBytes > limit) { if (allocSegment) { Tcl_DecrRefCount(segment); } msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } Tcl_AppendObjToObj(appendObj, segment); limit -= segmentNumBytes; if (allocSegment) { Tcl_DecrRefCount(segment); } if (width > 0) { if (numChars < width) { limit -= width-numChars; } while (numChars < width) { Tcl_AppendToObj(appendObj, (gotZero ? "0" : " "), 1); numChars++; } } objIndex += gotSequential; } if (numBytes) { if (numBytes > limit) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } Tcl_AppendToObj(appendObj, span, numBytes); limit -= numBytes; numBytes = 0; } return TCL_OK; errorMsg: if (interp != NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj(msg, -1)); Tcl_SetErrorCode(interp, "TCL", "FORMAT", errCode, NULL); } error: Tcl_SetObjLength(appendObj, originalLength); return TCL_ERROR; } /* *--------------------------------------------------------------------------- * * Tcl_Format-- * * Results: * A refcount zero Tcl_Obj. * * Side effects: * None. * *--------------------------------------------------------------------------- */ Tcl_Obj * Tcl_Format( Tcl_Interp *interp, const char *format, int objc, Tcl_Obj *const objv[]) { int result; Tcl_Obj *objPtr = Tcl_NewObj(); result = Tcl_AppendFormatToObj(interp, objPtr, format, objc, objv); if (result != TCL_OK) { Tcl_DecrRefCount(objPtr); return NULL; } return objPtr; } /* *--------------------------------------------------------------------------- * * AppendPrintfToObjVA -- * * Results: * * Side effects: * *--------------------------------------------------------------------------- */ static void AppendPrintfToObjVA( Tcl_Obj *objPtr, const char *format, va_list argList) { int code, objc; Tcl_Obj **objv, *list = Tcl_NewObj(); const char *p; p = format; Tcl_IncrRefCount(list); while (*p != '\0') { int size = 0, seekingConversion = 1, gotPrecision = 0; int lastNum = -1; if (*p++ != '%') { continue; } if (*p == '%') { p++; continue; } do { switch (*p) { case '\0': seekingConversion = 0; break; case 's': { const char *q, *end, *bytes = va_arg(argList, char *); seekingConversion = 0; /* * The buffer to copy characters from starts at bytes and ends * at either the first NUL byte, or after lastNum bytes, when * caller has indicated a limit. */ end = bytes; while ((!gotPrecision || lastNum--) && (*end != '\0')) { end++; } /* * Within that buffer, we trim both ends if needed so that we * copy only whole characters, and avoid copying any partial * multi-byte characters. */ q = Tcl_UtfPrev(end, bytes); if (!Tcl_UtfCharComplete(q, (int)(end - q))) { end = q; } q = bytes + TCL_UTF_MAX; while ((bytes < end) && (bytes < q) && ((*bytes & 0xC0) == 0x80)) { bytes++; } Tcl_ListObjAppendElement(NULL, list, Tcl_NewStringObj(bytes , (int)(end - bytes))); break; } case 'c': case 'i': case 'u': case 'd': case 'o': case 'x': case 'X': seekingConversion = 0; switch (size) { case -1: case 0: Tcl_ListObjAppendElement(NULL, list, Tcl_NewLongObj( (long) va_arg(argList, int))); break; case 1: Tcl_ListObjAppendElement(NULL, list, Tcl_NewLongObj( va_arg(argList, long))); break; } break; case 'e': case 'E': case 'f': case 'g': case 'G': Tcl_ListObjAppendElement(NULL, list, Tcl_NewDoubleObj( va_arg(argList, double))); seekingConversion = 0; break; case '*': lastNum = (int) va_arg(argList, int); Tcl_ListObjAppendElement(NULL, list, Tcl_NewIntObj(lastNum)); p++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { char *end; lastNum = (int) strtoul(p, &end, 10); p = end; break; } case '.': gotPrecision = 1; p++; break; /* TODO: support for wide (and bignum?) arguments */ case 'l': size = 1; p++; break; case 'h': size = -1; default: p++; } } while (seekingConversion); } TclListObjGetElements(NULL, list, &objc, &objv); code = Tcl_AppendFormatToObj(NULL, objPtr, format, objc, objv); if (code != TCL_OK) { Tcl_AppendPrintfToObj(objPtr, "Unable to format \"%s\" with supplied arguments: %s", format, Tcl_GetString(list)); } Tcl_DecrRefCount(list); } /* *--------------------------------------------------------------------------- * * Tcl_AppendPrintfToObj -- * * Results: * A standard Tcl result. * * Side effects: * None. * *--------------------------------------------------------------------------- */ void Tcl_AppendPrintfToObj( Tcl_Obj *objPtr, const char *format, ...) { va_list argList; va_start(argList, format); AppendPrintfToObjVA(objPtr, format, argList); va_end(argList); } /* *--------------------------------------------------------------------------- * * Tcl_ObjPrintf -- * * Results: * A refcount zero Tcl_Obj. * * Side effects: * None. * *--------------------------------------------------------------------------- */ Tcl_Obj * Tcl_ObjPrintf( const char *format, ...) { va_list argList; Tcl_Obj *objPtr = Tcl_NewObj(); va_start(argList, format); AppendPrintfToObjVA(objPtr, format, argList); va_end(argList); return objPtr; } /* *--------------------------------------------------------------------------- * * TclGetStringStorage -- * * Returns the string storage space of a Tcl_Obj. * * Results: * The pointer value objPtr->bytes is returned and the number of bytes * allocated there is written to *sizePtr (if known). * * Side effects: * May set objPtr->bytes. * *--------------------------------------------------------------------------- */ char * TclGetStringStorage( Tcl_Obj *objPtr, unsigned int *sizePtr) { String *stringPtr; if (objPtr->typePtr != &tclStringType || objPtr->bytes == NULL) { return TclGetStringFromObj(objPtr, (int *)sizePtr); } stringPtr = GET_STRING(objPtr); *sizePtr = stringPtr->allocated; return objPtr->bytes; } /* *--------------------------------------------------------------------------- * * TclStringObjReverse -- * * Implements the [string reverse] operation. * * Results: * An unshared Tcl value which is the [string reverse] of the argument * supplied. When sharing rules permit, the returned value might be the * argument with modifications done in place. * * Side effects: * May allocate a new Tcl_Obj. * *--------------------------------------------------------------------------- */ static void ReverseBytes( unsigned char *to, /* Copy bytes into here... */ unsigned char *from, /* ...from here... */ int count) /* Until this many are copied, */ /* reversing as you go. */ { unsigned char *src = from + count; if (to == from) { /* Reversing in place */ while (--src > to) { unsigned char c = *src; *src = *to; *to++ = c; } } else { while (--src >= from) { *to++ = *src; } } } Tcl_Obj * TclStringObjReverse( Tcl_Obj *objPtr) { String *stringPtr; Tcl_UniChar ch; if (TclIsPureByteArray(objPtr)) { int numBytes; unsigned char *from = Tcl_GetByteArrayFromObj(objPtr, &numBytes); if (Tcl_IsShared(objPtr)) { objPtr = Tcl_NewByteArrayObj(NULL, numBytes); } ReverseBytes(Tcl_GetByteArrayFromObj(objPtr, NULL), from, numBytes); return objPtr; } SetStringFromAny(NULL, objPtr); stringPtr = GET_STRING(objPtr); if (stringPtr->hasUnicode) { Tcl_UniChar *from = Tcl_GetUnicode(objPtr); Tcl_UniChar *src = from + stringPtr->numChars; if (Tcl_IsShared(objPtr)) { Tcl_UniChar *to; /* * Create a non-empty, pure unicode value, so we can coax * Tcl_SetObjLength into growing the unicode rep buffer. */ ch = 0; objPtr = Tcl_NewUnicodeObj(&ch, 1); Tcl_SetObjLength(objPtr, stringPtr->numChars); to = Tcl_GetUnicode(objPtr); while (--src >= from) { *to++ = *src; } } else { /* Reversing in place */ while (--src > from) { ch = *src; *src = *from; *from++ = ch; } } } if (objPtr->bytes) { int numChars = stringPtr->numChars; int numBytes = objPtr->length; char *to, *from = objPtr->bytes; if (Tcl_IsShared(objPtr)) { objPtr = Tcl_NewObj(); Tcl_SetObjLength(objPtr, numBytes); } to = objPtr->bytes; if (numChars < numBytes) { /* * Either numChars == -1 and we don't know how many chars are * represented by objPtr->bytes and we need Pass 1 just in case, * or numChars >= 0 and we know we have fewer chars than bytes, * so we know there's a multibyte character needing Pass 1. * * Pass 1. Reverse the bytes of each multi-byte character. */ int charCount = 0; int bytesLeft = numBytes; while (bytesLeft) { /* * NOTE: We know that the from buffer is NUL-terminated. * It's part of the contract for objPtr->bytes values. * Thus, we can skip calling Tcl_UtfCharComplete() here. */ int bytesInChar = Tcl_UtfToUniChar(from, &ch); ReverseBytes((unsigned char *)to, (unsigned char *)from, bytesInChar); to += bytesInChar; from += bytesInChar; bytesLeft -= bytesInChar; charCount++; } from = to = objPtr->bytes; stringPtr->numChars = charCount; } /* Pass 2. Reverse all the bytes. */ ReverseBytes((unsigned char *)to, (unsigned char *)from, numBytes); } return objPtr; } /* *--------------------------------------------------------------------------- * * FillUnicodeRep -- * * Populate the Unicode internal rep with the Unicode form of its string * rep. The object must alread have a "String" internal rep. * * Results: * None. * * Side effects: * Reallocates the String internal rep. * *--------------------------------------------------------------------------- */ static void FillUnicodeRep( Tcl_Obj *objPtr) /* The object in which to fill the unicode * rep. */ { String *stringPtr = GET_STRING(objPtr); ExtendUnicodeRepWithString(objPtr, objPtr->bytes, objPtr->length, stringPtr->numChars); } static void ExtendUnicodeRepWithString( Tcl_Obj *objPtr, const char *bytes, int numBytes, int numAppendChars) { String *stringPtr = GET_STRING(objPtr); int needed, numOrigChars = 0; Tcl_UniChar *dst; if (stringPtr->hasUnicode) { numOrigChars = stringPtr->numChars; } if (numAppendChars == -1) { TclNumUtfChars(numAppendChars, bytes, numBytes); } needed = numOrigChars + numAppendChars; stringCheckLimits(needed); if (needed > stringPtr->maxChars) { GrowUnicodeBuffer(objPtr, needed); stringPtr = GET_STRING(objPtr); } stringPtr->hasUnicode = 1; if (bytes) { stringPtr->numChars = needed; } else { numAppendChars = 0; } for (dst=stringPtr->unicode + numOrigChars; numAppendChars-- > 0; dst++) { bytes += TclUtfToUniChar(bytes, dst); } *dst = 0; } /* *---------------------------------------------------------------------- * * DupStringInternalRep -- * * Initialize the internal representation of a new Tcl_Obj to a copy of * the internal representation of an existing string object. * * Results: * None. * * Side effects: * copyPtr's internal rep is set to a copy of srcPtr's internal * representation. * *---------------------------------------------------------------------- */ static void DupStringInternalRep( Tcl_Obj *srcPtr, /* Object with internal rep to copy. Must have * an internal rep of type "String". */ Tcl_Obj *copyPtr) /* Object with internal rep to set. Must not * currently have an internal rep.*/ { String *srcStringPtr = GET_STRING(srcPtr); String *copyStringPtr = NULL; #if COMPAT==0 if (srcStringPtr->numChars == -1) { /* * The String struct in the source value holds zero useful data. Don't * bother copying it. Don't even bother allocating space in which to * copy it. Just let the copy be untyped. */ return; } if (srcStringPtr->hasUnicode) { int copyMaxChars; if (srcStringPtr->maxChars / 2 >= srcStringPtr->numChars) { copyMaxChars = 2 * srcStringPtr->numChars; } else { copyMaxChars = srcStringPtr->maxChars; } copyStringPtr = stringAttemptAlloc(copyMaxChars); if (copyStringPtr == NULL) { copyMaxChars = srcStringPtr->numChars; copyStringPtr = stringAlloc(copyMaxChars); } copyStringPtr->maxChars = copyMaxChars; memcpy(copyStringPtr->unicode, srcStringPtr->unicode, srcStringPtr->numChars * sizeof(Tcl_UniChar)); copyStringPtr->unicode[srcStringPtr->numChars] = 0; } else { copyStringPtr = stringAlloc(0); copyStringPtr->maxChars = 0; copyStringPtr->unicode[0] = 0; } copyStringPtr->hasUnicode = srcStringPtr->hasUnicode; copyStringPtr->numChars = srcStringPtr->numChars; /* * Tricky point: the string value was copied by generic object management * code, so it doesn't contain any extra bytes that might exist in the * source object. */ copyStringPtr->allocated = copyPtr->bytes ? copyPtr->length : 0; #else /* COMPAT!=0 */ /* * If the src obj is a string of 1-byte Utf chars, then copy the string * rep of the source object and create an "empty" Unicode internal rep for * the new object. Otherwise, copy Unicode internal rep, and invalidate * the string rep of the new object. */ if (srcStringPtr->hasUnicode && srcStringPtr->numChars > 0) { /* * Copy the full allocation for the Unicode buffer. */ copyStringPtr = stringAlloc(srcStringPtr->maxChars); copyStringPtr->maxChars = srcStringPtr->maxChars; memcpy(copyStringPtr->unicode, srcStringPtr->unicode, srcStringPtr->numChars * sizeof(Tcl_UniChar)); copyStringPtr->unicode[srcStringPtr->numChars] = 0; copyStringPtr->allocated = 0; } else { copyStringPtr = stringAlloc(0); copyStringPtr->unicode[0] = 0; copyStringPtr->maxChars = 0; /* * Tricky point: the string value was copied by generic object * management code, so it doesn't contain any extra bytes that might * exist in the source object. */ copyStringPtr->allocated = copyPtr->length; } copyStringPtr->numChars = srcStringPtr->numChars; copyStringPtr->hasUnicode = srcStringPtr->hasUnicode; #endif /* COMPAT==0 */ SET_STRING(copyPtr, copyStringPtr); copyPtr->typePtr = &tclStringType; } /* *---------------------------------------------------------------------- * * SetStringFromAny -- * * Create an internal representation of type "String" for an object. * * Results: * This operation always succeeds and returns TCL_OK. * * Side effects: * Any old internal reputation for objPtr is freed and the internal * representation is set to "String". * *---------------------------------------------------------------------- */ static int SetStringFromAny( Tcl_Interp *interp, /* Used for error reporting if not NULL. */ Tcl_Obj *objPtr) /* The object to convert. */ { if (objPtr->typePtr != &tclStringType) { String *stringPtr = stringAlloc(0); /* * Convert whatever we have into an untyped value. Just A String. */ (void) TclGetString(objPtr); TclFreeIntRep(objPtr); /* * Create a basic String intrep that just points to the UTF-8 string * already in place at objPtr->bytes. */ stringPtr->numChars = -1; stringPtr->allocated = objPtr->length; stringPtr->maxChars = 0; stringPtr->hasUnicode = 0; SET_STRING(objPtr, stringPtr); objPtr->typePtr = &tclStringType; } return TCL_OK; } /* *---------------------------------------------------------------------- * * UpdateStringOfString -- * * Update the string representation for an object whose internal * representation is "String". * * Results: * None. * * Side effects: * The object's string may be set by converting its Unicode represention * to UTF format. * *---------------------------------------------------------------------- */ static void UpdateStringOfString( Tcl_Obj *objPtr) /* Object with string rep to update. */ { String *stringPtr = GET_STRING(objPtr); if (stringPtr->numChars == 0) { TclInitStringRep(objPtr, tclEmptyStringRep, 0); } else { (void) ExtendStringRepWithUnicode(objPtr, stringPtr->unicode, stringPtr->numChars); } } static int ExtendStringRepWithUnicode( Tcl_Obj *objPtr, const Tcl_UniChar *unicode, int numChars) { /* * Pre-condition: this is the "string" Tcl_ObjType. */ int i, origLength, size = 0; char *dst, buf[TCL_UTF_MAX]; String *stringPtr = GET_STRING(objPtr); if (numChars < 0) { numChars = UnicodeLength(unicode); } if (numChars == 0) { return 0; } if (objPtr->bytes == NULL) { objPtr->length = 0; } size = origLength = objPtr->length; /* * Quick cheap check in case we have more than enough room. */ if (numChars <= (INT_MAX - size)/TCL_UTF_MAX && stringPtr->allocated >= size + numChars * TCL_UTF_MAX) { goto copyBytes; } for (i = 0; i < numChars && size >= 0; i++) { size += Tcl_UniCharToUtf((int) unicode[i], buf); } if (size < 0) { Tcl_Panic("max size for a Tcl value (%d bytes) exceeded", INT_MAX); } /* * Grow space if needed. */ if (size > stringPtr->allocated) { GrowStringBuffer(objPtr, size, 1); } copyBytes: dst = objPtr->bytes + origLength; for (i = 0; i < numChars; i++) { dst += Tcl_UniCharToUtf((int) unicode[i], dst); } *dst = '\0'; objPtr->length = dst - objPtr->bytes; return numChars; } /* *---------------------------------------------------------------------- * * FreeStringInternalRep -- * * Deallocate the storage associated with a String data object's internal * representation. * * Results: * None. * * Side effects: * Frees memory. * *---------------------------------------------------------------------- */ static void FreeStringInternalRep( Tcl_Obj *objPtr) /* Object with internal rep to free. */ { ckfree(GET_STRING(objPtr)); objPtr->typePtr = NULL; } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */