diff --git a/lab4/images/1_out.ppm b/lab4/images/1_out.ppm deleted file mode 100644 index 586cf1e..0000000 Binary files a/lab4/images/1_out.ppm and /dev/null differ diff --git a/lab4/src/1.ppm b/lab4/src/1.ppm new file mode 100644 index 0000000..517a71e --- /dev/null +++ b/lab4/src/1.ppm @@ -0,0 +1,962 @@ +P6 +# Created by GIMP version 2.10.38 PNM plug-in +450 180 +255 +¬ge|YUmJHX14N&/F+9 ?R".DE<0 9>!H%,I!,:Q"2b4AO!,O")a2:b3;e8=[15I#C G'G'L$/K&.a=GX7@M+9M(:X.FR%BU4QhUi}}ξƿopfj|T\oHMU,2E"@;;<"9 AQ!-K'U(/N%+B B$7=!M%0M#1U&6U'4E"CU&.S$,V).U+/M#'C B"F'= A&W3=N-6D#.C/J#6J5/ &:#55/9$+3@NYνǾ~xnxOIc55n=@Z,6M*D%C&I.D+7 +49 +>@=G#I"'O*1W4:?"= G*L /B#; BK'N'O (L&I#J&H%H (M%.E(L&1Z7>N-4G&/G#/J$3N%5F!36&4'.+(/$&3=BUtھý±DZx~ddQxH!@!5 +07AU28jGMU28S.5S+4U)6K*AI%O!+Q",Z-4T'.D E!I (I (H )K#.Q+6S07E")@&D!(E (K&.T,789#&D3;C5D0'<+(=MPcªzx|u}]X@qF6c4,P M #D =/6 B)86 J-G(:@K"*P+2\9?iIN}X_sNUa7AZ/9^3=^0;Y+5Q&/L(Y+5W*1I%D @=?R*5W/:N)1?#@#F#'A"E#$R'0X48K+.5B%7K2H5#;, 6FO^~ys~zd\BjC2V.&<<K"&H$(34F +I!,D$I,?"8 K *\3;a9AY6N$0X09Y1E.E8;6?)>21APcrź¤Ʀũz|aZGe?2R)#B?L#)E!%:;E&P&2Q%4D)<B!O$.Q(0O'/H#+dAHtOVO'/==I'T)2N#,N#,?01 ?@<J)]3?`8A_7@U-8K&.J'.U26D$%=N$.B!7P"-V';@+?2E*=;0A@F$?C!G%T)2I'9:E!D"B K *U)6Q)2Q)2J"-D)F!)V39I)*A" T*6V-5J&L(E%G/Z3HF'79*=FRbźؿŹyȫévpzkuoyRAa4.c14R'R*V2A +A +J'G$H$L(D G&^0=h:Gc8BX.8B"9G")L%*D!C>E8 =U+7B B =;@R$.]/9Q#-R'0O$.S'4N#-J#(R.2N-4G%3Q(:G+I)R(4C*=,P1AG+9=-:A!M+L+H$N +X*5_4>\3;I!)A!G"):4 9?I#V(2X.8F(@@E#J(N#,T&0S%/P",G%K *N"/F%J!)S.5M)3D"2E1S-G&R$1P"/J&@F"S(1N#,D#K#+Z2:h?ET*.AM$[,4jG&U08R.:L*;I&:U3CE!-=%F$2>.9*G08:&26JQȶ}ĶȹŲ¥yĝvepM]AjD1J"KU(+J$4 +/5 +;=G O (J%I 9 +< =/ 7X/5mFK{RVb8M)J%M)G$G&@!F&W/8X4BQ/@_?TX8GO/:K*3E%2C'3G-6A,1?'4ATZϺŚżƹǹij¥{švdlM_ElC1S'KBD;<A@= DNNFFB1 -O$+pGMpGMpFJ`38Ip=DNUg8@U*3W/8O&.J!)J!)AS%/d6@T%/R#-I%: E$L -J!)U-6X4@N,=O0BJ*9W6?X7@H'2E'1H-4?&*E)5HY`ͽϺɞ̽ͽɷƪß{roP[Bh?-P$< ,AJFCA A ELKBN!H2 CrHL{QUY04Q'+N%Q#d/5^)1R#+O$-C$I!)K"*V-5W,5Y+5X*4S$.[,6M)<H'R$/K 'R*2X2=T0>B!2B!,K(/N)0J$/E!+=$?"&H(5GT\ŵ˶ȝÏϽŮ{plMtR9`;)J"8 4 +DC= 9 < + ? +AA ? ? H> 6 S%(pCHa7;A7 BZ%+b+1W"*N%N#,C%I!)R)1`7?d9BZ,6Q",Q",X&1R$.I&K*J&F J#&M(/T0:Z6DQ,4L%*F#H'C#8C $G%3BLVʴȟ‘̺qmqStV84 7?CC??CKH< F^03]03H"C<BO KM= ?T/6T,4Q)1N%-M"+N *T%/W(2K$K'P ,K*AB@9F#)V0;J"*L"&G?<?P).G"3@JTùͣҺģȲupdmNrP5_<(I%: B6:C9 = LD>E93 +U%%d-2PGA>@M!ND C IQ V$'W%&PNOMP$S 'K"F>D#H (C#H!&Q*/I!HO%&N&'D#I)AQ'+C$,>JZƶϾǟ׿ũƥҺɫ~fhJuP6jD1Z4'K$O(#N&$N%#J; FR #B> J "K!"7 S!$^%+B IE?II@ > C IU#$U!#GQ\$'PKPJK S$,Q$+P%.O&.K"*O$-Q&-O&GHI!J&T&1F!H!A!,:EWźϩȗǣīվεͫrsQZ=yQ8|Q>xN@lA:lA;W.*W*'L= + MQ@ L ;CF['+X#G +QM FP$D9EJFHKO[#$Z!Y"V#HFEO&O *P"-M",I&H$F"ICFGE Q-I#N$B .9AVĿϫȚȤһϳ̪mwUjKhOgTaRSK|OIj=8d40Z'$OSMC +U&: ;`/2b+0MQRLM"T!(IBJMJIENZ$$RY##Z#&A GJ!H!E!M",R'1H'F"F"M"GJJF"K'K%V$/F!27=S}έɛţ־ҾεĢ|k^_|`nY^N}NDzNEsF@j94g2.[#"\!#`%)QMEI\+.NI Z#V!T$N #T#'Q #P!EAR!Z*&L; JPMJ> FL$J&F$O%/U+5M#-J(I'\)2L!GK#Q#-N -K'O (F!239OyշϤɨͶrcadzZdKyP6S&#[/,= = V QHJS-,L$$<HM!CIJFX($H9KO@?KT#'O &N!(R#+Q"*S!*M"DEKJL#CJ!M!@*3:M|Ҹϥ˫àʼumnboM~_BnL3V3U1!Y0,U*$Q!IKA :[)(W*'GFMRS Q!!T+)T1/P-+7>O&"JQ"X'"IMFEPX%$U#$KQ!NDKS )P$P#Q"JR U!#LJEP#P!@!)9@Rΰȥǡô~pe|QySkKmI1Z5#N(]5-W,%G> KOKY&#FA @ Ma/(b0)[,&e:4U3*M,#X8-]9-Y1'T)"EF!JLF= 9> FJDA> CNV#(DHN> + KDH$G#GP""N+2mG0d=.g?5oD=nA;T#9G_'&]'%^(&@ IQ%Q![& c.(_.)b50c>6W5,Y7-a;0^3*b5/d<4Y4,FD@;=G"S,'X1,\65X21L&%A:@>L"Q#AECP'-M$*EQ%$9 )5AwзֳѭȢк}xfamL}T8xM:uI<}QH}QHvE>\)%F LV\&$l64]1([/&X,#NKRW$ _2-h?9_:2[6-_90T)"X-&hA:T2)N-$N-$N0&Q5*W:2dG?nQIpRJjNJiMJ`DAO30<;4 : EAFBK$)I (DQ%&8!&4?wϸմѭ̦ĩ~wgcvSaC]EVEyM@|PGa2*F :9:Ho?;xPHrJBjB8Z+#PX#X'#T)#Z3.`;3hF=lG>^5/Z1+d?9[:5_D;cH?fNDfPEgSJuaX}f^u^ViPLkSQgROdLJU;\95P3/W>9cLFjSMnZSfSL`OGn]VraZaPI^FFaIIZDFWACO6:X9?\6A[1=G&=@C#?"L".P",F;:;OζΫȢÜķxkpjiay[x`ePoQFaC8S2)C!@A$@%C,&ZH>gUIgSHR:0Q3+fE@hKEbIDR>7TA:XF%+B,/O8>E+6B$0:". (3:M͵ҮΦ™´zxrqsewaVbLA]I@gVNl_Wpg^}wkyuiqk]aUIYG=S?8N=6VIAULCTMCMFSIGK@M|ȿɱͨɠƢƢƢ}oujXl`PdXHcWG]OBM?4VI@lcZhdYXXNdhZhl^fhZ`\Pe[QeXP[RKa]T]]Seg\bdYc`W^UP[PN^VTOKJNIFHDAONJVXSW\Vinjsxtejfhnn[_`=io0\eaηŰƴtugdbUVTGFB6DG[^Ueh_ehajohkpjejdY_U`f\jpfioe\bXV\RX^TX^TnsmsyuageOXUQZYFONCIGU[Y`fbV\XW]YmqpcgfPTSSWVGKJMQRTXYDEI349+.58,TQH]ZQpmfoognmh~}x|uvqabZ`aYkldmnfabZgh`|}u~zydieV\X]ca_ecUYXUZVceb`g`RWQZ_Ynpk\]WWVQkhc`]X_ZVnifd\ZaYW`XVf^\oiilffqqzlkn`]ugd}rnvmhsigvljuyxlpvkok`f[QZiap~uzrnbvfYmYF\E-E@&??&4YLDtja~smod^ofazqlwol{spzvm{wn~zq}ypwsjyul}yp|xovqmkgdmifiedOKJ>88D<:LBAE=:IB<\SNk^XaRMq^Xzuunpltphdeafb~b^z^ZrWPb\d^zWQoLFqNHsNHoJDoJDb89Z20\42Z41N'*H"-J#6F8E3G2H/B +%? = ="H/G,:!15 4:E +&?867:"<%<%7"5 E,8 , *)9I}սɲĭ±˺ǶfUKP<3ZC=eNHeQJYD?XC>UB>R?;^JIbOIo\VjWQbOIhUOgTNZGATA;ZEDgSR`LMM9:K57Q8;Y?@eHJmOOxZZdbdbZWZXa^[XRP~NL}MKsB>o>:h51[($]("X#]( U H JOOUPONJ F LM#@ >G R'R +"NIEN%S*C36<CM "FEDBB"B"@!@%C (J+J5=;'FXf譱|frfJVK6=?(04'/#)!!% +' -)B*@V@W^Sci`qxtȽÿ}tsaWQ811 ;G&<?=;H&$K)(D"!Q/-eCA];9R0.cA?nLJkIGpNLkDEpIL}VYgloskp\_{JMOR~LOxDFu>Aq9:f,+[! \ LH + QK PQJ Q G +L +SRTRJ SWSTSPUU#J PS"SIKP E= DA=C +F H H AN"M "ED<49< D ,I8C'@$3WgvόfXgA%4** +, +, *((* ++ +,) -/.) )+0 # '1 *>.8K;EcTWl\]~jkxwmheJCN/*J)"P+%U.'lC=rJBoF@vMGwLFxLI\\``VVQOb`^\TR\Z`^\Z][_bQTZ_\aw@Ei06m05f(+^"$VOOROLRGFI F ON RVL M PN VYU^YH J SNKQRSOF 9> H @ <?A?AAAD +C JKDF!B 9> +!> +!;-3-2+;\jwMGU&469< : > = 6 023 +0,23//68 +2.*&( ( ! $*/ +7 =<:;G!O'%GT(%a4/X+&^/)R&Z-'c4.c2-c0-Z'&V g11d,+i10f.-^&%\$#[#"VPU!`),_&,I=BN R F EEA@F + +I J K RPJG<KOO TTH P \SSVH +PYNG JF KE> +6799A +> +DGJF@?:U QEGD +"9<8)!8+>E G +EI RM ;E +NPH E +C?8 59 6 + '-: + +6;; ?=?6 3 : -?FC@= -&1'2I\`9:> + +3<=C 92561 ,)+.)*.46 32 550 0 + (- +2 2 +61 ++)*//-/57549==;>@?G LK K BAE D?AD D BDDBBBF E>>AE J M IE +I H H H D F GAAIKJL Q +P JBJ G +>;3**1,0/36 1795 5 +:6 4 8256)!+*BE G F H?AE E ABH K CCB@>== +A A > ;<? +B A?KI I G DJP + +P +P[ ^[ W R LM KU N @8,&15 +035 22 +/ 3 51 7=:856!##-8GNdˉB75  02200/.- . / . +2 2 4 6752) +,*' /411:A @< : 7 +0 +-0 2 22587<?>?A?;?=?E H D +C G +H H +B +B +>9859A +A A > =AF L XT PK IOX +Z [de` +[ +VNMLTPA 2.2; 56?>6 89 56 /1% !$ 2(:CJ`ot쫷rtq2,. + #)0 2 /.17852 . -) & %!   +  *. +*,5 +7 2,-/ .*.01048:< ? DH H C B G D C GI +C ? A BB= B B C GB F G M +RS O NP T W U +T Q +NTY [X` ` XZ +` X JCG + MC 34; 528 +A C5, +% !)%###/AJS_ns}ail:9? % +# +,-.-)$" !# &% " !*.102200024;@ E HLI +J P Q M N +N HEHIB? GDF NG +J HJ +N R VWXXZ`h%n)"n( t*{- z+u)~15#2 8%A2v."P +C +E LG7 +6 6 *'%( /# "'A?Lciusʽࢶm}zIXU#-, + + +*-&   +  +  ) +1 7 764455329= > +@ F HK OR NO R N +M P Q PN +SE AJH +M UX_ i,+v98C>H@I?TF^Pl^q`kYkVmWlUjOlRuYvYw\xaVC` D KLE9- -9+($ 1054 ; +7888AG +KM LG +KQ O NNLWW]N N c%&k//y= AF;@3fewĸբwmxz]^bUUW3/.  %!3 . * +) 3P.,nG@wLEVL]OaQgTcQQAz>3n3+h,!r3*q1(m*"s/&z6+C3ZHkY{ivzwlpȚǙѢդyXkᮏȗyңլ֯شЬΧѤǖxmÂl}hm̒zٝٙ}ʊgyVpPrCyCPÃSɃPiBl%6F C +7 +AD- "=Tfږ#" )4 %682. BmE=eRmSzav_t^`MF7q3&a"Zf&j(p,!k%v1"A.E0ZB~eĆmʑvנެ֤˛uРxfdѥvdÔjܪО}֣ޭ鸗綕洓ާÊl}_oVv]hʼnqϖyأ֢{̛pɂb}N|F{Mʌ]ՓaƁZ}6$8F + @ 6 >H8-=ꜷʧOPR0<#-1 5/ .P"|RDmMtKvPiEgFQ4{=${:&r1l-v3#r-m#e q%5(|3$}5&M:L9S=oV̑sːnsN_8m?Sϟoa]̔oʍp̌q٘|ܛ⟅ޛݗ~щqjRU=R:XBZD]GpUfɕnʛq{ϐdNqDVВa͉d:+?E +B 9 4<@!/#:9Kڣʔ,&26 0) 1 18 +a52bNrL{Jn@Y,R'K"O*c>fChEn\^O2&c +] cgZY Z Zq)Q>[C?%c#G(njl١~]{YsU[C^JOAA3B5B6B8E;8-z&y&~+6%G6VA_CqLcܛ{ܟs͓czQ}QWLJd>0?I I9 1?B +L,C|{ο.#+!1 4# +- 5=jD;jSqK~PTk<`1d5pD~T_ƊhŀpgX~2%b [ ^cT [_X W l$}9&{7"s1K5͏v歐қ|vXI14!<-z#b ce_c b +XQj/F3T>\A[:a9nDeϔj̓fdbÐcϒsPFGGG +5 +-=@ 9 $8$IQ8Q4^2p*"k lijs/,UQ鳧Ÿ뻭ϡ˝ОϖxϓqɒsbxQnqÙoИ}e`i')J +H 66 + A3?.po倁y:5 +=8 ; ]%$[DyQZbb}UWiEg0GNV"f0K/Z:b@tQ|Z{\g]^dXm>m>OSd޵ԦʞĨаǣyZwi}qRHr%s$l!dv2/YYqmٙ⢇՘{ޣΕxeȝrĘukʖn֟`U` ZH MQ#J+7"+> +`)$]C{QY^zIuD}LxIY-M&\9iIyQYdϞs߮㶌޳׭ը~߰⯂ϙkRvHzK|MÐe淋–ײŢzկٱϢ঒̍{cRG8E69-aM AAh)]KɈr鬐ᦄ՞ȗnѤzΠ|Șt͙qۤma`!["UQ!S!,D%-F?FfprгtD@I@ F m6/eGRYYNLRQDw=|FNOSƖe֦uتxحzٮyԫsўo͙jZ}P|PvKqEsJːh豊⮆ϟwfėp٧ݫڡcpTw[{a}dt]`HT;u;#g+[^!H)~^ᦄڣ͙qѠu͝wʘs˘m֟lad&]$_#+Q'K&.?07^ikƻhfd,+JE SIBsVY`\NRTĒUĒSLEAOX˝iӥtѣrΠlϥkѩlעpō\|MTǂXxOnGoHϋhޜy㥀ߥ\[՝xݣ~Қu~YYǍgcŠeʔpƐlϛt՟{ȐmqQY9F$N+yV̗xŐf̗k̘qПvԡrآi\p)1e"+g)4N)D)2\[`󦤘`*(@DFV&RNx^]jgRW[͘b٥kץjɛ`YǜgҤrӤv֥|ే߰ӨuӨsЛg̒bՖjڕl}WgB`=[8qPǁ_֒o{]{Vӗr檅פyÐecΞnϟo͝oРrԡvբu㰅汉ަަҜxƐlӟxϝ|Йp٠sӜsԡtեtؠ{_Qq$,j!*a#.:5$*򤚑WC>?L}JGu\YlÖobbŽ_̗eڥsުxئuҢqեw߮کک鸏縎٭٭~Мj՟p}ޚuyUmLnMdCfFzZ˄dЉiÁ^{WÇb魈鸍ݮҨxԬyڲ~׭{֨w֦vբu֡wۥћwќz峎뻕䴌ڨآvߢuΓiÐaǘdњsYIdd R% 604ߚ`JF DD +uD=wXXjÖm^WSW˖d՟q٤xڥ{פyݨ~ܧ{ۨyޫ|۫}٭ഇ䶅ޫ~֜tLJdrQoQsSrQvV͆fؑqҍlʈfʋhbۣ~Úؒ翌巆᱁٤zϚrҜx˖vɗv۫جÙơzƍbёcɌ`]Ɨ_њqTDZ + VK3eijה}wn(*RT)O$GxI?_[gi_VPVʒaןp~宇氄ިzީwxڨs٪v㷆Ř۬dvTnPfIjJyY}\Ʉc|ߚyϏlٝ{˓pϙu溓—ɛȗƓē三פwҚuϙuқ|֡ݪݯҨѪŔsVюaؙmӟmϠhˑi>.OCEK;;Й~ko0)o'(~3G_/Bf<=ybma_đd_{O|PNJ^̑g՞u⯄ۭ߰|٪v߭x洁超šԚlWwTpT_GX>rSuSrNӊiӓpӗs䪅⨃ܢ}ݫ鹓™ǝřᲆ͝oդ{ը׭优٫͛zڥh`‡eʼndɐe͗kăc9#SM=SDAܩ{B7p+$7Fl%7AJ]Gi_}SaŒ`W…Yˎb̑gКnפyة{קwܬ{嶂蹅䴄嶊콓߬}͙iÍa„_|_lScIwXρ]vTԋj֔r֗t⨃ۥѝvݫʣŜ縌ܬ~ޯ䷎鿙ƣƤްќzԞze]__^cwZv2QQPvc\Ǻrb~C1q(1r*5NC sH5l•n^]`‡]ć[̏cіj֠tޫ߯᱃黊轊溉ƙڮ}ѣq̙lǏjȈl{amQqQzTvS׎mْrΌlלzݩܬݭÝԭ̢序㷊뼐뼐㴊쿖ȢǤޮћwϕpŒe‹bʎjʎjǍhËjmUk)R [ d%th߾ѱӱնڿܷđʭ۽ϱhLy31y33g#$Tp<.fǗsaXXYVąYːdҜpݨ|븋”ȚĒ漌’ƖԩvΠnǔgdLJkDŽju\jMeBpPٌn؋m~aЏoݧⲊఊÜӪͣൊثᵈ뼐߰湐›㵑٥ϗrːhÌcɏgѕpΒnʏoƌtdT\ P gr4%yh޹ٴ԰Эϡ×ƱѳҰͨƧŦĥéƬɪģáͦѬմ۸ܹڼ߰ݢѥұݷݯܷȰmJ=r0$l' bl0%iTmc^ZÈ^ąYÄXǍ_ɓeќp귊ƛț庍乌ė縊ϜoƔcɕeŏc†bȇkъt˃jqTa@sSيl؇lcӎoݣ~ᭆ涐ȟǞⵋѤzԥyݮܫ߯뾗ğ䴐ף~ЖqˍfNjfϔlҗoʎiɌpˌ{^TYG n)H4t۹ָձήȰ˯̯ͳѲ͵дϭŤ®Ĭ¢¬ƬƭʰаӬЧϧϣʥɩͩɣĭǭʧėȲưªģ˴W`]nLyR{O|MćXƎ_ѝn⯂뼐䷎഍곌ғj~UāVӐeΊcuTfLlWw]fIgDyV~^}^xXmM{WԚu츑跏ޭ߯뼒ⱈӢyؤ|ݦס{峐ンޫ՞՚z̍lNji˔kϛkҘpΌtvox41BWfPnܹӱɬ®ıƴɱɭţïįĭ¬ɯëǿŵżɿĺs~itxz٨У̣ΟϙʖǘƟɣˑr{ ػϨɗrāf7)ST ~E1}\bpN}VƒWRƉZYȔeҟrⳉ纑쿘ԘssLnG˄Zӎdǃ\nLcIu_ˋrbƌgϕpϔr؝{לzzXkFYᭆ⮇ПwѠx綍綍ڦ~ۧᧁԞxߪⰏН~њ|۠ԕvЕs͘n͛jЙpʆof`i" >`,oϭȱܲѪǦĥĨǨȭʲ˳Dzð®§úɻʬ®ëŨ¥¼Ļµ|ZrtQjnkr{^nm_ooTcfRadbrrl|yu~ԨͨΡǩϭҨͤǡěâȓ|t}µӷĘѯÉdv*N[i,e>}_{YvQUyM}PÊ]̖jӢwᰅユƞ궏‹doGtK…Yȋ_uOqPΐwܟϗ~Őqޱ鹓ӡ~̬ޢ]yTԙwڥР|ݭⲊԣz֧ۧ}ީ筇䪅ިإ̙~ƐxďpdƔ_ƊX}`E:\Br1zƩֿҾѾѽмϽмμ̶Ǩê­ȸǴǸɯ®Ým^sxr;\U$>?Qkl{pRkeCZRQhbIb_?WWC]^E_`Ifd[xvtϖŸĩȣ—ȟĒͶƮkF1MNf+J(iKsQtO{R~RYĎ`ďcҟrޫ糋贌ڥ}^vLyPRNJ^Ƈ^ʉiՕ|Г~˓zԞᭆ괐ۣ⧇Ήhґq볒̖t_ף|ߨۧқt؞x؞y٣۩͚}ÍsƓtbXȋ\z];/M@O:άѸؼθƳİ®v{mXtu_{~qpzgyK_jG^fpuiXY;UVB\[MghWqrزҪȝ¢¥ƞ½÷khM\Cd&M5aChHhDmF~T]Ƒea͗iۥyӝq\zPyP~UɊ^̋aэfŀcYEy6%F1u]ʋhڛxݜ|ܙ|飉҈o`HlRԍqޡtR~Yޤ~ߣ~᪁֜t~֚uКvڨЛ|Čq̙zdRÆYlQx,FW~kռɴũмӶɲűį«|zsg}vXpp5SSDbdr|j}{g|z{e~NfrRhv_rVizI^o>Tb4KYBZffjc~@[b5MWXg;UbIdmXszglXqv?X]>W\?X\5QR2NO.GK8QUڱխΪ˪ǦžƩoeB/ITK:Y;[;[9b=}UZďeaɐcۢuzȎ`sGpEzRW~TX}\\Cu$SeK8lJwWz\~cۏwS*ݑw՘y]Njfכvܡyܞw﯉ڟwȑjף~Ӟ|ʓtҙ|bwJrLM6b FuA6±ɬͳϰϭ̫ʱѷٳմֱֺʫIJDzǯ­ô±ý|v{yz¾ĪSlp"DF.QU\{~oc}~UonZvwfiRqv=[c?[f@\j.HW%AO,HT1OY@^f\z`\y;X`(DO"?M/L^(G[!AV"CV9YhLly[yUs{>\d2QV=\_Fdf@^`:XX4QO>[YݫϤǡ££¤äwðŜ|^Ei'Q e y< K.X9a=xRZđf]Zϕgҕf{Me8i>qJmIS/[:]B@.-">5VIeUZ9P/H(\?ىpaLp/ ~fݚԔx⥆ݢڠz؝u͏hLj_ܛsؚqʓjԟwԞxԙwڗ|ƆcpHcC8)T F {OB۶ӲѶݼݿݽܻںٽڼ״ϫơ}ºĺĻͱğJin@F#JQHkq[zVuxPpoUyo\x_}Mtq9_`5X^/PY#CN-OX<_e>dgCijT{za^6UW!AL8GAS;P"Q5X6e@~VȔlaXƉ\Rn>e9g>b>X8E(72%,#NFk_Ѓq|ZhFjH̃cxrZ:'-B-^HbJZ>sTϓq婄㨀ϐgrJvNΐg՜qӜsїqҔoԊqwWfESO 2F 8KCT!MZ#NW?DEG0VWPtreghr߮֝‰~yzǭuWjM]C?)s0x5>"K,Q/qKÎfeȏdȋ_{Ml>k>d=U4J.H.% {vx)!F6r\概概﯋ݒraFE02 p{&<&:!G*aAƆb{ޟvyQi?ȉ^ٞrϖk̎eȇaoU]=V6A-h=Fs]Pžü¹¹d}z]vso~i{{NbcShmax~lfZvzd}swczFZc\ovhzz8RQ$DC,PPLoqetq]qpOk_OmcQogGfa:XZ(CJ ;D7O[LdpPktMkmRro\}vjg}=VR)FN&FQBR*=/ABP,W^:cg,OQ5WXPpmryxәőzuqt¿~ķñdzrdC_@jND+t.m+G+N.fCY]ȏdƉ]tGe8c7T/?":!7|xuz-":)ZB`ܠ{ڟwҒloMO1Q9A-x +{">)?'J.N/dAҎi͌dqGņ[җkɎbʋbXdJS3S5<,a?^<:{¸ǽ·~jg}upI^_1IM:SXFciJhp>_f,MTC`pUr^zPkv1JQE]ajvJ]Y-F@ =86VQ[{xtjvr]riavof|ybwxXls8LW.>,=OIXkHZhBY_KedQlgaztk}SfdIbiHcn7Wf2E 2CGQ?fkZ^||^|znvx՞}rvtvĿ}uzprQlJ`;U9I3`q$D)dBd_\\dDS7O3H+:r*(nkx'7$B,E.yH(hItT];F#E%M2I4s3J2Q8U7eCnGҏbܙntInjbߨȌjȀgnYP4s7F0@3Y A +jiǾ|o|cx}iogyydm%O[=J'N_0Ue<`n>\g3NW>RYSei`orkx~m}zSif5XR8YRLg`jyzlxjkoovv`yvZf8V^5TWCcbVpmdzxppmSq|,R];B4\^`~~yw|nzpvѥ̠œvymgzxyxnjGfBY3XT:@*~3E)]ApS`BU2Y1a:wR|V۟{챏ÃgYCJ9q3i(;(8-R ? vs¸|Žrmmq}cnrKV\?TW>STMcaw|fvvK]]=RU3LQ1OW7Yc,R]"JVDT&JX3Ua:Xc6QZ;OVH[aTfjhwwy^snKjdWumd~uu}zpxiyx|~h|zCX[,CK6NZTkyTozKfmB`bGdbVolmg@em$MQ>deh|lyrsxݬף̕~wyV6]7kCD(S%Tr>}YČki?F?}<G"hFkKY:|[y[aDP4P6YI"DN#EQ+KX;YdIepMeoD[cEY`Pcj]vrh}xq~wk|vgy~uoz]ooWjpewsxqgh~|o~s[rxJinfAP/Z>iQ\JC56+{/"OB`QwgߒхnkQ[>N2hIȇgՖwՒxaNl\ 9+XMx+#H/0vyr¹zrnss|ÿÿ}pu|vPic[rlx`olYljEXVG[Y`trrzv}|sbuyF[`)BI;C%BJ/MW=ZbMhq\u|byWnvOepUkvUon_srixux~u{w~~fpeerkr}|aorL[`@SYLhk\~jzgx:HU!.>Ҟ{xt|~qX{J)K&d$ Va#j0`AjFP-[qGmHcEB++rogQTx(5&K7t\tZaAtR]LJdv[D0i c 90IDmB%2) ǽi~fyqž»tl~vbz?_TFdZsucvtOcbTjhkys{_pjVicbuqwfxzJ]aAV[@W]=V[Mim[w{d}e}h}g{e{l_wycxyn~~y}{sWaVZe_p||rdvxj||sZilCRW9LRPimp}\ov2BR!4ݘÉstxe`jkl}oe7e,g)Um+pSsQtS]>U)b5a4nAsGe>U4?",7M.iIkJ`iApIpHkD[7-^ M|;5‡yMAcm(c"y< pQiIoO|Y|UwTS9mXc{0+v%$bL39/lq½ìxs~kwuXjji~cwuquTzk8ZL@`Scss~_sr[pq^vxaz~roeut\omPcaJ^\K_]J^\Tgeeut{l}YmlWlm`xzd|~oxs`tuXlm`uzktoj~qy~bldWcaXfgppObh@SWTgkt~dw}NagBV]Nglksy~wWjq0CT#7ޛɑ{p~|~fgmfa~pc8%[# +K6f#s-!wgX?N.țzp^6Z1g;~PRpC_8Q,F!P*e?|W~Z}Xƈcljd{YmE]2T+AmCVN㶣m8&b)iOvWb@V4\FTG||Rgh4RTDfhkhwpD]YTnkvk{SoaYxijw~nxNffJdeD`d>[cTqyfjYnsM`dSfjRghOdeH^\>TRDXVWkiny~zws~|}pVigEXVOcdav{g~n[nr^mplz{~iuqTbcDVZWisj~_uJaiE\bVkpi~x~yfPhr>V`W^,LW;[f٧ϞÔ{s|r}}}Q0Fk+"\ +Tcp[pXfIf~YZ7V3[4c:yLÃSВaʎ\OIKąRɃRrEa5V)M"IX/e@yW]b̜xڨҜvΔoяmuUP4F/J5H5r*^ \ +UPGSJ$HHFx|nzx\nr@Y`(HS"JTNXNU,Y^Iqshtxuc}]zPumAb[C\VarlctjOf^Zupqh=[c9E7J9L$GZ'HY#CR#@N5Q_>ZeOjse|r{|~~v_mpWfk]ptatxasuj||xuOaa.BA%9:8JLOacewwl~~zt_wFbp ?Q>R$G[>_r+J\&CS2@;F5W`?dj?co6Wf7L35M8QgFarC`nXtxvx}N``,AF$EL1RYҘŏxxhV(NU ] X +q<*^.V(d@xSeBW6N*b;pGl@p=vBwB~G͆PԋV|H[)Z,^1[1a6ÂXʍaċ`Ía`Σvڮܭ⫂ۛwuUU9;+3&p%_`bT JH +Q; ! +[aatg|wzgxrEYX)EH(KQ8`h:iq,^e0\]Emmcs}{vhRqiLg^dznt}Lf[1OGDb`ilDbm6E)< 1C!FX)M[-O[.N[B`kJfqXpzm|vj}_w{SkmQiibxvssUjk2JL&@A5MQC[_Ugi[nri~`yRnz+L])?*A)C?Wfh?en>bn1Pb8M%?V8Sh@_s:[lLkpjcro=QP-LO5TWٝÏ}yqsM@5QWVf/W% JZ2iDT/DDg=xKtDrGDN*U^$QW'TY8eh_me[rxbu{sp}iv|dsxgy{qvz|~{lNip@]aRlmj~sr~~rthQooHfhLimOlp^svf{f}Ojs<\i:L.D?V=T@_q;[fGjnLsrJqnUywdg^z~Xw|Dgm&MT'OQHjlm|nnߨҧϢȓ~{|~IJfA9=I +p4J*t?{Yʌg^:P,L&{<Kq9y=s:w=x<}A|?xI +6 %%'ruh{uk}J_dQimXtuRppBb_Eb`_yxwvma~yd}kVxz>`b4W[ChnW~Dmq5ab8dcTvwhb~VnrWlocvzy{z\qvShmKcgOgi]rsh|{syvtd}Hfn6W\Cac[qocvtt~uwsf_}}aerukVqxHfp,P^FVJ]B[(B77OB_qDbmMlqPrsa}fqyn`~|Cef$JK$MO9_b\y}ۛɠ̚Ƌ}xsw~|{~²~h8$g-|C&{D&}F(qVvWaCX;y7n*Bq>v@xD}FGIF{Bs=a.t6k/Ro<_ϟoΛlΛn֛qڤx٤xՠtʏg`=4|(rb YL@=;A,,Xbawlyrvt\vsA`ZCb\]~wuh~rQraY|hw~zts_yxUrp[wxkzdHon9`_Jhfa}b|{WooRjjUmmbz|lwrgy{\knVhjZnoavyd|~TrtGfi=\_@_bNlnbz|pwgx]tzQowAhm6]b=_`Oif[qnq{zssrnkmsyxc{{UnrLioFhq;al4\h*Qb9L$9-B4N_Hbo[v}dnns~ug}Lli6]Z,UW,RUA_glՏ}me_`jw~{rot}|~}|~ww~~~ɿ˰gL1q8e-|D-i,p2mTW@S v,CM!^.g9yGOHrf:RPr@l|bwrw}xcy`vql}wD^Q'N;4^Jc~owomtbGgfFe``}yf}_xuYqqUon[xvb~je~WosH\c;OV9RWGcgVswY}}MstCijFimTvxennTlpA^b5\a9fk;hkAihRpnazvu~xropnnxnnXqnOihJfiStyOqzAgp2Xe)M];M";O;RdTlxd}igh}i~wztlXvtNrp@ik-RX1OYYq{sޠנўǏofUx~Lsz]{yzj[~`nx~{}}~}{{|}}u{{w~ys~t{|}yuw~̸ܜP4P[v72c.&N7`Pt&Tg v(86I"nFStEm8i0e)i+f%z:z;MēY[yMtKɇd~YrP[;U;E/{)h +YSTMGE @ <V-+~lQukDiab}~ZjjXlkqjFfcGF +85-WSWvqt}gzvo|~i}~TnoPmk[yyiedkkpr`x|Pkt>[m"AV*I[?]eXxwh[Uv}Us}]xnpbz|9T]@G"KO4bb?mkV{Wwrg}q}{l{vnwpxjtlxr}p|`zwE_`.JN+HN:W[Trra{\zrLjlWtxA^d+JO5S[Mjpdo\x|Wos[ntew{buyTlnQmpZy{Lqw1V\ CI6W\Yvzm}|hݬܛʐynSzHpxYv}zdLruOrvdu}{y|wuux~}{|~ytuzup{}|yyz}|qmq{í؜U5SE`$iakH6]et*r+k$i 9Z8_:^7^3_/g3`)b+r9h0p;vCl>_6jDZ7@E&@%3z't d SPHH +A8Ko:4ZSqdy_~vuoQgeOecc|ypC]\@B8:2XY\x{etmcrmpzy^ppKceMegWoqglqvrq_wwLhkDbj2Sb66d4(nYiMoY`y6ZV0YUMvrhnloyQbi'BM8G ?Q7N`Sdxiulvoyzq}yo|sy}ueww`rtew{i{^ovUfmXko]rsg|}Urn9XS-ON/UX:`i-S^*QX=eeKjm4SX&DN$BM+IT@\gZu|ebx\t~`{Zw{ij~p~{p`zwOnpGho;]i(IX /?%5 ,?.O`Qq]{PmsA]aRhef}wqs~u~vl|yRba-AJ&=K%BT%H^AX;N,P`Nn{\ya~]y}d}ssLZe!2<ڗȎ{|zm]`wxg^egmrqX*W\EM&W^);+?:N-Na7Td2NZ,GRJ_`dxvvsyVb`8GL.@J%?N&EY-Na6UgD`lOjsWswku|O^e!2:ڜГŎzk`dpiWHu{CpvTbaYT{]cefcT|~:cg1\b>kqEpvNw}LtvW}~`Z~~Wz|Loq[z|kty|yv}|y{}y{{~~̼lSYjN{8(Jh8"~MA!y)p *`i/.y'+o%cYM +I A5Z$`O{^zUlB_Azgɡ`uf_qeºļ½ýý½ia^7_a3[[\^xwHecQoolnbNz{IuvNxvMvpJrjn~}p`tu>U](HS,QaBQ4E+<%`a)IH!A>-IJLhi^z{]wvQlgQlgZnoav{Lel5S^8\h2XcHir\wf|lmd^}`~h}n|}o{{x~}~|utorx{xpXrsJfjC`dPlpYx{_Muw6_a8`bGmnKqrOss<`\8[TXynfypp~l|qc{{Rpr<]b$IR FS)N^-Pc0QZ,NW+MY1Rc0Pe6N73";QMcpcwxpuynfxx]oo`sqr}r^trXljk~zzfOhl̛zxwrodh܎ăwr}wtpqeLtv4\^8`bDmo[aMfj\vwly^xD^u0F3 ;N8RaThohzzzw}l|revnYiiObf3JP:C$BL,KP0MQ7UU:WSJc_auswxfquGbkC^iߪџŏ~~}~}|upqw~pnspkfagx|uo{ԩӇǁz|{~tpoY50$'*)558> +41= =1.839>H d 6'7'B%G']7rFoAf6lKH\cgyy}|n{rgtkRgjG^d(CL )4(45?%GP8[aEgfQome~zzqxY_k0JW/IVާɖ~vq{~{xvzntwx{qijt||~}|yxqpii^QWizĈȌ˚ڒЁxkipvsxqmsY3YZ4[ZW{{srfgtw}{{y~~tt|~z|vt{{yxw{xx`](t. +]jx0$`SFCJ I BC A,$( **. / /0 -**5<<Jr0"G5J3K3S2X3kAyKp?g6tEȈ\iFW( +    "ooyziww_oofxz{{x}wm_|buru_:_o JX#M[CFL:ahSnwdr}v|rjxeve}Vt|FimLmrRou_wykk`yubxpn|`olZeg^nnOgi:XZ%DG:Y\QmqNek9MT(DH#BD/NQEbfMim@_d9Z_D]aaut|zskymymzm{{jw}VelK_fC_cFcg<^_3Y\)V[(W_0[bAclYpvn}z|z{~isuSbgVkpXptYstfuk~|nh{>R[ 7E!.).9,GNUjmwvykvn^qu\qvC\c&BM>I.NYBdmQtz_|fr}}dnwHR^"9G!8Hࡵ{vuy{xwuu|ou{||slox|qtwvvw|z}zjbckrmhqsw}rlmpmtkcocMqoHji`}z~zz{z~tw~{z}|{ztv{|}yx}|{zxojt{|}{zvx|}yѩҧryAN%n# ZW\he^ _^U ][F3 ""!#,(,7;>BEZ =*U;Z=_@g@mCsGqBmfnLRHN4]cJkpZsxh{qtusg\|{[ywTqobvul}n}g|uhwps~lxteopm}}cxyMij1QP9WYA[\4LN.FJ9;79?C1TZ:[d+MV"IP3PVYqsxl{qqi~hy`vseyz_pwR`k8HU;Q\IdkWvyEml/[\LPMT)[dEnt^{nz~y}P^^3GH;SUJdeUonc}|ui{{eyxWjn,CK2<2:=B߮˞{}{ywtuu~wy||~wtuyxpqrnmpx{rvwpqonssrqmflhaotsku~zsw{~lbzk}|snz{x|hOwwOww_rxrjeky{rg[}~\~jt~tc`~~s|~ydKqrGmn_v|w}~vxofʗzಀJc6R2z6h&g hh!n,>(@0{1&r#5/E?y?;[,&@/ +'& (37AN N IIZ r.>#V6lIqLh=c6f8n=uFzPZ}[{^L:- +   4CJvo~yetojyv~|[kj:SP?_^X|uvswvopnxzuqk}Rjv=[f=_kGeoGemKfmUnr[sul~{qnnk`VxyRtuQsucYzAfn5\aDlnSyzY{z[{xc|xorsmd}zc|v_vncrop|zyvr}n{m|yktspz{rg{z_yxJgeD^]CYW?SR;SS*HH$GIFK*OW0U^"HQ KT.PZRouqe{y_wwc}~]wv_xuc{}`w}Ndq:O`'>N6R^Mks\}Nxv2bdLRIT"VakBFuNOfc|ux~zzrwyu|xwucuRjtTozWmxSjrTkqay{jpvttvnYuvGijDgiaiaUtwXz{^\zY~vYxpd}yk{{sun~}m|yjyrousy~z{upz{mrurz|p{}^pp_xu[tqUkiOb`Tc`VljFca?cc4\^7^e9_h)Q[*U^0Va>_fSorQklOhlWswLejLdhVrvKfo4Q_$CU;N.O^@bkNotNxv8dgJT >MFT'TZ/WW.SLE]acuy}wxgwtKa_G__Tlnav{h{_ns`pp`pmQa^JZZSgff}wx}{x~muxitpݜː|voqmnsqownehushky~{|||~~~~}khejbVtvCbd@bc]okSut=`\;^ZLokSsnPpk_zp{}vpimotwk`dipekmkvmjmv{xomrsn^Pw|U{~l}zwodHmu&MT(QUGptgmmf_^[VW=kkIIFH+X[BmsQzOv}SHtw2_b PP*ZZCssHvt5ca,TS:a`RyxclxoRqs7Y[1SU4VX@cePvweeQ(VVIJ:ceaqxy}~}qBei-PTCfhi̮QX?ɠlvEmA^6_BY=P6G(=BK+G-B"h%q&w*6(<.l*o1"SEl`[Os7,t8-~@1t7%o2L4M1D!I!b5p@l?l>i9q@tCsD|Pшe|`^Fl%1    +FrnBts.`_IF0ZVNupfqwhBkg4\^Q)DT2Y:R1A!z08=%H/W@Q9S=ZBJ/N1]={I(s=N+c5g9oCvMrHi>b4b1b8l9p7z@‡[v[@3S/% 4M(/V18P).O"'ONSVKIKJGFB?><;503,07 +1 4 9 2 (%0%,,0+)+6J%,iFLmpl{mx|w|uk}hyn{s~}~{wz{|xtn}au|XtxY{}Uutajc|y`vsf|yorrbrqL^`Uhnnk|apsiwxv|y}u|uv}uy|l{vZllYlp_pw^ovUdkVcihrtjorbdcbb`gssdtsVjhPkf]|w`}OqpDfg=dk7_gIU)Td4^n,Sd!ES-MZ1Wd"HUDO%LS+QT7Y[Aa`EccEgf:]a)OX%PY KRIP%MW?L3C APD`k]rucoksxq~zw|~r{xu~yr|ltvkuw{qx~uz~}qmaܟȈ{xupkdifjme`ZN~Wdjqyw{{z{fUutXz|Y|~PswYb^jmp]{}SptXuyhoeee|{{{~~wxz}}oY=kk4gh8npZiec\^`aefgl`Dqt3`c7cdPttfj}hi\Ajl.Z]0\_>jkJsuFmrOux\`Y{zX|z\_[OvuKrqU|{^X~JpqAghEokKxsIvqM|tGvpR{YMyx@ieCjeWzvlppeOvsAdhGoqHqu>kp2_d6agOx|_ZXbnuuvwptfEdv>N +8G%T^FruSutyʀh^U/&Gd+f|X^6\5]=gCjDmFb:U0U2N,[7\:W7[=T7K.cE`jKhIrTe}]_=S0T0lDxN[[{Ll9n8wAo=xJwNiEM0[(5 +*' !*3 = M\ XMB >@EHHIO MILLGGGC>?<685@ 53 07 +%9 V4*yUGZMg[h^pb{gjR]@b>$H$ 0 .K5(xof~osru{{~~mVnrWlqdy|}up{}{zp||n~}wypVms?\`EgiZagkmosvx|fvuRdf\oungy}_nqgwwyy}v}uvw{~n}xXlkNcfG\aBW\?RXL]d^mr]hj^fhpvv_mn\nn\pn]vra~zf_}{QooIjoHkq:`i8`l6\i=K1=;FBO"HS-RZ=`dKmnVtt^xub{w]xsOmmGhmMrxAik-UW)NVDM7C_;\6e?b?eBc@W1d;WȍcѓlߝzߛxuRV3_:lDlIoG|LTSIOŐ\НpύjdL2!P *.2 ? P\bjri` eeQ HOS Te^P QN +GJN + HAFB=B?B + 7<+"K$o_~zhjXYIQASAgOkM}ZX~W|XjJ{]Cxaxz{`zwUss^||y{mvZaikrx{xzvc=`bFF'QPGqpfjjku~rbtvbuyfydvzewyov}v{xzz|{o|YnoH`dC\a?X]9RWCZ`Xmr`swbqtiwzdvz]qr`vtazv_zug}iZtq]yz[y{RqvBcj9Zc3=.9;C!CM=_hQrw_~nttyw~i~wh~s`}Bea;]^:[`*KT4R\Jch^ppmzq~u]knP]cTaiiv~{x}tyalfbnncnpvwr}qzuyzfnpltv}de_ᕻ{nwz|~rv}~u{zrnppnorkkjc\TJObmqz{w~{s_W}~X~bmbOnqRqsYxzVxyWyzcme_[{z[xvhnpwwxuvyz~ywx|{{xtoptdOww7ee7ijBsw]jqf`c]|~Xwy]|~`dVxwSwwX~W~Y}\{\{vnmfdkojkrxst~xwlwq|wkyi~wo}m{p~lzkyn{m~z~stwmf{mk`}yXvvcjZ~~UxzZ|~Xz|f^SzyW{yenxyx~znkp}x\x|@_dDelXx\yRnD^kRp{9[d=aakbSY=:>#S'O@\JZAlOjI_:\5^4\2X0]7c=_9_9jBnCi:d2~MהgْhvQW1L%i=Z\nAm6Kcȟiϔh֐liXCU"01> ? 8I J N R WZ]^YTVT IEI +I +GU Q DDEDHFC>B@<@=/.%'I"o\uczK;Q&9 ((9A>D M(U/uL6v]}׸ɧŢħwkjwwo[hqQYdjs|z~q_}Ntu:fg*XX0^\Eqp]^]{{gx|yzupk~bu{TgmTgk_rveyzp|wvj}{ZrtMfjC`d?\b9V\>[cNkqYt{\uz_w{_w{VnpTijUkh]spl}tm}qp`xxRkoKdi3LQ1JO7OS?^cart{|x}{}~nWumVsqZxzTqwZu|d{j||vyq}}brrYkm`rtwv~r{x^llSabapsjy~n{grvjsxrz}jouBKRDMThoutvsbdaֈ{xz~|~}x{wuz}pjqsovsillede[Vbjinuz}vjwuf]XVYe[~HjlNmp[z|`fhrqmoqxyg|tyyupwwwvqpu{vooutkkr^WIvyK{L|~W_ka_c`[{z[}|\~}]Vvs[~za_~cWwrIfb_zufgiknortu~u~|{~|x}syn~tl}snunus{sy{{{sk|t}qi|qkd~{`zydf]{yfpb]z~RxyGooNtublw~tmm{~ky|ex|c}~dloa}LmtIkwLm~OnWtfUquB^_s֑v=%%P38' ,9Y)N;gQpScA_9d:`6[1b=a=a>\9c=tHp?Z$X$e4a6V/Q*Z0qBL|J|GP̝eڦtΔlpTT>k("? +",AIJ N EKMJMSQLU ] VLQ +YVTWY[Y SU Z[XWSTX\\K F}]RkZoXtjj-LPS& R% 8> ? @/#$+B]3#vP9}cѯ巪Ɯ{ovi||ollNbiM_ict~j{o}td{NmrBjlBppGuuMyxWWz|IklB``Xppqm|_mpbpsWkl`tumh}Mah?V\KbhWosl~~v~m}}]ptUlrQjqIfl>\d:X`>_h>_h8Y`CaiXu{`y}ZtuNffRfdgzvvtq|y~pi|zbvu^rqYkkWii^vvw~xy{{|}f{r_ypb|yc}~]xb{h|p~ppnlnmmvum|ypru}sm{zmxtN^^IR[dnrqkonz}xy~~vw}{op|~w|yosvnpvnca]Y^eryrv{||}vd[p}xg\XV\]d_Tvx\{}inqqspr|}f{k{{tuiYwu]zxgoqortwsgeoqhabYZR~RM}R~Xh_[_\~Z~|]Z~|X|za|gegqc|PjgZtqc}zdzj}rr~pyv}}z}y|y{vy}vyjzom}rnum~tpwryw}}|{q|h{uj}ywqi}dzxXqn]vshc}zb|ye|moa}ZvzQv|FnpNtw_koqldb|}bwzcvzfx|gz~g|f~roc}~Zy~TvHl|FhtPqze|AWTXlcƺų=) ! >!&0/ %F o<+`JcG_=`:]6^7`@X:[@W:X7iBl?_-PDG U1V2f=}OxE|DƓ^umoUL9d&? )/B RNHP\AL S U X ][Q +Xp'p* a`b^]e_cf^Y ZW`]U Xc k("e"M +X,!շR:JcKn@0o_d/'CK}TRlfT1+/,.; W*%NGaX~OE\6-hKCvrj|~\txE`gPmuUpyWoyaxcz`yQowDioGnsRx{\bTsvJgk3OR4LNShi`uvShiH]`IaaOgiay}czG^f3KU?ZcTp{axj~qm~_pxPcjI`hKcmA\e5Q\/MW-MX(JT%GP1RYAbi`|c}~^stdwu{t|nzvv~~r~zs{p|xwxzw|h{wRg`Wnh\ur[swTlvZp}`tj{~~hlm`eh]iibrqp{}rm~x{jvt[kkIYYKZ]M\aL[` YTX` h +ogTd c ` \ USYb cW +X + +X P QS MZ + b\ +X ^ Y PX +V X +UY +Y +[ +^ VJfVĩشѮdIM^ HKZUZ +SH eWֻXBZ+~K:PCa(471= +]-)`67L(,D#*q`fesvBad6]bAhobdgnjd|_u]o{Zlv[ltcwg{XptUmoekcf]{{c]y}Fah1MX,IW,K]*K^%DX ;N2D-@QHYkK\lBUdDWfEXg8N\6P]9Ua+KV@I"CH.OTB^_Mgfh|{yyxv}lvunyuitplupvx|ovn|~~iyyVpq]uyqoez{bwxUlrOep=Rc8M`9K_O_op~}r{ajqaj{ZfvUbrSalantt~wwuovwenu\gkSadYiicuu{q~R\f;CP5;IDLY?CNDCKBBJ=@IFJUPS\KKSLKIRQOx~~rpoovy{uyvg][YX> dm#ho1v}KT^]RyX$4MGVirudtTdsQazCSj4FZEXgfxnsu_v~Yt}Xu}^{b}WpuVoth{itx[efVb`Ra\Ra\^jfs[_kuIDI`fcuyestaqpUhfK^\N^]VbbnzzbelKKW=-%#6(%TFC}~x{wruyx|pjqy~{qkmrk]PL~=t{0kq%bg"af4sxCLP[[SvxKnpFikHkma~gox}vwtvto~q~xyu[ut>\\)KM-SVDio^lkuiVxzVy{eg]~[{zRyxIopNvv`if^ZRsxOrtOvuSzyV~}NutEklNtwMstU{|KqrGjlQst[z|^z}[wzVrs]yzVpqLfeWoo`vt`vte{yi}e{y`trh{ynfyw`rrZnmXkoav{if}[rz[nuaryetyguxn|}tso}}m{{iwxdrsitvdoqalnfqsftw^mrUfmUhnVpq[txaz~f~f~d||b{xb{wb{xYomZnlfywp}v~x}v{x~s|o{p}p|lxxk{zqe|vlzlyiyvm{{n~~hz|ewydp~du|f|zd}yfzxq}}F4(f]LĽϺqYQ>tePnnpn~xjbWRA>k&!` UF>@=9;EJQ +Y agj n$ehjbXX][X[_ ] ^ _ Z\ ^ XWZXY[ +\ ZVW] ` + ]]`b _ Y[ ac_ _ Y +V_ +fd ^ \d Y<mB2ܚrXc + aAd:.xc3'5C1 jUɶͽ_QXX \XV"X(L2.@ STC:% A,1t|ush{ZnuQisMkuDfo;`fCkkW~khj}zvqq|gtzq|mx~kx~ct{XlsE`g6T\5W`;\e?`iFgpRnyKfmUjogy}|tt~xud||NjkFbeVotnv~sO[[9GJI[_ex~mu{sXls@XbFY_UhngztwRmt>[ce~||tsud{>Uc*?Z$B5 !9%:KBZfA[h-GX2@-;+;7H6OcLbyThVgMl~.O`&6"1=I)QY(QW>C35D`cpztauvK_`DSV@KEMVSimldeg75:%'#1,(7#+-14OTP^[V_VONA9-7&SB:~}~~sruusuuuzt}~tpy|wplu|~{z~sjefjfZTCvz0ei4kn8rt9psBz{H~?mm>jkS{{_Y{|XxwUutTtscjs~||zsrpntyvb}RrqGjlJouTybifttkedZ~~Uwx\~RzzRz|Y]VNz}R{}W_Y{}[\~_TxxAdfIlnY^MoqIhjPnpYrvc{av{Zrtbz|]uwVnnYqq]uu\qrZopd||lavw_tulnh|}`tu\qv[sw`w}`w]qz\pw^qw\ouky|rxs}~jtufpqfprfprfotdosaorcrubtxQdjAX^CZbJfjUnr^w{c{}dyzcywdxvcxsdxw^qocsrm|yw~}}wxswmvozo~{frr_onfzx`{tgz`yuXnk\pofz{g{|cvzavwi~d{qltM2;ukܼ˪ɧζӸçpk[dT\KL6k;%e6&T"H +MI +@9 :63CW'_-$^)%][_dc gk"g"V Z X +TV`e +cb e +d[ ] ^W Z` \ \ _ +]\_ _ `[[__\^d + +b ]XX^ \ +[ + _ ` ^ +ekic _e cDN uj[S^ +VSXC zUC­p_7B 6 +BzpYRP` ` \ \ i-%e*$[& P!2*HMJ3 +2 W8@rxj|YlrH_gFck;\c.QU:`aNutgh}~j~}shttnxyrz}owznu}krzens`nq^ptSkoLhlSpve]{Zx`}]x^sxfxzwuoyxistfquWjpH_eOhojxwGUX);?;NU[oxjvvq|tpawZtm~vuq|nIdm>[cbz~vqtuj^w~9S`3N65/ 1">L'GT;J 1A(8'8 ,>2G%@U5MeFzgvyRekQelMdlG`eVosgpoo~p|grnxzqu~krxbiocmoftw_qsZor]uym]zKhpHdoPktOcjQcgaorjuw_hmSZbIQ\4DQ'=J@Vddyotwdru5DI)0$:EBZf\tstirwnvyusuvl{p^ry=V]+%~~{uqrsfemldhmicdejquv||tupkjd`dc^S{Lt~NyRO|P}TS[hrvlVvsNnkctpmpvvxwe{xPfcNgc^wsh~lmnopsqj}ilkaW}^oyvmfgd_[~W}Py{U~U~Dps5^b;ceQyycpikonh][}~a^||a{|nsnpvyvzwljk`x|d}jb{cojglh~f{|i}~k}gy{dxyg|}g}oppo{{pz{t~vtm{~l{~g{|`xxWstNkoMlqTrzUlr\qvdw{j||m}|m|ymyumxthsonyus~zr}yr}yzynyudts[qoSmlXqu`w}_v|ZsxWtxLtvKsuJpqPrs]zxi|xy͸ԱoOhϪḜ٪pgWUE{=.\$MV Q A@HJGA +> ; 5645 E \8wRq̛z}dUFt.,]R LOSRUV ON P + LLS Z + \ ] d b b ] _ bZ + Z + b a +d e dfh h abd c `]]a +_ dea^ Y +[ +bebe` _ +eb c Z_V IHLP O<Q&}ϮzM8D\U +Su#']`[JA _jn^^-ZH{ZIO*87=< += B%`LNviwzkzpns{wrqo{yoyxwtluz_ikhrtr}lz}etw]osYmtG]h.HU">L1KZ8N[EWaYgpUamOWdFL\;BT/?*;3J\OezPblUho`qxYjq;NT%N>J+LU6UZCacTrr^|z]yzZwuYvrkz~sZjjHSUBJL687'%& + + &9)4LEMAAC:@ :2'+>d9(p\Ǡy\dDI2l&U OO O +NTV U +T PJJQN JQ Z \ ^ WUa fgf] Y +_ \\`bf g c ae +i g c ` ^ \W`b[ W +SV\ e^ _ ^ +^ +_ +[ +] OY ] UTYQ Q =wMAܶ޺~gG OZ Z +VLOLNPiea QD\3`Mtcq?6B 07=*2{lg{}|x}z}{m}}o~vo~ut}|ytgwwYghcnplvxluzlw}cntL]g8JX!8H)=2H)?TEXiRbrP`pP[mNUhBJ_#4F4D1K\3M^-CP6LWK_hVipMahF_fPmu_}g`vGYc8FQLYanw~z{zym{~YkoI]d(CN-;;JAal_{g`xz\uqId]7WT:\]:X`(FQ.<2='JP8^_FnnJsuPy}LruLoqSsr_|zp}~wxqO]`JW]N`dN`dGUX>IM9;6!/<()5!":')M=>J;>B=:JKC[]OgdSobRq[MlUG_FB:!}yqoopqngdorkkdlmlid]Z_^clw{|}dQx}@kq@krMxTVQ|MxGq}CmyJtXVFqwLsx[ittpuvh}c|ykmjie~zd}wjwz\ro>WSE`[Yvr]|wimf`}yksqrhif`\frskc|yhi]}z_f_[Y_c_`jsurpsd~}a~|ph^xwSkk`tsj||orl|{rtul~k~qjaze~^z}jfchlkc{h}ex~m|vtl~h{c{mrurm|wp|xpzp}q{}kvxgwwcwx^vxe}hbxbsz\nrapssz~syys|wlupepl_ki]kkdtti{{hz|RkoTsv\^W|Rw}NuzDmoPrqNnkSpkju˾λzz]`>h;`,\"A +443@??:? 9AI FF + > + /$*iJ8nөݴx^Hh0OR SPRQ UTR +QNNR RRZ S HOY X W U +P] d a +` + _ __ +ZZ]ah f _ `f i e +`\ZUW``Z + W X + +\c_ UX ^ +a _ Z ^ P Q +V[ +YbU P5g^åTG] ] Z _J G I T L V RS +T GU&P@k]\Ni9-5+## iXP~}~z|xdxvg~xkwgswvzu{scwvSccWefZdf\ejipxfmwUam7GV$9L %= %? 6N@Rj@QeCReJUiMUjBMa(9K)@P5Q]#?K6D%=I6LWFZcG^dKfm]zkgIdo!8F)87GT`mupz{pvtoz~qhw|Obi7OY8F -=?P3UaLju[vay{b{wEc[3SNImkTvxGem!?J:C0SUEli\gjv|w|xET[(1,7:LVL`gCT[0=E%(!) I:3WD>R?9O>7PA89v|tmpkgmlilqssodlnnmic^[aemuwtlhmaTyIt{GxQZW{X~WR}Ov{Vw~b^|KkvEhnRw}fpvzym_|xRroXzyghf~jiksxe~PojZytnoqqkd}zf|jknnke`~~chf_~\}\}gmfc`TR~Qyy[~efjnmmgimigjklbxvawtg{yh}xl}pm~skez}g|h}ezcvzdw{h}ja}Yvz^}d\wRjt]qxau|knl~w}ryfkoqhvwftul||dvx||nqzdksgv{ib{^tfxcuw[mmWgg`nouwjrunvyk|vgwt^lmWdjZip^quawuc|xZkrXptKjl9`_9b^Mpj\zr_ypnpĶʲhbDvL3Y+B 70069B + 56: 7; 7A3 +28 + 56 +;]F8jVoշ۷lWB|3$W +KMW V U XYV QONIKSX +V + +RPKNU S QX +WT[ +] Y]] +_`a _`h ldc +lkd + +c +e`\ + Y [ `^`a`g` Y _ ` ]] _ f +VX ]S +RTNR < g]˧[EZ +[ T_U R W [[W V V VZZT m3'hZxfVEU05TH:|~yw{jxe~zh~cvjzksikwfjv^gx`q_z]zxRfgVde^jj[ii\nrXkrK_hEYd.DR)<&;%;P6OcP3B4B,IY'DV1M[Lel`zyRno6S[0A!4!;JH^iZmsbtxdvaxeRt}/U^>J9HEV6W^HekZrtj~czt6QL&FAEiedWuu4RR0NNKigb{y^qu%.J=,MG/MG1b[HuiY|l]i[qTF^<0>>xyrqvtmkqrtsqsqmpntnih]abgjnqg[WZY~[XPL|LvJp}NtLt|ItzPw|_lcJkt:]cKqt`jq|zkZxvQqnSwu`fjoppv}rhqwtonnoohbzd|kkhcced`~~`]|ae^V|Luy>kn:fgBjjTwyckuyqd}zbzzgoomkjnoni|h}xrui|zk~mlji~i~fy}atx_tyZrvJfj?\`DchMjpKfoG_i[nufyk~i|kzn|r{t{i{}k}n}ri{^sx_x|]y}\ovgt|ls{krxkvxewwcwveyzaswK]a=NUM^efx|l~fxx_rpgzvdts]lo\iq^mt]nu_stfz{cwxVliA[R7RCG`Kliwb[Hd;'F;2(*35 +34> + A :? = 2:HB*#+)B"pYGο缩Ǔ{Q8_" L FIHS X V +X [ W S R +R OMNSY SOOKNV + U S TTT\ ] Y[Z[`e e ad jljif aa +dc`U[ a_bfbc_ _ ea_ ed a UY [R V + +ZP O +K`Tȶ۾޾ڴu5+IX]X ^[Yag n'#l%!f!]X YU JS +d*N=fVm]mG:' `N@ķ~r^wtUqr[uMgvRiwWisWfmS`fHYcF\iNmhWqpVim`nqfqs_mn\kpRelOclSgrEXf)>O!6I0GYW\8U]ATb0FS!7E-? #86H:R^OhmA_a;V_*DQ2B&B&5 +4;yvtsturikqtrnnqrtnvoptbekldbdXMy|R~[RzIt}IwK}Gy@ly:_o8^i[_A^bHekMfmNem`qxopi{kz}itxisuu}oz~lw}dqykyeyNirAcl=bjNsye~nxfindjjjvrj~ugrpTem:LVG[fYmv]uw]xsOjaXicUebVddcoop||q}{p|xtz~~{y~xt\vQ>_5%M> 72243 +2 2. )*: =: := = < = &K&uODk\޽E9q']QJI +S S T OIQS HNR Q +NO LKT + PNNJMV T +U TVWa c` c_ Z_ +hic `htlc + `^\^ + +a\ W\ + `X [ `[ Y X +V\ +[\ da +] +PV W MS ]WR C]Qò>5JX _[Y_]ch!afc[Z `_U O +OU _'SEj]fB6tiƟz|w{j||\uzQowFfu2Sb6ZfHipPlmNffE]_AZ^@][Phj]pvhw|druVdgQ^dM[fObiZlvQep6JU'=J0FS5KX,DP5NUCZbThqVimRfeLb_\tt`y}ct{YgpCO[2 % 8-DVLhsPmqRmvNdoCU_@QX7IM*;C0BN9UV>\\OrnZx\{b}c{g}g}jwQh`E^XPkfpwwzczpSngGf`$AE-2#.:E2MVCUWT]XX[PPGB;0*/*" ! # 0"G;+[POYHY`N``^riYn_iwhso}{bkH\@16$CH@Z[Rc]ci]ijZeZTJ;6- 3!E5(ZK8hZ?l_?n_@P;&. +3;;kjtthgeV~Kx~PZdaLArwGw{WorxzrruuyqjdJu{%!$7G+*@(&4!7$I7#aM4^I,O7B%98F"$J&(UKzIxO~YaW?kx2ak8js:ny=v?x1ho'\b1cjL|P=irDov_d]TXTV~\W|Dlt>mwL|]^Ku;grGs|W]~a|PloNnm[{xozvoi~Zws[zua}gotqfVxyHonFnnPvy\{ekhckgcQmnKgh^z{`|}dbih^z{_{|bYwwZxv`~|ba~^~}\|{VxwRtsVy{UwyNmpOnpY{}Ux|=di+TX@hjX~bZy{Zvw_|zb|{c}|d~{e~ZtsPlmSopLigB_]C`\Smlc}zf{^wsbysf|ycwu_sq\qldxv^trNdbNcd^trg{zbvtXppYsrSpnMjhKhfMgfUjk_st_srdvvh{yhxwgwti|xjxf{t_us^st\tx\txKdh>XYLfeYvqi}qtwtzpkm`jkY|zc{j\Xií|Ĭ|ӵʭucYX{J[0wAd.Q> 4.)+22 ((1 2 +,*, ./ +% 7R;-}hysĩհۻ|H=5-R4*˺vP ;D GO K CEGDDT_VP + Q OMQS R +Q S W ]Y W ]\ ] [ a_ ]\\ a ] Z +] WV^ \ + V\ + bY [ ` ^ VXbXX^ _\ TNW [ T T LKU V VZ XM R YS QJVM +9mG<֯yV KS Q +U +VX\P M +\a[\d&` RRS`j(g%_V +URX*@ 3 VB9vmvuqR]_H[bTvwGjp,LY2N\Qdr[itXenM[f-?W 9.F:TeVnxh{q}}q}}hwrjyrj{qizppy~~{ezqbvwRfg4HO1? #: +"</D.IZ3P^6D'CNJelUns>U]!3G(E;/ + 8(=PTdq~xi~BWXPfc~xtdjh[aadmlmwvr~|Ze]grjkxoitl\dYRTG\VHbYHiWMM92;0C%%G+(9!-9#P;(bJ2R8B#;67<@K}@pz8hr@BP KEHH DH ]d !VO P +R R QU +X X QV _Y Y + [ X Z +W _ + \ +ZZ\b ] `b] \ + _ WUdl] ZfiXS``^ ^ XXWU^Z +NPRPRSX NP IS V MS +XT QF> a2(b!LNNJOS O YQU +Y +^X Y i'j'ZQOY e!bf] Sb(sE5kD5G*;(YPA\^SP\ZYnqcQwx%EP 7G?O_LXhERb7GV-I6/K;ViSnwg|m}|vt~mzsk{qk{pl~pw{}zbyq^vxXqu:U\*GU;P'CY3NaA[j1N\0@5B-KU3PX,DP0F$A (C454IHZhu[utG`dcw~xitz7NT/14MJl{kz`~vTsmLg`_vn}amk>GF?HGV_^dnmiusknetzpu}rjpfSVKGE9SK>\PBE3'>';, 8D'#J1*F2)G2!aJ8eL6H,63-30 . +=t{=t{2dmCs}N~SL|@r{Aq}@r};q}=v>w4mv3jq?v}FuDp{9ep6aj@ktCoxBouCrxDqw@krNv~Y]RxFnvT|XxPr~GluKry^lrwqd||e~h~jzn~}qwmb|ya{xayyj|~tqlKjl9]]HllVxyVtvc|e\z|a}~ngPlmC_`EabUqrine`|}dhcTxxJnnMoqWy{ea\~_TvxGik=`bSvxQtvOrt`cTwyPsuQtvMprZ|}QprQqpMkkOljVsq^xw\vuYvt]{ya}YvtLigJdcSni^ytfyc|vcztg~vkykycwudxvj~|eywbvtcwu_sqautavq^snRicPie\uq\uqZpm`vtfwqm|h}xcyv^uogvc~m]xeG__C[]7PUSnuUquTqmZvjOjYgz^pwlW_/eDbD_I§xŮjUMA6h'~Fn/aM +?>:643 +-(+3 ,,+,, +' ##;fK6x]z̪[BU > > yoǹܺߺr\8$5qθ̯~ZJ.A II M +DJ G +BK \]R INR VXS P +X^_eX +W VXWSVW` c +` a ^ b a ] b_ Y a`m^ V`iZ + R\d_ WX ] +Y V _a +W[ +TZZ X W MT +P T T JNX PNKD@BLS R T NLSTU +_U QP V bh"d[ VVbgl)b#a$\#\/zV@iQp`I`XCdcQ\dUbreevNki7TX7?2HUJ[k?Pd(:R&H,I.CAM?^cJbdUaakqo{|}~{}y|ysayyWx}Knr+RW'MX.Sc=]lTozNek1MN4>'8,? 0A5B7A3> +4D 5ECP;]gRnrmg|}.JN.93MZNdq\\`|}j]qr?NQ-0.8:R[Z`ifenim{nt|ovzkqrbTUGNL@KB=J::4 <&6.:XA1^H:m\LgUAaJ:_A6;(*.) # E|Cz@r{RQK{Fv@r{IyEw>r}>r>r}4hs4fo@ryFtGuFr}Eo{Gq}Gr{DpyFr{Ju|Ow]aaX~KqzQwWtMmxCenFkqZ{hmqj~_wwd}hizjzyk{zsmhje}}k}vob|{Jik:\]EiiUwx^z}kkeb~keWstUqrXtu\xyb~mh_|z[wxdneTxxZ|~Xz|]Z|~UwyTvxIkm@bd9_bLruMsvKqrY]RxyNtuNqsGkkPrsKjlPnnPnnSpnYvt`zw_yvXuqXuq^{w^{w[urXro`{ve{gzc|vaxrezsh}vjx_rp_rpcvt_rp^qobusatrexvf{v`wqVmgTmi]vr_xt[tp`vsbuqcxs^sn_vp\vmd~s^xkZufNbcQikLejUquWqrQfaYi\lygnfZSn=nJyVM̭mƨleQz;x8x:o4a-yD[ H C<8= <951-//.4 + ))- #0 T8*s^վѽz|Ѵӹh?-; 7-b]ڿݻ{Q%#"pXNԿ̮ǫzh> 6A DF>I L J R`bYQ W +[ Z WR MN`] ^PUY \ +Z W +[ ] b b \ [ X Y US] _W Z Ua^Z + ] d]TTeaYXa ` ^ + +eedbQ ZZU W V U MMS +P PNRRO IEEINNQMKPPOYH LN +N +U ZYT PS +]a!b$Z[#_'V d3"XD}j}[od8QK)GE*IK@]aOjsD^m2M`8T0I2E"BM0MQ9NOKZWalf}{wuvux~l{TllDfo9^d IM*RZAisSu~]|~Olg8VX:D&6 3&75A$DO)GQ$JU8]fUx~jgohxw:OT,6'*:#9G*9'%9@Hdhp~rXpp8VV)MK/VU,PPBdcYyx\vuKcc3HI(::>LLZfbdqjdqhcoabj[km_stdfgYZXLLC>A32D0%N8+O8*P6'X>/nWGpZL{hYq\KbH;T6,7'$##"By>s{Cu~VN~Cs}nz=my6eo4ck>jsApzFr}MwQyNvNvNyMxRyY_Y{TvQs}FktEiuTp{Tp{LmtLmrYx{elnez{^xuhpmj~|i|zph~hmmpwnayyYwwLlkRts`jrkda~|fda~|fjgdfif\zx^||ghb]PrtQsuTvxSuwNprCeg?ac@ciMptQtxPswUxzX{}SvxNqsMopDfgFhiGgfRppYvt\ywa{ze~zdzZwrTql[xsdzdzc|xc|xb{w_xr^uo[rl\ql]rm_toVfcWgd]mj\li_olgwtgwtk{xdyt]tnUnhVqj\wr`{v`yu_xtautaus[tn`{t]xo^ypXslYrlcwx`xz\x{Yww\uqVdWstbyb_oƩoc_ǥe\Kz8p,o.k4X/n=g1["H ==;66 286.,38 8 0 +,#!7hN=e|ȯǯs^qX9rZ>ʵ׶ŭԸqK@,0&mJHҴ۽ܺˢc7,)$P3-ʪȪ[5*-<BAAGL P \h #dZIP Y Y W +Z ZT + Z \bU Y ] ^Z + \ _]`\ TU RZ + SQY X PR NP YY V + +]^W PY ZUQY[\c lt"$lTZ W PUW P FFHLM BLLLL JIKLJNKILJKTFLO +N +N +Q +R +O NQW `^\Z^n0!]$X%e6$~TDŲŽ[k^5OF4UNBe_RtuEgp3We'KaWT0SY3X^'PR:ce^pp^}nIef+JO -:#21=.OXLiqXpz[wzfzykuzy;LS&1 +!103%8!2'$2=8U]Njn_x|^st]qrPmkDbb7YZ0WV7__6]\GkkOqpTrpOljD]ZCWURb_dsln~slzmZeW[aSln`vwgnoaXVJKB;C52XF8^K=gPBkTDoUFv_OnXJmZKlTHhKCX70>-(!& + 0-OI~N]SQHwr:^.}G#e.TBE A>? +> 9 9 +93.)(&#!,C'nSBxսֿzcsFvT.a?#= 3ze¨ʯټnd1 2 )R,)ŪҸϯnF:.,:̬Ȩ¨{VF.=C@GIJM +V[V KWWZXR R Q HENY OQV +X V +Y [Y + W S MRR X PPS MGLR KQ R + OT + W S OL XWPQQU_ ejiUVTTY +O M IH??I E@BCEEEDEIK +GEIHGO HGIJJGFDFGHW X Y Q P +SU YS Ig>,r]uqUl\GcURqiLnpIku8[I;]J;gQCnYHlUEfQ@[E7Q>/]B;mNIa>:F .0 /8E+*@&%XUTRGv~PLx>jsCksW[SwW{_`_^[z_~dcdd[|\aaacXvKisCakRiqc|cUqtVrufnkhil_~\zxilikowojqqoniheiic}zge~`}yb{hhc|c|f_|wXupVup\{vZxvSqoYwwg\{}Utv[z|^}\{}WvxKjlFegKmoPrtVxzTvxJlmHjkJlmHjiHhgHffGeeNljVsq]zvd~{g}i|dx]xq[vo^yr\uo\sm`up`up]rm\pn^rp\pnWkiVigWjh^mj_nkfupfupgvqgvo]leXg`Qf_SjbVoiWrkUpiWrkYrnVok]sqc|ya{xZysOnhQniNidMfc=ZU2RMBidS{rPl]akSdV8dJCIJhW;56~9w>eF CI J +M OR U T R J @<=?K Y\g ddS QR S +S T +V R +T P LR T M GKN + KGI OL + HKO N IHIKW X RRRU] T P\ V QR\^TU +U WH@N TI J + +J + +K L + L M MR + R + JHOOMR + L GI +O J +@@G D D D QQ S K KU +QM NA:H sN;up|heuh_sqgecgs{}~zy]qeF]WE_Ta}oas\zrpuk{{n}xvMZQJXXTbe9J\%9+332%:/?*=);&@QB^lB`kGem>]`;Z\1OO@^`Xvxdd}Woqavwcwvdwsfvs`lj]hdgngntjkqe`fX]dThj\trejfZa_RPLALC:I<6O?0UC5aN?eRA_I;R<.M:,I6(S73dEBY62D-/ +:I++V88P22PRPEtz8ekGryIqyFnvSxccXx\|ffdc_{b~hnojabc`~edVs{NksJhpWnv`y~[tyLhkUqtimg|}jmiSwwOnpguupvwaXtuf~kf]wta{ihjla~z`{e`zc}kkhfc}`}x^{v[zuUtoOniNmhYvreTrpQomYwu[ywYwuXvtRpnPnlQooRppWuuXvvRppOmmPnnOmmFddKiiKhfUrpUrnYsp^yta|wf{azv[vq[vq^ws]sp]qobvtbuq`so^qo\omYljTgeUhfXkidtqbroeurctnduodumYjbSd\LaZTibXogUnhWpj[tn_vp^uo_sq\urLigGeeHfdWtpTmgKbZ9XP/RLlB,N"H62-)!M34ڽеL()1$v_Qʴδ̴sg5.%fPBªƬ̳vf@ ?M K J DBDI K +K +K +9;G X$g3(w>5G?JCB=y31o)'ZYT O +KMO LP O L Q +Q +K +EK +QQRJ + +FH AFP N EEFQX VV] a ` +c a WgdZXa^Y + W W XN + DM TOOOQQUWW[YQPX X U ZT R + W]UKO [STVZVT T + X ]S JV[Q =Kg<3nby~q|os}sz_uifyw{ZegL[b>OY,AV*B531%='>P4KY/DU4D"]`1ST9WUFcaWoq`uvfxz_oofuretqr{vmsohmibd_\]WJKC;=0GI;]aRqrdzvjjfZ]YMMI>F=4A4,N>1\L=fTF`O?R?1>+D0%L5-R62Q4.I& F9 2 +9H&'S10K)(R}TWQ~FqxOwOu~[chbYw]{_\\ffehnjb]bebf`}RouWtx^}g~f]v{Vrvb~rrllojNtwDej]znrhik]Yxze~ifYvr_zghkm`zTwq`yd}lmjmlazYvra~zb|YxsOnhPoi[xse{QnjMjfVsoYvrWtpVsoSplTqmYvrVsoUrnZwu]zxZvwUqrRnoKhfUrpSpn^{wZtqYto]xs_zu`yuazv]vr\uq_xt`vs`trdwufyugzvfywbus\omZll]ooassdts`poaqn_olbsmevp\meXiaRe_[nhYngTkc[rlczte|vjzbwpTjg:TU4QUB`b_yv`wmUl\PndNohTwqRsl;@>@=96 0,/$ 7+h^CqŢïmmGxT2c:H 7 3/152 )& ;ٽռϵwR?05&YE>ȱȱM> .M1%׽ůoJ +:K I L +FDDEDIO n2*E=XLbTaSSH@9x5/bV UM Q MJJKK FH F CJ + J + J ENNPTI +AG@GO + M J +N L VWR + Q Z\WW[W aXO +L K F +> A 9: 8037 014 7 +9 ; = A GF>>G G D H BC G H C >C LGF G F D >C H B FIO!LQHMEK^4&\Iixz~hznixsYfn1AN/BQ0EV'=T+D 97">'Vb#:H.>4C5Q]Fck?^`4TSGgbSplVolVhhdrrcokfqk`kcqtmlohmnhXWRDD<''79,cfUzxi~xlqk__[OSOCE<3@3+VF9fVIgWJ\J

2:&B.%M60U<5H+#?EC6 >B B :PxMu}Q|XS{PvHmv\~jg\z[wb_Z}ZiibYzV{Ms|Als@luMnwZ{^|d]zPmq\y}ivqkjtyxypsmLsx:]cIgoWv{]|QtxIqsQ{zWY{}[wz\x{decbY|x^|zja~Svr\{uitlazgiZysUonXus\{v^}x^}w^}w`~vc~w_zuWrm]xs`{vZupSniMhcOjea|uYtmTojZtqc}|`zyVpqQklSpn^{y^xwi`{v]xs`{va|u]vrc|xb{w_xtcyvfzxdwubusaqndwsfywbus\om[mm_qqcuucss_on_on^nkbrofwq^ogZkc`qkexr[piSha\smf{vg|wk{cwlNda.GK)FN;9AC C@H + BCL HEM JL +M K QVNLKC= ?8 + +03 +&*0 #$!  !"!$ ) +0 9B6?W'i;$rO`jBdnMrzRwDlv/Zc,[e:isJu~X}bnnmWvqBidLwp]c~b|yXyn[|q]oasgyfzbyaz]zv\zxPsoRuqbc~yavqm~xk|gz`{t_zs_}u^yrZun]vpg~xk|cztg|wlazwVpoOijWus^{y_yxb{xazvazvi|i}g~xYro_yz^w{Vpqawuh}vcwl^mj]mlZjj[jm`rtbtv]qp\pn[onRfeWmjVmgWnfcwndsldqjeurl{`tr[onbusbqndoigqigsqM__9QU1NT5TYDb`Vthc~mcqSshb|{hxxkldlq] C DK U\Y]WM E ? ;75('           !#%-> V$#iB;sWKytv}|wrti~yqzur~m|i~yvZeaMYWeon}w[egHW^?S^%?N$65DAWdI[e5ER.>.A%>T&AV)DU3O[9T])FN#@H-5$8@.KQ>[_UquZop]rsYomZmkgvsmxtkqmjokefaYZUKJE<;6872/0(/0(DG>jl^nq`jm\fiVon\rl\^VIL@4SG;UGXA3K4&V8.H*";, +2=9<"8) YV~T|]aZ|ZzdnmY{Ais=hqDoxMs|SxZvJlu>fn/[d/[f1_n$UfN`!Yh?m}Vzgjbagq|uh_x}c|mkb|a~]|~PqvIjsPqzVyUx|@io%PWIO(U[Alr^lqwoVvqAhcJun]flYzqXynVxj[}mdudwaxazk[ywPpmQtp^~{c{e|vexrlokd|d|a~y^yt]xsi|og~xcztf}w_xtUolIfdQpk[xt_yva{x`yv_xug~iZspPjgWtr[wxXus_yv`wq\qj^nkatrdvvfxzh|}eyx_sr\pnZnmXlj_vp]tn]tldytcvrgwtqqcxyZopXlkYiferkmxpv~dtsNcf:U\5RVA_]QlcVpcWrcdtc|vixq{SQ|9h%tISD E >81.12542&4S8%}gPwó—ŗór\mCsO-W*: 00/16 + 8 + +60((, )16 + %6m¬ªٮzE=:03tSL{yPOJ5'O5(ũĨzjRpǘ~qplw]dMWEH;j* P LJD@DEE F I H +FEGGGGIKHFKP RRP TQK F E A: 1 +-& +   +     + +       +    &9J#Q0)meZl}Xoih}vizp|~rwpglfitp_nkM`^Nb`k~Yb_PZYdnmzwrJX[->F#9F:H3C*FTC[eAU\%7A1<(?M7Q`3O]2MX>W^E]aG`d@Y^-HO4;-HO=Y]KdiYrv[ps`sw]qr\nnguuq{zoxukonikf\^YNOJFEAIJELMHKMHY\Uilahl^dfXghXon\pjZh_PeYK]QEZLA^NAeSGjWIgQCU>.>'B$=<6;E#"B#G$*@" 1[`U{]d]fljcMq}5]i,Vb6^hFktTvQr{FksBmt:iq8fsgi^kksqb}S{sW{bhkbz\}rWwj[{ncvbv^{v`}ygYvtTtqUxtUurZytb}xcztd}zmkc|a{a{[xtUrn^xujj}i|k~dzXsnFc_LkeXwq^{wb|y_yx[uv_{|_{|QmnJhfNnkQtpZzub{^ws]spfzxh|{dxwautcywdzx`vs_ur]qobvthyc|vc|ve~z`yvc{{da}~XtuRnoLddOb^etmuxz}s}eyzTlpLhlVrs^ytZul]ndmxpwqnğbyBbs5mHT'@ >B ;156 + .! .=`K.pPxͿ͙ʓȷmZTsKvW:X2C::B + @ + +9117<>/03-69 -&x_Kؾܺ㷞cVA;?7B7 0; X1"cG2eϭδofnW_IM6v>'b)W TQE +8C@;?F D +B +CF CABDG KLRV XNI PSOIJD7 +.'!     + +   +   +   +     +1 +?+*|zYnsA^\[xtg||qzwt~eurOac%=A5NUA\cB[`H`b\poh{wbvuXnlK`c8PTF^bXmr[pu\ouZkr_pwasw_qscqrlxxkts`ff]b^QVRMOLLLJRRPVXUTVSV[Wdfafibgi^kl^urayr`xm[wjYm_TfXKeUFhVHmZKmXG]F4G0J0!R70Y;=R18O,2L)-G#'K&-=/W}]SyRwUzRt~Wy`\|StEl{:fs3_l6^jHjv]}[}S{XZXYGv+[oZgSc.]mIs^Px:`iHmvV{XzOozGeo:X`7VYKkj\|yjlomfgjhNws>gc7a_7a_ClhX|xb|e|jljdddeef_w\|qasey_}uXup[xt]uwYuvYwuVvsPpmPojTqmYsp[utfb}XvtZzw`}[ywRpnTqo`}yg}npi}\ytKjdLmfWvp[xt]zx[wxWsvWtxQnrXwzQstHlj@gbOtm^~yZwuZrr`yvc|yazwdzxj}iz^uoUld\qldyrf{td{se~x_yvQmnNjmKjlJikQprXvxOihMd^dumruvurvm}|dyz\tx[uv]wvZupmxtnyqzu{yDm4gh2^7 I> > 9 53.&$1 +O:%ueKhÒ˓pd\VX_8V4A 6 36< >>:67;>=4694:77 'bF;ĩɫ㾣yN7> %" +9)bWCs͹ʲԻӻҸhP5E1:+u5+p4,a%TE <621 3 4 6 +7;D +G +HJ GEDC +DG JJCGI=1 1 2*       + +                 +  +$  +OAAm~Jcj,NP?abagpxk}J[c#6= 3:;NU^mtyywdfcSYW]felvwt~owzX`c*kRKbEIF&159D $S,12'RwRwQvHjtEgsDfrBdpKo{PqKpItHvCqEo}W{lf^]efdS5dt]hOZ&WfDoZOz;ckGmvX~TyNpzPqzHip@bdNpq\~cfknkntufZ|X{T}wR{sZxb|ie]|vXxsXz\_`~^~y[~x\}v_}ugyi{^ytVpmXrq[uv^z{VttNnkPpmKkhFdbLig\xy^z{RppEedLnm[}|\~}TvuYyx\zx\{ve}f~a~y^}wWvpRslVvqTrpUssXvxWtxVuzMlqMptGmn5_^%OM8a]SwuXvv[uv]wvc}ze{fyk|lyczp[rhbvmj~sj~smvre~zKgh9WY0TT6ZZNpqe\yuVmeevliylq|nnzppzn\qtLfgMijVtrwuzsrxDl0W]0Z1=02 2 2 )'( +G0 ~mS}ķȸ|ȳrhZyGe6yP2M$*'1:? A998;@C @;469:?8; -]?=ƫ־ֻl? 2T7)v^Fw]ͱѼײx]SzI;j0"WTGN + R@938< +; +8 8 4; ?@FK M M L +K H D > 8 65#  + !       +    +    #YUTqWloD`c-SV&KQ?djB`h`wtg}{AS_'5%&56DOclu|zzzfhgVZY`ffistmxzfquMX^#7@ $.6ACakUtyVtvSmjJc_Lc[Mg^Tmg[rlavon~txx|wp{skxqgvq\lkZjjetw_lrR_eO\eM[dUclYhoS`fP[]Q[ZNWT9>7(-&,/(783<;7=>9BC>PQLpqlyyq|znzjrqt\m^GhYFsdOpYoWziOvbIjT=YC,WB/cJCV9=6!$ ,>L%*3* Ot|KmwRt~IkuBdpDfr=aoDhvBftFm|HvDuCtTjuo\Kx~Q~Y[S:%HDCfbcd|axnmsm~nrnvv~|]sq?YZ:XXBdccmlrunzZZBei~DLpI"B&$* + K1$xcPsüij{tmeXg@qB$X)?537 2.2;C +? +;;?D +C?968:=73$F*'ʴ˶r}cLv^ԲݾǬ٬̓\Tp62PB +=A?FCB 4; ::AH K JHJ S S KG D=8985.%  + +       +    '#       "   +  0&%}}gwtWmkOmk9_bAH4=dg8ag%QZ 9F 9D%JS9X[KefTqo_|wfxhuowtysxsuprrqsn|wt{]tn;UR!B9'HA;\UWvpa|sd|osuutyw~wYol>[Y0RQ*NNDUOpslrh^JH1cuGX1- #( " UF3m·œȽ}tôyijg{UU;a.D17112 ,-4< + 16<@CC +A < +8 : +9:9:0*D/ǪĦɲêåǣy_Nn/&aLBB 37> +@ H +F ;.9? A +@B +H K K ;@ = 6 1 +*    + +  +      + +    YULzwn00(    + !  # +' !$ "   + ) " + ZLLrlvwh}a{Psw+PX*5 /?7RcOerXls;PQ,; +-+ /$/AHP]]ajcfk_cffjkmqprxtpyvmyy`orBTX%:="7<+CG4MQ6NNAWTSha]qhaqgbsi^ri]qhbsidqhcmddlaeogepj`ljWefM\_UdiQ^dR_eSbgM\aFUZGTZOZ\U_^\f^fnc[[OEC7;7+LF8hbTuo_zubuvjzar[{kTxiTsRyV{WwSqMlLmX=S=%<%@(9;<51- +$ ibcrlfgV{Afv4_o-^o%]n$\mckRwV}VaU}|Z|~[}Xy~^b^U~Gqp0^^Dpo^lc[}_eeecSxqIngRuqX{w[~zRvr;]\5WXBhiJtsLxwRzyTxxVxw\|yb|yi|ng}{[suUmqRqsOnpPpoPpmQqn]{{d^z~Urx@_d%FKAE+QT;ceGoqOwyV|}UyyTvwZzyXxwXwyUwyEgi<]dKlqUtyYx{WvyOqrImm;b_4Z[-V\"N[=M 8I#ITCbg`zy]zv_|w]xo^yjlry|}~{|yyzvwovzz}m{Ngc?]S;[P@_WQoeZvjbxkrtyuvuyzsxevpYolWtrNpo;baOd]1"+(ŏzLS, )$  +^WDȤƽĸxe]RNg@j<"G857 <630 *+.1/8ADDA < 95= +> :8C <? vUϬϰظڱmX;4  " +  #$( % !!!!% +$       =84ou{ls}]nxYnsj{zjSuw1V^ 1>#6"=P=SaJ^g0EH.?%9#:'?0;OJQaNR[JMRQVYaggmqpntpirmmywk{{UgkMabDY\AVY!F)!7- +$" jpkmynY}W}Bn{.\k*[j([n"Uh4etK{Lz`}Rv>fr*U^>fnU}S{zZS{{RppPhhYwwU~Jz|Qy{OnqWtx^{Wuwfo`Oyx4`a#QQ4dfJ|}J|}AqqBlkImkYwu_hdLoh;^WFieZ~~bfMpt@ekLszNw}=di 025 +-,3 +2 1427B @ 8; ? 8 +17 N$ kB&jNu޿Ȥ{iYMn91Q?83869? 896:<99= ?; .' ! +   +      -"}sjj[V( +    & ! #(+#1. $%$$+ / '%%      +F!^)/; TIGmhl\cmF\g@\`Rnr]{}og|}nlXtuAce.OT8?/7*GO6OV>SX7JP/FT4E%9)=2?PMYgS]fDMRLRP\`_jlkkmlhnnjtsguu]pnbqncrm^mhXgbYha]mc]j`VcYQ^U]h`_ia^gbirmq|xo{wl{xlvxdnp]giXceUcdUcfXgj\knYhcSb]Sd^M\US_Udj\no_|i|ot{q|nQz]tbzgIiW?vdPxT}ZzXa^{Z|iHvcCfR/F18!8@%3$" iia_{dYyPr~RvCoz.\k,]l3fw/bs/`o9iwApz_V|Blx/[d:ciOuxSzyR{w\_}{]vs`~|T~}=mm=fh@bcSru`_}}lq_Pxxck4Ya7\b@ekElq>dg=`bBdeIhjPnpNmoFeh>]bMksJktAco/P_ :;@>=CB <3 +(0 +# " # ' +$  + +    #     +   SD=xpjWQ?,&YHAwea@1.  +# ( '%+ ( ""! #* %%( + +$    + +  ;P"%3VOG|{yLVX>VZJchA\c5PW:SZ8JT;NUEY`AZ^5TW3RU7V[>[aMimG^dFY_ASW8KY%6F/A0?RHSeWamYclW`eS\Y_ecmqpmqpbhfZeaYhcYifapkfupfuncpi`mf`md^iaXdZcmeekgdjfiokrxvqzwisrcom`jl]giZdeWccWcaYec_kieqo]h`[h_]j`amamuf|mwr|]j]=pcCg}}gnPo]Eo]IwgM}nQ~mQvVxW~[|V\ar]B@)/ @#0 !' ! +a[yUq|Up{QmyIgrEepJlvdgEgiPoqSqqTrrTrrRppOltXvKkx3Tc;N .A6I?R/S_AgpFmtBjlQuuemmndytavojur{rytx{}~}|zytzr}uz{{zz~v~v|x{~~|vuszrf~q\}tOon1TX0^^EokA`Znyiywk  Z\NVqR&I/dN7nZt³ҿиxreU[R`8]6:'( . & !"&/7 +3,6< +22 0)' %%.>%yU1Z׫跖գcX?-13%'$&!   +   + $-06heҸ}z$  + + + % & + !%####$&%!!% * $ +      +& 3 / <,_he\pn]uyG`e*EP3D0B!1@0BL4KQ9WWEceSqsVruc{cx{VhlCRUBP[;IV9FWDOaP\lU_kOZ`JTVMXT[daqwuqwu\ebR]WQ`YQbZalfcnf`kc[f^\f^akcdnfcmemrlfkgikhptsosrfll[dcU_^T^_V`_YcbZea[e][e\^h]al^ioarxjs|ktßȾhsPeW4_P/zjIg~|oetZweOwdS|gTxdLxcHr]>zfA|Tq~cK4"3 I-"6*. +" ]~TrzTqy[vUp{KgrFgpEgq4`k3bl4dpBsNAq}3cm9hrCjy?kv:krEtzNw{[~gWyxddWstJln>io)X`!PV*WZClnYfkd}Zyt^abZHzy(\ZJK"TU8ehNz}OwwHpoJqnTxt]}`\T|~Ajn+TX%NT8agEls?fk:`c:`aEcePnpXtu]yz]{{VuwLoqGmpLttMstRtvRprXqu]uwZrtbwza{|\xy\{~YzFks-T[ FO"HQ8]e=`fJlnTsuTrrTrpWusXvtWt|Tr|=]hAO 1A +/?6H^Y^yth~|fxxol~oxyt~pyt|~y~x}xyuwuyzrwmslypmwov}uxwqrtzvfw]zU{|:gl6ij;he=XS~}ic[P}|gµN|JoBZoʼѼŪǥY|MxE{I~NwQ,K& 8'. +. ("  $,57256 + .5& '3 +K/{cAj׵ЩȘttVz@*R? +5:8: :3 4: 7 . )"/'D:PE)WN-cZ9lfBrnIvqI}xR[cgez]zqT~~bfppXa`KmkVyfwbxmYvjRwmTzpWv[dif{^~ai}|^yz[pwlktve|\ei}az`~q^qdQ`SBF9)%    8jLL_GE(   % +%  $!% "% * & +#& +#!#$! !     !?}oزhicVe^bxvUmq?Wa%:K):N/?O?Q[@X\GecOljWstXpr_twcwxUdg=LO:DN?IUHQbS\m\evYcmP[aKVXKWUZffoyznvxZdcT^]Ud_RaZV`XYcZ^e]biagleingele_f_af`^c_glhnrqcigU^]R[XQ\XYd^\ga_iacjbfl`ho_kp\kpZp̢ǜǝǝƷpXqc@XJ'hU5qP_`kxq|do_ybPmWBlV>fQ4gR3oLv|d^D3N2&T6,?A B+  [~NovSpx]xYtQmxNlvHir7bk0\g-Yd;ivJxBq{9hrCrzBl|5cp4foM|\dn_~idSt{Dir@k{7fv+\j.`iDqtZgi_|wUrnVvsZ|}ZP|{Ctq1cb,^]7ijCsuP}PxxIqpLspUyuX|zV}|S{{Owy@lo IMagOnsUsuUqrYuv`|}b~UrvMjn4U\=F:CBKEN FO3U^Ghm=]\,KEA\U\smfzxl~~qqstrm|ixkwt}|~zzwtsrrrwl~rl|rnysouqpwpozriynlxviY~Lx{8ko4no*UF/QC)I;!F8VK-UL+TN,ic?qkGogCumIwT}ZxSyUivturp~cmXC<)!  +  + +! " + +$%#& +#& + & +!#'%$%%' ( "")#% +# +# 'A}aUpf^WOZaYZoj\rpVotBXeEXgK]iZnu_wyMkiB_]LfeYnoWklOacAPU=LQ5?I7AMDM^\evco}S`iJX[SaaSccXfgeptfquYdhP[]S__Vb`]g^biaflbjmbkneilcdib`e_Y`X[b[dmhhql]faV_ZXbZYcZbj_dlafl`koauxgmppœҨΠ͜͝ʙÓÔ˽v~[`Q0gS8ziMwfJudHd{~gwaJiU=u_HycLeO8cM6xbKx]u\HgM@iMBU7,<O,(K'',   Y|MnuPnvZv[v[w^|\}Ks}3[e)T]ir>jsLx`iEfmOnsRosRnq[tx`|a}QooKik?^a,OS/RV9_b>acCfhSruYwyQnlPie]tn_to^rpl~~h|{g{zawuYroVolWpmZpmYol]rmgzts|y|vwqrnpjni}ri}tpyxz~w}{mzsbskYmlQqn8ba/Za(]c6pqDnjl|y{h+CB.n<^C}?~Aiʹo\~c8R5 gCg3s?|Q&_39$# '23 (&. / )',,'/ >kG7qZϳаxlQg8$=4267 3. ((  &@3#K<)C7WK1voRzuWkfPYU!WB'S=%?)+#   +   +     +  !"!#&'$$& + %   "* , + )&'# % & #, ' +) * " +'0 82 +<gLEXIDGJCP`]Xlkf~`y~XowVjqXqu_|zIgg6RS?YZQfiQdhN`d:IP2@I(4B.:J7BTGRdM[h>LU4CFqZqqqmTjX@m[CpZp][D4A'C)S8'A%U80kMES5+6 D#A/"RwPr{Uv^z`|ckp`?ep7]hEkvCku9ak9ak=eo(RhFV#U`Bsz_s}dKtx7dj&Vb"Qe'Wn+`r:tX^dgosnnW}~MuuOwvT~|Z]\afhkh[~zTxvX||[LruAgjHkoVy{[~ce^Wx}XwzccOqs/UXDF&RUFrs[rtmc{}^vvfc~XtuJilCdiCflCflAdj>agKluDelEbhHdhLejQjoWpwWpwNlnLjlHgj<^`?acJlmJlkTts[xva{z`yvh|{mdvv[omeyw_sr]sqRjjF^`D^_LdfMeeHa^Jc`Ukhh{ur{m~tmsnvire|rh}vn}wzyjyvVkfEad+QR<@?IKT3moOxtkZ _Y?|}h3u[(fvunxPhN+>&?)tR"d2c2i=J(  & )(&''%%(5O/rP5v\{ҨׯϫjhH1A 7 46 +3 *% ( +% !   + + +  +70E=*YL9WH5>/A5OG271+% +  +      ' ( $#% $  -2$")0 9$8#7 9;!4 +" +%"   +  +  +  +"  !#& + """' +"!#( * + &##  !#& +) ( *. * *? 6Z1-~yvGLFALPL^`_wyZswD]aB[_;Y[;Z\6UX+GJ2. .<)"%  +    + + % * +( .(   +   " ! +"  + +  +      " %   ! !$ ! $$   % ' +! )'..    0 H0O"lHHvhg>GB8BLFW^Rjn@\_#?B0LP+JM"EI>C7;>W\`uzVipCT^&3# * /!5 1C3ES2EK3GFDYRMeWdznezs]plbrqcrobnjlwqoxslskorgvxj}~py{moughpcoqfqtisvm|~s|yyvphUbWExlV|ț’ǕĐőɕƓϜ͙ɻ}zóοym`VJZPFl`Tvh[p`xfRZF.UE5SC3aQAjZJmZIS<,P4&X;+T3.<0 <S2)2 ::)JqxJqxTzRzX}JoFjzIm}Hgy=]lIivWwSt}Rt}QwGmvFd?Z&Ui;mxCswGrxSweaX~R{}Ct{'_pOcN^#U`5eiFosVzzk}yfZU}]cejgefdbidZ|~]djaPoq[y{MkmRprWyzOvuQ{yNvxMuwNvxEnr@im3\b&QW9djAmn?oqBtu7ij=kk@hhOnp\uyJnn?bdGjlKnpCfj>ae?bfGjnPswFgl?^c9V\7RY@]cE:MHZ'\dqt]_Ze5W`Gih~{V?1RH/Ӿw]?3F&- R7|d@hmfI9 ) # +  +  D7$|nTyǴ ֽȯsagF7B().&+, +(         +  +   + + + + +   9+(.%"  +)+' + $ +  +  + + +     +       # %''%! +  )X;-t[cZhWbofSaaCRW0CG3KO#:GXR]ocgxephyjtezguȞΟϟ͢ѦҥѠƙ}pqbO\M:{_÷ʼÙěȺ}zlvuVY\?_cHnpZyxcsp]c^KYOCYKB^LBeRDiVEXE4WF6D3+F5-\KAweWo\oVBC&+ +G"U0'P.$B!9L0$`F5Y>-W<+&Ke)Nh(Kg%HdB^7Q>TI\&Wh$Se*Xg0\i8clKv}VOz2]p+ViAo~TGww5abTK^J[L['We7cp>htGryMv|Htw5_o/YiIuc[IrtInw[|aX}@hj'TZ"Qa-ZmBixWyc^{a}_x}D_h-KU%IU&K[(Wi"QaETIS,[c7dj>ipKv}Gty-Z_DIGL/\a3`e1^cFsxKx~Kv}CnuJu|Cnu9fl@msF&DL\d'EM[Y`rdz~yy|ztrQ_P=H@Y_[}nzewŹ³̾ʻɹl{cwjZaSHPD8peSsviez`ysY`^O`dUgsei{kqupntjs{dggO[TBWF<\C-@4$UC9S?6gNGy]RuXHbB3M+!J%A;= J*H+?!E)M2!V3 T1:Q"@Z%?Z8Pl0Je:QAT'RbJXDRIX.Xf:bn>dm;bi6]b3Zi/VeHo~^WHotEgqMn}TxTv;`f KTIY&Qd4YiBclPnvSpxYv|Upyip8cj9fl3`f2Xc2Xc.T_4Zc:`i=bkDirFktLnxXzEepFdo,JU!=H>[c?\b5X^BH397=/RVBei:]a1TX5V[=^c9]]CggBde@bc@_dDbjLiqHemIfnNkqPmsRouOlrIflB^aHfhLjlPnnYvtazw_srWiiZjjP``I[[Uhl[ovVlwOftAXh:XcQW?TYMab]rubz~ez}gzxo~yvp{Njn?Xl6[n!AN-9-6=[Y}wI1'--+Ŷd#)~\ͳеβҶĨybxV1@*B-P@1f[ImʼΚĕ̩~^yO9J &"& (    /-   :,)VHE  2)"2)<5#NH0WU/ff4xw>J^n`yPzpLyUxNuqBP|zGnl9xu@zCql5pk4if/LICD X["OT69 +>@HG)?:$C<*=6$1(2&* + /.' +     + + +           +    +   !      +%""&) +* ) , "# +:nUQ{qplnmZjgf{rl|qyw{{{~zyTh\)85 ,%CRKaqgk{pbre]k\lyh{vrp[iZXbWzv~vthZVH=]OFoes{lyiwvuerewhoqeUXLRj:Pg$@U?OFR"Q[JWHV&LY+O]*OX+PX,QW,P`$IY4YiCitBgo<_e5Wc5Tf>^m?_j,NW>JCV I_$HX+LU3T]CakOmwNjub^:]Y=\^8U[B]fRowGdl>[c:W_9V\=Z`>[a9V\HdhZvyXvxLjjTqoazwdvvdts]klWggWfi^ptXlsOepOesF]oD^mG^l>Tb?R`L^lL^jCUaCUaJ]c[oxi}nhvyeurcztQog9[]+J\EX /;"2?)AKLie~tD+'CB=ѿxQ, R=*b£w׻ϴrPsV*S:YCr_>z\ȷÚڿ̯drN4@ +.)    +  0X=*S33 "- XD;yK>- + "C6-92":3!IE*MK%ca1xuBsl>xO}qAamyiOueLzlOndA{W{sNf^7cZ1bY.VN WP"\X)SO FCCBPS&Z`4X\7UY8ZY=gbLRR:DB+FA+C;&J=*B0"6 , $( $# + +  +       +              +     +   +         $ #- +0 * +' ) & " 5X=6la}rwwyvy{yxybldXd`Ob`/AC  &02GSSVb^DQH7C7NYKbm]amaQ[PMWLeka}}jibZOHB-%"*!"E;>I?=VMH@5/4)#B92[QPf]^rllxtkqu{ydkiTnlWyxdz{iik]UYK>D@AGGKUVS]^^ie^h]hp[msYigNRM9>4(@2'@0!D2$\L=VH=R>3H/(D&G%R,N(BF K%$I'H(D'/& +8E(M.F')EQ3JZ+=QCThDVj4O`$HTAJCL!IS)O\*N\$FR@J"DM*MS(LZ>NCS)MY/QZ/QZ&FS =O=O&FSAK=JCV>T6F;E*LU8Yb:Xb0NX'GR BNAM"HU"GP4=4=CK"HQ+PX6Xa7X_,NW@I+MV/QZ&KS2W_5Zb%JR&NV$LT!IQ(PX'OW1Ya)QY FO&LU4Zc)OX&LU1V^6[c:_g9\b>`i=_h9Zc7U_)JS-PV/WYEonBei7Z^2UY,OS5XZLoqOrtEii=a_>b^(H9"G9H:OB"\Q1ZT0KG$PG*a\IC5?6BLAIQDJQJ>E>6=5AI>_gZzrswhWYKFGB;;9))+,+1BAGDCI65:002?69TKL_WTXSOICE0+/.)-C?@KA?>63G?1!_OBSB8S?47* ?W/#L$8 C6AE(B'3 1 ?!>!: 30KT=T\7HR7DMO]fMaj*EN>E=GM!ESDQ>I>I(KQ'IR'LT#HPAI#EN,MT+LQ*MQ(KO'HM$EJ$CH'FK1NT9V\1NR2OS6SY0OT0OT2SX/PW.OV0NV1RY'JPFK#LP IM&OS8< 58DGBF&MR"GM$IO'JN CG"@H;C+GR1KX(BO1NV<[^2QS5TY=\a?^c/LP6SWMimLhkJcg=[[Fdb>]W2QK5TO6TR7UW@]cB]dA\c3LS3LSAZ_G`eG`eC\aHdh\uyZts5NK0-2IC]tnl}dvx_qs[lsM^f8JV.DR-GV(CT%@Q0>3A)?M0CQ5GU1BR/?O>P^@SbLfuKgr:W[6SQB[XPef2R]3K@,RJ5k`N}r`wjYg\Je]HkeKjfKi_FbX?XM7VK5RE2A0:'H2$P2(P4)* +               +     +  +  + +& + +    !,5 4 . +* & !% + C/&sUMzydsTdyXynp~eslqou{wV`a*7= )51";2)0@4;EMTZW\_EMOAIL7AC0<:0<:/;9'106<=C<J<@K8AF6BB&20/55@KEMZQIVM(3/"&%10.ID@[YLdbU\ZMYYOQPKWVRhic{}ru}naiZJUE>I;COAFRF7A6.8-+037:?EFKTSXWUVZWPmi]|yfskXjbOjaPaZHMD5<2&OC7I;2K81:"1E!W0!I#7 +7-1 D'P4F'U5*V4+;10*?D;NT7IM3BGFUZEX\;PU6OT"=D9B6?#>I%@K,HT$@L!=I$EV?N#@N%BP#?M">L$AQ&CU)FV @O:I=IAM>J=I@L(JS(MU&KTCL?G$GM)JO#DI&HI3UV8Z[1PR)GI,JL7SV>Z]6OT6OT6RV0LP1NT9V\5RX1PU+HP4RZ(IP CI,OU)LR#FL?E5;;A29 &-5>7C"8E4A6@/KO4PS6OT6;%W^3LS-FK7NTAX^KbhNekC\`MegOgg2KH'=:9OLLb__ur_sqUihI]^4IN 7?9B#AK?J6F (66C4KY9O\0CQ#6E!4C.AP1HXFarKkv@bd>\\E]]QdhDdo0TbLZ LY,IQ,LG@^Rnoj;&# oƳ}_;pO$WܻдsVv[,|`1^n˵иг}pZf:-? +')  ! 31 #$(4 @* 7 ]0yK)U+c6Ee6jFjIc2$29 +>c9)}Y?\=)# +  +  + J<1л¨ȭzd* !(8, C7+@4&=/"G7*RB5RB3L<,K>+OC-I:'C6#A4!J=*SC3K:*E/!I3%J2&D, - ! )           +            +    -6 2 +, ) % * + " 0hZ~lnefv[m{dmyelygbldQ[Z.;A% (*!&<,2B?ESHLWTY_TY]FMS>EM(18#*2*196=C)065:@GHMGFL42755?44@')6'+7'.8'05.:8+810;3GSGUcTP\N7C9291BH>]aSrvex}ifjYW[MDJ@EJDTZPek_aiZGRD4>5+6.2=74?9/914>5DEGGFKIHMSQTXRR[TNjdXxqayp_vo]vo_jcSUM@B8.OB9I<3O<5G1&98? ; 2 543C&W;&W8&`@3X6,@= B*<>9KM7KJ2FEASSE1JQ+FO*FQ%CN8C#@N&CQ$@L&@M+ER$>K"OV/6+21@G-:@%282=C4?E9FL4BE-6JI4HGK_`Ma_H^[AWU.FH9< ?D#DK;D!AN7E)EQ?WcCYf5KX 6D.<4B8I,P`8`j;ceBacF^`O`gLmvIkw5cp6^hG^dDc]Pl`utpC.-( |ǵh, % +,&       +           +  )     + + $/ 3 +$! +"$ + 0\GBqsjbt\lyeitckvf^l]S`Y6CI!1 ++ +(07;G;?J;>GDGPGKTFMWDLY-4D$'8#117E28D=AM35A44@11=-/>!0&!/*3<2<=:E?=I=BQJ&>J-CP%=I":F.FR#=J4@4@8C8B9A >F!?G#EO&HR@I8ACK-PV1SU1SU3QQ/KL1MN;WXF7?/MU/MU.65=4=2<(".>%2C,?'4G*6L$7"/?AOZ9GPFS\@MV*7@*4>.8B+3>+3>"+4/8A-6=*59.K7B2@=KMU-Z];baD]aM`gGjpMr{BqyLszcx{WumXvj?+*3#~{q;s=sɱƥoi|HP~QɣvٲdyS>F!&$%& #  ' 4 6>Lq9*g9!K$H M"H5%#9^1sHyQ`5U' oA wGW#;9J h+&Q6V%^5!< "  +/*$~l}fpȯɭ{ď}E6   +    +  / ;!%( ( (+ +2:"%7%E3'3!6#),0  +        +    +     " + +   +   +#$+.&  +! ' '  +<*(\95T=5jdV~xtr`q_bpahse]n\TdZ=JP$->!9 3*)58A+.5'*125>59D9?MBI[7?R#6/+5A1;E*4>(!*'.8&,<-(",6:EILWQZfXdq]hv\oz\zbjvowb^lS]pThwX{ir`jx^bpYbo]_lXbpWaoXQ_NETMCQRLW[MWXEKGGLEVUQ[ZUXUPTOISOFZSIg_Th`Sc]Qpl`tpdkg[c_T^WMaXOf]TdQJ[GF&DN&FQ%@I4>1<&:E,@K/CN0FQ2HS9D4?5@5>5;;A%BF"?C?F?H8A7@!DJ*KP-LO1PR2NR-IM1JO9RW:SX2KP.GL1JO0LO2NQ3QS*HJ(GI-LO$FH?A'HO3:#FL'JP29!?G6>+4*5+6$:E2=(6/>.=)9+7M)A*6P%1K 8%2E5BR2@M?MX@NY,:E'3?-9E2;J09H(7(2;,6?,9?+:?+=A-@F0CJ2FM8KR5HO0AI>IK;DI9@F=FKALR7DL'8B&8D&9G/= ;D)AK3JR4HQ9MV=S^2MV+GR=F9D?JJQ&VX5]\>]_LeiEknGlr@mrPvwh|{PndPpa@-)B1!Xg+T¥{áqahAi?oFlqXW/)$'0& +  + #7 L$E(O~Q4x[1bMlU+d?%K C;0?)tQ1W+sGQ* I g; g:b0 m5(VI _,_(E SY(@3 : D,"  naN}b~QĢr˧wQ}Sŧu`    + + + + #- * )& * 4818!C,$J3-I2,$ 4E''$ +     +       + + !   + $ ^ID=(#  + ','"   + + #* + ) '$ QG>tzn^o_LaR^pbftgVgUO_U:EI#*: 3$4%,6'/27;>*.1'*/-07'+6(.<07I,4G#/'4=6EL0BD**))///>A6CL*7@$19+:??NKZg]sl|{vsuzim\UaMVhPdqS~k{hyjvjq}gbnV]jN_oUJYFAQGN]Z^jjYb_GLEGII-AL5IR;OX1HP#>G#>G#>G ;B <@'CF-IL+GH#BE"AF?D!BG'HM*IL(EI(FH.GN,EL)BI(AH-FM1JQ.GN'@G&DF(FH-KM&EH&EH*LN(JL%HJ"EK=C#FL CI?E%FM8@8@6? $-+5.:-:1?"3C'7&=)@#3L$="9-?+:->H0BL+5)3&6C$2?#1>)5C'5'/"/7%4;$3:%6=)G/9B1:C5>G'.4$.0*66@LL^Ow}yG6,SB.xCpZ[޿ѯƠyaFQ-b@gIoB/?".- #   ! 2 6<MQ,;`2`6ye0oe*sAqM+JOK > H8kIlAS&R)3DKe3OBk4/['P" +H_/ r>&`,!D 8e< zetZA6!K7tK[T\bÙqsV:iO`SB   + +       +  + # 049=!=$I2,K2.* 8>( +             !  +!  + +7$oh!   + &, ( + !%4!a\VLVMI[OTe[Zj`Xh]JWP,68 * ,)0:9AD7AB9B?'0/"%$(&-518B/9C!+7&5UO0G??VNBWPMb[Seg@RV3EI2DFCSP^kaq|ku~|pfcZ+(8+ETMboh^e^OQFWUIdfXdgVX[HVWE^_MfdU\ZMC?30, @<0KI4FFKYZP[]6EH5HL#<@"?C =C5=!C.GL+GK#?C%AE#?C$@D:>:@!@E!@E%DI >F@G*KR AH>E@G >F%BJ$AG3;093?!9E5C!4C#2# "3.A'9+92=5;5JO/BH#)(/(9A$2;,5*3%1!*'0,5+4-6$5=#4<*2 .7+8A&3<'1:-6?,3=*1;*.727=2:=2:<7@?RG6RDejfA1!eT:š{Fj1mšԫmF7:`HnE/2"/ '.#   +  2?> + 7=U1`A$mKe3t[#fPy[)mCNVI9! . iQ7mJ[1mBP#8G +S X&Y%P`.b3!<W*~N*xE2S#4d;'¦k=HBFUNXe^Q`[@LJ"*,"#(,7?BISTBNL=JC$/+!)+=EHKTY@KO1PPKWSLVMV\Pgi^mobfh[ORK+/. $1(S`Vftgq~tp{ubmgQ]QUbQJVH)7* 0%;KA_jbgleb_Xjc[tueklZ]\G]\GdbMb_NVPD?8.30!B?0TQ@\[IXUBYVCRM9^WDSF5YM7O?&?+C-P6%T9.V;4S74V;2I/K0T9([>.P3!T5!^7&f?.BZ\9QQ3LI7MJ9PJ7JF8HGLZZ;IL'9;/DG25:>$AG6?(@J)BG-DL1GR2FQ1EP3GR4HQ1HN,IO2OU5RV:XZ?[\7ST1NL5RP7TP9VTE!+=?.=@1@E,9?(.+3(1,5"/8,5)2#09)6?&3;*7@+8A%/8-6?:AK:AK:>G:=F36=6;?08:*0.?D@iigrllYOP02/')&/32>DD=E:9?%&+")/&5:,.$''9=)7@/;G8BLBPSE+@CALNUTR@MC:REcca>/pTҼOOؾΥ澛kV39 `;(+/'#<G!C&& + 23 541 M* oM'|^,m:|Y#a9g; l<b1i5]28! +K2jOoK{P%h?_,B D Z%])JCY(rB.P +OtD U0\3+A~Yɬ_Oz7yAe:N# #I.%qpzSj{\5*&  + +     + + +    % $ $&& +  + + +     + +  + + # + & % $      +   phȱD0)  !!  jLBa<6..H<#(+#$(,-:CBP\ZJYV?OE*70&2.>HGYcdYcdIUUFRR@KOO]]duofwmdvhnrpum}sXnlJ_`D\`9NS,>B$23$-*6;7=?:HULR]U:G>,<29F=YcZorkmhdmcawtcifS[V@\WA]XBSL:H@5=4+F@0SP?ifUsp]fdOb]GRM7]W?VK7WK3QA'L;V@(ZA-Y=1\?7S73V;0I/F+D)J-M0]A,Z9&[:'HXWBRQDTTFVV=MM5DG8GJ@ORLad/DI6KP/FL7;'@D3MN4NM1IM+CG*BF3KO9NS8MR6KP-BG(@B0HJ=WXE_^B\[ST=RS@UV>ST:PM9OM0HH4LL7OQ8MN=QRD%4622//7554)AC4GK(:<*,()()()!9;)CD.JM/KL$>=!:7'@<(=8&932C=3?=7A@.8:+49.7>)2;-8>&39 /2#273@H>HR4(0;%+718B=AL;=I<>J>@M;=I68D25>8;BNMRhdckc`[RM576/32066@FFGKLDEGOOO[YZHHFCEB;@<.421:9BLM8CE"-/.0/555ECDLNMAJG6C<5E;;H>6@7+2*-/*162JPPDJHHKBopbRL,{`һhjȕ֯ŖzT%+/4 $+*%cC,m~sB1)  2?A2?mL)~^5uR,nImGqI_6U+b8a7\5F" +!4 xR=nMxH"^,U'DGV W +QY- +j>~P,q?X"q9O0`1.1gKnZFIwA[-Q( +$P8.vbtTuO|za" +     +        #  + +  +           +  +  +      !  !  !" # +pXNټuXF$   # + + #F%E )<N0.\NMQUTHVV@@J03:0596;>@FFNTRTXWX\[QVRDJFMXRZg`Vb^S_]P\\S\[KTSKOPQUTfhenslai^ZbUJZWBRQBQT8EM)1< "('/&#,&!/$& 0 .'7&6.= .;* $*6EIUQT[@EK5=@CMLTZVbc]]YPf]TnhXibPe^Kd\G\T?PH3JB/LD1RM:c^JqlVtnTmgMa]@\X;]\>b]?aZ=VM0UE,ZD-_B0_;+Q*R'Z2(S/#<6 +@&[A0aG6jB8_7-6FF3CC5EE8GJ4CF(7:%49-E0HL/GI;SU5MQ/DI+@E1FK5JO7JP5HN.AG!69#;=-EG2LK2LK4LL7OO7LM:OP;PQ?TU>ST:OP?STDXYDXYFZXDXW?TUEZ[J_`K_^N``K^\ASSCUUHZZFZY@TSBVU@TS5IH8NL5KI.DB5KI9OM2HF4JG9OL/EB)=;7JFJZWGVS>MHAPIGVO>MHGXRHXUEXV@SQ)<8#  '#%!%$ $&$-2*3:3>D2@C.>>.>>:HKBMS7@G09@3@@J:=F36=016:9>TPQ`[X\TQLNMFHG<@A>BC=AB<@ARTScedQSPINJHMICIGHQNU_^MWV>HIMOLWUV`\]XXXFLH?LCGTJNZNNUMGMCDG@;=:FLJAFBHIAom`f]C=9@87?44@>2>>8CG2=C(/7#"'!(. + $+"3,)( "*(5('/"%,"'+-335:6BC=FB9YPGd[Ld[Jf^Ki^JaVBUM8SK8XP=]XEniU{v`ztZqlOeaDb^AcbDxsUx\tjOhX?bL7dG7gC5[3'[/&`5,V0%AA$P5$lQ@qVElF;_9.#27&5:%49*9>/>C$38-4*9@#1:2CK5FP"4>#5?+?F$9>1FK/DI(;A#6<&9?+>D->E):A#4;#6:$7;*?B0EH3HI:OPCWXFZ[QefMabI]^DXY?QS?QSASU>PREWWDVVAUTJ^]RfeSfdVfcQb\EVNARJCTLDXOEYPG[RBVM8LCCWNBVM?SJJ^UK^XATNFYSRe_DUM7F?BOFWcY[eZX`S_gXgrbY_Qdl_`h]JTK5<4" + +     $)+6:3AB3CB2B?9HE@LJ5?>2=95@<9B?DJH@FD267015/0543998>89>/05..0=;MYMXbWbh^Z]RHIA&(#%*&(*%==3oiYwTxŮqʖԩg>  L8-RA-oaDŭپcMB +#, /7 +=M+^@P5T1 e@e?jBe<R(T*e;TX;S$B GP],h=X/c0_%d)zF.V3yO'rK"]3[9c-AC +T! e8#_JnĥvV~QRq$,Y:&byWfvc4%  &wo~E>4   + +        +    +       !!! + +"& 4 + "  ) +*!A [4-D49dKNlcfSWZ@GM-4:7?BQY[\aeMPU77?108< (*!# +$ #*#,3+175399:BD7?B49=&*-)+*+-* *.- 3$('(:,  +    $'%'&540@<3XOFfXKdWGfYHk^Kk^Kg\He^KjcPkiT|wakexsVojMokNqpRdp}dtcOfO=fF9d>3W,#S$U) K#< D#S6&mP@nQAb>2R." /6$3:-4#290?F)6?$1:4AJ3?K".:(6C*8E/9*;E(;B(;A$7= 18/607&7>(7>,3&-(,*.26&9=*=A2FG;MO>PR2DF/AC2DF8GJ;JM@ORBQT?NQ;KACPG;G=1=1/;/4>3GODKPIAC@:<;33597:FDGONSHGL@@BFFFKKIHGERNOYWXVVXLMO:>?177:C@BKHBMG=FA@IDAGC@FBCJC:A:291ED@UQN]XULHE3503:2GODS[NZ]RLNA00&($e\KcƲ|ҟ⿙TC '|p˴3  + - '3V*!R,;Q5 lQ$oL&[9 f@W$wN oDmB|R(l?eDf2$C>Pi9"c:g@!qC+[#Kk:a;uHZoBsF%FC MIJtJ1pǧvZ~UwRe3m6}JX47  &xZBz]nJgOE êoîeYM             !!             !   }mͰJ2(  !  . .%@f=7H6@R38G;?A?D6@B*46;EGS[^QV\77A%#&-JOUYacMWVDPNHTR=IG*( %)(.3/;@:?A@CEDHIK@DE?CB7<88=75:3#!,,0+B>9P.+*)9)  + + !$#)++-?>:KF@_XNqaTgUGaP@jYGufSynZvo\to[rq\hrk}vZvqT{wZ~}agoycveSlRCdD9Y3*FLP!J> H$W6'lL=gJ:gE9U3' \ No newline at end of file diff --git a/lab4/src/makefile b/lab4/src/makefile index 18477ba..06148da 100644 --- a/lab4/src/makefile +++ b/lab4/src/makefile @@ -1,29 +1,40 @@ SHMDIR = sharedMemory +SHRPDIR = sharpener +THRDDIR = threads +PIPDIR = pipes +INPUT = 1 -shm_build: $(SHMDIR)/shared.cpp + +build_pipes: $(PIPDIR)/pipes.cpp $(PIPDIR)/important.cpp + g++ -g $(PIPDIR)/pipes.cpp $(PIPDIR)/important.cpp -o $(PIPDIR)/pipes.out + +part2_1: build_pipes + $(PIPDIR)/pipes.out $(INPUT).ppm output_$@.ppm + + +build_shm: $(SHMDIR)/shared.cpp $(SHMDIR)/important.cpp g++ -g $(SHMDIR)/shared.cpp $(SHMDIR)/important.cpp -o $(SHMDIR)/shared.out -shm_run: shm_build - $(SHMDIR)/shared.out ../images/$(INPUT).ppm ../images/$(INPUT)_out.ppm +part2_2: build_shm + $(SHMDIR)/shared.out $(INPUT).ppm output_$@.ppm + + +build_threads: $(THRDDIR)/threads.cpp $(THRDDIR)/important.cpp + g++ -g $(THRDDIR)/threads.cpp $(THRDDIR)/important.cpp -o $(THRDDIR)/threads.out + +part2_3: build_threads + $(THRDDIR)/threads.out $(INPUT).ppm output_$@.ppm # ----- OLD MAKEFILE CMDs ----------------- -build-sharpen: ./a.out +build_sharpen: $(SHRPDIR)/image_sharpener.cpp $(SHRPDIR)/libppm.cpp + g++ -g $(SHRPDIR)/image_sharpener.cpp $(SHRPDIR)/libppm.cpp -o $(SHRPDIR)/sharpen.out -./a.out: image_sharpener.cpp libppm.cpp - g++ -g image_sharpener.cpp libppm.cpp - -run-sharpen: ./a.out - ./a.out ../images/$(INPUT).ppm ../images/$(OUTPUT).ppm - -./coms.out: coms.cpp important.cpp - g++ -g coms.cpp important.cpp -o coms.out - -run-coms: ./coms.out - ./coms.out $(F) +part1: build_sharpen + $(SHRPDIR)/sharpen.out $(INPUT).ppm output_$@.ppm clean: rm a.out coms.out -.PHONY: run-coms clean \ No newline at end of file +.PHONY: clean \ No newline at end of file diff --git a/lab4/src/ogSharpener/image_sharpener.cpp b/lab4/src/ogSharpener/image_sharpener.cpp deleted file mode 100644 index 5263273..0000000 --- a/lab4/src/ogSharpener/image_sharpener.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include "libppm.h" -#include -#include -#include - -using namespace std; - -struct image_t* S1_smoothen(struct image_t *input_image) -{ - //cout << input_image->width << input_image->height << " " << input_image->image_pixels << endl; - int width = input_image->width; - int height = input_image->height; - - // memory allocation - struct image_t* smoother = new struct image_t; - smoother->height = height; - smoother->width = width; - smoother->image_pixels = new uint8_t**[height]; - for(int i = 0; i < height; i++) - { - smoother->image_pixels[i] = new uint8_t*[width]; - for(int j = 0; j < width; j++) - smoother->image_pixels[i][j] = new uint8_t[3]; - } - - for(int i = 1; i < height-1; i++) - { - for(int j = 1; j < width-1; j++) - { - for(int k = 0; k < 3; k++) - { - //image->image_pixels[i][j][k] = val; - // edge cases - if(i == 0 && j == 0) { // i-1 and j - 1 doesnt exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); - - } - else if(i == height - 1 && j == 0) { // i+1 and j-1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9); - } - - else if(i == 0 && j == width - 1) { // i-1 and j+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9); - } - else if(i == height - 1 && j == width - 1) { // i+1 and j+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9); - } - else if (i == 0) { // i - 1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k] / 9); - } - - else if(j == 0) { // j -1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k]/ 9); - } - - else if(i == height - 1) { // i+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k]/ 9); - } - else if(j == width - 1) { // j + 1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k]/ 9 + input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9); - } - else { - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k]/9 + input_image->image_pixels[i][j-1][k]/9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); - - } - } - } - } - - return smoother; -} - -struct image_t* S2_find_details(struct image_t *input_image, struct image_t *smoothened_image) -{ - // TODO - int width = input_image->width; - int height = input_image->height; - - struct image_t* details = new struct image_t; - details->height = height; - details->width = width; - details->image_pixels = new uint8_t**[height]; - - for(int i = 0; i < height; i++) - { - details->image_pixels[i] = new uint8_t*[width]; - for(int j = 0; j < width; j++) - details->image_pixels[i][j] = new uint8_t[3]; - } - - for(int i = 1; i < height-1; i++) - { - for(int j = 1; j < width-1; j++) - { - for(int k = 0; k < 3; k++) - { - details->image_pixels[i][j][k] = max(0, input_image->image_pixels[i][j][k] - smoothened_image->image_pixels[i][j][k]); - } - } - } - - return details; -} - -struct image_t* Rotate_image(struct image_t *input_image) -{ - // TODO - int width = input_image->width; - int height = input_image->height; - - struct image_t* rotated = new struct image_t; - rotated->height = width; - rotated->width = height; - rotated->image_pixels = new uint8_t**[height]; - - for(int i = 0; i < rotated->height; i++) - { - rotated->image_pixels[i] = new uint8_t*[rotated->width]; - for(int j = 0; j < rotated->width; j++) - rotated->image_pixels[i][j] = new uint8_t[3]; - } - - for(int i = 1; i < rotated->height-1; i++) - { - for(int j = 1; j < rotated->width-1; j++) - { - for(int k = 0; k < 3; k++) - { - rotated->image_pixels[i][j][k] = input_image->image_pixels[j][i][k]; - } - } - } - - return rotated; -} - -struct image_t* S3_sharpen(struct image_t *input_image, struct image_t *details_image) -{ - // TODO - int width = input_image->width; - int height = input_image->height; - - int a = 1; - - struct image_t* sharp = new struct image_t; - sharp->height = height; - sharp->width = width; - sharp->image_pixels = new uint8_t**[height]; - - for(int i = 0; i < height; i++) - { - sharp->image_pixels[i] = new uint8_t*[width]; - for(int j = 0; j < width; j++) - sharp->image_pixels[i][j] = new uint8_t[3]; - } - - for(int i = 1; i < height-1; i++) - { - for(int j = 1; j < width-1; j++) - { - for(int k = 0; k < 3; k++) - { - sharp->image_pixels[i][j][k] = min(255, input_image->image_pixels[i][j][k] + details_image->image_pixels[i][j][k]) * a; - } - } - } - return sharp; //TODO remove this line when adding your code -} - -int main(int argc, char **argv) -{ - if(argc != 3) - { - cout << "usage: ./a.out \n\n"; - exit(0); - } - - auto startread = chrono::high_resolution_clock::now(); - struct image_t *input_image = read_ppm_file(argv[1]); - auto endread = std::chrono::high_resolution_clock::now(); - - auto startsmooth = chrono::high_resolution_clock::now(); - struct image_t *smoothened_image = S1_smoothen(input_image); - auto endsmooth = std::chrono::high_resolution_clock::now(); - - auto startdetail = chrono::high_resolution_clock::now(); - struct image_t *details_image = S2_find_details(input_image, smoothened_image); - auto enddetail = std::chrono::high_resolution_clock::now(); - - auto startsharp = chrono::high_resolution_clock::now(); - struct image_t *sharpened_image = S3_sharpen(input_image, details_image); - auto endsharp = std::chrono::high_resolution_clock::now(); - - struct image_t *rotated_image = Rotate_image(input_image); - - auto startwrite = chrono::high_resolution_clock::now(); - write_ppm_file(argv[2], rotated_image); - auto endwrite = std::chrono::high_resolution_clock::now(); - - chrono::duration readduration = endread - startread; - chrono::duration smoothduration = endsmooth - startsmooth; - chrono::duration detailduration = enddetail - startdetail; - chrono::duration sharpduration = endsharp - startsharp; - chrono::duration writeduration = endwrite - startwrite; - - - ofstream logFile("read_times.txt", std::ios_base::app); - if (logFile.is_open()) { - logFile << argv[1] << " "; - logFile << readduration.count() << endl; - logFile.close(); - } - - logFile.open("smooth_times.txt", std::ios_base::app); - if (logFile.is_open()) { - logFile << argv[1] << " "; - logFile << smoothduration.count() << endl; - logFile.close(); - } - - logFile.open("detail_times.txt", std::ios_base::app); - if (logFile.is_open()) { - logFile << argv[1] << " "; - logFile << detailduration.count() << endl; - logFile.close(); - } - - logFile.open("sharp_times.txt", std::ios_base::app); - if (logFile.is_open()) { - logFile << argv[1] << " "; - logFile << sharpduration.count() << endl; - logFile.close(); - } - - logFile.open("write_times.txt", std::ios_base::app); - if (logFile.is_open()) { - logFile << argv[1] << " "; - logFile << writeduration.count() << endl; - logFile.close(); - } - - return 0; -} diff --git a/lab4/src/output_part1.ppm b/lab4/src/output_part1.ppm new file mode 100644 index 0000000..e69de29 diff --git a/lab4/src/sharedMemory/important.cpp b/lab4/src/sharedMemory/important.cpp index 6ec1182..6727f4e 100644 --- a/lab4/src/sharedMemory/important.cpp +++ b/lab4/src/sharedMemory/important.cpp @@ -77,9 +77,9 @@ float *S2_find_details(struct image_t *input_image, float *smoothened_image) float *details = (float *)malloc(height * width * 3 * sizeof(float)); long ind = 0; - for (int i = 1; i < height - 1; i++) + for (int i = 0; i < height; i++) { - for (int j = 1; j < width - 1; j++) + for (int j = 0; j < width; j++) { for (int k = 0; k < 3; k++) { @@ -98,18 +98,18 @@ float *S3_sharpen(struct image_t *input_image, float *details_image) int width = input_image->width; int height = input_image->height; - float a = 0.8; + float a = 1; float *sharp = (float *)malloc(height * width * 3 * sizeof(float)); long ind = 0; - for (int i = 1; i < height - 1; i++) + for (int i = 0; i < height; i++) { - for (int j = 1; j < width - 1; j++) + for (int j = 0; j < width; j++) { for (int k = 0; k < 3; k++) { - sharp[ind] = min((float)255, (float)input_image->image_pixels[i][j][k] + a * details_image[ind]); + sharp[ind] = min((float)255, (float)input_image->image_pixels[i][j][k] + details_image[ind]); ind++; } } diff --git a/lab4/src/sharedMemory/shared.cpp b/lab4/src/sharedMemory/shared.cpp index 099140b..06780bb 100644 --- a/lab4/src/sharedMemory/shared.cpp +++ b/lab4/src/sharedMemory/shared.cpp @@ -9,195 +9,200 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include using namespace std; -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ - if(argc != 3) - { - cout << "usage: ./a.out \n\n"; - exit(0); - } + if (argc != 3) + { + cout << "usage: ./a.out \n\n"; + exit(0); + } struct image_t *input_image = read_ppm_file(argv[1]); int height = input_image->height; int width = input_image->width; - struct image_t *sharpened_image = new struct image_t; - sharpened_image->height = height; - sharpened_image->width = width; - sharpened_image->image_pixels = new uint8_t**[sharpened_image->height]; - for(int i = 0; i < sharpened_image->height; i++){ - sharpened_image->image_pixels[i] = new uint8_t*[sharpened_image->width]; - for(int j = 0; j < sharpened_image->width; j++){ - sharpened_image->image_pixels[i][j] = new uint8_t[3]; - } - } - - float *sharp; - const char *shm1_name = "/shm_parent_child"; const char *shm2_name = "/shm_child_grandchild"; const char *sem1_name = "/sem_parent_child"; const char *sem2_name = "/sem_child_grandchild"; - + size_t size = input_image->height * input_image->width * 3 * sizeof(float); // size_t size = 1024; - int reps=1000; + int reps = 1000; // --------------------------------------------------------------------------------- - int shm_fd = shm_open(shm1_name, O_CREAT | O_RDWR, 0666); - if (shm_fd == -1) { - perror("shm_open"); - return 1; - } + // int shm_fd = shm_open(shm1_name, O_CREAT | O_RDWR, 0666); + // if (shm_fd == -1) { + // perror("shm_open"); + // return 1; + // } - // Resize the shared memory object to the desired size - if (ftruncate(shm_fd, size) == -1) { - perror("ftruncate"); - return 1; - } + // // Resize the shared memory object to the desired size + // if (ftruncate(shm_fd, size) == -1) { + // perror("ftruncate"); + // return 1; + // } // Map the shared memory object into the process address space - float *ptr = (float*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); - if (ptr == MAP_FAILED) { + float *ptr = (float *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (ptr == MAP_FAILED) + { perror("mmap"); return 1; } - // ----------------------------------------------------------------------------------- - int shm2_fd = shm_open(shm2_name, O_CREAT | O_RDWR, 0666); - if (shm2_fd == -1) { - perror("shm_open"); - return 1; - } + // --------------------------------------------------------------------------------- + // int shm2_fd = shm_open(shm2_name, O_CREAT | O_RDWR, 0666); + // if (shm2_fd == -1) { + // perror("shm_open"); + // return 1; + // } - // Resize the shared memory object to the desired size - if (ftruncate(shm2_fd, size) == -1) { - perror("ftruncate"); - return 1; - } + // // Resize the shared memory object to the desired size + // if (ftruncate(shm2_fd, size) == -1) { + // perror("ftruncate"); + // return 1; + // } // Map the shared memory object into the process address space - float *ptr2 = (float*)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm2_fd, 0); - if (ptr2 == MAP_FAILED) { + float *ptr2 = (float *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (ptr2 == MAP_FAILED) + { perror("mmap"); return 1; } - // -------------------------------------------------------------------------------------- + // --------------------------------------------------------------------------------- - sem_t *sem_parent_child = sem_open(sem1_name, O_CREAT, 0666, 0); // Initially locked (0) - sem_t *sem_child_grandchild = sem_open(sem2_name, O_CREAT, 0666, 0); // Initially locked (0) + sem_t *sem_parent_child = sem_open(sem1_name, O_CREAT | O_EXCL, 0666, 0); // Initially locked (0) + sem_t *sem_child_grandchild = sem_open(sem2_name, O_CREAT | O_EXCL, 0666, 0); // Initially locked (0) - if (sem_parent_child == SEM_FAILED || sem_child_grandchild == SEM_FAILED) { + if (sem_parent_child == SEM_FAILED || sem_child_grandchild == SEM_FAILED) + { perror("sem_open failed"); exit(EXIT_FAILURE); } + pid_t pid1; + pid1 = fork(); + if (pid1 == -1) + { + perror("fork failed!"); + exit(EXIT_FAILURE); + } - pid_t CHILD; - CHILD = fork(); - if (CHILD == -1) { - perror("fork failed!"); - exit(EXIT_FAILURE); - } + // Process 1 + if (pid1 == 0) + { + for (int i = 0; i < reps; i++) + { - // Parent Process - if(CHILD != 0){ - // Write data to the shared memory - for(int i = 0; i < reps; i++){ - - float* smoothImage = S1_smoothen(input_image); + float *smoothImage = S1_smoothen(input_image); memcpy(ptr, smoothImage, size); sem_post(sem_parent_child); - } - } + return 0; + } - // Child process - else if (CHILD == 0) { /* Child reads from pipe */ - pid_t GRAND_CHILD = fork(); + else + { + pid_t pid2 = fork(); - if (GRAND_CHILD == -1) { - perror("fork failed!"); - exit(EXIT_FAILURE); - } - - // Child Process - if(GRAND_CHILD != 0){ - - for(int i = 0; i < reps; i++){ + if (pid2 == -1) + { + perror("fork failed!"); + exit(EXIT_FAILURE); + } + // Process 2 + if (pid2 == 0) + { + for (int i = 0; i < reps; i++) + { sem_wait(sem_parent_child); float *details = S2_find_details(input_image, ptr); - memcpy(ptr2, details, 1024); + memcpy(ptr2, details, size); sem_post(sem_child_grandchild); // Signal grandchild - } - exit(EXIT_SUCCESS); - } - - // GrandChild Process - else if (GRAND_CHILD == 0) { + return 0; + } + else + { + float *sharp; printf("GC reading...\n"); - for(int i = 0; i < reps; i++){ - + for (int i = 0; i < reps; i++) + { sem_wait(sem_child_grandchild); sharp = S3_sharpen(input_image, ptr2); - } printf("GC reading done...\n"); - exit(EXIT_SUCCESS); - } - } - - wait(NULL); - wait(NULL); - - int ind=0; - for(int i = 0; i < sharpened_image->height; i++){ - for(int j = 0; j < sharpened_image->width; j++){ - for(int k = 0; k < 3; k++){ - sharpened_image->image_pixels[i][j][k] = sharp[ind++]; + struct image_t *sharpened_image = new struct image_t; + sharpened_image->height = height; + sharpened_image->width = width; + sharpened_image->image_pixels = new uint8_t**[sharpened_image->height]; + for (int i = 0; i < sharpened_image->height; i++) + { + sharpened_image->image_pixels[i] = new uint8_t*[sharpened_image->width]; + for (int j = 0; j < sharpened_image->width; j++) + { + sharpened_image->image_pixels[i][j] = new uint8_t[3]; + } } + + int ind = 0; + for (int i = 0; i < sharpened_image->height; i++) + { + for (int j = 0; j < sharpened_image->width; j++) + { + for (int k = 0; k < 3; k++) + { + sharpened_image->image_pixels[i][j][k] = sharp[ind]; + ind++; + } + } + } + printf("Writing output file...\n"); + write_ppm_file(argv[2], sharpened_image); } } - printf("Writing output file...\n"); - write_ppm_file(argv[2], sharpened_image); // Unmap the shared memory object - if (munmap(ptr, size) == -1) { + if (munmap(ptr, size) == -1) + { perror("munmap"); return 1; } // Close the shared memory file descriptor - if (close(shm_fd) == -1) { - perror("close"); - return 1; - } + // if (close(shm_fd) == -1) { + // perror("close"); + // return 1; + // } // Unmap the shared memory object - if (munmap(ptr2, size) == -1) { + if (munmap(ptr2, size) == -1) + { perror("munmap"); return 1; } // Close the shared memory file descriptor - if (close(shm2_fd) == -1) { - perror("close"); - return 1; - } + // if (close(shm2_fd) == -1) { + // perror("close"); + // return 1; + // } - shm_unlink(shm1_name); - shm_unlink(shm2_name); + // shm_unlink(shm1_name); + // shm_unlink(shm2_name); sem_close(sem_parent_child); sem_close(sem_child_grandchild); diff --git a/lab4/src/sharpener/image_sharpener.cpp b/lab4/src/sharpener/image_sharpener.cpp new file mode 100644 index 0000000..331bf9d --- /dev/null +++ b/lab4/src/sharpener/image_sharpener.cpp @@ -0,0 +1,192 @@ +#include +#include "libppm.h" +#include +#include +#include + +using namespace std; + +struct image_t *S1_smoothen(struct image_t *input_image) +{ + // cout << input_image->width << input_image->height << " " << input_image->image_pixels << endl; + int width = input_image->width; + int height = input_image->height; + + // memory allocation + struct image_t *smoother = new struct image_t; + smoother->height = height; + smoother->width = width; + smoother->image_pixels = new uint8_t **[height]; + for (int i = 0; i < height; i++) + { + smoother->image_pixels[i] = new uint8_t *[width]; + for (int j = 0; j < width; j++) + smoother->image_pixels[i][j] = new uint8_t[3]; + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + for (int k = 0; k < 3; k++) + { + // image->image_pixels[i][j][k] = val; + // edge cases + if (i == 0 && j == 0) + { // i-1 and j - 1 doesnt exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9 + input_image->image_pixels[i + 1][j + 1][k] / 9); + } + else if (i == height - 1 && j == 0) + { // i+1 and j-1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i - 1][j + 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9); + } + + else if (i == 0 && j == width - 1) + { // i-1 and j+1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i + 1][j - 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9); + } + else if (i == height - 1 && j == width - 1) + { // i+1 and j+1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j - 1][k] / 9 + input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9); + } + else if (i == 0) + { // i - 1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9 + input_image->image_pixels[i + 1][j - 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9 + input_image->image_pixels[i + 1][j + 1][k] / 9); + } + + else if (j == 0) + { // j -1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i - 1][j + 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9 + input_image->image_pixels[i + 1][j + 1][k] / 9); + } + + else if (i == height - 1) + { // i+1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j - 1][k] / 9 + input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i - 1][j + 1][k] / 9 + input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9); + } + else if (j == width - 1) + { // j + 1 does not exist + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j - 1][k] / 9 + input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i + 1][j - 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9); + } + else + { + smoother->image_pixels[i][j][k] = (input_image->image_pixels[i - 1][j - 1][k] / 9 + input_image->image_pixels[i - 1][j][k] / 9 + input_image->image_pixels[i - 1][j + 1][k] / 9 + input_image->image_pixels[i][j - 1][k] / 9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j + 1][k] / 9 + input_image->image_pixels[i + 1][j - 1][k] / 9 + input_image->image_pixels[i + 1][j][k] / 9 + input_image->image_pixels[i + 1][j + 1][k] / 9); + } + } + } + } + + return smoother; +} + +struct image_t *S2_find_details(struct image_t *input_image, struct image_t *smoothened_image) +{ + // TODO + int width = input_image->width; + int height = input_image->height; + + struct image_t *details = new struct image_t; + details->height = height; + details->width = width; + details->image_pixels = new uint8_t **[height]; + + for (int i = 0; i < height; i++) + { + details->image_pixels[i] = new uint8_t *[width]; + for (int j = 0; j < width; j++) + details->image_pixels[i][j] = new uint8_t[3]; + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + for (int k = 0; k < 3; k++) + { + details->image_pixels[i][j][k] = max(0, input_image->image_pixels[i][j][k] - smoothened_image->image_pixels[i][j][k]); + } + } + } + + return details; +} + +struct image_t *S3_sharpen(struct image_t *input_image, struct image_t *details_image) +{ + // TODO + int width = input_image->width; + int height = input_image->height; + + int a = 1; + + struct image_t *sharp = new struct image_t; + sharp->height = height; + sharp->width = width; + sharp->image_pixels = new uint8_t **[height]; + + for (int i = 0; i < height; i++) + { + sharp->image_pixels[i] = new uint8_t *[width]; + for (int j = 0; j < width; j++) + sharp->image_pixels[i][j] = new uint8_t[3]; + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + for (int k = 0; k < 3; k++) + { + sharp->image_pixels[i][j][k] = min(255, input_image->image_pixels[i][j][k] + a * details_image->image_pixels[i][j][k]); + } + } + } + return sharp; +} + +void free_image(struct image_t *image) { + int height = image->height; + int width = image->width; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + delete[] image->image_pixels[i][j]; + } + delete[] image->image_pixels[i]; + } + delete[] image->image_pixels; + delete image; +} + + +int main(int argc, char **argv) +{ + if (argc != 3) + { + cout << "usage: ./a.out \n\n"; + exit(0); + } + + auto start = chrono::high_resolution_clock::now(); + struct image_t *input_image = read_ppm_file(argv[1]); + struct image_t *smoothened_image; + struct image_t *details_image; + struct image_t *sharpened_image; + + for (int i = 0; i < 100; i++) { + smoothened_image = S1_smoothen(input_image); + details_image = S2_find_details(input_image, smoothened_image); + sharpened_image = S3_sharpen(input_image, details_image); + + // Free memory to avoid memory leaks + free_image(smoothened_image); + free_image(details_image); + free_image(sharpened_image); + } + + write_ppm_file(argv[2], sharpened_image); + auto end = std::chrono::high_resolution_clock::now(); + + chrono::duration duration = end - start; + cout << "Total time: " << duration.count() << endl; + + return 0; +} \ No newline at end of file diff --git a/lab4/src/ogSharpener/libppm.cpp b/lab4/src/sharpener/libppm.cpp similarity index 100% rename from lab4/src/ogSharpener/libppm.cpp rename to lab4/src/sharpener/libppm.cpp diff --git a/lab4/src/ogSharpener/libppm.h b/lab4/src/sharpener/libppm.h similarity index 100% rename from lab4/src/ogSharpener/libppm.h rename to lab4/src/sharpener/libppm.h