From 37a65bcaf6d843d65c031fcfbd21cb35088e6bd2 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 16 Jan 2025 13:22:15 +0100 Subject: [PATCH 1/3] updated repo query schema, repo and withbuilder validation, and reworked relation with building --- app/__test__/data/data-query-impl.spec.ts | 54 +++++++++++--- app/__test__/data/relations.test.ts | 34 +++------ app/__test__/data/specs/WithBuilder.spec.ts | 66 ++++++++++++++--- app/src/data/entities/query/Repository.ts | 15 +--- app/src/data/entities/query/WithBuilder.ts | 73 +++++++++++++++++-- app/src/data/relations/EntityRelation.ts | 6 +- app/src/data/relations/ManyToManyRelation.ts | 29 +++++++- app/src/data/relations/ManyToOneRelation.ts | 16 +++- app/src/data/relations/PolymorphicRelation.ts | 15 +++- app/src/data/server/data-query-impl.ts | 66 ++++++++++++++--- 10 files changed, 285 insertions(+), 89 deletions(-) diff --git a/app/__test__/data/data-query-impl.spec.ts b/app/__test__/data/data-query-impl.spec.ts index a2fcdff..e2cfb29 100644 --- a/app/__test__/data/data-query-impl.spec.ts +++ b/app/__test__/data/data-query-impl.spec.ts @@ -1,8 +1,14 @@ import { describe, expect, test } from "bun:test"; -import { Value } from "../../src/core/utils"; -import { WhereBuilder, type WhereQuery, querySchema } from "../../src/data"; +import { Value, _jsonp } from "../../src/core/utils"; +import { type RepoQuery, WhereBuilder, type WhereQuery, querySchema } from "../../src/data"; +import type { RepoQueryIn } from "../../src/data/server/data-query-impl"; import { getDummyConnection } from "./helper"; +const decode = (input: RepoQueryIn, expected: RepoQuery) => { + const result = Value.Decode(querySchema, input); + expect(result).toEqual(expected); +}; + describe("data-query-impl", () => { function qb() { const c = getDummyConnection(); @@ -88,21 +94,47 @@ describe("data-query-impl", () => { expect(keys).toEqual(expectedKeys); } }); + + test("with", () => { + decode({ with: ["posts"] }, { with: { posts: {} } }); + decode({ with: { posts: {} } }, { with: { posts: {} } }); + decode({ with: { posts: { limit: "1" } } }, { with: { posts: { limit: 1 } } }); + decode( + { + with: { + posts: { + with: { + images: { + select: "id" + } + } + } + } + }, + { + with: { + posts: { + with: { + images: { + select: ["id"] + } + } + } + } + } + ); + }); }); describe("data-query-impl: Typebox", () => { test("sort", async () => { - const decode = (input: any, expected: any) => { - const result = Value.Decode(querySchema, input); - expect(result.sort).toEqual(expected); - }; - const _dflt = { by: "id", dir: "asc" }; + const _dflt = { sort: { by: "id", dir: "asc" } }; decode({ sort: "" }, _dflt); - decode({ sort: "name" }, { by: "name", dir: "asc" }); - decode({ sort: "-name" }, { by: "name", dir: "desc" }); - decode({ sort: "-posts.name" }, { by: "posts.name", dir: "desc" }); + decode({ sort: "name" }, { sort: { by: "name", dir: "asc" } }); + decode({ sort: "-name" }, { sort: { by: "name", dir: "desc" } }); + decode({ sort: "-posts.name" }, { sort: { by: "posts.name", dir: "desc" } }); decode({ sort: "-1name" }, _dflt); - decode({ sort: { by: "name", dir: "desc" } }, { by: "name", dir: "desc" }); + decode({ sort: { by: "name", dir: "desc" } }, { sort: { by: "name", dir: "desc" } }); }); }); diff --git a/app/__test__/data/relations.test.ts b/app/__test__/data/relations.test.ts index ea56388..c62decb 100644 --- a/app/__test__/data/relations.test.ts +++ b/app/__test__/data/relations.test.ts @@ -119,12 +119,9 @@ describe("Relations", async () => { - select: users.* - cardinality: 1 */ - const selectPostsFromUsers = postAuthorRel.buildWith( - users, - kysely.selectFrom(users.name), - jsonFrom, - "posts" - ); + const selectPostsFromUsers = kysely + .selectFrom(users.name) + .select((eb) => postAuthorRel.buildWith(users, "posts")(eb).as("posts")); expect(selectPostsFromUsers.compile().sql).toBe( 'select (select "posts"."id" as "id", "posts"."title" as "title", "posts"."author_id" as "author_id" from "posts" as "posts" where "posts"."author_id" = "users"."id" limit ?) as "posts" from "users"' ); @@ -141,12 +138,9 @@ describe("Relations", async () => { - select: posts.* - cardinality: */ - const selectUsersFromPosts = postAuthorRel.buildWith( - posts, - kysely.selectFrom(posts.name), - jsonFrom, - "author" - ); + const selectUsersFromPosts = kysely + .selectFrom(posts.name) + .select((eb) => postAuthorRel.buildWith(posts, "author")(eb).as("author")); expect(selectUsersFromPosts.compile().sql).toBe( 'select (select "author"."id" as "id", "author"."username" as "username" from "users" as "author" where "author"."id" = "posts"."author_id" limit ?) as "author" from "posts"' @@ -315,20 +309,16 @@ describe("Relations", async () => { - select: users.* - cardinality: 1 */ - const selectCategoriesFromPosts = postCategoriesRel.buildWith( - posts, - kysely.selectFrom(posts.name), - jsonFrom - ); + const selectCategoriesFromPosts = kysely + .selectFrom(posts.name) + .select((eb) => postCategoriesRel.buildWith(posts)(eb).as("categories")); expect(selectCategoriesFromPosts.compile().sql).toBe( 'select (select "categories"."id" as "id", "categories"."label" as "label" from "categories" inner join "posts_categories" on "categories"."id" = "posts_categories"."categories_id" where "posts"."id" = "posts_categories"."posts_id" limit ?) as "categories" from "posts"' ); - const selectPostsFromCategories = postCategoriesRel.buildWith( - categories, - kysely.selectFrom(categories.name), - jsonFrom - ); + const selectPostsFromCategories = kysely + .selectFrom(categories.name) + .select((eb) => postCategoriesRel.buildWith(categories)(eb).as("posts")); expect(selectPostsFromCategories.compile().sql).toBe( 'select (select "posts"."id" as "id", "posts"."title" as "title" from "posts" inner join "posts_categories" on "posts"."id" = "posts_categories"."posts_id" where "categories"."id" = "posts_categories"."categories_id" limit ?) as "posts" from "categories"' ); diff --git a/app/__test__/data/specs/WithBuilder.spec.ts b/app/__test__/data/specs/WithBuilder.spec.ts index 367d3f0..b8f70ec 100644 --- a/app/__test__/data/specs/WithBuilder.spec.ts +++ b/app/__test__/data/specs/WithBuilder.spec.ts @@ -8,19 +8,60 @@ import { TextField, WithBuilder } from "../../../src/data"; +import * as proto from "../../../src/data/prototype"; import { getDummyConnection } from "../helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); afterAll(afterAllCleanup); +function schemaToEm(s: ReturnType<(typeof proto)["em"]>): EntityManager { + return new EntityManager(Object.values(s.entities), dummyConnection, s.relations, s.indices); +} + describe("[data] WithBuilder", async () => { + test("validate withs", async () => { + const schema = proto.em( + { + posts: proto.entity("posts", {}), + users: proto.entity("users", {}), + media: proto.entity("media", {}) + }, + ({ relation }, { posts, users, media }) => { + relation(posts).manyToOne(users); + relation(users).polyToOne(media, { mappedBy: "avatar" }); + } + ); + const em = schemaToEm(schema); + + expect(WithBuilder.validateWiths(em, "posts", undefined)).toBe(0); + expect(WithBuilder.validateWiths(em, "posts", {})).toBe(0); + expect(WithBuilder.validateWiths(em, "posts", { users: {} })).toBe(1); + expect( + WithBuilder.validateWiths(em, "posts", { + users: { + with: { avatar: {} } + } + }) + ).toBe(2); + expect(() => WithBuilder.validateWiths(em, "posts", { author: {} })).toThrow(); + expect(() => + WithBuilder.validateWiths(em, "posts", { + users: { + with: { glibberish: {} } + } + }) + ).toThrow(); + }); + test("missing relation", async () => { const users = new Entity("users", [new TextField("username")]); const em = new EntityManager([users], dummyConnection); expect(() => - WithBuilder.addClause(em, em.connection.kysely.selectFrom("users"), users, ["posts"]) - ).toThrow('Relation "posts" not found'); + WithBuilder.addClause(em, em.connection.kysely.selectFrom("users"), users, { + posts: {} + }) + ).toThrow('Relation "users<>posts" not found'); }); test("addClause: ManyToOne", async () => { @@ -29,9 +70,9 @@ describe("[data] WithBuilder", async () => { const relations = [new ManyToOneRelation(posts, users, { mappedBy: "author" })]; const em = new EntityManager([users, posts], dummyConnection, relations); - const qb = WithBuilder.addClause(em, em.connection.kysely.selectFrom("users"), users, [ - "posts" - ]); + const qb = WithBuilder.addClause(em, em.connection.kysely.selectFrom("users"), users, { + posts: {} + }); const res = qb.compile(); @@ -44,7 +85,9 @@ describe("[data] WithBuilder", async () => { em, em.connection.kysely.selectFrom("posts"), posts, // @todo: try with "users", it gives output! - ["author"] + { + author: {} + } ); const res2 = qb2.compile(); @@ -56,9 +99,10 @@ describe("[data] WithBuilder", async () => { }); test("test with empty join", async () => { + const em = new EntityManager([], dummyConnection); const qb = { qb: 1 } as any; - expect(WithBuilder.addClause(null as any, qb, null as any, [])).toBe(qb); + expect(WithBuilder.addClause(em, qb, null as any, {})).toBe(qb); }); test("test manytomany", async () => { @@ -89,7 +133,7 @@ describe("[data] WithBuilder", async () => { //console.log((await em.repository().findMany("posts_categories")).result); - const res = await em.repository(posts).findMany({ with: ["categories"] }); + const res = await em.repository(posts).findMany({ with: { categories: {} } }); expect(res.data).toEqual([ { @@ -107,7 +151,7 @@ describe("[data] WithBuilder", async () => { } ]); - const res2 = await em.repository(categories).findMany({ with: ["posts"] }); + const res2 = await em.repository(categories).findMany({ with: { posts: {} } }); //console.log(res2.sql, res2.data); @@ -150,7 +194,7 @@ describe("[data] WithBuilder", async () => { em, em.connection.kysely.selectFrom("categories"), categories, - ["single"] + { single: {} } ); const res = qb.compile(); expect(res.sql).toBe( @@ -162,7 +206,7 @@ describe("[data] WithBuilder", async () => { em, em.connection.kysely.selectFrom("categories"), categories, - ["multiple"] + { multiple: {} } ); const res2 = qb2.compile(); expect(res2.sql).toBe( diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index a6dc576..638b99b 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -103,17 +103,10 @@ export class Repository 0) { - for (const entry of options.with) { - const related = this.em.relationOf(entity.name, entry); - if (!related) { - throw new InvalidSearchParamsException( - `WITH: "${entry}" is not a relation of "${entity.name}"` - ); - } - - validated.with.push(entry); - } + if (options.with) { + const depth = WithBuilder.validateWiths(this.em, entity.name, options.with); + // @todo: determine allowed depth + validated.with = options.with; } if (options.join && options.join.length > 0) { diff --git a/app/src/data/entities/query/WithBuilder.ts b/app/src/data/entities/query/WithBuilder.ts index 260dc86..1d5cfe5 100644 --- a/app/src/data/entities/query/WithBuilder.ts +++ b/app/src/data/entities/query/WithBuilder.ts @@ -1,11 +1,16 @@ +import { isObject } from "core/utils"; +import type { KyselyJsonFrom, RepoQuery } from "data"; +import { InvalidSearchParamsException } from "data/errors"; +import type { RepoWithSchema } from "data/server/data-query-impl"; import type { Entity, EntityManager, RepositoryQB } from "../../entities"; export class WithBuilder { - private static buildClause( + /*private static buildClause( em: EntityManager, qb: RepositoryQB, entity: Entity, - withString: string + ref: string, + config?: RepoQuery ) { const relation = em.relationOf(entity.name, withString); if (!relation) { @@ -15,7 +20,6 @@ export class WithBuilder { const cardinality = relation.ref(withString).cardinality; //console.log("with--builder", { entity: entity.name, withString, cardinality }); - const fns = em.connection.fn; const jsonFrom = cardinality === 1 ? fns.jsonObjectFrom : fns.jsonArrayFrom; if (!jsonFrom) { @@ -27,16 +31,69 @@ export class WithBuilder { } catch (e) { throw new Error(`Could not build "with" relation "${withString}": ${(e as any).message}`); } - } + }*/ - static addClause(em: EntityManager, qb: RepositoryQB, entity: Entity, withs: string[]) { - if (withs.length === 0) return qb; + static addClause( + em: EntityManager, + qb: RepositoryQB, + entity: Entity, + withs: RepoQuery["with"] + ) { + if (!withs || !isObject(withs)) { + console.warn(`'withs' undefined or invalid, given: ${JSON.stringify(withs)}`); + return qb; + } + const fns = em.connection.fn; let newQb = qb; - for (const entry of withs) { - newQb = WithBuilder.buildClause(em, newQb, entity, entry); + + for (const [ref, query] of Object.entries(withs)) { + const relation = em.relationOf(entity.name, ref); + if (!relation) { + throw new Error(`Relation "${entity.name}<>${ref}" not found`); + } + const cardinality = relation.ref(ref).cardinality; + const jsonFrom: KyselyJsonFrom = + cardinality === 1 ? fns.jsonObjectFrom : fns.jsonArrayFrom; + if (!jsonFrom) { + throw new Error("Connection does not support jsonObjectFrom/jsonArrayFrom"); + } + + const alias = relation.other(entity).reference; + newQb = newQb.select((eb) => { + return jsonFrom(relation.buildWith(entity, ref)(eb)).as(alias); + }); + //newQb = relation.buildWith(entity, qb, jsonFrom, ref); } return newQb; } + + static validateWiths(em: EntityManager, entity: string, withs: RepoQuery["with"]) { + let depth = 0; + if (!withs || !isObject(withs)) { + console.warn(`'withs' undefined or invalid, given: ${JSON.stringify(withs)}`); + return depth; + } + + const child_depths: number[] = []; + for (const [ref, query] of Object.entries(withs)) { + const related = em.relationOf(entity, ref); + if (!related) { + throw new InvalidSearchParamsException( + `WITH: "${ref}" is not a relation of "${entity}"` + ); + } + depth++; + + if ("with" in query) { + child_depths.push(WithBuilder.validateWiths(em, ref, query.with as any)); + } + } + if (child_depths.length > 0) { + depth += Math.max(...child_depths); + } + + return depth; + } } diff --git a/app/src/data/relations/EntityRelation.ts b/app/src/data/relations/EntityRelation.ts index e7d680b..07611d0 100644 --- a/app/src/data/relations/EntityRelation.ts +++ b/app/src/data/relations/EntityRelation.ts @@ -1,5 +1,5 @@ import { type Static, Type, parse } from "core/utils"; -import type { SelectQueryBuilder } from "kysely"; +import type { ExpressionBuilder, SelectQueryBuilder } from "kysely"; import type { Entity, EntityData, EntityManager } from "../entities"; import { type EntityRelationAnchor, @@ -67,10 +67,8 @@ export abstract class EntityRelation< */ abstract buildWith( entity: Entity, - qb: KyselyQueryBuilder, - jsonFrom: KyselyJsonFrom, reference: string - ): KyselyQueryBuilder; + ): (eb: ExpressionBuilder) => KyselyQueryBuilder; abstract buildJoin( entity: Entity, diff --git a/app/src/data/relations/ManyToManyRelation.ts b/app/src/data/relations/ManyToManyRelation.ts index 25dbdca..b4e89f1 100644 --- a/app/src/data/relations/ManyToManyRelation.ts +++ b/app/src/data/relations/ManyToManyRelation.ts @@ -1,4 +1,5 @@ import { type Static, Type } from "core/utils"; +import type { ExpressionBuilder } from "kysely"; import { Entity, type EntityManager } from "../entities"; import { type Field, PrimaryField, VirtualField } from "../fields"; import type { RepoQuery } from "../server/data-query-impl"; @@ -123,7 +124,7 @@ export class ManyToManyRelation extends EntityRelation !(f instanceof RelationField || f instanceof PrimaryField) ); - return qb.select((eb) => { + return (eb: ExpressionBuilder) => + eb + .selectFrom(other.entity.name) + .select((eb2) => { + const select: any[] = other.entity.getSelect(other.entity.name); + if (additionalFields.length > 0) { + const conn = this.connectionEntity.name; + select.push( + jsonBuildObject( + Object.fromEntries( + additionalFields.map((f) => [f.name, eb2.ref(`${conn}.${f.name}`)]) + ) + ).as(this.connectionTableMappedName) + ); + } + + return select; + }) + .whereRef(entityRef, "=", otherRef) + .innerJoin(...join) + .limit(limit); + + /*return qb.select((eb) => { const select: any[] = other.entity.getSelect(other.entity.name); // @todo: also add to find by references if (additionalFields.length > 0) { @@ -160,7 +183,7 @@ export class ManyToManyRelation extends EntityRelation) { diff --git a/app/src/data/relations/ManyToOneRelation.ts b/app/src/data/relations/ManyToOneRelation.ts index 57bb993..e95ea06 100644 --- a/app/src/data/relations/ManyToOneRelation.ts +++ b/app/src/data/relations/ManyToOneRelation.ts @@ -1,6 +1,7 @@ import type { PrimaryFieldType } from "core"; import { snakeToPascalWithSpaces } from "core/utils"; import { type Static, Type } from "core/utils"; +import type { ExpressionBuilder } from "kysely"; import type { Entity, EntityManager } from "../entities"; import type { RepoQuery } from "../server/data-query-impl"; import { EntityRelation, type KyselyJsonFrom, type KyselyQueryBuilder } from "./EntityRelation"; @@ -155,15 +156,22 @@ export class ManyToOneRelation extends EntityRelation + return (eb: ExpressionBuilder) => + eb + .selectFrom(`${self.entity.name} as ${relationRef}`) + .select(self.entity.getSelect(relationRef)) + .whereRef(entityRef, "=", otherRef) + .limit(limit); + + /*return qb.select((eb) => jsonFrom( eb .selectFrom(`${self.entity.name} as ${relationRef}`) @@ -171,7 +179,7 @@ export class ManyToOneRelation extends EntityRelation + return (eb: ExpressionBuilder) => + eb + .selectFrom(other.entity.name) + .select(other.entity.getSelect(other.entity.name)) + .where(whereLhs, "=", reference) + .whereRef(entityRef, "=", otherRef) + .limit(limit); + + /*return qb.select((eb) => jsonFrom( eb .selectFrom(other.entity.name) @@ -100,7 +109,7 @@ export class PolymorphicRelation extends EntityRelation; + join?: string[]; + where?: any; +}; +export type RepoWithSchema = Record< + string, + Omit & { + with?: unknown; } +>; +export const withSchema = (Self: TSelf) => + Type.Transform(Type.Union([stringArray, Type.Record(Type.String(), Self)])) + .Decode((value) => { + let _value = value; + if (Array.isArray(value)) { + if (!value.every((v) => typeof v === "string")) { + throw new Error("Invalid 'with' schema"); + } + + _value = value.reduce((acc, v) => { + acc[v] = {}; + return acc; + }, {} as RepoWithSchema); + } + + return _value as RepoWithSchema; + }) + .Encode((value) => value); + +export const querySchema = Type.Recursive( + (Self) => + Type.Partial( + Type.Object( + { + limit: limit, + offset: offset, + sort: sort, + select: stringArray, + with: withSchema(Self), + join: stringArray, + where: whereSchema + }, + { + // @todo: determine if unknown is allowed, it's ignore anyway + additionalProperties: false + } + ) + ), + { $id: "query-schema" } ); export type RepoQueryIn = Static; From 26a5fd8b34d394c67f3d019720300b12bcb18d8e Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 16 Jan 2025 15:25:30 +0100 Subject: [PATCH 2/3] reworked `WithBuilder` to allow recursive `with` operations --- app/__test__/data/relations.test.ts | 5 +- app/__test__/data/specs/WithBuilder.spec.ts | 227 +++++++++++++++++- app/__test__/helper.ts | 13 +- app/package.json | 1 + .../data/connection/SqliteLocalConnection.ts | 5 +- app/src/data/entities/query/Repository.ts | 74 ++++-- app/src/data/entities/query/WithBuilder.ts | 49 ++-- app/src/data/relations/ManyToOneRelation.ts | 18 +- app/src/data/relations/PolymorphicRelation.ts | 15 +- bun.lockb | Bin 1063936 -> 1064392 bytes 10 files changed, 305 insertions(+), 102 deletions(-) diff --git a/app/__test__/data/relations.test.ts b/app/__test__/data/relations.test.ts index c62decb..19eab85 100644 --- a/app/__test__/data/relations.test.ts +++ b/app/__test__/data/relations.test.ts @@ -106,7 +106,6 @@ describe("Relations", async () => { expect(postAuthorRel?.other(posts).entity).toBe(users); const kysely = em.connection.kysely; - const jsonFrom = (e) => e; /** * Relation Helper */ @@ -123,7 +122,7 @@ describe("Relations", async () => { .selectFrom(users.name) .select((eb) => postAuthorRel.buildWith(users, "posts")(eb).as("posts")); expect(selectPostsFromUsers.compile().sql).toBe( - 'select (select "posts"."id" as "id", "posts"."title" as "title", "posts"."author_id" as "author_id" from "posts" as "posts" where "posts"."author_id" = "users"."id" limit ?) as "posts" from "users"' + 'select (select from "posts" as "posts" where "posts"."author_id" = "users"."id") as "posts" from "users"' ); expect(postAuthorRel!.getField()).toBeInstanceOf(RelationField); const userObj = { id: 1, username: "test" }; @@ -143,7 +142,7 @@ describe("Relations", async () => { .select((eb) => postAuthorRel.buildWith(posts, "author")(eb).as("author")); expect(selectUsersFromPosts.compile().sql).toBe( - 'select (select "author"."id" as "id", "author"."username" as "username" from "users" as "author" where "author"."id" = "posts"."author_id" limit ?) as "author" from "posts"' + 'select (select from "users" as "author" where "author"."id" = "posts"."author_id" limit ?) as "author" from "posts"' ); expect(postAuthorRel.getField()).toBeInstanceOf(RelationField); const postObj = { id: 1, title: "test" }; diff --git a/app/__test__/data/specs/WithBuilder.spec.ts b/app/__test__/data/specs/WithBuilder.spec.ts index b8f70ec..bed48a6 100644 --- a/app/__test__/data/specs/WithBuilder.spec.ts +++ b/app/__test__/data/specs/WithBuilder.spec.ts @@ -1,4 +1,5 @@ import { afterAll, describe, expect, test } from "bun:test"; +import { _jsonp } from "../../../src/core/utils"; import { Entity, EntityManager, @@ -9,12 +10,13 @@ import { WithBuilder } from "../../../src/data"; import * as proto from "../../../src/data/prototype"; +import { compileQb, prettyPrintQb } from "../../helper"; import { getDummyConnection } from "../helper"; -const { dummyConnection, afterAllCleanup } = getDummyConnection(); -afterAll(afterAllCleanup); +const { dummyConnection } = getDummyConnection(); function schemaToEm(s: ReturnType<(typeof proto)["em"]>): EntityManager { + const { dummyConnection } = getDummyConnection(); return new EntityManager(Object.values(s.entities), dummyConnection, s.relations, s.indices); } @@ -77,9 +79,9 @@ describe("[data] WithBuilder", async () => { const res = qb.compile(); expect(res.sql).toBe( - 'select (select coalesce(json_group_array(json_object(\'id\', "agg"."id", \'content\', "agg"."content", \'author_id\', "agg"."author_id")), \'[]\') from (select "posts"."id" as "id", "posts"."content" as "content", "posts"."author_id" as "author_id" from "posts" as "posts" where "posts"."author_id" = "users"."id" limit ?) as agg) as "posts" from "users"' + 'select (select coalesce(json_group_array(json_object(\'id\', "agg"."id", \'content\', "agg"."content", \'author_id\', "agg"."author_id")), \'[]\') from (select "posts"."id" as "id", "posts"."content" as "content", "posts"."author_id" as "author_id" from "posts" as "posts" where "posts"."author_id" = "users"."id" order by "posts"."id" asc limit ? offset ?) as agg) as "posts" from "users"' ); - expect(res.parameters).toEqual([5]); + expect(res.parameters).toEqual([10, 0]); const qb2 = WithBuilder.addClause( em, @@ -93,9 +95,9 @@ describe("[data] WithBuilder", async () => { const res2 = qb2.compile(); expect(res2.sql).toBe( - 'select (select json_object(\'id\', "obj"."id", \'username\', "obj"."username") from (select "author"."id" as "id", "author"."username" as "username" from "users" as "author" where "author"."id" = "posts"."author_id" limit ?) as obj) as "author" from "posts"' + 'select (select json_object(\'id\', "obj"."id", \'username\', "obj"."username") from (select "users"."id" as "id", "users"."username" as "username" from "users" as "author" where "author"."id" = "posts"."author_id" order by "users"."id" asc limit ? offset ?) as obj) as "author" from "posts"' ); - expect(res2.parameters).toEqual([1]); + expect(res2.parameters).toEqual([1, 0]); }); test("test with empty join", async () => { @@ -165,8 +167,8 @@ describe("[data] WithBuilder", async () => { id: 2, label: "beauty", posts: [ - { id: 2, title: "beauty post" }, - { id: 1, title: "fashion post" } + { id: 1, title: "fashion post" }, + { id: 2, title: "beauty post" } ] }, { @@ -198,9 +200,9 @@ describe("[data] WithBuilder", async () => { ); const res = qb.compile(); expect(res.sql).toBe( - 'select (select json_object(\'id\', "obj"."id", \'path\', "obj"."path") from (select "media"."id" as "id", "media"."path" as "path" from "media" where "media"."reference" = ? and "categories"."id" = "media"."entity_id" limit ?) as obj) as "single" from "categories"' + 'select (select json_object(\'id\', "obj"."id", \'path\', "obj"."path") from (select "media"."id" as "id", "media"."path" as "path" from "media" where "media"."reference" = ? and "categories"."id" = "media"."entity_id" order by "media"."id" asc limit ? offset ?) as obj) as "single" from "categories"' ); - expect(res.parameters).toEqual(["categories.single", 1]); + expect(res.parameters).toEqual(["categories.single", 1, 0]); const qb2 = WithBuilder.addClause( em, @@ -210,9 +212,9 @@ describe("[data] WithBuilder", async () => { ); const res2 = qb2.compile(); expect(res2.sql).toBe( - 'select (select coalesce(json_group_array(json_object(\'id\', "agg"."id", \'path\', "agg"."path")), \'[]\') from (select "media"."id" as "id", "media"."path" as "path" from "media" where "media"."reference" = ? and "categories"."id" = "media"."entity_id" limit ?) as agg) as "multiple" from "categories"' + 'select (select coalesce(json_group_array(json_object(\'id\', "agg"."id", \'path\', "agg"."path")), \'[]\') from (select "media"."id" as "id", "media"."path" as "path" from "media" where "media"."reference" = ? and "categories"."id" = "media"."entity_id" order by "media"."id" asc limit ? offset ?) as agg) as "multiple" from "categories"' ); - expect(res2.parameters).toEqual(["categories.multiple", 5]); + expect(res2.parameters).toEqual(["categories.multiple", 10, 0]); }); /*test("test manytoone", async () => { @@ -236,4 +238,205 @@ describe("[data] WithBuilder", async () => { const res = await em.repository().findMany("posts", { join: ["author"] }); console.log(res.sql, res.parameters, res.result); });*/ + + describe("recursive", () => { + test("compiles with singles", async () => { + const schema = proto.em( + { + posts: proto.entity("posts", {}), + users: proto.entity("users", { + username: proto.text() + }), + media: proto.entity("media", { + path: proto.text() + }) + }, + ({ relation }, { posts, users, media }) => { + relation(posts).manyToOne(users); + relation(users).polyToOne(media, { mappedBy: "avatar" }); + } + ); + const em = schemaToEm(schema); + + const qb = WithBuilder.addClause( + em, + em.connection.kysely.selectFrom("posts"), + schema.entities.posts, + { + users: { + limit: 5, // ignored + select: ["id", "username"], + sort: { by: "username", dir: "asc" }, + with: { + avatar: { + select: ["id", "path"], + limit: 2 // ignored + } + } + } + } + ); + + //prettyPrintQb(qb); + expect(qb.compile().sql).toBe( + 'select (select json_object(\'id\', "obj"."id", \'username\', "obj"."username", \'avatar\', "obj"."avatar") from (select "users"."id" as "id", "users"."username" as "username", (select json_object(\'id\', "obj"."id", \'path\', "obj"."path") from (select "media"."id" as "id", "media"."path" as "path" from "media" where "media"."reference" = ? and "users"."id" = "media"."entity_id" order by "media"."id" asc limit ? offset ?) as obj) as "avatar" from "users" as "users" where "users"."id" = "posts"."users_id" order by "users"."username" asc limit ? offset ?) as obj) as "users" from "posts"' + ); + expect(qb.compile().parameters).toEqual(["users.avatar", 1, 0, 1, 0]); + }); + + test("compiles with many", async () => { + const schema = proto.em( + { + posts: proto.entity("posts", {}), + comments: proto.entity("comments", {}), + users: proto.entity("users", { + username: proto.text() + }), + media: proto.entity("media", { + path: proto.text() + }) + }, + ({ relation }, { posts, comments, users, media }) => { + relation(posts).manyToOne(users).polyToOne(media, { mappedBy: "images" }); + relation(users).polyToOne(media, { mappedBy: "avatar" }); + relation(comments).manyToOne(posts).manyToOne(users); + } + ); + const em = schemaToEm(schema); + + const qb = WithBuilder.addClause( + em, + em.connection.kysely.selectFrom("posts"), + schema.entities.posts, + { + comments: { + limit: 12, + with: { + users: { + select: ["username"] + } + } + } + } + ); + + expect(qb.compile().sql).toBe( + 'select (select coalesce(json_group_array(json_object(\'id\', "agg"."id", \'posts_id\', "agg"."posts_id", \'users_id\', "agg"."users_id", \'users\', "agg"."users")), \'[]\') from (select "comments"."id" as "id", "comments"."posts_id" as "posts_id", "comments"."users_id" as "users_id", (select json_object(\'username\', "obj"."username") from (select "users"."username" as "username" from "users" as "users" where "users"."id" = "comments"."users_id" order by "users"."id" asc limit ? offset ?) as obj) as "users" from "comments" as "comments" where "comments"."posts_id" = "posts"."id" order by "comments"."id" asc limit ? offset ?) as agg) as "comments" from "posts"' + ); + expect(qb.compile().parameters).toEqual([1, 0, 12, 0]); + }); + + test("returns correct result", async () => { + const schema = proto.em( + { + posts: proto.entity("posts", { + title: proto.text() + }), + comments: proto.entity("comments", { + content: proto.text() + }), + users: proto.entity("users", { + username: proto.text() + }), + media: proto.entity("media", { + path: proto.text() + }) + }, + ({ relation }, { posts, comments, users, media }) => { + relation(posts).manyToOne(users).polyToOne(media, { mappedBy: "images" }); + relation(users).polyToOne(media, { mappedBy: "avatar" }); + relation(comments).manyToOne(posts).manyToOne(users); + } + ); + const em = schemaToEm(schema); + await em.schema().sync({ force: true }); + + // add data + await em.mutator("users").insertMany([{ username: "user1" }, { username: "user2" }]); + await em.mutator("posts").insertMany([ + { title: "post1", users_id: 1 }, + { title: "post2", users_id: 1 }, + { title: "post3", users_id: 2 } + ]); + await em.mutator("comments").insertMany([ + { content: "comment1", posts_id: 1, users_id: 1 }, + { content: "comment1-1", posts_id: 1, users_id: 1 }, + { content: "comment2", posts_id: 1, users_id: 2 }, + { content: "comment3", posts_id: 2, users_id: 1 }, + { content: "comment4", posts_id: 2, users_id: 2 }, + { content: "comment5", posts_id: 3, users_id: 1 }, + { content: "comment6", posts_id: 3, users_id: 2 } + ]); + + const result = await em.repo("posts").findMany({ + select: ["title"], + with: { + comments: { + limit: 2, + select: ["content"], + with: { + users: { + select: ["username"] + } + } + } + } + }); + + expect(result.data).toEqual([ + { + title: "post1", + comments: [ + { + content: "comment1", + users: { + username: "user1" + } + }, + { + content: "comment1-1", + users: { + username: "user1" + } + } + ] + }, + { + title: "post2", + comments: [ + { + content: "comment3", + users: { + username: "user1" + } + }, + { + content: "comment4", + users: { + username: "user2" + } + } + ] + }, + { + title: "post3", + comments: [ + { + content: "comment5", + users: { + username: "user1" + } + }, + { + content: "comment6", + users: { + username: "user2" + } + } + ] + } + ]); + //console.log(_jsonp(result.data)); + }); + }); }); diff --git a/app/__test__/helper.ts b/app/__test__/helper.ts index e11da33..de6993e 100644 --- a/app/__test__/helper.ts +++ b/app/__test__/helper.ts @@ -1,6 +1,7 @@ import { unlink } from "node:fs/promises"; -import type { SqliteDatabase } from "kysely"; +import type { SelectQueryBuilder, SqliteDatabase } from "kysely"; import Database from "libsql"; +import { format as sqlFormat } from "sql-formatter"; import { SqliteLocalConnection } from "../src/data"; export function getDummyDatabase(memory: boolean = true): { @@ -51,3 +52,13 @@ export function enableConsoleLog() { console[severity as ConsoleSeverity] = fn; }); } + +export function compileQb(qb: SelectQueryBuilder) { + const { sql, parameters } = qb.compile(); + return { sql, parameters }; +} + +export function prettyPrintQb(qb: SelectQueryBuilder) { + const { sql, parameters } = qb.compile(); + console.log("$", sqlFormat(sql), "\n[params]", parameters); +} diff --git a/app/package.json b/app/package.json index 038d7cd..d05eccc 100644 --- a/app/package.json +++ b/app/package.json @@ -74,6 +74,7 @@ "react-hook-form": "^7.53.1", "react-icons": "5.2.1", "react-json-view-lite": "^2.0.1", + "sql-formatter": "^15.4.9", "tailwind-merge": "^2.5.4", "tailwindcss": "^3.4.14", "tailwindcss-animate": "^1.0.7", diff --git a/app/src/data/connection/SqliteLocalConnection.ts b/app/src/data/connection/SqliteLocalConnection.ts index 0b1a8c8..b3bfab3 100644 --- a/app/src/data/connection/SqliteLocalConnection.ts +++ b/app/src/data/connection/SqliteLocalConnection.ts @@ -1,6 +1,5 @@ -import type { DatabaseIntrospector, SqliteDatabase } from "kysely"; +import { type DatabaseIntrospector, ParseJSONResultsPlugin, type SqliteDatabase } from "kysely"; import { Kysely, SqliteDialect } from "kysely"; -import { DeserializeJsonValuesPlugin } from "../plugins/DeserializeJsonValuesPlugin"; import { SqliteConnection } from "./SqliteConnection"; import { SqliteIntrospector } from "./SqliteIntrospector"; @@ -14,7 +13,7 @@ class CustomSqliteDialect extends SqliteDialect { export class SqliteLocalConnection extends SqliteConnection { constructor(private database: SqliteDatabase) { - const plugins = [new DeserializeJsonValuesPlugin()]; + const plugins = [new ParseJSONResultsPlugin()]; const kysely = new Kysely({ dialect: new CustomSqliteDialect({ database }), plugins diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 638b99b..5234bc4 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -65,7 +65,7 @@ export class Repository): RepoQuery { + getValidOptions(options?: Partial): RepoQuery { const entity = this.entity; // @todo: if not cloned deep, it will keep references and error if multiple requests come in const validated = { @@ -228,43 +228,79 @@ export class Repository, - exclude_options: (keyof RepoQuery)[] = [] - ): { qb: RepositoryQB; options: RepoQuery } { + config?: { + validate?: boolean; + ignore?: (keyof RepoQuery)[]; + alias?: string; + defaults?: Pick; + } + ) { const entity = this.entity; - const options = this.getValidOptions(_options); + let qb = _qb ?? (this.conn.selectFrom(entity.name) as RepositoryQB); - const alias = entity.name; + const options = config?.validate !== false ? this.getValidOptions(_options) : _options; + if (!options) return qb; + + const alias = config?.alias ?? entity.name; const aliased = (field: string) => `${alias}.${field}`; - let qb = this.conn - .selectFrom(entity.name) - .select(entity.getAliasedSelectFrom(options.select, alias)); + const ignore = config?.ignore ?? []; + const defaults = { + limit: 10, + offset: 0, + ...config?.defaults + }; - //console.log("build query options", options); - if (!exclude_options.includes("with") && options.with) { + /*console.log("build query options", { + entity: entity.name, + options, + config + });*/ + + if (!ignore.includes("select") && options.select) { + qb = qb.select(entity.getAliasedSelectFrom(options.select, alias)); + } + + if (!ignore.includes("with") && options.with) { qb = WithBuilder.addClause(this.em, qb, entity, options.with); } - if (!exclude_options.includes("join") && options.join) { + if (!ignore.includes("join") && options.join) { qb = JoinBuilder.addClause(this.em, qb, entity, options.join); } // add where if present - if (!exclude_options.includes("where") && options.where) { + if (!ignore.includes("where") && options.where) { qb = WhereBuilder.addClause(qb, options.where); } - if (!exclude_options.includes("limit")) qb = qb.limit(options.limit); - if (!exclude_options.includes("offset")) qb = qb.offset(options.offset); + if (!ignore.includes("limit")) qb = qb.limit(options.limit ?? defaults.limit); + if (!ignore.includes("offset")) qb = qb.offset(options.offset ?? defaults.offset); // sorting - if (!exclude_options.includes("sort")) { - qb = qb.orderBy(aliased(options.sort.by), options.sort.dir); + if (!ignore.includes("sort")) { + qb = qb.orderBy(aliased(options.sort?.by ?? "id"), options.sort?.dir ?? "asc"); } - //console.log("options", { _options, options, exclude_options }); - return { qb, options }; + return qb as RepositoryQB; + } + + private buildQuery( + _options?: Partial, + ignore: (keyof RepoQuery)[] = [] + ): { qb: RepositoryQB; options: RepoQuery } { + const entity = this.entity; + const options = this.getValidOptions(_options); + + return { + qb: this.addOptionsToQueryBuilder(undefined, options, { + ignore, + alias: entity.name + }), + options + }; } async findId( diff --git a/app/src/data/entities/query/WithBuilder.ts b/app/src/data/entities/query/WithBuilder.ts index 1d5cfe5..ce4f14c 100644 --- a/app/src/data/entities/query/WithBuilder.ts +++ b/app/src/data/entities/query/WithBuilder.ts @@ -1,38 +1,9 @@ import { isObject } from "core/utils"; import type { KyselyJsonFrom, RepoQuery } from "data"; import { InvalidSearchParamsException } from "data/errors"; -import type { RepoWithSchema } from "data/server/data-query-impl"; import type { Entity, EntityManager, RepositoryQB } from "../../entities"; export class WithBuilder { - /*private static buildClause( - em: EntityManager, - qb: RepositoryQB, - entity: Entity, - ref: string, - config?: RepoQuery - ) { - const relation = em.relationOf(entity.name, withString); - if (!relation) { - throw new Error(`Relation "${withString}" not found`); - } - - const cardinality = relation.ref(withString).cardinality; - //console.log("with--builder", { entity: entity.name, withString, cardinality }); - - const jsonFrom = cardinality === 1 ? fns.jsonObjectFrom : fns.jsonArrayFrom; - - if (!jsonFrom) { - throw new Error("Connection does not support jsonObjectFrom/jsonArrayFrom"); - } - - try { - return relation.buildWith(entity, qb, jsonFrom, withString); - } catch (e) { - throw new Error(`Could not build "with" relation "${withString}": ${(e as any).message}`); - } - }*/ - static addClause( em: EntityManager, qb: RepositoryQB, @@ -59,11 +30,23 @@ export class WithBuilder { throw new Error("Connection does not support jsonObjectFrom/jsonArrayFrom"); } - const alias = relation.other(entity).reference; + const other = relation.other(entity); newQb = newQb.select((eb) => { - return jsonFrom(relation.buildWith(entity, ref)(eb)).as(alias); + let subQuery = relation.buildWith(entity, ref)(eb); + if (query) { + subQuery = em.repo(other.entity).addOptionsToQueryBuilder(subQuery, query as any, { + ignore: ["with", "join", cardinality === 1 ? "limit" : undefined].filter( + Boolean + ) as any + }); + } + + if (query.with) { + subQuery = WithBuilder.addClause(em, subQuery, other.entity, query.with as any); + } + + return jsonFrom(subQuery).as(other.reference); }); - //newQb = relation.buildWith(entity, qb, jsonFrom, ref); } return newQb; @@ -72,7 +55,7 @@ export class WithBuilder { static validateWiths(em: EntityManager, entity: string, withs: RepoQuery["with"]) { let depth = 0; if (!withs || !isObject(withs)) { - console.warn(`'withs' undefined or invalid, given: ${JSON.stringify(withs)}`); + withs && console.warn(`'withs' invalid, given: ${JSON.stringify(withs)}`); return depth; } diff --git a/app/src/data/relations/ManyToOneRelation.ts b/app/src/data/relations/ManyToOneRelation.ts index e95ea06..de53ad1 100644 --- a/app/src/data/relations/ManyToOneRelation.ts +++ b/app/src/data/relations/ManyToOneRelation.ts @@ -158,28 +158,12 @@ export class ManyToOneRelation extends EntityRelation) => eb .selectFrom(`${self.entity.name} as ${relationRef}`) - .select(self.entity.getSelect(relationRef)) .whereRef(entityRef, "=", otherRef) - .limit(limit); - - /*return qb.select((eb) => - jsonFrom( - eb - .selectFrom(`${self.entity.name} as ${relationRef}`) - .select(self.entity.getSelect(relationRef)) - .whereRef(entityRef, "=", otherRef) - .limit(limit) - ).as(relationRef) - );*/ + .$if(self.cardinality === 1, (qb) => qb.limit(1)); } /** diff --git a/app/src/data/relations/PolymorphicRelation.ts b/app/src/data/relations/PolymorphicRelation.ts index fa30974..cf77108 100644 --- a/app/src/data/relations/PolymorphicRelation.ts +++ b/app/src/data/relations/PolymorphicRelation.ts @@ -90,26 +90,13 @@ export class PolymorphicRelation extends EntityRelation) => eb .selectFrom(other.entity.name) - .select(other.entity.getSelect(other.entity.name)) .where(whereLhs, "=", reference) .whereRef(entityRef, "=", otherRef) - .limit(limit); - - /*return qb.select((eb) => - jsonFrom( - eb - .selectFrom(other.entity.name) - .select(other.entity.getSelect(other.entity.name)) - .where(whereLhs, "=", reference) - .whereRef(entityRef, "=", otherRef) - .limit(limit) - ).as(other.reference) - );*/ + .$if(other.cardinality === 1, (qb) => qb.limit(1)); } override isListableFor(entity: Entity): boolean { diff --git a/bun.lockb b/bun.lockb index 82c57ef5689e65252ca9ee888853ae070ea65dbb..19836ad79553abab4d05eb8769dd45966e6eea54 100755 GIT binary patch delta 163852 zcmb@v2Ygi3_V#~fl7TrOU_eE%&_q-~6p;Z#6A=jzHK2%sC4>Nx5==k@#YC?S6gAG( zW3Pw`C<=B3u?rd{b_EL-tRP&xcI5p&d+kZkANT(Mzt8*52lMP_*R|JPd+l=0jFrFi zd*%0jS08*}R_6m34-UIMdiAVp7q@%A;N_aAKMTF zO~J)rLvVQdi9J&l!@jZ9V?f2`g1dliJ>K+f5bOajE-xyaR5-TyN_ZpqEO0mQtd+)h z|2_yB!^a-hc~)uZOi( zPcHH}1C)f9Q|N0L9jP?3tTcS2BqaQ z%h3=+bfu3UKdE#~;iU55b@=Y2KMghoD?#aLeDRd>nNx~_Gs{b-98S45#J42A7%BD# z2cg&9!T0}g^;c9Lyv@XG4~8VnCLsrW9c%y={uu;&f-iyURz4^t6>Yct!$ApJLVm^P zk}iRY%8DmVLx7HOrQb`s1h^8EK%>CMK~_+?CS9;s^VpJf$zB~Q{>X~CMw%d{8vkc@ z%;|2s$FD(+!F`FC8?jqK>Gqs@v7iO`9jK8UT0iE57!Frw#)1-V5UBifsYmsf6&Dsw z>s(TPE*z~7tNig98`RMaVs5Z{fvw5d4pakAG_;DI31e=!8WJz<{0px1wV(uC3`&rj z(}jDts)#kQ*mFSXVhX6{ciGiy+0@u_H_b8eMu8g4IH>#^$)`b^+%)FKXspL~iC1fD zefd?Obl-Hhm@~;zkn)FB1_YGw6exX6D;zVXaLlCQOVc)pT_`9UZnB37(57*^>plze z2Jannre0P&cKSJtWnZ||S8tz~GvTtrah=PHCXDUo<2!(|k)HdS{0E~=_2Z>%) zplRg_pFcRrjZH=6(-hR8oC0dFvO1ao(?F@QoOm_dy?xA?=qxI5TI&=G_9MOsu6+5R zwAF|FdxOIcHg)s_Rqw&1w*oKo_3aPt8B{P%RIDB^BtjL}9AXVMb{T@o=k_ywzX6xk z&F*5jh7*JsnpLL8CI1N+<*;FXw`r;@{e;!mrcX^)U8z?KD zT%tMHW3bJN%+xI@A5$tndjRoL{p~}n16O(siPwViXvI)d?Jc0jZhpRvUE1R%peFAu zQ0rUwxcT5YojtWu5W66Bfed2kL{GPR9&4)!jk?8PjE;RC*pLfsUmiX)M=c-VwI4%udf~+o9m- z5$0X?^m?d&lIi1BxJu_?K`MPt%)0e^o^R#kSkRvM15UB>tw61V%hIuS%_~Ys)$rwm zn(F6{HnSNGDt-{C&UW*7-TFO-aOTmkWRaCK(HOl$CBxNLjYjFM^6&g1ANzd5i~i{0+AT9Tl0 z{kgzWKTEecs7pocKGSBCg(hACRM{VimlDfon3(I~nl}R$nf<*2mzmXDY%)9m*Jv$( z%L=AX8CNWi5D_o?y%dxh*WGV89^N_#(r+AeXvNb@O|p*5Oopiw$9EoEQWh*FUb3uz z*xI@Z)Ew;vs^8llF-sYJr_J$iefi%XwYl>JsJ5SZ%w&5XE)A4CZha}5P&jEKGE{VI zk+*_6)!!yhTAkUThVzyzI|go|Ew%lL$A;urU8|q6a<_Wfo=UIp*edo$I@YOqVP1A%88JzRF6`TyJz{#K-T;Vj+M`nNc_l7ea$Ot~B&|1jMl(99|u(p9EQ<(4wB0+}} zpCiXOh=3a0@}~8q-&@8fmP{GjxpZ8Ro@zawL%a%pO+J}HA763u9n1gG+ZppPOO`}3h7ZEk_T8X_8_?Ret8+oc z@Bfi0CF9#3OyAKZRgsx7-;pX=GBc+N&nB+ioy#W#dmx*Ppsf6C`P!gx%1rh>MH7~? zM5^{>>%EsEpZa>%!zR_9pIfWrL8*`#H=}$K&iG4re^605zN~b{B<<43pv5LLsWyIQ zQ+9IU#A5lVb#P6Z*FZJUWP=H`0xkg_0yVYgdt6&#-CtH|*zPOKUwlppD-&}D0p0#5 z&jpxe#b*~!A)y^yJ#FrB&NtTZCmxGHX=YOCq~dePf9JO*&=yd7pGmp|oc*282bW;~ z_CE8x?`;~MSw6OOayAt_oj&={R^jEFEZea31&4Mx`2v`mWBxpT76Y!&5yY$V{XrSr zJsZvSj00s1*Mges7lG1NKB&%2_vt66V_iE`^oL2*PkuB}Ql5A6*bY<|5C6%exE@ri zs7M+LuJrNedb}7^{;|cyQ@IlhipzC`D-SyQ^p?K9LavS|p1!ARUd4FSpzYdlP(2Ay zw`98cck97G;-$7@{;;0)0o6uPsU!%3tH`JHf!l2Sdy!undk3zb5Bf8vWv_BT5O*8y z-M~ZO-)xTs9kua(j)2bbH-kFNob9my)UmFU$A+NxiQoAO*MQpO913d9%j}P57M6|I zD0QqCcO7d9N|1)2hUTW5?Ci5W5obuazTBGLa#-IZ2e8!0evbep|DmAzdBH=5gBrwL zeEEdpNt4bj4_<&Py{wqc3QPBd^jY1yB=2nh} z8pjmSYlJeV=upZd-HY;e8w2NvgV; zyeB>P@IDo-D5PPWQrfvl?)!-5R=BiG`zd@jTfpqPLipwXJXp8wr%eWh@&q3nbRjwh>j10>?-Ve%lZ}He-pY)mC z_w88)Rl9$lZJo;9*V?(*$ItXQxRoh1W6GuJXS+8)@Y2>crqd=*mC!-MHkONhPTAPv zX~FrVYmla=W2w_C-fCw$cnjGj+KTpZXE|f{H(jhgz-l|_K(m~uK$Tw8!Eg~=UAPgH zs;hi@D^NOoobno|J3v|FT#x5id`0DH1hk#miwb3m!)aI*eGXRz14)+!913bqwgr_B zXYCfE9JunAloytj70wKPr<`^Yi@R8S{X@*IHW9Bm`2i?fe$wS*VO~f;J-8K=)~^E9 zz=fa+oCB)B7*G`t0o9XUpz_T;%*^{BxO!R-l%QMah;Tiq`dA9qfKi$L1wd`qvUJa_AMd>4Z zwyNlpYvR6glo|Ik9F~-N5xLauFORTpwFV__qPKPX_g;qRyBzBYKzF41yFvVYTsBd! z)aDJPYvq5kl+ZVv(c>=^)PRmn=N!?zq8*)+wsrxf^&jc9_;T!3qjC6A7JnxwyS&H8 zR}OGrS;9!F7em+Rtojpt&GzLT+{JPPMDSoA|_~6lTcS-*bcyHndgFV5fU=Q%))8j!m zaG}Q;;9>Bi!LDF4kDr}pi}odxO_MFB*nmHzcs6#GrxWM`9ts`|W_f()RO9!8orymW z>;x8o>PZLiAaEOk3Qr#ycUL2Cd48YAO5c%_JSIGTG%6lc=-KQe1cdWEjsvxu=<9J$ zk6TW$_*X&gGVbpM=NEYF4eChowoner z7k}`8?W?NNbNaLjr(I$uwle)tpXL=^FSGfzr^oG=+PwM-l*f6)hWw)GwtEDP1P$`*$SXH3d#`ptba-kc$(z|q_x@CT88QL zOiM$F$J0U0s1fNceVfOs(_z2yv8wc0{aRJ5y~!r$bD(^YPRE_QcMI<_$IOkmzadXIIkH8?qT5X!lkT)$oaXTaP*V4~%Vfx0 zk&Z1sdr~O__7-(&A)G#?WL!z{*r0g6@p^Zgx_*O83*6YV>kERniPr-83aI!=3!DS0 zsCmE)%0Af1ETAIwBy;JzKU&v#&Zi;a)UuND$!ujam%W+G+`nIDXPysao(CMxCAVDq z-*317a+@vB_kVkx?H@c;-iW{&vaXMqhB6N>GS4CQB3?7%;K$5yH3BQNIBb5@=G3d8 zJk=slbMPOaJYpjXN)uNr@8c_xLHRQm8$;seA(~K+7T;`-MX%U^oe0v6u9d&vXuE;Q zh2u*&b4{Dt`K;;1(~E-_R$2UGp!zqp^Q4l=Tz=G~e;v>vc1^m?(H&Z>d(HaX^8#z^ zB)A$oHeGmh^TGiz*+}N_R{gqZG;?@cztFC1GZ){rCqsV`UOJ^%uUG{O*I3t|KvHQw zRb!GZN`G*4tDd{PY2!BFZENj7P}`&Z-Z3X1g5ukVmx7vuQvdboLkBjm81|l(>J7?M z&wbyPfJ~`IA6T1hNmngo;+E5`C!Y(HqPrn2{@E|s$lyk*3dVg8kkGPvZLgBGwa!K z2{;baJjrw{)1h9(?{!lQ z*2{7|{T7tQJ^^KcH`LE^nkg?Wnkb_^B$?%W+y0=2CiAH2%GT3YUgo?d1iY3kmeOFnpm5sP>V+QNZ+?#h?n^sv#a$vbL{;JuG%J# zWpSdF4d_Om^sOAr_Y^44dqvYMH|mLISuXuP;+5}3xE9JKAXZjUIl<})<}m6in7O&% zV|Np*0jP!IQyiJhaLyhk=((TSa4NNU$ zvK$@+N23Xyn~K_+$}?wx%qt9sk*=Y*yIodLp_#rf5n9ZK?`LC{1D8rO8~y+727mgL z3B_gXP5egxf9&(Sw6~!_&~bl}^gnIIR&C5PG_L=6%t>11war3aB?J@;TOalK}=Ru zvk%SeyCDb$)zNX#flw!CausZ-O5br#;*hA{_pvbfm31ULowGQV90ODCC}(87L!!!b zER6C_kM#}L`uM=f-sWqQAuC<8JQXXA!ZTuh6Sot2NIHK>ZtT-&4iRDDH&z#A7NrvR z!1|;c-Jcu#GRiBA^^JG>Hkwd;8#!}^Jtdgei`0VTc& z)0kwrQ3yBrw5XtMtVa^25wf%yFb%k|M>1(v>32}wer2VrHm1VfKLo)L$28CptgjVh zXy1jo(McDqO~v=!9L*g^2gYyClrMNR6`LQ0GMZAC5 zBMIw9TD^46eW}ED*cnm&Me$zQzXZW4s>y}=`8t1PtW1Z19_zQ#@UBPbxefCPR+90Z7~o?c-#ReHi6Up~uaCr#59s7c596@?ayP zMstvY&=l8pywM-g;8L{rbu_1x5LuwJCq zlhwp#MysY${H;IDG_hk$v+?$5@L3GSr0u*@pPsiNH@uC|krax_V}zf=WO!8ZO)6`@ zAQlZNi}g;74S4@DUHwpQcpV{YBj@f^;!W7pD8Dq88}{d6o%|5$Wm;VWvyO+K6FiOt z=G*2}*fkz=lc1?aAvP__n-=RETN%v(!bDaqW7(KwF03cz_DI)kb~&e$4g;F*ofTiw%gvvzhQqi0m0PIvbf9B#?sKiKyVic#mw@h;;tK+{Dv_j!ieZl^pdf zM@&*Dt6-;)zt)K*{v_tubpD#$@U;3dH?rtySt_v*HrOfTM?&g%EXo;&Q%w5$qMXK< z9IQ8KP0|GmQ?X~FyqR?2S0d%h>PH3pQy`3)n~4g_5wSrmI3wL?ac-hv!&q>dLSYFZ zHQ-IE8amKrX|{{{G9rZ2TbvtvCz^8}Ivd`Y zQH>h?gE>Ixh^YF!SZ;jJCeh&8T0NS?oNtIZ3tt110hqlUuqy&PCUd+DCOI(frKxbA zoE>xHP0=!=_DR!7x`w_IEZ+=8dthOob16M!#^1-@-GYtlDwM=ABLGA@)&=>@+FAd3dHiFyi2i$EBBHC zgBoNdxYeo%qaG3Wh$;0739TxM62fF zK)#Q{%UNjJw2lT}j>Vqb+H8u!yfqbjI$A|yR?sGve)XQ-;ea+a|D2Z$uZ5)~K~(cz zjM}cC|Ic@DQ|!CkL>s=3b3{6SX>M#(G-nS*u%f!^+a7KX!~{MKRx5sDDGV?BU2Yif?rlQqO$>lBki@@5Xsjwz z)rnLJ#n@QQBWM-Xe47f_!!%udmkN8tg7LL9u^wvG4d|J1Kk`u5M5}JV9^W8RE-n$} zm?X9r$%om(k#mxznQx|e_#J6wPBt0Ysky$}+WjR~!t$c(8(0FuUeW5Ca7bf& zA!Ag16AtNFg2%bk#IC)Wp)MGnPEgj&HW0URH%v|@JIX0yQG*p)iDUa{fU2*co@E42 zv|#JL8V)s>IE&!v7F<&o+ooSED7DzD2~tdXzpRTr;mF!z%Lq<(qJ~}jo4ZQ5O?w$^ zyp{Z*F4*rVx^6u?Yd|b0w+vqpJjP->9_@sq>*09>)k(G!$I&g=@lpP7teFF2!AY)Q zco#t#nl-r%M$e_TImguY@k4^H@?P14VnKQvbGSlfsNZsDH= zQyO#c<5c)0OeV_G_Zw$O*wL_T=R2-EF6Q>+w!l9JQx|Q*G(H|RxoymegtSU=_*$F_ zAAtFmF|~LB#_DRX*_w(CiSicG#ixnXNe8Fi1uxNQn2j477<^J0OrC~q04J75qP#_v z*h-|PBqhdim>q6juy!99E+} z8L0Xr{2WYK-RU#D3nnkcTJ&8id>k%KpdbPQCc-#m-h*4F7X$+G#83ndP zt1@XCp?LF?qQOg;t!JFXdKu*}!DR0ss9Dc?@jV9wnDZ9t0(?Nnk(s>~g%kImj7Lb% zV@Gz>DYgyA6{GH%Fzv`t*TPizv}d+p{{)lsWca9W|4~+soa{D7!_IIAn(%3Ya@w3y z7N!z+j>ZSLZD{>dYqN|e=zNvhj6D|REn^)%`7~L8P93)sl4Z~kz5d=a+#KWC<8%{{ z6A|aSGT5Mquhis*PZI2=LQ%nN1}S!iX_rmG;#9on8PVWJm?9O#s(aMTmh}mkPK?;` z`c(1<&)ltqyVGc2Xk%g9mt+xC16G&eCSu%?)9G%V&(2_@$(CbGTTVaW2$(a3D2H8A zHf(g%=sgaCgofF1_sSxM#LlC8jb)*8!L0JJv8dr*9Lk0l$AU{N`2&JyTX6ZfSTM_i zsqry?rcB&T&>xqxCg7qh!>I&^xnQ`2pql{h2+^yArOVB|+XuA{L zOzV-SQ=rc6y9MuA*chFglkFy2-F0f3L5w^pcF*O?a+s9n?s~%Rll=b9jqVjNotK?Y z2v_*Dq)Y2R*{|xZy_;b})7AInhF=rXA+dqfo)|QRTyC3sCm{`&7xzP`#5JR8Tk73n zRIoSG6m}SCj1_162&RHKv}LLA4VaA4uE<7DwGAYVvG=_fCIwknzJ|%Tn5=74VcWB6 z*_u>18Yb(EM_irvNW#=jy!-taIBX1zeFyCwTb9{haIKZN8g@v!`q5rV0^`UOi>ey1 z8kIAF+^l+x5IY7=j^Q-h9dWp2dKSXeg!3GUG^|_HXhy78l8_&Hwkd~Bho!4IByS+( z&Z1#-w(Ta(f9A}v?%V7;6*kvNk#i(!gJ~MOYqBtPj&(RIsydhncox)cW!)rx4c4Em zcA9ED(@oo{h(lV!!jOYm6mhaxY9OHOJj}cE+4B{lo}Zf7`#!C+KE@JWlupOk%L2vHd&f zd{{bvMQ&m$A&%R4ujPbf2Hx&|hRWP+m-cQ&W*BQKaqpG3XEfh?J4~{|Ze_Czlg6A? zB)VM?;|@|c6Eg@&uXG&0`=VI7`j*^q-Gv$7&wXFwpnpiPdC%mA{~)CNI5{R?4NSvt z!`c2K8$ff_)5X$_?#oSlL};W76<&-}apv^~A=fRpz54W$Sa5LED30T8d}-~nz>?7i zcCZsqRyfJ0aYMJYM-t-ZfV)#!0~_s3xYK1aLYZ(SA#*o?MvjNiK}? z-sYV7Vl)Q`e`fR;&SPdIpTf>3Z z(m_|lJ%n`V#37C2FxKR{STHF)Z)0wFE+H8T`Zn2-EIUi#Zoo}{2+9Q_nFk3Ll9D5+j`-ChTh?ExH z(8gQc60QD(4anGA%p2I&`9_$oBXaZzBi!%S%qZwKYzj=3;+?qvS^%@vORCxgQ$I{O zS$%JdMX&C|9^tavaEj5q#_THy4RGVs;C6GAwz>?0X%1pJc#rd7UCqlaC+Mnlo0rCS zSRw5AH^va=o&-6Am<`hmujlSL7G-j}a^JwbCb(d2bEmPooxsV&I2T|}d|oXrNYV^U zI%kX@N+p}$Wp1}_SAG&Pok-7)YK|Z`OjY4pIG{WR)7}(~6f){C8C~G^f{Bjv$?EQw zPA6mwubkmJm|SDrq&etr^SEYXlVG;C%N`bc=Cghem8f>Bbie|$1~aQMFgbk9+f;Zx z%xNU5nT60W=`NvzbF%F{CT3k1#}T7O(fcE~ng!5WD-1XL?2O&U9?5&H72D372~#Vv zsOBzq2e7W`M$hEN-j4FVi&ey1+!w9>F4ia6a-j`t)aH$(J3=N$5~CJsMTq?~n)5y8 z`xXh#k4HII#CpUQMGZD$zJ-g-b;jMKXXid=BYB%G&M1y$HFjbYZX)spB1cLj=k52t zUoMa3F*Yn(MRM%cDExt3-xKfbI;t5>_e~6tQ-ur+VoO_56n;YeA=6vw-Lu}I0 zjku@$jgY2I3wL{T!BWfIB3-b8s}7i7t#Mx6mwDs2Yqx1oCq=lBkX4~VzdalaM!5>b zPJF~RlvKzgjGJL{(XO#XlSg$Go4*x#EK!ayBy1=Ru{0-Q5=O1(>YVrg!)g)EbjKJ)f|W*4Q+dPO2vB z6EK~GEv?Oy{uJvr%;R8voJW{X$Sql>lpmpN6+X_5AMsQ)_-96W)>F2in10v7Z0+Ka zQrP}!??PSS*u*IB7lv^uv9fu3$;tL>n5@w@R;`!Ysn>)$5vDcHvE-dFP2xHa@h&m0 z@9s7sXN6go+w6qHVKP=-iloA;U|MHv)~$k>A~Ygxp0SzD5`Q)B0H%9wlVC9{x0Zbc zQ+s}5w^(T%@$@*TmR8fmqp;B~Z^3=cC0wCFvshivheVj_PeT6ZPs>e`0A&mr9^I$4* zBaBD)Y);-)hx^XBI!dc47C zx#yW_LQc(Ysd*me8j1?a7_IG46}S0u)EeuL9Rn_gsXsKdJr%xMo5t*oH>!ySH;DHM zr_^NR)>dJmn0th`fsp1bntYMVvp21#T3sa0AZD-*58*;W(gUrqh4~Yv(Sflp4tc9K zjbqyNFwGJ(@z-IR*=#N6(UIia8DXWeV_`}(=W-d$W)Q=aZ1#>-S}ROgK#X$JD2KOe zVQw*Yo0V#q4UBeQ;k%a8-1bp0H-u5mNX(@+O~&vt%r7yBUjMz?QMxCU90F5&PJ*c4 z(zr`kD=y}mpTcZ%bhka%&pxyH`Q)MR+x)MS{z_uhl3V1HufuBVb{AC14=e^lo1aPy zh4pghm&>BOrt!XsY9e|#YfgNaQIj$r3F~1Z%p@qqv*%&cy#nSZ7aG}Xtu6LJRPzTq zfN9tIOCwYqrnG&lWVpjs|kWJZw zyHm+0U~iV8|jnFCXa-z6;h2+)l^37D-+k2>xrHr#gbI=9+)&{qq1^4 zZ-CXhKDxW|-{|biwmF%oL_|zwI{}rj6Wc zFcqdc-JV^KPTI!%hJO$#`*K%3;St~MD8wZ&soT8JN|Y*PJ7C}OziQ*2JXpR^UY=l_MC1A%vq`1rd|#+W8zUtSOe2a!Xo=Im*-pTq{Tyb z-KBSi+Tl}nHyx%X@c*3|WSBN5=7O64i>c?P)~STF`kHSG?}Pda5QcXvOp>q-+C&vw zYkdjJbPXU(CHcOsrb6cE5mG*VOLb zznT(Q$=_o+gvkqFx!gT)an%JYc#KF{Syq%2WBk5_deuCX%4+*tEPeSiy~7iJvwGMp zF6xmD>EyPrO9|;=SBt1>CgS~`IZ<3`ATlw&Jm_MbEbHpE+G1Vl!8CJLD zeh=o(@$Ml^*0xMJb?yY1Jd4e%>tTLg@tVK}Sl#Jn!k>2k#9*M*=|McWh;sGQIX|Vs zUtt%BMKvAc?7?I4U`8F?0xhkhXT;;dMH7zFzWWliA!L-X{DDpRuVKHz`ic*S1)e2zP3DE10C#~={iDg ziH&l8Vv^L4J3rUdy_;JEv#G3w@U9GVRfL~I-7GP>dy;P=ZCiB7wtEw?zFM@X`94aSDQ zV)Ik6KciIx8H|2=Sknv!&v)j*dPey_^OD3%1bLfrQEr&s+`7advUeQ-bDD8GluDS6 zS#GxxJ^@n;0k2e}C(rx<9KNS1kp<@?90^RGmop^i%e!G(>lhpa{WnZn`W5}rqlx@+gw2Vkeb*jnSfa$B0=a9gmR`-#2c?u8s@YGE3toW?f7{I-nMHg|7h zEKj({IWVon_O3;ZXS|{E6UMMlMgbb((_uE=EP&y)FxxB2$X3B5XDq7H3J!Bdq!to` z_Jx^AUq-NYK7^~4;DpSz@$x7 z@k%QE2xi)p*V|`5Gd$jS=h5ycn3*VPu_&5zLcDKsTYH;JwPvKRGMq@yKRCeD;Wj2= z-ve!#uzl7GFm5cK$xZy}Livw!EpQOFktP&Y5~|&7C04^+-Y~nPNn>^NhjAIi6U!?J zji3kC(igQ%c63B1b4XU^64+=xh+5U7nR9V?AVe5MxVsn;} zTaXGT!eqoa0v6l*VHyE?^HYx`#MR;kr}v??Q;VUx7-rTkCACPT7$H&cz%Xtc5-9wvQ^ z`Gu!oc2!>R2CsSw}8*-R@Aa(blZkW6iIqB#@J*=F2V>Fxsvou;rybi;@mggo8 z>4|dO@ZU*Dtvc@-KjesLa1oN7dxZD7?ydMF%&pW>RT{4b)A*r-&8cL5?%%8~ktU{3 z)aWg)NeNlq3|VrYUN(Sr_IWBXX5|{vWiZpGduZA_Gcya`?vbn|>f)s^O?~rNPyL1c z02?OZ?5jF`yx{KH+PN_I=6?7rA!pZaN%llH>+rsD-6teU`)cy)8Tey_%8;ryH zt0ujRKZlSr8h1!p50eEmlsuXmdXy=vPJN4ral_)g`j;@BYU@QgXRsxEWhm%lbIM?$$mtYZGi# zI)80$SbAJ$7^F|zxj#Gg>^|5ziBJl@TCbSPverC5EqVB`zU!YgE0IH;^a9gJ~w>^#pIWV7HQZ@J|cALhu?3 zo^ob9m}|i=>Vi`y#)Hc&_9ue=y~6V*x!^2bADGN>+R_&jw6Cfq4xfUssnHLpS#ycbim&O^Ed9&iViPZ$px2gtBtqs0Z7aVX_JUGuXtR(2)W;~)S z9-L#bO9}ed9SW2$S zc)s43cLi5y?JkPuUV)#Uz_)DTeOr8dQ9L+ZHqIx;fAtjL^J>&)Uc5tmL55TUJ)LBiT&hSc2v`!rJ)kqk9zQA3scE8FwJ7;0j|3$J}7K|sr`go z6Soj7xyP`^4lFEEy!gkD^ud~&+Njm4N9#MD$EBp;aX&>eeWQh-8+%YUZ zELwR(d{BJgpDy&BVxj0(U2W^-M20o)~A+nV4`1G1{kbb-?DT{%y9o z^6PINR68fTpSuvIO`K1B*C%o=*IUQ8+XjqH)>Euqp4q;3C9FRMZ5fZ>q1o;(E5{Pl zD09~3oN*mYgTQ%~HFPyh>lTH$9f{v*o8hDra~5m>X?BCR!ZTj~U6xA5?=nlM{U%Fd z1TiCBgNX+SrlNWJf;ORUZqM6dK8ES8DrXSVA-$n{gZBZ&!`#z>#O`;?W}Vcd2udsQ zYYVU~h=jHsMdAzSAZx4Bg1EozNX{UrorU|&0rznAYhq3z#x4sI{qJFpTS*<3>_+4BJ}k#o&euqkyC zZHJywM^9hEwnfxEQvL?!FVEXOXcLBx+)KA$vUlIDx9Sr0BNSa8`pbsw2B>zHKJyPy zjjwAW%v<`G_V0u4u$ODL>@TV1&>d=8^;g>JVLM1zJBbURc1fJ5A?UAG`#)lK;B|93 z)H+gd3W|g2sASvN&W~Daet1rJjO~n*TLbV4YzINRKJMFgqw`N#S#8#OPuP~+Hl$Nv z=hUWcfN79@8}~oCV;90EPyNMuCPRJZEeH$SVdQe2{)=wLL&v#h5}B{Sg%=W|XDO@-w{rFKjA_x> z`7l*x>`9oG?a*CwhAZ9aoFmXAg@|_#;KFA;V~J~rc|B{+4_}RE?+H`4>pc5xVl)G- zg*RY2ju;D{v(DibxB)v^EUI3{H3cEH$8{m!cxe25#+A@QcsxuF0QHn`oVx|8+2p2L zVxzJ~^QQ9N)C;!6n0XY#4snHYWI8bCo1%iVm;&!XwOwMb(VN5%hBrPti`9iY)#wBbR$gu zmGkudC>EyYBQ)@4D$)EE()3I!Sx%^SKj)Uir-=Eh(zg?1YL@THTa`IG>8|Pmm=<4K zgQ{W5$->F0xBhB0wcuFy=k*M$9?1QbeKA6%B+IPD%nzOOvT=e!c}Y% zi{ADfjS5C$?l5^9dvrJO9Xrsl<~^8-EsMg{6lnUcZ4}s>@paW9FwMUps?uAzFF>_% zWAbpj5*rPwE1(h>Uxe`;@L^^G@#K+nR9-c$FC_9@vUm~OuZ_ExjXk{&DqqaJVm5^9%++Aa zOx)vOI`8o%y|qffo;BU_%FH73@>`ttiYxSo$Ko?Rnfv@e0lf>8y}M(=~k z7h@vBxmj!Q3EE3nFUd`eB9!O8q%@z9-pJuniCdw)KDF~$V0UaVousIY>9E{0FHhU` zw(K)yY3Y2JoSf~bSHfhd+`; zxxhhq(gvGyCjP}REdh)Y{^wO#Cm0q4`x&OG?pWgRudpuLtDZ%WhV=r$%LJ8&apjHD z#Md^}u^m9NJkMeY(=7A8{%WYJ*ml)#L*)lqomcP@lv##z^vQgfTTSJS+?nQD zVx(+(&r{7eV46luW;P%D{M(vw&t}3?VLm6WDDr7ug!gI_G1&yKr)0iGbQD1?e_jVO zptiR{LCNJXHCMNaZ6`*CoE_C%KtF#rH8--3O@g{bE6T~@@Cs8mlkU~8_hC-+mbLXS zW)aPzs*jnt2Hod;RL4Ew~>U`Wz-_frNVX?6=IY$lPYbWLV7k?|HKjrc)7b z+@OJ$zt_Iw5JMW61UJX`08G0XUPR?LyZ(gf)Wbt=e?xJq(Ox1!L;yz0h$`o3>%&c$WLFVcebj%3$V&-Mg|+L)D7UyJuFG9T3tv z-}lIdOt^MlR<9(1v32$L&&~=a)zJr_J4}dwLEUoT`r1E{WoKKr-M$hgx#LmQ*%%zZ zAgVs?;nw%C3Mxe)CzJjcm}&VZux~U)Ktl~$K@_xd&o*~W*UIrBML#@`VJ7gRMbql|KyDhvNCNmA9 zf~MHhYmKtp8`Jd~(_x~~CuZLrCi7$$$U}~D7_X1rpBvs!$gQjTiNNslTBhyHe*Dm@ zm*M+VY)q8*D}pU0Qu^{^nBYfWQ;9bGvaJ7}=5T`QgR3W51(SW$7L3(Id4Hmo8~I^W zjXl{gsxM%&Wf*791NdE8>BvMm6Q&B;x9dBYF!c||wkQ=pY|m)*cJA;eUmIri4e#K0 zYNaoJj)D2H7AD2ptZvi7y9d|3Q(+@q8rGFq2Ak$yc<9hF%UxEO2djdOaqm%VB~%vW zpUCNWFQz;tu@YV|tcIQAN*=wp^}t%20~_OV$rFAD%WZ#I!m#R_V3NYM z7H)ybDRBT@fdkvuMvi{6DR=~SIBAVtxo=_mkr~cj)N)v>9q0ONn8w(a{8cb%(iWOM zTW7f~BMumEeI`sgw?p~^Fq`DE{%>K@a#mCoB1;<^Ys#?!yc(uSY!|Mt!rX%D^tv53 zmNavg$?0uP7`L|Y)siG!Mnf0%MeueeIKJU|V|9W*McN6q6@^Xs6IZ&*6 zX)3lNnxnzb?%O28|8IiWOg6{vcz_E;s9{axcD(x5V42g)XH^6@u=`Un-g-N)bI@lHkZ z*%2l9d>=1V!*_cwRQf$&g&JH)Kxq%?&)-n*Vm#vGcZN!OfLs$ja0KO59%XQ=WsNf(~y^9fbo>^~yo|KBpGqAV&e^3o{0j0{W9uEgKRJ}a!3#!2ZpadT1 zqBzXVh}mx2|_IER4na*y+ThATk{aGmE7C;@H+)zEF8-|5ru0#(o5K7FB2 zzu%`n;L{)U@yqHl{u@?eR-f=AC{=F*^%1HeNh8bx)x(76Nl+cw#pA9%y(uUGnt>8vPf+Fe z^0+Uka&0SoM0-#bckuim&pUZM7*vH_JUw4oc=;Ape4+_@f4n0ULtDK$Ra3 zN`s?(dd2AkRInIq43>k+IL*h;0@cuLP!(R_`9&Tt_3@X3YUny2e}j*|1>|2apFi4~ zJ_xG4N5KO$|39`sP!F-xPzVwg>A6t+DUVNss&|Fw&v^bU=KK^h}AEAuuNY8gf<>QYE{rp#idOFA_2qnN^Pz8o~9O^M2)JLd% z$9XPP{^LOz=?G9gKLu32(LR2R=VL1fNL!P9#1v2!lzN;Bs)A`g{cO)?f%*uQ|6I>^ zM9rcLeY{ZhT;lUz3aZ_Tt9-=O9;-lQycX0)s0Oa{@i+STouPVovrpdwtmi^!;k7lW$!0bfw4^rfEfh|2dc@hbO-PZ!F@9tYLqm7vPM0LEnhFA~s4 zsDdwfeA(kGpekPN`KzEReBH;d0rlAt74?CS7pnYPQ1!3#{9{ljhu|}x@HwcDP#M4Q zd}k;DzVhk99QZH3+^;@fsC<9;_-!8l^y$J1oiiHYFV$dUk4@x1`RoieOLik&)2_A8 z-v*QbT|ud~yN^$S`s@sqFSh~uSHr!?C`tSJ0z$?21EsqD9tVKC!cPG85vtrtpeh{Y z@pO+xK7Aah`o@F$2*oEfK>zB|WS<~Z!W7SiYTzu-g=%OzC}W!K(<^=Yj;M0~AYL7~ z*yo=IO8eJ&ertu#a671m@9=mh$iHAQf7H;!9-ju4Z#gKzp93`%uY+o6jmI}ZeRf3E z^P!K=;Nc3W;5whMGgMDLAzclBs(jJB9$C!~BoM5JD)|ea{H2ol2qo7R#YgY-$m-xc z?N2`2&mMpA_^Zd?KuPllsE<&sZUf~{v)E#YXM@UDPg{<^p~j~H@lsC{pAOne)6^H- z&Epf2Kk6QkAr=@P!$aYrMdziFI2_DK=o)8 z$omID+NbY`8u8nRm%w*|s&781^6l^Tfd$~+L_7y7t)A};)vZ5#zHL4qXuj!BA0bpl+d-LPg3e0( zq&n?UR@>Bbq4GELTqr@CdoGlo_x9KZRQ|R;z3nbojGSFpA0bqMl*eA6G||VW3spg1 z&v!(X8{p%2M0Ma8;?<#ipI(c*5g~~SKvg^pY!p@Z%4%Myc8h%USdYb^K0;+5=W)D` z7fRDpL2c@0gQ};(rwhd|0Ao>pZyqa%ULp!!>hUsApB+)@bBNc#SNU|Ix_zDJ{~J_& z(JtB?SilKzJrzly8$s=4?(h{06@QoKLRB!|bD`9DFQ|MALFxT|Q28DJ_4%L3mwu$M z$9%yje8H!E!R5Z-j;My7C0_WV&-aqYm%*&)kv>^n+{}6tDtX@a$?t%&^-n<+{{qx! zN0frUCtm&E>eGcX{B5B6rNLFdVjASXq3TWOf1s;|>-!8sRoK`UY~tgE8o}Ls{O%t2 z@aa3E8f@<4{~Idbo{hXO-jf0nq@}NTFJFOB@%w-+!0w;~$@S?%Rn*J#9Z?$SOT2n| z6evE>=Rd~hKc<3!8p!hzLS-E4T}bSAx5NZ-dJJo{wJ(s>2_Fe2#Si z680 zo_;1>-Q4E$3FA?5|EvztdHu6?b&ox=bg95cs5-Mf-x(@B;nV*cs?CPvlMK6pQh7U2 zJ#G(bv)#S1yVP?5vrZE9$pzI=FVBT?BS(W$!XR*$sQpn{$2tEx0jhe>^vRP!eS~rc z=Xky|RJmC`eMeL?vxyg0`gEbhx&TzvRgHNgK^0W_3_C*=xQ2A)`=`$*RK=0!Lgl+2 ztRLkMV5=!Q-)FnWXA{ce7Ww!GeEg0my+7>J9|Kj-;~t*?CB{>pKMm?5bf)jqpKI*b z4FWFVB~bFN0`(E9;?wLbCKso#`eSVrj==@I@ zbsoqLFe}O*=+6uXkXxk>^mq^`F*|wQ8PsQIsCjz?>C#JYpTCdK|KCvU^=;yJfc<>I zBYi=kGW7R&l#dsxp@E?EFxc~apDtAT@t|gO5vYz7g9n3YP~{>}Gymo$45S*mg$UuT z9&ZCx@D9)K1oaWhgzxqE0H}(Vfok|sk57QA?@7;>gZc=SZzU)}UeN7;B3=g7;3}U` z4eBFQ#u|_B_;{h>KLFLxhaT7ZbfMzcfvWdoQ0=Vu{BzGMHV{xn-};D+pbBpCe2d2) zJ^t+RH&CVO0}Ip>JD-}KN3_! zd7zAK1Spk{0`(E9fzv^4l1hC1&QO9)B3%Mcapn5*{~q=c(|p05p&Fb?x+*x&V+EKU z-IB*#ibu-<=M?7=tLm=;)vc>RncfOeAEDx(0afb@pu~R#RQF#8)k+Phd~bsK2o?N{ zKT7`+RQd)*8k$quAtICTKTsQp-zcbt|MV3IRpE9}4a8Xj#j`wSgNm;YO3+52K0az00qP@Efia*A@=TvT5mbXy!GYkT zpz=Kqs^X_WDf$^uihB{%N2q)+dtQg$DZSzogzCX6&xNY68dL*oJiZ00!goA>-{V>z z|B=T}K$ZX8^DjOB#^c5c0;+g3sD}R!d-onyRr&t?e&GpF(acQ9$m}F!RAvXr$m}F! zWOfqjOMT5usL0ez$Ox@0$jHj(1K01j zd-nJ~&$IW~|LwsXW3KC-ult(!oNFHMwP3;?q8i@o{)bODd;HVmUmpJ^YW|=@+hZ4^ z78pWQJKf#G-21rq^%&pJ3;l^|=m?@V@j#zG#_Nys>A^l7t!bN>6cz~e$KRUXF?_5M;0_0M0|0ovu`yt_+Qp!>Z3L9fsA`iBo~zZL`@26Rz;lBnNxdY!1@ z|4URmA9_3g%XrfNDS>*u)0K*rG{#T*)y|*z?21ZTC%%>IW z)|Wk|hC={d&iW8X5HBa{5W2<_#}PIBGqMhWbX@b_N>szQ`}7?|Eno^!gQDv1bf4}% zJ%@r8G?S=?vOVEmpPuE@vxyoMbs5a_X+_O9m#8iB7*Pv;+~X4-=M%L>ji__sIigl5 zXQ3y&=8|$@+yg1(1%2Q>{>_Emj0r> zJ}0o*6KaVX{u#A^uiXDr)B?78y`rYS_Gv|Jk?lmS*iNF3ojpY5{nqAV`1M(b{X{OI zfe`M~nxQ9AiD4dl5w${xcs!J-yZA9g4T_yD{|dS!ntiAyiKi3Q%o#*&z~S!a615>l z5!GxWQG0eQQR{sTQS*)S>3i-{T(HQ&2Lt?<&r{4%)I;XO}O)Qsgs zHTZ%1KciOYBX>nLxQeJ1S?m6Pj5+^E)SA_JL+goJz~^4Cs1^Fcrxmrp%|88~qUNvj zdPU8@)nh$T%gg!J;X9&+e?~1}hx>nus{fvPEvSL026uVBqW1k>_dh(gc)iD*fC_5p zPp|k-QS}F?*Fo4tS6PpGN8Nn-pHcb2xavcRn(pp-irPhe+NRn6D(GN4+$$o9dM8J> zCA3Ga+vz^7sCOLe)Bh=I{^8W?GIFu!{ioRW%O|5q(3&QC;y@xR%M&)0Q>z#}v z>K!I~o}yOZI-*we2BO-ziKx7ZL=B4i<;TD+4vK2{Hlh+UJl^hp2T{X6qZV){u9)fd zikiNMsP^u4S5&(>K26MN+o!o+k>?ePdIygXb^1NwuBZm)dwkO40wP~*1YRQQ7ZYi+l8CzfTuW42sYI>A4MYw9jNGvUQ$24wQOla?`PoEWE9Ve(_&!Qh`}5pQ8$k^h zdd1U3ZIoAtn&B;?21PaW9#JRua-tTrlBfJs=fzN!+*z|e}EEt zGpz;=A*z8xy3D#!;{n2s2MBdW{7(-O>f+IzZ-w{jk z|L22)x?XBppH4a+AY?J1Z@c?1R1BCumSjPi||4$w))GrPHFCQG#vuvvGc!02dL;UX^EY#ho;{n2s2M9YJ zAmm{jeU9sRfUx5M!Y=+ul%l@;_~(Ozx}<7azeeBj0Aa@igdGnMc054nkFe=MLR}U* z9w1~RbUZ*9&f{q6UUxh|*zo`%&)fa~^Z~-Zd;hI#-b10Koy$T?yZqkeydPRhYqQP| zx^~znAEs1Hf4Nh_im034PFwWM_v0(pe4FvF?N`6N?XRh?r{6yIs*kfW=k-5t6Ko83*2cjx~dO?^)R{*tw{0gAA)d_N!0rAU#K9;u(h+Pge3Hn;xa-cy_ zv>fPXje>&rfu#3={#N)tkWdM<3L-4A5@;5bRssX8MNs?!koo}-X(b;3$t!@c6~I7C zSpkH62viCNS?GsAxgg_1;8?2=q^$%ZR|3ad`br@DBcMhw*djgxssz~|0nt`1$Xo@) ztOABu)+!+CW1wCTW6>W2wSxSQfm5tbkh>a)UkwbkywyPLCqR>6n8kepGzf}50nV^S zLBSdzX$^3e6|Mmis(@BOoF!HP&4SV@V7RpiimQRtY9QW9s)6LSK-gMfgr%$nLe>G5 zf{_-w4k#C7tOG8v3PIYZK;);uMV9_45MBe+2u4{%4NxV>t^pFQT9COOh*=MewygC) z)CQnlkYv#tfLcNR24IZU335LJ;y(k%THa?s>_(tTaHYj<1R4ZI8-c5>QBd$Xkn}k) z&I&&V5;g&?f)q>K1T+guHv!jKi=g-mAoU9%)k?kqk~afkn}HiFWit@+B~U3CZ=qiT z<${bafeBV2NZSHLZUH7*`W7I(7N`+SvWQxsN|0R(q+7Khvkr)<18%jfIw0yRpk9z+ z(O&_zg8Z+5$yO)G-3r8S1*TZuRv`9kph+;z;=TqN1Vvv1)2&fZP!A;412e3!9!U5G zXcc5x;x|CEp!6GHrnLx)w*jf!fNU$-1|)wAgnbL-Sjx9R$abJoFxx`61LcB@?ZEw3 zAxQfUi2M$iW9i=k;X8mD!9y0Y1E>;Y?*Q_wT9ElY5c54S*Rs9`qILrHf_#hK3DgSm zcLMXQPLTTp5dQ=4xaIu-#Qq303Fceek3fT<=tp3IH3|wEfTRY%tgrz{XargXg_hU| zGz&@_foH5mQ2Y~+`V&xOB|mi;7xbJ3?IJvHDGD#xVughk`ZLMpKa-sCGs!Pm1rYSI z^=Tr!V(A16|Ap$BCaPbvh+lvzLG~{|iB$_ScLOoIfj2B`HxTtJP%kL8=wE?aLH@76 zBC8YR?g8TW0E;be4-oqs&?H!5alZi#f}-DmrPe4Y*b5}>1SzAVJUwAA^U+!!Ac9=50ncs_5-V|LXg%BL^cDf zExj2CZvkoqYb>G#s1jti0M%A4$ovzC`4d=YS$_gi2Y`A(jYS^-Y6bZRfDKkB$o&h5 z{|ne?d4B=1tw57tlf|_H4T7RpV6!y}3jXfW%P#x7%OycutnhCj;UF2Uf0I#Xi3fpZ zLFqwYtF-_Nio1p_NbNd0sD437S2jjaS2jiv)7va12ngu}R0_6RXeXdtkkJX)VHJY3 z&Ol^mV5g;b2Ew}lHG&^4q6<(Z$nF9(TD2gvD-hEa*kxH=fv9dky`agWy8*R={BFQ* zs}tk~1M$JY9?J^`Vncu?!Cs3C0U88FA;3Os6cmI4Nuj`gD+~n^x&y6(7EA07Gz&_* z0|%@{P}~DZ?E$n}Ne>{oClJ;XIA|$7fsinuQV?XJVL-VcBMj(l6@s*0Kx8kVtEKk> z!g~WXf?$j24O9uTdjp|XEyz3sh&cr4VOfU&QGI}VL6}AN0cr*LeSqFpC&)b%h(8qQ zV|j-Hv3-FiL0^mO3p5Cd`U3r|QBZIgkaQT(-wF={68ZtHf(T3O2Q&*x`vC*2MNoV= zka{=}X(fjP$^E@Mvqw?ApUZ!pW=bPu?I44JWT$kP!|XYZZdD z2p}>7INs7Dfbb)L8o^+TI0C2=WFG-UTeTo_01z_(7-CrifT$yZdO?gu9|_b7@{a^g zu{uF+BoH4747I#SAoeJrNifXfjshA4MMnW=Sfij|AdoZ=ILitL0trV0t%5j9JQ`>g zlpYNXw-!P1ARu)R5N{=efaGIIAt_ zKztN1*7Bl&*l3_haHYjX0}XQD5EP977FeU8;5;DdJix5*JRo5t&?+dj#F0R=pmZegjI{`g&j(V^ z2a2rZd?5J(AnXF*c}uwf2)Pib6fCsR3xRS$#)ZI3Rv}2c2#CB0c*W8$0>Uo_Y6P!Y z#Kl0BAp2sV#Ht0Eqkx!Ez#En|3W!Po>IJ11odDDd@)LkXRwu|!1mY8c#g>-{#9jh4 z36@ygB|w9q=n`P5H3|ww14*NSGAkSnBwPx#3Mwq|QlME-dMU8nS_H*OKxz_DX(dTO z@?}8SWxxtcxeN#y15^rDTId*{T#zvaSY;K0w9A3W%YoIFemM|67N`-dv52uil^}a8 zP;J$M%qxJHD}Z&Dbp;T0B~UM@vFIy-T0#Dmzy_-mMU^_&@3n&2W+(#L2)vWnhexiNivX}0)(Xi z+bkso2)P!h6l}N9Yk_h>#s}Q7J2Si>6?6majfbf3-HG&^4;$J|OAp2iHqg4ws zQ-K)ueRf$^DiC!&P%mh*=<9)6LH_l?ZmSdI-T=hk0PL~68-Un<15JXx7WZ$UK~VH> zV4pP#3dRFT`6eVRSPoHfS5F( zhh?P!QRzUvAk3oEfm%U+I?&td1i7~W@wWhdEbkT|_Ew-t(AVN_1sViJw*vjFQBZIj zkaQc+-wJO75;A~RL4+k{0L_BZ3}Aq@2#Rk9Qf~($t>ktfc`^_-85n3OlYx*sfJ(t2 z3%vs<7i8Q49BUPVv?)O36ySJEp8|wW1!@F?En+HACCHu%L|e5Wa~cpc4H#ls(}1Wu zfqFrVMc)b33i9s+PO&;c?sOo2Ixy7orUS8e0ZoEo7IzoWASk*EIKvtR1v7x88NgXq zI0Hz?1X=}gmY4}NXVT|-GqdZZ>VF7|v&cxzA|u{PvVi2ffv~%Q5tec{5Hb^}6pXac znLxQ9V1>S&x(MWj#jQLaj$s z4jJ|Ll96Q5IY6x-KL;3Nb%NYkK>RFVtmVxDVrK(Qf-5a&vfTa6? zaaMRAkZ?cHDoC-!`+;Ub>HWZU)*>i=07!iRNVSp&faEzq*c{*nOPK?NJP1?@##`uv zK)E2}L12Pa2+|$`A|C=KTKYpkcrH*Qm}C*TK$Rdn7f82iL1rEhlLy>tS$ROz!$7?t z!=fJsY6bZZ1Cy;zkUJNMp9@T}ytzQ^BS4d2n#DZ=Gzf|w0j67{pdcSe$_HjxVLp)X zD9|d%vcyM$WHCxFN&fH{`_1Q0$Ss1ZD55%Ym6LH2wg&#DEPPXaMd0&^|vNg!$gP%p^0=mkKn zAb$Zc&*}uZPXX~y0gqeWQ$VZ%O@jFrXF!9X$bbdbC@3fZk_rH`!U7XA;$8$A1Vt|bORZ5*@Dh;p5>RG^F98WJ1FeDzOMDq<7L>jW zEVmXx@hf!TuYZLOe5IAV0wljmM%b%ltgw_?~FwIK6#Am(*oon^faM7;sj3u-L-4WL$#{|2zZ>IAuO z0`YGG8!himAhr}}5^S=#QlLRlR0?diMnS<_K+;>l7At%UNLU243hFFz5zs6sT?A~k z7D4gbKat=Pyr-W0Q;@50!UZ}vif#mmru=jz3mhwIjQVCQFf-JNWC>LZ@0-dcwkoEx(`2otAHj! zUyEA>Gzf}T0sX8|Q1CI3^fA!i3O@!CRs*eq2uoZIGz&^s0|Tr@Q2Ysy`UwzeC7%Gv zYk;sdz(7k`1B6rom4ZPQS_PB~GOB=MtwNAi4MbK0$6I1*K+HN|h-IwIAtpKzt1_)beV8*!4h@V3@_N2O0!L z>wz<@QBbe}NZJ6LWrZ7ngwKFhL7XLi1~dywKLdtai=cQTkh&3ww~~!O^5;O<=fDU{ z`5Xw@1XKz}TIeRAT#&H|xWFm|XW}rqe$|5!cRf6ozK%!L(GQR|3 zz63^F)|Wuk7NA~`WYJrIT0#C6V2srXa%+M3T41c@)dI0~K$GA~i>m_~1Vweg)z&B| z_zFn+3K(aFUjYeQfmT6^C2j?p1*Kbo>#Rjk{56pJHIQm0UjxbYKv+F+gQe61A>RO% zg7Fsm4Nxw~_y(9@6@s*FK;$-HqNQ&G!oLM-1d}Y{TcApi{VkAg)q>3JK+JaFR?FHB zM12R;3oIAtvfcPE26wBKI#C{Jn38q=x_dtW7=zCzgH3|xL0!cf8 z8CJLxNcaJ06=YfB4?we^^ao(3wFruT1X6zlvaRGtAh`huYXEXAr2zpmY!LjI{`ge*;o~1B$HVHz0X05VjY1-ct4gA-@Baf`u0PJ5Vmj_#Jr3 zDg%195xiy*e*jg2>_31Ks}^ML2V(XEZ&=oTAgURt7nE9bGf*qY zZw3}woglXbh;IQFTV4wg`zO#OSYmO10u6$qKY^vzC@44pBpm?CtndJk@E6c3sIbJp zfM!AIU%+x}5frxqsjWbzm9zrMe*H~l~n)>(z=B$ zi0nr1V?la1HbxMWHB7Fth#;n`n6~U7pxUYhnVo=`PQW_L>I6h}2I>Vh7Tp=B736mY zHdvh?w+j&81=whLU4YoGK$BpT#dQT51Vvqe&DJO==msQp1GZRUHy|MxXcg31VldDw zC=CX-T8p4K1V{}5>a8RMNDc+ULV<0T5(Zy>%m zu*dRx1F?qyO@h4^cL>lRC^`h#XN`h_K0s0*V80di0TK=cS_LhZcqq^;C_NN7U@d~; zzCdbUpw&wH0?CH~VTS<+E#)vEq#sZz2(r+AK)E2JAJEw<1Zjr@k%t3aE&XsHygyJQ z2)2m+K$Rf7KM-owg3NFrCLHKtS>Zrb1W+#sv*-w*R*)Y7^tL)d?h!!z5kMcyI|7Iu z05l2uTHFAjK~OXR=x2?Bf+K;XBZ2-_cqEVz3A73#EHM&j7L@A19$+nk;-i4nqku>& zISNP~2!ss;23pEMAmnJEQZUFuj|R#G8Ak)hT7@8O5D+;CINs6+0pZ60HG;twaSTu; z$UX*$wrWA zVJ8A3EagNXWC&0x7-^wHfO0{`5a0r<5Tu<1M4kj(Wa%dX;W0psV3b9~09AtQ7$DKA z1(_!UF((6~E$d_;>J*?}kYv%P0JVbrQ-Cp6C&)b&h(8q=Yk8*vu|t6-!Ic&_6lf3> z4F#^YMnS=8K+0Mo5e zP!JC!#RD^}Fdj%a7ibk^S>m}sv!L``V5YSQibnvcBYM*`)7jFG_oRv}0`ABa33m}BYZ1K}3{HG+pM;sT&bkbMD=XVrqt3xSvmfw`7- zArN&DP%p^0=!<|_LH>Wmjm^J zQj5MEs1@X24lJ@dLGD-}ek`!q^2P$OR{%|dB^GxD&>$$f0$6H|f`Ti7q$`0kE4&g& zxC&?$R9NCwK(nCqDqy*_2#T);Qm+Oot>kJT`5GYX8eoN`TmyuR11be8Ep!}EF31=M ztg;G0T5`9Zc4Tt5OZDAHG7z3ZMolsqYb+uKs7m>-jB2X}g4WugYYFQtOW{-7s8D0k z*O6R%9dqYj$J`sN4hZ_phW?AN(ee~Nx9tj>EH0Jsg*~pY*%}qTw2{{nwpgJ;t?f~$ zv&0(+U)e&1t=6LOwT=BZq25XqzOkV3gl(3h@U1OY*lwXW627zX3OlSq;d|>dfw0rk z2^M~n-sl8Y^+$`iNpDn;eG|}V)q>24K+Hs7mt{=^qHYH21x*%xGf*qYzZuwVb%NYU zK>Q?NkL67QV$;}qKTl%&?zKMJz71()6s3`|&l=N!f^;A$9oTP$>8xL~?NMm4#9Ih| z+Cqf`)}rv2jlGr7Y9$0qzU{wu%|T1K4G78Tc9Y$tmJ zP6gtp0(~rRDiAvjXcF|bxM@IxplBM<&l&{wcLAw)0g+a67mz#y2%7;6w3Hb@NG4Dz7-XTDK)E0z6FAl?1Zi17WEOC|rDp-* zcLOzo!4`2hP$kH|8;G`QLFP;#W+pJivStEN_W<>R7>m9Ks1@Yj1Ds-Yg4}E%J{uTn zdD%ehy+D&-n8n=-Gzg0B12fQu~s0U&%1P$L*+ z5p#elLG~OV(W(WR4+1d{0;4VKK_KcOpk9z<(GLN&g8YYoF;*wY%?09ffw7jC3&iFD zO@b>eE)QrB6y*U|Tce=hVIb*YV4M{`3?$42S_LVVI2ULZl+FdNvlc<|BS7jSK&q8I z0wm`HVfnxfmXZ&IJPK3_##`v4K)E2}QDA~q2-4;Ok@J9wmOc*%e+;M*OtOf_fGR=u zV?er93o;)EVjc%>wXDa1s3(AWL54*?0n`fep8zIXogjBU5I-N7VtMm{*e8J|!8D6| z5@-+AZYX#n!a|@`P-uw@fo4JJLf{!|5fr}&q`n9gS;>n)@=HM2OThD%@)8j8 zGEga4XrV6y<${ctftRd8koF1?`3mrgrN07%zY5d{UbBc-fhs}vt3ZiW3o>5=VqOE@ zu&mdBsA8aAP-@Y|K&>FZ7+7R=g4_}yz64loc_l#X>p+uWiN(DRGzf}b2bNl+px_N4 z=?$RF3f}+{-UM0&6_)rW&@3o@6IgC7g5pvjwG^ndl2Rb~Eg(Ukua;)>y=1ph}Rv7^t>tLFPL^%saq3%X$Zh zS_0GyYAkvQP%Fq^0&K84LGHUi{JX$L%X=4yT?#Y_Hd)+Kpg~Zy6xeKyf`a#er1yX= zR`?!}PzJOL>MXGgXcm-~0b8v_P+ShAmIL)xQVt|n0AUrtHcP1hLY4uQg6$T%3@Bg5 zeOR|$^)v)&%gKmbPR344Uk-%757Y>Lw21eCDna)9K%-R)GAn_YN??~|RRU2T0QG_< zi~azp736;a?6x{V?g}7&1+d5RRsgXd0!@Ow7WX00ASn6}*k_G`f|WqhN?^Ygt^^W3 z0$K$vmiQ6SEGYd5IAAS;;#ENEDxlR$RsqQ$17RNn2QB4eAY?UADG0LA)j+u*V>Qs( zDgnT`m0+Abbr_BM7#LH9(ahdkqk3)q>0_Af^iFVOdo`R5eg92(##FpjMDy z4fM7;LGD^0el5_)^40>e>wqRfUyEA@Gzf~;0sX8|Q1B^`^eNEa3O@xBYJgTjgeBGh z&4SVzV1Tsw!osSq~&{0Kzr^11)6(5b_yNDHvp-p8@59jL(2$twNBt5s2If z9B=6xf$-0P8o^+T_#CJbWPc7sTeTo_6A-fr7-CtQfT%BkdO?gue*x4A^1lF1u{uHS zW*~kuFx2uk1F>HMO@d(-_a)FEDEbmO!x{wzTY#i3z*$zf1xTm`S_N^ISPL`@N^61P z)*>jb15)dNcq^#`lD`7Nz5+&A%2zwy}{lSiQho(O_5hWF*%rD7C>Lbx0q(a7LE3LXL`3rbsnXRJj~{3nq5Cs1T1e*(z|fUpC= z^OkY|2>A=B6fCsRzkqT<#$UioRv}1h1tMF4S1i312>%2YT43t@6XCR>q&?=~~#4bRyptK9H+*$<1U4hiDK&6#*1(Le~ zVcmcgmeLIf2?iLY|1FNh;kQM?&h5)NAJp>331!@FqEFu)B5@d%0)mAOY z><+|q2i93u_h7!mDBIXQ_?hAJXBBm^w_}43u?KntS81x>#XI@OtAW6*3Ad%6e9N@< zzpk;>l12sZ&^H?i!K3;e)7bWpX#b~-XUg&uf^Y5A_4?oWx4|~MN3gXueaNuj5PM;C z@J(IEweaV?RWVZ)Wp6(loEcPh`E$Xyb^6b*=LNMjaO8tD@Zkx;&C2T1W@Rs&8~kY} z)dpQuR+AdMt4rwZ$wB(t;j^Zet-LWfr&G|ZvXK*mmj?%JDQmqgcta%=)@4V|wuO zU4zz^h0P2u3+kM^A*gI%LGZ*bZL4?c?BI~DuYbdAWn&);?h#}O_XXb+w6(1CzTkO5 zVg26?(tqro)w?k$(6@~DzTy9RQ(f2m8WiZR4YExwmGyim_{grESp&=I5&U=?efUUl zLQvPwdUXnP*UZD(-gD?3QzzbeXZpmc_mm|)7TiCm>q$p+3iMVxFSX5d$P>Xw_6$oL z(nZsHpbZUEtH{UF8+Y;Ka;ce^H{myBbymS6K!h?42tHGCb3V*0< z{j0(6^a)$Fv3<7niZ=Vz;0x@ta^CsM&pQSBXxVK$bx^^Vo!Yk9n?xR`ZrhIkwYtwg z8^mgE9~pc~SfI93;0UUZAReW6*0yq8d;XLEyHWe}eKyR~J39q>wwc{=TyU4N+bV<8 zx`jS@khiXPSysO)_=ccC%}nbsXz1EG5b4Xmaq8q5(RzZ*B13>oqmB?7R)ZL(bIe$j*9=&N5yrU$a@3-}*?D-3dzu5_kLeJ%sL+A*4h6@*k_RZ0sFw(G+|IDZ7vi0u~G-~+B zP5&WQqlQ(Oj!69@KaCnzyXil~>OYQaSmUN8>wocTsCH9MpElwD=&l2`U?mM`$H1p< z`jhiVxz%9$>j?Vq*yFs#&pc26Ejh()Bc>J9-;1zW;T)AKkQ#ZukGi+kmOa$#rhvPRCz8kz+1!m)jmU zZOoZ&zq#rE`95MB7jrP&&3bC*{O(nQC};V)?{hl_o4}~y54U3}Cwtz0x8txzZ6k(e zOvU3Fce(xPc_(057`v}m-~gzNGnnxnoAM6pG|Tf3W3_dhL^Iy!*3a!kY%QaP!`+5Z z-rOeqt8PrQoW!`vEyD9+n67p^!tG?HKWev}zyP256kwSrMq)ZkPGwx_c8t$FlGf{Mxea4l8%YQG@t9WdbVhA-*220 zSPn;v&XDunVkuwec^A0FVK=y4h-txRGmdw=*ljp=V~%42sCRr0;{>-PPmITIavS4z zE;i9^ET*Gl1mn$aS9#ufSi0Lan0E0<#yj0|#(~-#=QB=soZyKUV3}?=VOqfp8MEBd zJ?|oHrrRx;w&2B#v)pt(X~Cly?{}Mwv1QH=B!CY%PVvM<>_NAw?TLX)uv|z9sqSQx{~o!+pcvw!}Fh|O3S*M@zD1CKoO?v(lv}jJntpX8;2#T zlHp}c%TH#!#O+nL6l}CxvCn%gc4@m^AJ9L&(}J&KO!CCn-TsAL=Jtj+n2L>YEA_nV zvCG}wa=QT=Ya8DS?HhlESH103s1q}8t1mu z?Pe_5?LD_iSc*+i6W4lGxmTrAb)8#<+b!6?+?KiBily30HF3RHz3){SRNdfK>2^Ez zZ?_NJCS&8RPdQE8=v5zj)fB2GxUF=XirwV)k=rzEqK#J*H+$8`UNxPnNp7p%?!waC zK5?6YrQ2ef$hpOK%n$!_aC?_TVV zcIy?`;K;Q#FvZ4J@V2IU{zk8wP1Q8F&)x3B?sVJac0V@V7OIK6ylS&o&7o?B+m~(+ zVwrAR+#bTRY>%3_+pFrlDvzp}ZeO`QjNRk5)om`8Z6lY_#Jyfs?^XF!<+y!=X#+jV zILqx@&zpzMw#R8AC(Nt9^QyAL0&7SD+^tOEC>Uc;0-Q%tl6FZ#PHMG6KLduO=D~4c9SCpq2 zce#bQJ%erI2B{uKsL%T><*(g(V2A61TLgaNI0)36dXBLW({O?}_&nv#lr;=?dx7$P zR#rol=CwV`*{E8l7a4nc`pHCXjF%XDxt&VXD!YEy1h?1-t+EptHi!k5<|Az2bAj=hv;~}*Kq}q;xp?%fU4~e8L!4p zCeCtON%p7;qC6RR1Ya+{B71=lhbxIN{z4lB%YECh9;eaiR(b_Ve|Ojn~C z#)WP#`^@XH*_@DP5nsdfrZzAhE^^yUc`|l3QJ=Q8GTP_2xh?kgwqWVlaN?5oyqrKS6KRg` z`ph~wZggAf_7yfBJBRq5+g8f|b}Pg5?!IQc9*ZYdcwRl_RJUcG_YF3#&jei^0)h8E zaU11pNR(B2;PN;yd$;GU#k7MP82e!w*89ATnsD3T_7fD`K5tIoGsj(Ee^1=# z_A?gRo*4MttqJSpw#n@m>=3sv+;(FJS!oTMG3|t38JiA~1Oi*y@=gf^_Av2_W3A8p z8}=J^0kO_)FXd(%{}CIlo~jF(-0D^PD5tRei-=#l{XzMK9=tHrV_N=x#^>F(xiw>r zzMk8C-WF_^+jnk%V%xD%x;pJ}JOI{uqW%Z14)MPjKf)4;J2CC8R>swy*WmUy_C7Y6 zxXbMzJ$XN?f9!FcEa9q+k@#Hcg6~^B+7d+txOl}X}3Q- zuPgQ>b{X}}-d;E5v9-ovEpEZsAltKwozS0akA?$Y6-w33>eDd%<<=ehw_B@Q59~U( zzcH<5PwZcA`nE+DhNZf7!k7&7;w7csE(vsY><#XwlQfouEo zX3+4EGIm9gj ztMR-(-2=C`z3C&sH17iR^~3>~KDBE&4AaIr61&yyaL7_deu;>!rX?qorZdKSsy3wR7^YT zEbJGz(=hF~SZo=l;cTBb4qNUv-0f_vvfXk5=Qs`rKk&qOw{x(`ew#nnEgsv?VP42W zM!21e>FS{2Jhu_pZ*C(ot@L@=Pi_~q<#DYZ3F^A^0tpv-;`x}aX|jvmF2MHN!Ya1= zK5rwjtqrcxROvFN^h+?Eg%@K#x+QrNqp*8z4^8Bp>`h$mO(aqkjlIOIW3j{46n4Dl zP4c|a*omH(=5{GI*e%^H3ENFs!!2%?VNLCJec)EdG2pMBc$?eh*iN?$qTbI~Y%`;V zJ3Q|SrU&`GXNudE*t531n)j$)orY;%bv0GbVy)lM+Juejt$I7uB zx9hQAnV|xk<@4Tv?Xit(d5_PiEr$C&eLPi9yFK7`BX%LC4-IoLosAQ)w;44&;?3T~ z^mA^H`n(gF*6vtI-aNOPnZAmVp;zEB$4S7&Hf0^_q*Li*DxdJGbf(i-{%UN#+b!7X z*eBSNm{$2#OgBaiPr2QOUB~nq#sZ%=1G~JxvN#Q~uEg81E85LEe;V3{`#C$?XSjpP zWGbt$7u=?(VYh{tcEwaI)f;}8&1O?I)oq#E zz1TFj<=$)#cBeP{f#=P_rn{}c^uA|fce$-}yAPYuZaINfj`xFigtvb{Ta9VmAHY^{ zU)NBDF&UV{%NSj17^*$*K`aGZi+$?$5Vp?e-Qe@)Vl~)0@;<{l>1P;u;AfurxhFo1 zZF1YxmdHI2`_gCLjOmW^2v+B|71K)RW3OQPu=tI)_bB$d+cvj(*sJ=4sl;y`9|Jpc zaDIkucY7R*_D_W0xjlhh(zE@8`VP1G*jIjO``+zIYzUuicF>+Kk4y#@@bWpG%pWM{ z{NVT$xXJNHH^UAMYyXhb;8uVgO&?!Fqgx?%s@qR)Ph%HjyUE+-_6(Nbc|T(uA2|Vj z+#N{t#9u&d!Xhk=4;LEtv?sP*WtRH8+v^QJPu?=O-!Yw3FJQ~vn!UY+*oSTheBKwa zMLoPT_?OT85?En_KI6n#;rT&CH1G;9@3?hxdlh@ztus*v{A<_}x2{C3Q!)0Qo9+_2 z`jlX=yY(V68F-zSvUbY}^!CIzz!J*(Bz2f4zKPw>-qO&|trU9z+m9WNX+yq+jbRV! zlT?J~Ey8w^r%zHxc%ClnUwM0xZF!s+i$NVH`XqIf&-@Oi!$daFZ3(sp)2FMW-QLCY zZ)9b<-D=A$#a_qsiR)Om_poJ{-v04EZ<+FPz|Is-@WgV;uPBir$`dOvodjKp(QeBq z$8l0=I1$t4UyfDz33RgOy^lTS-TqTBtzaeg0Y^l4V$M*<512TU#2&<9nC^rtD4*ps zpY08Ph{d@L_jy-h-_c-CV!Y4$5#?|Eu)EOnR$_S8p_GqDhyY;t;Y`aZq8M18?eLNu6Fwj8{qR^dLJ&; z^R{3~HuMYLV**v9nY_WP>L}~$-%E-A#<+O}zM`xP!R5pmp0|~Wm>LaE~W$1NB9ohI>8nTWleAH8IC+J7rx(#t~<^ zeMeaY zV_Qeit%2#=m{*;+=iM4959Ic);RUy!u%q1;y6wUSEf>i@56ey>Ef@vKY00y{VfPK) zT;cX7Vy|F#5kGeOoAN{5{qnTh@gSIIW4CZ( z%=I?bcvTQW~uX+6WS zZ`}@fUIg|grf%zB7?S~hd$R3j`y}?a=MBKV zenD->Jp|J~7=MPuPHqFSOE7f`JG&i?#nTy7r?3mgWMB|4BfNvy4bvVx20Mekj)v}- z-rTX+Q8}P`iecX1ao{jd?B#YmHq@=R+X>j|Zil!H#$w$1xJ6+@+z!Q<3`FyCDrF5h zhk4?O;3J;c&us{ni>W($xZ6osq388?)6cu+yM<#+22SQ>fzNw{=beIGL0Q89B3mIR za4NW){iES1PaKN1xD9kW4IAX0tfMg|1H*Wk>I*)`^YkhFdQ5%YW8Kcc#=9MdY4e|n zebR&duVJt!o(1Z%piXg=TP(K8S0)osC_?LSARylih}6vsmdjuv6U5 z!EVRYCqDI3NB!{gPRF5c=VI#Ps#AQL+Xzg3T-h+U^DrIhi+Khm^w^vlitkc=rdMA; z^?J9n-1POyxqf2Bx?O~gz}kALZWm)U-a9?pZ4`Dp{W5hvhhw@7CSa4>Ehlh3$aEl) zmpeT1LZA5(>`u3fFm24ySR$q&(dWGsyTolYrkha`HrnlSpZ7BCQn#zHw*CRXFCDnd zaaKe6ZpoOwVB3t{?xvq=UqWxH7MtvLEvD|6 zhCAG@!}LQ(4LMUB{{`x&lS-b7F&RkZ<#iPp?)1FtnSO&&U9IVEH!xl5c9+|~nJyzo zy{{SG-gr0lzOvfwn!t_VOMtpxGks=$Wj&BaheKVhd)#iquE*5X%Jv2)V#%1gS~;F~ zGj=WiMus22sIxWOSzo~=k}A6o(;i6265Qsv-GW_+X~^|?Z^cG=UY_TvSE$>&I&Y6) zI<7OY6UkHOZGKO#R$9pI;7N{8`OK5CA#R1fkUKE-h1JV@+HDH<3ky-F>>0PI*e*;R zuxBwQ1Jii<(d{|6J3Dc;+V1#*&pe&PA>N@`=yn$taVB_?1#PDfG0K(Qp#4dK*j4>Hlz)OO+m$L=bCVUD! zi#wotJ6pX$qpa^i)Z6*mt$?!bP8#ZoOa=;hIh}GeahvBoO<6ZS4c~g+Gnm>NLj0~h zkMHT2c!mXQ*a2!~im+(5f`%V4y_4s#ld%}$Pwg`Yo~Nt}xH>1h++Lup>$mJ@qV7Hm zDeGD-+e0J-UgYJtUhIE$PWFPFG=Y~WYYo*A`Q7bh%DU&DLEPu|3T55$Wq-K6N_jK= z3iUbmyS+wvi(9i>F{Wjxf6?+^*U1tlwBOGq{^^Oj*ssM#5)ZiPVt+9Q(nZ9-Fhbx> zUUb{j&HZmow>{kebla14W9#b8y+t{XJ6r-W*sbd#CLXpvJGm6hp)QfhP_J7|`2y?` zVt0%Xc!!q@-Fjl$GfS{Z*rmkY7-x3iUCP&ENyKn(Zz<(om_GhTxV=YN%iwmN6F357 zI#9-o76Jy2#I%rd$_IEuR}cqcx)fAU)-M6-R(rfRxQuc&rrYWXZp$fO$^|}+IN0rd z%A?()u(r-eC79%>p0~Ez2iTQZI`Jg86_jnZl)6Tu|f-3O}Pfs9YG%x8@21ZwvNc#7 zrr}JtDolroE~+}yb(mCB)?p&c8R3a*nb1DbmG(T05Lm~Hc8TnKOuOV$%JqKXyvXxv zu=lWsh@&tqWIg3FH+^ZW72JSTxLw|E{H_wX%yBHJQ+FelgXI#{LzjI{d6wICn2v=_ z*nMvLxS+f*u>0L^#!I0+*JzT{<5KQ0Bj#HV}W7RtYIraeNu#jTdIPThIL zTixm?C;HX&HgE7N>@v68J#Q;^Iktc}+3jn}SGwJykCR&Kdhlw;>E7TsnELR#`p)o~ zw^3F%Tvysmw{Iygp{yax=iQFI?l#l&zQf*hyT|i#c7P?0_Y!p_{vKQAb{|oja3}T- zWnH=Ncl&|z*<7o1<$l2JN6I}Yzd)QrRC^7S!`$*buMwj++`sKI{V>RM;3r=0=G`sq zWbZVF9+RWqt%gT^rY7puyVWqy?H5eFTMdt4THtO>y=4tgdfu;?t|f00^*L9^&mPK` zaR%yIq1%z(=x>zu?Hkt$?o*(S`n_OCI|iQj#NRP}C8vwZ3vT-;565&3Sm^WqL0Jpd zsrWLc1@EWa%THD9CM~!b+rdGq;f*%q;A{bZaMZqIGVmua4Q_Aw%m*-?=Q zqO9{=R_1xFly#cxtSk5S{-&(cyzNZH^o9>&Z`;^i+##N0Q9AiP@Fs$&e+bjbw*u2A z?M|4k@;dp}dR}KNf;^pk>)g6v_j8!*{Q1<4$3_DWxYb}x26#X;@Ce2^#T5c1zwN8$ zyTGrR_}pg>A#sM=Cbv*5)9nkNw>vfk)9|HR4{RK!bFbE|C$^rlhOdZiUpR$S>lj_rDk(DwV-x@T+H=6QX{YjOM5?NCe~fOHCMck7G&pw5DZ z@4Ugoz*_8Q62JFE{bsj1e>y*Qx*d+`lahuXeBS=p!*v= zesVkl)U8P;$S$`5SZ_?n^UrQaV!!+0*@RIQh{SXb=rG-l=^Qu;OJ(zGU+?q0fs`M@ z^izfX?UoZbnu$4}_H~OV4x&62(|$dG=>$54@-(-rfMJFh zN^)R=Zb|7zy1Pq|I&^n!xv?9a&-`}$cE`W=-ls5Tl}B}w)^RI>Sx;^H3w7Lz;x*%ws7fe{ z<8d67w=9lgIm~-;D~8PK=#|H;$7*FNo1^zSW<6EwFT0~x0k=#4AMA$%X29K`Dv_UI z)Ryeg(37i)c6tr~ZR;EaL-wA(8}z^xqYb;-psSC-wIB|PKv5_L#X(=NOTii9{5pY2 z{b$fxk9L}l1??^!4-;V$XshTHm1fRD%+bA7UXZ6oEXD z7fOQmkw!uUL_r0}1lge=luAPlR>2UR#vHjHbk3vQY}&mx0!BhEcnxwx9>@#%pa4Wc zey9XFAviD4tPwh6SIZ3}FGm9Q#NfJyT(DAY3w%V-z_W1$_i z2JLlg4$UA3oWWZN8k_~hApraw!wDT35#I~EQMu|1!lt>n3#|zc?-h` z7z1y^Ake`L<6ta|htV(@-hk>*6Ouv#NC=7GSNfUu$z22Ojk^Kg!w>KsT!ahoIV_=n zFNPJVndnzySPIKv6)cB&FdwuhZVnh2584lx5`w`E+6$KynGm%3?GNlJkXMlpArpxgLe-RP5T$-zu^ho2kj#o z27OrpHW0SLHrNF_U^~16Q(!90453M9VOS4KU^R?~xv&%l!wQ%HqhT8Cgz2yjR>2^c z2xDLfY=#Xm0_K5%k+21Z!zNe&%V4Y)VXncj5Iis&Ho_tp1@mDBtc15=94v-OFbCGc zWLOUUK%1ttNvaQ|q=wofJ3upN4o#pbXlqarh*P44Ari7dR;UKrAfzjluFj<}mj*X4 z1+~#99cXh;B1jBjpglZkAsJ+WN6h^hkSQTKWCHEW2|;Frl*IQlS9s4a{QDJtgKMCT zI@*_W3+}-m@FzTgvv3Z+f%9+yF2WCR2|kCqL|z{nLL+Djt)UIvBLffNF5HI)DQN#Y z82*I6;5PgYH{lj&<%U*jXjR9r*tKIvJ9K`4AK@ps0^fr+EN?HcXB`lZW6F3P!!Bx=KmyNIOcwKY&% z0ndT9|7q>J z=^H>JXbjCk%i~*dxLa^~k5;>Dal00?Yw@}ktM>w}Lf5KutuohwZ!Pey51(MxB5tkE z)_Ux(VL$AFH^^2Oveg+nLRZi->0g*h8)L4CxjJ{=RiO&h(6_|~G`N-vorfAI>b4ylEGZk zeVmH%ngz$JaGXGAkcA)?;-D}Tfuc|hv;?{YB!?7`l}zu31E57=2VpH};n!B!4_X+e zRcTuIrB!TNji%LS8(^=8fBWDtXl>mp&@$p$lp-(Y0-$BU@4|bq7qsYhD%Cv=ro(U; z1*2gMjDJqDJ8^O!e-)}Csusn(WiEopV;gXBDVokyO4Pc%QkUVTOEhM_xr%|QPO zK7mhRH9RKLC(w)Wpq-8hAQ5QcX;KJ+U~oe+&~9(7A)N}^UOpKLLpdk{#i0b0hB8n~ zk8qI~{vxo8s(y<6!@QRyI6P-ctlG`G2eyFLd~SnK+>^n(6mGq7B@Om?B6wM;m6TdJ z83|e#`3B>r8q@$SV$_<&1aJ=f1-J;ANKJbWwbn2TghOUX3w!Y23;SR{8~`mpTm>89 z9T*Q2gQ>&G7_{b3Yy5_zsAYKX)56D~ErV9e?X;Ax2Q-I#Pyq6SR?bC2F31MiLCfQE zfR@B%g-nnc{vf{la1pd>O{>%{>-GN;42Kw0*Pt&0_y;QJd-x9aV$aUl(rUBZPy$Lp z83u1}{JPOIdcgtQ4nYU#2%Vq{bcJrv8~Q*$7y?6K7!22!;1MtiM#ChS0#jicOotgT z6K25@&{DNekzay7{X{__hyi^v(x)VSCek;mJdh6xkzp-y((<Q+dU-*VG`ej0PcAdg-1_B@jolqO;W;0mkz${n@iy#92#!m}k zw1QhJv9(esHKj}g2l3aEo?Wns0k+Ycbq8nhv|`{ify$soE$QGYef%_0oq-Qfk3{Bz zJdh8x6huouj)FD^eGT8hdC;DZ_1^wk@%73RP^XhlEP3Wv_1l?nP}Sscnk5n50S3F<&Fl&3rC8;d^D=Efp&ls^tn!-=hlM0^=yMZunTsBzU#Cn zf%M2A=!f}j7z$czHU#u#Z4l^d+CaVI*5|U0u#L*v4g;v9Qq+pRQY8m{nbLv;^1KxmYP!H-tO{fiZpcafEgP(i&cLEN972F}i`W*29u0uxL(!)sN)`yz} z;CV_QeP|g0w_qXY4g6xztM}P32j)U*0w)2zYX2Mbdi^G7LDV+T+NPbb3wDEEd9Mb& z($<16y|UKIAFcG!YiZsj#{_J^pe-iJ$ayN*Lw`+zOaSM&&(SHGIyG}9=y1M%re-Q; z7afB*fnc*h2jJ;YyP`0P=O7(rwT?+`80Z)(9XnMTbgEPe_=+TcBfL(Ex(HX`C(waV zyr&MBi`3~%KZ8zR(rHyXaVZHyN2gSAP*;k8nHa{wP)NP^uT;UWxjc*L5=&q?=rEhI zWKIXz{7IrZPo_8M44LkrGh%ckOebgy9ia`hhL)hCTpEK;YH0{Mokgdy)F<;gQbk9o z=*W~bpyN+mDH%*U-bBZlB!FN@2&te10k6|PZ-7oBxepKFJ7|EvjvHwSt>70T{thm~ zc{m2|!$!~vA3H&Za4dvHuo!gM#vH9so=b@r!ck_Mci{%y1f6J+m0HLHF_0IcAt%H_ zK8S?;kPG6V2o!+A5Cz%bH7E$#p%CPT9H5UBXSJU7A9w^$Ab=(agak019O^iU9-t#6 zQbJNl2s+5M4%CIMunHE#T$lvoU^I+?zAzMChqs|Uby zU5}}<0W^V6>Au=-eG1OOdC=aK^{^4vf%dIvpUO$f_9=V@L#W@()Sos&2SWQGddL7O z^)2WFO+cgi9as<6T#YH&n*H5hH2+Lx{szCmH;|iIM!TfTgTDBGL7ZQ~myim3NOEQf zEgeV$`Iu@dKzVo#N|C76gVn*WGInidPDn(7AostSswBla5?c?Wh{>t)Q^ zo%$Utg8R5>7pgX$-UDqk)y7g4(36-55`mPo_C`BNhZ0D;M^8fteK0pOLLNwkS04~s0eeE38PSG`V!nL3ym^Q-6 zAbPg#o$uhV9>zndAoCJ9|Z7)~>fd;rW??0r#@0VF!v@+^sH{gqA$$3^Hx^ zQ-9am+_MnMpwce1GN2Kyjb^o>I@Ew_P?~{R2GSEQ3p$x0r@{%{S{8)YAQ4Q&QTw!J z!CYvD+cgrs2O%V=)e)_5Zwc+84QT)53HTgN!AB55xcc~M-DE?k2U;&Vg7A^}X$5l+ z@bu@OrWF4v;UaFfgeNd-8`9^n88q)5^fPOZo~E2i)K+QGwxf!0g1OT$U>Cv%4B!u; zCuVIe(oUj2&^ImZ-w%Vf5ot$HNzg8y-%!??wd-&LZo=O&?!3$U=b_<>G)4?T7x|kX2EQj19QQE)fi}+6?zhb`zci<{)hOMB% z^R3+F&P85Eh2{$TWU zBVebFuQ7iDXW$f6r?lFv@Htb%3nSd~+z{8Ugh`+s2<72*(9%>bMePdRK|2gOKu72T z?V$x|mq9CN4R1mdXbSb9J~RNWM}0ot`drwVQy#%%cmhwsg<=9o1b4BYg>&#VX#UZ> zq8>jSs?(7!F;Y(;y`#eXm5qTVZ+q#I`2pQZvIc{tI%t1EU8o1zS1(jC5 zYd?YZ4@5yhCG0@t1t$S9dNreo7)SySe6!15l zOe@F7!c}!R(1PwsFd3%7bkL&g7yAZH>+yCBwUPf-Srd}Rc^TTVER=(n1onnaN!Ubi zmm0Ybzrpiu{O_8W_SeK|d+#O!3!7Lvs{3U)Ry6Gmg+UK2IeW!GY5tqRv7 z@WC(ywD?<#y}kY(3|i5B7Id>72npda)%78a11-?jf^1c>SOVIUTZ#5Jj+<&weIY3_ z7;FJ-=Itob1=~M!9-GS-b1$VI$cPs0YW1`dwh1azVhw0%v&@gEf#2a4*hH+{jK7fH z`*0lg0-3MxU7{?HKyvMZPcWYZ1vmf)L8aUXT2-tJeF}#_?l$ra`u@b<#VJ}%oGs54 z?xFP!+=bMBF>Ne)!u9YTd<-8z3H-C{jm{e!p2D-92jQcj6~%`^@3D8mM%V!Fz&cn9 z3t$9zU_K0oe$XD;LThLN&EXBu^7-_jtryyo5ez{P0NSr|I4~eE;L+X_#e%yf2-=2w zZ5*qb=u&*((Y_aLO+qI?`&|ma@9+=EO(Y_ogb)bYl0afe3QwIs?I-9=5(=k% z1lmbt{j`-s+XHkIe@bAVzQ_A>P*RqMwq|I(e;UwU0Bz(~pgfQpGQc==XMon$vjE?_ z?min*8y~dmA`G%R_DqhOc4%aF+_NC%9s%JAvc!8Rup-P3IUI9N)21|)6o<7c#DW&& zYj1*fH)*p$3`B#LENT(H+_Z#I2M)<>btJWPU2&DAg0!?&$ zcFRE&SW1F67ATMwtEpm&f;JXt;hF-K0wt_O6sg>lm_Gj6M3jJyT$z{qhlDu}TJ>S| zl(^5GSxk-!XiLx(a|5UeP2f$a1=YZ|ko;;ub!ZIolUqYj*t$^Lk#d)R9q>2nb4ERl z14SfHp@9BM*4)U?U1mjY6H*40u+>$>{_!-!-U3=dOK1b_K!u5%LKSK^WM3SpjDX(A z4vuFhWJfczY;c+`T`+bAsf%8idq7X<>X^GByE|s5m4r`zXgU{5^g`+aWjr(y{vcHDgF=A4n>Y0$3?G1y&%93mZ`G2jRs; zY~(gh*^hwiHr~v<&PfYtAa%lS%;y-MppX)&ud2zx4Z#ouNg)Yne?nq-gs%1|1j0Sc zkHLlcALQTg16+i^;33?C-{HEMS%J>;4aT3~0(=c$zzO&i&cSRC8uB`I2EmEM}a!u+M5-MU+;iv1oGM!L4Plz=K+HLDs`1{6j$BtIKo zIu|_rQv^04Rkf;Air*rw@{3ZV zsmg2#ZJW#gD(*HTvMX}iO#Yenck^pX-rx}623Td=MmA$|mzxq%d*24Dd&kdw*D#g3#1ZKsmo#bEpz4F{`8!+tT{C>B|yS>HNbg zv&v{D+#?_yGD3Pt1^4tKUt?Ik|4XnrwwaN;b<@NgKU2p~(wdmx)hGGBWV^(lX5@|_5%3HO%thfD`0*d z%7b*YKq)t9fs%Btp`*o1TF|7$O?g3!pR9j5%w-`)T`Su0$Vft3)ua_p+sL<8Mrrj^ z94sQjGDt0CD+O8|RRX@py%_QevMBNbvN*CNNJnnckyN5eOYtto?E|QikglckWGmx% z6opGEZlsze7^$WSLYBh5jZEr&l|Ej##XT`nFB9U3ct3U> zsTqYiCo%?^5BB0-8mVU71G`}(c*@|Y5~zKqf=+=MiW~@UL3dCMbc2S_0BV6s=>MlK zR|jfC9x|uG)WcjC>VwQ9aVr6mav!5hOBFJpoOf}Q^y)!XqX^pL)(%uk=`=yU35}tV z<7UIR!QL8lTt_Q(TVZYqEno{Z(Hz+fR8vindWd=Y)CATJPUq=>J&&EsFU&na`H@>s%q5YstJYP^a_^73^4SM^gTH?XM{fY`=<%T(L*JJuDnc8n z)v*an4k64|GWs@h5DW&L>9`iR37AKK_EHarVIcPoAU7Q+xD)dz4FVfL4wLYl2%}*n zjDqz}q~kD;g)yKoHk=|H4^v<=tcE3EU>eMW+0dGJW+7+7445vn0?RTN<~U~AWnKge zVFAqdlZ!Dck)@zSHaK>LTMz4C4XlD?pg2~7;#m$W9JAtRp+GXM1(}7+@A#Q_V%`Ef zU^{Gst*{w3f%=L3C56si^17Kmb$QFS3oniQ;Z(pr%&H7kj0SH)xPkdP9EP7k`9A_b z!Mku24uR_AARGW?Q#!IMoIX)nqepiTo54ht-pg%!*s_S$F9ug9|;5;Ue+^C?ns(d9WG!2J_coGxM^HNY_Sg z3-cL_DR9F?xTZ@<=_^tNUtD%+Js#I zbk{M5F!?d(gS?OjHsM|<5$&(Ybstm&83()ZD2qK7a}1QjTo|cH6;V-SF|cXmSrw{4MR*;`K^Z6wrNG{wX{Y!&4}s($h4Ox$a;t#75>$4iB9xx)BHlpSh$NM$ z&4hJ7#@8@qss?^FXm?$hOM&ja-osDpQa!pY(E9n_&GLN=S`(|yd__~}RAqsW*Z7J6VF2*c4M zVXuDw#I%0{EOnti)C2wAh>JkMD7VI50&_pigE1>I^^c~QHEP0euM4W7uDI#68=ZRd zHfF8wPlnkI(=k7QVbBP=!$4^7;h#1EHUvegKvGb`y+I}Eg=`BpQQdecu{O{IxBt;uZJIu1HHdG5XGaYf$N2?CV zPJTLVsU54MBe8qnr&4zVjhvoH3g_`EDM2NqlG{@B!`v4XiH4rW^IM>;U@wm8{&$Q7|Se|J24xK;u$@$HOGhPgG1WAhD2iCz_SP9Ev5iEhlund+$M=~K+U|s{O zU^Pfb?1m3WKVT<@?I6W%umRS?R@efYVH0eG9k2^*BF8Wvgafc26!Biz1N%UUDr4_~ z(vklm$9x$1u9{aKN8l)&21WJ}dq6%(pQA4mUMQZ(#TZ)cda@e}?Oh)Q|Z5hWS^}1K~AfPPhx|uz$dxKu`8|Ud`;2 zFt-Mc_Q6Pv@}@{TTDoF>8+2A#B3*Z;V@Ze{h73e%GsZy7gWxHQhbQnD9>OE|8#KEA zLMn6rKv@z}V$!!Ge*$LNMF8sO!qh@CRSy>rW zsq5pX%&GJ?V|B3ChKvvn{+Un$%3LidPMAu_not9(!5dIjRiZ=fDnmsm0Vn8a#gWCJ z2o!`kh=%-72%0Ck$E5|DBj$lUn6_XxY`7VN9V%2hf0uleVpq- zR?M31Gb76*%RyPF23btaHhhiEhF2uyfQ} zaYO7jaz&;dt`4M|;|ADY?AdSP=RdT(@v8T{=|rqq#pYB)q$%$CiOhppy|xqfW*~FN z#3o(4;Jn`TPP%81+yAuGEn_(-1bs=jH|U-uHT1&F53^(r=!rph$=#tFbOlW)QtD$a zx1)tK7d*A4aYnT+S2;t zkz-*LjD!*J89hgjFYT$mfH63z`A0i)9I_XY)CawLo`iiOOaKkz))ZLJy1GT3jy(%H zQ;}0ZIC#V{WXEP#ce zYt0OGN z^ip6~7fg(lzW+o1F5C*D69og{Rrk_+(bJ5gL9O`9k`d3h7|z2tpsB<@Y<-Pg)5AGv zg8N7!K8yJ)I0>JCZf7-hB!Ls~3p#J2n+ACt`-gB0I%7YKJOpaCgUAE0UsKFJ3`gKS zco&X>I*~H+0p|B1Jt)vePys%MFF}u}%JdhQN1}fQc^cvfuUb-#suuMtMW13mCD8v2 z`8llC(_$@@RZ{(=k0Mql(<>__sOnMz-ytu6N_r7&dj~n@v^)zJgQ8Fbv^6~x6kkWe zYd@%JD-}{((^EiiI&yLyN~g(F2hsh2vfAhtTmtQ150*cf(YGZXQkN98r~R@r1;3-0 z7`yhkCxCBp(_VKMT)}(^E`q*Sb%X%ipAx1xaXyiJ%)dY25&Q(D@c0LL9^Ko>zu^J= z3HRVG+<}|sOm`N{UB+0%$=|P-mChC9FQ#s1o^oU@inp+z$D}56G2E0zWlyP=1Y6V> z{a&UoH&ubc%B*Trb;#{UxTM)dMez5uX4S8hZ6vA!nQcZ@kIMXgzwnCqA$CPB^Iw=R zA#I$}x9Q2PR6-U?%b>^uQmifRcJKpjNw{m?{rb@FKI$;Rz(msy>kUC-XGqK@sC zhW9Lnj>PKkW|LHR^LJOC)t5UVl_mNx9}_TK0^5m|zjUDfsD@Bv5!f?>PIOcQ>0mWw zHY+j~6tQ%4I79}>2O2D@;22~y=V ziu?x>kzI+(O^GUVosiO320LQbK5^;EU+$8fAQ$GGpgrZ;L1{&3dMF4{Pyn=5OdHo# z0!63|>@q77Z)IVI+e1UE@#*h=ZiuCXXLYnPiFyPbAC^7Nl~{7dFP@2CdsyrT?U zB5^gDEw!4>f8Kf3v=fJ(-?WqZ74weA&O4g8U+hC^h{NCQMZ0Yoxt9RVxj|e6N@A`E z>d%_UE5Pee9?HQnCU8|MlX-yioag&}d>AK-i z2G)Y^DH`D~zgoJ}*9~D49OTH2!LtbUy1F?i@|H+l*V`g>Q>_S9Tgs3!xSKe1qpf%1 zg+V$^p*{N2>3}>&Ja>qr7#U6G=)`H=O6iCmgJqg$Yx`Xx8ji@!N zbkZG1m_Fzz4&Ag`f8DSuQ?l#EQyEkI%KQ=Z%NND)E(YcPDDp694ZtDfK{x>WL8aP@ z+ye%7!!Foi9`_2aowEmdU5a%HEQXP=2o}Num=E(zpWYm!G|4RJ&Cb#hxD0^)@ZxjI zTaKG@IZ!&pE*;HE!(kW=JRgPWNB1M0*a=Fi`P9-dVjd_i84L4f~$?{+`sSK#i{WEJjp5n0PBf7xb z1XAOnVJN$Lyp3F)Mwc1cRlSNp=J(OlA)P%zzcc+I_Vu{y16_SMjvW#35z>CZ(^8)n z=rji{+4xiY#5D6M&@Js>!|@Li0LLFM=ZsqBnEo$B!}k7|p2 zfO`XEeW(Zb%}9c}{xnMl1jo7_m^0Wsk5Kvt{)WHcAt=(PNJZKMmcVGxDV7_+R!AUb z>DbCrz37Lrbd+;$5=>4Ve1_ZG*uTZS1aA7F0`&+j*XWp({OXr4>frDr3iB}Q7YtM> z`ZWXnu84lk;3$4NSWfGirX#0--g!($E+itYs~e74jiX;X&`p7TJ2@V^4x}3k>KS8@ zqhS~fO-g;`BZvAXue*j~IPSqb1Q`T_K|gS!7f1TBlYY<_bmCqTNDMkEEdhL?MA3VT z@al4!Htal>2!BfJEv!x>-&IRt~wW=jUrk#vLH ztyxm%xcTdZV~>Dzpks_x<2q1DIv$;EEQ63^C@6sJ3Z#>iv=&H#GC+EepX}0O0Z~9k zq+Ks$!)jShHr%s-N^CPc4|m1enr54>#YeN8$Rlyg>L|*rL?m-ScJLnFf|QOm=kzm6 zUw*GaE>H&LCUS$#SU${o9e20dUml_WC}OLafLjEWt|)FrAPQ_LwI*Z(NLSTe7*wi4 za1Hl@NR`-TA{KKDL_5SG6}E)h-$tSYlmP`&q@_WMa+6&p(ZUiXR13;OIVcNdK#@yd zO)9ezmA}jiC;1&x!_UU!se)r=ka7jkIXMcX+$z$Fpi;dKHUVWoy4G%`+>`;uC213> ziMa+S9i7fq4V?5m0dHWb3N|tSgrsC6x0!sEU77ON_cyEdL{q2_rJxRER{P7NuGbP@ z%~~c{4>wh_GN>w6d#cT)uVL2&-UOXF)(9Fx15gdB^vckSnf@1dwZC;#^(iq`xhcQ0n*aTWiY6C3tTgnLh#hj)uM2L9v^VsE&d>?u z-qo>Nou1fxKsV^_AU}oi>CpZf_x=%GVrJ@(+kB+1+PN7nx~l0arlI3vULS-x0dgR6 z6pV!7pyt%OalL#Ufq5T=(1l3v#)~-a`UpG`zX`Biuao7VOJ{Br^yH?C$PwJ8p)eI@ zfHI;|&xQPu8Dvl8n3p4$!BSWP3t$fMEJn_U_bH6rjvyBybwH%d9y#i5s{*bCz0Y2Q ze2WaMLaqcGP&%t&9lQfNDPuiS*Y=Ibyd-Gv1?)Y-Hr#(fPuKg+m{riN$Ssgox06bI zD3D$XNdm@&5o6 zr_z((c6At8^rr-rW2+$hX*dZdKsuiwKZ8%fW=?vi;B%0__yW#={JsMJIQ?tDqbmK{ zQIPUCpi+Db@>5lR56b;_a1s3VWtN`&72fJ!!mLE)rZ(5l#r}x-Cm72aBsxdtj>dm6 z4EJ%o3F=_i;cJw~BXz%b6{)3`>OAt-SD4?B>b<`rZHN6CvpVN5kRHE9gmobmM()=@ zA6@iCNW=IB_B(3-+ZcWawf$2P&W#*^{TAE>x&4X!1MWd{A}tSR(NjrO0A)TGGCL?i z-FEK+6(k#ODvZ)`VOF6OrwaB!?H^9AYzcqG^9gPfNI$bXRP5Bk$j zZ9m1XXO&-_@VcY6aXiLP`tnbTZYI#-_4;iwj~o(%e!VOqBmy1iT!2i4BU3{LNCVzq zenF;y>k78FilLLe3NA>ourg%5>{5C)1nvrb;k;#eY)SwR<)|0jv(AWTls z!j8WoH|CjAI{Ma=t#!~lAG*` zNIEvW%=%#tB_`B2MuL8zL;XX2Nqs{<++jQTZMDDc5b6W((nflaD1lNbChmEm=$L}YQGD`f<-3dDj=5ROL5uL9-}WHPuz9MY9p`jz7KIC&KZEwh%V z0$OD$zJX#@uy;QG2`HS+z{~t?2CUA@GXv@`lY5ips}qs(nX;=c73hwh^z;7AqPEsBvsf1vvk`a zTZ7hxH$`f4s*kk(4KO!?hVUlnCyNxW1JdfW#q6;WHN&C^T0nDX1ua3VO+F?wdZ8k- zzSQfzgpI_?_UN_)C8CZhsc+kzaq9%$JyXao&<(UWtf4l{S^mJr#O4%E8F=SmL zQAGW)_W{*ZZtQzWpugkx7E-T>H6rwySTmxn^1{^0F#HQ3^FUFk2T@Q925bDkjY2^z z8YT)j1iR!=WIm(dV)Rj-}%GeIG*M!W<QdC0ji2WD&jpM_y2e1)eXQ{*p3`YLyS-P45AKA~@35yv^)&w#e@ z*!UM}^NAc)m5a&5B3K9uU_RIqSlNOmkgm1+OGT{tKqXd9EFrwix}ez_RSn2Z+qss> zUz<-9i98foPe0m-qH14>!V1uYqODna64F!A2cV`}kDt|l2XlH7Qd26-I?&#qRY)7( z8qA7AVOL|8zQ?w?loa_|M@fmu&APw%7^dEy3O1sj6e)WcC{o3l7OAjvL76y$yb1+C zW_9|lYJWRT+6zMkl(&PbP3%Yc6YNSrwQ>^kNAMvW0o${8Vpc7x2JAz~UfeXScR7B0 zkh?)TGS5)^%dj8zfg-R<)_f561CE~pABIDq%!u41pwXbxet=Zu?;(#mZW_k#f<~H} zKs6*?g?(S+{}{-kPGUVIkK?WYx~SM%P}P2nn=Ro9%rkM*ypWjwqsK1!Dg0Rcih*uA zp51U@*1VuhrkWZYz{IInrhAW14qn?jOg~?hoSTe$*KRkwT`%pAxm_)z3rEF872n(K zM)0aov*}83Ez|dp;M68-pgS&U_aC`BqHgLu4Gv8b6U7{#?3h|(a z54j&P=+{+qvOKvLi%+c2XOnrHz#SI8_h&A&C=}mavPHJ!lYa81;SE}UZ*)R;0$1&9 zzj0rIMz8s&QVyR`!=Mot6%!j38&J~miJjGM@Ow*^4-0ff;i9rvL2@YLh$`>4G($r3 z_4S5{jVj8O!;DVk?o{|+gZ8-Q3pyB?mY~;5wrO)BrdAL^qob(5=zwV^OJaAJYmq6Q z*j+R2i`h!$N_5>UOzbWZ7<$8;OYE)@-uedj9>lag#fD;~GXFD#m{fK$(bJSpLfJ>6 zproE|{5$mBhV9Ea3dI<3rcV-gtZS87BXQM)1i8b^-6ZaeuG=PgQi84`s48X3%HYL) zX00n9=!(f&AZslB;E5@pG(OC?bW*OS>yLg|SW>_$Ze`q2HxYL_0!S1v{U!a@{`V2Iu+$i{b5*MK_NB(IFHBXj-Qb)f{Yb33aEWN3j z%>71CzdwB$^ywCt?#uHmpAjglQ&hRqy;9!y_U`wUMn2Qb&19sw#BA@9EX=jZL?(B~ zh95#*!{hp|3m4We_OYz`ZIgw1GZ=W^Bx{{4gE^Gk9T)y$_aq>r zCXRH*o4VbSg_^7>+zDL^%(A-4!c3VI^b9BAR_5{!cUm((g*yvH?eoM|g3X!vBZWK8 zS1)0&Xq&=O#cgT4#RxT1Qo1v9+S|sIHnvdnZAy1NCmMXJq;hw1DmzhpWduH7=i$vB z`6@5nlWdiaZvAqaxALNkMHLC?VxmKcdzf*hCiAUA+=;@cp`4MbD=?_p!dnjty^At2 zQvm_*7!S(fpQ8|r!t{3c+BEv>-1>NhZ_LgRcTHbxVSzaxn~2oz3=vU}eUr+KZ-(#P z{?n*0(2rp{jAO!lV(Osb`o{E0>rR{4n~0N@vgzE30!uzIOXcs)Wm?lK)Sbvx)0|07 zj@y{>p$Nz37sy5yU6d>zH_`dxi>Ek!-l2(@QSe=n2H*PTXcVHISy8~9Hi=5jhZ%n|08PY@DKrDmp5f8H~g4MrI&|s^(M%I!FD)u7D8qZoQu;%h8=j_j>gT zanT8AZZ$z31XHUxc|^2bB$Sd9Rv_P05U;u?ed#uWiP> zUwvKQR_Ov=$}$}};Hc?^LXit7Xr5b|qWhT%)eg?`DMX`i7oRYE1~=@OWM-?7De*zw z!RAOtcZR~*gMAu>w+Fjpv-K>(mBcqn0!rbNm9QCipGZ991@_nSYT*L&vU%ea{l;m-eJAfK1(Kco?C(}+xAo@8=o2rQVw zWXSApnW$0hDlRO)J z+Z$b!Sr+LoZZ2kXr*=&}< zPiW@sTUv07H-p}rzqkmKDvvuRuxx~>h;&sm1M|2$1t!j9F6D8L2rr(Q2B5k>afN(a zd*iQvJ0;`w|8X-UFC}=@MDW~E^N=P6|c&UlaGyAee+Mfg;}RvJUlJNsYN32rl$NV zJK^=8`tF#PB|Ue#VN}wQPJWrE{L_BE(!EKf%gmhjiqdk6>NLhAGg;RZr#R1DVIsX( zn2>C)08Stuacsx@nQL<|y%OlsBLdkB$dk>aD9E*^g2~c=DBd*X3nF@(W)h>#iYka1 zW;(XQ+leGQkrX?c>G$02%%MP6Y*dk=#fj!C$7fS?Ezd{a{4zY==Yjc-pn;jPo8fPA z&sr+GE8sPvxZf#Hs=<|q<&IaRzLfqjv;9rPYSXF^)pi7RWxLh~LDw7qlBsdL`Z;q_ zdViQ(go;R$!xfMXy-p{We31D29lv|^iWMejg>#s!RlLRfhX}b**08x)7_?w-ZrdhMeZp zXoh)_oMv$oQmbR0;>?Z2QDO-n%n?v3MW^f+M$LTfa)>v0G`B+mv&<>QzX=76#hmpY zrs}i)=>R8w+V_AN8AC)DO!7vE`zBLUQcID`oQ@&2T)9m1M#wU`%(l9u+SFWbk5)eu zQq7$%AvZh|Ox;)QIqN-^k zcCWoBj(#5S`kj)^oVw}~oBh$ZGu9Fvt-#4;`ZfR33`nAxGB zNm&Q;yM?*mEka3kx7VP3y1Reoj~hiv8TIOj-pr>6En(3_o_PKv(F#plXf7h!=3@|jB&+@T41W^*#=6&cNmqVaitg|5ws*-(VS z95kO5BXj<-Sew%hp$UuIRKkl#`Enhypk{__y%tw;TApmwGiQpw5KpX))!X@)P75&^ zt|&q4_!>AgGZDW!MsH)MOUQKLWX{`p)0QZ#cLf)ycg?-iHfQ;}RjvIDP z%c-~HI6d1JHJz56JDs-Xf2}6H$!WY?Ekg(QE0yDM&Md1*l<|3w`!@~!LbHUKz;fP{*Q!JFmis{SQ)YQia-truS#J@2Ty9*sw5bhzf3_g=@g-CU4xYS%X} zsF%l?M@79)n%-%{nJ>I4r%S}F;u}mE!prd4K$nA%Hgns5T0dm9(_VC2UyR`&qo6Tc zWY5lz`;MR0z^f3gH!F@pEFU0r_nx}VvBQragk6lkD*0+UFd(n_q$2k&qs-%qi~}a~ zOLed=F=r~%GFV4cV(M9DMs}og-ZY<8LNqk4%FhP%f6Sy47k7uco+wIPE}Zt!tfrLA zxGL0#?_y|GxL|s(D85UC-=rI#Iq!wXnS6Z{s##sto$*-=zMwX(z~WIR#TyjISJRrm ztDEwgexIMly>oIWXI6c#LxlaCS<=^8!~5s+J%UV_QD@7{V^fkkZDyxYZ=E{XzFdu3 z^j(La<@jH+<}2(ARTG%B?7SKj9khU zuZwt#6QA*aX&&2^oMJy`eKA+H2p5Z1Zi*(fGdnLcj4{4xbgpKM8N4 zoNKQ4vKIS7&wo}t|4{xpcB=l>vHPmbcP(3GqU+JU-Z#||5kFP%Jx4wsko?_=EmP7p zxVtN+o5X|_&4_yL3`KHR^l9V@Uo#@AUG;YH8ddSh!$4kN>+I7S_wRf6&0N~Eh-cLSvyZEdYogw_( zO`+?#Tfb*_biP|Tm+ywn_5Z8eGG9-5v2y-zt#Fqb%Y%%&Io;s-3rIu-o>xNYulM@> zHg9W(-{vq4I?qF?E1PM}nY-cx=n@kcUD;fev+q)4npfcEYD?3i1yMT{-N($tX1mt2 z$^5xq{_lNx_S(vbczHwqAKR~AH8VU{v9=MOo6!RQcg$N(|MGQ$XYFgB1AR|q&pJc= zto{5Y-FLAwLp%J-UB?=ObfG zK!$3jdndYe?rLUSC-;cJV%1F2&fHjyG$lLpJUX3#sTdyD66ZhM_4}XJrS-ji_1-1) z>g=u*v>yfC(4RDiJG*xW230e?2QWIOnW;*PUkCPi0wEhgg@T^W-; zf7e8_5jC#V<$ELcm>;^jJB1If>GFOt3p%5EPUeT@b$%bX_FoLDXBZW7j*zl6IeQ#r(tOsPod0fIJ^0)+l%r|%SufSS(W%ns>Q$Ja z`jF~<;;!9;xR;=y2l@?X-`sF~^0skag=oE&-e~H6nJir*p3;)kn-`HR#+>d!EoG`_ zPUqp9Q0AWWfDI-xbF#FFz3NqrCmWxcyrI%_ONe5s5-2W5QK4k{H$`~@S$<~Wm ztCDHl%RRElNm@`vXg<5qh-iGr!_HmO^;HPU;Os$pOUf{YDm=m?zu-r)!2UeA71;$}R7HBJ5%JKfNtNhtLOw zJ~gP~ede%&`o4sbi^2g;F;^S+TX=kAa=zt`EpncC(o%0#cO2`Sv3j`<#G@A&#B&oL zec$};=C$khrsrScbP9YDG%?fO;^kL3#|x>)g?38yeVx43^s$1kuS&`{1_EQ7n2S=Z ziK0ICUm1I8<(Xz4y*8kA^p>QHNjZ?rOfY!{x;sVWcE)LsO>Zu~p5~+JjMMl5zG)yI z!?JL)Q4ldD4{?p@mwx0fVk*REa$?He)La_qt{528)Z`lE&g$A}stj^3Li{+0N2}+) z=*-R!{#Vt zL804&J#l63zCPYpYQ6Irf{$JXPAYR{Ol-M78+n6zhmkJ<8nE~a-*eeYcYUyXWMIOU zrsohQu(U1BwCirh!w`*!mgbNg3$`@phPY!2mv8B-@7~SVoGm`HdsZiY-n+g03uO!~ z@%!G=L+PfjGp777I%PF801=VEX}JeArr(PGDSKyM8T0|wR+R4(ZFt3Yz88_deEj{q zz6~RD#w&I-A;W1o-)CuCzkz(FYCW7G<^4WveSLl2>BeDJ*LB{6j7k<3{_^@%ULKgp z?#cM9+Adk5z{n1!)(9f@rT2V{W}Al*>HClzUb~~OuT>4&c5~#rYjVWr*h#M&3R*MJ zJa+WN-SeNGj#rpzGL7VZB|fQt{S0jr_Ksp(qVWF|CAn5q&r0rm%O5k+9T$hwp-Sq|`dk{jT@> z5yJU)k*9~5HHJ%Q!Ja1VSa*%U@ZM(mB4T*0w;4JXS-Q8$I)NU#WvqJ?GiUTTI>BP& z8qWo?^2B6JjQ&nMGH+ap!YR{c)-ydv-ElN=oeGh#W-T;II6gf{iJ zg_+aRwD}1iU{b7pmY*2wZX+LSrru%}oNZQ2AmLT!AR>Iv0N>dDG%~DQrsF-TQfj@o zWA^yO+(N--g9S!g$?vn=3^Y$?5ZP1HXJWkT^C_m8yDfR*XHG{=`APp$UdOSKY3AqW zb1Xb&u&-@5?;TS5iv^K-kKw#Wo{5jX3>6z)A=OV`)jfj`?o(|R&@OEb;v$?lPe&?$)d z#!TUj$u1LFiM1L}rf{wGUfI$mBJBbmQ)?>ysHn%6yR7G2`{&>LT9cvrBpT&CX4F)7 zOn6N+)N5C)={xw~+Dxg?h(-Ywr)`>=nU9$Ux}g_>-th4cPp!F^@rm?&U(IG!V{HO(lKna=Gf z1!f*)3O!7gAtG*+Z%j73+GxhLhLLmQOJyUkZQL`+Q#%y(MsQJ$k2g-;+-6XGo`#yT zDDb7}=u~>nYLjvT;((bd#}lUJUsUP4Gw9*I?1lFp?JHcOBzAE_s#>o8ohmip`ua;4@vH)wS02nMZcsH$X}0*?hi`uMRK9(ah9cL~|W5-4Orc>&!R4(dYWW+(aq-n;E|J z`X3BA+VJFens&II)C9KCL@p+l=SP&w7s)eM-!L?X7BiHqo0He+!cEMb#oTFqYWig0 zsmB}DSyOfi>t!Cy@=Yr-$^QAVL8f!lL@=u5H)bXqK#aaRh}iCk|Xn-h5Z(zyfnjs&mO=oXH}hIA=F#241qg>C!xl zYd?+8#B*0=U)$R&yRSK%C`|C#WT{QLweF-&-}4Pbn~rlc;4Oo_w%bAVtasWOcD%Vx z0p_jXvh&h#&ll90?ak>GG=wkci!n2|yrfFJIW)^xx>E=3p66=>UzmuS^dJpwpUZNoB5#AfoHcAZ(cnH#7p=CjT2Q-QAa zX6Y8Joy?gngrPek!p(Z$r>boilkETKO7E;%*TzLYwn)GhlVvL{@-Yg!ndq?g&CW~v z{!`PZP=r@2m+{f9&tX^f-0!@xx|S1^@6vym^4qD}L>qifu=3*tH>+3O$VwLb5Rr0& zS-I7{kcA~ubX7Esw`tMTCiCt#dhlA499MI98>7Z&cKI^n(~ossGy}G?Dr~&@4m}m@ z;dYj)%`~lc;Oc#<)iNhu6nWS0s*kaLIn<=u=}s7Nev9vMxN6(!8UASXRd+H~lvi3P z2W&Nkc9OjJku7axv|bs6@be;i?(X>bRE=Dx+s;PYxzEkH)eJ{Fyc8O$g~>U4E^4r? z{dF{)UQyd@-$~)Rnv;m|5$I{HWy$rU*OUtxya>G*y$z2Jm~5U(Z=(s@<*ph20eX66 zl=ll)r$S$T=Ur;Xbj@3>(`Mu@^lqC)h=|`?`O;myWAc>fWQjr)UsMs@oVmA|)4OQ@ z{M*d6T|BAPG2M2PfsXu?T6!W*x1&zs;%SHW^cKatIANGshC<=lD5$K7uij15FhSb4 zyfLz%I3{2nKDzup*fyt1f@W{sz(;RNc+qy)+*I6OqM%B+ay!>|d5iYCfI?Bdo`?9Mr~7ZWXW`!tQ#KKo%|qtL z{p35}PLtt)dzb67iM&S7Z274>ykOoM< z%UpcO<4AT+08o>j&h$q+whp~bA!vHNA1b)ZjJS+usa+=G5nb;MGxG-3*@ysoI;mGC z&7-d?4_2vZC{4rd%x9M=bsy8?5MqRJT|rDYD`Z=0eju=Gv$^~;;)pr(h(B( z4HdB~_7V$yOHlBN&z{4mJsw%=tTy5Y`g{9&|v zb3bT&iQer8P441rBh0?Ta#Zr$5z{R}HqZS2j!GQ>z<%7Xz}Cu#ML{DGl<5#wi+oKx4@t?Lwj2il8z<+^FJC{o;#ZXgfLK%Dfr5vTifSEBS!1434?5fcXnF)gl`24U+DB85 zfE(u1!Q1dO?LOjC{y(V#&%B`K9;gdun^kibKXJ(4Hq=U@V^lR3e5xka;JU2)X?-mE zkp!gcv9M|+hbu_MMAY_ogcTHFZvPHPeX4ap!~X#0O6Uq6Rg9uo)rL9E(+^03xfa=9 zsakv~cI+x`yNBu?1-~u>0LKicEzFC`5e_m95p!( zQ$qfteaA84yHxB1>M2d%?*vG7nAV)Yx=2L}gKXU>>J)f*J;Vfb&y6<%t6L}Wm_hGO zLR_t+4sqz<8f}Tg%f@sf4noH9*ql>fM9*VX_7pfrH1g2YhPs{xOlNv`8IRtygntd8 zTl{M*ZMlNSOiIE_^U`Bdv>iFzAJ_KxtOx?JFvSYlNCnP-B=*Ot(ivC)6R9VDB0x0Z z43L;ZSL2~i@|={li)0-c13V0JicuNgoqH$-z`49(Kz{3Ogq{J&0s9|{c&A|#%Cfrk0pc-i=+mLEMEofy+xH0}>wZP$R>B><(3G$a92^*wFE zFU?^s9ZvvR)hNvN=zteV;?(TbC+uFwcA*;QpHzkiCdTJ)dQKx!etDU{NsygR>9{Mw z*CUBdTy}*3{|OXlg`0C8Gd_z#FM$Y0&Pn&@n)BDf`dqX~;UNgB@H|KRFQUIh8g(9; z?moadhA=ZC`o-FZ{STlA#oo^-{ygA5&|^HzPUj^i6N+qoKjF=qu2%dLDc=Q*TQuvL z3CejAb-#c~QR9-`DbnZ8s6P;TCh^Rs01gIYun^4O?08@IZY`Lt7%{ZJn|kvAX40gK zM!#OBNp$%lI9w3H-#qA&9M!V$T^65iky0rLB8;SImrzSQ3>Ma^T&CBT!261^CExyM z{yt0_E~72ADr}Yt`Ch@4*ffN-Gz`neT;;MfPxp053%4 z*wJ@$Z|K!vs31TYwiqR)zOe8_QE5Ln&rq0s(c+X+6gz+Fst7Dr|^ESAtyTt05PeL zQI$&y^mb~Vv^48MYsq|?avi+5Ip*qh?9LDXD|yppyCFN@-vmvR+K}?nurD;Fs{&Tu zmPpMC3);A~T(CDo$?-%*`oHA;!a z(IT`IIP##hRqP)Ig|D=G$OfO<6WHC6_H2h_U&zu&mE^udPi|uu(}^0~0WV*r zad$v3*&sc=0|F_X6~v-0MNx5o22`)R@IGa`PY3RTnUd)8U9_`@T<-xwsCZ8bzULC8 z6?#Ae?qTyKtbtCp8lTqRhuxDgu>~a-AnmJN5?WQp!mqUD0e-0ol*X_!+tSXXrQ1U} zkDj&lXTRDm|e?kFo3w^MhNIWHSgQ3~G3z+r7oe#CE{nup6b#8PMQ~ z+@`%~99rq{Pi^ZN6fA4k2_>s_^$Z%X830%lUn~{*WL$%LcL9JMBk%1xQv5Rvzdt?Z$7pg$2J*8h z{2#2+Ur>t&Ikv`uA>;hJ^-|5E)*k8(I7`u|l0Fan27F(jcS3P_Qjhod6`scINp=Y| zVYm3=IV_n;G5!B?>1s07r&}*DbM>j#->~OI=brTLZ|0OI~7_V_r&H9?1G&P0elJKi5pdam13v z3Jy5~03odcuP{sj&PUqtl7IDlg|hy%;uSFcj}zx_;cMo2LeAu^GkRver!17zc1~?W z(TG@4V!8O!@LkX>E#F{0q?r7v_Oi-sHMr8)${OO>JnfyFyOG(N%cBiC26oa+W+P=R21r=8*T2ZY}S9cszKre%%U{g0R@8 zs^O{aDyOaE%(#1gVVu=O8*IBAUT`6P>~9T$zN~#R0v@=mm1DC3Pyn4objGUMc~VPq{$!IwEZYke}De2*uHPC&dY|D z*vbTNOTfT00N?{At=DEN_%#1d?f?k#Eyuj{SXF%*(PZkM*}FBcmbiSPte?<$iBBfG zBB(p7*obzGp4NG-Ah0m%QRpYI+yH8Uhj}63I1}MUz~9MlvKM}4ZRrqA13(iS*+HU3`qm3N7F)FrYd3{nHA>_ztQiNBYp2{EfUVl>jsJVUC{;7& z0{_S}?!)#ph^%;U9Ot6J355-ie@Z&Ym-P^RjJ#kZupd0 z`$R9IWIjb{dX(t}+1u;>@OTB`p}9CxH+uwcy&W}ST-;5p_eYncJgrfUT{@74K8`U< z?e)m0YpQ2$mNkta2rvzyBJ*|ny8&H!IY4V?9GG`-9jO~=u0XY?nxf>g;x_clA> zdr*x1%0?^K&O6Z@DeVxPA}wq=^>#s>Z8XUR4Sl5j{J0(S!bShhq*cI07_NGx^lR5} zQa08`8kSY}vZT`{UqAr%gWr2=R=uNCo4Igaw$QIsHX9;JE2&d9JxVL-MUVJrio^Z? zoR=lRP5059ymw^Rvua8i_~A5i)tn%YbRC!m(TG||EEwah36k8H_m|)55v$oRhb;v& z7|=p6As}O?*&F_-J@_@K-*Tave2O z9h&5=7rZ;XA0q|zd)i_~s~ah)IL7sRQBBDC zGBU1u3hQifKYt zC4GPQ;mh$uYAfK^kZi{G9A>Ci(J6nJAfnk1)_%}EX0ba=`G~a@Rm2QQxyu=iwDfd(0 z@TB$j({p7iZ71uMBCq0l9$HyM7b(?7rgSdKQdIA%>d@4pKxRFyDXNESnM>2_qIzwk zsC6+Ei4IHCnqtsG0=d%ks+hI<(698765bR2B7YMYc;sVeX6Dkk&;c~<^KsqV3%4h8 z?x!-RWkxp)KhSrOzb5wlmKsq5{=B5+QTT&+EWGPI@J`9yU zb$4-~`J0`+)e^)Gp4S9O`cDb0OPh&IJ5hdWqKx-O^HOSh<^{|D5G1MiW9OQ$f4W(5 zm!OZ($YK?;8xK;>of3WZe4ovO1JA=TDpLwt&1Nt-7HzN=j|3WsSNojO_%j7=3*bk+#LTELJh(jVHyG1`kM~W7&i6Bk_U__0>9e>-5SZa1?$UDHxDlsrVS3<)Zj9 zSV7+9DH$RIWXj@~LTdBq@>1Du-Q+myT$vh^6gL=*)yX^^0NmBlYWq*eObbCMTQC&> zo>GBwAiI#4-Y}{70Dh5F;=AZme!IZFj8d3@&<`1(<3L0^R@DvzgW{=nig9mXRd zU1=iZM1Hj3hVBzqFKZa#Plit#az-6V2u$xB1Fk|V6#$wgmeuRYzj?1*D*!9bAk5|f zy|X!_qSOL&iX8o+e~t#Mky(lXKh;33Kz)hj9X|ie3V!MFPHsuNGPMB|ZhCoeP1){ai#KvE^V5a6zxih6G8a4XjcK_spehacMz3vIURBztgExncu2X4QBgK8-^$OMK`ZrkN(!SJ`6^R5DpHM91`qU;A z>%J`w3f05SpPP^{ibNo)FWmyTC1V>>Su_aX*Q%oXIL)i3i7hv4n>3=*gnNk~G0mN8 z%H^YF!HROO6dbk5G<}T#5T%AQ6Gs$yJg zX?s;Y>ICp+uIls+&CVWR`(T!m|S!pN~J@Rw8QDN&2mb|Icowz%WV0S+uSuh?+L91pun;1iAqL_xospyJ+0+ z>7ZtxJPx~=z6m4!TRlH^$|b)ADWtQ>QMiV?QagSnc3 z9KyaG+;z)W?za|*ITDiiC4E3$&AT?`57Uclm1|SATIfZ-R(nR%7@AiLTqql(`?d6i z#@`FS(@Q}1ANx+PXvuiLr&`Zaxwcd{>!?8(lto|!Ef0gWJFA}L!u@|8dQkXEg)G1h zxbc=$oeaS(k9CX@i|iFOU#T!`m%P~OFEF^;&IQ94N%F_>7EC|*(_Xr zO|Ic$WTD}p;0$UJ4i7?e%HBfv&hcDcH2CYAyjP}2F5c;8x=7E$^+w8*L9OfPIS|V3 zT}Llqc-ytijc8*X@Qzy}X$AW4C@_1ow(6a51;ZzVTjWt99D|qZmdT#A&uNTRg_ER% zL^SKP1RpYCs5x1{>B7C?Np0%t9!^UeN|T>@9mj2*v+C-3%$|Vdsctm3UDh9WY#XKK z7JaRw6Lk&uh^lWiOunn(fR%J}6m(PmnQgRy-89l)MyDb$#wBzsLN8#h-9(P5_vSX| z518_|5SaV(nL>G&Wqv;G*B3y%aT(u#PZ90g%-uCpbG%_rHcnEFr>?l{(!2_{{c>{EjQ$rnoft7dI3tJYjFrGDLai5!(wRsB)I4%jA1GsfFD zh@K})cv_p$Ra7;PPyoL)KDPPsFGG^8Raa5Ah8Xh+1>jKiMCqs{anq~-&r!mM0k=71 zYq+#jh`lHgmxktUL9H8N%#~Y6h>b6r&AJxyOLJ@8jx+;}o2Jk@eyEdn+vx`Pn21{J z(%8J@w+41wC$RRxXc%XQmYTSpe%Z>tiE=hyA8-#j_NS~X`I zI>n7wZ==~k8b)4-ey}$tZu(#=#7|^u0!pkUGai=ffWsy?@_WnhZqZwt@TyfvI$ z@S`d*ouy~|@)~7n24(Puf}4S!nZDQT_*S?)Eu-q+wj02%Cl$gef)eKCnjyzxwPRa3 z-Hl!9*w>W!fhISD71xATaZ9pYR#SXuv8MPg)rrc`=9pol*m}^CuQrzYE~QkVY5*IU z%Tu0d-lqJt8Gp*#&uGTorIaelq&jShzHA`m&$RfBrB5vdty3fK-Gl110zGWWtxk&~ z;HamJGyP6duu2(8I+&yYrHf~pQVw&X*EDZaex~%3nvXQ4HlQzADf|aiZ7FxKt#yVC zeJhrO4ZTwO|2IQO0k%Ol?R?zfE2%l((1v2R$k`PAw~+9pVRgA@7D606e5wN`+8Sp| zbxU^&!fCqruYRTsHXWqXj6G$({;LjbfxmEY+7>V^g;Vg1AB;G6i%zMgUsklFYmJs; z=b>REiMjiX&(eP@8%5e%*RBv+%|A0*_e4qiOM59k%^g{G=#;sC4c*EvWr%KM?yFwi z>1AgjTwl_&S?&y)6Bsa=qH6i29uOZIHsQHG_Sj4WQ^h%ZF-vt zk+`4na5B24-A|gfd~O=l_5U(KMAEMiZSM4-tDevNd4IuUWOPNWLLr0HqT!)Zk8b)I zQ$MQQ9n1DWOyBNsu9+K;lg9nV=ojPa&);$k8wn1%L07k-8$EQdnq2_E5zZQGKdrHB zsgg|-CuOm9vg@x(PBfkqclO*!_|-)46h)tZb|H!?_e2P4Dz)ng`L>*f;9=g01~{;B zair&#ED0qtWlHJ$G;IPv-~#~g8Hvm9Uj6QzbZ3ke;1f#N=-)JA#Gg5`JezAR$vvJv z_Jl6<8&A1=!BbY7!g`^vmgA)#w8dtprayEU-OYL>O%EE;OZRb@0Dz)=bF&AsuVQ;) z8#aKtH!Fu; zmw3JDXwq_P$t7BZs)0!W;3(CQC+(B-nvnr|(x#xF~bDRPTbAXB!bHyUoaZLQ@ug_8R)f#uVjF{EtDXjpY4JN*Jy5^Z=| zF89UWvNsj$2X@^{E&Az$9PH-6n5B}_oW1EqKRpN$d7u7>OM4MD?XRDL`YSd7+v~0| z(*~f>33p|RNGL5m0B7>GpPloPHctT#2Un=iMi+vmM4ZufCdv4ZSOD9;4_EvD~aJzFNrJ3#P;Ic#=F zt?UPWoD50GfgG4`aKbGf4yF`Ya$Z`d1+?)INSSQ`IgY?e|I(-(5PPsC>Xg_`h%yrR3F6iNl)t*E>7*ZJEd_WA#y9*j}$N2heJ$-*-`QW!= zd?H{tjItd=Pcs0(tf?O@7oWem<2DVqMRNufUzQUZg`N&k3w~Us{!y4*X|DZ?OH!0O zL6|ow7M~Dp)kf-_arl1&E;tF8zeu{mN*;*5x++(hE)T~@RG_H zTHX7)xOF=Lpg90KfAx!rv2L&VSenXgxkp<@Vfe4<1Rm)fiB<)&`7gA+(ScbZs24wz!#6*nI zaTRTzfTk3Ld<#su2?b+1N@W0wQwCuZ(UxsR`hFrtqpEeI2UZ9*T%!l`_SMo8n(5Bm zLxn>}Cs?`fG>w{sh85-1V=+C(q^24a&#@L1O_Tq`(hiH33gq602TfiSKIDeR)MhT;+n)`)>M zU#+dXMWYYZ?67sv5}*Iq6>@-ru+DfEt0)C>UPnuvX~KEo1+ z$9ZiSxTlOZQ8ScT@d=XDYL|ma!a*mj}o}hhT z#+`hD*m4+}>8-cr4Neh%|05mpp7Fj8}7;34=HW- zryf@zcd@abko6IY46-Z93P0u$Y-Sd5u)dk%ty(w3TIh}h|Y*vR!E&MsJQ}rPg zlzG$+=|(;1IC5ek_eUHcQgzpn>jG%O698a`^G`n%}1i`|VXrEr=I{;#-5mGMIz^43&!czc6ySf>KSesMdf|Et1bLk;_`G zx)hOOFuGifsaj+{M8+yhG_5$!^g<*A)Y>JtPL*Dqt@dcCpM#YMZBfGJzO!S;4Rs&B zKVU7vy-rK8)TRS~10z`@hqvBzqqRutmgW&|$6y{|o|%3P!d>;5_H`S2_O}(IRHeei zNVif+X;-8vGlZ$)Q3_e6m$k(0kz3f{5j|!m$|?`Y2#*I5a+jITz5XsR8G?3bL~huSf8b%;)ErWqHPT| zOWtz`abcQnp!P?tLg={F0U7z5`d6ni2frT8 zVI@ABg5I`LJl9qa)nxi@g;96(VE&i*4Rm^TNE3IaQF1ZdR#ER4eOy4spNzbDSkmLk zr#aq#uL>y-3{?irTyl*DhO4PqG!)Y-Y7vdyp1LsYS~T+N8c~}yz^lViX{5JzJ=Sth z)#^J%3t|VLP6e)CqnFUiAEPU4M8NwUD#=|)E-JBBw**Q z5tQ)WF8aoc2hVpVmq7^*5VF4{o`$W}eVm=VW$ex1!;OEe);c5! zR-;bqU~Si-?fhs$_Un-bca4^;N6P(2DzE|bjEheyZNSPz0(j#M$UBIm6&p}`n~H2i zm9^A&Bias%r|6A(HSL>tdWusA4&THh_DBaUE;;Sp;0!3RN%wLdfOjn8-Ot8U+l0Bd zxFCC<1HqfRtUG@)=RQx2hoxx%4jedA`^|bsOUB#Af(dkYv+ft*mmoJ>g{NJe7XJKt z1k&g^F**pJH%AHY6o;Q$I>@;pjuEAlL{QikkfkI2umuTZ!vM!i;K#A8%N6N4`L+Jcjeqv+!~1U~!8685BCSXQuE4 zanaH2pz3jM1;?Qwb<4UU^>Es|3nQ6A*>_-(fUa(PKvz-Q7ni?+DiV-qE=QJ?*Cbw& ztg0_dy0b3ip-p>=US0vU6XgoJk^FP+Ti-Xmt5_AJYJ(DH_9i(J0<`jd+o8k{jv+Wq z`qHo%!R$PrxEgj#41B%mkO^n!nC4%cLHJ^z?{jWRPPrVu6a5OF zh^Ht3phJF`AKs8IMYsCLzAD;t4Kq>600BOOG`PzP7}A(Im%d z5m|0I7$v-N|Fp}o%jIdY2PnZEE<(tpi(?@5_fckSx$`rMA%!OIao`Jf;>?LOTE zk83&ZQyoXw+?K-kCC`1Fxaiy8pLATt;(#H`+m*XdzI$QB)uwiPp&XQ}kv8syyJQyM z(&|nll5_`pzZczqq_BN@ctE-*kHqP3 zD0T=3V-)79Nt{r8bqG~oP@BWB0aA}-{b7Bi7WkM-AA!88{8)0&fckSL2Ufm|{1xaV zzPjEnf;t>Q&1j+{P@%%F%6Do(*BmGRSonp{)5BPl9HFkigKu*_rLn*3waty6N?|nE zVd%lH#;oP+5qxQv8(c_900adx|ABVJEoU76Uk6Vpl9vx2#p5|`I*xh$_)Ic=taq=A z|Acr|LmNsm>dCb456r72nLZwem@knm(O>ND+9&I{vETr9Gx|ZK1t*h!6w9g(g`Ggl z?Wi(3Fz*Gt8|J69{gi$)y0s%UKNwU8>U-3Rmcl2Du5zso&m}&)->=JFx$MeLVoYLI zr6V`6>0eUYjEcxoaNy#fIJ-pf7rsB8;ZQRDO|6e1=`Q;}Qrx=t(Ea?Ez5aoRAeXqH z4Ih`f!6cHD((IR!`*D~y|0DFH;U}Ql1MwAeCgR}z?l;}Dd$1LvnEWbjI{}5%;XF(1=GGN!4OeZmxQDnx$vJ`N>((^R+X84^{J`R)q19gwHR->hH*q0k^q;vU+axEs&Gt`1lOEi_H>x`=@c!{ym zjcO%e=Ub_JW|~UX{xSI>JJt}^XIAsYSXi=*T=;2jNBgGDP*NUj0L#Or5wo=2NiXX;i%tlz8!TEuFpX8c;73F-UvRmkM zHoas#KuRXn0kw~Z(7aC+kKE{-B+rZ%%$aG%tudpaxY({^d|%V2cwi$9eoMwth#=hM zeD*&%Z$_TQS`hw}PUZ@B_9D4lPsK7aJitX*GJb>mEcy?p>Vlc#?6*F+K(c$_WJZopT<^P(>Mk#|9Vschw!vc zp?_aLHC4j@Zy+eWG`LhD-xaVyy8JF!XXr?I9mSfs#9a1v!;FKZunCk;2w_ff3Aow{ zXW&;#2TH}N5VZ(TaK3T`kJ^-V*iM_?{9@R=i@+Z1_JF+ zM|&ZPrh1ilyZM^qTv(hC?z|IgjuIBQ*=ika>w4`#v}US{H+(5YSE`9Q@0ve#3HVJlwRi5A{~E%%U4-@syBP4+io0u83FH}NZ$mfVESnTK8&#cSpP!SADb ztwL=Uun?Qso$1_7Tp&K(*SVO-`G)d2x4`~iZiPYT|Gv)Jb)HNK_)i7j*G z+rVGk(&rER{-4`Wegj-(^=dQn>@8kt?i{&KWx9=^s&@eXBgNhUK0neMJT$LtisA5V%mzJ(}6$156&L;BE!My zr+?zdjBC&Qpz!kapsWue#y?T9hkBGHyQiE&=Z>o?SNGTrp97YQZ&_sF8s@%K#D)ge z@_JH^N8nefRWgg4Z~Q%}Epi>;W*hX#x*sv$Ly$Zt*ml~fx6_Ix`_{E0QJro*0!_o{ z9Y53@iG4*U@I2q&oL`tc=|o9b_+xp=3&PXW*qluZYiuZe!Y;*}j;2%kRopG^r9rLL zc>;a>2Q7F4_;ge|Qye{ZpfaD3fspZ68hR*FZc9wQxWY7No|-IF9YT4M(DnoX@G>4% z_nq6DdZmsC0AQ1HPjxCI22uYc)S<;mFmBXM)F~gm;1c7dEMxi0pB6DkLtL}ZZ~P8R zbf<5x@cn&CUB*z)r+O!IvD}g~B1cA*9rEBG_7P)v><`NDF7a=k$zT(Afa5&;F%aXn zZKGe!bvs>q1~y0Z>LtJf(uoNv23&_=P<~)|zDkGW!9x~s>VzseL9LRZm68F#L5$56 z3h(zma|xFm7yzy@GOM~lWU-EwlkQEnmiWfd`eb38i0>lEPY#It$YBDc`uqv2W}ELR z{A)<@odny)5E>O9W02n!&|D|c{J*d=zSyBTgHJtx3FP-0QoiC~+YAgW{-_Ir8{(r5 z@?Ldwam0K0dnF&oe~O*DyB`FwL8@Am4}qM3bRtHI*h5j3JzAy4M;~0cGMIOjs$@EK zM^#J4Uk^~cmX-&QU8RCY#^*G|M`bdAPN|JZ5q}zk_WdIxi{cA8#&F}v^(Awgo1u<)hBph#^iXVcVvm1>Z>J4y5H~$D|I#WNe&Rl z<#C$^LxS~NAdXr^$~ckVEKwmKBP^soO+tew=sBtDdmM_N_8RBAR2P~{emaRSq8QmR zVzJ}y_zb&BCxFGa1vo{0c3~YId=KKJ8A3zakjYi0<@lRhFPB@e+>f_rt=p?EAG}h5 zUzwyMkabeKLnTWLgjG@r=jtqd3&d>#UPiYmPa_4z21Ki2;4?vXl(_b{LqU5% z;^dYtPm>;+Vu6^#LZ(EeR8eV0snBKGrjQldLwpuV5Vr@< zBJD|7lm6y(zS58)EXDSu0loPEJ5_#j4slM{YpAt)|&WoBI;mT=I;@cdgjy?-w+v2Jnw4#<>-MhcCTgiAq=qL15+`bIl;w_f8|_b^vtgP?AwJO zlGjQeow)V=;fQ*xTj4i{ZtnCO*~RVqT30*aH=B8@y0)0qv1X_x_8(b3C~njHkpmwD zoW^gS$RXV?RJ+;9&!rIVLgZzz^J$Tzvz|M3xkWcqaV;VipcDq)V(iH?KJc6MW+=@`=a&F~ZHmi4bmE6cRv#WPZ nY&o~SCg;+XBEI=?Wq=%GWeDIPfU(2e;m8?`R(JFDX3U!Gg=(R-8f8U^~ibK}sK z@fHs+nf5}{bf3KsiGTHJdfeUz9hUWZ5bO~I<+p+%_~U0mK!Nhlz=q)DFM?oqun?>V zHcG#^ce1SE7E7%KD)zUpf}lRQ(c|e~2SF2fL1})fC^f3!ICuki65JC!_XXo0eiH<{ z!ABk5ZbotOgy5O27Jm+?`iP%gIH90qG2G|NFD@$XTS7uXsPwpajTCKh>;d>Z0w|+$2z)obW>sGzAX<>w^t`41#^Yp>TEQ zNRORCb!Q;u4gs5jlH&QFgCG|??Ux|f7wn(z*1Y90cM{tY*5bDyXaNp~OSOfdR6VW~ zH8DcR`S>wK#UoQirNPzky-1%9?hf`$S2S;0w&ABBXb#(tHV*;^qDtku`46k@8&I-r z1~s7F!N%a#U|n$Ezk*y z3dkSwPQgua3QFH4C}<4QX0Y4yXhd(4emuE#X-YVB5E{xVRu@cte# zXOV69bmi-oKTCuXrllL_G~In`1518qFKcc?gLL|@C< z6TdHoOH!lTmFABfwcW>m2FgZ$$uVi$qdN`p#rvAlo5CgCw&%iBtZ@TctFeS;;(0AJsy zB@???#V3Q3G^2@+5I{DtGZ_o^2QTevJ^db31wZU>4fO727W+R9$%E9>n*3LT66_RE zL!LY!R_1z;rXn>Ikf0v-+0VxM_7}}9X7{uLO-YxAR*+wsNP+6vtG!IsOW+!U^FgV; zJ9seI%IDibz2a*@}GP!cElTMyd7WlVd4Y9Ih*J746Q zAm0u!4ZaVmfzSJy!0nH={QH0^|040St%@?Ap&V30=Xm}e6{>-ff(eDw7}KARu~~6> z+FWvB>BwSSZ}2(sauy?wvkn~R@ipSLpp+hOnjH>ms8fS%=uY(5tRDfl41+SlE^%|h zN2RytHZALNg7t4-P~x0@qUCx3)Cf+QTv&t@!Pt|m+O?pX9bH_)Vw^vA%n%d%72-8_ zYMpF)8V;9f4gjUUZlGGPM?2EbZ-X7yEkCBatr*?YH|}?Ev-oM|Og{3xeg&@HUy=S` zzounR66-1*77Gp}_H$4U_Y+Xd-lXA%6N-waOX&RKiK9mrPYVtrU4vB@lwRs^Syp*{VFbc!Cq?mUQZXmM4{tGch-e zx1l<3Y+?RbwD&GtPT-3ov#gb%wDBq^6WBVz;wP09=eH{=9`h{urIbg~9~{uM>=J}f z?kN)sM;8{13NmdEn`BBj5tJ$?mlRJKLvvF{7Zw%J>NV$@&np9^%8@BEz~75)tQwWt z80{=EX+H&}#L=lK+NuN?=7iK_-2P`2kVSqx+3@lyrlrnPZN@GKC14hK7+6ZWjNoI+ z$x_dO%Th0xW`djuSNHaqZVmQ@%NS>zS2$VvnnH)AmJer0oh&=c2}pp!pse&hP*dS@ zuoXBKl=Ynss^TL-_4w48CctQ4;ZTpqfNJpE3r%yq;977ec|52db@O=HMaItqC3(Axji=xed=My&bn|%8CD!wupnT{Lm!#i1sD0VRmzg=o zK@}Sd%G$bt>hEBmzBecj_|2uZ27Cz0V|{a#4a{4h(jW3X0<~6@d&~#58oow34bb#! zogT`{SIja+v_ei*Sl`RLop=ed4wPVrcs-;_CzljX923-qOFw(xV3u$*sC=_P_4_G&9h%XDf(+r1>PrvRkdjV8>X=zCz(ZS?Yi6F?7Q+qRt3e&}{b93Lg%Oo3F(i511KV3YWFL43`Y!;Tr7x2hA9! zOdMSx$8ZYqGUNWBv^i(7;Q{bgL6Ba3=wW5kA2rFo0;Q=*hFwVFB_H!oLR^P+<>66+vZPwG*-4K09$7j7@uI04!thO!7 z?tRI$^zw_Q+1{XfebvjBs~udjzl8I)#P8#XT=>2~WuFz0m>$qAl+1y}y$J66wHxbpQQUES#lN}TqfjAaT}B>G(SuB*R!`IHj3 z!wimi&k7z2sz8(U_I6Fn{@F}M+>Dqbb>+e*GcR&Kux7LaES$(Jr&(#G5%JPq0#xk} zeQ09;35t&|oH(jo@#rA4@E`RbSFWu59x})a?p$FNzq-;2%mo#n(c8d}Ed53w|Fq9{ zx98JVnLZwbOFx{;Y%B=_C>V=LGNRD%c7BjGN%6xzb`$;ItT3dR&n zD_>*rsge?ADgJ5NWM@)EYfTd`g0jDnC8_*^(jYj0oyD*4I02M^Bf)yalNnR;Q+Qzw)_PZ%yCT z>9n!~s6?VQ0wwCRzO%!2nuuA%OWU>nFwu7suSWBW)kF{+4_A8DpJt0Y(4HEd4R^En zubA7a#Dcin9e=PZ7IY;2Ua(CNl$Dne&`En3sKdzN9(Mx|gm0k&;TvEsxX@R4EvPNY zw=|?llG)8pPnC>et^{8t;;v(>K?(8(DBa(7o1I;j!|MlGI%e!Ry!VkYRs_wZUzeEt z--7CAFOP}3ao4ZXu?0m%<4S{BaHW?No}gW9!9TE&r)+si&r&>fExd zF?C3{lM70mgP*ut-0^)H#@zsC)`80x*bUj(RB5}>MX5169x>U6vxzGAiJh4C*;OU`999H*i@=6V_-kY9%M6a?>s6w_ivAA8n{PM3&tg7M? zEv`7@rY72hRIPj~$S(^WH;KOUSq@j1Mwhn3Yn7zF-aGEhAme!MCS9AFg3_WwZ5W?w z9(SX7CrEr*`LzV(6lQoF2Ws{W_qeKs34|UdPv+QHQaFJNMy{+%3MXqB8B9J2^w(7D z`)@fWKwlr<#bce8HWC@LZ%cgLAP?o06ptw>C@n3Vcd8c%kJiF|M{k`hxr@C?efpKSrxd)lvE?9)FXzw|u?)DWKq%DRvCc!b55mG479JD87Y(5;%FD!P*fR6!Q$a>C!jCBQ~d z`Ec59?RgKb{Dq~gKB?)!lW=Vw3OiW*E1(AW0pc~kZvi#0&vW@$?8XpK56%EJ5XXaR zpf{)jM}R8O5>&<6pn9^y3*6;!n<`(z)zg1Q@*H zqNxSJKqAy&7f=-)0%|7jBT2C$mHB@&WVClbs;?uiYxz(Tq9n{VE*z_^oT6Wvn z-MaNgKmU}5W0G1ql3eQcU8Jj9>){gjr5@JpC({+(nwI@@`2RTy4^T=<`ahY)YvfZa z8Ko_QYxFYab|})R&!dX-btEm=MBh+WS^1j;RB(w!l+VCk)yW_FTKw7l%pOPi_@4dU z{4DPXN~wDfFs2ebM(b1a#8{}}uL z;wP7K<5q9PCOU{J_Ggw?;IH~(-K?WFW-h>GpLpJ zMNmE1vmoxSU$%^jyL^umFTv2zxY98N6X(D+6xV|qikZIRZ_bFjOZq^!=+O@=MHar9B&Tk&5E8sGZBSDRQ2+9}-c-|3I zL$_db(!}8OjlEiy9d?;n*i2APa3XsG?GuE|?clr1Z4Q3qaXF~Ty8x6=zsBPfP$qsh zsHt%rC=)Mb4W6WWuCd;{4@&w+K%_4#pG`pGPxd$zl=yj|ZnRr^On`C*+pe~TSAlBq z1yBtx@^~|-ZkBs20wu`l9{YPd9Biyj{wCAI3{YB|d9y7Vo#=-ai-SD2 z05zlb05!!Y6_-xt>Yqz09@b3f#GP*3XH0BxdU~IhWw+jDv$YJA&UB1!*QIkX+VjDn zbeOs8`{(s?=Gr-PU!J*~%v?_|n`e&rE{~b}a({oGZhB<1vaxrXI$Gal{o2Q4V^ICr z2}*{{1?s4RsYS&M*bUUF#WHhuzuyAmFN4}EJON5CB?Xh6rQCRr+0Uh*;#=SAJW^Tt zH3Zc85>VrJ#(lOtmC=BFU-m*1@F(ImPQ}E_5VP;M^vum{=B7GxwVb*9&s;HQ9s*<@ z4!lHp_vkmDfO?X-68?0qX(B~K8tF+Tg{2cP`OH;t=BoFfSKXP12bqTjKU`wRjDOyJ z|Lv~3j0XN+FS|2OC59rfhU~kgrlHJJjm%SukBQfe_~vo*RBwT0S}hh6(3H9YlS|B#2cPv z8PiUobZp`HLY%;J&zTK80;<6hP{!Bxc{8f!FBlekbPGP^>cf>kBEM|uDo|UT?o1#F zdXUFc>)C|JJoVV~Hk_-*K28SVyqB$Dej)c(ql<%4r5q3VY@ch!cKoq+4$qu4R}(L5 zcF)7wO`5RuRTE@V;b`VM5B=a0=u{tHj#SE@xfeN(t-M>9-=QKc&@Xyy^@fe%?x1@1 zWcq{tO`FYn)11m=Q2m?KuBdPVS0~q{V*?J3ose!l;NT6Rw);fpSRx zJ~zm0eqzMSYBI;etI{_PXxc4vAO1g_JA*MROs=WOEBStctM;+!$^k9QKKQ`KEw<9? z{^CDo2$gU>)OZclZs2K9>R3s-)PL$KlYJ6iV{&0Z$@G*xglxFl>iL~?`R=1XwlyJB z&s%Uwv5|D@Eh}HM#wz}h2r23T8fXosK^fGs>&#;FKzXZ~#A}fl?*%y>lwo#UZw+1t z%IUNKWl)*=3nol(2J+Ab8|OLTUb-&~$*2mJZ?uN)1=YaOR4lLd>L#=F?r;gXKd7mb z=~<>nJ3h1qU)XHr8jw%*WHgcKVE(6;{vG-2b|%9`pIOBliIC*7Mh!C$QYIH+oyUG| z>D9x&v`mBGn)qAxO^ka3kb-S{6T{Bbe?MA^P|r=d#hEbrLs%s!cmvQ zW!;%K81D1=R&2A1_xRQoBdIyJSB7cEMsO(^Q5&EqG3SqDl})1 z_CKGh{!dR+Gta#ea>X2sJ#Y zZk7{ZAO+nJP*6iMreJbA9@Ye1(63aMu4no3set`*`Hfz{r|Vk-(^FGs6d^#52F4Fh ze{fvWvV(WCQX^9(1?`xr4o8;;tB98vO{qn#{*|z9FKd|PEU8u_Q%B}RyZ|m~Cye5O zxw?tkB-IU#E#EXy{`Q#Nvz$S^1d?7>KAHq&yl9Usw?GzwGC}S~RZnmf7NLTfCjkH1 z(*%1Rl%D5#M{`sY6SOO+@o59f~A~%tu&;u`KP4+(+MCmmY-5iLpb128~c@T4drUM>g(9X;+GPy4!j7e zWu^zF_(b_X&y}|*Xav4o}ohbK} zSl4XWsjyg7**lgDe}VRghUwhrlVSJIf}jhmmZ}OT!TQ1Kr&EiQ;bXAFV0F{E4<^GV zp9k&=CCjm6VQPX(bEvce+8vr@bRBeHHQoOUCI&Q-u2_)Fz6^FeEIO<#(J_6)yzKBp zVst%JE2`WW>ssea%N=bWTid0_3Zgk@$9jji`h*~=oE`6)4U+^}>B?u5v9{5$b7H*{ zBfbiPj_DB(=f&nlYlsN<-C~sm>D&jBiBYg#>72!RvAd!lzIk zqplJsK@;iJie&gcOyz2&E9WI+cSOy`qQcGFqv2y?y<(R{b4361L$nr}IONA5I6cbQ zCzcm0kA@Xe*L%baqI8{f#q-HT$Di=+(Y)rdyhIVf5|=gc8^Ny8`mw}r`Z)+jS?uIr zSZbpY6JkAT5jx713itliOb*c=PKHBZUQe(qV4Z2Ib~^X|WMVn&9ILeJZ$U8JRT`iD zTQqz^tamM9`kEX$JA$B7di{dD#0iA@xNPC|1f_v`>B={g;p;G2ay(smUovd)yIFGF z4M1WTl!=J&u_&4|kuI+!rjyH_x;L4qy)y_-vmTvEaH7fa*3M{dG5WhFT2oAsU;eNm zriDL}iOzr0$tdUbSdVN%nj^K-l?#*MgRmZsVO_B`Y}+V{e#dUBh&0Q8IQxG-o=pKTf2~1P6Q= zo+^x)b4lY)!m)K@!8xw=)T8mPwP0sqe(@gJ^{f#yrtm7Ls)$9YEwQe(V5eEO`bevI z%)Vu8rV)1vS!&&! zOODkrb;m7MiM^UoceMTjOzb3ry`-)l*@TX@78WKGYm`L>7w*;6dK{!H)+fUeFbxi~ zVOKJ-7}iy};-5E-)?R|Ho9`V9PKwrFLe=95o?yYJ2@bMgon}?RQwSbsv3C$W#)4lF z9N>asyXL5!#+VVGSR_q}|%iQd+jOc~CpbJpbV+mYCYB=@~>w;gpUxI2>J#F3E%+u5JpqjM|1HNGuOg8Tm4>{B) zn%|iS9g@!3l^3ofB#WmMEBC-Qf2;BqsMNs@ZDBHd6HK-mHQw8Ao;tU!8hHxe4jWrl zRjqcuDp&CknEV53el{7-hn=pRQR-^UzFqrRaAq~V66!=xS3b-Zp?x%WHtHVU!DKD*GJayP(b{ieV=@lX;$yEZpTv#JadK#guL!G|I(Ob@op% zDaQ?4bmE#=n4QejSNS!A0n>EyJ=?cyEErQo6Z4^13bn?%Wt!p#(xt4k+5j@p` z>j|D@8QS-b1!r6ET7o`y1Hod89n{AalX!O#^s$YPtSUB%-~=aX_#MGM8TBMO^hLE+ z$t~5vKMCer&)WBo1*Mjug5c2>`xQaNpzC3`0oF-VcNt8^>{uc^Di#cNg~M|Q%IYlP zX&Aki>W(_Psz(t)-@pcfh1TrR1FP~bB#2zC(`VL$nY@2lqFlIx-X&X znFm2BQwShGcjiOii#V{?4HiHUL)3xsc;d zh`EhA4KBt6VRBGenvRLLVMlA*67GJYEns%^91rs?V`R_6j&ZeD{+NtqM{^d@$LS}r zToOsO9q7jvsM|}q{ac42=5SaXImMJja~@y~c!bDP(jy+v3->+Q9HH0245;K~Q&o$q zo`;@nHOoireoB=rI)uRbk?7=%_Ff$8pKu!>Ely#pQ!T4IiH7IE9BDu%#RexxlC!%`g=L_pBBx1nC(Q)P!`c>-osevSp+rB zSu(bAR)Cp%NZ|s$g4xcC;ZKYkh6_l~+nSdMhO;A&Mts8VhLCcgpGC=Vx@We6KL+ba z8lz5KpQ?=Id^nkCb_TB74o%Yu>L9>jg(}WIlj*KPZkJjMc1|>6COh5{8S~BOi4 zhW*X1*%0Msn7K4r4U@jmCHAq$$eJc_GVDy!a1akB6A#0N*dg_}dZ1D_tLe(Kp+lACA*92iyQ)egCX&nTSEA{Cxqn|$J`r13>63cQ(!8H z3wtaXUIUXU+AUeLNw$ZiF;0^OFe%8oau3W;uXVIg&A2|{knU{LR^LIePLyN#IRf7g z8wq0@L3{N|GMftR)CR$%b5?ZJGZQu%X2W(sDRao3@+K2vlYqN?jnL^Xht~XkCtEx5 zsG^dI1JnHAED&cy1@k6=2ENU(sIo2R$0^KHSKld9ZBNOzo%Y{@xm{$Gs>cwV7vt3s zwYq@NiPX$2pw*vX(nD5M(VltOep+Tvn_C+pU{bt0Vuf$RY?~l;wwZ3i;|fvB#jyTX zDR%NYOv0l;?zDEoP0Oq&mccBN^SgNWO zrG7!Y3rxcp%_?Ii9@8OvkC`TV_5M3WjGG{GMIm0t3B~fpHt|cb^oZy3674ReBk3I6 z+6+Rb8MnqRg=!|)b}e0&8C>aN2W*t}7m-Jlo5=K@<>XNc1&^u#tomiL$|W5GCA>M=s6xl-X(<||@R zWkZJXYCBkP1w(}+jCSbbN6hHQQ^J^y09k4Fx^*`o?9}&_X zqHdHr5~**nolkvt-}nGbHQ+L^j$JT~j%y}7;YKrWCfr)e!E~ao8&zJza40RBw=Zk^ zY_Ah1TJ5xYrkk(J2+7hIrF)ZMotrYURWRXCg6VdSO+6F)DwtL+a?-gkU}w1+M&0b4 zL{vGN3I7hXNZF#wLzrK;m~}9zx8hAK9vg&yha4Ow^ncvlfKk`-+ z-aGT#pmKA}2WH2QFjZ_4E| zg;cw#0e58fB`hh4i(&oUxV`SWrdH4vmJwFi zm(A-sJLwM7Ot)K{u`r*LvAP##iz{}Vy}`5U4ONr7yyESmlSg3Nj>M>q%OPRjly z1eLcnTWfufU-F}r_M)D}E$jVI$;d`$nM;#Zn02+h*M{2W@2N1Sg{Wc#Lk*L@67J}{ z5hf{_K01i)f1foNk1Ccy^Py^jr50^2hAFSH?J%t;Ha`zuNE_*#=kpS06Y8W;?8a!$ zH?gw#s)bSWt=Qk{`!j|iE8lC8Rc#H&PKwrS#d2>T*4#F0VEnm7(eQ1Q-1h-HEz)tO zJRA5m+sM0uSf{F}VvHUmeM{V|2QxboU97Kxbc41iXkeL-5Y90<89nJZkQ^F-n*sP^s$cQ%<7U zWpl=}oD4%2g4n|a^Bbb@XerM5A|-JUdE>=or+ zNmiI9qW64{K}`$^^$ScTt;NHhvh%75JQb#cu%&JAX=WSyKaD<|4@ePmD~YqV#1bf* zgAIA{U!RWV{>n%vpRwh{`h6?Rypk4+%`mwHGym8j(VX8H%i`r3GtB)a8Quevshf$e zhw1EVLhb%+4J~G$4b!x(b_Qu;T;JVg!h0}T7sqj)ab!Pd)|!ZN&u1dSswdlJFdf`| z*I}B^wuf!|yxn+PS|O}jfeT=2&rj!7P`5v`nOOgYnwltuo$2zX-bWhP5E%E)d$N^y z(Qi}2{}7UW(R+p~`I1#=3)KXe%mtIseZnJ9&1_EF>=CxYtf=Df{W@=b4m?s)Pp%uG%0 zEb*2%7pKo+n6?wn{=;Wr+D+MPX!y2P#CbgYJ(E!Pbk6*|@D|0X9lLXYndwz5LqYFk zTGiI%8klmLR>KugKOXFN8oldP?ly6QVb=BBd$_NM$+MzoR-LzC63`Z>u-|*uYr9J* zg{ch=s62Ig0@lmP`!gYqfXI8|`<92(u7f;VKX=&ze{H+zy+`92zVVe&!)#bj-mQu{^cJC&n8EZ3ZHB2>m^UC=Uqta0! z979NUM-yybo`Ff1FeJ_Xk57v#?q?doG~>*)uZC$-Q{lDr;#H_gDt*;kX^Gfu4h3O0 zc{KDZVAX~m?)H&orA3ZuLtuUf!rjYNupUv)X7>3YGOdx8TH4ve zygpR-s~PHyKU|Y(N&1N9>>lr(xQe*0ZtL?>CRKT}|5E(l#OSityE=EgJ|AX&JvE$W zVW+tcO7HF0*_dNXTTvg3Q!e|njS7(qYvyop;3p_Wd#gktA@>A2`#wU_MOEh$-@9BY z-Fbaxf~7XnB20eRPpKtP={p|f*1}+6HhvoF)*Eb`IHz*9D}k}o!R8haGGnZek;7zj z-Za~8lwRaqMiG)s__JpiSXd1Oul*a%+H+GZz0ZR^!@-+OS7y$az)U!|U3&#;-YUg( z`U&P_wbiw4rL;nS6IT)%?hdV=66zVPf1f+i%{AAT%`l1VJ$d_2O;FrCgD?)JiD$d- z`7mdl?#biFK8;C<{s8QO-PHP8?Nl^&ubV&bVGS8tVIl>-kX=W zgwR0u1nOf#uB*=A_Wr``p0gpRiZfw-ogvIu$knVJ>Q>%Xb-P}Sf~h_~ z%nP7WojHb;FjZq+Z1PoR+oN0MVKCVTZh|JRhUvg-%g)9sraj!yEt%Czq{Q#?8 z``dkOb-E3@9+>PG?;Soxq#OxH(t(&I%=TWYtlu}LbrWJHOzRTcr1z5H(=b~JCBz9^ zZMSCvE`S|Q&W3KZuHWWYBHKvUiRK(YyQh9@y0sgEIWX2pUgLR}kd(s7hNYPew9~C^ zS7N6|YYwFBCB$m^c56kr5++Mwlqiw?eU-6J$J}8W8*={0{SQp)XJy^M?K!M1jF%;J znf^7@PMnxuR;TUEgjKz=x7$Xeh+h= z#u;muAFX@bps`(<29tO^;Ky{9!ZhX_D!)jEU%*t0GvDx_pE52%_HY)=ynpHj1`Xzx zdYgi^f0jF1|3Y5aUm>b+(#IA@Yudzn$N%^_YTlL=uizK!uPp|PVP=_{QtM%+Hr;46 z`_&jjMek09IS=Ai)9Yb!_pG!BBZ+66D*tE;p4Db zVo`3}ID73_JUFkKJ_IeUraAF=Frk`W1)V6Wn&Q93qqRrGd-3jRvo0ugMONIs8{jKG zyjI*@*ITPM!-iH@wAE9m!|Z;ExU+_;6)&7gj7|RBbzQR|Lnv$WH*rGkI2$IdhI0tn ztkA2M8)5QqySp8Jt2%LK`K-Szf9GVF?HBHZx=CX6L#V9L&7eg6>^NI$-qcC-AjHiF zS0a-L*^yPFd_PR~%99V~*hZKt!@;fOMYg!x<**Cq#lKTwJ<>Vf<|S?<)LpL7w zu|nwm<&99;bGECvX?@d#TQ9PQ!jx96>+6Z>PYiA-#e9R=%#_}mG%yW2=glSEu-**x zokYsJ#-!T#<_6K)-bl1BKaV1R%0y%L7{Sb+rWPf$-}Y&)(Wud*yxY;xzV6PlMc+rk zv<~d;JnY>t3B+)a_9aXLdoS6tQQTc=V%o3q;2h>o1A0suf4NaKyl=c$Vh?^b<#@N< zpFv0}#!oPL9*3DXl&AcqDoxFF+T9v8BMYZO-4I8)U$FwfB!gRL!p~q*k#nlq`|e>) zR4a72kKu+e#vFz9apt;;&}kCJtgh{zaW`ej);pd|oCodW_GC{Gva!Xy5?f%rgvNT& zZ7&m%`!CkjnK1cf)}aN-*fUYHqZyh%iBx|X8eU90wh2}n&HI&CBQ7S$_VR(e@I^xE z8AHmcEY`G2L0pmcgz2b-<6-wS6{Z$Af%4kaQqTN2`~a0MS%Y|yuhZVl85jn573zY? z6c{4}eH13;@iskr{uSno$CS{mnf299t>a0ilAJ9PidKw_%lSum-S&Dk5ta4yWxNvvZnOeR;yb$0IqGRBGJ#7>FU zoI(emKG0?nrpD<`-)cCO*jo-UO}Jf3_y=qV)!2?}R%<#O<;>ADgQtEk5~|wwBzD2L1mfZ3aczA2Zg*c%#pEu3g~=UZDL0~^wsCt7 z6ji)w%uZVF0Q5PD)~s~Wp`C9ms^FnQE!gSqvgcJoz9U~J!=~*sos=nzfH|iWRXjuW zFjrqxvBa1gDfgv>y*kAG-p*}OXF!z|>!#_CVVbNA+`XJUI-2$30oVtRgL!xII`1p` zTFek(+UYv8O!PgBQH8v{6r74a1^1`fnq2O0+)CF0Na~ep2&z7pGe^Hy^3GcK6QJ zl^Y9VXTVM1Q-r*y;nK8jp4XhyN#aDPyH5zOBjk+I?S$6CG~aCcgw1D>1DLPEBd zGQ#2GFtadf&ibKOTvrE)w!Jkw^~%I#LRHfw>$%>R{u{CG33g&|A6bZU&L-rn+VwyF zNuQ|sI5wyIM8n46AI>?_dr_p};u&_j)BX2^_$mY=cT`{7Sm3F-k(dvYkuq}3gRozf zk?KZiEY$m0-1S{BJ*40Ts&h!Zpnql!lQFJ>xiPYHYsaYB1TLJe9DpUbF1MxyeyMU(dkReD zV^K;^NML&7jA_r?JK4ur&a9~70UphFhn|(5#~b>$5*n#O?w$PKVMjRqb~x6$iN*hi zmyltaw)TEXo#Sll%@cX<-=a0=(#QJ8$Muz>bK|^5MNl^9HhYN&VZ3yugt~)l31KJo z7FWA4Dbh?c(Q+_NSiUI)<<2;-&A>gv&Pb0~mlw7@A*1@riJWC-K{YOR7nFDg%C#O# z-d}{|%bD$Li+Y@>8KifjrV^S&yloG^fQ^H(QD$c}^&~s`pnUB5QyAZXsmu#|46(ZW zh11ng9nVtu!56mzvMgeq&TsPYYl8>Zo|=eAuvPqQJgcNAyBR=keRhY~VG&HK;Iz&rZviYH#`Aw%WSucsye@PS{Ro*f ziAsW#?UlY$$Hs%(Ex4WFO%}YgFdoddVAFB&;3^ANR0rFPj|W#+>|+G|tAgE%s)ElG zyu>mTPM{;v`b$v=A^Wyov(XddK?PFQ3EcnEgunJVHd<01KR8jRIL`TM{fu~C;&Or) zT1|;bRl$p^gRyht!3CCKCczmN{FUG|3l^84W($5^70f!LG;Z%YzF4Yc_ie!BfjL< zy4YfRVj)QrmNEG(>tzH_PLJ4>msnFBd1SfLN0jr@C>E=iM#F})GLv6h{@F0yd$?0( zVi#Am84ba}5_{n=X#lUW0o+knhjLdpEo7l6Y{o>f;mR zzuF4$xgt9E+W5ioy)KQKU&g`p(o1m@(Y*Y4o(^=^#mmC@W%grg%;~Fs0T;J zvHDt=rg8ejc^#t@ua6H5Hxr}pBR6#Zzvv3PbTRgFhPk&Av#&JQX=%kU-Dw$n>2GYW ztKz{)RcWJPax0c|8BEtsj>Up#&5f8v<7?x=823iSG(!0u+Q}6%b^rq~KEoc^g>4dN;EDvfvrj!3PKqw%8rj z!J}v6Y%Mlj9o$$QY?H=|x(s1CL3ad*atGp2J&Q*b#q6+QI>j&&d~db;O^i!=-m1LB z6@=K3@Tl<}LMn}C<0w`4W?Q|3DAkRDJPN7{KN5KyJ zyTx{0?9(4j#%_t$%!!x9KfNUyJ{Q;AIm(>4d6kFn8Lyd(4Za#h&2Pi1;lTX5nS=T*ID;VHrXV)Heoi#^_V|UdPEoUY@#j_PJO=lv+v5H^$6?Ox zey0;vEI=VJEpdKhxfm*|VFs~*`U@tjaR=P&H|E*FsOk-d>;vYTCA*lY(V}>mP0Z<( z;PB6y@d`}aD8J~|zQguO><1!RhH0~8LS&)6wF zmdt)0rcIptLdwmJVqu-Tt)JDcjweRvYC87~n;lqZw*gy4Nc(tpY)uegf#s^_PI%*C zN^?td_J=TS1YDg_qwmn>J*F`0_en5y#kLsPyv*R-NR@oo0rsX7qqB?f#>Du&$fZyXj;E{tPFp`<`nR3RESRM5c|U;4 zY}pI5$7%IoW&qrFs|Z>{;^ol()kTBFHo+OiLPiT_7qlt8>seJ@P=!Kz^kHxZ*zap_@?M{J__-rWFo ziB|PiXpJr0X-jM$>N7tG)o@!)wIBVP7^9&zimv#3YRAX^R?}sFr=LJI?W~>bUQ11@ zX1gc$h=+BEaZ{%1J@sA0$T+;h1}^j6a*vj7hxrM=7wUs)H|@=;@e}NZTrap$N?ZyX z7p;GYgEt`)LI;@aC+(`yY~p3u*i4zQ%~Nd6s@UBy4Z5#>+|!wAoQ1pttzk`vKI1bx z$21XEVH!v1D40#R~Ss)_rPS)O#QRtUF$sSRh0SWNcPFZI2C1n4J^w4N8CMU{9j;Fl3y9Rzi9K(s=o&2&M;1p*I?2Zt14f(Y4Q>*n)eIW z5rpK?xHDwAd>f|D*#%aEm(3k8)5dWK91hjo;+)D5FM{=T?sF?4txtB-yx%K!r^5N3 zCuBoluEMC|Tn@uGLAi?OQeh<_P0hU|PxfA~5)U)mZ1gE=Bu2}CAODx2>M18k{6+28 ztPMKD64nK#8z=4tJ0Rwb&}yZ`KYA@{{u~Q=)7PyD9t!XdM=h9L;@nI~Pe`cw!(?Km zi`SRQJHBDQ+v|23w7S-CIn;;oPY|Xj~rku5-id(rKfpKleH`;5z zWw}^bxSs6+a~mQzJTsIQjTpxC@wpOFDjx3|e~Vih9-uaV+qN+cqTGF%R4^&ezDRr< zOiPeA_xGVP7!#)DJ0^@j0uO_#Bu^62>SCBognKv+#DBu1m%2J;XZLv5uTq(r5zZh+ z{qh5}6zUC=%lj{UV%4`p!&dK^>1VkiI}_HP!bpWR&Vgb2?CdrYk{bMmBj^2^5>0?< z2)sXA0(DcfN~CQ*18-#Vb&5JGOub=UhL6b)<<^s zVbOae8JiRhdy4|^6R8KFZ0GofYW6CdazRw7H*se{wb#Q4xrT`~i-x^Tk&{+iyLeGt z%q*DnKpRVv*+0XyCRg=3EciI?z5$7gdyFbShU&oNX>yGz)oc8Gs03y+!TR|*O!mQy zzdy-|YtFm0K4xt^IG;!_;%2DcGWK-zI&;2EC#J${FnJd|5)-xlCw4OOStmfX+wk;h zsNA8a1J>J8WY#zzCTm1>ukZqvC9&t?8}RaxxC*b?8ay^}O)3 z_eKi2ZzJ)7mwTbqE|5Nk4OO#l9(LGd$1YUMjF{n>7ilB(OtLa%c@UddX|B!o;WJ^j zBBhR}-FKk{(TKOWitDu5G|V&OC0(;2+N{MRWeY#>X`b%&soz9f>SU=Lrue`)Pk?}jcRMkN?$-Yb0xCI`r1&F5u?FQd61>yqm$ zYu{b_g)^&|EaL%~q;U>CzWu9c?ixxQw#8-}j{RsJNX?3xt>v8b7O{3Qz1!C|b8AJF zQ}v4(r1HX)k8@x7%K65eIOhC9GBFEws(VzsijW_MF^pELt^9C$I_LGga1bHqt=+@d zyI^*kr`yD@VOo;R|HSr-nysh7;oCCjO&!N>_Kfd7ai5*N2CC|+cjGzVnl@`i6}p!8 zjMW#tJr2{$%yD<}_!B0N>XzHE!*^B3BAoLWSO?Phtu%ff>G1C<=N6T#2uWZ>Jb>C^ z+MM{g-F~|b8y-Gr`Z2P`cu4mnBOL*FEO^5H25)Y z-obXcgP_Xp7la$3a*hn?a~u|7G7#tfv+Mq3Vpcn;A;d^gD1wKa*TB>c6P#VnT9~|$ z-LN+Qxhf|f>J*ssP$t7onM7`4vbxrRNrTlL2!64}(QBkLw94$VXTa2I)nFx-6T>cn zXOq7ZlENFfb`q_BWfa}}D+Pqq&20C^%FQsZe?87v57k<-M^w21deLw3pb%;=!|#B} z@jKfL@7!Vjqqg&u-@|NhWO&_ww`#&D^%0{A(}|R~aZtc&nC^+P+ySoLPE#}P3lB9O zCa1}(sr(qxGcfJAc)-m%@dr#@uj*{r_Ycd>))Ln@3#Pa3u|CfFufgO4%&f!spXT#% zCA@N01XIO$YA)&*!~1Jic1R+L*DPi8&0D;}-e8t3gXeqUZ**uJJP0Vc_8mfQ~;E@tMC70U`nR?`CL zXsAu#@NMWQQMZ@w5YO^1!JROsL)D7U`w>*@Vpde~C37b$%O6~{3%?DfdVHh1pheYm ze66gS)8b*MTPIwPcfmB4Obd43$MM6VlAe`JucE`$vnFos=ZC|xoH~#e2e1sL$%c#l zg750WG`ldK?On6^(Noz@c2uzxQDK?`)Tx)!c0e^>P-;ICv#kjh7+&+5;u%hyXE{q? z9o<&F(#K=A7+em&nJUAhNcnPO#p(kKwmuoqnw3bf}sP z(y7P!HYM!u4!04%gR0J0U4voHle@yP>!LY-p`4-o*s2VGJlIzSOqLB}N_-BJrmXzI z{O+u3W0fH1H86FM?mm!=f8X@x=2^XBhu%Cat9N+T-ljBuxPi%XD@@wAiM|159z!tWzkSRBU?sfTausZvdzm8M z!i2Y$j)IM(U2}{JVZ3g}i!r|uI>*J!s!z``30$u5A((uWdAB|HwNays?DR`uy1m}b z&4&A6c9ExAzK6M4@BDRle$Q3|YV+VSn3QPi&PT8zj>&l++{z^OuZh8=8}rro!K7dt zm|ZXpHEHY-2j$u%#^t=ryG=GtZ1GwS8%0KQo!OoCGg+!un#6^~@cck8LlBbG-pe-G zzoyvJV6r@)_zqNt0X?4C&+pR8k7CbU+MgfcdU}Vy5oz6)i2V;VmWV1}qyS7tV4Yb7 z)8ZS8D(}P(9%S;{Yn}aIazVDFTn&@WX4wxiz%=olJtkrYV~@_m^(Le_V*@`2rp3eB z`WdDg%!wUwh-rtG*&-z7KzXBbNnY0Hhv0!8=$Yuyn(>L&pU!hPLRbv`<^w`<0yqrD ztlpu<*jjN#elkpxA{OQ9`Nxe=^^{?4NrsRCQl^E>yX#o(n_x&z}Dm=-U6U3P`XWzG9&S z*$FD@FaAi-T|Pdh%zXY0l`rno(+Up!l1h#{7LypPDFvSNQmULv`Ro(uFHQ<^Ra% z2VMIvLJ6yUhSi|*tn(R#5}?v^p#=K^RJkufHL%5}3l;yhkKgL~HqXBU8A1zdUDNyo^@$o{nHx5*F<3Tl7466LOKE4Fh=igA}r;sk3 z=JSDNuEOa=G$7$JP!(R`@hXsi!S(!6!P!3kCQt&-_55~^^Fe)TqVg>uUV`5PYM>qh z)qzJ7SdtPRBSH-?^BErprHN;K#uq_-gc9TxP*HF4N9ErV@u-U5gR8z3pprh~kIH@Q zw2KPVqZm@DuG*mD>wt<6L8*3kAHN5vk5Kvd_WU1M<`Ps{I|_4V-sKsISXndcXQ{GT*~;9>&Gc&W$BJznWD@ITE1 zCBSUY)1U;n1yn<~c|PB#-vO$=3ZH(jPru)%FY@URDqf!SVFDV{$9%#vk57Q=*>fIW z_3^KR66k$Uf_&)XS9)CK(>H+9)NpK+3pp9-p> z>7eq@^t{~T#XkOWPz}xY@i+VUIUxUnJNcvi*n^{|FZ=2`QK0iyyOeM?C}*)Mc?6%Y+?nd20rwBl@j>~xeEw( zXG$qw6HP6TZYQ}n5mNC!K0`~NL8uCIL5*p9P(AA4;|~M%5z44~dR`Nizn71%iHh${ zy!?*~WKccr?+XYez)_$I9PM$S$74W!gvxiE=R)N_9+Z&|0oC)glb^6kH5vo{~M}9xBB#&sD^JRUIN|i)9-fs#+nhC1W*O;1J&?CP!%uo=|ZJH zvV}s>91cl`ngNfHJ-a>LV0?$>Yl&UjbF|Yo5Ojs=~K?{5zmN zHBnI?`FNqquLf2B$HvQowFD%|2A{AI)JLd{n>_zFlmMUlbfIoje)8ph_VGgH`_0Gi z@c6q+XZ#h=u_DA@s=>M*>&bue`8U)oX+*laP4M}1Knc(uREIkG_`^Yc{tat!^%f+3 z#;%|w&GQ9>5~v3#)%Eh&2W$jC5!6ShawmheqGvBN>BcfK{~0C)7k0{Mg6;8>%PkNLRz3_L0kJn1ga zwaHKq;@WKd12tB)iI=MC`E;Qq+znK@Mjm(f={2y-jnzIrp(aX@7C!#pQ0X~7U8pfX z$n%=0dc2vuM(s2&Xkd3zza-lx|@jreWEOW^sSD!da^`3jGBfi2+A zfy(zHsE<%?D6xV-t!PkQR?}vR{{*UfHh`*UqcD2+N`DKyS-FY+0@O#S$@8t}LKXYY z^M6Bi>o=cohtDTex!*k(ithwviLv_3a>-vyo%SfJ-OY2M3N-XwC_(q|Tqr&7?J);b z{(XJAP+qRR=R)N_++)}JSc(+W-DeQ0f;`V_q6+r$@ikE$=tsPIbc|20i4u4a@v3() zsBPF8o}XFY2S$MLs6o%HriCO2DIY!3V?L;lP?|0RRnK%#@}KY1h2k?owRfS%GLPk; zKEimk?dq(SZmL}3lP?7|@YnimLUnt#=l?gT=F`5MQ2ZuP;@tvj3o}m!pbr6;a0jT5 zPzCPvTqr#*09C=gp!9w}sCi+=MuRncy zO;o)x24Br*$p}2EzPb%is0!Be2||rvBT(^;J?`$)YogNk@bUi}D&L+ypHPA{0Tti0 zLG*j?th#OiYDS#gPbW|^Btdq1qhaxls8A`uJm| z1Z6m$2sJdwXZ+t#v-f15PbfYNYz~%!YG5j;j+_sw-U~d=^mrkt&xH-JY89B}BZT6Y zfO~)us0QYN`+!e^>hW@LPjCgO{QvRst3h>W4XBS$`PX|clt3Fm<=fQXCv5s(P#HJ- zf}eW)%;y(oMcaJSW)V6O{_An{wN8;4S9X^jxb?sDM z@DCsV-=NysrTo#%zU*#PJf<6n{{yP|I^>f$^+Bn=B`7g+LG83Vf%*uYk$Rp4)lOH> zh4Lgv?uJQ7p8iB=cAf~T!Xd(FLcgpN+|IcWs*g|}VY27{hAKYQr`JR^Go5(h1wLIU zxn_cjx|%;Kf31k&@JyfzRp2_G@dlq!sEX5`3zhFCP_E=QA1_q=?O;}PZGZGH)4NX; zT;#LWMCttzpZ*xA;!8a)110Yho<9ldBXm>1r$6W8g^GU(RC}-P=9dftuHx4~RrrSI zZ-V*=75}!6f5*oQ75|>+|AuPl1D`Hb2R`)ppWT?;idgA0)I?Rhig@A2zQ7t#KEKlE z7pnYb&ugL-zlC`9c$-fb%JO~zRqodw1P&z7LR-E65>+sV{8`b2qq3TYqWeMF1Ki{% zRBK<`zoDjH7nKIPfhykJ=l|bO`SN`J9v*x8azdr|YUr1&-abL7hWdii!%?0ef;gco>R1gfHkK{foS z$7P@@e%$k?Kz)SDw;YrpFL?eks0Ls4@o$3qyjkWW-u3u_PY|ktk3coF%HwLEE>!%- zpekMqs^RsXZ}faKsCvHed<&>@UwdA*%?G~s_@l>PK$-4epc>F-T0XBnsD>JP+#OT{ zO+0Vrd5*_iPz~+}O0$Q6R2d|VmjyiusG$L%jBN-gl@A5=5vqYRK<$$XeEh$m1RG1b z1Rm$hP4s+{FZXxsz^xz&YH$ju3Z{8HA5_C-pemdtj0WB6=g<|Gs`Uj>wY&nV|8Ie6h4JXwIqWFjnUmGXU2zT|PQncY)#xCfSEx1zdpyC%3svVypvs*B zO6W6ux=`iL^jxU?XMr-t(LQ}lV?2}^EF$74@KK*}DX5B{0Hx(;Ky~g#P#>WxeA)Aw zsD@wh@j~%eJr}CJH$m0^PGi5He4hwa_<>JY>2bA>U*mBds0ucEUg`Pg9=Cw1cq^!e zw}GnnJ0Jgp=RbM;C2BnA|6}j|!@HdS|NlQ%t?gM>lC)t+Xu~ALCPR`oHA&KjAxT>d z32ib%Vw3ru`-VwEn@p0l$&k=iCLwJy32Bo_k~SIN>utNgj>G$NyuQcxeH`EK@%?M( zah%Wl*Hcts0(6NYaM9tcrs3wE%5$?S`_VL)4sJw%S z+NOv2^kH6qgijCj>7#u*<^T>nE$CQPSa}K`UDeJ|&pVB%w>-?J6Fr{gaX3-==lb+{ zKAr4w3{jgR#iuXyIG(7*PVhL9sC}G%fPcui63|g~El~@|^mx6;8;NT8CZbmG7LVCp zKg;XyAZkH(di_0KKga9uBWh68Dfq|%92ENPrI)!?kp;omdpomSzB z?|6LI<9i-g5j7|(?|n^MLrK@et=qGl>)Hy{nBrQ`S*IKZMa}cEPb(_#6Q5SpUf4iX z-e>NL+WKD-`w@2#HD5DPceGZb4#&T>TQyMlUq>x4gszAd*oCNuyAjoEiy)pw97EJ` za}iN_D~QUgBx*r#6ZJuA4N)8RQ?K99*DsD=02=-swSX_(|69}o zHhI0Grt5rKQCp;es1@5v)S=Q$RNgP{zg_IGo5)Ged~lfTwxd=|pXa5kxgRlBhkKLezR+MAUraeL9t> z`L7_h-` zU&lOV(3;hFLu-jzz$f02qE_frpH|cYH~92_i<*C<*DGrNO&;rsTHe<_o%am|4gZc> zz!vxa7FGW(^;*ymL^ZhG^A)x4ce?-PagW#kJJL>G;193(Z&3@{OT7-l_KT`Vy`wI= z$o?Nu`CW0Ma%D-`t(@`*bA9&%Sy-oqXr@%Si_uPOrbiE6Oay^N@KULk5lUUgsM(@Q-r>(~DN z`Su>rCVk5jR}wY+JF1~7Tn)eH_5Y6Y)wqtCO+>Z#4N>!b>-mbB{?6kMc@)&w`o$Ce z9rccPx+`ka?j~wMe-Kr_*JBG&gQC3ErxkTDcBB6#4^=7$5x(}Rc_6tyvq zBdVP^qSpBoum5*cdqdrcr?)p0@1UsT>`bB-Fx*{H)93oMBHun=$|nNdb}sSiG@_P& znWz0ba;Fa5;Ca)DTFgw(&mrm>c{fpq?E^%u=Un&4iE4MA`;$a%j|B&DzG#M*0S$_3 z=yjsb=oLgQsEVkLM2%0cCu)OzPE`J8q88BL)7yx8zm4uc5j7|(?`NO>`5-@E1X|-} zq8i-eiF-X!Q4Rh{)PnyeD*qp%8Vun<7R9ba)raZ9mj9cm`kvHl{{7DI8GHE*imK@C z(~6p*uls@Sid`-JWqLf?P|=9HQP=E>Va2y+jR)THqX?R@D6YMCCt7 z)DC)rs5e;Le|*ObPdUsdYRz8s#B!o$TuRh}Du{Z=Z@ItY)9(?rpw)8AO82hhXH4o) zZ6In;)N~_J&Fv(rxm`r9&mTms|6Zb2qm8KH-%+a*64|l1ZbZ!&^y&SGs^3474XeU| zfEI8NQ4RMe>Wjc*h+5xRqVnRr{sfPM-A^Ve?^K^Yov1-ko=8-?XA-rXvx!>q^CG8q zGxj@Mc3mxpVZ?X$7azk z=zLP|zddNjhWTGVD%km?Ugwi~|Krg;U1B?*)YFrDy5#=*2|b-wn%1Q|oTv*>529{v zoloj@KB?Dn#B@HX_urn-;}mIs#82l`=aYJ!PwI6(sn_|WUgwi~oloj@KB@QLp3u|X zQm!86zn{>PYg#?f&L{OcpVa&J6MLOc>TyzZKB*T7bUvxq@joARcw$e# z3)A_e9zPk>C-A%U6GD%jPwMe&V4Y9ubsP|SVowK1U;V86{~;=`^GQ86Lg$luezbHx zsn_|Wo_=M5K~L=IN7|iF>UBP;*M3Lod{VFTNxjY|^*X+~>wHqL^GQAKje25Fo#@Ud z^*W!_3v@oI*ZHI#*8)AU*ZHI#8=~_`z0N1~I1Cs%pVaGoQm^w#z4k};^!osvPwI6( zsi!CQ^jpXO?Fl_yGUfVY(fOnve`n91JNx$&dfG;s?tD^Dj~8`5si)(i^GUtVC-nmV zpFOE}e_A>JSFgNVw@_RDdbiP5`g*qri&)lebV#eEE$cSXQkMZ$f_)Zz0||8@Tkkopc#B{;-_?*ifP0$J|@ z(N-y_5JbNR9B!HK0U7TBwSoZ_wF-z_1>~**23n1vS`ha>aJ1#T4`ja&GzbP+>}nup zHBh)3h_!k_ognc8;5aMz0LcFUXcoj-!iPZohd{}Pz+h_K%3xX zOI`yctpUo{07I=+&>~2$22QiGYM`_lh^PS)EUgAetpTb8!z{QK2ww|itpyUTQcxj? zUI(0Ind^XzbwI6PxJ7*oM1Bn9ehiGT8bP%nt`-<+IkiA`EzlqsWwD5$Al)hj6@ut5fh#TZ zOCaM*pjI%+qBa4Mn}FO+z+|ftR14zjfGL(!2V~a)4T7l_TMxw41BLZKrqv7T1c_e( z*IB_=K>k-ivmnb7HUsgSfs)O@jn*V+6r_9&Ot<2%fugU0Ho*)_ZUB-Rfbs_5R%;cs z2-3d+W?I=dK61M?!tza9F zzYS;>6k5WMK>UwD$&bLp)+A^Yq-+Nswc_nS(RQFs@VF&60!fWPc_T2-S_LhF^d`Wp ztO+P>0wR6_iY@IYAoVApO7OG=cL3o#fUF%riB$q2&sv|K3G*#e;W=BSu)w04NseqL zIk%bQg;oQEykG-V{vaUSzR5ftZ~@;ZC5;>IHRz#9x8MR`4s3|0~ce zD7S=NK>RMCWEZf+ngor4l;41*R{R@K^c&D7SZ2w)fu!9)`EFpjwF+7U>AwRjtn7E7 z^mia)4^U}odw|qEK$T#n1^)oT{{XW70IIA~P$7uk3%qNYdx4C-K&@bvMYRBtEkJGy zu-a+_)q=QI;6ux41+rU#2EiJO{S%1!6Da%>sIhuMogi@^u+9qh0r~rYWLnG!@F}2x(A)#!GkWjWo2+&}af(k)&7hsEJb^$WF0JVax z7S$Dq>T~-_p6omtAg58!J1d@V4c@WrRt%4RodJkZ)mGuBh zdjJtVfmTcF38eM}ss#HixE~O{ACR>l&}Nl_3PCj6uggDOZCXSqeU1pER$Da0qI!`M z*$c?+1$4C$p->S2Lj~>0{yI2&>~3h2lThHen4qI zAmSh(%F+%3QV#;E1cz9#KM>v@$m$P7Tcx0)f9QU8Xk_RZ^*JJej7TzSBgq(GQBgo- z6p$MQ473_SwIJ?b;AqP^7|1>tXb=pt*h7GrLx93VfLN;+)Cm#~1&*_VLxKE5fo4IR zB}4=9(LhNwFxZ*|je?ZJfFV|V7*KQ=&?Y$9k`D)x4hPB)2Zma!phb{=1aO*_9RZXc z0YnS{5-e>1kU9XU5)8B8kwEy7K-Q5!qE!ki1knS5vn+EUkTDRb6%4niqkzbxfZU^i z5mqCp7Q`J5jI^Aif$XD!2EizcJqCz51}HoRNVa-Gogi@#Fxmw9FHLj1z!b!6b_s3`7nFat8yG ztwvBSh&vIOVmT)Q*(U-Gf~gie1c(^|6b=D0tzJ+kNIVI+&I(Qf@=pSq1zDDGG7x_< zP;xSGqcsT{1u3Th)2;Xvpy(8!O)$ffhXP4Mf%2iit=1}N5u~3A%(Svofznffh|_=^ zOFIonJq@T5%(7rS5FQU?#RIukDX0)cCjfbtnE+%Y0JVauJ3(74a8Hi5?N|J#k)+A^Yq?`{d zwc_)EqVs_^!7@u84J3^Q%0~mstyRz>NFM{Nu(B~g=@=j)1*o*N6d*MPs1mHS-~~YV z1whsXK$TSrDg@DEfp;x)ERZo4s1>ZTs0)F}3xV7Vfz?(cs20SH13t8zaX|Jsph2+4 zVlM(>E&>WK0&1*YP$x(n53I9-@j(7~pjl9B2^RzL7Xu|11M96x&?rcm0Bo@02|&>V zpiS_(C0_z0T>_L}0&KKaL5m=LBCyHICIY1sfrwO~-qKQmRQexQCD?31`Xk1FuV8zm z0S#6us1QV73T&~=OM#3_fm*>_4EWw^1l5AL%Yki{b2*TGInW^3Zn5b= zOgd1Q4m4T4piYo@1+c>kt^o3{0Gb8OmT)Byeq)9;eBw&xV3R(o|R|9*k>}sI&Y9L}V&}wOufz-)Bm0+I*uK~iZ0kW5nL|zNzUJG=!8bP%nZYmIJIa7h`sX&7u%wjWum<*sW z0|;8ZpiYpO3G}prOdvlKXck0R!ZaX$8c;F~=xt4cMnTGTKp!i<4k)?~XcP3cw)s?fqvF1Xc44m0sXBk3n$ej)hv>HLRAns=1Xv?`7$i5k95Dc=|89>Yopl}8dYxROU zLEmnfs$K+!PX>b6r|h+46)+dfTG)gHo?i3JQGNo36#$S zhFYtjMUb8ioMvU&KxsA*kpm>ykUStYhwj$fIdr#%S@3os{B|<3ZYLwrDg_mS=vly7 zmN^T^m<7}dhFjDfK;#`j?j67gs}WQS;&OqJmXix)=K>9aQ5JhA5OXI`cqfo-^@6%P zS&uXFSdYmM_Qcxj?z7M$4 zGVcR2?gMHClPv0fAo6}7_kLiq)d;EuarwX$%gG0_^MMAzREsSDVhVu50wB}s1$BbN z2Y~CW-~k~20iaosWeIbE__;vIT;N7)5;O`@9t5Ua@q<9ogFu^Lh9wsQNrgapA#kg; z3R(o|4*@f+>>;4^At2&mAji@k22vjessytv_y`dG2$1y%kZYBK3PJRvK%Qkj3S>MA z)C%slsKI8|;0gJ8RIUxTzpjl9E z2@8Pu1whFHV2L#e8U-oO152&=d7$WdpiQvMk{1F=3xV>5z;bI9vAL=V2oDg_lUkrBO!jCU<_5sZTs8S%Z z6v!AXsCuF9R_z1BEXGHC8XE6C^GM)>*+~Ab&B?EU2}F zSAh6efRa~$_0}Y46r_{`8?3k-C@Kfq1fN^-t3cALK>4e{Mr#$c2-24To2+aJP`U(& zcnzqxwAX;t*MKU)W(zI_!j}SBOMwQf6jTVJUkA2W=IcPl>p-nwt3@pXB9{TV%Yg5# zMo=w?djr^JId1^jZvYK~?H0Qnh*=I4E(e;dUQj1Ud=uDV1#bfRZvxGNW=mKB#IFEK zRscJ#Nzf=rsQ`9aaRpFR0kjErTXH3kR0)(<0(-1g&>~2G3)pLAZvmxm0TC;KR!dt6 zq^<<21p6%bHW2c@HRj4+vVlpiYpu3g~GCtAPAfK(ipi65a>m-v>(G2YOqR zpiz*r8t7xitAV1`K%1biC4T@UeE^hy0Q9p~L5m>$L!iHveF&6(2t<4YL|NKLKMPGAkGqMf%saWq!t)#O@c;2$|t}O zEB*v1`UGeboNUSKfu!|7`FdcewF+7U>7N3pS=pyR>8C)%1|Y%GHUOy`fGWW-3w{QK ze+FcI1|(Xgph6J+IdGO`ehy@O4%7;UThtdof98S3vn!zyxa*vvv$U^))USam!DSX~0Kyx9tOg+6 zDg_mS=x=~4E%O^7;~St>Fv+5}0FhgO+%3Rls}WQS;=To@SkAXV_P0QTV5-G#1!A@W zg62Akkvx4t{{O^EfL6#+a55#{Dlzb1|Xib7fLCO!nbSwS=DEa|t6U?yW zZ9vjCpnMx}tF;PR1nEBlGp+1Lp!7!|VmpvyY1@I+?Ld`amIWJu@J1l35y-VlL4_c? z3COd|CLp5;s1@98Q9l8ZKLNQv0kf?}P%Vht0nD+S9YFRDph0lI#r_P${0tQS3=~+s zpiYq349vBHW+1;AXciP&!Y@GlFF?sJz{A!gXcVOE1Rk~Goj}n}piS_&CI1Q}{R))- z3e2-sL5m=L7hqPl3n<+MMEnL6TiS0x>Tf`m;Aso)2Eum(S-XJ}s}xiSqJIbGTjuXT z#_vF_V1Y&L0V4MRxqE{|3VU2D1JJs;p8_A&CA5c-J!j0W$spY6Yw2 zMRlJzFS2{Yyxi{eKIYXhRo$IU5yIq$mJ`yQO%Vb#2-a9^7a*n!P}l{iv3fzBAh9d3 z&I-B$`CWl#L9Hcp1LC^@CEbAa)+A^Yq=W(+tT+@X3I*B(pIdTwAgMc0-W}Lzt%4Ro zdKj?D%EExsFd!lvsJFCmAT=DQ5^T0$5C{(fSwWz|Dg_mS=pMip%j^MU^Z;rFTP><5 z5ZM#R?FoEuHG*nE+;>$wf?hy=FQ8e_ zYze)A_})NCZ(yf22^s|{`vbeIcz>X1f1pjU+mibLNqvCwKENJp6|@M_4*>RB*#SW5 z0YF4wpw-g)0;zq0D#1Pr9teaV2xJ`yv{|K~LJ-}rJAIGtHmzTG`X2p|T10)1gGh-y z2*^DM=xQ~BYC&9oAk=dD1KIt720@s`MglP$P*xZT1g&0BCrFF}dRhTToaILW&4LI^ zI2edO7$`Xy=xt4cMnTFUKp!hU1SmQLXcP3c1+%k^HLRAnr)uXv;Yg$UYKi5Dc=|fk4bapl~1%YxROULE=%saaM2?kbe}=EQqs&qk;IN zfs&(v!PX>b6r>yj46)*4fTCl7Ho?i3JP1e{1e6Z~hFYtjMUWl?oMvS)KxqsR5ep<( zS}c$n3seb)S@2jO{8%9CSRm0V1r>tmmIG|QA+@g*LB98}hj|WCrji6c( z7YB^AoH!sm4rmaJve*-Vm=l1)6M$r^7t{$72Lq$6U@(wB7-$xxSi*@w{E0xxiNIKE z5;O`@h5+NNcnDB51ZWeCx8#$6q?3U1lYj}HLRAnpR-Ma#JW$i4t*5G=CTu|UjN zpl~cuX7z$PLE?qLVk@{1$iEP17L;4UI3Ru;P%;i!VoicZLCQtIQY*d)D7pw}6D+gj z@j%jepnN>A+*$=Kg7k}l6;^gJP#RWGW811wYYCS#cl_ndU2-{dueT;3%a&8B*ZwDF#gDiFy5HkxXoCU;My`WBzcn5Ht72E;j z-vKlW;w&K-h|dK|)Vm*SO@c;2%ALRvE4~vbx)W#!`vu$zyxa*vJob zh#X20ApbF-S&(H3j|1_K z10|0GH(HaRQIPTkFx`ru0E(Uf+5|H!c^;574=A4p+-j|Y7D4)xz)UN95-5EVh%g|> z(hNv7ph_^yf<-`h5s*~`OMzxVxh0eV@nt|s8L-5f1dW1}mw}~L z{4!AVGSDViX32|zq{Tq_Vqm$o3R(o|uK+8o>=mH&6(FJjkISx{>UZvgRc03~k#>#a%9C`efjY_Q_xK+$rb zP4KxTzX>G036#GHY_wKEiy(aku*u3+0HrH{hzg+I(kg(|3ZP1`*@BfocqNck2{c%x zph6J+7O=%K-vTn;0%`?YZB-T!xsqG)9V@vNe{VG_f$EiH#Jx?%Hp_V%$bK7W5Nx;D zDj=o`D69gStX@zjNPGv_VFm91`R@SDf@Vv27l?lsD0vsyX-$GgLCSl;E-QWyD0&ZQ z6YRF+RY1}zpnMgu$65s~g7o)+y;k-(G? zs)534AZYc1IzeI$(9;TPfczSuSrB0fYk~N+K*?I5w>1eG1u5%*K32RAC|U=!3Hn;{ z$3W7@K>5c&KWi1V2-0hT{#I5Cl-2?fp8!#o_6d;s2~Z_C#DeRA@by5}dLY^=1r>tm zPl3ZN^HU(>Q=nEbz@jz)ksE;A4ZuLF5mXD}J_C-noX>#l&wvKOAdCGRi1{2S{2Yk2 zdO@8a@eANMEBFG){{m2<(qR#pd;)&UXqK!T;!1F7{um0*|!zXHO)0s5kCNFmi7aX`U6lUxXgmvfbeZV);1vBDg_mS=pTVAE%Qep<42%Y zFv+5}1CiT--0i?*s}WQS;u?V|meUAiHv$cUsTSJ=#54hgO+cpA3+e=kKLOWS!B0T` zPe8LE%Mx|~@jHN$9l(v&Bxn?*{0vOD;-7({pMf^P3`=eXlA3|?X5dz96|@M_e*tD% z*)KrpFF?djAji^n0;xNJD#0uZ{tATu3S|8XQ1t@O;=2@$tMUdVKn3c5xrL923 zpFpvt{RyQ02~-K5w%|S>d>@dt4=AxpL4_dtFJQi9{sm7BR1xsd7sQ z31eG?gt09`fF;%>XcVM$0hU^E7oeyM&?Z=B$z6e@u0VNLV7avlS_J9cfE8BO4Jhpf zM1%sBmKF-6h5}WBl@{y{gm(wBx&u{KDX0)chXL84l!z1FNk@ zP%VfH0v}pV5XcS!4T3cm+XIN{0TlKCYOG#RCrIoGtXomgGwkVMcH#kH)sH_?(yd?D zZS9Ya-!=LA%oC=~@PE@_QAuInbJ(;cg^lXBrLq0Lu>OyX)D>yTVb^sDJ>+-({jF_{ z3^O%m*Nh3fKIFg^8^(mK=@ZgrMe!A3JGuprOAXO~d%bJ$io(fZd0j#hS43PJwlXaA ziHAc1Jy%Rh346Co`^=Br6c!$O`7q}s+? z!^TFP{5p-$xc-{N9LoIH;=788y_J7jSLLtB&I!A!OX&U8A%Xp*i$bKqNw?g1wVsq7 zx#H2>uo>M#r+(wB6V_gD2hI+=CZuRZ&g`&_PRabrlJuNqn3k#y4_R^{Fm zyY36?+C8*=U9>SCZeQ$!g<(k{T?>14S#f1b*wBBy$Ap8r1p26vjwMA*nQ?vQ4YvdW zO;KHV@65kw#n+F89lBqz``9jlLs{yPD?;Xn&F#|j&B5cbw2}Ecaqr2Kw`C;8w{QPp*RlOqa+R)L$T*Z#`_p-ve*>ja) z-9qpDjP=sC&kIiYvP=7>%(NkIh4uYE_DV$6rY?blS+7mR!?cju?eFe?dV51wR26n; z=)`SWIU1hTu`coNgk^LOj{AqV`=57rS;tOUj_Fu=(fWMEa))*A+OfIALhQsfVK0O} z3iMo&o*Xv0iw@xj+c)&bYs3EjWW|M}!;d>vufx0Qb@2r&j+h^o(dGY-*C#_(JTfNu zz~tZ()?LFc8~9rAOuOc_;29y^Y{6^6zU}|6S5>R{TNnCs7W}Wh_CG2sdmqyQtUofV zKZT*;12;|UKWl6F$W8wVSO1MxL$#Zh%-`T^AJ$@8hUPn@gYp9F95v%%9T@l+(_c-{ zpHLs~Ew1-G{T<{9Zl7XWLH$A8aQ@JQ%AfhX`meN)sS$>aKCk{j{WES~w%dq~wR^>J zlPBuWgRO9@!_=_;kVU22SDvSTM!wSaEDavs{-3w`a~FXcPx;1E^dEP>pgnEaEtoc@ z{`YJ?rt&t=i=zCnmdo&?8wYb>nzky#c1%TWxSQN|dLAd^nSq-fe|3x|ai-fYH*Met zSwZn{ZiiF8-8Q_=!I0zY{<~KVplULshCOaaQcm@}KimdlP1;5bdodM{V%*`@>Ul?F zIhYQBKQV2GV;Jw~$mAZ4w?|=G!IK%afn~>FI(SZDe8m5^{25p`{XgrWV3Hs4XM2OEV)}E2IzxuL zokn@0=bhsgk6q?A0@H#M7}MQGx}A<);Wi4>8y?1ZWuD_0Pdo#>%IyNTL~N4Vg_w?x zGa0XT8}E5%VN={DVA|7XGv4HO3D*9Gu<34jS9{_);4O}mF|FYU##`MoJnvj=rduYa z|Kl{0@ea2v&pQwM&zrje)0P>!X+o;kyr7%9=cDtuvfIa9o3)6-i%XqG?Jq&kZTF(m^`?=ladE>An zF(tBhpP@?Eq6v(HI`RY0d-^5VNL4Z{#I*d0 zjOV$%=$49&a$Dr{reR5LrEZsE$sKk@pv>_y@O)2v*&DnZ8}0Ur=cQv~+{)dqz*5{^ zb-NO~z&5N1_Dvk?Rj+x~B&sfSTk3W-HqPyJx5?N=HlTtg#(UKpUNwcPi`|yHU5ia{ zd(&+yc8N__6BE6v!mBc=N_DGrn}(&iz2$ZtcB!pW6PJ0_+g_DL)#YwgZZ}}*Ztu9= zh+ScQDrw?MuX@j`rc-s5+bXx4u}N<4yUoC^wn=JYvR8fJRku=gjoXKAw_#J)k$ayA#XmuwH@n zj$B&-116YpRX1BT6?KXTRP0aGD2CB4y3K{Qk+v4dDVYzPK zx;=~q?NOS@Yvj_Zp3-+z=?e5HV;QDlo2NfU`3kom-5$s8;L^rzDX<;W;-6qFaBFg# zhmFE?q1oZ~B;_+OI#hXqW>A+eW9$j`BX$dRG+0ErQESD}9n%%9nDHmKFt?|$&8&&q z3HN!Qrd;RN13QT6XBfY7I|2*U1-As8r?Z zR>Seivt4hqQMECiXVh{v3?^!o7cy#N9ZWn4Q{D@V+W4|lFs5ulXo7`swdUW(_H>UP|P2@PXCv5a!4+l6i~V>%!-jB{H|d8e(a;ypa-RpY&?oT^9M zE_Qnry9YazI04i9S;DB>l!l3J>NWLY-yTLx!?d54GTy;PIf8hTxA!{b^E>u!ufTN2 zW#AZ_^bW^+Y)4&ShF2}8YJay|+}_0cy4~uw0_$f>X(F##>&P&ZDitdk=ep&1`dipP z+P)08yRD?0=y|i;-p0OE62l#CRg~))k7dktdxvsb$GmxgJ00HzCxCIpJh%5KAL$Fe z3)9!qONuJm9v5 z@}oK%8RlYP#A?RJ+#bWUf;Eg!xXp80i_LS>|JT&TV;$o&d7%2eC7>=!AFJ%P&}Xj2 zaycPSCBB5|O?|?+k0VIKBDeLF+uTYqy{AtZv;Aa#+4DAF)BEtkkhj-nwE+k$O(+v?Ve zHDKovzjOPO@)sR>d4ca8_kr(#NyHy8?XABUS9ycm-P*7U?0n)+Zhuo=f{i9Ndwc&- zUhMP!;-+)y6}O%3#?>hVeAV$+Q17@4_5?PD@^6?{rYrWO+aAyBhCPC%P`|gmLH4}z z*jg80EpFYhXf8S$THV61zP9TFcEZ)_t1#^IsvuRDyZzVySNbxb26f zxrOxTxO_xl6WqGE^}=@0AG%PRvMZX2it&+ryTUW1F#l; zJ{;_ycQM@4`9Sz@Qf2$O^~3&gi*VDO5Zn`toc;5b)Ryzv2#(Mw< z^a$M0e$6}>oZ{Hm6A!_ry7lu055@H9{t_BG$SoS{flb8vyB&s|r&|(3q}$2qUUf88FS;G>b_}-2?FhF)SeZ?y ziIAsk&YIw$e)oIEQJ!%e8TqzK3z_Rx$9Pp7RdH^E+)lvyy2ZE+#=@;nHBAJ)>R7KD zLRF~Sac(DJPwIZlaJ<{e*m|2p6L}AN)d^lTl&W92XFo#vU`%`URO~0WA(-~tY1o^( zw=*R8yz$ryx6|Dcuu8XKZl_~!by!~D498*M4Sq{cbUOq4gTq`O2F`R##B^!VaF*Md zm@X|E&c?LTXJJ3Oo#T0DW4ct$r+!3x9@pyOpssVmkv{V|*lwSBl+Qc@+hq%C*zP+# zJ(((m0{|TRri5qTbJi*hWSTH+tSUrlbAd zbCcUenEH4crn`;Dp0cfLd5=$1RZ7(iZ*~Gz>Z@zG&C@TzLTUD8Y^K{p>}>KDW7%%} z5HIkq4m^e&w=_)Oek{Rmce@n3y*(>%MPL@FW8pF|PH&7M*Ap+tA~AhHxYI2i`;{3g zusoml3T&4eVYu7#uEd_U4eNN1PkGgBubM>FxtKmQ+>7aKyc&CrQNvtsb~4k?x)u7o z*D$S3{~mb{xlLjEV$XZn?OLXFc)hQ00UvRk3JkO9AG1ywEdK-Ac+9IZsX7Jw5PKY> z7?_5QC2E-Gb{%#Z(;qRK&wD*KroXb-)tFA(EbIce|NNKm8?XyI%(~VF`{b=5alSWl z6O|LGls$)OS4_v!ype@&H)B`2y@Y8+XJA*mm14R?+=5MZdj(@Ma4Rp@xRvYHqnU35 zr#LS0#F^N&Zm;=5vat-e*Dyd$8*x+drS>1wH_^?z6#_-pyHq zF&Vg*m(jY^FjRZq9BcwsgROJB4_o8&e&X}qkJVsn$y<+U1@p0wJ#RyM9(}k1aJ}Pa zp7;Rvna}(MraR7DY@^#(m{$5hYyq~8azlHAe65AOz$ADCXrH>=(*ExjluQ>v_7+Yx6&i zjr6=`j4hZK;I|h7L-~xM;a5*A!It{F`^_8FmFG>j-Iz|Q`Pd4#y&Vk(p2OaD`_t!L zfGu|0=kq>~E$`_a#D6?-A-K{8Y~aLr)$>D$Xy8R&UUBO})EjyUTjJJ@sC8O|z3vuH z)YYdHd&w<=$Yh|5mt}6fJnv=fMap}$VfuRFVla>0rQtxgSFpRVKd^q7j>U3pG<&dx za-`?IiftuNpQNHZZwdCLw|A)L=~A!5L?5Jd#|+UA_m+Y>PK1Yf;_KLIOrNd}cUy+N z?{);HE%OHU5~fdFN4hP?-o*aFj`Dfm^t>*_qdjj0+kdGw$OVI(`n`0G>@ubNhm_x_YupG41M&l=U^C zhRZ$gODq{nCh7;yguo_V&b1*Md5`+~cQlh%QpL?HP*3@9njK5L&C|c4+}5#9?LXCJ zGO(E!HKQS$JT3lfrghSfBi`=wHc;00ZW?BJ-Zz-O?_ZJY|JRDQcZjsO2OnHD?DW-Sw3wETNuJ>wiCpOTn-0fHFKum+K-%JK}@zTpJ?={EY z!0zBpMBR{-xSN-7H(ltp;NP(@x8`qQ10W$%t}lvxEEXPR@E_Y zUZ4e3k7ow)9dEFe@_yJY#CP5Pq`b&ye$N}+hrQtTzUTdgEx>Liu6Apqtj_=%K5+XR zo72NDSsyz71Kw}r>NqhT@ccDi6~a4s(5)KN-s*xqip^xUk3Fv|wvLUFjn!h>Xx*>} zupI1DOxK1`Y_8iTjLATEUS?qod4YPzFz^oWc4pq}4TfV^dUx>~Oue=sb~UE138YhO{FyV&`G%6?Snu97~`x_zcz+V={0AFT=cp7>a2R z4#0-c*U=Ef^yZGl4#w0`+|Sz^hz-v3#0bZuz&N*FZbxG$y7hKD28(su-)#^!$gK~? zWFUr@<0)(C>v^$QzUSo~=y)u6FR1QlKeywsd7gNX+ws`LZv8PP+kXc3sLvbac_&bD z0c8yb6SWlvV>(tfM0e!n1x^HYuxL2UXC8t@vp+Q)jxiZHiI*FE!2>++Wb9H*ecdD7 z^vOKkZ6Kxv55;t~(Qu6Cor-CZ;~F>?F6dFdgZyVJEwt zjeUr{ZkY|ifq82wE~ENXuO315>3(9J=BBSyhGFWZ#=DKgYP@%v;C3E1jeePWpQmHG z435ICa~qB^8A#&g`VPwrjPRM0!J9nsTudADd~779A<1VRjh*LqKBk+|7;Kc=Sf4iq zOL7~JY0qAOo$q!@yRk?4J?p?|P~GD+kkHz|<+c2y1k^ z*5@6Mt@HcNR7?xL7*khS-Q#JVryoKelgBoy0k3ns1iXejj=GN5yG_LO?c5hwmRl-z z9=)ke*bQ#_QMbBY8g6vE6w^;9HQeNO8K$3Ns_T|F9b`IiIWI4(z%auT)0tk(sIJy6 zZdWi}?slu&l}xW7N8PX6yuGX3)ceYIn}jW7TD`B^JLbJ4a5Z=h9S(K1W_g4Bs(av4 zOkJ%zeCBJgi?N@uJ3Vg-c8Ob_+qKwmOaGQ1z^DgyH>^FNujS4qRd%miCU!Qa;eMZe z8aBf7@;&c5Ot*J+-sWODuGLdKhCFrN9`n2`EXHl#e%#`<;2Xd}jzzwZ8!`2T)ype( zy9xV=g{V{Zl-qP{JEjiU(-@P1n|b-(t;B5x*5EeZ=e?y1$Mzua&^+gOD~Yjg3*2tQ zK4NAK&tqEYnV7zkQs?bOjLASYFE3;59W|df2h(@{8cN-6$A-&vrz>-u1&*+g@90CE z>-melDwnEJZm+oAiD?6=vsLb<-|l&k^;Bo;Rkyn+7rHHRyBpKI>Q}wyb`Rxa$)jJD z7g*{z8(d9?MjflyF?F);rTl?g1*WUe9PBgi_`L1&-iOV^dJ?NV?|#bJZmTd|newp% zeBO`R=Vh-HfV;V#s;9KZ8+?GWIxp%KRbzzq-;dem*W$IF_aGHNV(JyGb1S607*hx6 zW4DJWA3>i)9h+LWhbe!iuOrln`NZ)N%9nemWWC#?SR!@=@l&_QD4*@N0n=gfIChTP z7Z{U)CwMv6+xrsJ7MzEj%neYToxHES!6%u}_aN%+Y<4rsx_N2%n#g3Jh?f&7#}L2q zykg3_Yiiiyc~4<#?^xni&wHA(v0x3~VXO?_(}72`6*T+^>YbEe$71TRH2KWWQoe?= zIwwE5&8Mu3x@-qg`}jG^nQp%lnG7u8tq=dAAx5R z|MW!N0M6k+I+wT)BedTDblcO-y$#cC?-k0r?a4yfyn1)KDa_#(ryG8Ew^u3O=N9G` zx&*x2`uxbH;4JErnG8}#2rT90Y`316_RQ+1m5ID%fRvihk#nh3UDuPXdLk{OqYTR%A;6XD)A_9u#&QVu|~Jm zqut)3oWuowD)AV%m6S)hsgtc`yp1Kh9owGAp-=^m1v7}p`ONQ7)`d>Do#Wl!rK}5` zOg(;W@%Jd7$h_ARPjFjBd5GI!xA(E*G2Nc@$$$`8&C5@DG&r5YNuKxtZc{KV_zSErmQTDEBLp_`qN}s6@EM->CFNiGvH#~% z$aLI9S*Pwp#A$AIlt=p2^g3^_9y{MH%k#d%#$Znn^|?nYvzhW(w;M5CtG>p@x!t0V zlS~I1csZ2?>*{-(&-@ML;h3(pGu^gOUP4(zw$J-5_LAG}p0^b%b(`gR-(fGh_bmgAy_9JCoQ*=evM^QDnowBYaGJR%MdySOU zlYWj^fDzgsqoSkQza8g#;!o75d(C!u{iooOc{jJ0*&SZrOuc%>8Xm^9z+bSN+#dJ5 zotUmAi-}KQI(~kod_Je3t`$#t-Y&}e_D$D{r!gJ$zftbiVR?aPJ#javujG_C-|ctG zr(y3ApYxgbP}YKVDlWvd;6Et$@Kd$S=iQ5K;ULxUvRe!Go!eqe7so&=_=97)C;o}) zJlCnH-K0}+A7!2AGVM-n_P;3WJlAQrqP;xSLs_A$m}Ae5JU zOy|^kj1b^4)45M&>)$=^Fv_zr?dw0>4ySxKrd{3AVR?Zgn79Gde*F{Fei}geMz?(!lYt|7 z(L%JZ|Mt9rl(oOLum5p7O7*;B?Ls|9ruL4etnQYE5VvEnRq8BiA9isZM7fbf?XRwG zF_hI~m34E|@9S$HYafQX9qXoD*xl_o%H|6Wb2}c>XH5;^*03|!Gfz!vPX#^Y1j>7S z!}o9-j5WIT#I!R`#I#Mcu_N4uxM^eeb~}l34a?BB>ErF4O!+U2ZDUh^4MrqtCA3lc zdcsi3`pBo@K(|w|*WCKKorb+`OMm5JvVbbR<^EokKzX63N4lMkJ&S2GM7a&4yw~5` z!ER?@Ets~&A#RD3Kk)Vr#k391#NNkPwYGq)eY|bWoj3c?G6r9n)?}bS0Qr1ghado_HQ*eRh|{xQ(K$ zJ)(uhx}CU7U2iU_v3A&R!DH;I|BJo14zsH2`~T+*J!j|~hVC4g85&9HMhsd)O4>mB z(A@}&4nexRL+OxEZc!-}5NS|KK)$c{K6}Aog!{Rl=l6WC>-WcZuIn|Q6`$3y*WP=r zeO4uiZ7SSN&^`B9RyTSNtM{&TLGM%b{#5TqV>1}zKwOAtF5OKqHt7Z;)w%CYuooL=X$eW0`0Iv1*ApgL}?W1gRF{QZvv4?N{{Y*%lP^~P9li1ofZ3ZkJ96o#Tu z42~1^zu-O0deN#Es|~#-+5H3ye1kC$0i72e209};5=OyjNJu(KARfHSx~V$3FAG(m zGL(aAPzXwc&W@Ic;t&BPL1#xZK}ARl;ZPMaC#NSQ#gGt^K`AH!Iz*Zk-hfCb43(e= z@jdATwlyFh~F);Dt~~2#Fvu1j9mVZ4u~9+Y(p+vtTy#fS%9`ddCSe z$sZ+1>3bhbW6*)O`tTlPf-H~~vcVbFTxa1tY=KR%8J56OSO&{sB}{>-Fb$?d1{e$D zU>JM~+Osqey6Xt|XBhgzU>F2LU;vDODo_n-Ks*SBSP&b2qmSvZ-0yG|uEAM22WQ|X z_z{l6RQmT6mDtZJuNc05m z!F~7(?t%^z^?*)n1N#`3!ZKI|D_}XyhhZ=rMkl2S$6)vprotQ;2;*TIbc2~N2z)RC zR>DY_2eaW57!3X3Ggu4@pf^l_iO>g@Ku=f%lVCdZPf8Qc#V{Fq!B|)b2KvJ1FbZbD zr!WAfzz`S*U%*h90i8idr*u-PBY5fj&5+IEJ*W@wz`LOHK~YdprHX{~paVkbpc0e- zU7mG0E{3@{#N*MRPWvPSo$&D>gCQm8Bu^5E58?0-{}f0sB!Do`;hcoXRNy7PU%1Ts ze&ydqxCEC$r*(8X=NjCC+i(Z|fD>>MzJpWnJ)DN0;0zpsnnYe3>cU&_E;NQFaElE5 z2{+*`{E>+Ezk%Tn+=J_I6@G_npsgR;>Y;rh7qMRg9n<*<&cg*b2S0+2{Bd)Bl&lX4nAhU?XgT^{^GTz!F#qt6(Xtg*C7kR=_e?0E?g@7lCHb6qgvv2y{#&!FQk3*k#x0AD~GB5Mme2BTvyI_9ENEjq=b z(=og>k?5uFoR4AWp1=v2rs&=HUZpkp7&^&T!h=un3aaopt+rh^;D zK&LdKp(vDOAm)KIn3KZ-)_5nepMc|_QyDsip;H$+Ww8oYz!?|;&7lRff*P=$n%e=s zo&4JcyWuPN8rHyCSO*JW7R-hTFoKnsPHcP(t)V77q^cjlEw~APz@Km%?!aBR0T5!L>cj!2WPKI3uojB8J46Xijq@ow}fgYfv*ZCn2==?-p$O1Xx zH^zsy+G?+^w#{mb?RB^a+UKi1!P;W0XEk%Q4ONfKlM^tRIT|Y@yj6Ofj$l0sI(w+I zhB{iPql7v-sH1{s2(Kd$Q(+qDe8Wee=wg9(vg)|qOuES|m<@B_3(#jac5bX0JLFAI ze(kZ>o_g(}e+%kCeb5&9M$ie_GEtx>tPLOvt%o>^#Qbi)}XD@zcP{5!(0_}Wmex6K(EKEz}vLhuj z^`Kp3D?mHPmVvgjX;+%I8?S|Ruo<*BZ?=zrdXrU+Qsls_O|#kxybZR)T9^yNsqPUl z5_&>k&{^ny&>uQNV`vIZpbpdoZN`m+D9|R{{qQ}L&qwev_&(v^I#>_dk*kfh+DLmI zyEe*>g>mpXOo2b})2*0p^G;!24BCIH{ifPqs{N#unGh0k?{*5g7xrm_fVI#D+QPSt z^W$2s?!#~Z=D-soeG2Uv4}a5vbPCdgS({H|LmY?;@gP3T!C(7GbqrnS(}zMNXb~6% zg`o%(hZ0Z?(!)K%YNP05J>|G&*QfSmVh>XE`y}F#|M2$g)h1#2=V#S z@W4{LDYbi2yCpL~MaE4fr~=x^sEv!yFrS3);WUJiWD3xJLmeVa4QU|>tigXRtb_Hi z0kj8Er(YJre9+dw!6DSyPz>7lr+t1sQPf_%owV={Xv(0~mOE{yYX|iqC*+1)pzU+% zAq!*x?UKt3nLyj((m@!ch1N0%90M>rLA3=Ko^$sc{ zgG*b^vOy6j1|=B0UGQs9&*%&raN7jUp#`*rR?r&SKnLguo#8X+4n3f!kAJwJE;gL0D2dtcS^ZIFU0h+D<2uo1HqsN;Cd22 z8GMuYrzhvyW%CZyhgwhvZcqc);2t~xJ!jE#8g1-qLzqs`6toRfo3pg<>SO#mLTAW> zy*su0A+(2P&>UKT_A{|piTeWvVm}xNgP=EzV<1id?K9H8BJCs6zM-n1y+Yc`a|C9? z9GDB!LC;+D$YcVUUyj}iSP7>Yr0t;tbc9au9b@!ZY})@YhNJL|fFX239mE^UU>OHv zU@{m;1NZUM1{m$w*3N5f?MXx_6T?RQwXJ6r=$lUqAvSS(K#%wJB6k_AfN@OVjTlw$ zXfJYk(3Y2E@H4&t2#FkpT||@~nFX>#PS8dXZ4B88I%D)L=m^m%(54S<@^}*}KxL=` zxzQ~Mk)S;jC*U}A244gIHH7>S0R^BSL_!oqLnVj}p%52BAOR!+ZKSwITmA{!7jYfV z!&XMqHrNh3U?=Q?Gt|_1C{E|)6H>mQ-!NQ(r7#XAKqGp%_CI_86+kaT3qvW;Rs?M` zr~z@I6di2_?gsRXE+6Q5+xz&ngjUcRnnO|CTa&pqFr5CfFnKr$&^~c+SWQRiLdVc| zJM<~8rDkrTkmSCmv`PzV@n2Ay8Y}~4K`&cRQ+T}({Sh)_PYWe6mw+Nr2ok}4qJIdx zserFwB4zv>CV}20Rsp>|tOJF~XF2j&9=au@g7kW6B`krtpf`I9L2rNbMsGdn)zVDR z+dRGP`2zIHXc?@5Rj?Y?K{FCaj*J7^lJ+Td2fb(e47B@9JInO0?PERd*2}aOu#6g8 z4qd6FV$_P>VI=^)x6*qmy_QOfJsD(#2bB0jO4J@YfL_5=rc@Q63RHwjPz!28Rj3X% zpc?chgNJO^l!wB1EpX!JH@6s)EI z3CUb2+#thxS@8$_2B~mM4tf`Q8lIu=(@TI}pgnKeT{0Q;e0~b(nfzE72jd|Tfn$Ll z#NP)!eE%Jm;I|C4ZE7XxdH8Br1KI|r2j1E@rU%;ERHRKrdT7ma=7^vL7~W;X#3$#W z5DT8M^f?LozNWsXIT||BXFHqbNkcOF^nt`d1Q`QaP}k?~qMLNr-6nmfN#A9<0{RwHEQZZhBwzeW z6f_!xK8DmCl5R|xEF>qN+NL{9g&CmF+>|79`n1g*64jSxI)J_|(-!pg7=10KB{YQ= z&;%NTKKi1MywroYpf2dUE&5JNJSMQ| zP=tWL(KoMvzEN@)^j(r4pbq}}5J^L51iupY2RI9-K;H$~2@65r{#Xh6JjY}(Fa`7( zj&a(jJf0FyhONvr+u#cP4*J+dMrt7!L_%&T2-zSC@<1lY3)vwW3PV091ob;>8bcfRLDKvvDP#$~@`BwxY;R+q`EEK?;4^ly5@IpL@1wrsPI*;KScmNOK z6zqdFFb(Fw9vA>8U=o~zTW}M$!-}}H|56N#U<8bZAePm!h!G?p)i9RTxZzTTDiv3cl zQ@y&28c&*#&c3&qICUoeL(q9}o&Wv_biTU{mz%brbKSL=BNjL>M z)AA)Ogn6(4bbe(&Wjg@+xKb}_H!aoojAs2Cn(1jvSL*a5=m_tC#`Jvn60Errld&}i zy2mvCLS!2i2i1RlKXvE$~=$6zJ$I++z;vzraJtL`FjXVcn@|Rx7G351-f$&EUnJc z)+3!&$kkE^@SlNs7N|BpL5`t%!=NMAm@N>=oT8(yXEE#4>JMPxE^gX#uhXcvKnGBD z;8X?l1rvb>q@-;%I$_$KKsr@=1QOB*b(%CggksKt6dM@A?;`bW+@??uDnm+Gh5N7g zuY=B*e@A9Qeh$MihaqPo6UC$b6Ji;LWe|J|6W}hLL`O&;!UK2$PvH^#1&`q#9ELrx z8+JffI@M!3SqD~)`cBeQ(6N4+=^q}_sHRSn zRsfyCyhV7OTh}4?N1&slPe4Zk64LZvqqiJv8rpc>4Roqg;lDPy(}nc%rDZJX*rSd) z>R6+WF;*oPDUn{#$wcji(l)2>a6bh)ahRN>Qo>Hy4LV5p6@mydPfQK z4d{U02+#pM&er*Yx?}hZK7mi68yq5l9jJ%M^I@>nVcj)=x6@IYFahZBoetIo`sw`K zAb0LggIR~+?!e0v1LN&gGs6lLwdY$sFcuBDk#VMRb(+dkch{cX6OfcKrNe0@Km%Im z&#FUZr~;LsIODPeBqv-rI%y%Z!U-)-^Fmhez+fD;XKoCPhxc&1Orp0SAqi@aMI+oB zg0?$0f!+A+g+p){zJ@e}tBqexs0+2=E$B`7^!RCGb35>9H?wAxz!~8*ZnlJbF&~6O zuoyJ$Z45B$h@Wbv9JN&(bQ-BF>}Bel$atL$yBNQ_;X}+iaikMQ9idYS+P^afoi5Tr zpQ50{J(p0{R<_^Z3j7XN;W`|EqoAg-Gl`unVv%rcunB5L(d3ZJWfo&up9@b5>2Z4; zi}wG3&XxdLf)4ZO(>f#RTw3N>eD$No$Jv#9-Z4M2NgjFb9CrNLso}sazReetfd*nPFAUKOAe~U z-_gAaH((JuIwx}p&VkOy=sZj=^zwqfq{49)pA&E?mL*UI6mSD_CX|Aj@HtEZ15-gd zfzz9|W{-w3Fc!wac$f%Q&xg5RfL(>inVN2p2giJn9|}Me>}1~1ITW2c*$>A+XG^+6 zUdRU7AqT{RIFJ|~(Fb*mBybwJi2X9$fS+M8X!EfK&$qhl>P$#x(8$w>Y{Hz;9CX}6 z$2)YK<4uUhuMiXg%|#`VWuZ8{DL1GH1@S9JT+;C%wM{7xXd&_eZf!t^BW_~%J>p+R zJTrlAwiU?E5t<@&LRTvpouNJfC*fOAWJ3Dg(9=4=P95K3-UmnFFjS_r<>3%hLyQsb zdufR4u!0UJ^oLSV8nk0oJ5*akThPIS=FkFKK{IFoI(*Ow8pGT04!jGspf=P2ZBuxoW2FUD1#Pz1 z=6Y?WFRH$*5f)8gZKN*=WuY9%T|2br!wQ%MQ6x|pih%lcO5EZ>T!;k;AU1R$Jp0rg z9mQk&zQ%~cIis35njGNYo0Osg{3l&(7`62sReJ+6V9w}vy<6CCLlW#sAvvTl<#O}F zQ)==58i=dTEZ!ic1~-j z^fR~%H{l3q@BDt)0b4+uq}4@2kqIFY=zcE*?h}``kN1b4K}Ywrt9u9xg%L0kv@_fG z1fSCtD2Z)bwNcM}V-VHv3PI}?3E#Fo_+qzGHmgd^d z9fW*@+zkUjyR@|{TU9Kk!VIWL`%iS;RD|(Yk4GB-=Tf|-O4$zL`ZLl8J!V*{v3t<6#2~)raeZfE<_y}4;b9f&bLnEjH z+C!fTbpApIGZH|2(BTvvTH)m0#`DEP+Ql+&mkLSZ(|H#iKhl9dopZ?#H$evx0g@nThUl6gEstYBYqy(MjrAbBSAY9wNp`>@8zb=^$*Cq%vMKI zTh{ZM zL=>sqlvr8UuFNU{8@cS#+e?^zP};T2U5WeMnM0(cfVKn;FxP_`P#@ldnot#N3(2oK zRD*XxesX&o6t)i3a;4nmUmF6=Z(*arop+qK2m2Ba=JVeSAOp`B~~ z5ZT@}TX&t}98PU_!CmR~M)rcwpeOWz?(ivm0w0^Y2(&a)@ z@sqI6y?m2V{Tx(%nmug0NQPpc2%}*X41#`Ob)-K4)Xx1~cliwrFptDM4D@3FLy?0) zLtT19IR28cd`S9~BXArZ;Gwb(Gj+?eGMj+&I2Z#q-LV1Y@vgsgl#fZE;HrJAFLyPW zlO}$e8Eko{;ywoZOr%bY&p^&XPV?I+hDq@AjL)47s7nZ^WY1Z3v*yL%mSS+ zoB+8f_#%`4P2MIdAFE*%tc2yT43>h;tK4AQasn>0g6X(LD~kOEjKHw9K8jRPA{?pq*cA~tdxr|jE7b{lVcp3fwQWRO&c zWs+ccib5i!-jRly<`tMa<6_jQgE;UQ@7PEW+{OF^f-wJud<5sl#X=vf#NHz*+LP>(eL1oTsb@lHe$&`Al<+O1N9WS{Jx11&c>nA zTl2S=Ps*;b5E!9VP*tA=1(LE`U5>7rKvk6c6D8SenJ!nRhccJZF4DH#NB2@ zc13QR$!0dDTVPXONB#YSX~lkh^p>QfvmKW1B|0&mgd7|8{kC zo?oNHXCqX}RQ2lRwu)^6w#_t8$jwG)8|11qyiBpvSIkQTxq6(k15p&_i^ ze-dnlZD!>Dy!|yhznHFH%+v{Rj|ZBj)kicvE8@VZ*-p!viZu=Y2AAMJn0|wN|H<@g zYsh9$CD3K$e<5?ee|K^CkFE_ibE?6>Ce(#5Wq?}>%yxLH*+d%com6R3d7^1oFJft@R6r?VY3u#@^!!n3a^xm_;EUmZ)AP}PoxjvdqX zq7#^??d7kldYyD^OdO4%dhDS5K|eAR=?J7Y1!*6bHvZ@yU7LaI%1rN%GJ)w@k|Rye zDqvhk^SupkV%8^H6+9bguTT{B{P@XDlc;pdV=f0}K|0!Rq`gJjZzP?o=x8sJ_9tnt zlJ+lYFO&5zgSj+Bs>>8~J<^hpHYsVt(kk+-jZWIk6b;jfuoP1J(n^9hI~9j>xEDqK zf-Hjk30VwT0;D51=}0P3rKNah;I;=URm7r?#7geOArI!Nn3eM?pq#5@DwUSoszmwA z-BxJs*e0T6NGe}39(w4L9|e)QkU5d1X_<=90lV&!7C=VaLqSgtRGT_CsD}a}NVP%& zq*@|A@(t|zFr*$q#l_wn_c%yBEQlsv9j?_^Ec0vimmNbSj(K1M9&aGkZ0lhiEP+zE zDf4QMQJ^om^g?!nPoX`iz#qcfP!DQ?Dj@Jry{k6Vg4|@TtyX_^vDAULK<55<=r`Xa z!W?2}|}Q%t|uKIcVn?bPuFH)Tk~s z6tfTdLLcZ2a&HB4)3==0V(za2X9LJ#IG)2`0Q7_Yu-J`sFy=up5ERCSQ-nicB#eN0 zFasvTXqW^Opc(OuM~;KBFh*wOQkKtQqHC62=4mh$rho~M(=jWNnV>`#yLN?J1Pfq3 zd;zmSam)q9GaKf(X2sD&fn@j+WEL_n3^1?3yc|};Dp(0CU>Ph0^%MC^3VjR4aWmuJ z;x=$CUK;d$sep}`RT-)n4P0#@xrX^FY=cXn{BMU}VJGZ>t)M#D0-HhEl#c8Qr}v8% zxt{~+{Gu-QGX^PMfb*~y_Q2P$8+L&zQ31XJ8-eO&AIyYB)+Q@BTUS|)~^(lve4rj5e3e`rcPF1(6 zSXHeyl>H*)1N9TDcNz2V0e1BhHQg2X4OD}+dF1CdpU;WpJ`UGG^Y1<6pKurMzztB7 zsJfH^HJ37c6Kn}LV^%>vhua`M72+0H9qX?G$WJ;(Q;a-pAVpw1j;%&@&ObnU3KXbg zGolR0PkJ_7UC<&DKTr$ zZgNNhi6J2*0xw}DlR`4rP2n^Nr^cQJGNL25448-Ft}yB2F#giv5DtpKMwSC}cF-p} zGJ!tX5u3o7ky>7PFzXW@)*OaC4a5QIMc|ho@_|+ypA#l8<~)!aa)I+r>^QW)BG(eA zFftm}6QB(CD9n*i7IPt_B2`31kVV0+F!X+@1ZeGA6{$m)mEcV%2W6lXya77xZI@!D zW%dzB4pJx^;3>EA*egIqS1Lm3X$4UQX(N(UqBaxOeK#++l&R|YRj1u`VJ-<;cJ0FN zBk*b6)fIy_m}&?7htLk%!h28`$`eT&WF2S?t)K-ogZH5+s0JG&wV_p;_Fs)*6|971uo$$_{d1TILqQwfweej?Ks3!Rpc(X&>H0Y z{&j)3L6Itu6qImhP)Rx=n}bbM3oj+s4C+H$Xagf_l%Nt)$!#eR7{IC=3QIwtdJn#G(E)2y;JB z{~Cbo4+AstPi?FOG%gi*2n>fYC=NA|jaj9Qz^Y%N(Cn%?NI#e}8nfgSs zzLnnzpt6lej)Sp4R-AX!a?guhEj5$jO_xYBmb?gc^h)4no%CxVFw%oMYazP zg903YL$Dvdg0DgD(%B1pARjfSMC7JSDvSyxvr2ssR9i|%I!8cp_`c!aQBdOYJORf+ zo{|dmEmU)xLe;M7wpITx%xb0uNZUMWE~_Iqg;zM$&<~)DsoC)JIqj(cduS`wggk%r zdp`G5W~6fg)c)r|5vo+uKL=;PHo;lUDvbP8z+d3!0P{`EH{iNP=`{?OLB0PX@)BHi zrGA9x3g+KHH-x_-Y#;x| zV2Oq7jr1Ucpc`h*Gk?PncnVM80X&9Bpwayhsm%QaWeBRoq;E(5P|UK6XP_au03Chz zOmX|P+8&9aA?RB32E@lRF2nI7r_w0XF>9bL?nyzqZIIGe zP3Zd8MD1^@BQ*~1;;9RpYDBg14z!1qxFrT9&=OQLid2y$K_&y6h}@(jsn6b|fK;HG zQNo>FKgBm(?XQwFrWSf2>*J`IIdE21236{}@KfegdYiG@*lU44GnW9OZe%Xd z_wf|3zKy3}6U$*Tw+IQ3%#L*fl_2kWIKKt@OrB=@^vH6^vQP%9K?c*Y1+VS(HN8xb z6_yfQU*YRRks6@V5G3{VN+~Lb$1p3`Hiwc?*dsyug^&tU1X&)+L4V>afmAz{MwW## zP)cVM-@s53D zTNuap+=w-+*qmyJG{8MCk@dx_UfUXbLx_%LN_-HK$JfX)`_~Ne*V^HKQ)$;#16@5tX`RPt02|E51IMdqWFaU#D6Jfljve15La~={dT6`2cIsKpfQk zIxj0Z7}<$P-U2;$9*%t&=&nJ-_RFdYm`hAA)=bgi0()cKtmFw>Q@kzc}mm3n=?1nbjw;{KJnr#bmGi=fnvk}8~*abUb2dEP%BVS|w3Q~ar?St~L zA5Ma9QI+WvnERuD9C-|)39njGjj9&)%R`4Tejt~ojP!bL#`$_qmwNCAqkHQ|$BR&D7}Ifpx)vz?vk$e}u_ zuE|p;&Cj8%Ho6JtAp|#lY_2$&(Q71qd`_p)4FyLuFI`6oO1NR4@}+mZXRtt+586DW!AVz3hG5V&m53OP%`YTi8j#9 zCaGQ$=&n4go3}wKOF=py9kYKce<@K?S5-qOvT*D=V5u)UsDaWVmD!BQC{V=G(aCFl zUo8)49I1l!Wr%`M0N%i!8>yk8hR+d?o|74eG@!1jh}AU}kpgEzW&lNgo*glJCDYC24|>*`d?{1KncUZ8OQeIB0H;&&8qy<~QSY_V;eh_~oG-l!Y>& zU%hTk2{r4N0?quI^)-LKfmB3+375uA-!su@(YH-BVia#R(3PY*R5d3$@z_YwQ~?bp zT{kopSH!F+D$)CyX@RY^sji+%K>9MjOPIIeEs$HqV831KgnF)<^mOSjLpWt%0ch><4*v41 zsXGEK9P8sCM-~vzBh+KAa(t3j?|)C5vsP7A!TqKacDuVXXk}LIt`#D`qKFT zxtnUDLZwa2G9In=F0W)z2@G!zs__p%)c*a6yu_0xjYnpHaK4kk<&bQFgc zx7J?^TV+aiEl`y)#jnh7N551N3_CF>_dAf=KzjwYBDcV1*aRxo2IP8}4C`R6$=o%h zcJ^5qJCN6z$Qdvl`oT1q3RA$CNnQC!(kQdND@RBB5I7!^oCy09X^Ae&;ztRMLH^sa?sfgC%ZM%T)uzYJgE((WHVwj5a?$8l$kC85zF0% zA3>tlJ`%IdxV^cOUbHqA21fkv60?a)>hA1y;nX~8mOy>!24+m{hst5?2B;Mi@bWU7ds+oAJV?))0Uvd=rn@uIwz(dZqm%B zKnGB~4Y%MX+<@zF4U)t%Lp}}3lKmiNO(21Pb_dyS_$?rT%jW2(A=TrY#Cp=C>=u$S z>=MS(_-rMcS1@lw{*JtA>UIkWFMJ2%6HqDsKq@o+P^W^N4OA_V_i=w4Sr6WVduA>{ zJ%5_*-9n;0_stz_zQ-v21&`n%JOJmXwvmdoBg}+>urxl8fWcOW2eWi+RjF3=^H=(4 zb1o7LrOJ-rrf_*VjoffCOPN;ns!gT$bZ4(qc<2_PQm8*I{%)Hm7WZq1VV98#c; zzHAZ>`s`71P$u*dW9j&kx&~R~m;w|)b_GfU+A*X+sUa1}Pj>0C%_t}gX?GRbu-d$n z8TSmJ659+w;quIvjrgOX-c_th)x{5L@5y`BO1r&+ZvF2<6?$THI9FQH9LAi;X zU^A8nb8go?MC~sRkq;EHRSaf(oqLB()T6D3p=%0d|^4W&SlOJ7YYvl5lR%nB!Y z2C3m^Qf|tC;*zw9)WBRFluk9M3T}G7 zpek7OQ7)TUU_w%|k=snZ&aO-a>Ia%td!hln1tp<2q>o?J?@`CGyr^bvCajB_s#zIS z6{|hf=87o9ld#int?JPx8~ps9?d=Kzbzq|YgRwi zfY5yN0ocKl9CP5n&{Sdvkp`L)u>;KdwZ%>GcZN>T23mvM+xc7vtJD#D2lx=$yU0(0 ztd2%`U_@Hxe~jA{q^{7p7#zBW>6)d162vU7%TO?~8?rz2gFfKv%RfCR*ArP~W+SE0 zbw>}(i@5H3Gdv8xp`e$svg<;b3xD0E>5{Pnx6$~Ig0Y~CsMMcBUPuqJCw9%Vk+XF1 zoQYuuOo53+G#zQ+Yf2-x9mr|OsjgXWdIGC(UxJ=-&qsD6179HLf(<8~d9VN$N)m1n zQdjaN$lO|u+e^P)60F4IHxzYwUxryFU4dK<$;qG+?}fQNS8u%rS%+P>hjQ1&_5!Hp z&LL03k8lcfW&aL&686JB*sCi43U>lZU~%CPm9-!V7@2S8yCB9Fjf zu$hzIH*i$#F9mS|j)OeEg}_JyYd}@{FV|nX--8PA1ISNReHN7YGw>4x>dP!W`LEK& z(*`(?gA!GwYIFSt>@S#qg+Y90L|^N>jkzfD9`ZVh2;^+b`93JxB#oul*hLCPuG`G>)%fR|amu4N%+b!w|WUpJ2ZU zcR+4`BL9H9(3m*O!721q5EVd~&yMtE;hz%JDtjHMB$;tjX_Qb9W|c~js$};eEt#?< zyn^3T+=h{WGWi(uBX|I^KXm0^Nc9Kj5A)x^eTgsViW`9z&^D4Mcq)KyT;h>|bPx_6 zkUb6rgFed~8{$GfGL;sY6jDPnNChb&A%sE*#D@gnh2#lne+5*aB#;=okZ>ZTB1i#Y zpwHtg^7N3wHD^L*gy!h~cM{J^m~5cU9*^|KE+>{EPzZ8BG{{XqjG-UNhyeZYO&-V% zxgalSH>>?IoHm%{Ul0m_bZi*8$*y>$W5dhr(=Tr*F`>@U5A>@X>LBV&>Knzd+a9hy zVf%ynz%H6dw+;H`j*_5X@38SGj1T)~pfLJQXAP(YpA%0ljsG%ON@A%Er7)*Q#s>|b zTm3V3l4M z(HkUGlW?la>QD!}GL#mX5R?(=#B^7N?Mle{`<@U`w*pD=v?Y60MEa$puFwT)gT}U+ zNY{(@*!2dt6|yeWfvj}w{?uT7%+hU!d>^z|ya7^^(_8v5u~pFT5WNF$!+Y>9DBuT3 ztJ55_ji@1JA_!^>ji4zs0qsE9PiFM+L}q6v3h~%DtZa#H3$?!zQBRfB3-2~~vgEb=V_z0va z(N=jOs--sy`H;Dw2-JoAP!oFK*Bv4-Ym_KlPwbMtka>^_69RIR-TL*#zmKaUH{sJF zVjzwKpcSi|{zzT<r~tZQ(oqVTmCLc9z>|=l!$g<><6#_pi=QG> z`FkjatQN2*aO?a zcI-8nN2~o+1NJ6l1CAQkYvqaidgMBgj?9WsauaNXKpkt|g8OFIPhq#gR!~@xllV0n zR9N5F7!>&~tpzpRe%x#U4`3dL zn`XZ_ae|6EPh#b%2nOL<6tw6FTySV!P$qAW3?UdDFW$z>qe2!m+qmFH$QLQiJXYDV{}Ax(8DV%KM52)p=HnAGw1XP z_FTgyAuh4aowx)_Y`pQjZNmSlm*=Wquc#Rv&l?tA-L-B^v-iyL<9}Zy^(b;2SuCi& z*&WYYGsSr~rOs21CGI<{hDqZ2>Z-{S-&-R1BWGOJN`z_ zWx6Kxri@cCqG(VdQ!bG=Wkwmx-KBSva_EGLZzmmey7G&Z-!pSViL9g9D&d4q5!dM) z3C*og3KtMzpsy2oinvafaNNU!&;4oU^z^17%X6EChM93SLsOem3B6Sl6ujqeUB8~k z2^!`pWf~C)NFG_fldJhM!nKvxh!#GfP4r*u4D&gLye+I-9lQbP-rOAs(cYsiQKDXb5 z?2|W~s#@+ne<;RJ(1ir1SvvaqBQ!Fhk#_yTxV;Y4eflEaFf%=a_kFs-+4MwM!jwx- z1NcRP5+NRbX(TK?Ch{D`fBs6m}dYgKJ&9jW&usFeqP&Cc6F^{rXh;52w@)q+9F`YAc!-`D7 zPwnv8s$-YNtsT3O+AbUstr=vg>ofR5UthDZ)!*V16;YUL2S1Nxc4YFl4$qs|-@VGu zZ$0?vuxE9gmU31Y{`o3y6qo4e!lprHZ_VI?iOr(S-WuT(llZ&Zp6LbmJ{%A~yA!Q5 zBP}tBvv{M^?Lo04gDd^VOw+moAF*}Z9kk0m$XWFw}0hM!ff znXY>ZkA8Wl-{RWoPt2Hba;uYM5hZB@xYC`7;}updA4zFWX7@&UDw{Yt7=cciQ<-)- zyaoPI}Whqps4&va8Rk2kZ8h|5orpo`(AZys`WC)`ZQ0OZazns~Od585t z&FHnEe#~O}MQUP0BPSa7+vHBtvr?a2jz-bq#GA=vY)DKc%u!+rZ=Tf?loq`L8FCiy zu&dw@e@unZ>t#Gq=uI@Es~}dJj)V$6p4HTeqA+)}nhRB(!pv1B z##cpDH05M#X!^g8Xk#Kv)5*y{1EvHHqfEKNh-KzzebPCY!<=hOeO=38#ucW%LQK*o z_+~QYY9or8+G^XXrfV%kW0SN9qNB-M#2X#FFQ;i%gb)qQ_&2=KW>r&$v){}t_!tdO zGE<-^Q!lmCw@Fwb-E)PmDf+@?=u z;*|5I_lz;V(yu9=+e4lH_m8Z&eaz`asnkRLd1HblBmNe(HTt|Z-1_$C!o)A0#s zjg!HNrj)v&KUQV1=<~pVRoS&1S1nt_7g=*#H&D}w^+hI~-k!>gEblGqA4{qHwd*#j zqwVj2wtn4=J$H0eUh1la>lN_?g)@Nv8k7BMt9D_l>GiDib)o5mPZoTlK3cx1=HoHn zxkH;8a=Swhv$_In3U?s8qr)jsSh`(#{L%gqx9h}l@tc1WFfSA}p;catgu&)m#pg{J ze7l$_Sl97XR^2gXrWIrCmN5mI;>5%`rxI6xC)H@zs$rP9GF^L#c}F6d8D9DMxC(y! za*F#S{~}_wxb`^HwL2yI%NmdsXG(YL!#`7*eAVbEcDDD2 zvuUZTGfhr737Ee%mDMi}N85KH? zDamT;d2XGnMwsR|r~4*0y%hheyNFeCee)YnYj4W9%GWEGbncjQ7jD7sf{d;mu1waF5VuFpipO2*{QrNA;|}B)HTKdP_y1Lue>v!mGpC=0#k_6= zna3<3!;e+;=umgRv1_Z1n{<9gIM*k4aKAJ>(*)nFXl}QmzxXdOT1FNM53lUM=eWKh zB$=mr$DkLZ#NQt2B2Y*}>>o@h6@2DtlS?lKnA=ldJ#g&kdbMx5l-!ai)HqZ^)a|=5@@(fW|NYeSUgBOkUcSQm z?}<$8Hvd?}JP+rekN>Ab!L!MfYU`a|WM5T}^CIoS;FJ|^^xNdiq6c9-M~w)Ms2ANII+^VkcYOI1yxcHVx$_o|w4?YvRprK|a$-CQ<_O77_%c0Gk2lJazn%`E0@ zJ1#7Z&4YH{iV3=*rz`R>Q}ILZ`rv(4P2cw1xmB<3cdoYV+2Y@G-3ZkK9w!GuO-zCI zEGhhot-05^)Sl&`;~ExTsfPdAO@fbFrYn#zBpY);p$J|8XuVOh1F3#&+H_!nThttr z?M*XxUucTB&XbfnW@T5Lnw#_;tzLBS!&;_k7qa86?Vlc2E$@--?56uX5@4J<4_h;s z+31HCK_Ml@c>DXNJ$h_^V?GM*)7X#Aw;jFxJ@1?GU3eqXsS}O2)C})Lo{O99od{Zy zkGUx5gLntKHCw-|z7y2B{cmXQpuj@|Z)dL4d+M5R3Wv51{;{rERVXx#SZ{d61^>>4k8wTh9^>!ETtBXWL=_z}VTZ{hMHj~?X)0!t;d3EH5_j{WUKEmmR zIqk+HA9+s)hi9qpf3lq@=kZ0q_&N_J`@EGbqIU0zoOfU;c^()Q)+uaMBo8r9*Ea>bbA9qxV)$(o z^*HM9Ry~U5>Az$uirigm(Hdg8E5%uSv+azy0Fzu)Ju{oknIy zFGg4#_O9wBU+v1Xi(ILn?>yS*s_nzfonBO1G2`uxuwkQli}`Zuo^|Hq-roM{b~o{N z&RTC~%(pl9Z|R+MBT)}J(ZnR_er*}z`Qm#|12-*ZiR(>FQ#8W=MnjF$ zrSX@iijVJ*$%(^x^6Y=mZ+7&AK4 z8s_mBpO5@!H8tPmowffBvDFFR-qL?>-MR0?ia#vObCmSlH??z&r=L@7y-~LBQvL63 zZD=~yi6(eD6_qlM-tVq6bw3E@ee?%rRijY*KKkX*rdWUG5BCjlsOi|BRNRPinYpsn zGFuTZNAiz1!#2{FUKisS5QD$4sbjPA=6d26o((Ud2?fY<1*dKFew$M0puPjIL(e!s>NS{yRl-}P3 zpJM(8ALrVezJtB3)9vlxAIop#8?fen+5$rrmM0^0%I`W%9-=4G9ZcFGT*j_H zYXqO}Y_V^={ z#4sr&F=d9+C@)!~Z8n2Xe_{&Wq3`)KmB#EE&Z7#q3^wBOX8d$|OC3{gCX+|APyJW6 zRF4Lv$XGU!_eFL-HvK2^=GiIaP;+b|sk)hAr%dKa0huUd?qKz7Grk2cTwhLBTdwqH z^U~Y&8cC3si|ls{Pu{~n_}1n~opRLlmdnVJCOoDBSKSR<&P0xKx@mPpc>SLKZgJ%6 zU*=vsyzD1J72>@fE!5WdP$)bUg-lfZjv)toPTE*qFK66Kz(Ra<1>QgPboMo#zYD&o zgKg$0L4!~BG*?FPgsPUAIhw{TG@5NGj=8_*9g}ek&!xJWjuM5;)-lZOSNr%$XCb7?Yj+xXAE=Jptx^Y6Z<#zQXRS;o>&IG{C_g7{m6(b846TxKL9yg2(t^}2HN znoVUVj7q= zIN0?xW5zj~Z0cUF z{{H@N#;U)|2R|NUGJH4>NI@w*%VovD>OdiMPFvYm)&vR!p^3sgshP4%COX9D$A}vSwC$(DD%H`=->+rM} zdFh9bHd-_<@vL&G@6YMV=H}n6lyKu}f4=YCYiBZO47Zut19~Ev%Wj# z{PD&Zxu%FNneom0vnX{cv-Ji=IYb#e!_9J>!Y54dzq^Q&)r3~NmZ8{-=3ZxhMj`mv z1oLDTE6Lwc)CG3JZ!^a&pOR7YyxX7L@#gQdPCdCJl-+`y{_`psbyVdJE8k^O`W+EGl_AU-bUk()pjF0 z9%FVVJ8M@koxk8(^Xfn^m%=~8M|+$gVgHzi{!vur%H*2wO_t!J$^O~J->G<1tNA

GdU*?yg__ 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 N{5Gg&3?M6-{tx|0abf@f From 8226b644ae083f8252c74735c8ade96e695f7de7 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 16 Jan 2025 15:45:29 +0100 Subject: [PATCH 3/3] fix double registration of auth middleware on data routes --- app/src/auth/middlewares.ts | 33 ++++++++++++++++-------------- app/src/data/api/DataController.ts | 4 +--- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts index 50fd2d4..f36c94b 100644 --- a/app/src/auth/middlewares.ts +++ b/app/src/auth/middlewares.ts @@ -26,25 +26,28 @@ export const auth = (options?: { skip?: (string | RegExp)[]; }) => createMiddleware(async (c, next) => { - // make sure to only register once - if (c.get("auth_registered")) { - throw new Error(`auth middleware already registered for ${getPath(c)}`); - } - c.set("auth_registered", true); - const app = c.get("app"); - const skipped = shouldSkip(c, options?.skip) || !app?.module.auth.enabled; const guard = app?.modules.ctx().guard; const authenticator = app?.module.auth.authenticator; - if (!skipped) { - const resolved = c.get("auth_resolved"); - if (!resolved) { - if (!app.module.auth.enabled) { - guard?.setUserContext(undefined); - } else { - guard?.setUserContext(await authenticator?.resolveAuthFromRequest(c)); - c.set("auth_resolved", true); + let skipped = shouldSkip(c, options?.skip) || !app?.module.auth.enabled; + + // make sure to only register once + if (c.get("auth_registered")) { + skipped = true; + console.warn(`auth middleware already registered for ${getPath(c)}`); + } else { + c.set("auth_registered", true); + + if (!skipped) { + const resolved = c.get("auth_resolved"); + if (!resolved) { + if (!app?.module.auth.enabled) { + guard?.setUserContext(undefined); + } else { + guard?.setUserContext(await authenticator?.resolveAuthFromRequest(c)); + c.set("auth_resolved", true); + } } } } diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 497ffa9..6735c7a 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -70,7 +70,7 @@ export class DataController extends Controller { override getController() { const { permission, auth } = this.middlewares; - const hono = this.create().use(auth()); + const hono = this.create().use(auth(), permission(SystemPermissions.accessApi)); const definedEntities = this.em.entities.map((e) => e.name); const tbNumber = Type.Transform(Type.String({ pattern: "^[1-9][0-9]{0,}$" })) @@ -85,8 +85,6 @@ export class DataController extends Controller { return func; } - hono.use("*", permission(SystemPermissions.accessApi)); - // info hono.get( "/",