aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/acp/acp_permissions.php
blob: e7dc03db5c05c4ee1a62d6f1cd36a8e708af4a62 (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
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
<?php
/**
*
* @package acp
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

/**
* @package acp
*/
class acp_permissions
{
	var $u_action;
	var $permission_dropdown;
	protected $permissions;

	function main($id, $mode)
	{
		global $db, $user, $auth, $template, $cache, $phpbb_container;
		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;

		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
		include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);

		$this->permissions = $phpbb_container->get('acl.permissions');

		$auth_admin = new auth_admin();

		$user->add_lang('acp/permissions');
		add_permission_language();

		$this->tpl_name = 'acp_permissions';

		// Trace has other vars
		if ($mode == 'trace')
		{
			$user_id = request_var('u', 0);
			$forum_id = request_var('f', 0);
			$permission = request_var('auth', '');

			$this->tpl_name = 'permission_trace';

			if ($user_id && isset($auth_admin->acl_options['id'][$permission]) && $auth->acl_get('a_viewauth'))
			{
				$this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $this->permissions->get_permission_lang($permission));
				$this->permission_trace($user_id, $forum_id, $permission);
				return;
			}
			trigger_error('NO_MODE', E_USER_ERROR);
		}

		// Copy forum permissions
		if ($mode == 'setting_forum_copy')
		{
			$this->tpl_name = 'permission_forum_copy';

			if ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
			{
				$this->page_title = 'ACP_FORUM_PERMISSIONS_COPY';
				$this->copy_forum_permissions();
				return;
			}

			trigger_error('NO_MODE', E_USER_ERROR);
		}

		// Set some vars
		$action = request_var('action', array('' => 0));
		$action = key($action);
		$action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;

		$all_forums = request_var('all_forums', 0);
		$subforum_id = request_var('subforum_id', 0);
		$forum_id = request_var('forum_id', array(0));

		$username = request_var('username', array(''), true);
		$usernames = request_var('usernames', '', true);
		$user_id = request_var('user_id', array(0));

		$group_id = request_var('group_id', array(0));
		$select_all_groups = request_var('select_all_groups', 0);

		$form_name = 'acp_permissions';
		add_form_key($form_name);

		// If select all groups is set, we pre-build the group id array (this option is used for other screens to link to the permission settings screen)
		if ($select_all_groups)
		{
			// Add default groups to selection
			$sql_and = (!$config['coppa_enable']) ? " AND group_name <> 'REGISTERED_COPPA'" : '';

			$sql = 'SELECT group_id
				FROM ' . GROUPS_TABLE . '
				WHERE group_type = ' . GROUP_SPECIAL . "
				$sql_and";
			$result = $db->sql_query($sql);

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

		// Map usernames to ids and vice versa
		if ($usernames)
		{
			$username = explode("\n", $usernames);
		}
		unset($usernames);

		if (sizeof($username) && !sizeof($user_id))
		{
			user_get_id_name($user_id, $username);

			if (!sizeof($user_id))
			{
				trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
			}
		}
		unset($username);

		// Build forum ids (of all forums are checked or subforum listing used)
		if ($all_forums)
		{
			$sql = 'SELECT forum_id
				FROM ' . FORUMS_TABLE . '
				ORDER BY left_id';
			$result = $db->sql_query($sql);

			$forum_id = array();
			while ($row = $db->sql_fetchrow($result))
			{
				$forum_id[] = (int) $row['forum_id'];
			}
			$db->sql_freeresult($result);
		}
		else if ($subforum_id)
		{
			$forum_id = array();
			foreach (get_forum_branch($subforum_id, 'children') as $row)
			{
				$forum_id[] = (int) $row['forum_id'];
			}
		}

		// Define some common variables for every mode
		$error = array();

		$permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';

		// Showing introductionary page?
		if ($mode == 'intro')
		{
			$this->page_title = 'ACP_PERMISSIONS';

			$template->assign_vars(array(
				'S_INTRO'		=> true)
			);

			return;
		}

		switch ($mode)
		{
			case 'setting_user_global':
			case 'setting_group_global':
				$this->permission_dropdown = array('u_', 'm_', 'a_');
				$permission_victim = ($mode == 'setting_user_global') ? array('user') : array('group');
				$this->page_title = ($mode == 'setting_user_global') ? 'ACP_USERS_PERMISSIONS' : 'ACP_GROUPS_PERMISSIONS';
			break;

			case 'setting_user_local':
			case 'setting_group_local':
				$this->permission_dropdown = array('f_', 'm_');
				$permission_victim = ($mode == 'setting_user_local') ? array('user', 'forums') : array('group', 'forums');
				$this->page_title = ($mode == 'setting_user_local') ? 'ACP_USERS_FORUM_PERMISSIONS' : 'ACP_GROUPS_FORUM_PERMISSIONS';
			break;

			case 'setting_admin_global':
			case 'setting_mod_global':
				$this->permission_dropdown = (strpos($mode, '_admin_') !== false) ? array('a_') : array('m_');
				$permission_victim = array('usergroup');
				$this->page_title = ($mode == 'setting_admin_global') ? 'ACP_ADMINISTRATORS' : 'ACP_GLOBAL_MODERATORS';
			break;

			case 'setting_mod_local':
			case 'setting_forum_local':
				$this->permission_dropdown = ($mode == 'setting_mod_local') ? array('m_') : array('f_');
				$permission_victim = array('forums', 'usergroup');
				$this->page_title = ($mode == 'setting_mod_local') ? 'ACP_FORUM_MODERATORS' : 'ACP_FORUM_PERMISSIONS';
			break;

			case 'view_admin_global':
			case 'view_user_global':
			case 'view_mod_global':
				$this->permission_dropdown = ($mode == 'view_admin_global') ? array('a_') : (($mode == 'view_user_global') ? array('u_') : array('m_'));
				$permission_victim = array('usergroup_view');
				$this->page_title = ($mode == 'view_admin_global') ? 'ACP_VIEW_ADMIN_PERMISSIONS' : (($mode == 'view_user_global') ? 'ACP_VIEW_USER_PERMISSIONS' : 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS');
			break;

			case 'view_mod_local':
			case 'view_forum_local':
				$this->permission_dropdown = ($mode == 'view_mod_local') ? array('m_') : array('f_');
				$permission_victim = array('forums', 'usergroup_view');
				$this->page_title = ($mode == 'view_mod_local') ? 'ACP_VIEW_FORUM_MOD_PERMISSIONS' : 'ACP_VIEW_FORUM_PERMISSIONS';
			break;

			default:
				trigger_error('NO_MODE', E_USER_ERROR);
			break;
		}

		$template->assign_vars(array(
			'L_TITLE'		=> $user->lang[$this->page_title],
			'L_EXPLAIN'		=> $user->lang[$this->page_title . '_EXPLAIN'])
		);

		// Get permission type
		$permission_type = request_var('type', $this->permission_dropdown[0]);

		if (!in_array($permission_type, $this->permission_dropdown))
		{
			trigger_error($user->lang['WRONG_PERMISSION_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		// Handle actions
		if (strpos($mode, 'setting_') === 0 && $action)
		{
			switch ($action)
			{
				case 'delete':
					if (confirm_box(true))
					{
						// All users/groups selected?
						$all_users = (isset($_POST['all_users'])) ? true : false;
						$all_groups = (isset($_POST['all_groups'])) ? true : false;

						if ($all_users || $all_groups)
						{
							$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);

							if ($all_users && sizeof($items['user_ids']))
							{
								$user_id = $items['user_ids'];
							}
							else if ($all_groups && sizeof($items['group_ids']))
							{
								$group_id = $items['group_ids'];
							}
						}

						if (sizeof($user_id) || sizeof($group_id))
						{
							$this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
						}
						else
						{
							trigger_error($user->lang['NO_USER_GROUP_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
						}
					}
					else
					{
						if (isset($_POST['cancel']))
						{
							$u_redirect = $this->u_action . '&amp;type=' . $permission_type;
							foreach ($forum_id as $fid)
							{
								$u_redirect .= '&amp;forum_id[]=' . $fid;
							}
							redirect($u_redirect);
						}

						$s_hidden_fields = array(
							'i'				=> $id,
							'mode'			=> $mode,
							'action'		=> array($action => 1),
							'user_id'		=> $user_id,
							'group_id'		=> $group_id,
							'forum_id'		=> $forum_id,
							'type'			=> $permission_type,
						);
						if (isset($_POST['all_users']))
						{
							$s_hidden_fields['all_users'] = 1;
						}
						if (isset($_POST['all_groups']))
						{
							$s_hidden_fields['all_groups'] = 1;
						}
						confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
					}
				break;

				case 'apply_permissions':
					if (!isset($_POST['setting']))
					{
						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
					}
					if (!check_form_key($form_name))
					{
						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
					}

					$this->set_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
				break;

				case 'apply_all_permissions':
					if (!isset($_POST['setting']))
					{
						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
					}
					if (!check_form_key($form_name))
					{
						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
					}

					$this->set_all_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
				break;
			}
		}


		// Setting permissions screen
		$s_hidden_fields = build_hidden_fields(array(
			'user_id'		=> $user_id,
			'group_id'		=> $group_id,
			'forum_id'		=> $forum_id,
			'type'			=> $permission_type)
		);

		// Go through the screens/options needed and present them in correct order
		foreach ($permission_victim as $victim)
		{
			switch ($victim)
			{
				case 'forum_dropdown':

					if (sizeof($forum_id))
					{
						$this->check_existence('forum', $forum_id);
						continue 2;
					}

					$template->assign_vars(array(
						'S_SELECT_FORUM'		=> true,
						'S_FORUM_OPTIONS'		=> make_forum_select(false, false, true, false, false))
					);

				break;

				case 'forums':

					if (sizeof($forum_id))
					{
						$this->check_existence('forum', $forum_id);
						continue 2;
					}

					$forum_list = make_forum_select(false, false, true, false, false, false, true);

					// Build forum options
					$s_forum_options = '';
					foreach ($forum_list as $f_id => $f_row)
					{
						$s_forum_options .= '<option value="' . $f_id . '"' . (($f_row['selected']) ? ' selected="selected"' : '') . (($f_row['disabled']) ? ' disabled="disabled" class="disabled-option"' : '') . '>' . $f_row['padding'] . $f_row['forum_name'] . '</option>';
					}

					// Build subforum options
					$s_subforum_options = $this->build_subforum_options($forum_list);

					$template->assign_vars(array(
						'S_SELECT_FORUM'		=> true,
						'S_FORUM_OPTIONS'		=> $s_forum_options,
						'S_SUBFORUM_OPTIONS'	=> $s_subforum_options,
						'S_FORUM_ALL'			=> true,
						'S_FORUM_MULTIPLE'		=> true)
					);

				break;

				case 'user':

					if (sizeof($user_id))
					{
						$this->check_existence('user', $user_id);
						continue 2;
					}

					$template->assign_vars(array(
						'S_SELECT_USER'			=> true,
						'U_FIND_USERNAME'		=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=select_victim&amp;field=username&amp;select_single=true'),
					));

				break;

				case 'group':

					if (sizeof($group_id))
					{
						$this->check_existence('group', $group_id);
						continue 2;
					}

					$template->assign_vars(array(
						'S_SELECT_GROUP'		=> true,
						'S_GROUP_OPTIONS'		=> group_select_options(false, false, false), // Show all groups
					));

				break;

				case 'usergroup':
				case 'usergroup_view':

					$all_users = (isset($_POST['all_users'])) ? true : false;
					$all_groups = (isset($_POST['all_groups'])) ? true : false;

					if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups))
					{
						if (sizeof($user_id))
						{
							$this->check_existence('user', $user_id);
						}

						if (sizeof($group_id))
						{
							$this->check_existence('group', $group_id);
						}

						continue 2;
					}

					// Now we check the users... because the "all"-selection is different here (all defined users/groups)
					$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);

					if ($all_users && sizeof($items['user_ids']))
					{
						$user_id = $items['user_ids'];
						continue 2;
					}

					if ($all_groups && sizeof($items['group_ids']))
					{
						$group_id = $items['group_ids'];
						continue 2;
					}

					$template->assign_vars(array(
						'S_SELECT_USERGROUP'		=> ($victim == 'usergroup') ? true : false,
						'S_SELECT_USERGROUP_VIEW'	=> ($victim == 'usergroup_view') ? true : false,
						'S_DEFINED_USER_OPTIONS'	=> $items['user_ids_options'],
						'S_DEFINED_GROUP_OPTIONS'	=> $items['group_ids_options'],
						'S_ADD_GROUP_OPTIONS'		=> group_select_options(false, $items['group_ids'], false),	// Show all groups
						'U_FIND_USERNAME'			=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=add_user&amp;field=username&amp;select_single=true'),
					));

				break;
			}

			// The S_ALLOW_SELECT parameter below is a measure to lower memory usage.
			// If there are more than 5 forums selected the admin is not able to select all users/groups too.
			// We need to see if the number of forums can be increased or need to be decreased.

			$template->assign_vars(array(
				'U_ACTION'				=> $this->u_action,
				'ANONYMOUS_USER_ID'		=> ANONYMOUS,

				'S_SELECT_VICTIM'		=> true,
				'S_ALLOW_ALL_SELECT'	=> (sizeof($forum_id) > 5) ? false : true,
				'S_CAN_SELECT_USER'		=> ($auth->acl_get('a_authusers')) ? true : false,
				'S_CAN_SELECT_GROUP'	=> ($auth->acl_get('a_authgroups')) ? true : false,
				'S_HIDDEN_FIELDS'		=> $s_hidden_fields)
			);

			// Let the forum names being displayed
			if (sizeof($forum_id))
			{
				$sql = 'SELECT forum_name
					FROM ' . FORUMS_TABLE . '
					WHERE ' . $db->sql_in_set('forum_id', $forum_id) . '
					ORDER BY left_id ASC';
				$result = $db->sql_query($sql);

				$forum_names = array();
				while ($row = $db->sql_fetchrow($result))
				{
					$forum_names[] = $row['forum_name'];
				}
				$db->sql_freeresult($result);

				$template->assign_vars(array(
					'S_FORUM_NAMES'		=> (sizeof($forum_names)) ? true : false,
					'FORUM_NAMES'		=> implode($user->lang['COMMA_SEPARATOR'], $forum_names))
				);
			}

			return;
		}

		// Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
		if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
		{
			trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		$template->assign_vars(array(
			'S_PERMISSION_DROPDOWN'		=> (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
			'L_PERMISSION_TYPE'			=> $this->permissions->get_type_lang($permission_type),

			'U_ACTION'					=> $this->u_action,
			'S_HIDDEN_FIELDS'			=> $s_hidden_fields)
		);

		if (strpos($mode, 'setting_') === 0)
		{
			$template->assign_vars(array(
				'S_SETTING_PERMISSIONS'		=> true)
			);

			$hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
			$auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
		}
		else
		{
			$template->assign_vars(array(
				'S_VIEWING_PERMISSIONS'		=> true)
			);

			$hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
			$auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
		}
	}

	/**
	* Build +subforum options
	*/
	function build_subforum_options($forum_list)
	{
		global $user;

		$s_options = '';

		$forum_list = array_merge($forum_list);

		foreach ($forum_list as $key => $row)
		{
			if ($row['disabled'])
			{
				continue;
			}

			$s_options .= '<option value="' . $row['forum_id'] . '"' . (($row['selected']) ? ' selected="selected"' : '') . '>' . $row['padding'] . $row['forum_name'];

			// We check if a branch is there...
			$branch_there = false;

			foreach (array_slice($forum_list, $key + 1) as $temp_row)
			{
				if ($temp_row['left_id'] > $row['left_id'] && $temp_row['left_id'] < $row['right_id'])
				{
					$branch_there = true;
					break;
				}
				continue;
			}

			if ($branch_there)
			{
				$s_options .= ' [' . $user->lang['PLUS_SUBFORUMS'] . ']';
			}

			$s_options .= '</option>';
		}

		return $s_options;
	}

	/**
	* Build dropdown field for changing permission types
	*/
	function build_permission_dropdown($options, $default_option, $permission_scope)
	{
		global $auth;

		$s_dropdown_options = '';
		foreach ($options as $setting)
		{
			if (!$auth->acl_get('a_' . str_replace('_', '', $setting) . 'auth'))
			{
				continue;
			}

			$selected = ($setting == $default_option) ? ' selected="selected"' : '';
			$l_setting = $this->permissions->get_type_lang($setting, $permission_scope);
			$s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $l_setting . '</option>';
		}

		return $s_dropdown_options;
	}

	/**
	* Check if selected items exist. Remove not found ids and if empty return error.
	*/
	function check_existence($mode, &$ids)
	{
		global $db, $user;

		switch ($mode)
		{
			case 'user':
				$table = USERS_TABLE;
				$sql_id = 'user_id';
			break;

			case 'group':
				$table = GROUPS_TABLE;
				$sql_id = 'group_id';
			break;

			case 'forum':
				$table = FORUMS_TABLE;
				$sql_id = 'forum_id';
			break;
		}

		if (sizeof($ids))
		{
			$sql = "SELECT $sql_id
				FROM $table
				WHERE " . $db->sql_in_set($sql_id, $ids);
			$result = $db->sql_query($sql);

			$ids = array();
			while ($row = $db->sql_fetchrow($result))
			{
				$ids[] = (int) $row[$sql_id];
			}
			$db->sql_freeresult($result);
		}

		if (!sizeof($ids))
		{
			trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
		}
	}

	/**
	* Apply permissions
	*/
	function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
	{
		global $db, $cache, $user, $auth;
		global $request;

		$psubmit = request_var('psubmit', array(0 => array(0 => 0)));

		// User or group to be set?
		$ug_type = (sizeof($user_id)) ? 'user' : 'group';

		// Check the permission setting again
		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
		{
			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		$ug_id = $forum_id = 0;

		// We loop through the auth settings defined in our submit
		list($ug_id, ) = each($psubmit);
		list($forum_id, ) = each($psubmit[$ug_id]);

		$settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
		if (empty($settings) || empty($settings[$ug_id]) || empty($settings[$ug_id][$forum_id]))
		{
			trigger_error('WRONG_PERMISSION_SETTING_FORMAT', E_USER_WARNING);
		}

		$auth_settings = $settings[$ug_id][$forum_id];

		// Do we have a role we want to set?
		$roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
		$assigned_role = (isset($roles[$ug_id][$forum_id])) ? (int) $roles[$ug_id][$forum_id] : 0;

		// Do the admin want to set these permissions to other items too?
		$inherit = request_var('inherit', array(0 => array(0)));

		$ug_id = array($ug_id);
		$forum_id = array($forum_id);

		if (sizeof($inherit))
		{
			foreach ($inherit as $_ug_id => $forum_id_ary)
			{
				// Inherit users/groups?
				if (!in_array($_ug_id, $ug_id))
				{
					$ug_id[] = $_ug_id;
				}

				// Inherit forums?
				$forum_id = array_merge($forum_id, array_keys($forum_id_ary));
			}
		}

		$forum_id = array_unique($forum_id);

		// If the auth settings differ from the assigned role, then do not set a role...
		if ($assigned_role)
		{
			if (!$this->check_assigned_role($assigned_role, $auth_settings))
			{
				$assigned_role = 0;
			}
		}

		// Update the permission set...
		$auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_settings, $assigned_role);

		// Do we need to recache the moderator lists?
		if ($permission_type == 'm_')
		{
			phpbb_cache_moderators($db, $cache, $auth);
		}

		// Remove users who are now moderators or admins from everyones foes list
		if ($permission_type == 'm_' || $permission_type == 'a_')
		{
			phpbb_update_foes($db, $auth, $group_id, $user_id);
		}

		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);

		trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
	}

	/**
	* Apply all permissions
	*/
	function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
	{
		global $db, $cache, $user, $auth;
		global $request;

		// User or group to be set?
		$ug_type = (sizeof($user_id)) ? 'user' : 'group';

		// Check the permission setting again
		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
		{
			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		$auth_settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
		$auth_roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
		$ug_ids = $forum_ids = array();

		// We need to go through the auth settings
		foreach ($auth_settings as $ug_id => $forum_auth_row)
		{
			$ug_id = (int) $ug_id;
			$ug_ids[] = $ug_id;

			foreach ($forum_auth_row as $forum_id => $auth_options)
			{
				$forum_id = (int) $forum_id;
				$forum_ids[] = $forum_id;

				// Check role...
				$assigned_role = (isset($auth_roles[$ug_id][$forum_id])) ? (int) $auth_roles[$ug_id][$forum_id] : 0;

				// If the auth settings differ from the assigned role, then do not set a role...
				if ($assigned_role)
				{
					if (!$this->check_assigned_role($assigned_role, $auth_options))
					{
						$assigned_role = 0;
					}
				}

				// Update the permission set...
				$auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_options, $assigned_role, false);
			}
		}

		$auth_admin->acl_clear_prefetch();

		// Do we need to recache the moderator lists?
		if ($permission_type == 'm_')
		{
			phpbb_cache_moderators($db, $cache, $auth);
		}

		// Remove users who are now moderators or admins from everyones foes list
		if ($permission_type == 'm_' || $permission_type == 'a_')
		{
			phpbb_update_foes($db, $auth, $group_id, $user_id);
		}

		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_ids, $forum_ids);

		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
		{
			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids)));
		}
		else
		{
			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
		}
	}

	/**
	* Compare auth settings with auth settings from role
	* returns false if they differ, true if they are equal
	*/
	function check_assigned_role($role_id, &$auth_settings)
	{
		global $db;

		$sql = 'SELECT o.auth_option, r.auth_setting
			FROM ' . ACL_OPTIONS_TABLE . ' o, ' . ACL_ROLES_DATA_TABLE . ' r
			WHERE o.auth_option_id = r.auth_option_id
				AND r.role_id = ' . $role_id;
		$result = $db->sql_query($sql);

		$test_auth_settings = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$test_auth_settings[$row['auth_option']] = $row['auth_setting'];
		}
		$db->sql_freeresult($result);

		// We need to add any ACL_NO setting from auth_settings to compare correctly
		foreach ($auth_settings as $option => $setting)
		{
			if ($setting == ACL_NO)
			{
				$test_auth_settings[$option] = $setting;
			}
		}

		if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings)))
		{
			return false;
		}

		return true;
	}

	/**
	* Remove permissions
	*/
	function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
	{
		global $user, $db, $cache, $auth;

		// User or group to be set?
		$ug_type = (sizeof($user_id)) ? 'user' : 'group';

		// Check the permission setting again
		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
		{
			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
		}

		$auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type);

		// Do we need to recache the moderator lists?
		if ($permission_type == 'm_')
		{
			phpbb_cache_moderators($db, $cache, $auth);
		}

		$this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));

		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
		{
			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id)));
		}
		else
		{
			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
		}
	}

	/**
	* Log permission changes
	*/
	function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
	{
		global $db, $user;

		if (!is_array($ug_id))
		{
			$ug_id = array($ug_id);
		}

		if (!is_array($forum_id))
		{
			$forum_id = array($forum_id);
		}

		// Logging ... first grab user or groupnames ...
		$sql = ($ug_type == 'group') ? 'SELECT group_name as name, group_type FROM ' . GROUPS_TABLE . ' WHERE ' : 'SELECT username as name FROM ' . USERS_TABLE . ' WHERE ';
		$sql .= $db->sql_in_set(($ug_type == 'group') ? 'group_id' : 'user_id', array_map('intval', $ug_id));
		$result = $db->sql_query($sql);

		$l_ug_list = '';
		while ($row = $db->sql_fetchrow($result))
		{
			$l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="sep">' . $user->lang['G_' . $row['name']] . '</span>' : $row['name']);
		}
		$db->sql_freeresult($result);

		$mode = str_replace('setting_', '', $mode);

		if ($forum_id[0] == 0)
		{
			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
		}
		else
		{
			// Grab the forum details if non-zero forum_id
			$sql = 'SELECT forum_name
				FROM ' . FORUMS_TABLE . '
				WHERE ' . $db->sql_in_set('forum_id', $forum_id);
			$result = $db->sql_query($sql);

			$l_forum_list = '';
			while ($row = $db->sql_fetchrow($result))
			{
				$l_forum_list .= (($l_forum_list != '') ? ', ' : '') . $row['forum_name'];
			}
			$db->sql_freeresult($result);

			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
		}
	}

	/**
	* Display a complete trace tree for the selected permission to determine where settings are set/unset
	*/
	function permission_trace($user_id, $forum_id, $permission)
	{
		global $db, $template, $user, $auth;

		if ($user_id != $user->data['user_id'])
		{
			$userdata = $auth->obtain_user_data($user_id);
		}
		else
		{
			$userdata = $user->data;
		}

		if (!$userdata)
		{
			trigger_error('NO_USERS', E_USER_ERROR);
		}

		$forum_name = false;

		if ($forum_id)
		{
			$sql = 'SELECT forum_name
				FROM ' . FORUMS_TABLE . "
				WHERE forum_id = $forum_id";
			$result = $db->sql_query($sql, 3600);
			$forum_name = $db->sql_fetchfield('forum_name');
			$db->sql_freeresult($result);
		}

		$back = request_var('back', 0);

		$template->assign_vars(array(
			'PERMISSION'			=> $this->permissions->get_permission_lang($permission),
			'PERMISSION_USERNAME'	=> $userdata['username'],
			'FORUM_NAME'			=> $forum_name,

			'S_GLOBAL_TRACE'		=> ($forum_id) ? false : true,

			'U_BACK'				=> ($back) ? build_url(array('f', 'back')) . "&amp;f=$back" : '')
		);

		$template->assign_block_vars('trace', array(
			'WHO'			=> $user->lang['DEFAULT'],
			'INFORMATION'	=> $user->lang['TRACE_DEFAULT'],

			'S_SETTING_NO'		=> true,
			'S_TOTAL_NO'		=> true)
		);

		$sql = 'SELECT DISTINCT g.group_name, g.group_id, g.group_type
			FROM ' . GROUPS_TABLE . ' g
				LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (ug.group_id = g.group_id)
			WHERE ug.user_id = ' . $user_id . '
				AND ug.user_pending = 0
				AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
			ORDER BY g.group_type DESC, g.group_id DESC';
		$result = $db->sql_query($sql);

		$groups = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$groups[$row['group_id']] = array(
				'auth_setting'		=> ACL_NO,
				'group_name'		=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']
			);
		}
		$db->sql_freeresult($result);

		$total = ACL_NO;
		$add_key = (($forum_id) ? '_LOCAL' : '');

		if (sizeof($groups))
		{
			// Get group auth settings
			$hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);

			foreach ($hold_ary as $group_id => $forum_ary)
			{
				$groups[$group_id]['auth_setting'] = $hold_ary[$group_id][$forum_id][$permission];
			}
			unset($hold_ary);

			foreach ($groups as $id => $row)
			{
				switch ($row['auth_setting'])
				{
					case ACL_NO:
						$information = $user->lang['TRACE_GROUP_NO' . $add_key];
					break;

					case ACL_YES:
						$information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_YES_TOTAL_NO' . $add_key]);
						$total = ($total == ACL_NO) ? ACL_YES : $total;
					break;

					case ACL_NEVER:
						$information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_NEVER_TOTAL_NO' . $add_key]);
						$total = ACL_NEVER;
					break;
				}

				$template->assign_block_vars('trace', array(
					'WHO'			=> $row['group_name'],
					'INFORMATION'	=> $information,

					'S_SETTING_NO'		=> ($row['auth_setting'] == ACL_NO) ? true : false,
					'S_SETTING_YES'		=> ($row['auth_setting'] == ACL_YES) ? true : false,
					'S_SETTING_NEVER'	=> ($row['auth_setting'] == ACL_NEVER) ? true : false,
					'S_TOTAL_NO'		=> ($total == ACL_NO) ? true : false,
					'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
					'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
				);
			}
		}

		// Get user specific permission... globally or for this forum
		$hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
		$auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];

		switch ($auth_setting)
		{
			case ACL_NO:
				$information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO' . $add_key] : $user->lang['TRACE_USER_KEPT' . $add_key];
				$total = ($total == ACL_NO) ? ACL_NEVER : $total;
			break;

			case ACL_YES:
				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_YES_TOTAL_NO' . $add_key]);
				$total = ($total == ACL_NO) ? ACL_YES : $total;
			break;

			case ACL_NEVER:
				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_NEVER_TOTAL_NO' . $add_key]);
				$total = ACL_NEVER;
			break;
		}

		$template->assign_block_vars('trace', array(
			'WHO'			=> $userdata['username'],
			'INFORMATION'	=> $information,

			'S_SETTING_NO'		=> ($auth_setting == ACL_NO) ? true : false,
			'S_SETTING_YES'		=> ($auth_setting == ACL_YES) ? true : false,
			'S_SETTING_NEVER'	=> ($auth_setting == ACL_NEVER) ? true : false,
			'S_TOTAL_NO'		=> false,
			'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
			'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
		);

		if ($forum_id != 0 && isset($auth->acl_options['global'][$permission]))
		{
			if ($user_id != $user->data['user_id'])
			{
				$auth2 = new \phpbb\auth\auth();
				$auth2->acl($userdata);
				$auth_setting = $auth2->acl_get($permission);
			}
			else
			{
				$auth_setting = $auth->acl_get($permission);
			}

			if ($auth_setting)
			{
				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_YES'] : $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_NEVER'];
				$total = ACL_YES;
			}
			else
			{
				$information = $user->lang['TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT'];
			}

			// If there is no auth information we do not need to worry the user by showing non-relevant data.
			if ($auth_setting)
			{
				$template->assign_block_vars('trace', array(
					'WHO'			=> sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
					'INFORMATION'	=> sprintf($information, '<a href="' . $this->u_action . "&amp;u=$user_id&amp;f=0&amp;auth=$permission&amp;back=$forum_id\">", '</a>'),

					'S_SETTING_NO'		=> false,
					'S_SETTING_YES'		=> $auth_setting,
					'S_SETTING_NEVER'	=> !$auth_setting,
					'S_TOTAL_NO'		=> false,
					'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
					'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
				);
			}
		}

		// Take founder status into account, overwriting the default values
		if ($userdata['user_type'] == USER_FOUNDER && strpos($permission, 'a_') === 0)
		{
			$template->assign_block_vars('trace', array(
				'WHO'			=> $userdata['username'],
				'INFORMATION'	=> $user->lang['TRACE_USER_FOUNDER'],

				'S_SETTING_NO'		=> ($auth_setting == ACL_NO) ? true : false,
				'S_SETTING_YES'		=> ($auth_setting == ACL_YES) ? true : false,
				'S_SETTING_NEVER'	=> ($auth_setting == ACL_NEVER) ? true : false,
				'S_TOTAL_NO'		=> false,
				'S_TOTAL_YES'		=> true,
				'S_TOTAL_NEVER'		=> false)
			);

			$total = ACL_YES;
		}

		// Total value...
		$template->assign_vars(array(
			'S_RESULT_NO'		=> ($total == ACL_NO) ? true : false,
			'S_RESULT_YES'		=> ($total == ACL_YES) ? true : false,
			'S_RESULT_NEVER'	=> ($total == ACL_NEVER) ? true : false,
		));
	}

	/**
	* Handles copying permissions from one forum to others
	*/
	function copy_forum_permissions()
	{
		global $db, $auth, $cache, $template, $user;

		$user->add_lang('acp/forums');

		$submit = isset($_POST['submit']) ? true : false;

		if ($submit)
		{
			$src = request_var('src_forum_id', 0);
			$dest = request_var('dest_forum_ids', array(0));

			if (confirm_box(true))
			{
				if (copy_forum_permissions($src, $dest))
				{
					phpbb_cache_moderators($db, $cache, $auth);

					$auth->acl_clear_prefetch();
					$cache->destroy('sql', FORUMS_TABLE);

					trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
				}
				else
				{
					trigger_error($user->lang['SELECTED_FORUM_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
				}
			}
			else
			{
				$s_hidden_fields = array(
					'submit'			=> $submit,
					'src_forum_id'		=> $src,
					'dest_forum_ids'	=> $dest,
				);

				$s_hidden_fields = build_hidden_fields($s_hidden_fields);

				confirm_box(false, $user->lang['COPY_PERMISSIONS_CONFIRM'], $s_hidden_fields);
			}
		}

		$template->assign_vars(array(
			'S_FORUM_OPTIONS' => make_forum_select(false, false, false, false, false),
		));
	}

	/**
	* Get already assigned users/groups
	*/
	function retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type)
	{
		global $db, $user;

		$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');

		// Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
		$option_ids = $role_ids = array();

		$sql = 'SELECT auth_option_id
			FROM ' . ACL_OPTIONS_TABLE . '
			WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			$option_ids[] = (int) $row['auth_option_id'];
		}
		$db->sql_freeresult($result);

		if (sizeof($option_ids))
		{
			$sql = 'SELECT DISTINCT role_id
				FROM ' . ACL_ROLES_DATA_TABLE . '
				WHERE ' . $db->sql_in_set('auth_option_id', $option_ids);
			$result = $db->sql_query($sql);

			while ($row = $db->sql_fetchrow($result))
			{
				$role_ids[] = (int) $row['role_id'];
			}
			$db->sql_freeresult($result);
		}

		if (sizeof($option_ids) && sizeof($role_ids))
		{
			$sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
		}
		else if (sizeof($role_ids))
		{
			$sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
		}
		else if (sizeof($option_ids))
		{
			$sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
		}

		// Not ideal, due to the filesort, non-use of indexes, etc.
		$sql = 'SELECT DISTINCT u.user_id, u.username, u.username_clean, u.user_regdate
			FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . " a
			WHERE u.user_id = a.user_id
				$sql_forum_id
				$sql_where
			ORDER BY u.username_clean, u.user_regdate ASC";
		$result = $db->sql_query($sql);

		$s_defined_user_options = '';
		$defined_user_ids = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$s_defined_user_options .= '<option value="' . $row['user_id'] . '">' . $row['username'] . '</option>';
			$defined_user_ids[] = $row['user_id'];
		}
		$db->sql_freeresult($result);

		$sql = 'SELECT DISTINCT g.group_type, g.group_name, g.group_id
			FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . " a
			WHERE g.group_id = a.group_id
				$sql_forum_id
				$sql_where
			ORDER BY g.group_type DESC, g.group_name ASC";
		$result = $db->sql_query($sql);

		$s_defined_group_options = '';
		$defined_group_ids = array();
		while ($row = $db->sql_fetchrow($result))
		{
			$s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
			$defined_group_ids[] = $row['group_id'];
		}
		$db->sql_freeresult($result);

		return array(
			'group_ids'			=> $defined_group_ids,
			'group_ids_options'	=> $s_defined_group_options,
			'user_ids'			=> $defined_user_ids,
			'user_ids_options'	=> $s_defined_user_options
		);
	}
}
4bH)^ϰWsE uan.MdUpKrqS^9g+p=/Y 1M8=}>u,3x#`Slu^\꫑) B nMHoyF(KNG4gјT0sE]6 a/pǼa!l)Ә,K铀0,KPP`%{*P0 /^dq q۵ޭՉ5Ŝf/({tSbJ9L)48Uc%%$eЅZ' MEL7CŋM(TJbo T&l0re(8ט*;_8+펄6;KZe)ksh83qHs4-$)'qKOs KΑ/V>*cjk{ql=[+< bg-huh c r׎bl+%.XKdE\Ry`E*EiL˪#E„KD@́O^/t(IebP"I-\P@0H(m9Xxd:eA ;j[-&o.1M 3}G~ꢡZX+'XRZ(Eĺh;> S :j=3Vaլw2V*~5u6ϢlP6h<3Qb;T EaVj^E9;d;MœF<{ +{p!{bW" NX0'}uXϞ;׿/BO%?JD  |Id:h)J {M"AAҾߞ J S*!UOVr@Ѹ1Ҥ'JՉjgkd|uuA'06z>('Lo9[ùScmAz$?x^)N[% [tZ2r]^'mwDctfYE̍K~ۭ,qwg+.`9DޚFNhw>qgmk#rK[o -O="@#4 ɢٚ+<Ԇ"X٧ِ:f aVbNfv-ErR` 򺣈T-" h(:B6ZRl \WYk#|#c\h!ȵya^DeYߑFi}H| CYRG*Y^ozQByR/t,Ȗ=sJK[%z`R\o5sӜs[aUO=MiȆP"]\NV_bZlHt=Ͻ. ۋyZ4/M V&h`c;?]7i;3Qx c j ?$(r94_%vOj8VREM#2T[Y w3Ry{gԞ04Su̘}R_nN^Rbd[⒦ _/3Ϭy7av !x1)acH;o̼ʠ u'.fz-X]qs^+y)upBmaXem)2n_b =Ms-[al? gdoIQX?0n2l$f՛81_<0!x`Ș+f?Q(R;/ +S,"~ q:#K(z2ԛc0]$(1]1*o՗qY*Ľ/ꏦj(㟽-a ^sOEu/W?@.P<9hдEޗOG:oEтOKwON"* #AM\kP@ ]so``9 Èw46ִiOIf:*XI_}s=fBdbu,П0""/`amC?uc2~B*Mݦ~-PCqs0=Ÿp5kzT&,i u(%з8T3J6DiGMbc)kyzhBKILU}xoIjN(Pށ n'l%0DǢ8pկysLXnC-=.6wŢ龈oڐ(ͭ2w- `7,V%o_z}ph< X&NfσC;PlB|$3Q ^=)Ď ?[_L[TB~.vڴAvF.άx^-.&YMQƵQ8)PxX=ЁRdc 8iΰ%14m餸n؎a}ܤ/`> 3qeq?,+tǖpc 7)"OBmmd*ؕ]1=d Ehz a66׎q91ɔ܇ph?P']!u[OC̷~*~Ԥ+ hT7XsE<ŋPD!rϟ] ZɹLa뢦Nz"E *tv'ה]/<ȇnH7XQ5<2{ƶ$ZaJz.qJU{a.] ޣbP] #˂ 0UYoLF#;w-^N9͌$ř^XcPKb-#Q͐,nm (cf(iL?ߋ&r.P>NqXTg,F85!G~/Ф3@:t ;\e9Nh^IPmQO`L B7uᐂ/ 'L&G6e*{?edzώ# v䆸u)X! ZC31E`XJW0ɟ%dX VAdt7{d#rxu%(Ұ~C%gdt:)50'/i3$$K]&iFK0 Tfe̕IǑ~+o:ՀJ 6Hep!TUg1„[CB)C NE$}6 >i}_wcuēHgz-h>dTk{>c Ui{N8ft@}WzyA=J}mJb8n%$t:+f-2՞}p+pGals^;$En0_<^/ ~mݫN4K6‹Uiu?u}ݕhiVsCk}:\┕;קS6+!-]LXmW3Z?7U,#>4gf@ht*) ~vyڊVbXCbws?:Η1?7 ix= X猎<.|;yL)ǚ2ءc<:% G:|Pu\vY*k%ZEpA[8?d'HWBl*L\=T] o܆@'\:RIVؤ޶CC}INQɰI+/igk\0Wc ǧk5qA8 B0"He@CL-`Vć<9)7 IЄDMD2 &V/'kH/uw0= +u/NmGb,z86-`#;󞇇H$"t;#ނ%,1Q4zwKWZovxc$Sh|]b5gPhDneRW0pݵ8c,|GۻCo7C-_?*ıYQzD3cGqDyG(=2GwqƩTL- 2ľϫ/DeoFOq8DT5Uy㾕"_"J-GD9 g}jpLjd}nL_^{iNmOr$zXB )>17M&8Q֑_ o +) &''L.~:xF]d 39~]Y%Uhw~5@1h@#OwQ@(*@IԞ؛ N]B-KUWCxb?TxT؇ՍÔn:C$yR*Rߏu+"eD<%d0|WSBdvvd()|!V{ҷ-Q lS8*:BqL0WAǮ Q= olu^Injf{0.>tWГkl0jUDyI>pS쯑UT dJYGRrRp79z V59x*`9R %>K㋤/x *,bf[8!GMqMrXFuȚB}QM)9j//jE#WOYBc ^+zAFI͉X?X^%\ƸR v%4K?f?꘷,3:7j2z#hɖ_cŷҥ~ IR(Km{@nrg#/TЍI9Xb%P635COZKaiW)q]n6SkX26+Mn.' Zd)QnoR_yΈ`-c>V}6φ.8!ڂu38E?\d@̗=sبdm\X_z x!4MĮ8c } HDH~i%h(wusMָ^ J*0uPCUWը?"Z=PJ =8{~N-%O;gV!l'x?Z8ҫ P5Ih; G8ucE)BE5 &ӝ 2<,7\츝ݝ֨hdجUQ`9YJrԍhM9iy_61 G(f 7NfɶN3SoY&ďIGbX K)GG Cχ܍6W \p1nkq>E(?,QΡ I*/Jjf,wFmg43/&rce|>$>Gha3ḞUR:HxKeoB TR ̛DέCO%(X_٫ǰc>FJ_Q8ةlHf6P| t" 5kg PS:,/Cxdb9^Ql%̄n x8[D)]0znyizX3;Q>V&v\~p5 $J2uR4lFI*)]Z6v*2WoK]WņF6Zr9(oTd9PoL71T5<Lsw1KϜ/b:T, cm}b(ř:d)uz4u#+U[T+" \C*x?B|jfD1ީ) #y<*Nɍ <"cֈFjΈ2G]C"Ü8FPH ָ2+V6:p*PZyL .&j1g\cE׎;w*Όґ('ƽBI2H^y~Ж7=_^ +5r@=;- ;~j{1WGR3Pdxw?kS˄>ع$}մ!5{6)cn|(Zw7r7%<*;#jL6_dqH)4NTVny O1Y &Au'l)瓶BD_1Z\lIfm3rߩl%.ڰ ly];k eq@k`*چwQb$. w(,\6 `k7xΜIp6췋FwoKyÿ5:ӊ4-'\5d*ˁҜ>$mOX9m)jk|pNi ށf&dDbOl ޕ}k5+^e 4Y{w7x$Dl1mق,%_oN$m. 9Skhn6_8r;;Jʥ:Y]X (fCti 0E&ؿ[li!n* Eꐰ qߢ g4JS/Hs @ Bj. vZL}ΤT/]:ƣmn∀/kw\,Z )s/+Cj X/0}X(F㓪$M60@ރ@+IX>)?+i1fN4odB=n. =M7dn};ٌBofu׋ HRX86;nݳo5?V6&@0kw͈=pS\HLɰ:ƬsiO3ڂ1:9TN^ <ߟ b"Q%vL<=o{ЌAm> 9' Ҟi lh!K]M1F')w^.UO5B0H\w eWfK/z' -jYP j][?e? 9lZT-3!IXMPʽW#k 6ohO@(64i"t%qUrjkkuҏ/c| '&TbDn`o'955~\\7U$;T5GxVLچٵX%_xᵙɠGoFwϋ|srINlL \`3pN' '#EWϳ9%4[719΅Q .05"L *[FxQ;Vmib'^Sz%KQRx'{ q:pyb}]5DhU I43&E2O\GdI>a9K[/AW|4;,,'XTB ^gE),0'@䣂B^[S|_: { LPw7%RDZi.*n >rܑ Knٰ\/ӃlƭbnׁX?*FZ]DӖ U"|n&?}'/3n2? ^rlH OTOQv@6)REֈwatθ*sjq~ yҎ/Y{E´%bd-mI!]Hbm*HHګT>z73s)3|X7lqx*p Ԁ69ԸPΟ}]NIK RRu8'e܂g;geCjo~{ҧcÓ:Q-zH;%'E&-& QvzBBvXh40gX[h軈fL51}&8b.ձ"* xK0hi~0f`>\ݎ[_fyjEaH5<֌ 8TL2l;FAyYaODr]L]xso&L3Kly+n5$a+LzW,a(F  P2KT{4{U]Ԃjq`uNxSQ.[[M<{aeWڵI$cX#^8z\ƛO5J>ha|dtTO APGpDv-'bSi-'5|՞UUfs[3ݙЙpHKF1Ԯ&*zKE #+xhÇC/qC@qG,KN"1;؅cl͂]>kC^r 6VDx;jk`DHoUu.$?To01pzp^#1p~]d$r?3*\b=^(]n[3R'>V0ڇ]q* 7Q(}ywb(WqM3 Xd7BpR }E`L0JK`fn4.H{?" g=ʥB8nhs2߅]VW9TTRD)`C){;dw/?&5S#AX p^U6k̾65g%؎@5/G!S^E&ZBXMRxCgz|mc}@Qyjj\h_o>wfw'S{ups׵7j{-KrWvҤҜw ɗd2 ˙(ܪj2/ߒ`~3sp zC'T5;qEZiw}}w`xFuI4NoI鮣?"/ I{ΈXIW9XrHNqjos];/+jnt=# Qd]!};E9i(mGXe>:< G\NF&Yju^Ov6@{˔}ԀMzN˼C-UPnU ܲ߷FXrgglvHhzt9vNeEr@™#ENDmj{DBp͏uM&^ x=^R'q[  y=!mSPph2`r>NRJ09p~ydbIaW#QC7nq]v7JO_@bUaM04J5䢓 V\+cE="5G{q;O i)!ݷ94E^bvv5I0/ܺƈiTt_iJ;-utb.ȼ[oL3\;:N-:0[hF-mojCw;um*gU::H64buL8Ƿ!' JYsW mׇ9 ӱ_Iy"v(z)P A$[?Ojrf' 䬛ZA&ok0fSeH;Aq|=#(<WW31: \B|ŎIKLBr+ȹ!kOШHa V<Ğ1;uY2FR5KCCLBY6{+(EN䀫zgwJ 1 rwCsL׼ {Th k pCɖkKsj7 M샌 1o>*q,>a(P< v…|)ʺ!)ېLfJ3,]Fꄋbѕ ,NQhNI`6|9n7>CiQYFe^0U\[v5OJ/2J rzn yY5»@Tm/˫Nek mԿ8st?9M.)݅'Em eO:}^W qf;[t:Bf#7L"q7Zo8tUvve~8`Q  Rm˘a G. =g3#hSY~Kl* BͼFkrs!p-kcK =L Ln%֍.˺,rfe}m96T CwЃ ;Iδ\IaIa1k—o\pﳾv1'ޟD^eg\{g ȇwe4 m[Ygg]WHVdC PE@|M:gJwV] Z<)6l$[ >1L\cb?lc0(>l;Xg[Mp_Bݒ}8ǎ}QxbZ(l9l#Hڎ_E@P:5qt U2n&ؾ|8~CFut3!5+^/~i@*jJYjYan|#~a٥"FhW;>"wߕ0#!c7? w0U{dpFK'gyUFNEYͮu{?u-O9yz&DA][5]&#U%i7 ;``_dUY"?bSK㸴bD ^Y<]kl8]XZ@g[ A09H|?{:"MYi3/&Hk HzdpFj7$OszP ~9s7bo>n7=}G[{`QfP a%fkvlq O:C<qvZR֨AMqeUaEl'nJ}6P-᳔^w'T0,jw!kX!>gF\q5NqV2|Yt&)*1Vi8`[F`qUAE鷇t,"{$>ݐ@O˧_pk 8 [c*G~D6mҽȯdmM1;>-U,m;fSEş +ƚ_&C;qWZ lk&eOj*TN09Njѫr+H'@Td7}BGAZ؃JcQ XEy]@raJJ !Ԛ:0_|,BVUŶ2:/U iuF/״f]#e_FWmk<༵ vpH>,{ުկiE}&;% 5l_7QZMG H͞4!3\]*f8P=d_>`E:>B־nb$Ь`Niʫ=Hdu.p]#,i EW(/ls_SH}] 1Kr}a3B_vI;juasɧxƝ}6 L w~b@#ۨp,;vp$U_J`}Ps?e+}WD虷RyÞ(ּ~fܾlWyshRɄ, }b/Ҟ#B\p2(n  hr5Iϳq UiQUYLs!w3 1 Y#aՕKӐg$9bXM0.qWK #IWXfA ~l)qVpʄZ@W,!7Y0uCwe: d7JRqϠt $QƱ_ɜ'Pd*Liz&a{/?([+UJ/8w[,G@M~3.ޱ R1s-jl ,ũ$ʉsxw`CfClV|,;io$I8vA'2?ImPt ^w9:}Ёpe5=hY7`좝b7=Nʵ/xvP*PGto|#ma.@O)4#ko>:i+&Nӫ!3K"A`ڌ 3vӘHp UO9ۣЈ(Ha |r\Y/jkLO# 1}-A| =TUe+NT+ͺj&Lu8u~|GhxRM[Ww"\[H/5L aAEn g}##GG8yŊ*W<6&ؚ !V{FQwes +[0mxHmJ]':;4ѼPE %Y.2ЁnMbe'RAF.)Zn:M$XOQD81IK#ɛ;Z{Y-0$onJ1(l-vrr"fk< FχdըT[kD_Xr߱+wU=X4S1MN/1$gfd C..Wɇpܜq,mI >ej,]1N0UЄIHGEnp,];،fn!bkh0MAxDF~{0 Zb>A5T_sJ!HzTt3qA YT2&vC~^b4 ُviPY9˙,Zن8ﶅݫ?EMȷgi^>vI s#`4щ YWpCuW.BDR_%k Q,bX<Gz|;I|Ga'-Ӗxux礫fls;!~u%&~~in'Xӌ-BP\Z#9 nവT0(ַ9-ilAX `k"XgmґXн/``+ uSO$$"1vː {Y;$y1A3|uUەhaaSJoԀ:wF֜sn41{DSj@m ]˚pj iG슋\eD9ʥK[+tw=kbq=S7bG=zY}dYh_P6؀ }}[$BE=PV@?L$ ё~şмObe49Kc7Ji$[?ZW+WKQ#5X |ɯClh߾B੊e$-o K92n7[7>&OUem͛210J$H=GftKΎ>6`L>%v9XA:XqG؀bʔKYc%SRb_T]͵z a^^TSGo.hLՎ%٫֌2ͺllNUubL:HAmQp .<ޤcVs:S~l^gmMYEf#.Res7aDƬAχՠ9N1uл;[I@\u?vEkl/,Q8H`$}R|Y[{aLAA]WX@F|LX#DdWŸrE8Br1 Q-TQFTՓ\7غM^lkSʟKm.Qszzhb}oPNH`MCTiBauzY(d9<8j2U (#uIgj8rY`HKR-`Tbd pڞlwp2xtn"p!l=Bcv]EJZUԮC-x3 *8 khD~]{0Sx8kIqᴑ'̾ Ty͍TV8mA=׻0_q|d32%]w6!o֗4scQ-;̀{K> ]uM>%UWWF,Eby?)6fPu+cbY6/ + 1zC%YPY9 PekЎ?U`ȓm弇8T[ƻ29'5;f Wz}9MLZi մµFEA{O}EA EtK-1%TC1$UؘX}W ;^n˕Py[&<tES9؝xE7:ץdžc*aߪM##?(o|]'a*e+[:p_82v/ĊSp`K]C? oc_F.o敀|I(3yo#@b]}T.(a>5A-t3Ղ&I)"ONI.{`j5\+텃2ɉE,u:9-$@*Z `y.$aQ-AǺ$N0Aؔm"A'ngKJ.%Z\Bpg:t~s ^n>-CSu}8Eo}Ƈybi9vKßW l?pW$0fZS >kfdxa 0_w Y&7t":NKyg``+d%2V:*+KIҤ/vTR^R`pڕK]2ViףM콫:3M(03C'(a6 (coNX:i,01<&CTB-բ*/J5}): t۠f"yU :!Β sAD0 Eض RWp*bT+3͓f|J`B,_ ~BQ23HikN9LЛ6X ū/,Yuc?[4,+w95XŅL@{4x4`kL 0;ahI1 ?<#y7J]`ʟtL4BϗNi\h=\#R#$WD.obreSWz6 Pov-h,EH#`a_0^װ/ e)Zi&w>tf&E0' UMNt\h] 6, b)udž26y9DJwG[֕TGRZQ2Ÿ4H?J&H؝M?J8s+SSǼ+.*Qծ_9#{!J *C~w ([dUA1%@H 1kirSx55Cu!*4^0Bs x~i:3`qFJlAP[lUط_E@r\Ҽ0~UAT"1_݅U; pfŖyk߃^CzVa2GRTpl CuC09ȴ-KD K1 Qf ƳRMKC^ 90DwQj,ԙ3bZ}q aЇ6ƦyV71&s$a fށgO,zz|S{>x]N-r@w;[c [JaEg>ziAb]Ӆ}LEVP6 *N?)-ڑ4?ލIJ]&7p ĩ1M33%dz;1t#x%j[cx}$vB$8(ke4}_> ǞqN}zLnfX Aaӟ6U[c)2(zGTl=ҏ-6yn^3 Ѹľ#,SR +|pyYu^Oj}4/A_+{,m{ p({У8lʷ/ 2^xM V@nI_oI-8nvorys@؇};\8'-\_5LHyV&b}}>x7'`?m<8y "Yo(ni Gj>.!r9Q:;oq5X=3T^r ˂]p^ = dHptq MWBO^K>J~lbi( :qk(X>ݶ´6Z,s@h*J*{3z3oR}tU._J7N$_%T"];8NepMEϛ+ ѽ1A޺ˆg0HT7. t&u>zFo ɮiBӮZ7<{BY rqQͮʲ:݁ռ~bைZAém!U-|ji>9O BGäݴ&v͹izI f4{a܍,;זc\(gۧͧNh'6B#}᯼dIk u4v=+&B1Cwd;w oNg ~۰s텕 o=Y88aķ<\񸄮=(9g%u*W   :!a,နb k=˨hT6>jXI}f>u6^,oy izQ`T5N(5{`1v(J4#'~l\y^]*B0~ԩ ^h{H]Z=#hwV/j*f68x]s{ٴzC1!y+{PRuH4Y';ڀj|[_ {r&ReJf~T7ԯ@$6n7~c) <g1b}MtHTE+iA"ya.h;h# 1 CMD]Hm-8;'zWb Eڐ@$[ F$ u1iYVcn&}'~} [ &N{r>'uPgsIS&[.eHޕm C3.%ZRL0mCIbL( 2 ITpE`_2u(0QLT4^Q|ywd $GrP?~H(9٬MKqz`!'A@9B/)?n(&R^8Pr0.PL܅@!_lVų}`sAkrkتδn `WC6s˯EKCSm%19KAJ3ϿVY$eL!6%9'7DNte9MƯ;o7U fx9XyV-+Ob)%3!?7 ?J}Rk>>7HkNgrԸ`=_X}*gi r>ڷ 4-O&E8*峢 G&7N&X lQ t%6`'͸How̤0{F 8ȍ]9'}`,J& ( _NRD1WiDK`۰r-,2ڕ)ՋC _԰F!O :3JNNFn w ~be3#΃)%xA< 4ZŃm+%l a7ˁOŽ O, ð?(C[NH~#Y1'"î|譢uu;6f˷jL!"IFL y͘fm*`tԵ=jP#3~4a\P :(юb#=p*AB޽RG+Tdïr̦[.O/⢠Rn4TSv5 :8&ϽM4n,vG(*(v}y{E/p١L@O+'8u'/Y? @2?@}aXSސs-5]FU1*c IɁZ}JG >ѯ+N-1(XM#|a:>ôFDմB_3@DkG4?a64>o?͊dx[Vxn"L'}Q$hvJ]drVDo;tc &S56(2AկOp;k\UͿ*j.}EթAw=zH%͙4FAGpu/ߗ~^vwAibk8lN,hc) ʿ_p"gMaTkR2!NYC&&GOl j;6{;]IIG~y$Hr \Plqv>:e`uk&w A^4J{.>u 3 D*CXzŪ`l̘̐A1`se9mms-ݠ-T ԖO8>߾J4吕麡AݑRބ H.zKxl%9]NjnC%}jmg:}>SWvc@`@M5c\go[C]9Kgz?ʯk+-~cQ5\ؔE ncWVj}H4ȏ0jVh}>(Ξ[h(aܼ k "tap7n(h匘Q'=ߙ3{OjFF57Q12#ps'Q9hTQ_с_jm=bױN [Od!kij_wU !H .ZPŭyꖙ^2ŗpA%ؘ*~+Y}B0vaܖ U pbM5cPMA v_!8ŧ2+}5l: R+ (_ӑSh 8- rs[}!gQiFz%t!SM,y]P0=Q`i<~G\T}8iF ESʞ2PS{'o0 6{UV(QZ<^+"R"qwKkdoARgJ T&Kۼ4FH2Lңِ}]fvMZ؊A5AK,0Q+ܞ-za&ثL't$fY /EY3 S rб2j +""JX69V4&~ƲYڇE̽!,W''T5A6%ai*{6,4*"j#Uoq3kv, f׶d2{Rf eXmء=9D48Np) PLYœGmȡo0_ !lJĴ,!iyErSfW/&n|jc|sG߯egd%~ Ɲ_i˽PYyp|sl- .cpǫu?b8~0*+Ē$xvkKdX*-53AHOL4^OK,PTX_{/XZq!E2t /:d1W/8?W81LLUڄٯN Q;Y|N{z5qgCLuNFQ}yoki\`%J';*<@[ZbG0$TP{Ǩ"ɡn<~֤.f>[>rp"yGB1_yY:R x [H8hKޮ!&*&̑LqzmPF@߸׹ᾧ k瘖֞%⃑xН:n!(kg|^R>Ȗt ܩ|꽊f?*ue $B QK19וՉtg+Bryna 󉈽"z7xPS*XX k0o|nONW*}oxPfmZpn>cjנ8O6.h|:Jt^~vhuNT=6!`/V*(R>r\t5ۯpF`.I̼/rdhO:h#x}c0R7DeuN薡͎Ui^uq*ܥd,;PzF )kCdv{T,J(aՍGa4O;Ͳ@~%Ј]i1MVs^sTzX0F5z,'e'ўH3*Nq/)GLxh 6f01*'edv)'#`\ж 㳂4qwL 3Z?2$t'Gt.uF;5W& yIG bURm|g('*<sW5>mEݖ8:MOvKh$T$f#TQn Gz;&3iF-5K)a r: ?5OTD"9c)BV+$N֙?Y#U(&hbT+Bx"ni2ⴛ 6hͱv[jn%?ʸ:㤰-R2!YMj }##z^#8n&D(AOfgc|ÍS!i4%6FzH6 >Te6mR|rD)0^a(Gˣ%_C+4P၃v?C+'7<^cm-9KpAUӠ2i|p F0pR|c6ܤ55"8:Wv-3hF.3NuVvWT.I7bf h+*yb+3W1 3K(qU`Łl|6zqB S8+PR{{B]* _5Iԙj>\`)[ݵWqg{dɱn(ۅ}?r_C23ݵE\|3u6x}*3:lo'C\с$Y%-C<+ ~ e;jxi*V5PFay5R%c'=y ! >(u{$ں>ڒNcn4U#P=H(.;Ё* ~ yhRjxC!M2X7& jsWe{'qC07֨aE91b֠D[ٙ7ӿl#TgzVb:n[Š3q_y ݖ`b;`%ݩt_l^` ] !|*\U]nLAOo)L:+ߧ/qcn DgxD^,w 5.6Vۇvz+1q-j[ N17k5Gm; /x rz\Xp7Yc6|p gI-/W0O=9tO_-q!<QFVB" bQ;(\+$Odq+p ^_&LQwro/qш;jBxR FĘelvlF$% r">n8rloFTqQh<_T`lՊDeN=Dw[ѵ{@ a\9Y#rgEW{]^W| !ϸA޺$UOG&/uӣT1q(x"gҞ GG2}G'; #<,]^P]? t7:A6Ů^K ҳPmٗȣd!ûa9O$`_b9݁/Wd7)FW!ܴr$ QK! E(kU#c z f2fNѱ3`h(%N'yah ̶d09|b#QBXZ4&x‡Vt{G3Qy.κ@}( wc sz꺚XB$ پAe+'6@ Vu;n{̼E:"d.@*W#1_O?21t}+x`lƁ0Ř\:1߳GT.Wj~*gNKYS d1o/݇L)Q$ƸH@ 蟴;KJ6[4[*T]>šڋ*ͅ蜮7D.du`Ad1;-x"iK gN7 pOV?΢֖Gc;TfEAڦ&ꮵ~9 tw,\h,.Hd{p~7:`#gܾ~3=:r-)l78ǧX0K\7fL;\[ E'a9b+կ7:x|}9հjjB?d\'1o y\'!_OU[T잤 Oԛ =nn{Jc.*  Tt5*H5]fsV]-Mqj43z<'r +_Iv)\ĩNy6#ViPw:;Hb1PY9ůC_[(>,Юlna7gIO& A+\C\sQS]#jLFs֜DxoJ8$ZGҗ\sV ENɦ|/pFB}?u{P_FoC!4P ׿9EH8p;۩nrU.q7cHևp_j:lBZ$[:4IjBh>]>㘼 x<03J,6o[X?:`JNxiiYʉ峲9ڵ(A4&4b^ut.Zmj/1gkGړ{!RUa2np<P2\ 8QsOCvEE1'Jk~vYY-a#!֍R$5u$*U7!1;G t0 MV"LmR5EZtX?M' AHR4\@o#.= M~M:b]Sq31ۣ4>5@F^Nipm5'z|Wۚ->UF!-}?AZ(x*8|ykG+bzĐy4tSiZbW! >ԪvwUMMD!No cB!(F7TOelK9]* Bz"N#QGS/Dׂ9Yh8KX.)5 5THF"K>msO8cWQ½bwjFE)0ͽB:>0:E[-GH ! yp9%7<ߘ@[iOPθa 2brY6?vKãMS.ZZxwkUܥ /˲x}ޮͥj7q^xM"Y⒩ Hd2r=9:zcO=֜nmVjp˗m zKz gu9\E.mA,N_:jwuFM:+*/t1o2c f-KYh33[?F9?aSS籛}`"ӥzQzbsC,OZ0[ wE<л0 SX!+6-͸[Uʖ4N_Sm Q 9HmԻ=<pcT5"gNXnTmWs$MzOrc*Ϳ4}eRWxov/O-SHAG>#]ز"d-U|?`YhWm̀j{Ρ "QmeCq HKZWVP]X*n50Ϡ WN3>_ɸM vmsp=83:!(0/Ց ~>+WmTHR(cٕt`wnԬ.IJXJ48ECcs2{c]}7'x82mV -"̢`';;Pe&Q5VzXlYo54إVNƂ1`0 O5^1 0!*.v\,\E t!`=X6 k qp `sT* i1G;6bJ@%׌ Ze٢wj7:xQe[)}e)  FA5MG~05sGۇKrk&>ezawCзA"q؆t"s[_3z;CRQN4ۨ[Fo>~Rϡ4$W<7ZuB~7avQ!jW:PF 1٠XE)}k\SÛ,EzO`y./X%Tش^w[ ߒՔ\_떬Un1Rm#[,G, H\?pN${Gp9Tb0FKz:jAY}*8ʳM3-`X{3t=+5qcHvUk:Fty/S0Hmd &j]y0)Ia,sz9C>bozuq/P=Wߝd.L !:"=B-gSh/ Y{1ki*| ×F% 'V(R6E;Fd'.֗cNtU:CG쳺Ȭb‡ 20Z}8E]kO: ŜvHߓbN@rI!cӎ-. gw6X);;bwf< S~;ѢfՔŌӇ%QJ0 :F^t Lf}63v+9x# # Gu#0}b]ܼTP7{   +y~= *fhn&#DʱC4EHӝyxQ!!etU9O-t(l*h#1 ~?親ĉ>W2w1v]NQhCO#=da6U>aْrFeV̈w%eGs3"X͉vCuQ8c+2U5 4P" Pd:Cpd.Cpf71[@Oa}EL‡eβNlH3*& ?5z!/tQՌm;u ٳy#{L̤4# I?%*dzXd+eu<l{_b8B47cQ35H͠^sc*m0:prfF+ӿSq*H3j,+^n\or2͇* ^ǍG3m:,1 P%!_+(zbf&l  1ŹC*&a (r~cpH~T|5#0a.4$f/V>+d8E-JFWUJa@Yɍ̷U+-:|LN T 0.wg񒮜Z!b >dgL_se+mĹOE|H?Ly:ύLxʼ-,D %.?'Ʉ)F7yR@`Щ;韯}&%#H+pL>t_1y<~ҿ6djc~mרܤ8A E ®)GΝӤ9N9y-㥼g[^sK!"wKHb򕈓l/\%Z+JGt ` 2 z,FRIK4KBZa]"{7op5́B`yWlkAƎx:bImsJwȭ:"եɮj&wK7j]OVU8A3\+1A &u c7tY4E}\4hȱl";;}F`b mdÛ`ٙE^T>@~C[# Js02Έ8d~0p_ $=UDtg<0c#צ{G`4 qKN]ސrJGӥ L`AW'树#C(}KZٲ{Bqmc#PIMޒh 1_'9O5D' 1@=MQҭ-o>7:!N=s#E/)LZ '?jOw:4IL%gNJ%#bZ`a3'{Ǯ{sĘ˾+mm_U ƯqGŊ`*d-v=%̫3Ao?ӹ4 ΆM!>S`[2WKf7k" 3ObM* t`3I.5l 4PaL6wM]`y`#> TLЂKAê E,AGmXܽ6 MuQ񲐊moJ)]/mb?R@]3g"ѹ,TFd)r.KhZ\q7>WJ8(.|X? 8އ$#{n-r4Cʵ=>/)CDű@t:%D=]Y8!:$eHB6hzl`H.: /UzV&&oahY-!4eAQԠzyL j%bM2ijiOkz*J3u^8|L z7qtm0!å,ԉZL]2\?Ԯu MlrV%2Ѝ L̳y?"lF+M#6ѫME N*b=I{L&+,쫄ڶ*H wa| i?+d cUĚW# ${1gƳb8\rD&;yIܲGO2ns3mI4'!AvbklfK,0,'^ > ŒL]7$] t/48N;"O8Cձ2ZGlnL yأi=%zK)FhFK6Gʮb7?Ykp62ljo-y" ŝ9CoHDqɭ?g$ϐS~f} ! Z`F&}S#]uӄ" T>m - ?Jȗ1967}bxEOWDYO˓B0t "YX01/! v!Jpe*MlV~[27}LEg 0g'])0&z[ (Y$5? Nsql1YցJ#`8)4vF66ej.n1S!k -K@ V[Ue q϶#r>mH A{Tz5!M(!(TDppHvGbܿ}$\`(eMIbr^ޢ30Є3'R{9>P8[YD$֒U>̓ 3ޮ/Z?ފHr]/rJլyA˶ _?Z'0EAP&3 5=$^'"0Tz_ Ba rWTm^̸S$aKUF~ueoc1/25EuC=sYlnqlj!85U &Yh}.ܝJ?)?=0=WiC'=N3l(EK:uh.ƞ/Nr=$#=7VXDx ɥ!F½bm XmJkMSg_r_6 kTe{h '_}'yaߪvmK^ TcH QgNIVນ]. 2:[ч#@E[vRcl-:J2 F/- j†/dsLdea+ ӸՖW٭SN**#;b1F{(: ; zl~)BRĀ&_>;&pB o =%` )t I/ h}J"ݦlV\_ZmS}f$mjQZ,>mIE:\n|7脨{8jdUj֐INiV+N7~d0BCjai QZ/*b!PUkt1pyFm~MA-CE^N%@ǃ&.܏DlT SD[`%{ D^@!( u1SV r1ϒ"$H3`J͂n_X4dr\bF!5K*IGX'egmJ 3pM22*RiN#P 2Ͽ !dc4dJhIbLMmcg|HV.9˪o5Eعԇ APZx,owrr)&+gۛ?I0-bNV\1(k^C@A"<~q+дi_(xXgVyΥEƃ'EZ> 92ऺ0Un,"7`@d%k\"Cw@;G.{O#F=ko\a;fK8\ |4bUn}.Dۖ~\,oW ?K< lՙ!Gׯ$"IJ3$QljT:VFs/<O@3=<|\(-% у>EO:NLjJrwdvǼMA߼qo@H,(ORœ5&Z($*C&Q 6뉞=*uގ. (khJW9Mw2`7[ u0JO7 iCbBc^(~@c2$Fy 'WV`ê3,, ǹUoh"m\kf< +ʏyT/dAoW̲m1H/H}FKK[4#⸡fӭT9GllpĮiT } 37h> M!" `|Ypп_!Ah]ޞitv_{3N56:#בvu[)4(㑸'hYHu}sH&K!{Y)2B`\ĺo#I<(wC{u\/fRqeJϠ:2b2` ioִbK>nݨ@Ӽ_I| IJ][iH>%9qao7 gI ++l sBl*cB궲57LOI龗2gqEu(ܾ#LqgdL@ux&D@m:D,г ӌ5&bJ%m#(M]} JΣ$z.?Sc-6$Tr @,B"{yQ|^%B+%PC40j]sx42^dxj bRH:AO 4*6`5,W]Z"Al V'1P 3| Q5+Z9s@*W-e.h&m>牤Bo4_%s%($b-#eM!E4.h`C6܌9} ,Ӆ^moJӰV BFD Wux(:qb*2ߤ30ueZYY8㨷]P[pFES13ysƀEicR_:;{ˆdWvoh~= {j]0KPKS#! JV%އ{ @OB˲yb{k/wxxqSi/xP*Z>$ %hF~ TvEA_<SΆ kWiR S7U"Dݯ s_)֎ _f7sI"CWe_d^lQ!tq6{ \ \_.Y#hy]|*whF~zm*tE|Q4w u2\,Q e+'xC TwL2&ŗ >Z^]svU \yO Y&D(p8ጼUGA .D K\nIU F; {>Y\mAK_!TbcMJY>n`M,ѕRpՂ)[BuIҘ 2!upIyu\$xTϡ"4HmlpzRޚ$mTkGXr(}QEtō'0( >>%5pL> @tND$qw=D<]t{`M\ cR Iyي^-*)꒚/e$_7P@+fmKk]KJ.Q(H_En\.:C8ORrKقG7냃I|FE sq#]֫'jHqۯ̔U?pA]\ Y LOĥm0WnMӫ2OToBkih-H)oX9B:ԅ_V{)!#W **?U>-g\VAľU4)n<@j2QXA!Mtr$jbƽ2%’9rɇ#m3{-I_ Mx8E3V\z W*.'cJNnd~ J#+ BМU!ekOء,VW%N{qC Eqy7\xE~` Ҷ!׮ƨR]yR~7t%wTh4~&<VkݺŮV/sUM\*>y)w\r`3mҫ9ߙbdC5`#iMh(/6 *i[{Oց]}0Bi-fn\`_ajbw{,<Ɵe{ 13'j=,U> >ci)r$M0,N2>QTwgACRi9N'y( HQizS )Z\e۰.Ml B[ytYrɺߓGV!:S_-a./ǫ9A g`MX$fvVT$ A8з~@m !b[~`i+.&X'3sk<zum˻Xͮ& 2u- >.IRF#_lg`"ռӿ@8ڨ&sSh `\=xQOݿ-Y!#w$Y_f/6”<֮-̊grh{gG;fnt^+c#G8웶MW`y8I{!DdXw!Ǿe}H ٣U–m}eáW܏ngԱ\t~V#)P+FX6z\\~ Silsn࿡)+ ġbHHF#ʿp{׾ Ŕ~n5eyRa c#nÒ}}v4g0jvjCǏ]k,WP[1A^J!&fYE,fɊ[Ii窰SH~uNԣcG≧ lZ7!(}f@=/]=X E7A-2px*73<':nC" asBT `%nr[gT3YL. "Mb H4G=^|iKP*ݢuu`6jhn>-UU×xf\_:#U=+!y #q2h5U;Y(Jť:{ƃ>7;ChѺE͹֨EPqg*Bۏc>Q c.בY3٥ (7>6p7~ SZUTU_lxd2Hwp@ͱhBt_|d(HqZ$Yf PP}+AۀH-yeK5+cs=\,"%6ߚ2}i>vꔅ A#Q̻tH4⼠ 2XoFn 5:M'p;Φ''.CزԍpjK;,P~jǙQ *90|gK{krZ/*3{jTU2ӫH4<ɻS?{3HȬ^_*Tg iވÝVI\(4Vgف_Nxh 6?cB>!habPbak[rOAq/d˚z ˖R>Ԧ=^+SaTLBV$7/NĞ,j.=3bG C^– e4cDG_cA~E:IE)p\%Q#8QJ59L`RdV纱DZ4RD3~EDtzWAMɒwdl[jW3,ÈWfY@2eHbxE?\:c' =$]4 >ʆ\b{9ٓutVFk[EcuQYn /&oZVS Mx8OSs!p%0W37?"@R`l&c ~M6/O' Ij]5[6̎w"%x&UI8RŖ%"{P` ;n= /I g0BC۶[,!N*KFZ4{@cVO^'$~|cau/ v@8IJd.l69 Jv9^ Bo#\KCH0>{ȴU$B jT18@%w:MtfxD^zȗ2;mZCG 8-™QMjോ:yTp~X1PDN(5/$~-a{6d:_FB\oAbFUpZ58t`6Y,1ư6|Ht*泊 ǂ:0gC#Ov$V>sLѰ& !Fa#li_pNwgѬ\ J G!CG*`Ҽ^$k pG/>(w*>hC͈(1 իO?t@TNaF^@jԻ)LItIH]D'h.Б3a"Yw)q3ѥtUArymXJq@mŸ@''V:^ga{NffvDUsXAG6C!V"_$%&F"22k\^ND-yGxœEhf'tªֹ|>{ eMdGX(XS4Sc:[=aNǦyHծ@0:&u:Lslx4sю1riDailj0#ݤ"Gc&z`ͳ̉5y|UXJCѓ:Sf>|gɚašeʋv¯\e&Bc4U%;}ĩRI~`-tivRJ5$thW?#4S̝ 6#s*o\Zq{Ƙ̖c#\Bgڬ8+d]!pҴ$B]J{ffm.©F,kD,\ xrWl%љӇ32;yMEzGe#޾6nK{ 5.fE~p̶kG@PK0(*?<}oaZĚڮ%]Fcڔ#2M8F"<ږsX/D/R>QRx97GӢ}Jo'l)]gM ЏBc)c .By &{y,ּvk'gRFNX$}^U(Q }R! ]"B697] )NF)^r8} 1WSYQ`Ov+WO7,Su71q]4!O%e ED  $l (S J ƽ~y;T-:oaIZཁ^tq5X8׺󾂭xGruХ Rp1\4 دNVC L*IQ:LdU6 "_Y_Cnj$^֍KÈzӐP='6< 7RqBſPPD@Su? ~^nlҟ-G =t0LCLw7h(wP zk]Xh yhusP=dƿ*ĸEX8h(?O}Ļ7NAx>6XVL,H~,LCߥԭd-TZv^JMyx9c1PkIo"C{J}ٝVDو ]gB7~lЇT$IIߥTC?HO^hIOiծl031lQT-%5!jNjX:7Y m;t!oJa. t˛K <ӃN0@]f 1K}7D*TyE)C̵&.8܉I7}M4P/oN0z b2 X;ɞsKAdf>_lq__ٓ±c uSQVc,Ub‰Һ!-"K/Ȃ2KP0|"Σ 9󄬨0Y6ǸTN HȾᶶ^8bZ%$#r36HP=&3Z [XdIG)2LXݩA'x.;q.xB,h3 jb+E7={f,zp8k~eoiƩ`RHhLz͐<Ȗ+xG7WGbo$2|fϷ%"'&#$ϸӬï1uG< ܄?"T.Cq6HηN`U~*Z>C̈́ ]D}Γ/\sZP }i> *-$r٣84dQ,滬W. LKDVAdG St @F{\S/`l"mڵzڊ鉹"LWn%`Jfy[R0 lͲuf'5$"fVI][)m7bFx7)$䖷ҳ/Bi3 %;5~v<Ǚ q3w絛K- hkK B» IL|]6=MoG`gz6׍ZUR(Pe@, ;Mv'*lBx|Z3\"* BzLSts8)L)-SgPr_n[Om\}FРIbMfRԬ _;S|@Cg冎|0"}7 w[ :ixGGkmQ3>xTT6֔~hY00bs\n%SmJL6mؐΖy{dd"q)1y l_Ywk6Rk'Nvmn~J!il(lv"6:&7I)m!ÑiH#ݹ[+JM!shLHŸ63rIb/1_c?v«y$l]8؇k`<[@&79)~@"BS2-kҙŅazC.֬4A~N>JPR+aDئn f܉9~J )h@wu3֥qϱE!%# Vk>F>taQ22SN8v=LtV_'4pt_ԍΦ=~ܐl?_ QCǧD s%c۝R* '.2́ͨydO'۝*753#XSIz kՠ>efJX:jgMGfvRSԲ#85\jbx08dfV(Y* c=Z28~m ڍX*o1≏Bi2g|ܬ)#t j 2 yMTvL-5gufNW*1AF2}$xL\NXj?fugkZ;2FӂDބ uL!Sf5XʛizvDlEovbΝkD82vfr9.@'Xe$P*,͑Ki\U9|amg7 A:dx-O-XH .@1Lj~q6,#l;&8V씚p]'-|mJZ dMei'Y02*e#\A{ap'Gd;{WZckLV_ݽ~*?/ _i!YD-^%c 95$΢VB7(ʿFӯ|R^-6LJStپs58]>aU0S+fܘ.ci>A^h{M&PG23SYee*^E6@D [X^?nћ3p\L# ;3NCMG.m$ϼb0ɨ *B )94ڤJE(\M'ؘ%4QrrfW11L{`'򈛃G*7kM1Jh7rHiFocI,?؏n,x>m@I?f:Wg >\/ Vjšze`',C5&7PjaB՝i+>;J^N@rNӉ*+Sni1W4H<<dx4B]ߒ,9B7*0`"Dcrn-$f1LړfKZ$2K{~񒣻̸^3w I'% 2 uMɩ=.2<ʨu)^bs%c.ƹ7W,8r0p?K>Wc, Q,*cXi|ƾwgHz-r7|"Da#({t^§^hp#/cN'RWŅi !\ B4îF>U:k5T:nݯQNӘz!+<@U=M7$ ?򥈁Q&naUxtRt\׍7̆ejp!8F@)#ޓ◑p1ŗg= 14mEJ t<2h/TɊ鎆 e87Nys|>v7)tMrZ $jm hWX% SK0ŷ% Z:Q6mj?ʛψǖ?$>LF!,nݨ&Yҝ6,2͒_8PqO~zMDȁX(zП7ԳR9 *Y-=ih_ WU0M~biatJM@iG/ԕ CDv8Cdx>IҕMb5 M&=a#5 $`uqr$m$S]"mh"71"bs鉦r0.̍W0<MBhc(?YzAuxߟ@9{L'?껱I,tw *kR,D :GQlthݡmO ef gTjcr|L0Y,(@C_zy+܁h,;trxPcyc$qWqY MHUIHUǰO]eBqf%WoaJP&ѹVBJz( =d⸅nw̻C뷎h5yBVޢ\%.7kӓ{'^8]k\ּ61#WTT%UGAg:^S<=.jX̘-[bȳmt"2k'Tl Jn'V#98d#hS.{+PaB( 7i0ȂeQ" bxᯰ&ۂ-Jf'4i(@ Լx<'*츠pR Q;1*{@j_xkNmxeDn-ӰR2N+OEy4PN:0͔Q6AL:X)9T 8q+m ]A\? ]%#.u5/ֲJ9JM@a0}$0᫓[H֢SniimsM“.ނ\LEb8[QfZ?d TD.N0i ϧ"cuq Fuz٥G]wdx(8k:T79,ziuq.~Lj`!Ql ^i)Ƚ _֊!~6WZ Tr%)e+XS<8[,a`Lϳp.;,w1IQ1yt~@]awR'G5GCZf?zKDD%Bv=,&;Oo-|NX%ifkAW_IZ 3B'ӣ}YjvpW=R:-aۍ[zhx!Y=2-Hͩ=,TJH_?Tj+ B3#.Һ[]3Ox4:b ؞ޕᡔň̛K[EOxsʃpUxm\y-W# &Ϗ hgu[cgxB^ h; ؐW?!O_{ {go M=S3`H ybmMd3%[cs/`%`ZYPq{ֹ20k9>oB{Z^43IJQoM]o,WH%KXP'ѓaRxI5g\^nL')L8-a{.{h$9ttپ&wB]Aދ~T"% *2RFY d1ap`0pl9UCRYԶ'%wx!]m;E"S'n8{`\i.nWt 2xdt4%4S({RPff?Ӷ2<1{t ʬwf8kO J4*k6/<-WAay9hUB +&{R 7uri.0L 85h$*2]`:Ha{k|L [%1|zP,Vq;8ߓpbNw!x>V=-$Nm#szpJʌ1gRDljt-^b;mOkiiD3F m#|w۲s蟗!i7@О̞,Z>:%`,+yL|z%)hL:>Voė˞:_XG1_ UvF*F$&.M) yT{§xIQ,"/(Gs.&qu>TE Jn+?[;V/H˱5m9i fhd R=|6Yax؛{+'@ϰZPHdY:n KQdk}}#jjCwqR +^r>GzPYh% ~vl.6[ E"<}Mݖ?|к />;)y{~6;Rк+6#v_ʳ~5,uQDfQ 6 U H$cE.y E~P%8֛q`|p,ß\tZȄh}(T әety*E EFO4(S&'wp2;rT0as&Se /ÿwF|E mxh 7UKƥibk0hO$dWt˨$>4oXP4OQ}6tL7^0'✥] \e&یaPzd[mXj& r۱/cmE`ߍp'OǡO>2[؅'Z8TRe:{=*=kE{im{>#_B:ֽ1Eh{x`si׺}#e !7NZ-s7ZҺڛt8ڠ<\rۇT>D2yNQ"Pl1qtd1 mtZlcdU't)K>SwWdNy{/ƌ4tb^h (>?ݺ|YX,@9\9HV.DC/Әe)#t^x~0۬@#GFzpw=sۨ'w` oS;̞<> Q\hWw(skAK4Ŧl& xCBS9+"(5qvq)-c˪O:aLt&eSBr>K.HQu7){=±XDO>!ӕ4)Is2@7؅"X g (t5jD '?XƮrn6EOqugr? tQ,MTEC0= As}{x'fTM:p 8`|44n6'7|,m/B;ė}@0ڟ [o 9➚-̞ %YcLٖC3[(ĺ թnUҌ17w=wU\ѵ^Q'$QhavH?Ck+$9^I[K'd>BĆ:Z8EVP:‰.&/:N6:mZHƜVh Կ]dzRm*fq2[<b nMwI>3l X@e7bȮ"+| vd%[ͱ/zu^)?UyUvWX_#>NOa.:7Q<|FQ㑑O)v1BU tY0r+qIzT^k]8So>ymNG:I>m͓F+ph3ɽYʯ)%bT>) ҭO %Ń=:$.{_^(jڹߩJE~b'L; Ԧ>%SFm-n{J?=YtQVGjhgOwP_1dt4_-DO4k~/Y`/9"Re;iT(҃]\ â6-:/}xGH&y~T5".+wXh={g=wiqj9ujxx*XN{Vʙ=VB\$1.CachP)V!WAE)ԧ/gyBe?^?,K8ST)k{y+ Xg/.NV>uZ~P4 HFUX"_h;2=Z?K*쭝G}e`_Lȝ:nB%yjg'\j?79.B5"/:jܧ^tʼnDiaC:Nexg[zX@ܰlEUGgh8wvw %Ύ8ӽiKy>Ɠ~=. 0][M1{fWq|3](*n)gr@zHbl7'r7dpOVs'Th)A a U]im[lJH.p9J- }̉GluA՚Bm[*]%<frD@?'ywJ F+#^mª6 c,8(E{ݸMoi'`,a$a'AAAZgQVTqI Heߋr{Jo>.f~5/3jطnW^U)]7Ź+%zB,Kvx޵g> $SAP?p@NWou9[P#$Hk_ ScrP*30lf]Bh_ ۖT#B;n49! )8r|JNweVy[Ē/'Av FN~bO\@@E se+TO͵pC$&|2Էg4,FΤKy'\btV18<}tIZ*;)7}H(dN#hvj l>%*?~'>5[;p$|oj'k}W!d %/YJZ2,?%.n8ϳ T0ٰĻҤu/miBէX& V(UF]k4Jɪ}Hn%K!MfJG{FSlh\8`T% y=әsw 7wX^⁄`0Yk)۳P?d~ژsm+_FEă HXȮezOxکZF''3am_qŠծQ_hg bXJ~>dlٗu Mwi=Wr"}GvTgj@¦ #Q ^/KP.xi~ž4g@}%/&|/\\@i>]#+5trrϹT ɷC3gSF3k<'+~6Px8dmHJ lAhP'AÛyUO/I2qMO@j8'A&Jĺ;jz~&roi]caWx\dq?UW$? H%E*sWI|^YVr#ң`нj9"|̰f~lCztK]]")Nql/+|=6I.91]pdA,mYΪOeKXa(iWr$P[%=xx8iK&/R-S и{DOj/0|ZZ@ɸHe їjGb4;o8tXяX_Ȗiᆖ愓 s X3bFC쩚g(q~WSvOQkd9/!]SO\d_%ӊ EI̔hJ8pzu!1w<ۚZR\MpUrE"?yBXBFH(+K톹'# *<).w5VeP)&xBiXM K}L/#rp=Nݼc .$ ÉFm,-!H #jDvDB\gTZ7Ŀ78w rǭ~(QAp l0L{ L&%< [0W݉O2IqtopD$Дbv<)-Xg$TZ O%=Z(n.BI9:V] ?vOqV taqzZeLm] UcŒw=k?uf3LD1e֣PEUt|\mSG˗wIM0~_&AKGs:_cL3\Xhfw] VvFt@sI&,t̹1?fSH%hup d-±o96b{J%nvܥ#PaGMuT'!{y&v~aY3ue/Hot0`9LquyrXǫhZm{l8SJ"jBҳ.#`:ad6@-`' i0BwK'7U >j}iMsI\-ML$~x*(/V9tg2U'RT#!S,yGa.0 fрs?K[‚uWb{SOI,pbc%]Kx Lvٍe;.SܑQԶ-G`Yl_ak04Wd]Ѹ! ՆJP[3;+(ISu-1L;M?E9~$G[Vq+(ŒMײ0&fKw*5gN͏Z!jtZݘ7R6vI\a54XԌ@ڑקOv1s %iLo2ttm#ɇT:}z' 3&{QJ|H'uKLt(šv/[^,EAV`=ʜDNWh9(,G1+7@rTS?aܺud9? ;\7fzxQ U\,>lO]^hQxjxk̐S"e1my\j"<7gb0F1cܯRݢ`@#\ýNZ\-܆ =Zt-09N[R+ó@7]D>֚hfx}2E8g9]XYSo-|T![xmgA1n㘼=$eÝI",\B`n?YG̍"0O1պ.l ts%sqRȺ~o9L3)h)k#ࠁy<]- W©$bбtw;t&tЩ,vhvrŝɪB^IR+۠AFj!d}Y趁$pdrzN銜0Q4P|On"$ͨz,eVocwD 3ͫbU|Z:VYZ"I֪L.gf%ywi<,t~Ɇ{R29w xkU7tƒtѱGHv'?Dq FYU"9DTLxuЖ 3zJԞ>𘒧| % !*3h k}R2UO W7^L3'Q-C]~%(jRG߁MH$*JkQ_k<"Ea>+ʣ9 ` !SvQ=R6V{$ uͿ?A: d8^YP M cZ ]l]OC/tb,הy7_Y)׮~ϫl(].[elj?2Xڗ'в(PC K`oh=ΦfywMDpտHAD \V"E%@=Y"/Ep˞ev,w_1X o cNDa܇PvU;:_oyOb+ w#7=4ff6R 7/FjP*퐛3Bo$eg!(J]fKUů}j. yw)U&Y2Beѣ`eڡTv={iQ>bxtaʅsS擶_F#ڊ@anBQSqbEc:2/ϱD{ q;r&o Q֔?! G-5ZX^~p0-Uvv$&p-jdj-ͯq_3HOd²R<;df.Gc$V86G#;bԭ<4~0!gm|)⺢EӢc!AZt$ MZO:"ߞ+XXRl+KewEq< oP]p JxM#jj& I@i' ^J'S07{D2Zq͋ 4Oz`1o_c޻Ȱͺ#RN1R2}" ڭ'ؾ .,Pcz>k]_Ǖxdlz"^~&[Oq釅<&jp'a#:,{6РP9ў{dO~{|Fh:ɬ.+lD@#Agx~sbQgɖfFKp&Bm7ʙ  BH3uF_Iv)?Pnf1 _UY&9Q&u8UQ/4qy"bedO^f` @ pR+~?XԉlRVJ3,QOAU{-u8 t>> m-FןVFWO`hLƇ U֑XE莱>AE|Àߡ U 2 a[$H []yFqqϖ: ki.k?s :q^V?;`ţ2n Qm&+ 7SiIY:Wb(̓0ѥ_BEnKdP(v;_3'b|ELj[JreD}h'e`o(%+2,߸m-mXؙ Of gN}^w~Aax,AKG&a1p#+p;J(ʯE4*[".˓ؕ|(UMB8Ɇ +`E0KPC4<ڵJ^Dcr,t#Pt63,`QUnC =q = Hn[>%gqyt@2VzV]F'הX}H9tJu"]AFdM,Jj2q܏E֕B ڳITl|p"Ul>Uʬ iohO,NtαǽJ}lh fӜ܅.MU(V{GH [ֲr`4&&>R0):vt dD'm>Lpn M9C2;{ KDP3 ,)P{)\d-nqo5ni[;eH2;64$1JVBMf gu"\#*j(cCj^sb5/WwS-z*^w*Qk`47d"'Vt@ $ e${;=ц=k݌*I$/i!LPf` 6-u7Hyn x6ի)###;2:-'54wK| W2ЧعS\SߠݚFF!jFtAq.!;^+ѮuNZ:rzO' 2L O'20 м*4!W0'' {bO et.{{K^ b؉W{dmB@3?4;,2^Zͧ y!u9%`7"@ãOy61Ȍz{<+%Y(WZ?Y &[ôdIyVDh])~$t,~C6ksy~aŠ/@@n:A bJ1\̮=qb~iOq>b\$L j\/Qh_7H W )+;ZRe5^l1BH8dz94qyV/#&oю젨RH? ?;Ot͟)|PN `r} qZ '4t, y/tiVt252Z:=~uq A ^=s.)crix4ʕW ~ a6M\s6 cQs` [dr#J4U"oVX- fwWԆ7L2]==l@}?K@hx  W]p\2a5̝TH&f+iL7wPIe1xNbۤ-L=dpnrB8#R&{jj|:8/3JH)4+R,!$ܜvvhL1m1-Ȁ;]rb'}or1J~qjU,j/;AX aĬ[ޚr"ժq @k@*ֽvoԺMj3P`fٚ?͒2ѡIx~#0*)UxlJu:j٥bHG;ل@YO F8UջB9ٙ@1#6>Thݺp7dith?}T\^&A)[ [S:bL[}JO^ LpI.Hy\69Agr:/R>cs|L1sT_EaQDxp1d4N3 KI^MEӴ4!v8 Uh7BJ<o?4bxt샇lfޣs7j;bA7SF~`7&PnA_Kqw-w zQpn-9eŤ 1oM%XIMI sL>^:҆͘tUIwNl.K0t8Wj=pEx.:N3H(pk.2v qf_^{DEC}V0Hl5jL띗Y6(XgMp ު*O1nGhPE"6Vd Q*%&TQ&1_s_×8l?CqxŁrԂmBIqD}1([|{.νC5+GŻVzM09SQ*:A,u|"A&F*1qUo ">c?0sߒ;eҷ@KI\;(r B qomGO4%L!M?S4?048迎?""GhM-8ghfXPkކ%7"Gh`zy#B .\g͜㯡.`+ڮc$6c^d=ZUÈr̻#23T4&,KO^fXabvsiFuJq.:Y)/R\{ߧEeXSxwJnMW)[MlX F9([~*7H@7: t >vyZT"&v o6dE:L9ulg #:6KQ ܨYQu~*FlMHU(dRO IM]͘? t+7/ wBTSjX2!gHb'?0yEBi8ZuXlՓ!#$ĭl 韢/,)gSjs=~e\hXMb ̲kG3rlg)1]) 3W| -Qb쒶?Eq#pğTDL@a~0mdD` Z쫨d&ӭa,>gg&dԷq{^$yԈyS8/^ DT`U,w+־L娉OoaEؼqhKy#)Y`eQzj!QzLsNf#RÊRڧe;(.厽u]9)B)+/Csgj0:40].[o4>\O`u4$ErT8M^h8|pđгt 9tT&9>׭FUN%'r~Ic1$ejNoNZ#gVtwYsc3b{Ra,Nwm> 3$f_` \i/7T~S1(劼sxF[j1h}z.z2!GNF@$ne: ##Quʱ /՟If( St5hM647-;*a熸:oK:iEKMaxΨ^gۃ|O$!*77PqGi5`ޱ܇/%7Cu9Y%b^:oI.ä{G:T ÖCLtaҽs5{7¾ԂS0uX5GuHFqa?Ḵ8ub>E[K`g~,Z0`B!TeQbon\g53#>f- +4fULsx7m^8};w:t&Nj]aNSGnik#^Z [ÛeL䟚%~٫s&,}@j.Kxroq)Zf״֩/3,ɤ;4Atl \v:ȑݼqEYlS1Y K(R25!a+6I+O^<8Đ*R)}EqsX{NqOiKJp Be']k&LEjƜ4k};o ZAfGʵV&p}~2{sF}sVAKi%ĈcVgnnoPx NQ*G tY$,vwA0֜gKTw;#hsRPP4ZcaSuwr2^|wj8sh8&Iذ)z}QEKhE=x-΄ڻ ƞPfHO&FY`댑xkzΌR&M] ʗQ><GA m, hW}+/]4.PƧրTq`ʸE5ҕ\5^tF3 /2g7S?-{ _drDehDr .`r @c~.c,9/_G{(A'QHwk>tV Q/~N?P/,"QvA! M%EƢnkUϯ{T%8{ Qoԕl.nd&vJ0,:~P9s$}!TUL>13"D޾ C(hf,𒽇;M-3aI)x$&(.<>8WȳW",7bzxtA)sKd&/Fh ]3wNu`L TNl vg}MT<,Ns*"thĽb>6_D:( ^KͺmT?g P"ȎZLkGQ{ ,o`2oqZ8>*9}M*!òo^ M+yOsj\!K!bB)VHL'%g4rAqʧoA$Dј?TZ"v!ND;B.Yҵ{׫OBݜv>wʤCιefwhILJoKM9۠fn 6cy\^f%\%W۰VχCSVQo-h]_fj3<1]Xhi$Qx5?JC][14MϯO6"|YZD ^C)TjŖ!ܸpct=n ޟnvI=Ckn`h?R݌f=8W^G0cah^q!GHr*_Z2RmkN#+BʪuV5LLNN*_0\-t `$Y|JV$UTXi C: 8^ҵĝUzb9 )o7 h=Nλa;Y,"O3jۼPU&˹UE:ʢ)MEJck gd࿣,g]~M$Uݓ3Y&Cg0oً0F~O>M:Wp4DlwiW݁O5nHaQnBi28I|v0ڄ@iR& 13AʕBDZ~E Ddo dq(@yA߈M4Xn1HNYs</(buEPv&{LZ"ف$Ou @ Oݱic^Z 1c+J2D  jZq -Zo&2(|BA)m m'E$1,=)VVoD{ #` XE"kgǝXQ56̙%=(HgJr%2'5x5A>`, ST2y.7<9=!LaZa[#XL[Y y_=B֡8Cz_eQKy'u.γNoǢO͇BWyΦZ.!4F7ʓ#u! Zn_l;8:K 3ac-ċ+(FLH+Tg"&\fM 0!5I%{_L22W-v9\֒_`aЌI"uXv<8ЋsDDuᜌDe@@ +I_VWu}؏c/K0^eeu&tŒz`34zq=> XVάXPS1jt"Aje1@g$Z W*.yh^6FT QP/6f8˫lZ11'ITBDMΈ#j.E[UH?B5AC&/Og>u_p\(74mHZ?ӬGDmN1 PtS"uy-{ (oIMQ 3܉7xA'FaW=l!ӣ) ~ t:tseSf%Kq#Ķ9v8T9="ڱ_r)?gP V O0(|h1㮋-d yPA H @{u0k[N"uO;>RE~6 |ʥ?m}Yu~>T,|;6s~6KE3++nGJUM!)᪂5<}4ECS$Г{'"!axI[!$D86^O/xFTnw~8Ju LHKudb"|*s?jmb>\ N\W_N*< ;wH}LRFyd|ĺ>/eEBȎTч2y39[#Nu O\6Nڈ#9N-@--z&1}ŷ%a Ya|s`Uhx@T JxL+iy ] 3i൶Mc_ sdי}wP3&٧er<Ɛt>TO-Ħ鿚 ~}ʿYa%6f(xI1(f .p'*UX%:9xkve |ۿQ8f7i/`莖u["5bL 0r9&]mgi"|o\M*a⺙ew;T:S {}m`3ty] {h5,u [~ ~"HZUy75|% `(8nQ{ޟtDaӤU.UP~j{9S1Pj̬~j:%@ֳeSR4-NI|3j\FFK|ghן B!WMs>8[EW yKچ!,aQQHr^acmjUwp)nŠm!ǿ$EmZtwgVp|үsͮr27nn|H{75tpNϒ_ E Ww*XQrB$Ӝ]>c/6^Pa4yb=sFݘ$sW'VDЭEGϧ5VY`M#{Dk!uˉ2YV %j哝aE֏Vc ̯NTG .o`fr(O$JfF~؉0HC[s8Ɔa1DP!XQ'oHdO䷛ &Dj/w= %h 1R1:3?s&cϠ;/ex@KNq;4o$~HT5f~P4R)d)x(H=]d+e:&V,g/OƿTGѲ9ՙGVg|h4>dꚦA B̖VmLG;n](a|-*u=.Q]EO]+ut2  d[>e2= pLQOW|FM÷›7R3F\PU]H=MCQ W1eWU 1='-"ytw;#Q*Y)P@3 ʎې۪Y[t[QS_@O~+{Eee{85gCh"IqTG{T1DwApgs/61V*g6o;7P?P&x1ʗQqFv/휠NALK;+PăsTLtMF>$dZ4VEL/A 75M$_>]0>ʆJH+ܿ+W7rC,Qo yVKT+tc`KA{Zc*>>9Nȃx0ْfcfKO<r nue+ia7f0]3tSʯW d3{(rG&J^_;F^1l5WKIi0U%gWڷS 8-1ppF$Ը@N^66Ralb=onR5vpOʢmpy__amu^>m+C^̀u0M"p D>M_-"sw>:Ɵ{c@GO^'|Tn7||-*ڗ^_c8K]MFK-: ZP;^N bTM"`ڨX`q lIQ2l4+[`u@1.K@ːZKo=Gz7)0+f ':yڛBN^.~Sf-yJqpkpNYd M2fcK`7'QGvz&+Od~`V,;QZoD喱:h3%$Ȧ?T7/@Q ȍ-9Y܄hId .&)rF!4>v ,~S[ߊd?&Ws*p'{W3;3Xx!>PǚO.kϺM>eRNZEyyrżo@@ ІAܖݼSG m.͈JIl#k0:ݭ$lEv7 8U \O*j{AkwP~ QI6&Q>M6z:Uǣm< r~NnKF30[tj6 xAZƱv} g=HI0oVa%dSR%US~sͻQ^ʚ3АT^JR.DCE‹C~g3藓=UJe #YP9aC@7.h(ޟ*gl|f>(}+b]1-Weh(KcM0K6$<D.cWS@;p8kZUQ qPܚrk(XK0;-xcbT04Z^lIV@n+T_tߕf79#{xoҪO' nK> ȫ :'YFt-mDL " ~w͕O~˒q^R0É6:u94Ih~ .5GfR%܂k/1Q+ G{1Z <$=O]%?*}'Tķ]YL [n#Ћ'aO,lh~6vgG1@&{ !~W x=4v0="5@ZIp@9Z{ž&<]r߀jz z dTݘ4NRئadk7FtO-?DZdm+~0 FU=@ZmǶk{U? <.:a%yVQ:('5txmj!x `!zx`%U#FS0 4)!V3Tď%b,HCMRL+3e k0IU>uTa:y2?WfLLء@; Va< HjZָpr-zRw92u\:$DPV}x?@ĠH7TIpĢ܉y\q8F|;)#(]u =^'l45O6^Vʀ? o&46]%Ժ%rf{$g_?lFP7m í[R[L'\ Nv[E8 E{vE_h*&J7ĿxOL|eg1,ڊiLYs6Ҡ٫lc( Jd nI{ eTi_5N8R|6L<0SN~ j6ö&3MS]ZAԥ܊AӰt~fzb{kbjDhaĞ ZI6U>^48s +.bWe}B^{QqrUTC66'c`VtXPTo^y쨜}=L&1ᱨ,m>Zic,*!@tHJ}VD<Z!ٴԘz2r{Pc^X\[lLhGkǾeܯXIP%%lȯD?@RHZaS!TKh7lzF#(!ߴFkǣUtBtңs("SSRԲM(m-;rZΰ|b6s/I[yݗ.i AFz|Y(z_1m f,\~Yri |+?d/_zɎo[iA VH25@Q#?fY%n~u.u 7Gæ5LU pảĊv5p{%L&TNu6ՊWN]L4Y9〉ܖT&H D7 hܛsk#)fr]}V8`C"[<Q{-cVf8J;}4go)oB|A<}uꐟ&`CvREr9=4a7 XLfa@! yoDq: AnVCz9{.~ 'Dv |ae.kZd>s7SfS j!OtHKcz6̝0|\Y(#'Zwi**$m$FhX1irH,Z!=͚q99^q1>JM[W4UBu㧏=(i\=~ő [s }pT&O. %0Qn|g]x2a@)X nqU+fz(Z?ʗbeH%|.Dm2&|~&[C힐F -լ p7lV`swANz޿sH w Z."1HP_\N!b´Y#[dֹf\vnJަU|lOBb/Cf-(ƫ/v{Q@ , \ǫ*` ׯ˒Ryk;l%caঢ=>#KT;&SD[ r#"4ګ"Zv HBKKkS|'Sx2Fw/0OE:X+{axkY㾼B| HNCLoF$Q8|cu+yQ@ s}<]ph-\"5] L.o >NCk0[]`rC_nH%d3уΏDބJY%SXLgQ VcnW=H7"&[FclN0)4ڷixU 3f/u-UdglO%5uFY [[D dFbݣ> 9@*KD$(iXHb-ڐ*RZu2{ސk'/ R;.u8U$yibLI:qW_ x\@RO,DU;G_yOZO2_GAvy`(tH/'HpANlFN)2}SJ>Zt x^<*/F$S]| /s86E|9C=˵v?x=j#!:agh޹et)v4 .v(4oΛ,FGMT / Kg݈~奸IІMϫ@ ^V?Vc0%p匊nչ(_nƞJ ?cT̍ ZB9.Qb_*X`;mIڪwE̓p\o;F} w=U&Ϣ Uo h pEi [{0 ~ǃ*ИF1mᢩr0RaIH ~Ԁu0II@S:1O$?f*4P57#1WRdMh h_ܫ LbW槗8 |40Q1 _JMWDВ'c3 M80R%\ZAb߸7j;]= ŏynۖqrV_͙5 Ҥh>;5x7gXUX@0m+@lx!7Wv]:PU\=BnȘ PH'Pm u XcutKg= dX]װpe-mFi{!=&ڲʹ8+9/'#o<C_g' ٥Xx^ eLWY[lы( q0qun{_R[ H&v:z{J7e|UQ{o8 <\Ǚdd^ uf2C:#8&U!5m%ofDC` f𫹋 Ol(m*5m^,+/QZRFp$%R(}$\3 P0x;3Z ڢ;Ĵ~~o^ c ⥣ ]Cyw7sNN>1!f9&n+]7_KQ6TlCYOlOYG ^ݤpf:6:6] P2ecÍ^fH":=ERlJ'BLhtZ7,DH0J_z+[~mf5[iJID`1-sp{ibc"  $(Ӫݡrp?]CS\9͉t/x?r{VB9z}FZdz([IMJ 8ZhŐ%ٓ7/)!zj*:CC-,/=vG2)114Si/,aUE o%XJ7]a=t7Ԣn`gj,MRT>4Xg5gqqޚPE7 `_Z?R@l)_7 t.wEVf~ތ$*j 9Kϔ7@d;Uq!\D!OqM7(٤^P~Ğ4bB'{$5O;w^Oa 5>@bCgz8[xOpѻ/LNP;)DR>-%g5IGp8JZEWװolLs,w(*&̬붗.>2z\wsr[j$I.ԑrJbd3 :{T˨B}:A=7f4k·??~! xpT̓]zzr UCNB0̡pQpX>*٩d”{4˖k'd\h4[yT ю{,o-,SVteFt= ;t#|b 56k豔mDKY`fXDAMnn0Mr6s}@] lDAnIw  3mk/K)˫LEO͓68TtJ@B&AQdAwU.8۟Ԃ4mE}>MV#V+:]ӐF,й?#_3Z{_-[I/Jx,"$cb85=IrRIRkw498n<"atikW:Gjkθ =2%p',3 ,X߰.u q50ھP$ 3|4'ZO1z@On=v 8DCL(K1@93 ytI\h>Vu֎[ "'ea2}ZSWmaxHN+WG-/ᒮ<(@/xu(;,BW7W?><q2+BQ6] Ե);ojL&-((fk™O``/?PEd/.(~Otjd#m} (]7RB/esɂ*u`aƻUSз9J_ ]hʗ2c B=ջE܉ W.~I|acaRDOΪJ{Z3.PvC;]ڜFPOء8֟*t Sa.arD(JiV1[Ʀ6Ļت$ ~&ZFdPq\O*zKoIH{ӑG-O.icuAV#](%OR}DzN]9UXٶ% Fi04M 4hlH ,ɓ,}3V|zxً5%%L:M6 >b+!6i7uU1Th*ρ)6Yfc<ڃ6˛R*4q|F?GXżz711j$'rD xJTHc~Dgxb%dFqio9a U=UK!{<]M7f)<%;#M7}WU#f-&u'CZmfFw fZ1Yp&2Cyٵ Zx3Fb1,?W,ˍu:Kzo*z5ӶGiQFN7>/B;|ˢ;Z)0\U.C[>Fd)eFmnPm؋8(''\ ppPh$@QSg"ImٹLF͐nWNɐR Hq9kfl̈́Fn\F3-YHP'R7 8PV0,gsz\~p W"tafO[葄c:x2ooLt1<" f'x%E;s?Hov῾6>}@<5*سUnwz&JI?ů^qyG[fZD0?`mNQ_gmJCF!Ws]*]4ji꥔JY&H(rDFfQA7v!SFаr⽐PÖ5Q__zkCl<_ M.gB[1"_>N퉀RG5M*: ]3FVW]y?Bch/Oh]y]S&ѠxuUہxīNڗB b5}w:HqMv_A}~T.ks +Bx(W ьJzN61H)D3!biPևLm.O5LA.[q% \$!pa.Dc.[tc>"7{KLY4I:tfke^|"HJUe0CG_:O鷅"s/AD%e,뛉 %T  AD3"\jFA`% ;XK-@%+)hEM}lmZ͓<$İ#flJp<;[+-sјb '8b8#ɧ~?+}Pp,I^CQi <"[54$ocz'5?r5"|R2 n`c%{tqP\k}M⣤ dufb ݽ7XT<[}!L_ nsΗU}jC7_ITnt:,TtbF#,ijM=yv{#M6&MҘw5 8f`okA6Բ859[ʕE踂J%a~oEf0F'r<\ r+iP~% q"Qf8K_YtIZT4i-d4Ֆy9ola` {wH פɹ~i;dv (EaJRZZ Q p]zB k.!\břx6,QGyR$A/_quVqKEN]B1Cc\( x:>QR+5A>!+`CiHw#`Apm |SL22?|]0u?1)Hؚ4Vl <"jk4ѱ>ʫH0-܁?Z3{9r=H=7A[CK4dĮYļ|;}~tT+99PFQ0f,-bPt`l"uV2\yo@l\_YҮOj›ھdvh5Yd'΂$<  .4P0z`45>w60LXc_  &Ed! n8&:`ye2\QX]gƿ[L`L[Dkxjq(S2d/!N1ɻUpE<߄7vȇ3#Ϲ=цН<lufd0y9&32&B\ffJ cTT7]#OLY`k>/+oZ&DH,}+"7U2%2 f)?$wڍVr_S .FjŖj *Fɟq2b?s/E\0z3Q-%<􂓔Y@I oEo ]f!2\PluV‘ux~"?7ecm# :Ӧ9?h/4D,p.cR@:~8 àI{bDey>%tn$n Twa oq-4nC*)VͼUlyF}FUB@ܜsg [ I3l-=zdH*I/\d]IH<=ƓqJWQs PW:V_ط:OohAC4E-M9mTy15C{$t!Ū .y/JǵޛvQǻlڼaV.yҏ|:0u/Kn)S;oGI_:/;CA=CzNJ[~˕dϰ9 )eOM,:Ho:mdfgxT(F-H gdtVISv+V H+՝9gby@ Z3)nO`Q *u0S;dڽ=~W4ez_r!ZfTϮ]H`ޏE_P)bDxذ=}]9 ՊpkLLrObHV1 k*y'bt&~g(iҼ۬{ox<ȅ>]DףP1~Ƨ=uߑt4CduVbT3LHўzkk af:}E*ڣC6rabmONtyzt4F*%.Ʃ6ة؛uhaKjm}WɁG6BC+ '6g#J 7n[Y ʶ\ }e.vٲd`*4qY+^`HG`^Il#:l1O>`1ŀ+y 3z:77SDKDⷽQÑ%fw9TY_W~+%Ev/y|JJO>քbPڼ5 ~t>{{(Tq'HD~iW[4 z\i>ٷy.!BWζsp11bFX*/N̼&JVGNUzG= ktYhF4)ni+]S'fo8v6*YR"oHm!an/xGood 9B6V]msƚ-wu]ZQza 1;aʾ!XhdLY0X& >hU^ڦtCܡn>iv hשA3=/*0s(R&O9'vuvѓ0c]TʦizZ6sF1cE@([Ip8}IҖB#:k=gTM0D#Ar7"ˍ ћΈztxQl%֠xR2y 6ȎQ.ߚP'< 3ᩌtaSXNJD Nu~$f mWdg>[Nؤ&EC5ք*G2S,KT.xɪE#ͨ}z:Jc;櫶RpDY_Impp`[_Un境d1N7p[ >骫}rX/N{9Q"f('_DUr(a->dY/~4XV=02b#tIN?X&eU