aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/install/helper/database.php
blob: ad0f3dd3cdfb892b15009d9a0934e25591513e2b (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
<?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\install\helper;

use phpbb\install\exception\invalid_dbms_exception;

/**
 * Database related general functionality for installer
 */
class database
{
	/**
	 * @var \phpbb\filesystem\filesystem_interface
	 */
	protected $filesystem;

	/**
	 * @var string
	 */
	protected $phpbb_root_path;

	/**
	 * @var array
	 */
	protected $supported_dbms = array(
		// Note: php 5.5 alpha 2 deprecated mysql.
		// Keep mysqli before mysql in this list.
		'mysqli'	=> array(
			'LABEL'			=> 'MySQL with MySQLi Extension',
			'SCHEMA'		=> 'mysql_41',
			'MODULE'		=> 'mysqli',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\mysqli',
			'AVAILABLE'		=> true,
			'2.0.x'			=> true,
		),
		'mysql'		=> array(
			'LABEL'			=> 'MySQL',
			'SCHEMA'		=> 'mysql',
			'MODULE'		=> 'mysql',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\mysql',
			'AVAILABLE'		=> true,
			'2.0.x'			=> true,
		),
		'mssql_odbc'=>	array(
			'LABEL'			=> 'MS SQL Server [ ODBC ]',
			'SCHEMA'		=> 'mssql',
			'MODULE'		=> 'odbc',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\mssql_odbc',
			'AVAILABLE'		=> true,
			'2.0.x'			=> true,
		),
		'mssqlnative'		=> array(
			'LABEL'			=> 'MS SQL Server 2005+ [ Native ]',
			'SCHEMA'		=> 'mssql',
			'MODULE'		=> 'sqlsrv',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\mssqlnative',
			'AVAILABLE'		=> true,
			'2.0.x'			=> false,
		),
		'oracle'	=>	array(
			'LABEL'			=> 'Oracle',
			'SCHEMA'		=> 'oracle',
			'MODULE'		=> 'oci8',
			'DELIM'			=> '/',
			'DRIVER'		=> 'phpbb\db\driver\oracle',
			'AVAILABLE'		=> true,
			'2.0.x'			=> false,
		),
		'postgres' => array(
			'LABEL'			=> 'PostgreSQL 8.3+',
			'SCHEMA'		=> 'postgres',
			'MODULE'		=> 'pgsql',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\postgres',
			'AVAILABLE'		=> true,
			'2.0.x'			=> true,
		),
		'sqlite3'		=> array(
			'LABEL'			=> 'SQLite3',
			'SCHEMA'		=> 'sqlite',
			'MODULE'		=> 'sqlite3',
			'DELIM'			=> ';',
			'DRIVER'		=> 'phpbb\db\driver\sqlite3',
			'AVAILABLE'		=> true,
			'2.0.x'			=> false,
		),
	);

	/**
	 * Constructor
	 *
	 * @param \phpbb\filesystem\filesystem_interface	$filesystem			Filesystem interface
	 * @param string									$phpbb_root_path	Path to phpBB's root
	 */
	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
	{
		$this->filesystem		= $filesystem;
		$this->phpbb_root_path	= $phpbb_root_path;
	}

	/**
	 * Returns an array of available DBMS supported by phpBB
	 *
	 * If a DBMS is specified it will only return data for that DBMS
	 * and will load its extension if necessary.
	 *
	 * @param	mixed	$dbms				name of the DBMS that's info is required or false for all DBMS info
	 * @param	bool	$return_unavailable	set it to true if you expect unavailable but supported DBMS
	 * 										returned as well
	 * @param	bool	$only_20x_options	set it to true if you only want to recover 2.0.x options
	 *
	 * @return	array	Array of available and supported DBMS
	 */
	public function get_available_dbms($dbms = false, $return_unavailable = false, $only_20x_options = false)
	{
		$available_dbms = $this->supported_dbms;

		if ($dbms)
		{
			if (isset($this->supported_dbms[$dbms]))
			{
				$available_dbms = array($dbms => $this->supported_dbms[$dbms]);
			}
			else
			{
				return array();
			}
		}

		$any_dbms_available = false;
		foreach ($available_dbms as $db_name => $db_array)
		{
			if ($only_20x_options && !$db_array['2.0.x'])
			{
				if ($return_unavailable)
				{
					$available_dbms[$db_name]['AVAILABLE'] = false;
				}
				else
				{
					unset($available_dbms[$db_name]);
				}

				continue;
			}

			$dll = $db_array['MODULE'];
			if (!@extension_loaded($dll))
			{
				if ($return_unavailable)
				{
					$available_dbms[$db_name]['AVAILABLE'] = false;
				}
				else
				{
					unset($available_dbms[$db_name]);
				}

				continue;
			}

			$any_dbms_available = true;
		}

		if ($return_unavailable)
		{
			$available_dbms['ANY_DB_SUPPORT'] = $any_dbms_available;
		}

		return $available_dbms;
	}

	/**
	 * Removes "/* style" as well as "# style" comments from $input.
	 *
	 * @param string $sql_query	Input string
	 *
	 * @return string Input string with comments removed
	 */
	public function remove_comments($sql_query)
	{
		// Remove /* */ comments (http://ostermiller.org/findcomment.html)
		$sql_query = preg_replace('#/\*(.|[\r\n])*?\*/#', "\n", $sql_query);

		// Remove # style comments
		$sql_query = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $sql_query));

		return $sql_query;
	}

	/**
	 * split_sql_file() will split an uploaded sql file into single sql statements.
	 *
	 * Note: expects trim() to have already been run on $sql.
	 *
	 * @param	string	$sql		SQL statements
	 * @param	string	$delimiter	Delimiter between sql statements
	 *
	 * @return array Array of sql statements
	 */
	public function split_sql_file($sql, $delimiter)
	{
		$sql = str_replace("\r" , '', $sql);
		$data = preg_split('/' . preg_quote($delimiter, '/') . '$/m', $sql);

		$data = array_map('trim', $data);

		// The empty case
		$end_data = end($data);

		if (empty($end_data))
		{
			unset($data[key($data)]);
		}

		return $data;
	}

	/**
	 * Validates table prefix
	 *
	 * @param string	$dbms			The selected dbms
	 * @param string	$table_prefix	The table prefix to validate
	 *
	 * @return bool|array	true if table prefix is valid, array of errors otherwise
	 *
	 * @throws \phpbb\install\exception\invalid_dbms_exception When $dbms is not a valid
	 */
	public function validate_table_prefix($dbms, $table_prefix)
	{
		$errors = array();

		if (!preg_match('#^[a-zA-Z][a-zA-Z0-9_]*$#', $table_prefix))
		{
			$errors[] = array(
				'title' => 'INST_ERR_DB_INVALID_PREFIX',
			);
		}

		// Do dbms specific checks
		$dbms_info = $this->get_available_dbms($dbms);
		switch ($dbms_info[$dbms]['SCHEMA'])
		{
			case 'mysql':
			case 'mysql_41':
				$prefix_length = 36;
			break;
			case 'mssql':
				$prefix_length = 90;
			break;
			case 'oracle':
				$prefix_length = 6;
			break;
			case 'postgres':
				$prefix_length = 36;
			break;
			case 'sqlite':
				$prefix_length = 200;
			break;
			default:
				throw new invalid_dbms_exception();
			break;
		}

		// Check the prefix length to ensure that index names are not too long
		if (strlen($table_prefix) > $prefix_length)
		{
			$errors[] = array(
				'title' => array('INST_ERR_PREFIX_TOO_LONG', $prefix_length),
			);
		}

		return (empty($errors)) ? true : $errors;
	}

	/**
	 * Check if the user provided database parameters are correct
	 *
	 * This function checks the database connection data and also checks for
	 * any other problems that could cause an error during the installation
	 * such as if there is any database table names conflicting.
	 *
	 * Note: The function assumes that $table_prefix has been already validated
	 * with validate_table_prefix().
	 *
	 * @param string	$dbms			Selected database type
	 * @param string	$dbhost			Database host address
	 * @param int		$dbport			Database port number
	 * @param string	$dbuser			Database username
	 * @param string	$dbpass			Database password
	 * @param string	$dbname			Database name
	 * @param string	$table_prefix	Database table prefix
	 *
	 * @return array|bool	Returns true if test is successful, array of errors otherwise
	 */
	public function check_database_connection($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix)
	{
		$dbms_info = $this->get_available_dbms($dbms);
		$dbms_info = $dbms_info[$dbms];
		$errors = array();

		// Instantiate it and set return on error true
		/** @var \phpbb\db\driver\driver_interface $db */
		$db = new $dbms_info['DRIVER'];
		$db->sql_return_on_error(true);

		// Check that we actually have a database name before going any further
		if (!in_array($dbms_info['SCHEMA'], array('sqlite', 'oracle'), true) && $dbname === '')
		{
			$errors[] = array(
				'title' => 'INST_ERR_DB_NO_NAME',
			);
		}

		// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
		if ($dbms_info['SCHEMA'] === 'sqlite'
			&& stripos($this->filesystem->realpath($dbhost), $this->filesystem->realpath($this->phpbb_root_path) === 0))
		{
			$errors[] = array(
				'title' =>'INST_ERR_DB_FORUM_PATH',
			);
		}

		// Check if SQLite database is writable
		if ($dbms_info['SCHEMA'] === 'sqlite'
			&& (!$this->filesystem->is_writable($dbhost) || !$this->filesystem->is_writable(pathinfo($dbhost, PATHINFO_DIRNAME))))
		{
			$errors[] = array(
				'title' =>'INST_ERR_DB_NO_WRITABLE',
			);
		}

		// Try to connect to db
		if (is_array($db->sql_connect($dbhost, $dbuser, $dbpass, $dbname, $dbport, false, true)))
		{
			$db_error = $db->sql_error();
			$errors[] = array(
				'title' => 'INST_ERR_DB_CONNECT',
				'description' => ($db_error['message']) ? utf8_convert_message($db_error['message']) : 'INST_ERR_DB_NO_ERROR',
			);
		}
		else
		{
			// Check if there is any table name collisions
			$temp_prefix = strtolower($table_prefix);
			$table_ary = array(
				$temp_prefix . 'attachments',
				$temp_prefix . 'config',
				$temp_prefix . 'sessions',
				$temp_prefix . 'topics',
				$temp_prefix . 'users',
			);

			$db_tools_factory = new \phpbb\db\tools\factory();
			$db_tools = $db_tools_factory->get($db);
			$tables = $db_tools->sql_list_tables();
			$tables = array_map('strtolower', $tables);
			$table_intersect = array_intersect($tables, $table_ary);

			if (count($table_intersect))
			{
				$errors[] = array(
					'title' => 'INST_ERR_PREFIX',
				);
			}

			// Check if database version is supported
			switch ($dbms)
			{
				case 'mysqli':
					if (version_compare($db->sql_server_info(true), '4.1.3', '<'))
					{
						$errors[] = array(
							'title' => 'INST_ERR_DB_NO_MYSQLI',
						);
					}
				break;
				case 'sqlite3':
					if (version_compare($db->sql_server_info(true), '3.6.15', '<'))
					{
						$errors[] = array(
							'title' => 'INST_ERR_DB_NO_SQLITE3',
						);
					}
				break;
				case 'oracle':
					$sql = "SELECT *
						FROM NLS_DATABASE_PARAMETERS
						WHERE PARAMETER = 'NLS_RDBMS_VERSION'
							OR PARAMETER = 'NLS_CHARACTERSET'";
					$result = $db->sql_query($sql);

					while ($row = $db->sql_fetchrow($result))
					{
						$stats[$row['parameter']] = $row['value'];
					}
					$db->sql_freeresult($result);

					if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8')
					{
						$errors[] = array(
							'title' => 'INST_ERR_DB_NO_ORACLE',
						);
					}
				break;
				case 'postgres':
					$sql = "SHOW server_encoding;";
					$result = $db->sql_query($sql);
					$row = $db->sql_fetchrow($result);
					$db->sql_freeresult($result);

					if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
					{
						$errors[] = array(
							'title' => 'INST_ERR_DB_NO_POSTGRES',
						);
					}
				break;
			}
		}

		return (empty($errors)) ? true : $errors;
	}
}
k`kv5P.XUw!mOup5"LHHYH4K6R^,а&|'7ə"bI2P=_.9 }GN=\<ˈf Q~Obٽ և0L;`Jb8.-̑)))kCMU :ѽK=tOɜ:!'G=J>L:ˌ*[CD39A "B|*@pb6 h%E1+X p1w1VB2SR ]zJzo,=!Zs“Xk፣g#*IL>2AT}E7dPJhC:-cDJݠ{<%Z4)Vm)X#][-K EO|8zY!n)jDMD)^GaQ?4p;vÙ:D/|KK@T_bċ> F<:Rnk+TSܴ4QϺ /ʒMsFIs|/.[{E"RJ9TRT,_!@΀KE%=mTƟVz-x">?XK _eC5F!{ٔ,q TUCt{6> (M(1^?әòC\2ƺ.eJ{#6:aw j{b@+;ɩ˂jZyd/MQM PdgrpƖB@=g0MQ8*WY)*0Q,%Q 5zW]1h>/ִ\ y;c/);P_ F~j Z)KaulCA*AVqD 9Sg\AO%:?72 xuG š~VY2iA}L' 9cRM d^ 7zEIg0s\oD{q#3-]{MIC`X>S%pm\3q/޺p (=qdVa;Y6O[/\NJz-G [`qEڷ]&J+&yW`4!Mth)g +jl/}?BL  l{2 IeoLؿSF/{u[H S.@u1ǿس$(AnZK00`S c~/ND0<8x :Ɛz4wq{nqs/ӺUX@O/9 :eR!lv9Uy Fk-j:{4'ެ-ЮUU\'Z-<6pAv=΋ɊLN"8GT ¢х9I@{ݟM|j[R)"n&5q t%bz}8?\۪NL.bU2 (U_'@o{)Fk wՏ(x{8Bł1h6Kҹv-p8.Zr*cw6X6NS]T v)r6H;cX,Qz+G"f" : *-zx"ItqIGpLȲT?G "kC ҄%l:xDV Zr9hY z{k{k/1}gHM-OsL2{<M UUx6*H݊q1*\M#c\.&Ai垚-F?\*cK0Lr:y yzY{7{'HBIYllEjRm{_fRJ[O?}Uۃ\ȑvd+YO{\#JJAAfT|~q }-lA1/S#4 L{cVaocN_[,F 7SLDp3QEOKf)' >Gϋi{?Nn`gZp܋h*_b ŏ w5L6##LIt*^f)ُchY4䀜ߴB>c;ӕ4L Ѽ ^i`߆*!c9 sXi#?]?ŊBgJc>a=Tŕ\׼c(sVK#շE+ڢpŚ̶D4 7̒a򑭀ȷ+WKFcBXiN2I+$qD!]!l'~gGRhɞDlz )jGqn ˟Ѡ-K޴;P^Z% 6bQnz &f~H &zvg"r2-j)y¤@zXvPM{\2ㄥVp1 $5a3 UB m-ƪ/ė]I9[L)?yJy NJlJU\xLeν߉T2Ϻٝ] ߿٪Obu47|#?SV=jw.Ug,C6V%*KWN@T.Wsg y|\/xX1}h/M5%kbOH&{>uӸR68(w.6XVOk\]/BݸVT%k\sy-%{XdZc3 S"vDbr="#YC{]Toٺ)^" wxXl˃;n +y{h+3q+da)UԒG10$lU>2:*[1*.O9%X/Acr, )l֖*pEqP$p|2#,<|X"im {C׊*IeBe.n ~+A44;WQ+X㉓dtƍ%V#gXVf9< ]/! tŅ&u9(bóޙs,(^a;F7 =n^lAҪ|$n3`O.ǝ[kD񳶬`F5]$2]zZS 쁳a%j/?ͣm XV|pNV}FWqb~օqCcb݇P';Wpuz(Brj!.Bnb:^$H=fGS QB:LF$.*բϽb־>%,{ !ԍm7 +:!mGRC~3zH躶Y!]bh+o2fs/lLՂcϑq/!Β-`&=MuFWD_>߉#Qi+XFKܓĀ"lq^.sQ->A~Z{$*7cXZRQՇ pJ/I^)_ IL0,+5a:5I(|]*:rȈ=6[-[ Xz%a8"r.?GeIB8YWza4rm\Rx+nEH!5z|ݬMUzWh RȞViL4:5-SJ2z.$iT~`wgb>!*:h_\:#>\vU{)uhuR%IŎjJ5;u d\y"UenZWR;gw2I7ExKߪKr񩲇3K+>%~N2yB !\;>7"qTZJOaqja~ `. rFN11q`O t[J"^j^<9Ytg\X뼩EFYCҲRf Rf8,x"o{m4S2F^\ӈ1<:"F^*glbE Ŗ22UFNU;?/^3"~@PTwUA˵PG<4Xz\™@[qEnHJXgYT} 'ʼni=8 DIUx9aaY;] qO톏]W? ƤӟU ۞Ek߂ˎE^ A v2đ?׀Ɔ)[I|Xi+pÔSAa!Uj5mύn}%[H]K e#TeЛϴe+>6@{m \{j97Os9 "2 R _čr9TB"*: YݯF- \Hst"<}[JR;A+PөQ68Ѷ% g, ڜz.Fj(*K&NkEG|?r"hGtԅ> `a^go"N1AqPj\t;sbJYs~+196 e7ya~-_zJZ_(4U±CNZ3 &\20dLXu W=cհ壠 ܃S' dxG{S/w7y=6 h RAx,;2΁ bt^,L3@Vι S)F~ٽyҠA'D &ׅqD qG~"2؅i8^wv :bBG0X$±AiHJP{ ·`GAqS+.s4"Tp15FNJ[{L~nE!SEK4$_WMM ! _Ԅw"vcn1<+C3Њpﮕ:& YQ~탸{h>ݚ**yuC$$S3-BB?ʹQ)_s8e8("oY3N\M7ʀCP92Fv$c8b>f':[e$CN>JBs\'w^5?s"RWle1Cs}Ɯ`7MWZ-/)bW>?(k6ƛ9hHuӗ\YyylO(d* @RK>S,#>7JF,q&.}pŃyN):5SpK-ka=2xjƏ U0](T/-d^m&OJoQFq¡:6JуLW\E81=r^khW@ u2EiY;]c$ݷ+f3ł ΁bSK-bc(i%4rMlZ&I[YxFDFnD1exqAωUiQA Πުg WT[S:G6ρ鏊ZŅVИ$c!8.Ч#FqrF鰃q&1tzzT6ȆW&{Co+ z% a/5$樞P6Q"/.z<fyo'oƎ ,Ύ$Sxݥp `$`ZݣK\}0:6ao.vҦ{iMBqxm릒#hϩ ZU"~[+Z_'"ڭy0z-er~ t=Wa}AڸC# όZ:R깭4h|B̈RZ-LmIl\#@\}sZLc 8 P`P(ۉfrK ۼ [.}%oCmQޫ8?ߦۈ-kQr V z!)&T,B`fIr*{b͠_QRݰZL+0]MɍǸܨ)F?Mx`7䊛uDWQfTh=֚F/r>,f7c2 Ё 琏+VoJ[f9ut}/41$fNK3)B/~GZJ4ƪ{0YU8y ;5@58TDſw&v0}C@ՙVruT #yEZK`TDS 2?G٣ fS2(#]D7 ?N so7$$j]yrF3 hG@%U\xL>`~6_A5Ue66>Oқod_eܚڂvtEd5#o y!x5 +L$ݘ!$ؐZpžjVe%Ǒ-[L]"_OFʒyoA u=p0&iN,(Ke |q柽)fUٝ&D]WS˰+AU[<3*٬loKJq?WM5k4=rYoVzV/J]>~n d $Ja|-r՞ pN7>v Rm8 q7ޑ!ņQ[Ls{=5, )-e`NlM,K3@U`˞(# v!@5^ͥK ,6vQmt J60esyy8|M)PD="|Sy/xa?jvx/ۦ=7*S:u~'L.KJu!3 -D x%,Lak }nO?a! VQ-5_Əu6z,᥯\PEʕyVziNڟ' fâ4Ks*Th6io@+뼤JϤ RCoK?,{NN J%w>5:mt)! A";>^Qcľ"n5bbDQ=ٓ|4|7RzOj0e#,kۆL5[oEިv"OEsFԌ!Y}"'(]X>l֠8C;ZBrؤ/?ZY6/ֶCkW(26Xe9xSI0W%e#.v] f6˥!f:H'Mm&J5ISٻ9<`‡Nlu ,3dˀ~xoŠz qSB6N{uRFYMpyY2p EB|>}AҦ4 ޙW=w&O`r5 X'Xv_#NDf)$'kX4|XL_^tӾ[v2D WAB/k#龘r]E՚M{*~o+FW]z޷SdYCE~sJ0|IH8<`zɌ Lr1OF1g~BJi$Pa>PB=,֥v"Fˢ=SrK9O]=m:|@Jt@\dYr+7` aUv?3HE]'y)e?e=S~UàcJn ƙ;)fZ&j#C$ƴiAygG-B3xv1cE'$\FR=Df>zʴp^?% iάl m M~)Zwb3e)s[joӿx$/š2y?OM ڄGڵL*,jVF8Gt^襞6zvl1P%ONA4 TZuͥGS"td]$HJ3Bʺt *NoY|jă'N̶On7M2Ԉ {wvdžj¥n$`Tw>Z^6.̀ۆ19p|0Q(Ŕ~LCs>TX1El\empWc"NF\N n` ֕E=\7Y$B\h{` EηR.ǯx'0d(peMXǟwDcLE" % IApcSSn{ZYpi i> V!v]\n <܁+#/bOq<5Ov7KB AWͥ+z+oNbbX3H>C|*b6}"hX;SWH 9& ]F8|0wb}4&cqc˚D}oC.j>} %GeƠAͮf/? M)V 𙀿AB<}|s9^("==avV ZcWu+*Ðx?#.qd?ϤRDt̉[h[Anj(l}BWt>M(PqtidJ_(0>@Q4?he&h0mIJkz(K~r*j3py: >:{lyv2 yJ۟3CeنGkJ+. fo,ц$ڊs!_Ǡ/V[JaDp cMD'+Ws5~^az 1`Q~2Fs'wz9RF}lƗ/С3(ƭ=j4 M;OoKS;(΄Fa[nR^O;9Mh5A9e00 Fw4ɣŮ'C!$h4IIJ!rg(GOW_{k#!𐼀gV"A"!i8%xpXM ۔PV49u4!R8C{&[VGd;Qhi/\D:fG׻*_*D@g!2@FI͊G*ÐGoRR .Vez~& TpE~9ɘ'q}^@}M3rA'_UG:ERUWn}wf&j@, >%B LP_$XV q4B\)J ]mDc3ky@QBAOJ>D΢6D$=޼tE`1m8BH?q_=?*BI ML=ut)Dl?Z}v桩_mTd_Ɛ_wT;;0 XTdǔ8dՓn9FRX11vx6׸t+*r^]LpX@̋YUSӆluz^( T^R2)E|`f,ni8 ǽdE,+bM4o?11#tmPXohQk-ZlV:~I.s)^cf9E^8lh9JAH@Vxj@}fϙ-[џtr@h՜3QVFU[V7mR~y aaQ8r T\z;[=\b{jLzam,-*"af8t󂖮UDLx<+#q~&  hԫRwj+ m{d}GfK Z[,BQK3vOB?~>.jc0{).M6kT%엤LaVrĨ4X_v_IؠI/aY*䉱g1iA o~<ۄHI%Z+(EG?of*hJa~sg nGTgnp.&`%C% Қ D xg0ȟZA !/Idy7 9z9<eJ{7v],A߈GGx9YNDwy3ʗ ɾqh)Tb_4$[].-)k*gӖA+Y~tvkѨIƨ"}  Vi2N2^\[lm^9ؗ[<}#xq0nHBtSV쑘XW?h`Wq5x%{̌[owvE 9\ 2 L>^|"[Kt#g^& Geqla&*gCx]Y Գ; rQEtYLw<" 4a$DiJ8rP\앳(Gtsdd:ˉgU">AQ ƨM,n7!DM먾OݑdCN, arHEʉ%4&x ybY>b=woCdeڿIկ%!49cU/ߋ6_fXgcQ ,x>~L)(@-&?T0^B7No 8+PoXП npJ[H?^ٿ;BdVQc_?Y`Ci*wLzrkKFaR!'#R9]"EN7SQ)Q"i 1d=xG߶lj YMjuᷩ0eipwH*q\zt׷ zߓ>M4*kjh%hDbz84ErWyܽ qChl' _%ԉxܰ rtֵa6щ} GyVeڞ;uŞ6">KgSfE+3tS>B !!R>ڠg|U6MaJŝ#.UJ*twL AWl;۩jB#b+ j5<4B^(@sh0 yRzx} @p9Ci17 Wa7hnb }'taM@qEtc>$ ( :5dSh-cJH!~A孳cΪ_^V <މgs8ҿ}a; #HkM=%I瞅ޭ ͝S +{C֣a'B"eΊ5IJms,Zɤcg-<ӹoKhM>nQ_H|7.Xk/N0u PU}D3u7I(x;!..px~֯x;RN|͆j &p 0\2ޚ-,JOM0]n11 _ 9m«3C4i٨GKd52ȏ쥮ʜp0$yI^2;u 5_k0-Cv2_ ŦPRM7]p7mf`"!V:v0L|D-4+Ti"7!C^`(xe.Y{HQN<;`y;t0hcI"ʧw{%K,IPXUE VXx''á c >e.rH4Y+գg~Ej&<c7S98v^C6qst&?i,8)]V \FbxiĒ@bRor&R՞=7MAxH1B pi ?hA8r.8Gl^5 udc Ԅ|p%8+W%[_yfPf~6KC:CCdp3{HKnV#38p?wA$Մ<+"~8N:04x4ɏCE40LnM陆SA_;5$g_%ȅE~).d0zQz|tP֎;m'upS"fKNt9Z,+6up #B\3p;!V9Cz$3 fk">ۢ _$MXך\/ZYdwJ|I ^`k :rGuVZeZI| *3띔VLCqH$\MT|L,QA,7A9~eSzJ̀ ,fmm5RGUշ3[-&~i9vj: טڕ)a+Fud6D%56fFm߉ŅRUx>ݺB;ԏS EqTZSګ̰ʤ xb ; kn8 r$ҹA8H;6xVx,Lr!"ADVΆb껫N;K֋K"wjbd+h>¸d, ̈S r1W¾lptY1+ORqy;!_TRG& L/e@faEFVp(14B'UXF0`l7mʻ Fs8,ߨՃPRBgLCW-zE?)ophp-`T:{S "&$xMK(!Dj>9{G8.isp,K!ǸC/-Z &w0\ X18~*UOOB8G'"vLU TviI/֧T#!uy' S_- UuwǬHE{Q%٪%MD`У=wd &75rD%KTQȅ9UCcR(}b5?KChL_`*nYT!ʿclWwE RCZk+#S8g)ִ̖L;%Px3 ZU e[lʚ{Gc(S,+)S]2|4y lN96ZC!]sT~ٚ=QKͳ!gr`w"yI=Ej\i޸5XH;j=W ))T,-IEd"a#Af؀:+@W"i&>ce) Rhs[_M+l w4 SVwrLz8߉J-i1KU .kc-GX_R@7ʻ0b90u:a?sR4OD5XDO-3( AobŮ$N}HEh)wnXч$㨝'XD/~9$@@ׇ/w@1ÝЫ;߰uO5uWb^+qG)Zʉxi')ֻ'SbNeWl:4!QYT98ۦ+71%^okʫ5~D76+sIcK2udQY<=X-s݅.|URRH4$VXpMg̋drImZ·*4JI][Ps,SC!lƌO `5OΟc[A^Nnr95 RX|玐QkFɖ2= k7' HlC}70bLo 4R@>O ϯff ]>5 .l?f>j.nx,"xL ǠNXH@|iI))ץu}|)F)%g.Fr̥Z$bpPN33xP}f1LHzEc`= 3te{ћǕM`MdUi}c{;%^ǭ`@Jit)+=~#z3ԛ؇"7Z>VLPDa%c/-k.67K \/\HY2BS+o] J0A^mx#/  fPx[Y!~6dqw0L vv}aFRj7eըl8/FBHe_=΄ܱȩmHs]|>y5{_к ׀WO5Ja*d!/c{"#7OŴ[3a yցVDP c* 4ŜډE>9Ei{q$,p'X&EaQEh1 c!.Wg`م&7  I;x #涉w{Xt=%6VG/@82Ή->C3oi3%Nl1T5BFJ{0VArhc+_)v[p5h50lz ed5C%P%9L%QTSw|dǘ LZ9a _! a! ҠN8U+'#6ëp |5<UŞq|ɖ&Uz`inYkWhpi;coЗzt s`R_fMLP;l/3\>hkس۶G:p49dp O_YՉ,[Le@͗rHC42Yb$ց914"k2Xeмr4]& 5.K2CHTҷˮ 0 x^H A4CVϕ[xȃ3E48a()qP$IϷ[D'wF)nܑXL R*r)_02 &[kw;o&ϰ 3i1T(SٴFyKͻҭEK&hnM.PJSN&kO53.A8{7+킢u.i/k^@h>O0e `@ڏu䥀񡜱V~U$VA 7|tr)75 |Qkzj{w´$T%HdVd&3]~Î;;g'X4& A.Q~BCf3b#cT[͝bqm?l3ޟ ¾B W6`,EإSK7J|y@>ӿrVq jU-tAO,[!W<%[m7)q24HA'Պ^r,Δ#,:pG!4 e.d֌䇓ljyȞMBp;E JQMͿJC!m<1\: 0)cy;_ L2$cR:1=yI䇶CJG e۠wXU^dh譚y?DF\>J`zp@T6 eLnW r:,]6`6T m-bn%'jQ2̿4M&C!bm_N6 8OdR5 mE"ŅȽM`}V5Lg3#NN :}&?=-Jji_˙}Yp)r:RyF߿UI7A6tDT4BIڔ,> ,KNӯDzz#\4Eo&~0Un٦ԌEgnRPCW]mTq',m<}HO;ExANPd;qJmWeNm@&LJP AmBB}#"avt GC;Rw.Lbp ^q5krO;U]nOk:EٿKTefJ3P= G,q rW v3.~CaАl6rUܚBex&dw?qFԽ~5)>tEnXYz&ۧ5^F߶e^^&@V<0aDҳO!,qDwZ;r# LQ 2YaOQn}C?_qLz/%tsBiAv+PФ&HYc" yݔt]d +RY63ƅ|Α+hum`֖!pgbe/.4{S@(~9[ۊ$P/HR%cyk7ozk #V<`mO~c " !:,Ml䫵apyH([IA,X?hgt1]E<-ӅIXhs(jt{,bGhyAC€߬waoL͔`s7pHG| T3nFF ;ݹDiךOUȕWX8ct3)D,au~3S=h^,8)Vc1tӂٟJꪐ1Qt'Kmʊֵk&1y}c fVX~6(7-y^{>A=3-cWZat0E;8yڟ#wéXZpp _CCBpӧxaqB/s^*K%~y3E' jK^\.%]|SAoHHw (it-X`Mdkx#Υ]2\.Nk0B>g[1e%wBpwc\4$jʞ"*ūWZHG/>bl0iʩ 0[D?bN*EH^UHc,s`?\~/,p6l :32FbMṵnAsջ5) H4+]h7z[d9T>,1]VE Ru^vv g0NfjkspHhI9_Q?LD8"׽7-]֩ (pU2C+NxڜF C7<⻝`a!2/JQ_R]rJoƷt P6㶎d3+bme=^L 3tZ}2AOjLe8B| wtX:@Wca0مyk MԩQ6: ik%4R6&d Mw@~7_y4|TQB'wxJB.6 ^ј}h ’p@MFO. u$SlƬ.I2֑aQsualc;)T$/K׶(:r!YZuh;kN{)zm)ūb76{`#z4?-c} ܂{T[o19` XG4 'ϖ~}/ iڀj=Czܦ\zL^uWc d"\8v- b.\8+I6W'5j c^ٶEv7 (Q5[@S!Y%w,00*vRd:lXIo=׻ap6lR=EQ5h[+:G;rAonęcҊ̙O2]K1,N^{%y>|DiR,(k`Ӕ1F/M ~VT^]- C v0jhd^G:[❼л_@cL轒y:oknx /9ǘPQp sR)F>3Uo cU<#]lrk,tFX1#=4Gҝ=9]iTs3sÇb4a0>+4q,t3e"-C5m*>4x 3\斔W:Uɩ[6Kytd‡bU&<5-K:M~&FEJz]Q?a+zk8ђȻp e2p9/I5\ʇ!npPT:VsC2***EBoJebR\;+q*LAS!3 kmrE .^t3 ,L Ô9B(/mڄɩg.o CNtN% k׫SՑ8>{)Hb|IB6H?9~  zUHaB|U1T~X坦PMz넿逬DvP/FRXwmZ3&;7IKM3uN{V[S?~ j@ sy튢J?w9Rt&k5xI?VPlh2NFCN7kC4r #|ԩ:AZV#F"/Xk5_|rp(8troH1r]@U( n0UmI* "ԅ2셇שtݨ'GD}G  i0jdK5l{l2nV^eK4Y>Qw _ : 7l>MhD{\;8}g_IlƇ*nA'U*&F V"}uI8#EC']ԩqeۻndX?/-7SMCٚ#Zˮ^qJEȷE'bt=d!~ ɓsU-)z ox,1JlωF$upcxUmTI+.)TD/֒qU,U_Qr Nᘏp搦ˌX:fIT: ++Z t[s{<-wrf7ñNfd999RttAoHt7(pGO9(5 F܅Gv!mA=kgX J8 Egn=&_UAۃOfg `" '_,5^iЦA{e^Woc}9NYڍY+drA({}t6+{}"cT:hi!ڇ?U^r%z+VhA7?#[Lʖ̐ɩ-kJ([GA3v?=T?DP>a}-Lo5 Ӆn߯#6Л84"׌ \9Dt(}ĝ=S0ܘ)\*wM ,qʳG:G 6TcbT}̗O5474pu3))MqkfJfCY!lt1I4~~\)-Az2STjt_cisU}5gʽGֆFEQ١qFf|.Cr[ q,Fk%  WPkH$g0~r@z=A?I74Ii9]gm%3 D)a}iwlAnvH'm}sȂht-i=L\䫦\+L]AC<`v)^YWH  OWf:"{[@kEGBb۞>@*{en r>Ԃ4=Rq2 pm2d!VZ;|;:bݥ A(rtRuB|Jl/G({ШZU7)b AU&->|O7nY:k>!*k,%>.PQQ#j 7ਚr6!_*za֦%>j M3+]v t-Zp*"C~s^#2Eu*$Q8iK;HH"G!3{7YՓ*Oh2 &8IGʾ緌Smo:Tତ27cq|vP#6in+,oY@ut횗'Az[ H٬~%U݃چn>{cb;<}Y饠b`^7hqwl<ŋӻ?a+wT+\`]c߯Z .JhP%r^B%u zVmZs,>~k(D78 B>1"с++:R-wcZq ]+*<''"6ϕ~ v% ~w7A!] s|ڠ]4[Su##j0WXq] !]U_MV$!Ex#la/r4ל]9ٷVs,uUg3>ɫVE7DŽavP-1ŠUvÔ9ǰ=Y&aae6hJ/uqX< mҶdK|ɺ؎; tMH8/  whqhSJz|n)}ѿsr˸qRNj~?cݪ3 FRdsfLE%;A/ PGBIi}U@]ctMd8,"Xw0Oa$~/ڊW{:9q}rs}kO7o3g$˛ 0Z,m W!tk Ex7?< #}DJMƸL!yv 8FSID6M`N`[01Ti4=23++/SDEQy u׫A?zqe(Y\d\U?`"=K4HCʁ߷t$}ԅ0BO#34gGjV5$~f'V­7ҼzWt 5W|om19==k&F6?[$py~Eǹ GP,i#,Xݡ`{DHӿwGJ8}J \w _ؿad9 .zm(ӭẬ-Òq Ⴚ+FH6Z\tT Bl&'ov)[l|r{"\qG[<-<oisq楛[-OaZG溺69!Ih$I"#Ĭ([nOOƖY!Bp1o8Xt,;:@QD<㒷hx@N{p5:@&y4T1,1J Rp4n;,s `[) ^Kf#Jx\əsF'U:L.IE9MsW6&c$kLi.)OX^Vg&ofVT9*[LDE~Ri vFj!US]Si }WKϿ7Cyjwb:*!?;4|/L1QRc%u@#^ȁ5I7a՗">K̈RZhbD?Ucy#*%k"LHyp>0,¯T?UG zu8!pc}r3#, r]#BO bWegExQTƊ8V Д vņ\/8-Qc#<)6[bɇlx L'Ə4 kOpEmn9,DÆC@U'3T'y vDHl @FWQ:`t^W+,f9%b߹S쀲DĆkRJYr:|sOc)r?ҍnOψSFYn2H/-A ay a¨?wكRZuPJD6K# qNX-خ)qaJRe3Q'S+i&L bHu=phk O~K#)'I)͆/Y tH!ZME֥/|/T<. *=n| DR{u@ 6k,ۍi+5haS|S6] T/jqDf=`z-LN5[>0L+g٫=ŔykHw@b%`]%T[a>ѾZ-w%_Ϧ#q+]?$vΙ\ ǜ5?gΑ> n{93H @g x UMaFϙQwQ:pk]L9/}gOGrt?i-Тݍ%fS'QgJ7,Tڷ7x~l!pY9^`;/?_#|yd(eYdJ,12x."ԑٗ~~0S=Ռm&´f(ZlR ,d(,|\Kxj%#_gpԧhhLD(Ԩؿ9AKBeAvW6V%* %)td񢣮8y:LA x*~p,l1.yԀ{_N2]?*o@weXq{QŎ+G*_޼ʫ?f-g\e]P=ڻ l78{`Z eNJChgZxD>k ա͇|H:F[6֢b|9+Ue p^zw3u?uxTҴ\ S|7{c+xHdeŪySrEE'}|Su$ IҲïvBW8-NOF8tb@u٧pײ'T&r<4IfyVS4bPI EvrӺ\J3awnjhZxSQz<khX.b՛R,  ,;(~QC)ꢞ6vHuj~TA't\WʖFշ6QWUHr*5'E  Mvs6E?Sz!X$zz91,suE{*ٞ n|*ɯ0YQ5-Z=f3sÌE2ilW7̞tC*{0b\x :X 9rϴ!;Q/̶ASRhdV}9pQU2޽B\R*=w`iqQxN)v w%\cmJӭmA_@4X+q=3!UL~)oA*:AMsj@ܐ6 j u&m .>JN 24Y;e6kİǃjQ m髷HATy N>\19+\ہ?CVeyʲH^^tUS~YE7$5CIjN:ۍM'a}&? ؔ@?ޮ)􌡚y5[?Fgk|UKY MnVna*%V$a2.N'HuݯqPNc3=i!g:[.~TB1 7H ;aqᙔx/H۸緀NèK&P̬#i E M]b]9&_KTsnSRڄ>pIRf-o6;8!` q\q"Qg_ԗFQT>e^KHry5wni> >qlT+ulEPp$CǾ"0t|Y `av~>MEi:.Cy[$5 ?EI+v&CI/DeFݍE^3e ף {y6 m@ `DBhKFoX`fi6]F![X/4'" K,lăV-ʼ*_]bd ,^dhC.NbD),E(U_‚E-cC8ך3)!X;N |ZYn_b&ɼ, ջt_O;,N# XVlZRfA:Z/z!y0jX h ۟zDe̖n`]"TݵtȺG&fp|vpFTFYE ;fGgqU8eo1}) c^͸ɭGg$Bm|51#Mz*&zjoH:Qo3/Pdڝ}.-@~bT0UajdaW4n㸦O`b_[e<ILlf;D'e39%-B uQynt H,࿰s023cwQ8LV䔐ruJ"~ rR(g]O>G/]W8(fObzbPV{ @*LhMi3A6upu\amv# 1XE~ψ&peEv \'b~쒔Hfq̢v!y8|#xD3>"0V,}"{0Zc_˾̟X|o') {@Oڨ3my"|uө t>[0) נS(0)V))KTuv.\7aًu3tWTB%Ӷn>;=NDdEW2HSelfDX z=~U=Πz- UVJ~#p+7ZЪ 60cWx8h|X~?Edȡk٥=<*ZsV#FΝU4FR4¯bgRکlFCC0PƊU$DEʞɮueO~$/$jZH3%9O͉8S[X*Ț{i6t= 3D8be޾z\`t7WNOO 55j~D=\gq%]ҭLs8f}A#Ӿ"|U 4 l9DŝdUB͜&P-͈gRhr-H}Hfa6$ihOs 50LR֐ě@o(Kw &KU)/ǃn-B0~>&ʖnF^CbB25p;yFlT,sʉ³P=x$)q^[4غ4"Zz,m*!_) 8%|Ìgw/OzE D3c &nuLءǡ e02#g,T&obwHӈb_\ /Γ_݂*J{rܗDڔM" )LYCwT]v/T3J%LfhlBa({_F3NHM$HO-HzTLB-sKї9grl>XQF{o2ڕ1hq{iy78x%Dz;@p MbRf"c3]`iڽb(t&8JլL̶_Y@bMK`ێGkXo8kCga^6q唰2)2uKS+xqoțlnz!RAh_|wxp~**-=5R ^LP (ȸ>0W12Kye6#~)&j'b%\d euh Fq2~VHsA JA@g;א[&[|+soPuXn ڒ`bBmxVeI!&ݒ;*v$&>U*ٴg7 ǒ2(bH52Ÿ/cяXI*:=dU'YGb i%k|jtqʬ2_?s35\zbHfm"Vki $y<@`NO2n_> /ݻz:F_AlEfjo0S?A.8}Iq xΈj#AbJ`C/G lz\Yt'EҾu䲌SNhE'%LR2ꭒY8z!:BL f[K) C+i۹Sw9K٪fZvm{i7+CcVm?V2kSgfazd)1rTԴ'm#I6e.μi>d[q/z}_n 6pXY| Ao{4O #pUL~YbMK{9fP ~NqQoobꞹopOۓ=1ChU7f&hq6(:M7}Y(Emjgv@K&hz,LlQG0N1@nju`[`a2@!YKT2HI[,g۱gp߾ 󌝬WRfYi& ?A> â$c +J-$X!Hb呻Ԃ]J*֌3]B r/P5{+"$B >5p[OX nRc܋AˊtM}p$cSorHq(aUmCka#Ta/fdDƪIo0'X\m8κ SA8NҦ|nvQKN< w$u6\ kp]?h`v1uU ,֞[w:oNx).î!츤~,Dl1JvR#M,&&QV6x8YB3gN/L^Eά|Um2R^#I+{Xx!x$c-eY+ilhb{xӨS*q$͛j)~&06W7} WfI1h4!{=6ƿp57sRz;C{L U_x~ gF=^ŧDCt!q]Z0{G$JhA.|JC:MA;!tK~OER&6eÊ>$iKon:GWEtMrءxn(,g\ ;KDW2JǀQUa#e!H=M8^2.N";W>-q%b݌ 7`Ô~-Q>7mqPźa%4Kw5*߿j4TQQob >H% Nh|3}aw^bymr${ {]ueCȭHkNׄHJ ~hK@t8Cs-k.N[f+4\ׇ'ՍfC!ΏVI0˝xdM^aom 0^1le cqP^gNML7fE[ӝ>e!XO,=i.SD&КδY|5xHYy s7=6G}mQcDmt Q̜cX+$U8JH&l˸:&k32U['Ϭҍ(+^^݌ Z0fXR0SUxP }J6MΰQ BJ˶>Ǖ% a+̬bE_a4!Low$tO۟ g^ W\7#n_a|d5XziJWR6 ӱIufw {n]MvǸOP\?\4]P"o) Rǯ% )|K^wsmG*nUK L±ԒlRpaPm;B-v©N-#ĕpPog]MQBq^轈NY+6uw_j('m^B†$ݱ$Q5>R~^vbcbsA8/p":ɉ?iY^`u?zbmP(,w}Z&BW~ڮ%S3 l?,b Az z(Rs@wx~YP}^W1;Ǔ>ta*D-6wsSWc6.WSeldRnHEL 7SR6O}`G=G,ՅhD"H#q>']'jUex@Qx \Gz퐲@p=0h)f !/ ge>v_'Y}^ FcwY5S6>| z'Cbg mehdqSYQaLf"yJq-?L+ւe"ߎ!D"PCOŬ~z*U_&IDEW,28:YM-b+d˴&^G0K}`,C@>l}CU4t)jq% Ϻ/ ?hHxU7>PS#ZoTWLt`yNp|)h^zF%l]PbB%0T71`T7L"?U"~hZWY2/ a8+|4lw$̶16}o`^FWuK+rI-Mux6GFj!RJ.Jُy`f=|B  R!T6 a oڢ:P3$b4v(#NzY5o Uļ ,Xo&>Qpg%B}Jۊ3 t:>riz~srwiTH6PfA!4l,*{V#\;TC^ZZ-.y_L԰Ddg ΢d(~)6͎+z9VrB' -ou#O *xF F 5+n?[n?dڥm}WLt/Zi>ͅ9MQ||UBn6( (/hGfi1&ۺ^NX8yfwj?~=M!ҢS2,0(^ . zǯ`VsGq,3hZy}8jgԱ}i`G0ik Fp9>tQ|WU8F XP# ,zGu b UR 8؎#,~u)kkHpl9AkݬijR^gߋCG+-x-|q9 M45iY4iKcHV}S^Pjv1/? w}sh'?|Y-p1*Y,کK_MFI4i|P6d' _^s*J6\ SVif_2Ceo^O7[ hkANġ$4 L,ւ`6,ߟ.W __ m(3g Pl{wX(Tyf(kpEݶu]}؎\bN3V=@RXUc(Ҳj?5Oon/5nKM"T]$+R{5}'*@K, iialEu6Fio,ј[6ERP0)8CIkT|=ejjiw1 UюS9~ԀklX.ҡ.]_M!T^R9vץJ|io gKBEV`Բ}(sǛC݊-IVI;VàcϑƼ.bWj l>RL`$i4C͙P]Q#Yݧ9'7+VIpN9bNb]i ?isqTsކk pfo=4:w$2pgGAѭfGupgJ =^L[vۖrq!! Մtܢݩ+܆g x':UONа/h?d!2Vj߭.rbS7Sh j.g6^QV.ԧ3JINo$r\"y Q*-FnB5xK;Nh Z}ʯ0 X"U2>iaj cYN`8hwp>,0Ky'&w1$@Y RW( n_1I7 Xf[8g-VpDValw[ E^z9N "JqrĎ_8ٗg_Uqů0R\Mn*BK\iOjO z< &I, hF?)|w-V[tfw 3A6Ի_aBw 7Wy~3y=P[#Thf:MsA!tLG])& cوFo$qUpWE^˸h8yAhG`lK%$]ᤜ$~_gr7s3&snY.%=+#.bо"XdB!Ǣ"_-n4+Kbh x&+$lϓ]L&ulצn2uW[XjA uG3N0REP9w("Kn^.U JtoFѝK( Gߵz=_@D5ՀT?gt,[L?QHV7,܄--gYnJ2NnfԷFn`~J@M-K [ڭO-{vZ=:%O GNwTэP;qٍD.q&hVP̓8.r3lO2˚9ARU-L2e53yQkRa+SaeHhrw.(AwJsOk&#hEPPw`,LZp,ۓZ4D ~Uԛa[kf ɓ!UaG^XPk" Y=뼍Sm|IۥqCj51FtWLW}IM_LǜAZ }Y`8juKwr5qQ/t` k-VPcFU0 wOʞtҪSİڸQ# U$?gÞ*ɇG 55צә-˘'FCMqǵV.eB c&G-|I7b+p\Q#Q,Bx&2p K{$ɠxo5\S -5 :AL='6t_P@9hY o`C{ ~!ފ9"8c\L^HFP_m |7'DS*NV+V3^[Q\f#^/~,?\>&zcgKtmAyc:*ݨTWEqv?r| v R3K/N3 1§ *耰{\2bχ5 ^C!`9=WTsk0.~yB"-d3و̐$h0, դdZ@:mԣ?Y:ġ)zOhc,/=!:Σ2Y^Ҵn\lc/N5CV[Oz-_r7i= v Ҕ&*M;%& Kwxk&|$gvі|H;U R.X3 >,%TŔ0~%ԩݔRVw y\%(UYwWk\ʗ)S19w.ƏDT,Ǫ2aGWAA+n6)seD Xr T I_mՖwI}׸c b>GՔ¦6_l~SVb\ 8fN9;[`vup9 p/Cg:֊(M*k-D77lPȑ W Dlm}5;$~*Wg]!rQ@Dic'83z^2[B\lfc5o ɑV|\K+&0!E7JiJr:AףgB4:=8JWɼ{͢^ٓOFܝr`<,Pu?̒˗9n ! cN쳍hض`\~/dIV[dEQ /H3Yz5e͞2#"i'D1 Dp56q4f &jNPh KqNs\]~i]I09(&Ԣ1`GkvD~-[} vcG9rW`fx Qc߭ͽc@E8n:%쀆P ؃DAYȅ;wLh κp BQ%)MegwF_H#c\q<jo0ܑ;]AN;p8kBu;1r](kͯOi2 ^YSh?|r*AJM{Ajd64֘`!5K&< 7=!X؛'q3ibr~:g:ۛ o@;$4hz{`{~aT|j,+pگUbuKYۨ/JiT3=Ѣ&!u*Tr3'w[4 VA}XFLaAB+ MFf34MaPg+JWb@p9yZjK^'k[w~Bo^$_L+3n$`O@d/L/m}MPkDCK.wgM,cfMra5?` - [e3c_X8D}|Z2ѵ?U`"OT-7¯D#,!E&#jVueJ3h H[|T ag;]a)fu{*Pgҷ̮S8{nyFDH|PDASkFFbʊBFJ՘,\$,J٬ڤ;=FjVIVOTj|Fr[ Qu+z^(鸃&>9>݆k!j \>!ڨBsK Vu}bg NΝ)ϝGVvm .Y+p(Rn .D/(9@RJ a~g*9uD dF jH7qm'*dHu7D!xlTlK- J͢}@iwh[R$kx~%Wzw'e .Q-Nנ _3=KKPq#'?$(t돿}̽$g&'vXvMO-."3Iչ5!ѧYۥʴ>0Ӌ*ǗbYF$;Ԃ'iR4)lw7;hHLL@Y9΃ ~T[};8d6aJ'[,7׮?|LC \_+7'0A_ (i^0TJ lLYBkB-Bw"d?D L02\#I O"z t۰ݪu;E1G ʭacV^5G㜷~ 9\FdWQ?pcIlV H) ݉J'[]~mNG+9'rյv9/7k!0AAޟD_ӭ}ulY|4G>P0ySi\:D ]-xo΢t̀:Cš^cHܼ86; U׀E…~NOH] G %c%'CjROTԜVнMƩ|U^%ZYfÚk{rzS)y2]lĚrU 5&9MƈѹnJHX[?RU.I&ʛ]0NJ5}ڇ /Ak(w|pD0嫜t޶DA427nb=بjo^9\a%AMQw9׼i*a qjAS{*zTNo@>…؋؏&O=VΊP0u:8~AD9( *>*搓9XGM@}nSi9yH1)dSnvmo8lՁe?K'~tɕ%1h3=Y&`S+W8D(kxr%E|(?F?ŚR&N3\I|0(8onOu`ZS">T%uK]ZJ>OEY\~MQ3' }4u}..*19{A*Q0-4GwϲXݒpAzyÑbԋTP?W#]aHgU5ܫ]D샎\g&8+/3ƣ_L ;;^%cb@0OKqU-TQPJ%e14IfV[ ,b[(gD5@hQd% \ԍd5x4w$9G֐v2/u*H;sƉ>)Mr`stZk$ys'3jSdD"U@`^JM z>%8űz|C˒pze ,y:/Xd޹@wK)ZKY7NQ0\h/ym]3ދ67k&l:rbx4)/rL4M{-[$ctgp?=JHOV|,M5L%m-nx!l"m|T|7r4oW֞ktOqX]ߠ'Ov #Y>185՘-kbt G {-$u_[u'&hN\9z(i (Hҧy|qz?MxsPi+F'Sj(2z+KH&S+9d"ʛ꾠zORCX9Q$OZ-Q(kt@oe1s sEx/@Ю'<%w1(R(MxR 41HY5?M Dfz p## qyyߋW{r10^VN X'ol.c,v*hݼOq`0Fy=9ql%# sōQ N)FP#bЧjj._0좩g'#>zcX5Ydt6NV̶!$sSABRFON9,;Pk9dZ3Ydvm+zE k#JvE 7G ֬FWSZt#Z_1"}n +OPΕ~ܼhǚz"Tȷf'~;i:TSx!=B 8Z ; 6ѯk!(年J"i$%$PڤDWW4}= ʶC! 'g)UZ3p lE&RahGco -=KɓsD`I$Zo&h{ZYq= 16-ٿJP9(Z> N,L/PAЯ}]Tc !ih<:jX1:DMw`s!GQ-Jف4ȐĝoY\X5,CƿS]ttNANo+qP^8#W@g<2mo 4ɡy ^^UW##mH7PPlG<ŀG HH:YK4t"|ZkA<^>yf?;t9ϫnT5y連@C>DϠ;?B&Y%&e й cv#lxUf F0l$ڊV:,l}z`zLvvW:Rdۭ oHU֪2Tׅm` %~2ٞ~Z#-M׾'w9déqAŘ~Oq9޽'p*׶T}_!R^6SV G+; \*Vh*J^=Mk ůټ: @C9N$(גAzq7?sJ},dISR R3y kUp6%ԫKK=Q)Gf2 < 8Z<_7ch;("}\F3FqV<A݃D'ק!; -/8@&?.|oFEF^%.%j,>Pg VP]9߄%<> &o2s5 ZSq@Ԝ6$rԆ8"BCO§Ep)֨X:4Z qZ[YB<&bKRmWK}s~B: *`P !SSsѠBUa5[NOqj-p"&35 =A J:(-5xފ_.I+9p=Jb [JQA9{DtP:(=*>D/@iQj y]qdߪYfX!avJ~ZYZ6bk#sb}ETEEYToͲ\!3nAJkA`buM*8Z*ԭpLsdtl~G,euҦr3 f'OYz9 `oZ2rJщjXm]@}l`Gg0(KȎ5l 4SfG/=% >=tq,%1!/XHiF"Cn \&T{A:z]g@.wtn,w qy?$bKntAH|(MT>rx(L>1I rU}~n0.3?{Ud/irG% 0 #،Z)iJ%*MvÝ_.zͬ -i]/w\g$$FŠϗ;F~(o )k?4"w)dRTgj*†\ CȸNSV1 s1eLv*xPj*V;LD,^ѼЧѣa ̅gn:G9a0k#ْpoO64&k<OG:{4h^ FkLԛ<zٺ(klW}T`H?O-VZ?{vS2[,rqE*& CM7Ï$#"u~G.c9s4Tmdn%őߟ#ˣQo}K)P6|n2~c$;TLiUsc3[AJ:/FDʾ={|2 pB!IoW;yݝH:ؕ!…ߗ N]%GTEWi36?H .TY|Qײ]=j-åUU04P^2-g7A{Z5T[vl}?'&K%?FNL_ąx33* B9@강ɽa4Vq`Pumo6U2f*k(s,QQ7zxiWc0)l>q%)3a{rg{qM}{ 3`6ٵ8V;(Jr.Ka:7/՝N)LSV/ Rq!YfsȀ?P%gL!=TwEK85 NG.t(M/4mP_6ޒFQT(6q Lo$ThR=dLj` wV!'؄RGD -kjALSf~ad8 `LC+ lrF%a*(ܬp_qL7`c) a}Ź˺D5za^(͗Nzָ2_~"XxӞ]Oi7A"yvEń<ʙ_YFC)8jTL9ڻIDŽDtrS&Ovg<S #Ј+Pozeκ>a$mxnnbEԓ3.v¢[L>Hrk8i(.rxDUe뿫Dž«NۇCj‡QP)4ner72 8ЯVS)`+Z2QXdSfg⏱. ߻MEm:dmbGHZqj$}/GjmaVU{%>4(5}ߖ)|P2X<dNo yP/~9NuE3.3+1Mb_# cbӬkLȓ~F^ ׳ so }}OP;OnT84eǒۆv4R")_ &3 Q/>8?f 0DkB_xa(gՐ[iHJXU&ӂdҡ-@z<#^Yi&dfoVV#eC;=4pHt@*: bdooIY1"„LȢmcpzWgwFÏxO(~ gF%ΈVUsct5[fz8EơI~HyuqF)yȴձJ`:lU?>+geN Yq=k ˀdb'"̻ޟgѱ)7]V]7p^,Zsʹ3((fo(&K,Hӡ>Wf>I>Ce!$X('bՓHSv4d:pu"k;@kPŷGsB} Sզ{/ܟӋ7o)M4 9}+4*I \#F0Ui̼  4ũ= B7GDA\6o?@ *Sh<*k:@[qW BaF2]Z|^5\~ S_I*6]QFzD73,a܊41@u䈇l Cѕ<}+)S'$-I7I/ jkб(NW'uCAeo#Fw3ͩFƧ r2I'IN9u1\&4&w<#ܩdT9v!*CW(9˄! z ϱc /Ǯb }?67LDa4wJhMd$hͼEB70\BiO,X#B$L=׻ۼ:6 K`Xtʦ,{#>g)Р`0)-8(|x{r*xfQgނ4"iT<=]*Yٳ}6W1M >Vh8gW)ܪػޝZ*|RtLM֏9ƱaFܕN|,[*pl>(jW(LTK0tAsQ!hiw${]Wi&:oǥ.t vfؿ̏ 2 N)8e1åouu'Y ]9|1E(ԗMlbt\OO:ҩIqxwIc1rg2Dd^ ,WtbRZʩ*hNcw+:h;{y8/@6IS6f7QƔ$;CCJ ž-,Ѐ3ϲn!d) >PḲ1܂oXN_MoD J).GV3s„ƪs,Əϣmd_MhҩGLۺNYH%ӲNl<l~> 'cNɶ Z{Uu]1w'j1qnyBv4N4 K΋|1MTlln"I &3\,H( ؔ1{KڐffHdeOkVu߂{J8=$wsLu?C(}FtesR+Z&['u}D'bfm{fw+lDxYCgL6#Z/Hh}9PDkN}7a(ەHv8a 鐀f+E?E9B"OH$\&K[, i?dz2e^M%QWC ]a֨u< Np@|&})p'eħyI}lW 6.LvڨNٟҸPML ou""zhhI}ӰV, 0 Z=kwF8wlR  )CJlm9Z1%d=Y?Xl%On3 =#hc}H ,(+vkʹZD} ?2uƐ>8_: \Kuu)AsxRPW" };`G6o"iM %gе m n9+1E+ ? &|f| uJp m7n B DD۠L\et$ۼ!h!uuPFt{7{k48[4ɼ. PPͧ_5[WjLu(g*-9)6 Ji(}Ԑyف%&[iO"`*(\Zٲx'v1}^* q*R_!N cWAj "W"*9gMk:f2Wt#as :`>=X{:46ssjzB t*;ѡ #3EhZ%O W}(PB$A {0a쓥AR]QqCb52@ws#Su%lusC8J#Lw;ǐ=nj?.Y; (D9n~`U(z>M(J{ p3:ZX4.,*8W;22u#m<VuW2>HAz /E[d4B>O rRnvm^%QMF\x,`f1+UV< L9=W㐐dZFDu器!rPaaاF(K~+B)aM߃ߘH#|~|/V6<@-?j=]BfJKwo҅3~7RwjU mY%M<'qWoIM " Zݏs0CX$"״J(.Kod!eq[%\zښ΃(bdjG閈 k=G ."cռr.tU ؍ʊ?'MálU7"NVd`Ic< w 1=2\G8+D`jd0bpy v Q>1s~-891慏ŻAiq'^-oQWk/F9)6H:Y)Y"Z7%g0φ"Iґ{lO@g ׄK.|BW>J<:4աtlr8M?bU$R*.s劼Q"ӷiYlŋtKBBqPlE0ActuU려eqH@ G(14*oY罒 r]O_r#64$`h *B؊)!#.(gky Z>`+.=(A5MA0®7ߤ9jB@In+;{eQ)Q0|`LFIhع ڎgfo-}dn-3ȊLM%WzLC[ʤWأZ2{17]b{orIyC,V>Nw(I/ JTɷbPΞDKy-ZIܑ F59yͶU BetUW**9WR!Ce( _dtoKϐwWCCmF#[ADrŧ1mUR*)2^`(pϠCz7n&a>mhsONz[: ^֐ubLZ5m`\' S,lT,WUpmh/*Y޵y%½iEgQ+̓Mu xv.[D8b֥,w64o[}Hk12&d>El|Rfۨ_~ OtQ,{0^]oqZhQiȉpZYKΨ  j߁Hⱶ('Qpr `Ur |ȴ+ 7 ܯ K`:I%16_kֻyoyfNi|3Z"V`-K^?; n;>QWcf@Oop#B1nF+%R>.F ?lVIPgd:a ;h}ŲG1 XD|eֶاtC!U/ⵛcv"{1C@U䳌`͎'v4#,);yP.;RlysF;CS;$z*oʇ [ 5Gl}Z*>xLStoX0i@J;Z: 2EH{E:Ұw*}%܍p/C)";zlK\?`Q.:V<Ē#$OAdw/ 1lmS{6I:-M|1CxU{;8tFX WgcN(?ijXa @L@hd^Dni6ڬ7Gٕ`84b=&B[F\r 7SMacV\GCy< #,;"))5I0ð[9D=RH''f),cl/rHqT29UaD5OKuf˦6M5rq֡:u fv֋df: jJ,Vˌ,WJ@jE 6n}>io0gH^(rULJ120ѬkbdqRrЀlD ?<{Ѐo_g(qfK70A!sB8)y.^,cz"[Ӄ_5[_PPH%NXDӤ];[ lx':JƜ`$OmL^U@%Cd[=^E;A PI27=cm-t>쀈:򴿾( Լ1VԴ"mmE#cI.Z0dbGj)2FaZ'cV>CE6~HF+>O*^L\2%A=RryU$LYl&u}sfOm]~2ncU(A'%yxH4oOnw 5G7T-!1E h}ޟ7Y]VcB9$U#] 9\\RJ\om>gT:oxG>M +gzG.u5/r/@ ,GcAA<SkP_D1ڬyΧڊ`*M*TPZ`53q ,>> ?w)t3"+X<:c?Jz;,+M!"HA2-*WdG<>U ^!ez۶"5Rb)noˑtA\g7>"nۣE@ EK4:C.P uisc0@_w:̷%R'm+}H3gmLH5m>H䠬(Ml3˳O$PԛT\) *8.y c{qfv#0>|'!8zRqՉ"Li3=!x٧?s0ߛ46'N@b/kR*ϷL@vP64F̿BBns:33=]lw{ϑmoa]M4imXZQ_&xI|Lg1!arqorkeʘJb) cf ^ |^$R4 bt+yJO1x'/"Pv"+V×DL߫. \ ZJl93(R7M%q.U+w@(!hJ͜cI!8UMQ_ I.rʽªa_XGUhS >vưK&K.D67ߌs*xdu`JJ\$qh;C#p5Hy곽 x,J8 pU :&}z.|04l%D+a{z뎴se#d3{yZ;8 ׺CPC`TX3TCD%$MFM&ͺv8eBiDG޿nh›33p+ ™Q9γy oJA:\:uM M# H;ԺiS/6ߤbس&cg6x! ;Ybzr1`c/y*w^("i8X4:D8 x,ܤږfiuL9|͖Gb/n2:ԝP^ :GMk|u$%(釲4 Ks<٩J4u.S%[ -QK+XD3Tw.dJKKQn(|qm֜trm7}WVX['Q>^? =ef!7hwIw:k۫@7$3ջu߫.P0S}}s9aO$i) tfł>\g]RY4C3Znw:C8n >]bF wWT ؎0-[!$[z :"a ˈb[M3wNQEg%-.S7?H9U*rns|-$nF>$|9Ԧ?_L4.(YÐDT/ s5t[IFߝ*Cワ5M^qY 8B>HfbgcsmVOLNsl8q= " kĕ[4shь\^Jt GmO7m%𠔪Fi\Qgw,1R)cmQG @ #9 jBY+U 2~Dֈs1+R.R/cⓕ9sO.mfgVRX@-yPEdʊwI)y KB+/X3B5v9޶p#g7W*o{:&'{ mdՁ6рTqgC)7=Bԣ+\֘"dAJH-#^qtڌLêp 0lR1SSiyJ^뼜I+JH~3 4U8EΖŔgfݵ>n^@kmqo3K&J\ۜkX 4IO<{OI9݇\959r3?ޮ )sN>7=U|Ԇ Mo;? '|A*ym0RB!NTEBFPGS]-Z8XT|6%Q+SE[ 9xs(`o|[KCyePgU'(8V\ 鰹|ݠmqe+6#AK}tlhfL{90Pc 1HwRk L ^Y/ԟ@nTPG7G$QZQFm#쑓pa..7C O+ :I&11 şpҏ+e^_ 2x썮T;!JS**rC NW' J`Xr6R勓nP?BE#V])uǩml1FQ(- 7T\Hӂrj`ZنfdBH5TZSUD^cYug43 󮩭%#P#F$Ǿn,kU"G5!xprX} uG# X/PyRobEDF~#Қ*  ӉO9F@JO_r[ "" n^^O8$wHɠf9&}RږCB׌C:OHy(B7wMroaWAV$8B*l*0눯/Z:%i/Q߲"MEZ&/7xk-v-9ߋ]}F֜ʛp''҅9Lnvz&\gOR. M4 =U"xH>LɺJR0Y#5+Xa/ƫg̽'ɮ*iQ*~}KkSW6ԯ}b^\UߤNढ़U/>^<jHzW' rJv^5CYKB%f_λ厽\ओr7"\D\Ykd ;a(6O~a:.L}G;L^pBѐAB߉ؘm2cˊaZr=K-oU2Ƙk1Yz#]'9XAhڼ'Pe,Y+9cEn+"g &q.?R'\ysNI `?ByFpZ)öPs%rU)\l3:eD?JAYMATE>{~[{MGe۸h9]PpѲ K:rUFaW&~CܨkEMka>p|FT4 >Zlj|kУdO*NINnp/Gf(aHR`yW_샋xhXv!Ojx>eżDA)!M^(ua*OlRB.PO'k6ms۸~V0敭6 |/-ٻ0ֵ'db2*p5)! |l"\Ei5K|Wݚ"@LByaFWvfn:0!Sw,꜇OuE 1&CdʅRkȂj d@bAbe˾Aݗsgf=u&1`M9~tE-_Ǡ;O=$9(lPAʛ/Nty)rE0a}0~ѰttS溵E2xثjF@D2\+@r e۵߲SD[C ڜS(mkkw U`ZAo9%a5W8 vo9Q VM1B&lPu(ovn/xW˲G}ir+YqEkIn*S6Cuh幒9x0MVNF\eGSQ7-eAgjnKKznZF<,w/Pr΃?hVϢZ}jv|‘G|=p&g[u*̮3?9mpj_ ]RHoJtV $A]ZBq[|j7TcIqˆ n%< qBdF@1Y;8+5+CnZ&r|6G>2C(cDv:ERߞ'sP)g1>05 W_Ј7s ;W]Yv4r5b+L{6=Ă:z"yS]˻{3dhń@bfkǶ"՟\~t݃xO]z4U- GXxJM:|JZqco|e-QgjBq#7AeŸ^5:EC'r#Y~AؾMzȇ/i%'=ظ?`Oծ~sW{t7S>VBFEZa]I;'&|?4eG?z_kY iI,6ԣNexSAQ@"ψSP6ĕ!yM3RWDRwOf4;͵&W[D ǫ=(Pޗ=*.6޴(c˹d<ǰMX4N5r+ Tȹ? kJ,2Fee+oi׉0dl<_3gQDH|]^d]n7>pf*/L#YւMjil Ɩo%K!x8`z[JUX x]싞r0*a,*=>gʜ]Oqו8q>{m&6*̂jK$6h} ʆ8˰b1~Vi|XCo'>weyIp/Z6"az6d%[Ӎ%\ zH 9rE?Q,4)^O8E{GߴM3(AvWBOaOQx8Ԩl&$pNJN֜{79ꞅRb= tVaᴿ!Sֵ #/O8AA!vu;GX0~ hu)PPtcCxy`(B!|}]fɖ~)>k|˚gz<q>o ) G{[!5\kט*;uc3K<ڲ2&XY&=Ow jjMDSTs.?Vp~hZM_-bF1We4.0u^~E+JMv?3'`4ZU(x>{V֋v3_~:xAiɥl▒jýWq\r\\O $8X}yfNg>b\48+8GGx -ֆbp]Y/V;ם7ell@N?Ǘ&d` 񗮨s^&KnF &k (hmثfje'#dápk!lK v ́K0cERKܦam: t3yi|Tk\W 80tIJG,wȟnN Q+b#RA◧Lt`}EW% ]2zvpʥÐCH4]|(f籎4DT'7G\xdcW $Üc ;ً(ì`PʹHBԢO!tܚ瑸b it]d%m2RZ 7w*MƐ32wUkiTOԥ1(?X0kz :\sHhwkM5C&Dx.ߊU(o0mf=b/\UdO'cL%y8-AiK׿Fwk7w/R*PtF`r\Dcf G,&L$ƫX ,FNYm"j~4]L?3z-Q>}ЩSҸ.&!-) =8