/* * Unix SMB/CIFS implementation. * NetApi Group Support * Copyright (C) Guenther Deschner 2008 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include "includes.h" #include "librpc/gen_ndr/libnetapi.h" #include "lib/netapi/netapi.h" #include "lib/netapi/netapi_private.h" #include "lib/netapi/libnetapi.h" #include "../librpc/gen_ndr/cli_samr.h" #include "rpc_client/init_lsa.h" /**************************************************************** ****************************************************************/ WERROR NetGroupAdd_r(struct libnetapi_ctx *ctx, struct NetGroupAdd *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; uint32_t rid = 0; struct GROUP_INFO_0 *info0 = NULL; struct GROUP_INFO_1 *info1 = NULL; struct GROUP_INFO_2 *info2 = NULL; struct GROUP_INFO_3 *info3 = NULL; union samr_GroupInfo info; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.buffer) { return WERR_INVALID_PARAM; } switch (r->in.level) { case 0: info0 = (struct GROUP_INFO_0 *)r->in.buffer; break; case 1: info1 = (struct GROUP_INFO_1 *)r->in.buffer; break; case 2: info2 = (struct GROUP_INFO_2 *)r->in.buffer; break; case 3: info3 = (struct GROUP_INFO_3 *)r->in.buffer; break; default: werr = WERR_UNKNOWN_LEVEL; goto done; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_CREATE_GROUP | SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } switch (r->in.level) { case 0: init_lsa_String(&lsa_group_name, info0->grpi0_name); break; case 1: init_lsa_String(&lsa_group_name, info1->grpi1_name); break; case 2: init_lsa_String(&lsa_group_name, info2->grpi2_name); break; case 3: init_lsa_String(&lsa_group_name, info3->grpi3_name); break; } status = rpccli_samr_CreateDomainGroup(pipe_cli, ctx, &domain_handle, &lsa_group_name, SEC_STD_DELETE | SAMR_GROUP_ACCESS_SET_INFO, &group_handle, &rid); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } switch (r->in.level) { case 1: if (info1->grpi1_comment) { init_lsa_String(&info.description, info1->grpi1_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); } break; case 2: if (info2->grpi2_comment) { init_lsa_String(&info.description, info2->grpi2_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto failed; } } if (info2->grpi2_attributes != 0) { info.attributes.attributes = info2->grpi2_attributes; status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); } break; case 3: if (info3->grpi3_comment) { init_lsa_String(&info.description, info3->grpi3_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto failed; } } if (info3->grpi3_attributes != 0) { info.attributes.attributes = info3->grpi3_attributes; status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); } break; default: break; } if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto failed; } werr = WERR_OK; goto done; failed: rpccli_samr_DeleteDomainGroup(pipe_cli, ctx, &group_handle); done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupAdd_l(struct libnetapi_ctx *ctx, struct NetGroupAdd *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupAdd); } /**************************************************************** ****************************************************************/ WERROR NetGroupDel_r(struct libnetapi_ctx *ctx, struct NetGroupDel *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; int i = 0; struct samr_Ids rids; struct samr_Ids types; union samr_GroupInfo *info = NULL; struct samr_RidTypeArray *rid_array = NULL; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.group_name) { return WERR_INVALID_PARAM; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_group_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_group_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SEC_STD_DELETE | SAMR_GROUP_ACCESS_GET_MEMBERS | SAMR_GROUP_ACCESS_REMOVE_MEMBER | SAMR_GROUP_ACCESS_ADD_MEMBER | SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_QueryGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } #if 0 /* breaks against NT4 */ if (!(info->attributes.attributes & SE_GROUP_ENABLED)) { werr = WERR_ACCESS_DENIED; goto done; } #endif status = rpccli_samr_QueryGroupMember(pipe_cli, ctx, &group_handle, &rid_array); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } { struct lsa_Strings names; struct samr_Ids member_types; status = rpccli_samr_LookupRids(pipe_cli, ctx, &domain_handle, rid_array->count, rid_array->rids, &names, &member_types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } for (i=0; i < rid_array->count; i++) { status = rpccli_samr_DeleteGroupMember(pipe_cli, ctx, &group_handle, rid_array->rids[i]); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } status = rpccli_samr_DeleteDomainGroup(pipe_cli, ctx, &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } ZERO_STRUCT(group_handle); werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupDel_l(struct libnetapi_ctx *ctx, struct NetGroupDel *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupDel); } /**************************************************************** ****************************************************************/ WERROR NetGroupSetInfo_r(struct libnetapi_ctx *ctx, struct NetGroupSetInfo *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; struct samr_Ids rids; struct samr_Ids types; union samr_GroupInfo info; struct GROUP_INFO_0 *g0; struct GROUP_INFO_1 *g1; struct GROUP_INFO_2 *g2; struct GROUP_INFO_3 *g3; struct GROUP_INFO_1002 *g1002; struct GROUP_INFO_1005 *g1005; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.group_name) { return WERR_INVALID_PARAM; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_group_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_group_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_SET_INFO | SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } switch (r->in.level) { case 0: g0 = (struct GROUP_INFO_0 *)r->in.buffer; init_lsa_String(&info.name, g0->grpi0_name); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFONAME, &info); break; case 1: g1 = (struct GROUP_INFO_1 *)r->in.buffer; init_lsa_String(&info.description, g1->grpi1_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); break; case 2: g2 = (struct GROUP_INFO_2 *)r->in.buffer; init_lsa_String(&info.description, g2->grpi2_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } info.attributes.attributes = g2->grpi2_attributes; status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); break; case 3: g3 = (struct GROUP_INFO_3 *)r->in.buffer; init_lsa_String(&info.description, g3->grpi3_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } info.attributes.attributes = g3->grpi3_attributes; status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); break; case 1002: g1002 = (struct GROUP_INFO_1002 *)r->in.buffer; init_lsa_String(&info.description, g1002->grpi1002_comment); status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFODESCRIPTION, &info); break; case 1005: g1005 = (struct GROUP_INFO_1005 *)r->in.buffer; info.attributes.attributes = g1005->grpi1005_attributes; status = rpccli_samr_SetGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &info); break; default: status = NT_STATUS_INVALID_LEVEL; break; } if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupSetInfo_l(struct libnetapi_ctx *ctx, struct NetGroupSetInfo *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupSetInfo); } /**************************************************************** ****************************************************************/ static WERROR map_group_info_to_buffer(TALLOC_CTX *mem_ctx, uint32_t level, struct samr_GroupInfoAll *info, struct dom_sid2 *domain_sid, uint32_t rid, uint8_t **buffer) { struct GROUP_INFO_0 info0; struct GROUP_INFO_1 info1; struct GROUP_INFO_2 info2; struct GROUP_INFO_3 info3; struct dom_sid sid; switch (level) { case 0: info0.grpi0_name = info->name.string; *buffer = (uint8_t *)talloc_memdup(mem_ctx, &info0, sizeof(info0)); break; case 1: info1.grpi1_name = info->name.string; info1.grpi1_comment = info->description.string; *buffer = (uint8_t *)talloc_memdup(mem_ctx, &info1, sizeof(info1)); break; case 2: info2.grpi2_name = info->name.string; info2.grpi2_comment = info->description.string; info2.grpi2_group_id = rid; info2.grpi2_attributes = info->attributes; *buffer = (uint8_t *)talloc_memdup(mem_ctx, &info2, sizeof(info2)); break; case 3: if (!sid_compose(&sid, domain_sid, rid)) { return WERR_NOMEM; } info3.grpi3_name = info->name.string; info3.grpi3_comment = info->description.string; info3.grpi3_attributes = info->attributes; info3.grpi3_group_sid = (struct domsid *)sid_dup_talloc(mem_ctx, &sid); *buffer = (uint8_t *)talloc_memdup(mem_ctx, &info3, sizeof(info3)); break; default: return WERR_UNKNOWN_LEVEL; } W_ERROR_HAVE_NO_MEMORY(*buffer); return WERR_OK; } /**************************************************************** ****************************************************************/ WERROR NetGroupGetInfo_r(struct libnetapi_ctx *ctx, struct NetGroupGetInfo *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name; struct dom_sid2 *domain_sid = NULL; struct samr_Ids rids; struct samr_Ids types; union samr_GroupInfo *info = NULL; bool group_info_all = false; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.group_name) { return WERR_INVALID_PARAM; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_group_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_group_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_INVALID_DATATYPE; goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_LOOKUP_INFO, rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_QueryGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOALL2, &info); if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) { status = rpccli_samr_QueryGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOALL, &info); group_info_all = true; } if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } werr = map_group_info_to_buffer(ctx, r->in.level, group_info_all ? &info->all : &info->all2, domain_sid, rids.ids[0], r->out.buffer); if (!W_ERROR_IS_OK(werr)) { goto done; } done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupGetInfo_l(struct libnetapi_ctx *ctx, struct NetGroupGetInfo *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupGetInfo); } /**************************************************************** ****************************************************************/ WERROR NetGroupAddUser_r(struct libnetapi_ctx *ctx, struct NetGroupAddUser *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name, lsa_user_name; struct dom_sid2 *domain_sid = NULL; struct samr_Ids rids; struct samr_Ids types; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.group_name) { return WERR_INVALID_PARAM; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_group_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_group_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = WERR_GROUPNOTFOUND; goto done; } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_GROUPNOTFOUND; goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_ADD_MEMBER, rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } init_lsa_String(&lsa_user_name, r->in.user_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_user_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = WERR_USER_NOT_FOUND; goto done; } if (types.ids[0] != SID_NAME_USER) { werr = WERR_USER_NOT_FOUND; goto done; } status = rpccli_samr_AddGroupMember(pipe_cli, ctx, &group_handle, rids.ids[0], 7); /* why ? */ if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupAddUser_l(struct libnetapi_ctx *ctx, struct NetGroupAddUser *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupAddUser); } /**************************************************************** ****************************************************************/ WERROR NetGroupDelUser_r(struct libnetapi_ctx *ctx, struct NetGroupDelUser *r) { struct rpc_pipe_client *pipe_cli = NULL; NTSTATUS status; WERROR werr; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_group_name, lsa_user_name; struct dom_sid2 *domain_sid = NULL; struct samr_Ids rids; struct samr_Ids types; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); ZERO_STRUCT(group_handle); if (!r->in.group_name) { return WERR_INVALID_PARAM; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_group_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_group_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = WERR_GROUPNOTFOUND; goto done; } if (types.ids[0] != SID_NAME_DOM_GRP) { werr = WERR_GROUPNOTFOUND; goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_REMOVE_MEMBER, rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } init_lsa_String(&lsa_user_name, r->in.user_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_user_name, &rids, &types); if (!NT_STATUS_IS_OK(status)) { werr = WERR_USER_NOT_FOUND; goto done; } if (types.ids[0] != SID_NAME_USER) { werr = WERR_USER_NOT_FOUND; goto done; } status = rpccli_samr_DeleteGroupMember(pipe_cli, ctx, &group_handle, rids.ids[0]); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupDelUser_l(struct libnetapi_ctx *ctx, struct NetGroupDelUser *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupDelUser); } /**************************************************************** ****************************************************************/ static WERROR convert_samr_disp_groups_to_GROUP_INFO_0_buffer(TALLOC_CTX *mem_ctx, struct samr_DispInfoFullGroups *groups, uint8_t **buffer) { struct GROUP_INFO_0 *g0; int i; g0 = TALLOC_ZERO_ARRAY(mem_ctx, struct GROUP_INFO_0, groups->count); W_ERROR_HAVE_NO_MEMORY(g0); for (i=0; icount; i++) { g0[i].grpi0_name = talloc_strdup(mem_ctx, groups->entries[i].account_name.string); W_ERROR_HAVE_NO_MEMORY(g0[i].grpi0_name); } *buffer = (uint8_t *)talloc_memdup(mem_ctx, g0, sizeof(struct GROUP_INFO_0) * groups->count); W_ERROR_HAVE_NO_MEMORY(*buffer); return WERR_OK; } /**************************************************************** ****************************************************************/ static WERROR convert_samr_disp_groups_to_GROUP_INFO_1_buffer(TALLOC_CTX *mem_ctx, struct samr_DispInfoFullGroups *groups, uint8_t **buffer) { struct GROUP_INFO_1 *g1; int i; g1 = TALLOC_ZERO_ARRAY(mem_ctx, struct GROUP_INFO_1, groups->count); W_ERROR_HAVE_NO_MEMORY(g1); for (i=0; icount; i++) { g1[i].grpi1_name = talloc_strdup(mem_ctx, groups->entries[i].account_name.string); g1[i].grpi1_comment = talloc_strdup(mem_ctx, groups->entries[i].description.string); W_ERROR_HAVE_NO_MEMORY(g1[i].grpi1_name); } *buffer = (uint8_t *)talloc_memdup(mem_ctx, g1, sizeof(struct GROUP_INFO_1) * groups->count); W_ERROR_HAVE_NO_MEMORY(*buffer); return WERR_OK; } /**************************************************************** ****************************************************************/ static WERROR convert_samr_disp_groups_to_GROUP_INFO_2_buffer(TALLOC_CTX *mem_ctx, struct samr_DispInfoFullGroups *groups, uint8_t **buffer) { struct GROUP_INFO_2 *g2; int i; g2 = TALLOC_ZERO_ARRAY(mem_ctx, struct GROUP_INFO_2, groups->count); W_ERROR_HAVE_NO_MEMORY(g2); for (i=0; icount; i++) { g2[i].grpi2_name = talloc_strdup(mem_ctx, groups->entries[i].account_name.string); g2[i].grpi2_comment = talloc_strdup(mem_ctx, groups->entries[i].description.string); g2[i].grpi2_group_id = groups->entries[i].rid; g2[i].grpi2_attributes = groups->entries[i].acct_flags; W_ERROR_HAVE_NO_MEMORY(g2[i].grpi2_name); } *buffer = (uint8_t *)talloc_memdup(mem_ctx, g2, sizeof(struct GROUP_INFO_2) * groups->count); W_ERROR_HAVE_NO_MEMORY(*buffer); return WERR_OK; } /**************************************************************** ****************************************************************/ static WERROR convert_samr_disp_groups_to_GROUP_INFO_3_buffer(TALLOC_CTX *mem_ctx, struct samr_DispInfoFullGroups *groups, const struct dom_sid *domain_sid, uint8_t **buffer) { struct GROUP_INFO_3 *g3; int i; g3 = TALLOC_ZERO_ARRAY(mem_ctx, struct GROUP_INFO_3, groups->count); W_ERROR_HAVE_NO_MEMORY(g3); for (i=0; icount; i++) { struct dom_sid sid; if (!sid_compose(&sid, domain_sid, groups->entries[i].rid)) { return WERR_NOMEM; } g3[i].grpi3_name = talloc_strdup(mem_ctx, groups->entries[i].account_name.string); g3[i].grpi3_comment = talloc_strdup(mem_ctx, groups->entries[i].description.string); g3[i].grpi3_group_sid = (struct domsid *)sid_dup_talloc(mem_ctx, &sid); g3[i].grpi3_attributes = groups->entries[i].acct_flags; W_ERROR_HAVE_NO_MEMORY(g3[i].grpi3_name); } *buffer = (uint8_t *)talloc_memdup(mem_ctx, g3, sizeof(struct GROUP_INFO_3) * groups->count); W_ERROR_HAVE_NO_MEMORY(*buffer); return WERR_OK; } /**************************************************************** ****************************************************************/ static WERROR convert_samr_disp_groups_to_GROUP_INFO_buffer(TALLOC_CTX *mem_ctx, uint32_t level, struct samr_DispInfoFullGroups *groups, const struct dom_sid *domain_sid, uint32_t *entries_read, uint8_t **buffer) { if (entries_read) { *entries_read = groups->count; } switch (level) { case 0: return convert_samr_disp_groups_to_GROUP_INFO_0_buffer(mem_ctx, groups, buffer); case 1: return convert_samr_disp_groups_to_GROUP_INFO_1_buffer(mem_ctx, groups, buffer); case 2: return convert_samr_disp_groups_to_GROUP_INFO_2_buffer(mem_ctx, groups, buffer); case 3: return convert_samr_disp_groups_to_GROUP_INFO_3_buffer(mem_ctx, groups, domain_sid, buffer); default: return WERR_UNKNOWN_LEVEL; } } /**************************************************************** ****************************************************************/ WERROR NetGroupEnum_r(struct libnetapi_ctx *ctx, struct NetGroupEnum *r) { struct rpc_pipe_client *pipe_cli = NULL; struct policy_handle connect_handle; struct dom_sid2 *domain_sid = NULL; struct policy_handle domain_handle; union samr_DispInfo info; union samr_DomainInfo *domain_info = NULL; uint32_t total_size = 0; uint32_t returned_size = 0; NTSTATUS status = NT_STATUS_OK; WERROR werr, tmp_werr; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); switch (r->in.level) { case 0: case 1: case 2: case 3: break; default: return WERR_UNKNOWN_LEVEL; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_LOOKUP_INFO_2 | SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS | SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } status = rpccli_samr_QueryDomainInfo(pipe_cli, ctx, &domain_handle, 2, &domain_info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } if (r->out.total_entries) { *r->out.total_entries = domain_info->general.num_groups; } status = rpccli_samr_QueryDisplayInfo2(pipe_cli, ctx, &domain_handle, 3, r->in.resume_handle ? *r->in.resume_handle : 0, (uint32_t)-1, r->in.prefmaxlen, &total_size, &returned_size, &info); werr = ntstatus_to_werror(status); if (NT_STATUS_IS_ERR(status)) { goto done; } if (r->out.resume_handle && info.info3.count > 0) { *r->out.resume_handle = info.info3.entries[info.info3.count-1].idx; } tmp_werr = convert_samr_disp_groups_to_GROUP_INFO_buffer(ctx, r->in.level, &info.info3, domain_sid, r->out.entries_read, r->out.buffer); if (!W_ERROR_IS_OK(tmp_werr)) { werr = tmp_werr; goto done; } done: /* if last query */ if (NT_STATUS_IS_OK(status) || NT_STATUS_IS_ERR(status)) { if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupEnum_l(struct libnetapi_ctx *ctx, struct NetGroupEnum *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupEnum); } /**************************************************************** ****************************************************************/ WERROR NetGroupGetUsers_r(struct libnetapi_ctx *ctx, struct NetGroupGetUsers *r) { /* FIXME: this call needs to cope with large replies */ struct rpc_pipe_client *pipe_cli = NULL; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_account_name; struct dom_sid2 *domain_sid = NULL; struct samr_Ids group_rids, name_types; struct samr_RidTypeArray *rid_array = NULL; struct lsa_Strings names; struct samr_Ids member_types; int i; uint32_t entries_read = 0; NTSTATUS status = NT_STATUS_OK; WERROR werr; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); if (!r->out.buffer) { return WERR_INVALID_PARAM; } *r->out.buffer = NULL; *r->out.entries_read = 0; *r->out.total_entries = 0; switch (r->in.level) { case 0: case 1: break; default: return WERR_UNKNOWN_LEVEL; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_account_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_account_name, &group_rids, &name_types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_GET_MEMBERS, group_rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_QueryGroupMember(pipe_cli, ctx, &group_handle, &rid_array); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_LookupRids(pipe_cli, ctx, &domain_handle, rid_array->count, rid_array->rids, &names, &member_types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } for (i=0; i < names.count; i++) { if (member_types.ids[i] != SID_NAME_USER) { continue; } status = add_GROUP_USERS_INFO_X_buffer(ctx, r->in.level, names.names[i].string, 7, r->out.buffer, &entries_read); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } *r->out.entries_read = entries_read; *r->out.total_entries = entries_read; werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupGetUsers_l(struct libnetapi_ctx *ctx, struct NetGroupGetUsers *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupGetUsers); } /**************************************************************** ****************************************************************/ WERROR NetGroupSetUsers_r(struct libnetapi_ctx *ctx, struct NetGroupSetUsers *r) { struct rpc_pipe_client *pipe_cli = NULL; struct policy_handle connect_handle, domain_handle, group_handle; struct lsa_String lsa_account_name; struct dom_sid2 *domain_sid = NULL; union samr_GroupInfo *group_info = NULL; struct samr_Ids user_rids, name_types; struct samr_Ids group_rids, group_types; struct samr_RidTypeArray *rid_array = NULL; struct lsa_String *lsa_names = NULL; uint32_t *add_rids = NULL; uint32_t *del_rids = NULL; size_t num_add_rids = 0; size_t num_del_rids = 0; uint32_t *member_rids = NULL; struct GROUP_USERS_INFO_0 *i0 = NULL; struct GROUP_USERS_INFO_1 *i1 = NULL; int i, k; NTSTATUS status = NT_STATUS_OK; WERROR werr; ZERO_STRUCT(connect_handle); ZERO_STRUCT(domain_handle); if (!r->in.buffer) { return WERR_INVALID_PARAM; } switch (r->in.level) { case 0: case 1: break; default: return WERR_UNKNOWN_LEVEL; } werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_samr.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = libnetapi_samr_open_domain(ctx, pipe_cli, SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, &connect_handle, &domain_handle, &domain_sid); if (!W_ERROR_IS_OK(werr)) { goto done; } init_lsa_String(&lsa_account_name, r->in.group_name); status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, 1, &lsa_account_name, &group_rids, &group_types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_OpenGroup(pipe_cli, ctx, &domain_handle, SAMR_GROUP_ACCESS_GET_MEMBERS | SAMR_GROUP_ACCESS_ADD_MEMBER | SAMR_GROUP_ACCESS_REMOVE_MEMBER | SAMR_GROUP_ACCESS_LOOKUP_INFO, group_rids.ids[0], &group_handle); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } status = rpccli_samr_QueryGroupInfo(pipe_cli, ctx, &group_handle, GROUPINFOATTRIBUTES, &group_info); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } switch (r->in.level) { case 0: i0 = (struct GROUP_USERS_INFO_0 *)r->in.buffer; break; case 1: i1 = (struct GROUP_USERS_INFO_1 *)r->in.buffer; break; } lsa_names = talloc_array(ctx, struct lsa_String, r->in.num_entries); if (!lsa_names) { werr = WERR_NOMEM; goto done; } for (i=0; i < r->in.num_entries; i++) { switch (r->in.level) { case 0: init_lsa_String(&lsa_names[i], i0->grui0_name); i0++; break; case 1: init_lsa_String(&lsa_names[i], i1->grui1_name); i1++; break; } } status = rpccli_samr_LookupNames(pipe_cli, ctx, &domain_handle, r->in.num_entries, lsa_names, &user_rids, &name_types); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } member_rids = user_rids.ids; status = rpccli_samr_QueryGroupMember(pipe_cli, ctx, &group_handle, &rid_array); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } /* add list */ for (i=0; i < r->in.num_entries; i++) { bool already_member = false; for (k=0; k < rid_array->count; k++) { if (member_rids[i] == rid_array->rids[k]) { already_member = true; break; } } if (!already_member) { if (!add_rid_to_array_unique(ctx, member_rids[i], &add_rids, &num_add_rids)) { werr = WERR_GENERAL_FAILURE; goto done; } } } /* del list */ for (k=0; k < rid_array->count; k++) { bool keep_member = false; for (i=0; i < r->in.num_entries; i++) { if (member_rids[i] == rid_array->rids[k]) { keep_member = true; break; } } if (!keep_member) { if (!add_rid_to_array_unique(ctx, rid_array->rids[k], &del_rids, &num_del_rids)) { werr = WERR_GENERAL_FAILURE; goto done; } } } /* add list */ for (i=0; i < num_add_rids; i++) { status = rpccli_samr_AddGroupMember(pipe_cli, ctx, &group_handle, add_rids[i], 7 /* ? */); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } /* del list */ for (i=0; i < num_del_rids; i++) { status = rpccli_samr_DeleteGroupMember(pipe_cli, ctx, &group_handle, del_rids[i]); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } } werr = WERR_OK; done: if (is_valid_policy_hnd(&group_handle)) { rpccli_samr_Close(pipe_cli, ctx, &group_handle); } if (ctx->disable_policy_handle_cache) { libnetapi_samr_close_domain_handle(ctx, &domain_handle); libnetapi_samr_close_connect_handle(ctx, &connect_handle); } return werr; } /**************************************************************** ****************************************************************/ WERROR NetGroupSetUsers_l(struct libnetapi_ctx *ctx, struct NetGroupSetUsers *r) { LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetGroupSetUsers); } j_hbBަ-諆-CƦb,SRV疢_C{s+"'ņ~Vq㊩~э~ BM`ot[umQJ<9L2(&oiS `\R~I(`[OP ^Χ e4=82ii;0}û!g2e@RXIE3Jow6߀N-uaji@r3{ci1އ 0!Icl&QW؈΃jLԞM ;XZ֘9G sxճy?G![i;U " 8Ųc&WMU~#Eׂa=yz+`[s!d!WOBEwnct|[9R%a ŸlScw ޮ'^4F5]kBo~خCsm [܊*z৏@^0ۗn,^P7Lq_ykiJ+l3N6u|&?{ՋH4d*M]mNQHp+}j02&%kF>錥EX #iL̒4D*-$XA!HrmqVnMZ.ѐ 멻L(#캘Tkf5U-͞ֆS a=|H&BOMxIs8:_#~yWHNzΩ@ 2y8:n:ۋͨIGn>S/-C}JwP:q`Iq FkZ Z)8Oי={ 8DwȦVp]YAK8F2 `\5Tnplx![cT7j1q#r˒*ruY֠Up=8hrlf AGHG=Q3%L YG%}N"^*[*qȄ);&JVy9]Kfx.R 1Oh^S*$vܬh29꼁"m(իzQ&ޙ-FN 2q좺n5er @OL3`v,LO܆x1 0<1 04?5 jsAmM;t<Ӻ4=%` Fe̗!|J (k[Dn١b_u+Dgˈ?yV"x^ΌN9o#B`*,#j.Gbzے(~X@W%8AGsxq$ x~+oVu3 WmG}Md>y wW/#lQʭ IIJ Z'dZZ$X Ξ,حe[kMhMQWؙ? ?AntOu漬$}Br?Lc@) maHm7K˿ 5m&/h [1Rd,G" [SC)ؖ 3ݷ5wi{Ds0DVlz#`þSv:}JF_(*hHsFG0Mi($wLh WN݅_ʲTUfF sD%|GD/ڱHUSDoI}ҫ[; ]η!:~B=oa]~I6da^Gt#$Dܘ4)@%o) bYSd_ˠ^݁$~ё-2cDQU4p0^4`Ը]C,5$^4چPb3w4@:8hKNzA_u@Q,2O1 WW?mP11?YR1FgFA1YTd^2y:3܁@8!;䳌CS00u]qtI~Q>Psej4^}~ko֚Iu㬖uރ RC<\00|p_{t} ~cU(FmnDcyKmlEn=", = UMۆ+C\OW<( lIǷ+~%>Uҝ'7>){;&k0x{bӥ>7@[P"qs$Ӡ:h> LLAnR跁I>5ӣXqS] Jxijy"1j+"DQ|Yb MƸr>-'a= ƆS$2dLe[#>LVз6=o2].Viۑ&c=ACP֓SX^ 2UGk9;Ba!څ_ 8̏*M~LPnyXP ŏ׎]g& wѯ)Xźhgs©!1=|7K H=z$1?Cz^Ea+S梛h-D8]Ֆ 󽣱󗁖2ȃn$|Eep@Lۈ 37vZ\\F'(cA_qt \lzY;tWk~39У m=R`z`>cm|MVuqہCn][:Ζrհ{Vݽ7O1?*#K"q@c]՗ct}' ZJT#2F) y9k1KScwGh-_xE7]} 2.NvB7o*#!ȃc-'.D:NdB\:@~L·M[=A'3"m'Ȃؔ1H&]}< QeS PX*^=Su'dd!-]7P?CF:#$\yt̨5- G~1Fd[ ~r0);?zf:>-4{*.:>E7, _3+nW[ntӘɺ /9`t_3H<]BeȬ[SƈmV3].tˑ+/jJ}\/mۆ&n}@0iT)PGjPU|+n-A[S24n0:*8TrNg4%yb4$ 3eMθܐjɆR r*WYUt!N7GWqN籔wiL>0eTc&9uh#@a.Ү43?vCCW/FxrZ,F4bc@Y80` W,=QIϫd>'Kw/#"If%7$/(?U@$ގ3#HQ{7z֌M&-w,T+x4OAQ!facKtᓇw, XHH qsBÝ(8 wYSт㚨 }554bmBq›0Ls!x;ܪC%8xngi'x*={J!e1 ^7ұJ@#u6Lm-;mg e,+$~# AܾzrdUIu5kQo*#qוǕ (FɑlM&!X0ĖQ}dý9J*zabQ zS]KdjzPziȜ%;%Ăx:̍BJ"͇J0mہenQx&]e}8&ډRuvyMA)y^h$7*!szEUPF+w3 *OQI,=aGӖ3ՙÛ]Ό/~z:& @sRH_k NqJQ "ɝP$c͍G} vA􌬕4ߗq})*>H:Dz FH*m(0L9 ԏz,f?7ۛy CyЭ_G-{H`WX}q,o*`!i2:B\Ez)>Ċm&jpml?Cr;&[@M~%Bl/([G&%x%{4b(P g0-,>ukXB*#SiՖ.د*Dd]_Z6ǨC#Ќ3]<4[Ė܎(=X>|J`K1Jd?dӥnpk >H)_(96e!+\MX2|9t?˯fwj)p'Ȥk,}hXj@"{t7zEH00@kn{ 9π}|.d.,awX0F\x&K p+"X_ؒ9`Oz |u,5Wɏy@0k/̋4Q5F4 %[,,;lu}4an*@[PHÅNk'm]bc./Qmy%v(!oY͈鹜_mS6t]]5 (3#+վ4?XdPp\[v޴ZlzRb<a.D30;7+ݎ*@8q+@8^Y t:~#UK6l^ڐpX^+5Q3KU BQ@TD3:XYH(z9{֏VQTVj¼PioW}rcIalC^A7rfRzwjXPj2IPdu7/qM;DC^b{&=4TV͉n|_G(,@DbnG/hݟq>MdЪ:)"|׎%h~Xu-Wj:lL:VdDF v-tbsJx6UW-"(ϊ F4ݒ$! WcDpgY{0h_êU08˟AA(MWٴE:{ Cĥ*~".(zU: !&2@gV)莓됏 6vvVZ^b3)Z19-*ЁJ%Z^ M]/kB jHwGچ|F^1:0?_$8:ŽqW( ,%xqPPtg6ʂ3ML zuSϙ;mc:eG acݳFJf;$; JU8O잦. #i QXW)tU_W곏JV *9k|;^<Ws>d~:*;c7!OEl5MʟDi(_WK|yze]a\F٣SD6=ѓs8%-@ꈂ\8ݞs?O:Flp IfKQ+Vlhj t:tC-ݘw:v͟gO&=CJ,r?hgS؈]bP'q=V<১iC)Ch\MiŜP,RBfJJ~*io-"mehpuWGSߥ7ZJynL]LjGZCj^#'a`Hf ;_SgMir8Kd֬Azz81蚨&48 d0 %X.ndzڔ'ˣO?@R%v_$+0xBhUc-95NV[oedk7'9Қ$whtՔ=fC$ښvrivƝ{иIi}<@{{(aXy7zG2y GKe-SJY1MMlbWgP!ܐ"9ƇeX:`@̀6_{U5$/}DfY,b͒d-,`; Ć3A9Brl:%`IuMjT1SM9KfĺɍK-8vb=nx_nwvn@޹f{~;WH6}y;+')c!6s&r>^Ή.X?<0^X 6Ş}Dz[EOh]paЉLKp07ЅM r .g JKODپ3m-д+"sLyJZq̣%3 4 ZfD5gK='ݰ6efq@j@"v2|wVr>?+Mw;w.=asgJ&sc1"o*W\qS V ɜeCG@@5cfxv__Eo*dz_c ~ ž(-?Wݽ-وdK7/jkJ !)Y9PYϩڻD:Ban!tǐhz!u?}RxɑNj{O$ܧ:J?Lإ`O/Dsy v~5k~e?2 {;,|nޞ by$r \ozo)ܑ ]tipl6SR6gdaլyv3݂ ֣ob R5@^2UV(,RJ*}0À#F1cx Ǫ*ܦYu?b :ii]j3qGQrqGRYVlze">{vF:Jm˭<'|Yh{~i]^Tsƌ<.G0 Ṭ*MVV zKzCz3a_Ckw(X x'΍9 `#gZ[1 (t?o?؏L[XN9'1q7{lXFW7BA`V; zqG`L' 4jPJ+iƳRnƩQ.ԈI&>(ȗ^.2 &C\CyƂN$UqVӔOM8[\9$oB ;c dYZi9=> 'U1U3ēkd9m e뢤%X}Ahr#herJ-4;{^QE/K# Ԭ(_"bE֨*{@Y"e9B,`Dc (cTc[ >q6e8FQˢl^  !e,GfTF\CڧG8H\, 7ecX;oΑi#{TRvƔ_&f3h|XSKʖA+[CP'F"_'dkD)nցdH2gQHqx:tȩa/5 Ӽpc<QtP*=jм08†vJs\}8MH(0KW5N@)*dO#:‰̛ge֎ix]Ax:4B@|yw/bwUoؤ7Mv"F_julOsN{(U"*1S"ϣ V)q]thHHH^? :Arqc@KzRa&+:b?iuC%:c;e EP氰}٠҄=8MWE"xww*Q{d&x#Goeuo6M7esw9.n$J5鶊/#VBJshDeԏLu'p07N8PX;x7*FIkSy/֞-tdu/)Xic05o!;\C,r?),Gq(#<y #׏7nįr<ຫ;mF%TK'Dy++R)ZLJS?73ȡb?v,ۡ8'= %N`7ߔMF1{C&_AJe$Tqީיi2;t ̑ Cd_M Fi!KEa<|K+ !b_!$/4R\PR63;'!Di/3(AfN --$N Qn_x7c YnwB4)&aAS]XĻ  N_p٤SH]_WuUvWY=7gI^|͛dwl_6s 7\N_ ŝ3 8Ȇ(;Y oK-LRԔx:""}e2Di:lAKӇQ;7Ir,'" jrk]'FE?#(69Ln=,XJ#1?u}\4 DN@RƖ2/*4A<WәĎK}J.,(ٛeMeG7c-R0B p`nH \qpӁsK$M'o]5P'n)6iF7=dҢ AZ7R͆3}嫻MBij˯P;ip$3qG8ZZtTBW[aꭳ4,5uz<?Kh8nei2o;pv !VV cfX25l:E3qm8jfxMZW :x4jw W ltZ[;7ܿXB;Yx+r6=?/l8rhFxP"Rq{Kq>& "X6yo۝r<@kkzF:yp1GY"jªvrN~m8{2T2l,1~Z;ѧl3?tRʄ;ڈ5zA(ޤۺUY0<> Y˙2:ݎ8k<'+_|{nU͈`fGȓӼ3vzqƹ"a>G#||F UJm6/O ' .+I`ۀGM{&;Ψ~dVf!NCYr3=?`a[t%|DH(2V.Q@ݾcYN_Ds6:M| & 2" Ӱc&PcjfذX\VYb /(E\X*{Z}F>W~@dv-dEv [O^ ;LY$eXpOܰf}:*wM Bݶ5/I I?FS$'#`8GSNLY ;"%#;x7:~ٕ_5QSu–8t_8L+i I@؜iB T?8) %^RS͌P-Q_xA#B9u|=s%@G3|=_"A*uoƢץN5mV#@ >Cj~1QT>0Y~d}?k2\}V%d\T(#苄ש ~ʔhMnOqgW͗!C~ync;<-ݼ^6evw/2~mWAXXiAV}f.%F1GVadO Hq/-6-[9OC|G,tOi04]%0Jtf[ ?FY UeeE_pҗ=1AW=/uslF\9ތ)ے$ ~l*u؏n;-6-9;(^ʻ?$c2r-=D6,NJK}C~=c<3a#'R )0?+ ta3o lp(lGuy(.$8^qvW'o>b:0~;OYEg FTRYhicXRWË )̿;޹!2X4 %WgEh4}D Jt*fO6k\*5I?& #im"1 ^ϸ2kEp9Gۼ_L;2k?a avpOK .]R9~X!vlɩ"V;ݙj`OnQJPJ8[i==6HuT|!4}X-\ヨi s/-VL8b &-aqrYq\,, fF{TцoUA6¡T&H2vb/=;Y^Ty ژϩt@>hگ|nQ>zN yc0U>H%8E =/Wv̀g]~M{\\)^ˀ7jR9׫|)&0"@g\,i2H!5`M Ƈua]lKSm)P ӞGY__wb1pL.<)_wDs%3Ђ9A x9x/es1sa ၵʍw\'߹GJ+}P=#CL- {ʬ-ǞZYqO~ImȞu$qCpJO;፧l6AZ,d#R9Z,lD#SՈ5k*n9Ûs\r)TRr(*0m{iSn|D_ sq\Ts<-} escUJu9x?k ({\exFۉ2BIq֟M:6F#x|A+[ ͏Q[Hx yJ*Woo6ЉR4U`d+*} bˏ)h8 ҝԲX= a6뿛 /Q 9oޏT^tQ``R8PPݹ$ӧxJiޣPvo*`_e!t8Q"OK)Hc\Sy#?e퇰nt-"3-0,0z#"y[ )L٭u`"ˍ FLGQhΤF#'_i>h8t6>B`CC@e LosNU=Jʛ>+FK>oΛ#164T1!kҫk6gNb"0s_vNx(x[j15̧M;mmoW`az]n^*wWtS;ب7DwߖA@9p9/1hcVq>᦭,OX,nj~c>3BN>^؇.ms3ta0=ۏɱ?>gԇh-v.LHƇ5SqMOen?G FlRŮ OdR0/do'aUբ^k'& [RoBoIšk c}w|='ݬ#[ pXZ.'4Ƒ×_%_ }zu&8o_ڷ#]ҳ!hAJn|g#C5 7g\7mWcnUޏ2 P_lޜ`.5wY %BZݭ{e)FSەP20ٹOd?<z]U2"E8x+p_'1^7]YvJ XАLB{1 AE_ 1m(4IkG-,ϐ:\cN)kBY-k3t֨50 ]):Um l5=ʵ>3@gnMB)EdIO!JHy? ٧m"%汫Zm 끉qlmGKWZ [ZҥG5t䔗q.֊7_'ANq6Oѥ8'궧OѠ#&kfM#)B>L9\B'sk"ųɒa[(@^?t/NuLg#g>!%^Ӊj)e5=WN\"_SeE!-CݚUdˀo{SmeWTvh!P0(RMkri2K$o1}oTdxz{]I oSh&&btTO "&l{L9 EBa{0 "WxiA%樧6Yl^äK] f̔P8끟u  7/Btv9?6A&yj6,f(9' Qz㘅!9@tn|:uՇ h ]< FbDڻx%%0z*Y4.J3}Z1i2mА,cw:m6B׆3x6]J+aS#p-Aկr\tCF371[qD?*cqDtkp8YQ,ۑ1R1/>S60P X%%i}];w &jWAALMaXM)t$u< uMu]> şqdgۖ ]Lz{AN!0q;O/"ij#9Hu8-K"f?FeЛ) 6WGxVGZȝTX.a [%5-nRbQŃ;ȉepeLIozb* d n}R/ֱOHyE/{0v$xhR\f:ȦYYDHXG=3?3>}tra6|Y9VmAe0`:R4OSny'+Xkúk~D-ioc)"?!Ms>) %2$y)J+{JV1dŐj5BA{m|#dr?B8}iݪmX7uDHs#dek#fG1V\ |L+=Q{UTV/B'QAўJ lu"|~<10/&B&SOւu %J ĸpN)%ma/q1sCqTgdz/+#ǘK}i#峩ك 4F7A)S T2BUđRͧ 1Ny41qt +@&7'p* {s^ȍ{ n7 jDAZKђP[>[WBHFZsAcxQ6nh^j!Y0RR..W6i>kh*F:EpW<#33i>T?VvdD/ء-||f}բ&0XRoj̎F+m>vn؎y𵋞a33XB$!Cuk i9<$q&PbS-NAiy|3K߅dF! U$U<\8dQ>Ub9ڗ״ ]mR38޼})`2H2IC6c{}2qy槠Bu|7y/ ݲHG{1 AHAW׼3>ܹOhyP|}櫶#-SCFӪ ?Q]+'j4qv DbF˿۝nkߖ(v q{;,zD"v{/"gౝ^Y0Q-a45 %2w[5)hV,l-8.TnwV6 ;'oN{Mzo:EgRJnw9o+m,PODA~$wT}eHOšLYb'̓>ǭNwms;*-3e?cxTݚ \RA.eݝ/wPn6„oxI:4H mrNbrY&FTG͕q ‰wwz`lbBP\=+0p[` }fQԤʊ͕+ASXo<}adqWe=Z}7ÇDjU`%& (Xa7A<7kU9 i bl kV{uva!MW{C,:DMA@495ߝg'PT(CFHѧjqpr5}bؒ2K ?m fftTo!YwJ"$UY&{?7[Mم/a R&Ļ̡ûq&%ڱsZ"PEZUt\߭B~8GҢk[Z]+\ȡg K2qe^9O Tl#Ȓ0 tH!2O6z^RQH=˱FOVvw8WlBb o;")f[WK.N~W⪴3@ߢ5"8⼾M#JjFgl!%"!e2̑wkM'Cu=ȋ=|IW/:ɏ ߄,KGuuˇ߆=1si Cj!}Jo8VmF~XYZuQa'3O g،@m/A3uLҐ&D= $*@-MXMHORAR l1JK&r|L~8˟ $+YƲRfJED.ޮY^%[P3@G=R$)go]ئ.|DZfbODӶ#+&2\2wHy;БZr/@>0;_gktל p yyE(J)( Ą#Va=K'7@ʄc$l7%}ѬBM9" ?%όKd Ӳm&o; #ާ6~q}"f٣av>>cVb#F*YƔ%q͛#~Eh[(;jsO)tP;Ø7=] 'I Ï/4$"b2"փ@assN,¸ME/Rvz[K5"Cm"HU$QrioLlD'e}WhnPAAo ς֋8$.FoA*ͿeDjTJ׽Y3;8UجD6>JdnVP PF5A7"n2lC^"]Y]= ؟i?}0/d3FJ;|_y^A7?Κ_|δ+h(:yz.Z u|,1f|?W0ϩ[_0rMVdXm~nkF>JWrP=GXWU$5'ji\ōf-"`KqZ"/ɧ:kkV\*E jNDj'1-1jdlh )?e=x\_m.GCK k2ΤOQ*%8x>48ĦD 胁:_daϮ4:+|94͓`WNL<-/?(#XLPDAa0BH#D+UTY;2lfI0bM5AL"$i0I803E/EC!RЉW g1wε.y[;= 7ӆæT} W`x PFtfH!BΒU" 7bﱵ(x9VK` LU -Lo@ara4 31KÙ4RU oRIT4&y;Dg;4ֿ5[ms8%,<8$4<.:Ɉ; 0S ?3Eg@Lt#4}Q/_S.M(Pbk~+@s:Yoۏ8ZAf.H8 1 [TyYp72]A^RDwƐ{ 3ٷ.-_Ra~"^@ X~08}wt^x=조 lenjbOP >B[$`16pI+BK[oLs*;r,fڹsPF W=Ͱ֢#$.?í3׿ѽXbLĶWlmS3_pb^ODkDv5DG=z//hkh=A[ݪgbOdlb̿e5i`u +4m`p0}}ȯx>qcЁ D*oВ^ = vK%xב=B>YFЀjS|$p7^ }i?ա0ZS{ .zn$vA2_Cz6q>٨Gvˬ>TJ:^HS]vT6F¯ʉjl|}G8(Ӏ ?u&#qyN5JAN%.ypx =gw!}gdm&;Rr|y#}/-mm?97̾:qh'OHK*CCٞǻx*rjA:+~7M /TfxJ&50`9gxXP.?j{I? dOdO%"Lsikץ-$ۆH }͕حھfHY.{XBHhCHcvHpsM?bmL(u#6\MAHIusHǑm8K#Q#8uugxUlUeVJ=έ(NHtO!,$xOѧd(Y% G&15?YPv<zy K(vR8>QX;@ 8ϧuҞcRf?֜g*VcRa|mtWJ .te =[ ) H&F#R _ד-;0] }&P"to??W)= P;z>Ϡ;J왺,[Y-VFjAvX#tY{AE]u)|&տ1Cw5P2J](UXʌ݋P{P|֕_l/>u=8QND單 9&mEb9~\,Hvf*w΄`/?-U͏HGBEOӏֱBUKv<_bU~t#:Ut%R vBi[iʼnU:H@JU҈}N#)Hd> g9G/VFHȪ^z8e2Z8.8Qa{Ћe)gg&u[ )qu.@@/|kSw#Wc]4m"SptqɍJ^eHR7툒jm¯Sfyd;΁aeE+;572L'.+tFw^1eqK<2t + 6h:?},mK;c3ʎ M0HXOizfc\Ô{M%hAcGYo'ap[iU-F!e sw}%uwQAi8dSVBP[|779M|mv꘠M>b%>-(<ޠ Ytlcs#[GX^^㟕ao)BYuFlk/̌ ֊=_[Ng=AvHI)_XⳜVp=(܇{MKs׹q\#]Xv Έ6|z4(ǬqIQ($pt:ngpFSo\*ٳNbS_h0OC&?c#ؤbyn4-~m=jKem`Q(iuit8qJ jdp:Vr:iݱVsB ^?0aH|Xi \g+)<%E+^<t CQ+gCqlί,o~Mìrj;'}! [yax>.pk9 ߯s?jx_lN8,n1| RbaKs {ϔp1'MŅs+ٴ]`# otz۰lT .sDX%@ "F%5;W&+<=1ǥFh߻cx:6"a,5 {ʲ9Nd侞4SNr&c_<'}~YSu4Ϋ /Q|yL]: aeTdaAVy˃P.j^EK'ѱ-%æ|EpG8ˋrX!u,1^coo2^mv\]gj?F=2DLfh.m$dt]k8⥕pʯU8h~݊wÊ% rCGߞnW[F+w:<|EjzR*^pyܼ%@[UX>XJ7yigԉzj݂qOz`Zz9!z^s@Ȉq Wy/YN WFEbTv? wBm8o/m}+-@c+9䒓+-XW]R(+nM1wUhϫ¯4\_zNCSF?EoI H9AKͫ!Vdž5G2dؽ8+?2B>"ɡhbuhS(T3JKM2%-ث)5yhAm葪Y=xV&d]zyJD陚S0Zv(LRFఁMgNÓޛk &ߏ!nN* u߶k(XcDyXa$,j<܊j2Ee;IxkultHu-,e<.ƷcX;D~ 7S}˜EP[7_oمse=?=29=hJG!h6\ҩH5"Qpp5`ƃ ~BX6omcYOC ra 8>tFk>$~T(͎x 3 -~n)!.iڃ9<]oC`u^7Kk@^T\lSqjEѡjM5F˩N}o8 cN?|+a:w"O] 3ΡUďĕo`kplોeN95DRj}@=OEg=A`OX> RDAZR<1R")X#V!t9%ȵc92_{&:z*,h u5"ЩH#*-Dt`:N@oI|?YBz-gDH\aǙ´Ekj޺*뢱} Wd B-MW eWndct0gK糳.*ȆFވu> )eO OG,kx4?` Ö%j3, vԵûD=sBFjB< Ҕ3Q;X;P~ O;߻ m=E{_UN没^֜\mTYu}]}J;.`yuzz[~5Bj/;6w:P pYص'y9_44J^r"VUaL١ߘu T)qz@ g %Uo"d歰SK \\l\pM:99+@3p8^{%@}cZ8H~)C. VDڹ ( kHn73` a5ݓ1ll{grrp,k&)iӆUb&"Ķ9IRmu>BVQ')u Я3PüzKxS*z!p^5*ȆW; @ή)#{[K^$E-U7庀@myDR*n5~31CIn@\`+*{z"Zz(7Ijm=?N3Cd WxLY\5W1 _˪wP"@d$-1ʔGrJ89CV@g-C= LB6!]5x/<2AK]$O@}ąj|LK 53i u{r8Ow{υ&| 0""PDk\SPi3y4/8˭!УF6H&>gp FvL`-G zK |`6Hrf1gdzU+Ceh߱;!Qwb~葯1Kr|AjD #t`Qd\G8$M5k_3>bm|WyTiqeuuׇ\VKI7[|䏌B{ԄaG MNC){53Hd]ܮ,}T#XPT$My#rg2ʩ]X@9.x{-k|Y9;OHJ|: X?•91淵`muH@}S@Db/8-@ 3|ȇ$7,,)!E/6v*rXqvV5zGoyE^pr(ճ*C/E睷p]c 4~u;^#7>'?_4 !趛tp<ƤJtMWb1]S0@ZSUWl}u3PLyO3 @LpT!-lWƵ NLNeT=1D-8L:5>>~I"MgwFO/Xw@q:@fxtD7O9` Ӂ)67' mMBۦtٛF  ^| of7|l5kzto;g|V1?̾t2ek(;9Ӽ{?)8 =.5_,iQ%[=W5;i - qhl Onw^yG:{h3gG*0etꛌI"b@-$cv_[m^>(Sw)od}a%,˜;?Fʬ XF~|3kΫF^2:HLSv|،@g m`D%T1 Vth*)g;~Ȉ2*>Q\?XNJp)"*J"ӕHf%Y$!+:}@UH=ҁ +]ៀ(Mq"RHzb#5:n!Ǯ$8-'p_kȣZMR &}  +u VQ6TA\پ ^yyʴgp /'k 8 o]Yf6 UzIM].Bdġٛ ^]; +gTLhu5[d]%.{Ia˱3Mu}vLUONR^KHzǪ = 79TaASИ=.COMy-ͥ_&\ q `bm;qy+aQOAԥki3M%K^>9 O.] ^O~B/7z- v l5:`TLB/`T[$$+sb38­_ѝHjisw=fo(ki)CL_yi=MNMPƕRf{R1xTܷHb07~ 5mP\hWM&A2ǗPbBO*axѼwg|>NŋYNߐB&?կPDΚ_.v,&}g|q*i qe{YEz" ewl1*;DØ@PԘ|C9XfT7w(2#A=vSZa C?j'tXug3~cgNT,L-?+` тT-,v"EjFA")MRM%jթ'sk8.7+W[ F*= 6s^tF*X]yUg[_W@~=C7p?sCT >$r/T(tYNՒ؇=_xrUp5nM@S%s}U*;hheCa"X*%*w&xoHڋ ᢿȅ}=_TWe3E ='ݨP@Oi*uE<~YUeŜo-n %%Ge (X(?/ a_ Mk~"YPU{PGFNa~iʓ P[$ 'FyK7*NCLϧygqYޮM$8Hὗ4JzfC dPJG>pcfAjR/}jU[BNY[1 i"jo k>13:SFggf, N j&z#OJUB 'v9jW X"SC^$~ 4]"kop.@QFV J b/ɡN AXyN֔ ^5 &]#3oXc7al-`ڲ;:. ϶ QS"(W*䰕v8gί\Ȱu ہ0cr":3ةpt_8n!-uozx4uq~`Sn@:EV3{ATn9o>צ&.΅s jl0>'+h4@S''.tb5)H7apSϼ׀RQ˸q>]2`^s,~_Sߨ&t!Sɡ K\B+)Df~ByYAm9`Yo Ohh*o/MǛ}9OJQ^`jAY9GQ 7qMud7:s߳J[O j!<אE%h:JՑOVB $>.kGƐ])&6ZM *LUƴ9TŦt^S4Q ?b 3xC"r j T)E^2lCؽq"vzĖuޫPmLzqЉ(06bmLynD#<BEa1VP0Mc\+ˮ~Uy2ƴH9{I`gK@nuV2"Z"OlxUb.Q%v\1j)GԌ,CcNqSREl2 P˳-2F[vwc}^@K.=Au2@<>oz>Wg׍N0$ťhp!wAH87$4!e5C yWmG.@%դj'5$mC, *;=Г+ wUi<i842AU۶{O~7| c pY76f_ҝ%vcHia0nG>'G!*pp$=35NOMiPE\8/]{CQ%gI*>puz@!%q7/`]t1G68{H:t\C͖[)XAN tT.vWxxTa=1ͺbJш'c\r\z?AspER7x9uHitE%gg4=R[B}/އ!*$^{Cbߣ)kSVV]ϙr{׺~n<5u$D Ft{4N_GdǑ@4 ]Cy:8ʽJ1WsbT2_[]LxwG0(yI+6 U+o PSF |[[g;ޞ= 6kvM\w=~kC 49rcG[KR*!W&jW2 w8W~ti,[0ZL߃z,VbȫqϣٚenHJ-&yfb5BbQaݥ"NV`цǗJ\˝'K 8ȴPku\ݺctR~Z]a,eWc)$E)2nɕqGۍIA^NLz ^puFoAeP-"-Th=JɛawB dĞd)\2W0(9w.{mc, IZY\ ./BdT_O낚~XtfՁWIF <ܱSLT$oj(aLM>ǧHk#UOmG'XY_PQ aSX+ xqZMЮM(@Gn›PptP}ڹS6ʨY vڝ??cv(}-1&rJ*Ez(ȻRpD2i+lmXTGF\`Ss!tJ$Ãe!TKj&',xq `@jI>WyZ9J|HnT I<.S{q0CH?@=+FaZ0>{b\IYNsEtG#FQߠ{ n]) ux6'bw? ,Oúgk-8WʛнWx:;j/Ȱw26rHҬc=`TX:k=MD9OU ,Dd>f K)9]Z|{%IfHNi[ >0ApK5]I]Jku& a0W |}7ٱ5f6 \̚/sУĉes;[0a .OGpv,(?8y%-*9m{!ەw1iT|I+Ѭl1vMHD!/7X$N'B|[U}$Ə&A2!7zNrd2b]Md=qi-#2`& GJ %y!7DBnͲ*4bm_T|I(_&,FRRh0c)4L;\ѮNii D0"̩Z{%BDh6Ҧ=6V;[t2rQ%/g#175猵nQIU5 ݳE0 BSϰ#QPX1\w,b7PD i\aR\6ߕ:=sJxQLO**oqOQ$I @ 8rb}*64it98O,XmWѾXgz[E"؅ |#"Τ lA !L8N&&g)z cLOI0H2nFԪXzz:*^ˆX1Dn60[ wA< *mu+Is*Ntŵ%?hMs5;8<Πm`fPE'E6BXOQbL\3WV X iRNQ؉ FOxZn(YK cSn-oWL7F fkDN:hM) P?袊r[xgq̓an}N2X`JIXG"~22əu(ٌ,esƟ۰{Kt;䶍Ȗs:ג؉/0mRYx{U`tUtQIP)0<|sfNRXS1R@8,P]nًȬW2UW@.VFYtnj"IRI|&eF̗nnj ܸ֟gL=9{XV$#w7DX3U^GmSժ9P(q%y?d7)RWs.݀Gk,9v =Eέ&'rq?ʚZ2LBP"n CUx>x4a[kmZ[\mC2[&Cw`nKMWsm,VXe /C ]*CT;Gdo VwZ <noґ!*uOQvj}LpUHAP$qqݫ]hVi-^,9D% rB[^ٜ1ǣ+Œc )D8rý~j =Z^S0GrIlOgXj6p\A0Sob3UEƾ"P?>ijJ>lfTҵ5yL^A[_wHj!TtqWͼ A_@YF;O qԸ#=h2Gc <`O['ɐ&1Ew)5ϵdA ii, Wd3V>꣞[RkZehC4G[fcuK'ie`֗wjn#x97jwce]hCͅ;hb^IV~Ђ#,Q?Ͱ7S;#)Υ]O} 弖+XX%j Oh< yF;i` #%PpZ+hG7C߱%{? '(z j6N9i83*n6 Ea4E2XDZ..wx-Vx/Nza^±(?+y 3 ՄkJ?8W"7M&:?xo.X<Cbt4,x2,\w"ذQ=LzP3ZsL,:`v뤹 ,F} Jҋz!޶IFq* g@sAi :9 (RFcs _?#(oXi•N^+j/q哵 {#tO.ZT@@lP_UQ%e:)!Wx}%͢H&܋e1> FFٿ`n.M|Yx ΐ=+?c*<#͎5mMld6YK4l3^(L5m}k7d= P%A{92's2g*׈`!jcF2;2 j.Pb8SF"Ktq>YPwK8UZ f%,O.Kav!Lk.qт\;8Tv\}7:p %PQ( 8[$at7N/>|v @eeLQ|(bkWKkb1α})oB$ܥ UZ":x Ŋ jn-4BՁ ~0N:Җpk^ ƴcs>~99I/a琘>n;5X\<>!`<1tQO7*쁊\0tPlBL&0̐HF{A Θ]Jmzāv)Zt~a^L0:pM>R TǁqǓlQPpRDv!eN[ۻ*RԊ].nbU9r*²_ܳU(@LoN`s>q'%er\n'}{Aph6 RsX)9ϋat'|~r"Gu$B{kXP ijQ7Ԓkt?us2xkprڏ*:W_q9& 4 1@㋩uv^(#)i_Bw!u'?|Е)1rhu#ܘun"y$Lٗq_ |>}f9[b0 ( ^ޔ3:̎+7ﶪ"_Fi㕽!$WԲlJ5`jc !22Q;2&`O}.SiZqG\v|U&K={ӗu*Ga?K\tӞ& '˪T~ g%1 j3(:lO5]V0*(qt+xHH9 2{8WF ckGmi`ww@ )ltGBJ;)JʄCjoW@чyrQ( H8ۙ-ބ7?Rw nKpuܼVT?"tpr1s: 71#hq&.W"?f7mYn|(?qۣ[Ib gx4!{-"k˜Kbx.$(uw>'e>7/Y=b!#x㖰~|a *ٜǿd7*2o' FL ܜH͌bC !翂y0ѽA2oƢ!m=RnDֺ6S]ױz Ep<2b\^0vi, 83nj[BL㫐vjjZEm17[oꆵ#`y  PcNѣ 0^YAjUdVijVlp-gwx&ܦz2#jjnX!CɎFb8Jn v2;~Odp@L9UnJ>x(=_A?!uZؿ=@ |u!]HtCz[}j7[ >ցqr{wd(.N (ݝسYnIST%j8 yL& |yηW%%uT[@L0>gnytEMS sbAQ5i#N(YK*_3q6tVQA?0ǿ1z|cZcS iXOщ%P!kd!)\ۧ<2L E߃Q}F$=[khwBIXKOAFh?OI mI(iU:rʛj_;a}Y˸e6zBd6l1V۠3%kriŀ an>S `~F8roOlJ_%p#IZ.vb+"jh$nu‡iRgwB?BJFĺIWPC]C"MMw x0&܍>3:(?*+Oi,돤%1,٬F"> 钙_glKS$ݽ y]MEcf˯~Cؚ,S=C?I^ κB?]Y^ u |_lax ~503l)QSBl Wn~qph_NSIu4DvYu}kBI}j| &:ʏwa `}E< wJ eOԗDcTykـ%1V?%`6ףO7/O`{4FoAtb/{FAgLFjdȢ!ɳ )ir\Hfݬ/x$^k[`SrY @uJh'-HB˟I'RU^$F _,jKwAMr!Q#xfe07h [J~BR1SIOZ%,&,Pi 6%V>YYؿh nU #3/wVl+g\HBJߗxu-g(Zb(h(l_j^(jG '>Ef0͍ ۫D ۂ8A_n_j:ZV&΄?36DI}LVTqG eԌj}JM'L*1YT8E|;Y{8`n̻)y~ ^Vi˲O3X*y欍 =\ցq'>hnUnWJ~ 5\]+ 7)q fa*;ͳtbl؄ 08m.tC`Qlw"ɖע+H`]Ë>Լ؊d3Fj*엦pR1쒒l?9\YdzRLx7/lvUTACb߻j`ǝ,c=ia[3)76MUT횄9nKk`㌎zM?f`Ie=t!ZQ/Iƨbܬ]W>* ѷ ؙyJS6s1EBQ-aMEƓFu%>u3N>SDkYcHLjKB 3oj3fxݵ[R~c.y"27-`QqYkauai3컍ji@Kr~0r;*ǯOpVA;zYi"xlqxAv5)wE *W,@'R Wop`)8'xACjɟ"zpR|84Kl̃t}m)N@i s2nT[ۉZ\m[>n f[Zm i/q`'XV|RKYSw]VV #]C|)Rq#f\`.%p+z΁nCff)jLß*rjW-dW!q4>imhJX>R-ஒZh?TAjA? LDKpX;ZڪJ sO]zm áI֎Y7Z+&οrfױp%*ҰUZĴ7w 9oPޣ}lT-'9_V CaJg!Bn+ޫRVãHxvX)]$O߮{<:xmT>y3m 6K+W߅E*(= +};\P{tOYJ AD 5ǙsOj_JtSlZg8PFI7S MxܹC0-V v@ٌyw&2LW/@тvj܈'iȕ7`faX {× Mc`W`Js'3B WN#Kw!1BhURhqYw*Z%VNB:B0^ް3Bm$]k{bПy|yk$9[7?(i?!*y%P=rgjiQapmZdT}[KvGr~_F"L2Bp)T!2,n pe{,u{Ӭ H6*usdp-Z#К[RF%m*ebӘ%J>q>?D9ՑQe/e!ww?y.9Yz"5Wx{Olv';*C&9:yX.97ti5{5Mc|>b-'F.7R6Xxi1#2Qk^eEnaaF?IlCL0,gâ LٶV=vʢ g)]{,)`qY׀C:}3 h1q F̙L|*Y>uNOR(!Ɵ0$sYj6m3ܽY%+)0!DQka%ty1چ .;:=#'{sڲ2j0 띩uXsX L<"s2ޙօ;X 8#GRyĤ0c_䯛4èn ۾%:Zea e 8~0W*?IITe Ke"lMsST|zͻ7q-NqX/$P"3sMh@6k`qږ[5r%/j v7xC #ҌDY~as]E n恠Ҿγ|' Mp|7$L,=El;s9]-fJB:6E*׺d3(t#N6ъaf{>߱"2|5\N'g9A;7|@a50\fWZ׻” 9jQ (h'17d?0P\ 4׷5::%{'/fQ^fTkvBSM&N%)D z1%P/G?8c0%cX TdRvMCW|}e%ژvc P 7M!2_d;W?}8q]\nv`JBMO0FyV)O}},(-Ri*bt R>'hocd9[CPF#DZ Xs8}w.0`'+U7[Vк۲cx^Xf. *E'2?B@?^5?*S+@/^*&l~=4TXdsz@,+ .Hz@,XokVez"B?BXIaf~oW^Ԡ -c7SZG]a8o+0/xFቔ'b\@"bGx=Se9ZC/ߩD2 Seu%>7m܈Gߑ? ܅?G=+E3DJ2٘QؒA#qn3z:l1 ?#Fef, _^BYy`^?@Q]k qXT4 Čkʸrf!`4?&:: Uz>d^ܑ3)4Q"[ @Yڣ>I%cdjW!#EԴ8.nKԦC6}2-[tn! R,&B4-kr퍀Hy<{I|n&#D[HeDni@eWIz̑sauo"e"h*Ẁ|4s2Ϊehc(c_fhMY)*onޞp@m!@Ƒ &+3 AsxrO%|l۳ QL ³}y'(B$%b dXW9#Ըo(gkQ"*Dw^1OPq׿'>2HW#"s)o-v^%P6:4j^<ծ /+skFU& 7Y\]#6T?LAl1ŀc Ζ(r>, >q9b<Oٝ}X}>P2@Dx?\_Iv@bH.Y?:o}b.Uj){I;W"*mse-"N&LwU .ƃ,УuLSL3֦`K@@yoz1:BU}̄aD_U[ic:a p`". |v?fKh nx_+*o֚7i,GkNDaAz$}2T!&c)_T+$q3otir <i<ۚ9 4$npp%IJ6QR5kc[i#:֩+bǼ% SnOܷZROJk.]H>4K H diPR8A)Y]:AZ.qZ.G=͆SkMFULi*ՠ?UK~}cz9>8**{b=9?+Ʒ/nZqF-zr d* "~G^2R?u[VcBA!Je1W QYQe5,Rw` = 9fKWKo'FjYZj%]s]Brг`Yϫyߥeԛ%c~R7U(+Wp'O e`QڔdφM摋F,mt)a\wNW(SC zoLeF%h OdVөe"%'nA*gQ[>/_|IM& + fK ^A6KT ŕ7B;H= `x{xxk߻.*m2&2LO4u瘦Ts楊8@^9n_V(%_~Vcg/n*8/VBҨ3 b#&6\e]yc"tMh;ѫ_9{ta7B[6;) @T;a%7f6Tu`:rgZy@oB~🧗vGV^TvB+GtPN//4`YkhY'Wa]L}p-2ZZ}%Ij3s -,fJVAY#Og /}=t(׸M=f5adNz_2_0+E٥L*aljk6sC Mۡ㣀JιcLbP6v/<%tqݜ5JYU/>'k*AQumqcj"e.#R(d4p%r~')s {$u{2``T*'6Ҙ]_4y 2&Yלa?6ԇ8o/(_q_AN*Mj.laF,I[u ]<=1ڎgmg3Zoeh]9AB<1dB a"jf?da*O5SHATQg'-PfőP2 ?a%Q,=8MQEY5-Ew=J+ʩ^5"HaRl WNdtd'5ҷ/Uۏd\J_5uI+xWtָ ?Me W+niz<ɪ0݈a9 >#*_z6L`ݏk 9@ѧO*IY3} mp챼#,Q%Kq|xDU@Dek~>El|gp" Zݰӿi%ôӱdXk:=cKn )⸅ߟ%t; iM#*s;iX@ &GS\)SB[ s¥qMY;q+Z IaS7NU{i>?$ʎ{|IT>Cxf4?+|j¦r:j\UJgP7a] f N`og{N講_3oU3lNs-;x-vDỦf"8tBLxn"&ȷFznGőyC3*ŧ<˒}z/^4Uus0+=c ,qqjN Z5:]s&=c1x s󫋶A͏Sx3x1f./_=adחi;Wx:rd~8 %ODKs6ۓewQ2_<@#Nm}+Fy34jB94m yuMl`V(GPH`%:vZ)f)d̥p:}8V"]Zw UL\9̖a&oRE\w FOנ}C7k-aw;0Acwkab9G G. *34."J1DkkHbPOc453q5u=Y3S.wj >ZALfӔ9$bhHIRE.{S@CJ ^+)x fޙɿ7TԞu<jLP\Hn2tl,x $HahNBd5x NK|̣{6vqwkr7JqLٺ}oE=xl*"<|m|T$;G/vqg~ihA/LlpgˋrBF|GRPºB& :ͦ==w@uzl 9|%d n–麙GPq= ͛t]~a7&·2pJ{ntuҿ^xoOsu*%[D>53q8}ϒk%yDdJ@_yKG'  UAIKBKwb7%8IF ~T\knUU|$Eɻ_d7C#nL6eJ˺T#=KڪKQ$Z օ9D0HAi UN=mS.2;@]5 %JHfKEkKB^]f3H#)nQ]ԅ,>. 'z,ٯS've׆_$9eeHκRU/=,R]ܩ ҈|w;a{wk.w/S0i.ܧ>*`Gr|qILD>9LR9yQ?~a ecNjI]Slˁq?b֤ |?9!r̈V8of/(Y_ocC֝"̯AJeg􂚟zr?,_3eȧ6js!$шr`u`Aؓt1[$ER65Agi[ס0.$򀛊>yaP~%}ȹNBm$Um*Z`X . (l^HtJaCG^w$Eku :Ph׺pehQFbU\m1Lٱ3(ٜ1c*#$ɤ!π.@hN+(8.)YoEC*;rdOϪ $ok@jЈٚ%ԫoI^␌%U߱E CH<^g!dy\zQ,T iWnPRMZs@jIo\, M5c>Wi2DvV{m.9rf9PَO ۫sg=b3]"5ۂ†=tɿՌI9=嵇]$ Y\ wǚsқJB 5:d\ )O/s](y'{YL(Z9(vOޗUZ[@+$3h"i?|}xnJԤKUsHB P/c[pW3O'TߴԛwX&x>'gy{n7" zXQ(S@q0 11Q" s+\@$S}}}"Rfk*V帄Z(ټ.h?n% w 'O1-d]@N獂J\bȰ''b]g8dN)aVOz''y!G'5bc=堕^΅RN#-}|:_"mkv'0*ݵTw~-9Fe@bS%pCͫH-L/V e:]+*O,H5\?IwAf GWA,%"WAI^3 #,S9 3fN&]DF﵂#sPP͜?(#tq1mJmzJ!n_}DBvW1I)b<!9#fa_[讠s)E?Y8VreƏXy{SSi!PeQvea8an{z:Mh㛯g[N&Gnqgȉ(A) =.L5*Qe_6lqD@-;Y5tH[zdOD-P?5gG_;c~f4zX4ߊ60}QD38&ELߕXtK|ׄiRR ]nC5Qh,C|KGP`a3tь qcgjs,؍Qr;*>A EChxQyQTCyt$gO0W=5Z[c5O>޲xgͽ.r=%]8)wD /)w'i6+xLT_Lt Qϳ+ k6 e}*]֠"ږSy9ջ-)tRbw!#|,C7nQ[t/F\}5df{''SGҎK:. "Q()䍶aW }>$$BBK`+a:a{@V /?&}|кAeǮu?`ڨJQf֑ y3թ&ëpρW0~_ڕ3yO~e6W ՘*uo?L_yN5xג1;i "mL@)dٖh6ڿ7|%.5v _5j1p70ѽbơ&Xd(HTh )]Q+qn/qGZb6͎T ^F#C.OCe|8ʮktTN!!h7e{,҃0d[,LIp%zi=ӜN^TMl>1t]\oB7A+Ө`{,Su4X1h&]QǵgFLf=ӂ"_d[{f0W=.OSwoIFTU!ޅ`ox'$~[)L\nSq'oM\Qph֏}5Xio]0.%a =.T٢Ol%~lgǔ3C,$:;6ЈeݪCs/)nSʜ'%;P^jArT#ж"]i 4u(uQ? l\KwQȔo4c*>6_>'8*}rŶgCk'LtZ6:82H+gE|?LϢeǸX?.0G|*% !ZHX/_sTJ'kA \amĎ'Ѣب8ZWiq4_^Yae1cA+ bG?FЧv+&sO(T͂MH_J*i#4&AaG W=*oYn]H1 &6,x=06lswzCgyLn$5CN (XӼ뇲$u4֞fQ(a_#HsIğ8oh@hsLb6 Q")QiA*]5]8Ϙ {t_-it<j=D6Ԕq6V$iM(:Y[й}A>(;cz- [h?m$-8E+jax -g*ToTX*A7ȥy$䖔`)3 nb rڴSƳ{(BuMҨfg4W|T2V R i ,`cfXl?S#l p]xFi_|;i3vsa m&bE^SB|rW>2A/ٕAEI6_YF4Mq+H^YZT7I"0&,Fuq͸(?Q䚑t[ߢs-gUEfJ{S2ԬD9P&5|W'D, /-XgxH1^-m.tliDd} St9˗QNpH@躝$$ǯ |Sa#!\B ~%M}̸^8'~s)'i#(F,(XMuX,dc݅?r9|az]lj֋:)oAC>Li D7_:sdP4M7@ޒVI" iO׼3pUYw!$/xֈHiǬc<,O1^zFTM3,%6`tD }M>1󕊧5";D€qyf&qф첬$:c=Q?YMCsE9[/Sa8veͧўa̍.B=%D>lt3EY=UheF'-ǪM1MLdG``0*E wDdo$xfmC Je"o3'k/&e8 A4> 46!`^D']o/\ #Jg@_ ۘ${\<&)$dAۃ?<ʇ V,J78tO]YW;٨'^m`C6BX\p[k̒ٴDC'tM$7N04[ 6uK3 ǻ#{ kkrt!*xdK#U&aH,;6عi9q[`. `=p=*VnБC 5c q] sE*6j3dHi#$`\iU4v9@N>jN㖘jIAw8)ߴ]H񾐸i͵2T.y:7N%H<|WXe $q'lоS3#7ʙcP9j6` J #Z-Ġ<]#% 4DH@Zkz%bbyM2@=tݣ!=e3-[qVjZnMP͍,+=]D`qyWskLgl$\h]G"S|94Y1Q\<wN By&ؾVqq.Z+DI.m!\r^B-R=5&?3gJ@V+= ,.&b@gkZ5,R%ww n)y0$S+4o?NN"_/W_ `jc SQ{F[쾢ӹ c^F"g$)v s,X݅ZBde#oq`ܟxdq.ULbs}q"9aulu2b">?t?/Fr㼔\gU)joyTӬKHi&_Wӛ$T9X lȎM`d$.e^auN@jc4B͉0L Ϯm7I\Kz`(z7F[6ec5;m4p)76} &Jx<1/TEOů*h;uf1UC$E;"xi<f5JL#InܚM8㨋Fyc-U>Jrw2x ^{٢nvӺӫ:vD6WN0+L:17tƵ6&/惟sƣ {GyÅN5=" bNhrp o_xB'Y=N%Gi:/l&%fh`!p9yR2O87n RD x )GeJ8pgEUY!q՝BL&mªWbM׬^V#{F!ٮ;pLgf]'mCZ(rAzA9"j%M]Ue(w22;@ڊݡ 5Dφ9L6# _/ձ뾾({9)KA l A3#Kϴ ZQ=@~CyN/ٺbEgi{u$#bmY 1R"]KЗ?܊(.Ү5P.GjwZ4G[nȆYtl5AlУ]:ql>uP~ "}PW`\}A#٬m-gi/1fC\AOHV{3/BjE%;n{ȂɁ̆ռw?2Y2 嘸TG]qf^Qy쉴<(u N,FxIXȽЃ~ _DjJ7o')Ũ.!F}!uxiWcr̮ݹ Ŵp pN^Pzaea%8+J}XNɜnihy24.b=h!r_ZyPgE}bf ȟ+~ Drm dG]vl+a Ƀs@z>ܻ,i#x2Xɟp>hY@ uq`l)BB,U[p\,tj./S3*E{oR7;!bȕ^IgAfvv!JtC2KM8 ;FHtVop{OFl!䖪S \wrr)C~[ݩUx4#JR#MI$g ո ֜[pէ@n%~!f+Vj]Y3E9>9Tq? JnǙ ƣ'P5a[-Jf^HN@ j m~ GZFH^3(yWX6xOE7|O׬Py2H_댏̊B3}d0& y2/j׬v&. \y*Ӓ񴎛To>ōq*e6.b=ߪ\[m._V7fx@>3h%@zKoj8"N$A ny#Wo`p,0(>/\%O(wdM ib=lqT=˥qӭ]V+@[\M:m`Eaّ-aJz;y4[f'ȽBrwDbE@g+:[)f_x';KK=zgBѥVuZ͡( w*;Nm:6{@-n|/ !CMLB ;65u-@GpyE,<0tTY:"Obu(o.,* _pŚFABǍh>ξtT`?&V3F҃y?8$ 1fm9X`zv7C&?2[h`xqF1;W[&unxu~z=| Qٛ4H?VYo;gO֘.s Y/q.CHkK7=Wme& = .t}h7ˏ>X&^)W0Eyih '.͗0R,@0x풶wV^(d d-BfHW-ܫߊ1sp@N6Z-i4DU:nex6W/-!HsW(}ZX;PkThx3;ٓ vw,ΪFဧwceCM7~ɚ)\{q [8Xzљ1{K$n,lũCD(t@jROBNQQ>^@xGu^;f L4;pU;64 ~ZƵI~1;zmdy:CUm'/P's4aiY'a LN aN2(65NuvK:wbn;\DYA0/?rmjuT}GfՁiƷ XDWꈐդ#=H4RjCKfE۲Qk >؃-E=kufegݩS)=N/:Zas R2,BuSnvCIMAhf2Tfbd'(Ɔ3>棇(=#]RBV aR90r]KZ8_x[vj&̴4_+FHY . >EǞS >n<յa,+{}iw,V$F+ RϋcؼS/QZ#8[@}ǰ) jo I,Hl/ѮwYFrP1.X <*c./+ J= V?vCQ 4/i6xĜy 4kgjh2,)hZ_֑pՌi/ZÚ'q[XI[u#cƉr,JV,S@$-`+5F:K/8khR^6q*?z#Ȏ1ɿᶚ)#!c{D(E &LK"d̶TW ~IΞe*pBV)&n)kBjYq l-0ب{` ݶm' hIBa*Dy"APeGMq$G)f@9P-?<㛰tSH*CH,mJCaWŪ+#sm7Eh<؎_ V@Ƃܢ;(єi00aY,/۪#_YPD!ÄizhePO,Nv3ytD]I-3v %PN:U<ѿۅY0}GYHP:9kz>T,fR?u YA3HK'M&'GmNA jof/dgN#4ۮ l jʅ]VQVQ&C>NWOWWCA&w}Tt#W&/UOIWU\$gŬ ??I>ޑ4ȝ0ny @M!/tJ18{0c+ۣzT +܇Rqx0/e5h~E~vCC|]yOڶ ;Uw9_f0cGD`Kx+w]ϥmy6鏖TɸY]̣Q}J`7 خey[s(8 *ygAbZ}9sb5L@B<]#婾:@񧲥2PV5h RC|6ߨߴa6Z5a?,G-2om6Kj_n? vl>'HoKj=xeQm͝3S ;7y4ˁKȎTeVuR|Z@t>K0OR#xGrD 5 JWm2iO;8bc>:a=?jNMA o=X2׉^D\7 {S}98(eĈZ7RNl0K P]hػ\VgC#( Gx|r{E@$ ,οh#&j-{llۈRy]+HїXp- Ǻ#jX5Bęt2=XqvڀQ8kߊҪD}6"~L^-.`̯äzXѨJrJU$1p!RK<.+uP6%Q&Mxflp.䰆jMNQv7ȸSX/R%M}YջRwuiCDqugU&r+4mm[!5 Xs2Kityk:җA_9ɔJUEm8n.q :NŶl@=3wz'XlF!/kȃ~brjЗo"p'TnY|㥢lZe4auhin.s{Whd ݄͢\ yrN9t'Yû5֨i6r@?Zg" dlMv~ɝ)NXgd8iG.2{8TrY#HЏuH+dQl .P!Ѿqby͛~mŹߕH0ua u_{}gBǬ*sb_fn̽#Rc]@QKqM&mgdCs,b> 3j9Ȯ-1~4J"y?q^6`n~هd }Q53U- >)V@?#,90:QnڹXdpY~]h4B2]4h1hحV#Lɴj-=p%Q`>{L`{Z\2g'&m\ejv񸅤A! 逸FQ# 5.;r3үgܱ N#] cO) om ,E=@tSo._~.cVJFRv;rAh冭:^A&7j.9 w )wU^FTVo]KL) vw F09mj!kgǰyEu n]GmwU96un'՜#5G/|dǛL=;PmJYV A35XW.YI`$wb _F’|cuLc$NL YW+?wD]eLכ7*jւDWˆb2lFkz\J2ν{UnBӖ!nϘ pT>G#lBf^iV{0M>n>#gX5"&T MH^}syOkT#(VќDRe(m[r_IYmx0L.NqK[Dh-ŏ D:* kM|k9G 85aѫfy:Vڮ弟J\%牳d!Pj9`l0RhTZp?CL~oGè-4axvy Dz*7L65"kk?"TleWVh9?! Sx*]R(D<;>8Ԍ= wAƾ"yjwyE"az}—- !Osw3!_tھ o{ӾP`on"ok5!%&:GH=Y;Pѣ Xl^@!-l^|Ω;jOvlKwo ʮtHe1uFD {앂Gg A%A-θjR˙)fjҔ3-xPŸS<9TXaOp8&4UN QuXykҭ aqK 9)=%%(2NO+cnš."kWM{.#4O_ Y*DtHDj?Ysޯ h[ ̠xcqeoK xBO_lB8>,K<(0@ɭ&}N xC/cqeW<_b|µ~{$!G2dO;o2Y[O B)?o0s_A6AA>K /\ J`N"xjsGʞj&yL;:=> p NrFNtu*ڣWװ|t1l݌Mio~>h0w~x$ Y| aCtٙfw4@!d)l`}$uӌlT2Ex2'Iih}!]=4maҹ3֑8:Ig/YO`1,lty%ru s$3-T红GMMLb^p>3ԙeaO=n$?la1#a]"Y WQhB[17 LT3{ YW IP9-Qƨ~_[ֱdGHƭw'#]!,&\*ќl;~^ږC IG1F}$-Gk dI^iDPzݱo0h!ӊI,vdq[KF=VtVw6-OHA:`nӝIk-~;'FYjwsN= 3,$ =0(ۿ{lL x A= X^!kg|F%"b>'\ˉZDI,! ul|WEK qhnr]9{g6DC5"OBllr@y"&㝱K!kw?XW#:AU*9,͎-]kGծ |@z{xh n*~ ЋXJ߉L:>*[Rci'׶?`j!̙q"Lq\9FpjƕxEp ~bWl.Q_7U@_Pis@R24Lϙ/@6VڈĪzd_R [?Pu9Ṭ9FӶ˩1raXEմ lrrxx ` LE*_k˩gf #|vmh;:Oxv규X CtT 8Yk4;؋:B%qB MXX굏H^cc]g֍tpfu ]G8!OW ]8M&BkK#EQ_ 9uDxՋ&'xFX̥j!a2}fB[8P]7GwoVna#DOͱ/;%ar/u=fhI+H7_K"upى*tU%YR6򍮖:K X.䧔<.Ϛ]=ևT}W+]ihi*V[Zs*[\ vDPI O]„>q :-pAMعX;!n9TCa_d22Y * A$rm&lGK @#m?S&a0*;p1{| =J}` smוX!5)Y*ԼLH ܵK;3Ϟmj}Mܰ$iU= iXɑ璧mAu^&>.A"$5o6p+a葆Y2U)H739xǗ0~dŘU\L_GqL}l:eDo3}":l~AoY{N]c$4W>gnA뫅"iu1~>HiRLPy8y/j9mwY5g~`Vt`'bVx__HL+$d eO.ASFwֹth7x!0q!q>g\ d//q i;v}u2DrPY¢x.iSr!A t/+ʰ౪ʁȷ}P|!/w.&c!/M h[jʹ=#ȢtWBZ`4BpyTA4t={&6D9Ry0pAyI|BhCP=7TZp6`=#Z>(7y)ڧOS({9>oZ&M,f*` rI4|4=`)t„6z1G&dG : 0֒|g@է ;,pDB:V1(lY$" ' ߄fnߴ; BW5Z84<48Q28gx',\@3W }EaZR㼋%ONPjD ]7oogqzx9~}qy>-a ֛Lƞjtre\DdWeqg̚6y0n{¥[ .qs4[)Gpټ\HuFo J㮝=I'!*ljšN^T?3ABJǩ<\~˶*;*yv4=*FQ>O \ *ʭkD0βX|WI?&Um" 28A*L%7{Uc"a >4ɞYW䍬DW֮y2] vR Ԣ_ _R;e9Y5@@5{n uyPnz ❉׏|mE-Zkbɳ gM\oNyu9`1w*3şQ9hz|Ex>d+E~){Ӄ'htXd`e?_ϕ) BQlPvojjO _} :]U1$44.HBY2S>ð d6zP= B% 2T٤ GSu<QTRz{84ֲ8bV$vj!"Kj_PjZ7@@SD XQF,)/,0+O:z>s`1x7Z(%AAɧ*qW)9 K+sH疑&Ex]Q[z$ÜPRȨfF@e6aD@ͭp% oa)۬~n CH,N11~LIpP A,w$YD=yHϟY {.&1ěMDB#lER(Zy| ՀDZٛMa IbsW|11chmol?^%CγtJ6mA jfbBf=uCpx\ԁQ$YVyfe3\ea+?pU=AIzE+2cSpe+$4qM_ :!E8`{@F"lq;i RAy58 ܦCf^u_:rc鼝Ʈ@/ShO|˻a6&; sbEI7C^K7#Ԩgfr1ոS8`-tfqsքO8kp<}ؖV. Y|33ٕ?Nqŕ؋sv |Ͳb'u~' !FCU4->;8v2)}C$ abZM%<"HGxοB!wm"B;P&~>}ɶv.\g*Zf ޞŧ讦˨F>>Ck&#R U&xXzN(#ΊIeޕ Ϙ:F4B w/ʎZ=|k|.W>{OEEɄ9үhm9ԀޱΩz*LA7s#HJ-1-f[hj+?yp:U"eO,h6fM<-aAb'"qSG\V{HH&*9Wdj(8":K;OU~:*UNESJ@#(TIchMf;8QNNVfu@tCd]K*zcL xWp;lhO#jo-~Bu|,/yi< #C7uieNU]e)N_wzK׷Rʮ#bL4qy5] jE2̗Xjb~8B?B`ε*?]f'Cc§iJۓ ic)0ߪ[wڲhhf]Aup[TR҂^Ҹ 8T5t΍ _LZ\^GW9/T n7))% 6-'&o2O'3=H>~y-fde~6Nۅ,xJza1u+B\px95ohRI1]>ڈ7@-szY@qZ;?BR G@-h D'Ȣ}z.U3BВ"({6H"777V7&Mw1Hߏ>;$m V|tDT--{훵ӪR] AhCLnBg ONsU|D7Rd(CW Ϥ#KBԐ?GK< ̈́}0)@ 6eg'YEh|1@Ț|Z`ҽBH 2ܭbˋq kɷ~UV]5>uW7i~OF5k=P3]S&(uYf*Tar\IDr`8j=MDHgoDqPqրmvQ׏)M%z@8<$fTUL^Ya;usdX`6:RMufjM]Y44/Lxf`Pq>HG(D/OW#y/s^94x>l~^wF&l.ezi/D.!L oɶbCmۄI3OWK1NGvӐ{jX8xI 3wq)kgriÖnJ6J8lJzQZB`Y.Ia| ml/y9 +s8y#0*A_/hoM%Ȣ, }#tTh'K 4YBW}9ɿlG%iɆn 72)b+~ P᦮8ԯdl@T3LW;@4n=+=,t;(z4u PssМql›OE`K6 _[P e\OaBO<=%X$ #8M HFo{ "9SQ,Zn)UlʨD _<i33nCܟ-?Stx: ;~_+Uɽ?*HՂeHf.QI@&bh`fg).\2#N,dVmP紳:%'B *'"[_k! ;}U Ჵ j~1x,eRdr6?mqx=Pb qw&ԞҎ &`oeamh`T_l1Zf@V}WkeXzM/E'T&{5:n{=쭧Ш~)71i@u럜"Z"_'`60^e^Q `Y}<f]Y8bC& " 1c5o?y&(5hGB7/JuH9o  \-`n{κ8'#I\&q:Y)5`AY929#* u1%`_"$2чʠFnT-ًB zK>}MM\E=ǭӾHkDȋNܝXQU$'x`}ضC+:/E2[v;j_ߐh9K"6$L!#&O2ƉZmfC&D*{p|c*Km^o`@݇S6WE~gR*!\VD۝F"Lr%_L$:޲- 2YJXml? <E[v.djo"YDk xx-^kiy|6V ZmlA)X3HZPE}תyR`8]:BY|;7Q.|ƒ=8Bm*>O Soٴ9wݓz띻Y0;|07磃rLXpxq_1ǁTNqHC-)sD萳 !tT y 6E_?cյSYuRN&g2lNʇH@kfW9~ɾhTϦ6uzZ~ UZgP9ej,/W_QiV%g>=̑Q]%OٖWBc g#\R:KLK#T/lS h"c߄']"qϾRA\{'#iT ؃{ʊ8##򻝣5\ io"M;7Cp$BRRt~GK}i֦+{Q35hQ=w巸->PN̠׊ |KGJLv|-SnS 3up)'<=%;:3f0|b_1]guW\_¥HvE~ ^#q+4~u˫š[ `Aw2NgHC> v&+f".CoK)\Z Yi6l_Ze{TfYlR:'uC(KO$Us ]xk:)xl$t~GH+N6^kۻ-'=gC-erR,|`h$ >!K TBz"]PSݐ {I *H3Ka:X8{C_ N&Cʛ+^Ϛ7 t ou/SՌRPBSÛ_7<d>1Uw܅߫ Ј_VnpywJYt7'C'~._ dӗ'jĢwuEi-L˚6@.C])[q* 1ek@ĊdEVMtϽϘ)*.PGՕ#9E%!VzT`r` E={gyav>ԝֱY)J @C.B^m:ZfuY^ne8{Pֵ, λ+3X~2O7D!,y2^Ef^fdqD6x֐ԧEʼ> l[EDrtC0ʝաyЀ!Na0mg/TUq;kU(RǴ{+J3T;}>ē3^a.x=Ho*fh`{8׎17lzL Rg$'&4V&z%5~Lzw%V썐q Toh\WۋDvk^Lq|8_N7&7MF_KEC3;RQS5L&&K;2xTT'%sHRza9G#_" (Yy SOvDW-p!zs!oF=QY45i&Ggu&R yL[1oߩڅ$Ǿ W Bm::93"KEQ' }]q̳}KS3mb b615jܼ.h(ǂ0d,A7>-kǓoy_=eǠPH57 ontj?b莲Or[ f8G7h/覜fdd7106H Pbs)~9G-l&?coyxJ/'Y Z =>Il?brw G^4I"dd,+<Ň+6~Ϥr%r-Ԧo`s,j%O&*,Ԍ돗.w~)tovɷC3cjd0{~#Oc`¬ARO:[mva=ӥU2M=z ⑆'(D;gv14*bbz ?{5ɍyBM܄ J({knk/$Qӯv%{7R btO;)U2*&ZV{PTNgq7W%<5<թ51 l'dT$\(A%JNlaxN <7T UB_2s5EXrحh %֔KbKIT'\v j`7iiM..Y)&$s~ tqD=§ZXq)ک[LCZdE!?1A,$p7%ϥ Q]\ԷԱ( zduI`[m|@sUt5)q>rWK[˺ 3X]nL<?^=!4[ϦO{:1̼eshTlV)ۊpYaA#K@:B3#2Z5S#2#c#[fʶ"5\~E>RyFq۫צ GKsҠwPϸ]JQX"H͞pA'E_b}ruь}e րOPM8P ځA,!Vl/Ui"Yt?QN9z pܥ8f 4S.p~-MEZ56{VyGt!ڋŞ4JPJ{FnUN֕lɕz]ۈy_E-ib~4j&qJ[3Gk'_s'`Y "FxΪJE!OÄ E/X0FA9pF=vnPfxL8~3føQ\1ǭ؆Qql1 h笢M%8j/sP>$|Ooh.A| Y%p:]3dGC6 "a#J[.E)Ɣtep@"勐q)Ϥ3;ӭ~