* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ namespace phpbb\controller; use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; /** * Controller manager class */ class resolver implements ControllerResolverInterface { /** * ContainerInterface object * @var ContainerInterface */ protected $container; /** * phpbb\template\template object * @var \phpbb\template\template */ protected $template; /** * Request type cast helper object * @var \phpbb\request\type_cast_helper */ protected $type_cast_helper; /** * phpBB root path * @var string */ protected $phpbb_root_path; /** * Construct method * * @param ContainerInterface $container ContainerInterface object * @param string $phpbb_root_path Relative path to phpBB root * @param \phpbb\template\template $template */ public function __construct(ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null) { $this->container = $container; $this->template = $template; $this->type_cast_helper = new \phpbb\request\type_cast_helper(); $this->phpbb_root_path = $phpbb_root_path; } /** * Load a controller callable * * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object * @return bool|Callable Callable or false * @throws \phpbb\controller\exception */ public function getController(Request $request) { $controller = $request->attributes->get('_controller'); if (!$controller) { throw new \phpbb\controller\exception('CONTROLLER_NOT_SPECIFIED'); } // Require a method name along with the service name if (stripos($controller, ':') === false) { throw new \phpbb\controller\exception('CONTROLLER_METHOD_NOT_SPECIFIED'); } list($service, $method) = explode(':', $controller); if (!$this->container->has($service)) { throw new \phpbb\controller\exception('CONTROLLER_SERVICE_UNDEFINED', array($service)); } $controller_object = $this->container->get($service); /* * If this is an extension controller, we'll try to automatically set * the style paths for the extension (the ext author can change them * if necessary). */ $controller_dir = explode('\\', get_class($controller_object)); // 0 vendor, 1 extension name, ... if (!is_null($this->template) && isset($controller_dir[1])) { $controller_style_dir = 'ext/' . $controller_dir[0] . '/' . $controller_dir[1] . '/styles'; if (is_dir($this->phpbb_root_path . $controller_style_dir)) { $this->template->set_style(array($controller_style_dir, 'styles')); } } return array($controller_object, $method); } /** * Dependencies should be specified in the service definition and can be * then accessed in __construct(). Arguments are sent through the URL path * and should match the parameters of the method you are using as your * controller. * * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object * @param mixed $controller A callable (controller class, method) * @return array An array of arguments to pass to the controller * @throws \phpbb\controller\exception */ public function getArguments(Request $request, $controller) { // At this point, $controller contains the object and method name list($object, $method) = $controller; $mirror = new \ReflectionMethod($object, $method); $arguments = array(); $parameters = $mirror->getParameters(); $attributes = $request->attributes->all(); foreach ($parameters as $param) { if (array_key_exists($param->name, $attributes)) { if (is_string($attributes[$param->name])) { $value = $attributes[$param->name]; $this->type_cast_helper->set_var($value, $attributes[$param->name], 'string', true, false); $arguments[] = $value; } else { $arguments[] = $attributes[$param->name]; } } else if ($param->getClass() && $param->getClass()->isInstance($request)) { $arguments[] = $request; } else if ($param->isDefaultValueAvailable()) { $arguments[] = $param->getDefaultValue(); } else { throw new \phpbb\controller\exception('CONTROLLER_ARGUMENT_VALUE_MISSING', array($param->getPosition() + 1, get_class($object) . ':' . $method, $param->name)); } } return $arguments; } } ޡO@J4osP}dOdw>t³obFɷ#ϲO s,x6sdx.M@?Ӡ [O\Dj vO ۹P>x^aaBƌ6egKODܤR"Nb:ivhL5NB aֿ Lc RzzRB>Ks*ބu(pLԉ5Th`,OU -fCKٻ0 ^ce톜HyCG%'"*YtmNYޠXZM'_N$53Zc>7c ,bS+Ӎ(Lo k4ꙝړS. 1=.t8Q{r|}rS!2ddAWm+eXx޵8HF(ɾq)A&1t3(ؚ'ʿ.g DV#j x@GWFݖ%'~GwT7!\iɇQ}XP}} Vv _wV4pQ@V2#Qx lޕӥpcQAnewY'+?yX-mg{ 2qhBNw,+#C1*oZYr&pmTc ݁WZ,1'6iFs=bc{#զ=o~d|kDfY}d'C#1\T 6AFH&oM,'Crl[N/\&+gtǥf$TAid]`RF/sR9נ ݄^rȪɃF/xa5U'\_^:k"% 8^jɃ˝ mnu 鹚pc2LçOd&+~`uCPhIrN/;G7$ZUغ7"~޿p>?bEsz.&c5iY @9}U!ƛ4(uF|>g< ,fEe'œ'a@2{ GB{5\j-8I)MRQّD\e} 0ctyD 㕤}v7Oq6_'+ mvxjpE9 {(md9m\#Eԇ6~VyӀRygG?kL""< +/;UU1ˎcQtnӐՖ!.A1؆Wh:qot.H#6RO$v;^tTkheGЁ pBL@{̨μoوITWPg"PE JL, !L%xv'Ŗ[bKwIshkfpNѱ6C {k1^톭w4^TzX^.G\tAHD@/ /!)Lq i+:w-0&W2ҁ_BŠ`ToXlSeԵ[{o]֟Q<=̋ x(gᢦF(H\M4/!ĩAF2~י(;Vn;;;J;<%1}Ң5FFТ(NvFAG2]L~E9D:,p5M ΟcB8(0qa6*+u\?c<8MmE-iR(aȭ?mX2rӍ-$n3RݚiLTua¯]]I!:ۭ;f*!Q-zu<)bF3Tΰ@Z* q0%yp0NS^ȵ\ q[mXⶔʠB9y҃ה#`0nKtKoVY a!O>V6ﺠֵ^7DPI6_e)6`3^g0G1fY6m 76gWf>ч\ j B(,]h6GoT lFHxKeh~Ts5&lk4&1HU-Ogt0b C(:F\gpۑ`}"e?`T-+./䧞d {D_0'+ >b$H(*ȀB:Bv͙TtY*T{~Ӊ70B0k@duL|#vhs`AZ>c|{Ba>|!.}b1Z;IvRo.W "&a(^{Mϸ%l'9zmCsr8VGY~iBޅ_(bԟFq1X>nJrű'Ei^p0erGUس-Y 2nڏDD571Z{&._'ȺWҒ|.E0 |$}v /{eXQZe:0ILz>y <~*RQ-mB9_G\6A=(K{DbǼ#RdK\yDM:-\m" ܋]".0ht*s!p;k"vTV;ak`It[P]LI_er+VV=L5Vwn|UU<JKOo~bKIK Yթh%RMn*E&3o ȰZ[4%Xи(%giުbGGKF4D jí.^T%>u<6 `X\DD]QggKya`MˑhqNk8&3a?!@Q$LA@ @?דLV0K@."Qew=|k~$wKA&n]Od9ڻEG@} 2Su(FX6<80DڈZF(Ǒ"AKlb< +J\JZ |!%=з;&/tPس^ 2$G=_*̏ES}qbhpz@ǡAjLo0&֔9= m'$;UO` ДݢP#|_o)RϺKWX[~gX8)Su3;3ApV>oE9T>|vUpxI%vAZ^aeX=&֮qIV',luu@0JvrE YB5>;DʷFwNai#|bhKm3諚4N'vUt.-alPw0Yַb@>SASwNaޝƢV'JՎb:փFm/1ݎ b&]e 6ڠ:#1SF=n7¥jY(pڲ쏠(~?!qB<{sdtbvfZ(U}vi28XGf1-#8=l]ʳLATk] ~2l2}qFugXԹr'<H4Ы0ïJ?NVm">`F"<$\ .%>}B:B|vu0oyA;M?%/2$> Wx teuv1*u8Y[ 6v]hUͮlz-m-3lp;3zNiwi'`cYdAts@|U/B$ bzAb[EEЭ!ˬqJ4_-%@e<9%wimda{6/nه"'=+3"ax:?r%,I"=nk\q0t<ٽrw"@7/,hx;qBz=A} qU  = UO͋!52"U>/ABc-=xw*Lޚ-4po}|b yp*fq66w`%džN4nLxU KV2夾p6L9P:p4`!C0!gR>fIklރ7m+;d|OJ L3lAU^zn4¶C /i|˙D,\:$H^)%#Q܉Ry B< 9+M TjpN"@bG/^W5[=_2/:AbthbQmPJlq٣q񾬓0G>gxg% x88 d!p|PM%.pJ.tvW JT3%6 U{ilj7=eFIjkW%vh@s1cxYRI=-~PMdjbE<)ܥjCL ysw. wV`|X|{s.UO~<ɓ5Ñ0?F:n'U]JN~xwGW\(٨Ɯ> 07[:ͻʞ Xcow|)^]lX̼`25Ѣ- IZ3 E(q0 Z  5%Eol5 ^wU^ЯZ }`,+fnlIkz:Tp-P( D0HWv!vx&j"'UqRzݲz9v+tZԡrx9ߠb>=6\D^]U+j dhD0࠵؊'4^R4 ow"ЄQtAŒ0oh(%xr^u53sqiN96URIG(~oLڄA7)"Q7L+44vXպ+octPJ~h{EXkR `bqدT2.EvY Q%KҙԆ"Ĩ|m ´ m ,P61afe,;6(Їc|vT!/D c|5{!s;AEԲJ4`K6ئ85s'%0:e'ي(֝kA|<:p^ڽ~4h6Jf},yl N=,k.~[Y d@;Ug ͟tWTYw Mvgp_:I趪;: fӬ.XEnd;8g=Ypyd_s=gVyJQtIx+"{j27os+ͷb]IDb>(>N*Y3Z}L=Q7ߧ)Hݪǝ dM$FgUns[Efj\=-S8"}m^ٽ5G1*;O+ѪIʃNCX*Ftf36 >V7d<2ff75gޣJQ{ɞA~I.[ Q!pF{K7wk:y;Y3lo(Aǡ-Q@>a@܍Ɍ ~MkRH6lGeG5DLØ^AVÆ2MOt]8dJٳ-icRC>Ô}}mX}}ǰZXx^DjұmG17ޯg)x*\SCGUzK du|9х|_fC#Z3]GgV`wQqkiFRvQ':uJ@"tnxiV4j^/LJ2X5ҹIbhUNNLTQG DgCR~Ktp=f[jxm*)ҿ_w.T'F!+zE"_xkՃU,x`U|@^oDA 7i(HQ Jb htFdBhqqAn[31/Z|r'Oy5 9ύz+UYN1s/;ѣ4Ԃ1oQcXnlAԜЊ&D7*,Ts&| ц3?1T iscTT~K[j5%Nr>ΔĬ_"xa/Ƃ&b[K7f>lEe]gһڅ$5pPjttwIuh䋾 S֍6 erLӣӜ/s/]tTqD@)3B"ѢNdOd"g+% 3d滗Sr]M]8LRFmpV~UtX|C12y;Ȏ ?4 WQ|vV izl.@ln$>"C<^|`i_k&3YU9la:W$CC)ڔȳAS{̈́H:k0DX4.3tV{KDNZ ė>>Wٔ7\Z R`QuaD-W{}΋ QH-Z ag,Ȍ?Yr(?h1VjDXe{YKKNr3ŻK <O֒Xi568LZh.ahnwi)~jIfE'O^e0!WB? om >%p 4_uu>i4Gr+c$ K Qx[0Vzr{Q}Xo/k+ۓ=Q O *ޒo Dh'T4X&~@ <_QU+ Y&YAC3g$gg8֔/9t ELK)l\ԟi" `Yo}cWI%e.mx֥N3 ͙Y9p`Zi_#ZFu%lLA3ȅtva-Fr4j;CUw_5O U\Y,pRt>I{Zχ.JAqŅ3=3(q%sDAMrT.> K_4d)TfbND\^i3/#m$͛QwwrK 0)n $[GuVDZFw1 2 Oh, 1L!kZ*l 'Њw "ğ]$ytIx]/h`˪>/wjPN $qv2ޚ]CdYmAɸ Gwy50`vzmm"'Kd ̱ f")2H] hs{t1sQ+&T+ $d ss$ \_)5+G9jͭ$ږ.sds({c ]$68P9TBu0P~A#P΃(ytE?UrhsI}0DD(G{"DXtNR vsQl'ɩ̿~0.EAL\W羥Q@=&LH(|zaF_؍].O^U8 f?;m}7 4нsGFgH : XcZgJ/yV:'䞻+Z|նeNz @n W٨Bp/qkx{&B+!6eWu)W{ 8FjC- ΘQ-XV77D4tR>2TqrjUMCa Cz &6xWR kbiW㼓=.~1Nc%K _> xW t&1ʍTdd $#ƞGEO[Dn^M_ HDh Ѳ)yx7 #KpC_1pmI/_bXzA=?:}9͜Y6zwO^7i-vt%5w76/tCQ(iy!nQVi,Unϓ-fb]/g$4.w'LE¨ǃjjMBԞ-'9{t>3'6iē#^\W*A~[I|I 9ТD{瀳5\9Iռ pi-^ 6najtrJTֲ)&B*#v^!jb,ƭPKե{]0 w\|E>^;iG( yrc#7",3j&l2>f<^8Q]ˆϨw%&}VQiS ?eCNSғZLyAŔ,ϝh:9(ebBzp=VwƄGӻvԀ?B!`%v/,oҕ>> -V7 [vh.H|: Eߙ$O%5FC`/ʄZZl*',S~r!So*Og鈕 #`Lg l|kd/zP#HQ> Sꃉ5|L§lE$7nCBVS˳Mh6GϭV8 Pn~xJȫ:M9cC,VݬWNN.ՊAdmќ 9xPcƞ::mpɚDg9|Z-%L `"f̻?3HWItTm:GN9xۍxᗷ,D(WjW,%pD_K6޲℄9Tks&xPFC2Bި<]w]YWظ82ZE We0+XX6X}kAeacI:+ c~޾@_ˇ,A|=:eu^lq;r )]vŗ{J?]ߢvgp+o))܏k<)QRKT=Q p;_Y)tdf$O&/8KPSV=}/TC2C{İlBj1v{CC>mG V,z~R@ۉ4<*C?٣,BGlFϝ}kV-ܱ"c'eOk|meS,ю@Ǝƙ0+7kfo\^geMI8iZ!jfM$]>2X0j:m YXHPѲm-Qz` ~\ WPS)8! &fEK &'zۅw:-i~3MHz IRer:ij\QW! $ҶUC)_l઴8?$mĠ ]5mmpH&܈ ֌ixfI瑘FF"gS_iٖUDy"slSDD4.lt\Іpv*>"HĀy>=gч;YB"SbӃ6n>(dΆWy&IN7qM I/\]iREK+s5ĥ9N,fr\vι:X !ޢ2~KT Q9Bn)o%aPxq^;`aˍݖ q:AibNi^%f"ёӴRtqE.h(a^%juP.C2JKlcpz'+7b_TW]{m.07c"Q)Pa(I[ !!]H?4OHL!~.3Hѫ0"{~u]Agֳuԣ@ fJAعEAonf" B yV~gv4n[+C~}9dw&PP I*iBYγuԌb\*k+=kX4*åmM`y*a)YdX.1n*K#~ahܒR[~"x?|.aӞy>3UЗ;s̺jQI'ڶ,׎T7%-iv=ZoT—],.*|0`s䲶C'7VkHߠ?Z8tyQkDT|cDǖ P> M*[GG :`$n%g4ӫ4+½0eoTbW(uDQ ~T:Yz`X2*.`JgבLdZ2GK~ SP~VHD ]']uʓMaf}B}ū } c˸T&RxCUc(+;bAh \DoU]]oc* -TJ*գ;R9mMw+?<|&pUeYv3zMd6-!>脣b"X]ũ* oX8^5(/S5l,U Mx[w{ğwyğd vN5_[ҒYQ& #3*}XsAX"V' }%)*QNCD_9옙\OFɇ;&l.TU1 <3%-ISMrc54),,uEqL FnrĜGLJO \Z?`HcW̖ 2ۼJ^M`Z9&?ԟ>1'_];xLזTzQD2!,g\UWYVtWjLPlQMF߹r] bL-ϓ|vJR2|` }Lkҧ&qT2Z* /<. 措LO7_g|I.! !3[萃^ɏW3 u'&]?$!RaVlX)+d$:5aԶ1fLM'a/y5& hkD//0mZ<)L,zW4gtrH:mZQ/djZ]'WГɱۆٹl|8΄_/nܐvMSyDwOlSyG(ܼPXGqLfUD9]A)&m-afA$ǁjVfcZN8 d!4gώVr;L,ND%N[,2 |J#sRƟq2ܚ,jCc[vf ȟ` WfNHb ]?@{jQ!!m l6r E7U!g]ε0^~&>8@ #N[aOb\S) EH /lj VȞnɉ YÊ5:uΆvD!EQL~>^rn8E&Ᏸl:K!\ܙrgJRnoOq|Wa|#חĸA90ƥw~k 5W5=rmx̱e&EYgI0+'uUz5";KfheqIpNQR<ESY%6MaQ[xl A Ivm(ͳ~Y,y૛&T 5mlX5ԓHTtَZ]1u]>'M Œs4v $%ԶwѢ!ٶ9==N Lfلjio`/Vİn'Ʈ]B2Fhu<#4(mV j.ay_be'Z$y]_i:!i|B;s;}ެ^Mm/^*9ۍ6r6qpiVj6V ²,ܿTdS<ݪ /JSژ* )!rbڰ]P٢QB{@k}P\S/ډs{28 #E Z ,}+E.Dђ#_r5nФ,@JC-/Waf^PjMi®+i"fFj+"R`hեuF %A o e ҈Ll>gOxdƶ0UEcf~#yUy^UHqb(20(ƺ_T!sbos%Y(V+kJN)V:dKI'MmS#U&?qZiDRWlљlv#b\w,q!cE(އڢ(2YV[uu"P*3l]Ϲ!Wr0&C!CJ|]|7\3mP;zh'{8W*4(b1i?&8L"+Dq-O]Hm2b߷:Ýw*̜A3k Evls>A>u`mz|BsErD4Շ 9 ,k^S> "$0lkoS啞I뮸Vp #Uqב ,'&d%V-}ܥAAnMa h'58'X7ﱟ7wç? XKM<ߟiJZ C=+Z#'>m&>HDw2uK߂4yeҒHf^[GY?@ENp-\( ylp~7; >-}M60(+b żt( '*11be\DN7Ӊw+,NCSm KL[ߒ$gz QRG¿ Z9~\ӻ@K<H咢*,٘I\muuLm,i|]"G$JUŧ3$-O ?8?GaL(ʿO[r5hDgMwk8Dz:pcn-BNgl;̫qz L4#JsXyghHbm`.xC\, PL)`ޤ,[8&aS,K 7;Gv[컘ߋȆg\azM]VQm&xfF1nFlJQpr) mn+iM EoMވ('_[`$+jN򹩗f*_7),Qv (DrHN2-dO]'\VJ9q#'jr5L9J~1n`ǜq7yFü+XM֘N;ټo(??n(DMxѽZ^s!K /GrK `-"Un՗P zAHlЛ(]U֬y+bvUL'9QCl݅-n=}pxbjK8Eu~ODb҄P WM{0Vpp}~ ge'sf~M ;v {vĦ]Fuz!3K ,n60l{3trZW!RhAf&@N?+Q=Z ڧFOK:ViIkiR#ikDOΎ[P(/mpyta!X';|0 Y5hqP̎63r,%*~`BiV 0&йy<[Aآ&."VYB-PJ{S'%mG. z5\n6=*.K,eXq'٢Å6xD7}$/X?IXUւgٜ!xi:,gNcհp)GGlhtYaP̂#dXP]jJryl9^ ph!?JW]SPu\eR_ybΕ:o/:6r\l|d Prwӓxъiۭ.f+,\҅orc::/P K(%L| "oYI -q'Dڿ~AVޟ7G"e䲪Q*I.^Zq!eA.LNࠇObv&ɔkAwN3 M;: &K6lXVcwrloG3 t}ڠ G5PsY|r,_ !$y3yEsxBHA_:A?Z7Hdˁy~Xډ]ަq^H@L ,Ԏ$ԹfҊ\,Qd `ڪȌӡDE{76m) ^HK#Vqt?D]8WM'$~hy\]lhrNjNL~8vW~I4^/`&-@l!Lcɰք XV b.?O9AMA-Mh\r efҟ)|cq )IIXox:ܠߟ/5ANgB:2Afn|E_A; H@sn\]e9aM:%l2QKenR\b$^!nR :ճlD_9W \sBF =% 2Q-KuRB ^5q+vE79AޙKaͫ=@]AtV6@$8)IB.5ݝJQ\hRHC]?`8< y,*8&2'c?2S菎2 cq ܟAznCW)w7t(y +1c\UF˪c<X껳V@1j۴Y,1}f,vz LY+H|(K>b(yMh; p@k A4hnat_M U $ j 9iE }C7/G5a^UY׍EU֠|r3]bI-_" g׿ ;6Ȁ$KhS+4 3nlMisn}ulKMc,]\I|+ԉA]w$"Vqj0Ci"։r'ЌYd{wʂX C(tMGuHEsp.Ue]ź@8YBȂvTG"4nzh[q;9&K]s}m(hv @np>[K`.W'ɇ>7\X4V9B>1ySW^ V$7yo\q dHBdydU!:bB5Tv4eCK"6+ړX^!¼ IS~Z?{8[akhSGt:n?p9e4K`g,]A N00]wgcs R-՜hjOV$W4ndMSlԱP#{Pn<^Xb&35VWh1Rэ ryki}r,3|=  HU~Ca<P}? _:Aةg "Wȳb|^i@&EthLiw7w`;ΒY83ub ڤE\ %0}p~N~?3?hWSnjWc ?o|hRLH,Lxlas KͰx.ײͫ8AA=FKexK?ه`\#_x$"*K: \eI+?r0&lWgȫoIv.|D~(e2Ȥ P+6YokzyP`#'<wh%%Q5ѝ1D2dnkhyߵ`)|/ejWbB‰.aXШPLp@liT |NdcʋZcL Y8pJ܂/Y&jb3u`{F3ҁJ)'LjR& k¨@$W@ ͇LbW9t##X pC;pk@Y,lN_I+-Q٬-xrFqPA2M¨j˅~/m|SܥA u}$rVq"Qa>$?H]bQVR0\/6NNy_r*qP~qemH0NIEu`Ծc{%U'z͜E~`j2xLoO u滼Wn5V/,}7%Xϱ!Q:3˗:oG9̎y` 2T fpN";{rkJ$=oaC4M>GN|k&rε(gD:z[Gewj϶pn։UzJzJ<*}mX:XV;9Tð;4e4(M}$oj 2G/%DK3=9C9h! ]Rpla`>$YCUC*yoFbHҏy )_Ɛ 0;#Ջ; kFcOl⑊3D`%ce<}q*&芪lr{RrɄ<ЈC:x1v?9㣿(?n+мu%@v!emd`[&eӪ 7%U)iz01ק3c/u>b-x78[M߫|B40O9vd!h cBGP$0tWe{"Mt,?[J z&H"pQ]HBqUVY%Z,dbC )ݶ |*뛒@"\$sӹb4:T}M[Z( BN`9;KSKPW;8CוuNqN_)}/c*;^Sa&ҋ۪*'ׁ8 9a]U@dE,- סsa-kh{D8c8<)՟Cq`wFR:6 4ן u.2DyFwֶIqaN\X BЖ>Bb~bzY=î`L zO:5AuE C.7lC4\j@ [9^z؎(yO#7d}vղ ~>309Fd)t\0zq"#UP$eOr,A[Z^" >񤍤-xOeh0h>)BVjbHuK55`suA+ZeYF9*3l4<^/,kYZDɉ^,/:Yfbp-DcklY]8XX0 <|>|J6eejVtEHhD5G/eUM DFNGKw_&:V8)r^5qT 5$1P{iIBp=L'XjӱK߽9Sf&舂m~v䉞6` sũtO E S2T8@[f`N[r<υpG<] ?v*hc̥ QQhe zqԺ8/̘ds03r)k9EJ0?OV=`/­9UG D #gm)jgyL5^-v׫1Gה7}@R.Qw4ꜢCNA戒]a c"olN@ӡg'4AFԐ; )G~{ү+N*;Hf'L0S&4AeudK}zC Hz[m>pƨ=D$& V;q[B-Z1K`^GHʷbHmVySd/B\ԩ֮ vL&КV૗笭$Doַ= \bb oIŻ,Pd&oc`O+d+LD.0ܟP&0pkwv]ۛ[‰?W24H9ό$!'M5NKɕh5%pEET)C,T(g`EY&!^gG Igemí?Dxe:}{6؜+ Z($fL7GԮX5g+NE1 '6&Uc$+7>2Ca:?t'R{#y-?TUq5ܝ R݀B:AqA#{|q)fE(Y &Zޏ6 qrTKI0oiAEkWKhjÑF;d[qJ75.}>禆Uå#7EƤ9}+,upOZ۳j{#;lyg J;߮k6)3̸3{+)>a)\- zwsL.sIV(w@\wB[VƈJb_Q_i娉[ebl:P|qxxPӈxGGE:eRC# `* 8Yq->Vbb)M\?Y+`Ia^ynVsHm[gLn,?AI%Ɍc yN6g7aolĎ!:=  c>a0-k iR¦t ST ڢ15) HbǼ2VRoY 4'Oc1^t5Egh1e**zq thӺ&YiD~=FEHoK?+;Y34gXuӗt᠂JapLj[zQ7e{=XϭFy )(O/V::46P36Iů+PyP'{w)'ylV20@$]6!J %#KZdneYT7$ĹG%;O*Jx/{W&rI RSW fWA;Mf?椼_^ݴ6B3۳HZv~?-&(>zajF ݙVc*cQ /~˽(RXQʾ|5i; ӎ ڣ4 rs69͵q*+ރriU҂DJ噦C){&5*) yeFXEneѺ@L7a*9pnYEHЙSI*aynr"B1L;}PweKPOeZR w7) 7^ xH-LBR1 ro>:X8g97{i0*~ndC ggH[Tcm_C&2hy]#=5K~ѹ .Ė چeŨO(\[p`ZU^}kfuP)Orꢕ fN> J23ѷ2-gipGEn#3z}]e_Djwz+;O] OLP5T >q?TݜS݇kl5E1 f0|7H_SUp$smJX5B0UyU͒YɳJ+tW MB` U#w9l hCE{a>uIIw4=eX3bOgMƌ CiI+ B|md{qyH1,aZ՘2Oѓ^,-+Zdqg74|Cݍ?=fi1^Dh(ئ0"&Z5<.c6e-s% e`+'dwӎ|jkCt+ʞ ޯξ}UoI^ _DuBgVD*M7֫P6r}6jLˑ A퍚S1κ` ;ȏMɴ*laS7Y9eSX+͒[~DP|!hi4V>TVv LF$ o\IwI)T'liɔHbhܵMY/[2.ޠyeHjVeaw;DN$N ^{X)Fi0 Rae=髯-p= :^ĹcK!Pa!\aMo X"5t[%FO$K1VO^PqUUTQ=FafDg°?3唑3}᎖FtMY3b]H vԘ`c&W^eҠC);Hk/@B.LB-impe ;"E_|ea#Y'ADIi+!2.!Sɿ2SAE<@( LGy >{~κA9o&77}O_iBڊ3 S$r z_(,fv뮶/ qn{0Lu$^&Q>Sﺸ,K͆iMfSl 9%$PzwCB7tRT䛩ooEs!`΂ [f6ϨR?ž989GXZ!j 8W'xq/aa\:qEA;B @"hh$Y5+~F~_ztrA)3&#!^5+@] |QuӴZ65!HP tg]`VAAF;TZY>uAf Ђf, Zщ}Y!֌y=M亘zOMrǗ{QAKAľ~a7ymu$zM`~`ރ a=ᜌfo굷=/H7P)_F`'˪w/+?x.+1g"𗭯t<1VLȲk~9ᖸ*Z[9q'KM ~m?AvI$cYXjx JRtIHJlܮćKFlŁTiML*Jܰ*Cch #̽@x<̃ :5KHCXҪ瓶e!6eɆzpY#zPJдI-6z6Ssު6P_=|N$jM\fV{,C&MlMgTKb.' ϤvG&$vvfO~l7gz\ҐJuqEovnUœ­+UUeٍԝm){1jSDJRk@p AUjGZsZ2`ujNb4s˒C+%6 A%klbiSEpƐ؞ׁl&1V3SW 'd!u|ShdzN藘vε$Ix)F# b譧do5jbK|81iI"-Kآ~ G0 WAsk.0cxBe r[ oɕi\c"j}U|S8#w׿1)G"ZpFpVsr6㷫YnI~׎CMTPy.~.ʒ7@ؗNl>9:&P7vRaF;a`mi^&Y*ƝRI&h4l,Inc;i,ɋ+T7Y׀@tdh|7Cj*OT}] nRYTq' 7|F:[5ڀx&ޮ^՘bTL#x&.*oS0|5t-D6@:<$#y(޺#x1:5 P-:_+蝣z kbK#-b W0*O3o5XCZ'LE8G GKqZ-l<|H?mMnL2+iOJs} "b} G(-hfq>pw B2ZяԦy=o,a_1Ve|fi {TIғҫUJg`:+1\61Vs}ɬ^ҴP+U6,5H#8<@6v1jҵK>,V[?jNk?' 0sGU }OL.~fJ-rd%TQT?h,SCLNFQ94+ڛg`!c{}?}(Ԍ1 4M~3 Rl@ )4, ?pRbCӟ^eрv{;:0u |͜X/ @t1a05#-q5C55)2*Rą7kUϴ׺o,HCw7jB*j,'sX/rِlJF@"I)J?"y<VwX.? W)^p aܶmLig'zs9)@XWH4tx?gkJ(y*rvhϙ=wMG֗ezATҙISOt~._]{6 fe^ДU\nPzDWPf-p 9 :)84%e:Gg_2ՙehlq_3%>LgđD?1w"`&tn̫] S8JAY RʽRb=N V>% cp_դk*ܕ8AY$w/Ji=!xĊqH|1Js|j~Y˪^+ x}6goM IM7>QN*^7%yET,"5 b )3 yu,i"s_trn9mwh?th=qzn kȓNw>FEz۽ƞzNt`&;1}U& ⇿CLU7et1}KfN,4b mV3ǩ'#Vc)G 8qd:EԶrWO-fɜOҀͥXhJUhal?;JioRqԵIqVZ_W&w Kˠ0֯({;a k\dfr(Ckoh-Rm`iEel#',SǭzKe-h|;^iti-62\eCLTjt[>pr0rf7QekۻJhԅ.k6'3# l# pEQr= &Po2T2up2Y#*.e=*>Iߛ4FDMoS(]iOعբEXgs(j_!myxtǟٸPu8 eU1j8g6&*XchbPT諘tP~j~ą{3s/\69#`;C?wa^} E1+v8qOVSV `пÂh:Idl{֐MIDZiQ=׼ym§'cU%Vt?+D*XE{ec^òNʬWKVXuw:z.Z,&l":կ?h2&~-4 beqEHd.t*|m{ӹ,+m)W؈JS `Cx]Q[Ĕ8gNG4.lrP¨ev]n=, mڿxX2])Xxvhi Q[0p)QX^c=_wzN{-jgXq$9AM # S||i寫Ie nW[QkxJބ<@ý&@!Y P<{. %_5EI|S0{ HbeN*U_S7\ ]\A?_!k6½p"3[ݗ=c`F+g^ڶQ824I/:޿*1;E6@,aDG_v=;hU Fn$̩vu|/^,7٪'+%} 9g-lJjPB$SK,4]D-Ntq\S[B_aQ%״.2xRlq?s*H(bs?ZuO#;ȬJ7Ey^*t~Q z+iW,fOeo3eAGy"ch3Lš Eu=qz &#8;EJ JRH-ta;Q<2 p5S@BEɮG<̬/ANUƖM元xMTmPtSU¯TmEgJps@PeؾpYU\]DpI:P\][< GtMgGp>7ڵga6}Jad(kҚnU 0E֝ DwZq(H}k_Nb% O~;I9R4'/ѫՕu։fp݂#6Y.`$ oQwpT?8Dq:tHvml`)j#.0[=$]w~z[F˥$-;a\SOaĂ!o =⹏ج c @pۺ^}D.Q o`t F5kOڲzԽeZ |7fh+ʗΌ VBf2 uV,tֶoP H(fyY`D˜$.uFGh"`ʡ Sx%:)V#鸽D"<_wqdQWYJӸuA=;6LIFa"۽_QSݞiqy dE ]g~h\>!*F\ ~9z4jzq:Ƙb?%X`uVȒ+Dmpw igp'7)& H@긿;9&[n(8ZnndR+֓ta7ѶeuYd](ޘ㉽ӎ5Us1&?!lTǩKǩ`FZZU.ҭIk%"իۼy61[LZUGBط;Y%)-'}[{M[ GˠQ-48Y_u]x,!}NkYX 7Ͽ*;[=ȋW=dRV~BQ]k V-g"17*+aHT[ g.<и^_mhJ*AY;E+d%'{}0qvQ+^78Y{kˇ{C'x\!h9AD|jƅM67ASDbsc#i-淮1Y sq瑕 ah;R 4\1 }5,pB==Hy?shot.IyйY#괒Gd>xKԒ6 Wfq<]BV {1qcmx 8~9۰lM>2įIV%w|OP;( _5I{Aq-ʐv߬ՄUh9X֑ČXh櫊O!'L߀) pN 9cx{[~W{d8;%(!~z//덓5ѧe&(65)}-q[YWTĤ x$8|y<. uJ0=^NN}V_UD.a 6iW閭9h\GxOe\L5eepVw0`w; Ƅ,[sN=t,?ؤv]ou4>( aO}H!)(S?6Kǔɦ4 [b+/BB7 8\<̺,#g aDZt WiQ,JW {1T֍TTzdWdZH3)JPJep ʼnQAG nςyK(Sec~Lt3Q[66A5Yxׂ(8oLCyU< wVNWG]#Ъj fT4W˯UWRM蛀uo'~,M])1aWEaRN䋝:TZ}+z7?)S;>0yM螖IU7N5У[?iVޗl5c ?d|9T}d-ŝ=(bG>hAelbةm !u-s.ݸH3{ł `O1;݌٢vF=vQ[a*z%~y(9n>m>r%8rJyf%Ǻjp?)_wA܌#or^C9 ts.w]ִ"˞y1+ YcC{$t׬>@nb|:h$MQ5N.jda 8/^~2&Fmlq|E>yP?6pTwyhɥ8ZM5,ƚ'XWGi s|$ؕxΓ/s(;璳hr/ߨ̚M"ϘѼCuKS(r޼mr_b@.n@~cTs\tvZyxtalJtn~Kb'Vydz !_MzwCsP#Pۖqg{#GhjIgBCa/:8~N;ӑcc%[39!ڐ4 THJmЧё,QjD` +6;!PZl#<ؤ,-Xjqb1S DWjNC, 5mYz.qJ%5υv2xn|%Aa\~8H+ȸ"h̻ 8=ZuYqV!fS+$z>RpR9˃KJϻ aUx~5bRuCf}6?sJNiBpY_QuD!:?}Ӗ}!D@~񾼈fHj5^_J_d+똋 ۤHk˿S&^M,[%UqNQ{RR pkj8lxJG^pxn9!Rb&%odW\Y\JGĹL)Nů1+7gLuZبĒu҃tkA0=yVI"(6oL$c)AB҆b,XDs<Ӣ9<}^; =6pEoG/cf"\4mi<4TyϱHn_;Uv|~JB/:gu7V H0#}.>94$!&qMY>xY.MkIۘmWQcΐq\@"N7 ZOE;kVvɴOZ ]jn"NɍLELKqg]v@SeJ Z#ʢ.l |o孑3Z\18N W*OqQw3<;X#Atszk&Z=բs"gzcbOtf qim@j-P^@lތq2&D0:u(MHdC5QenH+Ŧ| .< tv-8'GR<1}5X/0K~O_Ņ=Wyqv>\F$#bOCQf h C&tD sGk6ᆲY9>!PyGq&*X݀+{}G  :"lQ~b1a |fjrPMy.*r9vOi%OZShS6G/bQ.a-+:5.De6p\P;FtWK:[6Pa(q7sODD?S)W+1Vr^;v: EGY&a1k$@dE=r Wk'{:X$IO ErKf뭁3cWEsCi-4 O/b|zg(敖z:HfȎqZXH|]ȍl(LA`[\.ջNRfi81 % 'f^ F:D!/቙hL70dkB<: dy41Dj/ol$/!?FNZ,AUBT4l!!bgf<ٮJ2D \7>Rư4yLۛPH{MA հov<BAULȱŽW?Vra5klVNְiK8 ]I*gֿGVUFñ zT&߈7Ul$ ֫ mhgD*f޹cKYZ8}耍6\Um8|.v|:gmSl&\VQWnm/uv|_ZC[u:>$_@w&ܱ|uiڍ¸¹--/z7y_g5nmFh74e8}:B2~k+{9ubD%k hQIz){FxWs̒4DI̸/(rGޥؑ<< WVH=& Gt?]0rD}u/oHԼvB$F b:N2Z^\ͩ䮵c]g#),z4igKռ^ѸAd@uRS*7ܳr][ݞ .i*P<ݒÐiUT[RsRM[>#Gg˯hgk˂\Vľ}Fp/yfT n[Poi!% lſ=W)O>]lg}Rl@BzFQ᪤q{I>2(KHyz3uZXE,m8J4CUz(oOP}8zm~ɬIбJQ-{"I ټBsaA-vLh:7\~85`m'+c}O}Y4Sucsa1F_8&9 {G#h+Iz1B*s}:Ecͺw Ui^GEϖQ@"0/ f]gp E5\ M36aX;8 _;RwvdeٺD%*x'tϼ:)3VZ~_SkiXRhrjIN$qM^l14._Q d*F %pY`Q:a1B)T|:?bBY;6RW>XF1´oN怂QSq FW3=8n# &ܓ}1z(v^Bw}:N3)6?hQL$+|.c\F숢lͩJG.BW\+)Ds4h("Jo~V_;'tI8b~ 6s h+/sWƵbN{? p0Oe7T6 0e\|j ȕ)hV7D:aƅ 4ΑpOQNP<{ ',cQRZa ~?3\VWOjj?~.m ~ԣϕ&+{FmR [ V~F"`*ٻItP'\[BM/bM@ e˥qb%z>@`t:(Nh;r~bS)Sy̾`낋T[* UR,f :_%LMqiA$wXs5]<|bϮvn\pb {@@JeG+TRP@ե.JQcRNF= hU%D3NG|-9j-KsaI4B}@!gKRl3c{֎*:%>%%zaYd"#Oc8@rj18j鷨Ok6O62#[w&'tͯ@A88ɒ/5 {tlFr4oG,CNos88cU9B!# :Լ(#3U1p Q+yMxqMb]P&2m&GD?skɇxo|,j6yp{\uVn"0espTZۑnb-c $O_-b2>dIB=KMN .>-}X^c qgc],wݼs!R@Ǎ -,t6TEwl Rwi"?v>5M F BѧML HG)1BsN+8'7o'H ˒zFʆvt_eq#c Vߌc *Y ?mo=(,B KኂAF*diKlp4z}xhcHq[ IAR*2  O|x1XdAin;/A6ܕQɢwݾKP]fU` ͚ިF>7Ou,okTOD,̪hO Txᴆuz51h'ܳ&Z?Fr ȟ9B8/,iV9sou~Mal0$/6-kSSHZd܏ߡ/{VHe+,1"*U8pIuIWp̗5cKLtUceuR%z@SgbXA>b݈ gpj ӐtH~z$P9~m1csQZoCx促 SZo$ ]Hy&q2hb`b a)*9$-_=Y6\̀9Oy1 jՐ_,e:HtxQ}ߧ_#:M{$fO.SlV}p[ eymg o*~#FdQӪ#L7%taNGyB:"K58:o]o5/Tͺ_} 1lݷL`JBi%5;ΙW#]ŀ ^qbfh%F~QJ5LlkNGƏ6 S0 Rj [_r.1쎅?:@:9MEOG2ђ|=,^8i5_ us/k[[CƔ5ZA!iede2;*q&ˉ%{WA+ܶ8%"YSk:%80 3AR3Ody;j- I۷SBϮnNq'v`·hin׏a[_ۆÆVB̹-ȕn:>oLy$+;CxnK1˝h߾4h31k&?m{Oȓ` _qFf1,0`$6qQep-S[U&9g?~YV*;DF&L\Ykބ첖%5AA!ʒfdap?Ok!k2]5\Ϯ-'U8>~ޗw+8oJݱ41kCqQxY:9Ɇ4m-WmH@mJ+&+-vr|#^P:s!tܸә~`> i8`Ԥ^ /V_Iڅ(3 x`/T4g(bEc2NSxB~a/4@5zVJar.J|VjP6- M~q銕ޱ8j:h&[0aԳP+a&eȌwXьk"kF1CkIhji `LdmZEb lb w>@q2F?cLqp@M*Ɋ -+0Q%0Rn=@ZK;_xOO$ox'T_8| Ij> J>;$ߦO9+?{&l4)ͮޓD. 1A?~˩ ~4J"ɂC]>ǽڇSp v ?GƅػntDNg5,_CsmǏ/㽋XWvun~XAU'dgS^*6%$yK3ѓUu{c4sZ%I9hLbrYw1ed2H]oؒ.EӍA#h٨vmڄ%޼(J:}ۺBx @ B@0+I\5" ̑$8 z?&X!֡Fq±qoyuU 1:^\0lzv$/us9z٢@~Y=: -yE~B_׏U@<ȆEp/R3EǒU&11ʌd"dD1t~m;Ĵ*֨ĺen9rDxMCGhL%]]붋Ϲ14Q*A el?gkd9EũLϼhd@>VWu&w؀Fm9=o4=ڡ_s%sPZU@}7 & U'%C}(`) a%~bœaɾ?7[X1.?Wþ Y雜uJbo%,{!=o0'p7*Zpx^sJTtX֩su*Ɋr^T8ZFRy$+4UոZVzyV&\[mHT_XOy)RsBA4*\и"@&rAqeR_1i# X=̙\\E FԦv)7Q drfE`rS[.Z]DiXo1H*}+ެ$Ƕl?صz|_ˊg8_<0hgG}xyޝ)Y|2/jg7jl؄'q3cyr:f&$i[I-ܚ'p]n(ߌ^?klr0?b9$VT hPu*C01!++n*Ew)^rJ# faƸHH\JJ@)_EGinm_+oںg-̇DDm`,?J(̽(5m FV7Az+5B beu1{h][?ϸY+,֮MC* _zu%cg Y EE,)^&FRuaC7|j;B=NØCڗC`z[(qV--MZh% ,'{;&|:yߵVZ`Uy$?zoP3}X}j}KYXNߊ@Ж jܥS؞VwQ`4n΁q?ڜ :!_ v~xY<½!E5VU/VR&$F3f G7(ٵWl IǮ~-.suhAkkE~@_ aB))ǩ,/?R@ .%{x*I`k߆} rJTORPhzنC+8>Πɱ{yz0rJ46+RpZփ\Io7q^Ty*T)4bDh=}oP!}^輮ƾ% Ynq~=+*d 2@LrpE5erf3_m4`)8J'LDy _F~G>ht*URD_?"N \Y^&ҩi0񜲥<_mJP\C:ܥ 6vE2=WaV~Zxs5'Yp$t(ΞZOڕxh.?#e#}s([;:ɥjjMa ]/X^ћϟ OKu 83 ?IDQX>H6<IBq+{ -<t 蓶_M2*vG*UKsUʼn*!{n>^d  \zdz䞕s{۠N#~,*~Z:YC|rYUp$IЌxJ<0<ZjoBsA)o-m1!\,F4Hz9>`ay귓nϱx@sr/̻*;xv!ᡛAxӣ /|tIj>3'Z=8=Ӻ.۬H GMH)Bb1kr Rʂۏ T&f\½S#S6dTky>d#exŧ e 4}Ag-ܨ%fv˱tlحbzx |Uהݾ6JN7/_QEc]<_"tSh)3-*Oqexo[s_]6P0[ÏEjg? n{oֻkw/DA>QCTNɥC%HlʽYR,\>eX<#{/6B1rC|$k5 KC6SLC&Ϯ>>urø52y W=בEoLJ 8રMMZ{!pV)vD4`Lݾ<VSxB^rE+/jjeA\AM iv̂\ k"neyT-*M o)'죿5Q9Dܡ |p{Y yEts4Ja9I8[f.{I(^遨iHSVx*D<V?*Tó2gOtnF H QxP%R>월D5)? 0 }}vMY\Ja'zIAK8:N|(A%zF7FeH(oslq`R 6sM9l*\<`=?]p夿v ,I/* |[3ޤL+`$\8 &qvIrg6){_2tkF>s.}EΦt6tJ3~n+"fj~K=&|B,>!)z8o# 74/c-[4lMŚpSy@RQYý2㡈~