* @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\auth; /** * Permission/Auth class */ class auth { var $acl = array(); var $cache = array(); var $acl_options = array(); var $acl_forum_ids = false; /** * Init permissions */ function acl(&$userdata) { global $db, $cache; $this->acl = $this->cache = $this->acl_options = array(); $this->acl_forum_ids = false; if (($this->acl_options = $cache->get('_acl_options')) === false) { $sql = 'SELECT auth_option_id, auth_option, is_global, is_local FROM ' . ACL_OPTIONS_TABLE . ' ORDER BY auth_option_id'; $result = $db->sql_query($sql); $global = $local = 0; $this->acl_options = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['is_global']) { $this->acl_options['global'][$row['auth_option']] = $global++; } if ($row['is_local']) { $this->acl_options['local'][$row['auth_option']] = $local++; } $this->acl_options['id'][$row['auth_option']] = (int) $row['auth_option_id']; $this->acl_options['option'][(int) $row['auth_option_id']] = $row['auth_option']; } $db->sql_freeresult($result); $cache->put('_acl_options', $this->acl_options); } if (!trim($userdata['user_permissions'])) { $this->acl_cache($userdata); } // Fill ACL array $this->_fill_acl($userdata['user_permissions']); // Verify bitstring length with options provided... $renew = false; $global_length = sizeof($this->acl_options['global']); $local_length = sizeof($this->acl_options['local']); // Specify comparing length (bitstring is padded to 31 bits) $global_length = ($global_length % 31) ? ($global_length - ($global_length % 31) + 31) : $global_length; $local_length = ($local_length % 31) ? ($local_length - ($local_length % 31) + 31) : $local_length; // You thought we are finished now? Noooo... now compare them. foreach ($this->acl as $forum_id => $bitstring) { if (($forum_id && strlen($bitstring) != $local_length) || (!$forum_id && strlen($bitstring) != $global_length)) { $renew = true; break; } } // If a bitstring within the list does not match the options, we have a user with incorrect permissions set and need to renew them if ($renew) { $this->acl_cache($userdata); $this->_fill_acl($userdata['user_permissions']); } return; } /** * Retrieves data wanted by acl function from the database for the * specified user. * * @param int $user_id User ID * @return array User attributes */ public function obtain_user_data($user_id) { global $db; $sql = 'SELECT user_id, username, user_permissions, user_type FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id; $result = $db->sql_query($sql); $user_data = $db->sql_fetchrow($result); $db->sql_freeresult($result); return $user_data; } /** * Fill ACL array with relevant bitstrings from user_permissions column * @access private */ function _fill_acl($user_permissions) { $seq_cache = array(); $this->acl = array(); $user_permissions = explode("\n", $user_permissions); foreach ($user_permissions as $f => $seq) { if ($seq) { $i = 0; if (!isset($this->acl[$f])) { $this->acl[$f] = ''; } while ($subseq = substr($seq, $i, 6)) { if (isset($seq_cache[$subseq])) { $converted = $seq_cache[$subseq]; } else { $converted = $seq_cache[$subseq] = str_pad(base_convert($subseq, 36, 2), 31, 0, STR_PAD_LEFT); } // We put the original bitstring into the acl array $this->acl[$f] .= $converted; $i += 6; } } } } /** * Look up an option * if the option is prefixed with !, then the result becomes negated * * If a forum id is specified the local option will be combined with a global option if one exist. * If a forum id is not specified, only the global option will be checked. */ function acl_get($opt, $f = 0) { $negate = false; if (strpos($opt, '!') === 0) { $negate = true; $opt = substr($opt, 1); } if (!isset($this->cache[$f][$opt])) { // We combine the global/local option with an OR because some options are global and local. // If the user has the global permission the local one is true too and vice versa $this->cache[$f][$opt] = false; // Is this option a global permission setting? if (isset($this->acl_options['global'][$opt])) { if (isset($this->acl[0])) { $this->cache[$f][$opt] = $this->acl[0][$this->acl_options['global'][$opt]]; } } // Is this option a local permission setting? // But if we check for a global option only, we won't combine the options... if ($f != 0 && isset($this->acl_options['local'][$opt])) { if (isset($this->acl[$f]) && isset($this->acl[$f][$this->acl_options['local'][$opt]])) { $this->cache[$f][$opt] |= $this->acl[$f][$this->acl_options['local'][$opt]]; } } } // Founder always has all global options set to true... return ($negate) ? !$this->cache[$f][$opt] : $this->cache[$f][$opt]; } /** * Get forums with the specified permission setting * * @param string $opt The permission name to lookup. If prefixed with !, the result is negated. * @param bool $clean set to true if only values needs to be returned which are set/unset * * @return array Contains the forum ids with the specified permission set to true. This is a nested array: array => forum_id => permission => true */ function acl_getf($opt, $clean = false) { $acl_f = array(); $negate = false; if (strpos($opt, '!') === 0) { $negate = true; $opt = substr($opt, 1); } // If we retrieve a list of forums not having permissions in, we need to get every forum_id if ($negate) { if ($this->acl_forum_ids === false) { global $db; $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE; if (sizeof($this->acl)) { $sql .= ' WHERE ' . $db->sql_in_set('forum_id', array_keys($this->acl), true); } $result = $db->sql_query($sql); $this->acl_forum_ids = array(); while ($row = $db->sql_fetchrow($result)) { $this->acl_forum_ids[] = $row['forum_id']; } $db->sql_freeresult($result); } } if (isset($this->acl_options['local'][$opt])) { foreach ($this->acl as $f => $bitstring) { // Skip global settings if (!$f) { continue; } $allowed = (!isset($this->cache[$f][$opt])) ? $this->acl_get($opt, $f) : $this->cache[$f][$opt]; if (!$clean) { $acl_f[$f][$opt] = ($negate) ? !$allowed : $allowed; } else { if (($negate && !$allowed) || (!$negate && $allowed)) { $acl_f[$f][$opt] = 1; } } } } // If we get forum_ids not having this permission, we need to fill the remaining parts if ($negate && sizeof($this->acl_forum_ids)) { foreach ($this->acl_forum_ids as $f) { $acl_f[$f][$opt] = 1; } } return $acl_f; } /** * Get local permission state for any forum. * * Returns true if user has the permission in one or more forums, false if in no forum. * If global option is checked it returns the global state (same as acl_get($opt)) * Local option has precedence... */ function acl_getf_global($opt) { if (is_array($opt)) { // evaluates to true as soon as acl_getf_global is true for one option foreach ($opt as $check_option) { if ($this->acl_getf_global($check_option)) { return true; } } return false; } if (isset($this->acl_options['local'][$opt])) { foreach ($this->acl as $f => $bitstring) { // Skip global settings if (!$f) { continue; } // as soon as the user has any permission we're done so return true if ((!isset($this->cache[$f][$opt])) ? $this->acl_get($opt, $f) : $this->cache[$f][$opt]) { return true; } } } else if (isset($this->acl_options['global'][$opt])) { return $this->acl_get($opt); } return false; } /** * Get permission settings (more than one) */ function acl_gets() { $args = func_get_args(); $f = array_pop($args); if (!is_numeric($f)) { $args[] = $f; $f = 0; } // alternate syntax: acl_gets(array('m_', 'a_'), $forum_id) if (is_array($args[0])) { $args = $args[0]; } $acl = 0; foreach ($args as $opt) { $acl |= $this->acl_get($opt, $f); } return $acl; } /** * Get permission listing based on user_id/options/forum_ids * * Be careful when using this function with permissions a_, m_, u_ and f_ ! * It may not work correctly. When a user group grants an a_* permission, * e.g. a_foo, but the user's a_foo permission is set to "Never", then * the user does not in fact have the a_ permission. * But the user will still be listed as having the a_ permission. * * For more information see: http://tracker.phpbb.com/browse/PHPBB3-10252 */ function acl_get_list($user_id = false, $opts = false, $forum_id = false) { if ($user_id !== false && !is_array($user_id) && $opts === false && $forum_id === false) { $hold_ary = array($user_id => $this->acl_raw_data_single_user($user_id)); } else { $hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id); } $auth_ary = array(); foreach ($hold_ary as $user_id => $forum_ary) { foreach ($forum_ary as $forum_id => $auth_option_ary) { foreach ($auth_option_ary as $auth_option => $auth_setting) { if ($auth_setting) { $auth_ary[$forum_id][$auth_option][] = $user_id; } } } } return $auth_ary; } /** * Cache data to user_permissions row */ function acl_cache(&$userdata) { global $db; // Empty user_permissions $userdata['user_permissions'] = ''; $hold_ary = $this->acl_raw_data_single_user($userdata['user_id']); // Key 0 in $hold_ary are global options, all others are forum_ids // If this user is founder we're going to force fill the admin options ... if ($userdata['user_type'] == USER_FOUNDER) { foreach ($this->acl_options['global'] as $opt => $id) { if (strpos($opt, 'a_') === 0) { $hold_ary[0][$this->acl_options['id'][$opt]] = ACL_YES; } } } $hold_str = $this->build_bitstring($hold_ary); if ($hold_str) { $userdata['user_permissions'] = $hold_str; $sql = 'UPDATE ' . USERS_TABLE . " SET user_permissions = '" . $db->sql_escape($userdata['user_permissions']) . "', user_perm_from = 0 WHERE user_id = " . $userdata['user_id']; $db->sql_query($sql); } return; } /** * Build bitstring from permission set */ function build_bitstring(&$hold_ary) { $hold_str = ''; if (sizeof($hold_ary)) { ksort($hold_ary); $last_f = 0; foreach ($hold_ary as $f => $auth_ary) { $ary_key = (!$f) ? 'global' : 'local'; $bitstring = array(); foreach ($this->acl_options[$ary_key] as $opt => $id) { if (isset($auth_ary[$this->acl_options['id'][$opt]])) { $bitstring[$id] = $auth_ary[$this->acl_options['id'][$opt]]; $option_key = substr($opt, 0, strpos($opt, '_') + 1); // If one option is allowed, the global permission for this option has to be allowed too // example: if the user has the a_ permission this means he has one or more a_* permissions if ($auth_ary[$this->acl_options['id'][$opt]] == ACL_YES && (!isset($bitstring[$this->acl_options[$ary_key][$option_key]]) || $bitstring[$this->acl_options[$ary_key][$option_key]] == ACL_NEVER)) { $bitstring[$this->acl_options[$ary_key][$option_key]] = ACL_YES; } } else { $bitstring[$id] = ACL_NEVER; } } // Now this bitstring defines the permission setting for the current forum $f (or global setting) $bitstring = implode('', $bitstring); // The line number indicates the id, therefore we have to add empty lines for those ids not present $hold_str .= str_repeat("\n", $f - $last_f); // Convert bitstring for storage - we do not use binary/bytes because PHP's string functions are not fully binary safe for ($i = 0, $bit_length = strlen($bitstring); $i < $bit_length; $i += 31) { $hold_str .= str_pad(base_convert(str_pad(substr($bitstring, $i, 31), 31, 0, STR_PAD_RIGHT), 2, 36), 6, 0, STR_PAD_LEFT); } $last_f = $f; } unset($bitstring); $hold_str = rtrim($hold_str); } return $hold_str; } /** * Clear one or all users cached permission settings */ function acl_clear_prefetch($user_id = false) { global $db, $cache; // Rebuild options cache $cache->destroy('_role_cache'); $sql = 'SELECT * FROM ' . ACL_ROLES_DATA_TABLE . ' ORDER BY role_id ASC'; $result = $db->sql_query($sql); $this->role_cache = array(); while ($row = $db->sql_fetchrow($result)) { $this->role_cache[$row['role_id']][$row['auth_option_id']] = (int) $row['auth_setting']; } $db->sql_freeresult($result); foreach ($this->role_cache as $role_id => $role_options) { $this->role_cache[$role_id] = serialize($role_options); } $cache->put('_role_cache', $this->role_cache); // Now empty user permissions $where_sql = ''; if ($user_id !== false) { $user_id = (!is_array($user_id)) ? $user_id = array((int) $user_id) : array_map('intval', $user_id); $where_sql = ' WHERE ' . $db->sql_in_set('user_id', $user_id); } $sql = 'UPDATE ' . USERS_TABLE . " SET user_permissions = '', user_perm_from = 0 $where_sql"; $db->sql_query($sql); return; } /** * Get assigned roles */ function acl_role_data($user_type, $role_type, $ug_id = false, $forum_id = false) { global $db; $roles = array(); $sql_id = ($user_type == 'user') ? 'user_id' : 'group_id'; $sql_ug = ($ug_id !== false) ? ((!is_array($ug_id)) ? "AND a.$sql_id = $ug_id" : 'AND ' . $db->sql_in_set("a.$sql_id", $ug_id)) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND ' . $db->sql_in_set('a.forum_id', $forum_id)) : ''; // Grab assigned roles... $sql = 'SELECT a.auth_role_id, a.' . $sql_id . ', a.forum_id FROM ' . (($user_type == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE) . ' a, ' . ACL_ROLES_TABLE . " r WHERE a.auth_role_id = r.role_id AND r.role_type = '" . $db->sql_escape($role_type) . "' $sql_ug $sql_forum ORDER BY r.role_order ASC"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $roles[$row[$sql_id]][$row['forum_id']] = $row['auth_role_id']; } $db->sql_freeresult($result); return $roles; } /** * Get raw acl data based on user/option/forum */ function acl_raw_data($user_id = false, $opts = false, $forum_id = false) { global $db; $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_opts = $sql_opts_select = $sql_opts_from = ''; $hold_ary = array(); if ($opts !== false) { $sql_opts_select = ', ao.auth_option'; $sql_opts_from = ', ' . ACL_OPTIONS_TABLE . ' ao'; $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); } $sql_ary = array(); // Grab non-role settings - user-specific $sql_ary[] = 'SELECT a.user_id, a.forum_id, a.auth_setting, a.auth_option_id' . $sql_opts_select . ' FROM ' . ACL_USERS_TABLE . ' a' . $sql_opts_from . ' WHERE a.auth_role_id = 0 ' . (($sql_opts_from) ? 'AND a.auth_option_id = ao.auth_option_id ' : '') . (($sql_user) ? 'AND a.' . $sql_user : '') . " $sql_forum $sql_opts"; // Now the role settings - user-specific $sql_ary[] = 'SELECT a.user_id, a.forum_id, r.auth_option_id, r.auth_setting, r.auth_option_id' . $sql_opts_select . ' FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r' . $sql_opts_from . ' WHERE a.auth_role_id = r.role_id ' . (($sql_opts_from) ? 'AND r.auth_option_id = ao.auth_option_id ' : '') . (($sql_user) ? 'AND a.' . $sql_user : '') . " $sql_forum $sql_opts"; foreach ($sql_ary as $sql) { $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $option = ($sql_opts_select) ? $row['auth_option'] : $this->acl_options['option'][$row['auth_option_id']]; $hold_ary[$row['user_id']][$row['forum_id']][$option] = $row['auth_setting']; } $db->sql_freeresult($result); } $sql_ary = array(); // Now grab group settings - non-role specific... $sql_ary[] = 'SELECT ug.user_id, a.forum_id, a.auth_setting, a.auth_option_id' . $sql_opts_select . ' FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug, ' . GROUPS_TABLE . ' g' . $sql_opts_from . ' WHERE a.auth_role_id = 0 ' . (($sql_opts_from) ? 'AND a.auth_option_id = ao.auth_option_id ' : '') . ' AND a.group_id = ug.group_id AND g.group_id = ug.group_id AND ug.user_pending = 0 AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1) ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " $sql_forum $sql_opts"; // Now grab group settings - role specific... $sql_ary[] = 'SELECT ug.user_id, a.forum_id, r.auth_setting, r.auth_option_id' . $sql_opts_select . ' FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug, ' . GROUPS_TABLE . ' g, ' . ACL_ROLES_DATA_TABLE . ' r' . $sql_opts_from . ' WHERE a.auth_role_id = r.role_id ' . (($sql_opts_from) ? 'AND r.auth_option_id = ao.auth_option_id ' : '') . ' AND a.group_id = ug.group_id AND g.group_id = ug.group_id AND ug.user_pending = 0 AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1) ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " $sql_forum $sql_opts"; foreach ($sql_ary as $sql) { $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $option = ($sql_opts_select) ? $row['auth_option'] : $this->acl_options['option'][$row['auth_option_id']]; if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$option]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$option]) && $hold_ary[$row['user_id']][$row['forum_id']][$option] != ACL_NEVER)) { $hold_ary[$row['user_id']][$row['forum_id']][$option] = $row['auth_setting']; // If we detect ACL_NEVER, we will unset the flag option (within building the bitstring it is correctly set again) if ($row['auth_setting'] == ACL_NEVER) { $flag = substr($option, 0, strpos($option, '_') + 1); if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES) { unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]); /* if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']])) { $hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES; } */ } } } } $db->sql_freeresult($result); } return $hold_ary; } /** * Get raw user based permission settings */ function acl_user_raw_data($user_id = false, $opts = false, $forum_id = false) { global $db; $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_opts = ''; $hold_ary = $sql_ary = array(); if ($opts !== false) { $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); } // Grab user settings - non-role specific... $sql_ary[] = 'SELECT a.user_id, a.forum_id, a.auth_setting, a.auth_option_id, ao.auth_option FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . ' ao WHERE a.auth_role_id = 0 AND a.auth_option_id = ao.auth_option_id ' . (($sql_user) ? 'AND a.' . $sql_user : '') . " $sql_forum $sql_opts ORDER BY a.forum_id, ao.auth_option"; // Now the role settings - user-specific $sql_ary[] = 'SELECT a.user_id, a.forum_id, r.auth_option_id, r.auth_setting, r.auth_option_id, ao.auth_option FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r, ' . ACL_OPTIONS_TABLE . ' ao WHERE a.auth_role_id = r.role_id AND r.auth_option_id = ao.auth_option_id ' . (($sql_user) ? 'AND a.' . $sql_user : '') . " $sql_forum $sql_opts ORDER BY a.forum_id, ao.auth_option"; foreach ($sql_ary as $sql) { $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; } $db->sql_freeresult($result); } return $hold_ary; } /** * Get raw group based permission settings */ function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false) { global $db; $sql_group = ($group_id !== false) ? ((!is_array($group_id)) ? 'group_id = ' . (int) $group_id : $db->sql_in_set('group_id', array_map('intval', $group_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_opts = ''; $hold_ary = $sql_ary = array(); if ($opts !== false) { $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); } // Grab group settings - non-role specific... $sql_ary[] = 'SELECT a.group_id, a.forum_id, a.auth_setting, a.auth_option_id, ao.auth_option FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . ' ao WHERE a.auth_role_id = 0 AND a.auth_option_id = ao.auth_option_id ' . (($sql_group) ? 'AND a.' . $sql_group : '') . " $sql_forum $sql_opts ORDER BY a.forum_id, ao.auth_option"; // Now grab group settings - role specific... $sql_ary[] = 'SELECT a.group_id, a.forum_id, r.auth_setting, r.auth_option_id, ao.auth_option FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r, ' . ACL_OPTIONS_TABLE . ' ao WHERE a.auth_role_id = r.role_id AND r.auth_option_id = ao.auth_option_id ' . (($sql_group) ? 'AND a.' . $sql_group : '') . " $sql_forum $sql_opts ORDER BY a.forum_id, ao.auth_option"; foreach ($sql_ary as $sql) { $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; } $db->sql_freeresult($result); } return $hold_ary; } /** * Get raw acl data based on user for caching user_permissions * This function returns the same data as acl_raw_data(), but without the user id as the first key within the array. */ function acl_raw_data_single_user($user_id) { global $db, $cache; // Check if the role-cache is there if (($this->role_cache = $cache->get('_role_cache')) === false) { $this->role_cache = array(); // We pre-fetch roles $sql = 'SELECT * FROM ' . ACL_ROLES_DATA_TABLE . ' ORDER BY role_id ASC'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $this->role_cache[$row['role_id']][$row['auth_option_id']] = (int) $row['auth_setting']; } $db->sql_freeresult($result); foreach ($this->role_cache as $role_id => $role_options) { $this->role_cache[$role_id] = serialize($role_options); } $cache->put('_role_cache', $this->role_cache); } $hold_ary = array(); // Grab user-specific permission settings $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting FROM ' . ACL_USERS_TABLE . ' WHERE user_id = ' . $user_id; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { // If a role is assigned, assign all options included within this role. Else, only set this one option. if ($row['auth_role_id']) { $hold_ary[$row['forum_id']] = (empty($hold_ary[$row['forum_id']])) ? unserialize($this->role_cache[$row['auth_role_id']]) : $hold_ary[$row['forum_id']] + unserialize($this->role_cache[$row['auth_role_id']]); } else { $hold_ary[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting']; } } $db->sql_freeresult($result); // Now grab group-specific permission settings $sql = 'SELECT a.forum_id, a.auth_option_id, a.auth_role_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug, ' . GROUPS_TABLE . ' g WHERE a.group_id = ug.group_id AND g.group_id = ug.group_id AND ug.user_pending = 0 AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1) AND ug.user_id = ' . $user_id; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (!$row['auth_role_id']) { $this->_set_group_hold_ary($hold_ary[$row['forum_id']], $row['auth_option_id'], $row['auth_setting']); } else if (!empty($this->role_cache[$row['auth_role_id']])) { foreach (unserialize($this->role_cache[$row['auth_role_id']]) as $option_id => $setting) { $this->_set_group_hold_ary($hold_ary[$row['forum_id']], $option_id, $setting); } } } $db->sql_freeresult($result); return $hold_ary; } /** * Private function snippet for setting a specific piece of the hold_ary */ function _set_group_hold_ary(&$hold_ary, $option_id, $setting) { if (!isset($hold_ary[$option_id]) || (isset($hold_ary[$option_id]) && $hold_ary[$option_id] != ACL_NEVER)) { $hold_ary[$option_id] = $setting; // If we detect ACL_NEVER, we will unset the flag option (within building the bitstring it is correctly set again) if ($setting == ACL_NEVER) { $flag = substr($this->acl_options['option'][$option_id], 0, strpos($this->acl_options['option'][$option_id], '_') + 1); $flag = (int) $this->acl_options['id'][$flag]; if (isset($hold_ary[$flag]) && $hold_ary[$flag] == ACL_YES) { unset($hold_ary[$flag]); /* This is uncommented, because i suspect this being slightly wrong due to mixed permission classes being possible if (in_array(ACL_YES, $hold_ary)) { $hold_ary[$flag] = ACL_YES; }*/ } } } } /** * Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him. */ function login($username, $password, $autologin = false, $viewonline = 1, $admin = 0) { global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container; global $phpbb_dispatcher; /* @var $provider_collection \phpbb\auth\provider_collection */ $provider_collection = $phpbb_container->get('auth.provider_collection'); $provider = $provider_collection->get_provider(); if ($provider) { $login = $provider->login($username, $password); // If the auth module wants us to create an empty profile do so and then treat the status as LOGIN_SUCCESS if ($login['status'] == LOGIN_SUCCESS_CREATE_PROFILE) { // we are going to use the user_add function so include functions_user.php if it wasn't defined yet if (!function_exists('user_add')) { include($phpbb_root_path . 'includes/functions_user.' . $phpEx); } user_add($login['user_row'], (isset($login['cp_data'])) ? $login['cp_data'] : false); $sql = 'SELECT user_id, username, user_password, user_passchg, user_email, user_type FROM ' . USERS_TABLE . " WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!$row) { return array( 'status' => LOGIN_ERROR_EXTERNAL_AUTH, 'error_msg' => 'AUTH_NO_PROFILE_CREATED', 'user_row' => array('user_id' => ANONYMOUS), ); } $login = array( 'status' => LOGIN_SUCCESS, 'error_msg' => false, 'user_row' => $row, ); } // If the auth provider wants us to link an empty account do so and redirect if ($login['status'] == LOGIN_SUCCESS_LINK_PROFILE) { // If this status exists a fourth field is in the $login array called 'redirect_data' // This data is passed along as GET data to the next page allow the account to be linked $params = array('mode' => 'login_link'); $url = append_sid($phpbb_root_path . 'ucp.' . $phpEx, array_merge($params, $login['redirect_data'])); redirect($url); } /** * Event is triggered after checking for valid username and password, and before the actual session creation. * * @event core.auth_login_session_create_before * @var array login Variable containing login array * @var bool admin Boolean variable whether user is logging into the ACP * @var string username Username of user to log in * @var bool autologin Boolean variable signaling whether login is triggered via auto login * @since 3.1.7-RC1 */ $vars = array( 'login', 'admin', 'username', 'autologin', ); extract($phpbb_dispatcher->trigger_event('core.auth_login_session_create_before', compact($vars))); // If login succeeded, we will log the user in... else we pass the login array through... if ($login['status'] == LOGIN_SUCCESS) { $old_session_id = $user->session_id; if ($admin) { global $SID, $_SID; $cookie_expire = time() - 31536000; $user->set_cookie('u', '', $cookie_expire); $user->set_cookie('sid', '', $cookie_expire); unset($cookie_expire); $SID = '?sid='; $user->session_id = $_SID = ''; } $result = $user->session_create($login['user_row']['user_id'], $admin, $autologin, $viewonline); // Successful session creation if ($result === true) { // If admin re-authentication we remove the old session entry because a new one has been created... if ($admin) { // the login array is used because the user ids do not differ for re-authentication $sql = 'DELETE FROM ' . SESSIONS_TABLE . " WHERE session_id = '" . $db->sql_escape($old_session_id) . "' AND session_user_id = {$login['user_row']['user_id']}"; $db->sql_query($sql); } return array( 'status' => LOGIN_SUCCESS, 'error_msg' => false, 'user_row' => $login['user_row'], ); } return array( 'status' => LOGIN_BREAK, 'error_msg' => $result, 'user_row' => $login['user_row'], ); } return $login; } trigger_error('Authentication method not found', E_USER_ERROR); } /** * Fill auth_option statement for later querying based on the supplied options */ function build_auth_option_statement($key, $auth_options, &$sql_opts) { global $db; if (!is_array($auth_options)) { if (strpos($auth_options, '%') !== false) { $sql_opts = "AND $key " . $db->sql_like_expression(str_replace('%', $db->get_any_char(), $auth_options)); } else { $sql_opts = "AND $key = '" . $db->sql_escape($auth_options) . "'"; } } else { $is_like_expression = false; foreach ($auth_options as $option) { if (strpos($option, '%') !== false) { $is_like_expression = true; } } if (!$is_like_expression) { $sql_opts = 'AND ' . $db->sql_in_set($key, $auth_options); } else { $sql = array(); foreach ($auth_options as $option) { if (strpos($option, '%') !== false) { $sql[] = $key . ' ' . $db->sql_like_expression(str_replace('%', $db->get_any_char(), $option)); } else { $sql[] = $key . " = '" . $db->sql_escape($option) . "'"; } } $sql_opts = 'AND (' . implode(' OR ', $sql) . ')'; } } } } OINjW= cVNL^qzNfʖk.Dû PvC?OO.k>vҶ6D)ʮ 88B'O`gЇEÖp놨C8qkU1Dn]*MPv*%sN,{v_adih3ФÎ2&EcF Y7Jμf!D#,aQc_ޜh]5Rfα KY a} myh#6s}q{`ج 0(#s-3M-zS\SHFG6lj 8&nǒjaTqZf1q-ͲSl|qEfAgc M;Cuh"4#>jf] etz1lcQ'LzlxN",{}T'6+%cP۔< GCj?M9e%-'[m(_xȰ<.h%vkû]9'NuyJ&KF,=[ݖ~>ʆ֪͌u( s,2竢m]YW lBM zIƊyY3'Xl*/*@! 2b6EqȜN-e+!(/M.$yiLqy߇Ʌ?'/F jȅ,R|y?3+Ul-NsdVvn'M6j0k,!m+-&-܍jRQpjxɋ-Q뭷3QpZv %}1EU*3_($'b/p ]uzz:K{B9UR @Xt,a1@xOR7l_n ,2ã!%h4}vĝ7~=4z71Ag3Ko1>z&\Erx<|yfg'fg ԓ{6ߤ6l\ZZ6/"RY,- u~t8 +\.z6aҕQY$Nrv`C] ўL[멠\\uM!-6f݅MbXt|=$n#< PHE_iX(+vC1I;V5tLe]l{|5wGb?şICIioq@k|h <;R__1Vͭv`oQ r] as1M[`Pw)Zׯnfj)Cչ^^w,ѷyWALxA KN~MB!_@OY.X74]ڀ)|w_vOB= @],ST<)1{1Wt-Y+vC?eZ,ښj3NN%Xǀ4錖L$,v^( j^VWNA“тoxN1s`+`'xtgzxtC. hOyЯTiQq^_(1co7ȣuz| OhZaR|'hGr.\=`2NJ~U.[ leDT#¸)Ȑle< Bjx3C)Lw ]62B%Hڪ?rn1pr("{Hvq88n4|$7$Qu8R?>^{(#z'(4+ᥩ :W Pۇo(L7˂ҳd lE+2>߰j75"U`ys/bOdŢL j aIe}cMӘ¼%vU[m,璠;x݄kIOBM탞[Q҄g|G|</V"I;leAtXd+EϦztTrYE,YZ -4ONk2 3GLO>xCնù9̓#5oRhwp [P[4~5fAK_'Y) 5*b^0(UwWgؖ(rsùB3.zRBRfb$o`aܛ*Rpw$֛ZmwgI}J!,_O`F @N4ed%k)H}UBN{D|r5I@nZk'qރ)/F-=bS;eWqB"")(T2fPؑAuo-Fx^k)L Բ8z @o#X֖C.5+iyt(YQr٣,°y~(1hbRQd䥝zD%*O֑@N_F("%E[qs䝡;(Zɫ~8\dAUIfVZqE"}" Nfc6CzgfOd4CEpiax tGCuH"2\Oy$eEniS|cgǙ7hFuRXRa$[t7͙u!( M".<[`7$q^ӿo:Ւ{&>#V'.{1}hB2'G)tGDǂeq2λRJ8Ɖ^]#TSj+ag=V;`{ܭj[% ֻ(68$_a C".ìfzT[h޽Uֵ2TZ%s uᩅ[os(H6B9CDž"{pPh}-#COR!Y&y]0"z櫰Nu Zx亩:7Zu_wD("b\n`W#f?1!:VJb>|6V̕E3M:IԯNs<} 'B|S'%8ݛ L+*%k Z\ց 5\_CX@Sy?w3wUEI*xC 4eZ.H@d-5f`+D#[C(/` VVpެפO¸8b=%7hҲHw2磫3< ˕QTYH@)xr|@ָ6R:}5g"|bIV*AeW PV%V}\>'MffxDN8E.jX{8 <{8#t ywUiѹ5tu}ۄpިG)('PYe,+gPx_*F" ]]Y>a_@(pFׄJkZOSGe{)8㠂SZqE=8EOpُpXse'+Vτ27!cab/r(?yt/Q֜D+-1/FX\9`vY0$}̘'O}}o+@̷~ sXeZ6A~@US:$ BR]MhO &R޺+rFy W S[ Si)mꋽ[qeVtkq!Z%41 p1 ߯2Yfۅ1'Ra(M05fcsmhSj흠#]Rǜ:S'2sR:ڀUHUW}pժ کJy">mN6xQ/`ZȜF̊$OPZخAFhe譴 mށgWH,O廱;\3]M̄W'ABO۔hn y2#J;ou$ƣ>6y5ӑ`+Mu~hbF5kV']i- ȭ\o‚f.rN#/A'ȫV'`ڇƹ0RðPskƤLU 9 EkZpMta?hcom[g󟸉akSm VHvLSrQOw;YP% ڊ9dәI|-2˒ pR6h\9z7߶JWۻQM3'CPwGUKjrp WyR,ςfo CPsg_꫔)%񬊖Bnc ֽI n곹Ck*zQ?h/j#+-xg`"pӺaǤh5Sa6y.9D3Ѵ_=`3 NMiԦ{]sŽvVA!VwtfsJ>Ȗ6.u<-`1`czGb/ޓ1:y)ɓPH9Zs R27]EG0 6} ܻB`WjҋCY-2 B:E e^rXNҙqy S Rk$x W gj?[$>%wlFV,:Pі[A%%ENonM}z4o&LSF-|&{vMy7pG~4{f_bs8.:v U.wP[5Sط݀켊>IXvw\!' \* DW*ڌI W'wQ.OeBC&G7CbP`l wY :vw.hɘAXbax50{ڴ}^WJ;CT5CwFQ?K 20rTE҉[k50) xq-Y*]I ;god)~X$-M32TW:'EWeV|A8#>֔9w75;Ϟڻ$*/rS#90;_]oF|sGkI_csʩ7<>Đn('ܸ@]Q@F9AAZۍE l$?dgnl,kU3ҫ |~SB-nF4;$G@mwLV=Tt8k@ɽ>ItYŜ YNHUeEv6N ug͡RBhNە͝ۆ?k#?\^ d/k%\nfv&${\:˜2hk6 (OUHd MUqBϢ# 3-롞az &iQ9T& nnd54b'#+A^ vhiF* &̀-3Mt3 rΌgwYQ}C^6L~GX)3og ڴeԒw 'FV FI@-6D 9뗕F:(3Wdm^/XEPh(!Ti3O/%D|%ivېF DR[xmB"8c7|v+|Jc˸xOBt>{NC(XAUB&se#G8lhJ9G͜3 @b>##;[wLĝu-,''y=OBmg7=J$3|d:5j8!,Hw{~cS->oH}قJV:f|XK?*rUp!!!@-ѝ uz- aօJ! ly!Y?O4d;poB 1ΜoR@ETAƭzK=\*a1ڻq=-o?}`&1sB<~}o8\j5Y04E㾘/OtK1lU.l$?ūCUuJ}^LAɜ辽~;o₿9VD)ZsW\ۧHmA+SWiKV[@:JP=@Ui$#Ǫ\x^Ok>4Gv坢m .}f|iJ_Y|;l)A4:(wp+G|e%OmAI6,8?̜:QG"pc v؃ĉ7A9IxCs.pPr_9ďeAAolY(5/(Ӧbc#:>)SP )_M%|sPOÊafZQ嫸SLe&P(&O& fsIm]\6qBHxyaS~kZ" BcG5ۆ'6G02SLJ}y*L[O5w߀j<=}jš1LUppυR"y-;\@MrlxHr]P.;0r/ Os]or05  imi@hS,N'aZ5 x~GPߠO(NfqS&7>Tؿ(נr@2SMVq oXG`8ot9yS.B}YiֺT;D(gG}kcvab@{ƀj3XQt0zK:6a%{֨Eh؃3kflpɖNZr8>,YL0\?/y*g "*!NƆ)^fW?VQq3 t)lB)m(\/iCC IlƃHT4Yε)Oܯf7LŎ-;s SSaa\?.Qb%uoԃH Gy5Xz$7TW$ hI3K0zl64ćL88ȃgy-GT[yk/I?t[FMRU_gq(7D QFv^ RlQvo٪ejV;}3;mOR\a>SzĖ+9O s܀НlA%92Y,mZ@P#-TMa;?vjP璍JA1I:@fiRgYXďͺÝ6}d书D`]pbu)Ig1[_?-p٨!BHcA^voyuiu+kef[ɑ!^E[أ6ņ֒N^ įЅiS# LNU~mc~Kfxr>kmL}_8ʉt-/b!c f~a ѐNbف9Ɯ~c^?L7.sm% )>p2q2KtqוsS?i,Qin=&; KD| &#BtO-F#Hb^^!ݧ/^?؈إtȠF'Y YDH0aBפN^8/v!}hm\ywrlk\.$""Sf9 1X+9rQ:K#,wk21؟:PP;BKw$tKk9z.:kuY$AHB]`poϣ|K% l<7F=By rw͎|yrNtg*Ӑ%k<mPYSGj”hA)_sb3ct)o_&߰NR;#F@WkFVhNe2h|dj.-QFw&dTG/l"t^Y ;/'z(odBjCjhܯ:˼L{[\I$يOߔjb|+•#R{, bVl H=M Т/tjIM~{w QwmP7:n{/Rb>Bp|n8ܬ:u] gP+EbFX;fgE,-0֙+ ,p @8}໇mDyf/7!zUn9fW٪kZ~bG-Dc"n' L@j:Wb,taΖVbI.#1tLG]U-O2ۜNsYߖ g,(O("uQJ"@xp:dj~V+m˜/]ֈڬ*hd=`' xJ_36vN嚴W~ HR9?Fd.[AXxN+%)Vn4 ़.jC q-(;w?: IQ׮*Q)b@{n(֖6l̤b[]|ϴS:-Gxީ*V YO^(Jc}oe>xnUQFCԥiEBV`xN`AW_Lٙ;aI\Ό09,kމ!LIu:p9i7m%X)brP s jZ)4XI*8ʶ. Qu.!?%UY'!:x Vu)\D5ѷq8QjBv3ɕz6Z(bO_oL(vU: +<w*N2ՕӣI WN̖ mXڦ8*"†f RzwⰋTdDDWӵV5gZy?0M^Bҭ5E8yfK*fB\?f˃}^ޮ=$8 KfIE%r5/ Ta\9ySwX2?7$k0(̷ߘǖW^c15չ_.^hŮ.GQ4l˽NH~iY7C;N.Y! oJ9ON+O* uʵ&\9O$ot-PrjN /?ma|W<ɑP,X-fYm:*!c󟅿c*|b=&=%)nC(YJ3Moc\@:;@hHyڤDx5Yj+J Vׅi5Ef2 X|n{Jqknl@`]?*&#F [C߾O鶋]P6XOpNHRpn]m̻RϦe*IŊf~7޴(˓6sJ܋Wq0'iÍ;:L)[a@gF}y ##H R'w0"Wt$o= B;фǻթ֒ި[.TdEh=sցYt}[GG#*`*U h &t?P7ZfG̠ȉZ&B\!oa?zyQ Y|!Q.չi~w/ZKY#YV5&а80}Vh=,@] 4Jg Ż-eʂ3kC⺙܌-5b8"G:l_Iq߫t&WXbT-^k|{m_A]ʸ>edr텑UKWފĖ(Pdcm㨑%土}tR+oѧ0`"Qgn1fHZ,ibfC(-\2a CLkD~X )L (V)Jb)O?ΒSUq+`K!\nCzEܙ%f46Ռhs3zO.գ!SX<>Aְ?Q N. ~,ikg]gώhb+ш>^;̉~o {C$Xѻ{&|yg&)ٶ'IiJE}iu9?KUanL+Er6&lVs,LqNT r lYKkQVτy&#Odϝ՘_F2U}܋5\_hd c SH{?6Pн8y9` *W8쇋57kB:YXl~tfU=aJ/4]f`ki*"bCH@A;˞*ڸĩ(u~`  }N5ϑGefapa!-Z!5|lI{-·a0͛X8 T%މT)0BR\\PZXF򄖦1 :j- yfJg\zМc_\==+< -w-c&[4B(_-O6UjP^I/O]]URҌi Ti6} ̆j= > fr%ߵN{tVL o+: {m*HcLJJ-R{z(QuŻKPR1S~1*!e2陓G?;HC,D&E|Ok>]A^= ld+}&1QaQ^xjfu6`=JRL<)ڒڸ,sr4IW֞R[L".Ǿa1D/SmJYQ?vn9ln'OBW3vz^ t&C+ˊsMI "#Of"047Ә6-iԊ9~PFƁb?kݿ: UmJG%/LeЭZPZg6.ueu֘l$:J0PLQTL.ʇjXd"@UXt3fשT^ldy jbڔg?;U?M|.bMW;knqV _Uqʡ? nljCIw$ibOl,sU+ I@צyT#ׂ&ԇdwK5ZZ22`oځK!pjJ﷐Dgk*d)·alhlʯP,޳%{ 굾? E|Nܹ4Ǡա.je̳4MBoCE0y&ݺILPP/{yEw[|}֏f7I@f*#P8h\)xJBue6m=mndy> a(g$_xQ90 ,[%-]xɆ^-}+y.5*F6oF?ZbOpQ'FyY a_|Fjo:,:9o){[b `E)?%Z]AXYjG~p(i>&8X#L9bړ|sę%,z>i>#Akp=FfLYdbk1L.7z?r|X"/dD$+dbLxj\' 5QQsۑNw9M-<>2Aca5VSū1(N00R 'zc/ɚÈj.2P܌\gݖ19N%HWs/ ʬpMq@fmFډt,K[<d;0O`.J" \\D>ʐhiDO&*P%*B >uݣ]C(Ep5\7;ȣ@ewEb 8?|u>@zk#rx7HB/Bڔxw}z ljcd 8pz[4jM4U uJ]Y5E8ɋWkćڑG-nK^" ,I^;'z~|tjzCL7͞?a@7P Gnd==tU@~]0C  x61T4=*,Aurhao5|# @"!;4˨#.[ 0w?z~|k[n>YxWtdx*:;+Ax\g;YS}W_ĆEAL@/88ᮕ3vځ\O!"럣1wX'wst  xDž>*H6Ji(X 'y *]ڹ st7ȓ0u[/P/G;f[Vxكš֗2ODFpN9 Fn4q@(aD0!ȥYjӺMq˹B13qQipSipr|~_&רㆼ_t=0AH NaVH00Dc'y2 (y rBOEqj}`=ԟ~aRD@u\#y*OCL ^~\YnqG x)րyBK9lP;zDkSgG  wosՉ@,9&' :AMSk ©/5=B>ƄbpEi M)5WA]_gUPCKkHqay8:5X~becljC8pw<ۗg 8{!=35^L)F)1-ZcS PyF i!Mf{vY,3<%ߏX D.>8mF ~?Oh@QwZix|ٖPouCǎ[ +xo &~Oq`R s'7m>W$^) J0@^5)Giʢ3#F^Yz֭>؞yFeXB.#el#?A%ܒ,&}nգVm)p|Xo{ѐi_>ee5 pvH@W;E䙍ЎkM8Lx-kd{gm%@( !$[QR rb@4]SGsL*k󲜣.qrv~fe P*{d4߇C*IvON-΂@!%|#Gre فLb_Xˊ?ii)џ[2 \ɸ|#~*nFY>X>u|sl" \#1yh x_)'ԏ.fLk%erXc%`SU$r%k&'/n_/1):KfENsE?md_M4J&IOV,:{y^owv(0aW&xLoYM C7uDJEm4 [ye+oδVmHE{嵥̱iU L-1XA/l9tN٧s?yh͇ LuB8K{K`aO ==r v@W3~u`L <P4'k#Ҳ['dtW& %T ϒE2)fNjiV\8uw2m+| Yq֖p_x76X2?Kޕ)D$,&:ߒM\z;Q58g {e\O`S lHhFTwy|k;ekӬ 'j1\d3X"-gι(E)LifU5Yb v-ܠMSXQINZ+^k.Khzd5䪊M}-*ʦ9 ZOA"5yɃV5X7LpNnyluvxD-Kr~B9bp}uq=J Q&h)a ^OW! EdR zjU8/Pz@~__}/nY%3;2Ɍku ~6WJ7n0l!` .]U ƘderI>@;:BtO5@@fkil<I7ac[ mov[QhU 2&i2¾fOOvW<^MSV -,Z{aGH4-9z.ҍ.!.'n$ 8WY[^Ќ}m|۰"{~9űXQoYh_F"aG7F˿yʖ *3YfL0sq_a1>t-i1!Jrt)\D푺lǸɒhx[F<* <57dft퇒{`}B'0MƂv8ۣRMZiZ lƹVTRbV|qhax%%wɶ{% `v !gsdK&g{Fwv|M $EM:)v-{Ԩ~4ݧƷ]_p~ѧ**fas,RFI߻|1dhXpA2/# z@3Fa g\LN e=!SO{T^Za(\Chl/bdQ\q-LR^l`8#|5?(*| i99>m "7雽T/-!Z"%}<&K\+q*S%PMͣzVQ{,3kyvr1t2htc-SOЂu{Q(s̼(i֔C|Kv{Nz7܆yhú(m"Y+\urfJZZPB,kXٹ"2T9sQ*kOJqA,`oeǁ Ly Z1b51pz7ȏ>T6-eK#R/N(ɒ)F0Ȍ_nV*dϣw\4=al Q!l)]]e2;"&V[9h2%fK\ݖ:4ҏmƄ`ʴ1yTfg#"dN^!mR Sw{,Mn-])q4wc3xK7RM*b uܮ%[%9U, | Ht\je,҃EA= P*PJdKEC~:qݥӪ#\<$G/|8s CK$?`1P1ѕ0l`s|vM2S >Rvh >+(?U@'JH[f A{ %䋓6W B2] ~WCvl|fT7B8݀Vkn/zkS~1sA⥴ZE!hLA݌r(#n; t{7Vems<5PLp!Pls;q~t[ڽlOQ?cZǨNc |D8Iv>+Ĭ&:HBbt()b>ȠBnA@IR2p]tY|MSux8BZ# bu-I@#(}OQea܀"ДҸ@nVCgguEN.W%IkE/@א Qs%kn2h<Mq8z4Ii;0Y& " W/u {lo''p*eT*tb9d`oDa*"))Cz4#IٙO{[nE 1yf7J^港s^_nR("ɯm͓Y( d lw3HPK}"cG}oo5'ʽ'eMwS^_WF+?W*1z02+9ܗ1]UOQ~&vANc3ya{:M&.RI:8$/1lh)Q#ҥo 7w_b )X%hExfctх6Bk>]ڊ?3 ,J%]oKVx6x2 pVLRrMNgdz:e ìˀY|P[z<_hYSNg"(CVtxDK!|X>_[pd/z+7?@."NlqrQaRNCU>Ƈ 'I |Jg:X p@W4s_ε"5ptOl85$hڈh1CO}MGT=󇽚I|3R[ų>5615G8Ѿի\+l=݂UW-HpUnJ4Ϛ:ikV/ZÃX~F_*,KQz7cB$@Eȑ25\^QkPo& ʼLa ^ǜ[;v%WބxCMYV=@OIA0cy8pV3('e%o9}0x.%wNd>#upulȿGug^'B4M)m|wQGn̴ lU\ka!dIJ­Qi0GV 6#e5"я? Y},ٕ2reϝ¿sU.)aPJoN] DZ.ms5EM27\S%]ܔ#}@ 'C˹*$F8R oJ$߳ɷIPxt=}&ZYwc*?}d"P|Dz6V<5sOՃJT{)8G#fE$p /Um1?ܜiq~'Owq܂rհdvnj@I>HQ  -/۱@FYQff2=ޠGG̓b4ٮh>4 ?A{pLV<4I϶Bs+*c` >L5-c1l/Dh_@bTȢ#2jTՎ>E*`f|kf':J{£un4$bg#\S׃(S/'[VGсr9lr,2ΕҩBK՜8Ԡz.mqKjV5a$#o0uuaFJb!X{.OVA >}6Ǖ׾d4S~in+~#G*y ?,dtRHJf 0[辍C4k![ZafGiLDJY6G0Gڴ^HW~xȰ 8!gNve3),b6^1.W(ӞC!(.~ȧ-^Hx)𩄣#J~6ԷPX:1DM";sYYr-6%2F ?R{ s$Ou]PfSpZcڢ6)yR|E.0׌vGr]zw,Z! p xlډ>3xd2y-rk\z у>/0OM7@șռ>=Jqߠ k}zNrVC< mkU#"/V@&f*pbɄ%-܆bǟtun-Ϛp@~Ҽ`]:senw͇U ܂N(ITZH)l[I+)*Dj>3):> wn5cY>" PsV"Ǽ2 QmP5 c+"# V& lIl5\h9_tfc{7HwDKgVtGӎƖeƇwd"T9!Fz KH~<;!_ {HIJ5_7*LZ3.0Jn?`L[;64m̄ڹ!JfV,G$*0 G 1٦EG#'5 "ǥŰ0%ZlI|9.'^UPE]'3 `nNE͵Qңou$B^X+)XthT6ڙւҠK%tGF|[" ]FXrMX# )m迧~!\ &HM0$J*iG ˭= XK25e`.Hnx_&__LĴtDRV kHTu4_.^SG d[B-m޿.Aft!2v>, < F,l4S xl 3~Z ,;zbJ!}[QZm3a-ivʘ~,'0+]" kΩ};9Xn[/i ^| D획̙x\ 3 }ƼpU8;yBD~=ub6 V0ɷ-gLdHS= _8C\\/]a~dw&m_Ukm(!ٳ@|QƮ& mjBtA1T|h&. _U]ɡy=[;2YbN?r]yZxRVv rOH vȊ0`EQBCÎ#b&qe4uq[]ANR+6MH&zgW\'\op9rH=MHK혤" 7@ЇH٥/6We牸z(*bvOgʍVI22yO}įTzF"O(E!|̙ lBTjܞm*(kl1dFH!nKɮOf=9ʤ>z rҖ *@Qi+CLu A08OX$\~t eN6 zBଭ傍(h uҸ鱽meV:f4qc.~ zӎA Ɵ7f1ٱ2DW6j7&sN+ܧW l zlKh Uș{GK?> ʕ s^S E =gbx'Bv ݇yE h70ɝN7, C6Ƶ -Ig)YpK$J!czٯҸ8],pIPgEʾՋTiK+n~5݉hє>GS9<7PlȠ^Eag$^/fLT%v} >E5r6ZH^d}r>ޏLl*-e5 }YHxǸ<b"(BGV׍Iм#fɴE5\R ҿypUɉ)*WF @Rɝ̙6Xoߢ47˟.J3NN+#|SGѫoj HUjm΍.Ej2qwN eg3,_|0r\V#g:s{%Ȫx˔м;g2 SP)A㶊塑FPLQ} ,Q"nGp*^guRPYaYX>%_ +Ѩ dxAdž3 =8D0%\hKP4Z;hJs1`אjSa"!ATxm;.TcqSiW,@0}Gw%K[Ez<gۘ|8DKhH~ "6U>+z;N?-q M`GX%G=Ft"d >LJuut6?RhT-#Sx/v_ GT,P} e89L0b9'}2B~S0K?5p0gU݊iiut1r?g~TQv7r&d KltH'-lN0H;ŷb8OtOgmx((MbwR*2EKC> XiS kzXGYypƅM%0Y!xeިc?!m,B`$z*7 IRP˔|٠ce|컽c63k`K!ۧ2`O*Nh- I2Qo{!,Do$d=d2~,Vmǟ26Mj4$wg$uhmlAE~c\o:q兄["rʐ-ndpyX5*5SE{=\WT]ܵ"gD`!ԀC|$TIj[B\w0;OzRAȤٞ9v M>a {A$:@B 5gI[OaЈh,_&L͎UtId:m4_Q&g%i )OӝS AS1Ur+( nkۂߡ~wKymPZ+nX 1i[@',gn/j"c2o!P5[(d" 54DEaeəcXM. UK *A%BFW%A=Xo #͏2#3f<ե,&͟ 8&yu(q"Bg:"!#']\WH,eAА܀P>C]j\_4@N/ dh.۟( A|J<C;^ߚGE5oW_tIj+~y@[jLt/of++sjZ}+.<ŷGN.WƾדIՠ҃'T'!Kz$ϗQ2FppU78hy?aL8ԋJR:Ե#flI8=u('Y.$kZD]) A U[*i NƄT|]]{2pX\f^!L ) o9bMr𵳠+=е`7c&q{*-Ke̋C']$a)q)Vߊܼ|a:) pY\]Й.Ra>ŨfxZ>'S-כ&b2z}XzΚ30Lk:|`B=o H”Hq~D5(M[JRg)ag^8 RnJ]{Ni3᭒NklJ`光Zt8cP~NL9e)ƾ7+<<غcVqyՙ1$ ׺Yt-#>ѿogmm+n|ܗ.[Ya+@x@^"1t;6Vu2s.b{ *>:3 ц_cq=ߺ( ؇3'S˾ ! VpxWԪu^8Rw+RhRWiQ5ʣ|A1 E5`>Ϩ-?O߶zj{UhC$ =&nNkE n@F E*5P(uBݤ_[~Kҫ_*|`P݉Yc*2S!ޔH KAk ^u?| Hk׊- my92^'g@Hl^"u*qbyQxQC>H!Kfj^2Ğ*^ vB/,|;e3o'/b敬=zCaԝ&]~~ vHlw[6]gcO+rG\PKg;p -ɋ#seM"7pE)0['g%^=hJA> gqѢɇB[]P\Jr!y#c߸vĈ"0v˥B-b>KAjzV-L% פC"ӌf)=E \T` &37oEq ՜[!qUZuEɔX+PQZЗ!eW!3%} ̙0oaz )xSU^[b$3guH=;ً`wèY'͗U靰TTJZpZ no^{G'(/'JQED?HKcghQƞ B~K4Etsﵢ F>ߣԴQIwl V2b(xV5q% $ͅiΟ'W#Չ.tpQ&Aoͺpa(J~YuTlMI>3@I4DAz$fu̓>ª7^qzYYnSyJe9'LÕUB(Il]cGDg"C7jJ蹵nc+x=oR.KM>QxIT  È}kvBSr& "x%bLO>3&Vs)sX1ӟP1sa ԥRÁ8NϔDSKɯ/o,hGaHrrعWX6BGUU]=mrymҖFߏh &`ƅԺZ( ɵ"gJX vƼPwc#K}L*h#Է3siE^R[U෫k.i k&p>3FYQW/j.lVwS=Aœp2c>֘%nv-ج9l(.hJS}ӣ? Z!gv| #5UD=ػ(⺉d>aQ3gs5{O xG]Q6OE@{F K:X!Q\6(tԢ de1Pn5wR8տԪPNjclx:u%fZXhmnBhor]\ t-ٛ[v~l!L;Rso!c Bik9 ,lҴYdò<+OP5Z4<\}`/aZ>az{ȼT q#e7p+aB TP 16'K*?MKcU8_-C|R9g-Ёyڌ sxD;, ZqEWY&(L3]Vc뾇ђ6{(ߒtFkm{gXp21;zN$mvS3Jqף1}bGFܷ9ZaVVJ2P;x%)Q,/p` *vI-AuZk-yAm2@N,:?&[V8/[<떸&=A\ QP˵bIO$-s~#f+߈9|ғʯ'jCݣ9Z >`TKrR]knE}x7Xng>3c,(7WkPTL5ɉHPn .U' CtC`tZwLU g13iGh2}})l&NX[#qZ]J:T/ Sbܫ)K#+:sS$yv3sm\[Qo`_$,>bL @ѐUe:Yv'Vg.;MGm`#,;@FFGcP@V ~D^u:hՖDt믺8|ZD{9?xop.Cۙnʇ8m܃PZ%/Q얼%)a$]j= Y3S,4&Ǯxb^gg1hO""B~QSxp?k"}.TǐѕsQ?oO3#,Xe(+.͓< 3!SIISq;}rj嬒R\ VOp"]哽~G;gl{rj'ImfHؐStmoǑ8cxjn6DOy3: (Qp#@ڤc?W!◻`Ĺ 2 !E,Uniٖ9%c\.e ̊aB"cfNMevAR߶Qc&;0Rms ?ռ` HV+!][Fը4yU9*#KcStPerfBK/\QAP@;Ӱ=F ;]b/;-hv>8Wwgbh.9E3aSAݖg` ,Cw h<(xp'c?+D',cIꊗ>ܯVO|ev=êlL%SÞ'D.VC(~ .ω[:>-ݨު1!VuCǯE0793\ G "OF )lO/©!t>UdfNd˲ K̐ OZLŒD=4aA:.BUg5ڇMt!0:?HNk* 0P>5bcli ͮ@V\k;e8@evЂ4k0 ELqJ񦠦.i?̅HR?]?5KvvJ v6:[C:=7&>~$(},k>y- -C[vg>H§_K6@9tk0 8ȫ" q ͎)܅,\5;ZqGRק*kUjQ&o֦K *LޒQwIL!>9L̠^u汵r,oz\;=/2J']TQ^w|-@8'D 2 B|{q:ߡÏ9&e}h#%寮]O`=uX)؈x x֘=;@>*aP S m[^e5'3F'`}Rk2^4f/ѭ=|h:d~7+8̖{1cv^D*hC#̔9`UލOk]l*@ \etz&vL h~nLJXޠlzh/㾹4Cܞao=s7&Sbctt rPjYCiJ'|'unJyzD=s֝>UIZƧZ۞&G".9]r+1\0'桵&z~›7=lt+EX~5՟ڟNW [Ȥ%Ht*[_A/]@hǬxu/~oLobp(*bE:yrǻqoQ"Zv1F  q P.fE+kOF$ܑfa']g=GxvƑxi#e0zG(P\ɒ3_ v$ E(>n$}W;cogKC\Cg2b =9aj頔+xwd,lkT$SzzO<[ ބUE(D/9p>Mwi(B Ru;Y1%MkQ̣j"K`l^n*u[=bb"*ZaGƏq&!tV~U*6:a<o?c]:q 7@Ąqz7>V+ t OpkI%)!^'=mTHӄ5I`P2Q~Mج$"-m8w)}1~2s e BWq5݌@mpa)mt3$llRDCjՂ..ьf^{ V-z >]~\k }QLˢ )څ#˯0F.Ow.Y5¯ a\Q}u~qD&YTNHwÜJ%4+J,I.o}UV.3K~} xzqO2Zx[!Oa~4DeUG`ŵYf}%.1<;~К(*=Fz6]{L@4"kk^CιoI{nNyiO $tu~(|DBO(EX0so; :SE9JSx HpKF<-:?M ۴H~Ͽ1X:2 ɓoke=2qv8w]5v~G)(2m^U sTm2EF_A@LɥI~:[G[CK?pR߻4Sv ~imw>qyy%Ov͉vĽ_jt5G]wl8m23wKf2{uu5>b:p1+it{_ `>Ah#Ty%`L{@ݸ-f+¤pzU4awdEX,PUי\ w4 TcH?UAɴ}d\ 9񹉻/"q#8FDPvbZS'Z2l%\}%"ŝ)--[b\? 2bW+Is J( }E+(`s]~/7$ ~+0\ӢVٹK@Ȏn< 6-{ſ5`zγtkh*qifKs|Y ]]gńroeJ&b xdZ/w6`;>RCthøe wp/#vG<[+pǥ54ȳF;pQhfPL)nyQIaռvraam{R/o'1#*ܸiF; Ҷ^*Ƣ#0iq*Cbμ Y q4>6i-=qi>w.I O @%wS56 ((=]Q(bxI_}{oO.}nz/㲝0î~D.,H\L5/T200G䞲tt?Һ=әW9@yNk|Ի6x+ՈSugǖi<<ȇUVZ5N %t#=QGv0|l0XBs "se<^6iUו =|ɣOS=Pl`nO#!V$m׫2>4J1¾yu[:0248} ʢJ EC1LӔ,HAň k4vVUN [j'x0VI=[3rN&mU'y+ȻǗ'ȮGa.HĹ,̋3/^0FfogI4fX1:D0hC49~RJ&yZ`Lfk?P3LZ!C-reک?R1adP}%>^Xlџ"vj vioܬ<]ܐf&]oux[GD%Qd{kfMğEt3&+$>o3 f(Ҧi>{yBϐkMuLJ{$%`g*L1H" 5Qߪt{? x`Or }JE߯]ِ|u#U8S臝-~ fK$vS}`^܅anp\-[' .0>nO!~eX5Tibeb‡nX~krtXg]2*,:J{G=@8LYF<8٠0a鸸:| 7C?j{Z&d?E0M)J:>?s,:49P1uЎ. jN`| g +J< VSҶȟ_{,3؍c ;2c'gۀRd|O/ܡ+TϳX[?5vhhnY.Htv34ͮ+a fV@e25'sV-qn"w/BVTqڔz NLv,3Kjg `_r~AĞsgʗ 7N;jnmdJ2)&7FC`GC!P9tb (8IR?{KA5*K)Bƅd_@24zb3Kz9lL!Fq9T nR0ٯDmK8/~|IF6٘Ebj7Z1ގ Yh?l%B0o\S҃Gf# u!ŔtPw#Ov;u&'Q//!d$Oi=*̠9*ӃUqhϲtqINXkkFm9`Ӽ[_rni~XF' Z6d.lҍ`g^ DYt8+"ֻXYTvtT_,&ؽ=VxB>c`*X\"[7ܫf7uEg4Ph?uVy=%.Y}45r WM8oJNL ^9%njnէ/gZɉ{IVypS"ln>—8!O[RE.m\4Lӗ=ۙgA~^/"Z@*|)Zv'dkc ]Tv97(Mo* W!Ѓ(\ Ѿx""K-Ĉ-Mݭ3\U}UVr s۵81;yIКqOo\29Ah\NbUL[Pɤҧ{ njN}*_j,0Iq>{O]Ԯ &0yd64N7aUYvS-"f>pZPFb`c%dZE;S:Bk P?;鬋:?.wlʮ%m}PRZ ^e Iáe'G#p 5yf⩹ׁu)VM\.6úXvC"'TT#Hy1fcnD'vۚ 2f20n sދ1h0NBZ5xt\I/ٌ:]OjᙅL$}Q")cR쎉ѪgDa vֲd W4KKH[ԇ=.5}hw/N>~^k:wjڣ0'D+ _sjK%38YIz2)E?Άѕ;XPN")>ht\{*3s}~o8Ukjcʔ> {b?wA//>׈6_֞K* 7/̱Je5cS|:! 5 ad r3>ʻ@ܞsoqz&T+K*. eD\W."'>#|ʾ]i4èB2|{ߎ:[2I&GOFu&'O\/| 1h ,Z#(h_]mf/2O$kB,[KEo- Żxmow4Jx뜔R{U=`M aj;G@%@6Ϝ4GMѐ,d6.)a#y?7}HC-Y?Q<5N-r^$6֙Tbgkl" b<4 qWY C l-%ٰni_&>rq΋P)q9vn[M:},ejɫ2ĘIsCE^lUXvP<K' O֧7M_px6 #fNGn(a4 <@8Mjޅ1!C+D,-{騄 cn}>@<+BLu rRpL#ońRJGo ?~_?5ۼD8TԌ} +|v.Vnٳt-ɛUͦfEó{ 3XlW#&L3f#h|tI,wnRm.5 2e BNu ]D;!Gl6)L&c y٪F x]'rd&ƉM+@l?oHs6inoک i\#9rA7v:fV#BKK ȋ39&zP|N^bv~rJM|EَlZ{q 9` vD&Z_D*:(C±>7ӎi^b |-Ư3o3=㹚eҾ0l;,*e&mOK!TފôfWAG6j+Nz]:_gY@@Kozb@2LwKwnJP |r@xښ@Ӭ q/#{1_ MۄWIEzEJrz\zdo?e!;Y˘)*6Q65BX$'b}(3(*U[Μ.vf3zЕ' h;C@?Q\ ;"#܁e> o'ꔣLI|eǫ.Gxh;>M'T&$ed@ŏV1>۠7eS5[\L,@&kRQ@@ ,"dIPuhY#bψ,So[]]?,zWRa7l(x޹T=u1+6Й8bx4797Lv)Nojg CxG}Va+ O w.$X%+pOd%ӼBd ꅏF]Y8+InS2),OCV8/gf!fSeemT[?HVY!;4_7ђZZ5;pҐE2KE',Q_e˻[m HhƍF:myCwϫ;MM+wKwC\%и*hg_? -gF`{P'^QR8( ̅ Kc ;`jy=߭\6@0MRkh1ȃD,J .>U͑1k5QD "EZnK?f,kDQ  +[[,]Hr 6Iw̲0Ms/B m3C㱸bWwoم~d6%fl+ܲ|u`YaKUFNj۴ioTGdV wϤ;bLUa :BB;"D|+]iT^Kt[_X[M iB~_3oN ynOJ@>GKӦ?*K* uh`Q+;#r񄯃yG%+p;/CXtBry!FsxB~ﵱ] c~_DPd x =)i w17#7^qxZ i%KNZE&` #DL֥¿c7"="==CZ*-|I(E?ׂP+:|mKh!?],D+ +~Š8/?+}"\MV𴦛:2)!5i+-W@n 0(qc:/ S~{gQUl:" N.7E0F:gn~[;.}Eoԅâ~.k惸asWPfX^mu}x<Ύuj60e 'rT-};T;䴹wLjbXV{3 K䕉l-x睜G(-5:5:ִ2G qwum !Aʊ\v>zkܭ/q]2kX䓀.KFrV 偘(UYqN6tyre/]6u7 dztͣeyIP$-smZOg3[V?d`t?~ÖSk{޽kS D*I؆ oZ4L:#.`Wv~YrC!&u:ޝUc'njugԈ:;rV>%{GuՎByH=iYVR6R"EI:tQߌDre6;ckPGD K W],I=cC5ԭ`Fkc9(,/CWrV UӂKW8nİUWL!cu6 mbnҜ:Kl rS{/V#CatMI͟8<_4k@ǧ\c:Dax> 9C_~ kܢ*e|{ծz8jAETKS,tDqtad< »'&IJ .:3!BZ \@ҫ/b}{@w kG4gC-U^xѨG wSQƾZe$ߺ;%0# F0 ؽ0>-kyzZ};*{ =zO(@gKp8%a3L X nH#[NhE4HQXKv)TWTSEz6jBUү4jrQ8lS[:eƁ˞{A 2 ]{KKAU(3݁њ _7R= fG [mzY Qt`6 5=]A;+..JCO_ffDى n%ᯌizNUyT)#J?`$y7@A0h3 G͠BC:a:ABsa`}NL!rZg 7o-\1%Vs lo`;$ZK/:WBt2Fz[$1Z48{MRkS..az-(ܤ @Ls~.,#{̦m2.3Tď#me(nW8ι'_vt*2غZKqrB|Da A_]h? /JiMo pʹA@&w(s+N\&O3^Wp*Ae Jȩ3@Mߨ/<ؚ'XcH2:ԶAO Ђ݇;E2}a⨭i?N']<Ы}G",R0V9^ ⭱|=&+/ -~gw(Xիðۉ07:6I ָ/7E &vJ[qB#q(QŦ]p&T/Tnܸ܏lW|,OHt" w5%xBgs/d9!hLcvf'2E%o3Eɲ#u^$^F/?7na^&ra `:I<ʹtT"'}]R3K\|!%کwbf+2Õ#n*h'{Oo :7j>ᩲ򤩆R?OFEOZoO恧Jo$\vwwD}v ܅QSS=MԌ$VS0[I[< EYoGSw}@M nݪTs2`",a 'xJH{@=Og|hgnW%H }%>Cۇ]&N< ɶ9%+`qi#7vݱPԞ6@b#d8"xr#Fꚫ™>=^p p?b'Կ.uޤc z<@AG^@_s-VיhaC Oō3ڃ ڔ3 (vJTmAnCJtT˅<{e䏼ǐ6W`OHC* iDF8BO%bn:Y4b?0wD#`*t[ͥFv%YRtvηn*RzrS:aNy !Ys(pFMxf6\ $ӡ9+X. ,=9NCB^7`2jv1[}ZaOe b8tU'OG1ʔ&> 0|%Q~)El[.d)zMiO♸詏U 7RvalGeޚHRYcKvgAQ3OF{NZE4T66h6& ԛ7#rȩ8M9C+huJ1v]gs̐B.`<2v5nN#2U[oCC- V VW|'swa m`OOfʟ-I/˽ N!2yG8E]HGn4NVUpF@VвꈍLX q-3T$W#yGF]#QMD,zhgy;t"DC`Uك [P-l֟XNPRtyC>dܱM єU%MˠJ}T̾DX&&ţ;޵\w3vE\_loIaA3{~efz4`Skj7'liQmnW&V9 8 VU;iv Cn%7?q =,ۀq2"@T%L'sDC&`+,UxP_Y9&R(4yd, 檩ljL[?jfk26yNbLE42 9)n_NnaݠoG:d_[ϥ;\v^aᵭ pה`YR:BjWmj)D|#vX;lO}dP. w:TZTghX ldB"H (Fez{|nS,5snK1qiȂf-7Ii NpZ3 /S} rV ## ߇Zvs';2@W݀YȌnT*{UߴаۦeT9eXnW'gWD_ b@ƥV'Ȋn,K%u[:2f(M}KGIR(z_ǦNu/ |TH^p܂-27 ^41r晓Bߐርn 70Ft$k7cFr # w ҽ&Qm S!-v)\؃Ja QΦB/{-AڌAYv?WԽX=mFu S h]l\D(]쨷׋EI@4g,zуw..hEQTFndq>U)L'1G;~=ʤ28^{3W('! H/(E-/CF!v*/\ S3Q#|$rtH/ucɱm}PRv}4ry[o=x8X#T ᭒o)!*tK%N^efaW91,G4GC<-Йs_zމ^taÏj9ЙP}7o7E}1Df*)xK? m=<c@]5t  4YhZB&X[Q&`(֢"U6kLO` \ƼAgFnգe/ o(<5*DVdCWeQ]5e\)M-ƞ7xT(aᰰ$\4iC*+my.7fM)><7?"6_ۭ%Z3lI>WTS3[ H:!~oםU .[1 9R]'ٔ\K'cHs4Қ Jܦ*<[uSjqYB5s|LZ^Ɛ.ۀyo"ZΞd3=y\YnF|= 3x"V8ԔT;gcjgyJk.)XMc !TUQ|ܔfnnnK(In ljEHuꖤpq YHkf ;325[اBZF1l" 8ueXi2oa {NHtY<9:9qnwUs(P8Gbz;EӝoŲ0,יO POS3s ~Mwprktԛg_pfO L,ZZ#|^zd,3\NO݀p&V;qt*Y9iD1`TI1*U>0ÃW-\yQ?ʒm:q~ᨓ*U6W|1gJ6Ąڄ/ E$p _`zuj Oiq+VzQhn銠BRU%a6#VI~ြ:%Oű:D Z|sB`'UL$_8OX`a\nSaVn/:rosC(q*j{,k9˜ M%ns~dT\?^ɭ1)ݗN_r}Fʗ5عr6wU4nj7 )4a>wnߦ^!lelHGa n!@W (9}vP!cgnmu7W!Xce4?nLX7J<Ԕ1zkVځ_?٦l^;u/P Tu|FG-S &h\;G.sXF?`1%|?R8c\Q3Xn Q6HQ2Y jg@-#ӈYPNyQ19Z&+>T9Lhd]V4xaNza}X JT4+ɓz#zmKWo+7^y[zŧRU#ʥ_L"IpF"1)s\@7ޗ Hj2rjf%c*PCJ9 P]th D>$dJ`3@1֢h.lT'fd#Z;NYftn@Z8:ixQfEuk!~VIsbLOs!ĎDdY)v(I&xO/26q]űLdUASS+Ӂ0Jb'_uU0'3*1-s Qdā3;m+11G( ;D#!!6SAA;0=ߕ*ַD ~.sDǟDNz 1_#I[Dr^nA;Fs3"x(Bx)vՒ rBr1p<9 8=ws6 ٟVR촉}oqTY)7k6تvi^=NxE:.3j2*^y[5D;>${LWOs~-&S(j.02GQL!1#C7Ύkȯ=@E_=LJji'07{ELst GbaVE1MP4Ё&zD%uΚM 34|o*L5 oU8"!q4m/>GG&12t0!9((ztB[$!ٙ)Tdd"p(~ 5ʾ 6bʧ\1ѧC|҇huB^b@X=Rվ8UA1}MsӾ ̱ y]bud,.kƌNlܹ !"SnZ|K „3m%(D7 Iv›g̎8MCvXMVZC"W8zgq-ZO@.Սs ohx9hZJCQɖkP=M@S#et?k"՝7 >gaPzǛ]  j $dSr?ixuИ̯440w֦#@b!n㖕㳢 +VN?Őm5W豵2 y{!v<| IɠVeħ :tf\relȸ /IbMTS{!~TE6gB"%AXer%qθ}U+eKl:}+T=M|kj}-<ēF[`{ lryx*o ٞn"]">dt+ΔJRL*S~ksTBz?rw*!R*ú./vVNb}ڭAt_OyqK!2)):z)Cfޅ[| :ehӊ"\;ʥ9֎o-NHgR' MآI37452MvJ[NoC/-@@u">6J2[Ywv`f(wfA_i(SA֦cQUBT#MED^_@t@QWMF. 8ѣx?n%#*e3p'خY@w[,{#P7f2E5j5pQ# w~; r$AܨCWVCϐg݊+ N8;xtC3p)O.Ut4vc!y<>uQ×Q3<k%<@)`J$?Iky1 L<.M& Ř]u$0+AйœTBŮsh.KbK\=b*e: O ɓޛ]%xp#}ƒ(3͂W`R` QR PIs `ЎFo]sě A_a166,Wrr:yp 6;mT4}tk'@oM~|Z]]}'4$B^ ~ ᒪK%g.8KɰzE xE[ ySXҜGb޿lh6 `|ͱ%dҦb0ZPy#ε0ږ9pz ΀Uh41}YApUĺ!$@Aw#wffr>жz|st]r аv 5t| y=Db aAo7Hz㿉'0: f&͕(sE' mEs7)ngY,9K ZOnJd$龆t2\}^sc#&Ɠs¦R۟ TLj?T=ςlZd:j C/`,';{ [uK, ^ȾI7E\`+&tzgzb$0oNu~ /"lZ*%%5xXeoa\y51P"Vq6V@U%u 2ū>Z { /$~ܡ'y2e Y+{NN1XL$gcv"iZ7E^?c G?҅ KIF75|C~p̩ލ2|>]m^Eeގ:GBA \Ԏ8`t@⦲/}#c)_$GmQ!6|^Y2s%XڣEm2 tNNmLOkxvA6vL(d`k ,pd%Sz+haJڤ\ȯ:_\ZuRQ2PS9\o^M6>$"fZw&oY{2z,wV  Az(z靲bAj5_iuC;BAdW=FЄܿ:'8CޔxC>)䂗6 Y& M,5`LšݐL#׫b em0p<&otߞ{pI83`ٻ4}v+v2ȸ _@5.w=;>^X.*s"(9]pKQPN:Q `:1@vl䯴:N$P .ڐ ] NZQz=qffFAx EhnFcFBbz$!Z Cb>!@:Ʀ#&yj0\TdgW\Q}Yssh,IjϞ+ӵ)rbiqڙ (s]2 w*H>,CGvjK[z5YNQDq!9EeIuK'f7dw&PoHl+r`I5$2K@S~w q$dbU{? w b$ Z1htkc* ݋%Ean*Cև(dh-$o*(dBԢhh8]\z)bw< N;Q-ۭypL0t7E+to֧J豄:,Q Gb@_Ӳ(x$;n~b먃>Om`PѧxLqG0MҒNK2AqaR' O=sPW*r՟-ͅ" `z"|F Bx}r͝Ro TWc8=̺ zEЮ3La|`>}F :$1*jcP[o-6-6Mohv6ƒ(~̹fN%kSun_%#(6|X*BBMnSrAzҩ=0:Vo=;'I3 }l\>Ԭprf;;U_͑NXX#&И:@lp _0U蔮>3͕lf[2ze=uE?i{ 99#avoT?~{R#V&v1N`1h.!EaG')ua2jUӌFÉ*a*'Gg@Ex6j6?뤦0{s>vsGXg z(CV DY(ŞE"4*n){Z2}_K˥")6/p{8!FqG ?DJ~m0Xxg/[\C VrY7bgv412;B(iJl<:2y+_Gz%kiU 2BlA3Zꊇg)| P,YyČhٕxlCý!iը]l"`\s 9V:bg'ZlyHp3! (NW~n @J_:N6P[c-iTSH)U7i?f+p{'_C 5 7oPkY!x uz`GXDH"r+xbt)ڸ*PViP"~fQ&3(N?ߤ247\Q/][@)7 ]7'h[0U ec,AYHl#BBDӈF󣏛b3*Xz֞'AhWU@k6od~{L$N]&e%ܝ32یaSa~OyR3< { ٙ-zv%P{.oUOyLn"=La~`]fSCdoar!_bw2HpʝZZ@vgaߔ~06 & &4M]EH>8>$6cSQކկ ;gYX?P#y_Zd& ^fF3`Lk "'m'lO-x?E?XJyղ |"T{bΘ <~j7^WaʑX\AC$ .q;ed쥮s'r[ɜKtm)[tz5wN.(/ ^vS"_Ǵ]"Gi:H 5rk"͖n+_÷li(1-bn.u9:#a$en˱ $ea G 0tPuw!FADJIYLtߋ#`F['Mu$xF̀ gh.F 7%˔1a-gb+ktFEK%!AyUjoDIܢt'18PFaFMaFBAFyɑ keI5چ?شRbm'dZ֋]^AwFwmV1&%0$v2)Hҷ^_Ђ%wk\b[ J6?4v`T*`!U'JKiS~CGVl;NIHW.N^iMLYf2 כgfUSէ!gӥ˚4ϝ(axsiՌd*WD_B9a%ᴦBOھ t^zROMUi{nٜs܄!]}QlJ7:m7Eר]|gAfCR-/e$|7n0U(/3xx:*[`l2cj_۶ltƝ27'G^o_Q6+m-. $ 7A{c-sޘ,90.ZdAsDk #B4 BV{UnEx`Rʦ)(6Ã#wC,;IݺM[b׾EDz㶗j#GЛ&㦉C 9]vTSe5alܫX-0`^ŕsl6JgǢï"6,?=>|kBWiAB(6UKa2EN~ͦN ƾp18kͶ F}k+ 6I@Ni>s:al-Cijcv.G=.^}}G?V*aioDsE-/ "ܥMEɦ|VPXm%ݮ佒Nõ(yeW2~L~GS<ȔBuiuDm}-|EntL_톘BT/HVcԹfAݬ_$=F8!XŢ;o,r Z,D.&J;|e'5pƯ?ҳZ}SnGDJkUnC^+l6`l8rSHN߲shJ. ' NP^zDq IZȷVL*Ii{gUȞH4id-zNf]َ*Χ c7yT5W~r;4 U%.XLA |MnhPX~QB \?˂pwJj%z|Bquex}:`$ħ3S4ރ^_>eg7z;EN:M*s=κLy*y/B.B?9u>i~eo;6n bJ6] D[.hGuxHt&2BԘuĎK0 wMv?Z[']nx=u{=xb  vk0D|(| &tѦrnVo6Cu/&?ic7BLA2@#=|JנdP]=1uϺ/Q߈vCh'C0itt 0GI/]p &\hJfKs)@A{ ge6n+6 u2RjyE h"wQXM')+ [+u!Y k8}Qը$ KRR\ fR7{fDRv "A> r#G=["A5|RIqOL9,X:A9*k@"nPpI~Dv=r0N5:#a[ quiǔ#~5ҷs!"AV'J__RɛAqD\mwJ&.F1pX æCO2]pǨvIOѰ?>cCT֦ 0:7x}s}"dFs21!(aI#cX %3;_bM%-jPS~ 2,[6̒ϔ= FTK꘠uBz#e Ÿ%vn2& 矣|t.:ͿaS)>u)StiJB:/dRM4=,6$z_Fhl[I^=6w4@?n urUVLshK |ʍ>ȑ X]||3:֠+AAYH,|MæuTSSz|߅a1tb ,f>|ωvE3U~Wp& hW& Aԯ#Wx&r Mdu~$fxTG^{9pu6 jj9V3qp1VUB"W.C ?5g6i_g=A_98(7Kf{@[ʾX<֝ZLx:sek*)#WKA{yL(O^T6mgD06'ݦfZN+ϛÞ\ǦoNQn2#P>~܀ 7U~;D $k~5O[wgz6̀h;p|ζ]0Q{z=:ZQ8J֢AAet4~G0^jB:|U0 O0fG;S:NE_:EV6($,Ha?lhئy{Ps:V gQAP@Nw'6:'*qə"H9-y1)_nBqIe-|s eAFÂFd#q8,T?0 w0<Ѯ,cfTHQł[{i.syCu9K˘ 1J@٠]-Z 7 ǽp_tbR @n*DF}d!g9} AxEVj*>6QU@/b#S]c&-fj]i. Lض(MgƔݚ81g ?3[ұfS~ (/"OyHWXͦ] &ψR8aJE1ɴ|8E*Sq;;ɽyKkS؜LʹY3}bP}VوeDuS?(|W 7 tz$5 @8bۛ+c: 6/:?G/EM/g@Hbv 3OzV=azNj ) øF+yVMC3\ E.FwniJξ.ENwom@(&&(wH2e))7 nRx Ұ#j @ S]gf(Ra2w }IoArqY w3n/N87jbIqeךQw.97ѿ\l9x5$a[: }=yF&D\G/z!2;z!Q#zr_z|1(:*REX4@ a^$v:X X{kˎ+ﮚD=&u/d'wz3ɭ2ˣ@4QDlIp":Z?N4*Ĥ?Rx"Zf_WuG4?JXqqc`-ʅ @qTYVcs%':v;o޸n)D"M-K`-NB١&TA_\16u]HE5qHLA=K5,A="}ذU-9x8X5K=2]&D&>7-4z8f.E%;?1 q%dѶz,A|>2oݴa|&-txi6{yb:E!/ ur͞>X9ؾƵ^Sj֩D֙+MA1%an}FJ.DfdCC3rlSe%-"{utCw:Uz(Ů84L6Jq$sVOL( ~no#XPQOhffį"Ό;{VYĝqeÞ||FI{ $o%hNc ˶\Zb IC:X*VN[^z#9$ P@AT/blawh_p~',לzӔU'vh#kqDYYVڨn++*Q o=&잝tpQ. ЬGagsy_aeJE{1@#L9)% '@bd/ՄkZC]Q%j?4$!Ls)pb!Ljٔ͋y|quͥ!9;ܪ@]lt]]AQYvvB &!LA:5[MIBޛ\S5PI͞.]o-cC+wYoy IɠT"auU–os)ܟW2N#zGvml8(m`XBn8K'N`U{Zo%꥚]D_IR/S߾ZPdpko ֤{! v[L ݠD*8ׯU߰^' )9 RcURO]*hĜ;u6^ho%['/w(< QOU)6yqMIY㊌}4w=;V<:Ǯ`ׅ^m W.8e;i`#cF(5!pF}Zޥ!}.@/U6i KK5ur5..=!6ϦH,O9 %7 pfp~Xq/'תxB}03 ~MRn5H Mp%1DERO;7 X^C2#G/W+|..* W|S,\XA􍣀]s׷7`}wk5} RL JII~hFM̜~Ú U0_h ,ʼn M@IL5omb: V %9y)S{:I]˗E \z`H#Qu,S7J^VX*mH쏋֭*\)l?".]D`亥&eR+ s|6dUe%^D[?Tm =8tkU]p<ǵYUW;awHps}L7IgJΠ _oB˒/Vՙ#6^:Q5zd̜ѥxi0xدV{{[{ݖ-} Q` 03x/%etPw"V7>rlTqRiC0:];șGp?h ~_xF`ncALM ? PЊQ|@u5T6xk;x"Oi }.^L{݅d=L;GV02jưb#F^iUo9B"YO0GE];5_ϙQeכZLvaHW^#GpraZΙ:)&alʩ@`6e癕!D(TÝ7P:᣶*0/0 F T"G͹4Н5ƬGbcD$eU l RS4u.'NFH$K bHTRyTZY04grH 57eVPJ}? (pW9p9EQگY8aed"GkgL\WKs&!HQQL|t*cFf%;LZ %I;*hdQd$홁_VIFc#DD7g}T\낤~)fIJ45 a’QMGX;Ge0$JQ n8%[}t3wճE뾻&XZebM*uaOͺh O!|h}4yVm]#E؂MtSܱj/yUX]^AVh4^ÇqGr޶370h=oI8F |6[CTeQE6V\]b"Cmc 5'oh:`($20AJ5""0:te7E aGg /sN2#,n0)0"$ECS IFyCH-4o@T9ն {e֑,„ L"vx `*|%"Jjf<kם,{ݘl/B#kyI9`>Bsx{i>YoI: ~P» ȯ98` C`4U AfO{S\ކiwVqWh.+Nv F eOHi\KRܜ~Lr# NM*U?@3s* B]cP iyx9_H(8iҚ(h/% /)c-ɹY kEtdz282Uz "=+e^>A&6R%3UTTĨGp}s]uu%q-aá Tt׳\ʜxadWj@aMɊ*E[-F>_=_ܢkmw, POK+F ?'#&w;)I tJsԢ 4\H :+j8M>cĴrܦ%IRdF乱ϖ%39idg.H[!g@ rE<.v&w6_)&z6)Pq/2#Ȝ\('w-El>JI|j]'ϵh CzjGUz eP MU Q+AO>w<*hUULƳ(`Ŧ&.jTcsՁm]E ӽ- G~iF*u;pM#{D4ݬ+[c4vE"Һ(9?$ɥX@>!XM@0q%S RP2Όp-x-$o`!*B7`SaFԁ䒦9$x/vC[S@Ncv)I {vP70pa!{׭%+YSmTa?x.AF9K 0g wbi\VS"~ʿA!\tG '7!WMQp^;>𻍃aݯ0Vqmb;*B!p{SlxMI0>P,-nn$s$٤v?ɼ5\E-; pw4ٴ?P${""o=#?TH 6 2BJ c6P5HBrYˀOaV}5b VlבJ $aon'N f,Wg,춏E \u rQpD);܋q?JQeNU[ϒhtDd@6Л{!V#=u޴#R-ޢЌd4ukApn=I4}]>6C0qZJ[4QaS6>'2i= xWs6(Vp9Wӳ0vwI'ԗH.#c,% yCc pLބPFEZ23i2p{3f_ /gGRyܰqxJ&]Ă#[lq >UF_Rdޜ V!&jvw_01̊EEw qwAla/F)bSߊ%s:+4߂mdꦴ_!ۿ J;XHvk*c_^ E< 'ɪ~yɞmV\͈}5 yd}Wb|0XZ$Sq<4ԈKC'yE3xiL=wωU͡4j ےm|Iiot9Ɛ쯜Z\xc#l2"EMߠEBZȒuoJ^<2TfR?r6>{s=Dr}f>2+/띠4:1/y M6&3c~9QmJyYC;'K8pժy$eBu'g!-O_<*Ml+*_J VwNukBP+] P0@.ĬWJ'!P.R(umNS*, mdd =8JJ`#2[nYe9u $r\7_w ,6q#)>E0@QʤO?$8 2AACl[̈GzP>F"\L0Ǽ4A#K"js]g#ަϴM¹Aw nWPeQвШ$j,A$We;!=NJw9!]_ׯ$__U1|nERLcff!@yˤV(h76Jp] 0x2#6Q@!i{&~55y/cYN`)09(jʨ}R㸚xc)o둸s>Xul12%?7\Gm!"F)dIr:'ƽvCt8_RĘgw}4M8;:=ѵvT@.'i'{GS8:pxM*KNE[ Nm"l1ndm߯8y[>s˕K[E,IצE@sC &N8z*@T}I5qB(E67UŊ&TD!m ֽ֢">|"32Ɋp_ηeZQ,Co𙈯HDXF5D]j"jդ┽d*.JJ{mXG"{;8+]v~MBU 80Km]bun .*%\-OB{^2V d`-\p v`<'3?7(V8Xκk(gT=CVn} ǓsJ7Ƒ(+}t2>\_t6y܋܈žWIi[#+'i a'jpG{$9뫚8;f^ '],p29Bs#_ƥ| c,Bhe4kjJ+,cϜ$':i1v+E(&wV7 KTr[r d 7e-dF)չZӚzx ƀWXIw%53ůWviPy=IxpDJn%g+DoLecj"lsT{\aۯ%[u98$湨8.%9舛 u s,2=M 儊hM:#9%|x 3e=Koj|B,:!ݣkJ)c> DLzk~j - ` ֐P%ϒԼߌvj+à rhoWMUdkdXx7WҲcWpQr#sX?i+&p_Ցm ev?`O@𶥒ݟ5UUTuAtD4pkKQkN{v_U\H%mT$9Ek?!vd\JS|@Sͫ{B,cץqscM*ҁQF.x:D~5V>FKVv50G2['Y7^!#j 7`IE49aN#`!@;s΋~bE^ U-jm?KJ+SK58NlmyfX6{c Mm2 ZdVÑ'!t\2-#nFJLzȭD*f(#Uр2Qfa  Fy/0}FT7$ ӗhP^.V.#m'Ȣ:2|"1RJVP#JA&|gi@sF6<37/Yshvz`QVc_FEmGaǭ—v.0AN{ssMhEAPiAYz'Ĵ,u30YHC ]'.ҢXen 'B 7#ytW#V:pΔ͋)<4RbYma0"sk\ ;- *-Hl_#V˹}So?Z-BM\ VWcɰgɹ⶘ l` k]}>`}}L CFg% KVSIErJ?@%OQߟ!yDڊ /%.}5tG*xu*0~ki! A xavYɼK\4&#d3z9Y=?4!qY^:.}?M⺟A'[ڂ!.-[jKiS6z/@s7%+1O%|T$_c A%|Yb/eTD*c $+vh:͎H"֍yի>;[!ft]#LďaK@IMuvFɂ*&Ƹn2[shDrwl_Jnd3u(%(;Ȫlu{`IJZmØSk0âQꆳVybp18^Ξ@@ɞ,XڑmtʏL\K"+惁7[(vd4o%V"Ե{hH|>QQ6{i4=6eK.L^vNGWT[ K<5ۇg&:;J俪 ȻwXUmJZ \5:뿻oH%Rq]3E,oJgD /e6K_(,| Ny@ Z=S+§V}P6G1-I QK;4 "k3&6JCK%.N Z]xDICƴz%-MeVƪ͜rZ-sݓx>4f_̬'2?/9N# 6j0{N_DDWN >]ej$vI9bWP9q &cՌWӻ:J- $i) JٽŨ';iH ˇ Ȑ]dJU‡,5tMb"0TWfاmTbٟ JK8p 襗Q w>]/tH?>A7irp LjHlLJRc :h7]{jI/=Ar5t mX_.d0:*bćs%LKvu v!vOZ\[ Z7D[lm]3ŏh?/d;ɏqqbL dX!ϛ/w' e ʤ:]2xsg8뼚'َG.Jc se@){[rΞϳZG&8;`~l')լxHdy)'19ࢰ_ఒaƚ\7Υrij֟ff$8җ';9axVUPN=K[p9i{p\!kK58dKy ؇! x߼ qcPsOi"0n+R`XA#fr\*rځbur#] tNϫv4pl(5 eXΆaz'uFs[dvu1; g~oeC uru?)V52?# zJhnPQ&zlUfg`}}τu9^Ⱦl;s }/X;}v(Ph඄Hpq-% Ӣ=!r7!s*]cLoNpySeN-uݡ΢xDkt oqsEw귲hyfTʠ:x mL)-YXÀN݈O7:72Ď=卡bfU<3QRi&Sl+֓ݸl` MWfٱy݇hMYԮ]D\J}ӊ^)l338*zMri@n4\dqyC7|f?4t!N@UgIMi 7jkeu ?4ʷ[6D2Rn N[1z0S V0^ˆC=i,=#J*[鋌gF.ZfOnN"4'B?W 6'N5]WrW`e ̤gtĒC 7J-IFԓ{iNp8pF^eW+Ӌ :6[#1xʧĒ`CPju;tQv+;3ӘpѰ,sTk3/JU1 .<S-m+I?"hii`I""nx8Dc&dq:`$w-Y=^5FRnZT1j1ї5\Ait4Tg$EF{t%E7., %71~= ,0c:ΛTpMB6&2"|n"{RrS\c_DO4y#l jaRht\T*!,{Dԭ>V X̜N`gWF"+ɖUߖ)-^,[{N5A\\0qv2loWeMIsV,2x+s ?d@@YȸpS._mN&6 vNj1sĩ=GGEZo8so_ep-pڑq?% `P2du6]s%D5'ê=+|hl\X ˲l7k5`eYpA]cU6& "zT`#0$-< di]_NւCpZ7yUQͦ[fȘ*"V[wpHGQlrҔ )C+mHq8}韛G =wޢJum"*7$S+jf׃ȓtmL"0OaYI' @sh#$Cܗb2o͗ @Nʾjl(#`@ttN]{'HJ+.Mr3k6Lwe"鴨 H2RkϤO3-y9o2^z}{}s<}v%~*(HR_wOZ(viđuEP,~6 &_Z n>5Qd/H?`\Nzn\~Y\.H.65TQ9[cdUWK[fRR< |tQ$ApThw7_': OK (t]f`E$XHTk&Y6M5F[jMe MuQ%{!`Vq_bD8%鯿$V}D.G )Flz AkQ bi&Z ;jr^!'vS&wQO/_D@rq\)N S÷\țې~VF2Ң;2)eӚm8Ǖo32?tT^Ed)y@$'μK&J-RfD?Z4B igYqv1erwG>Y;TX 6HvYZH OIb8›~w ;z9NJrB_@6xq&e+lb3bp54b*.̓ZFH4꥖=xdzvNJX)ܟ1+$jkp2Z:#}7QN}yXE[tObV5AgP3SvZ<>_哞[L +u36NJZX"&c7{1CuRkj ?mt"*륨#2l_bI٧>8ǓNCZ]stF67fxMlW&qtB#+eY+kvJ1ElĮ( <2--+w `l6)<gJebf'(^ѭU}ߑǙt כ϶?I\>`X32T+.ȓ$= A\G'dp!f$6/C>Kg?= >Gx堰OZ"`:{."᚟Jit ZF !c9|vTzc0\C'= Zb1, zF7WN,ߴ"nT(uO&k7Q1DlTAQIPb4@ߛZs /u%9 ->vTdPv֙9Ǫ莑R聪6 zÃnEw55@Wԭ ߗ @Y0(>|mcgrR l@>{ 0\'x~#c#_u WZɉFq2{)U-mP U P"MPuUL?&[)p`D^@Bx"j*S'iɻ_dI\#rU]G"m UXd)F~n6q~2+;z:=TҰl5F%T-}⓹+%=ϤHzWn3}#ظI\%y` 8*jOj$b bX}@_ GYK7dv]v}d¥aM(4Wp=X>"R`Y|iF -)#ɳ/0dFFFy2~M'D6[Jں۾q81WX^;ɥgT$.Yw6by,o­[\b3/Ơ`[Do޹*"+4y+C[CSQ/N<,&kmW󹀜5|"{w/T}@d B:7^c"3?Qހp r>w71[ٞUmkT>/ՇxPȤYۉfe 7ĺ:yh3Vh_2BD _;v)j~T@xXlŰV:җ0r(8O6 il5i;a4qkD(g$'ڜ HhǫƯcdӇJGp͘4"X/nZPCxL0Gj~]{<h9~J\*J]H4/@֥ s p3~IΗ`#omszrh+ 85uΕ$`.},[dE.J8 aRF=HDu?;yXT槜6o҄YWsUY_?:M{MB}p 1[2:|>)/HRGx+"$]v|R6b7ڜRRpMsׁ4dQb#`_0FTC0\.UI1`ѡ/tEti4q\U%~>&&f8&} )W|(qpEa<0NSlrkM74El='lVes~/ڿ̈́"E^@\8 aHiӬH:ݥ,>eh6mQGb*ձn8h݃.Td\t%??i㓐qW0l҃t%+(UM6\)e?Q Zrz*V= 4 xF(Ei病 yupj`Y\ tr[|k)?U(u!6MPܞg%V]aEX9q^QU2b%8L#F},:דn j!.JO-7yaƲiDm5 2o%XY %%,Ș$̔O|Ҳ.&ָl]Oy󌘴==SH&@%Mao.̫R,;pћtCpڹKz|02Sdx컊$T]21VQF$'GBX`&d8_ 9 ԦNa,ء Ppeo{hRkRMp < L}I5*h}I[Pe,nʗ޻Rönru\izV$s6iIq"T<[]T/DC+Q8*)щ@YrfebOmKSD1nC<%9Zt_j.MTȣ#F8AFG,:ˌNYReaɿoi&IZĐ7ц3[Z+Jx^X 맧Ni̕j4 eKgJhPە|jݯ85R۱xvF2Iu_ˀ."JRx Ư\SMX,l֌,eh d?7p-Ku\9! [Pu(O̪Yf7t-֐p*HCyc 0ilgŌ^~kPcW {E wxf-U*L~BुS7^,<R0ILwNd|tI2&Fx5f 5kb) eun h&K݋QYwX5gW >L$LM ¸̐m?vmm=|ufJI.XqgQ 8*-GIeH|+\^{ER{c5ii_:Up{q3PX~i{*3V⓽['KP?dV箣=/E[4%p殼+kX<Ή7Zvxq{!54BSj9aZNP&s5R/SR*J"[1NM*Ȑe fj[twrгqUQp{GeZZƬz,q=m`Is^IGML5jWBsh:KkEˇ\-<^遰G00zĂ[Gc͌,Cde%XF ɓ)Hbo!|DX2u-%b6참-!7Se՛lf% cYcL*r0~\=NoM題-Xd!<:;7)PMz֬: mrŚ2J"78|2#db[T^6#7#(j9R+C!1p0FC>aDV ʞTaA9\Ž"b x6%c$i3(R4]\ϿQ/7tN6fLi>?UOv4!kR%sH?a?yOt}+6Y 6ڙ4;2X%*7(.{ceZbq*1Axzh++9%%95I0 wF` 1հp#k({j'"D&%4Ε^7$? {b>t2y3p.9tg8v"ZL-m!R dH Md R_R U7וh5z4/1jmb5|AWODRCCXt`y-)F!0dL:҇opdڿR VۋRj%:UkL=}Ku,O,"n+FQb^^3|ӫd M!pd8맩{ {6K<Ѓ ~HWdUWSbeyL%"θ9f aW4 BÁm9=a*Ti3D[,3HrC(IERGM$qn,? ]EZ93_,j4pyl0DR&.I džv3"(qU}P9tk{vE"!)*KѺ%R1m*U=">8S 4$|>ȎDB݅lw yt&֡&so,hm{<] 2 f$e/y,`h1kNf6'hy۶ ~(sQ29?J_c1|3#|0ۀ@w^&^ew+j`n5 zt-nF1d3j{*MCn6]|me+_#t{wJZR13WTpm%W毂ysIk E$ɦ1gKҭ@f;l*PgpTVV ±%TiPy:cd͎>e5Y 8 ۞f~mSK,FS Xoct"7Hy$xQ>1\=w1uӁZދ}v[IK]HS9~}y-SXNzf`u1=X)1*@:BMUѝWj׬Qz##\s5b^m:lioffDZVE0յg>yD?\9>a O~O|m**Wd0G6^*xg4a?s3b{a} 8ձ](4J, !Q'JO75*)kro2K`9W2n l|f"w`z}sD_0M4 8`_1$ٸ>GT%sN 4y1!Ta~8^1rV[Uڻ>`7]&"('M6p+| eX3BebGg= LJFcc`NhO'Sf6;qgiFQ2ꢻS8~Z\œEJᬱMzk(*&ah4m9VbpIr%T}0/@W4{JU*Lpoyp}̧dzl]٠m\`2JR9T8z)%v".hVsnۖ,36$)Nvm;ϊm9tiZ ;$Byv(Vԋ~C@.m\T|4Ĩe4 vrǟ Tk܎ڣ $ͪJd80ɗsS\A;kDKzx#].*?oך] yb(i57~oNym[ecrui)9FN '4j^ׇ?%:L K(r ڊz^_TrzmMZf`œ*ldaNN!Rȫ .l":Ôg3.l7:mexhcVŜ|)Y'j|]-WPE!vX`/5Q4s;FORފvz׀df rk) OM0`^xtk5u`E;]|&ld?񥯆͂(؉v_-m 3^ɉJD|BRbѭ sW,ۣoH WUâ5lI3-K,v&* ~_2CgM|$h/(CYO6:vb8^MGv  ŠS:!9o}N^ uB>y^ { a %"fEtLU8儕!۹-px+\Oܤ@qmsڪY㾧ՅB>u$h thМ?R f9~ tr<m!;W"j!ݔkB / @DjWظ3w[h1A 3CtR-V[ <\CV$PE9HX;yx{-"iw|˽mHJA;ac؄п="-;): XpR}wH5@D2_J TG~vJ35Ю6Ye-@a\=X-ZXt] ~ۚVw:ν <.OhEBw2~W?$eA憝٬5DR1B>7 ̗@Md=%/LiC6\_; #n)ayɦC`ZKHZT5Y )dG)e< $&$z;:*) LO,+^ i} OF*\Ab3R-/ʼynVXZ&jg[q'I3ʘս ojvđ t],P()y"*v6l_I-xJ @Fc;KVpHy$g:#8Vb,!-mIxurq 󸬮w1 Fa;=Ju`-z#IC><XN @+v1 ]}9 UQ<0[ҁ;,Z`B",,#?~N3 "9MV_ꓳ&:QE,pRn[@L̪,nS<{21rn2ƒjԲ [ؽtP&/wr9~;B2BMey+*nM(6Hn}{C5l>*!? i4{0U^!˖FgW#a8|NXu?'wzVoMR gƓ "_u,rRPPT$}qND"UujEܕ"8C NqҞ-h.(`{beIZ=}zCrҕ%UTGE{q1EVLn" >~exR*(/U`^m;US"}Z@ a:ޖE7rHSOVy*RdX?}}+RRrr15}UӐe[6qyZчv.tsc$Q΅!EB(l_. ՈAORDJ1; w%52 {U?XCƏ=~ a]_. t>{r,!zs#D((IBy'IEd5(X26FnlXqoL6D!@  Ӳ>N"bźݓQ+y5OG9 q94&8*y7`&3(!W1#YWs3JQy8p(`F@q^~ ZR~]zZ `ˣVCEbc)OIt20} S)bQ WXG{z/L˿J8b7f /`i=<^)ׂ(*5pi^emKU$tXum^F)j%=G:MM7O*IzP5 <͌΂GӶ8UmrQ8qnèx7m@Jw{<[z;dfAU`'l:|92GijVu?s=DxaNNӵ#<57$ZRPV)f5뫳B+Bh[]`R)d)D EXU!b]&x yR&zD"dKz}x] "Kh}=x'\hMFHLꇄO‘Zy#rEKrkԩabdɘfOL^{U< tx_G=ʳȥJ½ y+`I))@d׸a5y1L@s6JQܾPBz,Kdm%W1`Q}T4@lEm"@+l9%f}ߨg7Kbs7^zGg;Uest:8ΠKԛBsi^<|GraMPZlD j,D|oQ^)M(jDgb$&[S.eu9KA4Dy?w?9Ul׏bsXjO"7 !݀RpL.FXf!u 3e"T b`O'1erm?G>(IlՐ{BxoN5*Ff;BW!l9[Uy5p]֠Edh9]3ǘe؆yf#(r5?\[$7?O=]c$uk|=ݲ5?Z qt ŭ|ĕGg0p{a@I{7qXn\tUrqPClA'3=tW VVPNjhLy7+D9PfVerWg 4_E*H0_XE2aUQaP?ٕ-MMO_M v%SCOt uT@LTo#ǣE/[tmtmzn Ͳ (>lr|m>P1F:S o;?P'kOGz*_cZ)ОDу+Qw`(&~^̺8¬1!zc !@sj9!R#7V#R߂JSLğ-geE'>Q኱qdVYܿ@&`gu\QѱG\logSxzL萍%6_`_r1}>0Pe༵֞v6JE^Céw.==g w4\bK _@kfy>xXp{AtopBŌ|6PPv-{iQiknV>*(¤G̞,:37V@.R'͑%59P$V]xGJIH^Kmx_nS^}H:У|z&JV!^兺7.R/ ;~-1)#XL$r! &;]ϰ+ h_D_B\DG\ˆei=uJKR2.Ҍdh򄨷/ѾIcM2M7R^-7c_yXW{/pO(#i{]U!+r ODT˂aܸ+9E:`XN_VV&MrW4:2ӵ 8N;n |ß 2X"j);<( 1єq,D5' eLÎ44($n8nsɠ?gDbs"`HA59Ͳ^=-I}P"Qoj:F埥XQOȭOZ11sTRНHZ]& 0"=|:rՎ|\{,L]\)<Ћ::".ʮ:x?n${^c T&L3(Y?q ezJRxOjp+lot`![yG# ,v! <]!iҎIZ<褢N-ҨRgx!U/C3FިESOzu Z\sU |#ԩ:ʇ VݙXua*wdT-T+vHdMjϿqVhv!3^E]}m|E[ }LW K7\*ntF-@]_?G^%\O˿#$ju @I\=Byw~VA̒-@aZ> n$3,gwj}&}aS<>XHqȠ^ 2GcH͈ΥGTli9YP~C!rH4mSRq*xd w /ob`K~[ 8|Hqߡ6Eܯ@ܷZP8j,ʗ-\&^.`M1W6 /D/B#~Ho)6[ͯ_예hJ&-1\cTNM^:4|) Dbmh6͞a1p#sIe m.ì8Z/8*=و:_ggey<٧$ E:,qY(>ѓk`} UH ~FFX=w܎}M|5NE&#9+i Qx`=.bQCDs9/!7Q4jߏd-?K(eYY%{֝!$ ?!BeG>0xwn4m^;jX3{2IXzQ%BS2[x[v &80g˨YMe65[_&'IXh DzDD$DlFKl=Թ#ZuNxӁ-Y'Cs1Jlj/^gDpu-9 r]Qf|NRj=鈋x%4ZM2yKyO(x`))`>̊xD╗r0qswX\.󡙽- YfaҤ>VwR6$Q\$#hg6S,0EZVh X6޶y;@5J}Z/h<АmO-%&Ӈ? $5 =˜GŀF7 vcAkr4E٨ޏUAaz_Rl}c0O-O׽O"kҼ 3 "O،Z~fn@nE¾jMXL#w>74!s# 9 _V5ljr#yز#7_楬UMTS!;$krq?O(Ps G{r՜5k1VS k~frGcxbw]أq}C*e3ƚCa(w.%V?"iPAk;9G_9(0i.[LWk?LqJMz׮$4Pb/:D$= š~&a) ōij6 Fy2)ՌO`4Zm^Pw)0u)3@Ro`7[Dk;Y9k ,/pEYErD `M )[VHb͜٨ H89oQ("vA~ڍçˏA>PW1n 1YξY6]!DCOi/N81%.;,U;:̀ͭb8lB}#\֌n?]p-3a}5{k+[݆8k~>d/8O535z'KHItfrҡC~y]lzx.4")_ޕ- l0F\S=nz!.92h}kz(0E@ xhLH ؏ ƻt˴> źC\v <6])-3xT^آ{s3JЃBPe_fDft$Was*N4ڄgе2-ZqM{ewwPG&mlBVts-MzlHt #X:oޡҍGM+ t)åWo Ï3]c`dRjcڷKmozဪdgf[ 6&'r}k3n"feOO:iI<0oSuf /d0f,ph%i?cpeͫSa(U5^WqTp$X`94|bWAO+´Ke J=g4/mA^kK V#(he":6"ȉv>{/JF_8!nnr>>e<*M  C.LX[p('Ji`0LR}m;I)D)]@.~7]^Xk;7B7? ZW|&o ui~VjȌτL$lcBV~dxg?#Wkg{J:~! G4nku(PNp~ʫN}Q؉F:!žI" .DL.mahf$GnB? ۏ:ʸ]iRvɇ:1)8FQ̦ 0I J^tDd Cd}\A*酘CtW$LoRv{"M]A-d=gA*wz#Ŧ7pq$s[ʄ9l UD(o Eb-DxK2 p6!hɈvGE%V&rrJ"bXc? o_*[H7E-tz<Xkδ.[ YJ6G( KXM?Igw=/ 7c:V\6K[e[(@7;'*,U/h L PD~`=O9tjud]85'+\ZIlq}닜tqd-z:N8m;1YQ\2M@DdL{VOLP)!ap%,#lPQ 1@dx[-OJ8"Gq}#4NVb5 ͂ xⱩT$"5tR,n-_E"G'~s_Wi"`G1m9.#R4xRƍ>uO[Q VZW]mo_Р FR&Jnx+A` JИ5;mm^ |ևF\]fPGIcrq'~V0敼pPdavf2}r c`Zp41;WA{'jn2;A,]2ѐbfOIŜ«KM.ptь)/+pXU cQim9DpIUnj!`G"UX߅DS}Gd Zc΁=&f#,UIqFhDΉ9d3 PGDM|EśojB aV_,\C34؋+0AEʇGQ]f/]g&K`ud$2PQ*6Q>AC&J"!cF\K2%jגط aVН:q ve qޙ@_x#}(.?hMS^6!>bM݊?HsqڝE;"PDkgueb3su-G`uWr\m@L+A5pC]h(Lmt; c3ip"s ys_FYdQeȸ7*FFi<%n>`NT˒=> ^C* TVS`G Ok. z){*jpRޣ`k"RлNQczN:V{PaRЊ<F3,,BKvh5E8~s},$ujQY*>?!ֵؑJ5Vm 5|̊V^/ğ$D:ǩ2CNu{b/9^ڲ.K?X$Š}B#;!V 55M{X'6zP/,3^b}[Zf#@̙IDE}xd1vEs˩;]Fs6[-uc^5f^ro$xl9[(CWf;ïu;P.~dWoiPldF4=SwDcˈwa3]ApNZϞHݽ n5Klv[dJPV8׹nuR~"R8+W-[b.%_sr):-`BlDϕG]|r!,YQǓwsu?fҔ3jwsVTVq .gZφ2灷5SZN@/};*KAh_]yrh,/?*jT`֡;1}dAJqPs^IgPt;ZiHO~rȦ\@-fL_,t 6,K -B!zwZ4Cw3V؁-g70\ٖ mZ\V&WHP.hr&D/D鷡=~K~'p%H-'{ad[P>3/_B24J'5Q1CZayEJ5Y HC@LrG E[五{}~\kX=KH)9uD_TM9_{KNycưP7yKIGk *C`]oU7NblX/y ,ߦR{Qݏd?{c&2rB<4o"EӊXG f7 "^G+s%!?BXjR-74co`+ҎXq>jn{afC-~D ]ha/1)m9l6 2b~<'Od$2YabFT"h}?ko4s6F?y',IRĘӋo3uyR|`Я}EX"<1uwlRŽ k"DLxHCO w6'NLSn\n4*[\1g.c%Ai`Z|8E Cb x9=pck_G'fio K4{J_ 4?)]沞`ACOb}98ucVe-/0`*QPS4^'~a*fbg w:$}nWN,UOXtEL<|zGjRΜ[&eS2?-oz{(UWG@'n0t]<ˬQi33U|>l4&\.Lu\yS0ƟlxyYϒ_HiEdV}\g=:/ٜS}{%̏%|<-9ĉ}V5=g`&O2]jBS,%ؘjhXE^+4hpvl@m-RN6-,t}9c9bߐ}ݕK O'4MӔ UB9HNCLOUSZHT1Ǒ9y]-N7߁x*=}d1U_=̏/!=\Uf.ͶC캥xY8,z ZBvg-Jm+Wr G]vV|ȋ Yv @JIţƏ=k/zjĨ4p&3zצТްj?0rjEeaf  /$1h[ H7 ɞʦxCjV!o{`PNuDJtOV=WMWU6| ʎl  3RnI/O_vxP\ 2$</Q=T&B&RvA. w1#& Mخɥ:|_MD·uB,"U0`{tp+~`$X 8>r:3'#MuwEs *rJG磌7A7yi .3))+;E20 rԃl$$v@ NQ- R5}ssDP<)b?N]R p'HAбa DGH.~{$ϓQFeݨ˜0? %YJtrʼnȅ'-.Bӧ{p|5x)@ofY$7UaECΒ:ϴ~W5*AF̳VŃ[zS^1:tIBLC6-zٞ[jj)f%Љ=ٱn'eC' Ɏ+RGqmA̴$}Z?mYEH4 p$P2{_:-/g x<$ʔ [yHi@=Ѩvve]$a'66Ʊ~yXE Ǿka> iH*f\\z+؈_yKR ƒ(z=4e +}9NeO{F{w ^'LG10<|E-i.`:5F=4#V/ \.0v7TSuqXʼ%p?$г\Wcݛ %=M@z˵oɀ E?TBЈ8H>$PzӻQLMDKlm #iҕ[w%` (隋s8еu ͫoƲhu| ~5La:} _EPV^'<>ZTlTH@ 0RwԽDž6)½o_aSsmHB<.Z0waET.LwW[9tmA':R FT]cGG;AљJ̫f .Od_ܥOn#u땽~I)s h M$Ěd=(٨kåK"^@6<&]SOSc9("qPsSQ<[$,[$%R«4KZ! |3U9y-z;ަN%{%%s_K:S$zSYonw9Xv)~'kቂ/d{{7(~\y$R<4YMaH-!K\vo:綠< 'Z`k"}XR֔~,fВ9l7/s )[>BgmßE7Z= cp`|XVj˒=4rG>_'\1#7 :b>9J c=YJY\*uS.z )6;< ݺc.?ȷ_ dq]:@;V`SܽkZ" 3ɷ˟otuӓU-d~8բBB/ts*ܢU{q`kOI[snl4Dhe-?y7 TurJ ܓ ]@Y:"NU~,.(boJa9\Vez6E_mZBG,h 3~hZ`D?7`}m+d{th?ztssYų13VĈatCòaݸ89Eꮃ_WU` %z5⚟/>ﵜ-j+XЌGޭɆOi%( ۵^C{J+NXjMBa/iPp[='%v%.iECa7oqVw[q43\W3qpK= _ @>pL&2ǼԤ'nA&Ɩ:HiɈoX(;묃1^fޑš2h._?ru`J25q1I'Ч_t+?S;YrR׆J=+\sY) lɃ zeןlb!Mh2a1 fZHgG114k"x wr954QHǍXI3@_1ua Fs`f+ v;iHw,NfYKtwyDy%ca0]vl|s҃١8cZ78"} I scٹ*>Rvju(G+֢=2qޑ&D|YL"-| $:v> ?ݘG+ӛE3 }^'A#ݦ̌>D_= nMf:its/J71^xMl-vuj!K5^ZYNζ<z 2+?sDc}ktU΍JL_Cg|m]pAsJ< Ug/ :Up[l#6tZ5MArť'iv  ~F^m'K}|PPηDI8{gL ld4\C ןwL~. 򥐀a+0 \;@?o ^rJZyĻ -c=BL Zo6܃Y3Ӆ[Ma`xS9/EvV Z]g TVGR,"v'bU˂(k&ކ.l[9do` DU M? A *_b%oH NCZ+dKj݀ (jy _P &-sە>Jd<34{IyQpFl LmQx]tf Lϵl_T#SUn4xFfa*'6ݭUOe' ,@Ek7ٶxs3UC'/acMJ?#dN+N16[0G. M֞L#b@+Ѷ>UzfюV.!t6b5NX\0L7Ĵ]#~nC>I[ j]aO,v6ÛFOr#\ը$ށ/ƧP/kc75"$]{$!"l`[evȝL(tbeb^I?LMQqR27]-%OL r%0;A>,nY1w OҤ8ʰ1.ISdN"uۣ=2^\5 4v1܅ >x.lƙF^qZټ{6$ ElyhGq'NWP|QLǧ׫e9W`կdjoQOEk|uҎGx(Evhj*زaՂ2>xĹ#OL|oCvpD=@I GgYT hdZ8ٱ(CY0z u?wnq0ԪTW0Z&w 6찆ZJ_oAYAg54D'?J')IGӳk?Ǒ9i4`o5$預Tlun0wwuR&.`0OF:pi$@DA{ ^" OGXj;2D A5~2ܓrK+yՉ\iSzMLQi Z[.`]+2; X0Gg7/TrϩXF;,Pn3_ ycgdOTXۚvFCS7[N})K[#1mn.hnn܅ؖ3A!i+~CrF.?+ ׯ7=]UHu/U4բGaa%w1KmEG&\ŝr#4XݡXذR,י`w2|U"=¼4KbC{$`wHƬٿ+\ 7,& 2pπdK": gf+R7֘ )e㟟 |+D5.+0xz**}a)w,5ÝOS0trɇ5bxn0.jY!l.&8#AOĀ%Lza, '{ )R c(!,g}}5\=\G+H] VBGt ؞QXtq# m .,\WM]()PnQ\􀙉oӒ.&[6f킈i_ 6I.qM9}!MFw+n6;1hUAQ˻t<xy|N*G.hjTu}M:4~TAlnoJdkz9cRįaf^d=5C5БpO"e|qAMOkƒp!BӞVUȃ\H)%2TEkjv$͸q.]ey0 2r <& ~c8< %t^q}08VI<ӁuvSv]w{5*8'梗m+'z%5&V(@]TPUNOc@ HZm2:9#2;n RirWsb)T8ln"J^7 3b~FP=[Socu40Tgэ\YGs9x=V,J BE:rf#(ͅv^=\.eù3>[m*z]П,beSsjH68 x>ȂֱGO!\S*\([_v 4 jK= 坘Y[>2ynG<¡E~1O_-ȼSn^k\&سZ8u4^ӢւOADaۧI9"!vհi-Of=0OM;&5P}l5h̠*U8E*J ]#ѡ5^HK@zt $|>Q1IDe\=5t`Ba1o'XIuB<D7ŷԕFRbrQuoX[Y+r,qijk7}[I4lEЖc~LBBaa@(~kYh,X,GPzҬ6߂3ڟ1i@Rd)r$.UY@9,N5OeHn`9/@6&2v(o.e)u_$VboӜr@ c}}KTj _x0*'45<l/R^:H'%vz'ױk Ճ+o}2;}jZp樝tQ;vS,oԮYήVb{aŘi%^%_&#~${-" tRO[w>&}Vr$l+,߶tTTs  IX$Y S=E~tm3M+ﺜ!4Z$>xh9,ĐA4ŬSō?Z> T/3hХم^|7Xo* 1.1̎V\,f 5WeJIZ V=á`AV3e:պ%Q-<;G|M ,c缷  7F^ߎI$l<)- OxlŴLI1 ?C 2Ьx鏚:{۾({MݏU`g^RoT 2i 8;_ڸdzʇ4< nإ:.e&歞A ue> 4ƱӱT; |9aRt}Q|a>D]{j$f_AsEz.=@WYu/¥iD7Y4!_u-"? W<[R$9soF8*օ~sY+E(TcxM>ZXPw=&agyЩma gDx*uL_@o|쿕JL) o ~BDx+sOH2ôdrh*hiҖ|y)_ŒڪԊQi)dxʺfߝTv.msj m,2U_A]", 71i٪k-jn-$v*lFL?zhf,F"-PݦUP gH0.& 1ޫhĨ16'TBsFэʊnps; :pxYG}\5 8FB:Jۏn,94J^JV+>Rȉlo龇!&|g˳V3qX8Dt@zٟ71؛eq`-om4P" d2^Eef9BǫЍ~/Wލd1o 7#8+u~.gAr5 }mr+*6'hxw}+:Y-"5QϼӴ4hy,v z11qYvnwM.AFWV6I)i &.h_zgh>Jai:cQChMT j T|\Ć)C%ց˨+i0i2fSq3e$HB;\@O*# z#X)\9}UR[B$_|c",+oȈ&{IdZ*D%E2H:dS(IИbjdwO.ۚ,*Sx[_GRn~obfi?9h"Ҩ`LIǶ[7C 0$S uF$-2\83{uƌ3u%zF , I\IhtvH=-o2)e,+ & ,2s*-  "+j{w~U4^{Ўj~<|4稤]|tNp8dqmF:&hm lAP}n5ȝm%qsAxG2Ui](+1ժ'̣O8mSѩUܲj,dTY0-A.vMPqFqtxWPq:RFh9D+S~cCBSp|:R9^fc)uUuXܳjm2}{_C)`䑥lc{wI3O99!HRO_1;渕Q.od( F˟禝#=iEKe? XmT8,F.P.ƍ*)KId]dՆ\W?C*|?$,gŨRc"M(cMnX}Uh?NſҺH}MɵSc0VOAM?>nn8ǚAAmh/9E,d3{~5vUxiNלʘ.l $<#ںx!T"QK+l"p^ w#%~؃{NKkɨ{ʵ^Б=oX8زuax(SU'cjW)Vq5r<=ErՅk-q19>2u8%`"yEtv~Ʀ3FHc({)JT㜕Z0G<+V=VPBfCdf|!= :04T&w:~~p(q"㉔Ctؕl:o_'a6n4r ~q\̥;9_S2|K_|vȯ44pEYC(;/+udъv^O9 Xye+v.xaJOڐ Qz) P,Fh J` }R2 !%m!zҁ)t\a h>i|Z".c׵K6^.Cf@;[rqv* qhqb_3ޑ4qMedh/ݗ6Zen,9kM=y8P+3>MRf¥燩 ,/O)oɑrXxM |f( .ғDaL! ?I׆xtS#+&u AE&^xח|x5pxA~D@ G~DyDKz홂b+w+rݞp!t> ;` #/!i%CjR=Ә4%}zuQGoPr8hC3XD%Vnj-2!və<b^SDF3@e/ZhH$v7+.rnIPg8ʆi`-S|xxiw' sAtGp|4KO`LT q.LJ3 ochPtϳ:v=f(ȿ^y9Ӕ(;孢P4-lalh kg3+AmZpp+< FA폾qGvj)@ǀl?l%HԭJ #ą5Qֆ.3Ϥ򼲙MnKJm׊,5!W\$55Xn.kαu #-EӝO#. 2T-d/Aɏ)OȦT3JE2؍ԘۀhɷrD>%b*趍RpLHw1eђYqXL~VQ8ᣁ;QVH"r_)ngLUSv78o&Vj$:{aӱ4JvEDx c[#M`b8L#zv\f뻸g^O%Vz-|B$S'{F=YdžJ 4LՂBH@LU Id8es*d J򫦃#!525uc@Id@̿ `se:pQ68N[>N<( ,ڑ6OhأXQWұ yd1k!KaBZXMW0CmHs(: ȌXN؉|k`$! c: <{8v"Ioê@0< {^@` 9?h{è(t4f X"}7-Ys">q AuqJ̵"^o"{~ 42jc_sT幬6m烮_;^FborSCRuj ]1 pIڕ`x ?d* [`kY|@,.ud< hf[pMn"WR| p#yaLnLkh $" lUCs 욧o@LjMZ B#0MYEfV#4w@Dח+t9&r0@Xu Ƌ暙FD@Ss& Yi:/ͤAg HܕO!=r  1.CoyJ(!.4; 0_B7 JmZ3RݙKCs 9\}KjnlP${_CmYWGusu\[Ln;DGR6xYRC7. ۜ-s'p]n"XܶONǹ5݀ ډsXmNi؂hGX1LP 2l!dgD%-rae2\VsЎ$;EEehy|֮(*\ &@gߨZ 9iM~[ROma6VBF|YH] q7 N(̩c,>rB-;?Z#R|_ pYRI|Oi^Y[ԥ1GF sP #Y*7tKf=VL[TSR bexVT~@[1Ym_=հj'wjHLk)sDߺx]^u~͐^Z6~+45~ջȾ3R铂FyS7ho׸o>C1-#p@DVlM{~{cܳrQ{og)kjA ؕjL4_ϛ:Er+sÃztl7u. \ZHʵacPx "7EZ U:{n~a0T*,` Z~~4{ZԞZ֡2ʠ?g-kub<ԹSΕbXFy!Yˢu* V; @AIXM]Dr-;|\zM8ĕkp)#`2R߿=j.Vgg3Ffshj׼izڪׂHm5/d( U Jd];G&.s8H:.bzpFav5S0$^ `E50Y7Fnp #av194j4^$P{0U{@lw$F;f˾K?YGnϹ25|FGDq O=F/GrWI֪F'tCē,D5bLbΏ`e &h|=4 7N2kwjG[򥮺EV$6eP}i)b.yK4'JnRy˂* Bs2ZV L=l1y! .4sOnݬh%`uER+ۙ h퍙zsic^?ñ/=!BSP~c>Z J}?v#|VZ\oKچ *L s?w{۩휟՟ 9⶟* =1gmg xxcAE' ؽ⅘+VЋF~f~*O__w@>wvg@`=}L_l>F5Z\GbOomwba#RW-ʧgӭI$ֽQo>rO ٘LjcI|(b9"Plp~;t ZѶ<vvn̺ s7Yn7]HY0Z-!A(O_IfMv0oG *7\ p!Ch hE?X@n ?tr=5:J}i)&;=6pZJ_׃OlKP/֍{>Au; E-";\rḰ #mg oa5Ύ<"F(hJ*R _6D M$%އW)(|}M9z:\xmΔk-\rС#$4]ˀ;1!3aJʑ4W/ 6dO:lcs%`g0b^+Ej㬀ƸRĘ~^5qCӗ56^m6QEz_Vi<_~*O5Qu<Բ]<[cK|b|ZiFwPy$|p(xfq{-X3؉ֱ.Ĕ5,`9fX ̕&OpחW1x B/f)1y-+lE;}:Ȥjovh(' s>| W#kJ'G*wD)+'6w-l]?Ys< *`X]?z'mY7^ 9/Q# vm1(Sbuz8{V!57 2s@(;!}^1܊ϐiak[QJx4 K_ 'div,0`*xrw2t~%Ʋ;)[rdf7$RŁWQt`Z={ (C- "u;mkZü~HTY_ C~=,}EC֩фw)-ocsBVڶ% B VP<[`gxjpwyR\Q 4S 8b8PF9اv#ү:I$(܌EO~Sa*!쮮^CM%$ OR9S2&M⣒KLĥeL4ڞ(,23z. ^拙JL3l2w])J5/#"F#JCGLdʴ6woR.Лu gCsmy/LJ*:trkLY8Q?%/+71 {u{^ߕ8c Ci`MaCv ?A~Ivg/Èojh|F1. Z?q !`vYk &)54 U=1-< zwMH#)%TDF/cS!W*󺨼}q[U0Ι-.IevHSi_.?|lDeSDӹq.M9H+ 8Ń[Rk^ @G(#K=J; kAg@;I5j M ? PŊ*ͪi;Mۣe1d:+.=oS Gz2QI-{ |uߜ4aib $%XQSm{Z"~}KYnҀiԨ-^:%ӱ2oR XҧO?{rZqh~eL(گY`dq; P3%= j:f>@vݝPv9Bϯc~1uXZ,q;o^T;'oHyyM'%"$QG!~AךzHB'Zne ]W>Ʉm\}7](Blf(I;!_zF4uk-KJ+ <K8pq:-ZH_qAs'%cj: Aɯ0dL덛'n˭7X<|hۀw{5|5Q&Ni^kon\L,QkBU q .Z% ﯛH=e) 1f 1UI"HIJP8Y;_c$V'&1f6u)EZorSh"w<fd֩6|gMlm YRa Srh^ *KyP)ܚ8L[m54D~"@T0{WuD=#M}{w8#Vo%鋕 P('嗵LXH;G2'}%3!&k jчfnzΦ֖: NiHG /Oq(BKoѕSX)LA7"A}*$ 5I3\G݁I]uw"C"-;R,02#EkJaJg챊7s Py_Z>/6Lsq`/aI+Xn>Tr? }~N>r~Xi_0+/{gJ^/ 5*bH cQ  Xⷞj~E R$۳ob r1Q72bS g TXꫛkftKi~j-lg_n!Xdt-(f#o )wBe9N[H8#HHʹ|[0³E}rH,x2XaBKp>&7$:J% =7m|ZBzGU%lzdtDZrDhHU4iVՓyΤ{ LUa4@:G/̦{}u;1MⱔXi/dN1skcUouWl/f!PHc01ٺמ#`ׅDżېC_ڛ_i*~$Ry>S:̦iZ^X*< ]L*&wR[KebN$){Wft8H%@@VTwN=fUy0nLGSRZtI_: ږ2fۜ6]>jj٬\}O'N&`25D KQa1YI1 7Q_Y7I-1Q#WK\QAh~?֌.7K )h]YPt(ҦhEDbgk8$h$͹CUo[Z@3; ]we^vEշ0sI,mЩ|8:Vȥp%SU;ol8 uu+n#jvhɨ䨣>ر^ {;T"iR>D"gö9s *L[+'>U2lo&z(\ \\!]V>,gr6Pr{'7tD?4^N?a8,1Pd_C"rZQ/ѕ`N-}S2Ym:wۓsrZM“ :gwϗ3 U 鋵Wj m'RtyT~F2؟~Z}֤>8Uos;?U*RɿGd=)sZ?U OW"},י簈Wm*0eM7=c1k T"a5!n,@>nsݒ7'gh~ ڵY,z".',H^B]bO=ړ_ 1FfmQKdWp}N83gM ^/;k@nG8}\0?D͖6L=66SbFIU Ys_|43`(Ŝ Th4Z)C90&-}({F`%yTJc؁&e !`Pdcǃyob!^M9~/o>ݺBrvȘ"R}:cFLxX:t/uix{sA@\i `s=Grjs= U~E@B KL"4K܍&Jy/szXT;mұ;,} 1M?9,Urb"b EYiɎH.:躁n}5Ht&jLr8]y,eʢcmZԷicJqp<kp|VT# ϸ&O!2KNro93ui3uKIS 8D G K qt67vWT I2 VW\)lSF6;eYfXf.,[|`AeOu wMZ#~}h WI{o5H yPshk dڰu9'}kaO\]|а=!{ u?H!&Z.P4@RzLe]{s \=~nTàItvsy+ )zGNWSzyi\#=&\5u ȷF9զӇ-3Un l10겁z+b$ʚ*\[GnN?va6O[^W/q yQMa^-b=i4زROјrՐR4 "7`6 Y$WXhVt XKOlf-{VQdI^/ '9E I™ ) y8^?N$B&\||22xJJ":"{*I~|fn{+ȱmkҼ"#*aƥ:`x(3E`NK>YѬlYZKzJЭ}S%Q_͝ŀ}oo\. j/Ghs<\@#(Z|Nkڝp.~,<=!T[^~`VKؒ\B@S!L9)-~JnJZ`6l" 4/CJozWqB?"m*gK=;jU%V6B4v>3M3 8#3G EZSJ1 Czewjw$,`c'3D#3v,71cW35Ӱgȇs ?h(Keq"O]x^f M! 1zg$3rp;8sEFs"*6G׆y o{$lߡb$`3t-F%ìp'7$*ES-g_C>ۅ8dWIVt~:%NJd!(Kxv{`ii$Vͨ-N~QprzĚi|*\UH.Xѵoz)XPC,ZATĜ^?xTi`QczZᴽ9fh&u&%p~#[*(H@3dnv]=d(4=rmWs㍺CDI 圴*J>Vh$B{ks5bfgdd~+)b̦'q@bиG0 bb:3iYFV-g{ŔkO#{qM]k“VW2z с)zʳanEsM] W避.?bŖgN c(q crA_,(efc"Kd'/3|}%i3joD"B8p*WH.2በM~K s{=]Ŵӹv5FIОNH?5_@dt2|kj^w\L/4&dіׂg W.TC4YydB'o]TQwcAXx#zQyrC} .Ia(])E(Q%޷Nx^lFz(C'$Jd"G 煝{ s]{߰x"ge@/඙҃yX[;~f(ϧܕ iԤuS3oPp`2+O]q&-w'fVJh9V=}^̺aEUOr\8~<њ`[Miۗ/yLf"w0X\Pupw8@5pkR+l›AOPG3̫ /x- ~V2hBK⩋Y4wnK tݰyr5YXRe~X l? 頃wU=9CYU"9Hyfpۗt_ F=\eL5D/6K(T P[W !Ԓi<9`{ɴl.Eϕwk<9@{fh;.A%̡R™4a_raSeؘՉcrDާV'EZcsh׬韱2BcxG QRmGx.{ )"_Le/4f}؈,8vt+.e lgeg16^/!õ\gVkhubY\^RO(S^z=7A w:y ى"0d1ls֗ft opa6^Nc!w7EѠ2|H)!r#f@ia=ѵ@F 7;.5+0<Բ/i +M+l1@r CҺCŊHa'5SU(DQ g-_xh8eXRWgjfw9i"^_hbҷ^(Džn}xt@Ҷ~Šǵd+3L !%u]K+OW+BdNw;P'a!ܖ>jl4r X0Z=<%yW[iawLRHs^N@l>N՘ "{IȫD O۶89Ayߓ!9PX!EJG ёלGz#.5@Ў.c jڮ܄?" eGoWs[d&I㳍a,_$d[]R~Ĕ/-wAB.rim|&ESE:"~,$ku&+qX~w' U7*!V2V#ʥF11F 6ACugvFBgh isưHxTDß)8E~u g qg9|r;X,pF'Tdp-< H?c_{ߘ!эBӝ 'bGr70=܍Zo/=?̲@]% ORG6Vr+~xkM]N]{JmhĭLyma?v’C2i3,X}e0m9Ze\u{mK ?n7#j%,QOV~Qb\ʮo\-cLzln nX i'-1Q#{{UNA+|Evd*+"i!cQɕ\Á|bHV>a/X3"P7 ,>'N~ ڕ l')ܫ0Amخ878_5X'yœϺJp2k)sS3YeCLvճgO!]Xx<5Ky}@#Fn!k|鋈9%i2Jľ_bfTK7-˛ӤKצI=s5el"*YD!պC*1{E|K{m<\ż`id*;e <(ׅ$,ޞ@Yb^) fGXuѰavo^,yU9?Gi_e (́dDypc+Knfb7V!{N|/kIÖXλe'J=ˁ_$pB䁁PLJRCnFc`~z"?-EVᚂvA&PxEEZ,)DXʱWAbۄmr$h(\aJv`OîO6E5bQM⫷9'!pfn4dHVzd<R"a 73}]$?`^('ҡ'+FJ;%cKlLXQj9BUqp@ț^ ?\cG j ۡnn6qD A[=V"S=:.)GJ딤_ضU*c l*ġ))|]rI$Vo$)0:?2HY ,~1YL2!{dEcc|4Cƙx"@\Ӑ-)g`q1L!EsKzȔ"G8W\S!˩0=>ume}pn{+Ӵ7.FA7e-#k*uDƅ2R}.E,U[o*}J 䖛Iҹa>A_f1 Y~%yJT?2~bHbPyyNS:-2N53HHR ЋGH?b9 2`#C(c ->t5vʆB!!4j5PQk)!ܗymyA\}#(*(ٷ&x$II +q| m `\ޭoHtP-bHuiGSʖX㡬rOW~G8ӱ\Zꤛs'!DF8%Z @9~>gNHU;vO@$% [`w4+1wR=ڑYoLqg/_/ت|i׷-g;"ahJJKʣՑRH+e N c!mѯt=ZoSr C|ej 7>hN"a S >lw4!l7Fq_ x$Hb%BPHg8CK#[p/0vA1#-"& Xx\Ah-xṶ'T6ulqï(6c`).]J?xA0FH0CI 2xB47׷I&a PT4 beoFhT]ZwT;Xq/uL8fL&e{qu&A,/Uܾݖnv =K * R._%XaԬFu5Rjb:^'.})L2+MA'Z/-A#K=26&b ,G><#:*nI5JHxsCӪ;nK7!RG*s8ǧʫў"ݍf39 "y^e ӷKFg;5=V#' O̟+[o_# EQ\ւ[B.sC]x'N04yr w[LW&]ɝ -AWkHDapH_eE=ߧ xk2%::[z n!o%bp+g͉6܀8;2p@=,CֻInqS4B kT7ef~#̌[qրlޗFЛʁ5sឧؐH(٭xe 3'0 :)N[75 s(SB4yHQF#؁n$)0ɀbpI${ N[ &pVXKPgNJ^@ b9kC Me׬WseXf1 ; dN{M0{ -0qϼ'#m2+mbAﲇ͏kjRjQtq/.|`(F,EWWXǎw`gcyTc\2l~kc!jp_e[POpE^+be@÷(Kr)KER|yXlM!00DS@9'ܾ&TDk:,yGG>ZELQ2^#`4! =Zxv)x*'̨?C_ɥqnV__S)m*&Ͼ_| ٘&üG𜎄