aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/controller/helper.php
blob: 7b232294f09712db89c62127199eabb5d1bff524 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @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\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\RequestContext;

/**
* Controller helper class, contains methods that do things for controllers
*/
class helper
{
	/**
	* Template object
	* @var \phpbb\template\template
	*/
	protected $template;

	/**
	* User object
	* @var \phpbb\user
	*/
	protected $user;

	/**
	* config object
	* @var \phpbb\config\config
	*/
	protected $config;

	/**
	* phpBB root path
	* @var string
	*/
	protected $phpbb_root_path;

	/**
	* PHP extension
	* @var string
	*/
	protected $php_ext;

	/**
	* Constructor
	*
	* @param \phpbb\template\template $template Template object
	* @param \phpbb\user $user User object
	* @param \phpbb\config\config $config Config object
	* @param \phpbb\controller\provider $provider Path provider
	* @param \phpbb\extension\manager $manager Extension manager object
	* @param string $phpbb_root_path phpBB root path
	* @param string $php_ext PHP extension
	*/
	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\controller\provider $provider, \phpbb\extension\manager $manager, $phpbb_root_path, $php_ext)
	{
		$this->template = $template;
		$this->user = $user;
		$this->config = $config;
		$this->phpbb_root_path = $phpbb_root_path;
		$this->php_ext = $php_ext;
		$provider->find_routing_files($manager->get_finder());
		$this->route_collection = $provider->find($phpbb_root_path)->get_routes();
	}

	/**
	* Automate setting up the page and creating the response object.
	*
	* @param string $handle The template handle to render
	* @param string $page_title The title of the page to output
	* @param int $status_code The status code to be sent to the page header
	* @return Response object containing rendered page
	*/
	public function render($template_file, $page_title = '', $status_code = 200, $display_online_list = false)
	{
		page_header($page_title, $display_online_list);

		$this->template->set_filenames(array(
			'body'	=> $template_file,
		));

		page_footer(true, false, false);

		return new Response($this->template->assign_display('body'), $status_code);
	}

	/**
	* Generate a URL to a route
	*
	* @param string	$route		Name of the route to travel
	* @param array	$params		String or array of additional url parameters
	* @param bool	$is_amp		Is url using &amp; (true) or & (false)
	* @param string	$session_id	Possibility to use a custom session id instead of the global one
	* @return string The URL already passed through append_sid()
	*/
	public function route($route, array $params = array(), $is_amp = true, $session_id = false)
	{
		$anchor = '';
		if (isset($params['#']))
		{
			$anchor = '#' . $params['#'];
			unset($params['#']);
		}
		$url_generator = new UrlGenerator($this->route_collection, new RequestContext());
		$route_url = $url_generator->generate($route, $params);

		if (strpos($route_url, '/') === 0)
		{
			$route_url = substr($route_url, 1);
		}

		if ($is_amp)
		{
			$route_url = str_replace(array('&amp;', '&'), array('&', '&amp;'), $route_url);
		}

		// If enable_mod_rewrite is false, we need to include app.php
		$route_prefix = $this->phpbb_root_path;
		if (empty($this->config['enable_mod_rewrite']))
		{
			$route_prefix .= 'app.' . $this->php_ext . '/';
		}

		return append_sid($route_prefix . $route_url . $anchor, false, $is_amp, $session_id);
	}

	/**
	* Output an error, effectively the same thing as trigger_error
	*
	* @param string $message The error message
	* @param string $code The error code (e.g. 404, 500, 503, etc.)
	* @return Response A Reponse instance
	*/
	public function error($message, $code = 500)
	{
		$this->template->assign_vars(array(
			'MESSAGE_TEXT'	=> $message,
			'MESSAGE_TITLE'	=> $this->user->lang('INFORMATION'),
		));

		return $this->render('message_body.html', $this->user->lang('INFORMATION'), $code);
	}
}
]MX&6JR8o٧W6qX(\AL+H2%[Eb_~0Bǹ轃õ9S-*f|l&IE| LK`oPQp/"J7T$&Z>#o+ Q+;97cS PSV`uK"*Jƙ$C0#5HpW}Q5 AyEдj8"T=Z`v ajP)7ުm ޸0G6G_?.Wɛ" x "%Z[wGytRX&u@6(idt?VGF>@/$fĴɮ=3|mx'`j}ZId2d]FUh92+Z}"n h;N=$ځ̤'wsCYsYRhϚǓf(H# ջŚ 7MYp={y?` @ 49hhZ(ѤNοwJM ځm'ZMkeLM>H&sRct'sKVS=>0@8)cKpV|\R?čt%\Ҥ*+O#[r%sXMR*L|2>7:$#Fb (1ag+JVJ?^~Q^_"*S' Y2bPuafפ[@BXUs=~|[,4zu-PHsak*5 - amHp@DzkNpuw܀r)hP77=zلl@oƒ֚wVI=va׼FU@ 3^!V)[ u?>ImynP{7KϪ "Yzĉ`".YWvᨃ. +E1)Ϫyw&;?䎚M!>g?;@GM*wUv嫭x CxR*qZ#qm璬f v x;1nss!ϼO? :Pra9÷uhv{؂%|2QSUR$rY'\dVjFqhMxVK eʶH6|1u©=*ኬ )(H=Gq9[(=0I"3?YWƉ5SX?;~fύr) ϝcRYxIx~pS-T=0=}ݭ!}`-Pge3Wu5gU'v?9:Vbo K]lN[U.'Hx䧸VĐNl1p\4V2@Ël8 i,p2dDP.Ϳ2()RW],JАzf-)Df̝M-¹>5m3ik_>E"eN ̖֕Ls5!\[Z ֡ CyuecA(3F8Y.5;6//C%BBp[MMNԗ3 |Չs𜌚@{J|LÉ&=t1;1tvm[ _43oߜ%Р{\/ƛE"xhXĜq֥IPJ.FH%E9)7*Q۪ J>\kN . o>o l- #0trN\Ӡm9ZwZ@C8XL.s@<׵w>*I:d>2BLء0NݱJo0{3bЎ_uzUJ7d!ʫ6kڋS"K$leu+r,n=DLI) e>842Z~Fz;Opy*sRw S9GΥ-D TP1Ñp&G.oRX&BB.9)e*h_N=[ю !^V].e<,ÇUsE+ h Ktyv9p#2229Nf!Z~2Dj0CܒY `?[Kx Rƶ7=%oՑ3u[Q]/V} 'Ÿ7 cلzGY^S`#fԳ6eV[58D8{bc~pu +a<S*] n0&ݍ*w \@r-=e ?pT&Nk<߳3Fzt+gx'/ڀx+TcR0QN;EN)n 1}1S paw/. q!&~}99zv;쭬%:σ0ʼi@ՈxOߡf9FɪA%,g9opeOFI?EşE;m*O3ކˊpoRè C zB SǦj_IDڎ>ɪTWW= j5WQIS}I ̗^Ɔl:ī6hUұgWמ}uM4l'.+n]ȏJA>dA8Mi";{8t`ѤX4^@8斖gziȾGK(ɋK)gxRKӖ:RaXa0 'Gy>t #6^^i2uh5FujTR0+0FEosY,kTK!'ӿh4 e/rxDR6QĐH+ d&cVDAοaM}RORDaRKVmDaq6 ֳ4?F$jR"踌vpR+KvMˆG?t-7߱<K l57by3_&/T&GV>V,א|q=_&C>_P4щBHkN50?ATIY<ȍ8-E}i2N:e[?NL њ3.&"dF3ҵHK@n_>6ˇT=xWu‚!,Ͳx\QA+_o,r73DgMTܜIc`N͏xF{{l{lNt:ܓjёDyvb53|Lm ,Ħg Pf KΤ>0F P#"װ+IzBaw{0=)표⮌'6K.fɽ~`e3PjPlo4caNjk;[ƒe_39z :''&Nj)F& n-"+I-{VM)Pb1kx9|TOIM8Yl0 pY`YR]^w w\{R"'٦3Au_Mi6EG;g\e0*Edit1*\^|3v\ ELVPrK$n\KFDux5W{^ae,tNdlYoR A$Z1!aK,؞eC˕?S!}kؓ^ɀg@@VxR3b&$.U>3KPQ87a<pvC<ôۆ,xM@?7K ^!ʼn݃р- ''lh)m Er, 5º 4̋|y(񯔱KdU'Vic&j(1P^!wV sW(@[}YeAJO5\{" ֕hKMSD]z`Wo1oln+}cYLEx"\S'ETNٰɈx̱P;iQxLQs~TN`mTl梿՟lszumxXZPGw/8^wW̨ &y'Cl0*lɊ5E`h>gF||?&i޾ (֜ڲDJ1 T,iV/_gRe4oDr΍#ۡ?9dtݪ[]ۤSO9 ΀÷51cjGY瀴P84b?QVG?>(a(g_3QI.-<}J=8somơnM>zp8YV5D<ͷ4̥SݥR>^}y \m&CºD^V 7|GɤRδ"ԳN0َM MB}6Hԯ4ܚt@An56e&GYL?o_B(A[(8Yxl$7+ CAφ۹ȱgG=^ރa𿬎q鿥/­aL 'c" :ɠorALJp.8 rЅ0HqӿVŞ48҈JCOJy)TCOeVPYP+jǷ-*>U G,)X- f^X ^4|Q]!RTnaB|Ɣ23'sq9"I`z ڈ P~sN 󽔄UQs!>) o84)AxZY'OMT(na"J$`c-Q̿ۛCiܿ^C-OS{u珓.QnĄ΀F *:A&g?X "1v Xd @4jc:i~ީzdzR6XB@Y9n^Awt68rv<3So"Cu/Ly6otxof2uw^J@Xg#H~?AM…52z5ha1<oEckB{dyW+KQqYガWsHmK/UO?^^bx%5R&^$=7{A5y@kyKΐU`Hyο/?lgLD4OK3ճ<` xP:˰$=)kdu^v>X#B۷Tj* NN"TfC_gū&rCAe eznпyՊ#_ob'Pw賌ظY ߯\y ISLaI'{̾abI؇O I7)gg>]ks,btJ'UN.HGOr 5FIy^2禸Ҋh[K2+SQ{!xQBB pܗÜYޏ3}`9Wk 'l)Fphm xM]< fjc\Ohk`u/!OjR/LkɨPb$nÛlr.80; "[#~g9t'Ev|!bzk&_`ъΫ{C=Z ܬ Y Jd썗y霪&M}daq)ř4 7:;٥NAً"i(^;¼'E+LpOM򼠓6ϒażXV5r؜L]ot*Și. -i8R^5*ګ.A(!]?0dE jeLgh!wvK\I?p%lᰊ)=UoDIݘAK͘v2*jD G5g,6k{, n~\]=(pz+6&1VghVC;ǛIpK_]W(tVi9{b :k'mj31v+Jy\ץ>Bvmo-ȯFܫf>0jMOi# D\H*q Śf^2RN%VzIXgS1-o>k3iaTy$5** NLEpA]~^XLIrԹ[å|j ("3N< *NúLJ`ޘK>daYGzgk`۳P^6ܱ}&]ϊnz$Iw 8HugNW\[oKw9 9zGww I_d7Ȥg1ͻWNUwY_~#Rṉ.ubCVZbsEv0oTL&m-s+[D[1G\m^ƭr$Oȁ~^VEnFK"u8{:!њ 2۽X앭nn3j[pr~1~",R[bt&&y UȬJGY/So_5xY:3{z!RDḲ]&:-ۣTbS)Y byk|L 3T:<B(ps6#l=ɼ+ȔIrRFeHX{22&|QXau(t6͙$_b8>@v NJ66+6LGI_#p't&Kp*c=6icLw?m3tx:1&;J\6G \UVD2Xo=2򐥫:Q5qK/CxQ.ϙx@,SݭpN;\?32Cb@'V泠)o%zFDlfiF6Iql=nZny?}Ȭ4 +(0]dm~WL0w4:cE}U$6_4Ҹ>υH-ފE#f.XK_ nB p%8.$O[fӅʮF" Wf54fCM ɎI_&FU- qAZ#xq _Z~/:J:Z`' %>4ZPfJݸ/o[I76hY)<&5Y|&7J*Ųl- BpFv@tZܾ[J~PqcK{(£W G4哉&9R*pqJwDvt";B޵r3jW7!Y@\[i5(8T~0HpH8ZdI;X \;B[{ΧmF=8x?A C֝nޗݡrU@]/Gq}Ţ]+շ_TY'Lsl5L͟MdVYC,bh{sx'sqU>Iݩ+Y!m0c]z -r=I:B uiCykꊄd kil_,=e܉5_^j6GsQ ͗ArD%u@lDۼ``!-@[.Ѩ܍5eˤg5*"isfQ,־'IҺmNݡA3P)q)6KTTQc3r6yiz-`/GI٣S}u$>w)pU[q7)07O#zTkoU XĂJ=rfb4k#5sO("/KcwD1YVS 0BzU#._8(M*/Np4-ι(d?/W`/DF@Ufǒ3 7Ʋuf/Y80#@e|w$ϴpC-2EB9 J +jXNV+f1;:Txu^u`6Y:a擌EVyh$ Ti14O(XKLPa-ݪzMK pҊln(Ud@JNj{Buz9ŭF;WPi|PC_XCt ǸJI&_?WΊp,lS6~dRBkţUj) Bm.DzތRV:E< țп[Lc#>y&gc0~DK]|y2+@>V/nkC /)Yzyo >"tgǎ1\/+Dyp?SkFP Im>IjA᯾,;U'ds+[RʡUEb_uMID|/iy}IX9܊mx i ~}y=!!(̱}'δAz=Kn%T{bJj*1(y8+z Ε JZ$}*>_q#jGV-wAh%Iۑ%AsAIg {Mw6"z2Rp9wXkoZڷ%ȕ |7nK*ӫkOa e;YR9<` o zl&g&L4x-5EH&CU+pSTh|P]U7;YC^TtH7{6VĨ3a!c٢ƚ&3qI^k!x#I4?F%ƅ0ki 蠻Uբuלjyu$,_[V5П|m4e(.<3`3FEm" +T}MRNPYsG3sςV&1,}-!qG9ةTpDϥޓDRog;t#`n2n]_xItdúM8/9$FJ/Uw_P(o=sC+\-]+3OHY|:^*.%B9ZJ AM;;9vAy^0hC@adnB%3PD6 IN yKad0!2TG k"x'oPV$QK'F?cs-˫<e8<&}QMIV pcUr@mdwC*JUT%XeyaGj^ZiXIY勔psq:nWu[vS't%~@L%r9ki."qo6 p=|"cqA鈈FNGYT$ Y//#ۗNG`rpٮky(g}%<z'ifwnɀEhxc\q2kgV`ay9o))BӾz9tEU<ŤpiثQqzz.kf>d1[.0,K~xUT%c'GcFbTƕG*or)Ջ,H'tGRtF2Q# JfreE2 `Goj"80e_j<'Rq0}ߜ=%I:E=ƲQ/~PG/ՖRuEg1B:&&$#j O$/Ky9{gj.&fVtu(SJ3$/At|Btt˻LjpR_VT8x`^ՠW;##Eߗ x+Tr 2[TZd9+ >IǬƳ!`V2.ݽlB4ƧUpéO빷Rb]{N2e89r⾵3mꡒIJ w_qҼUL&t58HP hdF!\ZyWoN䳟XCvcFr߻0:ҡ9]rOJ޶&RoRZm;7wW 2#+xD'QOu_:YaXFth)c -5z8Ll;}p6Pm9]\1ؘihE.qܦڥkv(mFxS˴4LD L7#d5`⼦@- nOȈxLRidԁVk !>:R5bdv4 圫mTka 8+̕9ؒ* L.urJ*1wi7kw`N./Mӝ.*nqJzhI`6/k _6uR? Iئ@!.0]kx U:+`xmOM Sfd柃lYjdG"ϨC닧Rz1Uw^B'+?v%x d@875@Cvc :BAg2r4՛_4 PO|1d2!OBȁcTd_F^] EDpo$i*29m+U=Սkw]L gP}~Ȉ)O=3Y B0SE#r^?~ 28Ug=C)'ނa%>i =;]+eVSfS(-"HnӴR^kdDNՒuGW%t6' sK#oWS)H $NfaY7^y= {wdjx<%w5؎r G*IyG<ϦUNˆO*P ȼMDAs(ѓB{K}ւJXĚ*:#tѤ[QPIN̥0u[JUePrh+%Psh7eA0i<|)5SMg`+SCzwDo'Nj7>t_!L  h*7 j ג\6Ʀ;` `qb0n8WM.kT_`xj]ץ+ؓ] ʛ $1LQֲ[iPi| M#/^;Q>9Kr@Y4Z#YK6 ݸ.S/|k~5[1Q;M3iqWx;KW'w(t3n%'rP)Ő7QWB%r Xpgjm5*R3n^#!Wfo~VSM<@Ѹ'MA"$t" Co㣯=Mkwg^2, \]X效AX"Mv=<2>阆{vG$3.DC˨}f)ЍAz WO/g2ç[ OwpQ#:ҁW ^MYp>;Lı)?кg|+ G_3/~aꎛp &nxdZCh _ T @*.ںD s[s=_#d1[Gh|ۆqWu~ )s/lz1)̎:nmƈ  }#wO?1O,J .8_\ݭ|IUYxT0MrWWh#`jk_t@FSW_RfjQQi׎rzeWlIE[kE̓hzCZd1VC֝0 +H+eiڑ -BAPgnv4C27uqPZfj}/ ^e?h,Qf{U(LqU{\{X-#< ̫:G3Nrf}Xbzb;g6otC_2;4h仪;ͬ]R## y٢{G%zU`rVi[,__*-;8dgP\Gǫ,\V+)~^{*Yނ3e9'nϓDQ?R1:{YB&Bpmk[==XݡޅAGʗ8_m@u=FX5lCݶ:]Z.YvUc`+1}eAEX q$(D}N| (^>AC_O,iڈÔ=Lg;=1T递]9^~d017tSts=QjTdfoίWx렳DvM&U\դ_3ߖl[2 9{&{-t=o@;TeI`w0_ ED2~JḷnbUyn=Y\[ .{a]ҽytQb'|GkF Ǣ܏w̖`*;FQSJp[yirO@IhpUثs,-{3d5&hV;!`_sbs.|{X8HΪn's$~w*t؄$<`bR.r/zy VYcKo5n2)Ap8ޟxȋuORV!<;WG1?km:"պjA [\+JԹoӣ1A"/8 ||#+˛CYN qJ{ƖhNWdkNIiÜLÌ}KgB"`oË+$dA+.}K38lXY!|n$|ȺB[>6jmO8,~k{7o{<0\λG~],%QT fi!r:wE~_ #a+?]a:qh^K:&JWI4 @` kNZ&.E薤ňaQL IG>@[ֽ6-_4ZӶJdgSUV{/+~8slN"ȩ zoՎcᖯӮPŲvxϞE$Z\m1.%pUq$کX4x\"͌`-nq27<].XDme8]D}gQ),^U/3M]|5pJ(), ,!.sP C4̖:V |?}g9Cإ^mc=A҄ dJ4h~>Gǵվv2qx [I@RJpim.7?="Qx ŘU;8Q`PrfUBq : rLpXMFlK`>DhY` r1׈ӣX*4 )[LgɓFtp J2xBݣ"{t-Q%V~R1){ 륡ppXDC$*Pʔ`RnZSp٢ Plzsɶ| yT{5xjVMθ d 4^F|Z$o0$ huv⛫ ~,DM~Z"oh`DK' !A+~Sd8I,%MpxBOP?=3ܞ @gvKk:sYD$GDF[C3=-$g0Ԫ m )Ԟ#y[jA-<*L7*_s>n$},67'hURR xVS7Yv=]~H̯}YWzE$}SXV |^YkEA5*ka\6L:@d#fHUo񼓸%{{zsH!.rgd1]lwv~#rsW-0zcrʃYYG=!å5l,Pf(GFjGBٓD:[͂;MERkpW]s %ςOaEpyJ_Pc&>j໅#n7SmK_1sqOqpM"y LޙJ"f'@pђɞSdžX=U4`/&z*yլt& E[?cL/xxgZ Jn/'ƺ)5@\&z3ϩI"Xvt'pjTQ?*r܇R7m= <_ʨDBi3d:[Գ O*i8'Ƿʁ֞)O+ bPaC0Obl*<=PHi%>fyԾ۬,f/7[X`ͱ' ]3|cF)kjܰܺMJ7F\|Л%^WO޹S'!7ۑvyI|LDÕԃ')=aqr-DH0i7qpR-})o(#9,;)u^tdle7ϣ<?d[kUANTx[ӧlvuM! ,~4AWԣ@, .XҒ2, 2 WV;$~26r+ ,uΛﻘKS9xC韸seGIH?O,&=XybK:Mhn +49;l'0s!:=P?/9 a?TLj@Ja~3WpX瀦cIɛU(cY4\2t6}5E1q2@SqZcADimUPxl֘&ar9je2|/Uhg@aQ> AZu>OIuSsWjgiHB*gÙMqp3~E6?i_> Ƞɿ,GGw=Iz_~ݮld ;[Z*꡻؜Dpv{CSwDJeáY6B(1rdy&` s94 J~Uavo_ mX!u}Nߟ- Dތfb+U, t;,R4}Ѵ|s7nCwJJI.bѶs8mSmS pP;Nm*/1r.FL-Wi LxȬНSJEڽW$:0(fQAݪY%U#d{C^ ;-oO\䋝mPHWye<& iB3Žƌӝ `N&T}4]yk^=|kpe۵RdXHC.׮?CFf;xD Z{V&=v6l@2Dcnl]Pך&qNJm7w(uDžۋNعh@34"g!)G &t`rL-8'9xrMVืH`J{?t@K NaSlsVe#@reO`Mfλ^aƟu+6uZFn}*a(xY{,}@#,"OKLo)ֻ)|Df)-ԩ= 6%2D67`%ިEB@ߨ8- O8YMm vSl!Av{@~'1 U+ Ƙ6SȅP7僚2` \O2/UMIL׺4;pp*TY^!9>jrdJ1" .̉ P)w[ѷ-3REǢvE ]eDJH:JF9(f:?}/xUBMèukv )>_B'SBHg h'o`>R`JڇͿ7.a *xx1!l*Tn(>5*)^6;^ODž7~.+r_!d5Sc9q6|'>w?$D([aBgFrYw̭,(8 %_vhvOS۟lѪD;r7@]m(ėmY=J%\=.#A!h7;jyL ( {O`gys&jCDFuof\1yG,h7.Wl!Ð!T~XW3$Mw$9x0K0ܚv-Su6@"c C\~YYF*Q|nTM5Hm88˕a%s$ +Q/ 5@7`Y>!}-w(T(IWRPRCIť4&? IB\j `8ׇ=xu c={b|~NUu 46W<-CGo>\iExtsU$vJ21uw,pbbY`)'?;wW4YkvW=CfKic󩻇$Vl|>} 4D*4cؤ_`{xV!J,lg =ޘ/.mCuodU`Jƥ= bԊ<ɽۖ=)iT4tlpRMEA/y@ɋ`ӷ _ޯv g+~J0n.1 , ɸ/Cmx0$Wrc+,|ni2R-h# $xA& 6{sD0uZQS~7"tPmrm5M9 [66a q*E@N1g)}M4~?(2ޟ`f1_qз:N )ky%*.VKe>ݬtx.6u)ky59~W{Dd״ r?a9'G^}h_2VбzŬALTHdJ^{=MqgF.Yr =l 0f^fIzvWM) D;DT.[]t)lklu=Կ-^yt ?Cd]4ph-f̗Qu&sʶ' 8'mkܤ/qgqmMiNUv%\ 9S1?3T?rڡ~ZG[V-zs1w85Gc([S3fQ*"=3Y3c\ބX&[i1${QNpA=z/9-Su&{f^ gJ=$GWE/ /B A؍U]bv)3fAf!<Ѡݭ o08·zmrcļn ?M%+ 9`CrkR@v {uu!*\޹a'G4m,7Go>oZT{Č*FbiZ|y`X.%9ۺar:' jb',MdTjn9dRCwpͦ .q_BjO_W}qLVQ6l GK+$VMƿ8E֖~PΝfd I 6G~8QUŪV6H l=һ}: 2Xb8~AN2LbsISS< }4iEz03bw~c ⶹ% k ^_ߤ:BD_M8k+,lCIc:p3(bdT\(6y{#2Nqnh/$gG% Ϣ,ސ| z;E3r;s0Ig'&i3 - z72ت묑A@Sۼ#,+qo,od|ʯyu9ψd̼V8ʆZ\׉{MKk&1 TWլ 9NDypsLevԝuz=o>x$,-鰍TۢLs! 6]6D 4yևL=`n?4]T< ?wgM=3Q4sBV‰JeL_V<ָ捾ibg!=^g PΕ,my#WoLbjv̞$5(^ˋI0ZvkK YҚԵ8/eieڄȭ/P^Uo٪?~NΗ28$~[`X|ll P-.d-!=K3ߤԄSPimvן5'?nEV|^ Hce)GҸ.}PA)u o(X;najU/ת'済;~1ݶzvE_Kkpllc7` XZg}QYQ,4kRrYht%AڿAMfעG[BZRN&{Q,߷SҊ(#C8}׆ſ!0*wo=FP#OU&5[T[E13?r\C0X`|7ГZ$Y? ::h~ HjfB7v.n>\I_UMrC3>~kA(0=#nTZZ?_F: w$,UNm*cs:;'x'N),ѺW^sGk0m N]vCpp]FPk[Z6U\XqAQ}}Ӓt¯֯8T0N„eBvw 51@M㱚( 6G)tn\z)j>v1wap1ǧF7$s))HoOHIh 6vze4&LB`#|y;{6'^?vy5)դMq39FFs)=+˃qi[Lt4AeQAt7kuԋyFaCQX7$gkeIR$QC@NȎ?J+R|KZ2wJa()QmJ{pbD߇[vzSh-5wE^x8I!9CL\R[a'd\*%}@%YL}쒞  m1(W& +hYdr]"XTn :p@Tt"{j S(f*9u6^Tn=ZI*{[QjzМN`@ Qo%|?Ru'scTƍG\`˂dzC| ajD2*"7^?eop%-4(mSohŴo3ĄX-Vj"Z>nOeK/k7ki&gLØU(loWS5\x@<,}M)ZlӼ/6AA4%ѐԏXBKd[Kf1iaw&0ɥ碁yfF@P4c2f|l}NhKyxvE8Z 0)܈$}~+Bp`;rW]첂i^S@;mEYbP=%{c7ġ 1g- U]1)3^m!ϨA/RcA<+7oޢ^~S垷b$kcV!pr:$Qr ]` mAu#yEuMP*1viJ4(!?xi{ID&hbe\WWb']3}t(,iEhڸ{j89;8ȦX8E4i8Dv+d2:UJ9i-z2:Dryn2&uWpD)qyYa(J-=} Jp3 g,d#.X?q2¿dU΁B/l/$%\lGUxT\ݦkM }UǍ.4R?OHϥ}lD[}6Oa,Ǜ29Z?|$Ր.یڼz k b0R Sܣh Thqtr>5l-μP_?i7>o#Un5t=MaC[}dA=hŪ6!^)h|"a2?7?'W%;x'"QE%T-t0|Q+FH'*/AfvƨPRjن+B=MX-\XfXä3u[y2J$OXYCca׎Z~,÷{A###-Jn9o5eJ$7V ^-1ɶiW4)J2#zL+TD twMp74M< u 6"R<4w:B| pnh:'?#E|T@;[J?`,mx^nhpss8Ww#tϻ)u+%i HEBFaV.uSMP$E-]W`W2?r >%9 f!]*yd긟K_)7j` 9D!W2+8*7G'eGQ|N,GPMzӸ(ش׾ǾBc37ۍw.|HWPx)(s7l?DK>tE3LWsÇo%xb rV=hj;`d+H<,utlמEۋH(ta$|$᜴[q'(;`څՋrC?7=3uT8#'@AI֦_9' V6'\ F9|e-! |.3*MͰU3*~$!/: $Tcy{hAiǶ&qFX^8\Tg<7@}]ayED8VkQt&4?h5@s4tmU' 'k}&b\cуɯG:_n wujkbV'Y$Q!eTG>?j6F4 Ga}tKG^e#zIn{18sA>{ 4nq9ӉDϝV u<iA|hr=U!Mo]a`ܧCi9}ͶUo]{Mk$qϨ:=&qR9VB7qmd1jvwFV|V,l|ͧuW_:Kmkik3CQx]ֲ`*V F6\%,OZF[^ LߗvIS{ūK '!S[JjpW#+:na4CLE8*x8GJ_ 4=Fؑ`&Й[?O < %!"%Z?GպBw!9A&c̜tfK`i@Hdx'BF& 8V(X*12?"*p͸BpFw$  9!ꂄ uB70M:H5&c#$6i鴊Yf$\k(0`X!˅e\# JLLa*YSC;JwyeS\o `/|f8y,,ѧNJf&=ёDW8E]40bfڌE~SJTm.Q$ R$ _Œ`(sQG L![p9caIeAQx-1̩ܳJ1a{oUQcVZ`m nyÕal.X]=bg,,;(WcL6i1A uF܏~qyҙcF5J\Π8bA>RAc+"zzAGM6\6nqv%i|~F엩 cUoA# *^˛ \,Rv=55l/歿8tQ)#V'8"_<!"-c3vΰ=(Ηm ޶*DV;N2S̴VyĒ 4+i7JJPʣp'1mPLF`j#3 {2=xkUhbBȋR5y@;.>  )0א5^Xa|.u]tnN:q X)YFtC&ʽJ d}[@s Ϣ.(V[&M.Ȋ0!`Z"0 ]ήBncN/y!3x%C Eh/f:T5H(2w)s5a#L۵ꙫ1-%Y ٶ ȝ2Nz䙌zj=/Ull(frǧl6R8˕DuR{˶B-2OPgG~ts˰<;И"ۻkxksޙp`2K:fQe鿁8 PTD*]F/a[r([;8ke͊ޫcQ]?P*CU[w,#tˑ$/Atj}8EX.['r'X5L)1_Dg~Cphuڇ t BZnSe6W{Rg ̣XbC2?2ҺH m(5r !),[ Ja;^;=fj(Oq jp#chRP5lRt$W1u_{1Psu%!2QSB]e\Mx'D0[ʳyJ~BR&%iіqކI钌 䢛3:>~8ױ\<:V]L*{K=<Wj #8GV\#[Վ4XU:i6sp#OéWkErh[}0]QF)DE("xMSG,V M8l~Q)ِti1kIowj6mOl ; y 5Db߼zrSŘ8e/li,aHY#@t/2(aAlE~ɠ ڇLa@mz_--6'Ă~9i gJPؠ09t&s52!ͦ.aˆ(b"ժ/Lx(ӑm@^fqBftzB7έI Yut/+GX}=>_~uKˏ=Y$}Wde4BoHoz2$|xzII⎆x.QY{gGфzm| SG v`f!31c~Y#Ue[6lH`W$cf)`k*d5}<@`7:(|Ԅ&'1xm$L_Omr^2f3h]\Hd z I Z$U#55ag/tUof̎N)Ɂ0>ߒrФS2'GɅ+t$}Qb ^(mL<3;r