svg_path_ops-0.8.0/.cargo_vcs_info.json0000644000000001520000000000100135330ustar { "git": { "sha1": "a43a699deca46cf579909787708ef73cb56d67b4" }, "path_in_vcs": "svg_path_ops" }svg_path_ops-0.8.0/Cargo.toml0000644000000021210000000000100115270ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "svg_path_ops" version = "0.8.0" authors = ["orhanbalci@gmail.com "] build = false autobins = false autoexamples = false autotests = false autobenches = false description = "SVG Path Manipulation Utilities" homepage = "https://github.com/orhanbalci" readme = "README.md" keywords = [ "graphics", "bezier", "sketch", "2D", "svg", ] categories = ["graphics"] license = "MIT" repository = "https://github.com/orhanbalci/rough-rs.git" [lib] name = "svg_path_ops" path = "src/lib.rs" [dependencies.cgmath] version = "0.18" [dependencies.svgtypes] version = "0.11" svg_path_ops-0.8.0/Cargo.toml.orig000064400000000000000000000010361046102023000152140ustar 00000000000000[package] name = "svg_path_ops" version = "0.8.0" edition = "2021" authors = ["orhanbalci@gmail.com "] description = "SVG Path Manipulation Utilities" repository = "https://github.com/orhanbalci/rough-rs.git" homepage = "https://github.com/orhanbalci" keywords = ["graphics", "bezier", "sketch", "2D", "svg"] categories = ["graphics"] license = "MIT" readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] svgtypes = "0.11" cgmath = "0.18" svg_path_ops-0.8.0/LICENSE000064400000000000000000000020541046102023000133330ustar 00000000000000MIT License Copyright (c) 2022 Orhan Balci Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. svg_path_ops-0.8.0/README.md000064400000000000000000000052071046102023000136100ustar 00000000000000# svg_path_ops [![Crates.io](https://img.shields.io/crates/v/svg_path_ops.svg)](https://crates.io/crates/svg_path_ops) [![Documentation](https://docs.rs/svg_path_ops/badge.svg)](https://docs.rs/svg_path_ops) [![License](https://img.shields.io/github/license/orhanbalci/rough-rs.svg)](https://github.com/orhanbalci/rough-rs/blob/main/svg_path_ops/LICENSE) This crate includes utility functions to work with svg paths. Works on types from [svgtypes](https://github.com/RazrFalcon/svgtypes) crate. This package exposes functions to manipulate svg paths with simplification purposes. Also a path transformer fully compatible with [svgpath](https://github.com/fontello/svgpath) is provided. ## 📦 Cargo.toml ```toml [dependencies] svg_path_ops = "0.6" ``` ## 🔧 Example ### Translate ``` rust,ignore let translated_path = PathTransformer::new(cat_svg_path) .translate(230.0, 0.0) .to_string(); ``` [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/translate.rs) ### 🖨️ Output Translate ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/translated_cat.png) ### Rotate ``` rust,ignore let translated_path = PathTransformer::new(cat_svg_path) .rotate(90.0, 126.0, 140.0) .translate(220.0, 0.0) .to_string(); ``` [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/rotate.rs) ### 🖨️ Output Rotate ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/rotated_cat.png) ### Skew ``` rust,ignore let translated_path = PathTransformer::new(cat_svg_path) .skew_x(20.0) .translate(180.0, 0.0) .to_string(); ``` [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/skew.rs) ### 🖨️ Output Skew ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/skewed_cat.png) ### Scale ``` rust,ignore let translated_path = PathTransformer::new(cat_svg_path) .scale(0.5, 0.5) .translate(220.0, 60.0) .to_string(); ``` [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/scale.rs) ### 🖨️ Output Scale ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/scaled_cat.png) ## 📝 License Licensed under MIT License ([LICENSE](LICENSE)). ### 🚧 Contributions Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the MIT license, shall be licensed as above, without any additional terms or conditions. svg_path_ops-0.8.0/assets/rotated_cat.png000064400000000000000000003567001046102023000166410ustar 00000000000000PNG  IHDR,w݇IDATx$I$IGDDfffVUUUUwwwwwtwwwwWWUUUUffFFD LfWwuwwOL\uUW]uU/ %sUW]uUW0UW]uUW] o_2W]uUW]u \uUW]uU/ %sUW]uUW0UW]uUW] o_2/g22xp@;|᪫ꪫAۿd^ \n 5xn'_XO?g:w/_r-I\uUW]u qO ~wţwnrۥ_~];1ߚa˼W]uUKΝ:܌N Oɼ }wq\?|sӏc?S\&okꪫ0qo X;T 'Oo8')[H⪫o_2/38*u/Ҽ ~On;qgt=VsOw߆2sUW]°nK$8f7K~ fN2;yIS')9W]ɼÅ #?k&0矰r4}/~?'xl=_A\uUW]C&,nW~g 60|ynpϭln2;y)f'O2;uqUW 0^q^߇y?㈃!-33^ jwy4'_82/UW]uտo^%8bw-Oip^fS3H]g .p\>k` Wb/2%12\-Y_ƣnbrgN yfA7sy̋>nono+޴<㈿wݸ%14Ǻxl[?o׽rUW]qD0?#Ωs/EPaF_h ~a#*͒{렽o#}XAw'H,H6tVL_6`XzY_4rk_qY̋ Ǒ۾yys؇sO'mN, ob;qf__|S77y;DpUW]8|9GJޢ;õ^9&['GTl[& '{ 7M`Fe=Sі} ~eLB)?_<}^e5?ymO;Iuozl=\uUWKO?u^ ?cFg5f Šl0}r~Be ?( &~)_~L(?G ?g{KP^f?So}_UzCKE,Osk;y$?9_߽o?!'z[K%!xx_7[pUW]/~[oe㦛5ވ{ڻ7+ Lԯ*S#, $ʧƯ>)7H|dAB{}p_5߈K&QoA._e%F{/.\J7/'w^8_|>6\UyGosk~#^9/]w}'6W]uU/Sʽ,M}|iS~&jNP0~ZAI]AG7EJhV.AxpW70Uo T.E1Ox O}np݇rKw='_ycUo_2 {K>Kٙvxőy!ƜXv{5p_/R\uUW=?mq&7ś}l/9}D}lqP <NЁ(GWxls.+_R? o5%V|Ӧ|_|Ok&eW-䫛1 ΚŅG=g9R/M7r7\fA]lpZ̿[C<U^ Ƭ~wKM_O3;}͸ꪫz~au9n|7wAbdh_pU2 Z>Q?0}}:|L_*7UCT3}m77.ӁQR1M'}`2]_OO} ,ok:~W+]~wgܽ?Gqn+޴'aU~qΣ?Ypr}_k|´Oox3*Ư`\*5c& FP>_<WL}@%_+i`\`fO`a.>z1 >mm .sOg}[{(_핉U7/\<x}؞gk^l_88UW]u~kuپ!(PWkpP~0~ӄ5 ~? u Ox0 YWtk /ȗ2A r~i!~9>o0A0~ ȗ1ӧNL\aw ^p|{%opwY~o-f~ion9^_W}eqUW]`~Nk_4'5 NO_24A 0}l%v9y`_z>2}t#4Ё޻޳2_BGoPN8GV4=I4˼4'^ePW3p> Ղ;?Ӝ~8$^8GKfQ/:? ,uc>ō7pUWqO_8'_7i+. }|@wC㫬;;ڗ60/(` wEJ{F{}}P%_+iԸl+om?[._q>}W]u_ng|Ϗp֗'6MgYB_ҴN.3?nw?׾krz'&`sSQ?3f tVpNݧUXUt\%'U;%3Q2}fW?L_? P?5zZ}ǧpni%^yC>4qD=~k^Yx/C;:dA\uU._{oqß}`YD0}._rח7g7,_MP>?Nu z0BYOptUiȷIOwEBFЁ_'t0!_93̥υ+c8Z)یX{L{LLGr$b>ͩ9#Is1c;NB6.{ctKL{{8j2'Na~ifpp61qW\x>{Y{ŋ8DW]s řÅ\&oD5_ y:EVzNRK7w/yxy_ŹꪫYs/w/Ynb=ƳoD\q$O ` ?謨S~_&Hs<˃{zCy죙_w*Foh'|K W_2)._*Ӈ7 q}f!L_@\# 7u tPaÌ_` U5`ƆO+&8w_rWzYby~+DP76;[u_}cL=Mӧ9ظ&b_?g{)k?qݱct;;DYo?&h =kNS66Q 7qtm1T++CfԝmmOݿ8*LK9+KW~I~釼 ^?}vW}&'_z>&;yk^5ꪫY;?m| ^OV*iָ_S]Wߔ{ϝc8w>i57x(;?0U z_ /3?,;$4E 0~a8݇v[%]%.` 6L#q~yC*>On;bK㺷}=79M ~*н>8?ʷݒ:c+#&W8b9Vcxy_w J?3w XП:A]̉a wGYvI]Y\=s癝>VeG7[&_w6O ?Ka?aǶy{3'7{}4qrQxaLͧƷ|3Eqtǝ'NP77LZqo.nqA݄֗_1&Ow[~g>52v;OzO 2Y0 {(qAS~̂_.AHԯ* LиlGW}\~ bo4#Q ݅%tQC`5wp^}~Sȗ0o Okp$ ӗM>31}Sç @B?o=wNS9`vç3?[2;s)vG0ܴG[h9( Q{ߙQ.n} C @ϳ} ~5< aO^ğA -Ay0~nr๩?[I㇚;A@ۿdeyϽ~oGō706 =ӭO o|M0}V ֐P?he 廃& KާBBi`vnLHY,m,r-?R &Ϣ M7lo7r~NY~q/.k&g7HS8{ٿ)<)zd1K8ukmtvX;[#ʱ{,;} lQe$!x+ u# Q0~m[|CP~7g6eT}BhhoP?#ߥ-A}\R@*Iʂ_6Ax|P>3h̿ӹ?c$^_Ǿk8z^a[=+#3s~~;rUO;ZttM7jf<倫;Ytg^p>PN|+/LߘOi$ظf<6a2|me{ {Ѿv›\O.Kڻ67ʏJ /.hgNo+/7p-5(W)_>/g8݇U *0vIB{$%ޯ0~Cm;EBk?̿ӥ{R6t%sį>cn> >iă`Ÿ±|1b}۾6i)gϱrxmWE.-!G3mwp=׼T/u{kG|-7.9>#_L1@OU`3~m P~P)c6A~IsQ?2}x#"y}D%(/AKQ?@& wC /ox˔_ ʷܠ}j#_)ѽ~h!ȴlL{߳'ԇru_x wܟ9Ml>!<)tǏqkes Oc+'L @(_Vh_G|m!!IzR?/o6$}|4#}t!_޴l\P@_w'L+]1~C7BJ{l>"7/.<{t}Oo>~) E<_[0p&Gɉy)K}cNvʗKKW߷n3\esWy,x )nsr=og0\HpK,>ʯWO#e c+,a @B&| _ IІ^t[>o/&Gxb TLȷ4S7o;}*_9߉YWowN8+ #2.cʟqy'8ܿS 8~WeOIA' 4e @(_TW2bf'(b }\ /D)?L޸__$1}΄Zi_$~lAޣo̿ë=h{_>û7~}^Q7r4}6 O1" W]Վs[7x]fgN0_8?`{l3^p63g Z tp3nN<6,sK7[ /oP~>o.L_3;0wLpItRWOm<˽}x1}爯ݧ<=YwNm#_=A@Q=A%Ӈ7~rEa %G?L`=k@{P?bol.~8)Zor}{Ox"׿?vQ?2}DBF%н~x}D#_O9` 14Q?IL_<7:nw;}|3~T}\P?&"4ion7/>xo?}/>/z[#'q@W[=fͮp!'S3ޞ|W6q\{x"f=!&ҺK?pۿ W]_/ `Ww1.mߜ5gߋ |L{E!S' H}DA{}dE7͒//pwIBOLbNAB _/>ApYʂZL_I!t^aL_ݠ`|9s d1~c2:wYoK7śQ76x BJ{$~3F3}x=>6ɷHtZEoLޠ :FVf_pIO,&踬lhCLoHpkNW|/p ZA;.3y7zn߸;.MM;{>wOGlm^qyӼ ?xmrVG~}/RUWW ^pߣ>[m{{>r"_/,I=o n;$3 z@kQ?>|dⷄF>}:1~لfpʏ3 14Za肘~§|_|g0}|#,PLJ'>?ɍofmϖP?.  XA|i޿Cѡ;`Felj*I AȊvaF>ҰV83~T'5.B?L@0}.w=Kǟ)(0=̿&^bu͔[^<~Og'^5=?}ڛʃ^+Jn'YWLOl\6B&feABN2}z|[D0~̈́mHY o`{ Tho~Zg7x|P?&XpYfP-k @BE1~m7NIwN &>L~A!_'zȇx2#6lb 4>S}v#_h 3}u~|%~QO]SAj ~`/lQ@P>2|w=pѲ3r~Oy~W._GXqǥq+ܸo]8o\?Wno~UWwX=ǝ?<ޚ5P$ok{D|$L_4/-L7LW3'% @_S-Ia6  svǹ,~Wԯ_=pY ~2`}Vt_K'._ +f Ok ~y3~M7;|ck2t!~EAO6|\g:ջ_i^eqOÃgzԃ-ybfgM.&ڽKwqH[..0%֋KNqN}MIL3خEۿd/ GwWx7\NCB7b{.x3mߊ:xS9'|iF}fk?dOSy-k~Gϻ1vs{\zē= "(.LWM.Ȋeh詢J{}H~ K9cM{LtWIc~hEwI v1~݈2ShW4sQ/Ht^aی`Eq['8k}B` o达/f؃IJM?'m(o0Bp~4( .rˉMg9XEEtu\|'pbџަܤ,Ub< wLPDڦ>|zbwhN\x1̿Ӆ? 86}Wڛxm38?ɥ;oǍ\˝{#W1^Iߜ7X?r)O%.[5ӗLP|?&1~Y>D{F~b%JUo*_Ư @YP?0}H#&3DP 74`s]b ѽ~pE 7&.3D_*b|]L_6Ap0}]6Z?wŽ[ ٙ3a"03b3t;z>Oz Қ3N0?`ޣڢl,X5 lcEט3t{DȂ_o'uQLwȉ;N1~nj;1r^fƫ>h_~>]x]_yO8x@').{kxiy-ӷʯ{k'XXMpHԯ-{%G|T}\эnƯ`AR@/O$G6:P` w}\E ik$+#mV}dEOӗN˘Ea/SA>4 Ag]ΐ_ϝ bfqult/nQ)>d; xm'w,<􌗿qј o>퀃;_e^-_C]#Wq=Wwcά6aщ?s_ܹ -zj2L_m?G'-~q䪫pgpۿ? 5|Q Ư /gVkԯ i1Fw*A^2}Bd|CfƆ=AԏOmk$z] 0BDŽW7|W>&X |+0~DA|Mwoppthc&KqMpDF{lp-/+WO'7?/7M<t<G]q;~ӓ'~; ٬cvh6O8n[b0~W o$a}/<~!/sWy!kodV_~>6{Uf꿋mnc˽4k}JeFzRP~,\v>>.)%# W$ӧ5ςоf"itA.H-Gv8L_7M._ZY>/gʷy ?܌_7wao.W*L_6$7&ho$78Ņcq iv~8rÛ :/*K& Xi4tͺoCNy艞ko{pĽ{RoD{פ[R~9(_R>ohGV{67 AnY !Wsj +>^1Ltԏh7MZP~( Hho%'ulo`{ ބ&|* ʯK ,` ]k l>хrGrzhȗ3HaBۿdV]?~a\Yynr84~# cxm O;|-'Or^S8{- BFA;'36؞ob;?cK_?gުqv=qf<Ʒ~KgNsUV=Ai39/F/Lv.?pU)s{Q?&iҸlUՌZ0~>'|E3}GЂtQ>]>{` ?pos ?oh/mDQ?0}7LGWh0~@ID.=g8vǍ %O}"xwz[^ {MSΏS ;om~<]?0Gs_o4NKs_ ~&>3ރ_x>C35[=vSzݸෞv{'7}98lq۽uUWH2Y}=? ekuro;} '^楨H_]rMŒsP?5&_-)_^n;}JAe P &#tztc+d1}z#_7SD_!1}D<.gMk=NtZWms~HE AJIUkT}D F{pZqGojK_u6|G Gc2+%f6^b?}ήПO'r;#Wv[Mo x܍ ='n h&+& aDDڛ&Gԏ|i3}BtUe|@kQ?'IN,@P?E{F^0}T~Aen6N+"K?%po%]^-~s00+3.K6#?֣WzmInz?yfk-oXEq;GϸսqӍl>!l>ygpſkWfOa0}v~lo/)_ h3~?o.f ϡx|k0~Մ_̐PL4c ~Mp G8p݇WƯBBN0}B#4P?%;&C w2Mp&޷Q~>u|Ia_ޜ?eu= {s͓ Ư@O;%ùxGC'w,xGoy6÷yGq]&?~k^x9 r~䷞vH\]yG7,nخě>r{&#qu/?逧vW9/|1|UW=K\+"{,xuGV8,i@75t #pKҟ5}b}A{F~廃=|dFB0~o7}嗂!}Ie?KeO;ݜyŗUE٣9YeA;^ q7۵Uw.qg^)c>m˻Koxőv^ ~.14xml~i\]yG;snə_Ɵ0c/S67*O1\W}e7{Y(?(k$g7PM{40y9vm#,g^- @(_\Q8Oo `3}Մ"0~݈3}ZE>P~((ZsY'H㗁 NM0}fWT}0}NÏ5~aůlϟ ,~Kϫ+&7OD̊{r1 A]“_5 |>,A?E:{ʫ2[`7/gZ7}6g6 ;qo;G|85''<~wٹ 4׿ kWCcw8q7~?=..r'_~>i8>/cw뻗+*lR'_8~8R/E8W4p/*3yr/eyR'h>3LsYΠ|_!_L:xG>CN *'WϛПe姃MhƯh/o}l%m/@jP`NpY(_ id4=KʏׄF1S#4D1L_` ~t5+!0 rP~P-H;W$ϯ.oػ)3snzK鮟%VCMe?X7QFֳK~[~^J/]{Wa` w M^a[l7v[cy <~^9|~']Vᷞpÿ?+qy>2}dCh0~m#~O//Z3~+>'fn#+ SQ? ~7]k=NL_Ոopڇ4́|i}X蜨R _;蜘>o_ ʗ(IF0}̈́ۿ ?%t=3.̪XO\3{͌wK]?{o7~OU7?hŃ=r~#N'} 7-_b9Ҫ[O;~:=u_ܹoYVYqۥ!qK43ʝO͇=SWvt5j~vAL/o)o>iOi47Mpg ϙW4:2MPt]iop Ư's >iƯip!~v!~/hoԏ+Ì,`| {EJa.Ư(^~߉&('ѡx#}DAw+&tU"_71>' @IP?)>QޣL_7T̿ſ[џq<ϭy?%-9(wz=W,.{V\Ӹ3zC ^=dǫܼO?~WqCnةC'qiߤ'xGl7,;٣ko׼ţw'sqxmS=?Wwz]Uw= \7~V7i2}j~M♩Wf6z>a|_DPо`"_Р~ZA2$ϩpʴ7JW/tVa Ư|kPLС(U[YFgEЊ.|#}d!_įNP޳Q2}㈏BQrAL_O_ 9` bTwE{ˤ}L@c+h(_{%=&psQj8~d"8~wX?%tx+|ևx[6K5xnw/xف. XWߵ7˹?7dA?r{>7Tr瞰YWϽt;~ Li۪mK^᛬;c;V<šWiaY,پcȮ[ls/'=967f3p`.Ii н `FVrŠ~KaF>&(_S(0k @@O ڇ7W'M*}D>_ʗ%JPߋI{GȂ*n;%%t^ L  7(C(YcL~i!~9hhܯ~W!~4l/nʷjf tY>L9Q^7)?_>b¯bNj2T1~;ǿɥO̫*^ }ow.^䎟~ͼwz]bhɛ=jFNlC3|ے~?m?˥׳GrM~ƃAp|Qx8d̫?xz%[=f!x/qݜ~fN. otn?f OI7v&_OOo&& OoEFTRP;7MOh/~#_\?w¯be"0OF./}3~5qV;%Co_2Ng|x_^]tMU̪,/16pPK&T+W8_~ vh6mS.y⹁x}׍zwϊǟ]= ~q{ Vcwuwo=e=}[}0gw,XǛQ3>OEn2}zqZϩL?3A r%W/(_5L>L_@w?֌_5Ak 姃|de2MLӈބQ  퍓~Q!_L_2A2WȏN'W~b`~tEOf'3 Lٸ~x`۰/L+x(Vp"<vp#h.'Bۿd}?̃]c,GS=:3`h_{!/{Ü^3yWy,;|8O>?ibu};˴ttmSJP]GtIڢnoR7vO\og~i끛mka96~Gc;ܺ;Ꮍs oM~ ;WV}!<=e3O5j2CN- oj2/uݜ{o)y7_5x|~I{0q>h]K,c/b7s^UO옾||UB!o`0/į ?L_I| $GUڇ6-.j |;5LHC+:+/7+ &|Ҕ 7X3}e3Wk&81}DJ{D"~ƯlA@'X?ʴl L_}XG{kC+a _k2W3ZI _^A+p|KD ~y.'rӫ9󗺞7/qg|s;-ӧxMc݁?x9:g٣ƹ_E^ƣ^'a󯲾,Oy˻fKknolQ) T Ug98222001\"O`v$3]{1$qտl Oo׿uM#ٙ?}^a}0wxo24;O?Ԣ7zmF"Q\\&Cn2}|#_5YQ?oohW4.Q!'6'P?LH7L_1ᇛ~Vכ'|t]7KW WN/M>//LIo/1 K>;E 8 DBi"L_37?LҨ_Pf›\P??0ӧ6 #+=||w̝/zW˾4Co_2N~p۾yM÷<['?G<odvT mbttĴ<-g1Q]%2Q6ԍ &e@Å/rXwmf~fמaqu̯;zN'zC8k?db_{ vf_y>i؞ocK!xGnᷞvȩ›痍>x;F x⹁!?6\//s;-e>=_UN?SyfP??֔o)iϯjwLB_5G#;ˎD?O@ ~y`*zhhܯ|qJ><)į,}t詢~x9L_? DBfTh_0p;4ToQF &JL_; pA_9ǘ&Tᔙ> `_6__ |ϝU70ׂkFg)TlBWO(~l%_˴wjį l>A\zo.Q7}owr&Oy?;.MdŎWwx¹=Ft/tpſktp0\Yo}gY;ىMƂXP "fj/v'߳j5^ Ւn17~7n“ko$$1\Uy5C۪#6/aS5r_w8~MVӞoFǏP~(ПIa|d@(_PPqInr%d%_:>@BiVb :.+_\ kOO/_I{w}=T:I{D{P?C ?Р~JCh҈OJ,wO ;W M>lj&5ʗtVL_0A%`F^P~P'K'&~WL'/ 5OO}X'V5%~P w ~3>{"_;8^ޝe]oێ؞ooE7|=N, dJsZqO>{4_%X;3n'=7k>M=̌qO?~~N qvzFxGng45}xɩ<ϟx󻌻i5'O0;yzlm綻ObX|3ӧAa~9nnz%vz&z4^aeo3g9%]omמr1CUKO:/֏/^^?=G1gSyڅW&/~͌'b̉Eή']i{_/\??ybO[.ߐ 7/lO+$ok&(O޼;` UOP~mA%Ưmmʏ ")Uj|c!~WNG5-['G6ׂ=o) O,&~ecL`*~>>oLMJhwj/~0(L_99wڇ4;&Wg6ʯ }D_^P?@C~_^`ӧ53DΦkΟyw]?~mwHAۿdk*^![i~ɇz?^Y/vg_޵iO#ċsgCG[; ";xn/yݜWic?_ ||S0|D@OOР~RBLmAB{ˤ}L~嗃`LvP?!i? *nO7Wq~lA>Q~6h7; {1}p&Ӈ7w;y{VBۿd._31\o攀7~6*~Li^ n9ѹx8o=is8ۿ-72Z7+m_ܵQcwٸߋ]3o^+O9Kobۜ\pnzƃqV#݋V+33y3\xqIq~ӧx#Q)EX7U_gt A>/=qxsG7y6=6xmrVZອO?~uK']&W};/\gw.fVk~㩇0+[>v#Mӟ}/>/2\?GwũW|9?K_楸Aq#s|=>xk&sYB @aP0~i.;$ 'A>oe:'T 3}D(_Xȷ73>i◂Q/E҂_ޥQ2}&/)h_ho[$|E3}G5~LfOk'+MK$[ |ƴoOwbh gk&V}lů?wȃ>4Ln7x]^Q'y-q4&>:pO,/RᱯJӗ/_U6`c;\a~5 o7rȯ?xGmq*lSpd;.MHەx6#xn @W[=fS{; omvW>]YylO=wbQxGlq׵}];c}t7JHnG-&׽qocO>nx[Vw~mF^A;ޑ1'h7~3wϋ}{qa8(ţp@HtϏݏp_};{;8*īx<~'^[sA㥮O<`wxxޟ]^!nά/ mG{~<ܚC8>?}\۽wϊgUcwWus7t4CreG<)w:{s w莟8A'G%p&ظF^wk%/8/ɗ},='7*C1+xn ݰnO箽 x?5gDžen\pNo>7~O>?plcw`W|@J|6H!^Ehi^9r~?s __rA7wxs;llvp4W]+tԭ-47dvϒP?5[LtDJY2}t5/G]Q?2}R#0.xezFerq>z%ϯF3}wP?׎h'Vڇ6w'AZ2}tYEaݗWka~Xa_į}07ӧ5|dL0kL*CDk&A20~v_<ѓu ֢~\A 5MZR~(~9~(XLez[k'i˿ʃޖ@O9cxM8(ţw;ʼnE\%s6nn˾ _y<pq ϟ@l:FoqtDׁō7yM̯q+M{?'q㍜zW٦xGosVמr@H s~ {#mw/Z33^!xҹW{93x=#>3%KOœ =+5x>S~&}O>xorjQ'3xȉ7|&}?z6?3xwyq!\Uy[6ѿD C_av)r WK}ק.6xmAAp*2+>&Rh6c :I{D+eAaHsٽ}D%8i}Z'| p/L_٨_T '\P?+%L{F5 P?0}V/n⧂u>e]ԏ3÷mo擮Q? %d}?Σ5\1;ܳ?+O>~r|?k_ܹn\27,'p-:^xorğܱţwӏc ߸c?}4/wÂ'34pf-Ϯg7~6]\qϯ:OymoOQ:Å ƃ򮻙_w g^P (~1(?J4_`Og N.B<̌?AK[&1}|rA=icL&1~ń_/~3__pgOhшހq L_4Adz*D{F _9i/4tԏUV_PgGU1}^#_5ԏaf` ?ȐP?= l7 ~>k~JeĄ[LJ|5?ݗUƯ}xs'gwG8>? %ĭvH&ś=jh~q{ =Džeອ[/ch~pӂk7+fl5/}~>Gcrf ş~+ݼ=ah;{0qӱ}>{+ܸn\g'<΋?z_w'*w>sY;O'O;CwlI]̉V+ㅋiwGXGџ:6ykg<v[?vz=9claS.Ry[6lVy ~ڭO?n!xus~8vƋ_3j2۳mí#Z٤/Z&"/Ox G b o,'BZ |G5wb BJ? P?LȷKqWNCTP0~ń_ԯ-BQ ~Gh 4ʏ7> WN/*7H |$2'ɕ'X!tU/jD_q|vi7/@w/3;cw8(cw;{ׄō=?=;v/Ó<̌y>{yCx5Cplwۏx!葛\Z%t=35>_؞oc<v]]yGpaܸSyGl3²qGR9wxȉ?툗q=qecщ}1/{x7[Eᗞt Gz~)sgye}iւY/[MO\.iiZVkvϭijW8u5e曙]w-xn/uݜWeG_x>ompvż7ҜZۜ?L~cxl'/o~i}b/iip/t1}_\6B|BO W4_Aot K?Sƅ=>g%ob;{0;O?ţy5o-Z;~ܽ?1t;.M?7m}ڛn-ŝZWe"'q~ٸ~ ;x"pxp|Zswh@ԾB\i-2 bAlىO_\qpbJsxoO|˂d6^9?=Vٞoc SӏcNö{WmG,xXrlܼS'0ykf-{';^ay5;ge o-`s٣NxʓxGlWw8{86nɟFi}ק?y{<~(Mސn{~T%_įgM|9]>= ƯkmgϾׯ^߸WlC_}ݛ\:6>W' |FWhp Lz 4ڛ%3D7ڂ|? L:_X,.hȗ3ǃ |dbdtёhoį?%*\g|>, b =1П& ؃*|)j>(Tiɰ<1?Ƀ]16}ox'_e9/^Z~ +ܸn\7ێx鞗a~'_SB~'WwXts/3cxmp ym^l;/MSo>cVSxE Ŷv omypߊumK~qF;_ܵa'{^!4<_ؙob;\6v<ԌWe\+Gd{~◞tCNvŝKlVOc7lW5 ~{쯓E jSpur˱7~&O9?O;+f^9?=rů?_XM޳o?A;^a[ғko~M|@Kpӱk?d_|>Mn8kŶ K,'s],y|zW#(\m-NKZynڃQ?/3&|-L4}lAOW7{|Br!O?<ޏ=9n|yMЋFXp^O)UM{F~S>3gAB{ݤ}r~ڃal*7HON/GjM~WIn gV3}\V?L_2/k݇V5M2_RF1}DQ0}n>]>-}}aF;ZO(b Jo)[?#gNRwy<?X73^~i [}/Cx}+%-vwo= g"1/=nةvۏ{V̊xۡ~q(ғIs٬om O)8(٣wͧ/]5obXTO;y3xnKODW-ÉE瞰ϽoWQܵ?Oer+߼>~!9QylGk۪٣`䗞t 7Tӎxʅ5{aS7}}^o;õ[yN\]ym3}Oaqbݧ?mQ\ﮟ%ם+/a|9pcԚ*Ƿ_r|e< gXS^cF!ʧWx>Q?+WNNu;Q?Ms+޽Q2~7&~-(PSo艢~tcfƆOABF{DkQ?ka i|R%_)'K''W'ƯЁ^3 Px"T @B3>|_!~YL_po'ɔ/(L_8;gG%i}oVk?Dw8y}^4n43/O%vXxs~)ܺ;PB#w y6=ƅ=aɼ#9Y:xkfصs~q{ 7{6}aݒ~>S{7t_hLj76S37T.}0'/8YyGlqfKv/,;ŝKB&fщ{떜X;&GkO9+άSm^c~c3~1천 yڟX>~u33^?=`1;mGV͋;(cvXO=nuKݪvWQg ~qXN`1;3yȉZ7rī?xfo?']srQxGkO9+noi92/űWxywǏ̫2a=Yp ԏK AzZh&=hncͩe1o[&/m.r͇?k^5Q?;QK'TrG#$VHi2+_S_ ӇNL_4i݈3 |oC~iK}@~~Ae~důnb l.2ȷInt>58fWt|/G8)'\>ǘ5N) 4g\/X^ߐ~!!xp|^qqxkfƃ7kox@<̌Wn4 ?l+?{ yNq0$Msf/nUԢ~A;^![]6";=kv/=ǜyo[ꃷz#qi  qϷ|;Zp⧙:5<~q!~53|YC|RӗNP@.؁|U޷ָW?psU^TV{~oBwɍ]|F{Ӥ|IAUt_L7MW~6(_U`Lԯ-L0/gʗӧNn}djI}xEw~ XO'g6Ul|$~;h_0 w|~K KAF2}F~r/P0~Ո= 1}w,0(_Ur7N@{F1N+`ǥG?>͠"K?A[yM߈ru3^AxY/~áSc:[S^<}>NM͍*n4ym8]pfᗟ{orjQ߻.3D⾃)t@ڄ[i ĿJgX>6xmv~!wH-}"lBgE'yE gM勤wh$1~EC^^WHnP?)Ol'}|%J<3kA0Bb}ho/i$+W(-s~Ze ?/ 7Lp 70S9>Q?#7Hע}g_uk }oOrOq^u x}+%Bţ9~q{쭓*o-~ܵ7rq8מr.5]3\w.XǛ*1ǘwgDže㆝}&C^!KzaɱyϔfQz6~!O8f 1;瞰ϔo;I]/}݂y>}}cL ?yGos_ܵo\pN}G^T>zCu^c?Cffo @|k!_=> ~ WmCş'1߾~թr_^ovq~ۿ ݟlS;~B>^oӷ8n>¾>o#~)(?L_; >f z_V_ {5{'UtUqݧ/kCzƏJgUܛ|ޫq͠~~7';A|>y~rGĉ|9/_63z>2~_ܔ+ğy)ISg# ކw)'f|(K?I[8΋=z[v{?ac^9x?K=l٬٣sǥ=t>t?}_ݽ~/qW{]'p|cw`◞ ";ܺ;'qGϹco<'bym^lF~ɇ= l1hLyCyk攀?|O8pV-e瞰ظ;^a[8x|x5933vG~\3s^!t)<~G]_!<̌z&&~{-ñyO瞃[5xԙ9w\U'r yGmsf+O#cwxMŝKqj+ݼěx_x>W7~6:O?qg׼C SyWe߿zq/w_x>笟$>xWǹim)_YwO|(Y(J{7voFU9ٿ}Kpe^n&Ɲ?xjoCphc%,Ӈ7t$0}Y#,L_<ᇙcA5#>A_ʌ_:Aڃ!/j+$# | ~6(?cSGU4@^ ӗLq݇aw~daFBi6>#߹%~|$$(_L_(Q }L[~;~>$~}oOr{{_9R/";<5ߊy?ܷ/\r[?vs}\v|^xۡ ~;j8>/?q0$-l~q]YyGn䗟٣F puplc8X'慴'pE-{#w%f_'oWQKmw6L9QxG?챷n\;q~ꃷ{cԀ~ V߷o=/-޺O9vΣK^Iͬ?sɹkO>{;~g~9ȗb~ ӷNxe  {'tIԏ-LKà~Fgu 1w~\7l~\E>/i5OAQ_ը_Э 3~mmt^]b_<ёo׈yi1 *͓|DO3*Oį oP?LWJDx}7y׏p-Ӡo_2 VwÝ?̮9ÍoH omSꃷz ӏߢycdzff%xns|Qݧk^![~'^/q팟=Y-S/ S 7-gZWު֏=F'vqo^fqx?=Ԣݦ{#o-ro?^!?|u3EP~)GsrQxGkO9Wen`~q{>tGOGxGlrjQ37~6! ~vigfC6`gcxԙ}>[}fןzް`5+C4p;#W:SC=_bP'<E'q-oʹ}סlS3o&e?6u ~'SȷM&#+$ډn+a ltV h8hh`_T`-Ϛ @OI|$~<fHA5\6AIe>2>vL @P?0}tNԏ*1 GOlI^0~ (P(?L7I|O{QM1@0 K{oG8{nrVazCO'e5[f}0+[?v[wGyz/)Xk?d}!M~ܽ?ؼpa9O=-SΏ<̌_xY֏=f'~ioG<K]7o\`٣ƫ=hvz߷~z:3= 1;K^~O>?pv-j2?{\]y7zCۮܴ3n?iFNoT1|*q7q \aį &|P?<qqȱ{4'_e_ 76 _iŸ9,ͩ|[@O ~C![>CLJI69ZZL_55\݇t^_9 A>uAB}P?oďϟNj$$ׂIo6zd 0~M ]]` .A Ưip̔77ڻ%$O-/ι?7y;'Aۿd]swc/XμqWqK_??rE-.16Nso~z/yݜ/ғX=r?}_ݽf-o=퀧] 壏k4>3GKxĩMt÷x艞{&w*sϊ?6y鞡~Crӱ7y6n8(cvXO?nuKBz⦝?/Mng COܵ7O# /{ÜWi']O?~9Qsch5Nl(v[x7;VާnO.ct]mb ?0@q=.>oʏf :(?ďoGV&~YI<7gTO4+)$ӧ4⧃+A{Z0~@BALiQ?MtGW oJWiZ gV# 3G1Wwx=H(7NP}oLne::A sfk=d}!;8 s^ ~<=̌z&O=n^c k~l۾wϊ{@\X6qquO?n!~_z67ykf\X69xO0O9ǞdYm_l?}ή؞oJO>nU5ɼY ;W#6y艞{G~  +߼K\;g9%?XN'zܳ'67*omFӏr4p゗~/f?a?ܻ[7o330xʟqS/ t;٬!_M/iԸ_jP/m/ WNIhaubچfXB0~3>M5LBF> J>k~j?p_h_ȗ1o_2dK8_UX?rwvK^7o\ӏ²qyGnw3ەx6cO%f['=xÉy!{݇n!q[>f_Lo147yś6_'WeG~47TQ;ʓyHW{[WwXts^{८Г=_{ {fr2?Xgf-'sę[>fd~XN F~>{Ƌ_3o<'W֏]=]K{f+޼@_{oUn:Qx5{ϊxGnsӱʽ?}tɹgpEM[3~{ omʓfjJLy{&w5~I4lV1=+%{lQ) SO?$omn>kom~ܵ7Ffo;݋3++#"ۜ;jۿ?<;r<{~7x]"_ִh\+ba_?/roH/w6y78W)E6aFB5P-(?R>g"_o/&#W%074|+gNU @+A_ |doDo458k'vwm /oA@P0}DZO)nn§~qC{פ~ba_}h%oI/mЃ;XOk* ϟW4ào_2Q 2wWƂ3|1'pV/?y/6_z6mς}f%'q[>zY?=HƏئ~In^pfkO9-ݻ g̊xaVO>{xl?|MO=nu3;۾*~C5!xGnj3xlsz[O;h'xȉ~>/v͌q>g7x݇m"o_k6;6/vY?=.,%-ÉEgϹyow;om4rVqӱ`%ݰjJ9ێuCNtljXf ;<#NlC69Q'163/壷jHO8Ɲʛ7z@Wh~]Y(μګpo箟eoO' WO%۸z[={\ߞן0}Y~wAOM*oE !~9_^>_ʗՒs菃3 0}̈́i wowH GB*ϝ\ .{~䛙)1}V/n◃ #tYu lxhۨ_i6fG1}턷֢|d!.k /~Yyw/Їp>݋gw,y5Eۿyǝ]syo @W{S<ǟ]zc?=.We[uYůkfylr8?|!!⚭=a{&n9ƏܢޤH.N";\tB6YGj7}7lw]+#NoTQG ~q{\j?|O>?pjQxGo36</?ygCOtsoƝʛ>r' >|dfELi~iX ^xmN7z=hG ?= &-~qJ";;xϯ>y{&^:=ј,:֏9ƩO=76cz`V[?v1>~) #N :86 ~I4/~W&xmskxn~Iu3^ 4O: mj7}6旞t4?tpMoo-﹗;gmޒur|F0}E/ft+{t.n|73P\{۫Wb ~:f"~2? /&q| ROaf A 0~ ~xůL_ ڛ&+u# KfƯma$- W7 }L%_& @IP?!i ~nAlcAr0}^~J%߶N-:~qW|1Mt'fB{zaמrf' ~=laJnۗlt[?v嘌I<|ێ{VnX7. 7*om;'W&[`9&NtoV eo._y{.z ?}x>a%ě=rYј\]ymݑk*?=fn>&/=in٣Ɵ~K\;Qgz~٬934SB#(_|SK\>'ވ[n@}p|CJ{N˽,]naևFD`ډ ~5rYQ?77It> FQэ|%t]6L_2AQш+L_;)ʷ|LsUx1}A#_1_Vo[&z[+'g4ԯ(į5INP5Q(W4= Gbچl; g65<%ޞ|0K?@~Ss 9ڃ68>/0~M{p]#{ pvo?yo[O;Inܩ#'s[7|6= |?X7r7.xG+̓~SX1Syő7xkw8gJ7ylC7yNtEcvx5?`MÅ xGﰞ,]b5Wqݸ gCOv÷[}+vf~6xE#:twI6hP?w7Lx~|!/(L7P?܌_ ͠}\yR; H㗅}Gtpbʷ '6|A0}i|[0}d|w?/kK~FaFv[=pK~Cۿd?kɉ}iN+@/v͜WiΏ%cx͇lO? gS=-n4KOf-_ݽ/\plc k̓xVyG O²S=-wv>E'; CBqݻ~/yW}&ј<̌|&}n4l9=D7|&CGc7wxpȵz>آ qb O²S=-ޟ'6g6 o~Eoct~q{Gy<-+?}f^a[ܰӑi~ {փ7YAgwf?xO<uI-bg<5Oxq*wb_6a6L |y^0~o4\+;%GGT4 rrA{F{$~-(p-䵦}\.748fʏ7 ='Vi_83_ʗnk$]t^>o謨^y~^x8K??6okߵ[z6Ctn~7t{VG[>fgǼ}1;O?`V/v݌[H矰e㺭x;[w.x\]iƟ߹-Ùݻq~r?|߿o@ xGnFexGmsbQ]Nܾ7q˱>f7y6}N-<?}97{6?}S3+ƒdq \o$і+.=ql|3T 3*g7lC;MtřzE|̔oL_5k D؂` :.+_U(?L7NXA=Mf z(S(L_:/cJ?I{/ ) [@&(>b l◂evIQ# 7 ROhLGtLoȷJ.G穫7~C6 Cۿd}?# E'Ŏq~'sYv/=C샷}c4?=4oO# !xGns8&Cjx6^{V٣so/Zq|QxpN~{̈́M:{ϊ}ޟ'b [=fOK#nU<<fߴ #nx̙/~휿gݰ>-.,[v*pxk<c/ŝKg>%Džexls6}xGnsNW|7}Oo#O'챿Nyzƫ?h_'7 /s~ܽ?qbQxGmsq'ůwgpfah}!c9{8[O;gfus=_}>on:VuwW|elV1<5x{m= ןzMn936⛀=>>4 .+?+jN~F%׍x◂e I/*f Q5W6#Oߊ'&~?]JOkp(5XCr0}Մ7A+mˎDq|yޯ<yл#:|m}ow/p}@x6g6;~w_'5 ~omo=5_!*v(?=u#Ox߽z-瞰ϔ`oby!?֏rp@+֏=yᗞmFxo1O&6yĩ?xw >x < O²qvM?唼öo>퀧_ꃷ|& ?}^ڞWi^bVcwkOdžxGm O'mn>2i(?ē*["_L5Apn# >i^1CBJ>EI|q3}*7]k&|ph/k ZO.'`_gG7'kߗ?܌_`;=ۿ˙xUr7.xG+z펟K~Mtl=a'^!|3{휟=7 }^98-EgϹ Wy~mF~IC7vSg9%]olzxØ}VSrv FG_;xoXrñc`h̪pj)tw7z&>G7+ݼ*?}f^ ^9{ϊ?Y ܵ?3~{0qlcv!wߚ_١mGkfEcwpԸn3Ɲ~&w“i }o6/>逖O?nuKN- o%/qݜ~/~휗~?q4&]o16.{x##pv #N- s?5ސwx5sϊyob;<_ܹgz^A's[RD{M2c_ UWPw/3sñ| Ñ>lj !#%tP9 ~ѓEх|13}Q|!,_ Ư(?)1f \q#) .G|=o* 5ڻ'$Q>U ~N&_3)_Zr7~TS0~ w .b ɟACmf *KokvVhL~o/1xkgM8ln\r7'pǥ~0gec-~qJ^>sOʫ?x~Ѽ÷x_~>]xkڃ6`矸ϋ]3㥯_ӏcw CNt<š_!}oDžeĢf9%W|1cw;xkzq'{|nQgz~qLi6;֏=ϭy̙?=ɫܲK]7gcx9vƫ>h_'bLH٣Yuە~w\6a46ar%ظ~W|o-.?}- rsG|!f:[y[6yɎy ~ܺ;?I_1oZ?}3W]W~wp^~$ZAJhojhlcAXIL7ftVhoߋ^I`چV|q\+Ưn~u!LM ~$\hoov}T~P}[~f}A#iH>]3}e9P,oM@B‚Ί&o?\w3}u'`̿ӝ? {/ñY8 gnxGm+O>K#{Ɏ6zaa'{^ғE-ͯ>'qn\3go~ {_6^ ^9wp yoL~{٬÷'s^ ^9Lf/?ygl[=f! =a)M K#'慴sooo?<~ux㶋:3㷞v{/~͌W&wHU^![Jz >~) l~izߠHޭGöXMfk&z~/r'g'| 7wjM8GtV0@wCJ{|w}n6Tܛ~ ~Z%LL_8hʏ3r ~]/E(G4&|)?X?cS*&e @ڂ\__] /+ 1~;\|? O~]6?}ow{~Xp;-=7- }v/ßݱgF߾[qV-zϭXT6/v?sɓέa瞰 z ?#N8?}^[wGBƏqzpo-B8ggC6է#]6aщ^0+m`v wϒoͫܲEᗟ-^!~IcyO?stǝT=Q[2'KO:檫^dg7}svf 6 &h%T؄JI ݧ% l!t^7Mg ~>>L_2/kW?L7KE܊G5 >74U}0~UÏ4A`} @HP0~݈||c!~CLu@+}7z{ @ۿdrxw|y׿F'/!V殽?c6m_l']w.ٞoc}+%%[/]6^7lw<5pӂ߽}}^ xv[j`4S<zO=nKAloKGCrUO!w)}J// 4=UOpZ>k5э|S ~Drom,bFYrAB{F{DOGUoީOc , #@B<%p/ooAFBq6 W5pP~((ZȷJn+ Ư# 3+w5d%0^3~G9/W{k=d?|gC";{0O?~-~ilv{?x!÷XMzę[>NiimC_{goM[߉EmCkeo7mp?qLxm;ןz?7,ێxn;O;5zO͘l~ĵsyK#oU~ltm^"~ܳ?osϊE l =4pN?|G]hhop/tUz` AM2}d|UA0`Fhj/~;WKOi>YȷIo.}xL_=1ݧVb|}gA>58}be܉|Y?ԯ* o+%+P(<;zq[^mW3 o_2{原YNګp%_zi4-x;,k}:r2roW5ۗ<k*o-~㩇C7;x=+fEPߖߡ:X\=ecU70rxlte>_ x Q?2Ӈ7؃*3~f/k/@~OK G|de{}\%_L_2c z4gM]ѡ` Wڇ6;$ (LԈ K^>oloxo 6͒O /ȭC5O/L; }ow8V_pS= ~['{[68Q'6Ml~|{VmGlt[?vEb,x~[/c)4rV ߻1M%~͙<㈿w@ xG{>S;^aGғxo!?=VSr7|6gqً_3:]p48r7,;.?}ʼn¯Н>K+/ ~I \3n=r97Gҟ<K?^<V|L(,U h$Q?3~Cm? -Ku]QG's+>5ix2~EXB=ALȷIWgIVP?.}0}NA|C O.aolpgڻ5{' 7o} <79ʯΩq؂cáo_2Oz oqÛە7{6n4raNX7r7,x53~.q8+o-~ .MB7zە{?=MÙgυeC7|69{x}&?=/{o3xno=k*omJ<[wGvnZp8 z@_[?vg:VYtb5{[>z_~>g[}V/Zr7,[k>dǞk~Hؼӏchɋ_;G~m~IM_[?v“έ;cى|!O:Ģ^7,'ś>r'[;O?~o-v/Zw ?|3=9(ţۏx7F]5r7.x̙?{ -: -j\]ymqǥG9O%{<W{vJ5`hgϲ'G5S'ỵzCP)g⓸̓_B 0}Y#_*+ ez_>Ó_\xPli^ţwrk?dG'sk>dǞw.;٬w {܍ ڛ'31;,;]Kݪ÷8lOdž#p†:F'~Gc<@_[=v']3pߊoK_?oν_xi;~q{쯓~+߼>a wO!':^[l\;瞰Ͻ[>z'xg ~{읿=? _ō7pmbOaOb}<u׾:I77raIۏx8;~$3gwύo ⇂>iW>x"_p$,V1~_p;$CY : ?h-4G+AO'|=`(_R(k&O7f **hW% Lm0/( 1} Gtp'5'z]c *鬨^iJgUnY8';[.~f^/u}>N<{h^Aĵs5~[ůsa憝?ܷn=bV[=v'[3^x;rL~ Liqŭ\y[6'sH 掽*Lxɞ>ğqēVמrFxc~)<~O8)!~I{yE_`ߔI6;dO:v^1lJ=4oԯ.KVd.= /0;udY{Fᗞ5x6cO% _3מ|.\]yGm?=M3^A\Z%?K,Gy[68zt8sȯzY?}VSpV-٣>SyÇo;k^硛\Voĵ3i%/v{ή!\U[Vo-6|cgV/pO՚M9U5v.^dv=( ~f5ާR4<=Xq[zȃ|CXx#e>jOf OƷ|sLeA@c&KWg|d s*3]I]IK1}x#._BH>,ѭ~DAK1}D|=0g|v!~3(Hӗ5 ?/k' ZA؊/5 Gd1~Os O(Cw#+{z;w<ؾ\v"̿Sʽvo3<[>fk_ݽyGlq/=7{6gcm{sOQMW`V~ɼ٣h66:~ {\\6n9ןr>b'x鞟}>7Wqz>떼st<9?=5xۡ 'sN7ۗ+N, o};=oMӏct lvv*v?>\ooW? ٌG>G>:ۢ~TG;QӐ/k{5G+' @c'.Gӟ{ObٸF]JE,nFSQ[7 ʏ d=o+1`FBloLٸ_TPޫ;9>`Fi+iƯkhWO %Ư/G$ks~ O`i AоfGU85`sY3*` GU5ſ+O8*ĉ~IAۿdn~WmߊpcsݧfzwM\;Sx-`!'fȄ7}?=..;7m'g0~?吧^qMϯݧog>㐿w 5|6Sy> z%ά*x&]pp=?=^/qݜ}>&oc̪q0$[?v&~)iuIWį> ^O>7z^7lw93g෹o[sߵje_gw.Is!':N+qMܯ~yAL6 >=S'D>|@&7Uo!|GbehK4TVއJaY l=!ԝm^(ӿzCz-lH_<Ἐ|YF|◂d8Q~P!WJ/hP,0Q7LOlG+i*NGWƯÌ!ڇ$[r%gW/# %o>'' LB_767T#MNo}Ƿ-yŁqNԀ?sœέXT6/v#O1g6 ߚ߿Y=F 'sf'ŎCVyGljO?nKn\pNϮx6qӱ>t_z>_ە~ E ;瞰ϔfşy+ܸo=~&wڨY~/ょ]bl\=-'685eok^ n4Og玧?[k _Uyꅑ7y|WrݱmNګR_TP=G~v/fƯB&Z+L΋&ϫ8Aeo~:[ 5gzCy#)9_趷^ŧ/gx1~;'+$L_$7|a%ߺL_? `Ӿv›\'^܌_4}jE&Mz>L#*~i I.|@Oc+ӧ4 @B`ӗL!~r%RL7MW9 o?x#yC[x{%̿ø{gЏr[{(o䷞vȔM͢?}fnܩ#'s7~6&%9*,34ަ+gǺ>xӏ`H}fk?d?s_ܹ~M}f߷o=eo=qq/ZS=xc^;xO00+"O:7݁{μo=n^w-yy&:=g861XNO?n)=b/?4̊x3+so+-ٟݹݑx6p1gfus% ~toKwv^ ^?}9!,l[?vs8o=o^pqNg:ߣNx[?챷N߮]'?=f߮ö;79'\z{$_=$m~i\Ͻ[̯9ñ|q.L_&$io ok(^k ۢ}U+%䛚||_!R_>wptvmf}:yגy*~ܺ;M~i6ͧlk%{~n  ;~>[=fy鞿g#NXM_y>Nco-~Iܹ73/c~q{ y\ʷ,XOӏ~'sǾ7UyO'UD_USE @bP!5A>|9O w4E#@˛|_ǃ+ ~13ED١dbQDCP?[2h_04:xhoh݇W'姃iIޒtZ"L_c D0}cçM|O4WOA!;t>o}z%5| mGtWM57=%ݒUAn2}zqYvP0}A#_!W'~b'r>M;oō _gCۿd]˱,'_yWy^3²0+m_?^Ryة}>xGO;䮽WeGsa٨!ۜZT~ {w8qbQxns4|c3;ag ەW&?f[=zu2'沗q yג}&CrqRyȉ{o-ܟؙ~i<}&~C3}om ?}=xMOC⑧{~i<ܚ6ykg~i䷞v[>zz?ܷ溭M%O0`hS5|6#pv^A<}4">b!9(ܽ?= 6<ۖf"_`QAf wI|]0}Մa>; Oa~ StWvp+O+0z"m+tRџ|93} 'V(?]|'lk%P?ONCMRP` 4( {ޯPs\ 3}JtPI3}FeP8zMF|oPOƯhs^tWihoW؁GIO^cԯ,%oK鎟Ǹu^ĵs^}ܛ=juw~w6a~6q'xkf-k$o-n9KO:K#NcW*vf5=g>|']S=?=֏ah 3cha'{^/=iuڃ6c9}&i8;~\]yGnn:)!ܰS <=uɔg}/゗q>㐿w^9r&~ #n/ZwqbQxGmO;eosğ߹'Ӓ6;/~w_޵~/qW{Cv +߼Ea=uc%I肷yw=j+}ܛ(!Q[ܽ7qӱɼo̵'-ߊwus~{&s]OQ76ވIM(pL(S_w4<3=E7O/k|C_(/+L>cW~<(PW6'7tx8 :+;$ @BR3|;P%+xq3O~Q!~5>`_\ /ȗ5gAԂ7` lh}FE(_VʏA>ĝb *P?0~=P?/|jP ݇W =T%qș{ L_}ow7io-x艞7xC|~^!l/>i4(v'챷Nzq^o-~<k?dG kjx6lV~Ivi`{cQ~q{$]'si#818 57z^LiB3g;8l ۪~'$xm=rǒk ;7}6Eמ.,;?+a[o_2NoC=k=du/ZqnΣnVcv[co [8YxG'wxś6x}kxoГrǒk @_[?v/>iGo5/qݜ|wMM ^9c}>Vcw/w 퓆y|!O83^9~z&?=om>_xoby5C̓y} %uw:Q[q O<>t~%.C7xZ;~iןr17T^[ý+uzƟݹUnރ◟e#v:xK%{\]2ێx5oowy+7υeEdw{ =C;5{$4>GG Q?2~ń_vQ?oe70)/ AB{}R ~3(U aà~q@8_[Hq0~E#ROKK&,~1_Vhh>֡ 0}DU$L_2.wH3~ E0k'|⧂݅F|?ğӗMpWh0}Y#_*Zԏ/k&XpYBb9iX=^_r =G<}hP}owZs/wwyGǨ!4{|&?=IW]k^!,էopvO8%j\w.x7x<=#wX巟~.cwxʹ{<#Nöp+Vq\]fЕ矰ǥU݉{ɍ;yw!-~I\XNwvG7x 4Oڧ 6ؼsk~Xqiןr1;m{Y_x>W}&?=͛?j;F./wÂz.xlkO9\U'6Ncq4&?}4煷x6{ϊnGE~Ii!ڑ/L@K y~]L A/p Ut[LiЭ~B%߬L_?^ݧڛ$:#+z:LȷK n>/-z3}]' BQ1}uQ>2}ل_ܐP?¦ߋqI^tѡ}>o\P?75|į  `i=g#]5#^7t [?vC~r=|ozcx͇lrӏclc;Ks8Y8w;f&$~I~i@7zVGQBSkoIͧpbQxGm8Unq3vG^i0+ÉE7z@KxGlr8zGyonɓ ö'챞[?vsɓ%c9%%-F.ͬomt~cGJ7o݁q8${-G+l;?}47lw6;7į>7|O?zU]^!; }@ |}R?pYIP?/kc +1Ӈ7.kP?†>AK>7M/._74NQ?4]_`ð݇u0gO'+~U_1}H1~Èo2=^ԏ 'UDS2}p ~/_Up|ķ$*lGVxџ~c  @_~$_=^ѽwޫqͅ` ?>` aҳܵ[r~Ico-~qןr17xGn34pu7yś6x5C^a[ 4E ~),:v/fyҹ5{78n8 7/8)^99sOا/6Z-x}kt󂗹~mF~I';a,:y͇l3svzfj|6?=e!憝vĽom#O8__?yӯ^Q?o_wO(įO;E (į0A3~^ ,VLwM%gT {}x=ƯР~REl *OfO3+b|9;~Dט'CBZL N. &(>a ?РgFORDa|kpch>FI~}aFZr݇U؅'|.,o f' z]"_+K??SVwÍot1xʹ5s fƣ'qv<~!ylrrsOclpfᾃ/>i9(cw!~Iqi'g7kotܲ`/ܽ7S=?}yGpVn;oYqǜ;C6H޳^q˱W&?K < ;|=35eg̍;7}6i'sp⥮ʷ,XOSĥU">b<~d⑧{o[?v./_ܵ^a["~Ipӱʛo\v0}C'MB _L_6AUOpi>K0}^#_5_U}H#_\vIt^$6ⷃ|D9S*2NqHt^ihܯ|]R0~ngs];bz._] p3~U %`u=?σ]76xGls8&Cn9wY />a߸f.μ6ahlt۾[}8o]pV-SůsݻnјC7y}?ݰSy݇n{٢zqqȉE/>q Gn3|sϊ?sq>ǝ]3^9Vf삍.xҹ5woBǥU"=b'p@ 殽u(a=?[w;tUÓZd¯`w{ ͒ +.# ~>~qAw 3~IP~!}t#_͔/į *+^~uy>S{~)?*fFgEȂoٍ 4-#򋁛i[&Zo ߋ9|$~0~D 0:~m#* 19s' @aP.h?ˉ7xY/;}hƯ[o_2ls'_x7{9 }pjQxGOܣ%ͧr#O͛[5x쐆~>)xGpfk~ omƝK^7q>l_|痍~+߼ ߱yqīܲƯ>eyo#~qUnp-{~ {1;9w43/c߿oũ[=fo=qgW5s^9?}v=y&wMyGosfo?^qӱ~&?=^-ᷟ~cx[6l̂~Lʓߵ[|w?k*o-43 n4=)[!ͱyKO~c«?h_?y{t=WӾޚٙ3ԏ FX~.$rfqp-'%g&d1}DH$'4_Lݸ_ ~'ӆKB{\>7_@65bpOK>/f7t]wOx~?}J|i4ˠo_2A}C?ʣmwNPCcy5O<7Igݽ+N, om~~i$$[\Uq~x[6x̙f~.q8ە_{!cW|kzd~{܍s{f/[=f߻E'^9?}zVoYw.!ۜX~[7";4?}45[=f#^r&~I{쑧{^O8r7,x5o=0g_^_59z>95ڇ%~Tk*o 5^ѽb ?o- ڇ5'/ȗ3$ϩ4q[0}DV+%4({E ` ʏ⻃k&0_7A{ ik'σ'|_T7N5u7ޑ/ȗ3 o_2lsϯG>ټ& ݶM٣?}Fcw;<!^atGGqۥ76C^C8c ~~ v#?=.Wy/?iʛܰ]7Ϲ&ןzom"=Ow|[fNq_?3i %)Wz8ۏ}4_ܡL}Dy~y~[wThYl~ Ʀo~ [`a3`_TѾ5'T\@k&|Y? Ϟ4ABk2}@C{P?;ɍ||]!"+wn^Q'U,C>lwE~~ns; _I!']+WW6XsL0~;WIyo7Oi]oLLVG5eAۿdqk_u~y78(ʓynao>퀮|6O0Ww/xm :On? g ^ߚk[=f?k*6 }lxlr˱~~/uݜ9lܼQ'scxx7w/yk>dǞk~㩇{׍~ɼ ^9C3?=ɬzϊǝ]sEoclxӏcLᎽ^xGOrC14ůǷw߫>hGq~x<䌮_޵Ůs=}Mn\kԀ}痍E vWSp|^xGowx7XNɯ>7xx!O87obYM7~/w=oU?婨6AsA p ʟ ԀO9:{'G4˭X^aSiIB}|EOP3}="߱8)_Q' .&hS;(SާoIĆP>5ڻ'凂e5 `0A)=UߋIYP3&wJVTB>q]Q?2}D^tYf7 +F|M޵CCע}hCR@ˠo_2NΟp}gf<?}^;¯ja2M3xM;[O;-?ܳ_7cx[9lcM~qa'{J}O8rӱ~&?=-y#<5<)^9twMIW<5cJӏgoxĩ lO76wKxGpzO9H7XSc÷XOo_6O8i\]ls^ r~ןz^9 ~I~i;^Q~<,0э|5*'4_?oCJȷLiįl؄|mS?mn7qYBz13}턯2.(77A/gUOӁ36\'|פGY#*S2~WA ǚA =C?9b/G]R?KߡV? nyӛC733nکҼC6W >^'/샷~CI ;76/ѭ 6 +!0~=/.įy /E_pMOh_$凂o#~ici {Q?oW4g8BL_7M8݇TrfƳ# | ~9(?4>@*?ܹ4 K2B̿m_7{{-գ'pfkgX7 7.x>~)̓w#y5Cos|^]b56n۾[}𓏻UWWғ',egqݵ݇u' B=䫚 E!vMpYqv;PP~Wyspv_߽ây!?f s~WtUKkbFx(Ug6gVt_?p݇W5LhR_4G ` 7' 6 Aq`Et!tSnWQ^o^I{b̿Ynnr;o?jܵ?瞰ǥU= ~\\6N, oV}cW&'V_ۏxŁ-͙/>i:n'Əݑ{ɬo-O:C69Q肽Ut@&÷8yopD_/?i~;¯n>xts M OclCNw~k?d/,肷z{ϒ~zFxGm39*xĩaᘜ٬ [}KO: mv şݱ/ZӾ{x~K^٣~>isUlN)tpx;oX L_=9o- {$}\GtQ_3~E` h؃*Ij0}R~[AO!#mկ-oР7ˠ_P~dG'' 7z%~6  bhEO\gn?Mq o_2J9?Űύo+<_ݵ /=qsGmUQkob;~%x/a'ګ$~龢[NDy+&s Q?2}F#_#Zԏ+ t0}̈́w3 WOk&t$nK+`7/~w{9ʯ++7v]{#煷~6xے'[3+â?=V x7`/>c^ ^9qגWe}fΙ/=io-߮9w4qu#Hm#mW~{쯓ǞbхxpEgrJ^a[GoGܶ;FA;~Iܺ;PB#؞-3xs~q{_6٬cvo=ǜs45'q7y6&2f嗞ϬomN, rǒk Vcw8X7J fE\\6͂y>)!;/=i4RxS#W]?YD̟ޛjnCM{ƫ 07S*b|Y#'V`FZBB s;DF3D _L?ATwEa2}rqY_>OW1>Io>,A|Yn*vwy 6_i~E!~%_=>nz6o_2 Gݿ+,ny o>y&xO8mŝKj7{67 ?=6l;<1633^!<ήy݇nsOʋ_7gǘNxف_Jkn9Oac= ~q{&f<'챷N^ ^9O>?O=`Qz6ɱyӏg5%oWG<[=v?ǝ]sk*ox[6xȉsG?}x7xx6^Ws%q{'7 "~{[#7'rۥE'ŎrǒY;>[wx݇mbS/y[6ĘMM*O0kO9+MHp4&}PB_'M٬ߵ[՟s3mW\utJ'gJ.o?o8nx7~n!~?>詢 0}t#*_[nAg8 y*f Ϲ|{@L_ؠrVtPihğUn>}lŧ7E @-[&g$-9 ۂN#w{'|YVԝm/77/QOx=8nZ7x55[oM "~\X6sfk=dG~r27 ?=.Y֏ݡ ;lt3^硛<<WiwkO?K#煷ym ţw~k.5} '޷o]sW{?|o~;x͇l33/?=f[\]&xŁnκ{ G 7.q0$ۙ1;7 DUWo?0Neb9(_Q`Ư @٠|U0}ńew{ ͓^n|&~-([voɼeO䖷xSÓ &fo1yGl#EWr]oK}"1;=l߉E-MM;/}1g2yGl>aM:~ (cv[7~q{<̌nΘG%}on4qW&/~͌;.=k^!٣z^7']/uݜqA?['p゗qvM7*om~{?jo^~6.qV7z=6--#_d9r/MC[G4&\#*[%ӧ4įI_R?_7 Vt_3~'"tf :.tVifU .k&|_wy g_R7M?ݧT\ g0~Ʉ_os ~nanx7f/_3 )KEptm ‰{i]_u3;}pǷ䦝O=nu3/wWq~_߽ om.,lVn87肷}BO>uɟܱ䞃~w]x²O;r~I\33^9?=^ ݧ-BO;Gq̯?~&uw`;ܺ;rf1?Ñw瞰qU՚= \WΫ?|DP?;D>L_z߷'{~q{ tg 5zC3?=^a[ɼ?=fvn^3cfO?'7y6)v[|ғxܰO? g";<߹~B7yɞ!![~x{4qU[=xg>a* `-h`HhJ/+L0xuQ>>Q?bFA[EQ`|}sP? bFBp,YMk%ˡo_2sGyo<O' ;:矰=>iS0९=O0S=?=Fc}^9M]Kۜ?jG,A?WNWP~9b/nʏcW<3-|~z>0~vï`W%芞(l$:+Wt6ڛ'Z=AmH_b懱K8|[cmxWF '0~f淟vS.vރ/>i!'z^rǒWe~Cj%O?!'zo=5ɬ_!=7oǷ*ld ob;=x5t?=uIHSW6/άǷw?r[uG}+tɹ_}!\]yGn|!O0=ty-ݻIּ#w0#n:gh1<ݻgfC6{3 cvxGWw-yS›=z_x>!xGpvמr[:KOQf/?iUv/?c#oNr[>zk:~)[]qW&7t?n^9r&`>'r4S@\uZ;~[5bJeJou;iո_Bl0}|#4_B`Fn? L>K}XG{S~]pz A{綠W@~dEOaI{bϟ Kʝ+lpz'b :{~U_}WaJ}>C3~wϊkE8QxG;O;5ɯ?{&^9 #򈭝M~nO;敻1Sym8K#";</i7~6}?.x#{oۏXMoZ <[wG om~yiÉs>bdgrۥx&緞vǸso7zsfƫܲO?n ~r=|K/^7̹uwdKyuoΜVK^?w~UWof0~v/m|9 Cޠy>qAB{F{~AB{G@w@aiD2~I{DG>*>,Da&ᓦ|Kp6iѸloG*pa U| }?b73}V/nCۿdqo;g)['7q4&Ncwko⷟~f']p4[}Vo;n\y5>FqgW]?+2xW|4mn{ǷenJ%!xGa~#Qċ_;gfymS=pߚ߻~+߼S/ Sٙxܼӏr2}q3xЃQz:.9wvqllmor5;l/:<}6pvMWcԳkvV\ձً[6bؗ,uK^̫`!'z~ {xls_ܹ~>qg<ܚ7~6Ww샷z6O⮽/ΚWxq;1O}]Sϳ3s^!yف7}~I캭ʛ=j_}_ ;7{6Wr>r_XO=n O~mnQ}#O檫~tM>P?@`ʗf 鏃 ͓1~L!_ǴOj\v݇Upr~NE oFPL_0@qL_7@|y!_+>A s*񻢽k}@)0'$7g;/)wM`%|,ﺛ~x{Uh~q{]om}j[=v>lt1;<5ow&8F-{#O}ڽ ?xïU!yWW&7_{o?a'{^?}o\7.xx!b{?=ocvi'z~{?'9.nZʬ޳ՊZBE]G([/9~j͵osr\'a1  <]Yyp?㐷|1̓3]?c<70^%yϷ%wI}/w:Ogl`v;<\,OU` vf>?f|_|goL@~xEsoP_7 |Baxv}4 wOQ&>Q~eԏhƯ`+O+` `ׂ@ (_PP/ ݒ_ʗ'ڃa` _k◂e|d,ȊB>/ |O|0}DUIhx7?.ak*;sOg^[=f?xlς}V?qAW[=f=a{&^![,:ً'{W܍ Goo>csGp,w>p7~n4rWef>~w O='/wK^A~!!xosh\2/8(͝?;ߖ٩ö8((!ltgr4o-߮Sy>xGщzV<~<пҫqh⪫µI K  zj2+_Q?Op-R?_93z>N[5M,7{$? U_?A =EL_=q}z!_)>AOtP/oag5&IaF;~ gy;3'V :WMK_f:xwnxGmO;)^tӂ'[[O;~7փ'o?^l?;}7֫[?|d~C]ws<3y;%gvjw o?+m~[">bէpv:Qn;ڭɻo}4eeObIOfv$7[aE_޵^qzWr oM?=Vcv/v/oᑯp-ނyn N.*?=y-3{Ecw8(ʓx'q's}{ۼ>F5}C3W]?U#wү3L4Q+|~'k&0sA|@ƯdntEk$'6D 6 Gt:3~ _Z_/ȗ3z>5NsYX&ⷃyIBlb }_q/-ߞ__cƯ۠o_2ϔC|exk^58(cw{VŝKuzyWi]q璗vC␯桏}0׾kr7oprO'uoO}:}BpjQxGO`0o-|noY!=rcgjJ^ ^9#=3ůL7rDW7ߎvWS]`Qԫ]6ឃx;(cwK#ot]{#o-nw.;;xԋ?g<<ޞ٬'a1ir=p/*]ML(?+$,PaFIr?Qi_8/c?ݧT4ڻ% P?w~x2~A~Z%Ncet\sP?Cq[_)|dF\P~0}H-_=2h~8级O&7Bۿd۸w@w_řW6==#Cn9ƏҪӏgEo%7KO=A;|4Zȷ}s;y5=?=5O`qo¢oc3kŝ{vWiCO_p4=35ܳn;;^Aܾ7p|V'Ҽ5⧿y7xE[_O~*^s[97^[?vEcwsOn?mE7z53~jw=_e~x:k䪫':N_^c_?//mHEJFnr?*WZ /. |Q+ |~8GT1}n#_= GWxf4~No[bM. lB{Fg'c+r9à|ca =Qoj:?a-ycޠ%L)Gwʼn}in7 ~(ţw.NJ[b_s󱎟yf}?l&^8wO:uٸ&=6O?~o-j_~o-tO8/ZqrQxGO;_5n, 7p5^nɝ?st;;q7՛/~rh~)ڭ[?f;F~IcM55'i2i5&W]?{\qA3 1@-[g݇V_ҠrYѠ|S0~Bԯ,xo 'A{_㲄`_9ѓDQ|detPa_L_=.SE0sMtU[}YCO:K ӗ5 O# =O9ؿM7})Xo<?zW_unyǷ^4mU~q{;֏ݡ Éö3yy?=lxko`x7xGO?yně i~C['M~{\Z%y6瞰,xGms83`H,or]ߚVii=l?\: @ 86+\X62y?=^9/wÂǟ];O?+ݻⱧzgrۼ%S2qO47ހ.>=ŧJ"[W~.^l36sf͘po>퐩s6^< ofH⪫'S~Ƶӫs/F'V WLP?ɳ }l- O,P` 5Q?0~_`_V_ f 7O7MC+L_6A$+)5>itGTFO Ư`t&_3P?0}VAJ|"tRѽbؾS{g2 `p; wu3~q-y= ~ɇ<^mU~#QS8xl'ƟQv盼݋㷟~&^}g'~5gx|۪xlPCSƝ7z}ڛm?=B֏yf/=qsG]?/oy; rtƒtǵ[7x_'퓆C3'?s̯norMpPfkRC#a+O>r7.x?=ĢVa^ܳo[a^[{q~~!*asӧ7XS?K0}Z#_/_Π|_#pYɠ|]wޫp7Nx7b _eZAJ>ğWOiGV4'HS?>3ޛ窫Ϟ_5hn~}Cx~I!_/Q5M+/oލ|~ |3}DѠ|{!_)A2SMf݇U|rs_G5['}Za_/~6(?Ì>Q?7W2 > ^IBk8_ k&tVԯ(_9G~ٍE%S?ˍJ{| ^K]7`H~8Y ]+Bqf ?a>toe؋=?#!^9?}VSrjQx0c9%xGnǷ7x/vݜ!}!gRʍoVN>׿@B÷ؙ~>pӂv/=i/MVGGvN-vxɗNS=tV]{#qגnΫ޲vܳB{&?9ݑ_}>i.{}?]Q]}'zApUU4ߡ?}z?L | MBF{~{}\eFIr?%UՒ_ n'fƯ`ez_W6D1}]3tYa'|AI|dnc+ g~E!ğk&◂&Iڛ$v @Ti%LqQh7 gW{W _%7/Ӿyл>yoa<~sG!xGnsF[o~w8N/y?;a~jEɪ7nOpHN, om?=5N, oxn<㈛uC6Q~aVgҟ/c7~N+G@|fOnU^ay5z8~{kڷOFn4׽[pa:{;g%ok&f[>fk_ܹɣ̸`瞰ϔʛ?j?͟m;'x檫.ٟs//R>n|~dCޫq?.W!@/L_2A{&~HEb2#+FI|0}̈́o0Z Ea?/QInr?='v$bBᠽ[R~߁ ݧW+% n݇W||$_ԏ+Oi˘L0}?,}Nx58Kv/q/2׽{'"ෟv.I wV7vţ[?v{ήylql|7<{w~^Tus[xwzS=auf ~㩇<YobǸ'rb٣wkoؼsOglF7~O' {p5_nxүxW{ ~I [=v{şݹQg7`_e^-_½[;MP? WN#~h 7L څ|Ӥs,J L/DB{ۤ}D#~K(_1}i Qhԏ*L_P>s~aaxn9/nEE\Gt7/y)OOG?ݳ{ o_ܵ~/}'] o~q_޵cM~/~yE~[8|ғY_q1ˍv慷|6]wێ>r{>}om=fwd^ Noig~S'ޖno3\cMO:7v/]{#C٬cv7zS/ \Q|w>.n~wE_ҟ go~C}[~)s6W >F$S`/mVSV6vfo]|mo…erUgrϯkpk:9 U?ԯL_5Q/rVP?#1|@+]}M!/Zio[%Gԏ,LӨVioȷLg~ӯ희_SOg=7vNaRSCNx͇lL%o-淟~VO9ל?k:^1(jm?c<ߙ:d.=<ߒxcIs٫?x[v*?=Ƅ|6Crf瞰ǥUyk?\w}Ry7࿓[{r_=dϥUra9?q肷}OXWw-xGn_΋_`W8vn|_%yk268(cwskxGnrV嗞x}!xGpv'+#މ__ex- \u߲yepHU '*K&'/Nx+go&|_ #h_cO }===ɍ|!/kP?(S>/)_ m'4^Wn~e㛒9|dwCqӧ5A>")Zh~]!_&i#*IF^!L>{~W9ɹ?cċq_0|^Roj\:͔f?aGqlxo1/?qɼcvkoo?ޟ9'm9͋9_4Q[=6,XMgf]5^a[lؼOރ GV .\[ߎ[o_5nzd~ݵ{~m#~S}LY\ol

n|qk];x{;xGyś6N^!<̌;.IsïLи_ 8>y~lĕ_D! @SɗK/nP?(0t~/vǜSĥUy?q~8vS_]6n֏wn=հ˽+tp-߂2qY6/v߿^xz-_ߵ[pzV~sc곾:'[-);xUjWx|y0׾k@nUQ9{8bxorqn cxl#d~k_u~O_ oڼ O?VE vll۽UO?痍v:Q|w7NpO=; ?}vWzQ w~s\W/%t n/.AR?>m"_/~#_P6gL w2BQ` tRufS+FgUI{DOGW;&z>f @ZP!oDB3S*_7S~Z7vLA0~E ?o /L<81~=o{>Adzo- lcx|P>&^9x8~| w?qG=ٙӬo?nge򮻸^ [\Z%o[>z_}oW^?y7~%wS's^wWsɿV[W~lnx7E6I+N. omlx⹁?N͋c5%?}vf۽r۽5Ox"}^]߄k6+}..o׸^͇>mt۾ܰfO% {Vw8GaoÃP5pߊGyokO9jzg6 vq`gVxp4?gy׾sM#?͋p>63_%s! ]lZ/_5Q8G4Uڻ&foDd+F>\_4AYWw 3ݧW&-k W$#:+V75 /j%t[ȷL/ϟ(_T0|@v_*/L_=. 5ԋŁl(WJ&Ư`jFA,oމ,OgK`яcE?Bz S'9/ƫܲyᷟv[?fkI ䷞vϭ9(cwxƥ_!!6>V/'wo뿉 x`H~C5xn3m";O>Cm^g6 wpߊ {x}dr0$UfO!Dx=+vf}mj{>LEW=?̉z N+?I{<{{֬PGu#O;K-ìK\Z%O?3>߇?i$nx7G\u :{ϟgqn7"974|VQ?0}n#Z ~ h׸nGb 6y~Ua U/>m/E =M oRԏ(I XB=EL7NtQh%k'K&wD1~mA{ähaNqYMP?5>5&t&S1}m' _d1@BB`FMԏɢ}|Y*LozHmp="G>/rt;'A)筇>7\Z˾M<?s0qh _ݽXۼ'+ܸ`xgxO~~Ϳ[㮟E-y^C?j+wOI! n$^'˙}mdfOq[)#YMo=y=倧]NM ~7<]ߙ$5u}ǏrI>މwM qVe/uݜWe[w~Il[>f Oν9>R=l?W{ZznϹNNQ?oh<*~?G6ʯ{~y ;%}Le$_3P=#r7]Цzk"|iJL ~N%~Wks&8 4| /m{7'$O/vhNS3Ozuo?k}Zݸ/omno-lT~q{\X6٬#?58ch?B[~ o&Cy\X6~q{ -us|~oc8Q?3)L_ BQ5 ABA 'HP' alH_X3(|i›P~W5<, .B|9ָſkFXp_=@]|Oyytvە'/yGlsa9sOgJZѧgSyő{GO2=<ߑ?Ҵ?̮=r7oӏ`Hq:DHPB_`H^9|Ÿm?s\s>e_ c?b;xة?}4r/uݜw<͊x;ήW\qw{7ౄ?aU W\>]q,xۡ/<~ՔţwꃿgvNxnpįQ?4踬|PӦ|[' T|_AvLэ|DgEV~/f.K_V_ z_ \a?ⷃmu (NP WxCL{~ t۬`qÍ\گNY,>?‹nb:<̫ yo{z`'wh^9r# Z]{#Knlq[V˝?\G7xm.[?v{wO飶q矸]{#:Ə6a둛mO?m?B<z4)x̙M~qWe!xGx@:~*_"~)fCy ;h肛??=>{solUzgȣ3qU^c1D{FC ڇ7c·@~_BB3WMqWI{~gz>{,QM*vI{$~*(_5Qb \)a$_-_oag 5W0 =^ EBӧ5@P?^'LtNtXLMz?WN0ԯ*L_?D}D+WN0@Jf+Ưiat'pV['#=1~\_ H7dvN< ּڃ6)~[u#{WmGܵ?O?n\ 7.g8(cw`◟t›A\o6)gq;}4׼knxGoqgJs|> 7p+ c~ .мO0~,z>⛍7!ߦQ?oLP?#}D#_\/-cM o|@*:IFlp/tQQ|dȆuL5aџ׎4ův _=w%f?|Ugr2#a_z>Ocpwз^Q )O!S'8A/,oL0M_'5O,˙!_ W}UIWOOPx[soW- IGyf]֋sl>1l}Oh"~7rM.#=C8EB$_5v~h hܨP++o h' >enPP~(hmp݇Tthhܯ|sP~d/i1#}d=0}Ʉ.~|ݤ~|clj&`O*~aϘ@ԯ ƯCL{P?9}ݿD;Xq/)|7@_~wyл3}VfgV[V,x;į>xGm'_=fm?h3%wϳ>{W^<5w\x8:jx65>~^٣w)#n1k#?p~wnnp~[5=oM~G< W?s֛zK#\?oĉa5%:ޱ?'ݪţ9yxm9l9N{x^ހV\o@=W5-8Ȱ{=NWgSo6 MF_ wE*43}q2e}v@I{~A #6{cqݵ ]K]Cӎ) 05r-'~a_l ` L|F{Y&_;O3+L_+#2iӸ_BRL7fhP?[ 3}}~d%_3iݨ_]Is}J#_pItZƯ>2~Nï\+U|wɓ;/(No{oc9(=+#J[~٬cmGtc~'?<ޞK3':yz{^1XO,x?y%=uKv慷x6۳G~o_]6| [m}k1;u9xS9nf;{7A^? D|Y'i'dQ~$ğl*| >qKQ>2}pb{wߖ^}}rY{_m .qN˱~I| 33~MYL_֨Spl=UtSDUo3 :'nx}P/fϟ ~W!7WKm\? hȷIWOLpOp>? ޯo\֠~bERL_7)Tl%4>כ|~Z}d3|JwuK[.9 /ΣDot#v/EK#}C+ʓiinܩ٣vᗞF.q/afpvg[{w?[~;מrS/ M }fO=CVah\ӏ`Hg[>z|G~w-^ v{&~;w/s[y0/sÂ~>ng[x|?p> {(>/t'Op~h}{|-?I\hWWOğK .ko}te _TfB$w  3~ieUtU?qbw8[}ύOz6_u ̿Dt_ \zܓ8xSh%S8|EAŌϜ^߉F|=R~>(_Qi3}D(ƯhTthoi\P?'u> }d5sY^P?ǘ+&sYNP-/NSfFW >\hwKWF/'TFэ + :|ۤ|na6EĠ}Ho{e3o@0~ 'W2~I3}L=>5cL .3 g7E@[;#>7{7v^챜 oH1~39xa{ͭ[^mw3AF{~}L-r"~'50ABML |U @BaS\[Ea3|qkok m$ =yGl>rwd"1ۜިy5!>;zWfqW _-|/sWi<[wn9`hɓ =+6;9Luw?< /rmq;ݱx~׿+ Sko~}om}fN, on[gk03vG7C3?]p[)g|#o'sf'Ŏ=4qzf^z߷xGlq˱ǝ]8ٞ}wq=[{(׼kR舳ٴhP?be}? ۏx^r ߯h#f۸z<'f/5?J3']Xa-~ya ?o) f :.+?c @bP)'|E7^K& NO8C#5)?įLPȊ|I>e|LIL7Ht>3}}[l?wko,L_` f@^P?^n_bv p^O_KWFbVO>n@H#Xo?^:f>9*#)?{釾#;O?glإ/Zf\w.ٙltz߷/ #BţaOn_sw/qr 9GΣ3Ӹ^L(e*91}ㄷ~^m>Q?3M݇v e=)'& @.vo;7sU^٩SįJ ;*X`9k5o,~$tT оa~\a/ğS ~jů O+x([>M.KVWMQ@w1x­b 6Aw@&^?iш_ wNp ?L_39>R1O#39Qolp 7ڻ7w68+f *p_1]o-4CZS7{6y犿ov慗uy?~wy#ofzoDC!'z4 Oܧ+/yo=[f>ǟ]s~+߼?ܷn=`}wo*ycvx}Ldo5ٜkfl6 ]L?Q!?Q?B&{?c޿eя2̈//k5I|sP?Cf NpY\>o\݇T{$w4Aa81}]ç D._!>.ʗjFS~<(P0}O~DEO퍓I EQO% @([wHǃ,BW50$O_~ɸls#k/-~;ͬBKzBC6x̙O8淟~E/?逻Gs^\8vn:w+c-7sÛ1/~W&{gwф ō}ܛfƏןz]{f:Y?W,Wt{GO!xQۿǑkuě>zFKnM߻Xr>xO/|w}/vw¯ptmx+"|fƔr4o-zq߻#q㷟~ϭߩEm_l'b ?xo}nyw,\?Ͻ[> J-^y#_U_,EL?lʏɠI0~D‚&ySQk#={G;|W`u$; ro.>lOSCMQ|[rYBq=C_7eBA.SO%> c͒>cBOӗMI5N)Hԏ/׍p W$.~d O( n*&I'TmƯ,o Փs~aY{k^[fO ^![K?ɛc&m^Gݿ+֩ğqE. fwcon=?#\ɛo5pۏ8'^ޔx"į=e;&^M#!xGlso>'_sm_l G|6us^?K7?'^%8R/U p"uk׼lP;(S`/*MiԈ[ M߉m'OR@O+.cVGr{o)] 8Ns_9 e G&(GUX3}x2C`eUtVh`{7H[>phK%$+o~fBD)_69}`Gf_ܯ|{@-0| S?,]:+GF$7~|k' Uo&oEʹ+nnK$^Oxw /^_?[mnCX̏%xoO~|7xw¯qkr~iwLt^A(8v*o#wv^/q?c+޼<RǹN~q{ h<[yK8]ydro{mvÅ/?4m[ݹu=[]+$xm=|}zl2מr@růs W68+&)ABF{@~D%-i?޷= K\9}T{[O}.5x@X>o"_ܯ~us0}nAJ0~;\=ZK+X\AIvPP~8M0} |Gj~kA;fכ _L5A%[ /KU<W#o<í;i"ӯc3۳-Éxi.;s.{}ػ'me)ě9#wů[xaO8YyGoO;tpOӿ7y%kKG-:3}a~d%p̌_=~\aט#;Oԏ.q˖}Tez +k*?q=N_6A$S6\&oȌcMO'<]Q0}mÏ4MP? ϟpYɠLE޾?ԯ/p- _3MQ>H['+ s1|~}l~IS;(S#5́OB{>%>\6@=Q_8rt]\sx3p4c;ł3ԭ- g'Ys?~MS_/9,^ ~珸A12q0$g6+om;'Gr7,8w_}>co-~{0ZF'M7y$Å]nK8g^Ux̙/}~%ؙw8O= e7?ނ %;Nwlwy7ʏ.ixkg6y/?ygyɞy&?{_6N- om~ܺ;pӱ۞9U?[r^G?~N!cN8/,aA|}DMW2C*\gƯOu@XpU^G< I?pO?4%.p9|2{صj/XϪ2=UtQ>oܯ|U!$g~ic77w7LtXȗ3~yWwr?+ '7 ~iM 6$+NE1}Ǡ~tADF{~K O.Pۏ~8[/HgN󯄾W~O [.cy/&r ˼21qzV%VSrffW|{m3~WO{m殟EwK0{W²p|Qxl36c5%9zb5;.3i ۳<. ^9u?K;y>;~g.^rf7y6?ll[=f_>i.;(cw讻ނ+2\ܥfoj߾x}.7]bZd65xʝg_6Y.W }?o9_ey#~ljYΣ񳏥~AcާA~_L_>L1|m}z%oI{'GU77|+` 8b+o5pO\qnC;[5$ڃFI{⧂2*1Ãi 0}7)n1G7x}TQ>,K>IYP? k&~sA0i # :+7ڇ%&x}oVwýN˼O{:O|2׽֫o2?ܷ/ZqVMo=[wBf+O>ܝg'מ>q'a7x]0";~q{=n-Mۗ+Ucwx5} Gyoaz2 ^׺>_Ux{Yzr/>q.xpo=4̂z1;{^!_?cpn{­~# XlP Ƃn6J'86nK+r!z\{׾kg?$gLK+Q?jg7Lo1CL;Q?_3G|8{20߻k5y '{cCZ`'<O>,@,L_KAf :ЭȂSL_>ᇙ*^Ypf+g|3}Ƅ&GU @DP3)  G&g6p .= ْ٩3l?G͒K7i7^5x7m*,#yʅ}!5?|r4w2wǟx'=~wPq۾27;Kx?N7zc`w~;om<{7y}7={V`qS*O _4pȓέy7|5/?i4tz2?{,docND;}-Wug9/ ;\q肘>o(h A|O}rQ2qg~P<8/Ndy]s7lNon AK0}q#_,UБth}|/`γo- 1I=Z9>8i (0}D>rn8#g㟀qZn n!ʧWxdƿ%\{Ox|@;8o[4)@7}6lU~q{.-(x4{Nʯ^͚ʏ%Z ۜ,9-O=|6}|} ?[*O_e__ o@ VÉ߻mς7w^lvo}|ս1^tǟ];O?uzƋ_;gϔ&$i8;@ko^%{d457ev)wMlrnc*'NU?L_!ԏ61~_ϭ.zM.+X(_7%~9_Rf -~dEO6 W Ohk'W O}!2Ʒ}3VGy':'7 Bۿd^<)\b? [%^QlrU^/y݌_|L?Ew|{O=˜NmIjq3<߀F^/~݌{&U9̯>倖Q~5 ƯQ?Ҿ`†Q8 _>{Ox2©'RY1}f[rǏ4cΟk_L nW4ڛ%+?^(f3~'O.o3'MNp7 _kVCډ|]j tt^ᒘ>oO :Ox}" #π l3>i_we>/u/8!fU{{ԝmg|)Âӎns,n?iML7KI~bio߸_P)vkCJ>o/+'|%~݇T6}cƯ`څ*%$3+::'/3 `|5}oyQ5{-[ssO?<8lOro]v(^mnw\@Gyn9MƭcNf1n>7~}]˿w^i~.-,:{14PCKgs{/q\uO+rc_ >-^\h_ j&ԏ*6qq[nmb6;~g8/Snc= @(Uh{&ӽ!Ư|KH0}T#2_S/+~}d|Y}DEOG6m͠~~כ'8~l!hMWDEh+%w/0#}`n6K}oWj%R8r/|I/rc49c?5לC(ukbgV*( ÎU?<}K{ lȌg˼ u{mFw8@[}LK@]c3W]Ӿ_'>[~༘a~d}L/*q`#8 /})$ۘp=;7|}⇂NI# K_5G~}}PsR!(?Y>肨Q7H{'ϒP? 7ڇ%zS`&͆޾>,)] 6]f 3~Gy[~c% }o7⓸wOu1gZ8 /ljY'w/Q8!eJcxO7}c.̟_x[Ưipԏ5ڛ%{ 0~I#~4VXϨ?Mk{7`rۏ$7qz7['#g_PL% @NP?ޣ;V l$:1NR?k&tth/ȗ0k SAI2}BB?Cz;ӿ{9w) 507/aw{hbO߄ō7pUW]ooN|;r6*~ɤw) _?ݧՒg2^7{#fgNs<~'G g)?.L_ȗJJ}2}@|w|O%i`'o_jP7ӗ7؊'O1凂|dFIP6f 3}Jq7</ǍotǏqw/p^{ފR[شmwH_P? oCx>k` 5AF{ ~KϫŒ *~Dw :.+?O&~&7/aC'~/b†ΉihN_ষy+fOqճ,p5^p Q?2}A#_*9>J>QP;KK'踬|CP~0}Dy{oS~9(_Rhojq~laچ~D!_ğ3{/y07Н:1K檫~wyG"IBi=b^~ỵzC?3 >S@P?G{=?L_(?o-wN5ԏ1}e#IJ|2}^ ݇u77# ӗOA@gE|ds_zN+}oꪫ}2; cwoOz ׿Їpwo6S8R/AaP?L@'|Oj,|o5\/.˘&H]?ϝW3\8WMx:# Npt^?'Nٟ}/Mq;=w7@ۿdꪫ~%Oнw\>'gWq(us)\?rk{Ud-CBim3260*U|ʌ_B}DmBB7p~RE+|SAO\M<&ӕTn|7gq7Aۿdꪫ~k8u?>CwB_Ҡ?{ .GqSɃ>2}aÏ0$/-L_(^? |@OVfچi/*;&7&|(_^(L_0h?:iد{6ۃrgػMoVt;;7Aۿdꪫ~rtoe{}HEMmTߢ,MvHs.r8y=6W$1}D  _۴wmѡ]>oOO# ~3}F;Q>2}aSZ/ Yq=4[R3;`P o_2W]uU˿ixnyw$JGJ>O r8r/Fwl^0<ۿu|P?M6qp]+%7ڇ%.tܑט'ATOȗ3ABF{DwVѾfb;sVuA|3\uUWstt;\ϠV+o8Er7y6n^4w/P77^M`ډeUt 7OPA.5#:M x|P>&ȷ5+D%_=qӧ_+@{ UW]uPpx3X̮GTVw3~W;U/=s}DJF(P 4U~_ZP0~̈́o6,;&8:# \goP|]Aw K{?⥿b1+"1q? %sUW]uwү>w;R#O L{xP~'6xQ?о4P?LWOhP?}1}ՄCWqK檫7V?3zWK$=QL@+CiKr?*LWJH_P ڛ% Gb N@)K檫Vw]fQڟ~?p3}ӄo ~1ȷL/Oh +| pG/\uUW]ָ}[,﹗8/Ʊ1zA1ۦ19+KyR#MF#~X9rc̓% }oꪫ5<\a8k,-oq'M;oIFA&#_\m~)wVx_ N)Cۿdꪫgq|᪫ꪫAۿd^ \n 5xn'_XO?g:w/_r-I\uUW]u qO ~wţwnrۥ_~];1ߚa˼W]uUW]%-7sM~rƓ H>tO?n>wOqݛ媫ꪫ@ۿd^qg|qU^^yś窫ꪫCۿd^n5xW}COc9>x?vȓ C6y/ o ꪫ3Kv/qۏ8Ë߼ßqfhx/w5~-͙ʛ_Mo\uUW]u2̿?؍;N/y />iݪţy¹5/{Üq{yлugꪫ_}oW{^!?\bά6/3.1Ģ/ܳӯ⪫ꪫAۿd/0\X6fEcwko]bom"~xw|\oUW]uUW/+]~wgܽ?Gqn+޴'aU~qΣ?Yꪫ}oW3~G _GO<YN/q?|;e_pVU^ށ\uUW]u̿?sw~{Og9#rlcvuwxi|'~_9/UW]uUW/;?Ӝ~8$^8GKfQ/:? ,uc>ō7pUW]uUáo_2yF6nk^ux5s^aȣxlr/ꪫ}o7Y|//>bgʓٙw8y=Г=p'}?W}%6 ꪫ8Kȭq//Vo[)?jcvXtgǔ_b{K^|ȃ8/UW]uUW;~;/xW />Wq_7pbKOĝ?t'OpkW]uUW]?%0p0c<=ޙʛ=j_z>w\8(0&Sx?Dq[W]8N'\uUWCۿdeyϽcn> >iă`Ÿ±|1b}۾6iꪫ o_2N7\x<<n+߼ ;}>SS[=v?x?6;pUa_Mn/R"ǜ/6ny|9ꪫo_2 ''4マyG]0l퀫~k=NkxGnqi_kv߆b̿=>k@ܴS'sD qk^G>ۛO<@{&nU~wYq"\uUWBۿdv868wn`ӎx55=b_eV/U?_5n<69{8Ů'sބȏU/\aUW]uKI<)wЇyӏx5!fSw%_ W=џn3Vqin\ 7.{3xO*[ǷqUW]_}ow:˿d0q'_p;⷟~zY?<ষ}+O˟]xM/?{Li|U~M>͹ꪫ/;]nymkxoO=஽ W&;sa?\vx˵ܹ7r%n>?}[u#?\*9>/cvz~7sk2呏媫%7xpșW{e^M~Ivin\{F?̺۽pv~oUOdrO<:߀g6 oct~<@Wm{ ۾p~ꪫ/;?y'o.oī>h?c_ݵQg `H~iq7/zo,X = c6vfyNٝK%o-n9s04V`wn?=Yol#W]uU7/`zOyzaמr5z gmKyO*~U?ϝi{c!`^~6']O?eJ7op0$wjOdžO~crUW]u2K_euooO?~E'ŎO?)܍ u3?Oϸ-͵[;.IM:۬Vux; k=tá{N{fƫ>h_x>o?y/\}nywnn7z6:q/7[2?sD̿C<myś7x5=O9?O=~7t#wϒc13~G8/ͱ1^!<̌{&~ oN- w!/wzwMX;ړ` \8 oVW]uUI7/{aZ6ɬ?wx%;@\pߊ>xG]䯉G=vzT W]uUI7/~w.fz<]xnO= Yoqq\1q+pm>Orۼ5s^~iWr _3vęj2}owoݸ'oa!K< ꪫo_2!x3=pn5ѐK"ۤgeo-~{~?zQ\;~}-yz>l6oW;=K+}$ރ?GynO:੷_UCKp%_2sUW] }owӿ9/ۿݫO=xGmsfcwngok/]1μ֫S|w-;oŏ#?\bhzۤ~wn=Iܒ3w??a^1lnrUW]}owz[xGmsfkGk/~īܼmS?qo{~[NsO~5[=váw.yGO*lpbQ'퓆[?v{_߽~r/uݜEsxZG>/R'sUW];x飶lrGf[?j(zvɯ}ˏrK>[^饸ko{< /sxA<=l^yGoqۥnO'\bl0>v]ۏK_?o\k1;\`ZxEǹꪫ7Bۿd'b٣wxŁYKuzcx| oI_a=#_~Xx{U2y?}[>y5´ĺ%7}}^[ť۽{ϊoy0[(׽qx7 7.ෞv ;}?=.!^}\om%~7{6wMA\]yGnsƝCN9> ;`n^pv=a) u[76pߚ?m?|u3~ǒ~6zNJ\X7m7yفz>>w>~ \uUW+o_2Nŋ?CyWN/qK -yGpȉ`ho[֏'gtzH6Ox;#/ o~ yoSDx8#=3%ӏc EÓέgj`{yG+5933vG~_-qϥ5q'7՛*3ꪫ^D̿Ӵ<<ޗiAWvī?xEc3*~)#86 ~G<= U5n~_<.x kxn-/=quݳgq7zwLKn>&=a)ͫ]+~~7~IO;3?O[oK_|˱O=͟ݹ݁7wŝKnxGl O8zwLy/{yMVrjQxp4$?=Vy|!zȓ,ţw_yߤ24~ظFfלAV+ LGGL#rI[xuU)ecAؠlnR $11\"go}Vkלav_눾4-=3CxɎ|/v͌.j`gV'Y֏=_޹[7~~i(ɣ'=7t,s~샷cԀ'g?as}/22Rs8rſkN1;ugoc>}_%ꪫG@ۿdӾ;ygoo?K)ꃷyc՝G}k|o燹pn] 3p/>G{`}YVidves,łZċ]ZWm$Vlw+&ݱn$^s'>{սgџsOgJ[=vgmG *oMK~any⿚mm߉{oį o{?-tǎqUWCۿdryw~/oQٲ ~wmGlςc|7"w?p[}'u2_[S΋=/ϝOoaq5Nl{fݸK_?awo=K#B#XTOg>gTO]݋՚ 'z1 <(ݿչ /^d8םߠGrtx7yMlt#es2çʍo<Ə%om~)tEC6ﳷně>r=a)M/ ?=lݑ&^硛]5^t߿o#OCxҹ5#샷y]ݧ~W{ݗq\voJ{ #5 :{^J᪫o;]˿f:xa Gݽ+f%xqWgfoom~I{=lz䚭O%u[~>떼#9X'O8Mͯ:pO,/RᱯJӗ/_U6`c;\a~5 o7rȯ?xGmq*lSpd;.MHەx6#xn @W[=fS{; omvW>]YylO=wbQxGlq׵}];c}t7JHnG-&׽qocO>nx[Vw~mF^A[y0xګ0_%ỵꪫ[o_2Ab^\X6N, om~ܹ7/_#~Wlmro^8N+j/ ^9E3 }wxg]5~5/?逻'5x:rH~q[3+mstB#6y~!O<~->a4-jv/ݳoYqEo/yݜgō;-o?\.yO|ݬ_d-'('NП: Q ſ+6n@rɅ?K$Kr_y_x5 ~{qa#Ӝ(ғIk~r|?k_ܹn\27,'p-:^xorğܱţwӏc ߸c?}4/wÂ'34pf-Ϯg7~6]\qϯ:OymoOQ¹?# b?Wy{Ѽcw`c?}V WqݸϞO|1;y O7T ˻fu} γ>w2O9Fwl6ec9*秭V# 91sdyq`cя?uzmxꅁ?툷~zrF'~)pvǛ=j\X[O;८*lO? g٬#'27ɵ[~CRy?q4&/~fO?~dgS |Emßq޻&o-nqĬ{t~1gf[5 o.c-~SF*ێx ~<,xq;ʛ?j O?~Ɲ>by=􌗺~ιCNtmG܍ ~.NcWwxSgƏܢN, M<Ԍ{&O8kO9`?Gw{8S~/K{̷lg Gy7ﱿN";;l1o\pNzț?j}!!z_쮓k_ue1)׿PK<㮟(%h)OY3[wj}=gz~i<7|-ޟmñy7ێ؞o{ϊ-ܸS'mn:/Zw. cqzN. oĥUp|Qx{au&uOXpD;ܵ?=qג'xś6xɎRx>wM\_y-ͫܲCNtt8l\UySٝ\<{vd<8`>9;`X a kj_! i.4yO͉ؠ?q^engէ/ii8w81COv÷X'aWej2/uݜylς~1)na'{^a[+#Ucgw,9nީҼ53^M~{ܽ?Гm~i<y͇l7}SQgs~#W=xppgO4׾ӟ<'>ZSGooo;x{;W]uK?[|K8{orjQ'6p゗qܳn;{^BK|~M ʟ~_ݽ`щ~1n48~93O%.,煷y4O@7zc3Cꃷ~[}O=5x֋#x;>/ţcoQg}+n>G-yW&]0Kqגyl C~q`g͋p('3y/{ޭGauܰ]{ּ7ﱿN5xn3O%-z퐮[xߡY<~{;}om䗞te7TQ;G=+fE͋ ?K^ Nm~IlVz6'[;O?ţw瞰G5xnsГw\Xt <̌vΥucෟ~[?fo=qgEcw'36sӱhK߉EÓέyȉyɼj_}>/wUǷڭ<~'߮ö8ӟMoVۿ&&؄}Om.u_ sU 7/`m?CtǏ{ OO>K#;ۿ?\b ?jUxno=WqK_?מr#%ě>ry'~q{oc\8j̛>rӛKfƋ]; @ xGm-3xmqNO%xGo35sN*YOr37~wlv/>iob;lς?s_ܹ omnɉEjp4"1 ?=..*Ŏ116sjQx.̊x[u['=3eo\ӏ`HvNud?x!oN, uג_yGl;O?5o?;.ě>r~ɇ<[fYڭʛ?j눿{uzްwd?㐇~)G7xkfy5'7{抟h/R{?̽l?\z@­gʉ~)ko3yͬϝgt-=YLڸg\/X^ߐ~!!xp|^qqxkfƃ7kox@<̌Wn4 ?l+?{ yNq0$Msf/nUԢ~A;^![]6";=kv/=ǜyo[ꃷz#qi  qϷ|;ZauϽKJtzwxPp:{gʃ;5p"=wl>A|Υ;'B-|π'h5BQvƫ=h_}O83 ŏs84~q{X<|_}w\kf/~ ܵ?3 Ǹ`WremUQ[ʓko $Q[ܳ?1yɞ}>lVQw0O8/VoYk^lAw0?[?gXs/Y=#__V(8g~#u_#ɟa:8`+"es8y v\uK??s={%$㥏;"N۪#r^/w_{O0rx/v͜?sɟ߹com#gSE 1_~<욍.x찚{>S[>f?'>twu ~Ŏ1%_bh-m#qגq;N^yS/ob!yM3?=vt@rG=r/Nq'tȝ?s .r5^>ϭĵs^ ~ 8{8YyGmOK{}r{^9 n4KO<"xp/=ifEcwuwOn?~:=㥯sȱyKO<Ęۼw1!'z^b^јL ?=%b)#vqڭ[>z=aqكwöq7.XG-Yksfk=dggC6x/?csfk=d{G~4nUn;qglςzuגo^![tn4q}Sy><ݳ Cy̙MM[>fc矰=x6C^ oݸa'{~q{xGosfWw-;J٦>xk%{ś6f+^M~ {'6+ӟε:l?ܯpNƥ'~<9G'g<#xr2۽1~ [uC7sϊ>xa<~tƏמr3vGqnX?$V?[u#]5~q{ta?nuo-pd6^l.;ŝK5xls~^ ݪ<|?=f7}!Og:3νk }ZCNt÷9zC3omlV~*lZ/8n\ O²qO{|O=?pOp^>{p?O;\ƯC'q?+,'__~P<pӮAn~+6:Ưi\u$K?}{= ~WKx{}+v慷~6pߚsN, oNIsym^l*sC8U]bl\vfz?h_~>g%ě?jO% y֏9FW`x]#|6S3ޭGz]ӏc\]yGmgw,{V\K3 OF-}f޺prQx ecŎQ~q{_6J[=fk6+ߊ߿x{Ư?c^9:gw,yo O'z6"%MpnNYʛ=j~q{쮓7y67y55[y{&^ ^9;w~+ݴ/>k6 -~)Cx5fί>y{&O{O?A?O_ ~MpK>y{;e~ǩ;o"'Q 3^gYo+,\u K?{g~5gmIMͺ_{[}V}[T6/vLSc om/ Cwvk?dsܰ%o~釼M}+pv >t'pova "vO: M|gDžeʛ?z\ݧ3+cyꅁ]/m{Y}肷y۳ןzSoNoCn>tG C"̛=rsOgJ3^#^롛[5.+;<>=gZtco CNG+xonJo<cN. o~)ܳ?*l8O>n!y݇nS3~)<oMN- ?}VSpfƏo=>.<̌~&Ly:gQSx&sv巟~F|>n|w?ڸϽ[8s}ǜ篸uކQAi)]y`籏@DJv#_/.O~?"f?ӯ*sKn`v'sy&oU~xp8$}\VCţ9(?\*M:5C^9t_{O0Г-~ w8[?v7tO?n\ 7.5[rj2?=f^9xӂ_x>wO(cv8{0O' cuw䑧g8~?xw -5gv=lGۏWeo7mp/>逴yÇoqjQuC6ݧw~om C1<ȣ'qa؞oclvw~ήyn3ttSUrr^'6[}֏q.us^~{=jڃ6xkG}+l33~q{.۳ßܾo\woW۬&ەWqy!x8M;=*CvaFͷ~ۯrq[nb:Z% ߊ'nGoL~|__\ Պn{-(\uտ%?<{r5_ ^9?=5[,jgp,-vϝ{#{[6x~i䗞-:[+%g6+o~i<@W-}_3y?=Z#Nxm7ێ CO{01%ܸS{VmG#O 8u#pEjL~q[7}7~iu?w~oMz箽ixM<~!{ȉ7|&玒{C3 vrO=neFzܼޱ^ܰ1L瞰<|sGpĢom u?Wy~Γ x9/v[wn>sOcl0+ή{V<ԌW~i<ݸn\Ww/ۗ%*l Oν Y <<3g;۾6} ~ {M~ {'VoY25jޠ;<N͋YK,n/gŸ9{ܻ%k)%ڹ# ی5s$(ޜ5R?'|1L3x'V_{~7Y}^%8DqUF gr(zwnn33^!y5 tјeo7mO?qg1gfC6]6~ql{^XO?`v{V+B&²#M~q{ ە76wғɋ_3²qcxꅁ_!<̌W&c&?M obKpv ,xP~qMUJp_޹ COܳ?O8 m^ ^9)r2==a8Qyls4~%ys~ܵ?3 1;G pߚWyGg8H\T#za+f~)3^A~i䗞On>|߹']7}6lޟ;Ecw8({0Əᗟe-3vqq_޵^0+-m}nƷxSS'ptu,~Z^0}@#~/~pQ/{[u7ws_^q߿S{oyo~aHpҟ>A4_#K?} yGnwێx ~q{\X6=oMށ?|!~fL>{Gocw8;O?~-$;xO9cmr4?=f^9x]*lp/<ʛ?j_y> cskNcՋ>wOusz²kO9cXN'<̌We?};8Qx찜O)肷}Bӏgoxkf7*1;ݽkyݑkcyśHkO9M:jOfgşܱ~-j1ErJ~釄M:pv_޽-o?&~ǒ{vf{~@_ě?zsG}!\wyG<C?V?x[(93n_WvL龾7;N S' ?o,7@ۿdneg6 ocܹ?+O>ອʛ?j_~>_Em#l.۞ob;J O㞃|"~q{MIs+ݼFמr[>fwή6/ì} Gd9%#^!zfvf}U}kB&fwgF州vϭxW}O<7?}^/{0?}5n>D߾ glvm^"~q{\X6J[>z>~sG;\w.!qiڭeo;c-K&aՔs0G!>l8O?n=r!FcwxڅG'sqxlrzOclfg^xGosiՐp;7ygϺ%;m{G~)r7,X:!~ůqpWr?j?'xlQF{|~o<=rSX?l?QyW?̽<}ߓ]Oyf籏#^Nr=pxm,+.9MH"s&uk2S6McC?YaKJ{$&QĽ`~Q%~]Hڻ67}ÄP!k5]w|[T W]Yyw/Їp>݋gw,y5Eۿyǝ]syo @W{S<ǟ]zc?=.We[uYůkfylr8?|!!⚭=a{&n9ƏܢޤH.N";\tB6YGj7}7lw]+#NoTQG ~q{\j?|O>?pjQxGo36</?ygCOtsoƝʛ>r' >|dfELi~iX ^xmN7z=hG ?= &-~qJ";;xϯ>y{&^:=ј,:֏9ƩO=76cz`V[?v1>~) #N :86 ~I4/~W&xmskxn~Iu3^ 4O: mj7}6旞t4?tpMoo,ϸy{;ecA|[pׇ>GnO{S!r/?@dv$݉ԍe6-Wϟg}<%$ѝb;ٝK^/{Ü>wO<̜WyO% CNt-.k\U'퓆y&~'BƏcO8O>ĘW}&:pu3!xGl=O0kO9`oc]K^CB0%K6rLf~I NmG=+r7,xSxꅁ|6LIs٫?hYE'~J֏A ˉ?툷x{_xi7ykD<逽umC_}g'$xGlFw~mF}Ungυe+-j펟{>cwg ShL߮öxȵ[{C37xGn◞K]7QOn?%3=?}lVQۜ_N)![/>) ._xWT YrӿyлǨS?o~/Wބ[&I? cC)^=A7#{y;˧{{ܯnl0z6t 7D2p/ Å l?}M *P߯ fT5LvP=n9c?,7[0Z_}oĭ;x ߫?xǞ'p^/wÂ']O?a'{^yҹw*om~{0pV /sę/>c;ltВ_~omSҕgcxHqmo }n4jʢvǒ'X=b_zwě>r\]jcQů>e_=lqa86;ܺ;pNd~O8;pGymq_z>g6+omqcm{߿\Xplţwͧ͛=z_xGymk~,:6agVݧW&#{kg6_'?=gf7'sۥWen?q4&B#69.8{[=fGݬYD7|]_xGymq=a8Qx7;,x+Sc㐿w^/wÂ_~>]ͽ7lw['cw肧\X396~Iܰ瞰:yGos|Qﱻl̊xGmS~}{~W_f ܲnpx_]G#[xg^U)9+7T/ /%G5ԏk$v兑-Y\w-vV淟~ȓ 76{ϊ?]YylsqW=3v~̊xqE ;G~im{?[wGnxGmq/?4tEw8Y;ܽ?]GqxGl3qax7z6|{ qK_y|''ߪSylsCNt]6^ ٬lvn_nU;}VSob;iA{|_һ?s{Fw6zdڷ}T W]/@ۿd}?# E'Ŏq~'sYv/=C샷}c4?=4oO# !xGns8&Cjx6^{V٣so/Zq|QxpN~{̈́M:{ϊ}ޟ'b [=fOK#nU<<fߴ #nx̙/~휿gݰ>-.,[v*pxk<c/ŝKg>%Džexls6}xGnsNW|7}Oo#O'챿Nyzƫ?h_'7 /s~ܽ?qbQxGmsq'ůwgpfah}!c9{8[O;gfus=_}>on:VuwW|elV1<5x{m= ןzMn936ԯ/pӧ5B؎|Ӥ}@OS I@0}[3%}h!_´Oj/2;Is8|m>\jzS]wwxy IuL!+ul=A{ɗMVڻ& A{wGs~xel7LKQ># a {׈k;f+"W]Bo_2N=?#ε:HfǏ.x>c,ﳷj#Yt<~|&g?񀴑 ƃ7UO9dQۼEC7yO>?V١%lvm^[};O?g_1;\XNHyoܽoYpӱ~&C^[xLi{#u[uƃ7p$$~t89/ғo-U“Ʉ}&88]oraz~\X6߮#G{ͧ[}ıygϋ]7m Cꃷ~4~om~:^<ܚf=lꃷ};'`s+޴COttEޭGܺ;r7.xkH]3~ {Lͼcw;/-7N'6/)HL3q &,> .+p(ڛ'Om/s-6ny7[qU/%'ro.g^U9/ݸn\'Ww=l;~.q87yб?=;xlr󱎟zCxs~X7`+Syk~x6'y>&^ ^9]':O=ntEcv8Q˻VGlv{ c~YMە7xC3_gp|QxG;O;>c :͂1ןr›>j_sӱ~%&葛fVQ<~w:^!ܵ7 Oڧ%EcwGZ{&7*?}-9(wۻus~q{s^9CјtEcvgظgfM ;x58l̓ <Ԍ_|{C)=+UsqGymb瞰ϽnI}y 7})-_1}de *ƴiğ ӛ6oo`q_kn\Vh6%~B@}΋S& A\ ~K*L_;5asC/f/B ~0}Ljw|U'5Wt(O>1}|#0_^}b Grg?< }ow:=7[1ݪcv8KLi^/?=/{ s~Iqie_27q~Xqa8(YN:'b̼o#^9^xɞ'xԙ~>SNcsksf<~u*lRy5C33^9?}%~ɇomcrv巟~&fEcw;.Mmcw샿{ş~D xGp86'0?r>nuKB&ʅUschogz~q{쯓>xw,ySn*l043 S' ^)L_( wl>1}x㲋}h%_Ѵi|_|>wOUn८s=aom߮yfcv8Ҕomn4rb^H;F^ C^A_']|1n833~iܹ7xor?Xu>aK'z=lC7 ;n?iFBfʅ/=7{6g6 O>?O=@7|?}:ynO=n!x͇l33.~%xr?}NtEcyꅑG;W :/?y/o%QFo~ypLl?[/67v z?ldf){'GG+>xW&\ӿ`u}foBB|Aq.IBF>&_Z nc+ss g51I^P0~ل_ܔ 7ڻ'L}jE&ڻ'%.LШ?VȓF(͆-b *Ϣ_0~o%`xQhNQ?0}Dm?_;/-ODF>,/&|+O{8j#UW̿ӭłmx艞i%l샷{%?~7*om%pߊk*om~#xn ycKtn ;}?=ov߿\XsǞdo?|ۏWEcwXӏr2MҰnܴwx͇lO=uo>G$xGlq0$g6*O>]om.?{8YxGnKOa㺭ʛ?zh~qXo\Г=UWwx5Mqj!':ܛ'Ҽƃ7ٙ<^xӏ2y7Xުo-~ܺ;7~6'ޟxGl?x?~<=uɯ>e_肷yN(i@\VP~!WOiަ!򑐯t[aOȗ3K WM#AF>&))_3G.B!ӗOtZ>/]6^7lw<5pӂ߽}}^ xv[j`4S<zO=nKAloKGC6w/.n|7?&CUTH5]Q2}̈́lW `#l[ fn\VP;u,O!F/*fzFa=ALȷJ=AF>?w=-l'qlVy͇lp8$?=1gfus;XtO9l;'pǥY6=Ɠίێx|νv*}om9rY=S/[ CNܳ?O<`Jb慴O=Qgs~ϱzy}1~Ǐs#nCnf5VhVĺ 4`㦛-M ~FAE|9[E'~'`F # >P?y1}=/K &|PgAfIBP6i?3+ӧL W'6'+ E`҉|9PB~t}L {~ߊ*G6͒ɢJ8O==l>檫KauϽS?W{@/{Ü3=l!~㩇HM_z>i.{ܸ]'6}oߚo+ܸ/=i.xa9yC3";4*lpjQ'EobؙC|~ͣC_'?XNUnʼz\XpV oĘGy=+^}[XO=q\x`Un८sano\pbQ/l?Wy_z "DjJf{/16.{k7_'?Kz^Crvǥugϱ8qS՟ӧy}E^/>逡t_gv7r~n!_2> Q?67s~Xe ; 1})U\Q| ~-_T`'6{1~E>EϢ# Ff@Bo^Q?YW }LEg6;~8~ߣvx n\u ;?) oFlr oWQʓ^:Scݰ1h߮÷'쳻lC7 xoW^a[87}gy> |cO?nW&/~팧_'`LW[^?''w i~Le|Y~xE .>O(P`|E,olpac+\7Nms~h5g6(? oMU|L2HtVh_ !}H#~-_\hok\/(xڗ5<3ׂI{};ǃ6L_\u ;=[͍o,cm{g_޵~93oު3=r?}.,[=f|w\x\Ogo~ܳ?z~Iܵ7gfK%g6+o~<^/wセ&~̃z*%uגk*o-/6!om;ậщzom%O>?Vg<'ܷ[y7sox@C6yz䥯7opOclF7|69q?)Mrν_oN. zy׊>xwx 1~mmsmAe2~=<ߚ;8W]/Aۿd$] om%O8;py݇nOރ[u#'py1p Ǟ#[?v?sS ^9Cr~o\7.{3ٞopvO8~:=uSۣcwG~î|4g>cxzqeoXp ?=^\Z5#BƏQ<>㐇xoL~q{xs~w83^xm9n ?xf΅e<|v*pߊ߻Yotn#N{Vzqm^1'3xĩ{HsK\;Unϝ{#%ě?j;Fߪs0!'{zO>?p[=v_{w\Xtm{>է#*1;\v$,䫚 A|YO+fMEѕ|d؆D!Oo& w !G| L_`//ς'|O.9+_^4j&?f0sU/KaO=n~]uwݰSyGn[O;٬ţwgs%ě?jxxo3c576ϸ8Ww/yĩ{ts ǜZ)~㩇Ec_zܰbaՔcv( \\&7~>Gcy?{?'{~3٪ғ5ɬurjKO[i߮Iy&^M.~%x-O=nWyGuwWOQ;ܵ?rfa/:-ì~>)v?a) CN÷[y5Ml.+7^ qג͊x;_ݽ gomݪG}+J7{>ѱ3+y~juoΜi›~qA,5`㗍p W$(>1~ {5=_UП׍p ttf>?흓A QֈWLh7MZP~P~@_?cvzf9"8|m\We5^|䪫^D̿Sʽvo3<[>fk_ݽyGlq/=7{6gcm{sOQMW`V~ɼ٣h66:~ {\\6n9ןr>b'x鞟}>7Wqz>떼st<9?=5xۡ 'sN7ۗ+N, o};=oMӏct lvv*v?>\oo?x%5|ۇP>0}݄3W}b h.݇VOH/ngMO}P~e!~=q6;@Gb|)~~!!r7oOoÌ"GTJY ij ʏƯM>-ԯ, t^ft]ѭb ? K'c'quk /+ԛ69|{8nyWgOBUW+o_2G]+ok߱y֏9wӏXtmÝ{C 7.xЉycYVᷟ~F^ } o4O9Ę;Q[?jC7yz Yob;C~qf'_z>&^![o=;&N. o~)s03~I{d›>zyś6ۏxm3c[?vןrS/ ܸӏ肷y۳q޻[>f)<~[=fKOggVxopiXNk~sG]~1fU8c]{znoYg⾃./>i4:ݤ+W|^/w'_O=~/w;֍ǜk~LO㍹ڇpq5/;?oAēDJ 9ny˷gq_fGt'Їp%^ UWo_2˻Ο9nx7a㦛[=V_z>%[>zIs٣Nxś7Ecw{V<욗v#N'Sob;矸GK8(cw8yɼ ^9~q $QܰSێ{V69l߶i^;SO:`Qۼt<=ǘk6+C6mKnvw~k=d_}gomnةK%g6 o;h(oc,}k~Cg>5瞰}x;VYŪ%?=.qM;?nM*-~I~i@7zoW~q{\\65x{>S37~vpC^!ܽ?rj3gݒ rwq#OCsox@<ԌaΓϯyś6/?i;Ÿo 2~WF[?jG_o.a@~S'G[&(\V[&s 4ʯ` ,U%C~em Ap0}ՄYoDJh GB0~OEɕs& @BT2iӈ?3+ށ&/)CmW޻s~Hgo}CW^rcqjNtW];x(׽6hL~iLi,:3glƝ>b>g!xGnshOn_=r˂~>C3om"~q{ꃷ~?=gfC6;ŝKgf}k~C^99cG%87m0yꅁs @ xG .~2/YsomnW om~#^yג'xn3v<csҼ#y. Hì~;/>i;F"1;(ٝKnyGo#>~'sfK\7o[Z瞸OVqgWn%O瞃 -͢ ~.Vcw;Ws~#^7T~{쯓=WeO{ʛ?ju3ch=lsɫ?xG}%m?kO:M淞v%On,x[#`Ô_ʏ/W>#>1Whp(8k@OGfTQ? ` ◃=U _g.}H9:_X?k~GTo&AB>L_7Qllt0M&~Kϫ&ӧ5h*~wrK\o݄Lk;8o.y`籏`uە~%Gp|Qx;O?^kO9䚭>b 5[~C2+â?}..7xGn݁_y{MdǞq~14omۮSy [z?s+߲`=O?nk6 侻nތWy/?i4~^ţwͧrȫܲlomN-*?=;8(c9O>nyoqOʫ?hFσ[:ғIsݸ펿k>t!lyt O?n|6煟{>L s^ 'a!x݇n=Cxn^A3n4[O;-En=[sV ͯ?e|&u^yGos04~)[>fO8~M{͌_|>w\ ᐜXٞ]plmK~q~'~vǒwy^l̫xy̪bO7xwx]aĵst瞰ϔ2'B/)L_`;G=^,L_:Q|]}TeFnTt1~݄f؊7nOp O9 'YTOEF{$~WϮLȷIe 2o*~ES?'aI{ewC*ڇS~H'8WtNL_0?3{r^IjpU7/;~gOymy[so o֍y!>-ŝK|~ů*l O#X/=/,:=F_'aKڭ[jad^`H'svźz뤄xGnsNןrS/ <}&S}>N ^C5{-;'F펿kşqĉEo>퐗a~~瞸OK.۾q%y׊ĵs^Ay5|'d׍u'{Vo ;ܵ?[O; om߮soxGmqM:NoT~{'Z33מ|+n:RﱚEw/Psn (Y`7GV&#+'5o}h~x%Դn`_i'Vtph7[Q?>O*MgISi@sP?‘7lIg|d}XE'V1}݈e[ b_%G-w S'eUWCۿdaƷ~ z o>'_sz&}O' g6 o~ {쭓x6^t4;O9ރz?˝d^ߞS7<~!yiMOoKAN0~ل|d%>]"^L5Q?⇚Sw{ }MhWMI~l[K@嗃%nGXB 34~UAw&(ԏQP~81ӧO@BJȷKo /W4凂Å&|[N5_ P>UW'@ۿd.r/{"z&_޵~/uݜG3gݒ>xr>|{qfO8]7m7[';%u~_|>&;ýk^9ڛxs4?}vW >x;O?䥯_0Dӏ' oC~qQgs#^M~{L lσ_}!O8Ůk~oK%7t٣xف߻]Yyll~q<̌nF~It!=+}pNx ە}?K\Z%{݇n#8(cwȯ?cnܩC{W T/0I{Dw@N2}d a3~tƯmaW;&P?Н0}}C!*f *oʏ3ğ)#V @|Ua 8D㈛W3'Oફo_2N{原Y.Hw5Ĕ~:: cvxܽkwvk>dEmGĵs^AK%|/}^7}7xڅzO97=wϒ'xĩ{c{Nt1;<ށ+lJ[ܾ;Ww/q:n=5/?i ˉ|nU#/wWqF~It!;pn<[?v;.MS1`gc1 OԢQgGyGpȥUnXScom~)ܽ?qWy*?}`щ}1瞰ϔoYgl~{gyobg“CN#6yő_{!<􌗹~[]'/yGos|rm.Kמr==ɜ!DQkM{|MAawN*ߋl=NtSC όGVaf؆~Xdϝ xC*ӗL˘qkyA@0}cg @O8+hx'VE z.+?(K%ӗ6AgE}h ~;Whh%7>AGL̿[i=\:#Zғ9{ؐGr7.iO;=3^}k~#{fk>dG~c3Msf_ܹ/^f枃¹Ɵq5|6!KOK#B#jL<̌מr]{#Mo>›?j!r&#;a'{5w!/v͌x&~>c&omnsoOxcoIYoN, Zad;ŝK|~~/yݜvO)(o6'whf%xnk{͜?Wygcb ςi|3}ⲋ?s^ N%9ל2[=C;j`~ɇf{c㲐xGmsNn;ރ76gυeάGמzÑ7wKS=M~;=lqaِM:ix39xȉ}Ma'{^<ȯ=>x;m~8[>g"_EBgOtUaW5e}T0~rY@~| 6 @lp~n|mw/8{m[>O9oYxԙ9?=nخ6q0$MNn~ { l1;w'6z5/>i;.<&w“x[lFvg1oݪmG=+33^9q|i{V+n9w[3WMHV?4A'` _gw''*zUh&3D|@ ]&|+;k&0)L0O i7݅/]{o$%`u=?σ]76xGls8&Cn9wY />a߸f.μ6ahlt۾[}8o]pV-SůsݻnјC7y}?ݰSy݇n{٢zqqȉE/>q Gn3|sϊ?sq>ǝ]3^9Vf삍.xҹ5woBǥU"=b'p@ 殽u(a=?[wz_|-o>퐻FyUnުz3']O?`g^xncO7T^9C^a8ls^ tn7v̓|#^ 5~)̋xG#r{Fn9sO֏gϹyFG}+Nm1;;ů7ﳻlQgC7soWϛ=zk6+|}uC6'7.h CsfƫܲO>ne`gcw`W|ݪw{WG\UyoqǥYpYM3߼om̓_z]x[6xmG=+zۤ%̪xȉ_{5\?gϋ_;c9+٫qG_ O9ƱK:`|}pP~%(_\ȷIlh-T >}PeFI@z>M3}P?IpK>k9 c F~ Ñ66}bE+Om%:6;&#+KjNw GcǸB̗|ǿ#?{肷~!o#zaƝ>b>g'"1;ltO?D7|6:qpgGK6akY?w]XǛ/ě>rk*?=/z93cO%GSB٣~kO>pL[ʓxosk5۳_?q٣`ʱy! ?=Vyoz-:^K^?}SVFw~Ϯxpf CJ[>f]}l8QyGoO=K#;YxGﰚO?~qcyŁ_}!x{K_?V/;=+%5ě?zO{@W[?vgϔx찻~qī=x_n3cl\7|>#}n:VyGp/>i4=t\i^OiָA=1cD _AF MaP?5pk&W]_ }o`{~78\o7`H%omK6_ܹz!':~Iܵ7x6/>{&^t}-ۼ1Mʓ1F7|> OK#91/8*N. p!r&O8=?=~ }z?\bhĢ6hL~Y}&pWyν߿7y=xGo!y]|W72;uOwΣ zhcBw|~囃#?`|S?Bq0}AÏ4݇vpL_sۏ;z$_%bݿ;sۏx8|'_y>-lͧiF% ^CzaA;^[G<q߸[Ww-yGqVFᗞ Mn9ӏc葉Г=痍w:j}=x̙/~ݜy}o%/}Â~!w\y͇l33|~o<!^qޠ~W'0 ;IFtho[$$/ą` _gOW}6_%ﴺ_`}-{fc3oZ3+ʓxGln3xM3{Wި飶&s>G:#C1=+ us~q{<̌We>nn9vݧ#7xlӏcݒzO8S3#r~eJ7op?qyoS34?}֍GZ=ޟxGmsȟܱ~]|7*=|?=<|UK%o#vqە|\?n)~ŮjF|S. ZT9Yg,uw~93enzǒ'[S;\U'#cwx5/yݜ"'lx5>Əf.-zINK3 ^sK3?G#7ߐp66&~/__c @ '7Wo;~Hoki8ѓDJ~tQr?=^ԏ){'.in2OPx|C0}㈯ՠ~q!a(_[ES5On WOFm<_͙?:%V+nџqM^硛x7T~Li^!kOdžGylWw/ۗl[?f!ii~Iᆝʛ?j>b&ޟxnӏ`Hl{~'7O9f^9(٣w'qƏpLlT|~޳a'{^.~>떼܍ ^9}=n&wO<&omf~)/omn>{qixGnR8{8j`{SyGmqǥkū޲K^7W/<Ԍ{&?=47#wg8(9srl\Uj+5{W&{jo=#NٝK%%ě?jG؞#uy׊Y/~"''?<ߙkmio;~g1b%P'+g4q}fa~G>^ܤȎs'%ta'x.qqP?{&9Q?ohW&q\V~! b +.0~H傞 ~,a9K~AAs7%I%od{~9z3ބq om~٬<?=ͼ n>gJom|~o=[=f~qXM6alǫ=hdom~w8o#~q~*ǸsA{)uwo?bщytO8j`gV6#۪ţwX:yxIyŁY֏=Fۏxm=+hɳC7yqג[/w(!~Ivie=?}^A7vcxlw.;ܸfbhpupbQxnt*3YO^9GCJ~ڭ>|(Iq߸~E̓gʼnEpi3(!1ۜިuwOG;/V.qQ[.~Sz'w1}ل;6 n*a=ϥy;*=s+b ?<˾>[9~'8wf'r{!mB*|p9/lG+A|kIL7Ie_XZ*<;|"g^8` lⷃIʏO+S\u1KhosG{~5;]+nZ3p4/v͌~O=\UyGos/?i4HƏfecQۼxkltz[?r!O0Ó/ ŝK7\q4$V_5[>f{V53u͜u26O;/{Wĵs~q{ #Nölxܰ!u]XO\O=ĘW&/~y!?i_pvoYGո?LNŸ !ԏ7nwL݇ڛ{_75v;O|\| fw=ABS2}pYO)0@d\q#/Lω-Iq|wctO˿<~AH'aG4o ۗއ}3!w^uzL}ovf_y>a݁? ۜ, K\;nS*K]7UnK#C1;̂?sɟ߹cM~\^A ~xa=|C3[}6a#%ě?jg ?h<~&_9Y36o%/u߽;.\frǥUS=/wÂ19Y9&t@7՛:/ uג7|6}M\UyGmO箽>x~qXN%S=c&%B7yɞ~!us~q{7!Q[lOfx6acgX77opr#'pb^xGpy瞰GQ;\]ݧkNmMfS0Ungz?=a'{^![`~8侃Ư>y7}']O?FM/?iLxGOcoH;lO>necVz6;G~uɍ;?{ -$O9Uov:~{ @W[>f'[s{'%;ۼ6*~鉇viڭ>|Uc f]#'7{cc^O0;O?~᎟9>+>͝M~q{}?JWv1h@BBqt |KDp'zWċ4݇Tthho/~!?_8ᮟyocF/~'_Rh"_1}ˆoƟvCjpU7/~w{9ʯ++7v]{#煷~6xے'[3+â?=V x7`/>c^ ^9qגWe}fΙ/=io-߮9w4qu#Hm#mW~{쯓ǞbхxpEgrJ^a[GoGܶ;FA;~Iܺ;PB#؞-3xs~q{_6٬cvo=ǜs45'q7y6&2f嗞ϬomN, rǒk Vcw8X7J fE\\6͂y>)!;/=i4RxS##?F;Z~`(_Q+s\ twߌ{xл#qP(_UbOE _;qw8'ۡGOOS+Wp ϣh/8uol-ӧ5'OH. _'~~w7${?i{c9 +~ ?r~/׾kGpU7/o_7˼[7zcw{V<[(!~ {z&lV~{ ڭϹw 6+?'7y7F8e?~2woҟ:Hߣnlr^|d7Q?2}_\ٿM}sf}T -so6pݛ?_ԨWȗM]VP?6xc7}^o8ʵoGPLE7'Ɲ ;B\u2KEm?5o;u3x=+pvM 2 >|'s>xykgJn>&枃?}>b_y>*^8~>7+m_?ܷc#nfF旞ǜZ_x!xGm=aKdgcwB=+%}6gٝKwznZym^l?}߷ o߮< GG_3{yq[&^!<̌O?n7|oW ~q%nDžegf ~q{ v慷z??0ѽŽ['se_AD0}]6sA'XKϹߎO Oষ~sfgt>0}T#_n;w/1:N@/ ~;I0.۹_+<'^exQ?w&4( ~pc0~ycEc>OɼeO䖷xSÓ &fo1yGl#EWr]oK}"1;=l߉E-MM;/}1g2yGl>aM:~ (cv[7~q{<̌nΘG%}on4qW&/~͌;.=k^!٣z^7']/uݜqA?['p゗qvM7*om~{?jo^~6.qV7z=6-)6nkʔo/ȗ5~NC涳?kހ(L_6^r}@<+mL{׆K_=o[foB$P⮷ $n|7cq kt-F> /`X~~87#Oɼn~W8r/;nf5#^AܴSnn\ 7.ۏWMͅeʭ]/C~C7;s0֏n=K/G}{obyفy{k8dщ~1#|~1gf6h_}w\9(cwh ?K쭓z&f,ۖ<om߮\Z%?=͛T'q۾ko>_Hʷ`[ȩ}OT 9?ΣG }7~eA$n_۸_S 9W]}oz?ϜM筸Dz2x s~[7sfk=dw>C6 T";^A<5O:]k^9:3yg^Mza`9Y+OާwxgM:SxŁN͋cV=a'^>!tvܳoŮnᐼ78Q'36omvfy!cz ~<\':~ QjţwvOK#7}oOx~k6+of~{ö8y ~{3}aCG^ x{ߘ*]GΟy6 7b8;~gyйaS_=Ae|Ue9n<~]h'W]}o?;x~{^'8w؈_}>ixɞy&?}9x7|O7r1/}y7z6R͹}oZƏQOn?gz^ϸ4rbQ'su#coK#?5gGK&²GqbQxn3+o?']xpjQ'pcx,Qqƃh6?}Nusuf]?r~{sG]3# ]v/â٪ %u#I/?c*lR]6Fnߞuݿ+5 ~dEf)~kFLWM7\Οypvỵ^]׍xݧ8+O'<Xx9 }?|qNsŠp0~'⯹ ^?7S ~je ?Kޭ;?Oɼϸ~y; 7q~٨4oWQӎxʅ5nU{'䡧:^ #^ ~/ ym^l?nјC7 |!*Ŷٙ#!xGns˱߿oŃw69wO>Ę+omBO;vn^3p4c8Q{W<ܚ7}<vM:^!8[>f'{W<̌~&!]zO9?3%O9?pjQxGo OQ o.SvA;"~=j٬#'Jvg,`-ùÉ[u8xGoqVǯ?uKQ;ݽ+#李=-K]7UnqV^DYfvvo8?؋_Y}D0}loWޘ7~m6(}?vF >mƽ=ncNrㇼ5׺?#n|7cq į[ ׍z.'%j6w1ZN+y>b7.O{EADqU 7/`uwsͫ"N”&?}f/ oqג[?f!14pfƏwvk>d_Lĵs^AG[;݆wl+w&c>=wqFfEcw8͟y?|_xWi/>ɼţwnw;xobWG\YyGnsǥ=a),x{~ uo9杍UxGpV)+QdG_!6 om~{=jöX7{rV-_|om.56`9&x]6o;GůǷ+޴@y?rq7|&\8K#M{Mo=w%qo<=̌We~={_޽osȖ&u9É~>s^}i*v1}D_9ߛ?3#MB`ډ|l.~şr7yC6 U e:<^ׂeK' ɗ})N5q$׿巠&Gt%_w~/~W⪫o_2Ǹϝ? ߃u 8E';ܵ7O?doc.q8>xr7.{<yGl+}b^G+>?Ϳ6[7]ϋ[27_%r#w0{om~qiů33~ ͼöxĩozK_?o~)[.zCy9 ~<>j }\vVͯ>/ʛ=ru+O9M/rDž'?~67xO澑\X?x8b/ͩoz,zhh\vO.rGT^q~Ljwg/̩Xd"_h-'xS)6mߊg=+o͈_*>-6~;;=._ПzgB!~j7Bm_by2oUpU7/cy&PG3coxGo36'S;lO=ne+V~c5!g6 oyg |xC~/'yoV<~469SxGx5;J7/s4&/゗qSS1!'zܳ'чxK=ߣ=)<wq-Rf=ݧVՊ*:D XܒS;m}7奯=v~&?{oM~[=fG~cQd|~qC)DqP-r/{+Kx7x>c3}v/ßݱgVf9}>]3+]5_eQҴzӿ{[\wDA2}j*wU7b(._r~iWeFqrYBB~0}@c՞=koK]?ˌ.sU_X.On_`[8A/{~` {AB</h\Yq+? 7P\u K湸5f';14!>bdxGnsVt]{#B#j&sN?q.x;D~a5} ;Oq]aç=?d_Wq-'z~{÷8w8'w,a=qe㑧gC7/?逴9Qxp8&?=[>zG[uSO<5^|swד9 yzO?<̜ @d^so/j/o9k}{9ï>y7y6ޟx[6XO=nE'Ŏ14 OMάpȯ?q5p/ q6ǷxW~= n;)ޒ^q}͟>aQ7{7֝XN $1ܹ7wq>x05sOcM_~>L̊x3_] oFlr ?&뙾Ae ķ.N+Gpk?ti,ǂo)5?a'qo /{gũr|Lacn| 704r'~/ԯ+ 11/,Ӹ/8v-7ٛ( pk}oyGc^ᑼ}ޟx7xԙz>Nyҹ5{[686/<5?[=vOO?g\j{gw.yꅁmV˼;y/^3'aqA_ןrEï>y{&߮KOgJo"O=nuzk7 |^yUswзwQW̿ƴ<"VN2\m?7f\j۾{ ǞJlpK om ?=^ rag0Ox~K~ompߚǟxngwwq&Jx6w-VG?$}O[_M~{Dwxc}n4omjo?<ۼ[5/9xڭ?E+?y7oş);9Np%^հ?l=\گ @FP?7N~*Ə◟|F*lbsWq:]0s[]ߐ_uɫ?h"O? omMK^'|g~'72;u'|c3%ě=rNY-ە|!O>?o6:SފgЏub=Wz5M_r[Ãۘw}](sP?ȭ~awSx_iO_Mn~Ƿe-X|I 1}̈́w@+_a.|ǶXp=:gCg^5Kr~/ /rk&y{ϊsɣNxnr/?jO q/k9“ Unc?=9(^gw.M:%~x|ŧz'>3U^[?q4&;_s􍉾|L_3v;'#;_~<]3f9y3xAV3^ڣp_G<aCOYMIW[>f;v%{ xno=ymmO~hM4^ï>G/K8j.1Unn9&uƷyK5t_?y^MZ3~Y +i^{~/NS9xYN_b!p_ DA|}X;?2oJ'Ԏ?4r^I?8{|@q$Wܗڞ ^7@ۿd1e>莻8/7?qxSz% @ xG S£ūje^ߌ;1t<yAv8{WNԋ5o-vW?x<=oZ3ctMͭG~)\UxGlkn>3c̣OTGīGc)V/p.7ĵv]b E O:ŃwG]+N. o~i˿ƭμƫ-g~ng;Ʒzs^oz~q{,'xGͯ>e]Uyp/=i4tuɹƢ=?#_<\_ rعy̫w ~"(?иOgƵl>k?G#pɍGoLigC* g?7 _8/s;VџwzGWh0}:*ëN+mx;~ga>_ObЫ,(u߸O 7=Il>}媫 7/g~S -ދ溭O=ny';t!~w8q{c&O=?: sm_,}暝o~ {_6^'Y?σx!z<|t<~K6fwٚomxnz~{ 5M7[s k^5(f ^9?=gK]?nXk~tEcw{Wa ~I5j9/s͝??x,'ftNԏ-8r.}ſk,8- oxp@;8G;8'>xU}oln~᎟Y>nO>n%og=]߸ອv[=јX1;̫{VmK">tAdvhv(`H/("{?eֿY˃4Gw< aoo[KM70Z_K~i_&.Q(`7X~_;v y~n{㷘;Ŵ:@(ނx93g8FeRI=nnQlɜzbsUN 0=~We7'}ֻO<[>f3?㈿kqj0ϛ>jkS÷r<{Å]7SS[ϝ_nİ?̖ަlٌ͈`9z=J+<!؃B"_Ҵםh5S0g (|=W] }odwZl+sۥ7}67<ܚ|!~z瞰ǫ޲Ʌ?c+ݼ!'z~# suJlKj~"'|w<+}4lV4{ϭޏ2׿#x?S|ŗc[xnNcw/y{Bᐜ٬#8ړ{l~w#~wXyFޝk9Ώbkş߹cvf;O?gׄ?r[u]+#_籏 - GKkq[WyEKq/*7ȱx1fOFmoSvѭ7ixo!6oE$1s!$<| 7-xkғHl~om~;xԻ=mђ~h|+<8J7opiܵ7w-y-mG=+$xm3n'沇y݇nc˜Eu©~T W]uU7/Ӿyл>yoa<~sG!xGnsF[o~w8N/y?;a~jEɪ7nOpHN, om?=5N, oxn<㈛uC6Q~aVgҟ/c7~N+G@|fOnU^ay5z8~{kڷOFn4׽[pa:{;g%ok&f[>fk_ܹɣ̸`瞰ϔʛ?j?͟m;'x檫%~u瓿}O;iZ٤;xO;Q_ݽ g׼C86~=r;/ŭC;)o 瞰޺q|QxGoC|~ }c\XN9;ܵ7pl^'36#?r'c8g<{~x{+us=̌xܽ\3^LN~{0 2/Ƈ_iIO-wx[{6vۿwG s^ Gh ob;t!~<@<^unozUW]u!KS9|ӹfc,o^o[w-K_?'z~Iţ{W<[>z_\wXk6+o$ '7{6?O]Q-W'ٿ[P>cߖ_y/~>'cÃ#7?==xCn4oM3{׽,q7śpa\uUWAۿ;W~)~!'z^ ~{C6]&v7}kO?`v?kr5_c/^m1LtOz2Do[f!fsO*x5s~.滾Gq)ɭ~c9v*xGm矸Olt۾[}'w,#ȁ/od^ӯwݿ+v;7kʯصs~w\;Ey5B#7vKO<Éţw~oį}ˏʯ2ż?}$Vᮽ?{ؿn~av4/Dbocwظfc5Ǟ7oӏcwxmًcʯ>y{&uzk>x~[}7.ػpow|;]o׸mޒu^AܸSn&$[\k~ܰ~Mnyw?q.'vx}{g{Yob?ܷn;~x?Ogwx n4 O㎟-_n↷}k-ꪫ o_vo?<=ޕ{zv_xkx[6~SǺy&7+?{<{2~w5X7󢚖G#?Eu|ǽ#g\Z7֓9aM/>i'^9<=gxGns+^>.rq+ ?#Eg^rGwݑ=L+޴O=nugfqiO;\>S-6]]?ScǸ=bՔHCWkUW]ue򮻸^ [\Z%o[>z_}oW^?y7~%wS's^wWsɿV[W~lnx7E6I+N. omlx⹁?N͋c5%?}vf۽r۽5Ox"}^]߄k6+}..o׸^͇>mt۾ܰfO% {Vw8GaoÃP5pߊGyokO9jzg6 vq`gVxp4?gy׾sM#?͋p>6ꪫO+йhI*lpl^֏/ZRBC6skN. oqiןrHHcOF)~i[%oi7~19߿y :qo<|;sx;ƙz?ܷŸ9{?m/.c߅?٭ ~Sy{t1x5{ Ym_l瞰Ͻ{msqs^SO)9_;ޟ9xm5+T#r{݇n3%~璭>x0'VoeOOG~y<QW]uUIg~y_ ׼k/~f=7x&L?xoWw/;,j6/C16 7..^Ǿ8q߃_xiָ~"xxK]}F7|&9O=^/w'[O; w~o8sIru_2<{~So omVS[O;/mEkO9iF=pӂ=?_ ~wl?I q]7G?sw]SB\U'csK]7Un݁_~[}f/soa'{oOG+p/*[Ǐq^檫?O_&o?Ǽ?m~{܍ O8;&݁_{!FDže>bo?C^_~1f#՚;g(fo«O8v/>_'=G;[;G'ٵyws^M~q{ #Nö_'?JK K_?oݑ_;'kn'6YasGw{'^;5瞰ϔUn८wgqYobxuK8bo<'쳻jOs/' 3nsq؞ob;%ﱚx[}7ێx n۝'ﳼ,w!n4׿ś0;u`?#&Cμګp˱xw ~qX楮*l8]٠%ܵ7'׽[auϽ?5yz*8(cpě>jw:~ܵ7om;O9`_`ߖI3(ă8(GǜZG~)\7}`~~GeH-מr/d˿׿~Scvp~9+O:ĘGྃ?q._sޙg?{oMf\uUWB%qw͇>G<76O8IlrMݻo;!':^ %/M>k_<,{{qe^Stǐ}!/wWq?㐿w E=Nm[E|w?aA7}C$O>{y죹^vvǛ?zsG}>SC6xK)O_ ]_W{מr/O֎? ^{7lWFOјjӏclQgC6jX7x/~}:'Mp7ٛ\uUWA_]쳿voEάVf}n4rrQxpǥ_{lt۽{ϊnΏSxO"ɽ+14>\گ۾WqjQѿ5[7}O<;O?`Qۼ1?񀓋›?z_{O=?p<˻o>smF]ӿ_%׾@;m_lz說 7.'s?SL|w.opt˼or, 7n$'y!'z[?= ەyү5]8zJpUW]}|Al[=fYn=[m_CMEKfW~6?Y^ކWzqi_gGK!?}6{fAێn<|{Ww;vۏ <=ߍ";k3coոCO#6ݧk/_ZoJ^;.orOKwŇ'nՔ^[~ɇ47TQ;KOK#8{|0\w3O8pH;-?xkO9^>3w!y?4q0$۳-CLk>磿Վ;/y?sɽQn~߀<aK_?ge~۳mÝ{C~۹wFÅ]n䡏yooŔ◞omNn?=.xGlsiE-f}k<l>o=Cɗ{Y'ꪫ7@ww>rlߢH“ii^|Y ~ܺ;qc?~wyW}q^ߐ_y>/sÂ~=a'^ ٬̂~wMl[>f>'G?Ξ喇^ϻ}ЛO[qa>{ _vxGl OÉͫxp8$ʛ?z_Nfl>A|_}^_ /~͜Wy>n[=ffpurjQxGz߷&$^a}ï>b}?K&F巟~ή 7}+2oZ6?{nyפxM ~ܺ;p˱WCK|noYى|1gW|#lgxn[] U_~WWr]{#xGo36'36sbQxpzİ? \}e;Q⶟yM9y?/=i{&6;6/v.'qǥ76*~C55>b[u1]o-4CZS7{6y犿ov慗uy?~wy#ofzoDC!'z4 Oܧ+/yo=[f>ǟ]s~+߼?ܷn=`}wo*ycꪫo՟if_;5cx5CN. o~Iܵ?>;W|׷±pӹ[56nykg7['?K&o-n's57~ڛ5yȂٿbp&ދ8xyw~Ƌ=<\ f';ܵ7XbuoM5vǒm[=f|E~+{~n˼^y7x53]yGl=C5%M͍;CxnN- ob;<<c^ïs˻eફ_o~޹k*}lu#Oܽ?sO# 5[?vݻqgQ_?oJ`Eqt l:Λ?z;.MGZ;z;~#?uZ9VȏqMy{,BSsoůn;oY7z6Sx5+!vpͧ`sK]7o\sğ|s^/\uUW '{/ΟX7S^[tcj÷'sWywo<;~W|ȃ_9 c?Ŵ|;r{&MNm~I ;7yt;~/~팗vݱo^skpߊwy\Z'?=ff4-˼kp%_.H2~7r6;[}֏r◟t@˶-}l8cr7yW8 gowυ?3JaܺwzcKöxɞ?{C6UkO9 e9WmFv'^uꪫ{X<nzWM_Crvǯ>y{&^/{ÜK\Z%p^;aucݿ<ԝ՚/RW~~O]ύo<6Hzoؽ{0:Gſ{.H~o ?}fg[i.{/wÂsG>է쳿Nn9矸ϽMNo~ t3G1\1s^ǜ/]b9Y-}\vӱʫ >㾁-p[^~ѱtvx}٬풆vƫ?hgyynSeԢfw~ȭ#7ؼI=S\uUW OirO}e=[azW&3NoT1jJlVQ[ʓ{~ yz/O \z5sλx|f/J\X6/ om?{!':^a[&sǥ{!-a{cvrۥ~K^7gi'ϰGuO ŋ<=ޕ[l& >xpO'e'z_c?{u7[?S=_O1#KLˁ:^Kz@FC3 Ǽ=?˼,;~W]uUKX}2;u/R?<\ZPpߊkŵ[7}6Cnk>xӛ{ؾ/3V37y6O0O?xoqrX_U1_'so:nz۷u_^9~?s oCSuw`Q76LqM <ǝ]s&/N5r̯a݁Eo=[lot~\>{G'sϊ 8r_ዝa7yҹ5آ'퓆u#XO~lv-sɛh媫E<_-1y:/rJ~/16M5[ztp3yw}=#޻=ncƧ}{F7{66 ?}55xllSF-M_~_߽,orq׺~.PCcvpn=~۳߻]q[<=߅!du}̯~+ݼgyG3 y6O8;p~ٸg#NޭG}+ꪫ7/6O~ ⯘x[mqK^7xO]w.S0S[Gw x7஽Wq_7 yomO9961Xt/Zwr7.oQμ˲F-nW{G;㮻wiΆǶ:bce J kf]@ $6{xn͔~!v/ï>yK~B@%M;g\uUW+o_2یO읽@9ċcy݇m OQqo>o$cgrɉ{v$qUW a:\1^0[n v/p~̣8ꯆJpUF>wsԭMyA\uUoo_2{78N+CS= ~Oq?\foJg\uwq챏a8 LĸG$׿pUWɼ'8/DZ{,;(cwg/?}"үqQW]IpBE<=h>1^ !_학_-\:$7/Ÿ/y{usE ,ӏx왎ŝKy7GW]?s.re^/QGR3ֿu~q/qoF 8 /UW]%B?txă](o۪vi䗟t@N/y߷槿Gx82/UWO7rOH< > 5ڛ'L}hŏ4įpU_;g9ʯUW]%-7sM~rƓ H>tO?n>wOqݛ媫'gOy:g^5(?Oڻ6o㷌dmxp/"73;s4Kx^啸^WyOmG<y݇ncުQC|i/17Ps!' fËo;I^!<~ٙ3Vo$nɟ__` @LPW1O>pťG?/?wx[ꪫOAۿd^gqxw{c^ Gݽ+^/q팡=̈́[>f/~ϸ _=l_ ]{c!нgE'#l O/`摳ƳqБk굹ꪫOAۿd^9}?[ϛ>{>isbQx'8{׽rU-ﺛ~ }Sfy=@P~0򓁾<],o[^[f\uU'o_2/}g'~k^y#yM|9^'w, ߂O_ "*72ZⷃUō|L{^M.rOk^*W]u~̿?؍;N/y />iݪţy¹5/{Üq{yлug`sl-7t Ma~'T\E 믽 { 6_A\uUo_2 {K>Kٙvxőy!ƜXv{5p_/R\uϹE]mrK%_fP5y!NԏrG<zM߁r窫_ }oWpk<~ǾØʫsa٘֏߿u1BccF}tOs[W]ɹv|ݱnz,詢~a+(/_s_4=ꃸ_5K_Ÿx{;f?us^?{o~[~{t\u~dqoF=I@B` ? };~g3ojl=\uUko_2Jx׽(~= %8qg׼ *K;pqߤV?E[8~q_O? g/h+$ܧ?Şԯގફ_ }o7g;|O~ ,Gs7zC3C̓z/o2^Ÿmo~wѾnuphhoį]<}#Ǐ\&oUW]%o,Oskx8HtU'g4|ql}#ꪫAۿd lom?[._q>}W]ms 9 7qb zp&}r^Z䪫_}o7Y|//>bgʓٙw8y=Г=p'}?W}%6 ítܞk?)<\q/,?鴗zG'3^xe7/#ݿk[!oRB_ҪVaщySw|%/y~Oc!K8W]=N7/o/#_%ݧ 7.xf]6^ANl~;~ yફ9|3Psnfq Ǘa 'WtnSp۹~ w|UW]%0p0c<=ޙʛ=j_z>w\8(0&Sx?Dq[W]8N'OaWXy[׼kqeӆgTjɥ?zCsǏ]U7/;gYs/{7=1]+onܩG}+wǏ$Vpۿ5W]/v/qw~1N]vx3~)zwCB/qP_Waǹ檫^}g9ʴoF'Or)K1{Ox//c5gS=-t{9m?ȃ-gOb::`xwy3r(/Ƀݘ}`NpYBO_ n)oSgUW=?ſކI/;]O*laCW_8N1c-S6M<]߉z.ɟ({.;k~1vqnksg~_|⮯EZ?p52W]rW~3>>vnz뷄9WBۿdn yy?C=!Wyv*?}4z#~lnywફ~''^8/E9+_m//rOtߏ.ݟ9zLaVrI VP?2Og^y죹aΟfOqkDw}/xuxǗR̿ë=h{_>û7~}^Q7r4}6 O1" W]Վs[7x]fgN0_8?`{#n~Ϸ(ďC  s :+/8t[\u3~řz $P?SǸ-߀M7pKh^9w˸K+֯H~ {{0Vf+?\`Hɟ77vUMGGs5'^嵈Y@H#nү5oD>h<۳u'.> iڸ_Za@.?S\o$1{Ʒz T=UtZ7;.oOtW@ۿdvi o\&BƏ榝=a'J_e6jU8r<iބ}B6v۾Gx;~sj;`eA #\e\ZcU>v_[ǹlW0~U~Ap-N+s Kicsg/f-~M{Mo?'[SC#U&`үJ\m_=o?iM^욞{>wMq}WA/Org߅n0KA|@P߷߇H;K?uo,nӡo_2N7M O͇?>~+ݼw~ή 7}6?֟/ʯU]"wןK#/wWq޻q߸WY^ނ?i.8of,nŠ~E!_L_;q%7&ӟp/͇< w{b@FP0|BJh9'-So_2N ;+a'{^[x!^`= ~~g<oU?}] #>3ea)̓o5#9Ӭ;~Xx7ӗM @^P!'[9֋=if!}-OE ?į ~v@s'~3C?o_2N/۸u^G?^Sko\`h&x;7r-w\Ǹ{'y|sO߷com4?J o.-'^ZLyc-<1Nr_|DOGVX@i9[~]q4[툾?._rO-_w-4Q?;i޷$o`?u_>K`;1r^fƫ>h_~>]x]_yO8x@').{k'zw~/'^%˿Wz-v!L K^Q0~&Q?'O? #Ôw~{؃*66'WO)|=PrxmoKO;?y'o.oī>h?c_ݵQg `H~iq7/zo,X = c6vfyNٝK%o-n9s04V`wn?=Yol#Vnͩw +q1}ՄO~헹]ޑǹmޒ2q};ΟNp_y` ?Ҕ W&#A,_/<~!/sWy!kodV_~>6{Uf'~qn~[|Cx 1 v~@̸w~/X6!߂_ /SE&@3*#IdO+'^%?%p/2펷з̢obݧ k^:||;gyWe~u\mg\o@ ڭF~Icom}+rCO]|E>&~W_7-s{JrG{(^6<~G>"tT$oq.+_S(?U9tоa[GnyP̿g~cם6쯓k6+Mz:x ~~'IKr}Oz gߑAuK^硛<} g}Vn;_z,_ 6 7lG{w}}`!-io\o6Zs]OW5Z<qJ{}h@ Ptg~~e ?1?"?a›\;[Cwp7{:xGnsğq#NC7'q/*!_%8/Fd)O_-rwK',~"(?L8؃ϻ?k>QWuϯOy70;sم`Ɖ|a+\k'|tQiM%A_4q8}˱}~9/)7Aۿdlnμo*Sii"Qۜ٬_tٛK~3s16]K%ꃷ{c *pNL_?39|`u^vh䋣R$z̿]?K{1+>j-;~o/n ­gڷ(7䣹^&/2öo<퐷x6]y<Ԍ}%cyő?s^ %O8o=ϥ~~Wdym|K$#}vM}prYBnO{k2ݥm͟aޝU7-ヌ;xл#c/~!_[t"_ʐP?L@q^Epճo_2Ng{x{;o-;wxpӂ~%)o.C3^硛ŝKo]9iO>;|8H]l_=VǃO=K*~i3~e; g'.=?[W^nz7^U7%O7{c7@jP0}j#_/__3t2|}'r_t{7oYqM>f7x=Гr&?=^a瞰ǥU"?|WOtܳ\f殽'_e#N_s^ w=ՆGlpYRx"_h?yƷër魟JSn+<[}AB{kHA)ja C{5>QP3>oO&/mOD gOk'1/Y͜?`8M*7/[o_ >gūܲX2>v?㈗~vi`ƺ?%ݿ[p!zoWq=?}ς7}}=xܰsOgJpV?ܷo[d̟߱͟ޱ)ּM spvෞbOCv=_Myп_G{F{O.,oW9/ѭsÛ1Wu_Pޥ>  w5|/$ʧUcxL>/*wJ5 5)"~0EkCO3 ;|3?p׿ٛ}s̿p"w{oUKGCKQ;ܵ7rb#ۖcwoY.G?o?5[?f!d^.Q$1;3ycxX7prQxskGڃ6؞C;<슿wcxlݑ_y>WOvǒu#9{8sOgJj׊y)ؘ,?sxjoEJikABA2}j [n,oU7=?o"a't;ǚtU]h_ԏ(a0}q~Ve F_X0'|d@&~~_{x \:$Bۿd}?̃]c,GS=:3`h_{!/{Ü^3yWy,;|8O>?ibu};˴ttmSJP]GtIڢnoR7vO\og~i끛mka96~Gc;ܺ;Ꮍs oM~ ;WV}!<=e3O5j2CN- oj2/uݜ{o)y7_5x|~I{0_ay]ڜ>o"it>v?dof|_#Kj~Q/P V+n!vΉIz,~t3F6 ГDJ S>o+˘&|wc|ՄxiO r9r/W|9Bۿd}?Ngf7YwG~a΢_}]6A?K쯓v:᛬Fsۥ__5>o_O}5.Jo.wD;*oCBBm0|ꊧ=oF]lo1α>Er[ㅉ,6(9]n߶Cym-(\o's/;!tUio%ZO(a`_+q^0k *'ڧ4|Wm{ ٌ_`ğ)f$_#_Y&fuϽB\ZcC̿txĭoc}o-4!O>?pf7z3vG9v|̋b?`OfO`c]sB[/21-h%mY `uDWgucIY,txp"Ë>VG[_sٵgX\k#Ӵ< μ';~q{536מr=hYWOg[?yo@[Frj&旟ǃNܸ OGz6۳gecŎQxnq׾?oKyo7z}ע ~&_]hm?eoqn|7(4t6"ޠLsAs-|i kz +ڥ%Y&(f=ן;ySΜFrտ_'8ʯ#t\ȇCƳ4><ڧ5MG*'%~UȷNG +Vtӧ7A~(? Om~\onKə<[w^>x;_y߷{{~ x{u09x~zØ_s g9euFf'NP67) bA],Eص |>z5VKhf[qqqnnOr'y0?y*gY{˻a}̯ōױ̭q"m^A[܍s~Ilvc3%=?}4cyv@^a[O;`1;96+<?}L[ܸ O箽xlsVqgnkvNq~-+] ׼kp_ZIS%ѿG!_L@X~+nx7g =._qL|-71?s3̟ts紷H4+VoZ~e>b:8d?`ߧ]_dd!S'_s٩k]wߟ&^h۸nџwx['_Xa4g60/-}> NW ' n'Th%Q|chGVd1}Z#_7(?o._:73s;qkVoAۿdryw~/oQٲ ~wmGlςc|7"w?p[}'u2_[S΋=/ϝOoaq5Nl{fݸK_?awo=K#B#XTOg>gTO]݋՚ 'r{~Gҟi$}La_ܯr?`ܯ~e= ~W4߰e']`?G(i=MR_sIoKB=׾PW4yA}%MI`P0}B#4]~\}pԏ+@'0}U#i׃ @(_TM}T[b _ggsষ}+m@ۿdk*^![i~ɇz?^Y/vg_޵iO#ċsgCG[; ";xn/yݜWi`w}'_E\GzVw=L{/˗['K>4G4.}xb>q?Tf4 _2>3)_hK%GUOk&Vey<ǜcػJa~͵,v5ΜnlS}<߁W)?L_?Px~l>8{6{' V4Lڇ`|YP~4(Rhho߈i|@DЂR_=⛸|ga}9ng[6oI9a̿ſk# ޜƏfV>~) ܲ-:~8:wWxo'8w0-W?`}g^X{w&6Xf]fEcw=j.{k ~)yim^lέ[xx?=;ꃷ}6qݻ`V{wߊ{{fƣwX;y /"6oqodY\=*f=댗.q!7=Ǹ'o^q&旟ÆM٪?\b9!^!\Un=bukQʓpa'{[ŝK%lV1;<}wo<f%xnspⷞv1#3eЇr_J8|Fl} L_ğ *6ڻ$ߋyZS&_>r{YsK'u!N?qngEӟ}~Wcg0U/c__]B>L_ؠ.c*5-U|uS0}X#.Нލ|@iqP:QcklG? }orogNp=²pbQxGoO=ν xnek~w8/wpU^W{R)y>NC0澃K]?xS= ~Iܽ?11CSgݒYm_l'ێ Ƀy5{lq|.~ lQ{sϊ-xWwx=+nhi~r,xSfu"=l?A9q f'N?JL._q̯"֖K._'q%_/2[?fY3'zNnT~icW<a8矸]{ ~j4om'6B7'us^ %~ ӿăn1wh?)ۿ˩|Nr&5l, #8-;~g^P-0A75կ/į[&+Oğ B2~a S UE_O}\ Bԯ,c )|MR~oLxXG{$/kO.j+.7NGeuǽNG#;Cw'ӟ8Fs0N̯R0sguozlLWK &F_3V`&hv7k%;mڨ^wHh\v$+ ] 흒|~k ` ?I~ZeKT.=I_˼_? }orw' NɛprQxGw=l[׹WK,l|3GƉ}ċ7yݽ+5/w;9yȉ_xX?l_zLC6yz%.y'as+޴K_?7zS.+ܴůcw!ͥu{r-Fn>qa#Ӝ(ғIk&W3B>ԴK;7]/wK'% *'Lğ L+n{8{W~%NK%d}?Σ5\1;ܳ?+O>~r|?k_ܹn\27,'p-:^xorğܱţwӏc ߸c?}4/wÂ'34pf-Ϯg7~6]\qϯ:OymoOQ?}{[moFk2_(PnS0s4kn|71?Ư BOLLW;? t(j&A |@P?AOZ|сa*3M_>Q?Ciolpܯ~mA0e+sDB{$)}X fc*6{s ѝ8N8t;;ԭ eEՖ+Y?{Xu7ml,8/˱<Aѕ|Y>q?%%E1}Y÷+L_ }\%_-iįٍ?L?A*hO!t[7#?+4e{}dsK"~G_1Q%/ȗ5 .}pAʙzMvHBۿd5ΣcxGmO>nGZǝ{]WrbQY9YxGlkzǔ7xr44'7{640+^~']jѧgl\UyGo'w,{V!'z[}+Ggz^?{ nZpfe̙_߽楯ӏhL٬#ۏx7'?N( 0v(S'yW&/~팧^ێx[O;'gltWr 7lw٣yʅ5C^9rpv=r_z>/sÜo?!^\Uq0$/uݜnOGcxkXM`{cwuww~^!E]+Q?\֟e6<ނ'_6Ndvq`z.]~l _T GOȗ3StZɗMl .+?O|KL_'McB F k(_Q've'` ?/~9_^`Ì_Y([ϩi`WOFt^ipO+ciyDE¥y:Yβ>A$NPOrŰ˴tptpHuwH [SW#5ǰa4V`Ok\qu~ILKՅ` 'eo#0(_L_ܨ_Z@0~s ~qAo`۰+> gM\'qIR'Teo0k'N~t%$?׾kbK?ݿjN]6N, o#5!xGnqv<~'fE݋93gުq|^xP$vq<4o#r~@7z&VvcxlO>Gg>oşݹ~oWQ;\X6~{47TlQgs6rn;n\sOgwXtm{k87z=7~EpbQ'phf6yŁ_{!/>?{Y{Y_c`q֋-us9Sc<:"Kj`c:80skxxNp kٸff]$K]7UnQϛ=j']1*?4|6>i33^!K%[g@kQ?oNt*5̹L$͓` zj/V}R=` fI[ff,Oiم& ~$Q>ILIĎ+'|)X;$Oĭb ?0B|ل3U>e~SPa '*4 x|`" v.^deDޢ$ڜč6L gҖKu"_0B|iߊy.)įO'W4 BA|}sYB7_˔//L_5CJN2}z'UX޿̫^_Ӹ{{~m_l{&~Cxz!O< EKsvo<'5xpl=+#g[=fg޳~r7T~Iu#˻Kocܽ?q[=v~.qi_;ޭa'{^!8lMú%l.{/}_yo-g';=ٿm?(͵o'Oi:8)N+pm 0}J~'P?†>qYB̂/on3 C LpaHb #OvA'T ' P`z_5޻oO{P?{ ZhW3'` ϡ~Y!~?r3K jk 0`|cAu#&4t>2~z/i 7.x=+#yeoX ğ߹הom߮G+xK#C33^A?\²q|^xK}xGn16O=>x|~`Qymn8q[SǞ7.z/X;\<` M:G=+^':Oe>5n)F B7ٞ?}f߮ö'q3x6BX ەgͫ?xydQz6?\borS ţwxn'tk=d[/<욷}mB'\KG~_{=^ȣ#&YDv|ЃXs7_|soWo||S!^_5Ae廃C&XEB|k> H~B!n Ư y/_^Г|}hv!&>Q?-fƳ$tTџ.I 44CA@a ?2Z& Bb c +onm1|?|~B! oq.DJF>ĨS,y >L BZ~7T4~H>8+& `c+O6Q'fCABF{CBq0~o0 }R%HW~2_OhO+Oja~h0}󈯇s+}j}xeRBl|#׼kR_}ovOݿnyl2/x53~/n'g7/>i_|fVK^a[z=a{&߮٣k◟?rރWy}CrzVn;qg\UyGms/=nܩ# k27,x艞}c36 o~܍ vWvț?jk*?=;~g>˿O7ۢZro'(?UiU- @TP0~O~VaFa ~dw#~5cM{C~WL_c 33}i#~1(?&4c zW1N` R-(?Xhok*$1}$g/k&~?__|m `5io0B 3}N~lA~ ~Fz:HUE` ?tެ?Lݨ_]7K['~h'!,(Yh_ȗJ.3,x4i )W t7L%>2_̔ϯL_24AB{}\~sA?L_5GT3}fqY~P)>}Naz$_#P /˛}Ai0~D&݁Z_2q%N+ҟS{7t_hLj76S37T.}0'/8YyGlqfKv/,;ŝKB&fщ{떜X;&GkO9+άSm^c~c3~1천 yڟX>~u33^?=`1;mGV͋;(cvXO=nuKݪvWQg ~qXN`1;3yȉZ7rī?xfo?']srQxGkO9+noi92/űWxy%w/S3/p˱1?6G5~ЭB{+>S5/>{AB|0}D()a/m謨QIOo P?f ^P0~Oٕ|dF(RԏL&$Q?0~fMxQ?D]ޯ%|X>|IAwe 3 ~ys=Q |ݤ|wP0}b#$Zԏ.Mhވ n D=UtU>oܯ|wl>1r9o+о$ e+L'A_:AA~sU=UL_q~VeUE:)_Q(?jwN5:# ~3}Z#~>(?Ufmsoչ{G\6oL8Zo'8ſku ~煟z fkK#ö~̊x0ďC1gfsoA;^!_'B÷؞3:xs~w8 <|Yp|^hN.57z}cܽ?rfӏgÍ;w<7qgrJ5xnsqlgOK&Ɲ_|w\!_?{\Z%=nM1_|>xnOgwWVoYqz~)#q#x!o#^q'_#=lێ{V_1۬F3c5q zom~Iw8Vރ}![?[5N- o|nqtx8[|*K߻sYrW~\1s;`f=L&:C*lϟ O&o1'']>$io3D 0` {A @BL>2_`P~@|F{$~5_\ȷLn\f_XсV><ߊuN=9P?''|=蜨V7I{7W~>O~$~1Ag _? (?WL@+N-KQ?@٠|u}ter]aǹLwхI@M{'ABn2}z#P/L_3A#:|L_6*mX{s<gzn|7e3~Y7E7/m?CH7}#uxmO>Gvf;qO=nu37xoO9K#{o3~w87}67K\;?㐿w ›?z_~>wOɩEa~Cn43^硛Sx-3n=[ ?|'ݑ٣vq'Ww߫ܲ-:"~iܵ7rf/=i -m#!ak(&_os=L{wܴfov6DInrYBԂΉkl K Q}Ee _kAɅ|dz@B_:ǚ*'e;Asv->^'iѸ~H }XWW1 I{DwQ|eQIKk`vrL_7\?o+oK/PMG:*~rFwn8TɴLA~HtUȇI eA = Ư Ϭu l⧂sG*lJ(^ =Yԏo ]O'˴ #:{4oyiП+~~BOs ӗ5|> ƯmP?0}Y6ԯ qgp7k_}oOrOq^u x}+%Bţ9~q{쭓*o-~ܵ7rq8מr.5]3\w.XǛ*1ǘwgDže㆝}&C^!KzaɱyϔfQz6~!O8f 1;瞰ϔo;I]/}݂y>}}cL ?yGos_ܵo\pN}G^T>zCu^ Oz gAƷx37owOWL0k|OA#7gU/#n# ~]3}L ~1_^`OK}A`o4z>O 33~W$ϬbY > GUMe ݧY|-:ӗM&B/L_9 @ZPW6O\%Uhwjv}xL2\ԯ,xF ?/+& +A rB t\gm'0S_ӗ7J_zP@*yi]~DA{b҉|(k'ӧ4o 7 ֢~lZ >;Ea$o`m'VjѦ~z!_?g6%EمF_<r>q۾%S_}oOV+b^ݞOv+޴>gg6+om~qi~<On_Ww/K\;mF~_o9'cì~GQgs96~鉇s|^xᮽ_}!6=̜|'`cxlr=ڭ[bJ3瑧{`=AWןr193ɹyxpl`w~+ݲ]xad;?}N#_'C{fƋ_7Y˻x2o!?]cr;{ߘpӧ7o WO ~3(L>2~_p0}A;Ӿ/g~qsP?sbFMR?6|_BB0~݈:t~m 0}v}to2L\VP~>?WN0/*pt1}Xɢ~je ?_bƯmatYёhnpIZ>1}Dӡ~lfLo>G|0}넏'h7OWp||Wa )?o)L5iU _g[L;QJL5A>&7,JOL7MHUi`fDa)/-J$_%_Z Ư$ԏik$ oM pcO3cǸI/'g<#xr2۽1~ [uC7sϊ>xa<~tƏמr3vGqnX?$V?[u#]5~q{ta?nuo-pd6^l.;ŝK5xls~^ ݪ<|?=f7}!Og:3νk }ZCNt÷9zC3omlV~*lZ/8n\ O²qO{|O=O߉zr=NԏOW3Q?0}v~IGoc*lt(L?h C;5E肞 m#jwE ?ğ5&c1}yԏP` ~*(KMip>>li~doZ.9֡s>UbFM=>%oԏh(?LW͒}凃 `GT;&'Iq-LȷKςee0}DVL_:A,(;&Cz]nM.ӭ~Doihܯ|]Ac+&~R%RL'*|Ӥ~[!~$?H[&-_S+'LKQ>Ҿ1=lͭC:Trl_}oOr{{_9R/";<5ߊy?ܷ/\r[?vs}\v|^xۡ ~;j8>/?q0$-l~q]YyGn䗟٣F puplc8X'慴'pE-{#w%f_'oWQKmw6L9QxG?챷n\;q~ꃷ{cԀ~ V߷o=/-޺O9vΣK^Iͬ?sɹkw"_p>0}a#&⇂k'Q?yqk,$(Wh;/k7|x0}zCENI{@gEv~ICUSEM2}D~~!~3hoOn\6AJ˙s'OWJt }LCkQ?ⷃ%&%t]2'"_>iEq|d^ϩL_8GAb0}u#~]5eԊLU[ԏ,Hb2] ~>ApY ~3ho Ưipԯ,IFJr=)?+L7NO%>*݇U7~?[2\[_}oOgvn|D!xGnnמrVcv}ow~U͋#X70+ǝ]:~w827,xkg?q0$[/t~)<yBjHO8 >bSO>nՔ٬#[ymO?K#>3ɽ?}{fƣ7{6^\]rǥO{~vϯ:vrkGL~DG]C(|ho,ğk3z_ Ϝ4Ut֌_ݠpYB idtVԏ,ik|X%98ԯ(_=~bEO~ߋ+gLKSK⯂kL~L%_޴l\v#+41}l#"lS*soL@PP?#u @BLG+k Ư&'TO1LP? ݇Wex(V>k/nׂk&w|}0}} kfƯmGVWOQ@+]!`g ~?($\ ?(_P }D#~;Whm+x5Ϣ? ~=3}BCP?oN`Yws0~ 6 o_2ܒ'/q;u[=;/?i4om/ ?J$xGns󱎿w?㐗~+ݼמr.N,:֏9Ɵyč;ӏx ~<@ ڭ=#]3/mG=+BĢO?~n+޴6 oLIìomny=EqݻxlsfoYGzz#{Mܹ7O: m[Z~q,cM~釼C6r[|6O9?33~ {\X6g[?ݧk^硛<􌿹gv+ݼFew~IVcwg/uݜq{g ^9ߊ-<̌z,x'/yG<ەx6?qvngG1;3nrNϼ?]8Qyls}o[ظz&MPS+<ܰ ⧂#&|VQ?>(5||o@t^>c.Gn ~R>2}b(O3 VO+Ok+ *I|a~R%J$G60/-/i ◂-|v"~>Пs 7|)]Lxt>!i\f_Z`>nt>BP?)lBw ~y?._9}}Ve ?o.OlM^*ML;f.KQS 4zQi(L_MVaӌ8?Pӧ5Jv2}J|}!MPx>/n/>0MP?'n7\cKxs˙|5 7.x8xGn}%Ƴöxɞ_x>wUo%s_z>xGn񧷯٬w]|1r~͔gfh 85ܳn;@7x=sĔpNoYGqW&<34ӏ`Hn:&מrz1nI;\ZOܴǷr7mw/+#^ ^9O:7O;gص3nX=a~O8oYS3^/wWq_ݽOn_rvΫܲ/q"_/,o} RkOt G$3~1S½0}=`_X_2f *TS*L0~Ʉ__&DQ#Q?0}L/o7G|+}|~;C3{b $t !ԏK5SxI|hb  {>,io߸_ڂ~5h_;5Gԏ;$#b_D+1}a#V1}nGU3~DBb9Ϣ?ݧU|MS{b H_\༘d_[n+ o_2m?LGG<ޙcxlO?qg׼7xбzGcra+޴>ǝ]sǜZdwՋ~1zao?>xYWwဴx7xk,'z3^xmp_z>iXk>x'[=?}VSRC8L~Cn:Vyn߳^byoom~Cpv @ۜ;j\Y{\6Ģr?j_~>x6xőzyג{x6N3~MOR[.G~msBcb&,/G# OL7IעJq2}l@gEЊ.E$ԏ-q}hCrYN0SQ0}A~FO#_7)_S(?&'7߉ItRɇK.7IʷmA&8f|dV}lifڻ6KtR! FQQ/wOA~azxe3A & Ư. ]i&z\>kS6 @ZP#:IBAoLٸ_HP0}DЁQJ◃1IRE>{E{sЯ+'8+ڀ'k'8fO.F|=,'ek /'6?cxU@ۿd=[|qNګp˱7~w?툗n߸Dže~>Fgr+omƄK ͼcN~{+֏9}CB?㈷|986;,GScheo7mNrwhinةv'ݑ[?O9^[?['sK]7'{.,}^A<̌d~. cx[6OÉ3|?챜.x!?}Vfƫ?xxO>?0ݻ摧{n<̜Wyߪtijk!c{&~ cS›>z߷Qg8 ۀ'`Ù?rՔ=S=Mk“ii٬c{VK٢S,w~H| g+ko޺w,yagVWGE9wݧϥxzwy7S_v=^*[%˅G8Uԏ+L.B-.i9#+zhhoϫoFI` _kt]h7~}RP/ȗ0WLЁ,䋙 '(\VIڇ%A70}D>ğ E?b0g5Wt#;Ol_ =]L7ݢ)_6P?'Q/)L_ͦ|CB0~E:] 䫘! +Q> IBbϟ ,~'[hho0A 7h$ }lE&_3)]vDw@O'`ʆk&|( olpсX-iKq_7/(~Gy+ec[>wʓnᗟFwrQxp/=˶g۾`-ìzf$xGlS}\J7/8Q]kfE͋0augfC6YN>z&ǺYm_ly!ߚ#]5GEc9Qsk|U 67ykf=է<^![b~㩇#x'_O=+fp4.pO,ۏ~g^U|\?c}z[(څ~D j:{DB{$4с[ГEk@{P?b ?ؐP?wmHw~fʷʏӗ7}XGcCh3}@XP .8L_7M. ~i''%+ @/.S @&(0} ~F!8>/k,I8nʷo`݇W;4-m ^)h+LA ^ԏ堽wCDJ{FV}\'YVQ?MfF|O0L2_ȷHڇ%_ZpN ]L{ߤ|}a N+zb=OL_<ᇙœD:Ft[t/nʏwO% k#ŵ:l=a/Yyw/Їp>݋gw,y5Eۿyǝ]syo @W{S<ǟ]zc?=.We[uYůkfylr8?|!!⚭=a{&n9ƏܢޤH.N";\tB6YGj7}7lw]+#NoTQG ~q{\j?|O>?pjQxGo36</?ygCOtsoƝʛ>r' >|dfELi~iX ^xmN7z=hG ?= &-~qJ";;xϯ>y{&^:=ј,:֏9ƩO=76cz`V[?v1>~) #N :86 ~I4/~W&xmskxn~Iu3^ 4O: mj7}6旞t4?tpMooj{ KgyRP?B1UL_ Ȏ|F{D+PߋnI{e#t_ߊ @B _L>Q~5(_RI3}sg @|C}Le~vf0}B#~%_Z𦙾#;4NIx0~n'UOmk$z>jMM{݇WWxHSѽy @Bh0}\#$>$Ʀ~Ben >P~>(Pj6Wڇ&ۂIF.i7IϨ䵦}TC~t!4io-謘}Dk_+ >colНB>ApY04-`0S?LcMɉ_6_2}D_WOn&f>O}HY_}oroO|7śqMި;Men;~!xGpj#go CNŝK%/wÂa?q'{f+ܼ{!':^M~qx5s۪Ihĺ#x^ى~1%/{_!!zf[w%]֏a9&c3}a'{#{ ~<[>f&~I,Xɢf%x v[a#szO?K#>*l3²aw5qv=q;O@ fb{Vq4&oW^a[<}wڭ=~u#KO祮s'yԙ}>g6+om/'~ ͔o-t/y{+j{z?oW'(Ñ>L}jE.W|}3}@\P7WLq ~q/,'47W7&WL_2/kGUW% $ʧU77/}dg>~lk` A&fS\V&؅Sl?ԯ*M{47t>f|S?6П*g45CIDoM8Q?h4X'~b/N7~tv~" gVk~`_tV`N|wk_7oeC &eMBBޫ*>O#_7n Z|d:[6{'AB{o ,h_rszWao \&o'n<]sxmp|^'`^z G~a=YSj2p゗qήrxo.V omV142y{&l~a xGm?=fsf+ܴ@#nxpl^'sۥW{lV;<:[ғso$$,o?U{*~)<^ac3韥w}'Yg^=/eԊ3}Y {AA2}rޠ~W7-l Q?5f E`FY?ݧV3~AuAߋ'A؂0}b#8сSS:@DB{~w0~xG@I.# b 'Tm:?/8LE6? -#A`Fc;$k +1}7AOGLˎDх|C*a}PCwr2}b|KM Qu}Tx|_0~o6$,ML_4 4 JeO61};Q>33}Nz>BIh&廃=|dؤBioxDq6` AӧN П* \:|<񝿝.qkKo_2T˾4^xf+4GgfC6{ĩ{_'sf^w.86[xʅ5[huShL}fk>x_~>]x[6x OGc">b!肣1WcvkO=nuKxGlх8Q'qaxĩ{wOI3|sϊ?sɢ~1?= #N܍ va㕟}>C3-n4?=^, 3h|5EkKQ;\]sk^9/~wݻF-<'[ݤ3 wcql3{n\r7,'sۥy {0qv=au2[@u +&!-P3}e3~r%TNz{Ngc籏 K??6okߵ[z6Ctn~7t{VG[>fgǼ}1;O?`V/v݌[H矰e㺭x;[w.x\]iƟ߹-Ùݻq~r?|߿o@ xGnFexGmsbQ]Nܾ7q˱>f7y6}N-<?}97{6?}S3+ƒdq \o$;8}wSڜۡY) ƯMB _L_6> ]ԏhN#}X=L_3AGW&'6L7J'5P?@p(O>JL_0A7;>/g7 WN# ;WNo&t_`"~GbFNP0}DHtU)3}ApoJQ?jCkF|7->BO'To%ǂA^gp/;%7W~2(P>w"_\vItQIL_[Fȗ0AF7Oi .9[fB܂,oq6?8 .+?o-K+F}߇Rs@ۿd}?# E'Ŏq~'sYv/=C샷}c4?=4oO# !xGns8&Cjx6^{V٣so/Zq|QxpN~{̈́M:{ϊ}ޟ'b [=fOK#nU<<fߴ #nx̙/~휿gݰ>-.,[v*pxk<c/ŝKg>%Džexls6}xGnsNW|7}Oo#O'챿Nyzƫ?h_'7 /s~ܽ?qbQxGmsq'ůwgpfah}!c9{8[O;gfus=_}>on:VuwW|elV1<5x{m= ןzMn936>(O6ɢ~baFABi60ۂxRO5aD1~$iZ? Ί|F{ ~Wo):C~pR>|U3}e3}J}`c+Za NtR"pL߈ t0}]#~5S`+. &~SL Ar0}}2:'8׍!\lj*>noiOr˙|5AۿdK{<G|1[yo0ןrȢyO=n!x݇n3|~wo=CK'3ۼ1w~Ϯ9(cv'6=${޳cM~釼C'7.l;F%xorHH cqr^'sۥ![̫' Mqqݻ`1;<#Ol\]yGn#n;b9%-lO;-cWi[uwn\̑ݻѧgyw.yS[?v?ǝ]sVM ?=..{͑?_bop_;~g8j2>>(io߈_ `z;\Q?6b[~Q!~-> ٌ_?hGUthhiѦ~j!:3}̈́7|CP~٠\ޯQ2~DTP~9~7x`@^P >W0_w &HCB܂_;ԏU?/_;RtYޮԯ*'|O嗂.-k&7◃F'/C ~1(?_ M>g~1þ>Q?5Ō_9t>^/iӸP?Lf e+ zK"oJ؄s]tU/[EZ0~U sّ>/cE{F)?o-_47* /W4+WO1O{:zw$f=o_2N{"r5^c/b܍ ^ru6~?|sOÉz&7q8$/y^;au3 6¯>ef#NxGosrQshnesۥ_~M,YN @W[>f3kşqf'0'aՔ\]yo14s?xx^3p,8*~)(vx57]bjɃmG=+J7op>~Wen޳o;`Vz6w<Č_}>Lojݷ׼cv(xYo.5ۮq]{#}ZB_[=v.84O:xmrzӏgݒS›>z{K\7Nj_;祯s0$?{ @W[>fa~{}f+޴?']S=z&O/ 'W菃&X*wI67qx|oL@?gUCFjRxak)?o(Of? S 4TQ0~ՄeOAN?W7A OLP~P?z"iwE'0?o /oh'jMAP.fBǠ~Lmp Kԏ.'Ư_Y 0Op+.C yA/# @r+&/WtL`۔﬌_; ~rKIAb-n[$Z ;>:`c+{1}j# YywqÛ kKokvVhL~o/1xkgM8ln\r7'pǥ~0gec-~qJ^>sOʫ?x~Ѽ÷x_~>]xkڃ6`矸ϋ]3㥯_ӏcw CNt<š_!}oDžeĢf9%W|1cw;xkzq'{|nQgz~qLi6;֏=ϭy̙?=ɫܲK]7gcx9vƫ>h_'bLH٣Yuە~w\6a46ar%ظ~W|o-.?}- rsG|!f:[y[6yɎy ~ܺ;?I_1oZ?}3= ۿG?L_>'+.0}̈́fW#ОȗK;'AB{}bCc r1P?#h3~=V}x#hhoo-/L_>ᇙ~NK&e n*ӧ4>ݧWm+%AB{߉G|tԏj7NWۅ0P> (7W70S/ O?2}h/gGW ӗLP!~K/7W1w|^}||Ee ?+g6S?>lDe bgtf›^2?L)įWN'tI_?&/ a܆_6 7l+k&~dEOIJR0}U7Ϫ`F_iolР~V! ȷKoܯ|E|9i{8'µlt# o_2Nw/~Mۿf?'aMůK#'x6ޟxĩqa]omzaQzȼC6OK#{ś6xkg8{8(c[Ƿplw86o;֋#Mlͧ =|"{b5xx9D.=/%4t-e .*E~sAA/c$Njc* ݇T8' A7Np$-.7i(?(`3~f/oAAL7MWL|~deFis*+~.tV6ɷKW~:/~Iw /E|)%w/k,I'>>6Э~BaF͕F/L$#+nI{DOgMM@L+6+1}NCO{,Ϛȗ5_V? ou BOLJA6z"x!IS?%}Ʌ~P |3%Gt'ӧ7W/f  J9]wqÛ3g_ }ow{~Xp;-=7- }v/ßݱgF߾[qV-zϭXT6/v?sɓέa瞰 z ?#N8?}^[wGBƏqzpo-B8ggC6է#]6aщ^0+m`v wϒoͫܲEᗟ-^!~IcyO?stǝT=Q[2'KO:%{ }DEg|~{AoR0~ӄ֦~H7Bԏ(ĭb|M|i!A@_6FP [''A}hop?CȷmH.JѽEht^ion\vtW>Q67IXBqIgr?qP&ȷ3b 6A#+I<>(L_(>Q0k+fAȎS"_{4t>ޤt[h;%Wԏ*Lbntnw(_Rh7M?.L_$Ut^4[&Gԏ%}E#nTdhO.LoA{X0}]/AfƯmaDt͊>Y\׼S_ }owai=l>A\o8l[=fF%肷}pv͟߹d{c;o-nߛ;\;9xGok5:Ə)~Z;O?~á6=ƓϭWc7}c=vWW&/~͌']O?xGnsOgwxּܰM ~C^a[Sy[6xفo=h>L CNoT1;4'?=.cz/oBDžeQgM qW ^C3?=uzK_?²3gݒq:fVɟq[>fx=#=bl[>z?cݻ5A_ؠW٣ ]'w,u[xzs -5gʓICHllt[#r/s'b?Wgٻ{9:{7/qKD']|7۲Ym!iڸ(W'O/)I~d niO+O @B`OW3K KAz2}NCOHhoN+$Y`_J0}Daopjo8io0@)|0hOO+; WNf]Vi[$GԏOЯJ>Q~8-L_3G.+lϟ C>ocڃ?LߨRLD.IFP0}D o5|}r~3 .+{':# ~_ Hp"_є) `Iirޠi#)_L_3}tE+1|;?ԯ,p oZ.Y1|^8n2q^?7/%?|qNګ^!t~)ܯw8{g6ރ~!{݇nO;`oc3uw jJ~#l1ǸpOKo8{xGlzN, ox]#/{ÜWi'~d=l>ؙޟxavom|Wr/(cwKO>K#;m{'_G7̹Xϝ{#7T~#Qs0O9~۳m{^\ >bgxuf/ isA7zNx_c'&b/1[G‰kP<Ьu3Skz5NKGK.}}d1A{$:]ѓ` AF{|_dIڻ$凃-^R&'6|ƌ_5w>_L_;Q@OP@P?4!_Kg>k2# ^I|o}D UM{}DG{džzh"~/_X>0@qVb '@0}n+0}D s3}BtWHڻ$k}beFEo|=pitUqL@\ga|綠}tSD{}T 'W8evaFiR?0@=|Yޫq ~>ȏOgg7hS?O o0EOeqwpt۝rSY^%y%ﰺ^ _yaCOC$/=i4܍ nܮHzo߷n\pV嗞Fgz^![쯓K,'*lpve^?}S.v7zfǝ]ى}clןrS/ ̫xpq'b#N /u_z>o- 瞸OK. cqN~\*lR͹lX77.xG eύrcwsߟ %>mS,S6o71vL8\q$,It+袘>Q?L_;MLP7i |C6L?g|~ԏݐK&W?nS\ OhϪ/_ b ρT$_t__iPӗ7<3,JA~]>ai_c5J>&$/WOT}BeFM~^E'o~Ap?/=CL_3]]0}n*>[E}`@O+~с>Q?IƯhsDЂ_L޸,~N%~Wk'g4.+_^EнBOŠ|O4}SL۸_ZP0}HJ{F_^oWM䣒_.=8Sg\0tK;z+wүqۏx8{W?{쭓-(Hz&g6 ?}fqowdBȟܾ䑧{^?=;E8ŵە_!O0x?\b5ڭʟ߹\omZO?痍nΣ0sk۳>i. |y𳏿ظů`.q8Gy ֍y>]OWN%^y{fI;i U=1bT}D 3}klBB$/ @(W>Q>`d0|'C@{~|e ?̔o 3%t^ɛ΁}LEET_Y-k't$7Jڇ6ʷ'5HPEfR~,v;P% ⷃ+'~QS:+~L5A.?6S 3%Oo f z. lqoLЈ?*|Q>ApHt_Sd~e!_1i) kWic}v(v_|ݱъ=Xa_E̿½[fo-pvͯ~!yGpf+saِ CNtޭG}+|uA Ÿ/-ߌō7POL_>tT>/k Q?on5GJ{aA~Xa ?ԯ/>n5P~%(LW6%*L֨SȗKP(_L_|k!,O>޿iʏʏOp_΂ zx b 6pi/*_16t'g7_ WϝW3SA堽KR0~̈́5姃]k&t(QvPa>@&֢~Lg@A[xGO=~&8 O箽 |&=3\w.9YyGO? 7.xܵ7OggcvXT'w,\UyÇoq~ٰᗟ !xGns mu NSxnWw-yzO<g<pߚ~+߼{#5Ƀw_'/}Wy}c3÷yȉ{G~LiBƏcwSxprQ;˻Vl[>fgK^7wo=`H;ܽ?+O'ep゗qήrWeGScw٘m_ݽ䥮wnrz}ޟCNtCqa8(cw=a{&̓|O:?;{~98Xq>onџ؋=3jOW'V$tP>y"_hUfz@(_ho-L_:⇀~TEL+~cfnԊڻ7E u''W/c @ ~9Q>?Q0OrP0~ńcW~<͓`L|oP0~ㄯ3|kaFY ?tSL3 O*hwL AФ|ua ? ӗL/L_ͦ@L_1 ݧV olP?m0}v#LįZ3'~kA #+Q?0k 'g-M7W7tM<.ho(?_Э~BaF4⯂I{~`k`N~+y~7巂&_;=Iۿo6Kpv~9矸ǽxGlKO:νyoc=+=3ů3G~6~璧xMs~㩇<߸o\g= ;[}OGUcvxŁvN O;/r/ĵo'O?LGGw"HϩLWM 7IW7|)?7W6X'SA$_5Yn+uL(G%k)|'c '& _ ʏLx;Aډ|(B{wI{~z>2~ńdt>dƯn@wCJcQaJ{u%{$ Wz.9Q?>l#Q~0=P?WJOoxj?{8/y%?;= ۿo6kn]qv*om~i<5xtnxGmspo;cM~{&G%8zn;oY33^!6C6NNm~I\YyGo3&?\bo5s^ ~ɇ<ە76i3K^;UɥUӏr4/yݜWe!J7oS=ʓ ?jG٬=l]Gwӏg5%nU;='3xȉ7|s!O8ue%K\;va/ZrYob<-͵[߿o@ fa':vfz!Oϱ^-ޔٙ3wϹ#n|蛳zr޷Q?WNOjpf*'$|}|ir;i G0}B#$ GV8+H3}X||C0}q|v!:ɷH~^ax(?POCVDQ?>Q>/ gLk+GVG4wI{ˤ~m!~#n[@}X7E=~T}DB{$_7=~Xk1GN5|}0}̈́݅E~.w<N/nϯxk~n>y"_hup¯`t GM#3~]Ӧ~t%_oB|Ё(UȷJx/ Da)A{w>3z?CۿdT{kfלNoT1]+%[?vw_ܹ~-"~pfƏDž rJ~CnxGmgb;F~I٣O>ocԀ{>omXME9Op˱W[<#O9Ye=O>ۼ]=a{&vɟܾ^qbQxЇ'yGlr4~{[i~{ r2`"~)G7a:ꃷ}֓nڭ[,_FfBDsѭ~b}l#~)3}d|wPoLЁZbFk~v%B䵦}7,~$(L֨Q>~s54tP>knpTӽ >7I/EJF{DP?#ߺ%>#eR+pL_7MЁQho/~}¾>J7L;Q>0}Y6嗃э AϮpL{~l[ J{}'o OIГKؤ_-LWH.~b/MLM kl~u|kxL%ptm MoV̯oc<}w>E';ܹ7;O?~p16؞o~qiUnOؼ6K#Cn?q>tqq6/ñykO>G^lvb{^'shy5+sofמr?h=91㗟G&w'qqxɞWi?W}?=ɼcw8~)<;o-x~>.x= k٬clިcv(}vfxVO?n唼ƃ7肳#'/x9w4xcVO?n!86;ܵ7kO9';^M/q݌?x-;BI,M"~n\r7.x5Cr7.acox̙?w~ͭd=ޘ}W/{?sIwO㡛A͉[&8+ _g Ohߋx:_ ~1_VW6O R?a ];0}5A}^|F}X!>cΉ|1 `˙S'WBv ~&=Qt[71Ӈ7h}Jŏ0ބqmQ?2}r# P4k #OLx(T>7gAB{ۤ}H@AhϘ>0~=WP?M◃}2Z~A8'|Q@B[0_JF_=0};M/`r̿{Mظ&6;V=ƥU㗞O a9%}\3^ ~.q0$}o?%3~ Tۼ'N. ogj2p゗qί>_767T#MNo}Ƿ-yŁqNԀ?sœέXT6/v#O1g6 ߚ߿Y=F 'sf'ŎCVyGljO?nKn\pNϮx6qӱ>t_z>_ە~ E ;瞰ϔfşy+ܸo=~&wڨY~/ょ]bl\=-'685eok^ n4Og玧?[k _Uyꅑ7y|Ϟ)*2(p$/ȗ5Sԏ+m/O603}j7WMx囃#|}3}A{h_$z\>~}!_#Ἀlj+&AP?"7Mk$I_g/ 'Wx1#{9 )GV9 W8MDJ{F{~WA?"W%CJ.>|IAK&t(O}~t}t#_詢~T/mϝ @kQ>9p ƯWWtz; fO|IS?>o0@wMW>Q?KT` ?t7'yx}&i[O;;~y7}m__i;%V6؁ekG| q 'ՠ~Q`/=Iԏ,hg4]+G6o zaǁ 'Wx>Q' v[~ 7}~x' ? ` +~d@jP0}f#_+Uj A}v"~"(_6#>kQE?5nڇG0}لlW3_*<).J o]||}!6>Q~8|kS7iCa_kG4ӗ6]<[O7/'5<lC~ӏh/ o~<k~/{ÜWigy/uݜKz2C߮÷9CzdJ`⥯3yősk?d 6Y=LK^/;.MHFcJ𓏻:y͇l33/?=fBuە_{>O8 =byفk}lwG &Hc 74|E?Ԍ_98WtNHڻ6c -!"hooƯkf|IA ӧ4)7|_AIu LQ 0|' ~/('n}xT 'n&KABf$Ưja7'/Dp0~t[J;' }LsbT&ϝ'0}D_|Ma ?1'XpA.% f|_0}tR ` ◃=+ϝ(?o+L5ihP?*|`KoUς;=c/XN@tgυe`V۾1v_߽८S=?}6{7v]{#r>3²QC9pĢ֏h0?=fv >a+Mn9>~ l͂z6{dJKO'e/w;%MO?䥮?[ܹ?3 yM.,?=f"1~ {07yś68=u#Oy5{mθo=퐷|6߻ou[7x6}^Kza-rk6+om~G<6y53~IqiD7|CrbQ{d{ltyG-yŁ\;K";,z3²0?ܷ%3Ǣg<_ uڇy{>Sls(q!5!~M_?}Q?h^>ftYОd"_`aq`c y>q~^/o/HʗLKd"4_(_诃k&0s~oa9~>b lDQ?>?UfLVb6Aw@z2}B B/n/ƯE e'|O+P>~~!X_ H/,}T_Q!`zFYr?>2}d#"н;qS\DBoR&3}yC+WϞ>SQ0}u#~OoWN#6 @B _Nګȇ{e7/;~gOymy[so o֍y!>-ŝK|~ů*l O#X/=/,:=F_'aKڭ[jad^`H'svźz뤄xGnsNןrS/ <}&S}>N ^C5{-;'F펿kşqĉEo>퐗a~~瞸OK.۾q%y׊ĵs^Ay5|'d׍u'{Vo ;ܵ?[O; om߮soxGmqM:NoT~{'Z33מ|+n:RﱚUW\?Ǿ)_ pT;%~}S?wLtVԏ,>2a u|MtW0MP~WA} Ӈ' @ ~0}IKGO&~[Q?0}V~Q}`#_O/_ӗOK:[4 O!~fEO'| hut 4Q>oOSiO/ȇ L@P;(W`"_;|Ċ{k6O#+~d~Dk'psپ>*?]#Uϛ(Z95p(W/НP0~݄t\ho|۹7{\R;MCۿdaƷ~ z o>'_sz&}O' g6 o~ {쭓x6^t4;O9ރz?˝d^ߞS7<~!r=!f7|30}l%*io-x4 +zȷKo//wDF>/K ~f›\nO.JwM qP:vt^>O '6vQ?>M{~q!~#>}"_GVxe_S2~m!~]_ #O(` AȎ|$~VL މ_*Yi+% kP!~#_P>o/p|F 0>k2a>L_ӠO+ğ5U&>/fA<]_?aJ@&)Ư@wCLEQ|d>-amyn>zs }9K_-x'xln]+Ryԙ?}-ꃷz{!w썼÷9wg6 o#5x/{Ü߿oo-zOXWw-xp|^'sh?ܻ%O;஽Wi_;gLgwꃷ~C^Nt?}6o?GuzK]?ާ-8 G6'I{ V|_InR~P3l/i0/.ğ`XBQk+$,JitYho%` ljc*'/>Q?`ی_9+DQL_[ ڇ%_Z`:oWO}dG{K_^`ی_ B{/fڧ%y]}x &{D`ʆke3ę~9X@i۸ KiuϽS?˃A;^_']zwήy͇lWrVcwxف?vΫ=h?sɟ߹o९ Bc~O0V)~Y8zblsO [=f;pv嚭BWVɛ?zw'%7T^[ޭC'sa9ڭvܳn\ 7./>i.w\xȉ7|&O8kO>G2y}+^Aݽ+%omnY^}ޅzS`/[]:75NIb?@  ~MSES|}pa ?Q?>Q~4 WLЁ'LM_O/7J7e *EyAM2}d|UA BiԈ +g65ޠ~a| C =.hKhP?1>Q?A Ax0}̈́w@C*~?cu# zu 45V/oK%'uIs/k/ȗ2T|>0~q/\6BJloe(NLf0~ `GT41}v#_#xw|7c|}T7/'Ӿ{u^G<:(٣'s!?bUn;n\pN/J6I<9ttx~CrnΫܲ~_߽f-3gJpv>l?sk>x/MSxÇoNIn~W}gݑ^_+gkat_Zf;~JLtZwIڛ%5WL+Bx`WI0}ӄ{}dsoAF|d+ lB>Ȕ_ Я+ y ʏ[72#[}B}Xe/,L2oWtA&m )/(Z=0}N#H/L_3k#}d,,~9_RQ~- T`?g_U o%B\2}QeA}R0}x#X91~'CBf>>Xݽ?ǣѕSW]5g86;V=1yGn/?i4tM/S1comf~.N^9xO>7v?lf?E'v|!O:~|m'^`Gxy>&zA;~q{\X6$xGnNnڮ=+{{&rb/=qsG{ɞ&O0kO9`Ŏa=OX*lp8&?=^Ag}+|?~ g\//yƏ uc;3}-}J7M>z"_Ѱ+2_~ ǃQ S < rӔ?~oP'T%Hԯ/L>g,xm=Y7K58Q?G&<à|C6g7hohEq.I{@~GP_6w[Abоf'y~!~ZEO>c8}t(f_ܯ`|[oLSE_Oe{Q?7_]hok/fFQ=IM{4W3&8G5#ma AgCۿd?eu=6o @W-s[7xkf<̜}7lW^A8~&'7 ?=g6 o;hIS[=vF~r?|F~I- {#;ǘ|nU#{̙/~휿sk>d4=+xoS-/ܰqǷ3s^!_6~q{ ܸSyGn}>g'^9|˂?K\Z%B#69>/XM~-yoYּcB“ko⥯Г=Q]K|~E-Wt17#ͧ { ~I{qiUnko⚭j #;rk*omO=n[=fc<~sG*;=k^9]=^97 C^y{ŷ|zWw/Ewϯ:O{:<5y}Rxȗ4=P?BK'._ __h-䫛#y|Մy6a;Oiԯ*0'8ų/姂!Ņ$'| o詢~r/n1}yC^ɗK5.KZW4ӧ4o;?L(o ohpԯ(L_?=Q>0}NÏ5 sA|9}p 0}*}Xer͠~~75<3 0 #+G=m?6Qwy%uoLи_@?L_;QgA`F>菃 j ½gu9nз9@ K?{g׻olFpL~r5O?[>b_|痍q#N]b9ym'16肷}q޻ອ[݁yGla_x>wM--4w-yś6x艎|C3g6 o~=T=l}!;Qgs.c3Ͱ]sk;6;'aKD7z:+O>]{#78QsNa'{~ #yz'o͟޵wq/ y_ zloO05O`SABxegA`àR0~DlP0~_vQ?-0}e3CBBvp4\ Je6 K?mn+of/yON- o~{76CyWyz{Ƣoӏg5%]olpvo?ym?{ܸSy3y݇mOy7xҹ|;6;3x[68wէ3/m~/-=x=a[?fy>&v慷~6]8QxPCG< f4qG:ν_}>om٬G+n:瞰߸%y̙r?=v Y֏ރ_yv]ǷpV &vfrg5%{+8~c96~viUn८G7=l0!'z~)/sy>/~E||fUzn~'u~$ o/4/+įWO Ug@.'6[$ zI AZ0~WMK1}i#_*_/^>0Gtwm7J/EJ}~+ |dFW3N\CȊ%~yCBBn0}Z#_/`+h)876Ex0}̈́O-A0~\ɕ 'tV/L_; ϟW4C a -Áo4Oygqˍ\bIB{$&2K?C}>ߑ=lt[?v߿sGzzO0pN ?a]o6wu">|8{8Oأ%̊x5 ~ ,jjןz?l߻. rM{\6+m޳Ů{>omvaoYby5=wK^?O x}n4[?_߽o?b ;lt[GM~ w8qU\\%?=^a[j_~>:qvx;7y~q`^[?f.16.۞oc}0kO>Ę>xpۥ*uq=Y}l.!\U;ŝK{fk>doz^mUgfG?jƃ7ql^xm?Go1zwM?ɭ}B~Ql7ʏӇ7 zz0~'L+kz&~2! :[ 5|ϫeH_ O19>x"~2˙|~dEw 9vMѦ~UA#Ư`'|.ԏ L_5MнJ{F{J{omګ$ n݇Q+ fitԏ}0}@#5(^(?jNW$t`+1}UCD` ֢~hA31|rΉKG$''$zo&| W| _5ԟ.=\=Ab>qճo_2A}C?ʣmwNPCcy5O<7Igݽ+N, om~~i$$[\Uq~x[6x̙f~.q8ە_{!cW|kzd~{܍s{f/[=f߻E'^9?}zVoYw.!ۜX~[7";4?}45[=f#^r&~I{쑧{^O8r7,x5oƔ \MSxȗHwn;%ϲѕ|$ЛÒ zhwm(~S? ƯZ.+?)_:6Zq`LpGh3}b~as>Q?>= .D_coh oiGU X3}ABF2}NqY@p_ lW3 g5~HtUȷH&|ԏMm/W5H,U|L_ݘN-yw}x+1}NgCۿd_ n}׿yM#69?mɛ>rG#r.xw.y5B6yȉ_x>wM53^ $O<ރ }&<=n;K#om~i3qD xYM^! sfG~ {\Z%tS_~>'7y6v!p&=/o-n9w-;o-n{矸GKxoq˱!14o#za~;dG6?9(cw8}-au?ܻosAo=Mů?{&D{v?NݿnyǷ~GM_koox_&'z\'&0E _ 'mR.ix+yx>o|f!,hoi_ w,%ɷLׂu5~o TPWN*_:Q~ ӗLԯ/pn'Vk'e : +aډ|`*%4&߈ hoha7=A)?kUM ?tVП5UOaK}D!%ɗ5 fW~{Q?>"_ɢ7aS/_QNIN}+㙹9o_2v8̵:l?X~C7v@W[>z]ڃ6xkgSyxn'k^/タo_ݵv5[S_z>6C6XO?~urnCO_6nE`1gfus~q{Ecv ~qi5cx5Cxo=O?~d^/u~{dV[=vgήߢ~16{O&r7.x5sj>nƢob;̫qq8>/ţ{W,W|<|?퐧_y7xk欦ٻn~Ƿ;Xp'__wX@~P}Poܯ~IO ϝW3\#*:&R/j/ J0}ԯ-p&~1Q:oEo|}@%gT4=Nԏ-;~ M+MaCB<%~"Ưk'b3P 0µ\1AJYɗIG4 ~H}P#_79ZQ&|=}.O{͙7x z̿{gG_xW&c3O0pjQ1f݁=̌aNHKtnM xGpVW|/k6I׼usW|޲޳goܯ~mA ΋΍|Ä=>;~]BiR~'WݒFIFPޮ>,_DP~#r~EմmtX3}r2BJN%Zԏ.p_5-~Le9?ǭcl=\G\%V+nџqM^硛x7T~Li^!kOdžGylWw/ۗl[?f!ii~Iᆝʛ?j>b&ޟxnӏ`Hl{~'7O9f^9(٣w'qƏpLlT|~޳a'{^.~>떼܍ ^9}=n&wO<&omf~)/omn>{qixGnR8{8j`{SyGmqǥkū޲K^7W/<Ԍ{&?=47#wg8(9srl\Uj+5{W&{jo=#NٝK%%ě?jG؞#uy׊Y/~"''?<ߙkm̹?cN~unW7(@BYM|$0-&~#7LOi}z7\+ӻ'GY_7%~?L(T LIQ?aLޥop݇W؀+à~V3' @TP0~L EY/K ݒ~9W޻qa3c0}t'ToDF{=?RR~AxCL_9Qm;5I~T%_>>ApYIP0}DTNj&t5\1Bo9 UU~YQ?s9ws_,S'!oKh#Uo_2FgtGw-[>z◟mF^9>sOI~i<̌z&~?s ;o-?[''~6O8;G0m{1dz~ůs4$qݪ÷xș<~y ~qW|^a[<8Q{VXV<ʯ>y[wGqxԻob;lO>gW_7^/K7u|c!X`詢~r%߬+Ӂ_̌_9A g74jI b _ϳ ~F}HR>P&\8OxCtUW1}M}J; #=Qԏh Q?2}j#_t^wj!|Zant>ӴwjOOGVU3Iՠ@A#0fʗ/z &>3F/Wȇ%.B!>aƯ`ez:O옾x"/S1~Y9W$ϯb6|wP~0~lGUt>z9_"ƣpe|Lre̿=8/ƍjcw˻V+ݴgh^/uz%v_~>i />aƢy5b߽~1CvadQ[=f'_;/o-fhH.j|6O=?7xkf<9dl7vy6ݡ('\a!'z^!Zwxщy7xȉz)+߼K_? g+;,kqj0ϣcBff % =!~\v|^xGoxk8Gymqq16 7.aC;n47z1M^Cv ?,{7ܳn;Ӿ{9bȩziڧ77흒|XYqኋ}xůa"Д o⏃L;[~y{{%,0~_ԯ*".&}j%1W~=~XA| ԏ-wMڻ5gV|ɷlt1~_@ecr}U_ 2f *ş+ 77Op-ʷ3~s.+_Q;w3'5~\EgaO.Bԯ2_[_ Ư @FP0~ňA=UhMwB;#_o~y-%o>{;~稛oǛ>wC'qi[?vUgظɉy#vqxGosfO㺭w:~I#mw^2+[fYw.;t>~«>hO]ob;Gchf;lvܳxGmSCxm=K#7 ?}f6޳䥮_rǥ;QLN~JqnXp8&g6+GCrVғHyogw,8ߒGqhO\;K-̎?WOno #t[F'zv7kA`L O/W4! 9ɛM1}D(?<@$_=_V`mPH|G0}DсQЭ")>]_%>QGwL7H.KZPOPA&tC*`I|Z}D~y-xox!~V;E{DŽ t>o + -1}]6 }\zKBz:﬌_7)|P><k+ӗNC~|EO ȭl|[~qe s̿R#wO1s[9 Ww-yGlKOu[7}6}ڛꃷ~-wd^983ko\"?|_7gǫ?x)<Fn~/y팗aa6vfO?nu3|'7_~'7}w ~ {ە}!;FMdWɯ=c^ }gjS`Hv?q{&S=M;hyGpjQx5CNmQ;Ȅ7}=mV]6f%xn3 ~q7z^硛ܸјigtEcvx57g/Z3+͋m3◞xmݪ÷]56`ϸ8rr#'1686Ŏ CS'ުqտν;~;~wy|ma 6LMP?8iӸ_qho`FF W7/AmR0}\#4yS+l1݇U _Yaf͓IB|9 &> ͒$pM2~q#0(_5}Vjܯ|{!@_?&R!_*L_7kEa` _wc*ǂ|GNj151}D? X~9/f!~&PM0/*C{~la+}ia ?/~1_^Ih_ ⫂~i OoE{}lA<>(Px|;<92FJ{FAr̿}=zWyyGlO;䮽[?v?mɓέVaQz{CNt}0їW|1t/sk+߲>~^3fᗞ7yoW~q;:[ݑ+?=cxBcwp3g9%-~Z'w,ٙo.OgJ33^M's o-~㩇ܺ;pu#[%?}^aܰq_z>}Vw~٣y#n۝xGnCn(![l ^9?=/lV1;H淞vc9o8{` :.+?/Lob\~n*N1&B/Lب_Rhh}E0~]CAe \cl/~;(_Lu~[~Ae Y4p ~do@O /,tZ1}d#&Э؊Q o|$~%f*6IVH|tZ?6? g֌:M(?+m7K~Z!,Jl'+i£o}wChW9&ߡo_2 Gݿ+,ny o>y&xO8mŝKj7{67 ?=6l;<1633^!<ήy݇nsOʋ_7gǘNxف_Jkn9Oac= ~q{&f<'챷N^ ^9O>?O=`Qz6ɱyӏg5%oWG<[=v?ǝ]sk*ox[6xȉsG?}x7xx6^Ws%q{'7 "~{[#7'rۥE'ŎrǒY;>[wx݇mbS/y[6ĘMM*O0kO9+MHp4&}PB_'M٬ߵ[՟s3mW\yMv(s}xKe|q@&~#fOi ݇W'*'WG6WUg)?^Р}rR>) `a/ ʷƯZȗ1ӧN (?o-+%5耄م` oB#@ae4Q>ҾIgC*5=}E~!tUioz_Ԡ@=]''4$-pI: m#~!3F|F{~[|WaFBI/eL1o J1~݄eʷ! WDh$}|#1}o:\˯tMa*7/QOx=8nZ7x55[oM "~\X6sfk=dG~r27 ?=.Y֏ݡ ;lt3^硛<<WiwkO?K#煷ym ţw~k.5} '޷o]sW{?|o~;x͇l33/?=f[\]&xŁnκ{ G 7.q0$ۙ1;7 DU6ϸ̓]趷!ԏb|eO# nw2jc+:I{D*ӇN8NPxà|C1S_2Qf*_?O*+&@P>-|wE_܌_2+'(}BBB DaIV,K>hڇ6f ֢~b!_&76#*Na3}=0BBmD|//oAtQC) ezYt|}GfI6nT}R}hh( oʏ3~ Э 0}D{X>6~:8m }oy[-o='xة_WHߦ/ O' M^Ctn @_[=v_3s~Cn4rjQxp4$C[XM/=qsGz/~휃ua٣qqgל٨<ܚwűyᷟ~F^ uG_~>L|MުScLFFS¯>{&";l&~)tEcv8{p[>f./KO?ܻ g^9/~/N^/{㜣#^/{D{Dn0}CMOQ AJ{$\pzϢ'ZL-\ ׏4o,` 9~isYiL0EѕL_9&ŏ[ gL.A)L_?\1BJ|

}hGm޷@YN#*|Ӥ|]!Lp5//_(Q61}΄k0ϫp/2GvL8#+fƳ%aϟ(P(?Af 6tPk&:+t^Oh7N!}O_?Moy?\%"86_˽4ú>8wۏxmrNǺq+ܸo?^7y6k6+^{Vlt۾!'OXr[?f߻. ygV_x>N5]3 g>E'1;xǜڠ~)qiԢVݡ%.N^![o[#~rih6omHs,x_}>[o_|>wO6ٚ}|odŎpKczxGn+OGylqaFfw9 }l.{/~ݜy|ӏxz!#8zbhןrk?ty ~ܺ;o~Cn_ xGmsfØڟG|;sOgwոEVknc籏kׂ|Y3}}lANH ?o. 1}FQ?h 49Q?57b yPM3}]6WL)SiNWP~KFA2WO8oލIBP~&>8_L_C+>xU1~ v䣒S0/-hg4WoO ^aIFP~,(XM_ H>WN+F%tQioBAF.9]W0Gb/ >mkсQ3э|~廃gyWh>߼^Uo_2\{cxlgr|&}7v@W[>z|>hݻI׼cyܽkwvK^7Qgf4O=?7ߋ_3S/ ,G5 ~Ԁ|O9?7XǛ>r_O8ىyc̊'sݸ;"ēή{V538Wg6*?}f6ά;O?dlZo?^x/a8G8k>cJ>uB ڧ4ڧ%Rw; 6g~YaƆOb :.+RГEkA`|uu0C~bיI;h7LDu#_p w&gV'Xptݑ׈m)pOk:͆ }X}r?>r6yqc󏼙@ۿd~8^ߞy 6"WOvu?a{&| .a K_?'z~aaz~{-:~)usnߛ#9ۏxn3.X~comO'Ҽ#lmGXJO? gt1;ZT~ܺ;33^9)9g3=-=a/uݜG3c omN, z6[ŝK<=eӏ'o~Cn4ů{[=~//{Y]3`Hn:矰OƏGyFHF݋/?k*/?c_ݵ omO:-usvpn|Ƿnmqտ}{?<}ߓ ={7凃-|$_͔(p<ɗ|u0}]çM+>2}Dy OP~DAbFarE> i3}tJ{->qà~faF^BB6|3DdƯ.ԏh9Q2D_ZP.q7,z:t1}DU2凃`,MĎ|$"ƯaY]7=Uԏ.L8mWNV%ԏ+U.=|3詢qo0BnWN~W!7hh7!n7W=coOͨ7/so6y^&/5xʛ=j~Oڭ[/͋p`g׼8y&!O=d^ۼ6;~_߽"omn9xW&`~ɇsvMM~i i|CP`mg7&}hE} xm0tjOi .ӓEQ.I{@B`|Q? '؄IA{~b}Noc;5'|(*_3")HI|C?/ƯZ WtA_9Q흓A .B!;4|$+Q;?5 S*ᵡ#KX=]?\ӫ0 >~[?fg_ܵ֏pH~{ (vןr=/qW{zey&g'[݇|~)6gqǥYoGwDženZpfO:@2o۪]+#^5s|lVqisOgJ= ;/1?B[Nz/y-ygcwtQ;\Uyʅ5~76Qןrȩ›XvFcwyő7ykfG&7-w~#76C4Ə_ܹ z2ow3ku~_Pap$O@wN|~Z1gz>2}D>>cӓ|DCS>&+BF0}Xï`_?Ư_  }L36ɕ}ӅKeR沄96M{Ϥ{ +>"/iPA&OLH vk&G5W$.p$/ @$Ϫ̉zIwϳ󸇱g ؋o7/cΟY:f~{ɢoڛى~1~q8 Vcvyýkv̓#xo~OJ?#^͟_bx쯒?c @;D߽764x?}f^a[}`ݒx&*=xȉ{i!1ܺ;w.ߣCx5O>M&]Gk6/ko!;57v`S|l=<̜|CvM_~>i.nfWrFwN:n9S“}t|g'sS._vtm ƒvvx BN fIla 6GU͓Hԯ)L_5Q9L@!9{AC'ʯ jaXB%TП*7 O/Os'LH$q_s;Y?Ow_5ħnBpF|q#o?<fkF ?cD=1^͎X?C;qzx,?l7\ݧPb *iU#~X]z&ۯ(6 0//p OP'gMp$dV\dzӷz!. ~f 3}rYʷʯ÷p݇]`}33̯۟ /&^Ϡo_2򮻹g}M^g޺fl Oܧcwꃟz@W[svj2Cl1;ܱ7ԧ}>:]_pO5^yi.{mrz#Ykvn^ӏhL^/ェbCN#6gOܣ֏=mzgG{Sx?;[z=O[h/Tu^%vh\oK_?!'z%M~8!ʓ5zw3y<<q;sSZ 0Z^|Wq7r7o=?}f6^l?cϮEr0?}^A 6`gV'쳻j˿ӟ^i/ \-<0YS+~$~9h+$*~P>8DJ@OMxγӄ>&yk ݱm}gu}gr'-ބ$Gw03q0}]'e ݧWkxVQ?>q"_ܯ~u!~&hwm߈E7g<ƩW~y. .1v8B&JwǙ-O~_o7kLtUh7B M0}b p+ğO,eؿ驔ł_Pt rg_ w|cfOP9 Ư,'e #O(0#nRNϙ!ۢ%\o3s?s~ ʼnySc2#n O:஽![\Z5Vy矸F͋c?|"Sʰؾ_'8wﮰӞ?cdG/+ܸ=?=^[;;ܰz瞸3^vi䗟t@ڜ(cv8~-٣-:~'/ǃn>Ź;cH`^<=wd{f{ x/[s ]>yǜWϛO0(ěpM,'omܛ;Vcw'q㱎z&C/?i{&fE/.a7}#6neoP8*/+)b Hdڻ$k gMNQ?>O[Oq#~8'epOO8Ǡ.x诿k7N0}݈oY7'|(?Y>x^#tUio[$ڃ'?y' u>cI~La$_)_LP~40c~ua|%>ǩyWg6;IB3Q?> ɗJwj7J ;v _9r3~nyO-Lxн/mOo (X(?''5g䊷}j#_)h?y'^9} סo_202ޟ¯Ə◟|F*lbsWq:]0s[]ߐ_uɫ?h"O? omMK^'|g~'72;u'|c3%ě=rNY-ە|!O>?o6:SފgЏub=Wz5M\??q?=IԏpL4Pw=o\o9ʱ1tAx0IH[Eʏ^ 3i%70iT Ί|{ީqQ?97|/.fau6k/wA =Ct;5ܒ~ٿNp{99%tTh/kA ~-{§݇|/hFP~P#8Գ#kn7b7_<]+;L<;o-~i<ܰnZsk~icz}GS3=}l.+!q;gt=CO-qqE瞰r4/uݜWe?|!{~'_yO8P$do}7ڇ?ܷ/bhg⓸~Ƀ]wƯߋs~Օ'80;/~b/k ~)?Yc葜@U Oz2[}OAiKF|&T}daz$)!O OPLA'_ o åK{;a27[ӽqCۿd)[8/p"׼kp|Qx;xӂ'%/q휇!_C`}ީoFᗟO-t~JԢ`1[<ܳB7zf<~Ք-usGݽ+{fƋ_7gw$o<刮+o_#=0'0ΩWy%6m=wrQx<F;/<逻F[zy~?:Nn\{ ͼ0OyYlb*<^ n:c9ۿ1%v!Q[|\w.xȉWiW|w0x3x;=YOGcr>|'fM s g6|>>,WHO&!>'去/ɏy%4[ع,r=X,SnoEf<᭷q13m{{F~irͥUϺ%*;Kndgvăwڃ6}o O:ykOJou#XTrƷzs6o~!3xpğ~>vo<'xkf<Ԍ?'xx<=ʿ}K{˲r7,xɞ{>)xpܱ~/wWqϭ= r~`mɵ7}u'rUCpk&;7ws'WI|ͤ}R?†iҨYG >8X{?C{ GU|L_`S*zasEBiq>1сRaxӗNt_+?=_L_0A__5z͍o .+_^ o\a]IIR>&/ȗ1싧w'8Z/ѷaO=6 oFeDDP0~D ?)V1~;\V~:(_[W2L@BiG]+,u7*/Bۿd1e>莻8/7?qxSz% @ xG S£ūje^ߌ;1t<yAv8{WNԋ5o-vW?x<=oZ3ctMͭG~)\UxGlkn>3c̣OTGīGc)V/p.7ĵv]b E O:ŃwG]+N. o~i˿ƭμƫ-g~ng;Ʒzs^oz~q{,'xGͯ>e]Uyp/=i4tuɹƢ=?#_<\uoϸ/eSh҈+iި_P`i/-p$ڧLOoEF{~~Ϲqޗ'$2//p-v\P? ^ Ưկ-O͒ ONa'؁~iw|+fڹ?voގI ӗN˙ʷ5M{FIDF{2Clksf+=(G~w?7Xt71Wzϟ>>7Hg #/K La}1~˄n~usGq^6A3S?˩Wz_w|{^NsVǼo?};=l1xnSÆ׹6/[ {{sΌ7~=//?ϟANo= z~:ZgǥUp|QxnL~ l͂x6O<7S=?=o&u9h&#5c…e~/s3㥮r7,x5C";ݽ+{K?q&7[2;u(Oq 9>ޓ_|ڊK+MʼnyG)(!vHy>c3lVی ܯxP/aޠDA_5M[y 7siךz X%ӟ+w~j#olܯd?c,nG>HᮟUpgfzF|/iAw0}~V%TMG4OEuO⮗ N+re^7/6Owxɟm?yf[6a{ړyŁ ۪mGţէpVO??%_07y?o?;.M0rO4k6.\U'Z٠`Í;o-~ܵ70>v#~q{S/ <̜_z>&6`w_w~7;;XO?nk*o-n4KO' -4g6 GO_{ 7[myݜ䆛yפxGnsNW|/n\3~q{ɉEüg߶$¼Cxɞ/naOf籏fяb+Kx(ݸCϼ77Nσ='ʏ u0}DB2MqE7}?_Uz}t%(io(.?p۾A5~[ {'? g87pOE oe7ȟO/7~1ey]k͍k&ӧ7D!|iҨV?L5Ap^t[w~îg~ ;?=U)ٽ7o*g`FY4YFP>QpNL9;E!͓ /?zhAۿdk*˿k>ޝ&1;(G]+S3^9}Q]+r~ f/w; s9%,=lKfO5y|E~q{M̃_~isVvή(!QۜX?=ރpǥ\{=&C>w:ʰoLOGV0_;G w4-m{9fDAil}7_7+V}x>Q? C1~s.9Q?#,.v8/E{$&4pOnsϾ r5g7t>%ޯ=a 'T%LhIJt\?AO- nx`~iAۿd'<wpk%ۯviMM*O:7v߮ö'lrhOXJ7/xȉ߽qïpݫ[/jŭ _#:=//Zw.)o٬y5!Əcy׊?{~ycoB%ђZ~ig~<-CJ !OWM诃uF>l?._3]?<ޗ'e̋_5GwM/t^ޯo/)įf :.}h`Fn#*$޾>,߅3.>oy6O`mu~ ]LԨ^cNL_7\1@=^M^N.ɟ1_Ck[xy򟡭VB0xo6 m R EN.&et\]Kmޒng7Cۿdlikhz8-qރ}-lg^xGoO=;/ uoZӏ5o~/'M^T?^YҫrV'g9Qxls0'沗~+ݼמr.,]K~q_=my"NÅ ?C=P)

cc= H1}o6 Y|6Y㖧ʂbi<މgV҃gϹ #`K#o-~{Dz;x<Ɵ0{FqW}dx7'q8$'|6]yg'yO<q:^!w(}0+Ow~O~ٗe1⿛[r~?^yyWy\3'~k*M~<WeGi ?=5x[|'~#7t-lWX=ǝ?ВW_aSxGmCE-_ܵ/\gf{0sOgJpvMH|ޟO6lKsO& b@e o#+fd0~̈́o4z>2}D!~^!8x":^_ 0%}]fD|g!Pp(gL˚ ~{1}ӄ3+moqe_ _c}>FB`݅|Y-5AlƯ`w>\Oɱ| +,Ɨ~S ,qb)_0ӗ60?ԯ/iwL7;_^lMP-/%_7|]v/x_yŁC6!#1;xxWw/y5-̓ogyϽj:8nnq/Noƒ'쳷n_lto<'_0+m_CN,7{w ~ ƏD~{c/μ_5J~=35/?連!y7w;<|&_|L7?}#K뱼WS7~c'wޖ޸Ƿ/{#/{ÜWir8ۼ]~O:7;fywx泿G[^pO>{{0mϛ-}t!_?_ ;5 nVڛ%ۂÅs'q[y3凃` no;d7qo@`]|~~f-q7E!/K /Ư]?yu6 '8{᭷|wwC2e'6{EA/+ _Xyt{_P/pkw>MIʏƯI҂O ~П+6]U\5#o~Bۿ<ç>`6vV&<5qגs|痟t[m_y>6ywq[ UpK8}L| X .+ Ӈ7ݿ{{WNaϭ:?yw}pr?=UtQaK& @B`FMr͠|s0}mnKű> D_5dJA}Mn0~i-Gb )?o,䋛wOt8>iӍ@e/W?{3Dw3*ٌ_0\EaI{@kQ?0}YO/W{ׁBۿ;W~)~!'z^ ~{C6]&v7}kO?`v?kr5_c/^m1LtOz2Do[f!fsO*x5s~.滾Gq)ɭ~c9v*xGm矸Olt۾[}'w,#ȁ/od^ӯwݿ+v;7kʯصs~w\;Ey5B#7vKO<Éţw~oį}ˏʯ2n|Ƿnl[~-_w-ɍ;~fB-u?w~ om~_w~;~i|Чqq٘/v^}k#7mS=}vW q߸K#=ɟ-k/!nx۷aw~|Ѓ7FkԏL_<*:'|詢B>Aps펟-/ͩ7{^TG}t훳^P-|d!Wxr8}ze ?РJ>,O<G5w;sOo>IJ|_ɠ|]G޷.U|L_?kӦJiR~0~D>z_= KGǻ}Vcv[ /~휟~zoW~X7:f'aRf3μf^T;~(wKz27t#'s0瑧g#~qcom~#pnE>n|qk];x{;xGyś6N^!<̌;.Isml0_sē_ظfnx7E}, J͵o̾vˁ_܌_9A 0}s' *W'M+ Sx#/r3p+Q/m$)<`FJ{$_7_MP?L҈?+,5~|Y?Gl|C'q ̱}1ez>/L@\ /nfS?4AiqUʓg\!Km?Voݿk<][=fݻfwx݇nӏŮ3s~qJ^9pゟ=/x -77{C;έGܳ?vw~μ[P33 Ŏ >Zݢ뻖}kNoT1;ޱJvW Oc!}mڭʛ>j>g'^M..?}-x̙M~7̟}Orۏx8>k1^^~A_*9(÷| >xߡ*]qNǛ?j_W>zW矰ݿ><ލm% Gthwmh-OpD#Oolnx40zַ_{Cq-77|/) Ư nT4%'7v79ھ3rçs%s ph׸Ί*~t"VO l/iⷃ}/͇dvqo^챜~Wۡ 7t\V~ k~azpqo7zT /o{0wŵHF*y}+;S~7-'pȃw#g,{WZ~x_?3*۽2wŝKj=`s[)*yO:^qrQxlc Glvm^)3 v0?<9x95:&\Y'sqpxKol>!o v[uw76f~.Nx<߳gX}7~wE??vx{؇V c*]k%ӧ7⏃& ')&ђ{]ǿӟ}vN=;ȩGۯh/K ӧ4 %T-qPNi E1fq\{}#ō g\3 m\1Bu ='T4Y@OGT.jOe:<ԫ2ç?{~7ؾݯ 0}w`  O_įW70:c+fzׁaH7D?Bz S'9/ƫܲyᷟv[?fkI ䷞vϭ9(cwxƥ_!!6>V/'wo뿉 x`H~C5xn3m";O>Cm^g6 wpߊ {x}dr0$UfO!Dx=+vf}mj{>LEW=?̉z N+?I{<{{֬PGu#O;K-ìK\Z%O?3>߇?i$nx7Gn+,'_`0_7wO n*5 ?3[6otnNpqO`~?lFU2}p@+m=QOpaϝ >WH'$Dyp^O~8Ww~_B` VP?}hwm\vOe'2^čO#7so_bvI{7fyoEF{Dw@ ?詢~bnio 7c}Ynx7ln?O_&o?Ǽ?m~{܍ O8;&݁_{!FDže>bo?C^_~1f#՚;g(fo«Ai|B}z#_ԏm7+'A|\!,Ϙ1s9cy+7;mO^_x 6h` ݇u4W L@/O-K>2~JïblsO'>l? z_Fo?Scޅ']svgK\XNҼC6y}~q+^l?|S}Oz:xw$v4sO,kO͛8GymN~/o;?8~+߼#wpO|-OlzWØl~ANt;;3vj=a) ܲK]7]8~"Ŏ+q?My7x,!Ogw_/yOxf= vK3c5%ooYG3^ܶ;+OgyY_C>;i7av?=?YRL_:AT8niO*g;$ks{^h]+Nbq?:&[Ch!hk&؁]Q?Œ_ 6UFݖ<XT}7?~lwOp}EBiԨ_Yl>it 'x7iw-yя"[I l?~P &'S?(d>9|T2}i#+zGY _~HAM71r^[ƃ7[xo0L𓏻r4/uݜWe?xw |-ᮽ?%7ނ {Οyy#x6V EM_='Q[ܸO箽xGl݁_}}w'O6F!n Ea=<̌z&O8O#w O< C?J/@j~q$Å_%ކomNoT#r~-ˉ_y!<~4~lt=?kb6<{7-ߌō7p^0}ۈsYnNP,&'O+yл#rGNKqo._9/ #t\`L3DVb _T_ 7ڛ%~Ve{b?K[. ^[n??S .|_tWa0~D 0W4Q?'|dˁ<վp[I?s˿&l.I{ ~-_Z o|lS0}nq|m!~;۸~>ӯD?/l?y¹5MDžecomx9 7mgw,yk __5Aˠ7_ۘp 7՛?pw/ao>P?(Yu0}O#O+mml s1~qpaꗡk൙_/o}n|bgVxl_z>_9(cwį=c6^lgK^7G)<'~ޕrwKxyme8(]⚭ʛ>j'm^GCxEM_į=倧g]wy u_޹K#._p/k~CyY/O=nhy`ޟ)>?߻ci78_eux7~9USx7H<~u=o-vW}HƏrJ~&P? 5MY U~10-Gw^SH??ӌy~Ca ? E .N~cF :?}]_yŵl?ԯ,įl'|`_XWOeԯ*p>P_^q;2Kȇs^#?~;omvf߻oŢ}c_NI7}-ᚭ_y>c>#ފ~?[rq!ı joD?S / tQ>3P?%7ڇ$O=^6g7e?{W7+n׿џ8N|g674? 3~shP?H;$?|mαq\Gt_du}CwC}㮟efNpU^-ro<98s8u}D(R(?LwM~nAa\V!(?]p/8gſkvQlco*/﹇Ģێ(o֓'6/uݜqמrgyoʋ˳3 |~o??tt?(o̓oNo~.q0$o-NoT~#e[}Oyٷy}{w]?<I  ;?=..f[Gpӱ-gw{{.i6䎟Yeyǜb=߷[_~{vƫ>hsG?-ٙQlς~wx-l9گ)?Xywү{oOg K^$흓/)_l[$StXx[}[~(ecɗ93L3̯9?su9=L^[~ɇ47TQ;KOK#8{|0\w3O8pH;-?xkO9^>3w!y?4q0$۳-CLk>磿Վ;/y?sɽQn~߀<aK_?ge~۳mÝ{C~۹wFÅ]n䡏yooŔ◞omNn?=.xGlsiE-f}k<l>o=Cɗ{Y'-yw}/7?fe ى_6}P?oon9/N3ϒȽKq/^| IBL0~݈³į 7p >o;?Ǩ}לᆷx3T ^'~9v^9W`zFa.@{FM~^%~K[$6._OX_f}k ϫ0}}ç @vP?޽7 ʏ,ązNq5_}G#|cg7|EOKo;JO~ЗxW}M'K=ۿ˽oʓxs~ w8J7opfegso`1l>?_du,b_x>No^[>f!'6lVۜvb6c!˿['?'oj`oxk ~q{_6NoT1;4K쭓S›?zE'~C5!za'{=?˿-k3;s_aQg|OL0~Oh0~q7}D'%;~8R/C:?StyW kx5/_<ǘEq @aP?LߠngS4q\6o?g5OyN.^:3}VCO \g>P3(W'W6`=;?>F 7Z=ǝ?xY\7G=WMc1~c2$Q?L @$؄|5ot\>b?W t۸5rԫ $= #aMM Sj2}omNoT~<욐xGn]l+f`ÿ{MG>~+޴W|yo0xc{&~ܺ;ry߁Qc3'zέG 5z~W#!n{-ޔ3cғ``ob_xw\8QyGo3o=[SC#Xήglς>?ۻo=k^5Q)_tOk^ /W4凂\P?oc8ʱ1?I?k:q?׾x۠|F{ RO6;$$/+plbu_a籏&! wQpK;A.'/)p oIO%dkh}Y_&=uwoFģg`_V_ Oo%C;1N=QtRaaэ b&~#hW6\b9|8{iOut+o-fElě>rU#MNoV㿑SJl?wI?ϛ~;:/{ Cvfcw_'cןromv>[wN^~9)N˳qMou' ظ&^T;=y׊o-Z¯<)ά ŝKמT6ř]n4մm?VSދ]:]ol%q璝YF}k"[ܰ8] [/k.K(_U6&qO,e{-w ~ 1@˻9c~W&ɸm?\o|pV_?µ#'4+'LRCsv/R]wskO3Mޔ7#~3˘K'c76|n&f3}D>j9 Ư؟?{pKμƫr_`~]67ykgMtExŁC7y}?v8'a'O>/XKٜj ?㛼#O9!lt" ?=fjx66 Cn4pӱ׸StV9J;:D*qel,-v2y/o)xo1Ҝ(٣;W}+3/Lď}߯sۼ5=ۿ˃y3{#B7|&9sǥ_x>]} !ߚ7{nW~G&P_3G}hnju~[pB/L7H~V7ষ}+fgN}˯_N3Ѕğq sfήprQxO:3@׼⻾]oدqő_;:]p4!xGlqv/?y;&٬#p٬C|39%^<xȻ#3^Tq7x]6;ᮽ?|cxGn;o1;/ _<} E]+v'^8ʯ+߼c1%>bg)omnskwjQxG~便~~[(x qa/A{FPHiysn٫\˅KN+r%^Jm_5|ΣN?z'VOh$%/.qbOE!])nf=bLP0?s ?Slr׿~%7|37ڇqxBOc ~>g)^_b]nz!D._sQ/ 7}0ԯ+MU @u|[mUt{EB{$3ߋ*_oߧ?umPAП;7pV Cx鞻'~ {xn{<='-Z W~<^{]O?~e5'sh7y;ry7ێx?xƒWyr2}7yLڼ(nW߁SyGosǥ?S[=v]r>xGpz3~G_7] 6j:8qwM53^mG=+BF|O>~%۾l.{ ~o~NKp^S&~wsvo?<͇7#x~qlźcS3?X EW/>q|I C5Zwa)}cށ'S{0xmrjO:`Hnة#vێx{kgĵ %x'[VK:143o.^_c/viEɭC,n_yɞ'ꃷ~\o;ͧ`}S[*vO8ݿ{.ɟQwoVK^wNG+ɬ_{i.{ȉ}n4g8zEȏ1rG50Û|-ܯ|y^0~ÈoC>%P;^FuUl5Z\$Wn|_PP&j,~q!2d3ǃM7PO#+<Č_;/\c?駽";X|=/'9΃M 4x§L!B0 %BOj7Kƿ3\CfX;ǩWzE|vQ7Kt>` n+ &ݧT<%t=~7qo~GOk{X<nzWM_Crvǯ>y{&^/{ÜK\Z%p^;aucݿ<ԝ՚/RW~~O]ύo<6Hzoؽ{0:Gſ{.H~o ?}fg[ &k,+~8W74I7Lp Ϣ[E.n U4={oKXmDQ8^;nEv^QxC=17Mڛ&*&74u C_6&h-'$3]}owy{e1?dCG1=>VFK£9?yog3^! ~;կ ~%'_8ҫ޲or>z>ߕU?=f-}}\33^[}Ogr ?q{&^!(7f!_cm?c{̫ 93㥯_ӏr2;[[wGn:ֱyۓ?{:^ui=<= w~L_4/gʏ7Ò |zE|Lrٽ }1^l|=r_U 0=fƯi0o-_&|'/~TEO=~Bw[[[k\ }yNPLWO ~X!(i 7k̴{ SΟY6PvH_b~u\w/.K:irI{~uAOӗ7eHU? Ϛ4g_x{+u>xڭ\?euk7k^敉z6~o.37{ޟ߫=hG~'B׾k_6w/.^5_˿ [?fO)xȉ{qiqHK؞o~vie_ƯY3So?AB{wC>ӧ7u^ɷH.擹>3jW.\ΟeNK3;8=xk?x/kxw ' 沄 _/i.oL8O=^װͽ[T|1 ڇ4e'T*I{нg%? io8q8g^ظf7'~k^Ypw&7kJ|4퓒.xhn哂I{;~gX;5oio;ٹQ#_fqu~W~o%8-/*L7LW!(?^˛ 'wJ *{#?CW??w =^zbL3qS*~iظ߹#|ܜyW}gM |/jp^K~>}k=|.k-$Fb,,M̓<[>{ؾ/3V37y6O0O?xoqrX_U1_'so:nz۷u_^9~?s oCSuw`Q76LqM <ǝ]s&/N5r̯a݁Eo=[lot~\>{G'sϊ 8r_ዝa7yҹ5آ'퓆u#XO~lv-sɛhL7}|Ew|U3}wwnwOvo8gʢ\ύwhGK_b~ zm-?ƴpt޿ޭ%_|C/f/m}dŏ5M0Kq 8/¿pa;|ȃ9|ڭ|~BAl.ƯpYZ[vO~*ϸ۰xvwptǷ鎟<#v;U ` A>b Ol .9:2_p3<_-1y:/rJ~/16M5[ztp3yw}=#޻=ncƧ}{F7{66 ?}55xllSF-M_~_߽,orq׺~.PCcvpn=~۳߻]q[<=߅!du}̯~+ݼgyG3 y6O8;p~ٸg#NޭG}+gr?KgOsU? 7MD|]޵q?ٚs=r^. <չɥG? Ot]ɗ1 f >Bk&6W~jcݏ-B{w{m\]/`F>̀ig On;7tq ԫ2[y0?gp aeN>w5YFr5'l&E!TU zJؠ; Kſ+5^+*g[n\'p?St'#V+nџ'o8# kon\ph`^ś?zShi̓~1˻VG܍ 3쟾o^Qkx'[3_H݋O*

άk~\7Nw+{:[xj {AqS~i~n9޳sY[cvѽqxfv&o#UK?8Ƌq/Ϙn+3?ñ>G>n9L׼k,wsbb|K" GML/X{o>>#_>>aWnyǷ_-Ee~ifלav4S,>$~QÈǁ<7;^zMX|W@ۿd^T?sz} /o~Ӹㆷ~+/ۿǸxau[ϟ26_uoutނؘvC8su_?ϴ< Nq }di&~*w}ø-_ }oy!._p/Q77Xm͢ |a>ǞXy+əxs$qUWKF@}XD~>ß{_I\uU& qO ~wţwnrۥ_~];1ߚa˼W]u;~gx{ }\E/,ߎi6 NKqUWo_2/ilr3׽'gA!Ưc?uoF,_ }oy?ĩWy%{o^S=r;!'z^?챷j7{ o6?θ38*ɇmA-1o ÷5h-? {_p-e>窫WAۿd^n5xW}COc9>x?vȓ C6y/ o Å #?'ފ￑L_> .9Q߯>o/)_ v?sÛ1Eɼ%nU?}xw;8!z!=3nڠ|ׯ?Os^/R\uU1K#?^=~u 劄*L 4W3|W˼W]uՋ }oy!↷|3uH~/w:~4g6+o-4{ϊw}{?oK8W]u;~- u_B|D}Z3>ɷIcIOw|[ǹꪫ^$ q%nx7#ǜʷl#{1 Z!'PWK}?nx7GW]uտ[#Ǒ-ߌ{/[ wp  33}ntf~nx7GW]uտ}oymyś6gwxĵ3f~X7om~~?7|=P8g4q]KBF{|w&`0Bnc׽rUW7/A#}V<瞰OڜXv03Q5#O񿸗nnw~ફȭ7`ky OЁ!8LF>(į+x us;@W]u ɼﳼn~ǷConܩSxvΫ=h|O:7pݿ{ca媫sw]p;[ӧM~}aFarݿ{ca媫z7/?5Z<<&}?yÇow/;_c~uoUW]g}Yn~-vH7yI@~P?LРA=_Mo\uU/%p$vK²Odžk*ompnz0o>{8^D檫s$v7yx=Nԏ-䛘 =Ot/zwlsUW@̿};凼=/'fvfyqqw~1'5k};~W˼W]u?~we-]Jr2}|=CtPi\|so_92/UW]o_2 ng|ؗ~Wyu.,";ܵ?.1F~6}?{h<;i7㪫ָ{~ęw{M`þ>6G6 0}s#yNs۾W]u +]~wgܽ?Gqn+޴'aU~qΣ?Y?Ѕ? .?~wtt\KʏMJ< Bۿdr={_Q0`{Kqήy\U'~w`8W]u\<[0feWt]>o, p饞ѿI }o7g;|O~ ,Gs7zC3C̓z/o2^Ÿꪫc]?Iw;olpgYOnN}T%_5'<律ӯ{㪫z7/}g'~ӏ}^5\{~hiۜެ\8j]G=wnlrO4;7>3oH`!~M:A zJ=nKVl=,n9o_2yF6nk^ux5s^aȣxlr/?m?n}oW/ȗ5AB>&i_֨_Y>ſ+g᪫z̿ſ[VwxW);'H1Lva 梾O!))?^v?6 ċsUW=K9+KW~I~釼 ^?}vW}&'_z>&;yk^5ꪫc~;/8~9Q^c; Sb n Upp0wҝ<5\uU}ow~űm̉E/=y;.M\w~ApLt_Ty0ă`Ÿ±|1l}yr_|M%tÅgpSV ܰS38(cwgk_`s˻W]u;92/~)xɎ_o㖗 xɗk{B囃` \Q[wlnywફ~''^8/Eiۿ'_ ;ڃ6ȟ8>{eu=/{ÜK,Go..}n# ܽ?qUhɝ?5{ev4*%_7|=z>WY{g(: .9Q?Kȏ(a{&"1lvK ?3ڞf~ī17y֍_fmꅸ\xgy>ƽ}N/~1>b 1wwtrLҸ舻~msG.1l*y}dzwo6;.3y7zn߸;.MM;{>wOGlm^qyӼ ?xmrVG~}/RU/=}'sCn/o.k}zAL_1/a%bڏ}0Wȝ?s̞p.%$/(qbΉ#n!h^? }owydKr˃ks1W=K>o ^ܯ|U|0}B#8Z(&,Oz )F}}#lQ~m!~&b/mHx70w^x(7/o{&CK_?n^;O? gׄě>r~Oy~W._GXqǥq+ܸo]8o\?Wno~U/إO+|J,{G?>Aq|ӄOxfίu8U]On?C(,Oڇ5wwdܸƴj;_2ӯ oy݇nO?xo,]gp۾WtrOw.<̌~&痍=4>Z&|wc\];9 O7$/(^q+)[s۾Wtr;_i/K Ӿᙉ? 7~=JnQ̿Ӆ? 86}Wڛxm38?ɥ;oǍ\˝{#W1^Iߜ7X?r)O%.[o mSQ? oME؊o4pS^{8WGo_2NwyWů䗟mF^:ޱn[9Ȭ+ݻg'V\D&wqCM 'pf>FWW|/t0 k ޚ^ݿ;ƃCμ+?o,L_0hG7 prU4VUOdrOpS_&$}tLWOXB n_f<{kBۿdd7x7UɟܱZ3^Gcr0${y|u},w\Dž? ^ލ1 g;mOm,?˜y+r^|?._':G%p{%O_c~1|c?C;=f|5 %ttLOz")S/ SfV١;R77=bg`{݋P$%/}y>{ە?};`-9U϶>cVNq[ ~yM|Cо?6| ɓs;#ustQ x2~i^}Pk޿Q~8 F+Ư~`-9!̿C<myś7x5=O9?O=~7t#wϒc13~G8/ͱ1^!<̌{&~ oN- w!/wzwMX;ړ` \8 oVW] cO[Moof߈3ɝ?K=/b\gpe_c/b`_^_ X3}7AkQ>O 'M*'TϚsG7[Q;ւhLf% FKg/y5?iDnzw.px3p゗q-xn3~G<暞'Vl[=f?툧_x>'M<건3ףR{~ɣ5esϼ` ϹLD}J{FEpnyw.px3; -PmM|DDJFz;xwg27R?}ow~o.uy9%Ogя+W6s$7[џ<΋]35F~)53^mG*&VqV܍ {"O6cO+a|E{kнiWOE_%iLO<_Iv^ќzWƽ}n䦷y+lj W f Ϲ,~*_[hw}TC>"ɷJƓzC8?q#7/ę87hH%}om37|=?σr=w(?Ǐs<=uSΏI+o%S ە_x>xGnsğq#NC7'q/*!_%8/F΃> t hpW0~e w]k,;Wi⎟yǹu_Ņ|doEq -/i`T~ uQ2~ncxE_e:8K^(9ˡo_2yw|7g^y{~4}omlV~/qqxWyxMvms]KC?ƙzuʹ{}%~m۽1qq݁WyK ^a4z!oWQ;έ<[rW'c؋=/Mӿ9/ϙ_xihЁ~bEOOA@$Us7%$W5^m?cyWgWpwB!IrR2~[P@'6oE  [rul %^1ln%T+Fqg3_|?WyFWߴ'ro.;ם!7x=rajzC/\Ə矰eUnĢO' 煷~}{^ ^9/4ۏ|_OgZB䊞(-\V57G_w\}秙=׾뒯OkQ>i+Vl6 UL_0A.W]No.ďqs'@5ۏ|_OK鮟%VCMe?X7QFֳK~[~^J/]{Wa` w M^a[l7v[cy <~^9|~']Vᷞpÿ?+<'w/>DS1~;\V?'z^nOs#9v%KɣYq_ |@ *Lԏ-LcAz0~ ?^#iܯpP;7iԏ v\`ZyÃ8uӿI@ۿd'b٣wxŁYKuzcx| oI_a=#_~Xx{U2y?}[At ӗO.L{FfP3nUF>JP=itUɷk+6n/>y5´ĺ%7}}^[ť۽{ϊoy0[(׽qx7 7.ෞv ;}?=.!^}\om%~7{6wM{V-Li%c;x-w+'vQ>>Iʷ7̹L/O[%6؁GVKuAI2~KГ9/I }ow.^䎟~ͼwz]bhɛ=jFNlC3|ے~?m?˥׳GrM~ƃAp|Qx8d̫?xz%[=f!x/qݜ~fN. otnݧ3^9?=^&;O?ԢVhH~{&Ry;o⚷x3._sΌ7ᗟt׌<ǻݻJ$t0}f@P~0~ĝKl?aO{cuY}}%nT*:Mu{ME$e>;3?O[oA')I~IJ}B%_ƴn ӗM@{P?44׃}5 q =Mԏ_7 oȍ\<_|m61 ̿Ӹ3ޖS<̌|&1y<㈇ynQ/"Q “WYwM>;W7pjQxO=K#]om..y!7+C7YTO9` ;HwurN<|hn4\˿miƅѸ3ޖS/ >nMF_R4w/7sjed_e}Y4wxq)^Cަ٢noS6rqd:8d:8d:<`;`cpEПWNq?L_+WN 4tA-`1}57|vc&_omO9nfFSxm3+ʓI,x/\?rCNmQxЉw:~HVf{9llۿ1j 3X>ڗ~G~[m)9LG?MoVl<:g4G6$VO;g)G\7y??l?alx#kΠRh]#m-W<*.6([ILG .2yV̯93,}UiZq[{g^թ_V o)?S>Qw&({DJ{FUr zZi_0?W 7>=0}u3:'x ~ds?LljG4wM-A7/'goN^ߙ7{ۏjJm^ua.AnDL\˿Oggc~5Ϟ;Xwչsx8Aܤl,(u+blb.x=V#@[-ɣm劺Iwl?ɵןÜ Ϟeu},ﺇs'O0:7^3]?՚mxmr7'vx;O?جkg3yGnqv/bf9[#ǁk^ƙ<[۳ӴN nja]6 @a?Qc<ߍ:^w9'_wcq D[㮟Ejo6(W?BD|0}D@'l0BȊ_LAOk>}te\оᅩV /ȗ2}LE -c~x[<:[#ǁk^}owqiG;g&g'"1;ܱ7G= ŏ Wozl=!Xɔ~mŸO};/hK>w'?gN,z6nu0;}s{/wゟ~/}߽/FbQ>aijLSyğ?>ww/Vk'O`v96%qmwӟ>7fO6ostoK>4M#9hC7qN0grJ"ͯ=c$xn1◞t@__޽% ~q{5cN #M^O8;;O?Ę[?v']O?\ /ſ+^-^[$Ǒ}uGD|Y>{Et _>*|aγՊ ~ w/Vk'O`v96 X=,{ϜbX|3ӧAa~9nnz`{(_^hKF7A` D_ gM@BZBӻ5|[0}̈́OCB|0}D_[ MJI~C#^ \{0}owS7~3{xGl1'bL1;_N9{{mg۾1%y ç=~~C8/3?cnl3/̋p⹽us^VyGnݷ]7oS=?{ [|cS5yPs'sX_p]ǯ;QA[#odظF&gerOyS/ K1Sxlgo7}6]{>S ^!_~ {-ͭ#LC7'쳻j ^ Gy݇nsk~iGon4O? w/r"/Oz oq5^c/bh-ʧXs0AQ|^#kwKt?baK8x{8T*;y w ]?c&"ioo)į'8ez>S0}ۈ772%xa_$Ŷh둶\2adql|7HL?ir[9'~Z!_Ǵiԏ*L ʗV OдJ<3$/.1~+U?W4|)?X(jNWE|d:'+%G7 w^ΟN<{ɧp-*7/LG .p[9%ͬ}>SWe[u?qtv8vMl>̮͊xw-9{]6bySۼ6''[3=-~{w8ob;lt<㈿wo;<}=̌G$?{v8u;/X7^˳A{6 ,3AB|i}xAi_ WƯc !]Ӈ5|S~s?βt .0"i~I6rQ)p`o{~/]7~CN}t6Ltבȇ) &HCB0 |Y!A_`,p 7IVϛMWim Jz2}ZQfOn@Binʉ[}('_e}oɭ?k?$4?={^a]6^!<^{KLl7̯yWM^Fno-ܟ]6^ ~.q8Gy[6'scx͇lrǥ_|i~w~ϭxlsj{O?qg*grk6+om~㩇1^_U6`c;\a~5++%g4.~B/f(L8ԯ/hMlP7OP@+k7J=MLȷHh}z!oa~L}zOI1.7< 6Ѽ Fvl<s7Zw{(\Gݝ}XQ*-ot]>v"_+_Op `_QПԯ*+7W+>oL@y>`vY )$_8 z;P_kf{8sz{ [nNpu14^vWyoO:y 奎z> ob<voM|緟~ϭk?dsO'e݋w{VoQ/|a1;l͂y=srO;_ݽ ^9?}ڛxoS3~q{\X6^7txGwI_/?८*lw.;_pϟ%'ty7f'Gٽ[ؿ <?V}|e|sgӯ-KGWy%6zʏ 0~̈́c0/.6Go嫂| %ѿg0~Ä݇!gFeeW7(\]ԑohnj s  :.+?o*jN.ΟsqbFn|72%O"z7/<[s{'~ǯsXٸfn/2o3{W}k^7lws0==Gsӱ&=xl=?K\Z%}o OWi~o>\XsWi_;C =rKn=~5[Eum] 771:4ƍ7rU_ngu[_{!27'F݁kcxlO;I^A<̌<̌n/=i7zO:7mrJ~ Li^!l/?ɩEϔ!'zk#"1w2M xƩpVnGieHw&׿[E=6 Mȥ[b1g96Np%^@ 5[& [O ӗ4_y ~1PoC>id|~;3F| W$O&>q?EBџ_ ONP~u%? _{βOvCn;n',n͛ob~u'_ig?oԫ26Z>cI Ư>wO @~^L_ŠX0}q~F!дopItVL_/)y1~կ-b \*wJ68Gz\dM:~5ZǏ3=/u݂ Ɣ淞v#Ox=jl◞t37}}ޟXM/<逻F$xGnslVĺGynO;ŮW/nFᗞOgyo25 _y?=f}fƋ];]1[SaOtfg3?r G.W~<6^މ7x's{G?k^5ӡ|d` it=}-lj_ ʏ~a'5ׂ}nj_m$}re ПS+ӗMKTt'8ůK 퍒k M䫙o-SE0/0)J~=_ gM?L_?%Q?o?iCq;Gz;Gn<ϰ3ױNqt,#equN?u2€`:8s𔧲n7ɗ{7 {A{_ gW6ʷ8mnI{@B@0}n#_5'Wh>U8k&AY0~s.+W?WLx}L%,>qY?$+6_;yߞ7}A#io_2AOaяoZ٣Y' Nxl Oν_W9֬Ӝ,#y5=ScJsv>0io߸_^P?oL޸_RP~(iM|glxh ƯkEB|K0}O@aP?v_ac#wΝg}}dI@`7AB{}RAHP0}B#$DE0}BCA_7\V~, on OƯ^Q?j6//HwiO ?|OW| Fw@ۿd̬)O>neĢ8o]7~7npbV۽O:?33~ 煷~EiIñyn?)xGnrimG<̌x~q`{cVٝKwvÅeGKpN x vɵ:Dݿ˰|[0~pnC*~ ⯂'Rio/4vQ?k&P?>$MHQM>?ԯ)L;ft>vIφ!pCۿd?i\=?x^r@ /ýC^![y[6xȉ.痍*p*?g/̧5G{ 6 zM+D!eFܒ:)9 v8̍ %- u'4{Ɏ7x?ʷ,XMa㥮3c5Y֏=0%?=#o`_V_ '7%*̌ZLK. S;%5^}T}޾qa/EJ{W%tQɗ0ӭ omFsmxe$_7_(_X%+~SY a*RI||G OK>/cϟM}|"j_r/2%yےC\G05 ]eFܒ2Sw,3}2 s%~Wϩi|K;Lp0}w@6u MvP?.i"tާPL_`g & ~WϭL7HⷃU+'0sݧTil\kt^iG&݇W0|;~\O$7/@np^/ɩE瞰Oڼ ^sϊ?Gyw.y5%ě?j+ru E'1Ǹ?=̌W&?lvį>e![S1`;lo<'Xm^l[/mG掽GXݶ^Alt;/M]KvI3yY6/ţϔgf B{'~&~pӱ7}6rs q.asjǃOx[6xʅzMg=a+-~Ih7H~\%^hwI.GTf/k LF 20}g tV>>hUUat[ȗ3W|D&' @_{4ⷃehHt7fg&~6?X`!(Afe~R}`CP;'!L#}}G5HW=b N-L_؈=xrP>&U"Z3k LZ]YсaCIP?L`VuϡTav@tY>EvI@W6_^n1}E%K:7K-0-[Wo:ytD%Ÿ9oKe_kf_bOxor_|>6lۿ;öxɞ߽'xls4&l.aOn?oY1+m^lf]bl\7opjKO'ec9>/<ܚy!%- ?=\6[?vGĢOo߷gfĵs.Nm1;!;/m?qU^یS ~璍.x`aXܾ;O='z^A]bN, otnCNtXNn;~f7K_`w{V͋cQo>퐖nZ8/=qsG]|'{>L\]yGms/?i7~ɽ#|&?=Fvήnf_z6ܸSyGnO;)enX=?=fNmQ;y쮒?7nU~{w8qv}<ʼnv nzEх?svޖMBe >>N'ⷃ& ~L' עJF{DŽ}}XƯ`e[ z*L_ؠrDȊnIetW!` *W\GP io_lz^G6- 0~Y ?K*,LieUԏ( ]Q0~Gms?=Cԏ$b N@B1[EJԉCb5"LڠA|ia ?ܰc* |L'U% %+LѓEх郒|@/'TR D |~A`@O+s{E'T81~̈́mD IK-;7ۢZOk5;~[>/_~_ٙvX'fQ;tsk~i ^9n(!;ӏclۗ٬#cod ~I%xa{ٝK%!xGn=uKN, oWVfgVqqXT6/v1O?nS[?`~ovYN`VۼwOrg:y/{ゟ~Co#v#S3ypbQ<=by!M~qi$$xkO>il1;\\6~ͼCO8?qecŎVKNm1;,Ϻ%nUQ;]G+3^?K,'o~g5X K_?.Ba^ * 3|'b_tVK`_A#++Ò-AGV WOgKWO/Y&$V}e3_V` fIu5{'z> 1~Ä'lwNW~% Ư>Yi`FB`FiCĎ&H>wLq%^S 'Cۿd?_5} [?vO=n]35]{#?gf6'p ^a[\]`HfEcww~!yo33~ܹ7M~q{![lF_]bo ^9?}; ,8>/4'cO=`Q۾19Y3ffƝݻq^ܸg9%cJ6{3ߧyGnsN/>i;.Mom/=.y v؞_yHƘS/>iG[uC7'쳻l̫x8Y ܸSyő?퐷ztpӂsœϯOmG=+/ omVﱚݸ?7|6};xp>cs ~q{|O>78~:g֏Y3No~W0$-7p-W ڃ['| *_/mecQ2~3%ϩ^༘vsY~DL_e s*t7`3}JЊ_b~B%JMG4W-q.tV[@` W>O ֢~l`o4\݇Tt/LWKH\ @O70*VƯ@{P?oB3'VDi>2}DB{$ !~A!~3>pt13}w|wA+5gWϛ|d36tt7Mpх|}3}d~Ǣ~ie l.;#:m)$1}D|PoL^>>2WNT(0q܏!~wAO'h5BQvƫ=h_}O83 ŏs84~q{X<|_}w\kf/~ ܵ?3 Ǹ`WremUQ[ʓko $Q[ܳ?1yɞ}>lVQw0O8/VoYk^lAw0?[?oVk? 7f눟 ϝW3 _7D9s'eWW&hsYI+1}q#_!l$z>2}D_O: G%~JP0}Z#_/_B~t^L_cFO5|)_Z(iLH[ ϟ&X]o,ğ }z#_~`W #߈K&Wʯ~xJ{FwN'|d#+،_7 Ol*L&>⹙>AΊ]ӗ5 #;de{Q?>/eB [bʆ O,1 -~T%>io*<0?pqk.[/0o_2Iɟ3q.!/}o_ܹ@x6O?nurV ů?F7.xSxڅƃ7xkK%xGng= ;Kxn^9:3%ܽ?w.a_ݽXrvK߰ $U_60xlrr~Iw833^!qiOauzb^ʼnE7z/゗q޳o;~t󂗹~߹\ůsk~iQg-'|n47z6Cx?}^9p.q|^[7G s^ n4KOg^[?Nlܰןz>d?cS/ C696/,jVO? glt[=fՔ\1;m<^k९[3ߧ/v)'C3omn np<ȋ*|'~[y׼k?s={ׅwhon}\` _{}ve|)s=Y~ 3A{綠W#TONG4tVh'+?sL{'7~BsorAP$~f›\VON1&~1_V˛ ',~3(L_C L64廃=aʷ  8>q|SA4z>2~bï\֠3įWO+ |_-7r2~AK}d` ?߈3&/*L1 .ڗ5<3څ: '5' G8W6<3Uԏk&KÅkF8݇V#lB|%ޣQ)QFw_#ɓ_{zCu^DZq{,rp>ĵs^ ~ 8{8YyGmOK{}r{^9 n4KO<"xp/=ifEcwuwOn?~:=㥯sȱyKO<Ęۼw1!'z^b^јL ?=%b)#vqڭ[>z=aqكwöq7.XG-Yksfk=dggC6x/?csfk=d{G~4nUn;qglςzuגo^![tn4q}Sy><ݳ Cy̙MM[>fc矰=x6C^ oݸa'{~q{xGosfWw-;J٦>xk%{ś6f+^M~ {'6mʏO >ifƯ`eA~(ğ^Auo/ ~3~e?~y/_٠2=NtWA0}H#"ѽ~D!=io`_V` ~%?_3/.0'ʯlK>A@BPk&D1)/.'4[ ~uP/ Ưmm8DLЁ]`-q&(q"ߪQ0}M-S?;U~>T!߶Q~0[|g0}u㮿#Tޖ|?%$kɟq9obݑ[>f?mϭ ;76O:7O?~7#w8KxfL16om4Xk>dkK]7'au3*ǘ/16.vB]uK~\X6n9dJ{W=+6^la2?}Spӱ?b_{xĩa\Z%Cn9Əfw16pӱʛ>ruǺ%mw壷8O%샷{6\w.Yͭ#|{ś6vVؚ[į?u<̜;F*i 9pL~q{ ͼ9Y'ݑE ;]G<̌&%85n^ӏ`HBM:vqמ|H xGms|[55xlsh7z{fƋ]7Oo?5/}"_V}ta$8ZtX7HOhO.OpoE0~m 'Vim\*WVڻ6ʏ7Mڃ0~ .D,Rx L/.0NΉ+0N8E3'* ~]-:M0}dCt^-0~@.OZ3}s[F/q\s azFg]YW3+^DUR)jBIMb ΋AL'K gV|L`ԏ b|e]ޣQ~NA{@ZP0~݄FV? 5YE&pIYG%ӧ4g+ ӗ5|V?6͓e0}F#0(Xh=QޣQ/yd?%=N+s^Ecwxk;[?fo_ܹ~'~'~6/C9wxGoq|^`H^![*.16.fFo=/?iGE'zF~#J[=f.ﱿN߮٣;=+xmr'sj>Fco8(cwӏobǨ?=/%5ozD_[- w6gWϽ|/}ǝ]O?nZpVt5^[<\3WϽ='ޟyOZ}{= ~WK!ԏ'GVl{&3D?Œ_Ҡrn݇Xk&pS?w7p-/-Ib \' HWti) L_ȗJ `f >Y VtTihE_^+` `t>&FAu|`+zhojV|>ApYDP~9޷Q0} tաCh#LB ߊ[L>oh-U 57~^e ?`_T_ H3}̈́+tY_+@kQ?WLqY(_]h(_Q>g5[ 凃IF7xQ?0}V~I%_Ph$︰W<zo_2 VwÝ?̮9ÍoH omSꃷz ӏߢycdzff%xns|Qݧk^![~'^/q팟=Y-S/ S 7-gZWު֏=F'vqo^fqx?=Ԣݦ{#o-ro?^!?|u3EP~)GsrQxGkO9Wen`~q{>tGOGxGlrjQ37~6! ~vigfC6`gcxԙ}>[}fןzް`5+C4p;#;]s-eOgN謨Yȗ7r렚l.i[&K [U~ O7Np-NQ?0}lR+ho&ⷃ+'K?vO1 4f5~~BůL]~tkb `҆_6Q?{|DkQ?ׂ|dtTa+͠|g>")_^>gכ#*c~bG{F` _z]RL_8/gA +lOk[EY~qP?S~Q!~#>w"_P?O768fDQ?>Q0}D)/)f٠r0}AJF'5 @ACŗy<zw?%-7џ8^硛\UIsY pK@7}67{3y ~)<COvC'socٝGܸa>q+ܸෟ~omݪܳ?;vܳ omN, yM ~ܽ?pj/>i4J֏ݑG OhL1;_Gݽ+j|6lVt-qo?^qa+޴{# ũErJn:w~k>dy!wOţ96/\XNSyl#:3Džec{cى}!;uɣN{VmG NmTvWyOl[?v?|O8Ryqj%߫޲llςzrqyē\]yGoOoW^ ~{?+7̫yڅz6m=wǍofo?xiOCB;1~@ g i-qg0~Èo⊄+3oL(?o+L5iwEU~"tQi/q ݅=|@kQ?~Dw 'U 13~m S~.ڗ5% *#TЁQW1k#.G4& ;&C7A ~dgib KQ0}lR0}/ c !}j~L%_/ӗ!{D|~i!~9wJno U_8A>t"_ď h_94 AF{~+ ltUi([h5o- (L_hLو{>id}twV[-ߌDKxs˙|5 7.x8xGn}%Ƴöxɞ_x>wUo%s_z>xGn񧷯٬w]|1r~͔gfh 85ܳn;@7x=sĔpNoYGqW&<34ӏ`Hn:&מrz1nI;\ZOܴǷr7mw/+#^ ^9O:7O;gص3nX=a~O8oYS3^/wWq_ݽOn_rvΫܲ/y"_+ 3_ Ư~QC>@BJ$Ehmܯ~mAh Ư)Tj&GwxL_aS*E_Y>@BJK'(P?(QhoOj/~/]ȇހēDJ|~n!6&L_9Q?7b_hGVthlo) Aj_9؃*&I{ ~-__pI|$7UhhܯdP0}DЁQ7KW|mDP0};P?1a &+io;$/~ qe_D gr(zwnn33^!y5 tјeo7mO?qg1gfC6]6~ql{^XO?`v{V+B&²#M~q{ ە76wғɋ_3²qcxꅁ_!<̌W&c&?M obKpv ,xP~qMUJp_޹ COܳ?O8 m^ ^9)r2==a8Qyls4~%ys~ܵ?3 1;G pߚWyGg8H\T#za+f~)3^A~i䗞On>|߹']7}6lޟ;Ecw8({0Əᗟe-3vqq_޵^0+-m}nƷxSS'ę?ttă흩/ 6-5#1}c' 6-_ʗo^>L}}hG{F{ x(䫘'|߉q|dek Sl&~.1ӧO\?ԯ-xnlFwC 탓 # a7UvIڻ%s*/_٠A#]Q?/f2=Eԏpʌ_7 (Y(?L_ȗJt7ԏh(_ȷnLʷʯWM @O:%tSEv2}F#~*__WH/lP!,(_䛘-1~McFkQ?>#`\t_Xq|k#~&_]KOk .?3+5M&T#=!> !lb|Ze ?t_WIMeB{!n|7?uD'<~9/W{n9Ə]Gyl{葛ݽCwv-͘p}1/- 5|6wϊ?c^![b z~wM#[7%o; }?76CvAo'so6_9j@IP?6i(?^(_?3 maoE0~7L!ӗNP%tQ h;Q?2}f/nt>0~\V?(Q𵦽MR/L_֠Q?a|eWI{}d'h!#1}DBl0~',~6b ?ēD '`2]C*Lf7~]aԉ|}=>czF _ٴh Ϛ 5 F>~??܌_=i|R%߬_=@BI~Z;Ə4A_Ҍ_:Aez>oLи_k`-8eiР~J!,hoHL01gTz;>D{}P@P?Gc\wyGo_2Q 2wWƂ3|1'pV/?y/6_z6mς}f%'q[>zY?=HƏئ~In^pfkO9-ݻ g̊xaVO>{xl?|MO=nu3;۾*~C5!xGnj3xlsz[O;h'xȉ~>/v͌q>g7x݇m"o_k6;6/vY?=.,%-ÉEgϹyow;om4rVqӱ`%ݰjJ9ێuCNtljXf ;<#NlC69Q'163/壷jHO8Ɲʛ7z@Wh~]Y(μګQ}JXO+2yQ?2}~#_!n݇% tRL_:/f746$t^OP|['g5)MM b `/K > \׍eKtZ>o0Abo\vTd>(?7I^0~DLP }E#ig~aE6&AЊa ?+>3~{7{$Z|D~i_L0}o'$L ~a! )3}+1Op8Gtk%bld1}̈́] 7%n0}YC-OF3}][@wCa υ3Yԯ-O~>Q?k"_/+3 AA2}JK>0}Fcx;~g~8j2K?λg͇>Y^|?c.) w;<ͫx ?=focZ~<{&7qi-rϺ%/~͌G_3gk=d3 7lU~ {0p˱7~-ͯ?x&Ewu֏7ێuɢ=PC飶a/Zwpz&/P?' ? U0~È2Bn U OP@kQ>) ڻ'zZhƯlhKi~b +%Ӈ7XA=YL_0l0/K&eLTOOlP?q@7Mԏ-kI7Ϙ _3Gԉ&| GU? ϙc @ ~9aSE>5zaE fƆ5# lU @FP'K 7 ~*_[_9QO;$ xQ~4(^ȗ3M+>BL$1p[?%$nx7a㦛8Q9w4!b;ٝK^/{Ü>wO<̜WyO% CNt-.k\U'퓆y&~'BƏcO8O>ĘW}&:pu3!xGl=O0kO9`oc]K^CB0%K6rLf~I NmG=+r7,xSxꅁ|6LIs٫?hYE'~J֏A ˉ?툷x{_xi7ykD<逽umC_}g'$xGlFw~mF}Ungυe+-j펟{>cwg ShL߮öxȵ[{C37xGn◞K]7QOn?%3=?}lVQۜ_N)![/>) ._xWT  o<z S*' P? /`egɃ]Q-'Cۿd8q~?e>A ë=h/>cgz~ ܵ?rWiݰ gyɞ&CtnƝ?b>L\UyGl Oؼ7opu3/wWq~_߽e_߫?xf}?}4/{Ü~O=n~)MW[>f_S=p&;\80KO<|lςz%Vy܍ pvo?=d<|߿u?ܷbgVxnO?n~΃Os0qfOF◞t{#!f9%oW~oclTOGzA{~q{\X6̓|ܸ3c9[?v.o_rfypӂycjјo-fEpO,;A[8q~?e>A CnO-L7LD DeCo)0 w5;'GthlE`܉|5s6WM0A ~PP~% όVP>I7 1*~H4 GU' Ai2}B~~NeFUD;0~\V~(ŌKtW`L?Q?¶a)Ư`/ $LW6Gt`"_ԯ/8%ާog lݧV| ԏ>w"_\f_T׍!\;~Lůfb NnGUXBDw> m}`33~tS%az&>B.q8xlZ}7oW~i<v΋_;]w8Qyl8C7ÊݻocC5{ ~Ivi`^~6LܰsOcok6a ra͔<'pNk?d{-E1+MM n~{q5^/bor&'^9J&8 '6Mo ~y3~D<9(; :G5u)OmpO옾l6~a%">E>1 ԯ-hMW~<(PfƆOŠ~ea‰|EP!(?QqS@BSޱQ?1` ogVnӗ!.Vf :.'Q|F{}DE+1~Ä5|o!_ğ&؀M@5W7ʗt 8׎4 FIsR?/'5%'@{F]ѕ|CkEtQѝ}X}r݅K_U$+hh7oEU _k)p[0~{}Z_`oO=Nƫr_{⓹mޒurk*om~~yoc?w-XßyFuw7{wHCW[>z3?s#ot{7~6c~xGlǷxu q7opbQpo`h%[}6/v߷\ 7.n ?s[>f3w<=& a̙/>qF Ģ}oc?} om~I=x[6x53~ s0om~,`gVx%??Ioro6O|27[ZTo&+탓 ~tڃC+핒  G@P?wïIՒ~B!_6AD1=ImK*mD0~lGJऽ}|_P~@5~(ew}DtWLp o, "IFljc*>molp\v䫘1 D1nL@/)47k&8廃ӗOO7|2{Q?5s*bFkԯ,xk'}:{'c $6iѸ_fP?>:lv(/nap$_о~je ?ʔo~q~R>eKoo7~$_}op&$x;eg۽Lʓ1`ŎҼcw8/>i4M!zqoYfνkEm:167y67{W=+v{מ|17*oJ/>i;.\UyGoC^/ӂSuw1gfs%/w?K÷Ln٩mGhfݻq›>j;G~JVo=G͹`b ~)#vX݁_y6]YylmG,_wOC7x[=?}"1Nö#'7{6?= o?R7ٛmnăݑ ӗLO bfe:'T` LNET`I1'5XA؂_ôwLO,˘n݇W|ƌ_`0ABY6wLWf }d/ȗ3z>L(?wL$_5_O}Fx(ğ#t?|9޻{E!0}lXA&h}jE)k&z\7IW _gׂ5gNAaF eӗLo(&#$Q? 56t GVI ~" g9ݧU"_5>Ap G-a +g6% %o_ !ԏL07A9jFI Ưisq[=7ٛ"̿xigsţ9:!;$𳏿ظxl= ~om]3ch5YO< m$xÇos8&! fUSYT6/Cq0$MyzƓcvh ?}4x;Vy5~?'z^$7w/{Vt>z=^Sp_ݵcM= _}]~1N }n4 <|y}2u#N3{Wl[=f\x䩞_x>+ommG,-~i6ě=j_x>is|&O?pjQxGk۪ɣge~/9?K Zf3~G~ù_VIb _g.[Azi-Gt_~rE0}̈́7~Ug&耄1G6W؇B3CBZo>BW6<3:C+:+7ڛ%Gt!e :+.o_+ K&"_>wMA5Lb V}DEO4e s*ڃK'(PhMtԏ51}Y6[}jNӧ45*~xuiQL @A6f ~R` :? WI~0}DBZGk&<2݇TQy wwKh&Ai% 5 J{F郓|D/Ov2kpNy&׽Z/;=ۿ˙xUr7.xG+z펟K~Mtl=a'^!|3{휟=7 }^98-EgϹ Wy~mF~IC7vSg9%]olzxØ}VSrv FG_;xoXrñc`h̪pj)tw7z&>G7+ݼ*?}f^ ^9{ϊ?Y ܵ?3~{0qlcv!wߚ_١mGkfEcwpԸn3Ɲ~&w“i }o6/>逖O?nuKN- o%/qݜ~/~휗~?q4&]o16.{x##pv #N- s?5ސwx5sϊyob;<_ܹgz^A's[RD{M2c_ J{"r5^c/b ]/,oF|+ G~_^П>mʏpYΊs'⧂U  4pPP~(W4O/) >eZA$ڻ%:+1'g>m}\quAD%tZ>L@ɕ|$B_7 gʷlBB}}XQ?/sDw""$c bFM¾>$`kQ/i/B gO/nE=YL_SEJc#~0~HHkaNqVP>k'XpYbP# D_q.7Vl7L7%ytSO;$ڃ!|޻ԯ*P` pK~q8qKs-_5KokvVhL~o/1xkgM8ln\r7'pǥ~0gec-~qJ^>sOʫ?x~Ѽ÷x_~>]xkڃ6`矸ϋ]3㥯_ӏcw CNt<š_!}oDžeĢf9%W|1cw;xkzq'{|nQgz~qLi6;֏=ϭy̙?=ɫܲK]7gcx9vƫ>h_'bLH٣Yuە~w\6a46ar%ظ~W|o-.?}- rsG|!f:[y[6yɎy ~ܺ;?I_1oZ?}3?b_{ }Tŧ` @ оv"j/L_4/gNC 8辴0~݄o4 b uP0}91~~ïO ~b"~:*L_?e An2}z#>=b ?VQ? f\݇W{M)/N0|$~!vCBY>q`0}]'M|C!_=>A#Op a_^y˙a*:/;' }BŧVL%Q?5 otR_|i_9M.+^_74|9Q?oďs=o*xNC s*zqg @[@{F{ N.hHӓ|l}j%n5o# =1}N#_5qKD._åkN:o_2Nw/~Mۿf?'aMůK#'x6ޟxĩqa]omzaQzȼC6OK#{ś6xkg8{8(c[Ƿplw86o;֋#Mlͧ =|"{b5xx9D.=/%vw/~T>>*7IoIA$_!_[>m"_ M=vL34A` ]*Oa~s!~$>oob~囃#bA`"_蜨Yhl0FWWN 2IJ5ְ)L4/c⧂|)3}E hwEiƯ`ʗt>i~b% 3~a~b!$g0!5GU؁'|ԯ,ь_7 . 7 GB{Jaz@ wǃ5H[E,ڛ4'Sԏ.p>,WKU3}rCIu՛\b ODs\#zo_2N~P n~Ƿ'z^?av;<ިcۗ}+ݪţ[x5*Ŏw.yҹ57T^[cwgݑfΫ?x{~ ;7{6o~#ra{fk>dU'z2Mvo?^Va9$۳O?C7I޺qN_߽5o>}&C٨iz6O=?2pgxʱ=>µ0||cALP}DJV>;@r쑏 6;o_29 <;͇< X`痍xlsȟܱ~]/ή;lς}1~-{q›=z_}>omz~޻A;l_>rO<;xmS)w~[=fǥUplcv[xŁcmCHli7͙uK~qOn?e=?}^[lg,{wx}v;GgϣRظ&06 7z%w!.}q!]PTRftA&GtZioj0B|9hӡ~bG܆j~]>+:i z>B5Np7hwI!'W؀'|_[ 'P?"nW6| ⯃||WaF 퍒|~}{ =YtU774|P?>&WOtt^aOJAi wN/#? ʟn4*zL_]Q?L_5G=Qԏ4&+ :/@kޱ}REq~e+>'?oP?ēo|u>Q~( (_yX}>X=^nyT 7CWi }ow/]? IWןrJ[>z!}o=r}6;֏=<[wG[n=F-s'~I4[}6ݡ/=a7x&ޭĢ6ݡ~ܵ?7yś6{矸O&6생YO= ymGCn=fL6C^9*Kb܉ٕ#1}N#_='QL_@BB~O/k0 :.1ӧ5ʯ /?d}8nKnq673P<}}owXs/wr^/<0'{~qLizDx!yGncO^7nW~M_[=f߷[ 7.fKOg vXNg̬~/>;.-Z~IlQۼ1vfo<'_3=-O%y[6~2޾)\UyÇoO=uɟqݰoY1+'z~ ̓wڃ6{ĵ ~qh~6 r~/=w!5[fO;hLLi~q{_6|Sίx>~qK]7w~ή۾16zO9Ucvj1z^{ϊ~/=y7~SsOܧ%u8X'}l.{[6x\X6~q{xrX OW;v)_) Xs/wr^/

=)_H~?bG~]CdaW}dAOӧ7uJi`c `Fe[E䫛 z>ytZaLa& (_u .Lwʏ4-!]ӧOAln ' 0l+\#*\O\VP~,C` @B`% ~t"25g?/7WkO:_OX%pxKƵ:l?z^A?챷N*lpfO< m^!,xĩqz%V >rG#rGyxӏ`Hj7nW~)<_3%_pdJ[>zk*~?sɃw#i ?K_6^9:3SέWlςzC^O0=w{0Z'whNoTQGM[5rXw-(omᗞ7|697ێ肷~*;O=ĘY6a %^ylS~Iqi亭<|wcӏ;^!K%5[=f3?xw !?}47lw6ۏx7' B!~q{~om>cfΫ?xuӏhqnX?$7lw\Z7~qw=_?;}xW5^A[~k_u~ù_fP6i, zlD1~M .To0A)|d> _ Ot3FkQ?>'uLTP~0}wb*{;iՈ?+0~݄fʏ. #  F ?ԯ(8 ГEJ_#0~7BJhh0@ĊzhAJwJn肨^%lOk{EЂ.^|5}tQL_e|oי7xξ34e뙾&[o_2Oz oqÛە7{6n4raNX7r7,x53~.q8+o-~ .MB7zە{?=MÙgυeC7|69{x}&?=/{o3xno=k*omJ<[wGvnZp8 z@_[?vg:VYtb5{[>z_~>g[}V/Zr7,[k>dǞk~Hؼӏchɋ_;G~m~IM_[?v“έ;cى|!O:Ģ^7,'ś>r'[;O?~o-v/Zw ?|3=9(ţۏx7F]5r7.x̙?{ -: -j\]ymqǥG9O%{<W{vJ5`h'={㷸ވ[n NO;W0 /O #>e[Q?0~%51}D(Wfg Ok' ~f%@LȷJk&0s~~!~3hoOj LWKwOC>شi\v݇Wim]1)]G# =AF_U '%.`oBBTfϝ @+SEb2}^t#:t7H%+:ӧ4 *']B _+q ⷃI{ z~m}\}pR>ix y{F8e~j-3~]7;Q>7KO#y0pgnk ;} &o_2{Ox2os[wMC6y~?sə[>z~O0pWqݸ஽>;â?c_ݵڭ>|ˆ }li.{܍ pvo?-<̌zƼo%/uݜ{uە>sr~s!~Q _?-%}xKXw", ϘK%k~ӡ~D)G L fb{H\sݛ>oKaOn~֏^{ȉ}?==X>b_zw̫xoYx9/~݌y>c;<ݰoO=)^/タw?Y6 g#3^硛.?=j[=vY qq7v,xpAc{.16.{o0^ܰOuͥUo?"om5σ3yɎ7xǺWqK]?g}?9`~.q8W{/qG}>7xk\X6~{÷a[VI<􌿿gŭŎ{>SGymq>4ĵs^ ~ܹ7RBco=|w;(cwpǥE'_}>O80S/sJ_|wy~X'}7?y};oì?C.Iq,~/_Tl/fA9 ~@{P?}#*(?Op# |ݤ|_|w0}Z#_7(S($G6tV71_ ԏ@+'ӧ4t7ԏ'XpY{"_Q_O/f>A?>+T|U ƯMfPSf 3W7eO~_1}nE-*FIho&݇upŒ_1EJJ2}neA% lW%7_"!E5t>2}D"tZ}b܉|5=^NO bK#7Ûџ<1̿}{oM;a淞vS/ \YyG{8IJ76g'#n9gj2omqq^S=-#93SSxn?$aźO)yP֓'QcLNo?}%=|-vOykg\U'ck>dY{Fᗞ5x6cO% _3מ|.\]yGm?=M3^A\Z%?K,Gy[68zt8sȯzY?}VSpV-٣>SyÇo;k^硛\Voĵ3i%/v{ή!\U[Vo-6|cgV/pO՚M9UkO=n~aq ȷK 퓓|DUn&}|%KA` |޵.Vj;% ABN2}ZCG~D [0~* _9Aԏ(S` NqYDP~#>Qoo5O =>h3t'mF|=Ϛ4[}| NxP`NpYB+"_->'TxB4=V؃3z>G~vaFiP`@/fOܙ|-ޣ,{}h%=ioh-8>:l ?[L_yۿgn͍ofΜ Ka)O_Mn~fvF-_ݵ^rlcw{ŝKzۢ/◟ g6 o~{\8J[,n=7{pvq#so䗞t=j^?n y6=F 'sfܦ+0O?ndQ[4S?=..yoO9 œ ~ӛ+޸O=nuK^9:sk{휟~͋`a'{^K'~}_~>xȉ7|&GﱿN|ŘgO ='l[,'/7r=|;~q{>xa=~fݪţ{G sn:qM;wϊWeuN~/$Q[ܽ?w.?|Ww/ۗud6 ;?sɟ?c_E.s7}<{7ޚ5gx =Yԏ&]Gt6{$VtO'i'S?}L#&Phok3  I2S6|x}b%'>` ?ğk gLϮ&Uz o/L)?~&]>#3}eÏ5ABF{DGV8'* ~?UI3}]à~F ff?c+P?qAG0}Z~A!&~יC+5pAԏ+ۛ L!Jko*pz3}bYF>/a{'7  :+bzw}ϳܛ5;vw¯p۾k~[?O]O?bщywM+ܸA':~{ g[=f~!w\y[68>/96/cwȯ?cxGmqOcl'z~q{\\6fE͋plړyő&؞W~;xlr|l ܛ8(٣wZpCN' o~ {\\6voOn?U<~a2o/_!O0pNǛ>r'_O?b ;lς?|!{k6+om4?}..7*oJ/=iY5Uӏc9%M6-{~ { ^9?}Mt1ǘUӏ`H̓~wMSxɎWigK\7qk?tF}<~7k^\86_ᦷ}+^t>^-i"t^˘Uk'X#+'LB!ϟНJL2}f_C P? oe{}xEw&MM|I!S2@OgMԯ)䋛` U(T|2AB k& Gt>/ 퍒q ] GkO}L=EtYa  L_?PI⏃+&''p/5\;E_L1 ~WooG$K ~t‘d%-w) e [ &~!7Kk~<l~#M o_2˻Ο9nx7a㦛[=V_z>%[>zIs٣Nxś7Ecw{V<욗v#N'Sob;矸GK8(cw8yɼ ^9~q $QܰSێ{V69l߶i^;SO:`Qۼt<=ǘk6+C6mKnvw~k=d_}gomnةK%g6 o;h(oc,}k~Cg>5瞰}x;VYŪ%?=.qM;?nM*-~I~i@7zoW~q{\\65x{>S37~vpC^!ܽ?rj3gݒ rwq#OCsox@<ԌaΓϯyś6/?i;Ÿo 2~WF[?jG\wÝ?soM7sP?EE1 '(\(L83FP>Mڛ%ǃ` / a zЭOk' jOEF{~mAO.A|MS/*6|}x}h#~@x?nG*Ӈ%A.Oʗg7H}bE-$]$Q>cE}tEO6 #6W4hsP?s}b;P?~7 <7OƯ Ne 3 w5~.p lxfDQ?7)On/K&z-s݁~/~ů ~dů||{'p{9ZJVCMKaܽ3~G _=yGc[O;dJ&fщy>c37T[9{?rGry[yGo3cVcwq0$>3ɟݹ/\r~&>3[7yȉϸ8w-yĩWi1S/ ŝKJ[Lom]Spd_޹eo7/8wظa3cQg- ~['oWQ쮓yC3oW^a[K^?j.qoQN^{w/x݇m6Cz^%C?uozl=`VOnxS W70W|faihP?'|s0}]M[Ưmmtԏn@bP+iݸ_BRoL(?UM{FFP=`I{WOtI .Ak^/>wIKt]ho ڻ7LB ,>;E3O0cL_Р5 VP>O|~LE~_ʏ탓 P?7OWP~*l/nXAq.F8:+womi5/~94L+f 6L+ڻ' ~zb=n'ǹےc\}R %Ӿ^>>8}oW~q8 E<_xo0?k om~ {.7xl~q{ ɬ~NltM3v~eo7mݑ_~>:=㥮siXO淞vە6GCQw~^aL Ls4O8w.yl!z!";=+~瞃?s߸o\pǥ_|i肷~6] ~q_'M{fegLHnkOG$xGl=O8;w-y0W|>j䷞v>l|!۾O>On_rGylO> ܰSsq cvxG{<Ԍd'sn:Ə◞t{#;>v)o%|˂?=,<:;|{3^A}\|8o.y`籏@ 1}Osn+ @0}fCO*ӗOfS?؃*4 )'Us ~3~D ~8>'V8e}|C=M`UM{FA]/Nw~y3~tAtQ`)ou~e!~.ȇF>Lg|{}xK0}^#_5?퓓Ao|}@rՠ~iaFjrYB̊k%tU6񫢽SR~]xy~_VM.KZLL0@w@J{|s~;Xm]ގ;o*0~^E̿ӿ{9+<J7okz~q\X6fEgW+^9;go~iܵ7*l3=?}.,5ě?zS=a'N, omcla'{[=lap,xGoN4}\r7.a/Z`H..C^99sO<ŝ;@o>G²ӏch/-y瞰Ͻ/{ÜWi1`H^[!c^oEEP~,f;_;ôǍo~MOlQ;['omn8Ww/y7zvaɣSxʅ55[r"kOiFuzf?o>퐗ncSc5%%ý#w˱7y6}ϒ?} cxkviSus2gr[>~q{Li^!<̌~O8;p}&ivןrȽo;ɼԻ=n8ͫ=hyCrտ=n| ~WϩL7HWb *ēD# UM{׆HtU>}"_`_^_Ok&Z1A<1^}HƯq+ID0}e7+zf§L3 6X_}P?2}fw _7)?_.t^a&hCBBN0}@#5_b|M/-{$4.pƯ( *CCӧ4ʏ3 >1#ݧ;7$ _)?IɀS#ϲ+6<3 & E|t}T7u-/6̧Ӕ5_;]_yDM׍k^9:3gϺ%[}Vwo=䎽7|6Gcn=f-ßq߻oeo COvK%}o }.Mcw{׼us~iܵ7J7-xki~[}֏w~K_`މ.O;<ȣNxG-cٞC~q5]3 g96;%;KnxGmw!f٦yԙ/uݜ;.Bc{V,Ɲ/<+-~񗸴J$~)GpjQxp_!ܸSynxvWe{&j_~>6IƏڭO९7oWw/ۗo\pv\?n;ּcv桯R?l_x>^4oC=DיʏKu o# 5r~ff膞$GU6m|9]1}@#50}dGU)~iS WMfȎ&,a >>f◃#A{FMag75Յ 4>; o޵ O.7I4Njc+fډB _L_4Yio%_A#+ 4>ApY- _k[ ]D> CFIћ8'_3/ʔ-L_̿{~;?F 1߃w7ﱿNowǝ]dQů>倭>xz/qW{~?s +߼K_?~)MM*vaS ]y'[;O?Ģ֏KCؙoc*9(69lQ;ܹ7rixXt[>f_{wOnອ=aXtm{1'39>/ţ{VusG7y5ycY^ؙ9}4=oM~qמ|1<=eV6{WKܶ;w= oRpU/=rO,zw;~ g~#Q0}}}dEoԯ*pn>8i(?+jNʷ:f L}JE.Olk&GUu~C'&I_XaWL1%tYɷJwB,eO(k#J/L=Q2}b||w|O/k/`)+N$iЭ~DӧO\` =Uo(af w}B%_&P'~BDBF_B|+.B!4όnc IX>2)_S$zvRP~6l"_ f ׂAYRoL>d,^6>7Oo_2Nn}p[xtjQxGoKOaC7~6vݸঝ_x>!xppⷞvOxo[xM5~{C6y̙q璿{ɛ=r{7 zlV1ۄ/=i/FҪ1533J_{w퍼C6)N, om~-3x?|ޭ53^\\6~q٣qν_x>iXtm{UO'mfEcw8(Sh oMSh0M-y?=֓yw.yus^9?{,w肟|%m͓ίy5s#^ ;=?=~/uݜWe?{[>zUgϔ}&~|_էb< Z˫8#W5õZl=a<*'/j+yi҈ σe OmOl [&AfI{FĊ_0z]PNe 3 4rϚȗ2 a!G77Tڇ7-2i(?*Af*$4E>t\/(61}Zϩ4L0ᓦ~n7LnmW{%zʏ>t[<8 Ё>ޠ?io$bOŏ =Iԏ 3~s. IB>w~fwq}?Ǿ g饙>W1o_2c~N+sNc8# W|ȣus~q{i$O' 7xGn#CXǛ}y~גn[x n4O' =f9%?=k>dǞlX7SCc'16. 767T#=xGol~q\X6^A tom~=yGpȟݱ~8gϹöx~ 쭓+{ϊ^;㞃KOv.Sꃷyc'a18>/ţ;-Gt7__Uᇛ ~!~JME0}\/f 's~n!_L1@gE 7pt[O 1L4B{eV7^n;C{K??SVwÍot1xʹ5s fƣ'qv<~!ylrrsOclpfᾃ/>i9(cw!~Iqi'g7kotܲ`/ܽ7S=?}yGpVn;oYqǜ;C6H޳^q˱W&?K < ;|=35eg̍;7}6i'sp⥮ʷ,XOSĥU">b<~d⑧{o[?v./_ܵ^a["~Ipӱʛ(_Q5ބ+Q?WOQhP-q7gtv;\a_\_ ;$I~iS~8 Ϟ_i& aes}jeFVr݅~yP3K6z Aԏ+pqs` GVtv7ڃ|$~<` 7N }Rc]n};^c},]o_2VwÝ?<ޕ~c7z6cO?cM~qؚ8l qjO? o=aFC5mU;?=^97ݽk^ ~q{b “koUna'{~q{ ^/ェێxl3/SxGyymqǥk+޴COt8Qx7;z^a[y5:=%sii.'[w߱y֏!?{\Z%#xб_yomXǩ>~v*;O8 O|s;yo5W;y{+ߠ~z3f8_L_7AB|)S_MpK^f y?{}X}U)?S?v|ka 4 WIע~Qe*LЭ~Be ?ϩpЀK0}fC!OL0k@O+Zy|$0U@0~_o* Ư5)xGpfk~ omƝK^7q>l_|痍~+߼ ߱yqīܲƯ>eyo#~qUnp-{~ {1;9w43/c߿oũ[=fo=qgW5s^9?}v=y&wMyGosfo?^qӱ~&?=^-ᷟ~cx[6l̂~Lʓߵ[|w?k*o-43 n4=)[!ͱyKO"W"~wKxeF\m"ğWLv}d`nKtQ>:SEQV><(?%~9_Zȗ64O*}pީ)j \}R#~!(Tq[LwC_L@\ljc*mA =N.Inc`Ƴ\GtWN7ʏC .?jh|Ɗ\Y2;b Bۿd?d>cFcw[9wxw 7T9{8a ~q_'÷y񎳇?=Z¬y[瞰Ϣ ~ö[-:ܾ7O: e";=k^]1'i/v͜\{׼s~qy]OK#Ncql+#6mF'5t:p}XMUuŃwݽ+G(v'oW~ܸSyGnkO9GUcvhO?cY=#Cꃷ~]~Ww/yܳߘUO-͵[?s_ܹgfC6ޭo\pVeoH{fƟqk2AA+Iܠ}tğ)|d+Ea|$~:HpŒ_1!|c?_[$ǂ~hA}DEwI.] cQ0}YÏ6ӟS+Ō_9QMG4TQ?2}D7⯃i& ~xƯ`eWtRɗ0gMJb]=_ܰ'/ bU81O#3 W[&c+n2A{nWWƯQps_y7b1K?ȴ3~Gy- jz6O<1;<욿wʼnE-o>/ě>rk*?=/z93cO%GSB٣~kO>pL[ʓxosk5۳_?q٣`ʱy! ?=Vyoz-:^K^?}SVFw~Ϯxpf CJ[>f]}l8QyGoO=K#;YxGﰚO?~qcyŁ_}!x{K_?V/;=+%5ě?zO{@W[?vgϔx찻~qī=x_n3cl\7|>#}n:VyGp/>i4=t\i^Ou¯`~J% Ư @bMq§'TY> 6%6UƤ}esB?u#ށy@8_Jwq>f|l%$uEO^ƌ_ @O+3'$}L0}}#'(?k$g78 GU$څ`|F{@kQ?M\v$GUAkQ?h(_Wk$;1~ hP?䫙&ExeA _#)W7Nڛ%s*OC ~ xڱ`7pϡo_2lsϯG>ټ& ݶM٣?}Fcw;<!^atGGqۥ76C^C8c ~~ v#?=.Wy/?iʛܰ]7Ϲ&ןzom"=Ow|[fNq ѭ7}c6nS+Ȥ}@ ~x%߫(!~A!~/t/m⧂L_c Ņՠ}H#_ԏ/OoO|ڴh0@J3+_Q nFS-S 'tQ?޷Qо`"fO #t\_f :W F :+Wڇ6gK^|_/n/oxmwH|_Xfuy H]?/O+t1}c' AO# I^0}]gWʯoat>fƆ @(_XɷJw~>Q?0}FÏ5IJí)n~Ƿevϡo_2v8̵:l?X~C7v@W[>z]ڃ6xkgSyxn'k^/タo_ݵv5[S_z>6C6XO?~urnCO_6nE`1gfus~q{Ecv ~qi5cx5Cxo=O?~d^/u~{dV[=vgήߢ~16{O&r7.x5sj>nƢob;̫qq8>/ţ{W,W|<|?퐧_y7xk欦ٻn~Ƿ8w?p7zF0}D aOnh +k~}!~*> @|O!&iԏmq"4(_^?7|_ ~'ÌDhO&~!(?L_3Qh.Oȗ3 AA2}JCBakށ]f _Aɳ\#*z_[f ϡ~|%_>N>g1GUXMlrYBT>9_BRоv"jKh (? /#w 0}D>hv7LA@||W9|5S9(?[}~{ߖ@ۿdVwÝ? l=\cx3~M vf_y>om֍?x/{ÜWi?xw 7}dnۛg3^硛כ A|@O'WaL@jPW6'5 ƯmaAF>Oԯ-k$ہF>n"__ekF؁#+5k>|ݤPP6NABZ9_;LZP"PK&%VP?24e Td1}N8O:S?13_}X}@O#e凂|d~]a ?0 'aIjr`&k$ }\EN.+ ' ^ I{$ Q`L_5~Kre^ 7/Zq(ގOo:ǣ̸iO<`JZd^_}>6rgÉW{۳ןrț>j;.]+^ ^9}~qf691XM<o Eј;LcڭJW']߃w6['W-q\w.(!Qۜ=jco`7ⷃybkx' 71^OQ| U؄3&WLP?L&S?B&(S{}fR>)+nIDa|5/*f \?'WG6[&Ut_ GN X ioO$|=A}TCJhn\6BecKAJ==h_8:}7wwg[t^0~G̿m_7{{-գ'pfkgX7 7.x>~)̓w#y5Cos|^]b56n۾[}𓏻Uzg60kM\P# a$_==~D%[&tb+ kA{F>Z+'Q@S^ 2>LGVd1}N#_-9oAov>1~ӄiBۿdv9ı1n|Wm_޵"m^?=Gbx.͵[x6wOIomNoV~ {_6U͋0O?nvFc'w #*1;<_ܹ~!xGn5[GCriPCcygŋ_3Q9X'c3̓yE>g96u׊wE_[?vNܽ'`+߼CNXM^ ^9O8^VaQ<ǟ]S3^9?}}'z~ \YxGosۥ_y!ƜZ;t!~Iqi`^}m5~ɇ7{6]w,ympD O›?zwK\;nWq ;\qۥeCymknfqoWtWsc/b\JJ{ׄjƯi(?oD|I3}HVSD|.n$~b#;Lk.BQIg,tPNdOohc :I{$~*_8lKtV`WO&~/_UL[6!ԏ/NP'ohpܯ|Kp8wMpo%kA`F ~__9Nj+ y T}T%L_:/g$-f4>y_R3,a tWȷ3b _~a2740 >WJL ~m!~:hho?^;L }o7X=?sMnyMsG^![Jr<~ƉEުOcl\< rO8PCţ9Y'qVǍ;[ܶ;Ww/-`~Is|&7 ]J“Ȅ7xGSo=c= ='֏agV'ݑv:^a nێM͙`~ĵs^9?=.us^ n4O?-,;Kn:gEUay֣14o6n;oYPB!~ {6yylrӛy>c3]VoYR/[uom&'?{\Z%8r7,83!`b~IN÷;]Krxw~oo8{4ӏ'm[=?sMny9~ɗNU&~?__nGU|jկ-}`#_h-D1~DC S ~e޵Q?i?YWdyFa ϩiՈ? W~@L_0#^]b|e#U<7}h L4ᛸ,~]-p@D`os } '͇o/<?Ҍ_;Ag̿R#wO1s[9 Ww-yGlKOu[7}6}ڛꃷ~-wd^983ko\"?|_7gǫ?x)<Fn~/y팗aa6vfO?nu3|'7_~'7}w ~ {ە}!;FMdWɯ=c^ }gjS`Hv?q{&S=M;hyGpjQx5CNmQ;Ȅ7}=mV]6f%xn3 ~q7z^硛ܸјigtEcvx57g/Z3+͋m3◞xmݪ÷]56`ϸ8rr#'1686Ŏ CS'ުqտ^#wO1s[9[?}=CwMgU/#^t\?/mtVЙ&8e s6ⷃ4(?_3Q9o \776+?ďdG66[ z:L_Э~r/v1~W1|DO > \gMP(\ ;A|Lr~a!mO詢q>ɕ &(P?Ҿd"+oF~dEwCZ2}z~ W#|mA=ҨKs1}]g G~Lo` %U6x|P>3Yb ;~p_;>qpO 4 9K_]DN+os~i#ͧry޶I̊xO=~U!':^ >KO>Wy~_ܵaogcsfKOěMn/=i>xO?;ԯ0~iKb n0~cс>wmAB{n7W D  7ps?>B|$!fךL0~m>ÏId1}턏ABfL}LG`4 LbP@~ 'g4U_)'7__8}xe_(5UFPѽ_7 ? '/|oHsS ~Qz`B~xA4]GvLAh_A&׌8h-8 MPxK?\yį7S&Uo_2 Gݿ+,ny o>y&xO8mŝKj7{67 ?=6l;<1633^!<ήy݇nsOʋ_7gǘNxف_Jkn9Oac= ~q{&f<'챷N^ ^9O>?O=`Qz6ɱyӏg5%oWG<[=v?ǝ]sk*ox[6xȉsG?}x7xx6^Ws%q{'7 "~{[#7'rۥE'ŎrǒY;>[wx݇mbS/y[6ĘMM*O0kO9+MHp4&}PB_'M٬ߵ[՟s3mW\ost !oFB|q>,WOW'=EB<Ưj@O*I)?(&I`T0}̈́P?L7I6>C4? /#MIP0~w [0}ՄA^2}ZC~d;`njVtRp|D# $7 aƯn0*NI{Ji(Z(?LL0/4L_u $Q>p謘>[o&$/&_')__tRџ|3}~dI' 0}Mxf›<'ϟ:~7?-i\u%"a ~^:GM O8xGosq ŃғVcw{׼3~ {\Z%7xGnsȟܾ ͯxijk%;QylgNj_71gfO=nuKQ;ܱ7w.y݇n6Cuzb+O8Y7s²33^?=~;[=fp^u&~'pko>l|gco '6H]? /l+$ GuL hς|}@R?2}P0}@BRoOx=>Cw@{$,hWMQ?2}фjTӗ5`//K%ӗ5Ԡ|l'n^ ۙ *~dzQ? 5򋁯1O +~{R@WŅ|dAQ%hȗ5]-%&>fj I{~ MV/MB\'< +[WOO؆+F.+w76|<]/+TzKEto.{O|"śo|naz~a^!>|/IIBC峂ɕ 'S!(?UZ3~7b 2DQ6ѝ~L}r#_֔o-įYL_$gA7u#lB7`_p$>ȗ3gOGH3}Bq!GWXe YP~8ͦ~NfF@&/k)o07409H]BJB>,_BT/g?Lٸ_ 4`~B%:7Iʏ]0~OB{Fʂi_ȗ0z>2~لf>%qK}&rǒ{&1;ޭGvio\=p~ ^9O8;0`om,:֏9Ɵyē<̌WO9K#z-wuZ,ؚ|ے]ەKgGyGn旟t@vf[=fEٚ|6{,'=|?=$v/vK\Z%7փ`' =r _y>6=Lk?d o?7z6ˉf'cscxx[60w~ăwCo?퀧_xĩ{C3^kO>>xrJ[ޑ{>U/n_NKs l~x>8_[` 흓tRC ~cy? Ϟ辨0/# ||wh/m~ 3AI% >E>w#_/_a|9Q0~È: +F3~=tVat7ԏ袘>}P@~IS}0}n# ( MA` sQ4`gm\/-fF $0~A٠taA>fEŠ7`F@|@AJ$_-y+Iex_&ڸgߌ+\%/3~Ǚ9ś[qˉd֓Ry?쳷n<̌z&{?|!{͇l ~itEw8>~6xܽkt~[=fݻqg׼usufFKsϊ53^N܍ |#B<욿g+߼]3cO=n!yopfOgl`1 C @xꅁ~Ot9>/ɣ'qixGpVFN- oߊ147.xЉ}c3lV1; xmq4&xɞWy<~[u<9?KWQ۬K#tnU;KO:nsNo?'x ~ a'{oEVwcU/\9霨Uݢ}\ _`1}b#_;)?X?WLvQ?2}لo2c+81}DI|Ff0}ӄ7|w? Lxez>&_6Q?)%1~m o iğ` =COxM@<>]I VL7It*I{Yw1,﹗[^˛.Cۿd~8^ߞy 6"WOvu?a{&| .a K_?'z~aaz~{-:~)usnߛ#9ۏxn3.X~comO'Ҽ#lmGXJO? gt1;ZT~ܺ;33^9)9g3=-=a/uݜG3c omN, z6[ŝK<=eӏ'o~Cn4ů{[=~//{Y]3`Hn:矰OƏGyFHF݋/?k*/?c_ݵ omO:-usvpn|ǷnmqՋGwzk043}NAe~q,k%ӧ5.+?RIf0~gO'rޣQ?⇙Pl 1} Q?WHeLF0}̈́+tZɇ! =C/PL7MXBQ=ULWMcӇ7◂w0}ńeʏKG2B芞!5S?M{O޾ Ưk0+c|Mt0}t#*9ّoďӗM ~/(__aħ"tTa/o+otAL_)hh 5~D7(Ư.A]Oq|OaFkrS b g)X(?p )·:S2K8|[cmxWF '0~f淟vS.vރ/>i!'z^rǒWe~Cj%O?!'zo=5ɬ_!=7oǷ*ld ob;=x5t?=uIHSW6/άǷw?r[uG}+tɹ_}!\]yGn|!O0=ty-ݻIּ#w0#n:gh1<ݻgfC6{3 cvxGWw-yS›=z_x>!xGpvמr[:KOQf/?iUv/?c#oNr[>zk:~)[]qW&7t?n^9r&`>'r4S@\":|[ͯ,>?:N# (W/pa/?7L`c z|0}P?޶>,_ڂ,i[~ǂ?q됽cOe1;u UWo_2/9W}E^)M~ _1;=+%~C3chF<|&9xkڃ6;(#v6? ?ؚW>L|{kO9>;.̊xp8?6=.,tӂ3_|yGpV/ZwŮwۏfFK煟{>SY6~ᏹ!67r{k;+ڭS.;W4gCNmQ8{xmnn=ڭ[>z=\8jlrL#6mv/ɋ_3o?b5Win8>/r祉7~g'oM֓~qmF^,o^N w_?I/Lȗ3 > >KGV b U[޿P?wjNxQ?OxL_`G+/h/qd-/!\*NA>LDJ|_iQxB> >,xr7.{<yGl+}b^G+>?Ϳ6[7]ϋ[27_%r#w0{om~qiů33~ ͼöxĩozK_?o~)[.zCy9 ~<>j }\vVͯ>/ʛ=ru+O9M/rDž'?~67xO澑\Xs7sO,esS.&L_3ᓆ}x%_ҴOj n§LgEBFBU,+ɺzW1;?7Y^-(?pLиAfFOMTP~1zPL4ʏ7:f -F_; XzwK֯~v)L'imEؠܤ>m8WЉ^5X~wM-!~.hkwB{ //#ɯ+x˔*!~O_1AV}t%_ٴn/~)_ZȷH  wmOtNԏ*mK4Iyh 3Pe{l=Wn''W,`e{Q?>O-Op=3Q?ğ74>~M+oGMCۿd]wsoϛC9~?Q?&7KwABn2}Z~V!_L_>!tّ+&)\'nNgሶ^V+^`p?L%jz7Q~84UoP?`2=^t]ɗJG%+M{=>0qo~:oy< &1Z8~Kp^KU}es.9}pezFYr?=GV8WMo,pt =+v'%8AUo_2ŭqo637>߉}> ![?=&Û>r ťUc5w:~{ltۼ1׍'? nxs >?Mx$/ n9ŹÉ?c M~.<=umF~I͙[>f1l;=jrןz౯rؾ>6nX3~qXNgܾ7Nr L~?u{~;xW{)G]^#ޛ|~ɣpܲ:~q{,:v/v_xovf;F~{~W}ǶYͶ8ӧxNp!O6ko ÈBٻr2!Vν?m[?v{7xo2$``VībFnx7b[y5M<;o~!~f%nO07*b|)sYB̂o3ς&tup{էs$c`qzWkGiO&/(KP&ϯfFMP>?MZPWJmAfP_; .+?+_kr 'yQ'^8.}ػ3LO:4 1~C E>–t~rEw|Y3}Dݿ+wͶۦ&[?r#ӻa BCWz>g/i.Y]TH&Oz(G޿q? a ePL_$ >käFnx7b[}oyGc^ᑼ}ޟx7xԙz>Nyҹ5{[686/<5?[=vOO?g\j{gw.yꅁmV˼;y/^3'aqA_ןrEï>y{&߮KOgJo"O=nuzk7 |^yUswзwQW̿ƴ<"VN2\m?7f\j۾{ ǞJlpK om ?=^ rag0Ox~K~ompߚǟxngwwq&Jx6w-VG?$}O[_M~{Dwxc}n4omjo?<ۼ[5"Ǒ;wyC_e| P9_)0u~^!~'>oܯ|cAwA)ؠ# pMs2se^_X|~7~}g92/cEB`0}zCBĎs&XWMgFD~kM"5U>li/#7o]!_6aH+iyDOdp~'(ӌ/J#_ôoۃ\6An747eƯW^Dn7}cGUڛ$fI}WƏi #t[}iDs t0}zqD rIt_a L+] 3lǼ=8S /g+O#93=q{G^Aĵs%~=̌^;w~=r_|7~'_xC9[5<_߽⹹5ncq ;M~ {\Uyɞ{>*1;3uw`{J~{ "1~ {0bщ^<ݻn\g?Kx|;~K?gٽ^t=o<u#'p-53~|n\N~q8( c7~7o]ڠH<|G~~E7vmٟ=GoNE' @ ff?}ylqv7zȓl[S3=}l.+!q;gt=CO-qqE瞰r4/uݜWe?|!{~'_yO8P$do}7ڇ?ܷ/bh~WwYv[{e}raFn?o+''6Eٕ|~maj^Nī~nǠ}LYu7w3?s_) L #Tf G~DAlxːP?$i' Pg>ljo}gipbQxGOoZp_ܹ%8?yc̵;u(I|SCP)Z;8[v"'p=b[o?ϯO]Y<⑼܍ |~`oո]f)OŸ9-^ar_'߫ܲM:~{,'sbQx;_߽\ ě>juK%97-OO|{g6÷hL?a!N2\5v}XC#)/)KK&L "_ڴHO16.uZUgob-t~J!&'U/Z[h;%$,N1~uc~s!~$>o Pi -a <[n3Ϲ'>'?pN+ ~h/nOoOC+{5UC;4eR~Fax%n~}װxyGQ/hg7x5 o*=CtXim\}rE&{5{'">xoօyG83zNK8*Ǹ`䷞v-:\Z5~q[mݾcy ~S}wOGcw8(SxfOٟsg̓]Q{gG;8˿,ۏx8/wÂ'쳚|wKr7.x<ܚz!9j)۞/\{i^_}!wuxm\;qng/huœ~Z72]+Ӈ$ =>? O/οt_MB ~1fW<{sÛ \:GNM_io+w>eIFAP>ȗ7]L_6A5g_O}1e?`O%kn|7gqt^̹LP?/c61}D)?׃ oY^w׻Z:xiql?++31^Lи_|g!8> ~/Ph8[9rAqIWb$_*}oysǔ;˾4[7ě?j ?}No;Li~q['%-/ L >3g~^~yw~3xW{&?K!_U8R/[>z^ּ#]5GQYNlZ;~Xuol|Əwur7|5/?7z:ww8(٣wp/v8Ο9yGLWMr4}wV{#}pӱ}&x4|G?K^]ޚseS3/l\{#*_:c+a_tWi0K5 n {opuoL?k+׎4/Хr_zqVinkA5_I|U3}ք gUuS1~mmN_6|k)[?{e曨O)V~ך +`cޯ=ӡ~bGݿoa7p5^nɝ?st;;q7՛Ӕ_OpXB '`qJ\2}a ~Q%f g?øpߊv}oy;~g9J=oi۪wCg}{m1f-~q{:&E?bk{/oٙƏeㅹG<މ7y÷XOO?A;^!J/ omv=aYqg\Y䞻qۿ5Ӿ{~#u^plVle3~q{s^?w~HW=vwcO|'|=ƷyKfNe: X/_=⛸6>ƒ`AB_Lp-pߏc=Ӿ{~#u^]6+?oLď f D!v yk|mޒ٩SG'~o`<ߞj@+(\ۂ;G|+F>BW70zPa~t>o{~c,o$Aۿd<;m'䥮gli7.nWr[=f?6W|掲8^4¬;?̮9|pVtk=dןz 7t#'som~6O03s~;cm8<_@wlc~?=ݪ÷/=i4öҜ(=?c~5o]ws7n2c5^M ;_yO8pqOq4&'z*|ےa'{~n'>>G?>8Oln~᎟Y6{/76X+GL5iW;GNtWiCc*sҋӿIꃷ?c yaV?3̮9Ã}0}DV0}feP?0}_pIZ`tQ6` ?8-t/{.G]+<߁Ϗ\/L_7s ~y3~=Qq闘_{ 7[my)c\6+>5Փ &8Uԏh;&LP-?+<'>>G? 7/`8{~78oOwx|g6 zy׊=Ԍa/xً߿u?ܷ#X!|U6S_O }qߙ?暇;oH;?e7~C*L_`fW|)?į2~fqO}-H%}?pq8S/ G &?K+׍p 謨Vy1}d#*a >qZq/ ׿r*3Mlf%=,︃S7]˵,~WKomn:Vyҹ5Cwv=aWe GrǒWyCNG~^zɗEV+nDOy9oW~Li٬yҹ!{n=?};h#6i 7 }'[p;eG;~8/-x^o;O=n!9YyGlq~916'p&Ft,ﰼ';^s=-x7|y׊?sI xpfw~Ϯ 7~˻VG+c{Z.K#=,︃9ghu7}US+soL@\'(PfF ~/h׸ɹ9_9*/ŋV}? /_o%A*~d ?ϩ=E$ox:wo}\.;~8/-<.B|v}HolEfX$ă݈wރwoOwv2AB{WbFYgA{__u6t-ӹ%ɊkWH@ۿdlikhz8-qރ}-lg^xGoO=;/ uoZӏ5o~/'M^T?^YҫrV'g9Qxls0'沗~+ݼמr.,]K~q_=my"NÅ ?C=P)

k"_ӔoɂW2=ݟ.]x<]MDip;~gy*Z xL>5~tRS A{iċq_Ln;.2[K, [`a` W#6 - e_s?Cy׾kz@ۿd;g^{~8k܃x OGc0+[?vkE^9?=,#'qbQx݇nٟ,b{"3<~<<>>Ë_;gjJN- o4?{,com#=3Ůs4$CO?`|?CJWmފI?b7~CH7x;sӏnZ's#?=w2w?w{{ %O9/Wxyqn*ko/Zy[6ێ{VHz'gܺ;O'e?Ǿ9;So6~|r[&?q#&|@/wK k~ve *?ȱW~qcx?t逇NtCT0~ucFOc+Z#>eBF{$~.t |>p7O#Dw|+S'vi y s* o '  'Vtv~vWm.]x<z÷{I%O9/Wxy7meL{FB`FSBBBfL۠pYfPp6-s>P)̓x0o+=x ~;>r{&n4gGx[O=Éwzc}{oT /'x7MV݌q}CrbQxlӅqpbQxskG|}+O' "n>~}Yv(%~s^>z7x53~vzw~Ϯx[6x鞖3c^׾eΗ}7rM-߂ s? -y~^o<7y6?7\1;]K%M}fƽ?}4oWQۄ/}7oo9K4/̓x0~owfa~R/+9k&DQ'hS߫cqk<‹*lj?\{*ă.L_i[E KӾ4zV'Ӈ7ς|MP}q9Crc Cvq~Mj?㈷zC.5;Kpvk?dcۿYs/;[?˽ӛƯ ~ |6]O=̊x;ƅį>]{慟{>c3B#x_=__؋=3w;|3~ǻR77cxlO:hH;+%:=5xMO/oz,o|(nz7n9+mGpz0op4?6/C⷟~ E^V;_7^_e{徟=3O4_^`~ёho/-p}r;/ŭCxgn Om$A?L3~b_&b ρip_؋=3w;|3~ǻR77_\P0}'|d!Ѵm_ WܛI>&W{S׹a-'={oK9:+ltXɗ3F|t>L7Lvo<>x(7[=o_SS΍~0gyzߚk^9>O:-߻);<⚿kM:^!_l=!\:͋r/2q'7{c; om6]G7}6]?}"{0qfO?(_Nr;-fpm:^!=+tn^|F~i\Yy o<^8(٣ |]njڥ?߲QSxklrۥ>xGm5<ހݻe۸-ބ <ç>M'I{ʏ 6I{}L!_3i_Ņx[{׼kh -vݓ t/~V8m! O4W6t$GbFƯo`*zOwx[p7r~Em#0>#_2>@OGUh0}F#_+ѭ~BW%[w7T ֟p MFLۈ tm(PaF>&!phWJS__tOz7ś }oz4o>^py7`wٝK[o?>xןr9{ș|ucxQՊ~xл3u<\zy;%o4!'W&T~q{ om=aK९bě?zťzo'ӿ9+{ɞKr >iob;lܱZ&f#{1N+6wpt+KbelprQx[O;Fڭ/='BO_WG-?+[):Kkf:3}ZqY~P9Q"ͦ_}r C*38{ș|ucxQՊ~xл3u?=JoA؊0}Oc >zp< ׽ɭ~c9w`S?"t ~pAg|OyK>ӯ*wݿ+v;׼kq)&~0~ Э~xEG0}b#8,~FA /c Tw}"O:L<|&?=o\wǍvԍ z+wүqۼ%幽6qӏcLH壷nga-ͯҟ+?@8]r=pO4:.."Ŏًov^ ~7.x~i?3[7t _%? ot[_u^\L}%ov=IOL_6Q~9v>Q?=tCQ|i>q pۿ 3yQ?K&q>'m b pYlP0}o2 L=3A:+wCq+7Q76rxKMo̯V56}lA7K7oхw~;~y_}}hE砽y}Xr` lw{ ~3|?3͗bvxwzk-Bۿ[ފy{+l[=f߹lpvau3MNoV~y e6AknE5-G~2{G1θn'spNǛwO syzF 8n9Əo= V|\;Wz~G~'μ_-׻#zWiz5c̸/>i4cw8(|ާ~'Y+7[mx~ꧨǎq[%*7z7*)푆xnu8w*o'fCk~лGW~7śSͭvo?<=ޕ{tVԏ(L߈{ET0~m~cOK zibZqQf<lմ<)T;;oAyMF6a FO-L_ȗ0Lq}z}tI2~=,7r澗Cr8{8^$(~)(Lu~e!~.ȗ5ӗLPCBzS\%W|-<z;~<;-ޔ$|KIn|7_5.@W]nCbx̙9?K\Z%/}WqO痍cw9C9~~Gmߒs]%Os6tVM?a/v͌x&~><̌z&?OϾ'_G< t؋vK_H/qi_[lO>nV݋P.q~ٸaw/q~ wqc{ӫOgwrۏ$7՛s/zw%tYioS2~H ~0}ÈoAM~'p|-\joH~qvw~-)}X|$ _Qp6 "k''65O{㺷y]3'-N# -7 Oc!}m(O._:GAlkx_W?nrۏx8;'&FԏC,~Wᮟ9=SL_e򮻸^ [\Z%o[>z_}oW^?y7~%wS's^wWsɿV[W~lnx7E6I+N. omlx⹁?N͋c5%?}vf۽r۽5Ox"}^]߄k6+}..o׸^͇>mt۾ܰfO% {Vw8GaoÃP5pߊGyokO9jzg6 vq`gVxp4?gy׾sM#?͋p>6so?]wq6$(&ȷhԏLӈ wӗ5>>6SŽ_tN+s^|)޻V+_MQ)p$%z:ԏPIA aw:f}O}nzfۗa0}Q6o׸^͇>g9݇vj&7~|masE߻UrǍy{+*)џ7M&lD{$*Wtg5EB`Cn7z}?M/VW_@fNr_Weco?퀷~qגo='[srQxKCBmW}72xOy_O[O;-O7Ə9kf։v'~tEwؙ}ۼ1l~#Yso~wn.n`H[C=+9Ɠϭ{V ob?}=?l{/zWNѯ*y=hY nۏ>tGw.;l[>fY?J~+{g|?3IVo"_hIQ}b=|i}RQC|e3}F4x_Mwymӏn\xف7y6S7g6*?=.,lV[|woj14S?C7{^!ۼs.,?=f^ ^9O>7zȵ[z痍ySz&4_9KpG[3mn_ay]Wċ` ~ [rn;oYq[=vy k7{c"Vfy= <^Wyz%Vq_bomg>ǝ]3^!{?^핹7iN˒< ?uo?_}_YQ/͒)|53}O(M~Eʹ+qW'4?D[~ o&o(?RC`6~s!~$7HOmqJ>̴mxfʗՑ['yro^-t ;ΟNp%^. z ~j!$hhO*M<p1:?{g~Sy9NR%q;\ O,u}lAq @rP0ɒg\zWf7pO4_|z_Fo?Scޅ']svgK\XNҼC6y}~q+^l?|S}Oz:xw$v4sO,kO͛8GymN~/o;?8~+߼#wpO|-OlzWØl~ANt;;3vj=a) ܲK]7]8~"Ŏ+q?My7x,!Ogw_/yOxf= vK3c5%ooYG3^ܶ;+OgyY_C>;i7avM#n7z;QI?L_̔//_ ϝW3ZAJ]OU-ot?Ҵ?̮=͍Q~2}Cg @FP?kLFikH|s}yg>޷̧&wσvv(?oW4<3 ǂIƳC fI{?<\7?&1}o6\Ÿ%@ k&1:tAB>b},wܯ?xw熷~fN/n3*r5z=|a|%y-3{WC6h w7~/uogXs/wsc൹JN, om"~ܽ?Ɲ>w6M_xQg|R##./o6ĬxnszǷo_Nʓ1QgC7Oglf n>t~Ww7[[v,n3*ğ嫃I-qP~,(X>o(Ѓ_6yڟo=r<ۧε/Za\[E|JL_>/eEJ>cB+஛&n~Ƿ?yLy0 w{gt`8_ʗWL}J ӗMXQX$ϚW3#_dߖ#+zhhtӁjkP~%(_ZG%+G z[s;8{Oߚ_ }ޗ|]6`pQ<ܚW{&Eӏ²q˱7y6w?x6;5/~Mv(= ;ljy)N+xC'~釼܍ ^C5'~L8QxGnM;<= ?9nb籏z o-5~Li{~/q8<{~7xw}}^__{O8?Y;Zr$7x=^a[ܰ]9/>izGc2O?nGªcLWj?x7%sfoKх? ̸CNJYRC@tVhoh~Wvyd1?}{x+", ~i3}l|w|O0}d#&Э~x/fϟDԂ}g{ڟq!$X=?S<\Zs 'p3~s|E!PL2pqϯkp)/Y|vI7^ǵoz/证0~DQ4:60W?Č_9*O8xo?KVw7}(/컾gފn{Y͢ ~I~i֏K肷{/yݜE^#ޓ{Wbh?}._}󗥯Ԣwk*o-xvෟ~yc '76}z~Οyw̓-x}$y.GK}cvf۾C3?=K_?n\sO瞃 {/~];y XTkO9n IN.*?=CN÷]5~{,'#?b+)'_= y}kp^yc8;ύoVt[.Q?b ӡ~D_L5A.A|$~48>]e+l>\گ = ' I .BaJ/kV}|#>?򮻹 ނ|EŸ/ ^?}Hś0~'xA~qpw ?Yk ~v58/.ٍ]k ٌ_5 |ϟ8{<7sv동vu }<ߙ>xl3+ޭG}+UrW|H飶h luʓyܯ6Vp4ܒ;Y=˫J/`ߚ;. Kch 5[/aA'5>e '|i_iý5N m^9/w)ͯ=;!-^gg<~Q6ߙ';Q;,]`H[ި/![?vU/gG˶` ʟo]3,ﺛ~y/<|v:~{\\6wf-?ܷn;c[1>b38d4}P?tt?ގx Wb_`Yf#jůsW\wuzׇayC?}yk1~Մd'c*- qOg};K.ƙ?K[q˼-[Yopk&|(?o(f w W\'sv6| qGk:">}Ӎ۽<'/ݢ+O>qf_z>w\k߆ẛy5Cmu}3?Owoa+?d_{O0J7-x9?K [=fqVO?n!؞obZ9 v<]߁x3ٝK=rtuol= ^9?=/۞oܛͧbە7}6wΥC6`7.r$}̃xx+}xGmsr#qis"_o+/7 t]F'ohн~TkC:nyw`9[mo箟e{7`! ~0?Rr3ӽ~h/cOm''Vڵ+>էlGY=?\xu;#'sUcv8_zisfo'f36 NUyy>/Ưy Vf+ܼgeFC:9(wXto=[MvރٿϽkl63g):.yЭoq3~ga :>LWKpͭl=k}ƣ.O WMѦ|kAO '5e 1g5VecZn#\?Yn7|=_GMgW/* &@O+~x)/Ō͇)Ȋ;y׃*O G4mF_T~9sw¯Qsu9p= #aMM Sj2}omNoT~<욐xGn]l+f`ÿ{MG>~+޴W|yo0xc{&~ܺ;ry߁Qc3'zέG 5z~W#!n{-ޔ3cғ``ob_xw\8QyGo3o=[SC#Xήglς>?ۻo=k^5Q)Os[{(x諼*L \`-oGWT>8a)=8Cnؽ \RΫ>y|$$(_S`˴K1j% wyc;G4q/2å=N+psK܉|)s?B hs3DȊ_)>цC_`C9u_yƷxS6蘾p/ftVt^_27zW>LȷIqoLѠ+>I==k^5Q)>?׽8>#omn:VۏWC79YFN+ȇߡ'y>o-y5}6a_!cٙCn8y.smVk&S8J/M7qsN˻b㦛xQ-+G|gO]+WC飶h 4;[OZyOy/v˻VtEw8Y;ŝKvf~6]xGnqv<㈿wo-nۗ]Kl\=ooܹӾ{8ʯ_DalԊ\jwN0/-$N+ȇO2slL7KtN-p=>q%daFj;p.-׸MNq^n~瘝8!wM7Zygx_#~ -yO.5<3Kԏ+^ ed~׽둯o5sۏ;R^jN{@+UѓD{F{Dw]G4mBBm>6,~l%FH^_b~|2}!}/&/yWi_}O8p}&<=^Ƿy?is˱y)4_m8;~g8~|W|w) ě?zNL FW|mn:7T~u~;OiGC0^,ߎY&O8>1]o-4CZS7{6y犿ov慗uy?~wy#ofzoDC!'z4 Oܧ+/yo=[f>ǟ]s~+߼?ܷn=`}wo*yca箟%ċS66)? X'5eES}p? onG?y=l6?t{EoAB.XAs| RN,^ns! P)(ecmnyǷEӿQo@pőY`LѠ=UO,{$gKLys =ۿƥcf _Ό_21}D#& '`FYr#AU2}Ts?^c_ROWگbUB~iO8@|93 g8(cw'py_ k^]߂ ǮMnظfnx7ůdo.q8#q㗟ϝ{lV[Sko~lV^! gj{/ </~8r.xGp>c1mw#7{Kon"_n/RzWo1̘~wY CO3{ה7y67ty5;(#Cxor_ S-Nł)dɟs-لȗ7$ԯ,/퍓 z:ԏh_ȗJs^suomn<{v~[n7}c⧃u_׎4Р~f!ZLȗ1z>2~_O >Odk7!+肽x;RgȵoO ~J!&iOAuC<} E]+v'^8ʯHR=:q]G4mR퍒驢J~2}|O;ξw'b0[fO ^![K?ɛc&m^Gݿ+֩ğqE. fwcon=?#\ɛo5pۏ8'^ޔx"į=e;&^M#!xGlso>'_sm_l G|6us^?K7?'^%8R/O<^,x1~$/)į~I3~XAIer/p{,u'opq1/u_FW⏃&pݧUOW6 7ÒC1}XR3'qOr_/|tHnW߁;F |Y޿O#+5 e:'Trэgp.r `|n ߐx$Ϟȗ1SABF{DŽ ϬOɍ|YF\!feǂ#OK_%}{oxGzju3%uM:f~. <|_|>{7xƓ~͇?o.,'~Il;w8O;x8_ݽ/Z!?lۏWcעJF{~SAB{FBI#$ޣ#o0k' yv?ݜ)yq͋$[X|#׾k%:+P3}~eVh3}j?}9퍓v'y[mo޻5iP?jwNP>A~^a|EsK\0>^x?\Oރ q0GV +ܸco.r/2;(ugi˼.Dsۿ5 3gw*omwߚ?usyf. <̌~!_y͇l3~q_'!>x7x9vo|Lџpo;Rwߛ?j=aYo<4xO?>]ۏ6wϲpߜU[s;xoVޭG<ݰz~q{٬:'ѿ?λ~½l>Az+C0}_)M\V?_?pazC;d82/s]?M=7?nv[ JO)[$Òŏׂ|$~6>W0+ &|ac O}s/>|L:Gſ{.H2C` ϹL?L6AᲣys|i6w se~B/n7⧂|d+o'<2=Qԏ/OJW?|? dCG1=>VFK£9?yog3^! ~;կ ~%'_8ҫ޲or>z>ߕU?=f-}}\33^[}Ogr ?q{&^!(7f!_cm?c{̫ 93㥯_ӏr2;[[wGn:ֱyۓ?{:^u ỵ8'sgp@{@NP?.i WW6sY>wͭ~ԫ"^W*\xɿ1Zo''|艢؂m/mPra0}nqP?оIqM+=.ȏq%_3*/凂&8eKԏ-f^7n|7gq_0E_87'] *f goȇxX>_Kx_N{>xڭ\?euk7k^敉z6~o.37{ޟ߫=hG~'B׾k_6w/.^5_˿ [?fO)xȉ{qiqHK؞o~vie_ƯY3vcO=nmwţ0r{zO8^S=-[Uמ؋Z z/CO'o;沝YV=3v~Cwݿ<=ߕ+rG~n:mOܯub bAXfvXsf-8wiSc?Rkymc{w:ɉy)tdμҫrs ɷNڻ%~R0}r\֠~EAO5Vw0Opݻnџ ku~ Wta2{}\ &]*fS ~]ԯ0}Ln~g8/ƿ֥x{ؾ/3V37y6O0O?xoqrX_U1_'so:nz۷u_^9~?s oCSuw`Q76LqM <ǝ]s&/N5r̯a݁Eo=[lot~\>{G'sϊ 8r_ዝa7yҹ5آ'퓆u#XO~lv-sɛhƥ.3?}ō׳'0^x=IOcZy.Ư˿?|7 '=~wPq۾=E頽WwE>C0}z#_5.f2>0}x#"W'={8\yݷCjE>ǚtUioNgqO=.wHO0\z8{ȩWfO2-"?o<~vL_8AKQ>6L6sP?~wy󗽞7/{“%3!|W=YNɏ%#fScw٘x0oGyģ{wW~moT~/Hff矰omv_6ިcۏW\MUyZ..Zo0\w|;jzNޭo{v{Wݽ+bC~{~p0$2/xrWW<N'X ` l?̵{>tϯ:%?Le : ~BEOӗOaKo2g6ГE}pީp74eY|̿= wV}T%mG7Q?oM.3L_s;enϘKVk(?X(%7J?L_0B&f~~!~#>oɼ9xSŴ@KzWl܍ ^=8wWz1jm?Ծ gxěw ^?M̫xGos8_}-ͱy֏9Ƣy׊?q|r^7oqt\K8jn&qwݽK[p68[,Q*mX3[ppopۼ%_>sk4 {~\Z%˜*!nکͳ$</D}of|˿f|W}%^>l_xgnۿxySV'#>GK^ŸfϽ"ۜp=cI,{ ?w~}}{lӟ:ɿ]K,﹗t';F'=1975f{{kf] o7cÿ~*Y"e>I%&q7>?zX?3}T;q_ =At_t5 vc _?j͒q .ܓm_I-<5_byϽl,NhW$ğ>n5'첾p90znx7I }oyQ5{-[ssO?<8lOro]v(^mnw\@Gyn9MƭcNf1n>7~}]˿w^i~.-,:{14PCKgs{/q\aO)^yF~ c挏=`8y\@VMGgv40.>hS\Ưk:gMoq|CKb\+WML7r ̿R[.̅'<‰{iKr톸gkpa 7fBY,[ԭ-;[RA87v2Y3^#/]`CfP}K?M#OFiK enmRuخl5Hw:`\3^c}|o+ u @:+|s7/'>~4Qs Srxqu{]60檫'⓸wOe6W|ٗ+,[,|7K h̿ð=^'oꪫ{ ߣ]X1.MXxW]uտ %V+]媫V+]媫7Cۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫAۿdꪫ}oꪫꪫ^K檫ꪫza7/ꪫtv-y7IENDB`svg_path_ops-0.8.0/src/a2c.rs000064400000000000000000000130221046102023000141250ustar 00000000000000use core::f64; const TAU: f64 = f64::consts::PI * 2.0; // Calculate an angle between two unit vectors // // Since we measure angle between radii of circular arcs, // we can use simplified math (without length normalization) // fn unit_vector_angle(ux: f64, uy: f64, vx: f64, vy: f64) -> f64 { let sign = if (ux * vy) - (uy * vx) < 0.0 { -1.0 } else { 1.0 }; let mut dot = ux * vx + uy * vy; // Add this to work with arbitrary vectors: // dot /= Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy); // rounding errors, e.g. -1.0000000000000002 can screw up this if dot > 1.0 { dot = 1.0; } if dot < -1.0 { dot = -1.0; } sign * dot.acos() } // Convert from endpoint to center parameterization, // see http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes // // Return [cx, cy, theta1, delta_theta] // fn get_arc_center( x1: f64, y1: f64, x2: f64, y2: f64, fa: bool, fs: bool, rx: f64, ry: f64, sin_phi: f64, cos_phi: f64, ) -> [f64; 4] { // Step 1. // // Moving an ellipse so origin will be the middlepoint between our two // points. After that, rotate it to line up ellipse axes with coordinate // axes. // let x1p = cos_phi * (x1 - x2) / 2.0 + sin_phi * (y1 - y2) / 2.0; let y1p = -sin_phi * (x1 - x2) / 2.0 + cos_phi * (y1 - y2) / 2.0; let rx_sq = rx * rx; let ry_sq = ry * ry; let x1p_sq = x1p * x1p; let y1p_sq = y1p * y1p; // Step 2. // // Compute coordinates of the centre of this ellipse (cx', cy') // in the new coordinate system. // let mut radicant = (rx_sq * ry_sq) - (rx_sq * y1p_sq) - (ry_sq * x1p_sq); if radicant < 0.0 { // due to rounding errors it might be e.g. -1.3877787807814457e-17 radicant = 0.0; } radicant /= (rx_sq * y1p_sq) + (ry_sq * x1p_sq); radicant = radicant.sqrt() * if fa == fs { -1.0 } else { 1.0 }; let cxp = radicant * rx / ry * y1p; let cyp = radicant * -ry / rx * x1p; // Step 3. // // Transform back to get centre coordinates (cx, cy) in the original // coordinate system. // let cx = cos_phi * cxp - sin_phi * cyp + (x1 + x2) / 2.0; let cy = sin_phi * cxp + cos_phi * cyp + (y1 + y2) / 2.0; // Step 4. // // Compute angles (theta1, delta_theta). // let v1x = (x1p - cxp) / rx; let v1y = (y1p - cyp) / ry; let v2x = (-x1p - cxp) / rx; let v2y = (-y1p - cyp) / ry; let theta1 = unit_vector_angle(1.0, 0.0, v1x, v1y); let mut delta_theta = unit_vector_angle(v1x, v1y, v2x, v2y); if !fs && delta_theta > 0.0 { delta_theta -= TAU; } if fs && delta_theta < 0.0 { delta_theta += TAU; } [cx, cy, theta1, delta_theta] } // // Approximate one unit arc segment with bézier curves, // see http://math.stackexchange.com/questions/873224 // fn approximate_unit_arc(theta1: f64, delta_theta: f64) -> [f64; 8] { let alpha = 4.0 / 3.0 * (delta_theta / 4.0).tan(); let x1 = theta1.cos(); let y1 = theta1.sin(); let x2 = (theta1 + delta_theta).cos(); let y2 = (theta1 + delta_theta).sin(); return [ x1, y1, x1 - y1 * alpha, y1 + x1 * alpha, x2 + y2 * alpha, y2 - x2 * alpha, x2, y2, ]; } pub fn a2c( x1: f64, y1: f64, x2: f64, y2: f64, fa: bool, fs: bool, rx: f64, ry: f64, phi: f64, ) -> Vec<[f64; 8]> { let sin_phi = (phi * TAU / 360.0).sin(); let cos_phi = (phi * TAU / 360.0).cos(); // Make sure radii are valid // let x1p = cos_phi * (x1 - x2) / 2.0 + sin_phi * (y1 - y2) / 2.0; let y1p = -sin_phi * (x1 - x2) / 2.0 + cos_phi * (y1 - y2) / 2.0; if x1p == 0.0 && y1p == 0.0 { // we're asked to draw line to itself return vec![]; } if rx == 0.0 || ry == 0.0 { // one of the radii is zero return vec![]; } // Compensate out-of-range radii // let mut rx = rx.abs(); let mut ry = ry.abs(); let lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry); if lambda > 1.0 { rx *= lambda.sqrt(); ry *= lambda.sqrt(); } // Get center parameters (cx, cy, theta1, delta_theta) // let cc = get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi); let mut result = vec![]; let mut theta1 = cc[2]; let mut delta_theta = cc[3]; // Split an arc to multiple segments, so each segment // will be less than τ/4 (= 90°) // let segments = *[(delta_theta.abs() / (TAU / 4.0)).ceil(), 1.0] .iter() .max_by(|a, b| a.total_cmp(b)) .expect("can not find max") as u32; delta_theta /= segments as f64; for _ in 0..segments { result.push(approximate_unit_arc(theta1, delta_theta)); theta1 += delta_theta; } // We have a bezier approximation of a unit circle, // now need to transform back to the original ellipse // return result .iter_mut() .map(|curve| { for i in (0..curve.len()).step_by(2) { let mut x = curve[i + 0]; let mut y = curve[i + 1]; // scale x *= rx; y *= ry; // rotate let xp = cos_phi * x - sin_phi * y; let yp = sin_phi * x + cos_phi * y; // translate curve[i + 0] = xp + cc[0]; curve[i + 1] = yp + cc[1]; } return *curve; }) .collect(); } svg_path_ops-0.8.0/src/ellipse.rs000064400000000000000000000053051046102023000151220ustar 00000000000000use std::f64::consts::PI; use cgmath::{Angle, Deg, Rad}; pub struct Ellipse { pub rx: f64, pub ry: f64, pub ax: Deg, } const EPSILON: f64 = 1e-10; impl Ellipse { // constructor // an ellipse centred at 0 with radii rx,ry and x - axis - angle ax. pub fn new(rx: f64, ry: f64, ax: f64) -> Self { Ellipse { rx, ry, ax: Deg(ax) } } pub fn transform(&mut self, matrix: &[f64; 4]) -> &mut Self { let c = Rad::from(self.ax).cos(); let s = Rad::from(self.ax).sin(); let ma = [ self.rx * (matrix[0] * c + matrix[2] * s), self.rx * (matrix[1] * c + matrix[3] * s), self.ry * (-matrix[0] * s + matrix[2] * c), self.ry * (-matrix[1] * s + matrix[3] * c), ]; let j = ma[0] * ma[0] + ma[2] * ma[2]; let k = ma[1] * ma[1] + ma[3] * ma[3]; // the discriminant of the characteristic polynomial of ma * transpose(ma) let d = ((ma[0] - ma[3]) * (ma[0] - ma[3]) + (ma[2] + ma[1]) * (ma[2] + ma[1])) * ((ma[0] + ma[3]) * (ma[0] + ma[3]) + (ma[2] - ma[1]) * (ma[2] - ma[1])); // the "mean eigenvalue" let jk = (j + k) / 2.0; // check if the image is (almost) a circle if d < EPSILON * jk { // if it is self.rx = jk.sqrt(); self.ry = jk.sqrt(); self.ax = Deg(0.0); self } else { // if it is not a circle let l = ma[0] * ma[1] + ma[2] * ma[3]; let d = d.sqrt(); // {l1,l2} = the two eigen values of ma * transpose(ma) let l1 = jk + d / 2.0; let l2 = jk - d / 2.0; // the x - axis - rotation angle is the argument of the l1 - eigenvector self.ax = Deg(if l.abs() < EPSILON && (l1 - k).abs() < EPSILON { 90.0 } else { if l.abs() > (l1 - k).abs() { (l1 - j) / l } else { l / (l1 - k) } .atan() * 180.0 / PI }); // if ax > 0 => rx = sqrt(l1), ry = sqrt(l2), else exchange axes and ax += 90 if self.ax >= Deg(0.0) { // if ax in [0,90] self.rx = l1.sqrt(); self.ry = l2.sqrt(); } else { // if ax in ]-90,0[ => exchange axes self.ax += Deg(90.0); self.rx = l2.sqrt(); self.ry = l1.sqrt(); } self } } pub fn is_degenrate(&self) -> bool { self.rx < EPSILON * self.ry || self.ry < EPSILON * self.rx } } #[cfg(test)] mod test {} svg_path_ops-0.8.0/src/lib.rs000064400000000000000000001165331046102023000142410ustar 00000000000000// This crate is entirely safe #![forbid(unsafe_code)] //! //! This crate includes utility functions to work with svg paths. Works on types from [svgtypes](https://github.com/RazrFalcon/svgtypes) //! crate. //! //! This package exposes functions to manipulate svg paths with simplification purposes. Also a path transformer fully compatible with //! [svgpath](https://github.com/fontello/svgpath) is provided. //! //! //! ## 📦 Cargo.toml //! //! ```toml //! [dependencies] //! svg_path_ops = "0.6" //! ``` //! //! ## 🔧 Example //! //! ### Translate //! //! ``` rust,ignore //! let translated_path = PathTransformer::new(cat_svg_path) //! .translate(230.0, 0.0) //! .to_string(); //! ``` //! //! [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/translate.rs) //! //! ### 🖨️ Output Translate //! ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/translated_cat.png) //! //! ### Rotate //! //! ``` rust,ignore //! let translated_path = PathTransformer::new(cat_svg_path) //! .rotate(90.0, 126.0, 140.0) //! .translate(220.0, 0.0) //! .to_string(); //! ``` //! //! [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/rotate.rs) //! //! ### 🖨️ Output Rotate //! ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/rotated_cat.png) //! //! ### Skew //! ``` rust,ignore //! let translated_path = PathTransformer::new(cat_svg_path) //! .skew_x(20.0) //! .translate(180.0, 0.0) //! .to_string(); //! ``` //! //! [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/skew.rs) //! //! ### 🖨️ Output Skew //! ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/skewed_cat.png) //! //! ### Scale //! ``` rust,ignore //! let translated_path = PathTransformer::new(cat_svg_path) //! .scale(0.5, 0.5) //! .translate(220.0, 60.0) //! .to_string(); //! ``` //! //! [full example](https://github.com/orhanbalci/rough-rs/blob/main/rough_piet/examples/scale.rs) //! //! ### 🖨️ Output Scale //! ![translate](https://raw.githubusercontent.com/orhanbalci/rough-rs/main/svg_path_ops/assets/scaled_cat.png) pub(crate) mod a2c; pub(crate) mod ellipse; pub mod pt; use std::borrow::Borrow; use std::f64::consts::PI; pub use svgtypes::PathSegment; /// Translates relative commands to absolute commands. All commands that use relative positions (lower-case ones), /// turns into absolute position commands (upper-case ones). pub fn absolutize( path_segments: impl Iterator>, ) -> impl Iterator { let mut result = vec![]; let (mut cx, mut cy, mut subx, mut suby) = (0.0, 0.0, 0.0, 0.0); for segment in path_segments { match *segment.borrow() { PathSegment::MoveTo { abs: true, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; subx = x; suby = y; } PathSegment::MoveTo { abs: false, x, y } => { cx += x; cy += y; result.push(PathSegment::MoveTo { abs: true, x: cx, y: cy }); subx = cx; suby = cy; } PathSegment::LineTo { abs: true, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::LineTo { abs: false, x, y } => { cx += x; cy += y; result.push(PathSegment::LineTo { abs: true, x: cx, y: cy }); } PathSegment::CurveTo { abs: true, x1: _, y1: _, x2: _, y2: _, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::CurveTo { abs: false, x1, y1, x2, y2, x, y } => { result.push(PathSegment::CurveTo { abs: true, x1: x1 + cx, y1: y1 + cy, x2: x2 + cx, y2: y2 + cy, x: x + cx, y: y + cy, }); cx += x; cy += y; } PathSegment::Quadratic { abs: true, x1: _, y1: _, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::Quadratic { abs: false, x1, y1, x, y } => { result.push(PathSegment::Quadratic { abs: true, x1: x1 + cx, y1: y1 + cy, x: x + cx, y: y + cy, }); cx += x; cy += y; } PathSegment::EllipticalArc { abs: true, rx: _, ry: _, x_axis_rotation: _, large_arc: _, sweep: _, x, y, } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::EllipticalArc { abs: false, rx, ry, x_axis_rotation, large_arc, sweep, x, y, } => { cx += x; cy += y; result.push(PathSegment::EllipticalArc { abs: true, rx, ry, x_axis_rotation, large_arc, sweep, x: cx, y: cy, }); } PathSegment::HorizontalLineTo { abs: true, x } => { result.push(*segment.borrow()); cx = x; } PathSegment::HorizontalLineTo { abs: false, x } => { cx += x; result.push(PathSegment::HorizontalLineTo { abs: true, x: cx }); } PathSegment::VerticalLineTo { abs: true, y } => { result.push(*segment.borrow()); cy = y; } PathSegment::VerticalLineTo { abs: false, y } => { cy += y; result.push(PathSegment::VerticalLineTo { abs: true, y: cy }); } PathSegment::SmoothCurveTo { abs: true, x2: _, y2: _, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::SmoothCurveTo { abs: false, x2, y2, x, y } => { result.push(PathSegment::SmoothCurveTo { abs: true, x2: x2 + cx, y2: y2 + cy, x: x + cx, y: y + cy, }); cx += x; cy += y; } PathSegment::SmoothQuadratic { abs: true, x, y } => { result.push(*segment.borrow()); cx = x; cy = y; } PathSegment::SmoothQuadratic { abs: false, x, y } => { cx += x; cy += y; result.push(PathSegment::SmoothQuadratic { abs: true, x: cx, y: cy }); } PathSegment::ClosePath { .. } => { result.push(PathSegment::ClosePath { abs: true }); cx = subx; cy = suby; } } } result.into_iter() } pub fn print_line_segment(segment: &PathSegment) { match segment { PathSegment::MoveTo { abs, x, y } => { if *abs { println!("M {} {}", x, y); } else { println!("m {} {}", x, y); } } PathSegment::LineTo { abs, x, y } => { if *abs { println!("L {} {}", x, y); } else { println!("l {} {}", x, y); } } PathSegment::HorizontalLineTo { abs, x } => { if *abs { println!("H {}", x); } else { println!("h {}", x); } } PathSegment::VerticalLineTo { abs, y } => { if *abs { println!("V {}", y); } else { println!("v {}", y); } } PathSegment::CurveTo { abs, x1, y1, x2, y2, x, y } => { if *abs { println!("C {} {} {} {} {} {}", x1, y1, x2, y2, x, y); } else { println!("c {} {} {} {} {} {}", x1, y1, x2, y2, x, y); } } PathSegment::SmoothCurveTo { abs, x2, y2, x, y } => { if *abs { println!("S {} {} {} {}", x2, y2, x, y); } else { println!("s {} {} {} {}", x2, y2, x, y); } } PathSegment::Quadratic { abs, x1, y1, x, y } => { if *abs { println!("Q {} {} {} {}", x1, y1, x, y); } else { println!("q {} {} {} {}", x1, y1, x, y); } } PathSegment::SmoothQuadratic { abs, x, y } => { if *abs { println!("T {} {}", x, y); } else { println!("t {} {}", x, y); } } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x, y, } => { if *abs { println!( "A {} {} {} {} {} {} {}", rx, ry, x_axis_rotation, large_arc, sweep, x, y ); } else { println!( "a {} {} {} {} {} {} {}", rx, ry, x_axis_rotation, large_arc, sweep, x, y ); } } PathSegment::ClosePath { abs } => { if *abs { println!("Z"); } else { println!("z"); } } } } /// Normalize takes a list of absolute segments and outputs a list of segments with only four commands: M, L, C, Z. So every segment is described as move, line, or a bezier curve (cubic). /// This is useful when translating SVG paths to non SVG mediums - Canvas, or some other graphics platform. Most such platforms will support lines and bezier curves. /// It also simplifies the cases to consider when modifying these segments. pub fn normalize( path_segments: impl Iterator>, ) -> impl Iterator { let mut out = vec![]; let mut cx = 0.0; let mut cy = 0.0; let mut subx = 0.0; let mut suby = 0.0; let mut lcx = 0.0; let mut lcy = 0.0; let mut last_type: Option = None; for segment in path_segments { match *segment.borrow() { PathSegment::MoveTo { abs: true, x, y } => { out.push(*segment.borrow()); cx = x; cy = y; subx = x; suby = y; } PathSegment::CurveTo { abs: true, x1: _, y1: _, x2, y2, x, y } => { out.push(*segment.borrow()); cx = x; cy = y; lcx = x2; lcy = y2; } PathSegment::LineTo { abs: true, x, y } => { out.push(*segment.borrow()); cx = x; cy = y; } PathSegment::HorizontalLineTo { abs: true, x } => { cx = x; out.push(PathSegment::LineTo { abs: true, x: cx, y: cy }); } PathSegment::VerticalLineTo { abs: true, y } => { cy = y; out.push(PathSegment::LineTo { abs: true, x: cx, y: cy }); } PathSegment::SmoothCurveTo { abs: true, x2, y2, x, y } => { let cx1; let cy1; if let Some(lt) = last_type { if matches!(lt, PathSegment::CurveTo { .. }) || matches!(lt, PathSegment::SmoothCurveTo { .. }) { cx1 = cx + (cx - lcx); cy1 = cy + (cy - lcy); } else { cx1 = cx; cy1 = cy; } } else { cx1 = cx; cy1 = cy; } out.push(PathSegment::CurveTo { abs: true, x1: cx1, y1: cy1, x2, y2, x, y }); lcx = x2; lcy = y2; cx = x; cy = y; } PathSegment::SmoothQuadratic { abs: true, x, y } => { let x1; let y1; if let Some(lt) = last_type { if matches!(lt, PathSegment::Quadratic { .. }) || matches!(lt, PathSegment::SmoothQuadratic { .. }) { x1 = cx + (cx - lcx); y1 = cy + (cy - lcy); } else { x1 = cx; y1 = cy; } } else { x1 = cx; y1 = cy; } let cx1 = cx + 2.0 * (x1 - cx) / 3.0; let cy1 = cy + 2.0 * (y1 - cy) / 3.0; let cx2 = x + 2.0 * (x1 - x) / 3.0; let cy2 = y + 2.0 * (y1 - y) / 3.0; out.push(PathSegment::CurveTo { abs: true, x1: cx1, y1: cy1, x2: cx2, y2: cy2, x, y, }); lcx = x1; lcy = y1; cx = x; cy = y; } PathSegment::Quadratic { abs: true, x1, y1, x, y } => { let cx1 = cx + 2.0 * (x1 - cx) / 3.0; let cy1 = cy + 2.0 * (y1 - cy) / 3.0; let cx2 = x + 2.0 * (x1 - x) / 3.0; let cy2 = y + 2.0 * (y1 - y) / 3.0; out.push(PathSegment::CurveTo { abs: true, x1: cx1, y1: cy1, x2: cx2, y2: cy2, x, y, }); lcx = x1; lcy = y1; cx = x; cy = y; } PathSegment::EllipticalArc { abs: true, rx, ry, x_axis_rotation, large_arc, sweep, x, y, } => { let r1 = rx.abs(); let r2 = ry.abs(); let angle = x_axis_rotation; let large_arc_flag = large_arc; let sweep_flag = sweep; if r1 == 0.0 || r2 == 0.0 { out.push(PathSegment::CurveTo { abs: true, x1: cx, y1: cy, x2: x, y2: y, x, y, }); cx = x; cy = y; } else if cx != x || cy != y { let x_param = x; let y_param = y; let r1_param = r1; let r2_param = r2; let curves = arc_to_cubic_curves( cx, cy, x_param, y_param, r1_param, r2_param, angle, large_arc_flag, sweep_flag, None, ); for curve in curves.iter() { out.push(PathSegment::CurveTo { abs: true, x1: curve[0], y1: curve[1], x2: curve[2], y2: curve[3], x: curve[4], y: curve[5], }) } cx = x; cy = y; } } PathSegment::ClosePath { abs: true } => { out.push(*segment.borrow()); cx = subx; cy = suby; } _ => panic!("Not expecting none absolute path!"), } last_type = Some(*segment.borrow()); } out.into_iter() } fn rotate(x: f64, y: f64, angle_rad: f64) -> (f64, f64) { let rotated_x = x * angle_rad.cos() - y * angle_rad.sin(); let rotated_y = x * angle_rad.sin() + y * angle_rad.cos(); (rotated_x, rotated_y) } fn arc_to_cubic_curves( mut x1: f64, mut y1: f64, mut x2: f64, mut y2: f64, mut r1: f64, mut r2: f64, angle: f64, large_arc_flag: bool, sweep_flag: bool, recursive: Option<[f64; 4]>, ) -> Vec> { let angle_rad = angle.to_radians(); let mut params: Vec> = vec![]; let (mut f1, mut f2, cx, cy); if let Some(rec) = recursive { f1 = rec[0]; f2 = rec[1]; cx = rec[2]; cy = rec[3]; } else { (x1, y1) = rotate(x1, y1, -angle_rad); (x2, y2) = rotate(x2, y2, -angle_rad); let x = (x1 - x2) / 2.0; let y = (y1 - y2) / 2.0; let mut h = (x * x) / (r1 * r1) + (y * y) / (r2 * r2); if h > 1.0 { h = h.sqrt(); r1 *= h; r2 *= h; } let sign = if large_arc_flag == sweep_flag { -1.0 } else { 1.0 }; let r1_pow = r1.powi(2); let r2_pow = r2.powi(2); let left = r1_pow * r2_pow - r1_pow * y * y - r2_pow * x * x; let right = r1_pow * y * y + r2_pow * x * x; let k = sign * (left / right).abs().sqrt(); cx = k * r1 * y / r2 + (x1 + x2) / 2.0; cy = k * -r2 * x / r1 + (y1 + y2) / 2.0; f1 = ((y1 - cy) / r2).asin(); f2 = ((y2 - cy) / r2).asin(); if x1 < cx { f1 = PI - f1; } if x2 < cx { f2 = PI - f2; } if f1 < 0.0 { f1 += PI * 2.0; } if f2 < 0.0 { f2 += PI * 2.0; } if sweep_flag && f1 > f2 { f1 -= PI * 2.0; } if !sweep_flag && f2 > f1 { f2 -= PI * 2.0; } } let mut df = f2 - f1; if df.abs() > (PI * 120.0 / 180.0) { let f2old = f2; let x2old = x2; let y2old = y2; if sweep_flag && f2 > f1 { f2 = f1 + (PI * 120.0 / 180.0) * (1.0); } else { f2 = f1 + (PI * 120.0 / 180.0) * (-1.0); } x2 = cx + r1 * f2.cos(); y2 = cy + r2 * f2.sin(); let x2old_param = x2old; let y2old_param = y2old; let r1_param = r1; let r2_param = r2; params = arc_to_cubic_curves( x2, y2, x2old_param, y2old_param, r1_param, r2_param, angle, false, sweep_flag, Some([f2, f2old, cx, cy]), ); } // let idf = f2 - f1; df = f2 - f1; let c1 = f1.cos(); let s1 = f1.sin(); let c2 = f2.cos(); let s2 = f2.sin(); let t = (df / 4.0).tan(); let hx = 4.0 / 3.0 * r1 * t; let hy = 4.0 / 3.0 * r2 * t; let m1 = vec![x1, y1]; let mut m2 = vec![x1 + hx * s1, y1 - hy * c1]; let m3 = vec![x2 + hx * s2, y2 - hy * c2]; let m4 = vec![x2, y2]; m2[0] = 2.0 * m1[0] - m2[0]; m2[1] = 2.0 * m1[1] - m2[1]; if recursive.is_some() { let mut ret_val = vec![m2, m3, m4]; ret_val.append(&mut params); ret_val } else { let mut ret_val = vec![m2, m3, m4]; ret_val.append(&mut params); let mut curves = vec![]; for i in (0..ret_val.len()).step_by(3) { let r1 = rotate(ret_val[i][0], ret_val[i][1], angle_rad); let r2 = rotate(ret_val[i + 1][0], ret_val[i + 1][1], angle_rad); let r3 = rotate(ret_val[i + 2][0], ret_val[i + 2][1], angle_rad); curves.push(vec![r1.0, r1.1, r2.0, r2.1, r3.0, r3.1]); } curves } } #[cfg(test)] mod test { use svgtypes::{PathParser, PathSegment}; use super::absolutize; #[test] pub fn absolutize_happy_path() { let path: String = "m 0 0 c 3 -0.6667 6 -1.3333 9 -2 a 1 1 0 0 0 -8 -1 a 1 1 0 0 0 -2 0 l 0 4 v 2 h 8 q 4 -10 9 -5 t -6 8 z".into(); let path_parser = PathParser::from(path.as_ref()); let path_segments: Vec = path_parser.flatten().collect(); let mut absolute = absolutize(path_segments.iter()); assert_eq!( absolute.next().unwrap(), PathSegment::MoveTo { abs: true, x: 0.0, y: 0.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 3.0, y1: -0.6667, x2: 6.0, y2: -1.3333, x: 9.0, y: -2.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::EllipticalArc { abs: true, rx: 1.0, ry: 1.0, x_axis_rotation: 0.0, large_arc: false, sweep: false, x: 1.0, y: -3.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::EllipticalArc { abs: true, rx: 1.0, ry: 1.0, x_axis_rotation: 0.0, large_arc: false, sweep: false, x: -1.0, y: -3.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::LineTo { abs: true, x: -1.0, y: 1.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::VerticalLineTo { abs: true, y: 3.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::HorizontalLineTo { abs: true, x: 7.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::Quadratic { abs: true, x1: 11.0, y1: -7.0, x: 16.0, y: -2.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::SmoothQuadratic { abs: true, x: 10.0, y: 6.0 } ); assert_eq!( absolute.next().unwrap(), PathSegment::ClosePath { abs: true } ); } #[test] pub fn normalize_happy_path() { //M 5.5 0.5 // C 5.5 0.22385762508460338 5.723857625084603 5.072653133236333e-17 6.0 0.0 // L 10.0 0.0 // C 10.38490017945975 2.356833863833126e-17 10.625462791622095 0.4166666666666666 10.433012701892219 0.7499999999999999 // C 10.343696304415177 0.9047005383792515 10.178632794954082 1.0 10.0 1.0 // L 9.0 1.0 // L 9.0 2.0700000000000003 // C 14.33449985803545, 2.8424915951774232 16.832315587265594 9.10006433409229 13.496068312614259 13.333630930046759 // C 13.210041054045906 13.696588273349185 12.888785098427809 14.030338740866595 12.536999999999999 14.33 // L 13.354 15.146 // C 13.626509327057502 15.418509327057505 13.501827656468443 15.883827656468444 13.129572992939691 15.983572992939692 // C 12.956809002353436 16.029864964698454 12.77247201882749 15.98047201882749 12.645999999999999 15.854000000000001 // L 11.722 14.929 // C 10.607493810968412 15.630605321208161 9.316954914290129 16.00195598169794 8.0 16.0 // C 6.683143407910542 16.00225541468121 5.392611921472294 15.63125361712913 4.2780000000000005 14.93 // L 3.3540000000000005 15.854 // C 3.081490668892032 16.126509323007035 2.6161723413343103 16.00182764550168 2.5164270103961 15.629572980490355 // C 2.470135042581356 15.45680899435182 2.5195279868119926 15.272472016947662 2.646000000000001 15.145999999999999 // L 3.463000000000001 14.329999999999998 // C -0.6402525423176311 10.834724535324305 0.5789613007758652 4.208276195164306 5.6575849175682915 2.4023929877120027 // C 6.092991729721756 2.247568785367413 6.5426560909258145 2.1362282004438002 7.0 2.07 // L 7.0 1.0 // L 5.999 1.0 // L 5.722857625084603 1.0 5.499 0.7761423749153966 5.499 0.5 // Z // M 0.86 5.387 // C -0.5920365149431468 4.123950649034067 -0.13226830657018196 1.7626691682261253 1.6875827750713361 1.1366933345457033 // C 2.6507190706407835 0.8054024659416974 3.7185449350320225 1.0915255439623954 4.387 1.86 // C 2.866949304852904 2.6317462542645806 1.6317462542645806 3.866949304852904 0.86 5.387 // Z // M 13.5 1.0 // C 12.747 1.0 12.071 1.333 11.613 1.8599999999999999 // C 13.133050695147096 2.63174625426458 14.36825374573542 3.866949304852904 15.14 5.3870000000000005 // C 16.59261327922989 4.124614019125415 16.133923667725163 1.7631227789691712 14.31435869929149 1.1363157677187599 // C 14.052337629032444 1.0460542784161344 13.777132057971071 0.9999875283075207 13.5 1.0 // Z // M 8.5 5.0 // C 8.5 4.61509982054025 8.083333333333334 4.374537208377905 7.75 4.56698729810778 // C 7.5952994616207485 4.656303695584821 7.5 4.821367205045918 7.5 5.0 // L 7.5 8.882 // L 6.053 11.776 // C 5.877899246607476 12.118765042426322 6.139515318575206 12.522545319767424 6.523908929541914 12.502804499213983 // C 6.70507326307185 12.493500669761916 6.8669876555325775 12.386803875011148 6.947 12.224 // L 8.447 9.224 // C 8.48184726536152 9.154471430221115 8.49999479206472 9.077772449437774 8.5 9.0 // L 8.5 5.0 // Z let path: String = "M5.5.5A.5.5 0 016 0h4a.5.5 0 010 1H9v1.07a7.002 7.002 0 013.537 12.26l.817.816a.5.5 0 01-.708.708l-.924-.925A6.967 6.967 0 018 16a6.967 6.967 0 01-3.722-1.07l-.924.924a.5.5 0 01-.708-.708l.817-.816A7.002 7.002 0 017 2.07V1H5.999a.5.5 0 01-.5-.5zM.86 5.387A2.5 2.5 0 114.387 1.86 8.035 8.035 0 00.86 5.387zM13.5 1c-.753 0-1.429.333-1.887.86a8.035 8.035 0 013.527 3.527A2.5 2.5 0 0013.5 1zm-5 4a.5.5 0 00-1 0v3.882l-1.447 2.894a.5.5 0 10.894.448l1.5-3A.5.5 0 008.5 9V5z".into(); let path_parser = PathParser::from(path.as_ref()); let path_segments: Vec = path_parser.flatten().collect(); let absolute = absolutize(path_segments.iter()); let mut normalized = super::normalize(absolute); assert_eq!( normalized.next().unwrap(), PathSegment::MoveTo { abs: true, x: 5.5, y: 0.5 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 5.5, y1: 0.22385762508460338, x2: 5.723857625084603, y2: 5.072653133236333e-17, x: 6.0, y: 0.0, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 10.0, y: 0.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 10.38490017945975, y1: 2.356833863833126e-17, x2: 10.625462791622095, y2: 0.4166666666666666, x: 10.433012701892219, y: 0.7499999999999999, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 10.343696304415177, y1: 0.9047005383792515, x2: 10.178632794954082, y2: 1.0, x: 10.0, y: 1.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 9.0, y: 1.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 9.0, y: 2.0700000000000003 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 14.33449985803545, y1: 2.8424915951774232, x2: 16.832315587265594, y2: 9.10006433409229, x: 13.496068312614259, y: 13.333630930046759, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 13.210041054045906, y1: 13.696588273349185, x2: 12.888785098427809, y2: 14.030338740866595, x: 12.536999999999999, y: 14.33, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 13.354, y: 15.146 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 13.626509327057502, y1: 15.418509327057505, x2: 13.501827656468443, y2: 15.883827656468444, x: 13.129572992939691, y: 15.983572992939692, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 12.956809002353436, y1: 16.029864964698454, x2: 12.77247201882749, y2: 15.98047201882749, x: 12.645999999999999, y: 15.854000000000001, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 11.722, y: 14.929 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 10.607493810968412, y1: 15.630605321208161, x2: 9.316954914290129, y2: 16.00195598169794, x: 8.0, y: 16.0, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 6.683143407910542, y1: 16.00225541468121, x2: 5.392611921472294, y2: 15.63125361712913, x: 4.2780000000000005, y: 14.93, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 3.3540000000000005, y: 15.854 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 3.081490668892032, y1: 16.126509323007035, x2: 2.6161723413343103, y2: 16.00182764550168, x: 2.5164270103961, y: 15.629572980490355, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 2.470135042581356, y1: 15.45680899435182, x2: 2.5195279868119926, y2: 15.272472016947662, x: 2.646000000000001, y: 15.145999999999999, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 3.463000000000001, y: 14.329999999999998, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: -0.6402525423176311, y1: 10.834724535324305, x2: 0.5789613007758652, y2: 4.208276195164306, x: 5.6575849175682915, y: 2.4023929877120027, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 6.092991729721756, y1: 2.247568785367413, x2: 6.5426560909258145, y2: 2.1362282004438002, x: 7.0, y: 2.07, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 7.0, y: 1.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 5.999, y: 1.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 5.722857625084603, y1: 1.0, x2: 5.499, y2: 0.7761423749153966, x: 5.499, y: 0.5, } ); assert_eq!( normalized.next().unwrap(), PathSegment::ClosePath { abs: true } ); assert_eq!( normalized.next().unwrap(), PathSegment::MoveTo { abs: true, x: 0.86, y: 5.387 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: -0.5920365149431468, y1: 4.123950649034067, x2: -0.13226830657018196, y2: 1.7626691682261253, x: 1.6875827750713361, y: 1.1366933345457033, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 2.6507190706407835, y1: 0.8054024659416974, x2: 3.7185449350320225, y2: 1.0915255439623954, x: 4.387, y: 1.86, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 2.866949304852904, y1: 2.6317462542645806, x2: 1.6317462542645806, y2: 3.866949304852904, x: 0.86, y: 5.387 } ); assert_eq!( normalized.next().unwrap(), PathSegment::ClosePath { abs: true } ); assert_eq!( normalized.next().unwrap(), PathSegment::MoveTo { abs: true, x: 13.5, y: 1.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 12.747, y1: 1.0, x2: 12.071, y2: 1.333, x: 11.613, y: 1.8599999999999999, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 13.133050695147096, y1: 2.63174625426458, x2: 14.36825374573542, y2: 3.866949304852904, x: 15.14, y: 5.3870000000000005, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 16.59261327922989, y1: 4.124614019125415, x2: 16.133923667725163, y2: 1.7631227789691712, x: 14.31435869929149, y: 1.1363157677187599, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 14.052337629032444, y1: 1.0460542784161344, x2: 13.777132057971071, y2: 0.9999875283075207, x: 13.5, y: 1.0, } ); assert_eq!( normalized.next().unwrap(), PathSegment::ClosePath { abs: true } ); assert_eq!( normalized.next().unwrap(), PathSegment::MoveTo { abs: true, x: 8.5, y: 5.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 8.5, y1: 4.61509982054025, x2: 8.083333333333334, y2: 4.374537208377905, x: 7.75, y: 4.56698729810778, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 7.5952994616207485, y1: 4.656303695584821, x2: 7.5, y2: 4.821367205045918, x: 7.5, y: 5.0, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 7.5, y: 8.882 } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 6.053, y: 11.776 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 5.877899246607476, y1: 12.118765042426322, x2: 6.139515318575206, y2: 12.522545319767424, x: 6.523908929541914, y: 12.502804499213983, } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 6.70507326307185, y1: 12.493500669761916, x2: 6.8669876555325775, y2: 12.386803875011148, x: 6.947, y: 12.224, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 8.447, y: 9.224 } ); assert_eq!( normalized.next().unwrap(), PathSegment::CurveTo { abs: true, x1: 8.48184726536152, y1: 9.154471430221115, x2: 8.49999479206472, y2: 9.077772449437774, x: 8.5, y: 9.0, } ); assert_eq!( normalized.next().unwrap(), PathSegment::LineTo { abs: true, x: 8.5, y: 5.0 } ); assert_eq!( normalized.next().unwrap(), PathSegment::ClosePath { abs: true } ); } #[test] pub fn arc_to_cubic_curves() { let result = super::arc_to_cubic_curves( 79.5, 257.83, 84.25, 249.60, 9.50, 9.50, 90.0, false, true, None, ); assert_eq!( result[0], vec![ 79.49901422066253, 254.4349913614547, 81.30983606638188, 251.29750424771456, 84.25, 249.6 ] ); } } svg_path_ops-0.8.0/src/pt.rs000064400000000000000000002041441046102023000141120ustar 00000000000000use std::collections::{HashMap, VecDeque}; use cgmath::num_traits::Pow; use cgmath::{Angle, Deg, Matrix3, Rad, Vector2, Vector3}; use svgtypes::{PathParser, PathSegment, TransformListParser, TransformListToken}; use super::ellipse::Ellipse; use crate::a2c::a2c; pub struct PathTransformer { path_segments: VecDeque, stack: Vec>, } impl PathTransformer { pub fn new(path: String) -> Self { let path_parser = PathParser::from(path.as_ref()); // if path_parser.any(|a| a.is_err()) { // panic!("unexpected path string. can not parse it.") // } PathTransformer { path_segments: path_parser .filter(|ps| ps.is_ok()) .map(|ps| ps.unwrap()) .collect(), stack: Vec::new(), } } pub fn translate(&mut self, tx: f64, ty: f64) -> &mut Self { self.stack .push(Matrix3::from_translation(Vector2::new(tx, ty))); self } pub fn scale(&mut self, sx: f64, sy: f64) -> &mut Self { self.stack.push(Matrix3::from_nonuniform_scale(sx, sy)); self } // pub fn rotate(&mut self, angle: f64, rx: f64, ry: f64) -> &mut Self { // self.stack.push_back(Matrix3::from_axis_angle( // Vector3::new(rx, ry, 0.0).normalize(), // Deg(angle), // )); // self // } pub fn rotate(&mut self, angle: f64, rx: f64, ry: f64) -> &mut Self { if angle != 0.0 { self.translate(-rx, -ry); let rad = Rad::from(Deg(angle)); self.matrix([rad.cos(), rad.sin(), -rad.sin(), rad.cos(), 0.0, 0.0]); self.translate(rx, ry); } self } pub fn skew_x(&mut self, degrees: f64) -> &mut Self { let rad = Rad::from(Deg(degrees)); self.matrix([1.0, 0.0, rad.tan(), 1.0, 0.0, 0.0]); self } pub fn skew_y(&mut self, degrees: f64) -> &mut Self { let rad = Rad::from(Deg(degrees)); self.matrix([1.0, rad.tan(), 0.0, 1.0, 0.0, 0.0]); self } pub fn matrix(&mut self, matrix: [f64; 6]) -> &mut Self { let converted = Matrix3::new( matrix[0], matrix[1], 0.0, matrix[2], matrix[3], 0.0, matrix[4], matrix[5], 1.0, ); self.stack.push(converted); self } pub fn transform(&mut self, transform: String) -> &mut Self { let parser = TransformListParser::from(transform.as_str()); let transforms = parser.into_iter().collect::>(); for path_transform in transforms.iter().rev() { match path_transform { Ok(pt) => { self.apply_token(*pt); } Err(_) => { panic!("Can not parse transform string."); } } } self } fn apply_token(&mut self, token: TransformListToken) -> &mut Self { match token { TransformListToken::Matrix { a, b, c, d, e, f } => self.matrix([a, b, c, d, e, f]), TransformListToken::Translate { tx, ty } => self.translate(tx, ty), TransformListToken::Scale { sx, sy } => self.scale(sx, sy), TransformListToken::Rotate { angle } => self.rotate(angle, 0.0, 0.0), TransformListToken::SkewX { angle } => self.skew_x(angle), TransformListToken::SkewY { angle } => self.skew_y(angle), }; self } fn evaluate_stack(&mut self) -> &mut Self { if self.stack.len() == 0 { return self; } else { if self.stack.len() == 1 { let single_transformation = self.stack.pop().expect("empty transformation stack"); self.apply_matrix(single_transformation); return self; } else { let mut combined = Matrix3::new(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); while !self.stack.is_empty() { combined = combined * self .stack .pop() .expect("can not find transformation matrix"); } self.apply_matrix(combined); return self; } } } fn apply_matrix(&mut self, final_matrix: Matrix3) -> &mut Self { self.iterate(|segment, pos, x, y| { let result: PathSegment; match *segment { PathSegment::MoveTo { abs, x: seg_x, y: seg_y } => { if abs { let p = final_matrix * Vector3::new(seg_x, seg_y, 1.0); result = PathSegment::MoveTo { abs: true, x: p.x, y: p.y } } else { // Edge case. The very first `m` should be processed as absolute, if happens. // Make sense for coord shift transforms. let is_relative = pos > 0; let p = final_matrix * Vector3::new(seg_x, seg_y, if is_relative { 0.0 } else { 1.0 }); result = PathSegment::MoveTo { abs: !is_relative, x: p.x, y: p.y }; } } PathSegment::LineTo { abs, x: seg_x, y: seg_y } => { let p = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); result = PathSegment::LineTo { abs, x: p.x, y: p.y } } PathSegment::HorizontalLineTo { abs, x: seg_x } => { if abs { let p = final_matrix * Vector3::new(seg_x, y, 1.0); result = if p.y == (final_matrix * Vector3::new(x, y, 1.0)).y { PathSegment::HorizontalLineTo { abs: true, x: p.x } } else { PathSegment::LineTo { abs: true, x: p.x, y: p.y } } } else { let p = final_matrix * Vector3::new(seg_x, 0.0, 0.0); result = if p.y == 0.0 { PathSegment::HorizontalLineTo { abs: false, x: p.x } } else { PathSegment::LineTo { abs: false, x: p.x, y: p.y } }; } } PathSegment::VerticalLineTo { abs, y: seg_y } => { if abs { let p = final_matrix * Vector3::new(x, seg_y, 1.0); result = if p.x == (final_matrix * Vector3::new(x, y, 1.0)).x { PathSegment::VerticalLineTo { abs: true, y: p.y } } else { PathSegment::LineTo { abs: true, x: p.x, y: p.y } }; } else { let p = final_matrix * Vector3::new(0.0, seg_y, 0.0); result = if p.x == 0.0 { PathSegment::VerticalLineTo { abs: false, y: p.y } } else { PathSegment::LineTo { abs: false, x: p.x, y: p.y } }; } } PathSegment::CurveTo { abs, x1, y1, x2, y2, x: seg_x, y: seg_y } => { let p1 = final_matrix * Vector3::new(x1, y1, if abs { 1.0 } else { 0.0 }); let p2 = final_matrix * Vector3::new(x2, y2, if abs { 1.0 } else { 0.0 }); let p3 = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); result = PathSegment::CurveTo { abs, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, x: p3.x, y: p3.y, }; } PathSegment::SmoothCurveTo { abs, x2, y2, x: seg_x, y: seg_y } => { let p2 = final_matrix * Vector3::new(x2, y2, if abs { 1.0 } else { 0.0 }); let p3 = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); result = PathSegment::SmoothCurveTo { abs, x2: p2.x, y2: p2.y, x: p3.x, y: p3.y }; } PathSegment::Quadratic { abs, x1, y1, x: seg_x, y: seg_y } => { let p1 = final_matrix * Vector3::new(x1, y1, if abs { 1.0 } else { 0.0 }); let p2 = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); result = PathSegment::Quadratic { abs, x1: p1.x, y1: p1.y, x: p2.x, y: p2.y }; } PathSegment::SmoothQuadratic { abs, x: seg_x, y: seg_y } => { let p2 = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); result = PathSegment::SmoothQuadratic { abs, x: p2.x, y: p2.y } } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x: seg_x, y: seg_y, } => { let mut sweep = sweep; // Transform rx, ry and the x-axis-rotation // var ma = m.toArray(); let mut e = Ellipse::new(rx, ry, x_axis_rotation); e.transform(&[ final_matrix[0][0], final_matrix[0][1], final_matrix[1][0], final_matrix[1][1], ]); // flip sweep-flag if matrix is not orientation-preserving if final_matrix[0][0] * final_matrix[1][1] - final_matrix[0][1] * final_matrix[1][0] < 0.0 { sweep = if sweep { false } else { true }; } // Transform end point as usual (without translation for relative notation) let p = final_matrix * Vector3::new(seg_x, seg_y, if abs { 1.0 } else { 0.0 }); // Empty arcs can be ignored by renderer, but should not be dropped // to avoid collisions with `S A S` and so on. Replace with empty line. if (abs && seg_x == x && seg_y == y) || (!abs && seg_x == 0.0 && seg_y == 0.0) { result = PathSegment::LineTo { abs, x: p.x, y: p.y }; } else { // if the resulting ellipse is (almost) a segment ... if e.is_degenrate() { // replace the arc by a line result = PathSegment::LineTo { abs, x: p.x, y: p.y }; } else { // if it is a real ellipse // s[0], s[4] and s[5] are not modified result = PathSegment::EllipticalArc { abs, rx: e.rx, ry: e.ry, x_axis_rotation: e.ax.0, large_arc, sweep, x: p.x, y: p.y, } } } } PathSegment::ClosePath { abs } => result = PathSegment::ClosePath { abs }, }; vec![result] }); return self; } fn to_fixed(input: f64, d: u8) -> f64 { (input * 10.0f64.pow(d)).round() / 10.0f64.pow(d) } pub fn round(&mut self, d: u8) -> &mut Self { let mut contour_start_delta_x = 0.0; let mut contour_start_delta_y = 0.0; let mut delta_x = 0.0; let mut delta_y = 0.0; self.evaluate_stack(); self.iterate(|segment, _pos, _x, _y| match segment { PathSegment::HorizontalLineTo { abs, x: seg_x } => { let mut seg_x = *seg_x; if !abs { seg_x += delta_x; } let rounded = Self::to_fixed(seg_x, d); delta_x = seg_x - rounded; seg_x = rounded; vec![PathSegment::HorizontalLineTo { abs: *abs, x: seg_x }] } PathSegment::VerticalLineTo { abs, y: seg_y } => { let mut seg_y = *seg_y; if !abs { seg_y += delta_y; } let rounded = Self::to_fixed(seg_y, d); delta_y = seg_y - rounded; seg_y = rounded; vec![PathSegment::VerticalLineTo { abs: *abs, y: seg_y }] } PathSegment::ClosePath { abs: _ } => { delta_x = contour_start_delta_x; delta_y = contour_start_delta_y; vec![] } PathSegment::MoveTo { abs, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); contour_start_delta_x = delta_x; contour_start_delta_y = delta_y; seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); vec![PathSegment::MoveTo { abs: *abs, x: seg_x, y: seg_y }] } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x: seg_x, y: seg_y, } => { // [cmd, rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y] let mut seg_x = *seg_x; let mut seg_y = *seg_y; let mut rx = *rx; let mut ry = *ry; let mut x_axis_rotation = *x_axis_rotation; if !*abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); rx = Self::to_fixed(rx, d); ry = Self::to_fixed(ry, d); x_axis_rotation = Self::to_fixed(x_axis_rotation, d + 2); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); vec![PathSegment::EllipticalArc { abs: *abs, rx: rx, ry: ry, x_axis_rotation: x_axis_rotation, large_arc: *large_arc, sweep: *sweep, x: seg_x, y: seg_y, }] } PathSegment::LineTo { abs, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); vec![PathSegment::LineTo { abs: *abs, x: seg_x, y: seg_y }] } PathSegment::CurveTo { abs, x1, y1, x2, y2, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; let mut x1 = *x1; let mut y1 = *y1; let mut x2 = *x2; let mut y2 = *y2; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); x1 = Self::to_fixed(x1, d); y1 = Self::to_fixed(y1, d); x2 = Self::to_fixed(x2, d); y2 = Self::to_fixed(y2, d); Vec::from([PathSegment::CurveTo { abs: *abs, x1, y1, x2, y2, x: seg_x, y: seg_y }]) } PathSegment::SmoothCurveTo { abs, x2, y2, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; let mut x2 = *x2; let mut y2 = *y2; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); x2 = Self::to_fixed(x2, d); y2 = Self::to_fixed(y2, d); Vec::from([PathSegment::SmoothCurveTo { abs: *abs, x2, y2, x: seg_x, y: seg_y }]) } PathSegment::Quadratic { abs, x1, y1, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; let mut x1 = *x1; let mut y1 = *y1; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); x1 = Self::to_fixed(x1, d); y1 = Self::to_fixed(y1, d); Vec::from([PathSegment::Quadratic { abs: *abs, x1, y1, x: seg_x, y: seg_y }]) } PathSegment::SmoothQuadratic { abs, x: seg_x, y: seg_y } => { let mut seg_x = *seg_x; let mut seg_y = *seg_y; if !abs { seg_x += delta_x; seg_y += delta_y; } delta_x = seg_x - Self::to_fixed(seg_x, d); delta_y = seg_y - Self::to_fixed(seg_y, d); seg_x = Self::to_fixed(seg_x, d); seg_y = Self::to_fixed(seg_y, d); Vec::from([PathSegment::SmoothQuadratic { abs: *abs, x: seg_x, y: seg_y }]) } }); self } fn iterate(&mut self, mut func: F) -> &mut Self where F: FnMut(&PathSegment, usize, f64, f64) -> Vec, { let mut last_x: f64 = 0.0; let mut last_y: f64 = 0.0; let mut contour_start_x: f64 = 0.0; let mut contour_start_y: f64 = 0.0; let mut replacements = HashMap::new(); for (pos, segment) in self.path_segments.iter().enumerate() { let transformation_result = func(segment, pos, last_x, last_y); if !transformation_result.is_empty() { replacements.insert(pos, transformation_result); } match segment { PathSegment::MoveTo { abs, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; contour_start_x = last_x; contour_start_y = last_y; } PathSegment::LineTo { abs, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::HorizontalLineTo { abs, x } => { last_x = x + if *abs { 0.0 } else { last_x }; } PathSegment::VerticalLineTo { abs, y } => { last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::CurveTo { abs, x1: _, y1: _, x2: _, y2: _, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::SmoothCurveTo { abs, x2: _, y2: _, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::Quadratic { abs, x1: _, y1: _, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::SmoothQuadratic { abs, x, y } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::EllipticalArc { abs, rx: _, ry: _, x_axis_rotation: _, large_arc: _, sweep: _, x, y, } => { last_x = x + if *abs { 0.0 } else { last_x }; last_y = y + if *abs { 0.0 } else { last_y }; } PathSegment::ClosePath { abs: _ } => { last_x = contour_start_x; last_y = contour_start_y; } } } if replacements.len() == 0 { return self; } else { let mut updated_segments = VecDeque::new(); for i in 0..self.path_segments.len() { if replacements.contains_key(&i) { let replacing_segments = replacements.get(&i).expect("can not retrieve replacement"); replacing_segments .iter() .for_each(|r| updated_segments.push_back(*r)); } else { updated_segments.push_back( *self .path_segments .get(i) .expect("can not retrieve path segment"), ); } } self.path_segments = updated_segments; return self; } } pub fn to_string(&mut self) -> String { self.evaluate_stack(); self.path_segments .iter() .map(|a| PathTransformer::to_string_segment(a)) .reduce(|segment1, segment2| format!("{} {}", segment1, segment2)) .expect("can not convert to string") } fn to_string_segment(segment: &PathSegment) -> String { match segment { PathSegment::MoveTo { abs, x, y } => { if *abs { format!("M {} {}", x, y) } else { format!("m {} {}", x, y) } } PathSegment::LineTo { abs, x, y } => { if *abs { format!("L {} {}", x, y) } else { format!("l {} {}", x, y) } } PathSegment::HorizontalLineTo { abs, x } => { if *abs { format!("H {}", x) } else { format!("h {}", x) } } PathSegment::VerticalLineTo { abs, y } => { if *abs { format!("V {}", y) } else { format!("v {}", y) } } PathSegment::CurveTo { abs, x1, y1, x2, y2, x, y } => { if *abs { format!("C {} {} {} {} {} {}", x1, y1, x2, y2, x, y) } else { format!("c {} {} {} {} {} {}", x1, y1, x2, y2, x, y) } } PathSegment::SmoothCurveTo { abs, x2, y2, x, y } => { if *abs { format!("S {} {} {} {}", x2, y2, x, y) } else { format!("s {} {} {} {}", x2, y2, x, y) } } PathSegment::Quadratic { abs, x1, y1, x, y } => { if *abs { format!("Q {} {} {} {}", x1, y1, x, y) } else { format!("q {} {} {} {}", x1, y1, x, y) } } PathSegment::SmoothQuadratic { abs, x, y } => { if *abs { format!("T {} {}", x, y) } else { format!("t {} {}", x, y) } } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x, y, } => { if *abs { format!( "A {} {} {} {} {} {} {}", rx, ry, x_axis_rotation, *large_arc as i32, *sweep as i32, x, y ) } else { format!( "a {} {} {} {} {} {} {}", rx, ry, x_axis_rotation, *large_arc as i32, *sweep as i32, x, y ) } } PathSegment::ClosePath { abs } => { if *abs { format!("Z") } else { format!("z") } } } } pub fn abs(&mut self) -> &mut Self { self.iterate(|s, _, x, y| match s { PathSegment::MoveTo { abs, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::MoveTo { abs: true, x: seg_x + x, y: seg_y + y }] } } PathSegment::LineTo { abs, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::LineTo { abs: true, x: seg_x + x, y: seg_y + y }] } } PathSegment::HorizontalLineTo { abs, x: seg_x } => { if *abs { vec![] } else { vec![PathSegment::HorizontalLineTo { abs: true, x: seg_x + x }] } } PathSegment::VerticalLineTo { abs, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::VerticalLineTo { abs: true, y: seg_y + y }] } } PathSegment::CurveTo { abs, x1, y1, x2, y2, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::CurveTo { abs: true, x1: x1 + x, y1: y1 + y, x2: x2 + x, y2: y2 + y, x: seg_x + x, y: seg_y + y, }] } } PathSegment::SmoothCurveTo { abs, x2, y2, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::SmoothCurveTo { abs: true, x2: x2 + x, y2: y2 + y, x: seg_x + x, y: seg_y + y, }] } } PathSegment::Quadratic { abs, x1, y1, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::Quadratic { abs: true, x1: x1 + x, y1: y1 + y, x: seg_x + x, y: seg_y + y, }] } } PathSegment::SmoothQuadratic { abs, x: seg_x, y: seg_y } => { if *abs { vec![] } else { vec![PathSegment::SmoothQuadratic { abs: true, x: seg_x + x, y: seg_y + y }] } } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x: seg_x, y: seg_y, } => { if *abs { vec![] } else { vec![PathSegment::EllipticalArc { abs: true, rx: *rx, ry: *ry, x_axis_rotation: *x_axis_rotation, large_arc: *large_arc, sweep: *sweep, x: seg_x + x, y: seg_y + y, }] } } PathSegment::ClosePath { abs } => { if *abs { vec![] } else { vec![PathSegment::ClosePath { abs: true }] } } }); self } pub fn rel(&mut self) -> &mut Self { self.iterate(|s, pos, x, y| match s { PathSegment::MoveTo { abs, x: seg_x, y: seg_y } => { if *abs { if pos == 0 { vec![] } else { vec![PathSegment::MoveTo { abs: false, x: seg_x - x, y: seg_y - y }] } } else { vec![] } } PathSegment::LineTo { abs, x: seg_x, y: seg_y } => { if *abs { vec![PathSegment::LineTo { abs: false, x: seg_x - x, y: seg_y - y }] } else { vec![] } } PathSegment::HorizontalLineTo { abs, x: seg_x } => { if *abs { vec![PathSegment::HorizontalLineTo { abs: false, x: seg_x - x }] } else { vec![] } } PathSegment::VerticalLineTo { abs, y: seg_y } => { if *abs { vec![PathSegment::VerticalLineTo { abs: false, y: seg_y - y }] } else { vec![] } } PathSegment::CurveTo { abs, x1, y1, x2, y2, x: seg_x, y: seg_y } => { if *abs { vec![PathSegment::CurveTo { abs: false, x1: x1 - x, y1: y1 - y, x2: x2 - x, y2: y2 - y, x: seg_x - x, y: seg_y - y, }] } else { vec![] } } PathSegment::SmoothCurveTo { abs, x2, y2, x: seg_x, y: seg_y } => { if *abs { vec![PathSegment::SmoothCurveTo { abs: false, x2: x2 - x, y2: y2 - y, x: seg_x - x, y: seg_y - y, }] } else { vec![] } } PathSegment::Quadratic { abs, x1, y1, x: seg_x, y: seg_y } => { if *abs { vec![PathSegment::Quadratic { abs: false, x1: x1 - x, y1: y1 - y, x: seg_x - x, y: seg_y - y, }] } else { vec![] } } PathSegment::SmoothQuadratic { abs, x: seg_x, y: seg_y } => { if *abs { vec![PathSegment::SmoothQuadratic { abs: false, x: seg_x - x, y: seg_y - y }] } else { vec![] } } PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x: seg_x, y: seg_y, } => { if *abs { vec![PathSegment::EllipticalArc { abs: false, rx: *rx, ry: *ry, x_axis_rotation: *x_axis_rotation, large_arc: *large_arc, sweep: *sweep, x: seg_x - x, y: seg_y - y, }] } else { vec![] } } PathSegment::ClosePath { abs } => { if *abs { vec![PathSegment::ClosePath { abs: false }] } else { vec![] } } }) } pub fn unarc(&mut self) -> &mut Self { self.iterate(|segment, _, x, y| { let next_x: f64; let next_y: f64; match *segment { PathSegment::EllipticalArc { abs, rx, ry, x_axis_rotation, large_arc, sweep, x: seg_x, y: seg_y, } => { if !abs { next_x = seg_x + x; next_y = seg_y + y; } else { next_x = seg_x; next_y = seg_y; } let new_segments = a2c( x, y, next_x, next_y, large_arc, sweep, rx, ry, x_axis_rotation, ); if new_segments.len() == 0 { vec![PathSegment::LineTo { abs: abs, x: seg_x, y: seg_y }] } else { new_segments .iter() .map(|s| PathSegment::CurveTo { abs: true, x1: s[2], y1: s[3], x2: s[4], y2: s[5], x: s[6], y: s[7], }) .collect() } } _ => { vec![] } } }); self } pub fn unshort(&mut self) -> &mut Self { // var segments = this.segments; let mut prev_control_x = 0.0; let mut prev_control_y = 0.0; let mut prev_segment: PathSegment = PathSegment::MoveTo { abs: false, x: 0.0, y: 0.0 }; let mut cur_control_x = 0.0; let mut cur_control_y = 0.0; let segments_cache = self.path_segments.clone(); // TODO: add lazy evaluation flag when relative commands supported self.iterate(|s, idx, x, y| { // var name = s[0], nameUC = name.toUpperCase(), isRelative; // First command MUST be M|m, it's safe to skip. // Protect from access to [-1] for sure. if idx == 0 { return vec![]; } match *s { PathSegment::SmoothQuadratic { abs, x: seg_outer_x, y: seg_outer_y } => { prev_segment = segments_cache[idx - 1]; match prev_segment { PathSegment::Quadratic { abs, x1, y1, x: seg_x, y: seg_y } => { if abs { prev_control_x = x1 - x; prev_control_y = y1 - y; } else { prev_control_x = x1 - seg_x; prev_control_y = y1 - seg_y; } } _ => { prev_control_x = 0.0; prev_control_y = 0.0; } }; cur_control_x = -prev_control_x; cur_control_y = -prev_control_y; if abs { cur_control_x += x; cur_control_y += y; } vec![PathSegment::Quadratic { abs: abs, x1: cur_control_x, y1: cur_control_y, x: seg_outer_x, y: seg_outer_y, }] } PathSegment::SmoothCurveTo { abs, x2, y2, x: seg_outer_x, y: seg_outer_y } => { prev_segment = segments_cache[idx - 1]; match prev_segment { PathSegment::CurveTo { abs, x1: _, y1: _, x2: seg_x2, y2: seg_y2, x: seg_x, y: seg_y, } => { if abs { prev_control_x = seg_x2 - x; prev_control_y = seg_y2 - y; } else { prev_control_x = seg_x2 - seg_x; prev_control_y = seg_y2 - seg_y; } } _ => { prev_control_x = 0.0; prev_control_y = 0.0; } }; cur_control_x = -prev_control_x; cur_control_y = -prev_control_y; if abs { cur_control_x += x; cur_control_y += y; } vec![PathSegment::CurveTo { abs: abs, x1: cur_control_x, y1: cur_control_y, x2: x2, y2: y2, x: seg_outer_x, y: seg_outer_y, }] } _ => { vec![] } } }); self } } #[cfg(test)] mod test { use super::PathTransformer; #[test] fn basic_translate() { let actual = PathTransformer::new("M0 0 L 10 10".into()) .scale(2.0, 2.0) .to_string(); assert_eq!(actual, "M 0 0 L 20 20") } #[test] fn not_collapse_multiple_abs_m() { let actual = PathTransformer::new("M 10 10 M 10 100 M 100 100 M 100 10 Z".into()).to_string(); assert_eq!(actual, "M 10 10 M 10 100 M 100 100 M 100 10 Z"); } #[test] #[ignore = "First M fails"] fn not_collapse_multiple_rel_m() { let actual = PathTransformer::new("m 10 10 m 10 100 m 100 100 m 100 10 z".into()).to_string(); assert_eq!(actual, "M 10 10 m 10 100 m 100 100 m 100 10 z"); } #[test] fn scale_abs_curve() { let actual = PathTransformer::new("M10 10 C 20 40 40 40 50 10".into()) .scale(2.0, 1.5) .to_string(); assert_eq!(actual, "M 20 15 C 40 60 80 60 100 15"); } #[test] fn scale_rel_curve() { let actual = PathTransformer::new("M10 10 c 10 30 30 30 40 0".into()) .scale(2.0, 1.5) .to_string(); assert_eq!(actual, "M 20 15 c 20 45 60 45 80 0"); } #[test] fn scale_horizontal_lines() { let actual = PathTransformer::new("M10 10H40h50".into()) .scale(2.0, 1.5) .to_string(); assert_eq!(actual, "M 20 15 H 80 h 100"); } #[test] fn scale_vertical_lines() { let actual = PathTransformer::new("M10 10V40v50".into()) .scale(2.0, 1.5) .to_string(); assert_eq!(actual, "M 20 15 V 60 v 75"); } #[test] fn scale_arc_rel() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .scale(2.0, 1.5) .round(0) .to_string(); assert_eq!(actual, "M 80 45 a 72 34 32.04 0 1 40 75"); } #[test] fn scale_arc_abs() { let actual = PathTransformer::new("M40 30A20 40 -45 0 1 20 50".into()) .scale(2.0, 1.5) .round(0) .to_string(); assert_eq!(actual, "M 80 45 A 72 34 32.04 0 1 40 75"); } #[test] fn rotate_by_90_degrees_about_point_10_10() { let actual = PathTransformer::new("M10 10L15 10".into()) .rotate(90.0, 10.0, 10.0) .round(0) .to_string(); assert_eq!(actual, "M 10 10 L 10 15"); } #[test] fn rotate_by_negative_90_degrees_about_point_10_10() { let actual = PathTransformer::new("M0 10L0 20".into()) .rotate(-90.0, 0.0, 0.0) .round(0) .to_string(); assert_eq!(actual, "M 10 0 L 20 0"); } #[test] fn skew_x() { let actual = PathTransformer::new("M5 5L15 20".into()) .skew_x(75.96) .round(0) .to_string(); assert_eq!(actual, "M 25 5 L 95 20"); } #[test] fn skew_y() { let actual = PathTransformer::new("M5 5L15 20".into()) .skew_y(75.96) .round(0) .to_string(); assert_eq!(actual, "M 5 25 L 15 80"); } #[test] fn transform_path_with_absolute_segments() { let actual = PathTransformer::new("M5 5 C20 30 10 15 30 15".into()) .matrix([1.5, 0.5, 0.5, 1.5, 10.0, 15.0]) .to_string(); assert_eq!(actual, "M 20 25 C 55 70 32.5 42.5 62.5 52.5"); } #[test] pub fn transform_path_with_relative_segments() { let actual = PathTransformer::new("M5 5 c10 12 10 15 20 30".into()) .matrix([1.5, 0.5, 0.5, 1.5, 10.0, 15.0]) .to_string(); assert_eq!(actual, "M 20 25 c 21 23 22.5 27.5 45 55"); } #[test] pub fn unit_transform() { let actual = PathTransformer::new("M5 5 C20 30 10 15 30 15".into()) .matrix([1.0, 0.0, 0.0, 1.0, 0.0, 0.0]) .to_string(); assert_eq!(actual, "M 5 5 C 20 30 10 15 30 15"); } #[test] pub fn scale_and_translate() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .scale(2.0, 3.0) .translate(100.0, 100.0) .to_string(); assert_eq!(actual, "M 100 100 L 120 130 L 140 130"); } #[test] pub fn scale_and_rotate() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .scale(2.0, 3.0) .rotate(90.0, 0.0, 0.0) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L -30 20 L -30 40"); } #[test] pub fn handle_unit_transforms() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .translate(0.0, 0.0) .scale(1.0, 1.0) .rotate(0.0, 10.0, 10.0) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L 10 10 L 20 10") } #[test] pub fn translate_abs_curve() { let actual = PathTransformer::new("M10 10 C 20 40 40 40 50 10".into()) .translate(5.0, 15.0) .to_string(); assert_eq!(actual, "M 15 25 C 25 55 45 55 55 25") } #[test] pub fn translate_rel_curve() { let actual = PathTransformer::new("M10 10 c 10 30 30 30 40 0".into()) .translate(5.0, 15.0) .to_string(); assert_eq!(actual, "M 15 25 c 10 30 30 30 40 0") } #[test] pub fn translate_horizontal_lines() { let actual = PathTransformer::new("M10 10H40h50".into()) .translate(10.0, 15.0) .to_string(); assert_eq!(actual, "M 20 25 H 50 h 50"); } #[test] pub fn translate_vertical_lines() { let actual = PathTransformer::new("M10 10V40v50".into()) .translate(10.0, 15.0) .to_string(); assert_eq!(actual, "M 20 25 V 55 v 50"); } #[test] pub fn translate_rel_arcs() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .translate(10.0, 15.0) .round(0) .to_string(); assert_eq!(actual, "M 50 45 a 40 20 45 0 1 20 50"); } #[test] pub fn translate_abs_arcs() { let actual = PathTransformer::new("M40 30A20 40 -45 0 1 20 50".into()) .translate(10.0, 15.0) .round(0) .to_string(); assert_eq!(actual, "M 50 45 A 40 20 45 0 1 30 65"); } #[test] pub fn round_arcs() { let actual = PathTransformer::new("M10 10A12.5 17.5 45.5 0 0 15.5 19.5".into()) .round(0) .to_string(); assert_eq!(actual, "M 10 10 A 13 18 45.5 0 0 16 20"); } #[test] pub fn round_curves() { let actual = PathTransformer::new("M10 10 c 10.12 30.34 30.56 30 40.00 0.12".into()) .round(0) .to_string(); assert_eq!(actual, "M 10 10 c 10 30 31 30 40 0"); } #[test] pub fn round_precision() { let actual = PathTransformer::new("M10.123 10.456L20.4351 30.0000".into()) .round(2) .to_string(); assert_eq!(actual, "M 10.12 10.46 L 20.44 30"); } #[test] pub fn track_errors() { let actual = PathTransformer::new("M1.2 1.4l1.2 1.4 l1.2 1.4".into()) .round(0) .to_string(); assert_eq!(actual, "M 1 1 l 1 2 l 2 1"); } #[test] pub fn track_errors_2() { let actual = PathTransformer::new("M1.2 1.4 H2.4 h1.2 v2.4 h-2.4 V2.4 v-1.2".into()) .round(0) .to_string(); assert_eq!(actual, "M 1 1 H 2 h 2 v 3 h -3 V 2 v -1"); } #[test] pub fn track_errors_for_contour_start() { let actual = PathTransformer::new("m0.4 0.2zm0.4 0.2m0.4 0.2m0.4 0.2zm0.4 0.2".into()) .round(0) .abs() .to_string(); assert_eq!(actual, "M 0 0 Z M 1 0 M 1 1 M 2 1 Z M 2 1"); } #[test] pub fn reset_delta_error_on_contour_end() { let actual = PathTransformer::new("m.1 .1l.3 .3zm.1 .1l.3 .3zm0 0z".into()) .round(0) .abs() .to_string(); assert_eq!(actual, "M 0 0 L 0 0 Z M 0 0 L 1 1 Z M 0 0 Z"); } #[test] pub fn replace_arcs_with_lines() { let actual = PathTransformer::new("M40 30a0 40 -45 0 1 20 50Z M40 30A20 0 -45 0 1 20 50Z".into()) .scale(2.0, 2.0) .to_string(); assert_eq!(actual, "M 80 60 l 40 100 Z M 80 60 L 40 100 Z"); } #[test] pub fn drop_arcs_with_same_start_and_end_points() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 0 0".into()) .scale(2.0, 2.0) .to_string(); assert_eq!(actual, "M 80 60 l 0 0"); } #[test] pub fn drop_arcs_with_same_start_and_end_points_2() { let actual = PathTransformer::new("M40 30A20 40 -45 0 1 40 30".into()) .scale(2.0, 2.0) .to_string(); assert_eq!(actual, "M 80 60 L 80 60"); } #[test] pub fn arc_to_line_at_scale() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .scale(0.0, 1.0) .to_string(); assert_eq!(actual, "M 0 30 l 0 50"); } #[test] pub fn arc_to_line_at_scale_2() { let actual = PathTransformer::new("M40 30A20 40 -45 0 1 20 50".into()) .scale(1.0, 0.0) .to_string(); assert_eq!(actual, "M 40 0 L 20 0"); } #[test] pub fn arc_rotate_90() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .rotate(90.0, 0.0, 0.0) .round(0) .to_string(); assert_eq!(actual, "M -30 40 a 20 40 45 0 1 -50 20"); } #[test] pub fn apply_arc_matrix() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .matrix([0.0, 1.0, -1.0, 0.0, 0.0, 0.0]) .round(0) .to_string(); assert_eq!(actual, "M -30 40 a 20 40 45 0 1 -50 20"); } #[test] pub fn arc_rotate_negative_90() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .rotate(-90.0, 0.0, 0.0) .round(0) .to_string(); assert_eq!(actual, "M 30 -40 a 20 40 45 0 1 50 -20"); } #[test] pub fn apply_arc_matrix_2() { let actual = PathTransformer::new("M40 30a20 40 -45 0 1 20 50".into()) .matrix([0.0, -1.0, 1.0, 0.0, 0.0, 0.0]) .round(0) .to_string(); assert_eq!(actual, "M 30 -40 a 20 40 45 0 1 50 -20"); } #[test] pub fn process_circle_like_segments() { let actual = PathTransformer::new("M50 50A30 30 -45 0 1 100 100".into()) .scale(0.5, 0.5) .round(0) .to_string(); assert_eq!(actual, "M 25 25 A 15 15 0 0 1 50 50"); } #[test] pub fn almost_zero_eigen_values() { let actual = PathTransformer::new("M148.7 277.9A228.7 113.2 90 1 0 159.3 734.8".into()) .translate(10.0, 10.0) .round(1) .to_string(); assert_eq!(actual, "M 158.7 287.9 A 228.7 113.2 90 1 0 169.3 744.8"); } #[test] pub fn should_flip_sweep_flag_if_image_is_flipped() { let actual = PathTransformer::new("M10 10A20 15 90 0 1 30 10".into()) .scale(1.0, -1.0) .translate(0.0, 40.0) .to_string(); assert_eq!(actual, "M 10 30 A 20 15 90 0 0 30 30"); } #[test] pub fn should_flip_sweep_flag_if_image_is_flipped_2() { let actual = PathTransformer::new("M10 10A20 15 90 0 1 30 10".into()) .scale(-1.0, -1.0) .translate(40.0, 40.0) .to_string(); assert_eq!(actual, "M 30 30 A 20 15 90 0 1 10 30"); } #[test] pub fn rel_convert_line() { let actual = PathTransformer::new("M10 10 L30 30".into()) .rel() .to_string(); assert_eq!(actual, "M 10 10 l 20 20"); } #[test] pub fn dont_touch_rel_line() { let actual = PathTransformer::new("m10 10 l30 30".into()) .rel() .to_string(); assert_eq!(actual, "m 10 10 l 30 30"); } #[test] pub fn rel_convert_multi_segment_curve() { let actual = PathTransformer::new("M10 10 C 20 40 40 40 50 10 60 -20 70 -20 90 10".into()) .rel() .to_string(); assert_eq!(actual, "M 10 10 c 10 30 30 30 40 0 c 10 -30 20 -30 40 0"); } #[test] pub fn rel_horizontal_line() { let actual = PathTransformer::new("M10 10H40h50".into()) .rel() .to_string(); assert_eq!(actual, "M 10 10 h 30 h 50"); } #[test] pub fn rel_vertical_line() { let actual = PathTransformer::new("M10 10V40v50".into()) .rel() .to_string(); assert_eq!(actual, "M 10 10 v 30 v 50"); } #[test] pub fn rel_arcs() { let actual = PathTransformer::new("M40 30A20 40 -45 0 1 60 80".into()) .rel() .to_string(); assert_eq!(actual, "M 40 30 a 20 40 -45 0 1 20 50"); } #[test] pub fn rel_track_position_after_z() { let actual = PathTransformer::new("M10 10 L20 10 L20 20 Z L10 20 L20 20 z L9 9".into()) .rel() .to_string(); assert_eq!(actual, "M 10 10 l 10 0 l 0 10 z l 0 10 l 10 0 z l -1 -1"); } pub mod transform_string { pub mod translate { use crate::pt::PathTransformer; #[test] pub fn x_only() { let actual = PathTransformer::new("M10 10 L15 15".into()) .transform("translate(20)".into()) .to_string(); assert_eq!(actual, "M 30 10 L 35 15"); } #[test] pub fn x_and_y() { let actual = PathTransformer::new("M10 10 L15 15".into()) .transform("translate(20, 10)".into()) .to_string(); assert_eq!(actual, "M 30 20 L 35 25"); } #[test] pub fn x_and_y_with_relative_curves() { let actual = PathTransformer::new("M10 10 c15 15, 20 10, 15 15".into()) .transform("translate(20, 10)".into()) .to_string(); assert_eq!(actual, "M 30 20 c 15 15 20 10 15 15"); } #[test] pub fn x_and_y_with_absolute_curves() { let actual = PathTransformer::new("M10 10 C15 15, 20 10, 15 15".into()) .transform("translate(20, 10)".into()) .to_string(); assert_eq!(actual, "M 30 20 C 35 25 40 20 35 25"); } #[test] pub fn rel_after_translate_should_not_break() { let actual = PathTransformer::new("m70 70 l20 20 l-20 0 l0 -20".into()) .transform("translate(100, 100)".into()) .to_string(); assert_eq!(actual, "M 170 170 l 20 20 l -20 0 l 0 -20"); } #[test] pub fn rel_after_translate_should_not_break_2() { let actual = PathTransformer::new("m70 70 l20 20 l-20 0 l0 -20".into()) .transform("translate(100, 100)".into()) .rel() .to_string(); assert_eq!(actual, "M 170 170 l 20 20 l -20 0 l 0 -20"); } } pub mod rotate { use crate::pt::PathTransformer; #[test] fn rotate_by_90_degrees() { let actual = PathTransformer::new("M10 10L15 10".into()) .transform("rotate(90, 10, 10)".into()) .round(0) .to_string(); assert_eq!(actual, "M 10 10 L 10 15") } #[test] pub fn rotate_by_negative_90_degrees() { let actual = PathTransformer::new("M0 10L0 20".into()) .transform("rotate(-90)".into()) .round(0) .to_string(); assert_eq!(actual, "M 10 0 L 20 0") } } pub mod scale { use crate::pt::PathTransformer; #[test] pub fn scale_by_2() { let actual = PathTransformer::new("M5 5L15 20".into()) .transform("scale(2)".into()) .to_string(); assert_eq!(actual, "M 10 10 L 30 40"); } #[test] pub fn scale_by_x_and_y() { let actual = PathTransformer::new("M5 5L30 20".into()) .transform("scale(0.5, 1.5)".into()) .to_string(); assert_eq!(actual, "M 2.5 7.5 L 15 30") } #[test] pub fn scale_by_x_and_y_with_relative_curves() { let actual = PathTransformer::new("M5 5c15 15, 20 10, 15 15".into()) .transform("scale(.5, 1.5)".to_string()) .to_string(); assert_eq!(actual, "M 2.5 7.5 c 7.5 22.5 10 15 7.5 22.5"); } } pub mod skew { use crate::pt::PathTransformer; #[test] pub fn skew_x() { let actual = PathTransformer::new("M5 5L15 20".into()) .transform("skewX(75.96)".into()) .round(0) .to_string(); assert_eq!(actual, "M 25 5 L 95 20"); } #[test] pub fn skew_y() { let actual = PathTransformer::new("M5 5L15 20".into()) .transform("skewY(75.96)".into()) .round(0) .to_string(); assert_eq!(actual, "M 5 25 L 15 80"); } } pub mod matrix { use crate::pt::PathTransformer; #[test] pub fn path_with_absolute_segments() { let actual = PathTransformer::new("M5 5 C20 30 10 15 30 15".into()) .transform("matrix(1.5, 0.5, 0.5, 1.5 10, 15)".into()) .to_string(); assert_eq!(actual, "M 20 25 C 55 70 32.5 42.5 62.5 52.5"); } #[test] pub fn path_with_relative_segments() { let actual = PathTransformer::new("M5 5 c10 12 10 15 20 30".into()) .transform("matrix(1.5, 0.5, 0.5, 1.5 10, 15)".into()) .to_string(); assert_eq!(actual, "M 20 25 c 21 23 22.5 27.5 45 55"); } } pub mod combinations { use crate::pt::PathTransformer; #[test] pub fn scale_and_translate() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .transform("translate(100,100) scale(2,3)".into()) .to_string(); assert_eq!(actual, "M 100 100 L 120 130 L 140 130"); } #[test] pub fn scale_and_rotate() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .transform("rotate(90) scale(2,3)".into()) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L -30 20 L -30 40"); } #[test] pub fn skew_and_scale() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .transform("skewX(75.96) scale(2,3)".into()) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L 140 30 L 160 30") } } pub mod misc { use crate::pt::PathTransformer; #[test] pub fn empty_transforms() { let actual = PathTransformer::new("M0 0 L 10 10 20 10".into()) .transform("rotate(0) scale(1,1) translate(0,0) skewX(0) skewY(0)".into()) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L 10 10 L 20 10"); } #[test] #[should_panic] pub fn wrong_param_count() { PathTransformer::new("M0 0 L 10 10 20 10".into()) .transform("rotate(10,0) scale(10,10,1)".into()) .round(0) .to_string(); } #[test] pub fn segment_replacement() { let actual = PathTransformer::new("M0 0 H 10 V 10 Z M 100 100 h 15 v -10".into()) .transform("rotate(45)".into()) .round(0) .to_string(); assert_eq!(actual, "M 0 0 L 7 7 L 0 14 Z M 0 141 l 11 11 l 7 -7"); } #[test] pub fn nothing_to_transform() { let actual = PathTransformer::new("M10 10 L15 15".into()) .transform(" ".into()) .to_string(); assert_eq!(actual, "M 10 10 L 15 15"); } #[test] pub fn first_m_should_be_absolute() { let actual = PathTransformer::new("m70 70 70 70".into()) .transform("translate(100,100)".into()) .to_string(); assert_eq!(actual, "M 170 170 l 70 70"); } } pub mod unarc { use crate::pt::PathTransformer; #[test] pub fn complete_arc() { let actual = PathTransformer::new("M100 100 A30 50 0 1 1 110 110".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 C 89 83 87 54 96 33 C 105 12 122 7 136 20 C 149 33 154 61 147 84 C 141 108 125 119 110 110"); } #[test] pub fn small_arc() { let actual = PathTransformer::new("M100 100 a30 50 0 0 1 30 30".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 C 113 98 125 110 130 130") } #[test] pub fn circle() { let actual = PathTransformer::new( "M100 100 m -75 0 a 75 75 0 1 0 150 0 a 75 75 0 1 0 -150 0".into(), ) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 m -75 0 C 25 141 59 175 100 175 C 141 175 175 141 175 100 C 175 59 141 25 100 25 C 59 25 25 59 25 100"); } #[test] pub fn rounding_errors() { let actual = PathTransformer::new( "M-0.5 0 A 0.09188163040671497 0.011583783896639943 0 0 1 0 0.5".into(), ) .unarc() .round(5) .to_string(); assert_eq!(actual, "M -0.5 0 C 0.59517 -0.01741 1.59491 0.08041 1.73298 0.21848 C 1.87105 0.35655 1.09517 0.48259 0 0.5"); } #[test] pub fn rounding_errors_2() { let actual = PathTransformer::new( "M-0.07467194809578359 -0.3862391309812665 A1.2618792965076864 0.2013618852943182 90 0 1 -0.7558937461581081 -0.8010219619609416".into(), ).unarc().round(5).to_string(); assert_eq!(actual, "M -0.07467 -0.38624 C -0.09295 0.79262 -0.26026 1.65542 -0.44838 1.54088 C -0.63649 1.42634 -0.77417 0.37784 -0.75589 -0.80102"); } #[test] pub fn curve_between_same_point() { let actual = PathTransformer::new("M100 100A123 456 90 0 1 100 100".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 L 100 100"); } #[test] pub fn curve_between_same_point_2() { let actual = PathTransformer::new("M100 100a123 456 90 0 1 0 0".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 l 0 0"); } #[test] pub fn rx_ry_zero() { let actual = PathTransformer::new("M100 100A0 0 0 0 1 110 110".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 L 110 110"); } #[test] pub fn rx_zero() { let actual = PathTransformer::new("M100 100A0 100 0 0 1 110 110".into()) .unarc() .round(0) .to_string(); assert_eq!(actual, "M 100 100 L 110 110"); } } pub mod unshort { use crate::pt::PathTransformer; #[test] pub fn shouldnt_change_full_arc() { let actual = PathTransformer::new("M10 10 C 20 20, 40 20, 50 10".into()) .unshort() .to_string(); assert_eq!(actual, "M 10 10 C 20 20 40 20 50 10"); } #[test] pub fn should_reflect_control_point() { let actual = PathTransformer::new("M10 10 C 20 20, 40 20, 50 10 S 80 0, 90 10".into()) .unshort() .to_string(); assert_eq!(actual, "M 10 10 C 20 20 40 20 50 10 C 60 0 80 0 90 10"); } #[test] pub fn should_copy_starting_point() { let actual = PathTransformer::new("M10 10 S 50 50, 90 10".into()) .unshort() .to_string(); assert_eq!(actual, "M 10 10 C 10 10 50 50 90 10"); } #[test] pub fn relative_paths() { let actual = PathTransformer::new("M30 50 c 10 30, 30 30, 40 0 s 30 -30, 40 0".into()) .unshort() .to_string(); assert_eq!(actual, "M 30 50 c 10 30 30 30 40 0 c 10 -30 30 -30 40 0"); } #[test] pub fn quadratic_shouldnt_change_full_arc() { let actual = PathTransformer::new("M10 10 Q 50 50, 90 10".into()) .unshort() .to_string(); assert_eq!(actual, "M 10 10 Q 50 50 90 10"); } #[test] pub fn quadratic_should_reflect_control_point() { let actual = PathTransformer::new("M30 50 Q 50 90, 90 50 T 150 50".into()) .unshort() .to_string(); assert_eq!(actual, "M 30 50 Q 50 90 90 50 Q 130 10 150 50"); } #[test] pub fn quadratic_copy_starting_point() { let actual = PathTransformer::new("M10 30 T150 50".into()) .unshort() .to_string(); assert_eq!(actual, "M 10 30 Q 10 30 150 50"); } #[test] pub fn quadratic_handle_relative_paths() { let actual = PathTransformer::new("M30 50 q 20 20, 40 0 t 40 0".into()) .unshort() .to_string(); assert_eq!(actual, "M 30 50 q 20 20 40 0 q 20 -20 40 0"); } } } }