From 68af4d556b6643593b02e0df6b876f826bc4224f Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 14 Jun 2021 13:50:36 +0100 Subject: [PATCH 001/140] Add allowedInstallationIds list to each github app This allows a single instance of backstage to optionally limit the set of github app installations that may be used by backstage. Previously, if you had github app installations for tenant1 and tenant2 there was nothing stopping the first from accessing resources of the second. The default behaviour of the GithubCredentialsProvider remains the same. Signed-off-by: Brian Fletcher --- .changeset/ninety-worms-kick.md | 5 +++++ docs/plugins/github-apps.md | 20 +++++++++++++++++++ .../src/github/GithubCredentialsProvider.ts | 13 ++++++++++++ packages/integration/src/github/config.ts | 7 +++++++ 4 files changed, 45 insertions(+) create mode 100644 .changeset/ninety-worms-kick.md diff --git a/.changeset/ninety-worms-kick.md b/.changeset/ninety-worms-kick.md new file mode 100644 index 0000000000..5170dbbdce --- /dev/null +++ b/.changeset/ninety-worms-kick.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +adds an allow list of github installations diff --git a/docs/plugins/github-apps.md b/docs/plugins/github-apps.md index 87d23b45d5..5e69ae8294 100644 --- a/docs/plugins/github-apps.md +++ b/docs/plugins/github-apps.md @@ -84,3 +84,23 @@ integrations: apps: - $include: example-backstage-app-credentials.yaml ``` + +### Limiting the Github App installations + +If you want to limit the Github app installations visible to backstage you +may optionally include the `allowedInstallationIds` option. + +```yaml +appId: 1 +allowedInstallationIds: [1234] +clientId: client id +clientSecret: client secret +webhookSecret: webhook secret +privateKey: | + -----BEGIN RSA PRIVATE KEY----- + ...Key content... + -----END RSA PRIVATE KEY----- +``` + +This will result in backstage preventing the use of any installation that is not within the +allow list. diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index 9bc09deab3..8dbc3e7a69 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -68,8 +68,10 @@ class GithubAppManager { private readonly baseAuthConfig: { appId: number; privateKey: string }; private installations?: RestEndpointMethodTypes['apps']['listInstallations']['response']; private readonly cache = new Cache(); + private readonly allowedInstallations: number[] | undefined; // undefined allows all installations constructor(config: GithubAppConfig, baseUrl?: string) { + this.allowedInstallations = config.allowedInstallations; this.baseAuthConfig = { appId: config.appId, privateKey: config.privateKey, @@ -91,6 +93,17 @@ class GithubAppManager { suspended, repositorySelection, } = await this.getInstallationData(owner); + if (this.allowedInstallations) { + if (!this.allowedInstallations?.includes(installationId)) { + throw new Error( + `The GitHub application for ${[owner, repo] + .filter(Boolean) + .join( + '/', + )} is not included in the allowed installation list (${installationId}).`, + ); + } + } if (suspended) { throw new Error( `The GitHub application for ${[owner, repo] diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 94ed00731e..370aed9c8b 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -93,6 +93,10 @@ export type GithubAppConfig = { * Client secrets can be generated at https://github.com/organizations/$org/settings/apps/$AppName */ clientSecret: string; + /** + * List of installations allowed to be used by this backstage https://github.com/app/installations/$InstallationId + */ + allowedInstallations?: number[]; }; /** @@ -113,6 +117,9 @@ export function readGitHubIntegrationConfig( clientSecret: c.getString('clientSecret'), webhookSecret: c.getString('webhookSecret'), privateKey: c.getString('privateKey'), + allowedInstallations: c + .getOptionalStringArray('allowedInstallations') + ?.map(allowedInstallation => Number(allowedInstallation)), })); if (!isValidHost(host)) { From 5fa0c32bffaeb8cdfa98f3691fbf5f92582d68d6 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 14 Jun 2021 14:15:02 +0100 Subject: [PATCH 002/140] Fixes some typos in changeset and docs Signed-off-by: Brian Fletcher --- .changeset/ninety-worms-kick.md | 2 +- docs/plugins/github-apps.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.changeset/ninety-worms-kick.md b/.changeset/ninety-worms-kick.md index 5170dbbdce..f350c6eb31 100644 --- a/.changeset/ninety-worms-kick.md +++ b/.changeset/ninety-worms-kick.md @@ -2,4 +2,4 @@ '@backstage/integration': patch --- -adds an allow list of github installations +Adds an allow list of GitHub installations diff --git a/docs/plugins/github-apps.md b/docs/plugins/github-apps.md index 5e69ae8294..386320cbb3 100644 --- a/docs/plugins/github-apps.md +++ b/docs/plugins/github-apps.md @@ -85,10 +85,10 @@ integrations: - $include: example-backstage-app-credentials.yaml ``` -### Limiting the Github App installations +### Limiting the GitHub App installations -If you want to limit the Github app installations visible to backstage you -may optionally include the `allowedInstallationIds` option. +If you want to limit the GitHub app installations visible to backstage you may +optionally include the `allowedInstallationIds` option. ```yaml appId: 1 @@ -102,5 +102,5 @@ privateKey: | -----END RSA PRIVATE KEY----- ``` -This will result in backstage preventing the use of any installation that is not within the -allow list. +This will result in backstage preventing the use of any installation that is not +within the allow list. From beb1d7812c2509e9171f3079a79aaedfd1b8b2da Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 14 Jul 2021 08:52:03 +0100 Subject: [PATCH 003/140] changing to using the installation owner over id Signed-off-by: Brian Fletcher --- .../src/github/GithubCredentialsProvider.ts | 8 ++++---- packages/integration/src/github/config.ts | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index 8dbc3e7a69..9988d669f3 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -68,10 +68,10 @@ class GithubAppManager { private readonly baseAuthConfig: { appId: number; privateKey: string }; private installations?: RestEndpointMethodTypes['apps']['listInstallations']['response']; private readonly cache = new Cache(); - private readonly allowedInstallations: number[] | undefined; // undefined allows all installations + private readonly allowedInstallationOwners: string[] | undefined; // undefined allows all installations constructor(config: GithubAppConfig, baseUrl?: string) { - this.allowedInstallations = config.allowedInstallations; + this.allowedInstallationOwners = config.allowedInstallationOwners; this.baseAuthConfig = { appId: config.appId, privateKey: config.privateKey, @@ -93,8 +93,8 @@ class GithubAppManager { suspended, repositorySelection, } = await this.getInstallationData(owner); - if (this.allowedInstallations) { - if (!this.allowedInstallations?.includes(installationId)) { + if (this.allowedInstallationOwners) { + if (!this.allowedInstallationOwners?.includes(owner)) { throw new Error( `The GitHub application for ${[owner, repo] .filter(Boolean) diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts index 370aed9c8b..f530879959 100644 --- a/packages/integration/src/github/config.ts +++ b/packages/integration/src/github/config.ts @@ -94,9 +94,9 @@ export type GithubAppConfig = { */ clientSecret: string; /** - * List of installations allowed to be used by this backstage https://github.com/app/installations/$InstallationId + * List of installation owners allowed to be used by this backstage https://github.com/app/installations/$InstallationId */ - allowedInstallations?: number[]; + allowedInstallationOwners?: string[]; }; /** @@ -117,9 +117,9 @@ export function readGitHubIntegrationConfig( clientSecret: c.getString('clientSecret'), webhookSecret: c.getString('webhookSecret'), privateKey: c.getString('privateKey'), - allowedInstallations: c - .getOptionalStringArray('allowedInstallations') - ?.map(allowedInstallation => Number(allowedInstallation)), + allowedInstallationOwners: c.getOptionalStringArray( + 'allowedInstallationOwners', + ), })); if (!isValidHost(host)) { From e1178b43613ff4c15a9479a0996bfe4cfb6f36b7 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 14 Jul 2021 08:57:51 +0100 Subject: [PATCH 004/140] update github readme to include owners filter Signed-off-by: Brian Fletcher --- docs/plugins/github-apps.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins/github-apps.md b/docs/plugins/github-apps.md index 81fc870593..8d86c03220 100644 --- a/docs/plugins/github-apps.md +++ b/docs/plugins/github-apps.md @@ -92,11 +92,11 @@ integrations: ### Limiting the GitHub App installations If you want to limit the GitHub app installations visible to backstage you may -optionally include the `allowedInstallationIds` option. +optionally include the `allowedInstallationOwners` option. ```yaml appId: 1 -allowedInstallationIds: [1234] +allowedInstallationOwners: [1234] clientId: client id clientSecret: client secret webhookSecret: webhook secret From 5fd31c2f46502d77f5a3818e9a4cc3c65b09fb92 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 19 Jul 2021 17:20:59 +0100 Subject: [PATCH 005/140] remove repo filtering on the github credentials The github-org processor does not use the concept of repositories. As such filtering based on selected repositories does not make sense for that processer. The GithubCredentials was imposing what appears like an unnessesary restriction on the tokens using the repo name. By removing this restriction, it enalbes the github-org processor to work when a github app installation has a repository restriction. Signed-off-by: Brian Fletcher --- .changeset/serious-kiwis-wonder.md | 5 +++++ .../github/GithubCredentialsProvider.test.ts | 13 ++++++------ .../src/github/GithubCredentialsProvider.ts | 20 +++---------------- 3 files changed, 14 insertions(+), 24 deletions(-) create mode 100644 .changeset/serious-kiwis-wonder.md diff --git a/.changeset/serious-kiwis-wonder.md b/.changeset/serious-kiwis-wonder.md new file mode 100644 index 0000000000..4c6daa768b --- /dev/null +++ b/.changeset/serious-kiwis-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +remove repo restriction from github creds provider diff --git a/packages/integration/src/github/GithubCredentialsProvider.test.ts b/packages/integration/src/github/GithubCredentialsProvider.test.ts index 85df1bb4e1..9472e0ae58 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.test.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.test.ts @@ -156,13 +156,12 @@ describe('GithubCredentialsProvider tests', () => { }, } as RestEndpointMethodTypes['apps']['createInstallationAccessToken']['response']); - await expect( - github.getCredentials({ - url: 'https://github.com/backstage', - }), - ).rejects.toThrow( - 'The Backstage GitHub application used in the backstage organization must be installed for the entire organization to be able to issue credentials without a specified repository.', - ); + const { token, headers } = await github.getCredentials({ + url: 'https://github.com/backstage', + }); + + expect(headers).toEqual({ Authorization: 'Bearer secret_token' }); + expect(token).toEqual('secret_token'); }); it('should throw if the app is suspended', async () => { diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index 899b233195..ea4fa737ec 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -23,7 +23,6 @@ import { DateTime } from 'luxon'; type InstallationData = { installationId: number; suspended: boolean; - repositorySelection: 'selected' | 'all'; }; class Cache { @@ -85,33 +84,21 @@ class GithubAppManager { owner: string, repo?: string, ): Promise<{ accessToken: string }> { - const { - installationId, - suspended, - repositorySelection, - } = await this.getInstallationData(owner); + const { installationId, suspended } = await this.getInstallationData(owner); if (suspended) { throw new Error( - `The GitHub application for ${[owner, repo] + `The GitHub application for ${[owner] .filter(Boolean) .join('/')} is suspended`, ); } - if (repositorySelection !== 'all' && !repo) { - throw new Error( - `The Backstage GitHub application used in the ${owner} organization must be installed for the entire organization to be able to issue credentials without a specified repository.`, - ); - } - const cacheKey = !repo ? owner : `${owner}/${repo}`; - const repositories = repositorySelection !== 'all' ? [repo!] : undefined; + const cacheKey = repo ? `${owner}/${repo}` : owner; - // Go and grab an access token for the app scoped to a repository if provided, if not use the organisation installation. return this.cache.getOrCreateToken(cacheKey, async () => { const result = await this.appClient.apps.createInstallationAccessToken({ installation_id: installationId, headers: HEADERS, - repositories, }); return { token: result.data.token, @@ -135,7 +122,6 @@ class GithubAppManager { return { installationId: installation.id, suspended: Boolean(installation.suspended_by), - repositorySelection: installation.repository_selection, }; } const notFoundError = new Error( From 2473096aa6176a71af4af6993262d935da49896b Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 19 Jul 2021 18:13:00 +0100 Subject: [PATCH 006/140] Fix typos in the changeset file Signed-off-by: Brian Fletcher --- .changeset/serious-kiwis-wonder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/serious-kiwis-wonder.md b/.changeset/serious-kiwis-wonder.md index 4c6daa768b..0deba49616 100644 --- a/.changeset/serious-kiwis-wonder.md +++ b/.changeset/serious-kiwis-wonder.md @@ -2,4 +2,4 @@ '@backstage/integration': patch --- -remove repo restriction from github creds provider +Remove repo restriction from GitHub credentials provider From 619cb40662dc7a7a114e4c62975fea70fe950379 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 19 Jul 2021 18:51:10 +0100 Subject: [PATCH 007/140] try to work around codeql failure for test purposes Signed-off-by: Brian Fletcher --- .../src/github/GithubCredentialsProvider.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/integration/src/github/GithubCredentialsProvider.test.ts b/packages/integration/src/github/GithubCredentialsProvider.test.ts index 9472e0ae58..a0eb3d9596 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.test.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.test.ts @@ -133,7 +133,7 @@ describe('GithubCredentialsProvider tests', () => { expect(token).toEqual('secret_token'); }); - it('should fail to issue tokens for an organization when the app is installed for a single repo', async () => { + it('should not fail to issue tokens for an organization when the app is installed for a single repo', async () => { octokit.apps.listInstallations.mockResolvedValue({ headers: { etag: '123', @@ -159,8 +159,8 @@ describe('GithubCredentialsProvider tests', () => { const { token, headers } = await github.getCredentials({ url: 'https://github.com/backstage', }); - - expect(headers).toEqual({ Authorization: 'Bearer secret_token' }); + const expectedToken = 'secret_token'; + expect(headers).toEqual({ Authorization: `Bearer ${expectedToken}` }); expect(token).toEqual('secret_token'); }); From b0578306b69aba6eb754119a7a2bf45cdb6b2eb0 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Tue, 20 Jul 2021 13:57:10 +0100 Subject: [PATCH 008/140] fix the github-disovery when the repos are filtered Signed-off-by: Brian Fletcher --- .../src/github/GithubCredentialsProvider.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/integration/src/github/GithubCredentialsProvider.ts b/packages/integration/src/github/GithubCredentialsProvider.ts index ea4fa737ec..ebd9fce745 100644 --- a/packages/integration/src/github/GithubCredentialsProvider.ts +++ b/packages/integration/src/github/GithubCredentialsProvider.ts @@ -100,6 +100,20 @@ class GithubAppManager { installation_id: installationId, headers: HEADERS, }); + if (repo && result.data.repository_selection === 'selected') { + const installationClient = new Octokit({ + auth: result.data.token, + }); + const repos = await installationClient.apps.listReposAccessibleToInstallation(); + const hasRepo = repos.data.repositories.some(repository => { + return repository.name === repo; + }); + if (!hasRepo) { + throw new Error( + `The Backstage GitHub application used in the ${owner} organization does not have access to a repository with the name ${repo}`, + ); + } + } return { token: result.data.token, expiresAt: DateTime.fromISO(result.data.expires_at), @@ -219,7 +233,10 @@ export class GithubCredentialsProvider { const parsed = parseGitUrl(opts.url); const owner = parsed.owner || parsed.name; - const repo = parsed.owner ? parsed.name : undefined; + let repo = parsed.owner ? parsed.name : undefined; + // the github-discovery plugin passes an • as a repo name. This simply means it wants access to all repos + // that are available to the installation. + repo = repo === '*' ? undefined : repo; let type: GithubCredentialType = 'app'; let token = await this.githubAppCredentialsMux.getAppToken(owner, repo); From 110bebc37efbb11ffe801a2c1347d84345e55c24 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 30 Jul 2021 11:38:31 +0200 Subject: [PATCH 009/140] Fix MaterialUI errors & warnings Signed-off-by: Philipp Hugenroth --- packages/core-components/src/layout/Content/Content.tsx | 7 ++++++- packages/core-components/src/layout/Sidebar/Items.tsx | 2 +- plugins/shortcuts/src/AddShortcut.tsx | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core-components/src/layout/Content/Content.tsx b/packages/core-components/src/layout/Content/Content.tsx index cb6a841cf3..323565159a 100644 --- a/packages/core-components/src/layout/Content/Content.tsx +++ b/packages/core-components/src/layout/Content/Content.tsx @@ -24,7 +24,12 @@ const useStyles = makeStyles((theme: Theme) => ({ minWidth: 0, paddingTop: theme.spacing(3), paddingBottom: theme.spacing(3), - ...theme.mixins.gutters({}), + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(2), + [theme.breakpoints.up('sm')]: { + paddingLeft: theme.spacing(3), + paddingRight: theme.spacing(3), + }, }, stretch: { display: 'flex', diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx index d675b73a2c..b930c455b5 100644 --- a/packages/core-components/src/layout/Sidebar/Items.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.tsx @@ -167,7 +167,7 @@ export const SidebarItem = forwardRef((props, ref) => { diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index 4429dbaeb0..87c2750206 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -86,7 +86,7 @@ export const AddShortcut = ({ onClose, anchorEl, api }: Props) => { Date: Thu, 15 Jul 2021 11:45:43 +0200 Subject: [PATCH 010/140] Remove stale TechDocs artifacts after publishing new version for GCS Co-authored-by: Camila Belo Co-authored-by: Eric Peterson Signed-off-by: Otto Sichert --- .../src/stages/publish/googleStorage.ts | 100 +++++++++++------- .../src/stages/publish/helpers.ts | 40 +++++++ 2 files changed, 100 insertions(+), 40 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/googleStorage.ts b/packages/techdocs-common/src/stages/publish/googleStorage.ts index 9def24722a..349d6ead97 100644 --- a/packages/techdocs-common/src/stages/publish/googleStorage.ts +++ b/packages/techdocs-common/src/stages/publish/googleStorage.ts @@ -15,18 +15,19 @@ */ import { Entity, EntityName } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; -import { - FileExistsResponse, - Storage, - UploadResponse, -} from '@google-cloud/storage'; +import { FileExistsResponse, Storage } from '@google-cloud/storage'; import express from 'express'; import JSON5 from 'json5'; -import createLimiter from 'p-limit'; import path from 'path'; import { Readable } from 'stream'; import { Logger } from 'winston'; -import { getFileTreeRecursively, getHeadersForFileExtension } from './helpers'; +import { + bulkStorageOperation, + getCloudPathForLocalPath, + getFileTreeRecursively, + getHeadersForFileExtension, + getStaleFiles, +} from './helpers'; import { MigrateWriteStream } from './migrations'; import { PublisherBase, @@ -114,49 +115,68 @@ export class GoogleGCSPublish implements PublisherBase { * Directory structure used in the bucket is - entityNamespace/entityKind/entityName/index.html */ async publish({ entity, directory }: PublishRequest): Promise { + const bucket = this.storageClient.bucket(this.bucketName); + + // First, retrieve a list of all individual files in currently existing + const remoteFolder = getCloudPathForLocalPath(entity); + const existingFiles = ( + await bucket.getFiles({ prefix: remoteFolder }) + )[0].map(file => file.name); + + // Then, merge new files into the same folder + let absoluteFilesToUpload; try { - // Note: GCS manages creation of parent directories if they do not exist. - // So collecting path of only the files is good enough. - const allFilesToUpload = await getFileTreeRecursively(directory); + // Remove the absolute path prefix of the source directory + // Path of all files to upload, relative to the root of the source directory + // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] + absoluteFilesToUpload = await getFileTreeRecursively(directory); - const limiter = createLimiter(10); - const uploadPromises: Array> = []; - allFilesToUpload.forEach(sourceFilePath => { - // Remove the absolute path prefix of the source directory - // Path of all files to upload, relative to the root of the source directory - // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] - const relativeFilePath = path.relative(directory, sourceFilePath); - - // Convert destination file path to a POSIX path for uploading. - // GCS expects / as path separator and relativeFilePath will contain \\ on Windows. - // https://cloud.google.com/storage/docs/gsutil/addlhelp/HowSubdirectoriesWork - const relativeFilePathPosix = relativeFilePath - .split(path.sep) - .join(path.posix.sep); - - // The / delimiter is intentional since it represents the cloud storage and not the local file system. - const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; - const destination = `${entityRootDir}/${relativeFilePathPosix}`; // GCS Bucket file relative path - - // Rate limit the concurrent execution of file uploads to batches of 10 (per publish) - const uploadFile = limiter(() => - this.storageClient.bucket(this.bucketName).upload(sourceFilePath, { - destination, - }), - ); - uploadPromises.push(uploadFile); - }); - - await Promise.all(uploadPromises); + await bulkStorageOperation( + async absoluteFilePath => { + const relativeFilePath = path.relative(directory, absoluteFilePath); + return await bucket.upload(absoluteFilePath, { + destination: getCloudPathForLocalPath(entity, relativeFilePath), + }); + }, + absoluteFilesToUpload, + { concurrencyLimit: 10 }, + ); this.logger.info( - `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, + `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${absoluteFilesToUpload.length}`, ); } catch (e) { const errorMessage = `Unable to upload file(s) to Google Cloud Storage. ${e}`; this.logger.error(errorMessage); throw new Error(errorMessage); } + + // Last, try to remove the files that were *only* present previously + try { + const relativeFilesToUpload = absoluteFilesToUpload.map( + absoluteFilePath => + getCloudPathForLocalPath( + entity, + path.relative(directory, absoluteFilePath), + ), + ); + const staleFiles = getStaleFiles(relativeFilesToUpload, existingFiles); + + await bulkStorageOperation( + async relativeFilePath => { + return await bucket.file(relativeFilePath).delete(); + }, + staleFiles, + { concurrencyLimit: 10 }, + ); + + this.logger.info( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: ${staleFiles.length}`, + ); + } catch (error) { + const errorMessage = `Unable to delete file(s) from Google Cloud Storage. ${error}`; + this.logger.error(errorMessage); + } } fetchTechDocsMetadata(entityName: EntityName): Promise { diff --git a/packages/techdocs-common/src/stages/publish/helpers.ts b/packages/techdocs-common/src/stages/publish/helpers.ts index ed681eb8ba..1f77d33971 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.ts @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; import mime from 'mime-types'; +import path from 'path'; +import createLimiter from 'p-limit'; import recursiveReadDir from 'recursive-readdir'; /** @@ -110,4 +113,41 @@ export const lowerCaseEntityTripletInStoragePath = ( const lowerKind = kind.toLowerCase(); const lowerName = name.toLowerCase(); return [lowerNamespace, lowerKind, lowerName, ...parts].join('/'); +} + +// Only returns the files that existed previously and are not present anymore. +export const getStaleFiles = ( + newFiles: string[], + oldFiles: string[], +): string[] => { + const staleFiles = new Set(oldFiles); + newFiles.forEach(newFile => { + staleFiles.delete(newFile); + }); + return Array.from(staleFiles); +}; + +// Compose actual filename on remote bucket including entity information +export const getCloudPathForLocalPath = ( + entity: Entity, + localPath = '', +): string => { + // Convert destination file path to a POSIX path for uploading. + // GCS expects / as path separator and relativeFilePath will contain \\ on Windows. + // https://cloud.google.com/storage/docs/gsutil/addlhelp/HowSubdirectoriesWork + const relativeFilePathPosix = localPath.split(path.sep).join(path.posix.sep); + + // The / delimiter is intentional since it represents the cloud storage and not the local file system. + const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; + return `${entityRootDir}/${relativeFilePathPosix}`; // GCS Bucket file relative path +}; + +// Perform rate limited generic operations by passing a function and a list of arguments +export const bulkStorageOperation = async ( + operation: (arg: T) => Promise, + args: T[], + { concurrencyLimit } = { concurrencyLimit: 25 }, +) => { + const limiter = createLimiter(concurrencyLimit); + await Promise.all(args.map(arg => limiter(operation, arg))); }; From 06b507283b940dd9ebeef2f43c11a43255d7ef58 Mon Sep 17 00:00:00 2001 From: Otto Sichert Date: Wed, 21 Jul 2021 14:53:31 +0200 Subject: [PATCH 011/140] WIP: Remove stale TechDOcs files from AWS Signed-off-by: Otto Sichert --- .../src/stages/publish/awsS3.ts | 98 ++++++++++++------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/awsS3.ts b/packages/techdocs-common/src/stages/publish/awsS3.ts index 7bdc91ffd4..7306320fd2 100644 --- a/packages/techdocs-common/src/stages/publish/awsS3.ts +++ b/packages/techdocs-common/src/stages/publish/awsS3.ts @@ -26,8 +26,11 @@ import path from 'path'; import { Readable } from 'stream'; import { Logger } from 'winston'; import { + bulkStorageOperation, + getCloudPathForLocalPath, getFileTreeRecursively, getHeadersForFileExtension, + getStaleFiles, lowerCaseEntityTripletInStoragePath, } from './helpers'; import { @@ -175,54 +178,77 @@ export class AwsS3Publish implements PublisherBase { * Directory structure used in the bucket is - entityNamespace/entityKind/entityName/index.html */ async publish({ entity, directory }: PublishRequest): Promise { + // First, retrieve a list of all individual files in currently existing + const remoteFolder = getCloudPathForLocalPath(entity); + const existingFiles = await this.getAllObjectsFromBucket({ + prefix: remoteFolder, + }); + + // Then, merge new files into the same folder + let absoluteFilesToUpload; try { - // Note: S3 manages creation of parent directories if they do not exist. - // So collecting path of only the files is good enough. - const allFilesToUpload = await getFileTreeRecursively(directory); + // Remove the absolute path prefix of the source directory + // Path of all files to upload, relative to the root of the source directory + // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] + absoluteFilesToUpload = await getFileTreeRecursively(directory); - const limiter = createLimiter(10); - const uploadPromises: Array> = []; - for (const filePath of allFilesToUpload) { - // Remove the absolute path prefix of the source directory - // Path of all files to upload, relative to the root of the source directory - // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] - const relativeFilePath = path.relative(directory, filePath); - - // Convert destination file path to a POSIX path for uploading. - // S3 expects / as path separator and relativeFilePath will contain \\ on Windows. - // https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html - const relativeFilePathPosix = relativeFilePath - .split(path.sep) - .join(path.posix.sep); - - // The / delimiter is intentional since it represents the cloud storage and not the local file system. - const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; - const destination = `${entityRootDir}/${relativeFilePathPosix}`; // S3 Bucket file relative path - - // Rate limit the concurrent execution of file uploads to batches of 10 (per publish) - const uploadFile = limiter(() => { - const fileStream = fs.createReadStream(filePath); + await bulkStorageOperation( + async absoluteFilePath => { + const relativeFilePath = path.relative(directory, absoluteFilePath); + const fileStream = fs.createReadStream(absoluteFilePath); const params = { Bucket: this.bucketName, - Key: destination, + Key: getCloudPathForLocalPath(entity, relativeFilePath), Body: fileStream, }; return this.storageClient.upload(params).promise(); - }); - uploadPromises.push(uploadFile); - } - await Promise.all(uploadPromises); - this.logger.info( - `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, + }, + absoluteFilesToUpload, + { concurrencyLimit: 10 }, + ); + + this.logger.info( + `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${absoluteFilesToUpload.length}`, ); - return; } catch (e) { const errorMessage = `Unable to upload file(s) to AWS S3. ${e}`; this.logger.error(errorMessage); throw new Error(errorMessage); } + + // Last, try to remove the files that were *only* present previously + try { + const relativeFilesToUpload = absoluteFilesToUpload.map( + absoluteFilePath => + getCloudPathForLocalPath( + entity, + path.relative(directory, absoluteFilePath), + ), + ); + const staleFiles = getStaleFiles(relativeFilesToUpload, existingFiles); + + await bulkStorageOperation( + async relativeFilePath => { + return await this.storageClient + .deleteObject({ + Bucket: this.bucketName, + Key: relativeFilePath, + }) + .promise(); + }, + staleFiles, + { concurrencyLimit: 10 }, + ); + + this.logger.info( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: ${staleFiles.length}`, + ); + } catch (error) { + const errorMessage = `Unable to delete file(s) from AWS S3. ${error}`; + this.logger.error(errorMessage); + } } async fetchTechDocsMetadata( @@ -365,17 +391,19 @@ export class AwsS3Publish implements PublisherBase { /** * Returns a list of all object keys from the configured bucket. */ - protected async getAllObjectsFromBucket(): Promise { + protected async getAllObjectsFromBucket( + { prefix } = { prefix: '' }, + ): Promise { const objects: string[] = []; let nextContinuation: string | undefined; let allObjects: ListObjectsV2Output; - // Iterate through every file in the root of the publisher. do { allObjects = await this.storageClient .listObjectsV2({ Bucket: this.bucketName, ContinuationToken: nextContinuation, + ...(prefix ? { Prefix: prefix } : {}), }) .promise(); objects.push( From 064f8d24876a96fba2489c77451b2bb32cf6fd50 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 23 Jul 2021 20:28:52 +0200 Subject: [PATCH 012/140] feat(techdocs): delete stale files when publishing to Azure Signed-off-by: Camila Belo --- .../src/stages/publish/azureBlobStorage.ts | 139 ++++++++++-------- .../src/stages/publish/helpers.ts | 11 +- 2 files changed, 85 insertions(+), 65 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index fe8fe9c2ce..5dc868ba2b 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -26,8 +26,11 @@ import limiterFactory from 'p-limit'; import { default as path, default as platformPath } from 'path'; import { Logger } from 'winston'; import { + bulkStorageOperation, + getCloudPathForLocalPath, getFileTreeRecursively, getHeadersForFileExtension, + getStaleFiles, lowerCaseEntityTripletInStoragePath, } from './helpers'; import { @@ -133,75 +136,85 @@ export class AzureBlobStoragePublish implements PublisherBase { * Directory structure used in the container is - entityNamespace/entityKind/entityName/index.html */ async publish({ entity, directory }: PublishRequest): Promise { + // First, retrieve a list of all individual files in currently existing + const remoteFolder = getCloudPathForLocalPath(entity); + const existingFiles: string[] = []; + const container = this.storageClient.getContainerClient(this.containerName); try { - // Note: Azure Blob Storage manages creation of parent directories if they do not exist. - // So collecting path of only the files is good enough. - const allFilesToUpload = await getFileTreeRecursively(directory); - - // Bound the number of concurrent batches. We want a bit of concurrency for - // performance reasons, but not so much that we starve the connection pool - // or start thrashing. - const limiter = limiterFactory(BATCH_CONCURRENCY); - - const promises = allFilesToUpload.map(sourceFilePath => { - // Remove the absolute path prefix of the source directory - // Path of all files to upload, relative to the root of the source directory - // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] - const relativeFilePath = path.normalize( - path.relative(directory, sourceFilePath), - ); - - // Convert destination file path to a POSIX path for uploading. - // Azure Blob Storage expects / as path separator and relativeFilePath will contain \\ on Windows. - // https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#blob-names - const relativeFilePathPosix = relativeFilePath - .split(path.sep) - .join(path.posix.sep); - - // The / delimiter is intentional since it represents the cloud storage and not the local file system. - const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; - const destination = `${entityRootDir}/${relativeFilePathPosix}`; // Azure Blob Storage Container file relative path - return limiter(async () => { - const response = await this.storageClient - .getContainerClient(this.containerName) - .getBlockBlobClient(destination) - .uploadFile(sourceFilePath); - - if (response._response.status >= 400) { - return { - ...response, - error: new Error( - `Upload failed for ${sourceFilePath} with status code ${response._response.status}`, - ), - }; - } - return { - ...response, - error: undefined, - }; - }); - }); - - const responses = await Promise.all(promises); - - const failed = responses.filter(r => r.error); - if (failed.length === 0) { - this.logger.info( - `Successfully uploaded the ${responses.length} generated file(s) for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, - ); - } else { - throw new Error( - failed - .map(r => r.error?.message) - .filter(Boolean) - .join(' '), - ); + for await (const blob of container.listBlobsFlat()) { + existingFiles.push(blob.name); } } catch (e) { - const errorMessage = `Unable to upload file(s) to Azure Blob Storage. ${e}`; + const errorMessage = `Unable to list file(s) to Azure. ${e}`; this.logger.error(errorMessage); throw new Error(errorMessage); } + + // Then, merge new files into the same folder + let absoluteFilesToUpload; + try { + // Remove the absolute path prefix of the source directory + // Path of all files to upload, relative to the root of the source directory + // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] + absoluteFilesToUpload = await getFileTreeRecursively(directory); + + await bulkStorageOperation( + async absoluteFilePath => { + // const relativeFilePath = path.relative(directory, absoluteFilePath); + const relativeFilePath = path.normalize( + path.relative(directory, absoluteFilePath), + ); + return await this.storageClient + .getContainerClient(this.containerName) + .getBlockBlobClient( + getCloudPathForLocalPath(entity, relativeFilePath), + ) + .uploadFile(absoluteFilePath); + }, + absoluteFilesToUpload, + { concurrencyLimit: BATCH_CONCURRENCY }, + ); + + this.logger.info( + `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${absoluteFilesToUpload.length}`, + ); + } catch (e) { + const errorMessage = `Unable to upload file(s) to Azure. ${e}`; + this.logger.error(errorMessage); + throw new Error(errorMessage); + } + + // Last, try to remove the files that were *only* present previously + try { + const relativeFilesToUpload = absoluteFilesToUpload.map( + absoluteFilePath => + getCloudPathForLocalPath( + entity, + path.relative(directory, absoluteFilePath), + ), + ); + + const staleFiles = getStaleFiles( + relativeFilesToUpload, + existingFiles, + remoteFolder, + ); + + await bulkStorageOperation( + async relativeFilePath => { + return await container.deleteBlob(relativeFilePath); + }, + staleFiles, + { concurrencyLimit: BATCH_CONCURRENCY }, + ); + + this.logger.info( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: ${staleFiles.length}`, + ); + } catch (error) { + const errorMessage = `Unable to delete file(s) from AWS S3. ${error}`; + this.logger.error(errorMessage); + } } private download(containerName: string, blobPath: string): Promise { diff --git a/packages/techdocs-common/src/stages/publish/helpers.ts b/packages/techdocs-common/src/stages/publish/helpers.ts index 1f77d33971..2aabcb3259 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.ts @@ -113,14 +113,21 @@ export const lowerCaseEntityTripletInStoragePath = ( const lowerKind = kind.toLowerCase(); const lowerName = name.toLowerCase(); return [lowerNamespace, lowerKind, lowerName, ...parts].join('/'); -} +}; // Only returns the files that existed previously and are not present anymore. export const getStaleFiles = ( newFiles: string[], oldFiles: string[], + remoteFolder?: string, ): string[] => { - const staleFiles = new Set(oldFiles); + let filteredFiles = [...oldFiles]; + if (remoteFolder) { + filteredFiles = filteredFiles.filter(filePath => + filePath.match(remoteFolder), + ); + } + const staleFiles = new Set(filteredFiles); newFiles.forEach(newFile => { staleFiles.delete(newFile); }); From fedf69a396809146197255bb2327cebdf47d5b52 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 23 Jul 2021 20:39:20 +0200 Subject: [PATCH 013/140] fix(techdocs): remove unused imported module Signed-off-by: Camila Belo --- packages/techdocs-common/src/stages/publish/awsS3.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/techdocs-common/src/stages/publish/awsS3.ts b/packages/techdocs-common/src/stages/publish/awsS3.ts index 7306320fd2..3ba5ffe4e3 100644 --- a/packages/techdocs-common/src/stages/publish/awsS3.ts +++ b/packages/techdocs-common/src/stages/publish/awsS3.ts @@ -16,7 +16,7 @@ import { Entity, EntityName } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import aws, { Credentials } from 'aws-sdk'; -import { ListObjectsV2Output, ManagedUpload } from 'aws-sdk/clients/s3'; +import { ListObjectsV2Output } from 'aws-sdk/clients/s3'; import { CredentialsOptions } from 'aws-sdk/lib/credentials'; import express from 'express'; import fs from 'fs-extra'; From 6f9e155973077d9958d21c68250f2249f1f1532c Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 27 Jul 2021 14:48:06 +0200 Subject: [PATCH 014/140] fix(techdocs): make azure tests pass Co-authored-by: Eric Peterson Signed-off-by: Camila Belo --- .../__mocks__/@azure/storage-blob.ts | 4 +++ .../stages/publish/azureBlobStorage.test.ts | 23 +++++++--------- .../src/stages/publish/azureBlobStorage.ts | 27 ++++++++++++++++--- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 73c5873832..56574dedf7 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -125,6 +125,10 @@ export class ContainerClient { getBlockBlobClient(blobName: string) { return new BlockBlobClient(blobName); } + + listBlobsFlat() { + return []; + } } class ContainerClientFailGetProperties extends ContainerClient { diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index e55314a71b..8c31153201 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -64,10 +64,11 @@ const getEntityRootDir = (entity: Entity) => { const logger = getVoidLogger(); jest.spyOn(logger, 'info').mockReturnValue(logger); -jest.spyOn(logger, 'error').mockReturnValue(logger); +const loggerSpy = jest.spyOn(logger, 'error').mockReturnValue(logger); let publisher: PublisherBase; beforeEach(async () => { + loggerSpy.mockClear(); mockFs.restore(); const mockConfig = new ConfigReader({ techdocs: { @@ -175,14 +176,12 @@ describe('publishing with valid credentials', () => { directory: wrongPathToGeneratedDirectory, }); - await expect(fails).rejects.toMatchObject({ - message: expect.stringContaining( - `Unable to upload file(s) to Azure Blob Storage. Error: Failed to read template directory: ENOENT, no such file or directory`, - ), - }); - await expect(fails).rejects.toMatchObject({ - message: expect.stringContaining(wrongPathToGeneratedDirectory), - }); + await expect(fails).rejects.toThrow( + /Unable to upload file\(s\) to Azure. Error: Failed to read template directory: ENOENT, no such file or directory/, + ); + await expect(fails).rejects.toThrow( + new RegExp(wrongPathToGeneratedDirectory), + ); mockFs.restore(); }); @@ -225,13 +224,11 @@ describe('publishing with valid credentials', () => { error = e; } - expect(error.message).toContain( - `Unable to upload file(s) to Azure Blob Storage.`, - ); + expect(error.message).toContain(`Unable to upload file(s) to Azure`); expect(logger.error).toHaveBeenCalledWith( expect.stringContaining( - `Unable to upload file(s) to Azure Blob Storage. Error: Upload failed for ${path.join( + `Unable to upload file(s) to Azure. Error: Upload failed for ${path.join( entityRootDir, 'index.html', )} with status code 500`, diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index 5dc868ba2b..c7b86ed39e 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -16,6 +16,7 @@ import { DefaultAzureCredential } from '@azure/identity'; import { BlobServiceClient, + ContainerClient, StorageSharedKeyCredential, } from '@azure/storage-blob'; import { Entity, EntityName } from '@backstage/catalog-model'; @@ -139,8 +140,9 @@ export class AzureBlobStoragePublish implements PublisherBase { // First, retrieve a list of all individual files in currently existing const remoteFolder = getCloudPathForLocalPath(entity); const existingFiles: string[] = []; - const container = this.storageClient.getContainerClient(this.containerName); + let container: ContainerClient; try { + container = this.storageClient.getContainerClient(this.containerName); for await (const blob of container.listBlobsFlat()) { existingFiles.push(blob.name); } @@ -158,23 +160,42 @@ export class AzureBlobStoragePublish implements PublisherBase { // e.g. ['index.html', 'sub-page/index.html', 'assets/images/favicon.png'] absoluteFilesToUpload = await getFileTreeRecursively(directory); + const failedOperations: Error[] = []; await bulkStorageOperation( async absoluteFilePath => { // const relativeFilePath = path.relative(directory, absoluteFilePath); const relativeFilePath = path.normalize( path.relative(directory, absoluteFilePath), ); - return await this.storageClient - .getContainerClient(this.containerName) + const response = await container .getBlockBlobClient( getCloudPathForLocalPath(entity, relativeFilePath), ) .uploadFile(absoluteFilePath); + + if (response._response.status >= 400) { + failedOperations.push( + new Error( + `Upload failed for ${absoluteFilePath} with status code ${response._response.status}`, + ), + ); + } + + return response; }, absoluteFilesToUpload, { concurrencyLimit: BATCH_CONCURRENCY }, ); + if (failedOperations.length > 0) { + throw new Error( + failedOperations + .map(r => r.message) + .filter(Boolean) + .join(' '), + ); + } + this.logger.info( `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${absoluteFilesToUpload.length}`, ); From caf519f69cc0139b34598244aaf01c8e321d689e Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 28 Jul 2021 11:46:33 +0200 Subject: [PATCH 015/140] fix(techdocs): make aws and gcs tests pass Co-authored-by: Eric Peterson Signed-off-by: Camila Belo --- .../__mocks__/@google-cloud/storage.ts | 11 +++++++ packages/techdocs-common/__mocks__/aws-sdk.ts | 8 +++++ .../src/stages/publish/googleStorage.ts | 31 ++++++++++++++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@google-cloud/storage.ts b/packages/techdocs-common/__mocks__/@google-cloud/storage.ts index 18fe62af14..ae2bce7a8f 100644 --- a/packages/techdocs-common/__mocks__/@google-cloud/storage.ts +++ b/packages/techdocs-common/__mocks__/@google-cloud/storage.ts @@ -107,6 +107,17 @@ class Bucket { file(destinationFilePath: string) { return new GCSFile(destinationFilePath); } + + getFilesStream() { + const readable = new Readable(); + readable._read = () => {}; + + process.nextTick(() => { + readable.emit('end'); + }); + + return readable; + } } export class Storage { diff --git a/packages/techdocs-common/__mocks__/aws-sdk.ts b/packages/techdocs-common/__mocks__/aws-sdk.ts index 2826a8d8bb..ec0273e277 100644 --- a/packages/techdocs-common/__mocks__/aws-sdk.ts +++ b/packages/techdocs-common/__mocks__/aws-sdk.ts @@ -104,6 +104,14 @@ export class S3 { }), }; } + + listObjectsV2() { + return { + promise: () => { + return Promise.resolve([]); + }, + }; + } } export default { diff --git a/packages/techdocs-common/src/stages/publish/googleStorage.ts b/packages/techdocs-common/src/stages/publish/googleStorage.ts index 349d6ead97..24f84f0136 100644 --- a/packages/techdocs-common/src/stages/publish/googleStorage.ts +++ b/packages/techdocs-common/src/stages/publish/googleStorage.ts @@ -15,7 +15,7 @@ */ import { Entity, EntityName } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; -import { FileExistsResponse, Storage } from '@google-cloud/storage'; +import { File, FileExistsResponse, Storage } from '@google-cloud/storage'; import express from 'express'; import JSON5 from 'json5'; import path from 'path'; @@ -119,9 +119,7 @@ export class GoogleGCSPublish implements PublisherBase { // First, retrieve a list of all individual files in currently existing const remoteFolder = getCloudPathForLocalPath(entity); - const existingFiles = ( - await bucket.getFiles({ prefix: remoteFolder }) - )[0].map(file => file.name); + const existingFiles = await this.getFilesForFolder(remoteFolder); // Then, merge new files into the same folder let absoluteFilesToUpload; @@ -276,4 +274,29 @@ export class GoogleGCSPublish implements PublisherBase { }); }); } + + private getFilesForFolder(folder: string): Promise { + const fileMetadataStream: Readable = this.storageClient + .bucket(this.bucketName) + .getFilesStream({ prefix: folder }); + + return new Promise((resolve, reject) => { + const files: string[] = []; + + fileMetadataStream.on('error', error => { + // push file to file array + reject(error); + }); + + fileMetadataStream.on('data', (file: File) => { + // push file to file array + files.push(file.name); + }); + + fileMetadataStream.on('end', () => { + // resolve promise + resolve(files); + }); + }); + } } From da705a74e0dd7aec23827fecbcc8efc4a907b582 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Mon, 2 Aug 2021 17:17:29 +0200 Subject: [PATCH 016/140] test(techdocs-common): cover stale files deletion for GCS Signed-off-by: Camila Belo --- .../__mocks__/@google-cloud/storage.ts | 13 +++++ .../src/stages/publish/googleStorage.test.ts | 58 +++++++++++-------- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@google-cloud/storage.ts b/packages/techdocs-common/__mocks__/@google-cloud/storage.ts index ae2bce7a8f..f5616236cf 100644 --- a/packages/techdocs-common/__mocks__/@google-cloud/storage.ts +++ b/packages/techdocs-common/__mocks__/@google-cloud/storage.ts @@ -77,6 +77,10 @@ class GCSFile { }); return readable; } + + delete() { + return Promise.resolve(); + } } class Bucket { @@ -105,6 +109,9 @@ class Bucket { } file(destinationFilePath: string) { + if (this.bucketName === 'delete_stale_files_error') { + throw Error('Message'); + } return new GCSFile(destinationFilePath); } @@ -113,6 +120,12 @@ class Bucket { readable._read = () => {}; process.nextTick(() => { + if ( + this.bucketName === 'delete_stale_files_success' || + this.bucketName === 'delete_stale_files_error' + ) { + readable.emit('data', { name: 'stale-file.png' }); + } readable.emit('end'); }); diff --git a/packages/techdocs-common/src/stages/publish/googleStorage.test.ts b/packages/techdocs-common/src/stages/publish/googleStorage.test.ts index 8a00fc9708..65cbf3c5ac 100644 --- a/packages/techdocs-common/src/stages/publish/googleStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/googleStorage.test.ts @@ -63,12 +63,10 @@ const getEntityRootDir = (entity: Entity) => { }; const logger = getVoidLogger(); -jest.spyOn(logger, 'info').mockReturnValue(logger); +const loggerInfoSpy = jest.spyOn(logger, 'info').mockReturnValue(logger); +const loggerErrorSpy = jest.spyOn(logger, 'error').mockReturnValue(logger); -let publisher: PublisherBase; - -beforeEach(async () => { - mockFs.restore(); +const createPublisherMock = (bucketName: string) => { const mockConfig = new ConfigReader({ techdocs: { requestUrl: 'http://localhost:7000', @@ -76,13 +74,21 @@ beforeEach(async () => { type: 'googleGcs', googleGcs: { credentials: '{}', - bucketName: 'bucketName', + bucketName, }, }, }, }); + return GoogleGCSPublish.fromConfig(mockConfig, logger); +}; - publisher = await GoogleGCSPublish.fromConfig(mockConfig, logger); +let publisher: PublisherBase; + +beforeEach(async () => { + loggerInfoSpy.mockClear(); + loggerErrorSpy.mockClear(); + mockFs.restore(); + publisher = createPublisherMock('bucketName'); }); describe('GoogleGCSPublish', () => { @@ -94,20 +100,7 @@ describe('GoogleGCSPublish', () => { }); it('should reject incorrect config', async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'googleGcs', - googleGcs: { - credentials: '{}', - bucketName: 'errorBucket', - }, - }, - }, - }); - - const errorPublisher = GoogleGCSPublish.fromConfig(mockConfig, logger); + const errorPublisher = createPublisherMock('errorBucket'); expect(await errorPublisher.getReadiness()).toEqual({ isAvailable: false, @@ -145,7 +138,6 @@ describe('GoogleGCSPublish', () => { directory: entityRootDir, }), ).toBeUndefined(); - mockFs.restore(); }); it('should fail to publish a directory', async () => { @@ -181,8 +173,28 @@ describe('GoogleGCSPublish', () => { await expect(fails).rejects.toMatchObject({ message: expect.stringContaining(wrongPathToGeneratedDirectory), }); + }); - mockFs.restore(); + it('should delete stale files after upload', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const bucketName = 'delete_stale_files_success'; + publisher = createPublisherMock(bucketName); + await publisher.publish({ entity, directory }); + expect(loggerInfoSpy).toHaveBeenLastCalledWith( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, + ); + }); + + it('should log error when the stale files deletion fails', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const bucketName = 'delete_stale_files_error'; + publisher = createPublisherMock(bucketName); + await publisher.publish({ entity, directory }); + expect(loggerErrorSpy).toHaveBeenLastCalledWith( + 'Unable to delete file(s) from Google Cloud Storage. Error: Message', + ); }); }); From 5386bcc989e2a45db39064d41161965d70703384 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Mon, 2 Aug 2021 19:41:36 +0200 Subject: [PATCH 017/140] test(techdocs-common): cover stale files deletion for AWS Signed-off-by: Camila Belo --- packages/techdocs-common/__mocks__/aws-sdk.ts | 23 ++++++- .../src/stages/publish/awsS3.test.ts | 61 +++++++++++-------- 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/packages/techdocs-common/__mocks__/aws-sdk.ts b/packages/techdocs-common/__mocks__/aws-sdk.ts index ec0273e277..9b3218f6dc 100644 --- a/packages/techdocs-common/__mocks__/aws-sdk.ts +++ b/packages/techdocs-common/__mocks__/aws-sdk.ts @@ -105,10 +105,29 @@ export class S3 { }; } - listObjectsV2() { + listObjectsV2({ Bucket }) { return { promise: () => { - return Promise.resolve([]); + if ( + Bucket === 'delete_stale_files_success' || + Bucket === 'delete_stale_files_error' + ) { + return Promise.resolve({ + Contents: [{ Key: 'stale_file.png' }], + }); + } + return Promise.resolve({}); + }, + }; + } + + deleteObject({ Bucket }) { + return { + promise: () => { + if (Bucket === 'delete_stale_files_error') { + throw new Error('Message'); + } + return Promise.resolve(); }, }; } diff --git a/packages/techdocs-common/src/stages/publish/awsS3.test.ts b/packages/techdocs-common/src/stages/publish/awsS3.test.ts index 81f06716b1..b94518c857 100644 --- a/packages/techdocs-common/src/stages/publish/awsS3.test.ts +++ b/packages/techdocs-common/src/stages/publish/awsS3.test.ts @@ -63,11 +63,10 @@ const getEntityRootDir = (entity: Entity) => { }; const logger = getVoidLogger(); +const loggerInfoSpy = jest.spyOn(logger, 'info'); +const loggerErrorSpy = jest.spyOn(logger, 'error'); -let publisher: PublisherBase; - -beforeEach(() => { - mockFs.restore(); +const createPublisherMock = (bucketName: string) => { const mockConfig = new ConfigReader({ techdocs: { requestUrl: 'http://localhost:7000', @@ -78,13 +77,22 @@ beforeEach(() => { accessKeyId: 'accessKeyId', secretAccessKey: 'secretAccessKey', }, - bucketName: 'bucketName', + bucketName, }, }, }, }); - publisher = AwsS3Publish.fromConfig(mockConfig, logger); + return AwsS3Publish.fromConfig(mockConfig, logger); +}; + +let publisher: PublisherBase; + +beforeEach(() => { + loggerInfoSpy.mockClear(); + loggerErrorSpy.mockClear(); + mockFs.restore(); + publisher = createPublisherMock('bucketName'); }); describe('AwsS3Publish', () => { @@ -96,24 +104,7 @@ describe('AwsS3Publish', () => { }); it('should reject incorrect config', async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'awsS3', - awsS3: { - credentials: { - accessKeyId: 'accessKeyId', - secretAccessKey: 'secretAccessKey', - }, - // this bucket name will throw an error - bucketName: 'errorBucket', - }, - }, - }, - }); - - const errorPublisher = AwsS3Publish.fromConfig(mockConfig, logger); + const errorPublisher = createPublisherMock('errorBucket'); expect(await errorPublisher.getReadiness()).toEqual({ isAvailable: false, @@ -188,8 +179,28 @@ describe('AwsS3Publish', () => { await expect(fails).rejects.toMatchObject({ message: expect.stringContaining(wrongPathToGeneratedDirectory), }); + }); - mockFs.restore(); + it('should delete stale files after upload', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const bucketName = 'delete_stale_files_success'; + publisher = createPublisherMock(bucketName); + await publisher.publish({ entity, directory }); + expect(loggerInfoSpy).toHaveBeenLastCalledWith( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, + ); + }); + + it('should log error when the stale files deletion fails', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const bucketName = 'delete_stale_files_error'; + publisher = createPublisherMock(bucketName); + await publisher.publish({ entity, directory }); + expect(loggerErrorSpy).toHaveBeenLastCalledWith( + 'Unable to delete file(s) from AWS S3. Error: Message', + ); }); }); From 9cf37164b1802687a7aa468645da5c70ab5f8a9a Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Mon, 2 Aug 2021 22:15:36 +0200 Subject: [PATCH 018/140] test(techdocs-common): cover stale files deletion for Azure Signed-off-by: Camila Belo --- .../__mocks__/@azure/storage-blob.ts | 14 ++- .../stages/publish/azureBlobStorage.test.ts | 103 +++++++++--------- .../src/stages/publish/azureBlobStorage.ts | 13 +-- .../src/stages/publish/helpers.ts | 9 +- 4 files changed, 72 insertions(+), 67 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 56574dedf7..f7303ce1cb 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -126,9 +126,21 @@ export class ContainerClient { return new BlockBlobClient(blobName); } - listBlobsFlat() { + listBlobsFlat({ prefix }: { prefix: string }) { + if ( + this.containerName === 'delete_stale_files_success' || + this.containerName === 'delete_stale_files_error' + ) { + return [{ name: `${prefix}stale_file.png` }]; + } return []; } + + deleteBlob() { + if (this.containerName === 'delete_stale_files_error') { + throw new Error('Message'); + } + } } class ContainerClientFailGetProperties extends ContainerClient { diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index 8c31153201..2e17b43b62 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -63,13 +63,18 @@ const getEntityRootDir = (entity: Entity) => { }; const logger = getVoidLogger(); -jest.spyOn(logger, 'info').mockReturnValue(logger); -const loggerSpy = jest.spyOn(logger, 'error').mockReturnValue(logger); +const loggerInfoSpy = jest.spyOn(logger, 'info'); +const loggerErrorSpy = jest.spyOn(logger, 'error'); -let publisher: PublisherBase; -beforeEach(async () => { - loggerSpy.mockClear(); - mockFs.restore(); +const createPublisherMock = ({ + accountName = 'accountName', + containerName = 'containerName', +}: + | { + accountName?: string; + containerName?: string; + } + | undefined = {}) => { const mockConfig = new ConfigReader({ techdocs: { requestUrl: 'http://localhost:7000', @@ -77,16 +82,24 @@ beforeEach(async () => { type: 'azureBlobStorage', azureBlobStorage: { credentials: { - accountName: 'accountName', + accountName, accountKey: 'accountKey', }, - containerName: 'containerName', + containerName, }, }, }, }); - publisher = AzureBlobStoragePublish.fromConfig(mockConfig, logger); + return AzureBlobStoragePublish.fromConfig(mockConfig, logger); +}; + +let publisher: PublisherBase; +beforeEach(async () => { + loggerInfoSpy.mockClear(); + loggerErrorSpy.mockClear(); + mockFs.restore(); + publisher = createPublisherMock(); }); describe('publishing with valid credentials', () => { @@ -98,32 +111,15 @@ describe('publishing with valid credentials', () => { }); it('should reject incorrect config', async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'azureBlobStorage', - azureBlobStorage: { - credentials: { - accountName: 'accountName', - accountKey: 'accountKey', - }, - containerName: 'bad_container', - }, - }, - }, + const errorPublisher = createPublisherMock({ + containerName: 'bad_container', }); - const errorPublisher = await AzureBlobStoragePublish.fromConfig( - mockConfig, - logger, - ); - expect(await errorPublisher.getReadiness()).toEqual({ isAvailable: false, }); - expect(logger.error).toHaveBeenCalledWith( + expect(loggerErrorSpy).toHaveBeenCalledWith( expect.stringContaining( `Could not retrieve metadata about the Azure Blob Storage container bad_container.`, ), @@ -147,6 +143,10 @@ describe('publishing with valid credentials', () => { }); }); + afterEach(() => { + mockFs.restore(); + }); + it('should publish a directory', async () => { const entity = createMockEntity(); const entityRootDir = getEntityRootDir(entity); @@ -157,7 +157,6 @@ describe('publishing with valid credentials', () => { directory: entityRootDir, }), ).toBeUndefined(); - mockFs.restore(); }); it('should fail to publish a directory', async () => { @@ -182,29 +181,13 @@ describe('publishing with valid credentials', () => { await expect(fails).rejects.toThrow( new RegExp(wrongPathToGeneratedDirectory), ); - - mockFs.restore(); }); it('reports an error when bad account credentials', async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'azureBlobStorage', - azureBlobStorage: { - credentials: { - accountName: 'failupload', - accountKey: 'accountKey', - }, - containerName: 'containerName', - }, - }, - }, + publisher = createPublisherMock({ + accountName: 'failupload', }); - publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); - const entity = createMockEntity(); const entityRootDir = getEntityRootDir(entity); @@ -226,7 +209,7 @@ describe('publishing with valid credentials', () => { expect(error.message).toContain(`Unable to upload file(s) to Azure`); - expect(logger.error).toHaveBeenCalledWith( + expect(loggerErrorSpy).toHaveBeenCalledWith( expect.stringContaining( `Unable to upload file(s) to Azure. Error: Upload failed for ${path.join( entityRootDir, @@ -234,8 +217,28 @@ describe('publishing with valid credentials', () => { )} with status code 500`, ), ); + }); - mockFs.restore(); + it('should delete stale files after upload', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const containerName = 'delete_stale_files_success'; + publisher = createPublisherMock({ containerName }); + await publisher.publish({ entity, directory }); + expect(loggerInfoSpy).toHaveBeenLastCalledWith( + `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: 1`, + ); + }); + + it('should log error when the stale files deletion fails', async () => { + const entity = createMockEntity(); + const directory = getEntityRootDir(entity); + const containerName = 'delete_stale_files_error'; + publisher = createPublisherMock({ containerName }); + await publisher.publish({ entity, directory }); + expect(loggerErrorSpy).toHaveBeenLastCalledWith( + 'Unable to delete file(s) from Azure. Error: Message', + ); }); }); diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index c7b86ed39e..f49b317ecf 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -143,7 +143,9 @@ export class AzureBlobStoragePublish implements PublisherBase { let container: ContainerClient; try { container = this.storageClient.getContainerClient(this.containerName); - for await (const blob of container.listBlobsFlat()) { + for await (const blob of container.listBlobsFlat({ + prefix: remoteFolder, + })) { existingFiles.push(blob.name); } } catch (e) { @@ -163,7 +165,6 @@ export class AzureBlobStoragePublish implements PublisherBase { const failedOperations: Error[] = []; await bulkStorageOperation( async absoluteFilePath => { - // const relativeFilePath = path.relative(directory, absoluteFilePath); const relativeFilePath = path.normalize( path.relative(directory, absoluteFilePath), ); @@ -215,11 +216,7 @@ export class AzureBlobStoragePublish implements PublisherBase { ), ); - const staleFiles = getStaleFiles( - relativeFilesToUpload, - existingFiles, - remoteFolder, - ); + const staleFiles = getStaleFiles(relativeFilesToUpload, existingFiles); await bulkStorageOperation( async relativeFilePath => { @@ -233,7 +230,7 @@ export class AzureBlobStoragePublish implements PublisherBase { `Successfully deleted stale files for Entity ${entity.metadata.name}. Total number of files: ${staleFiles.length}`, ); } catch (error) { - const errorMessage = `Unable to delete file(s) from AWS S3. ${error}`; + const errorMessage = `Unable to delete file(s) from Azure. ${error}`; this.logger.error(errorMessage); } } diff --git a/packages/techdocs-common/src/stages/publish/helpers.ts b/packages/techdocs-common/src/stages/publish/helpers.ts index 2aabcb3259..6f6eb7dfa5 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.ts @@ -119,15 +119,8 @@ export const lowerCaseEntityTripletInStoragePath = ( export const getStaleFiles = ( newFiles: string[], oldFiles: string[], - remoteFolder?: string, ): string[] => { - let filteredFiles = [...oldFiles]; - if (remoteFolder) { - filteredFiles = filteredFiles.filter(filePath => - filePath.match(remoteFolder), - ); - } - const staleFiles = new Set(filteredFiles); + const staleFiles = new Set(oldFiles); newFiles.forEach(newFile => { staleFiles.delete(newFile); }); From ab9b315e2a748658d628dac0bdb31aefb1390661 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 3 Aug 2021 09:33:58 +0200 Subject: [PATCH 019/140] test(techdocs-common): cover getStaleFiles helper Signed-off-by: Camila Belo --- .../src/stages/publish/helpers.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/techdocs-common/src/stages/publish/helpers.test.ts b/packages/techdocs-common/src/stages/publish/helpers.test.ts index 27a56cd06d..63b4e0aeec 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.test.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.test.ts @@ -17,6 +17,7 @@ import mockFs from 'mock-fs'; import * as os from 'os'; import * as path from 'path'; import { + getStaleFiles, getFileTreeRecursively, getHeadersForFileExtension, lowerCaseEntityTripletInStoragePath, @@ -99,3 +100,27 @@ describe('lowerCaseEntityTripletInStoragePath', () => { ).toThrowError(error); }); }); + +describe('getStaleFiles', () => { + const defaultFiles = [ + 'default/Component/backstage/index.html', + 'default/Component/backstage/techdocs_metadata.json', + 'default/Component/backstage/assests/javascripts/bundle.7f4f3c92.min.js', + 'default/Component/backstage/assets/stylesheets/main.fe0cca5b.min.css', + ]; + + it('should return empty array if there is no stale file', () => { + const oldFiles = [...defaultFiles]; + const newFiles = [...defaultFiles]; + const staleFiles = getStaleFiles(newFiles, oldFiles); + expect(staleFiles).toHaveLength(0); + }); + + it('should return all stale files when they exists', () => { + const oldFiles = [...defaultFiles, 'stale_file.png']; + const newFiles = [...defaultFiles]; + const staleFiles = getStaleFiles(newFiles, oldFiles); + expect(staleFiles).toHaveLength(1); + expect(staleFiles).toEqual(expect.arrayContaining(['stale_file.png'])); + }); +}); From 7eef84a0404e43aebf440749fd25f8ec171e205e Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 3 Aug 2021 10:02:30 +0200 Subject: [PATCH 020/140] test(techdocs-common): cover getCloudPathForLocalPath helper Signed-off-by: Camila Belo --- .../src/stages/publish/helpers.test.ts | 44 +++++++++++++++++++ .../src/stages/publish/helpers.ts | 6 ++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/helpers.test.ts b/packages/techdocs-common/src/stages/publish/helpers.test.ts index 63b4e0aeec..54761cf311 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.test.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.test.ts @@ -16,9 +16,11 @@ import mockFs from 'mock-fs'; import * as os from 'os'; import * as path from 'path'; +import { Entity, ENTITY_DEFAULT_NAMESPACE } from '@backstage/catalog-model'; import { getStaleFiles, getFileTreeRecursively, + getCloudPathForLocalPath, getHeadersForFileExtension, lowerCaseEntityTripletInStoragePath, } from './helpers'; @@ -124,3 +126,45 @@ describe('getStaleFiles', () => { expect(staleFiles).toEqual(expect.arrayContaining(['stale_file.png'])); }); }); + +describe('getCloudPathForLocalPath', () => { + const entity: Entity = { + apiVersion: 'version', + metadata: { namespace: 'default', name: 'backstage' }, + kind: 'Component', + }; + + it('should compose a remote bucket path including entity information', () => { + const remoteBucket = getCloudPathForLocalPath(entity); + expect(remoteBucket).toBe( + `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}/`, + ); + }); + + it('should compose a remote filename including entity information', () => { + const localPath = 'index.html'; + const remoteBucket = getCloudPathForLocalPath(entity, localPath); + expect(remoteBucket).toBe( + `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}/${localPath}`, + ); + }); + + it('should use the default namespace when it is undefined', () => { + const localPath = 'index.html'; + const { + kind, + metadata: { name }, + } = entity; + const remoteBucket = getCloudPathForLocalPath( + { kind, metadata: { name } } as Entity, + localPath, + ); + expect(remoteBucket).toBe( + `${ENTITY_DEFAULT_NAMESPACE}/${entity.kind}/${entity.metadata.name}/${localPath}`, + ); + }); + + it('should throw error when entity is invalid', () => { + expect(() => getCloudPathForLocalPath({} as Entity)).toThrow(); + }); +}); diff --git a/packages/techdocs-common/src/stages/publish/helpers.ts b/packages/techdocs-common/src/stages/publish/helpers.ts index 6f6eb7dfa5..fda03e7415 100644 --- a/packages/techdocs-common/src/stages/publish/helpers.ts +++ b/packages/techdocs-common/src/stages/publish/helpers.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { Entity, ENTITY_DEFAULT_NAMESPACE } from '@backstage/catalog-model'; import mime from 'mime-types'; import path from 'path'; import createLimiter from 'p-limit'; @@ -138,7 +138,9 @@ export const getCloudPathForLocalPath = ( const relativeFilePathPosix = localPath.split(path.sep).join(path.posix.sep); // The / delimiter is intentional since it represents the cloud storage and not the local file system. - const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; + const entityRootDir = `${ + entity.metadata?.namespace ?? ENTITY_DEFAULT_NAMESPACE + }/${entity.kind}/${entity.metadata.name}`; return `${entityRootDir}/${relativeFilePathPosix}`; // GCS Bucket file relative path }; From b0b165b9a57abc16174fc56118745cef053e445d Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Tue, 3 Aug 2021 10:50:56 +0200 Subject: [PATCH 021/140] create-app: add a prettier:check script in the template Co-authored-by: Mike Lewis Signed-off-by: Himanshu Mishra --- packages/create-app/templates/default-app/package.json.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 7ae86c0fbc..a763b3cabb 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -19,6 +19,7 @@ "test:all": "lerna run test -- --coverage", "lint": "lerna run lint --since origin/master --", "lint:all": "lerna run lint --", + "prettier:check": "prettier --check .", "create-plugin": "backstage-cli create-plugin --scope internal --no-private", "remove-plugin": "backstage-cli remove-plugin" }, From e7d9f68678dee468b0089bf3bff03734e1989322 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Tue, 3 Aug 2021 10:51:55 +0200 Subject: [PATCH 022/140] e2e: run prettier check for newly created app Co-authored-by: Mike Lewis Signed-off-by: Himanshu Mishra --- packages/e2e-test/src/commands/run.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index c205b4f527..e4072872d1 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -232,7 +232,14 @@ async function createApp( print('Test app created'); - for (const cmd of ['install', 'tsc', 'build', 'lint:all', 'test:all']) { + for (const cmd of [ + 'install', + 'tsc', + 'build', + 'lint:all', + 'prettier:check', + 'test:all', + ]) { print(`Running 'yarn ${cmd}' in newly created app`); await runPlain(['yarn', cmd], { cwd: appDir }); } From 58cdab3d601fa06307ff8eabd11a87984e892b25 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Tue, 3 Aug 2021 11:11:09 +0200 Subject: [PATCH 023/140] create-app: upgrade prettier version since we are using 2.x in backstage/backstage Co-authored-by: Mike Lewis Signed-off-by: Himanshu Mishra --- packages/create-app/templates/default-app/package.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index a763b3cabb..3f913102cb 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -38,7 +38,7 @@ "@spotify/prettier-config": "^7.0.0", "concurrently": "^6.0.0", "lerna": "^4.0.0", - "prettier": "^1.19.1" + "prettier": "^2.3.2" }, "prettier": "@spotify/prettier-config", "lint-staged": { From 94abf07f1ddd0381bed5e6a4ad95b82327f5dc39 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Tue, 3 Aug 2021 11:12:14 +0200 Subject: [PATCH 024/140] fix prettier issues in the create-app default template Co-authored-by: Mike Lewis Signed-off-by: Himanshu Mishra --- packages/create-app/templates/default-app/README.md | 2 +- .../templates/default-app/catalog-info.yaml.hbs | 4 ++-- .../default-app/packages/app/public/index.html | 2 +- .../templates/default-app/packages/app/src/App.tsx | 10 +++++----- .../templates/default-app/packages/app/src/apis.ts | 9 +++++++-- .../packages/app/src/components/catalog/EntityPage.tsx | 2 +- .../packages/backend/src/plugins/catalog.ts | 6 ++++-- .../packages/backend/src/plugins/scaffolder.ts | 4 +--- .../default-app/packages/backend/src/types.ts | 2 +- 9 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/create-app/templates/default-app/README.md b/packages/create-app/templates/default-app/README.md index 07cf6fd136..8c7c4373fe 100644 --- a/packages/create-app/templates/default-app/README.md +++ b/packages/create-app/templates/default-app/README.md @@ -7,4 +7,4 @@ To start the app, run: ```sh yarn install yarn dev -``` \ No newline at end of file +``` diff --git a/packages/create-app/templates/default-app/catalog-info.yaml.hbs b/packages/create-app/templates/default-app/catalog-info.yaml.hbs index 265864e235..e01ce8f756 100644 --- a/packages/create-app/templates/default-app/catalog-info.yaml.hbs +++ b/packages/create-app/templates/default-app/catalog-info.yaml.hbs @@ -5,8 +5,8 @@ metadata: description: An example of a Backstage application. # Example for optional annotations # annotations: - # github.com/project-slug: backstage/backstage - # backstage.io/techdocs-ref: dir:. + # github.com/project-slug: backstage/backstage + # backstage.io/techdocs-ref: dir:. spec: type: website owner: john@example.com diff --git a/packages/create-app/templates/default-app/packages/app/public/index.html b/packages/create-app/templates/default-app/packages/app/public/index.html index 5653173480..b93896c6da 100644 --- a/packages/create-app/templates/default-app/packages/app/public/index.html +++ b/packages/create-app/templates/default-app/packages/app/public/index.html @@ -65,7 +65,7 @@ <% } %> - +
m;ePpqwt;zx?YnVol2lyt0M= zeEq-n|F%vnJ^nA$?@bn%2MJeJfHWQ-Dx;j zbg+BmZ&Pvux%Gx63B!TC%5*u)mvUPZX2^2bP4uu4=PK*3RxtHaY zSN`S;k=IU9|3ZJf#G^+?j@x)jXlQNg;jA)x1zB8;-!~STLwR z)DHB+hxh&0oLeo-xcZ>`VN9i-U}m_OAb3;SZ+M~h7^4q<{+>+;xhd_<^dOiayvPgr zSD!~b#wZ1ZOAHPnF-#Eh zmkpK_MEP+-mq&k)d3ur_N!K7@IuHXu_N*W`LSh)RvQ(Ly;J*xVwD4!8OTfy zYWzUG+|41X>ygh`j1L0e31{KZqs?#uJ*(lycN$+4GL>j;&N?~Z%{9q|oJFpZBP{Z& zNg#{3li7v55AktzI=c2Ne}1V}?Hab+cd$Oqa!y*fD=I;a40-h zI*}_&hzHI7qVRnCdJ=+q|BvA;!!;kR6ck3TlbuRf+GGuKokS;_7>Yl#e3+%YK9VIM z%2^MlkwHe#5uQ9EcfFysJtpZRQVN`E0FOX$zk7zWXumJNZ3J#OoFLrP0yBfjlJdmO zmK&fL$nCBZx+(*CzmIzoPo(F3;9VB7#gQ8X+H;Nb){l!rD7k@U10TuVY;w;=g5SUa zUiY6s8aE+m2PeJX>~^B6{R*sEkV6KRcI5=P$s59d%y$ILa46h_z+?dZ<2%^q3n&6P zu?yxiew2+2vQG zr-#FjylHKjqsZYqEbG}Wo?Mv`T+4I2G9R9R?`(5sY!;;PRqP=$l@%-ouHnoQuI)!1 zMKFeZjtp0x0{GR4>zY1mA4bL%p;RXMEZxO+l^=HTrF7fj2 zRcYrgobw`t^WI~?X{W3<8*jh=V|}R;aPCQPuMxux0cl4WJ#CZnxz?t9o-IbSDSOQ6 zmq`#j!-zwSULZr@b_VZBvq#x3gtve6_B+{O#34pG<&=BU{`xOX5FSH0%JFS6H~eHg z+W)VE{nz;`M^c3&sBiIbk6bW7iNT*;Z2_U&SXviexwpJKR1WgS z-`0{_sT9NvkL|z?H(O9;#Bz}^75H?!Ld-AtaHPE6j{%)nkm>V#Kk#K__|F3`e$sg}Bnm*N3BWtXvTDQ5Y>LJa^(O9S$eeZ!%aRX&^ z4ayF6)aVpPil_HLCuV;yTGq^%j=CZ3_1FLQb-ECKZ!H1qbyESuyT2!(=q#-s#7vTq zzpSN#fWOoV7}RDNj<;zWi^4VKyH@H^jc@#Z@ijL5h=|n$`Rw2Ue-*xY^;PyD5!m40`LTzg%9p!4^e@@nphcdX@-+nmCa@oEhPiW*y#TG`U_#D277ha`z&2U|w#VHOjFki??3YNp~N7Dt| z1z@~oO>RA2$5kG)zgIM?vkPS1=3c4xH=j>i!fV@R*KwewX_O_r#J~QB=Rvt{0=U^A zl>X3lHonX6A6ztF#*U=llm8jE`iEm%9@Z zQ;L@p|Md4DaFcSbQl^4Hg7A(_2wtW9J@**dg1|j#2u%o75bQyCjsk)$%FkT7c;0Ie z*bsEaBaF~b*?>SDfu4e`_kYA?TL{~wEVh(zhQ%gjIuXwBulO(8r|cFZvx8?$NId2= z_aHn^LBke=w#A49;rp~8y#4k&{9pe6Gxt6{lHJ#RJ_%1#q)A!ikF-Q`DFI$+N4UEC z7YNCs)P=4_AooIRz5}mpfJgu@3^|iPqY)h{GCK0ml!)O7q6nyGQKYX^sRU9H^}6yr z=YD$56tB7^3KTG>?)UtAZj1Kj-h1YJ|I|4MUw?E?+7sA8IGdkqcKpuHcuWrSvr{uZ zqRxj?c2qE+SlBT^a@cH#h0o671D%E4oUIxbaCc{OmDRA=ZBDE2ISjkSup6+861kI- zb~Q)Ic**#Ttgi`LW)r@@>LDC&WuRHj!m|RpL^wm>DF9}x(U-^-`EiTB;B(GO`aJw_ zkN5mc?WIewQcd7j;6?LQixYk*H#kCLh{pOr|ClU%Ou(=2z5eBmr@1w66`M31jR~?$ zAc!Z&z_a8atDH&Tk^q#zWkk*S=%+panbpe4a&b>_E?5S+ze|fCvx~5n0bEGpbPRIi zCqMZRNzI^#wFEF%I(%rolBlmBHR;KY=+#A0iiWA?7RqxGUTo zIzsA^;NKJUI_OAZ*E~1OkS-v^0&o-?3tm6Nd18F|phajWtG_=A&6`vi{k`(#nDk zgigJj2j05leyO!*(qi_A&xT<(%z5h~u5}(ZGgdi!Ucy|?iUigwz-f!9$<(IegS^@Wl4Ja1_zYTA0=MA0B2PaZh85Fmo0rIA4rg3hToA#Lqr+)t;8-e% zaujpF^57T((>cUcemU}NDp&$Z_uWm%4bb>UlQ-MAMMrVPV0t`hpSygs^y&e|bo0}c z0a#)}Mln1sfS+7w7#|gcidRwWN!fTO_zZ0yi>BBh$YNu2b^;LjxGfP_H1gW8w7=;q zM>G}rAOE1VPd{}VBRUAR2H~gUQOZB0fxs~c76`As#vCJ-AW$E?gm4Z5pX$soqC9Yl z5yDg;Kj?2Ac!WXDL$*WE-~WH|TNWw1uc<8tUH*{qG=KcepRm%|xk}HlKN3G$6wf_x zb>M%L`hXJU<(FQ0`OoPfy!z_vuhlsS^be>He&`})8wf5z$T`ZNK6wSg`G(=cQJ;rm zHCH#=)6Kaxz`1W1_Ua1ng2XYf~(>q2uaE+ZTTi&!za?10uZ*p2Y zG`D%*J&G}3oS8)GHGIQ+*Pg@pzvlatd)?<~19$Ec?_GW?Bi^sJ5V%Rcp07qe8{nI{ zFH&EH%CYa&6;;A!Y`zc28aP5GQ;*auqHHqA9hDokC4%PIsNbLR(&3p()NXD5VeD6a zpmBIU{^ec-^=7O15P}cJ8@Y~kf;FH!WR0sZaZyU*JFBGf0?2~rc#%2Wv7V-3RhtPq%C^e>#0<}nCgr$BI*(>-qTbTcgSCwqwt9v#i-i%U!L`Vg}`! z)N)Ny?&tq&ag&&T$9HKSy%6a*m)F*-UA*myG z3KFUuGO95=>WAfJlAmX#*B39n!n%zrl12nl*^~#`3gD%Y4pFD~KZ$&_Z?psrKP)Rq z6_K#gA9Cqi5||~#CE>6%us5Mt6_gowRMjcPaL?_C1ZtThxiRrBJ_!#_D_)xxaZjcg!O2hoV9~hpi%R*mpAYu* z1fX(tOeDPghPeEyMR48iUgD{idoAmvDKm-X@92Bg(p)1yjD152v|hDvK!jvUDG{#t$%G z$`_zz9oJmBVId#z$*twI5p2!F=WBcQ>-z657VvJo4{D&YTAk|7zHNDc2Vn(ZZyJ)L z*Xn3y4Sp^1gP~Td;;9QXWaW7ot{jJp%UOjH_>Fsj&_YNeue+JyVK^7Qkxq&PxNfHG z*1PO7oYzziQX4q{iV%=gFiG_>L^^oWV!^QI8~ydkc=~|aAASxfsK`nnlY$`rt_lGV z8Rc_S1K}rAa5Ak9bfR-aauQiW@Nq31FroS@-ocqP%=n+5(wO4cBF zP+GMRI7xZj#prDhLa39JUv~`xALFzTC=tHmE=F~dvP%$N_)|6-Vxv>P<_`{-62uln zPc!Hw@V(#P|0xIdq*xA1!|{AI_d30$9B`iUGp`cnHU^!!kk~^_duGq1FNOPu4@jlvlsCCSQv$C~8(x4KO8@cJL9)V2+qeVKX zMxaOh+jxo*BHynYn*Y9X6rB^=_JPmDOWmpinoD%e^Y|-%sY8-XIta%oE^gIE`e8^i z*9`*v0_%X-xHt1|ENHnhRHhS`(Y6@=ms9}}qPFes<*U8WSiidt8PO5phw5}2V%wEx zGgSsob2|xWtXew`3kXF&B}CX%%=a;DZQG?V;McsBlJy8<55k~`BR4>;5=3&{t9wb2 zxR=rbi{b9X_%Jw=kti1M-|y;yK?-)Cy;CoWU)(oGK~U3`@U#7@-0I-sfu#83lIo!N z`#L!ZL65B3$jwlz61ecLaR~uAp;xUV;D=Kl1BD2+W+3jE?H^^${lk2w!f{-p53^iWiU<7_?GIfNv>nP35XXzf}2*>x!5d-U#T~pOlR*cn_9Hr|JQeB?9-@ zD@exxo|VPnXawFC9yjm{FA(S;a1es^L3I#niV+Qjx83ISAN>4&{dJB~c8bw>l5%Zh z#Ezq1raa)FG*%(Fi&3pY@Q5>48Phv>imSi>y{2mrXfseYR3ib`GZ2`dbb!NAYc6Y` z`0yMAijWuRR#20$2H{0_Ikh}MUPWGe-9-q@Fk+1|=cG{|Fvp1Pn7)DhAC@3IfgOZY z1UwjRwlYqw4a@*W8(#B}G+Vsw`R2@9tKr}e*;q9c*KE=#ou3a|jT<4IuWfaX|5~z6 z!}N@Zd*^Hd=d%vJT*A-ggBvWttC7G)4C8ue_0k+c6!5K8gc3Ya~R+@X~_tvT{M zT&tCE5_T=b!~QC0CHyFVV1m)l(?b%Mvjqm3X>R8^>2%H6(NS(I3s27>55P+`w_(j3 z=Ybffw>^q?g#X8phc|;ZrF$=>39nxPrQ8^85>dx@Chddh{{Elv1{yuHWjh(AR(dXy z2?HHUfq!Kg!6foa{$?Ka;CddGdt*{9Jdo`d7N+pC z=9yvfL4*iQfq_MHPcL`Ytsw6EUOD5mB=4*m<04!MzndvY z`cw->=}&mvvNMIe#~hL^RV^N>+9>`m9HhwiD~51)I4XW8=PtB%$fw1Fr9f8|5|dZ} zD*LF`^5%EOB@702RKk1RIQYfXL}PI#Jk5a^y|_w}QPEurm`H$w4QLa+x5yxF$m9$J zM(BV26WZxEPcquQ5kYxgnLu1C9J=qLuw*KU18YCgw- z{9P>uH$hCHd`nI`W~%wy}EGa@ie$mdwJ zcNyKFc}`+(?#m5h!ZHC`opQsx1us>2IPgO_ZgG>2=8n82;s5`?%Sr-%dRQkIDdrWR zR6ceO!cWGQgD{6CtC4VQ;{D1Xu{`mK^$6)mN`>Zj21Y|(3D+=+;}$|G2);!`v=T1`WfOjr%o|q zjq;PX2BE(3tqpLtHRn>bwFKCb+ot6T)ghsUBk)Huw}XJqny=kPz1;!AH&g;k^zt0V zn&$bETh?|IHaj1clnw~|bPn^uH7uPsxv0h{99m~EcxD47gnU@{zNtJ7G4h#~grJ6* z*=oR3nn%KukvI|^GuQ%RoOGEp?Po~-iKGs(w0$5SmG>&z+%-L)p@UKre)-wVQAfD5 zY9J`Lja-QJ=)`(B8h&^wcgF|05RFSPJ5=n&qRAPFR15r^H3MxMc6!a|^ag)tW z3NIMAW3?bL9FupkPF$)k1r{|fQ9zXzbSI&*If2bv8g^N5H~cZ&9L2@xCqE=SA`0J=Nu?0}f6uEpc#Eo_ z79!{UhR*w~`Uy%cKbR9^H~F`)9hXLMT6_b}`witTrsL9L-*51tY6Q_~_+pT+$GTuW z5RqD_7x0Z70w+msRQ}N%P9cEtvtGepY~;uie)axbgd?s==xqS={*>;&KUeiO)XB`= z^$g}%$!BtvFTyfF7wJh*Ru8y2h7G#kMK5J8Jp2Ad%$dDzSJZAPBnej^B^k~IXpR>Z zj(Z8eEM7Bi@r&0huQ@-;1mAusE_j77v?cNg^Nm=PFzy|MpifdNlvpVsj zwZ+Zo2W5eBxPl4qSiN_`nHu3H?TM8`*~hto(}}`~`MftTRholvs(FC>25#mWk;dr~ z0Rx|Y;mfs{KdeIF57R;TCg&hjf$$BsIc1UZzx=4yAh1gLd$bU$Lg1h@X7qgZm6tdv z?ZvNnqOtp&zQD{M&N*hCz`?V(4p7f{OqwkNb}D7Q(BAj|^c;j7q|DuR8*bTjc>3Vr zDJB;k9I#TEWeAiWEN^)Jg%{k#sCo!5zT`Ow|DXFQeU%EKb}@1fBbFf4Ny-#AnPK$x zUw-4?C=i~+Mark?5U9te1(I#11`N% z6*`x1hEo*Dv4=X)9fb}lmnJ27Z_Xvyt)K%o~M&ZnDB3xvr+j+-ku#(m25z5 zj?`k6N})OZf=V7P@(^uq2Niy}DzM@d=WxpbN(7|%Y@D+xPdh?U-!6`V62rMw7*3uz zQ<{?GVnpCK7ZXR}F;kiBJ2xfG9dXbIW)J??eD8aex)P)IlyEI35o(`@Fk0}_3GjyG z$V8ycW6{0XSnZ_~($c85BH@O8A@iru~Dmt@n9|M*p#;2l2X8h?#CwH06Sr z*l3+@BjAN}5itGu4-N`w6Wb9B5O~EY^^aiZZ`whpT*%ulbBqd(yp|{9@NU}T3G=2K zOq^2+)D8aYSLFrap!4c1m~>e%`GuecU+ZS(HpT1x#`|%=Zb0+#7-bJGB~yG;+-Q71 zZtDG3+>03Q9HOOsAXbXw=l!`E-=9nPxJ~$J-k+yc8LS5Rs&@b+nO7+pL$kA4_^~|O z1NwejUHvPXeaBIAMv`&~l|b=JS=tGG z`j83VpL%lBEM2ZO2`B~Eb^+rgbC8m3PFh}Nz*U|gLdpihln0I#fParW;U}pVWRA+8 z6u0CE*MwW$R21-W!8bL0OWjtm^$-rhMFT-9^0pq7lp1;`UhaZ_djQ*{gz#f80691LBu{r{x$Ul-2-)>l2uA8|foX-i_C>ZY^?ARzUd9jpR1)?QbQz(|jf$sWz!}-- z!f3mWd_{EJvRWDCf$H`V<{Iz)!%H99Fh0D(^N8z$Lhci9Va|voZi<9iwOCa%4fm4- z@JD<6^6@t7Vm#!2fjgssu;~y^9-Yaay0?4f*Nv+fNVE+n0#)?B6D7+^WX#e5GHW_rEY+$5pIN64o6u27a;e37w?Jyk0?2Hih|C@OD&)+ zZb%%ULgF#u=x$=X3w0m7R!*PUEN|#_L8c}Mh39W*AjknY-6|kTGeHo7qr`V~^aV&Y z8}9$=U;qC4t&B9&O^vv^Yp@R@IO?8Q)Oyc@Poxh(DAU<;9Hot&T(icM7Fr6+vfGDzofT-_-BZ$ocUXGI^$VwoEM;?zj43tt?xJH z*&?6a2z3pwm3Qm2y)uEJmb5hYm*bHU)+Gd{(@?zX z1Tsqg#xlTtkGfEJqdA&9ob1QpZ@^FFxR{aWB;`6vnGV9Zi_uSijJ#b_jF`H^5`>yz zguFbiL2!+7b}?e{Fvp}F@D=YWWe+g0O5k(m^|=kxO& zc*r8I-OkCGYnE7H;EU~IzVl(W8|=HTcT2dH0i1^#H-VgevqLn2;V;lx}1zerw@KdeZa3JegYzu zBMF_1M5y2o_iG6?NpW})wU-P(od)A_fx zOZHGTrMrKB`6&tNz7z#nkzkHco+Ji0tpUTrcON9xQ;Hn%?`B6NTsc14k#*4UyX3}Q zjBuzK?lKI`Da0*_$tei2svXlUyajn^g~dw@y=byhYZxpfy0=f&}N^mTk(dkiASkM_Zt+yl%`7jph!prn}BaYOLsDcPlbx!k$!5$~re83s=-Fl1SD_WWKT zJ+XGp%Wi|q>|FVxa8In&z?W1FaNv5M586$=<%Y2Eev8e*O&k--G0j(^HJR*URIto^ zMhrhr!5~-p>eA`cmdBj$ox{A&LiKR9IqppN67MqD{H4qR&X+y;WG0*!SG=PsFLP-m z#~y)muhReh@i+wrfJ96Az|LG&C*j}Mzti7zcp6xqZ~cg|qZqU%=ov z5-$UP@@%K%-z!96wGe?U+D3%dF+1QmyiRS2w7<`CwZW8@~M z&$&*S65)j}+dxPM;YAiHzx?MfQ?k7J`l~FV_M9}1efAs#_Bs72ErhRolJdCA>66$& zXt7kdQGWZ)TR}PD8nMHWO9QWD_*ovROJ^(9<9NG)aL?vEecZDxmBf0326NANRLuDR z-{IJVl{>4G@a(h~WuXCb`=(YO9&W$4XluulbmYrAreRINF@&$-fGp~Q)5KUg-^qUf zg7atdIplO@)!;w96vu3a*@mj5!DUZx4&ket9s{y^8#Al#gzyeqDt!H$FmT_$ubF_o$SrqZ;z zHl994ZZ$Ca@hB_c+R9h9>jpBvZBes+e8%{*{byWs$zDYTtx8-_^jsn--n+;y4rpdSG-^EDJ5vujVsrNJsz zlMs42jQmY`@1W%0;}GS>Y_n85t`;9V17^BHaCnCT=YnhGn%dyVhC+CVfZ$_{y@Q;& z3~+p`SH*y}0$eGMg{ZID=9H7t{>_upat;FX_<#JPAJ#z#ln2UduYZk`(l{s$VVhI; zG4gxe76PB}3d@Q4SATzQa>{4E9f8Nc|M8~hAW$SgxkFF6#b4V;xW!&bo`b;rA}2BN zpP@oPJV==ag8Q7l>^TUpy;_?XU2Svv!yj`D!cY1C!3x1$PT9ohiQMM29*o~rM~uD@ zIr~hoy=vSh?sl#-n(Q>3q2xKzvb1-d!PRgaTrDsInYX4`*p+Qr?sIoe3Nh7uG37(J zXTQnO#pigNk#Bg+kDJ3S2&*k2-;kQuwsWi5d?8=XoO3$3tt;h0Z87IwP0s18o&@DX zJzHn94XG7e)7!4DXyn#J;PVOUm z2A|DRIp9zf938E0A7QI?AeT@`@MN5gorM+8Nce5I4@n%SXCg=PhY!)-L<+8YD9`u$ zjG-KBQVhUF#gEe~D6Z25fq_?evR>_x|I6cKOsZzzzqWlaDF_tPvJ3DaW+#0AXN|GtB}ctNqfh;dB0!#%?QjWDHP=BWGoaa z^B|nq`k_K46#)4(9u##rUJKF9GA$eKMPJVu(Q=KRt}5+@@=D*s$u)Kx^imw$3%P0A zRj(q^@0K37N|M`mCvR^=U2;bIpzbzJ0Wa*~@a%G5{stws;Os zKqXHi{3uy(Alus=m77+31h)-mbKZRB@?Tx+`AP4H7)^NmOeG@2ExEIKOg{TTACG${ zu{J?q$`ASo*Qy;wjL(f5Am2xdYc=fBVdJFE2c6`W%9EE}o5z_HDbW*Au_)Fwt*q|E<`%rIgN z!jFFB45P7w;5li(v_SaQlh;Au@yO^YnOXk0QFonn#9%nn@RVBo)nVXs7 zNpNA`MjlC*{00B>03U^uD=vd8-ezpdoRfJ;~<#em_*Wzro}AFYh25Byr}fW|X`<705) z6`^h~W=G+cA8Pqw{t|vv+|I(I$xt)ugyO4X_#qB|=+l(yGpjsZAlW0K!UQ z=9AsW{6p_OvXp>l3X%_GxE}l=wMKdr2;RfWT|O-C2md9>R2Id}8DWZ(B!^r+d>B67 zBR_lazd!lppa1!jPc-|rLHYy$ET$J3#1!vJz)Psa$dhPrv%o)x{A8~jm?BlyI?K)Y z(-qrx9<~>EJx!?S_m_((`meWF1yu&}P+?x~_QE}ip zy3Oxla>!e_WdSZGk-83Qh!eRmde^&qw!y{>>}gSC52T=?FXmk2FX6pS5yQg1rGQrRNWs zNI;W79inQkz|ELWHK67@-*DuWM~dXe;_5Mse2g1@qW^|D28w{I_Bh4Ivj%vBoYrso ztJMH_2;5K+{WdxIoF}J+$J>hxzQZm?zhREiFR%7F{n`KIG-6Lm`#~*I{+{*0Yo4U+ zQEAmdP%IH%s3}GqQ*iLyGtV)>h%Umxt!HYc(19nVJ^lFiKg*OqTOe@sf%O9z&G4+W zI)<6^nAsEQOCF;99RJgtlSYAnuu7Q%;VbkHm}2ybo1DJ-+JEpQ zSDvmUwxg9HDfhe{tl%DJv%A)tBnz4OTmeWFe8Dt4uy8A&FaoO4ixIn7l)$lCh+d|t zT~HL*0;Y<%yXJRQQq)Qq#F)~}r zNd~as6FD;5CJKwB2_>tb)C1&25?qxh8K1**K&2cKK_Ax@|z@_LY8QRs9d_pruf8Fr<*We0Mc#v%Ba)l4R5Xhzy5Zoy3>if5Koeldcp!|%#Zvu|7;#v`tPYp7d1 zYbE;b<2I6^TAmS(G7Y%f)M(SEa7~VV7t5zHLpHPtH=W*&DeL%^56A%!6~hOw zHiyH^A&x^-hIcej+<+OsB)+4(Tfa!7_#hv^3`Z3@zqT+;5{CK0Fo`gP(JBOKSI8~t zXC~g|1u>&jJJ1bFieR(CP^9u0u~I2Ws5%)8iRAbSo+@^>LHLd3wL61IZ>EpA7yLxR zBk}a*!z3ZxJRm6mB$msq64z8S7B?6v(*|f2!%(2`7_l@f#9=wXkUS|xHhIQNO2A2w zk^(V9u*6e%aJ5tuh3{67Qo`^4NjJ+#$crox)$_ z_hb*y>KIr|G>jzd4T*b&91g98%gE{`X@23gjA7>|ouYP5d9J)B+@aPjxFrtFM|HYGRq)duH>canE z+XmqU7G7eXG6g|= z&-|@2(K|F(@Np|YOpigy$^|5*PDom`=kMWeIDi!=GC>Hwn!rV~ZBF3ga`~%2Pg=aO zVcAM!(YQW9E(~92?2fryka|T%u);P@7O)~Z)PChuKB%nXPkI_|NIhmFS4k?ZNdmiS@>5&^L8uYp+06_PK=v5nLOqFzpfH= zyFtgqvRr`W>WAy4n(~LAwS}}StTGsh#Le$ScX;LtlHd`{OYB?G;+3>u&CJY)_2E24;6Zkkh zRr1Ix3QlB<5i;F4XK>#y_!{{^<14prhL8RHcSe%jb^{p3WYKEYS@hKDuG^A?+aqKV z@JVssFWkV0$Isdwqm?7Qa*Pm`V9H;slyU2|dzM=k2HOT~lktwWAa5hiERYIpy$a#W zTPbyu3BX-jBO4Cc&unAE^6oAH!H6Wm3}CaBsQqkAaNWJTdy4`!3+ll#O9*S!aqHTV z@NG{4oXg4t(QvGd6j$I;-q-V(L#cK;_gv=KOzi2JfAJBS;i1T%%Q)l_c*bEk`k8KX zgqk_TNhT8WncrzUqiyC1nIItM26`q3zk{B1#;R(O~y!owVoUU`&c4V;5{UrHBzQ?>E8pWpAdv4;kq;u?S+8)vE zNjXv6ote9F$L0vrrE`c@@>XbAq2=Q|a(Vvp?<|+am;RoAWD(A7KE(5pzrca}_=F=9 zClT4*ycnfikOy+Mu#}N2EdA2fO$W4L#_UXkPFY~YxNTiv-0*1mP&Rxhl?;3=x%N>Z zvjVQuTBNSK)yJ#cx^m4bO}5~8O%8zzYeo`E(=@_~Mw;@WjDP(82d}=H%pges77~@x z!mDWN3B^?eUq!GGc_2;%duR?Dqcb%rI%l6vcpzBCb0sKmUcqyU3CM5EUkS>f65O$!WQlM7`3=06&2#6U~J>)|vqaK8S^&wsaimp6Gp zbWWp++C%AiN$kIVjnis0$l2Z6tzlH$OG%`7&Y`$>a!AZS-TP!R>2iWdrWtuj!xK-Q z(8>gKAFR`(JZZeOHaikP&}&9`ed@zC;B9Fm<`J=a$I`@Ly2>5nrYsBaYU1+!;>!td zwetPq==)<4zPoBo%M;vcnCxO@rc7>927B(F7V z1KeXtSH-E@g)ZdBrVx z{st9(4R!Tyt#btgS6~uS zi7bQKc3Zx{!LKiqAzWf{q>EQ5Aw2fTqmMnzPHE0CvIl{6PM>;;bcGfKc2fS@x5*E_ z^Ltbf+y~)}m)!@!MU0qY#6Acl2%owN!hzCC01R{V{sHO;P2^Z`aI$wa-#e1;?S*6S z?GsNf0N-O^f>Qg?M+-KGe9rF=fSl=u_MerIdN6T_Y(vhKeu#DWBz)4s#NaGUhl{}H z6SOPK$!F_>Jp!}2oI@@+oUIOL2OO~3nC3H*5vY&uxy!PK1E+E`k=2Z~D^}?F%9_J! z+*Y$&EZ37~$2N~WOOgPekV9CY;7Pj+=Lu)gw{3qz3)yNmU9G7ZQ2n(Ou~=JA@Ye9j z@{D8wzFLNpJgmZ}jqjdK8J0w>!>*>-IBwcJU7X4NmD|(EUBVhQl8;(yk)`c?%F0hS zTQT?-n^bofK4Zsb14}1_%CXHFMmRinlMfj4glk6<9Sw4b-!4fgD|XzdOfoWe;Is;$ z9qw~neicA*xp;dri_Hzvb><1jEJ?hRoq1P8=!7XkrU{Dsw5$!L9GhG zhcak)=pxnAfE}PX#?wrwBIgSHfympXb7kx%F5!BHztV5uz(8cn6|)6BQ3?&@0>+}b zkhfrjT7Z>S6I8>^4m3E-FbF1Y)geU)OmBlTASMiQ%MJ{<{>dM1)}cpxVp@`K{der?M!$pFGtW&_x|qVU&^dRy9;Ndz~rh;^hJ;U*Ca zIBJPidj`2=Dtsm2iuC4qkR?P$!&?*5$bpd*VU^rsq>B!P>})ubTC-|u!df8sHKO)7 z$PvOU_btcfX#85^)D%V>d9`4mHmwWRCS1$!s-e4b;z-9WCWJGDDEXTfPB=Q8F|Nr( zU(n97;G0T9EidHeV~m^j0WIBdRV2Lj9q=0Pv=bN$cLGy5f$T(;pcDrDh-q*RnA|-ahHUoEqWpRkA>mf`O&ukew2m9nL?K-{l|4y-5q=WfSNB zi)Bt}QbuS&V2%+@%5SiY(eEQ|AB2BwhCl%Uc@m+5Kmmaa;R%;9vPGHm;fF8KGT<^s zbPrGkuus`N&-(BG&oB&^F=D@EG&uwYKX4yr!_5BA^_OsTcUcKR?Dh z@kYYVG1>!yj`yfN%;S+Gz)!Hn%09OW8ehxNjT=lIK@c9+aqPLgg~QkKxqLR{4g_4u z+OK>6eQ!FPAB+jNv|}P)+eUH54F_!2u=Y0#eoFzPO?*1^u}vRY%N7pZ9%8!uiY4EqpHBU7oht;W8X!)K;jrY0Q>1 zxXIM^6igOTOq*K)odW2{TOJSa=DCcCH7GA`LFgWD`P@E zujxerI$j0hmeo6DzkQ$9=0WJ~I2kkaI(33!7j(}VigIwm3CECmIfTE>foSK<vs!WdOegenKE@JPTp+qV%ckP?Kx21D|M z0gn+&m0OD^&;XL8p~ZecSfhAm8ew7(dp$oXp@5J?Aw1pCnuh6Wh7I(_6IWi;`Hxh8a#Gw1~j~hPty*I7F>yM0=hcm>sg2!pt*E^tq2h_8eshpQZaiKEbhTnakBt1zIRv zgwU9AX@S5s^=7Ln@wR<}8pDKOK_z<$r-vEttfHwCUYBk++GZMMKOlOPGkG;1`BNf` zwj&!b9Dr34-i+bbe*}K6OoyS-yBYYcK!`)krIIi-d)y215*fi!L`T?YJ62L(;s-xr6f@5%`$ z-VAyYYA@sLeBc_U8VprfK%w#FsE(IxeK>ZmzCD3oYK0rerCt!;r5OB|-g}RHC6X=7 z_?fyjD)T=AcRrHAXT0SZxj0z_5o`=}nwdA>`EbL{&=;CKgy+|o#KMhx4`L1h2j(}M zDMo*mWsF?s^oKue`yjB4(F-s9-gnw6r(a_$WqXvF+QT*krUz}KH1{`l4WrAPbSSg6 z*(H`TLOw?YfwZ9e{>L072-zCJW@a)8_g-c?(#5u28mkz6?#e}*p4kPVH6gHZ^J8>I zKh7r3ZJ)HKzeIvyn{vw!=u-Y36%RTmUVh`{AGK9ZztQ$dBSZKHpUMit$&urc-|LEb z0>eD6C4gg8n=lkUhwq0o&gV%3I1$u7S%V%yIhli~xJCwWNJTb$UEDx%370j7MAI;> zg$O48i{Xg(114BA_&VYBd_I|T)BF&>Z3s=!rRye*yJ-%by2d(u)}}PMq}|%RHc1#J zQ{w5IUSS=sokKbXa;^!?;5J5(YpnMC+?Q_!9<4&)$YQ{ojKeWjZJ35PGTwAXV^rxD_fLEcr#_izoMtjp|2U5&(vpvgW5~R; zWA!|b`*6o_Oa{<~U!#Fdi!1HZdHTa|@xUL++g>|#vr$rp^O%;KSHQX8J8(d@aU(y- zraIU=XduR2OxWo44>oDRyG%D?tOAq0jgC-5$&cf23YDN`JY$qj{9P7&$sSF=h| z#Rhvd=ZsP`YE%X24f23UdJE2x?0bNyBk@9q++b`5%%XteeD!Bm5hBqbyy4K|STVM@ zGPB4i7tS56k~^KUD!}+o{0IT1Hg6-sSnbdTs=Oc%SFi>WaNo64>*JpzZt)6ar-c|P z6L{#Wq;PD{a14Nyqum`|rd;MPx21-NKB6J#u598K>GoV8YR# z)a0UjRyxY5sCvQ87~}ql0vug|0q5*jH;s`o5G!OTZ*mexSD+e{4>-=1@Y!(DjS3F9 zyQ_tBa``SGy6LN9oXELt*70=E!4(%mO;ep>J^&2aJpZREE(Ra#yLL41>cgo8Bw^s$ z9^Uo|vixk-U_6#%z`N&vD`KzA3x>~s^9A^Q1pZse=%dWj?j@0-b;t?oRk0J^x}D*7 zjU+!Xh|a2eXgzpqbCyGzTHbBqu^(jRvtgvb2b{-Z24#Ap1)3s){*_}pc(gNuCV zU;NAkN&@}&Kh~gvK<+>;VFH1JCati9z;)U4lIZ~*&@OcP$Ya?_nF4|(gr`Umo+3f8 z1tDF^HX+!9@bb$)B13SBQL7+)^P8W(Wlr}Gko^ zgh~x^i&p&NofNMjI)WpQh*WiRoamm%$@C`1xR~+C1H%32H^RBzlpW^$M!w>+e?Ebb zNSqz`fS$Xu1m}7}j z%6H+*$&ACNHh0fvHZYhVtWzGqhHA-?rH3BS{ z!5ThhMY`1r=H={CUkf|*Gr%yon47fXKetMi*=Ij|SB||{BuXkE7pB$#kKint4(AGA z#=siB9Cmt7J7?kaR+}eSX4V`RfmrePNXr8+>%>! z;xHt@QM}3qiAI2#OLVUkzXNoP)W&NS3AFQB))E6aqaf)(EP_=VkUJu9uGj9DAM`sT zl>eHeXB3bS!S;ENs*ii5tX{%kVAFE-xFB_mTRyq(bL!>zo_+LN8=-umiKlldA716*wU+%+e;qGJxy79B> z-puH__-x&RlUW*)87n)`9A~Ccq=*ZC^Iso^-Yc^uiA6=SSYTF-|@2ke(xok zluZ$s#Pe16Nki;WW}~#vf58bx_9#D269Nm7@|S)$Kc<9Wc0hhW>3{-3_x;cKVaY?%e!Mz;i^t#kU+(_j7y^0lvTrWk$ad$b_@ zeoGL3*!D>?KWIG&pSlFW%7NX*jK{}VI_e`L&6mva{m2fM!x)Jhy^cPSV`KR@{FYkC z=}*SrgQ;-a6+bdZ66xf8KHGSu*6IN#%11r+3~Oy5H-~FX;A9MNjBMYGOlAP?n8>}w za9WgCSa1R>FvG5TGKH`9d=_&|Fjg*Cw+6w-d*k&UhRw;YFlXn&?t1Be4emMi>)$*< zkLbc4vAjWW4Ku3vM--jYwqOMj!lP-p0c5JPLXUyyv3%se$w638zLdL_n=_E))_|w* zF&nzELA05HD_#2zS^C0}FF8hp<-3j3{Xo#AElT`Tj=yPL5%693Y0>;XFOwZQDIh+* ziK9KjiDIBp#gWWqN@qmgBXVN|vJa1Z6s{y6u&C@ENfBDwKs6y2=hfTqd{DB<4pbTR zOM;@JH#x#k-VY4dDL{y!xD%8TXqf^Iqb@2Cx0$M#edQsBhdNi>jKz~cXqho+k{n>0 z43t2T&4y}lbdF|17*Ymsz{-@M6ckhrjzb>QaReh0@K$ka2=aRbUIKUMrF^pjxa%bu z%k&~mZ6uS5-pUlCtdbP#EtDhe20uHe0H3A;U>UH4gKDfs=rtV!1LR!{%f!$Mbec8}5%*@|St5 zc(sYNo#Z7Wi$HrGnf3aR_qRt^wPf}{&n8ESgEWtQ@9gd+nahGL_1ZS(6 zj(=!c;f@=pS$V-Vabsn>-k47WXH8R|`w9eV_jf@VnPcgEWYV!+cq2EGor6?)m$RZh`ee95!w0j3ztAm38Cc%(OlW^*eiJft`Qy2VigK6 z5k~+NxfXSjeOLRgj|Ll_6*qe-F)>K)M?+)3j`7bkYDL*>~Bo#R$M*UUo5? z6d-UeI2D9{omGtftSw^njqIe%6eD^Nm|PDAk1Pe0ibgeUk!Z$bs((MPU4 z^2n9Tv=X}$!iAO~eC8pOgohZr@Bd+sa@!oiHie8%GU8XCbqyodICXx}h1R3&8b(Yp zqDk2V;R*I}=6`~Hl&NTZmHZ&foVpPL2?GDyBnUsTg5XAJfA-5?fAdqglQQ|i$$_%( z5=Qy(Hz(LPmH^5C*OnU(PpF)s6gOp1Q1R!T7anI*6_8`*nD2$72}XdWBJvIoXvVIS zY@NWQ<8c|>fFg#=`}XN)1-m%sw<)-}!_^5CW!r+mCz zFARtl6HCDG^<)W{OyJ29Fy$C<-JIe1_{Thz8!w(Qd^Le{`^YXgIZ8f;Q_5z~{}Fg4 zU!5)p@;>3U;vPKg-^Om8&-xX=TJ6vU$N$QbW`}IwCf`M#ZL6sIG}ptHBd2g;DG#(# zF*m{67X94jA>V1HNWLovW1)R1gzw7zadC$oaO9K=9sv!dstN21_gz2t&lUJ@E2%7S zMwQ@%B@YNsYGBoX09QB%q$GBQ-jUx|;GO2Gvy@|P4xLjGsABx4LRN8J$3vfWbV1c7 z5Z1Wo+nOS^>drl-3C;MX2ToK9uOy=52g5E=FUQ(K*GXv?BpZ{C8RO?cM z>OzPykaJfsiu9>Lq*8-`s2um*Hu=q>0}21uNxgF1EjgAB?&kfXH+-?gkpFeFlGd^E zeu-3UQZ{J;9J_TYM>kGv!ezA87{XWb*=)7i&SIUNHIB&7R@iWNRGY2|xH!hx^1>3v zLVSztz_u&5*X6L}^2F$Q#PE5ghEsX| z7F5C$KFrHgJ_IcR2O_^VObp}|9fT6khRd}Rf;Nt0S`i3x8X^#lU}MykB%nW#o{RmbWR5*YGOH-u zq35v^0zId-<PL(-{rrZozmC_ff526DU%?OBD9Ut9(&@E z#~-`$$YX3~c9{agm5US+=r1NmV5!oJpQ8}afB%yW4CQk+Dr6sJgvtZcizq(O>3rEd z;o=qkZCaooeb{P6nv_#O_#*8PqzGUA>es*ib(cAPAseN!$|>oMP0A!YKg$%OPh$mv ze842ZEa3R0S`zlj0*+C{58wy#E+YttN&q-dte5K!;q#B;$pVrFXw4N&0aiExC1dqO zYoI)bS;4@|b_xTTbFGVW4ml6(12`I(Qx{pspV;28!W^%S%ULm%v)w#t<%RXaLISmg z_UE6eyltE_qrk8vK!sTD!=7p1g(n?weIyK?#6np;5aK4fEgqC2V~7z6 zj|>AT7Yv=KuJ<`txK~t_6F4FXL<9pKiJQ;&9K;Zf`TNM;GYSO@ z9{5(D$JQ0v58v$ zL=vbichZg~XVOs|j9b`YR};Fs-J=r|p5|oK;Cp`SdH?U36VMfLs9h`Luu9SCs;iYp5l zU3`e0lqo|vX^8>?g$YuGM=wA6$m0kZ0u2aB5T1Ja>93F=WFLfo{2h7_UV147gqLkn zwt(fd1A_c-#&TUpt+z~)ZXj?ie! z4mP{?pye8z;BcuNF{)0W4frm8l;^*Kks5*GJR|dk?5IOD=|SV!0-^TvX8;gHX_GmK zZozOOF-zq475kR`!0u=Lq;{YrfDk~(Rrg%QAMuOlYAwTn#?wqtsY3C5`-fvRo<;>c z_$DcUqf7(RPXNQu_5}izBU+mz02hrVSEWlCGaR?AYxEvxI3abo|8#BN{QtCl5bQzt znd_XIA=sqs6eD^Nn7rdY2w(dO`yh}XFvsXgc2XumcmkmV;bCU~Tz>eXpYqHKy1>a! z%I<}1tMO<1@Bd*F0yxu;I6ljDfkfhhiarFIotx`^Pu;_ir2=+#m}$B3(FW2?Gif zezb4#K$GKm%UiPoerrj<3&-4VL%2crXuckf;#Nk^$Xq^0S$`nx)0=UQ#>%-j&m$ZI z2_HU``%s(*FSB82?V~(EL)8}|X5pJDrWl)L?2SlI!U_AvkP}QIfE77i z_`ug+IKL>b0r+P3H$iy+!Z1Au&l(rux8T>pZBYv+;gIvoYwXkyN5WZj^~Lt7PLF|t zS^Wo^ap2yee;o&l&KSoQqupp3i)3K7f|DvN zRtpLZiwQCEh6Sr*a|=ZT8sp$CBVZa5obvIRJY{hzR-%!X-x3%ML;?FG<*BpN>UJh&40rHW4H^DT04O6+=cTu zBs&bM)&Os_i%zfZk_))&PVu{{oO9APl5MAa{X9I&(bGDG-#TmGJ& z98-=R{vPNV2XAUY#0o;15L$lVMrmnMHbK}-G5Y$~zWOz$7(K~G%3u7FUBWggyOr|e zk21xGRfevZB+!6x=_38fHYtDBYQR0;|5OnMix@owHG2?~Ku|v*wO}cui!?mb^2|SZ z*%oNp93FSuW~UfsBV~G&sUWydn&pju%tp#iG0H~Dn`KV_2YV1col}hV*)sXY$qn;@ zo5weAw@!qcM^*_)8TL>175It#;3$0mSbh-B7ypKPC+R_^6z#$1`=kW$69Xsm6P)>8 zc%Ig&AKWlw&~%XR$@k{rSq%xr$e;_~lM@OLAr=Wg?_my=e0<4+deUbC=@JaYuUd7_125_#JO1R-Z_~3Gc)qSJmmIy4!1W-902*al=Vv3en+eBeugu+`;c4E_yBACtF5de(F>v3AgKY^39v zq7*)AJedMhmh?GNT}b7bj9>(lkK{O{1#PWVxbKZ0n+9Y-qgZHUV`fAZudJZVu-*-i zR6!wukeq${vRo%dZ0~JWj^bS5j3}2kBB-R{8I==x#}Qs4kA$}&hjt>7#28=UViBVx z1GU;}`Uq;@G*q~QW4Jg8L*sF(kbp3TM`!58_ybD}hS8j5X{v(ld`6+O!2%8%D`vQr zfp)>9@?2fNb1NexlpG+YXBIQPljV^N*0u`7_269Ll?B8s_JaX02`{HNhru)<4CVF8 z68`1C*_IFLlRxfIKyAnwgQNee@Nf^-Aj04i3EZ>1&v$&j1c39z#yP$XJ zKybpTJ1v#hsfWP>k$smgd!t|DFTy+N|GPs43EVSrRC1e zsw`eA%CbeW;%=f~P9T@cpTQ$0$2FWPg4_d64+0<2ZJE=bwJAm|LtraqdJtU2h#p|q zIc16w^5hqv{32qLvVYH~FMtdoyO~|QaEWJ}lTWjV(O0P;xRWv&LMjL^zwsmFClnC= zho7}=5I%+bAROI3Il6tsdHd*j4lFVT)J;+W(2b+p$9TuLZxcY^H>eA6)Bf#~6ZnlI zIal}r7yQNv+_r_|M~ugWQ1YYj6RQjq7p`YFH|;r! zU+p!XHCUTqXYnMS{*BM~)9)M(LAAn@3VuFzSdka8S;t2BnoXz z+Hjb_%m=-`2EYS_-3)>Z!)!p#@IYkMtLYFgKr6Y-{h^g{-R#cLyjt8yI_Us40vBR( zhn{I$C1Xr*F>aswX=iK8rCL_lMc{*WH$pKGe;1BzI1&&Q(>H*|h=UOq!62r2nx+K< zJ5V@x>-twHES=5f(Fd=*TauJOg~Vw(D$xwR=skF;9N_-^)gdnrmSvEPphDCTqQ$09;LeZxKjGUrj zy&$3AdJ&{DUN49I;hkUo=^vh7FR1Kb80u37kC=%fabkIvQPF{Pp(F{vI*9m(BV}Hf zZvl->y5ON!iI5D#62jkvtUosI-Y+x9xU+RG?C$*%-n1&E>XiekR!~J|@l6%(_xwjs z<@NlheB3|(S3dv8JljvXmb>?V{?~I{$2=fX&;LG(r&9r+sk*uqiZe zTboH8h~eAH8Ay z_FSXrFIpjiPygEeY?CH%mAr>z3eg|MF>*x}uVBa3A?lu&B-G1u_pv{6vxIwjn@1Ew zmHnMlT1d_yC#s8y4)ba|DN{gTj?w>s{Nx)yAwA$P@qBL6g7BSh(}X~NKmp;aUw-nb zC(RIAcJKwi*B@mUWv0)O~_=n`GV9G9pEJk)*v;|?}TOOUV|CXgNA(Sg9s zq|2>-zOJo*Ge?SdwVr=I-MQ#2ubPKKen5ioeWn<( z-&@-T;g@Wr{8yj89)#OB_-xps!F;Q)BFCx>K{x07&d54feE4TxCRD^12;bivBS+%S)uUtRw_pd z2X63h5-^o7CoYBBUJDi%mL>>Ga)v3gvh8iU<;ZeZd$e4_Yuh!rGLDz%NF%%CWIu(J z3D8(s-v~e43V~5r8lZ9DxBJXR(t zDRK0p2y}kdE$TnhJCYH%wq2_`J6^5K33ntv)F_@3Bs3a;LcV zKqx5$)v~G_bvL~BXVBsHa06I!ASbB+zEZl13-&9#)-)DZLYxe8B1m{zom&QB62TZt zk!A7HYAq;k??JXp6BMV4fblwr6NqJ!fV1H=FaPczQab3DJ3YUFx$i;X$QZ@>VJ~AW zZ6$6majOp@@~5c|WZexO_WARW7hzSN^)cnx4hfa=5+>5C66k}^6lUeelP4d@f~m<2 zP>vRF)-s~jd$B5*PRIkHAnRl%NBvzvuv!)JNEj}5HgdH%a?|7!dE$M2v2yUljb z=6e3`=J~&9%VvY*dHyR#;E|C-H7l#V3=etfoqKq{II2T7`p^AAS*RNvdhN#%^qE$#JmH&Rc!M+Gq37*Tw z%Gg@;9T3iaa&>s}gvQf`fCJAIqhJ5}XOs|35GWx0$O^*mzx2`zbSbw*jNB-V&vAPY zzWAljf1XBVH&S+r(PLNKC+*7ROAlY5XMi3AcQd%;Vn&t?`tN_oPO^oXfK~*m4e3?5 z@HyKT>{MnQBmPwm)=?!1@jt~nr=LeGAAFH5o!tk4Cgtpt_MI1KsWwA+;|&W4R1hd2 z(1SpR@agM8;7|4lB?5*U9FF;Vzj>T&;O5PveRw|oF>k>5>h`7s0&wEQ80E}7!bFJi zH0C~us-*zL8;^GKQMh+=Xco7VA;0I?XKK?NbDm{b@!;GQ&Oa;%$oCJ>@RKw)9Pb@* zxB0=gU4r5QWWyl@=Z)_X*h?oH1RE31h`_rpHCZgj=PSQAj}t0D?NR>yGO7^B*lXE7bEEI&i#yWDBHcsY{0 zXetfSj6TG@8FK+&G~RZ~ncD2k<370ndV!URMrl~9TtE-*om`1(m-XFum7gaiKs5UF zKr>1=QueDE2smi>>iy^p@Ao{|C;>mz<%ywl5dmZ{9GcPChHJ<3@SoGm6|U;IF#*yN!t@#zwhwR{>5OR}-*gpR^Gr`IK_S49;(@{b>peVD?t{q;yk-tc-F!zaG%U|GO z=J_v26`#Q;@;v|X5XTI|=l_@iYeAAgkdxzVp}0ttkz&N|Hv@8s?;WJnf3 zeJ-E-l^n#(nRs{fANjevPZm&)pla6Ky8%ZjnogAo5T-U?UXf)E?l_8 zNP7btr7_3ICS_+Bu@Ax*ND%nHVJBr07nV8wwr$GE53C@NAh?QAc2fQ{Zj|Py{r)jm z{`!w~V2W^)X+$`#aKyOfE`i!Q3HISw{B7SRW-heF0LFu+Z=x_2x#9cqk_6;j1Aby) zp8LY_j+=wR^?z5sXJ}u(XV_E$vPbH2Y{ZKY0j)jub#Q}d@&h zv};pVfHT0ahabQIbCi6uj2_&g1d^pNBaeHA9;lil42W<4Z?Y|Iz50gf$ibqQYwlOK~FC_n!ILq)crrKD7l1CHfCTSN3?v`U2nON;r~AI5HeyCF$MY{g$X>406nIeAlG_AgHyvZnU@X$S zSls>_<_U*9uFsn{G#PS(j$BZ=j!MVqmh&V}iNLT$1P-|dQ5di!;pxQKSptiC{!jC~ z&XXICJ(cUO7IMl3D^mfZ)({r{7040-DZ*mx6eHV{sT82C5ws$K!x)w6MvKPL@KYk; z&vp|@Bcoj9l??fgR{!H$9cPe-5WpD0M>6d2?74u-YDw}oE!A-}YWwmtwC)EuMFzEn z2D_R!sRB1KaLLI543kKZ8fcJ8*yhabZB2=pLWL2xH!D+unS>@ufrl*W!^G%52@?nVeKG|FbmZJE-yfcGnG5#D0!o>>~4*Ku^VFdw3!N52dCLIW$u|t_0fmVh~2vdycK|oSMXiW$- zAW%f0fY4Sk`Z_%bHYvM`(f4Sqc9~P;8~;OF=k#Z^AbdKf7%_inpO)ksCpTM?a7@L3 zS^}rv+{i&|J-%U`fW?jAJZdR4&}cxwhwh1-K7xID+mM;)F<~sEwou4Cp+p?Gxp<_E zgzv|PxdrDOJue=8thwiZc`uxVN1)(SK{$rD?|rfZEJAHID!k24A|pT~8nBat!xW&o zzox7zs+KIQp$)CC%d^jd!-OCp9K4>B4iK6UWjU#}KS~AL+Yj}9FUcLUjw)zA(LJ0T z0>dHW!-+qf9m*&2-NQC}32rK|yEeL>`5sxc$}$d!Q%<10B{Z_Hnp{@0J8)*d-C9YJ z>42}2Km@=sn!PI2VIX8 z5W>;el``nWCGKx^5{NDi(in>22PW@y1E)hDG1Li8&N##E7PulkOSQnG-<>T(stTQK zI;4%?uhk$RDj-AnK!W^UuNz`yc99Ioi7Jli#h}9x?l0pOPvFj$dxKVZ?(Kye!xQi2 zHLqdfAmH>sJ0wSl(FVe`C$teP#~k-|DCEY-Dgefb{tj3{e>aTOf8k4 z5)99oYJqqU0*20q;Mo0=6LOHM5Wb8I;x z_pZ!u^3u)k6**%~D|!xY9ieiCa3H7O{)uJzqqI^GdrpEudXU7ynn4Ci2?R3T2u=mz zn@%xunbU8$%qcr5vx*S~gv}JARzYB=G``2b#LOOg5RfNqQf{jlJxYGSXFMGUmoIn>TLW z=D0!ZrtzaAgYcUtC%2DS2=#^y&HFcQn^PR$B#GcI^9cC1Ig?L_j%_CJ zVJts6ksmcq6wcr73BZjW%e6eY;0N+7kK}n0$T?T#Y9j~@zmB?oaxb6DiO%7B+=7qV z^I!DZ$C{s*2sBO=!LRkyr1t>(dkVb%nnZkt@*k;<8(K8npem8=58}-{i<^+7ti6^W zOym>zWX3P#v!o68@QK&KYG!qOGGEPCS=jDy4PUGe*eqc_!P;ySx0)waSit$=dT+cS zEg0`DEI^ZM>;jbqi3SHEcel5+QIlZg@BZuJ_aqImmJaYlhJ4zm3K+Y-c{GY+d#G2% z8JL^2g8Qn0E_e&s6`f|d36%!_4z*geCO9bm=JnD7O9!r;k>VT6dj@j!zPUg|BPoJM zOh%nVmEO94V3<(UfOI_%D0B@b2eEsJE6mw-DwORYd>_%4dKi5b4KoH0^3<%1Bf}@o zDBdaMm9xy`2bDG?ACPM^BTR8n6{9|kuJ;h=~$u&44M6`3p>$&<|juecF?)Yo5F}#2oB1sb*i+6^J z0=)St8*qhTWcLLu?KDNZ7ek^S-OQYYP=6Dtp5)GUz{zla*8#(QE`lSo&Bh6NXYe3CoTrLlFpvKk5ARgA!)J{Hh+)dtjQH>@ zZQX6l55Z|;;^DLSb`E%9WjfK8J1XIcwy{>XSPKp7>aTV3{KbRM+A>BKjU#)5=krQq z#g$0-c-lRmeg2v#aMLQ!=RAL1@@VX%+Q7=^@6_k7kaL_Kv&Hs%A3o}y&uK6N7GGeT zE}JQw1i9==_x0_J7i7(ZN{yAcODXEx(ZkmFR_z%^i^n=F8k zV>9F$4&m5veXgjxG0YaSC9|E*))O#wlPFwu{nNA{Y(=a0bC*@F~d(Nm}5;l<3L<*B5xX%IF`bEhb9G@ZJM$8B|+l3%Un>c{55a$`eoqY8F z{9pgtjndponOQlmV&ohn@`FFlMro7~SV@#FWj8{2+WG-Pg7COC1olazftZcbEJjPDUUf?@bqtA5IUJhuos9xXaQ7KWCcJ;*ikc z;c~ug?-D%t^l;WX-xg*GGuj$R1;Y6!7VF7!)(Q=Lmm^wmO)Xy)OM*yvBwSfVg)b)q z$vjtOcMLZWcg5?6L!RBAeV^dLNeXCnbH4=|q{mC^+2eH2Sv*)#S{TE375-HwCM~cG zEGr>!=q1@gVo~4yAlZQzM^sLZsB*NT40YlxqiKF5t+J;(-B&CyN#LDm^kRTu`#3hzTLIY=N}ha+S7+aa7v84zyi z8lKLkw^~^ttFw@ZWe3X8EADJaF++Jm(ZC;p7N%Pk1(3W&~3~ zAVK&m@`G-pwC__wa22EP{oZ#dAdnz1$B6Xc%U^oRt(4g(?ekwGJ>YNp50fEWp@iV) zJj;?kbP4^C4G7c`=qc#G|A##YgzZumTS~aVV3RVP2rP%>6eAZprTzI~W-+m#>JwHF z6cPl)48fh0w^NK>cxlt5oP7|om9op6emW}%h>1WlfsKFTh7M%}eRBb=BSU5kjYqt# z#0g7D5qdef*G-1-+seMf;NL&qW*G-^eA*-U*vCOp+6c$BSs@&F-9G4K2mAIcCsXj> zfP;98z)w<|aKN4)$5rN0k<=&hl8D4ErR5ntRP*9(nGIyt{pyeqYA-xV#jKIU4mTBz zv;1UjFT|LE_t<#dUQTm{#)-mtZH>9eGsY8~v%T4hio#@i&|Wv=6|r4k5vV=X*#y3T z@4=}k@G3amwZH(+dxT%@!YA^vd;*wFiW^u@Mo9<~h`?P6qgmr{-Y#s^Q-7#pZEnlf z3+f14PHO@UaL9^R%9&lyWBKlmOL0>|u-MS}V!5+>whOnDdAYlD#yT22`LnH$qNBjQ zB_W5#CqGUCz`zyd$)#w0oO;0rAMN#h&%;udgK0m&b#aFxSox=$- zm@5$Uwkkfn^V6SlKLKO?-pr&A@V7P%2bdT*7%G2D5QC5$9VZ2bCgGL`I1yFMUgTxx z>ir)V*CA2Z^6bZk3Sz(qdmBLqIH`f;qjp|+>*s&^Fa3`1rMz0(6g7-RVn^M#Xz=F1 zduKn-e;)jv2eEv<(7$}m@j0Skor(QL1TyK`(HlszQ&U^Fp98e@EN?VVP`HOmx!>l%Yoca z{q66$SHAX9oO=+sH&18ox;*B6FqWGw5FSs~3sMRB*_5zL5?N(9BNxyb8=3&*G$W7^ z_BFpUQ`DkBg?n*;%pCS@uJzorGjCgtpu<`g3<2y8KseGsw{0_g$5PH9dtdW;If zBTg}58qj4HI(2%{MYk}>e#p!z>c9UV`iLfF*EO}opve!pKFg0UJw&H74ayWG*dxs; zMx2k6kRZ%3qJBW9^ixlLnPrT=_O*Z9DhRA%l%16ALHJ4ANZA$y@`DFiL0JB~fA{wu zUEtpK!V_G*RzH+!#9f05Ci*CL_X7TsCo1a* zjiZt%z}GDwSdk^HtzgS1iYw+#`Jn<=8Qd$A@Ny5eDn6b%tgwl4(iU+>3jzk52;40^ z32+m!o#mM;>P>e?s}&(QBiwZ~7L7Y0maJfBdFt|e3%u26Wz1GN!b@!o4n=iJX?yRj zO&{{kt6|q%X9HeCW!&s-pYlmw3YC| z&I;HZjN92t6~i=Ed{b%Y_Ho7|7MfRi&9Ld<{RWeq-0+o6%#!dkZL_tP zG;=V@DyFNmR`K<@JB6ctN{@E!OyJB;H_N5v1z6h%KU0p-i_;B1C9-o0Y*T~~IKgf6 zz-j%_Uw$e_w%_)`@C=^NNO)M}Be~M^yD=2alF`+KuL?$e_CPLx;XEQmhbx>=rWL_S z2?)j2qlSQ)jnwKhK1P{dn|+gq#e+=z33o(o&IHnTa4%QILgd|^Z3zu`O>ohnYB|u# zm64(68dz-~w5)0x0TOJfLv!JXP0DmBGslPofyw)n5MKV__rGrs!uP)S!V8&VWC?*L z<)`RDAV>K87oTYBoLWP0iV@kt6&jT(A5b}Pe$hp~^DPB*-~Y&9LEYd@0|ZOiq^zIPV=e6^n(%=}9^hrsJLI_;h(XZ8KSyH{Pjs1Eo2PF{3atl#|6Q>{W)ia;}W8CLrJB0<=3vItL8YHdOm07}G{!b5+xGjXh0Wn1XgB{ zRVZqKIwUtai)hfgY-o~jcx<_QEhjs$sEdkI+&}S5x12kt;Q+^R3*TMtHd;69}RW(O#O`Qtv22-iqISpwX?14Vcr85NH@U&8zR;M&H% z+J%TEL4dioX>x_kGjdT>Vpq8Zp8&Q2HJp)jA!E{nf3#g>$RQv1H8Y4H5zZ`IYCIqR zI$SNB8!^ZTR0@XoB)m1_4>w2SA4G@N7Rkk*!B!_?3IOM7;q)CFQ2RUc0$fK^0l2mj z9obe8e)(rq5GWxq!|3H7egBO&e%}Ov&u({8{x&@bUok;2Mfd_;2<}%#LjWxZln@@d z%t7@)xqO)=h(60jCBZJ``ua7fA!2zkTDy8!x_i^F>mF#z`IskpmEW{^m_KU4D_Y;O2`*@Yb@x(2|1}ap3#x z%M3S@xOq(I1dVMh-1U<1ju7}wxEnV!MQI;z|7O-qy4l(fPHyh24&V&?M{x9si!aIf zeR$>=seB9g`7htk8z5;2F_eq69_RJ2&t;D^5kn{Pyh!Actm4|N_?05;>8gVqVrJ2# z#*-UF@b3NYH;`BiL>*psqA?<6&Idedz_EsWol#xUL}ryB%<$BanDj~WqwLFIwIDqE zEmUh9MD2C&mJ7x2FYt3DrG`ouB7^|37Mx+NHz5<4R_H~l87|4^o<5@ucdjg%1?2{& zCQTNnqv?rd>kjpY| z{S08O4Ub^viUhvxn9KkV9Wmqphv0DG7RQVqrS{4g34F`3$_LS9!cmwl55OoMJK2F8 zt--|*7n{qFY}lQE>G?M-)x^;0-h8`e9Odfk2l^<-<|h_IiD`s?0YMjRQr@qsgzMX& z?aj|{V(geBtml21SROOHB+vIe|5c^S+^gsR{QT!X+N;KygK#Dv3fx=P@Hp{_bi7+4 zsb(at^Scjm+ZBMRDb(+0#4w=K;uHCbtYd|hMN}yf(|Fc4)mg6Bp!Lcc0`pK8wlbim z%auvM#HZ|R40G?B#RRbTEaQSU1UWqjOj44QBb@RimQPo$Z+L7^GuM*asR%paXv#Gi zkuumh{A`c+7C}YgB2$;#2Z3ouv>-f2V>I~zi>$g$8vCTtg7CHM zgYb_t#fZjgx+h3*enKJSX9yFg9@stzSIrNU|N8I#(d3f}>41WY+|E!^JR?USDiMM4 z1m)%um?RStQV97?Zh%pAuzvw8zfJu@enR3v{o(l=`{W!aav9mc^UP6_AHh#3VeE6X zb&y)`h{e1yGt0?ggAIP0p)VRwfZFX}$PG!O;e&feC4g~OHf{mL3G=3bupB>pY z923aNz$HJ~qn+BWWqG&4wn7M=f&!ee*?C_$p15Okl^3c8tvF)NwKWaELq7J7od@?v zv-^R`Kr#A;;X-FR5uxZw#z}40iM0mKyiY4f2(tDzld(N((c(f)3}eVubOxBOeS^Ml}ZKFvVy< zVa&b_(P2s%n?44W9$`jrPZI+G9o{!M6HypzbLa4WpS6tnfl@T29et^w&Ne8;9g7Ft z!{1Icfxr^^E0QD!MUxlgj#py94Wg1SI99)cRziA}Daf~}z*`1%?pZxau8x;2(-^A5 z*-()HhFT{H4+khS*vRm6U5^_}UMoJ7px>PL%JDT7x%S0iWbUesAyCadR+q)Eb7+As^bV84C|d<5`Xn$Fkxk zFzebCkl_|;-QRSEJUz{*M6em~hFqwOAe8% zxFb~@7c3fGW4+WCX?q{QZ|MQZ2gnyxu5z^9aygu1lqLjP60-d=g8BtHf=52@F?vZL ze49lSNkk%#X!JCJ0Uzw2%*~9PD!=r%AUb1a427pZxv6$G^bAAG2OJHd6nGG(%bYsL zsI6kuW*D^|gzvi%0;?D~!|3aLg@5hKlo0Gue)98fgus`&f6sr+eGneLbeTrti*z9< zm-x!R=zhqw9QWV{Gtb7CUVYy$2Us8v+*<3Azy2DD6=}{U zMo+qmk;|O^a zs-Y0OVcWw^asltP0AV2_DFJuk%2Qxq*(C-!7aRe@+3X>+lfoJ0$FWbYpPa}~_TdC6 zG;H{BOEToHog}~BX0u*Dc6SKP*3>p{n>KHF<|AFl)r8mdB!Wkq%{=RMV{ID2#=E|E z?3+bS$O|Bkv_N=VdGJueW6cI{mBTKu4qwkC4vdGGTJUt!F<{7N`T7S<5Nw6p7`-(i zxuX&uT|vzUCgWvaW1v_to+e2cZ@L*yZG3KXW}jWjpQW3@MZJmHsZ9Ix-Yf6+8G*LC zqNRP7vaFb;cvhD=imC1WCA5sG^kdCc$F;_FVQI$`O{1n>OSsI&_fA7 zPv++US-4|wMyF93YcHH5>42&P=)ed$3|B>FARoBN6b`Xu>%Jnupe0|!*Y%Mv3)fS0 zC*g`tuzZ&8h878TJN|Iz7|Am>n!+%5tCw!)KVh(QAv}^B;RxhxC12N)skS%ICd+48 zWJ2@I=Wkmzl{-im%o`@pPUu_aPc>;TBNbqJ(&;k2&eO$e{Op9!`vvh;S``R735ftQ z%BQ@%mQRI^mZ=j^g^(kd?aVIwYJizT$`435#{C3-HwL-DHMOn^=N6G&iUx@js%26A z{13l&%PrEb!4XuN5a6wO0p}K$yyXZ?HmbIO6cWxA_{WMzp1Us?wiv|hcqSGxgnO7C zWETWXO9+TLKt{3!M-))YLCaN)zUfA3BnUtIAKEgfFMl7Q<=2hUUih{d!dJiY)u$;T zeAyC$i<~Auc+AcKH%hy5`Qnuee$8KUn>0%X4_$D+Q2+hUIoJmQ&dJ?Y8!lLM`0T}t zpSkckY7uP6eB}ajmfQ(}6;2-`J!oypU-%+D2;?cWL)fMKRoawY#K={QUV4ev>X(0L z4?>$_^hHATvjRlSN=roQRMfxWsCDq#2$^hcgm^AE9z_hVvuG7J)063aIl2VufQU zW(dg?l1L<%z&zp5hHpv|23yRcMB1bqPgO#`-z<2RO}b}-lZ_AYGBzHW_wF8E_#EPp zcTw&vuEoe;B)I35b)<})UWwf8co;4TPct4-_zZ56u$G78!O0AWA50jHI4>#rM6!lM zu9UGs1XF0}rYFs`%Dw%oQ2aEEhiIP!^i@J)_1Gmq}gFR%dXzoZNW7 z)eSs6wY4;cU;lqw*}(_rgQ)1P%ruTkLIXQltAvF*4N8Nz8t$v zTMAbkGxSM-cgKl3e`*qE>1sl#T0tp99zz`T8%l2cn0LPtqa^(bNhOBd90Dj0G~%dZ z{9kb?x#5mhB584`ZiO^H6xVtyjn26$)v$jdzc6dab_fxo4Di=5DoF_EM*e}=f&IEi z9zPZ^cq>PQIKmk6&bw_T)LNrxqp=v2E(sVeTO{sL!0+z2QowQl#MJhP$a@Jd+1EQq z=J34_M~H2o#(LrCX4Jf*@VQn4^N%j~x*k!Ihjloi+DOe29*LfKsv#=)dL2{bApiBnse zuil~nflDGWGG}OV_ZK@Xf66v$n-=2VsboP(&QN|x&m%*Aerk|gU;|#Bc|p&~1&TYH zC>&QyKMWd5C9%@DE(Y$ozos>L2~&hd+9m9)y?J2Z02^Wlqfy*eUI) zFF(mTr}iLxffnV*KL6O`e78UBR>~F;NDeOBH^7Jf#S6?9`pg9~g6{jDJ<~p76(cU< zjNF08I!6AQ{DPFjRg5mNmooXsBmTFxJqQR*%2~yT3IgI3qZeLyiJZnB1f*6ueLxAq z-%Eb*A19~(Maxv-7oTW~(dHxnySJOwmkVMNN;FoPk)HFj5U;_nZqn4ya}xs1BYu|p z!hTyc$}sF)LIDx>^=zt zgVs4Kw4QW9&i$>KvO{sR2;lKSmRvPOK(voAiObtg)SHCDS~vkL_`cD!&mrL^46#ip z+S;mchK~|qS?BYl35EjjB1t$5A>o6BA`5bOG4=^XH^Dah_26a`2qKP()CG~`z(cj1 zk*l>pXa16-s9uPPgO%|79SatZi_mZj=hdu{S}|!aoI?*zi5$zf)Rd7wZryfQ1msu0 z`uWfQg5y{3_KgXiG1Hmw7hF|uNJvQ(k#j!agyMstRW9d{Ctj-}WmNi`et;4y&%&e#@w)j%2Y^X?hPE&R z-XxgkCpJP{wU#F^k;g*3OQ~RZcHzH=H;=GqGuM+LPqjFro{slw7o1q$-}4F4v*u&r zA&jR^0cG|Pk#SpEbwPCHo^08i4Nj{v#)#a&;sQ6VPK``<8Fn?ZHQUN|W;Ef`Q^uuS zceHHrQ@9xbA^9e4z^wv;gZ%Uq-Kq(u1=_v9Ro)37N@BTFJ4FPqm^~jErnX>%vYZJ> zc?wanX&`frtS_MCR1h-7=+FM_m%nry1bPt658lWsM*L--4g_ZyeT9wEoMFTY zqi&_lR3E#BX&z>qG6i*07o zXD?mkU%GsmEP=e^5&s(xKmJ%&F>)V-&%2h=Q&cp*LIvTg-$q!*=ml0Wq6L9{5K=)P zL1-0(2hgOvey?Q({~vE>^jp_;-D%sQB*{|KOzot0=B)vyMPF(elpJB;Vumq?WYGbE z-r=-udfi58-u#eE0b(5RmW@L>v^udTK>}Ecflia;!A>C=xU|EVW|Ap`Ac)hroxfnVm)0l5}}%&PjfkEW$*W)}$S|WEW|j*`9PvMqwktL0L+EQ?UUZqxI{^I_`o6 z7#@#V#X@0qN354E-FA1okRZo&Gbb$$M}to{MwqF8fXk9!aN>uC3(@5MHZm%u)7E?B zDx)*k!z%UQI?AZ+vSJ_-qK>zt1fW)fhisC@Rl<4+i z(8%!TB~=HV*}OtWzZ2JhM^7b#YHq~IpJ~k(J_E|^l{t9#`Zj08!=1!}YFoacFZ>2O zj{bMIhp4xqsEslc1`H)s{+HQbRBzE)BW2H~08{{=Qyzf}hZ~SaSz+Pp?N%h=4*7^X zSpr>c*+^-EGIa%dMXyXLM1u}R)ww!FeADQ*v`Tcn0eEj<{PX8_En1cl7qmZg8hE>*m2As+SR?kd5fTJI*7%+HzH3iT7 z2HqMfJOqEQ}d9S`t1b9WnySdb^$j2j=) zwix|`0Rmstt&{SL?lEGwj`2Z?l=(xwrx;PD+;$kzDNSLA(S`G8FL02Nn~TnzwyhZ- z_zU-*TCl5uXBXA?f0`o9i5`zZZSeyNH&qB!Dbs}6Jw~2$O5{O{1ww=iIaDcm@&B6XTkq@3K* z1{|^ze(Asc=I?**3!nPJUwrPjey@W&#q0Ojg5bt=O^SN~GKZT0uwYs4s^G`V#E-Yo z%q_4?cfyS(YLT}~zU6Au2L04OQ`JmZ0BzDN%NKwx-GFBc$xQvTl@7`_$R#m?voe{= zhr$-pP+5^{VV(F&E%xk?W5Un@hu=80tVom+$jTu4hJM93zfx1b?fgB3W$+Y@=oEgx}l z09W1V@GS3SX_bOn>&@Xs)=)l%uP5dCQh$1nCQ(}fz z<&4=cYIadU@XKA4LD6%+XxX*m1c#<`7N(cOofsu$ygUpAhMuy#OJx*D@p7Mgu>$)1 z<#1GKKtti)8L<%jHI<}~oANCT7tMiG4+gGU%@h=dV>xx9!i)pDc;JQ$Q%Rk)8eWTQ zmXcXJwi|E$u;mhvS+TNfY!|1#3>|;{+%#uW*iwJ&x>0XQGq%i$3N~86;Ly9F8qT7@ z49RHCPBM1h!DC_v0q^-20LB z4(~^}BzFYfscUc-=5Xkpws6WrT>7MViJa4pO6s(^49THffaS7=Kc^lU6r`M)dEZ9Q zho%lvqmXiC9&ww|s(Xi8EB#d#;{_rKT-cm+ZQ1g^@dEr{amk#55rKn8Skg5?7vVrG z*K9uuZxso9aLb*sx*$PPJBjwPD9bESbd-c2FMB=R5Ma3?hrSz=$({=KU7(GceajRV zlL5@#(32&ap+cQ~+UJtHBIuOn zAx2NL70P2ysZxINYk&K<-%JgHr<@WXyw?oE!D~Nj@j)GLy1w()KPHLr$a@M9QbAls zrp$uuLQ>D?yKC%cpZKjm{_`iF{NyK}{N$6!CqMnE-&`^AAWxE^%P=GYXg3nh9h-phk{-|)kfagNm1d|n9F-Y~SzHYYXDO*DLAd5J zsv}kr)=pg+wUhOZ(At4|ZA~cP)+A)M(@2k5b`8`vO5n4_^`tVsVRTSm`Kl!e8p_9l zS<+dz%8J$%GjxoB9dEGW+^K!nyW5)dW^XXFl*74L2u{_GSHRHcQOlUGb`IB`(c-aO zoK)D7Cr@jeLKx}E`Ei>*nD--h-j7+cEy%~hD^XBu zMBe$!)e~9C-Emz@-kltlK_H--JObH*IBldxI)T{Xz#jT|Ji^E*z^9j5QNfb3!nghs z>S3!uSZxK&$}%=Wlz_mST{X=6)+DRbc0WPF9+Ml0e2N*afu6NHFg5Psfv9z0>d9nz z7)tbmgG;)SP3WN{658pfX`AL6DNm$$G(9SE0)jhpz4C+_U1Fed85RR>NO2LptPZ*mSR8w z6HB;7iSVFloN~%Jr*1K_S@W3-=Sf%?9kdJr@d1YzeFSlfk&O`SgJ6xaJB(6;@QSAx zeV-JB#@$~Ag5`;30}i}w;BlH-R~%#!nqgAm){mU@ zN8ad11}Zf<=dLErt|8ImjS_>wU5(XZ4r76#$E$DE+&j?7yR4b7xT2%a71tr}e8S>N zkC&q)Awo5FE9uoYG*n!tQmx#W@SdlJdijfU%l%oKEk4lMaTR$&2B17@MH5B~ndNa% zO-v-=(D*i-Me7?0GrDxaH=O?tu0fyxzr*23-y)!JMIkPTYRur0sDYn<_eZma3G=Pc z?1DDvm{#(a&*lB;eoaQ(0@|AAk6B15fXv8FVScS!?6u2;sIic2V9~XnfPf$64C`bT zn0D7&Dpw!#l*>Jpa2*OftGw;~l#k+>Ymy09at2-T79Wh{?%NcukcLgX;IhKgTx>SN z3U9~BdB~CG$_Pu}+6vg-2|4d!v!xZRSnzp$Jh_PqSKx{~;&Vs6bVKLui;m(Y!;C>> zdA>0wTxF5eKz=~FAdN2%NEwh>SlmBI8yooI!Rj8x z$IIFW2YZAD2ibh2Bv!DU!X7HOOG^sC{aQyyfuj;hxbS#o2v{$}OCpVz{=P~=gGa72GCI7tOOnxjm^QOpN~ zKV^I%PsstE^igXy2MkO(6sv7A!r>O9A5)~v*R+igY^40+i(jJ=0(}tNVq~YZhd%ny z!yiEi5q|9fOO)woOrx|5ZHp0Y3T$U~iof=gMOZl9b_$)cQ`)`#?|;ga-x(m#`k=)R zi6xYK@ttCa(E?kH3=YnnImbUupEOP}a)XhL5Qq;vZIuAwA&QjKNx3yj>xz_LG=tz4 zBT5k7b0_7EUv%+7Uk+}^{j)14KIXK7gX^Vw8zMx>AM-KP^H+Q4NB-=|ffyrv=J&^q zJM~2$*YWbM_+$%{rSH?&<_c$U>#J;nG$jc3cEg5G7~9PcVJLW+ur#+Bi2UC`Dwi-G z6h>?K7p~&|UzWdvbuq+PZi~>3^m&lmv4LUs+!>B{G}cT9X>>$2tM02!S+CLr&2_x0 zO0P;8zFxf^7{~B+xw;X77zvkZRQ=!{xHLhV^9OViuY;}tw49_jI>BHBnY89KjJQAJOxR-y4i z=-kCcOz5iV+NQ$#?HjG_vqX?2g8b|72>kCrEl!ZX{`cSGDAf6_L~7}j#u)4`+8Dkc zbxqxP)V&|K>isCMf-le*!Mj_PUA05AU+1jK7%`5MQMZhS-qPySqxCY|JF#)+;u_3& z!#6A63U>vhDnY&pXST#R+c%jJ)3BRH1e=5kz92i!tc|GlzxU&EUXM$DviE0246FND z`pqt*3&NKV?Z9k4K~DF4JaDHa&M`WaQ@)(M0OuRE7{StId*;&&AHJ;MN0+v8W(+tB z4`o_(X32%c#7sGI!UT-PG)74KHIOd096|L+xPFOJF+taq8HY=sYnVsKhd(1<^;#7j zFqq}(gAlW;Y|fPm=PG3Ol4p5MCl5T~QoMwO0ahxPFP4*$FMmswc_bYX3;>86$Px5Z zuGi}PqSxj-DbpyeWe|SjoAg1TO1T|#+KLc}57=V#P%;P>Df=gUql>YP`2- z!3f}Ue>{^v)1GWIDxr|Yuz(w8kPxogQVD1Y2as)a!vjMIgvlp z|OsK9I0nUZzp>v zy#U`FB+%a}@PVvfZ>0!7G!}>$A$;yrGx>tif@7XLbL&s+5bkOc;#NY8F1>&P^05R6 z@>D--dhtjeX7TPcB#WHu&3Ih;Qg&_siPA(jX6K1^+y}kdFJEr<*4MK}>1>wbXyIN? zQIxDV+{t4FzgmAPCV@ zT5J4V+ouC`SfYa$JQWx46zZyi)=A!Z4g=s0$YselxC6g0~8_H2*DBr z=d&p^v4<2OSQ;s=(=4m@AyTynG4i+gBAGpWpAHM%yk2xg_Q2z0e zA^K^H99B*sFTF$rutSh={rdm9{u1E;@*K)nSibTc-mmP)i5|G%EZzhSn}3$FgFA-^ zpZOi0aW~TS6gZ=`ngbN#f$NNRaw(ie>3EEeqcYbD-OgIl@k9cD@}y!dMDcA>1F|;K zHzCCE!8jq6$~*?aL{A)`OGm^JvE*;l=>+ z{AY&&b=u5-gDZ08&CTplN(~?DCeC&F$_g`y_oH#ETgZ(jKvlAF3B9{>N?()`^^)eF=NcPQjl^fah6i*>vt6u)R(?miN5^% zl_dz*t+##nGsA)2T1rFFb<6J@7RW0i7{LC%qudHgX0h&$_gb!r^x^8N9ByEgsOGa? zgH_yBEvq~0cP*}2C!Us{DeFKILqx5)L|Af1K0GvOSojQy|2usiHHFR?UH|7mA7$u3 zSb_4FdxsoVbl~h=@j?InIOW}DE!oyF??=`=AhNG5HQP3>11n?zhxpwpV$&baxqveA`_!8P7=Ta}jQ5)Y! z{Y2v=8us?nX4yJsW#7!e3b6v@vAw0`$K)+8P=NBo#}*H)J~n|sL30X|7sFNe;RXpY zODas*HzGJL41lu^yglu<>mW!7w^q6FO#K+49}Z|RyB;IqcON7e2Rs_TZIXL_J?%6i z4dQ|{Mr*9;3>^{>6woBvV|5X3`-=1mn0+SF* z9v?*B9`-$WtAUjh2=Ty6*IyzKP+W)%n7kzj6yDV5+B2CJ z{TMn%KJ%Y_e#eO7g_n##%sRYaM#7u~ckO1n&czC6VSt=c```>fmDk)gSlE`z0Xqx= zgvh5`SYoC?-WoM;r-qrQki-~rG=c~oL2taZS=f3m9oOiQ#xbmB56mc}al($p%R7k+ z;9WpbpY}Z0Pd51D={z5X6yZay&N!Ot6%@x0H*WB;v2g?-2?Z2)$;ziZ;ucx!^;qEc zd>*$lysfLP0|OqcD%Bg0cGWaSy(&F)?r8He?TQjy2H`uMibmOSF zGUs6~IS7&KV3vojVL^OK0$Sq+2^eeDNL2l(CE7Pzc^^KYd`+io{qJTZvAUi<2{cB4 z>t&kWc%!5Ogopvc@ltU`1rFsw_cmhCY1EKxgF~#UxW-e$gC%9lZ_T@_&>^Tw9|AP9 zsJX-#$}wcVbU9%|oK3BBjGA6jMuiRViV4bFc1Sf~7;;g#P>!=-kO0(yU^P_1LZ-ly zLM1mV9tii_AD+0N0iROY=FgzUI~EWCGqzS z&G%D!JrsIAbj{)k3#!$E9!xFtmP62+$Fl7x4r7Qn-}s+@of3p3rZpfR!q3&VLM`p5J2B* zl_5mrOh;WcLUEs0%j9XMXyJKuiHl%C@1fn+4h%1}_xB-Y7(TIbu*|x*8s7FEk#*Ro zQeg=>T$C>_QJ8Rea7fNzKU9eAldjuQ4nJqA=0Ol0ai-?E`Ek>%DBk834+dn{F;j7vVLMuXezHKpj#w|vs z5I*wjTn|3*zyr2YP6@&XsZzE?nfu(ih12#e@Gt*%K(J2Po@f2<|9hO~#T`agCKyAY z@B{lWBMS(@fsK^U-hcWGn~d5KMkElB4-p?A?l2;OK!EU3`XIQ)h#CYsDRTxB83g+v z z-)EflI5BiPsp>WoK#yotVT4mM5ixoh1l+iMOe|B`VJ%5n1rdaN(iAlP3eYK01JqDs zvJFcCbohijp@ke>ed%3%@$Q z?`VA^n}4`9;Z=a=x48-qxE3phrbHQgm7zcXR>?cKGT?ZMM=1)5l>)t^IyXtpiORhd zmY=K{ESPafcrZ&a;ABm1fqQ+modgKb#eYuf^j5xOfM5pUn81J=>Av-yJAX4k<*oBk z{Rs|@WDYc0L{6wWxKWGu!vcLS>^sse(_o2)p4kyST7Sx_baW^c1~@7zPziG|71zpA zfrJvh%xGow!LUqW09>LBc_y#u)$$ozU!Qx65Z5d>xf6+`pM&nIanSs3ricm?cc$_< zl0|S$nDDY*J#rkiPY4O;im9R2g$mA%VrXhqXwV#j5_s$q`3XXUV}0u1@m6=__$1XR zxa7j{Ss^nnCYX9WH{PT$p;xGk#!Y?lWMXs5$;Ng&(_z;tW!5d;j|K$2_anUJR!t$K zoh8tFocALH*>Hm9C5c|Vnx`rHI;AB1c#+?&itOYFtT)Eotvray;ko>ClUxt*|+H*Q+#mM_ag&23QwW{?gUR9(6|6zf=lES zIa~^_hlG|g7hetc7gQ!l2u($YqqBd?ILi%fPaGh;RMSujeWgtGPd)js%70(Ko_GLx zff+42UWl&dWx~K&978TkMTDUQZWdiTttvt@9O&)T%OEH+rvwW;l1|RiMQDu!7}egP zo>eMVz>W?_ShtIJ=?E9@9WL__h7h>n+uLmm6ArX(pV*S4Z|luQr34Jz2>e-j>ZGSz z1KHKz8Sms9@V*I;V~SBcjTMw|_bKJS)5fRF{xih@eQAX2dp=crD63r6%XjHm4Lj$?m!5-YWSxlHWt`dF(dg0CEGYFLx7)n17P)aG&+f7GE5(ZHO zOyNcY8bdJ14<>+g!+ z9P;v+Yv}PV50NKwUXmOyMxSd}%+MB1cmb0R14$mDA3j7)5+WRz$%JT)8yKKCoE;_A zbd9NOHC%O^s)0q~3d|}!aD*E-@OU`JKy(dSHP=)QtyC??EZ#W+lQ_U)#n$1hcsA0v zEMM*wCJ-M~iPmIm{A@C>7#1vd0mC#Ygx%I>h6%6P0y(qqH^(?U-I$%DCj0t;gUIpDIK#h{@o zmC^YHg!R?L2*>9RhWLrWW7Y30>HxTKdnHD2(plBYsNom&w0Z-iRU#8b7%<>PT*4(6 zm2^^ei_t6Je}(>Hzu_^boMQC+S6c=Fu}GO>VEYfEs0{!oQv_S@e*nwEW00M)Ru)-7q&2EjH6AN&6IDN?Q)gpS{of|g{MI0KYCwx!n_2`_0(C9t#-`TKKrQbimZ8Dk)KOs=*^m#3`i zOQ2xZp5Owf4H{;hhqhp98oSYwh=^+)z08?9iep%-p!n%us(01_*DF_b4QGO5g|Eps z*X3%Ej+<5Yc-56w`#=Jr`(Jhw&SJR&d=viCEkEXm83bJk1i~|wH-!h~<|_W9uJk~! zGgAkWQQ$7#q@GfM#Z@BFiqD;~nnjsw!4|{e9Dhmi$glvq=F)m;1+T0X9S8>n3UkIu z<@JH8#(gu2qp#==*O=R$6jw?cW?p7TaXr<;Eli2Or1;$yMAwo?fXh`wO;E^tcxF<+ z0zw(KZ!SwaVFMF73#*(NlMrIKJITj-ha43j)+m=_2oe}5-%*R6wRo)J#0}ql^Z!!5 zto)Bui?t+c{t~h~D^Q+nW48AbVZdag-d}im@nGlu1)P#w?K-EaOwigZ4z8xJxJrcs z;gw_^))VN=D7&~rpyFLbRW^DDPYqVMwj2{Z*;5TBG(b2SSBYxr!Zo!D3HruLB7OFazM6=j6-DD%-N&_m zh$&yP)j|skmQT3Uqf9oQz}fH=Xv%!>!`{l@nW%_op}fLo#f-`l&k zmu?C!2YmknEnT>@x2T)wfZzaVl7aj3wRTLB+)YN2OZ?1m!I0ou^;s^_AAW7|((Qx? za#IOr5N3OgKA!FbO;EW@)XVWM%9Nk#6Yt_i18yU7Vg#x&+uR^g08fRdin*&uASPf& zg`+SKZTcY0`lP*L4FUlIebQe1>hoXy@|S6YKqG{wTbs0pNFbzB8VQ77{ZQHe7RVtG9FUecMfo%NgL9r@ zWMQ-c0-cl*!vkv&IOcS=#prpY1qgOZYlj#iC-0>ER?3sFpdMU%>u0fkF@ttf)?WU% z3lM&9?);)J{13x7Vh$*9EvC1t!&4qZkD#dTq;B|>l^lF*Nq8Lpa9qS4DB z45gxg;WFgU_P8rUZ#hyLfoQt>h{9?{mv)d(RLo4+Z-HPzj!dvDaoEX*q#e&%#fdgy zmYaM)HRX_O0>Cqtm=R{Y(bbNvla?PR@@a(!stFUKxiwdH*IRSy1$V~PIMD#m47|Yr z_wEL|#SvZcp4EQ4#jzQ=)9bk}dV9-&m-_@V>aP_B|L z2(@9T*nGG!;3(={NkMV$D6P#xMHfjfM9Yb)P`#=MP)GG{Lx+|MkD|9ZXT=5@#tF@< zl~GqS5&bD)J|?-);(+i$3x?{KR(A&ONX*yUaZpI~KQHghsEAe;544U5BJziq3=VO8b9RnU0qv8T)WIkl@j#<)$2e@3TeX~+# z<~fd~U1uN3^Q5NtpoaPDgP@>{TBC4fs!{a`2urv#u2dzUvtr8i=u^4%#`k_`fBXqs zE|L5#!}k~Ot8EPTU_Q$$Xkul8Y&?eN{k1(Ngs}So+`X4Z7gKrOUj`6zX82Wjzr!+G z47u-zVP;{YUNv%tinGHBURLoqisNSq7c1gXI9FWtdmJvsXCja3C`owW^Rbg2P>#Gc zVNykvM41%YOUM_$4gN#oL$VWDUG7%URToDlXx9 zjQqmm)zZvEjiNDoY37d1_*3;ng%`EzFRlCr1;Z^!j}iuM#0Nu?FG(v-jVB_6()O zc0yQa0m3~WFi7|SbMO0qSfkvUBUq-8*-b|L>R!(<;*3-G7cI0JWzR5TixEZ21_&Qa zC*=q1gYaSFgNH~UJo7~(gy)k%FoEz*69}(xiqVfxdd%t7e@X=KxW>`J>c`C(==kYd zul?e!Y&xQq@`?H&3=0kJLi`Rd`Sc(3BY@xOp-=u*KZ5{N%C0D(I9Id^3KA_axaF+< zltC>KcrSx65cvBdJ40ixpByVzf{1b^+tAeQG?gIVK!G%0{g~a!Os*CxAlun`1ZQXy zg`n5wBNsrT27iRw4+-RbkrsbG*y%omA)BJ5!?T=q+7k6CiZ(8AZ|{a` zsv080Kf^gn1}6s&QVE#{NY{YZ+UF|8N2NA**Py5#hQ|o^fe7whtCfGqHLO7p++D%) z*S}sFg??h8xF##EIxE!}pxcJT%)l((+%dHhI^YV7${bZEl7$Bq`7I$*O9{jng3&oN zl4lUsT}zY%4~j~Q2((oruD#=u%JF(=wOm%}x%s|o6*t7ls!uK9fNoSS6h`xQSEOe$ zN4XhQ(U3G5@PSmIaJM;wW1@6lQbqpUl`D_Gx_C6+ZN2lEeCbW5toFmlW?Lrm ztPNtw;Tk;bCPwi6g$dul9>YnErYS<>?fs>143}Dg0E07tG>5^~$g!vPwl4{12gbAxKmi?uDTd%=ZYU|-0OT7Gnz31`z)m6~hvh@~5|Eog0Dvz%r>3&sNF~TV3o71@0OUX$zsKZzxDbmR zDyxvwl86Bom*I;TP2fW18Vd#@*WqkvkmXu-8Nv2gyC!P+=w~HTV8rNkPSc^cr3td) z$K|A|Ysh8%gLTBI{>=EYL`RGOP-am>WfR)K-6{~|0&@#2)*w`XK#j6njJ`$@0y~Vp zOag(w&b!5k1Ofqqjg;-A>{g!-(w2a~>z}><0?o|MkU*fQm|n_uLtfyh(o^@524ga{uvW1Mj6EdMqo(C5#YtuQ_?gU})bx;k5={E&Up=!5X3 zq!1{bpu(C6ff@vh5dPuBTZ|GP{QT8&tpCEIgOYSdcCgn&QxNBO!)qX z!M%6v`5exWOvpf_dmCwk)HUczw1ADz1cH?d;jPm%D$ceiDfJB-6Bhq7l=)ws0mMYE zX4&(2Zs!os=;bnEFaj8FPkWqOK83r=(`?8vAq5NJyAvqag#QOOkm;oHsoDILLmLA4 z1jd-jYCvbLgb1$mYK})oKxCa8)BodQa3O`mtB3QbQ{o%c;`lR z6%X0^u7SXy2H|c(1U}fm{`r6Y=l_TN^XI?bWdUw|Ucv6Z-FZyLP<4t?yh;(`uJl0f z_bQPAk6unjkV{mdd?@mqtJ>%Kl&W`*7PWXK7zB#T@m-10r$McB3J$5Ft@O7Y1-Em;y8goS|U2 zFv(Sv{64aErIS}LAFT5RoNVyI-0*bj4f3+Plj-&b_hfhSEViBS;k=rfe|LMAM1oPk zWZXFKFUGWSa|kU=7`OdLIPiNe!>%u`iE7I>$Te{CI)mX`pIS+^Yt&%v6*Hd3M+~g7 ze765F91oE~wMGkfz?pM*xdN6sjxWvzvLJF-rFbo=E0~ufof(M$juI9$C3?5Nh}mIS zV8L=Y4{%oqpynfSlnhMdC;5i2Fkrd5F7N9S&U3C#!t3$k?ck#d7Lr%c#h7u@0!#ac z{N@0K8vv*7K+eMVKII8Z1O~tZIQx-^3rro@dF{Zi36WGeBe*mfeZEI4XYR$uZMc?0 zlG=%?Oqf`3U2q(J_KOgv%RrUOT;Ze_gvjm7a-K(p<4Ha9H6FQr>GEYV4IfVvWhHIV z(kHoF8LlwYaDCiqix!T+o^YVJb*S}D7RXy}07jkw-g+B6irS>(5cx$WIm1K&gP0*z z%UrL`!i2`VMrj^%`icR9$DC4wU6!U3s4uE#Z?Tn)O{%2;H6GI1FJi)@qK}M%OaOz&u5N=u`fk0w{5aIlp^Ql4j zVB2BT0)z)iAP^utH0y)#41Ex2gg|_dPRbukpEM$blLQERv-qG_bFj93z&@iA=~I_} zexf2}YmeWx{82A|@W?x}3m5+|MER_qp_mVte*C$a#?5Hjl}iZ}oRn~t+(A2!e!R*G z2qSQoHOwHqP=_CtTzR!z_37W^@fBy)QYMc+u21Y;yn85$NX}^9Drva#czy+8i8St_ zf%@pHgbe-Iz|_N3J2D~O*hZ{+mgCtbt*+WOEFny=N&Dtc74#HEjc{R?X=4^2Ok41< zeDULa%lk___|3p?ux>QIyS;@1U*|DAq!Dn8ou^|I!v{DQ%UCSGawWVa={-!`FyYb1 z#w=|I(#BQ71-S8ojN#Szc=h7y`0D(w-QL#TxJNv7g}JM{OJsmwmx{L{XL;gEGaT~K zh!Ia7)4G^v%2Vn1vWj1PRJFMB?3)AvgA4+`E)FPrzV?9VfZ(9y^E~Jm_vbqk;k!FK zj2K1_a(vu?e8M}0YZnj5@=KOmrFb*ds3{9qCM8HmjG&_W$|#$L41<`VtZMnD^tUpF z1cf3UFPY~z2dA!9VRDyxNFB3oVcguE=qy8(xzD5451}-=?N2xzx-{xrpb*cnB|dZ-%fl$D4-UHl0-qrlOSMGMexJ5 z1+xWDq~e1|XY1pame;ptCrPxLukIiTUWe{OO6yDgD6S6p79qs0ykvJPZR&k&I+^<3 zn_Qh5JD_sI$0)uq@fjA3yL7<@LirUhJPhb`eJfQ~m9pf?(e9|uN2(Kt!d+7z#f&<~ z(Q&ilh*DB%hK@(^F3CTvn@Ns@uW=h9jFkSyB9&wde8fmVkKGW^j?jauy`+&sg#f6~ zP1uaDs>(~k5x^n5Bqhk){S<+`bW4yE5R@F~&#(NvKk&iBR*Jwt#cVFD1HSw*3b(BTCk3|}H(Lk+=XT>N$Pha3|O%+1a$|#ia_?21LWW=v}t;#7>Nbr>W zDXwsbyxIJWC&7Z^&c+dS?r9k=*694+av+OZ$v<-AhH!g>!+sT$wuje@B=$3 zzcM@K)FNee7||(>tvk=OJ_x^VC*_Ykz#gO4N%@2Am{Tec&awOF%(+v3%CjqIftyas z_CmJQ_}>2a|F8%Fob5+k_c9g;Bo=@)IOcRiTa4Zf2C!!pZFnn_ z2!HtC!=dfJ|KA_|*;|aRk}TZQBoH3z!uKWmSfmLqK3rvcWDWKnd;Gw`|LgEKwd?Mp z>AySj)Zv399S%Hpoqfx2ggJ>jn zAB}#!`EE%F81avW+_&T8Nh3iZN(6a$=hTUK6f!VL$SBy9wGQMICT$sQhQVz|*boZ1 zf^6ZwV~_c*_*#!0zjasHDO3c!*MNZq|HF?wULHGo_^Bhe?uK{3BN$PsFh6?Vidcs{ zvH#YmA3f?n#WQzY1fQNS4}R?#gNL7Z@%a4{5&};Y5ggxlUzLZ)JxBGP<4+xyc0Tp= zolE23b};2Xu7`N*{gyY6dMNA4_c`eIxi|_6HZRV9&BjLaEej#oeaABg4#uDUn|nt0 zA8M27RrY-Ch5Dy|;>bNo2ja<{&D$Z(+x^{OzQuO%?K^r2tfM+m$r@jx|4lwxl3%Jbab07%4avSDgMUC5ss14l^vJ;vp69NQTnsGK3@u zA(>RDhF0T5PNCu{>6l5V5=O9q2FFRZkS7~eOR0g7?9P@F@&ErxmqWBOw<_^GbycTJ zC@QWFArhW&Aq==A8-5t|3sK~ZWl$XXd7%YAf2}y!;t-C?Arx>40kAe62oPF?$oRgs z!(-n_ zG;N#=sgaBm%DD?EG+m~w5)_!xUqk&_4gA2$Q3}Abvw45Lkp*jEz zr@B9~Ac|T5t?86!!zErHeJ%s`kx>$t0`LTrflGl~Vc-U)ieHKyMl@))Xcw9GBftmvs6~S%UC#Y%%%{r<{I?Ek-xrd@~!2K3j{FODp9Y*kZ&fL)S?XC_vb)x z(6|04i_kg5=vq+OgD?bw`~lSB6Pw&zw1tvq-g2uY(3ClRirq{w1a>xkF8Uzcd^1G| zR4LP=fn$v779$%eM;io+l&wMF6r&9kDK7;-cz1Ahd}*Hy;e!v~|8V=Bp?x3y;eY@B zrHv5;S;6U9bcn{BWA^my%;_3%PI)mIz%#fVJj)P{#;&3}R{R5Q9Qwxbqv72dNdb$S zUm%q7=&_+V$y7W`4el>b9n2bsgHIgWA?_Odg|(Y82#GswU;QZqMgyNJx-R+am~!Tx z`bxeqKR9qugxALbss=Tt@*f#=wEPo4xe~b*yeHM{e7C{UH2Q>i9vSsi9EnuAI&aTX z53>jpvHK|5*<+KvDu$2=%?X3P{>0$1O!X*7k38I-mujzu6F5V+AILvC#=)oW69%m{ z&HDmC_7S}O@c;GXlPk|2b3YLe-SKGqk9LO}mi9ZK1o?O3zpD52_?=Ab$iDiY%<0&2 zH0Jq7^Naa?RDPeRbT(yQG7Q^#Z^?hh7W~sA(c$>OoxP1hF)PiV-iIDNb`dNY!Ztf2 zdmq5twfgN=MB=X7?p!sAkww@toLcJ)Wu6STQT(kx<&wvS~z=}v(K@Cc3q3P+MrCD(}1WSISs}D-5@*4P0 zq!)p&$q!QQy?f8#XrvEL)PH|6_y7A*Q=B08yxT4v>`A0(g-ci8;rzLf(<@Wo~QY|ePMh`aAg0`bHOJH?lOM_ zoSeY8J?vTGgCpXXo~yWv{*qrnEMa~QQ<8v^5Ii>k&Ql-^7U!5l?)R@Jm<|)dxIA>p z$^eGT{E9D$JH*-l10MT~7F7h62Ux~4u$L1r7_Z|Oe+;$=5%6}6Z@ICXjCfd_<_Va- z*aJ|J#D@jy04Jvqcwq!^i6!#~0}h!1e&GO1;8rG^DGp{{nnBckDab{Sr_)-e`BhiNFzp6XZ%C(x9Cp%*a@tSQHro zHS@DhiUr34%uewnCX+)P&&@=P(jXbsOR|6|&ItTLar|--=xs6j8Nv_mlpy^0l~>6i zP=nwpM$`avj1gOmtO~yAb2ohsu}In9^KZOShF~`{cNcA8pV75jtU|CIGO2@2x&B9c z_eu0mCdVLZ_5cz=7iF8QF<)2SZwrSQNkL=?D;WeS!sj^Uls*WwLAV8a@EwZ~B7^YC zt3O5{2tWI>eGvYABN>F?2Y>jm16*4AFwQpJ{^3U-{J}@|4sAeAUpPH``t*g_v$L~j zFPuJmVdnJQg}Do7PoJH|oH?sEGdnjotI%>8CNOs@*GLDq6IR+b33ImxsBB+F5G-Rp ztQ7>I$f=9D>gqjsSLG>Zz!|994zMKa$kE&BiXfS|5Kz^wBDT8J{`a z+Qs=wA3Sk#s+JSP%*Zu={v)59x^Hz;xu-{a4HaU(ca87%P(aAeT%PZo#1Gk)j~4$# zITh(xFZxJ5UA30$Wl{4~nYSJ2{;`hS+o@w->#?V|2Nu#2gq_bgr#!ZU2NquF4?g+y z-Z(MIwxtb07(aGUBjxa|Ry(-u$lbk%Ok1q|eIDk&w};3w@FaJ><@o$Poj?6jZPmQL zZtUH6y#G^W0uRO3p-9>%-xwY3zTK{dAav#6Z&ph`V>ncKKuIqM8hMkc<`sSj0OXz4 zit+Y3B@TuHZ%bB;IIImBkGZ= zaR?GIcOuo(8c<C%s%dAuNxAGjk6Vd`U`Rs$ppnDnMst@B!k>1L(k|4doCbhlzlJWpGhm z8#pusj2Rq%d64P@9t1aFTzqK&d;xx8&t-5!3<3jTFcw(#3kFW@0bxa4aZk`956Kz| z9k41vZx17gMD%Bl3S>|O+sB-Bs)(yHl>L|OouK2Thr@^-YPtIFQiH4OxtvZXC<8D+ z#JeU9qD0x*a%60cdcdhO&oC7Syy>KD9|RWDWDve=5yFpNdDT8?6d_Q8!0MZGPDvoJ z$>`>rZ;~N=R(9}N*XuXXMVYacV~jSVHu1y%wOgn%=GsC&;M!*WkK1XK7D2)`On@EW zQGvkDq^%`?zd!b&;vyU%tpp$~>Ws1#!9-JuQ01?BA73l~nuJg1(8Da=9_ zU?x2{bPwy$2jKl#M?#J>3Utvo(j+qAU= zVd8lAgN}GE62*U(Mq4L+#qU#UphLzQf^gTt&i`GW87QTHFo}|RzsIlKk>f)($=**8 z)_S`=l8JQ)!aJ)e!f(6$pyn2eeqQ(2HL-w?BtuYpDWR*IqMLK(9+FPzfS}+45o0PT z2emGc7I+CE70+W)D`SXBt1<@zDOtDNYs3~_I9ZYqbH>6!w_Kn=fn{j5)OchJS_wDs ztZQzdNG(KMTnSV%P$u!Ffm+)(ftfqv<`61Z2onnp#y~SM19Bt%2cfRp4Z%oSjxbfB zg;_G<75r(&|pm=hBMpN790*Tfi!w5T1%b1j%fIA@?2) z?z>vKd(Xh=y#GG*-;a`j+F!;=&A%VH4Wq=>NN67ALa5rZGjj?l@nj`RZH(CBa^ zBt!rUgF`Ty*)<5i>~8KLxaE(L*1ODW{G;9Ka=W$IbfXCw90BRT<0bkTb#GOn#fFn#qe2HT6!B@n=rh;1HOj)@c ze4xD5f^+~|d=FD8GQg4q_#E^ATv8y8m=pk01a@V)LDVi6Joo^B=>jaW4Dg3vfPXa( zK#c=Y?V+|I$-W2Osf+KZMaer*<^#0q1|lN`XAnieD?xAyF&0~l$RI=wf?JG!{39|5 z5QLYhQZ9!WkwEwo%W-QEKKJ?0Py$fSICYEBjn~;H?Yga7uHUqEi!}&#GuYx`My3tg z^}o82XrU%>4bPNnW**)23CkC(ROTEb-j$1UR3#yN6z80N1}UxDXzBcgFOWd6NZDgf z|B>(dT^YiwW)R$BL;|5?5dO!XoAQy8I2GS1liL*0v7)=J@o6Q>QPG2(j_eZt6 za)ejT$q#(9c~_Zh%aitFyD~u_zaaeeD}9Q%Pt-1KSh=-{66n$V;O=XEvXzrTGL-yB z-bu!!BgcHs`y{%4x9&ffxb)+ZUhIWaHd81EBQ-1AZ5)9bIfTL9TRp`q9sSBg(}ivOQ{5-(=Aq0qBth8zX!oDtk)g-d`peZ0M)M6p*tX_M9dh7a zCZC-jU+4S8`5`>rW)OC)`KPayf#v?%mHzZ4$>2Tu$KH-duAD(=*nsj*EcjRRgLf(o zP_en_ZB!se46FMS31M`|K@x&yPg0s;znx&>l?`aX3<59^3M{OY2qZPgtb(eFPQ|l$ z8ReXo@vy_<)>Eh92py7h>s=L|P6v}Ybn_3%A;3`??V}US;7rE69T5*I!BMR(uP~q? z$|Zkj%ACQSFe0S&^Oyr?q$f!Lk69Jcw|*C|W`q+D5l=6nZs_Wz)5=+uVHW&h)|3DS zICofq2iT?zEP_@ulwa)olf?SvAr|kk=Q6eyxzfjDpw!A#Rf>37`Oh=zzrUtX<2=ix znjEkAeBfB^zrV)uz>H4A2nZB>zL?{IGohk50laM-3BG3INFNOjkn}*@NxYc#ks6HW zoK)5AUD>N%Or5xq#GPdfNc9+~sBMS{yOeZ`M;gIA!zB+nDluk{Pr9ths}{vEp$gpA zI1Gu8Tpk%6mK-eFi_)15Kr$eIkPw7xegNUnB8dUEeBdSV zIMxW9X;;BF#1S4`Wu*O96E;OqqofC<2N=;tO>6}>RiGP(n?~FqBN`#N#pve0wgUkRbol`-2`E9Ze%PZ(ue**dMqG3-aGQ|* z4A^DVuKzn*j12S|CHNru1NJ8ILQXs745Lk(wxB6*pivroj3`njfq;}w%Ae=klupXg zD2)_C@B=akKPm*_ZxK5wZ=g}y(tGbOJqrcM&S(j}^@lne$Tv>r5EmchF zP~NQm@gC3h&%U#BCK^sN08WFSJv(<6ia^ex@B}niW)Q{?ppzgVU#pCvE5~`YHzZ=V zyZ%Z!_%M%jp9n0rDb3!x&Zj^HW*w*I)TSfiWTc|k|KMH+=XhKL(djKK4?ni%Li`&^ zE7tjLwNN_C4Gu^dj7{xma~TBU(QmdCghmU5Bh3-D)Rr_LySpp-Ebg|VFSa)AJ3gk;{^;A413<2Ji&4^p-@*?vO~6obeGFrGJ|Nt@Y7SvFF^F(V@_|k?EvK~A zl@Zj`LY{Q0SF0Yfs6nhJU=a?yCJj=II3jNlc$mouI;F{BcI}L{;SJ$kNg}X5-iF~&>hX1g%>?;vsq?k+OSY%J0OV$RhQ zudXucd?-o6yqc&IxF-{-u^sJ+&rS+>CIG4*vKsI2tn52gY4Hs5*)1M&nX!&s5)Tr= z7-GV^L|ofSW^krb-)yqsGFy?DbeM-sG8mQ{WS4_M)iPsgbeI4PVOZR<0}Y4*;YE3a z+l?$pU?UMk0){{`!VClWAUGzi5x^xBOHRF9!B7+^lZIF{##kyk1Y}na-(_?m@rA&5 zVR#2!!0Q>(0@y)0m54wsTo5N#su%F~1pX2+nk^Gy%7zG#2xqB)eGq6v(n*;^jBJ#4%NN;WWDNq15GVm)l}-jB`Y5w@x8w2kEau%AM2YbyAPAc`nK)?I z|D6ni7zqR84t653C&>zBI0B^%TM)JwQGV(p*gpiau^ z@Lc=L6Ha4Xn9G&iVX_TU0rAtb=y(uPz^$s11mT!E3Bt_m_I$UF+%dPZ!|3mt=u=0I zZF}VSQ|CnVk$4>j zoxHSTGtvmGz}-j$jX))aBny|2ruD()5kuO;gsTK@{$Sb7Mwgd|#V_-ehUfszlEIgj z2gxna8*Na00LnmdGazlzs4zx(v?+Kw$OuJXm^nJ5fic95C5zCMd!t(gn0iqpv}`{?}W*#YpZD z%@Rrl0#9$+jJ@gFEmk|*d5z)*`=rq*?FRA{pZ*jj2<|bmqci*2h-^o85+ zy7kzL`N-itvB&6a(|F;)w{TAry)XBB94&{d-l{y>i{U7RVvP2G%0vC1GFYCO&0cR# zb7xSe&NLtVO=yF7`@yH8f*Q@V(v^YhWIsVLk8tGaM-R4aqjp+8In;i)7av*m-FBDE zz;si3TstrHr#7|+6-Xvw;W8ob*vy2*G)c6dTRi&6t#{pd?D2*n9CK5Wa;$yq*qwL% z-L@Bx=3|F<@Ut8DiIyPv2iGha3Osc#}a$Ir#YPU+3$zuYZh(LRNpD zzu%UBDZkH3Rbb~&|H7(2{aCFo+|&Q3zyHp@KRs<9N-^OdeY=vmxaUr#`M=-S|JVQe z`@jEY;RnBEaD}{M#QWpk2BSXwch7UCQKb&Xfxy9pP&^T666ZmYMDDGrL~=^j=PAq*xHc3I0{G!h8jie5e1RNQz~tqg%PEo*96qg?X~%AO(16MUICD0s9+p!6B{ ztN4-xRN#BW$s!P30QxEl6UBRcl^6bkJi;%)Yc2C`OP6=;-nC%oH67Y4huB_uXJ2Zd ztyh*bB(B=Ig7;1`HGj1X!NzQ_(Ew-}K^ zc-aiX4l zCW56?aUiCLn=@QI}?cJ;ULvntN=?G)vomKO&Q;oOgN2J^E8E}}+>E|YDYEKQjMxUkNpX^ev>zM* z(tPkm*#HtcsvV-!bKkP^iS6R2zWPiP+h?AFReST@9x`&~F8mg@N z(@*%Gcej7~Z%mX#f5SKq-ygs9P2AJ`>8GQO!|J#5Ki(Jn-frB2!}7~tHu4^yxbW+y z_MoofnPN6k5CT*m2^`>Kuq;td3A`&w71D7e(uR7ZKpQ7?4-g44@U~n5^X+66QNs}0 zbVE{!5NSfufDGq&s&a{}WdM%~g%V^gI3Z#|A;b-b4oS`+?qn>2Du2euj61|gKb}(Y z*3`*BmM?ekl)y8Wpqb1-?HqXaUg$}bBJ`h@q}Hg~p%%g7Zi}D8t$2?nh=lWV@i4nd z0<|Lpsarhk%q6T$Jx41hk2np9=(#l4BnIM+T8j{~SK?{*hiCS>*7s7JHZCL+JP;wu zlA~f7ZDm48w56Yqe}91B&V%F24%C=|(;)%ef&(uek5=-N{`+H0oD2e8oSDch)PH|e z+$~4q(JVok812s_c-W~BDiC#3pbQ=%WAzXsM=elB&<3g#cs2h5vi_S4S*Y9z1$zLh z_@zYD4z*L?!KI6H;0gf26=zXA%yRZAtN-ERF5}dW%YzaIrohcJP}vN=43+S4 z%aX;Hm&g;?JZ&lVAH_nS*=A|OnC>J3N68$r_MpgeUH|%T!9{kosvrcukD(N*=Bi#wYLW6Q z@Pllnyn!u7OS^ZM@O8MAVxHD6_}oLy znoQi7JB`k=xW}ILWzqtmIaQY+Ja*d-m-9O>&JG^#t-Ky2gg_EzdW*D!J2-unP}Z*= z1E&)Df~O_r;_$vXeOW?wQr4d#&eeR%H|B`X`S?`xDJ9@g1zgNC%?C&6HL ze|l$I6C`41|Bf9O{*3(8had$r@&l_{RrC_1&Pd_wai19)O@4@9i-xu>wzr&+O%4ZMdpB^sYks|$XM{eI=1xMSr ztJ{N7`F}s$iPwH}Mft5s0_FL&kdG_00r~YhUL^zR=|n7TN8$xZiO72LMxRr?;04Z1 ziDpc8kT^qMT+yzEj36b;owXf?60LaKp4l$UI>He!)TIh}9;#CYVhX5ZC!VB$E1aB# ztE_}#=g^7+j+=s4@W>ccJPMm@OfR?tw$CGlHV{{;hv6MDt;z{fG9v!->Qycv=oFIF zASId~TuGv~pyzNanw1qObrK{d&cuzqf@4KM;MB$#!MaTob`3qpzs8~(A!-xMm4+Cc zoS60mBdzYvE=SUdm|0EYrhYK$53d2u4dxJ%Cjlv|Ic$M@q;`;rO5 zCOn1gF3OOYb#eA^4;i21=;{LLg*lIol~m4uR=%In-#Nc3HF0 z0yr*p{EDI;`BbBoc9WDq{-79+L+ZRMa-w-;@;g+c9yY=$7$|JSZjr0lt- zrWiDNA>$feyyaRdowsZ@AwiEcw-|AM3PPg55BLr@eeUL)>FoT)FMa8M)(pbS(Mj1F z1pW~?<`jNljq*k^2qX`-m*l~_dxI*p^4^ELKN$Lm`J>&t-`!Y|vRi_p)?hC31{iY& zWd&$WEQX@KHJ3(@)W^k18(fG@Mg|BGDfes=gnHtPjoDxlJo-qkHhCXnbILsjn`OC+ z^&|PiGcLljGqV|eXpYYz+Vp5UTv7lRiq22@#*7kdpzl)*7_W0ot3Q~hlqUL61bZ)l zLuj1JlUpS%7;-#6k|YBpBHurX5K7u2_Z=Oc^070J z3#MpBJ;nQ;E}xkLi={^8;;Gw?c3q{C`fivo-Z%{`4v|2 znLzkm2ZSJmbYD~r&GiI4wUZ+y2!T@v&;3ST71wo23EX}PRkS+1;0k!uKPQf>SyBxm z%E}?E-Vp##c~b`@ZUd@>dki2XU2nxuK33-S3LHB5gp779Ze=xBaIR3`Ne;rRrjn0l z(5b^40t^8Yk094ah@RlzACuFi=L0VvBpHL%1!B5d&`M&RWrBzh+-gHx8UJWSof0QkW2FhT*s zvfYuP3QH?^X{A67L$is<06235f<2_9qqzZDsLHvOT{WW+$pi3($V6xcPN4K;MpL99 z9=ntPfNLu@jy^RxAT6lGAZ}ucnhwm21blwAyj6*T2;?CPnpx{tJR*v@gdhchzlC5L zF#vhUJ_ww13PE7=J}HD(e)NMMScCB0@4ozUY%wy0@I?*|q6Ptu@R`qjx}0-r4#6!( zu!HL;R3?2u=D__$n_1_Z3TW2vBnB0vvl zNfgX4pf7-)VRzLj9zVT1-poh^Y`nSy}QM-YyF z&4*@Z3K=-iTip4xds%Foad@$}wmfU>!m+1UiSqSL;UVJQ_SgCH(d_-6JD4jek*CZyhLpE7vz z&P@3DSR^7)_vDF6(O#}02-|!PnLOprsVtk2F{qm83qHk>tNC|gfp3PxLY6k_Ks;tCfOvRJasUI)HQ+Nr1@d53@t9H~@MhSR1f;GK z@gxBnp~W-;>UL|ccy<2o^(qv^E27Uxm%Gk!B_{||aqh}GcsF$Qcv6KtD=8=EaD)R_ zWg4Qy%49G(1j?Zf8ydlerj^`7%&m^#PpkRU+`U9NwD&o+bl_jliMKnAqE$i!E>U}M zFYJJ!t}_#N78@8*dxa#vrU(?AbB>0_ODCDqf__57ru8@y2OPLV;L?D=ZLsEkMQ}ts zx-m;94Ea9pH#)(r@NY5xEmdopeGb+zK5wM{YiZi2%_orOgg$_ekJ?UoLdQKx`@xi2 zy8zL!5&^)0R5Fkp#>XdP)maDjM8oEVe7 zaXgeWI0iU6vInD;30wkqq8FRR#u2;3sYomKU_7`uB)+ta$31MXWsRjva0LsM(Zk|w zB!Vq?xM?}%&26pos@s|ZxRGj2tTIL*biQP_4^V8PcdSL(RZjp_@V?s zitt&g5bRe*K>#HPq!2#2m5c0wvUMv*5M9F{lVFu{uK$A$v=UftmWE+}HP1TTq_AV@ zT24CUbfhiRA8?lx0u&+oAW$uR(@hjbP=jy_2?S3uYWg6!#puhm5yF4Blkx_Nlt0?N z_uZ9!Mj8s$il0VpYmXU% z2Lyf^27!l*U_ud;Sp#QVg79}Uz6cz>eIXeiZutX-#9u+1PS zhVxVQ;-@s95>Ik?< z??k03!@0%i;Kkl^C+}~_OGF&WbDoYO?aUysr3atK1o&c)WZA{Zsgoy8HQ(o?ogF47 z>>SP2e4o8o&d;U)FiJs)2{=RAb_U(ADknxG;?aI%A zV~nN-p=>Xhb|3OTQ-oZu-!k4oVe}FRKm0A{8TFV0I-x^^jHFZs5IUUnuxiLDd?gu1 zDs)`p`Fy_Ka115AbiLQ^zkrDnbk33a19h})E^}?>EP|t8dV{@LLvQ+Y;D*H2;pD6& zHCVmzs1kwj`>8-$O2t=gI7$;G*z7w>ymA0D$Nt7rw&b<78r#_V2GEqk<23CF%DsiN6+O^k`epGM!BIE;K3Ur zh2V_GtPpx`;?Ssov>_^pbpzKMnNBh=qzXwqti)A~T*}whk&jp0+GHFCvBWQF6LYGm z1My2m$q1MPxp4+-Mq!XBf*JU*mCW`{i@s{i%OWU~2g}RwgJBvel$irh7sV-EE(rsA zBuD`aTZ6zLso-g;2-YBoI2s&8W*}7YFn#(jAiH|=LK}*R96$?5j~k`Cupm1qZJR+b z;0slmK~RZb+*eyHJ4qKbJI5Bq2vqz*1}YG*Qe9ASE06W12(0}vtUrbX_%u+Z1Kftd z2pQoSp|5@23<5>UKQn`Xu*K*V`XGFdQ;c4w4FV~Ia*B~P$~Tifum-_i$~St7(I;=b z4vyd{MpPkKf52sx@wF`axpV#R-K{|&&2SBIfasiX4KLiZ8G~E|8HvqoU9t}X+l(kd zxRJtW_`zpMV3^4GYcdG8d@1@M&?)WZIOUY;2?)-=kO=u1!p5l$^g%E+V1?E z#RC?%u9>0K6vWJhh9Eoz2$^7j_mU9@%H||nIM2#4Mi1t%?`$UGVI(-hEbW@PPM`ip z^Bej@V6#NeHZ=&5R8ZaC`;`85|4@EP3*^+YgT!~VA1r>#=v*9e#E3}#BR{@^yU*wT zY{hkEmd*?L-N3mWbEv`QyA|X}!*bXVbZ^D)tn-W1GfbV#{Ys<335qV61Ct0RPkBAj z);9>cQpeiy(29&t5k8OvM_id=YFF;Jm*~COHo4#kYDaE=;$@2Qj6PF2!yV1vNxpKz z7f%56YLcJi4fsO&eTJvN2|1t>?e{ssHsFRJJO-0E!MoWUZt7e4r=OQe+@4=hS2 z0AeEMgsv@|89o`s%i@I|1cG7E=t}2ho>Y=8If0zi&fYPF8Ax1u{mq6DoUsY1o6Yyj9VPK5(ZfT)bX2^>>n)LLka!V!8?B@dT+UD5=qCN9B1#)ovp?PV~M z#m^W@#T9TJRZAme74imd9as6{KBDKQAygf{i?}lmL!6s&iN*YLq!L*9KL>vhiKC4$ zaEBvd;8fEGAW($iWtjpc1uy}qLd6M*v!G{3QA`vWz#i;~05Skhuxus*ty_wm6dr|8 z4C4`sW@;PD87K>Bb2b{Lf!gdb3Y@I6m4Vu#V+unPau z7f2ykqkPk6Y=po{-QV+Xv=74dTeeb2yqPKlWecnP&Gtj4an>pbYNwIMce%NaG`qGhMjI*`|MhF>K!*1mQi3l;0cLfSiB*_49=aIC-7B z@cQfc#$5UfNE|{8-PP1=Hs#IhNJ|j5aR{oSKKpc!Hf-yYI}T(SbmTDL9ka~jGEvm(-rwd71p6RSTsuozXV+6=;rarS9B zHMKd9>FJUgxQg#qXv4{D$Z+Q=q_VVw!%wX63m;O4Yo;=ZX zVc5y{|3-cvhz|Hkf>bq3o@~C)1TQlwkza6f+T)izXJo$l(^E@$V)Bpw>0cCkB?(ZTFQJ-WK<4@l~Y92vc!z<_kI8%zS z==zn*i6@k&p@xA*0!gWO8>>KP`io1jhiaylPH4*;BngJAE7|7gvRE_ z#KFMlqtaR2+`}ko1Svu(afU>|3qlAVLXTqXXMRo(+M(y_Kk(+YSGEALiRFq%%u8Cn7dgz9sOS*gLl$MqT>F#dn5Rh(=Qb9r* zh7M^#8U`e#LmD~r`=52<>%40gd|>lFd++EJcvnFj&jc(b9&I4{$2gflUr;B$QQQ#5Sie1b*kbzhqTidpAZ#MoHCW^ICRU z-FunFDSHf%8QlND2gvn^gB|C^mXjE{mPnk+=E2Aro+I#8R%{3z*ccyaLq|XH^|tTZ zLf$q+{X9J32jpD9Ag(_$ef_bFBH*=(nO5Pjx`b+$HgPsHS<>k^AM$!Xvg`oKyn5uD z=D_5+|H=fOqI=g_w2;iF71op8vr(|?{WfRVYs@XIPhg21fxEtBeIP=e-0>y9es#w& zG|^@5tDsB6*t2ZN(Tm^%WRymWgyXzI<-L=T+rPTk#Sl^%xxFKyZ|}x5Kn3oB4A&)@ zY+*NE^AMOW>-z@Pdy?@?$-z4>s=oZr$|@W%SgxmiKmmcmFnB`51X977Wv2LXV<#%Y(*MTXr}3- zbMH6!{o0yXMIy^-dW8I2}Rz{I4Zyiwf zv=}s!38R|H2TqVE6AWemyh&d;^di_I3OrrADDHeH{(J;@*F@?X5Zq0d0FO}Od*4c) zE1w#~zM1AEU14@o$0|A2D-cG2gF^w))il;FQ1pL_~;TUoYaG&6WU z@^K@aZa>*O{`>}C;fv1RjZor?kCDvO7X#GCIjvSn!VbhQx|i6=kl)Z#U|3AgSj0!m zU^C$uMUbg{F*JEX9D1n)bSX#WwRZOQ@U|uq zJPS#dIvxVb48`H%pcHa~aBIdN`L_(^@mNWpwLhM(Ri>L2(Xq;^riHIfWww1{a90^r z-gaa|LBmLd&q8Gi8h3y2V4$MPkPU8O{$d*t0>a|^5hzI}j8D`bbNpLvk21HgzpHV; zE#O>Nyn~_uAJ#z1!7;^xuyLrr1(>Q4i45g5xtHY-B|@KG=K@V>4n>jD{=)Ev8(?Ox z30Sq?hM@V$npCM5$z0$EG5KFQ82oZBEhzGac(g;|9?rA49p(3IS^WNU%#O?e)9L zu+`j+!!`qy7WL&9PQ%P*SNytcSPO>Y%;%TG-0#C|irBwzRA+uuF_`1@hI{%a%#sAM z4M9Rm!;q zD5JC+D_|K`&!R^vOoqE~{iG6Lx}8W}d(|>G07`~|Q#6M(8Ja(sjvD(bYv6U{_SfI3 zv@O5CCSK#pAhll8@q-9}Bg;(&7i>+Q@wwzIKdRn2+}MR@Nv7xCSyWv0;oYA*XEQXD zM=PzI*Th0t4KCIjD>{~0|IVx0UOglB!Rx)=?x`4w_S?gH;%!;BJ|PjF>d@u{f6ade zp)W{!5wvD9G=jgt(WHZQ*t^oz+VA7z89{wyc~M4Zq8L)P-Z~Y_C-V5@FJ@8M$yTS0=RTZ=u4De`| z98GOPR>!wNUA~Xe^j#G0vdyXiyvEt>#+<@w95%&!MK#+(UNc^NEHVX)yhP=H2LEEh z3kkwS2)G^2Z%Uo}fBC`)X2#5?I0Y%&{ykg3*@gr>jL{iNqLn~ao&9ci zqowx_O%sXN7sP$h(as9fUVm;mCszd{hZG-V3NDhMbIv6Av&=2U`^j^q`G17s1&Al& z#V?Kn-F{cLkrUs6nMKk2Y*`!$B!=P|Q6}*5l-`tCSRU{}ULggy&qT=F(0FXj+Om_c z8Ajt3g55h2rCv5opn>Dr?prmqMRslX{o^cnCmPy;vedrJCtf;Z%$_rD5(fDn!gZ@D zZ8gTf`UJZgO5QxJb5PH(QO;MQQb>w5Fcf1;z?7+Y)PdLMR$1=H+_D^iZySG@2n7@n zS;Vk%?K~Gm@;HsQ3qg6k_#r_II^}twPo7(|9K9w-dH z{OPvm<@8Jqzdsh#-+oo!{p%8WKTj-9D;JKQlGEIGu%;pYBPy+S27Qf?(v2pRS9}_bNmqFZ3X2i}49MNqO_UBQ5Pi92Ph_Wb<;H6K<50+-~ha zzsdChkb)Rn>B;~J1&@>5KXA*<_sA7pMIVy;z-)t*$kfJc4#4-&60!-73HYKd3h$>} z(P-i|pB^)%K$nj#yEt?d_(v+)3`w<@5vmi5&6bET_uBC!9(t zs$_#sJcBuM#wGJ+E}TWcv|z|n4uz7QFuJPnYGBp7@g(c4f0~)kNt> zvWkOPTBlo>fiD9Z4AtOtmP#c)Q~oNKtEWdGK0$vEOB!m`Q=NiDm?G?2vh5hv|J+ul zf1+F7Kdbe@5bzc%PS-&i#r$N;)X~VQVUOO|u+KZ9I!Y83Z7Jc-jt3ae{ecqAs+>k- z_yLN&X4D0gyZKE^U|tI71IQCBB5^x~t*`(LneQUxSTvPl^`0GZlGCz*Tf zmSoFt0O>fnL{Jq1aC>R2TxJo}%!nP*)<=R4S8QJ$HFO7L$-EQ$a?;buoqVnzhS9I# z)A?nTAj(lJp0b2*SyY4jlJ3_tS>+6bJtLWow{n!kDsi?~4Q!~LtubETHWIfk)`#~> zXYYNWCU2Q~`!P?MZeBlbIi*|MsUj|)r`PN+&hLWO5xs|blljMv@MVSef2p59U%(M^ z^Kx3eZ8fqbs=3S)r@WU1x;f~aBqbo>;nLc4nY)R7w=&?C9qSLyu&c@}DF<%E%k~~w zVO%>3NqPyIeyMdBl7^U7aZVo3pZy%NZnjL+Nc%RLfHLW9&hilSeY2qF7O#D?eY>t3 z3jK3H841&Y7#v@H-(39G>gUOk?6!0|4Ubu;`ziEa^{ZujP`?LTG+oV*`rt1X5Zx`6 zA*vIGtjkLQIUqpcaN7M(t<+HepSi^^L<(}mOAR)&h)Cs5mh@ezv4G?c{ZA#tHni9R zN9W=@XmC|EaFWK`A-{YKqXSNRxBT4uz#+wVb~Mvn{e;~tjeTAPmYLl}(>rV}=IDm_ z=lqt1(YieAMX3rBxr5e{p>aR6Wxzu6!42#FM0DAIRluq>a%y1aPqlXf4<@g1tsNI` zMKR1=Kkq#b9#Oi+l5U57`jmj|cFg|oI)l)3a@8o;@H;ua8>qj+>gNLD3{CGvGXhQe zcGaA|_u2N0@uz#cwWowRAqYR3&*II*6AHgXRJGr+rj89k1*8Cn!gdaWq|}HlRz^NG zU13_@`pFpQH4KY@E}8ZIJs+Hgomhw=9{8fZRq06Mk44qRi?^sQ z0_k&sF91z`vP`(`<)b0;B?{Z^#{KGD5})-7$kE3>%W%M{tr|S;?<-AD>jtoT1C_Uv zU;{sunela#+5%M_n7@QS*cNX|s>vNaT^CcE{TenvAI=*QRHtH0^Uq|6ikL1R8EHn` z@ii#+4P(xl$P{>@mE0fCeV#+7tqZnL4=YlsR<%|-1AJvpFCiqLOeIj7C)SF#`a^jB z587sw>CQxcNn-x~On8LRS^QO%IGa)g4FDF-kM93e4}BXNQQ z94Agexq|-sEw0E-EBBnXXeqkMdOf-7bmt#}(l|gh75L&XCiJ54TH=ucS@6F}MF%^u zS*h|eMfBM++axw3j^RifJqO%s+5;QbGYGH22+Wo{Y&nR>^SeZLGHrXvBYdCh7fzxe zD(-&i9~0roAGTG7d?!NymY7?I%u!kl390+$=QlNP?xRD;&KL*}7(o7# zlw*erwiYWf)+7><~Nx#O#sVX(zlB8Yu z5MbgyC+!_7<4>nCC{%HVostMDr9jFpZ!S^e-@V_{P^Ghmy^wpl8oX^WpE!{xTe!e| zBS$>Z9>qXydI+~{^-uUWv>v2rRBk|?8a1KA{J0K088_VCIzr1GMb#c**KTmhV=1!I z(4-t}kwQMfP#zV*O(pXnB@p4GW~dwv>GE~J<(0FLFDoHrp94{hw+XSIn=zq$B~S}> zSD+=ws8_@C6xU{Xn`Y(B>QVf9*2Uw=Q4K_(#4uqt{6(IO0GBGmEdraZf<_Oud?M|= z44wutPJyz7P_?vsfc;{nt%PkZc4T^lEUqsxkhiNV5r`QnmzY@T9`WH|i-|}i0L9%O zsv?!Su7ulJFDlt!8hS-*mSzdjHcPwvYWT$chP?s4Q94Rn!e9yM`CtZqk3xo~L}&!+ zl0Y|e%t1d(IRz!zAW!S7F~x4de!CuJ3I>}NL?f4%SS8S55yc%r;5^Z=NxCH!(F8;KWZa?Z2nLmN^X z85Uo{7VyiMhQg7tv)vO3u1gI6pVsvkr5hquA;wVeKSNd>GNZ~fvGnS zeblHOZZUyOECE(iE*dGirPKbNwR;ZJ(&Myy24dVZjVFvv+5O&^`7Sm6Dk#Vz@040H zbl*MjgZRJBsC~7l7F7kM3yUzx@chb_X~XKuQhFdj4qNnfJIKCy^yUY>FK2=1HrmIIds5X??M)ai!}>ajIs@dE|Nd$C++lmL!@8)+~rJHx7d zg*?6%1)i8q?vWP!avlQey`ikm8tq7F__0Fsg|HHMVQ69xNim9oVe?$XY6GY~*j0jd zLwv4>TH*x#g#x~^b1|xt^}i~b+cxq$2kHlwS_3T4eXE^H6dURL#uDu063hh0FBI0q zUfs^-3h~&yxHx@gA<=;Up!ZM|z70}=C@7*77R6+-8bl70 zOJbK&wC~sfp^WG$vx!&$@jW-BzmSW#@sH=wEEwEmXu~EZpz5#o8HS1cDo_fB{su0L z7_-UwucajT-Qr1-+Ck*rN=(j__TymA^dZ+CeaS6q`lhBQ#GlJV#>NeyLdGse>IEbt z%_3$$u4GwYn;g)VFmYRkiVMdO*xeRg^D5EY3?48g#omIG7_kbm4A1N@VPVC=1t;Jr z^=!?}ajEm8N5_h~`dFs>kIsB$BEZp!mT?yX-cN89wR~wbLPfcZmQlBoZ`6sX{;n$F zm_@#X?fwnqA9U#;pdOT_{TZEn!>3OB5@7JytR6J8Z$Xl)%PP_L-5%2^tm|DdF}pe) zAMQ5x1@-g?2c#!41R5fW-d6vokZc1YKV1I=f5Q*r?i?D`aA)G8e1F z^d0!am&L1J*DAk>7=+1|LCB$ShdOYy39C+u#(1UniYnq~{!f1$qhC>s4e#4sZ=3iH zxyu<5o7eZlv-cY>2LnN0`ZjX_bRZRRPjq$1(-I63v-*ACVwTo!#NQTy%&hYbl=rqgVt7u9;?YcLb!%-TvwwiV$M8FX5;dQ_ z>KA0RkX(t3&$J*pAodGl2ledR-CVy1s}PYWajP+c9h3t&a9e#?VO7VT$P9;V+kk0| zs97&w&#a-$Q49Y_ANn~gPMfqQ3#c%{&@Nr`ryp4>2hPi}t-S4{r^0_IGv!c6{U@br zxi6U!vBwl#>lIg#&Px9(UnNYei=H$pz0dZ!_RoC6yDp(st&>+uT07YB=-^fn3t}z$ z*l*&D&_l@VZAl1ML2e=^PF#9f#$H&NGH`z32=-Y0nvASvH^I6xL{%+}hQB8JIQp({Nib2JElL2s#kd3 zDlxLvtEY)Dc92D!0(_R4Ep78c*M?8=u2^d@6lwUO&$7#h)C@UIexr*`ymJ(8!^abu z<7_J@!1TcS*mtyC)6?5VsDd_;sW$340~m|`a2KBNT9y~5F3Xl`);0pRtRo2P%kH?&WjPBXg<*u)--Z{7 zwa2LG8_?yYN-U8E(A}eC{1nfw7rZOG2{gqRB^?NVt&&y>85vnp#FfYpZu>|n$od+JcZc8x2#w5 zIn{(*>pVX*fug(fv1K(cb+3PsY&LV8pl5$|TgTH-S*w|ZKygs$Gtz#jMtM#8<)bq3 zjj+1>Ci=A8RF(W)k|rgjuE(x_Qcd%{m&MnS)$glsG~zRI3Vx0~P5&0$iCGJAR`7*! z-0TL(5f^7ELixYHbA?Y}d+%B0%ZSKbwUU3zoegG>L({Xm*-U#Kl@XnfA=$fCfhQ$w3O&#b5y=So3DLDUfKnWP@~6`c z6Q)|^KrYG@#|crFirO`*iqG(FIPrHJpA_{I2nWTNFEG`AgE^D4 z%vB?fSTPqKP^8p{aeEj!!UIztg4P-Pmy8Zrxbw^YT0il<0&4iRs4^s z=Te}lf4uU;NM>poA&gYwHOQ1W1_TyFuCuFVJD^(dYMlE@xn|w$cqN5O?{^K0goiCw zYGo?C+YfDPP{tMNdGrM8>>rPV+{t?49!l|VHgD_il>bI}T}bPcSz+(!EX7Sh4cSm- z(D~|1@WkEitfFQc?_g!${^Lc_L<9E7sI1ITQcovLh0GJ_?dDL`6X64S^t`23jbfI& zqd!H^*#_rOSOzRlJxFJ1tQj!^-xmN`z$2AVWN);NpiSZ^ z>h9qABnTMa?RPd)%)*Rr`kNzfzgaF4$Iu)q@+T*N=!vvFx}4 zf1z;!oo=w{()%4%gK>u_7Mh6#*(lmQ{yLV$_=R1e#$eDSwrnWo*n4S(y%jtSf|*eF z=s0`>jm35*(5tTodFsWk37H|+-l47NwjkdO-wzA`ZXTEz4Nq~%v47#v^d`wvM)zwG zO>$h-5`f9*Qp6{grZ^F-7dzegZk8;rg)xIa#-u>Ue{5!U10{408d}`lF|M+ZyZ0#HoC;ypwG|jCps-KT zUPl(L*39kDI~L2*uwRb*ojuQkkA zvGan3H~ptu9)3d>c{Pgx*P4U7NDhBmN@U)IBZ_OwYAO=>T+Kc+IW54BzAR<-l3j4l zMg-*`F|#63vS5F@d=UPpPQf!p@v76&ZUfAkLaM)iMyyq_Pck*iR{nraepC@9Nd|E# zZSe%*tBubYGYcj@FSU&_7Kz3Z8r2~AvEE6D2shy|S%R|L?$JiWmyuB~0e%!?%n&qU zzl0E_pOV2zNc{q_bhw2)3l?83#N1syI02~3VIX!``FlnbW}1SediW zsq-+l6yL+z(?Oi}$KUaU2BvX@$bL+x|B7LpAh22T;`blhayf7r3|PE_zUj|+QU?X> z!>yjMUE~PHujfW_ZE;N=Q^HKtS_%X6uyfY+rSp&3C?h+uG^2#-gxC>y+&G*vI3EWk z#j}`Q<$)x9*=zptfk?rmn%rafuu0nRvk&6O1j2p|kRVpa88%}^ylmCIp~h_%I~`=g zwb(HkoN+sbx71O8VBa{t4tA|3?CzkkKD8Ez6O4tAaxfN^ycrcQK@#tx^`>u>8*P>u z!eW)V!>jPt`Delp^41BBX}P)Wd3+9&??II*pDKPX zC|$e$4O71UPoRsvwU=MYVg5v)pY(5k6K2V(6MDaU#?Y-e&KHePMr^(ysBZsGm;%mc zPnQrS{Z3k3oab#)B-&6LKIF4$!VDAw)OaMqSYiCaB@qDbuWh9~X6q4@GnIUE5&yG$ z0!NHUH_sl4uu>JA;O=u|x2>x+0-!b0y~(Ao1Wyi)9Z zYMR*teu>*ZLjYi?8hU%T-*_2G1>bsdEh>q=yZoTSiYtiYs=z)KWyC^##k=@e)w*a8 zz?q&R@Dt=t;aNz*)!=3f$xl>P@4iEpTdq1DTMZy|FP5>x+v)E({^oc)4Qm3O8q*4V-_@$s!1zXWim$chnt zRQmZ#n3QohZSl?K#+fr;!NEPf}$#nh!cY!d;s*ns)xizN({dZm?C3{#-3j)tl~ly`4YEs% z*C47x6QL>qrDlsJ)I<1n+gj^rPF}?z2B#%!P=dyMx%z97SO7N?%PDc2?x}oUrdQJI z+uw|ApWbMXXn7(%#31X43|=it6ucD+UfH;R zbce|PKrBivB}YpHra7!yUhvk7EsvqHZ-r?Rg8k}IEpbPcT(O~V3llB}mjhX5@%#jf z`S)Sc;4@8j^eLOFbScVrRO5M{?@}P@i`Cf*nF5{hAyce&JWDA-M3l*4^4hqeA8`mUi3hj#s-@ym@lN=6CdqlfvuX8DBEX0TF*6s$OaD_56Ey zZE|b^|Gx&^lZTgjz2|LQ1`fgHhlo1aG$^oK?T-!{^Vt zb2$A72`?7(rYK*w(kqhO3>NliME^F%+Pk{8+_7B!li=a2GA@-NaZi1;c2@(DNj1(G zejch}aWINjuwwA^mYpW}vc>s53r*B*hjblZ*{(OO3{Tm$8}GP(7%*ZM9L>;2|7Te( z_3!ow6ZZ4w2s^s#aLwK$ocxplR9R#_ekb2Kqzrc_p|dHHQG{=2;)BW}j<25BFCiCWCyk2xslcFmP`2#aNEcKh53f8>%4*SY&v{Yp~p^6jbD&@ZDcgCwlvh8Tp}d^E;Yf zdZHe9WM9f!264E<`Ls-UUU3*wSx^jD9- z0kmsqcHR+Ai_oSl(6?cuPjJ`LNNzp|QbgwgDF+o28gtx1{LMMo%$}lDCyL$J&4Xbn zofZj?CfxEH@-N)u1Zl%5Zb50Vh=xlYHe%ohTP>Y<{NQ4MN`!$gViM-6|czqN&{DDTbMz2U@}$b(6P zeTuU9grEHnJ}b_czf{lHm4O_5+fa1#CNNL{zgRlLYpGOF_%zQyd9}@s=hh6(PDDEf zH15CvDE$?k8dKqqWnMtBHosK@I&AN4)xr*fi@(Jxrt5dTOZ)<^e0`Je2@_uR`Mk_y zph<nbdkw2v-enzVw_?%$yqjbTs_bU*>gM3 zs6ahJW++)#oJW9Fo{UPeZ7w2NP8$O+k~_nsK}Gg(4qKdz+3y@l8xtFr?H7^wii^9X z>A@err47Ni&W(8s9JnunxM(DFmXKPWH&pU%zW=Frr$hhpKO{a2r;6?pm7l%njzJ(KY`WOTcsGbr zyWQ>W4C_f#F?%xj$>jx@LSaST8}QS|L^#BXv=M)B|a0{`ETTp4H%B=j)4Kd z_CxU972bkuwc|?KV# zTK8_h9evIN*gSg=GGQ8a$ttHJ9Zw_+--!pirl0N9)U-whEjpfvjMr{j2}UoMHf;0r z)4vzFRK5iQ?r&P_uaHH4*OEN6t7^V_U7sb+kuwm-x&=&Sgvw*1(TMpY_en_<;bGw6 zkEp6hOxCf+;jYep2v6Am$5<)0fYp$7ok9Kil7raYhHMWBO_=};K>BPvhJm7an&v+f zN%Wl4IJ0b2Wvu!RD??v-Sh#1oS|_ro(rS=OBXGr_pW(N~Ug?b+p?hu78Z-eZDvr?L zFYfxJ9X$c6pdXSFtPh079AICmo0;Y>WT?SavJ(qo`pk$?s1UkBDJAT1TV(qaV~3Dz z;)}YSP13_&rUU_TU%y+5G-hv974Js`QB3s@6l#sgDVDLyH3A&MaWi4_kvL?GNFu?s zpT0f+1ndjO$s+%WS9ZLR%Y*chq0}FTr`>r)G7`s=6paD8*i@i{b?3ME(W!h?z3e*QIEUay29N9>^SM~`3&Kr)mvd z8Vwl^sFoy#<$IP&ozD`7=ZVs$O(S7SI)zW9J5!NB41jZ}RqE>n&L-~Ck5#=&ET9mb} z#wi0WD=H-$@mlbE;?w?Gvx+BtW|4cH*bYEb+5x!`{0?14Zl=SNS1?<<`O?|r8?@{{ zA3UC3iKVcjx!m24t>HztB*S?bWp3lcJ*C?H61C4RI&)5?J5*&H2~j*2*!qqDsw+U1 z^3J}$4@B+%J?YoEO0D>}g#@?CFj9*hbhAq<)gk`Qr%{ARhL+I0d*3~D$E6SGOFecg z;)((ZYfMe0U<#LbvM0>HPekay52&kD-H+3wIOB6gf8I;Ud2s1$-eQc;m`7P4_Squj z={K5TytPHyv}4lG-GH_SCopKxeiL^JeCglw`{!y;=*yQ>khksSDFoED-o61fT^cxJFR8iUlj_E`<7fQnC?d=sYMVv0oRRvdue@MCzHN96F3eOoA|4JMa zXKh!~_t%8&tQGekE-Ag<^H=%$n7@pM&<=7{v62)Kef#b|zK76QdX^a`G^cGzK8SQ& z!&ppPaui^r9JKA`s|>wFL#39GO?u@yWAvJwudl%@xyk8orgul1T?NVt3raK<%dxkJ?bBnG8$$NT?Nd0l{iBl@ z6vUrQ?CJJ_y#Uj*HDg-8%CN9dCE|UI)#@y~TA)urR)x}H6uife6JAf6pOEwi?KF8V zf02w^yM+K>vK8IZ{RlvV@1ZHuZ!Hujmqxx8wDvCN?&%(avmIz1VIYR&1ry4JXsp4n zz421jW!H|?RKKayP3tb~_W#6_z|&q>NRrFwx0E0~hPh|*9qsZ~pI}r^J1BO@U|E4j zwe&==coVJXucJZ{3ICEv1NRbVS4%D4Sy(LWadT|q~$y>5;6 z4K@P;z*_N2=FZz&r)NwG6vipt76U*rCyYIR9);vU???$j(!YuRgRk;d(LK5Sn`=5# zT(J=Uhhj~84Wo~i)}8X0Z~k2+ZQE}lt0nz}fr&lq_oUaW6LZ{3e7TcRDAjzM{SdAycSi2IsFQ4pLeAg2 z`~IByc0Iec%Hhb`aZeOvExg5(Q@Xqc_ZnEllbNB+Vzhl+Ktm`(unl4NO`qk z93v1TBhREME}hT*`NCoiRZ_mU<|z;fqn@d64Da)o2&?`KmrFl{NIb^9e+;|Co0>t? z^dBEyu1EBr56fSbhIB$mSg2hloAOh(MHVbF+0gkzX2@9Zs1u0#*MVXGez=7_uBN=~ zUuoySt}iHi1+F_&UwUbO5QQ4J%Zae9^!n)V3>D&ty*aV}t^DRJnnk5LWHC6-$fGxP zNgO{;#epr#c%)QYNmXq7Eq$8LSlM=OveqXg*(3vtknbhFgJ0~Kiee@;jK6$K=~_>& z$a0o>8xZjs%JC?@Z&yCS2>P`Wn_|Pt3S9}aO@P%ABm-^oYto4CP1p zhI@GRYm#i=`SR3Q#dt0=8o+yAi$J2e%H4<`65kIlK1s+&A{TI~6!?x%@CfOaOS`OBqSVGIt%Z-rh3zHPsoU}@>klq zgrm4Y3jtPUu%Y>^+XGB+KhY29-#hYmQ!R08+i;F~f?>;Ag1mjcE9WXY1WO8$DPTs- zVX%L;1kFPXqtDMMH>@gNadIvQIn1+W$oXsX3zNAR?f|8grg$x3gzVZN6VhodOAP7f z8UdLn+{M77G3stAL_C3y%v1A9DDN`KnMR)`B;;M^PT=v-Z>6FDfnwe7g;BHx!r$E0 zTSK1KoTLMu*ATbAAEs<3kB;;NbNEDpiY6k^S!%d=Xq-0>F{JNcwRl1TxP}$lQ5sJEdOk}ZCRSt{rns;=^${4!p-9X z-(z68mw8Q{`CC=Hijv}Qg&#+&U3Xu4lJCyJ0Dssawyf$^GVTVc!Vj~fuwq%%Dfe3! zUV4i1lPC*lyAuMd985%YjSsjb4ZvlG*{Ff_zmp*VFn)aCHw-MA66U%fg@1puZBJeX z;OLuDjF(57A&;xQyxHe2uo5IgpGe+{dXs%uh>4(IVNT;sdrCsKJ-rK?Y?V{fV;q%W z2?i_t#NLDzD&hTG@s}onO_ry@pU4+#pQb9-Zv>jg@T`gQ3?=1N_k<}*Ty-U-xZ$BG zdZIb{Xis5nk@j^~Ib%VR)bBR1$mj;1!mOOet44-Tai2Ov+r7R%x6H-Y7^Eic9*j6O zXK9oqnsXN1)u^KWVV6oWgd4m@Vz_XZ_igpxu!z{CZj-CA;E9p{mF{z4eD--4#G-wU zh#YVOg9I$49ve~*^`4oF~ZUNUiG>uVA`q zuu6=z6sF);&dU+b+jUq$zOCK(`Uz;%nBKzmtMj~t|)ws3W5ZTOFg=E!{A zyFi!BJ;d_OfcQ_a34%UCf?E+XVkRrw|7$fyu(CQ7-*qW)faQo6!Inh4rR@k1 zQDhTD-Z`uU4?$6fqtB|`yOnEFU|S9VWXMH#RH~AnEPvleF@k*SGMPrf37^j+@^sVa z8EMjP+aK3$=hI(>OOp0unM8u?HOH=@O1NRxF|R)x&q&p{?xw>jD=5Dsq8qf&nT3C= znN$)9pEsQG4ea}|!Wh*qL1WlAJRWMS!7<{6Qw%OZnK>lLhLCC$6{z6te&-4J)?e>I zvNQ1ziYgV_F@w4hQ+t?MKbiJ9To20nS?}gpudV+u_vbkf=L+LW)AWKNHL+Oe1=c9x z#3SapKS2SoywRisz0=2!9;i*B`pxUA_F-E6%WViu)5j6)9^lccyzJ||X7p}0ePDG9 zg^8n~7T7nVf;i+R@(fp(TAPG`nmubJM98tXBH|{WoGwwTWz*j8OZz?~*F+g!l-pvh zOsGbC>pWZt)x9)0b=qnAyExQMq4<%$ab28`^ zf8wXB02`IqDj=#_Usoq^Z9+RxkR6^SGEfus{veR$Yu9?Ok_z{Iq{d)7>N_Do9S@lp zCTUxgq1I2Z#uuZn`eH@t6}lG?AjS5O%-}-2QnM{8#RhwAa(T)cnPXF47EI>ks7rb)&2h?@fAz@j12X^ZVAy8JFMDQg2EV7?4F{2(|j) z%t1HU$r>~D-zKTlCpCxTKe4P${4CHPOn&40GN}3Q?&mqODeCq)idl5RDvKonYj?O+ zRoWV&)oTjHEhCcnEM^eA!gh}Nxj(26cB^EGLcfu4ZvXbhi5l~x`)Cewy_T{>O&|4P zRDuD91Y#+_eN@BeVK|PI4iXMx%Z>v|f~VgqcreK0=yRW|A!F-FFu&>fx_xM7+^75J zh|v5rz%x#QM`bXla#AAFN_=j&6kP&M#U6H#Y?b&!s!0GK9xm-3H@n?%GEXwecTCVa zj2w(i<=PN_O;O*D6Mv$Nb#0tx45LtI>$34h##_@(9xqjNW0KbL9S8JdshA2uQmFll zQXC&j;CQFO?p2RTAiYQ^N}tBKblpgSam55KgIMJ^pM6?Y+Gy?-m3u7VZzI)+k=R>w zFB3ERX!*J6@53b5?lN(6{Qr>#=lMQwa>^p5Af&;IJVG*zLZaI5q2HQTRNz*3Y7;{{gNi&S2LiA*4>5yxaclOzObY6L+@??o^K5iJE*_e5>J=x*BX>}&Y? zJHnL)B2Ugll&uk>@Dpx9FD)o)eo9nr&%NF%;p+pnA&UPn+kgK z^=Vz+M0D;$h8geQyS_a^!q~=nW2)33{Yhv0MSg>AbSWV$y4;rhtMi`*PsM)vG#+_- z@2Va_DB96)H6HV&KnB?e#SV#+C{1UgBW+B*+5ICR2HJrD(6azUWYoae9IbB;HN&#) zS)xktBzY2Nie*IJu=Vq=W6NeW$ol`i9*IGts*T7E`}&w@dXCD55B+mm2L8MmlTntB z*oypm%_@L~o0MRnR1=XoY+1U=zgk0^`XQRtNx!aNhn$P?5Z&lq z7`+ps_Yx(7kBA;dFChd$)X`fodgteR-G9XW^jznhXZyU*UVH8JV(VQPc*lh8`~~=L z->Cz#5EbYZLfPd&%A4>82Tr-{tu}$m7NJ225>umv4|}PdWRUViY`Bz@PM~<{6E!HS zch@GWq({(yo{A;na2BkNz{txt#VWHF#jV(&|Lx;eVNEHN)Ar*R=#?x$$nckvmW2b@ z9*aRY0sf^jPUI_TlHnJ1*eE(t!^~aN@UT2bF|D1xMO5zmS;{}V#8o_DQf6LqSVvHkb zoiD7BFw#fYDKugXf-E;xM?$iPQ4l!9m3HCuHHfxb^qWqgrL*fxRygAwM6tY?O+O3L zMQxtc-OpZS^|ClOA+k1(Q9e1xusyAQi_t>vIX30{5r_?Las4d)mtosw9OL5a^C*K4 zK3@l!;S~fo0`dXn`^^B0$Sb$ft=!gSXDmT`{9;>?7dJD@^?7NC|hK zW&>@OJC#l*pz@JoY0&E4DJ{Z1-Afn1auPeIsU+F)0~#5?GKElKvpwiDQ}7-J@@}hk}eEgBAVZIe~{c1h-Mi~o&D_Y{mLO=@ZaB=VSJVXFT{E~ z1wRSG)yCNwY)$6>E_S$YYf{=c~ z{L1z-;h6_8o9$?3ukGp+=fnOs8mmzuC2$0FT3B5m0s`-P2&lr4tHCV&tf`%%jK7|? z8c$3hi@mH<@gRe56B9zcC3{N~k2;Re{$_%#2||C4@m6D-hWMK?M98{sqwI$)FUnYP zuCK%qVcE0Xw;v#$6yZLSVYJBu^sjk})ecvN0(IJIT`PKqRn5RAT2nPL-TxB406Z!; zsM5X!|D`(QL-TYvz6z)qKxYC*l>cysZ$&yJg;8rR-)iwPKkOk8bw;23HOI{&X2btW zNW4N*pTZt?9wkmb3!g>l`_g9F2-uzf@SnbK080r2D} zX=``(zC`PfsJzKZ4nYvu<89=?Hy5*NxKQpDU-ag`E!{p`3r=kbN?Mx2Vi`VV!t)Cz znX?%M`o&k8+UCTvROp&>XEP4y@W9U-PfO!p2I+fMZplCtkiW zaxRFs!FX-w2 z&otQ|qYzh%D*_sEMS<-~bTvdV&wu}PemgO>$%6qEt%It7$A5_~_4Dre5wtgoBRZWz zAi{?8K}JjokJAxR*)b^{X5-1i+))87f)UZOWOLrAkk>&XaVKxj4LDvQ`B;E5B!G^_ zAvHFuKh?`PTz#qhXiqaL(@twU_UX^a+m%Q0 zR5uR_CF-@s7wEEBh%4w#$S+JD7CCq^<5z2i*i(l@!r1@v-ax+@5CIeFxzgLdnNFNo zuKZrlr=6=EuWi=(dK-Eb$3X*|8mVc)ptoP6{1CLN>p)npr8?^j+9l>%lhqxwetv#r zs4f`C-gTZ8kJ>H%u$rOuUzja>6D}%KBVAa&eiTQzxEUWY?-ni<^6BkYtvG9gSqm|Y z7^MlqB$a$h2Srvu`z~7s)=8AnW`YHMUA2$)sf}m-f@7w65;aE7_m3>IrXfE<M%79O z`KA~)EHS2X;>HXz6eZNKOe5OFsXF))+TTx}?OhD0nbm3*H4+Q#qqv57T2n?!kE=vR z@eN^B4`9vRvhJ+oVI#;}g5xC}Mzlvo5lpDqDJ@BFg6LD$?M0c$<-T%O#{?wYbeyRm zesfEYZExYFPz_@GB2sFvM0{kA@S>{olKKv&($w24h`FgtQyfdf_4Z-e--z87z)(d- zrF$8rn9kDef&mF+S(ltT-}n|;88Zbse*dyOyZ`6!u)^HzUNNgrRhYS|%#8r7dK6*Z zRw}N2RT|zb+(6}N25ZDSaF9aq=@1%k3yE4Sbo=`R03r}8t-;qSV|yQ{*K$7{CA+@Pc$KOmv?wRdJeAJPaT-*ALNC+jp ze=k{izQ>&;7O<6E?roi%b?R?_tCn>B?LRVM+r$5O86sbxRv)fO7zIGjDx)02$cA*q zoB0JJCb5wYpaJ%P-ZBx&ZQqrhFM8o%mwy2!@rSRv@qZ|QGuZUw(tQH=DHq=XVH)*V7!^?=%jj+mE=(1JYNc%;XA3rcJ^okKSBX^_&B9(ZQMJft{36 zfK}QA#WX6Tq0pn}M_gtu=-8ZF2BREMUOMcBE+F86p>%UJOc=z-Cac1~e3>Cej%6^R zO6)w<82~onR5Te?4G`)g3XM&-U^vG|I3i0hFTq9%;|ZP~ZNTitF1bt!jec{(>YO(N zK?A5BM`-Wq`2NwD@JAiYstzjrsWJG^H5p#~lVaxy=Ey3a&(6m2M;96lela?_#IBIoWpZkjB5@v$I$aq>pS4Wrh~ZC6 zJIw(=7dx@7#88D!Ez9UnaVdI7lav@FN4ebp`h+>k(2mO{QyB+{s&5=;sq>XIM^7mF zpV&T1oRn6B%u_z^R1G07s)n>Rb@sHtocSLS=$YJ5YNrb$@^dJoQXI5 z6N>bHcNwka+#_NpOF}Rgwk(w&nLO#5S*R-)GsD$*iN78_N zN{0v9g5QfRm=*uphQRvF!cfqBvrCiU{nCGU2Rz(1FUO|&9E6OnGYYm{TU!H{B6M+mYx^;atSWadP0n5=o&n*xSJN<%Ex4e?)k2;w z7f1P0JC8Ri?_MNR9)n5?d_INnfk%g+^o6e%Id8ij(y@Ro;Nk)V#-~duXd}|Eaq)2}77D7jII42J zwui^}#3(@4{_~2tie#*|O(6KB10}6WG%tqJbf*4#3%{UHQ5CZ$edvo`^_TG5?I!{Z zKy&DK$!Q||s^`<;g+Fv+`z0?wZ9eGuBWi|=r2U?&H3B?$0&>KXa)VQT+}s#o(uV%q zXY~IEkST0)MYwkLN6JlBD7I;!d@<{|!wn-huFYM=fNcM>YWtP_-|3@Ww zjZ2`+=?F|6F}x2|uh@7$kZWLel6k`+Mm%z*GFJTL`FtTcj{u`72ZGqMTtaqfIiP5G2${bTdvM31R2L!W#A#>Dp9aG;yg9|3+K7@#p95(cGwg*v3oh zXJP2vU72N!-KjQEvS>m>1X^r2LeufSa?!6epRPK9-8QA2?u3F%YAQ+1q`hPFqv6Vf z9J!5vSgfym_HE?KN@j#Y;k2)}$n;_W_qw@AHJY=B4DIo1LT5sQ-ikBD7Jk>q$b{Ak zhz2VMx8u7XM6u%>70-Xx2Oo)lmxU5JBleZ;X&Kw$Td1mOn4Yy{$RWMBn~)P%Ca0+6 zkAw6;I}#c5it%sHGG|XigOlg#=L2@;9xa~+;tLnF&&4CwhabrNT(b>VaA{)H6F5-i zUd!`JG`|6#fGy`xXE1_iD&{v6%(Qi(Y(Fd044F_9lHci?-hTc`TGhEY-SfS8vb{k} z@^_?0c}nn9({B68xu4XUSCBQL-RIbw4xcg5I6eqg(PyXHi#lvmv4m*t{qf5&s8Q8| z-C{Egs<(cDt0^O(O9{>#l~P{h@6G)X&cm1U8vx~DP5w|@FyECp@@_&YK&zli{1p^d z+z0SgMLT}-dAAt0&ICTK8NbIF=m9w(EcMtq)!1-Wehi(GaVp`y1AS54=rn_BZU#4^ zV>WnV*X%UPQTe^fB&vHgOa2}h@;*Xtod@-(Zk-DY!)p4qiASH+GlUtfBPlk(&WT$l z)M?pHQ4o57(d+r66BLFbAVFOopJm!^IPdw)!v0=&F|~b=jWo)NRPIK2gK3*K^9rQ4 zhe|E`woHicL82|$3g2$(azIbbT}-^aFvfwbNDz&6u~jH)e&8hB#0{n0lhp78a7P5E z2h2+&e^Q5NYK-JZarCr!+}PJM)~2GYBZ039U$Da0)FPfJ$Ir_Yv}Pzx(UdoSsJ*S+ zE=mJjn69Ti-if7n7Jf|c!L)N^`Ujv0e>*3-tY&X*x@W7|Aad-TX@CoO0XV2I*=5DIvNa-Ke95OL=6- z1O7v`Rie?MqWL_vU@`DM!g&$7Trb|;F&J%Sb6?e`I#8rnY>P5}J#s!6^ z>BTZRPO6g50YR!r@w?0$O0c2qGP(dHb)&bu4&37^<`un_NyttVFGVAuh-nc13DB9@ zOMFF8g5g|<_*~efjM9WMJTEXg-?RURR0A8QX$}++{{)yV>mbNE=rU`i{Ov32nk-w^ z*en}}a4emiQ0COQ3AlieSYn6V@;oQ#Jn6{<@)|L$W zm>Q^q@!R%66u6G0$HAOAc{W9tOM*oN3UkwdteO-kQe-*%38NU5FCdWeC|xa(AVgO& zfGh@4A-Gtz&ePycHinJ%^^b-3-C@Tdn@ZB2TmTRY26LC@?Q;^piwSOwAL=K-=3aJF z#^x(52L}UmEq?cU-s8E-NlMsE9n9SSKZa*nsowclP#6y&;CB zna(~?F4xS7cNYbJ8gc6b!+A(fAiHUCocibMDhz*7Z25tZm*L24}TJWna2;}TF4syO;<6iCL2Ck;_T zhkXJk=BD@Q&A9DTDS)5lAh3>3=3GnvB5;a=uKebtIYEXe4% zV#!4B^h1d`r3JCQA4A|F{dRxLw+p&YrxV3I_wMEnHhkFDP)5(LQ|C=HezTG;e>!~r zk|8V)d=!l-Xrd_R+^~>mGqe48=*L;sU2Rp+GMjN!8k<-s`qJl5hoo5?Vc#M|t4#(> z>CwU-^M&<@hC|{ainJ9U;Hl3az8t1!)^ilRu@qz0LFD&fW3z21$CKE=VI@_4SmjNv z=t+UXV-i0Zg;272N65m3Wj!+Z+36OlZ!yI!BQxFimMU0Q#$1tJ4qo>*l%${KFc_Fv zcji>FW^J8x@hxlS2dZ9C*VM?sao{g1c$+$o?_a_M$Xgs^FnsElH7$v(g;k)|_YZ5A zm7FzvH&>4)#H97{b!6RNBu0h0@w*)@{t{a$Vea1dB;sCC#WmEG1hU^82YE(DGe-{g zEk=MPt=$Ny59t}9Jx{kgudY`ase`jdIW#uY2m=T)1lUElDhNYlH+Opmf&Nw=nW)Z5 z5^&t*G^Uo>YP#@EuYovPAO^-lxrG$ye4 z!lIR23Qqg1wR{{nHwpKwVn+k1wKuZqXRiWskCy)$R6Vi zH2*oD>%j6M(&XAx*Tx_QM_|svP-0ViCP&6bc*09xJGsi zCF%!uk%BVYsS6nEChEh1IJelTr$;TlZ69VurRSNsn4+R{LcS1|5Xf>sws)yxjEwrG zCGMsLxyKG~;6RJf%EB#T=ysa>zJFDz^?|rx*68C_J*LX-mt$iT)^}FFk;J@ctLJOT z(S00?ztnA;#fjhrD{B7mT?`fY#Du2_e=?ix%$ucChmf8}R-g?c^m)3n&sT3}kV_^m zqeGEsE!>{v!4yI5R&cUIQtzY_m_5Fy#igS-k<&2&kG706nI zHv%{9RUOdZ;xz{4V>&rKIMkW7|Lwv2%@)c@)Q-429-8o%?B|lnloQ+zYYf^*OuMg+ z?&YK_42WjEke84QCnuZa?B)Ct_x`NuAwqXuNoo`@iipF~lX-}qC<`F5Q1oHwr7TYL zpdKgIuK!xN`Hm28+!$ZIpKPov!V#4IjfC=_Mw(I%Smf>EFLaVl0R*k^8NG;dvz{rE z8EvWjv4s`Wq?!XJS$cu-SK8Z0xt#7lgAPv=Bw6J7DAjlU4oBYj3ZNGCn+?f>A>Rq( zpQwK$zEul!`B4@yz@`?(#G(sO9x^rih?UK}vuFn9^^>7HsBN0Pt>HEV!Bry~GD+HB z73c;`;6F)Qt*L-?1x3HCQ5ydN z2W|9f7`-Wh%2uQW-d5V2#~f=I+3}__x@R=ClJjA%Ul)wo;P!b)+5u&50`b)E`Iv#2 zl|SA@PIucpqC`MK{!*fOPdh>!bQjZEQ;|kGulk6!^`v1fe*^9wQ$>o)Uwc{y&&4q- z$R2Q%+X=IuUyF7RWD074E?(wdh!1Ow${;Dwq<7y4qjDyAwFQPeu7*4eF)FXxUc?qv zJb>c2WS!XSr&7Mm{0GYW)7Fj^mb<6CE`BLYxye8uMlod%cGLf42Drz!)9 zZ-`rzi2`!|$+aHfU=KC;uN-L0o)R^NQ+OxO$I9Fe$qghc6ZIh7a)yO@UUAD~)5&|j zRYKt&(T5qZk|*`*_>sli#K|@G^5lURru8b&%$~lrA@cKwT+z@Aw9abjh64bY|H5pq zNU=d1Vg4G#Ehxic5HPe33tFJHR=0y%M={WR6GZ}QTV^36?a8uM2Y>7kd^+hj z0%hW$tb<JpXe28sLYXYGSk|0Tlo#Xs@v?tMl>h7849nU3K;kjyVLR?l1rrdhdJ z_wOL#>@Q8@@f1Tws*Muh)Gy;6@_8KxrX$8K7K=If*g6@oc(STWC76F7eClf!F5Kh1Fn4)bQGAC52kD_%xR*J9d?Eca*gq@lOYsG?)H8EqQ2B2^n<1vCsB!YZz-C;4Pf)l z@A?~Bdz5IM`?ob{;NiF{Y^#@iSD{z)Mxhrf18!aO|DRJwj8N)$Z@c!yn`{|c44w$*WW_y^xJyx(I~F5*3qbHdek0K>{N zZ;@e-5@6sj^1zAx`C{+Pv-z9%4-IkzHzJR$HlSfP`Wvyy?-e@Kz0x)SG+$s4Hp|*` zoHIv-4G7&_T{NmmEms>@uW%NZ{;F{L>4B*#r%m^g)A;|vVxb?sX!x2mZVLt3dst=m z^u|)R2+Je4A|t&E^DxVK`TFxcsw?qmP}->c6Avq&bWi#z8`Uh7goa1(jTKhep7jz4YvE3CvUDo%IMyl;7LQx<){Efn%WZ~5qCK7agco1p#h z7q2Rrm3Tq*u-qeI#k9<^5@MtQ2owraD0KOAG+A6ACHDBwqt#wa?T?{Oe~N^gdR64> zKY~K`*!9K@nj0qK4dlhDdcEP%QIvc6W61YL0~YZfq}s>53I&yD0$p0oet{mBK0-7} z31~;70aNHi*iSyX0_ZS)NkcH`4PwCY!Mk_g=+}1jGzy#p=vZ3;(P-Pq(2d;!(FnAOUISVMoU@B!RS))^tBPK+ zG|d00HU!}^;gW&j**PO!%?uj6^eJ^gRlkQzfwP3O9D|O|g&D|5?e7<_qfb8c>_7qr z_LcqEk~Fzu7sz>Bu^QL z*TNoEe^6F>cDeM^vFekl!#&nAu}07;fO&6-r9n48Z2oi*mJ`NMXhLN!e&#rLEz)#U z!-+$p@>Dmy&C;s-#oSTc<^Pl_S1Pe?8^d&RH^y`4%Dj6|=Bd=)2|0Hh{{0kLx1@wW$bNtTK5`(_t z`jqn;bxyh6cM0wcA>Wma!C$bZzfL6+?~qTIU`jg6)zzWpUQ09+)X&F@6+K0*2z9Ug z_zU_k36UAKL_#ji@sJ*95q+qqr)}E#)!t=razhOb#kAFQj$nl7)P-gAZ!P~WF{A`>mry>XD59$K z9t#oe5@bZZLIRfUYx?V>qiM7$e-wOEPVkE=1;Dh(VE**IvT$seH@It;1O{IZeaYy1 zJXrBRlDmoh5O9CwIWR)hcWyzgNPtGY{>AECyp+cT??q~DjI|+fMrfmY z=%he`x>Jz|LPjik9sRJ13YlYb9f1?OOO_7Ld0_9Jzom$(@kYG83!s)Y(8QIR%=}ZC z{O+uXxJWP0p{9y#Cpa|oea^rX!VwpHScoX5E#|H_A03ykOL%kwsh8x)EBg1HS!E-pP zh?MOFo;a(8C_&z>zbU9N4pBtzHQKC3^!@vR@035$HZEQT=r})C@%)yD{AzvDf&baa z!Zm#NrmNIN0rkYLVega!e|oNxGUBEZfF!g0AvV%$4ftIhERNkmI6WFaOdv3&xQo!c z6&6TiZvG*cEcdD0m_qyV2UDj~DYM-D#!5bK&uQ}!^y0V*ZG*f(8nW@Clhea0g z@lsT`waj-5kyOx1paV`k#vh{)CzdUEu=GVE@k-$LmU|l9e5Gc?o8hTwCh3RfT>%2B zuUcoHwF%>8oFUj1-`vYQvL-7P72nCzH8UN(c`C<3N=q||C*|sBCg>=IjQCySYEGiu zT5mAk*_TO_$}i?j@-TRZwB_W+?SAXYg=?Oz&{@zqX)U*F`Uvyogtwsse1k}J&9Z|T zE}icQSbymtzGaxf`u<}WMWt$`B+~45I{OzRXO&p{9~mzPHq{mV;c^&pJw!m(BTj<` zsumCqO0YRW^#wK42do6Yi@U0fFL=-DKR4<1$bvdT;a#u#3b5P-syD9riH#w{_zQbg z&?ZJiVoDB{L1dydB4|GK4=287ho+_!o9lu%R_5R42;soIp|l~%Y!^#We#-cE4R_RD zXAJWpL-2iP75@svbQC=*T&t>gwZ8twR_R;IOUpqZ>fFr9jR&pgPx*m?IMh~9xKd4E zL=ks}LDARVm~wcCwS6PbDn%b8pGwkrV{X|(L2r**c+-e-=3rJz^`1yx$FP5tX?yKi z4kn8gAvV?%cAeexPy_5WPZG7c5PxawG{6<0$*E{W7e6JMqg+W8a#oMF7IW-(xrN*X zdA>UA?bzcZoj7m0HAPm;W{A*+J z8d%Z)`Kn;dhmxS_@0ZhVk^>P0Of7)@Z}mY~hb&WB_8=U>MWW;;EK3WUMWWIig;K3U zt7hz8^N$!(S#5+bKR%Q^maoYoXh|_?7zc8Qw_bM?^*v{*>rW##K8 z#&ZbaJxnyhOk(mHPwhXonlr|us=BV-{5#j0@UWH+=9{{_sd{VJYO+a^-j^n$&%~3} z^1*E)e>Emr}Tbg4!1;GU#JqS zPh#fR3n@UQ`t$3#*Ep`YwFs>$AwSd7aoN=-*&NiH_5|ew)A1M6s@_k;dl5-dK_ngy z#+|D(5VA?{7vMdQH8Ao}D9v*k% z<{cz`-;5eGspK3Q@r{*c!MuS{9;D#XiW59N8ynv}17$ij3gRHLA% zVi8i+G{~E^g`41p!>Q5mMsSaCthR|Rp9a*O_nK==N*r$-t~R#T3X{z^^Y{vZQ1b<) zih)j`iNBYUUW!DwmHcn{1NAl__(hEjSvF595)Z>oL2xPi&@X&|D`fM@+nsG@oP3z? z!i?bWx7$J;+KL*!SugDuon@$2rQX^5=nWQiP{ir;q%2>@oYaLkrk&z(fOxw0sH5^S zuddp*Gml>Yq#kTh4`l0zSw=C;^~9^|tiq;Rxzq8q^-Y3ws{0PqO zOR>w@cxAf=#kEo<}Gy-YZwuEE&LriYC3Z1{^ss5g3JHiN~vaNvBx7rr`j_UIPE@7TBF z$>Y^1?hm#GO5b77}Rf}?z5r#PAM8dpkUbQ{JZyVynZ!~;}wIZ%d(18 zC0afNR-OO7v9y%#wdGms+f2tRP^52N1}PI7s66Uq9tXLv;P$VuYlTavZIy>I7ct~5 zr7^7FCHHe!xLf~I2FdUzlGAVeWfaUg#}OMnJF|VZNB}(_wTy8l-z?BEe)^J1QO@gf z`|rcj&F{ZU9{eJBwU99308+v_o~T#4ED-q{Jdm1SjYV7#{_@EQWhPXaK~E5Y=jV;0 zNhhRFOh#v2jJ2wYzLC(ufksXbICZqYt86$F2c7&IkN_8F5oqVuZ@?*pTTmw0kK*9h z0`-40lm`$m!>lX#r%>sg>+~`-ss7x_JJM5UmAF&%aw+zKyW^bLAy0-|S?G(5){n0% zd5GgK$!und9>Mxr^(V!@H^!VUeEa6BZ?QPz28gq}e69wpLR0g?iS*O@6`4LjURBfo zl#!*+p?e6|Y=u~N?aT@&_gs^ei`y8!3>>B-k@&6Tfqi@CA<;cITI!%HHko@POnPMH zanCNDKYm|^O3JiqNDen}8)S7GTNtbP^Yr4rSn4IUT6$Z-_pcNB1ub>0Fi@B@zF&nV z^Qt*=8oW1R(tS4Gwv(x#JQhTE3})rk8UJ*vv>u!UJwzS-^WZ1% zI+J1jm_7+;j+dHFY9;ly&E1RqPFi3UR)2S@7W$QiW6gvb&b(mJTFbp}r`m>K$j4wd zfHiXUv`I_vFymaw+$hNJ(D>{sjHdSsKF%3X$JcrB5e(2sel6Yep?^<#m)^ z-!nD`vnUuH+x7as^OU1+9|%JOe!$WDI~^mkHFtDNoGHw6ee0`vxg!)ujDiSyRv{)B zu_bFUqtBB-_xgIBZX)t(X&mr9m_@+iC=waH1}ZCx3pkItho(7AM#i&c-}7w7xv0M) z09pP+<&uvp2@da@UUcfda+8L3=lz3gI|Pya+6Y)32~OM7_}q-5giO-AWP%RG6(}OK z_(P6*u+Z3{3@_qk1!@-lswAsbV;eMU1Sfd_{RK1Oi9ziLiH88j0~yiub7PFRfu3P< zzuvuxC_r7#hMutjME1BNh8(7E0Z71>q3b&tWm&4oA*Iq@kfvvvs(3i1=o=$|Y`Q@t z5VV1;O+p-7uKQO-&V+ap6f`__f>Et(jQP8IySLEOcazz;s^_lB4soV_y!G;bOl$D! zhaH3$jvpSj;T&M4$XT;D3zYYA5_$06G$v0D%J;?hoaGm@egdlX4)c7_bUbEmF3*S@ zw&OrMlN$PbSt1DP^LQ?+7YjXk8*M}C~?B}iGKK$JAw zsSwafY|TFq4p*4+2W+J6Mt@#=uKP<3{0kU!KwoX%LoTfMTZvzYeg|Rj(@6~EGPBY{ z`}aNfwo$B`!q-pD)) zxw5RX1r8XQ*)bS%5XSJw2lo_H8Y`(FDGsbV3+`!?9wbY<{=4Z%RMf zfT8lIkvgFesRBbh-bLdPtu^f^Dpkl0li>%i#j}XrL~VI&cccHT1KR`8{u*=9<(^8} z=TNK~OJzVPLo`_dK&Q~+bFl!6B+DLV+Y*T`$e1fzbLY8P&mDlFB-%euRmGfF92AA( zA%50Q>@d_`{++b@S38bT1ToutF7`~9qQ{-ocZ5V}gE-oQHUR5J%={uTcf})=&=w>f zwC7H2;N24cJ9_`pG7)W)a-TAF%n~&se#zbFtlBckAUf~n zdv5!|PdyJbY znUJ^{c`I=s?Wr{WWN|G_gvgIzj*BbDR)LMCB454@y z+}BFf*D#bSVrSh+81LF z-Dr^VtUY#i7fN45j$ng3YBuM1e!0+H-cW-1Lw@rQwHzC{!1ElebSo!LKJbYF$oSr@36Vu*Xl$Wn%sOr@ zx+%>v$t+Y7H^A~2Ue`SJCLm%=WSR1{Y1T$-kLYI?oS>aN-iJEZNk@122$41vDI8H= zG`_DcIh_7^AW2mR9$`e@<~oRNK$k|AO@CGD;zYcAzO6nHFGah_G^)hvX`?cqD@{e$ z4DzW$uE9>Ji$X!eYlF=V`h$ExcF6|7q13?ES4Hz-?tjnJ8{2ZBx9Pvv#jLisg!(x- zUnq>o{1W&}cbSeT^tU!^6QY}$6SLWt-Jd&*v36N%}Wtz+N6_O<}*6~KZI3P*Tog$9L z!I2`P?}{jy;A*n}w?vJJG?!q&);`F!wfvK~84&CZCNK6(VZ zoMZSe`#srp41)swaIUe2KeACXek}QP=68)TC6@hl4XT6*f=FSaLX!a-w9wq&>H=8Y zLfb86oesuWn(_C;)Hz*mvT+c+UhN5(hk}&4mTv;O;sk4<_bH6H>I*dsf@t;sFx+Ks zNKD6&&90r`EtKkGDY#x#B4x>-_rM+juDUlaniS|IzA42#=_Wf+0{kLmNJdUe+6>^8 zr|9ogr@rkMBoJUpwnQ}trz~2GODXFh+dq&epzyuaRk;IeQi7Z;9jyQ|Yo_0qfBz-5 z$@Eeu7j8oQ5i zq2e_jQezD>c4hjVoVln?Ssd23cM20JEQID#$6l|UBZ>bE7(0y;hk8uwrO7(D5MqJTrR-=b+_iV6UREDSalY66+6q(Q- zKOAerM7a;kla+@c8-P^Pge+q$Sb>*CIZB9Lx(d~sPzHffdF%t9C-*-tG2ZyEkBHMRYxq##*|DIj2n=kf@~q&Vvr@3lneNG{n)#^9U)I| zrhGY)Auj^z8K+hR{HI@sex9XzU0|ptW3tY7{$V?+N!Fe+z1Aw4@;u+&fbPf0CDdeh z7Tp`vev+I0DAu~d&xwIhU|nk&ktwgPs;*k23o3@^-0~5fC!1OoxAe*lp$8Oy^zD2} zAJ{eKYKYO(48L~2z2v<58)A;}ms?tAsB%H1>idDoqT%l!Q1$60tbduUFMsyAlT^u9 zmBo>K&lGliacheqmNW4ALbp@AL|{tO$fXN4rGU(X5U1XU!j`3Q=1^buO}MGh{r7iW zg{qQK>$AB+A*YY?&Fs|wHVxFsuc^{E-@h9k?)h&cTRJYtUMH_)%DJ&ezs47e)oY75 z+{7qfi5^5T==5QLV<0dOzcc}m2O6}4D3;T&b%$1+Ic#*}Vqg1qO}T`qNf9EivaC+~ z*IbgFKl6u?Vq4C=sP)DtUf zsvC&f_&n^}4Y!Ys^ed^Piq0hwJSe2nNN*VePPh+Fo^h3O5-1wvxSqoM%WxvN?PGX@ zhem?6ZD^C;gfmb#Xe8;&-Ee4)O@?iXvHiqZ3*z&BfyxVE%7s~HcwIt92xxm*w(F@C zvrR@{+ow#*W-&)mE9kGz+qZKrwONM?^1&exaz=o*Hasa{mAy9Yvr`n?Qk8L^wq_@l zU_y@ghy^}8lZuaE=)S3<=ABRe7)bB1BZ*JXU_F+YC7iDS>z13vr!}%{iFj4>uJ`yS zx!vj04xL(dnl*#sy96sE9Z&kELiQEC_brC%iIVaV2g;Taq8B^;Mx$Q6GmMww51M1Y z51Mf4J6n$4s_Rx3ZzbmliuKANF5R@@DHS|OH&&S5_^tO;!(vsC)O=CBtGG)<@_G)R@arvFNcc+JjnZ=(Y~pV8ThA|1dn|YL|o) zraQWc2rUf54Qwsn)lI?}d;im-iqSKJv;M{{p72bu7qTW(i#wUl4Ic}qBB*w=aFg`# zGiDK;zUgf)C8qhc{cC?)MuCk3QkxT3w~=L>U}J=qyiLPTgo%rWzm~@LI#v^`7_z(d zwU<^KHYpl?dzBaI<5?l@KWlY*TR zJs}@k-@?hAyirMa#Xn`dnWQ7u0r0f}u4P^7cA90sow$=i8pt6v@8MM{$Qm1o@_MLI z`<0kaGMUpJ90Mze^Z^g0Yu#eqRV*4i0yBqGRm>w2c6A{;8E*IM)#@i8s?BKyUqZkT zQwHiBN)4F58lhMvn9yb^!a#r^(SuQb*JL8)-M3Pck&mW;g~PZ;C@lrZVllxnj5$ob zOhEfV+#&7VM=3PZ-n@mo)wfhc$m_1C5!^yhrynJp>Iz=NsEU0xM6x|tR2Baka?@vv z?vC;@ebzpa_lzlBsAspz8RItx|J~n;rwm1&Ue_i;G8mubuB2(dEQM`|S3)FYZfX~+peoYS{<9X2#FaLS_DDkpSXe3$gvSrQ}Ojkav zcJ|!;@lYmsIm#fQRBQBg>2@(3S~3~gRZJ5Nv`jJqBQ@Q4Dwj&kK5TK0o4VZ6LbY&5 zs0D|Bbgd%l=H%8nl8TsGUAJ^!v|UV%mG~9Nh$Y@0waqD`UL8ipr#<}5{Qm&aKrX*A z1{f}H-q-i+CwcjOdr@#US{y^z7UAuL;);2VaYs{`W&YLpmMfCD-Nv_)b*3Ak9%&t7 zd^K+&cz*Vq;aXPgCZQ>}l8S=@ZX9X6GI}~HwSd~wOZrz#YDbJA#slEd0FlVdhI(nV zO^B<|+RUQkrO9orm;43(z||!Z24DK*cj-mo8P+|MS*{s@o_p4LfEefpM~v_yo$1^Z z>x?vDHs4uNP~odpBQT|PG+S_&K;sBLn@CWZnwDk)@v>2!?czZ4oyv}MAl%`cDD)Yk z9+sx0e1OU{HGN+IQPk#R6kz4xPUZgIkC&~AzVAytxL(pN{c4+*S<2|axckEcJD%rw zV!i0pEC z=3~bn(>tXa9n9iv>A`FHjorzzg@NyD*H%1sgtsrJKvoKuIAD!o1N(^B-h%1?H=mx) z^+l)P2rKL&4J#xTh)xSZ0?Fl0Z0$s`$5IAJ?&AR5476h(2g(A?S zEJ2`#z_&Z!@W&2$g%RhAj?kk_0Rj1vd-DDNrJ0be5(5q}T%wLB!7lW;<&=9)J!0gr z=A*}-reGmEs0sr7fJ=h?%pzaMJ+4LV6-BC9uhns9%YbQUJuYg?r1AezAoXBYwgo z?lN=Vm_4mL$lIcU6i0!Cjkm8f%#D;Ejn z2~(Ub=FUGgE%4G)UBz%#H&D%aLPPP??){)Yo($e??Wl9<5X`N;gQ>X(X{bCKV zjcbFa#hLf9-S!;b;BWly|J#3pb|j}Vr@BYTqiXixWAK^ph8tLD&{v2m_gOj@(!l%~ z(sc$o0!F&fgn*py{3EzwfLWmcyd##5k5<(_qK8rp+#-`yyDc^l94O-I$R8hww_~#L zc0@YUc#mIuLwcaRHO%U=@zM#DUQ6RADjVEHvjdV*>LLW<_&i>cBt%gFlUq`Cmhf^+ ziCws;0R@A%xeZlGhaKxq=tBCg4YK0BADs`M0ZOA@pw5JF&f3|H{` z-*?4pzydrW_*qg_Ke!DJdLB1-sIoWCm{+i8Y=;&%vh^8#y1xBYEW>mAWPI9w@H09!K24nZ!5)zu0pX>EQ5{y= zKXXdju(!K^_Y}CT1p_}NzH%2UZ5SidR_?BY^P|P7-5R^RdUscN9bB5QxJx(k`YyK{ zc>pPRU01pQx7%QM$Erf%78zFW(uyEGAYJ(C&Jy;nKJ^3kkd>Wb*GXDT;7X$+2B?=^ zQ^^gd9S+|n<$s|`nXhRFAvj3+z4zYzr4@v?J!0gfv=_eh!i(QTpa@@o))r+Z8Z#*E zcpWifOo8Lf4)d@5R1ppxsgpv7os{<2^!uMS<@*T&qYvZ{z-YF!(rOIzkwY9Yk{mpF z^hy3SbJDoQ$OA?WLVzE5+bRU%1)7w{B;~&^f{-TV_oyIv#K;zeM{<(#C;ztMS9@9$ zT81wmuGe^weD{}rf8ZopZgo#SlACy2(fB4!c| z+_+z9oaMd|r|HGzIBYBNO_wmP{3KaK#7_8 z;F}t?j;DqUeEeFsli_0UD=wLVf}2nLT+@nUAnq1zF+UUEI7mK#A~Y*dxgVlsxyP;z z%}z3T5x0=4ZHf5*M6rA@=M{>8cy~ufL{foJOBBR0l zzkx|tE-k|E91>p#+&%;2II2H3C5RXbUFGwBX{R{C4!b_@S5LCLK%l%OuK3me7Bzvq z=~iw{@e|2G{W1_y{IjP85wtV$A4W@A!H(5C{> zxOW|GKn3Ipa)`7ppR?*hvzHa!gYQ7ypLaI*YX{*rFl)q3LJ5jeh@%@PrQS1p%HS?3sm02g_@1SPeG)5R z;CF+25Q!8H?a7`;Vo=(?)6_hD#4)558j`&=X%|fbTCj(^yR%F4LS2UnZVGqLd27}r zz?T@Kyt4xgX;>`rGjWN-n6!M0TThj_e6LMQPg4G8Cn?jU{2S&V(4}10oK_P8{NOv@ zVpR0NCT0H#AF0pv<1mD$JYz%?0>YHD$B#T_8Ni`uhaR7P|Ia5W19|Z1i2_kj2}=kx zIivVPN1vdp;mIT1kwl&1%QY%ZX5thCN2S%IG^oq#%t`xk^&l`R%`phM=Jeaur0gW+ z|4$JFpU42Cay@erZKXDZW7(}dWLbvo7r$77-JSa~KgN*W!^Wl9|g&>adk-X#aqYS)LPJ_HO$0RNmB z%*p6?9u-{uf3GffR&K2>eHXj5y0ipMSlW4OX?5oW{{*?Td~#`L$+@g=orEBLEi!D{gW-sQpN3m4f?%pjBvqyun>>+SbexzePfx(Bl@siyjaU z+{%NzA-I|i0#tZdfLRlX&BU3SkOZv?&lP9R0NQ&nfaMCR0$!aePMzVq3-I+-xdC+o@+(CKmey#2URhe<|9^jXX-|eAzWmo+JE)-t z>WLWspxy6F5dOs;gl{8%VFiIBMl}YZS`av5#H2Kvl%J&u!9fUVLHNqkoH06n42s}Q zq(}UoNAZQvMW=r3v!>twteG5wA^=JiBokB}4$+1HyP!q+2$L0@zV;-~)5o56>H_l@ zSYC2k{NOpxJ&kKlfBd?Wls#g^00*0tL-jrg6f zS7Q`d!A%kh4El_)*6apTqgnUFLUD&zja@~ z&RgKJh)VFPxS^DR(1Jv!yczl9!WA<{;$m*XNZf0|S>pd1*>=xUU5p5GXvDDThC|)3 z;`&(zr2L&V1X9Sw>zo@h7m;^}Uz8(=+o(Xvfbfb$LLz|1fa3v3ArSG4vk}kk_Ggm( zCGF);Gbk8j03U@VIka7iHME zp|-08Mt$(eL?1jFcoaChaoqTGS|AceFau4R)n+L;Y9B-!@U!LsW-3PpP1ci2jkow| zkI7I5*1$<3BoGkr0!O51%qhBRWzG=*+clbkCRN(TNe%0xOz@WW+qDoe6S=~j)0}SR zlEoc+9qE!>+u2*&rDbxNZ;++cTZ?7BE8bd#JNV7vwT#QW&Bw;_`YMSNtKdt8??5Y7 zmv?rS`8yUMfcd;9Tn694hcsYzcqmw$JgJcZ2$0a++QCBz3lNuOm^Hu~RR?@|ND%^Y zLO^kJ^*WG%l0X2!$ciIq&~iWqd$2RQdzc3i09S(}%VrBVn)faX{y9Wp#syl^g&?lm zSyN_gZZ^yR8|jFC7F7+sP&b{)IN7S{n^$)!l-RtC*-@Us63*dax`2XLWE2`s5JCqv0ch`597TkLJ@st)AxI!2-AHR%p zk}^FA|AN#cMv&StTI4+Hk|HISoe`lseB4EWEs?b1K)0PkM@av;61ey?z9X>`0;rLTe zAAj=raZ487aweFldefQDQ~YvyDou@m#<~!2iG#Q$guX?UobG6crY1p+0Q_2yQ>Yh7@!@|R zUpipvfmg0>Riyy*+SME2e)NMwB6zMBp2lY&mEkpU=*Kp{-STB$@`tF1Bw~D!gA20o zur0wK%n|$}ol-R|a1)Aa+>L8MHw!lsi_6wr5r-M%Z5H^1OI+z=OP+M{&GMrOk!eN3 z=wfhzi>hjGa4F#O3X-InPLN;?itxiBum0T+|1K^mvr%fP0dHuOBy>>`6E0bTA(r*S zE+7c#8$_$RCHZsO6GTc&AN)d}HVyQ5zHERh0I;0N5Ss#a;6IA}~L(OQ-gxA3{7t)Z_?(rKgzE_f12S06QundSw-4;aWM-n^h? zn(5YuMBU;LK#A6}rYX%_nk;;HWodbBX@?2{-x6zl(=V+rEkPDw0e4bkAEv|?ox8w-m zn3)8ZaO_OGq~ivcM|f1JD;fn^=Rn``?~A7bkvmzfalj6A!U*^r+~E8<?zwCFNfu5P7M$tMpTac+VC^6vx$`;?t|HvRtp66!wjgpr*IatIuL;2dV;5CS=Hkn*vo zjvVEXkyjXb$tm&-`~dNU5d{PY!nc@%;1MHw5SXOQ9ZXaZoP#iKG5SxB;5DanksieM zxU`N(3emPoPJG4@-anW$G~Q0rgbEA?Q84cgN5GTBMpLv@!E6p6xs@9t;HLESwSm(k?NK5f zX$0>ox%`ME2gqQ5maq=kmGm}%tDp+f13VL2 zg%t0TpNQEiG`Ns)WJ#+g=}ZPf!1^IR$Y^7bPKaOGCMdpe@$!eE1=54|CV~E|9Y#n^ zXoP{Gp1#@?V%Xj^*AoApYF?CR3yz1;F{ho3UXwofnstL7nP3zmA?|Ag(+WV3Qo~UN zpM19muaxgZl4{kqof$sM#`36K$@fmS@RSJjUHGT~dQpPigFvD>oP`YayARp~PO1uc zxiQJ0??3`)CloamEclET%%(M`Hc-*Dkf1MQVAx8lG%%MxvXDA#WLLtSb1;I{9qGYR zbs^yH=#Y~Y_^EDNBN~ighm656;v#Se{2epMEsrA6$4qomTpS0Zh`)7W0e&Jl8H{e% z2`CG!N*qXnrafUtJvMkDw|rwNjn`kS4|*bA@C8FY;27|&i~euxiU9)Xxg%f4$OSZc!BaT)yE>k)J9U$t5kO_}yKeqkuMu=0c z{z$pi?&&?MqDlGjKf%Hi+zG*(M&$4jDTJ``<^?n9dy+c356nVgusWS+T#0E(*7f-! zN1%^kb7>XXLBkAiWC=Wc(vyJ;RN-I;jahz+^b%PFe5bj>j>gaLB~1Ji81vwzOx$vb z@|?g!2j_EMJk85CA%LsNDi|Tb;g+v=E66QeY)@h^67p3fxZnJZs~cBUuY(DUvlqnu zW#a--nq|M`3)c;f4o(JKR~zSKWv95NM=_|Ai?2*@b)$_djkga`SYG0~p8MHA?m<1P z?&f4l1mbz)th1Fv8mu3@2_qPU!EwyN9jzu~kV8~Q0{T2zhc!bA&Vci>dq5+Txvvv}kHYAhZ$4!mHBE2jG*(~&ak`a&gDftGd^c|hZ+wOXazG6L~xI`EMd zpiwwpq$-Xl?gn2$E1o$jSuYaMvLawke4TPZ;Wj|?>~gROu7Dy-{a}4ne9s}xJdg!& z+L);)?Cwz){L7b%1h6b1@E~{;4m2-G7GC0-Q}_W#jDGw3-!fn9-+9d`w;28O=T$*K zY*MBf*nhBp_G{01zK20+&wRNCA^30mPjl4}pYewe9XopH@uRSV!+hu;{?Z{z0@Lq* zyjcYS?f{pNKoDS|6_ya#M_osx2XsJt(dkoFLa6(bY*MBdf*u5#l;tn4e}~&x-*yfH zJqV+M;24B&|Ni$hDL;Ze2p>A%9>s&i^9dIytLJh@qyTEzf{szrxV3a1bUI0Ij?cq~ zrV*{%+-WSQmh{ZJ%7hg(E$AwQ8{PR9@y}%ov$#$1gZnQuDnM`Ew9vs9A~#%vJfLQv z{Gsn$)yqbM1W#l0wGZfO9+X14<`qg6pk3hjtbDP1P^qZ`TU;CQt6gJC;nRP6;3!c4 zM9)am;8)6b2kv_~{zTlACL#lw;+u|o=#qgoi^8{yLa;XB2>9EZqQ36-@>FR73m5v~ z@gS4p77hIJXX%mE&pZU?q={bvM3W*Btnmw$2QFsZ^M#9Y0XH-OoWBIVZI=V!=9LTE zH}lbt$Q4+hC%!m~)h>6^J}zYhZguA)jVtp8=;)5ybUU=xKu>hb zvQS3ias+D&!A?1Dy8t2*9JN-7)C z13#d9!QdfqA(iKjSj%g7clnYIPlz}jjRjp$pL7klCY=JGb$A6&7InOwS*eM7=<^&*)q zU<(Rh;+r+hplSr-WF!S!mt+PERpwoJg-JgBv0j#R0nV^FaDK~6^>f(41#$l1Cx1IR zR5W7+Jkv0`WAP-K445^Qu*INt%iqoebtgK|HHhx9&AqbKO2X+ir;S8p0gX!v3`h~B zq)<4TjQMUzz%R$$BA(Q&K#;KY9M|nn`S}?noW`>%_*9c{B8{t5?3RW!v2(nc0-~Oa zj9}X6U=TgWb6`nJ#0E8VO~iO!mFU1woA|@+)ktJV)!vd8qm?Wy8|fR#BP0bLvsTxpW@GqQyLuVXNf=Gy;C9!cHvH=b$*r+2% z3I@E23mY^tn*=Y^+JTWI;%p`(-!@0A$NnxmA+&xJ_ zSyBse$_0QBf^}E`O$gjBfbWf|j%_Aycf$JmF8D_;_uZx+>r6@s?(flqkXwvG5NeY0 z&yngu_^~|*%q!+N&o{pDY!QU7!VpUAL3rxeQ%@Z`N-MFG5DpbV_|g-SgeTC`@Bdkk zat%kYO<`yc8S$&fyu*k)PCZ|AsCtyW!-ykBG$~6EzA`2$KkFQXZ^#c`pn$;tOc=sX zQ$e7B@EZ#VzvULAe|Z$IIsK3;su8cXh6S|XvvkB2aZ^nlT#D(KWTx_oKwJZiR-5H+ zd{%?FGfeG>DNTR#PxEc(l9p$!+sK^&!z13sf^n}>n1iUv-ZMF%4Z5j8#|EX{jr+9d zw|R(0g&Y4yUAnjlMX2h*t7xq%(r)21sxS#Oak^N*QUqdj9%AG|XPO#B?&AfTG_XD+72cXaTu#Uc2GOTMvO_>yp%99S8=CT^0nw(1f+u?N#nkdwqLD22+>0@g>XaXMR=hq%VH5za?igkUD7#1ASqgiVAO80)yzaSoD3)3SV^ zhu+P zlm~zDD(gcFS zz#cT=?%F!>-4!bbP=&!0@WAO%cGv>+fc}HU3haQ3jhvgdSYP3WqdoAIT`7W`K>4_w zmwup+OIL!o7&SqlN7*Ar@6v?838Qx?An>pA9xhl%G67cW($DTUQ zFtei+5NIl9ma@~34{=rL;m0WiOuzqO19N%YMujm)8KLrEpYmf+geQ*56AmBaZ_@(( z^pjRA2L53lYo(e;fZ@!y~wPYEfOk%FiAPC~b9 za`7t4M-dix2^Jsdr}E;u!Sn0p1!N!(+77{H3?b6}&U$f!xTmE9Btf!`rR(4zs^B-e z+SOua7PX`4jDLS7nfe?CV65n{CQZ>jtqs8mE{zBh?JMmnjrbYgiN>!9G!1a+TsLE= z@t9D5|HA-S;)Yi>hMCBGAQcerFaMSf^*WlM$@D}9MQZ}vI4N#GGX^>vOU25^-Jd?N5FuLx34HMM$7QsRyo}1m#F9rtBej83hOxe$Zhejk;-s zwnbOttw>XTFvXi2_!y{^177Z#F>yfH^@L5n4}262dj*}?#6c3gNx>3N2RQns*kS{(E@-Jl`Gvy;NTlnz zn1OhXIAKKCEsC$UoSfsgWDgTLG4W1{yAHy2rnq?#{l?KJae&6Xs(L3~G6o$$)<;r} zkLL9XvWk%E6&`s*ax5c_TGVTd1R{jx|D{GEAkJ!>AF2LQH+Tqx0sz8VUS6l2`AsB~ zlO+HVgON4Wc%ugPFZ<~)6+n@yC2rdOWsf6Ko`|J9Ab;@HGaJrdrl0vd5MTf2wc-Gj z4KTRkXR3n%{PcNTli<(@TNnJDuAljA7F6MOH6-w^ILra_+G}ELIK`=Rr|lfZ(4pbC zKl#@zB;XOAL!Yv}xXS~+?8m(+GlV@FEx0*-#5lEr{owoN#AOh{0W|W3^eHQ7vIVq} z0azG_;Mja%ij6EVch^n(tnaO`0Kj)wEiJ5KR-pkf1Lmp)=T9#7YP9kqH~|NZ=8{^% z_cJKXYfgVFLGYSWdJt?u_=j9``XUUW1}Q&l0f93{^dKO7v>$((0>YC=pW-l3^%V1I zZw-KP$aP0ifB&N~EsE5E6mMYI<07NOPaJ;CGK7bgC?HUnfFeA7^y#N^jgcpeiXc2k z0Re*WLgpa+m^laxLVzEPNy^_IbJAc4k0e1*G%cN(MeW}FkN?~M^8f#jS03(%otY2^ zosKjKjDzio=#R+ll6r`>Z&Jqvtq6y}3 z)Zl1vKpfrv>~BJmjLsDA@eFRY*=#k+C1R{n4r*`i4&_-&+q6N`c7n6YnKn94aa9ti zZ~=cs7KI6}Z$2{cP6(+Sy~a|c5EBsx5@+Z3Rn7G>VFwz8V6-@}UH(W1G$O8TDg0`O z?aoU9red2mXnHrkJ;8hG^Vay6)=7Bo`QXi>~7r0!>fHce4HSFLH5)apmDs<49Dc&8(NIZ>sRl+nSNA!%lI3PJtaFWB|=;zD4 z2PI_nC%+~o038)F!*yr)L>iAb$7ffjCed-|K*#YvIk(Hl!vgVZf8kd`^Mz8JPM*~f z+${~Yh=&;1(V&ZHtr1|nk`yILz>_TarU`Knar`=(gd&haOr&rj@mrYbm%X?u8F3x0 zI3|EDwmdBXqO16)f~#YZa&)U*!Z2dLgE#;=Jwq*Th7s76EpT6>gvl21>0L=v8qp4` zpN2{Waz(miq3B9QCb)47C51IUjp;r9*U9bnM%7`0wAP3Np2zh)%L%9|BjBm{qTldb z5tb4Je878C#q~2&K^(w$OA&&(^-tT*pjb~Js%B?4I7(V@?mSxxft-G=a11#VcrGMj zYxd6>iN7}ZME=Pi99v95_TV=@S^0*UoJzuyNFgCIJTP#rS|>mYBn8cUH4OrudVyKw32~a6mH@m>DfO{qCD)<7N6Ge;N1+0Jzjxg(sT_VmTt?uotf0TCR zxkwNwAUH|+x4GujCS^_-F)59sJ3p>D2+uo7`J2yj#;7JKf2FQDr32wfPX8Qz^01%s zoC-R`Vv@46kZm=7Z2J8_Z$bbb$B%d(V;_P@9MaH-K(n)FjJW2MBStj{;VV4{;hAbu z_7%aWh|MI`;PLeL9Y^UlOo{$pTo@Ud0gLI_c?o7ng6gOnTC7>poF3EpBblTOWoW(l#b1YMM9 zM{gPwQ3&4BLGD|PtLoB3;|5imz~gN|mSK5{T9v>T=d}r)>}eH(4}21R5z?nxL}o#< znFAKF;h0|#kaiU=)Kq{N!%8WjQ@H3>5ngdkCHOy1PH_Cf>$amQl?b$?Dr_mZnRSgxaYS+e-ghVMV#a4b zX%gZHS(wAbd_?W&9 z^`wFND1~ciDOks&H+iqt*fD9Zc zGpf*zL?9V1N+m6DTZi`@-+Wfw9QZlNgS5ap0R#bjL)>ds1^DLISa|433g7@hqU3Iy z<;(xPxO4$W(U&}+_Wkz9Q9>mIyR#X5za|;T6V}X}!eL>|ky;bC$JjzdaK7#N84n3@ zzxMs!H^kOP0}y9u8e7{!0#s}znZ0Ha_9KG>>^ttDGE@!nd)kx1HG8}J3!9efh!Nz0 z+&c41_TUC}x=4JNlEON@35)fe6Myw5wS#s%VpO*nF$ZA`N=uV61mW#*#OQTyIen2M zM$bL>90!b^Nt1GoQhu5vM%*%VOp-tY!jZ%DC)=d_nALzk`TnPhFuTO)2~gRCFa(17 z0o3C0LmnHmkhckzw;y6$~XYFTy~<>5Nd7Vis?(v<{}G9^YR z-6PYXNJ_G4$MJ6&cB6R+TP%&nCLMBjTSH6N|-B-P|~_y2kybz$*YihMzC?v zlBWtl)~X88EP1Nlh&aRnT~ZCz{$kD14rxm7qYno9nTZijnne{;@{ME_smhj{LG>fA zd2drDs#7_a7#ZrX6v*=~nIH(J#dUJgeg&(nahWlgRG-470h3lXa z_x**vgp?XwBKASyxI9)Ke*7={-~9w~u(xC=_5S?+X63{UaC}spP$_eT$E7K6{~H#T zR~yvKzD>1Kbp$VsUi;EI`8mB}0hueT@Rk(xni%8`nW|btVtANpa_}Mw2{%WIO9m3J zWlJVXewDcCRtnFj*Pwofsy2x0Wzf0<@Zu7=y^*A$Qt}A34`Q(75vHQmAR`qcizB2> zX#+8@zGJG?Wu;(h50?OJHqM6Ze zg55f6IF-Aq+6c|-z+#$C2Aui%m=0~v_p>3PaLIzZn36=LoVisSnlc6~FNT^EFEIgF z!G5{lrVLCL)JmIf@dtT}Hc?(GpJ}jo=~kj?bx<-?QsSQE)EY zI8cE)0oWUF$_HvO5~v{c0<)}Ck`HjrLIiTz5e}ZXz+7J9AsR1O!K{P;<0X!%o(0^u z=VqDqOBS-Sb<1&5Ak_74q56;y=%8ITAf{;s$eva^m_n-ZY z3c`=6Akc&0E=KeKvyBl;jO+@2{<-I$Lu^v^@A*fL$Phfu%+*DQS!eXrVY?7K4w=%y zq5k|I?X!_QKbabXsMP~V1g9u_$Qt(9c)!DJVk8BTAyfrHitrq}oPOnNbWT%2;3Q?6 z5VC^s;g5fcKoEZZN1lW5FQ3*5LL;Bd5-wh0ntgTY#L4XLJEIx$_PRxuSp*h`2h`sK92e%yPvyB$?fA`eKDM8avmp;zH6 zg;$bXjwIY`U&wno$e6UduWAxU(ial{m;^znDn#m!dPF4C)**^sJd zv2q8zU1UTG6>-)8^vj~a$)~RcQB3HX&`B;JaliP($)w*ruw( zpsYr}@k+`!d+=1h!OK(rtibkt3MsrKp~1LO3;AfogbK+ZtfsOb?|5#gK_9E25{a9{ zBuA)il5|M4M?IG`i9z**Hf6GcHqsPMMixv(M)m8cX3$slZYDGw?- zRCKUBe18tfjTo!p67>WdVHayRrAr%Fs4zQ2%wmQaAWv#SW|?a2#GgXNB^b^=vNaNK zXO@;onkJon?6|@KtP25|L~m_vxmH?y(`m`p*v=MHl9yc#4L-ws1#H@~#D3fbNe0<6kL1VW7ix7#u;Krn@T)K2n(siobCtiu1EXZnIQ&62bkwGgjd_sU|K+>;3=lc zZ)C1=eXvei;3-a+ZZH$yfoBtC+2U^J_X%9?*9T3rhz{;d&qJF@7B^s0| zAb1SI=f3c{FCf$|SYq_$=l_5Lf=i5`F7_a>#^`U}^&n;1tAG08Pg!9^1%V|-|Kcu2 zpUNJDMof4eNEkXd{4;#GBUf=peiwqU(b9x=aZx`iE>Kw{bpa)nFS}h?JqjPk$R|N) zI->iFiF6xw(3l#dq;6ZKD^XIw!BY4qraNV7g;JFva59N@;v8-uh06x?QW&0Mro?e; zfBXKOeztm~742G??F{ZEUeYOouwv1nAqj>R8{I2B2||?^EF~bAd*UY0i8`{sR_UGu z;W(jwrcx4Z2|=NXu4od3tUZ|0TNUy?_oCTZW+2X0I0PWG;P`l4rpy!$#D#$UC=H@l zaGPMRZ&mOrNGqhO^}@CJghJ$#4E3@e$y$7jYiYunbzTbo-( zn>$bk;%uDuKsa&8#jSDZ1GS1RYZtfTP`LZx1RVDu)eygR%d?!RJGep8CZyul8G>9?k>8w{ca4Zg36V4!M^y1Y6wAp^XU%9|}flikg5 ztLa@jgJZ^DTtP3*FF?$QBu!B1X=Bf#KF*oUiBm3!;zUgA!7Uzu#|di`6Tn3niFig~fTzjqT;HpQ2RkPL$bFE6Fsj6nTyvx(FiUKpykR81 zi=D>d5#B5h$_U_A6!QBe3CFE9M(y`6WETlUZB9@rJh(w4ljZD`^{TY^Oqv}XE^&Jl zw2AxunS>(94SceP5t2>H|BDJj_8_>#=%+uSf&f8ymoDYl#E1gIH<*swgYeuRe32G_ z*yGeCMn|6YoU~`3IsDl}&m6V~!P5*5yP1(?gJ%A(ZiHhH1U|!<=w@c6*W7$^1$`=g?EVRENH|@`t2Mej@#m5UV0^l zC6#TYNCM7neQf3`ZIlEdppXE{6hXKLjzuH^Iqgp@9^h%~{AM!Q#q7w)^>7J7y-wWs zE*#Nsq&;?_2!fK!lghmm_gU>lX>uWxS!n=n6cCI}Bu*j(T%!~{NGbeIaex$q8k!Jp zwLF(6ey4o7KrTH}WtyuVq;CJ&U+$Nn2IcxxHJJ=`($^%=Rw5d&pJ@9S29_)`i}aT+ zsksVw9-nxcl=6x){c++7LG~0 zJy;E|TA~v_c)Oy43TJuI#(UFq&hDuTFf)jK94DRL5OjB$9PDm^Gv61VE_@n4aVPAv zEK1m6KA&P{Mh)Jb()tXwLyn@sSP!2n-23~gZsE!%7KSiA&TNG-QA0>_5IFfM@Tr;c zARXOFQ0&xX7i319pE}knS$>$Yp@Q>aXDCf1zBNuX?trZs^PACd0WMA0A|E*Ki3>^a z7zdbz?$(&ToexuIvh|^dZ|0$K81Ovz*~~3SLf~e^WfX7;@o^-mLhiI0Z4jH$?~G(W zGY_n;19TG-OWZ&)O1H(&?!!&>qg;~Y{V^Z!Z5B`0r+(4|3{svhlxc?l6-fk~^A}B^ zM_AXVbO1E3@>~jpu|7aR^rmDWPE5cQ&J&znkqVc5#Aq&*nkN7_h+yDKP5Q-k5)8a* z1%+E0h!%yS0k~B_NDrK$f{Dl8NL<%uQFBc+AOx2fefcY%K)?iDe!!6gv>@0&>{g`DKFbm#9-Ls{G9k`0aFx;i z`M=eKMojD-l;A+>2dquvh3t099!7@_9Y)jMz(HxOF``MC0s;~zDgOaKO`N2h2c=O$ zfFEQ9;U_^5{tv{Hls}CJrLEU?rMb)L<6;W~B%ya$V6;@3N31fsvA+JN!^0QW-#fN^ z<3)0#Czft54xOtZBbQk)zA$_S_r>91UpzcKC9rn<^78W0iB7dBt4K^oFe&ObicS3MO!Tc=%K}Cx?fBsgtsOesTHw&81gXd7aPBOUD*?s}Z3W>gKPO z!;dq3+LxWdc}HhtczDQNkp9Qe((;YvrBfZ}{J-Rv+y0AVH*cIH;+MO=G<2FVMFwl2!bTwTHgA?2Mik;UV7`TE5pOD3EcJHbm`=)j^cXZ!~)|MN7zrP ziUi3FAPVW@nodc_E{Cci6qfX$@XX|;a&x0B67;$pYUZD~*=k16=#|sAonQTBD=jG~ z6RLDEf-vC@&?UwL{e~Vinc@hA>lQoEAG|+m>$lwr1G43*HR|?cHe*d9h-m6c6kc$s z+61Yj8k|cf9$caDq!d9YG=O-9KC3%HuLp#YTks?(VPLU_WEpAAsq>+y6WN9sh*k%4 zCLa|-I;C(g@C=J8sLdurNRuvku<{RHV$>q5`De%-43mIK|D@lYiGx^o^Y8fGIl38V zx4O&_*!(0``^;=%U98aEBI5x|vr|mnZAu7yD~?=xg0|gY8a2B~V#>+;=9aT@vfOTy z6dsw$ac~23+<(eh|Fr!FV&miBT_f;uX7tlz<6VA==viQ=mBfj_yU|iThBw0~C;j4G zuyHREm}y=PZvXXISA?WPFkZLh2OKvWIKLCoruf!ow{UZE4+wy{tVWoO4kr^-RGMQXx=)Jg)(qoXFYxW8!j#I;{cxtRvApp#*62;C&V#h7^tz zUXplv2cI4{ApgLtoRUg#H)gX^0T%Ei6e)msjO4n9m;S7S{V)_EHR=70m%|VG$GJ{KoQ}2 z7=kCI(LN1-`E%AnSwWz+nr%*h8oLVu*nl(3HT2m<3tCuPgTf& z&Q(R^eZ2bGx4*r%eu4Sgt5*R=DKN~xrOdw`uUK7(D0>wq${&#}+)RJ@oqoH4Z?tgk zYUHn;j?}pt_6w%`FY&&2J zcNj9u{M;smMG~j{6_o4K%)9%)-1c_;axmXg#D$C`$8L}7ZW+Q zecPtsn%^9zi4Z*R5T>3_W2o!9GESX`?E zp&jo}(2=F^hNRxv`@lxXI%(#|ZQqoi^UbAZQ ztoMtG!|2V77M%8zSnGe@<7Lo7Ut^m8qb0)*clh7$^yrlXLufW;Wh|Y1jKoikH`urO_;7D z-*iX2B2_#{N<5?{tunK4^T9mt*?xbzYU3(Y_XH3_wr_(sm1kjyA zM;07daq`W4I`GNFQKY*}sFC0Ub|6pb0O2r#Ol?`pe1DwPKH$?1L}PS9Fs2Ll?Ns3A zbWG@jWWqQ09eCFJ>wuF=|CY9JbTmVs<@dW^`2ED4>U$6yxE6iO9HY!5H`0el`O}nvR7T}B*Gl#t6dh<}wu%XbzpZbQCu|^a34v4qd|GE0 zm2>=Ep7tDoli;OhJ|+&#y!w-5=i{lZ7XL)jU=@M-0Wu0lpn^aT0tW`zqZ~a5AAZO# zMidZ!kV}lBg1|{>oJ;lxtn7IndO#C`P0F#0(dXa?OylW5c;=bkI|M~IM7e;Y(m2rv4HU5U3!03JHR;9{O>)c?y~j{7RCG6-URITVi;c;0fwP_QqSt zFV`2**B7qV{zeNp^9u`CFca$+ubRJd^(q8m^a{Z8@;r0lbN!V@7kKg2x30$=Z`qBA z_7B@we;+%+$kXEAXDa{gAPTj{$d@fI-S8gcWJczlX~(^9b~g5IK2grdF>k`aCFiai zc)aw~_V)RB-O^3pZ9V7r01|{nf&ArapChk@z585!K-}CHzHov3{QPnxmfyOv;BVt3 z{vtocJaNoRPi}M&eiDA&>n12ibY9y3ajb#!*7b3m24~;`Z*Wz7qI3R=cerxp%E-2C z=xW~RSe^^rCkRFo1oH8LEyM@*Aby^Cu;xt}eCN7vX3W6Ly;C4i`|rWM!Q+5f?t>ybIgY)T9d3axMet|S2uJc>f=N+FHG00^HFa4{LKyf&mzbAR_wRUg+2SO?0 zI+h>mx^Fe#`+vB=vZnL-QRgRn0-hm3U}@4s{!_)R*H#u7<1ewa_R-3|e`=~06Z?Kw zs~mSdpW&mmYIDY}-do9LX4f&T1rMOFxw;v63M(r=TDiL>58#q7w5yMt;`0LhXg?;A z&CFOKgpjKdaPuYlZfSG?IWX^q!qlkBAp+&12{K#q?_&+kIwSq&-~&}jd2K@Vi9A80 z^(uC-Kd4PjO@*7fl=#8Y;x*GZRe{GPgqPZrcHH@hYC{*=up{1uAy9CTHEi-XdT{nY%{@)K@&RxO!6qQjF`5tD%?M60 z?vPFJn&~@gT!2>vJ;0d74_uuVXR~m;!b`-vO*ZuXaL*e0JewDpDX2%{MhR>-_|_S5 z!svRwZ>It-WFRU9Q#>%eX+F3>HaAD!5h=HFMjpBSms+{s$1#yHEF8D+${5}!s^QJ+ zm3qC71F-iKFA;y>jpPE1dyvcl*97|hgYgGi8K$_-_xXFj41t}8{({-Or3B{Y zB(ZOb>tD;30&%qBi_G{0$2YQ0P|_m?B>oE~@sd1i*$amYFEfSmAmU0K5l>ct5aCC` zzyv|6VgtwRpF)*D3fYBYYKUS0?sUkth#Cp(;=XN$1wFtWC4|A@m@8jTJ^NF`|UgO5|2}3xT3yLyaBVsoHFYQfREz{X6N-xzfN2n`3GlW6C9d+X`Tu7#`>Q! zqZ(#)&~09|xYvUq7g#3o{`%u7?2>><--y?<&Cs<)92mhy4qG3~VNS)5ksXT3E3e>f zhxc|hz2>|dbOL)~d;RuJCUv7gjy_qf2N(+wIJY-O0Nw{6lxJ+8b8DN8?Im9K;&u{@ z@r~`hU+%s5<)8#Z03&&FvvQmP&bu#?Uc|(T-%<%mfzTfFQ(8h!x`(B4BGq!pV zw2WU^?Q~WccLl2yL5LtL2vdGwMEQZ`HmBS9rhm28sW%XwPnj|i{@NJCT#T5l{AmUnGU0c0F6@sMv0%#Qj4u@b1r4fh1ky2GqxRSPloc&h<$wWC- zE@&H`8z&#>Dw$}5bgTQgr2?65yOYg{7<#ES`D~h#8Hy7)g02UWcw-wJo%trw9H&tE zM3j~^{7Ty%xKKfpDpR_})f%7JG8G_Mg$PHzulIrU+O?W!{D-ed=E6du4Y)505H~!Vf9nU&2|s`naRb8#;^_|F$*A&UxC8NgHN#rG74gA4Ar)Ey zS0QzOr~tSopM+sD5KwCrET0i<&$HM5;#!=}>_N-ldsAcMfP?|#zC>@Lob#ip4WNP+ zxHw2WnSrJ=*K{#*D~ zgPVWwYRaWpViYTk>Yy|ZQsy88k5Xph{pWuIL12xM+noNvmpw}PIsT0Q9Q1&{>3Yf}DDez13x@~3f$(Z_b6YXT#!kB3+cv+TvnuA9Jd zVteHUS12+6I`v30ag-U`!}X#0`Rm)ViwUOS;y1vBFA#4(+*p5j?Fv)h>V^)2Fa$B# z_=mR~xDmso4sYbJA>#GN@PZrjG6i?-8I4|MAN~dWn*Pbf#UZK-gf9d#%uh$XAvZ7b z?TRT}b!n0H2!8DUu_5nRVu=uc?tf(i=_~_F5L~B1p`hb0ciTqhV+_1qT?i|@+p$=1 zbTs}h{|fhgF^(?qzHe^F8yvT9cmd~h2LNaBcKn%tDgGGmhj5g+v!87=47`_#mui{L z_v5ec9palS9q=jnSIoVy-VwhHPy|7o8(cO%y|}n|PDd$%uw4Yf4{XZ(iN(c}og@g& zn>v60tNCCL$R#J)Yw>zzA)~m*i@jZp2-i;XZyuz?e{#wfZjjsw4s|@xQ+Zb|;UN{(E9xpG*Q1J12dFb0^M@#*;u$ zl_1PLkhcHq?;80_o?I0fWUl;56`n}bCKtbBHzWB(>2q>mAB8of#D9~9#)^~o9Jv@ zAR&AW0k>N@J#Y&LE#8+b3}`dm%3r?$%vIw2-nhTQ$W$LKJX;NPc+P5!xI%#6NH*a3 z+1WRAcHiE`&Q=uxF0iY$NFXjd0JP7*9QZ75;=9C&r;w@=AE3|V=s>ZlaN#=xN(EDs z<_!s^%SRVJMb2d5Sv4rCFeTpIlC{71r*)FD6@-7G1%W1IdJsG*%_T-w5IAC>cMgJG z$~Gw@oRsDgqa#!he%~cVECYImjZR%&^t4A91}=w7ejbs*mALV!?SNjtPQr@*#4L$sh)7&P70YDeF!Sb)1^R1*}6{q5^>| zGWU9jw{GAYt$;sXzadj_*ekM!$2sibIQV<(>sQ~py!_VkrC@}@q+c9<1pVeSjS7TbcwsY23}`3Gl7*qIKMwZV%uLXw?;if>Wz)t_zWBM zXNvUSzH;f(9TzMuW_R*?-gi6RAes?|eFJwM;?r27qdF=cu^W+#ooFzyY?9}m9gT#q ze7~dkarn1(wc=0iTwaYphOX|fAaH~EW2bQ%*={Qc+wb{@`BQm=Iw-B)blW#A7V*xS ziPbA2$XbMT4+5|4x_8dww>$Te5XAefF@Eh8-fykrl>M9FYyJ`vgx-k?Ndqnr$SB@t zHBpRQ>$oebBN>Gk5*37d%(4AIm^AYq{%Z#rITmNF%>#h1z2j$`1mPliUVBVVkpv;< z@V@71Zw+n*f!xZg{0O{1&lh>+_?o}#<(dxtr%=*+-3fCKmOAPP}_W@Jr;qrym z^c}UT<3-ZZI)x*;<<*uyxnN`sW3S&Nj)OA)WIHb#X;6kRAv zVXVq_f%>DrI38E!4xZ5~pNyOQ-{pvVwYbj)SNDPhD_0eP7S{~GApx3(4~Pn6((BP3 zCK6A2`zF?;BE#|u-%fKP%?T2b(< zrY&0+pbA@sNB8iKXSOL}Hg~1~HyKAlMlhb7!39a`v0w*I$z=!04+O+Fqmt0a3F}auwT=!Ruh>#FLRo0mRQlXut&u&O6kK zByp1&5*0ltTzgO{q2#y5lQ@*qqzPYm;mmy}opu>G%eR3!PEpPS5@ZbcG1Uk6;4@E6 zhEO;fAx~Bj^jXZ|O?8L~f_xJ88A0Ji5^_j`n@f^VIHR+ZIeCG)+4~ej)?}?f@{5RA2t5c;1n2?BIDa8`F?t??z~Kyk=o%w?5dK^CAkaWT4}wdKBnY3* zla%{)gVL30xI$_}ml)~zEakj@N)PA8(G;d!-x6ONJw69ak^+k8O~JxFY@X#NCJM8xDQ#aRR*fWUX&f z%9&t3xDGG4d1s!MiOxKnCh(2%iIbNX2q6ej)i`4nqy6PZO|h-2>8rsMl)UeM29RTT zUm1o2kdwXE>Zm~E94Pq0boaQUb#Yd2}efJ>Z;k|qH zh4)8ZKbrsMYisd-K?CBZYsZ5X#7zIBZpe!hCl_Od|Ap*9SiHx?{dM7$z)#@bGbc+x zk|5k$i4P=XA^y_uy<$eq&vwdl5>_P$xy0y4xv0m*LrD;bIx8zLPMql78h9vgx#969)U!L~F1#!p;pq*Yg_Up5^*b-F3yX-X>b-Soek zc2Ad>uQEhAsl{{>Ql(Q;c(b%gQ@S#V7otV)h52k&FQo50l{SYl}h5UwNpu_9Fq+4@a8RIrzd&NfgECL5`2d0fj!dD z2`&l@V=vR)Kyn5>J(h%Eh6@~80PeisSQ%rsPI?Be0ESPTxQQ|GaS~}w=6v)8>%_N@3Bw!hcHyik_Zz4}XyWXgH!Q1#r7JR0nP+$fZroa^q z3B+6;$~--j@sr)=`<16A%y3ObZg-~ZVFyz1{C>?yFXZu4#1`u01L9MY;#<5-${sIx z0>YP*h%prS#?CG|13eEgupq5`TqX-zjUA#u{tab$Me

-3PqilwL6>6G1( z4%2_YGfD_hgggg!FUfE!%) zPyXL$hIjtq0{6)6l{Oy39yX5Vcsd3cIxmPk&PoCHV+7$IW3H`V1zhIcM_6d?w7zo! z+;;&zl?@i_=Ks|%7rBi{FX+`?Ox~BYPw$%qA@Gy@4jV|UzuJHVkWV=m-4G`dN46i3 zc!yV3%_0cGcKdNa5NtY@Py|6hq7OhBsr`u-M&S(}sfHv$&~-fNPJCehmwS6swkU$o zu0!(IGeVa71i{R{d+e)TknjDQUy)k0tfbyA&rYx<9lJ8z|GY0`Bf&6c&5`#yG1ie7 zl6jg!9F&HaKYo26D@jH?UrmAlzH%oBf=$X-dw<4%)lb&MJWF-%G`Fq;+16I-pE}?E z{L0F{-&MR7<0hNE2}){hBjPphZ^T?8in<+QXf~5|9>e~3k}K3GyAz-kk60GeFA{{4 zQ4s+zb>e!JE-~A9t;sF*lg^~k+OA)}c zbg;Q;w!fyxLE>BkgRrqjQN2&U>)Et6uhQw(^FR?i zc-CLJ@+)ldvf>XaF=*U4951HRdG?y;CSUvBo3tX>yZoj*AqDiNso(=W3ILK1;w&W) zD2bb`RN59lNZvR&ugYgJgT7ZdsTwj1Cji6StqKG<9v93(Uci|O!3Th5$w1)op#ax% zY0^xPgjo`AgUjWUA3VACa-42HMMpz@O9^+dU0A}-lWU$=DDR%-`-SThg%7^deX=Wa zh*Jl*ro?CJ`^8J1@cl}BCKvWm!rR&bAN$U?tsu~({BtV^2uqAU#Si=ZO$G)tE}2Z3cqM?TLDIedX8WeOM;GQL6u;p^YXa}fR{ml)AlP4@%@ z=Vuf`evYtk>eF}*LQ_7-1w-XGrhtd9Ipr$a5Og662M--EgtNGKx%U`-=vI?gmX5x* zb&1I$coGEY0Qsf8al_dr{Wu9iE;qUvr!~j08aE6u$_(z|67RJ-Pp2!*!y8b6+@)3Z z{)I(em|G}awT~IGmzl&y@q%&?ftOB811LzWF>OByN|Q1_?Bx^ZJ6EfM!2BK=!dcuC zdmqf^w7&v)fv+MmmG|`x#5a;4;7Aa%XTm(GQHu#1en=ZgCANKK;7JfR;^Qb8-Uxyq zeaH$zc3;0lh_^j5yufhs-|R>sd~P`YwtiI{w!i;U?*ltlP0F_&)S>8*gRCGd!yeiS zLQ#ae$GIX1xzm#W=9gX=8blEC{ZcMvXF+`4izg;l?H#Wdkgt(YiB}wn_37okjM@*R z)2~(lOu!U6E76BtJ;@>?WIo8m%H8JHj1PhUuQ=KKQ;*0k>UX_z+66&z)LX3`BEgmF zuDX@G9}89oN(PWB5A>AUYryosxf*;x z3qt9%El{|&_&{d0i6oG!#*`#hcyWN%sI@-Rw76&hNV+|vt%Rzf17%8=9gMeUESPN% zYfD63UR4Y-&~1)pOS~c%E+rr6<2@uFM#%)c7_C8xsZ}igur1{UKpXE$%B%Y$$h97p`^Yglm+0BMA?mcVDW=M@>k81p;8_O2 zA;$5l>`;r1rn1VALi{_**@J*63t-Mxq?R*qY0nm}6<0?Sg62NneL%!rQ%xqI68Azd znGEki;pvxDg#HA|P{UNI2jV;nS8Mm-<6~R?ZQY7N9@EUyBLXfcz?&$HwS&JVdQ+4fuZf(A^C!zT@``dE4)o z#RR`%5(@FTC%Zd&p5d;H;cdPf2>26{JA9M;e(X+y`z?}+2fi~4KD)CM_!Cb>=lccq z2A|oQ;ro;A30vY@Q@a;lVw+Re82yvG7{v;s=t1})JqSNw7b8~~{UNjPZ+w*!f<4O5 zf6;>wn5p~s{3D)&@Y%!9&`A6=T?ooyX8BKh9x^S*`{(~2bkGXy0rXI8b{YY_2Zy2! zfs2X+T?ibM_BjtqLq7jG?)RnK=9EQ7&%29}+nmy)oCl@7O9kPFKXe--O9+1y=OB2J z@~4p?9DMd=Niu_8@Xowzf~x=ECP6GQx)FrI{pQ8IOe_Ge8eRHV6$JZ#9abABtz%Hd zG?F0XFe?O!>+lAf{K?;KkQTVxqP!qQ*nxj_oH6qsxxVK_g0@Z{ufoB@a+KG32PTE@ zxY+0-H#^hobv_>z0H^x3LWs~`4m_UXh#oJ!k^XxpPo7+j`}T0}n*<^7q7q3EVu{f& z0FbPlj4=J|tUJ`3-cb9>A_&_XejL5SqC+P^*vJV#CfcwI$Br!Kj;xB>`7`<3Qjx2X zwVC>z*ZsiW-#(9KbyLpId+U}uw_TERM?SEfJqURUvnD0)Q3N4r#KL=PID-koggWI| z5ClK(iHKW*P$MlII8vv?dl@bJ3TOTXIKI>%2!fe?ON=HN2jXWMiTTtMv307qrs5!F zAzGWjI$RzA9%nV9;&(kJBTz*9B4JRGE4-ck3s<&8{NE+3Ez!tR+6M3mtp_xGwDDcJ z0P;UIStjT+gc4IVsUIxAJ#Lh-sxpXXpBObIg%&nhcq2s)G&QWEsuN^T4qC}fNhS*` zY4E|vwl!O+R#qvSQU!(3*}kAD5i+E7fWnI)b$@>(169@wu;~@9QwKK(t|@sQEYSi;SUj7emyAd-9MKh zeEn-*{|Y69uUbNIlhfn}N9+vnptNV7dHUHy&gKt$OqwNwrw+MZsG0u{I0r%YfU;SE zkro|3^YqjI>Co>{i{L=!XAiMv$&(P+;q(afAlj6_^c+11@D$o1>{9+ZZOU$9kL-w;+t%7ICbpU`C=hiiXcdWki(LUIP5W$;xe<*=wsk-{`eDA4;&!7cxh?rWblY{ zaTXis^$kyRdpr_HxD`7gvquo#a|3?*5FS#DIF|E&8yglj1Xo>Rl(TfA4O^4v$Ky}_ z@3S_&Q!L>@+)Z~lsDk(14lwSU48x&SLFf~Nq7v&%-gASW20{_C;D}mcR276=vV?#f zyF8HuVY>(hMuPAXiM6Grr3V7B7b%V|!n+>b&TW_^2*;O}*q?}!LVRG`&eR#?n_6Y) zbuxG7Gwy7^&Zx_93SPnUF86pbh=TVZRok5UZyx!hMG$=b9zl39&TKGVz3Q|-RuUPz zYf(cGa^zZ#G-brI$jC~zCJVfD`7&c0g5cPdK0z4H5`rIf5d?1?O%CsQYpevp_(k9s z?T%i%cKPzL)jRyI=Ny=?uGRyoglGTH;m2!nw#+Hh)JQM!5t%6<~ywOIkC=&vnQ~RO{ni7FB zWmC6!AsYQ^J>V)&K+$jI*X!>!)13V)sbvC~3QOn2L_A4BBF;o)OhrRi=DPeZf@Eq-5rw` z1nx>ExdxIaG`p}#+(bU3n2`fA>5JR_lbR@{GBSxOOcZ{Wy_0ND06L@629CZZbGU!D zS)K&0D-jvk*9=c-+LQNB{B;vcytsr{X^|S$;^xOUX=|Q?4#fFs*{3W;aM6*T+aM(% zjxCjup1AHC4Wv{!SGvVZ3U9*p`_tkFf4|C#*Y`^&wFwN8q}=b9j9e+8q`qIX9=n#A zLEpb8`Ta6Wl;yj`XXE<^jwLTpI}IR{um%6`Kk3fyZq0~G5dPR*jN}K*tAF~lpZxSg zdJulVIS6r*@}C4l;H0!KfAx9xIkgAjOSC8-`Qnk!GjIQ_M=4uGfE+wy-vAT+rw_4O z=sz8T5$v1)b7tCrU5vQMqZvWOK1RM8egWlh7o)?Rr40Z0eeYF02nbEexr-4M1jHpq z@4ov3IE_6BNbYj_X+0>73UCUCVICk4+py!`n_mgnvvil&iy$a&;S*E+Me7V}uGKgF z-i*m5k^r#c$C8shlRr|7WchJkIw7Ncd`nhJYp-ND}VKf zl}gv#SLmUe5Dg2w@87f~4oMJ_DGcSwa6t1mI^#H8vT@9&2xTa?T8#og9th{GT?!HN zd18`Wrk7Xo?)n$@#~bH-BYDJo-j^YJ48t`udak&35;xZX*^(J6wE+oRt6Yb;wg zNu@fugA;Pn&$~|$a^y9g7}={5c;&sYejp=eMv|5UL0Bt-fU{alj67bO#65lpiw{W< z;?`@3x4r-!aHFLa6WQ~8ulNM_I~tRFf7e)HbdM|dD{2b{YNg3m*TG=>907$Gq6-jG%2WT>HvVMBP`O%Lq^@i)5s{2$E= z7FPgAVx$(lXo1?yuR=GHc*__{s(^q(4ABjc68Nvtk18g5xLW%;)@F{i;vqb)3~FO{ zCoQ;d6fRbzK>K!`5fzw{y1ZTR=}HilH)}~@nrTdK>KLiQWA0BOK?^>s0R|gH2`VnH z#Y=V$iuEQ3<7(;&94ZYv=!N!nB3)b)lj2+G=%BErb1UAjYXihgH~J-Bo_d*rM0W-S zzDbuSJc3FCLpH~_UUriuWedD35Su4~+Zh2B5a$_NECr9qBN`aFcQ#xS2k?d@05`&0 z6<%^bXhO*V{H(a6+BHztA8rAFpLOk0;l5c`BgFTuVj>2sIHZUFn|;jkhrxL-2+E}E zXk2<^OLLx&);lPzIDo3WCT?-1Z94|30$OF;A+<^`(+zI6@HxGr;31^z(1gO9@1Nob zO)>E|#Q)9j7v5~)@%@4(?2?&Iil8@Jpx-aPfBF4V7cRXZv7%;EY4i%%g7A#Z z#q4AB6x02up$HIz{`_C{u@y$aAfOLc7~&}9r(*L5K>%r?E--S3EcpAE6+uF(_6b z`Z4Zs{z{yDd-B*acK+O>Bna8h?Cf~qrO|IMMUS%6{HsHwqeC|wIr_n)N6U;nIYg0R zk;L%Di$_5gYM-QfBm7)q)DFu+fj7U-JO$dCtb zonGI!zG*#wiYZ)Yh9((|yefM*<;%{WKEG(@@;7UK4-+`;FL!+OmH6czSJy$LmoJT; z;4^>JLa z;*bOZJP87D{9-4D#y5O}#pADDJcgYBMzvr1+YUs(?dP@M?rYt#v~D~?LF znVQ@mD8&YpG!+!47^yPItHOb^{e)V)jms}KP`a7@qg6(gDBPfMrEqm!%066QotRgP zHcluMrxPru5sekb};Q_ z3OnmEBUH>@z#BS%0BWkF@H@!Pzm;zBt!S|(flJOW-+ppZuD#05mtVj|-+&R%`GHN!{Gr}m zjA&Di6-Jztrm({3$mgCt!bV0eE_&v$$C@$0KlGWW4|%GAdl%LGUowE-h#9v*4gP?` zlP(0hlsSaiHAe1p3iIHI1t`Li+*CCy2w$X0`T4JW8OrkYKm10WllE?&gCIYkNjZBE zqQVYru!eq`#G0?MLc^L@Or=4`bv%Syu#Fdi{piBglI~Y0LmgNDAgPSms+}@#^OKm2bJg$MCJeCqn12 zox*iz5=f-*$tn97z;>u6py_Quvk6n~*d$Y!+1i?MnG)n+vP*_`Pbq{8lf;?w6VGf; zj!zNWx&Xc=Oq=ah1c=a}_!yB~Lm~DgCcVW_hNmTt@YR#FYbZ z#JKPZTHIu+5`DfO%4~9aOkY4sCm)vhQXDg^+gH7qepAUL`Nh8C$0oE{6Vxg`z(SWDnZa& zZ-+&jLe>F}a{qt8l2!Y>n5^T<;u$i?g}D3t!h?tFj~+jK92ErS`VUtw$4}w@N8IPS zyx=aGW3UI@YfCvrKYfnejrD9GPC2)n&_#wRJ##wK%Ogn|w(GtxKHea#9)utW>t?Eg zz$A5e-jT}>Ho&>wTq0)tkikZ~i;;Hk<9N?tZ;6rpyxP_L#Wps+Kg>Af=4*kM!4H_qY&g=ebpH(Gp_+gfMPBrKE4LoDm(gf$Ub- z>R8D zPiM-6xUuB}jDnMwa>fL5R=g3@l7wUcsnabop*k}q4XDjmO~tY!VzfA~kBPr8B+fmR zND;vq#LtBILdQAZ58ND))@)Nz7=Q2p48i3xRl|(X-!PAkd|30f9wEUyW@}X+e07$+`UC3laos2+ZA?!#{h-EsR)SbeJAx3kb~m zz4p!jr39^zjS>S6FkB**D8VlD*yWUcPF-T;Va?AR`5Xlc*+Eng;0J7C^i{+qMjnLV zISBSByTT}Y5Pt41M*lEmVdAT zH3OX)C@Qm^bN}n!Ya(t2aIfw6z3;tL0rF|u`~%{eQk+ce2*P&xR9G>>8BKCjY#|1< zdXo7S5*02^qKSmVYhkC92i$ekl{rJb>6JZwjh`=156Emfrl!{ZI27le=W zA@RK7=+vsr1~A}+Tj&B_3439C5b=rU_GxPb5OPFNGAi*mr(N0DmMTraKi6gspC>PZ zIUzHZIy}e;>sL4Ct(Hw$+*!O~ZbgoqFtLkTwPbhjDf}UrGA~J!zvnY@%=x3RE;b&l zQ$pt0XS!E!b_*Av&m7^(D#zyz)QO2%*fsLJh8$W0TswvhM}m+uhK=9&@1IOGmQR!1GFBj=KdYiCGJaWrLa7zuaQK+ZUO>m2VX{YpG4k&XFy7 zeffDgV4AbvYe{3}4Yf8i^iWk@i`5A(84#$F#S^9hvX=D%7>Tw+i)xR4{BZBk&y{Y0 zct{YN2AZXoc_D8o&)8o6e%u}lTi#yD@K$&@z-aKh+o^@$25*D;Y#|*Psb0Bp$|){n zQ^Dup7$-mOnSwvzyT1I*V@qeeWlf%daWXvV&feLURejD(8vO=dF-v-~J@G>eR21l; zwH9E?Pt(On$vbA*F~` z*x~=@>00(e=1CcNDC!%vR(iqp(iRAs)6l7z>ckJk6BTWJavoF zKhvbl*R&TQc#-lOZ~W*dt{}Yb79(#;d-1C;e&tIT65$Ka+oH^k#$1$kZQ5eQH3eR0 zcA0$QFc8xS?K_7xFDT0x_CFSyspz}mzp0vVXRy$VynAT7r7FZPh~ID+o| zcXMWHooTIw!jEKrxL?Ho#ee!we>}lk>5MLw;4tc)LZd#;0g9c2qBnI7nu+#yFd<6^ zHF7z>{`GH$Cs23lV^nd}vS3hKe%`NU;*Cq**?O}jpR`%?RCGdYf(EO)zaPj6){3Zt z{`(LPRzsi(a8^c$GBC)ek>TyPUQredZ6FYe1WtWmqZYolYLffpUL&%qfOzo# zzKyNv+$2Q9wwsug1Z-TAKZW1g*%-?UNDFxWk7L);4u`a^`+tM8{4o>gP9ym1;3EoN zDYp(kT`xE7ae~=ecO3&BI0*tJK>+AL7r*rcwRN$(me!8KTes$WGIyuWXxve6hNG1J z=erM>IX_848DV@NGR@{AQ+;~m zBKMQ+^D5u+V0l00qX;N!`@S|6YvIQlnI=Cs*v{3qdhKAXWnVh?|*j?Et-_6*_^r}%WPN<*1=3j$ZA<)$>G%eT2F?K@Ks0#~JZ4MLif=~7l9d=hU`&RNy& zFfuTe3Oqz|z~J-!E=+1<{d2*=m%o%S{J}N;scug*mpjuEMy!)=p5ateD zfN~*i4)T_h&kg?meXIAw54k}oU|>ejdxNQwPPLfWIWtc&`hRZ$ZhaH*OZe$6U67A% zFlJ6ME__PmX4XpOLF3zr0nH7A2ZaYY@|?3bQ&k|4Tp$JvD|jhFr%&L7XM8Ho@}W%1 zo0}$^@uvN8_<;gu_Va)Y3XF@I}v25?bTA|FYlyv3&O@kZFmdIzy}N)m3>E zLBc>Ond?A~fSFk>T8e~%MG$}jd~^X?VyZ7-W<$as*tkElF$MR%D|t zwSsZvkw)UIB1q|-)NAAoz9nceHEqa)@;o}>grssbl9Z`QO839(*9+eiKKtECz5ftz zCDrq?!7$L^ONWZv6|A%+f40jMZ0ii>hFv&6Qp$s}yddZ{2Xz7!({7ADTYakO*0y-Z=Gx{fL?S zr8g)|5`dc)c1*UQtUU1R9saI8%e+dy<(?uN94N?}QitDwU&B#?HKH5T3D>Xtze4Fc zSS2v=G&7?B!jBv2$c#}Ee)-Fb?4@`h@9*S;9d2>K0#T*lnMO{$!eVcKT4C5bJlx-BOzL24oRb&x<{_Sn zHv8{O>|Fl$r^)FYRRYEdlwbb$)wblmxZNuCNd$z40Fh5~NO7l0D%&QD|GuzRh?{>f zZ85S3;cM9Mxq`qJqv;xisRe;8M%f}={!L**rG_On0Nz!C z`wq$ua26!qhG+c%o(M=UGZ9SXezzF08o@9fe!yQUB%1nVJ~s<-dU&J3m`Y-XTuS2d z2C55ZMl%(FUwmmuMDW!CO!DdT^()U%ohyP`bwJ1r4G=GFxqQvaDAZRX zEOsgx$A~3Tz>MXES}Fsl^#Dg;oHzT7!vh`R6NU~TvRY7{QZH(oit>hUae^w0O4e;a6Z{)|P)TX0| zG_W3i-LL-jyT0eA`qqQ+K+TVND)4-X+cOZ}?Lqo=d3olMyjku}n05onkG^Gj^#Y#Z zOKJrZGz0}rEU7BNM0wdzJ|>UNd4j0Ck^eU{l_{9KN{Q>c`8#}g>&AiJD-|BP(a1{` z_-}`Ccth3Tv8UAbeGOoSrf_)<-N0@ncuKc=WblZ-iXV#!zDM>FXbi~8gjGiu?JsNN zzpuIN%1g|6gD(I5oX!9HVovG&zb_Sp=_%8qp28*7FYH|BOvHDSwR>1aDG) zgKzEc|J4uv68km+f$PY=LPs$AfRA(j1%JBGm@Pl-{Na{kZ!373Ek@5=;d-+tT|V%- zG(P?>pa1^%&a}C~$si?i4C-{-@+BUAeHDd36T;J%pJoZ++OyAHd*<3Tmn=NxRE6-u z3&@o(f0<22fAUo{3{A?fzy1TP7b&X{au34qe==7P-ibDt8wx;<$r!5#xG*dtkWuxe zDuH;5$p)04o78+i&^%Kb^qbqM8Aj%qS8Cw$sefQx@;<2~UCl>H%&4#x1_9-@6!iM{ z)d>L>tVJNa^}aZAz{#S62)nOj@YA2SDO*qt$c9&K$XkFDQZixnYHjU^Y<5Mgx^wE6wkBx5z1RhaB8Wf|9Y`z@n%L+ zmnG(=#E=It^60Qcb%jG>Xl)=3(!k1MTTwGdghL2zcr&3E7=9@XR%K%S2yp}}34zR3 zl4ymE@E5En^pw*w4$`2R2rvq@!0-!OwmUSda4-ZWjLfOEGPkZW=uM*p=4Lyxe2+E4 z0om&_}fuaS2;Gw)~;gE0x!>cI-FCD<|iznU#AYZ!S zm(ojoE9JC!9p6iC(l}5xyfl@j^0*FG*L~WgI2b>S!Xqklvt^3<-HF=Y&TY+LV~tY$ zsoy#7p#Fw8DS)=8tD8L${*(lM8+LPNZ!;~$r}C^S(8J7GL7o8bp8n&LljCEw!QrtQ^|ePM|ZdFZRU1`hm2eP{Xg{YzZbBL|33WO ze@UgSR^TuCL*@a4h^~z0j|-Bp}X!7^x!X)5VtmaiI zDAEI3;86mI8QE!s%hCdDRula1Yx@)qqn=|t?`RAYaD&@2w@V)+NTa+2kJag%a_ZIjs|K5OLpR#wJo&Wy-lx}YBFtRg24FTW> z-ouPt!Vm{ur2O==SFW5eo7VfA2c<0R`5e=QFp2&_%ALHCY;H_!yIkEXf{39c?+1{H!8Qu%)VPtkN# zc&ADEBs}=!Nu2s*EtzJ7FI&D`-%3@hStNJPGD!`>n74+duW= zpM(&eNMeZy6*F4*4^l(8nTYRvbVK?b?n?zQr+#XAAdd7srhlT6fp31Q@a>#NKD=dJ zp7Nv>-hU5FJqrzg_J940Z~pne{$mQ{F;P=vfphrZj_3PyjkD$ZvlO>1_}*lnWuU{s17FB-QzfF;=|Fez`!)q$>$6i&L6Ojp2+L zn0~>RC8`+SeOWc|x6Bwoxe(tHGmcT`Qxhg_TY;%4uAEb6wL6G{lQ>HxEn-v(6fYJO zELReYQoVEX$!0FG`~?@UF{=Rt;hehiWWyzKmZ+8Zmcy7?ubGrjV(P4S>V0~0(LiG< zK_{yO7^$Y^+uuTZ55%UPSd=76!0LR5kz(QR@7=nk9*83_Zj4kDs~NnOmQ@7S5Bw_P zh)6I1X}|{$l%M_KZR5la;SUaPKxBP^%7K|Y(+a%*vWkW0TzMBCa>~2Lo{oIY7;y3g zdGm8U5haKV{m^fneS>4yiga0??7iMCPp;i0QaDm+C1#D-HBp8fx1cekv`_bj3<2@wIO-^wn3 zM$RJQ>mLd!uxZd{l7${*yT5$zTZm`>$RGCfkSDi(sDr{WoB}2LU69jg~Zt3GFA- zjTm0yBFkNbIF`|n;q`GX#F>Iwn^fkTXb`o@nik2!rE zfq;GGt6$-mQ=1SbfuKBa1p#~Rnr9eYWnA?p1lo(IFZ?H2K|mJt`(L=+W0b2AY-UDD zc=s~fkuFcyrE!YUlTTmv=u~b&n3@o-(eL2dNpwg@AADiDCykrZzK#9mcmDGGum9EG zU~h1Ykxj~9`@KmZ{NpF_nA2XdA6GLSBYn)y5_3Lew&@`2m+51+O<(gmU;Q?Ckj31G2e0!MXQ`Iau zS_zhsvZ;CMlLlJUs0b;g{eTyVSzPd~;2<7<>*szAY-S7+CT-n-hIlW14Kvhd!w+NC^zPHURz7;J)Nk-il}DNLLQSnxAz z319Nn;hp+ct1;&Lm*N9nsmQ2o;JhTFX2p=9)iam@sV!R&>~GE|f4K6AhKxl!b5fZS z3Cj)y>ckcnyra8`SU!Syf$tou7(8nXH!L%HguEecFLjG?y&?gY z$3!2VhzaDG@_L!_nx$d8)eTF2H_G6Qmq6QANODGMc&qXTuWJK5rcCrrznV77pYGc6 zfC$*tEYX{=yEX0H&WZ6kZz#hZ*jP#W?caH>>*ceUc! z7u6ET2GoN!9Nae0Xxnls-lw2#?}T5NzeFqGV{55e6t2mv$*-9!Dxym6o=mwZ@?o9! zgd;9pVDce7btyA8AW#nk4>DD3q!k&=KuDk-7}T^4r&z%60#>dR!2eEcDHK|$sjGIj z{abax-+!3?{nyR@{xfjqnqdC-e@{=$U;6>%orBjb|BKHPIIFKZPGNWc--k22$mXE( zo8?a@F)`hw>=vV6{OT9nFZQoI=9E*6e(*Qb3Ib-6GR?sLgZ=ZLf5H7dT$J{?Pfr&i z_;35qanul>@s}?>ef83lS5XI-`Ov@osY@&god5m@EmjcF4rmDl1PKvY;SvJ#s^g0C zfDUL6I(>FpLYU4^vPqd<2zn4`QdYlw`%gHH^>yz-pa&r<2wsEmwO{>;Cgo3H55l-R z-^VcpXMCKoeBX~5oqcm|%gV2vJdc7L8hJvS8ghD(iAdg>B{NLEs3Ky8Eww{@MuIlq za5P)7NWE76qu5)kEAJ-*fLgT{PhiMTNM{*>A1DccM1lCeT(ki{$nt?mz(eAuC83KC z;Ys)f*6m4#_rmChi%5`zG?N!a4H)roR2Luro#xJ%BnAkoDj0+jabTq~06t)p;4+3Da#^r_0Mx8^nJY#hVW-aTqqLDCzssUyPpEk{|A(2&wv#P+9NBhv| z)W7?^D1xjPJmkBdA=1e>`|qJd7Y}YI6CkH8MI_1szHD42;JsTSa(Iw^oCgd{ z9uUlaB;ZS+b2R|-+|{-(?OT+}{)#DYwlGN;zZ=|AbHpre~M6pXRh~hwr*uIVX7(|4;UVkYEB`X^E!-bgzBU@ zu3OJ41`!^Bm&j!b1`;QHg-CfvjzU_u5Z)37Cl5zpX~s36gZ+>6_n$O>|HX^H|K>rf z|Ne_=<(GfQmv%9q^|bN#TiZSNOSxS^1cEz^eqj#+0)czd-uRmz{LS~j&ou~Kgz)X@ znzR>LK*&vLEFgULbGZhAhb9CLBIRHDz5JLZ1l0lhz@-BZF6#F`zBViep)v@*ewj6g zNg#ac5^D&E1C}K&)BgMn{}Y~KWMi}fft!>u<$*m29CJFh82tcKAWS!_1k}>(9ORffo-GlWu+as2NNOqQnFTd@ZRMJRiN3kK zg(`#il#)7PqLx;F;cFN2mOlbtcFvo)4ADHi6Bq3OPtE|yYt$V{^rnO^APAi^KjVeN zL=u6C@vTQ1m=Z)YA6_gV>fhAQc|8*Yygh0on{cN;4oV3BrXak-siiC+{4%_isgv2n zObub`(6qtNzx(Bz6t&P2AhW1V%)?hQcydwGS`+vL?Z?d*7G4(qt(UW5sN0K@I%`QT zKIU}E3s#jKf|i<;$F{}OI~Y#)Hd7;!M@npyf-TwBun8fr z@ity1vAM$%#GVb*#K(J&!ymKY@OZl1Kz<8!aw>oN_;f1`)a+I|ai7xW4$B5EHMkS$ z@d^Ca;J4tx3V~A!MiTgd;~@YBFK$_#k>NW;9{F$pGD2P<+W$;tqE!I$Yx354zkli7pt?9>iMQVL#BeodPq^v;rOm0$s-g^+fs6Kd+1qA+|i9+~6RuEi3__+%R zzu*+3fBr-sb9#QukYM)R-{=f)sui@*xKb-bDXiwz0ZDphs!G9WjR&|81P1M0`Bf&r zzRHg0vbSQ^6n#Fi6xS<(=An z!OW@-DjbR{4GiSYJPTWv7K&j`T*O=K*+_lQQ9c|oJCw*sjp;qmR0Q`&V$9+M{4WP< z&w;+H3Y1CV!J0{@^`%Ux$(N}pNJ(VKQyaLYuoqi9mFITd`*$C${wB%hrcO*gF;H6LzM|! zbcf{|R3B2JMsKGZHTcI?0aXu~JlMa*M-du@?$FxIj^K@-fDY1Pt`i!JeqP$)T_osjGf2lz5lvB4D{fH(6b{Ku1 z1qA+e-YrHfARrLDNZFf|-Rkoht|j2#^`CzB8kd<}WdVVvV(wD*HsnhjReJeJ76Q(H z|Dy($_N0vpxknje<-tDXCy)qFT~#Msewsg<7U<`makWBy;0nT|5V+OZCgm5sCyjd$ zUe6K&trK)uqY&spunFOxKB-%broE*f*m1VB_A8IaArM`(dQe;Pzs?9IJQ|P4N_i`f z%6H))JCBGXy=W~V_b3FJ6zfwWWQKPd%FL{VrmM}*_KE>#S`D;R!@pnNKyEU4ZNdA( z;Pv7A=LeM6lmTWw#_~+4E*qp!lT#g(Cuz_V?!z;Ij`Ge?t#3hFrY+Xmo6sb%bV>w3 z`Ap%Q7a5w&TNjes!pwlM`nJm#(rCvSwKFc#~0krDa_~`M`_pmCg!*gjw&ibH&Sy#Cm-q5zzR(0s7reE8=<_e3$yeIJ1#%*N4NZ^&42mH4I^{XE zp#ks^AeQ&IRk?>u51Qm7>yQ@_4xT16b~-WH@4auLSqPl8#DcfTU^4b@`u*jTQsms|d#@UfMw80%LRf3Bq89s}NX3$f2y?*xHeo=SZep?QnF=Kl*P@%>?k-sx-d- zkMTP$0GJ-ZTZ9a6vcV|7;Vb50RTuKg0g~LnJldfLpUp+7l|Rzm1w*ZKNg90(02Ugi z6$72Bz|IH6z?v%!4<2ONyP!c0#B1AEl&t)xnbJrq*%z+ z;n*Rwe?Rve>f8LCGy#YWSuohI&}GPzjz$ET`RBWZ%GOcdE+1z1rn}@UNx9agw`K|6 zoTNM+BZLQpDDTVve$Xtud0q8~Hl3O@R0WY_9F-*VNa!Mh(K?v-r|#z5>kMm6 z#_JozLsZCD798fax6}&v69kMtrNXD^h=sDC3Fo}9N%Q66fLTLvBS0)1 zE^!pG6dKA4XS`1;nRDJd7YsF(L~X&FsR;lCt&PnL%D)`B`oW0@%=kGkY;UqAV5BmlHuy!O!BlFJ<$#)ryrtQfe?~3E z71s6u&Cpnkjl#uzoRv{+t-SSN;aiZJ^T}(;Ul!IdDh!Pgdi;H(vz z;iIK$a0o+%)vUdJFQ5DOSU-rnbBlTB_N_z19lzV17`&ur86L*wWfFp&3l#%d5-_*= zkc`d+(4o9jUUWbe$9s6+@>qEWJ)PzK@|QgD&#{zE84}b0Ab~tMyaY-@tPTFqgOj?s z`-ZM3(8KSEBLPG&;rvnyA1Y3>DoncA1CB*S)WZL+tZNe)+h*7)bK8P)V`nd2(rSt` zs$LbH>*V~dV})UFlgf_Tf-OsDyN^BIb%)C73F{J%PmgxIAr5|8aCp4S?j?8@AdVCc zC-6IKB037vweXF#6IeG5ZJivAwgU-6K-Lhl;Rplk34n?N%mSm8qX&wLIe&D0oTaor zEg)#1@Lbn$_Xxc};krDJhB(+-&p}I4cO}B3CYU4^0GN4rqSjXBTI&{#ssmjK$AWi= z?Ac!PPQI)NX#M+#>)%gTy{sk;Z)tMF!q>V7sppsiW7`&r<;meqjq;}E@OT1%B9RmW zTJY8Kvc}$|%mRWpDgR;|b4rskdyKp(jjcQ1neIXOvNtJz>3Q}TO*bijW;*7S4uoge z{d4u1%YMqUE9eq~o0Po^*;eBx&VTp+cs1Tfvx86|$_*4jh zd}`MJW%k4Ibl`%t!NSj&dWh{29TD<7LD zEjljTVdMyGG15RVW~#N;=Y^HlHH7BQJRMEG_0D_Wy>|~;a8E68>-KFv^lv{z8@MJw zxSfNGlm&-(ZU7JLLca5GXoMSw@D%SILX0H_cpvM2&yO%Z|K$%S9z1=rQ-Dzc;G+l3 zC2)uU_#4#a`7P0f0&+X0wZj{J_KR;|z6U?+^^}JJ#1{M@40=^TE4sZr0z88VVrYYp z5#<+_lD2D7ys%kq`y&3V1%Z{>Z?ZcnZwSVBn?Q3FBG=>cu&)UR$si5V1|K8RLLH3l zFgJPliNMMx%Hnj;_B~K`ztizfPGXt_1zJN9a(cXT!qNnd)<@gNv{xewwzrPuw<0)> z5?FwMJ5HlB&!!QAshS|-*WmrM_Ri%XNDS}A&fM&mHX^}6-1Sw0iouJYkL+(o zDBPWT8CYm|0Eu8&hetwOKSC2Y6bI8aYIm7W*WB`Oql$*Ku>%^{`B-;Zibjnqo8yxBH9lfM;B z<+rgEoTk3R)Z$H~iMtAf=@cXGLC8gEX;M}oyq+ya-{zFludv1Fg%@66gVE2jPVmXhNV%nL8Rd#%OFY@*?G2gFutAJqVs+^vP>dt~Pjw zDF6*w;Bb;nCdBzBJec$K8+>oMAW>_EuZ9pOF<6KJJM~LTHKIZ55`~}zd55bFqYc@D zkl98A`F&wXL$(&RIoEtHaAI8B8u=mX0) z2`iEiYURo=YJS4cd95|E6UI35H|IP?ZBTNqA{fZBEeTj&E4u$0n&hFgnQ@%5TyfF6%G&pz(aDrz2zTHn|y8~3l4|} zX+vg7fc)T49bnyVX7~LtCmxV}K16}v@)N&*BW3FQmL$*d<9l6R3$MXrHwIrTf7q`l z|F9+R|C$^j1IH8IEkyFf+(pG869L0RSaDjMw=-zrcK7*q3O_TdH<^y@d}}#owjDAs zW2qQ+m%P<8h_f6V0}9FKdyiKlLlzMI{+B$%F`z;7?cC>)ZtI$w;1xO0eB|2JRI8(A;*WYqF`t3w7iOe$p)t* zc+DM7)G%0q*o{dL!%T*qj^0PY^KnTgVLf)b^4PLsL63A=l= z9$pRM#wPgbCWsBxMDC13cEJ6^`ug2}7;6(K5$}B9WmEEXjz1y{ks$DRB(Il48*QGQ z?IQ?0&q$s6a4Z}MnG}%-Kse?eNLt^QKji0cBKo5ea7|{dFF-B}LvMc!c&p-cp z%qC_3J^$J@6@s^!xx45J`;4BtGTm}!oAQ&iCHMOu@0eNcPiBol*3|<<1h*)A$r|zL z>Cd~uAx26N6+&-PMk0KkQ%<=Dfol+6L>_$GCWNdYyz!HtVF-j@{GRt9{L?3K1tEf< zGNDNelz0qS5+hUPkZN7bY_&RAmX^DXj9N>}Lz5h>F3i$LwMUCI>Y{~N1BJtciRrD% zzf0_;(vuP(p&*>^YDzRDOY~XFhE}zpm8TxPZ{5cjr-!f#3LBkZGBgCkeGs)m% z9M#35L8AO`dU$FTLcGt+Eajgpm`d^kTHkqYj z3#lib2O&jywD5_kEqG`7#*)|?Kb1Jhs=9-fHA?8JRGS!`;DfA=T1uS$O^)p z8-#~<)EHK7-GX>{`?iOm5+B~UbHl|4bcQ>DTno78>H)0=eCpTydUrZ}EX+-A2{m6{ zWj*#~b`DHyO>+yCkCpOf+5HWV+a{(8*qy$`aN71wsckcXW>VWeYiX$(&Sb_gNkJp> zlsrzMyh%%WW%h&eiMrjSTA~+86HSavFS;UbXT4xIivo{zWb&GPX80{)ZD*oAS?QD& zgtSASp0I|1z(6mcBgjuZSLyWF6PHZ93GVo08$2x~Y@rx%a8BHbfYSM6l;%8EqCvlr zLc~GSH7OE~F5@oo z5C2bHq05-(3hMz+o%{YLU0jrAkqNMenHv*$E_;~K)oJ~J{Yo?_vw+|=2+w`yxzAv% zU9iRIh3CJ(0)ktNkS_Khu*c}HUiTtp+N*!|#?RPc#0mmijQ+_}j6RV)2;;cAn1$q4 z6anyKp@3;63C{2#X4Vx1t6IF}TI&nFAOgo5M9r!N^g&{+X)S5v??OAA>!8*Z8Jzmu z^}qud#Tcn3*P5B-pvnfHBq9Uj1AKT*ugNuxl?0yZ0kFelb_h~jv_cvhOvQm#QW(l% z@K|!nEfiR6sD*c~=2xGSB#t+TnswWfK1i%JZOvK!y#x`n^;xTP^C2n%f)fU_xND*4 z?Uu^t^B+PjAV)S-1eqpnrqd)w?M)uzh4#xOde6j>N9)=`DuVaksW5237a1FBEiCmy zmjgy3GBhhM!s46ONE>JC24d?bjyyAk5D0SU=Ajcye8o^}U8X+PLrjwd&x3v-<8RiW zToi9Kh??~ae$7%GaniWX$Y?NgmYh6bylIt0_ZCK+tZ4zXh*2P#35p zZrr|;{DwP}*pkTdv$&va@W53>f+r{0p*tP8N(DO+=fG9@>D%9$AP2I_V{3pMr@A2t zgs1Ar!G}T7(o8$!GlNxV)$G@y=E7LOqU;c8{I)Ox*z;rrqG`IhvvCuVejyz zhtoMo5why>oexpz}OJJB?x#M!Rd?iqqt^S$kx{#8Ab zhKd$-VM;!KSK+h8h!uqNAh^ZoXFp{H0fF#3UCPrTMl2wFh0k$&5I+Bf&(Z=gopI_G zqiaulPukO0uRL?<>J@tsyv^W>hZ(tSF#G<;&&(^-B%a_MyO~uHm!7nJ!A@n)G2&0< z;T%;(2>(-@bNX3qx~h#Uoxk)Y77%Pw_L$SZe4UnR6~a$kL2!!^3kcH+!XJI|RuIO1 zQmsfAn^iHN%6RR|xFC8@VO*?h^sSzj|< zZ5Q&7elu~9S@&pQ16W;9-pb&!hTx(@PHuHPk{?fa%A#0NqyjuXu+{@ubq=A4FgPKy zpz=Y}dL;rw1O{ngF-fDW{GesZ3tC^sN`Z?T8Wt576#{h3L`_sIVZo58uXR;naVTn` z!?@%Ff(>~!!8BG}Jz!dETE4bes94SP!iFX5Gx$1dVzq^taZsiV9*dgUn>x|2U;W#^ z{ky*%W={esz6}Z%DFAdB=!Zc`oPOU6A_M+5g25!-=>sP(4hmR^g9?I$FbEJg8fJX3 zAroKMbYZW|aSIg&1;GTP!Xa z3p>Aba7QOn7>LboS@Dri9G||T0 z*=b#Pdxrf4ZiI@L%?Kw%Aa#;npLx14{`Qj*7McpYMGMraO)NzCW=jzacMx z@SX5ZtK+h^+{4y3X@=kLM4uz&fv@-y2BJ#v@eNC<%4=(b*UCFmfj{bnZ&vTRq%ie3 zSQ7A9kXH~8!;b@72Y=oB-zNS#Re8zsQ_D1&+}Z~E&CmI)C8!u;hv}iANVFhSO57a$ zwtVj%hcxAto4k_MCh9P|h~`KLc>WgOR6UU8P%TvN_5nMQcCF%+36l&RJqTI1GMpasGHVUHqx`f0Wp@on2fPhUmDSv_g*GxAl z=b|*05YPu%LHOw;5Wa?alkz9=qO^9QX@*{slSI^N&$$aM`p`^Yvs#nUJG)fT0u`%5 z^n%Emaw3I@3<--MEk3BY+9Eti+^R#QOE$1R=_96QU=+8zS>IYMwVuk_veN|vfp7=` z)6uhFK_d!l7hVaiUsj8Hk%PIFfVpCLt4-6)R9X$fWAKAS2&e|8`&hhd7>*wgrvCxyzMR9h#Mf<&pu_)kmOq4Z%=o434iQE51-8WY+0}&pkS;^Dljw zOGHRH({79LG=IB%KJuo;-Cjmm#7O*vCOt zeiwP*Te}A!7ZZBKB#v~K;I0oG7C!Oj1VrU)5;p_n$!5G&%X!n;@&cT8!%@lzgi?xz z0i%M~2 z|2VB6e2o=^=_X}Y5T=`yImF0|(q8;BdyMQs;35QC0QgF01tIq+^X=}9$ItLF@6I4v zjGsgxT)yPO!MX4Mh?y7!PV!xAxR{_$N&z715`!+dYQRcY8z|x&KTg|XV16;$ zNZ$G7cllng-EuVVV!>P`ms1rQ0YC;;G51^h8o9%9qSf0qh;5yoV8=|QbJ!d}lLOMb8A z0tG=i5`$&GtcEr)37>Fg8RF)CL_)fkXO9AvL zZ_{jmKjAIYlO0wN{Oy*8-(KU(e~q7-@|%g@k>T5a^JonoxVa-gE@3#Py?F;fd4t7; zHGc1|rtMt#yy0qvq5(VRhBm^&1)O?-wq}wC z>&gc^o8{+6uKwQ){7>%eC=vbWkF`r*KiARuORb)Dy&#=7sl-jCUj3nq@Kq3)6T^#f zt{~8Zz=Z+!C{H~IZ@j@NMt_4s$QGk%1%aE=xR>k;?Cg2o^#d+6wgtgcjGjXu@EK1B z!qux!UP2;VV!7awhm}4#`~G*c(cC=cXk3;sbs+HerOV(;PhGLw*_+pBZt$KoE=qfj z^@`7Ynid527J`XDO^=mUF{xd(wIgr8unAn<=i77$oL_(TeXmzPIdR}w%q&dju- zd{x21R`M-I6<}g&I3Q_M!GtE0sHG5hp+yta85lDHlL(YINp#6dRasw)GdHS4R3IeM$v@}2Ci>82yg_?Zbu%Z^? zF0dbtU}RPu%n~iwWR&85D}CT-qQgL9q24rZSWydc7g&3qiw&fBok$C=S*W|%UY;k( zs@4I(id+px6*S`DOYu~*G0Co|RseH;RioAm-SSJDU{cpz5 zD1g)n@Qg!?ZZ3-5aNdU3f#ofQcxZUY)cGR3%?6YYTtpzC4lE!aY+9I90x7}Mmed0l z;C0Nb1K?)H54(pb>j3)7gBUz8X+D#jVv9uhWc3nz;Q`?RdLV!xKMtzg6?stsb=MrA zw(;x&hvnI2oGA&UA}2QYdqcA%*QUYq74KV=Y&|&LwYY1BlGq`W--O?uHXR*LmCf+m zJCv~OH44(Xizro!*;z<2)bRDuh6@G)kZ*2U-8rA72R;AMT z>+_HY+s^}fDH=d%{*Z*ULf2IULejYWwR90|*sfDj2X+O)Q;fI=;aBX+;TnXWyT=H9 z@Hf*%Y2RT9!Hd$qGF_DRMb{571j46XL*Sk?8i=_l?aDJ(_^PK1;VExXzJj;e`26=j zXnBva!hz{tBZdkAn~pMi+9qZGJhm@!OPWgv^dQ)T;Qzi`j4*l-zRV6Iw-~X6@VYAq zKgtTi&)s6=DMtVJ`=3yO&@MESt`sa94N^%`5?k0iGK*5xLA#%u=$(2)#t;SZrsXjU zqLF+cAGlm3&=(mpip%Q_+LR_V>D>xOd~Mv}rU~k6@`a8dL7?w1sxzKZUhn&Y@<9aA z*uca{6&MUznb0KsV$0GZEo`BwQ*Uq>M`#jWr7(!uj;7e)Q&24!dKrYl+PLyfM5^2n zQ)}0RMs0v#qFzHJ1sZV9?8umS;lfO-$tzN%i9y^r*Lx-!lQ>^Xp_-_=Nj5ENlJL*U#*SR4f_h zygfG0RtZ`F#P_>j)N(HW~E_fdaj=uztn|bMb+?0C$fY5OjD%05uUQb_d=V zgRc!<_uJa-;c0*^2`WZx3Mq)h=W zVfVAm2wdlIpn4!4-mtUbPA)>&zvTsL3^L*#F5g8raCiz5I?YtCbM!c*B`@jF%I}KH z<7Q28XK&`LZ%6p1G_LUY6%<9~VurnU6EfIwx3iZ!&Su^@KgfCTj}-`AzEE zyPKzvS%=_Eq8-YoynY6M3O<_}nrR$>+dCOc0W>v``-uiBMDi!okKi{I5guzg@scVCJSU#QV>_pQ)bd@(RIZ3}2V zr_CRf7cKch6VEIvqjyFuz=Pnu`&5DgBDWaL zSCpNtG^8#lAC-{0h^Z5cVySmSk;yyqQ=w)i-gHCJB(AfOslV zs5F?H%u*LDD<)<}AF#txt7O)+V&`gmYnc@~)c~!SIHCy3Gp1suoF-t*_9`_jdE=ZH zIo=KIGi#q_2x=)A6W+rQerZt^&CF8+N*Lb`Ig=fFqh?KUVIC!5;E_mfMYCr7C9fyd z@_ti+%LrWxn6(fvc#OeVc^j0i5y`<6!R1rqy?ob~x0X%oK$CVfAB#Q^{ zu%d}p+p8-pNk-PQQ(GEUGHY6~bG5y)$O_x{+=_`KR-Pe{zwq+4)fE#nW6w}!_27G| z1MC1MLD{~wVSMq|#1i7w*0qH@JhfXhepwpH9Z>l?`s@&nZYz{Hds{UCCU zLHvdp7YICS(m-_@eU8Fty_FGu==e$)HTYlnA3HHjIlIX-Ua^%ydS~QeV>&Edzq+or z1#hB{J#1pgIKL0-p%rFo6OZl7>*Yay=*i!d_hU}}j9QgPTB$d4CM%wVMG6%ND&usQ z%teUJQ+RGYI723!>^ue{F*fnq8M#KIfeR8R({;+Q{=gkX$_TGOKpD6&aSG4$D^=c` z5$sctKivTz?cmv3#M;8qad?U+CzD8k&)o%CSUBDksu_;pH;5a@M=U5rC{R6aoA4G> zev9k~Zrz>)NBAr+=oJA*9(?$zb zOFA@}0w+9Sp#>5OOOQ5%+fXjJ`co<3-}CoR%smL6bBaJ<^FB)m zZ~XK}Ke7kmum0-w*R#dQC4?_?a1cERXoSyx{xhCqG_4`H#RzrqG>ytEAFy)Z{-Vo# z=erbe{`=pxgt>M7z#T{+jHLrGw<&W60)HO%%+ri(^dKM+kOy4j{F$6$^gIHA%Nf4v z9wU1Y{xUrXG*Hlk;1(kV!YA`4<$m_pW5ur!MfC>#7;|Q}kPr(qU~9C)Qw0ONxBEe3uC7v10ha znCqJ|8m9*oAE+6Z7XJOO4A6ERfGqX;W@|))*zSY4 zZdJPf=!a?pg@JP%d%Bbf#qvfoV|)OkF+ijbjL9b~PEQT)8bW-{dNo8qyotq(L}xAh zQXtf~GGoTqe^bYZvqGi9igpBt^Od9(0r9oeD*^=Z28$XoP^LEH7u$-oVBM=jE5v{6 zJ>`L>M!4rf!aW8dyNgWqOmq43lHks5t7r*}F?sElHTYZj*ZO{f=Jz^$VmK2%>Lr;j z281{Bj8vfIJ4S}QP#z&bxO2-NhzRnaq!WMJiolZOjT?C#_K>v$DDZ(k0>QO_v3vlJ zMxcD#V~}_qe<*(d1Ej#7B?^h8fCG3vlEGAba40nNoTMZ-dhBH4*lx6Jh%Ube8E+P5 z&hMY+_sbh~@?p%+f88y9Z&kC9ATa84-|qPO8$sK(LqfBf4a6K z1<{8BeA}Q&l@Nia+h=uhHVxW;BhQ4?67blxO=p7ulwTzwE8L2(z!aoweaW9~+S zzYD(JMFw;N`-oHkLIlDZ{FH&|T($!5KknNUAoL<-P4lg$@E?a&Evyy^@k?Sb=K4{d zbQF8V`2R>%=i={&TjI2XGi&|(vG=EcFs&f`>K_pZE+PDki^hKRlb`%Rf#4}d>@fN^ zJqTY`ASe+&M;C(kmC+DD3j#|B&tBzW^+3CNl_Q9rV6u{6mvX=VBL`*{Zd{fI@P0MV zI=!T^W9cbQI^}evEA$^QrX>U>>{9UD)98bYY64@SPSV&}x(f$-qqBa%@crg*EQHfm@zDZC zXA{d}=0XaH3Nz+9pin1ibTY~VlN*Y)fWl?Dps;*Uiy#wH`YG9eF$`PbcUM0)#sB#b*q1uM5u6!7`B=dIh{yCXyq-04St zjGaC3$N@2Rzt4NK0wMV=I1BPtoLc#uooaHMS)O`%nH-op0nc0w4{ek`l!?g{9@5HS z;lMNsfT**?m;OD^OS(ZqpEE!nWsn5}d3&N^@=&zf0RzQzH-r3MOS}}u68t`XpTtw> zHBwDpX9zD!4L{@cR5jBP>dI@WEqR~teP7yWFlt2up4l_q!z|B;HKDvGDv>Y&yWwP_ z8IS-#`N#p32F?x#u{HVat+BzWCo;)H?(A*4_<$U+B!99^!O}6{6#cMsx^sLAj}QRB z(>FnB>zG%lk(>~Z8$SqA^O8$`(PZC~mV$nbE$oK7}p1K+$Ex3V!wh0;}rhQG@ zc;$usksf~Q>uVZ&gf*62PU6Fp6q+tP6LCMu9<^_#ov#tAkd`z3s(>@ zwivy^JqX|D6rM_mjSFrup)7ptxMj6z&0aV5U$Y}jXwAs3m7hBe32D| z7r&Bw5dI`vjA*Q;djf&;a~48=fw6Jwquzt?AOHM6*Z%y^KF)g(>WP5hd6?}KO4TUJ z6Q;fvZpOTm&}?;=vmkt_xK);mo&yZ$mK}tC^v`%pC3H#%7bRK=7p6T6lQpzBi2z|I z;^C1J!l4oBAL-;34p~XS`5DjBfC;HXBrmA>+V9HVT?T#Qg0Cav7F#D1>%t!g8GZKRr ztl}F2FR=D5G>cEsSzb4uiFnfolxbDYQWhNEyq|MV`}JQjU?MPvn1?PIIL#SlLg@5G zNn2?3hl`+Z!@-i5od_&&1Y=N`*sIH+Z(Q&d1_oxTMp2$H`XWuPaCIYs(b2Hvlk~M! zye`uqn$^fklt&)i|K9ihn&-RUQziU0Uie?X_r3p*Q33;+h%mkOn!JJnWkGwlgO6NVc*x9YtE>&cM?B!=RRbykw;J8RJU=NHvr)wL zrZsrK?==hjY@dAMnceY|5TA5^bcinb9C(E3R1VlgT9Ap4S;Wc=;sQRtsJyo1dwi0K z3HQ0#A|1jIS&(e|EP7#^X293UJ_#OCTQ+}dpr@jWSD8PCv zn?|%Mza`F|zGgB%Ow}AEv$f?V z*qdE`N}K)e0V@c^B#m}u3V*&_%dAx+7-U?FMA&{Eyw4-|Cx(ZjOP2bKc~KgM9Qn*=K9^%o*<|#*rxlm z@NfR}%>K=Pu=-JLaVoZ<*4|_Tv5G)Tr51kTylq)Lh4Qlim$~|bUw%%Rgbfl+C_#VOlh@lPO2@nFx0BFG-+--z|y20!o+9CYZb0B}a?F;rY z_h_YQ8G(l?z-VoHaiVlq;OuUmI7Nl;KOEYE|7A6Z8ATaiMH$??5uVtiSiNpRJ>luA zlYCHZc(t<<0+DdY$R%z21`Ix5{Vze}R=0;QP3_1eds2rvOvw_aD#-V|6*9b!CS8*n zycRo~@d+#W+Qoc`gGm&K4E8MS%INUEa%Ra}*?bch9uB{|3yV=!1W*u+p6SP@V0e6N z6N+#O4}6Rec$@>4&;Xk@G@qK{clLDfJ4gg3wa0$wPa455c3!1v;e?e0SU+PK+OdKG z39y|MzU1Je0S3ROTNu2ylHVBhyGMz5rtT=$IOEsI?jja8Ec>vhDLg$5M}gtfTP^SP zZ^#3VF7v6EmoIV)ts%x`vNhCU`J4&Sm-P%Ce}KOiZYWcAnoTdg;iXqesRd@hcQ6LP}>h;%C8 znG=7X%=1t!$%o1kfF`enuoynjFuS_h(QQEk$z1TQei6TXf0-?T_TCC!qCCT>537Y{ zga_$~_B9x!M1VIZ0H5@oAKHrGbO8Q$UB;-)mKmC|+K`X@lBR)!(9OQ|#q(N;24lRV zu}uiQ9j!qidNn1@xG?#Jl`ynrS?_2kL6Bhe*Z(W6HLqKC_%rFPd zUS7e&C=X)aYp5l6%=yTIxv`p%podKs?j8|-T3#s6Ko^AfZ3t@G^ihAu?|tEG(`tfx z12{AUEc`wBdt@n-0sOOX-wE%M1HaPC^Tn^ykcdc-=YJsL;I)ZIeNcmY`p$tig89(iGB10oELx}8hke@a?DMSGBu1~mJA&(HTsHqx&xQS1@^WpTPEM9cC z67x`AX#r0KllQ2k^cOJFxiB(b-3>}v18n2XEo|$Y@imzG0C|@SQW-JFv8J-U8y;9* z&(O&u65Ki@zuSfb)k1H7=4@5sDKXoO;2$$Jh)tT6Cm!}B#qcgB9B+o_F1Cp`c+-N% zt{!iBKbv>AZHeGrAz<+#%HWs`-o)zGvF`~fN?ES?=Ay9Djxsf60W*b-@^?)o*W^_a zStl63IC_xk;8|9XZ_!54+8duFXj{@RuC|^7`^`b_t7-= zAYeJ=^rK#swvp{cwjbDtkYr=~BipMhgu&ua3mj&u50Rna2T%!U&0|IK3+vgb39T}i z7|!@1UJI@1W6f8rMcB=}Bxa()keAD;5!4OAF^kDstA>cFFBXdn(FKM%(Hoj85hQ}* ziyjTZz|c|ATPH$5hOc0-j*-_)%`NFJURda+A>D#`x4bAJvuT{xTM!r`tFakBLlp&9 z2xj4h**s(!V2a5`CzwhE>F?uPbT*5h@md=MFjD=D&@9%k%Ky){_ZI1Ub8+yNN$O+S zKptPS>Wue>2ZHwQ%YUb#42Bi`Z7VILrkF73OQaxWte@vIv{=5dCa;W`YmX4i)reFr z{ZL1!+5n1$A`44l(5k^gv;bDcP$Eo5+mD0lXDEEFwb>QRS_{}z){=(S^s(kEEDg&` zd)e0H-_+8#JQ;{=#yOkG7x~@KV+E+Us&^^@^n6E?6Dg8|A(RSQctfqs9hMyYj7Jr` zW`f=6Z*D=|zJtT=JiK#{04;CVG?^5#V8Rc*^4T}1qg1W=_{(lmk~e`jgeTLP$EhqT z3tVQ9KfEE?;%xg3h?~Z?_Ln0*C@vAi5I@q2N*kS^(a|kg^bQ$RDImP!d2& z$a@EF%^gOZFzQvxZ1u5gnC4-w zNuyW57KE!d7jur$Q+)1UMk2VcsNes(#SWuMK_DNVF!7Yr%hS%JC$3!PPr7;)m4NPe z*8h!XK7B2x7qYfMtXgRy821PY9=(>5^ocRtBsxc}H!Yw9_G2Z|+P|D_&H7=vZ1= zp1~(H39AvrW-*az#ls3~m$TT+Txii*v$VWcO%))}iAAZ6fxWy~R9OC_P~^e?QU%nn zGC%2OZx<06@&g)7oLa9|7^fvcnmA42XJ??^fyav~3E=(2=OIq--U{#SXpZTtJNzv^ z`7u7$N%K)(%cuYOlwZbL^AJ;+8oBOZ@CW7f3;wpe40(B{H!5g1WVk&V1fhBLGyH+% zA%8xS0WS|kDo}AHfk5dFyOpS*2@YDiojHA0;31>jkF zq-o!Vrd}XF;1RNO-)ekm;5s5MYz=4bl^o!_KDVWA-sALC_sL!s&u%_a|vI zHb-FS&=|tewLEN_4Aa-L*@zP5@|JaCn-IcpoDkPApz2@pJ<7Uw4FA3-5IK z!I)kHz`7a%uny-$DM+*-f!#?2jA%XlN@E3q1q1~GU)0l0%5S*Gh}}BsgET4g5A~j6 zM4R%o!-$*GFn1VTd+zCL9AxC?qN`WD){GDQOHW+B%~v zFkc@iX}3Y6pXqud2yfLJ7J~9EPa%QX9Y@_}G?NcP8Tin^@?r}gIz+MZ$s!NV^L4dF zVRbJ=d?SDvLMT;Nlh1-gs6oyzcQY6*fUQiTgMg7y90N>-$HJ4L4y>X*Dl-x^sv?|0 z&N){P&LUl!mScgcg-7pW0HwkZ2G&JsT80+!PL0A$4m9eMq>`Z{XyGlzf||CvC|o2C z%ov3_>>Np=PnJ9{Sex@wB6)q7{v^COS()L@-V_j1dCU2&E*EqKVV0JzQE}+ZF#RBs z8+0>U7FG#|_(lLTgixxkCLa{4rzsijsD@Vxz|XE_ z^ILzS2z#?D688M9yzlcV4llWXQ*PEcZC%Ij{Q@8SE`%lpqBD8Boyu0X_YDvun1(+a zv3ygR@{_BsXss3BlkXo>9!48I3ubwZ{LFl^@>100D-t{+iET{U=B^b3cAB}v3#Yqy z39?gp>&H701$I54B4F6qbaG0UgPqavoRn&(!_E$c9jfSr>8j`*!tn_SZ>Skgc8<2w z9?g&lj~{k&6j)2TbG$Kx!<<)|9Qh}g-`E`84m?MM$txLD5xl~rmP_T1fDmh2EGs9^STcJGWlrH5re)Q9y z{yaSh-h+TZ_-$7Zwv+?k{KNB=Km4YW;bRjBuR2yF#j$jC%VPOPKtS!3} zYOS;rI+Hxr(3)NdXlcxv$%lsJv8Q1a17fFD0|3kSye=GOH?wICViusa)!*$OJHNCl zfq^o~Tb;E@r{0pY)5$Tl|S*IXSVa;KJ<1zzhuSO#@(Y>c%9!uI!dnb84 z0n-PDADMH($1Ql=EUxBtu5YWbissJ#l|GI3VJYx)6ar3*Wus|12F&0Fo_ zz^Knkf>@J5m#YS7wz$~2ozR&w@(lo|uEEmWR@I{ff-=op?RWpE&q^0}LeKXtWhxKe zruSevya)p^ln10nO-~wL8^JvM#aohoTYK%oJR^y_mrQd>gRwiC9I6G{628kr69cOc z-|g9|Y7M4J0<36INKm@NwjM@c(DAA`a3 z@jly7v_IOOA6hoq1-Og=2ILzbYVagkFF*ikU zuN|kY!NzD1+m(p$r``db7mhc%{Eg;kdfCF_N6_*6{EEEaG0Mp<(Vm#j&72c?Pz9TxF`a-c-aTay9AgI6tV$dHCN ztQ{4yGO;cnBWHfyo0M%*<{kvTs(+6C%pFDw1iF-6Kwy*6m!@M*X+iirALr_W&nOUB zL*Uz;Z}_J#d4v)Bi>}b4>;eK`{mygW|DReI)oFdJul$DMr6y3BewO-+BSzkLR^N{#cd} zUX9H=-F(cj;gJV;zx$O5@^}!QnhuDoY`{#d3q?y+V0D0@8T$2aGB73vDF$sfi{Ggc?m!v7BKgJq?lZVr4}2_7my5Y$34tZD6$ zH5|nXgT*D#WbuRw1yI%tU?lX!MHdA2?m{V0i7m5Ke2mRzhbW0n86zt{inYPFCSN** znSU#MWWq4lDGXFn9jy-3oz$H0I4Kxi?LI`nyJGp?pJq0&CL+L_I2q`Sut_5?YE2r4 zUNANj6EebUK(ppXM(xes!j@$O##|B9S#tyniAiTlAfQHOQ$dQ2R0?#pmVL_4E@5K? zwU7*JTKl0joW)sLLeNZ4s8C2Pyg{Gp?1SG|UbU_@QYn~a4uOwRSB!~pF(a9wCCBmx zg;hF%fIM(9U|KC8i~)4*z)CWl7IJPAU;I1J2(K-1)429J4;*DsepH0GmI&IR&M_C|X|B=fIYg`-M zZ}^iPRtZi(@O-78@T~E!{F*!zWw14XHJ#t;!GpJyX~1tJg=MT+=ktHYPdL{{gUjR0 zF!7eWwx;uSquw+x)*g^?$pdxmuHDg^Ta5mhCS|^+y$HdJl;3#cM?Y}|;dQqdc~jbp zUw!c_U&4?GUwGaYWo|U)qO@z%79*}H@H(^0{A)j}2$!x*JB2QLQ`!^fzyE1d{+|T` zS07CJAzDInpV4J@7+qqEk>cQ)tIzO9b59zl7`eg7ixAKUp0gxOa>$S1IP>^htv;_IV8d`5=E?i+{x^c;= zCkl+Bq-u*5mq15WAPq7{LGqoRfb{av21){;NJ6Ah#gVmS5d6+0z=B_jfO)>)MOh(; zA54Y8@LFDK)Z`ay1_a}*rVbGM;V(ZGs}kaM@Og0- zIO;Q%Fp4dOuUWw!Ete6h6dZ|VOuAf9ez}!MB694LNPXW((McX>vp}F~J@P6UbmOS`PC{H_jd?LRM?H4|u^Kkxe(!6}U#q)S) z%|8e&aK!D)b{rf*9+@2@47S(25kY=u{8Ky(dxv;V*5FU%b2yS8;o)VE(=Kpg#cLAe zt?=-T??VQaZ}*9>31y{pWJe|C>Q`F%_2yHSKec?@7<%D?_3+8rSu~{&fDs6+ARrLD zNtq_)pK}iaUCPrjr&ALG`hYD)FJ=Y7CT0H#ADcecub~j0b&nBE2pG4VJ$dB`mjS%= z%sUPG{qGKa7GgA6ravjX($tKLEx&i+?0lN z`8M~YeP`-H;HosQK}eIbUCJng-~J|Lk2wAMz_qV?)al0~5MF7hB`@I72}eqBg39ak zMos2rqlMaPJ~-*9x7LOThf%;P#*z;en{boLh+*adJaH4y#5ji_NU%H~srF9u#I!L8 z)EY?~STNy(R8m_l1TJ1nmHtuvwAe!8lZ+G>CU2>Qow&WB! zG5H`Xi|*$Fp)NopW|mrBkRbDBml2jN2hF1h5`sp_TnBOl%*<-h1v0^~@(rCc4>0xQ z4wD5x^4JgOyxx(BlUH$!6$m`jiYC%WRA6EgpA=ptE<}R7K)&Sxf&d^#9!+btXqCOv z5PRpxiUSu5wEu4|K*Ld-)(_-><5q(Th1UkCz1BP_ze%;<@tRT8K7@O6JODT{T)*~H zX)l72Y~%}GPt-RjCyNn>Jjkf1=rCa>u_Ee>=2$1(R;Ix!rO<7>U zX+ocLS|8+lbWsgHmBAb`8*kixIK{Dkkh+mh1g6D9gV!bal7x}zgF)#INIdGuUzDfQ zfh?)Sgk6Go7~cG$|9c371K6npLjRDI5~ggBR}R?eOz9Bbp&4wVfEV0sn?u4)_bQ2Y z_xI(`NO_PFqfTKm z#-=1UE1Zqxg-!Xh$6%CzIzrw>g3V30BJFNceXIyL7M&eO6Hp@G+I)P>vcM+jc;|TS zWX*e((H5I)+mG4tzr#QF=b!gCy{v$VVBi~no3ghPjO{r_Q=mG5TbPeFjww^ePhZ;v zjBqjq5z;`YMp(0g4;5Zklf%llBEK$}n{COp>*oFDA3SJXO1=}n#vd6Bua)xwYT=WB zCxP(K_8@%i|6uMseC#@|G;d3cqSlFYMx2}@ZS8E{C$!nzL;#IOCW7EUzz_jJ0{Er{ zo1&U@Tdnp4YG&Jk6Ai5=sfktFJ#QqLruc8|?{~k8gEM{Sg0qq)oT@tE`|hKJT&GW+ zD&+H45IABqJcBT_AaKNpm(pxfK2H;Z4#2p>7e8KWo9kRo^!=_&W~D0cWcUR z7KJpvL_`xcCzS)ti@d8t6J8zDwFW_FWX46xsgq6&B{o?FBEWJE-OM8|g#tn6f~4?~ zFu5p|@z6yQ5FVK2K(y&oPE)fGe3((oKe`U_zIlTVRgd!n^@A9Bymxe}HQ@oIeFwyV z#KFc}R`FS_ejtdT)P(BksiN%uW5*eZ1wgdL>ncIw7df-9@642cpGiW4-Zq$|4e6ma zM}U7jJU+`G47_;&-OcTb}p<#gJ)drI2x7!O1=nT6boGL}95{2IKtaZWHiKFnI zFH%PZ|3lP+7pEygohypX>`8+IK^LE;(H5UMS1O3Z=#dgco0-+FI*l$KB5WDA{Rw;H z0+O5n{#9(!f#d|jV1m^-)kZ|&dO(Z9X3XUZV3lXFL84>%}3OoxJ7 z`~CDVOGe_W><;kdwA_u)uzA ze}mq(y7Ry`M1+UY9I!TGRRaUR0j~nP5*t3QZ3&v^FkXpdpyX2l2rN88Xr$QuF!DaI z5Wc_PmV->1`|zOV4MwW)EKz^4ZkL1Sn;KuIo){D%{PJBr`OEV6@m6`!8QxmMyQ?ef zt1BxBZ$IKn)wPlLKoJkP9SuD3IyC5|fnTEvLH9C!3|w|}w7R#x22YwHfAP}#<%>_l zUsgYfvWo+7XLq6j~ScK~~_5mE7V+o>q7R~_Ml3_iB_FUp%B{1_Qt zQvOLQ2)?BJ8hh<;eEpTLAuo_1@EqA^=?Er2U~|r2@P`MDIr78FA6_~3wSqGoF*hRj~2?oDDO@=@d!kLq2C?P!g#JMNWKKZ02 z3vW3!L%48(bmh~Z=8(~U`W!h7P0BC7{0dSJDVrhW9fV(aj}-*l4b~=|%c37h1>x0c z^`ImD$<9QXgv<~L)B%;oKS~~*Ba}1CyJmUE1XE==U4pt|8Z&|T2tl(^W($@k+JkQn zm01BiQ$J17`N}*2>`h~QA_STwVE6$x5-5B`Dl*09E$MklDGQA-|M2S{{7X&{!YXsGi)_S02!V}_!Fo@PV z^|j$k^kXL*`UyXk;Hr)!?9eof_ zf`5AtDrPs11Rtv-xO-~&Te@ggTA^|AuuQ5I$S!#WeA)_9i4fd1WThC97Zu#;1E_DJ zb$U7w5q`96Whs>nSRHUmg*OvWYnJf%%aJE7Ai6$ckV>TrTf?2EL$G?c{$b|^Hfw?ldp zo?bh=xVpHqhZ+9fJ-QXFNq8@jr;Ui17gr_)9CUh0KB6s5u>kq#K;oDr#{WNaQ^&xpHfZ> z!bj**wndqF_UwsMzFXj5{(S+#K4srL>-+x?p^k|sjOhrrZs#f=NS{e>ItQs@tHBI*qDx0dJz7hDiR7H zr3LLn!#8m$AP@_WX@TxT$AHKK5#|MFM3W{7#WDn50^^6}7eBYf?@;aD8(w_Cc(c5} zc9aS{IJFvY^gxwR9~DBcRDkUFAE;7=NT{EyRm0um?w>&Mdx=Ry^a(}6_Kz!W~Bnb(ae=Ta4)C|c_ZQ4)8)A0bSFNAv1Z+Rk-8rtvTSkm|wCzH;aGo!a>mBDxU> zCL?@_p@a*^lc%(=){Rl>SLR!U0q5^%nsVwvHGEQWR5l1*J%}aU1Z8M1N<!38z&e4vH<^x2$=+oILS6vryo&Y-gzehQ z!@~1p{NnX$lP;#wX(De%F(>lJLx7p@nvrGkq(WVB_ogZ5k@YEaXVW|^g%mD&j z#+n$QxOnwS9$~gdprG@1GxNSZ((r^l*9>D@vImfI)CdI%bLlc8oe&c1+U)h=v5SQK zIQ&S*2_Fex#F}b#jK2>H&xD7Q&o?9x^1#0N%rDoEyh)YAN){QOUXv$t7>+jG<3`jK z6^M%qo01RB2;h&_pSris-KIw-2~-+prM-ZB?W-#-Ch{8B7}=!!lb;_F zgunBe(|>J8jHZ2YJ#?z#>BR3mxTcF(bSIKyXe-1+PxA`xvh%`T&4>|D8<5o7Twwx;;T!HCFRl2 zYbVmWnDsSE0B2PBp%8tov7*!YY16Y?NBFX>fVUsc__f}DNg7KIAdfcsm5PM zn}}54QvdMH-{BF2?+tTsP%#n1=;R2Bo)RZICLVLDunLtXFPxW{9#Qby zfQPsNYLJXzSN?`D&`olO@D?BB)ec}t`J8%6n!rTr4L7HbqVAFgiTQ%Wd^WMw5{dSE ziDmet7zAb(QMoTko`ga+JUZ>rEauWk-o?SEO?YVd15KKdO*fSB+|uTN9Y~Twn3&kX z%(%K7&Lg2xe86#8b%>uC)lz}*IYd-^Dg!Z5Z0~!bFr)^pfDj&S;Q&hO2RNXJ{AKtq zc?Ye+JjDPO@)A78Ji)=`N|(?mPzwa|IC*uRHSh zBvwZQ4=Q6{wc4a%4W6f-<;fRT3#t=O6I@&^;8*fqjVe!*1n50V5NqMBIjn4d@I+FK zwFV}Yg%z(QkPujO5Pt~|ORnG>2uHR=|JB+TAupmhZuHV$@s0kyp)tYl(!;*Sl^C1sBoz5avOd0*@&yylc!j9&TXP(eU!Ql=T$KiHrD_yy1R@KD;v z{>|_Zf`8jTclNZ8nVmdw=JbijPLmy+WTSubLnkN+^!-2Hq=G>1KrUedL4YN#u!O)m z?L1|AKnJuJojx&?5Qh7cY*MBdf*u5#l+9mW_)px%`m*mJ(1VZ)g3loQVD> zGR_7WxaQw_2<&RlLz@$@^d+$>ZQO7!!FYMnO_wTyuGSbyF+ngMh;DL=xQW778ekAN zD?5L9J(oIB{1|76{9EORAL+nG5h15YxSm3|#>RyN#>GPsrQz8~z*rHIpH>Or#b@P* z(>U506QH*?#KsTaCH%b1@9dokVi^-2&pXr!hNlXbtoq`y&dgE?s}$_-#7oedl9O5d zd3obxjeeR2s(diH|1^m~bZZId5`IQroWwD%7h__b@j@|bhE#}p5I(3{_3U5X-5IL^ z_8-`OfEK|YVj(npbVf1;8Hc=36B$KUM(Zqo&uFjlCIUO!8R`6PgKs5P#{>(GiC<4R z=$a$!;^LS&;J9uZ=_gOn#Tbwz$m2!AyX0J^2*NB8d{;{c^j!s&2uID!R%XTHYYgu2 z6Nlegnnu8RRtXmbjzmFTPtw8!LSWk9Qv2DaULJTmcERe^4A->My5rurZzGeiZT|A9Lb%9#J8jJLSyZ~7-y-w-yB0RhQBU-5KU|3tF!hnY7 ztdiHH!sm`t`89dhJ?0Vne^Lk7i(j~BB4KL44Mmc;oKO1VOMnQxiNlZtaC+z>FQcu! z^c4J%FuVlR4jO#{%3u0@{FoAg*#Y?hr2`5CZU2uxF1ZMmsp0dJ)EtHc;X@~= zA&?wUmN-fKGxdYB-eP29v3GEG6~qK#cquKH7+FF1S9s0oKa>53kHcWcpL}RHhd%P1B9yA0`}AipoR=7X;oUBFCF-rnVMA0Fp-^(4{Yom|XX`JY&s@n1H1ehc0Z{TftS0gu zN;RN|rKfx)144nPhl;{?`Tkrm-TBv2H$F3ac@GYSARKt6G!6^Nck%*J;j0_Ecrlsq z%G*f}By=>vW5RUgFJpS3e&^LcPdYG|xCx?N$q;I0$wv~pt?xjWWC1~({n{T@_DPYGhKX_be6 zdv`cgw3DO&JMR67_H-SsMu1Fq{L$tQ|Fp6@i{FZEN0EALXeN+YH%S9=aj7x@Pj6~X zEuoN}A;g1EY9J8ercqLdo)!$eQJ3Pk;!b$+W|vus)AekkpbdYW1tNdLrxwf(!t21Z zzz<9-yL&v70AF3ktbAk{M}Bb> zo`FHaYnY3}#oEBHOIR>i;IH)IQ6>z|bvOL}>S@Az@+JlH z(thm&JYw|X#E*{0YG_Lhgkv02De&5qn#~q^YT$|qSP~Z#c~*W-%n=R-$TTpyGK3i1vx**xs54XXR-8iIc5c&>)_)IdTL zXDWiThk=S~*@Aw8Q5WyF-VrftAW-YPZQ!WgzKp9qu@GL11c(SGoTdfE%m4#H{Ju-i z74rG>ztignt{xL)x`}-I1wCgAiZ=(y(hOdA=H+*05j~eWe(z@x(2S!? z___38K3mYM853T&L{~F$rt4m7!<#+8AAntlKN!mi2SeY(mQM17v{2L13~y}z z!saIFM3oUND!|iI4I_t0hQ}W8c5{Mu-Y9%*ZQRxRm^iNRp%9Hqol!hiDopWGhT-!X zgJD=9c^Ql*a-@LTXm2J#dN9 zWxa{W%dd1O9$*iNhrmNihwBS@ss$jX1S1c1M2Y}^Xm)}Fs5vy%Sc%E|3$I!-_u!2= z+o9JFSKh4z!d$0A+Lzv*I+Q;&eV{Yiw1KRG`~VA zx14&!=yz#C;DpgPC?N3Hd5;)TKp;WzA!T1u_NdQCc$R>_>z{ezNggvhO#y+XV%}2r zHRKaqReJI<3ITopPc|@>$81!{JIV-^2m6#iOp5UMY4e1WXZW{ifj)QEYK8fM6@(!} z;8kavlt1G;X}p8*a!LraPS9aZhCmO3O$a}F??;SME%@?pb>z3coT|bHks#zMyjop^ zoHb%frlkWVZV%_B`kggKjxfa^&j&0aQe~C>*7D zN%?@IEAyAA#0E~JctTX#l>x&WhZoHUQ(h?^2_Mm+WBGe+?;kI2&l-f3=m4rnF;k!? z1CAENj}}tYMh;fX0Mv&LS;sPQa%oaC2!2u)VdtEx$=U zVdOVCl>~p?tbmFF#AYs2S|(*+aL9=8SUSWEpSdyNBNIN%Wk!?i{Dq3AX`z_QOvoV%U^(a9F*>yh@-5so(^{mzn z@+*!Ttq~kb6~AsmK<2=bm&ohT@_vYKmT&~mlsMF^i-wOF--{O>;n|3_FO3hSdClqT zCJ0`0N)Li92wxwsIsGgd!tjvtc?$@fF`@?nVblKPISL48Pd~w7prNOjt-Un>oJ)qLHNx0 z4#HP?2Z4tW$Pe<8@=xZSG%|!F2=BFo@Rfh78~Kl45&3WLKS7vu$-P*vLGdrnUZE{i zDZOLCJ*Io!n$pwSb@+r*0_ONWl7h!k7DekGn{H z@F{_MiuHU!37RlWd}btkm*SO&xGh77uGT{gJZC7hePNPA}4@{Gbkq@Y}TqEy2PqPfAZbcQ)aVSO}HA*57 zrEx?lp)d(T&9@;Www5sILP*r|1*O*v!h{N|gfE%!quX1doi&OIAJ7>I6~I8R^NG6{ zzpA5-SCOXj1tsX<^!&jY3E!pjiQoEz;m#rw1Ge(+{__d~n{W}$7q4d9js9VRq=KBP*F;FOoEZ>l?odrn#kAHOD+Fk7>}o!;KoE^s8z7f z$CKJxqG0ll8_4noMF;pBSyx%`n?B9}Mp|GlFrG)^4Q9X218Y!b2Po45Jouy!@`#kR zh%53ND89fSdk+wJV+ahsUm+?bafzQE=bK2()C-)Z2;t2E%3;d0?&BHS)qrC-d6EkT0xp1ZmxTV8teV{ZQT( zW%%J_(ZC$v`aIVJ`^ z)gUMj6y5}Z0)j6ozdl}bYLhZ2jCd)HqdQ+6-a+`ZFDZZOJZFrCmy|y;TyshX!dXuL zoIZQftvsiKPB3{%*|(5wHU4nl|4*9`pmY3)@nO~p5{VNU`VeS#_KXqNoN~lycnIMm z^$x=|g$d~^^oiDO} zUXMR!2F)xnsMa`f%@}5~A_2npasrXMVrTQ=HOwwXuJ}>2k_4d# zu8f)q&`N-Rl9IuE?jSYgC-s53f>qj5W?_n5`#nt^aUn2 zCnZQi(7BL+T?}0vm=_NlF)CoPavaIrLEhnsBtf)%+z9OV9Z{Nj`QfwQe&dbrz45(B z9Cb6D@5HS9`5UZwh`vfGJGm)IG5B5}S3hJl?M9fFNn-*lBeMs}2t=?m2aO&fRYQnd zU{ZrPu7q6-JJf?~TwHW#XKy$Lba&5Ufq$^SV`#bnVP;^RAb-{$d4il5+QAD?62LSc z&{ONm@9ppp?uiabf-fD&8|?1OtFqk}m%oKIxFsqt5eXkA8V*Q?1vB9z#h2DjxA>iR zM=l)vM*F>lR{mDL2#*E{uWv-?*j4$0gFF-d7BcdY@EZM61^J$H1^RmUYNo{o`ylu* zl%$;4$s*5BEDypHaf#~zu+PWYB2CF+ zs7h>IH~WA@AAoIQNf@44a#O1(mMC73UTl+UY-2V}5SH>J2)^okg(}5C8U>z1;{k2t z(dB2{vI88bd;lRlm|I;Q6gj2I(ng>J5?jA%PWlt9SOh^D;#3KIwD=jhg^cn=A9Jb$d-i# zGV*IjLtg_a0@pudv1!mjYoHp;UG%tn6c!Xjwzp$dSDYI!zi6_Y|Y# zVmbfyOH>fN#fWzh@=#iuluZy`&Jm**xaIV-95K3Z;Q|MYJ~lQf4^JtdZxXCcyOJE>2EetEne~_96=O~BTUI#-^VW;sZtVxj29(~wte;g}kEc8{OGGDJj4FkO zcuEy7Sh3;t!Z(p?kU;aIoGv3IV6=o#_-W$d3(RAlU{GSrYz2dv+g5ASZ#c;U;!gNT zuMwyP<(jj0gfq&Qs^6`QlT*?CSJMPfc@OR|hwfmGZh!e%oH4WI=&8~hIK0;Ce zrU2fO*VcaAOh98=VDhjF$hxJ?lxHMkFe-i@gh)T+E>kDB6iLeG_tKE^a2Uzt0h;3d z1!4VOQO9*#5643bcuqIs{Y?h>8^c>}#oz4w*pF}%-vD18P#4kSZ0%xhgW9A(EbkAU zo=4gmjvrmWd22~!Kz>+hlGa|oAy4dI{=o>q0QE898R6Zt?t%qmj zuoAp@exZ{kEg)|xLL{6c5_h>7K1l}-V|n10mLqZ>lUai`3lRQu2k_wV!?ST$w+`U1 zE-gKnR?sYgPnKc71pI~vqB#CE@XyF!4gU=$!`hte#l`YS@ zYwMN|I9o(=Adh9j+tz&KAMsbKweaf;fW;ascN@vVvksYSM@KCAi}17*9OYn;-;_wW zv6nBXyAx1(sxXGyDJY;JLC6uK*Af2kP7A_!U;7pn1bPs>#fTnYt})_>kzK*(KYsq> zh)v4=J^#rk%@FdM*~t^9IA`?uDZ3DS4w=%yiN60gAwZhs{bXtkvQ`gBB6vmFN7k@s zhJWuAml&CXm?6|l%A^P%=ay66LEssL&yXIxU=u!0@>gde@<3WD+* zUUfQ=U;1ZB5T*%1X^pGr33Ghq366+Z{Y=~$RUa1`Z*oDB)-~7koUCD-&$5Iyu9hpL zYS4h_3@4(_3aZ4LNYF>;3^6?qnDDF#Um_M*zZ#A^?+jl2F|?-v$DubHS3!XA0V^Gd zt(N7%Q*~*8UQZ0BkYELlPCBEISe;CjX8I6APYsGQFzi5}7%VzANr6$Oqon+xoi}jJ z^F1wi(19r*>vFaru1qw!ARcu}sf1$8N4dT-Jc z3aC;$8tIHeVs$bT&DATO{o86fRw=PNSoEF!Ktqf2-rgPK{hhny3pOKLbQsv%X%^Tu zZE#XCsLN5^?z7AkDjkTJW5fY!yu%20SG%hfuRH+(#@Us|Gy4cH6+RA2k?Fj@P2ev_ zKrd6(oc@DI5slBN4gPNDZ(_YbHGvrlySkMr7KP74dm8-h#J zm;)^Nb=|*uogvS-8bxQ`R!%9Z3 za^y8rK11*zfJ0w?GapiafR;ZX*xCX+0H(r_R%&F+Mrnw&R+Cd~L*>B3N)Fp&5C1z<2mXhU8)+E=AK7?}>y1YW z4awpcSvV#H$iO=Mpk0sjr7!)N?;x<5rh@Q!n-IS9+P8csjV1(I5ZHZl&nX224jEmz zaNZ2zV`c{*bH9F$SCm<&xyI-u>I8rIfBY0(#*9qdzg7KfpOBy zj7|^r1I{a*IcovIXAsVP`1m&-Pj)b7e&;9xbks(aW0RqNN*XBLam=K*0(D@9d^G5p4;_GAi z_yI=gL4$e^gW)tq7}qs<3{DOG#F4T|4eEv@wJX}8gpQ|jPEvt*%tja9&!6FJl}cG>NYO?0X_h-O~*8h`~f^-V4t)sd-^RCghcX7 zC^z&$#KLb=Sh&JJK`uZo;R;8S{LjGH^l<%(Kj0kFHarIYnE`TRPbd`Lp!j3~QX~hc z%kUeLG(T{HNqUG>Mml(kT6ClO9^^~pyWE!#nzKp)mCJGS;+sy=1Y4eUaV|08@2gRX zJ-1{)^3d)~x{q9f(f2ol;I4ZMD^q@zE02uGDKINzuS?{R9+BmPwe_o$MD@SpOY(~lysW&xFMw*Tr4-!7vfV?S#9SG(H;mHzO_rXl@pg-I; ztslg39y@o``Fw(TpsT2x*oq9tDwRY4-!ygop?@H)fx2O?hOnA^)Oq`BQeweOa!eV2;{9sb*)jRD+585m!)pv)_wxD zJBw7)Cz`c|%4ZKwq}I{PijFk>3N>lKMq&PcpC zj^bMyQM}UlNOwI?gvw8QXMwc<4-Ua!zjeb*VTlg|;r*i=KmyFm2H53Ni-Q^XoASf1 zoCw}sy%D00LgXXcQOZ?S@vbSqspA$Nmn;Fd`1&UNf$uK|kUv1lldh<3G=>K~7LfhWz-58@WysTVQC z7v#5%50@@zR6K^cLwL=|Z@`;5z>_&#qI^LtFXBNa`TMJ60%Q9F6k`Q7fTRM4xCX0B zR~8s$ad>4RL^eQEH13LEZJj#A%4o4TTpfC(34R4{9b%DM1a$}6A=Y#vt0V|N_J|P` z1bPtIV1Mgdzx#@3jBHZ&79$=)@QBfcPx=A@8+7vno+O|J!Tw>dB0Y14BSs8fFz}cV z?-_W?sPF$LM~npOp#(pqe!$rze#mX7++lR$#3{7x4de>1$K zoQKjVA&?)Wg7BRoLHJ3;mz3+FwD&4c*?#clFMs7{fAQB0f9V6r5dNWNxR_FES8s^Z zRd>IM(bSK;7)&qz8lb3tp%4+;;T!Hr~Z_GulxV`-=~jx3aUEa z(I7IF8^kT3{75o|*%pUj^2r&3$3F}-jQ*HtE7m)w7P?fd_`)e6+CiHHV{ zSK&T(KM`}sd1t@zIeP>qpuZC;3TOaTcW{yLJNzRoAk@xYJQ4wdz+?x*c4K>*tC1v-*_uWdGZ{ycc6Nz$C*qaTYZy&<&Yg*mEVMLyHCJ(@OWsU zO?a0)@X$HHB1ZeX^QM7QKt7Jzc|~P90kR>A1`Qui{)+q+s34UQ_}Bf7jm^P>Hy_|I zP;5jCueoe2uh;o!G`Z>YzBBlx;U`z0yK;F$?|ydo;gRr~OY)bn!JiABP&Co~{Kt|W zgx6zG13(dwdZ3xaDv|>Y;zwh$asOSuy+i~kA-fvPf~0}@?f`LUDP@N6rV5Lc7T^zw zFCQMRF7x=?I?WSg190R6v_~JUuP=t{Q{flfnsfwpZ*4^c?_Ej5#Yqd0|N12#O8dK^ zg7A}65QdkOtso39DRYUD52bzP)0{D~2Z4tWXaQiCP6Z+FD6@C>#pAPV<~-mkxvv*`Z91Kr6#3gd;}uARs9r3{40$AW%d&Pln)2X|zw1 zzr4U%C@ToGR&&kicZXYy#v?{Q&Jm;cD{C>8A^h?OnjlP*g*3%w1}P=fC7=A`C22tq z8tig(>Fo#|o;b7oRD?|cir1S+@qXznG0f^!hZyy?B> z*ii}Zz^g^7U|?jUf{w4E$umVv0&o;?0z@509xbmVBhcc=IvqPZ`F>9xE5D~n5Kmr5 zWlo?8zZbp7OxLt0lH_mUfek&@=;Q^8!q4SfR|GuT;fFg0DJh^d2ICuOsYt*BM&u!D zmfTcDY!v9Rp>aU1ydNfPQxOkuT_L~jUp0{y01q&|kVqo+hZ{wxG_Iv4JSsO8`E-I0 zC*Y)50e>A57(9}@QGtULUi<;86&@yXweyA(5u5tkQRBZ)3W3?C^nk-DBkxsBfxygU z1G`C$Kt36T9S3=OK}8}^^@H5Ds*p3dCr2{_RR@7Y8Q1;BUn-S8<;w)}ekSYzp1Sl@ z&Ad;j(brKm-WC2nO6c;0cgm~v!zXaqBQ0MdzgX$i)v51ZiUR?>TEOGVi*$aC*o#!D z6Qq9NBWn~3Xpr{VXWJEqKIlW%rFHIA(y=G{kON8Z$jWO^xjBgn0zC*k7+{a`(1Y;W zYusW)0pS}tVl-3`cqxr{$v(l!p7YiZc+l7u1aC1qM}ELIo(_c5ryn~(ig1E*!3i%b zeeCb;|2=H<_r+U|#>W!=A9LrysGMhzjpUrOy?Iv>5&;N}Os9`P0+Smp z*aX?qw9ILX21%1c4b{WRj%^GziV$d-U(3JWt^Yyk;p(BGjXM8#t4`HL6wv=^=og zLC|5_h~kSgkffOLzozf~^6s63)CDvWZh|{_W39ita`j}jwlGbZuFh79wqJ(QA%(*}%;F$AVQoEP#c6n_hNg1^11}BdqlQrXj$rl_ ztPSimphJ~F8Li#|A!*lWFj!DjJm!+C*+6^|VH64EGQ6xyrQyHC?`A;h1|wyaVZszI z$y*=4=whJ*^XA;Cq^baD3$RibC~eC~V?xx+sC(QHY2z`bJO&x$F!c-+du1ENfQd0D z0aY6M&X%@dV*!1ub+E-x8(m)BR)bO5U91eN&N_q<#cp9)gJ06NUX#e`GBVp+<{3^N zewVDFmOV$g4SEy}LqDWbVJ$(GV9qQg!v_V3%ZnY%tDEqb5oQ-quc`wO!L2%U)tVrr zq+q5P%Z{VbMquH2Ub6;x&5}aBKJwMZnW)0?g02J9tsI15H0|$K;v;k;m#nhcUX+(4 z_5mtWIuiy&zi-KKb~FV%M2VNUoSAxnD#0OVzWdK|O~VK36bq31e{`0D0P+8@*@%&Y zam50&2k*W257~|M!9RRi-Fpyz;weVlgYX-6J4}p8q7$D}Nv{MhC;;Wu1gyY_#du877i@;8u3^mfN_-3 zLk=nP&tv-%x1`xZUUAjE-CiN>SDzONJuD3UZXafs~Sj=$h zTAa$}h6F?_3SyGP)#kVdNE5TviF~V)P=JM&UPu)(5}&H!B4!f7RmH)#q%s5SCk91x zS`judtfh;N%e`n=nOs-TVmKKu@ehQl!0h{B$(v}RWodOj`f}Q(E~3jzDX$Y12Ifmo zl;5luq9$DS1(u2IB5HjZMAz1lNcVoQs0^^>!5|S5{8U?XIwCbTr9hr=p%#5Q^)!Kq zyR8WlhH9sfrPb9_Op~B=5n-A=NY+G?c|e&bE`a?!>Z4 z>Y~eiZbrWY)74WRLOh@L z;i(Z?DeD?Zy9TApec)GE6av`XxS;Q0=r^2n5T#NBbin{}LqbwjD44@xqpMLhqH{(P zi`Ufgb+%DWN2Aj!K*#NP4ciW3=9CYeBu3bbMw_jffVu47| zbEuazX3uIxDuQ8ERkSXx&PQKvQy;iq8@kPhQgy>p9|-BIW4HjDZAr2A5_DD)>dqC^ zP_pF&A-jdtQ%3L_BF@13o%KHP>PC%({>>|d7@XAsw%~niMjozu)~nZe#j{rF9E_<2 z3JF>TqloZ;RWDK|{Krl+Qy`2jMq`IjE=qgnsuv-6l`KD98!Mlv4^P;7$QE+=e)<99zTUY?f?RP1ZE08|NTGDAdq%SS=m;?35-L^Od@a` zl3R>C==3yOjM&A*fvS(&K@b!OzzV^el*bk$rDMAKExt@e&5A-6m*?#@IeAN09d zL4nf1AUS>t6`K*!?I~2Kj~bBw68Llx^!zhiuM5nn;DY7l3f32yZ_wvv1+CDnju03b z_!Oe!Di@*I6wIk#&AO=$KAH7Jq-<(N3ki&>CXg%Y3g{efXQ%a45mkoNJ!-cTg00vM;9IL3}OkvjmtX_<`H&x4xKk}XAtL&I&OgXbKe&|y9m(<;jIiA zz}P=j0}H$ABKiP-U0?GP%%g8<(S0liMCIUt)xgkIg4SP4I6>|3EP4(>tt*|)S1o|W zMMo(e2jD}0m8D`rQ@GDBGs(iw{kp8#n6H2J+ItioaWojr5y4A$@}YFGxTsnDK6=wC_JDgyS$bq|7DjQ*-a%G`s%5Q1Bb>>zN(z~&wVr<5I1 z2Hce97NawC5FT-h5!--HbI_^Vi%xol!R9_>I|TjxfBXxEls(tf7K4;OWF6y=PaS8{ z`P4}p65NsI79*a=C`bhL!P8GMDb0xTbI-r<(o4U+=^$LLo0OeF;6DV8Ii)^uMmZgX zuTq6DwYum3E0vsj55wuq%UzZhnlu+AJ}X5++(eD~AXJ@Ux$-i9gCwDABw8sO(kqyB zeeVLQY=z|l^<9dxC4=p!nbyj~ZWSS<^T4C7|K8U@i4 z>P$^nH$QNNKB({iirbovo*si)mqBGwvpLChbYU40`e_eBm0hj11#uy*maS>NIAf zA5|rkZ5mX^Kv$7JBaI%I>ep&y;oh(B1}Ol#d2o=N@IxPNNnk|QRa}G4PrXB;AbJKE zh7HfBKQ?;R2ho*pmA0QH@VIs}Ud6^jC*(zl6l9=GH`bB#7*5f8V$_KXIDM!n88 z+NMajWaQlhwc!YVNlNw*&t$U7p#{S(>Nz6n0D{9^+?X6d^dV&tAw3tU`@~mjsvJyC zRm3{xn&50)>s1}NiwKTj-oRD5GJ4&H_UOUlJpad++ozPDgZsbtWGM^&6Wgp zy|W=T0m#-PQ_*!n9bYz}lqK&n9UzJWxY*=6MS zm`aGwQ}-Zv&M5@~oA+rUTz}{4Rc8>s|NYCCYm1RBgcmqCh#3TGgeRWzIHAWz55X-) zR0j_+s7(8S&Vl=jPV${^E8uhA|6uAMq<(M*5)9BffODJjNk$q@38$1FI>QVCC4$!= zJn2OUZZUd>0)fjJzUCeyXAu5l%^+OA?hJxkj4TlPCgrbEh0y;8sH=ntDFzY|_!QN( zH6Pud4>T~+(ev&eML=M-xDl>A7AM!4EST15gXmK&qAd@(P>BmX#3>J!(*rR@Vv7p> zI%fUL|H(SePfpviyo&%yEJjk&+(w9AL0SZDLAZJpJgY;Vcz%-D8gfWaK^qt>h9GP> zn6Id;F$sBwrwJdJ$k|EiLRF(0sGFVq`jiBr*~}!5|BULOk`@W(fx)I^ z;Esk*Dm5H=4LL$-I1Z159c)CvP<&=qr%ldecn>pZ7d3+Rvy=g`!(rh^(c5& zhdlB8B(X(>en#nU7f%ro8&tlF07zM#Nl?DR*WbTkFJP_?+A)e?x)izTsud*ahNdMv zCVZ+|Fw|9*Bz5d?!-8$k3k6y{r19h%i z2%q#fUD`D`)!h1ivTJ(wGgSs9x@klIpnOhmCDdwiMytB6i-QXGJxNJk6+vGCjjM#5 z1m2$nUFf<)A!SKjohn7G4bn>j8Aj03Y`j$w}ZHi1Fj z`cQ2is>x(V8Bjh_x0*obJ;o6bc{rB{MUU>t0lE=|0lcOVUS^b8_eTW3&&_L_o0Na^ zu>}GxgdcIy*wr8Y@IP4~c#6?)v&V=TgcmFjED@e$3c>rz7zkhlffm9er}@!65T{Rb z1ko`TodlvrFzij z5&8}wRT^}q5Ng&)QN6sm&Wfw{JZ93Z1j?p_l z)yo4dT9AAv-fu3|B*==%bhAz$$eQ}3n-DJ&D^7Ybd0WO2rb@slbwK;jqjgON8e9qd zff1L(2ePIl@elk&S?=>-<&MfW!vb35BbQy z!3s7lf%^I{)>3p8yoq`*4FipjJS#So(!fLtg!oW(>6kaL9%$K`!R+2fceZ)xm>z*P zLVGi*J&FlkjWDC{*9~i#PR5rrr6F6oOBcEHC?*mn-#TLH8X;fm`!eMMG)h_H*g)}$ zdRhbVq3YEfV8JHcPyFZ*1C439RHqM`4e{c#2nY-{>d;FrN#K|MP=-!mJf3<#l|k!) znW5uHEn#y)VVfYjWGA;sdkq|auf#GV9 z?RjN?77syH1eO6$HTymf%aVdRfK`Xfq+kC;~;-}nq2prexFG6ZS{;`crv{ShO|%o%Xe z!3Q;#?3D-1Ekm(hoknRvTHXK0s)N9g@-OTl0Ja!i=N^Q&IK}8P*C5bB7^fIHqx>xG z17{GtOZkka7(H_4A!-CqF=7hA`2&7V86W4PpQpe7edZYi+6>3YBh<|a$N0k&Cn5AA z=t!Jo>yq~%u+4}Ogfk3AQy)A@1H(qfb94}1e5vk1`0d(a#9%ek6BIb_(g^tlVB=Ko zLHM(;5dKtKjNYE6;=+??p?+put%s;$;*yT-zir(V=pvzYmnoqTmm0zaZKRt};_I6M zY12X_%x9?^6<=L z!WBJ%CS+ZoTn|v|T%FRFP(uvSYoQ1ussn#k3Zr1i0JfpjIss^?AKtH0;eE_>hLVyx zM7^(CuE$XCni~hwX(}P4xJZ;Hf+ph#Mo~UFf4e^TG5M^YG3)KL{Hg$$^%exymCQzq zB7Qo#SpACLw?50v>SgsSMH`kbM1so7C#UTphX}2F!5t6Dy#48~4{jX%^6rf?fc-?e zyEhJQ{1|ul;NY%~EWd_{A0KQo2g6RfbwtC8LyHmC2%L~~&4guup>A+p`B+a#bt_Tj z_gaT5ppWnTam5-DfpZ9GCcRIs^l8VBZ~8HASf>~*^|IqzUSL@{<;aKFrCq{o^tdPj z%~T7~iT80>m|okc@JgtbfTwE!9SL1oLQI{aH0gfxs|##(6fUAblh7>38Oq0QzUh;X z63dr86o*dg5(YP(>II;%v|+xgE{W0@`ZBk(lohvAG)%h1LhIj)PCelSL|q_lh~<*$ z-R;9Is2iEK&=1j}rBe!A8v52o-$M6}XZA>`pF^_w;2m&>b?Oma2&^Zm)(s8cJDYK6 zDhX={9^4i+geaZAJX?1)Yt)^DsEZlY$ryMov-UMhjnb_#Y;Hs^%cQhEg@^iUXs)G> zMl$sXOYy${&%FAoNoX}BynXo_bOy#jsPEk$_bI$r{RV~vUbRiY8pQymf-QnqY$9O! z#HU{P2*-5?UUt9@X(+$1ZtH+iWQ_I|>Va22_yA6^K%Kz#YMWu@mw)f~IOdc+M!)eC zqp`zi%phE42H`DFF=B_&*Z2y5>3LcR&L}_ggcl+3rS8AaKjS?J51%^CAn{425X33I z@=tmnG9$;I|Ndu9rx-b>d}17SIs#@7PK+@G79EL`r@bicQ7=jZlp~Kn{$w3<$|j>{ zJjKXkPMJ}zi_$LBLAZL=V~lJee0|)5;7!UY5dN$ygg^O^^0KwvE_l04IcHo+3bRR1D~XgoxTN)Z=DYM9h;8 zWnIxF^%G_ql`PF#gNM~u!10V!>y{Q28my@lSX}08NJ8J4yi$38OFhgdx_=TKl#L0= zP0@0Tg&u3*ad#7yflUXMqG>XiicVlk$rVsdknd6GjS<859SiYNVIVru=<|yLZ&v=5 z4liXKff~V2`LZr;k?<8A;}4f?l=KNyLlkADG%6WwMugV8Ug-0Yk`?+!8VY4a&>>cX3*iTge*Ra#95um>8~??Rd&q&2l>weez$^t?w=%GBD4h_YONB3kn^S;^ z)w@QQ0#mv_qdsD ze^e9rj0x=N_VzbZ0D7y236)Y#kSNO0=)ZSO;+58+CL(0~IRyc_E~%;t3a+#uLDwpZZ`zcSK+t*iV(M~EDojQnT$}Q z5ZJ-M)u|{BFVSd-&d;kI05AD>Y*gZmB?4xs8J|`!I0(T%1|0&p4X(V61{gb;RQT?v zNN~~`oeWxyQd=2pl}^n7_4c-!b{_65dTw;Xn~9zsN;<72fD9Sy!<*`cdi9J!j5>f- zd5L*L^6FyPS4|jH_zj=Bi-a;#n&VZfj6cprX%q;*`1&~J^!io6$gdZrUH-Ne!iz7w_#7>S=WQW)$Z6FFXPgZ1 zqO^xjpM2%?E77r}+h51nAo zk~bl6!s!{xgE6N3eIjX#ZGv8YH9m3F7BfsZ3{CNQ9-B@af_} zmTUxV!-PiGV-9+sWgkHUR02{4(S!AKPbWniU(Q&Qyf%86Sl98c=soqIQAlX8{`LQ@ zDv% z$YWyh3*9(6kKTkq?^(+DLthxJ7n?~1lT|Vp#&u_bnqnc84U9k2)RU$|!$faAvM`_` zsL)4_zsJb(|H{^&9#>8VA7SHLZ`CNi5GC)%Mf|BwxxxwR6C&vPP^4+JAxuHQC*0P| zxlKz;mw5c))%RsXNI@ZH@DGaKE|oyNk=}xjP{|E%BG4OQ$jX;Ie*;6`NeaNHH^1l8fVWcidkcM=jJm!M zy}tPudL<<)R02ca=7*;sPzM!kL%iw%b(hp30vQ_!TkyiTh7Em-R>N*(O6Lul16xi; z{CkgHaxj8iozaSJ*8v?^91v;HzPC6dsg5|R$dZBK3KIAc=gu}LkGff(LriqpMi&*~ zLFq4#%zeY;hY+YcDSclzs)Gn{otblAwRr?^X* z`r{G*-^vUEU`V-6F`|PY*kW|~@>|q2&LDs~<#f6z?JI)*KS|x+UZMx?fT6a8dIUD4 z>WPknF!dmb-hb4t9@zwiRs5jYEX;bU2n;aPmM|3wSgV1=6VRe>To(+wptF)j^%0P| zWGH8{xKNx6hVv^&sV3iD16=2NFrl4R7hPIH-Oa_&&C8e!lm5x&zwcKGQdRadk24 zqI1Ed&q8_vN9aKk|iS0y5LP5-XcPO4LZK?X+dZ=6@fX+g@XMD zBER(gl24wDBEanFC0ZO>;wYm894$%&L(LjhU$Y4>BvBv6AvT|R85iqyS0_IIx zs<2G>j9LK44_F(N)==NwvP3ArwxU@c&~#wS(Kb2(jf8OpgV=Jvk;MW(+6SJ08Xa$K zfUX%I|E%J^@0(_&rH`LpqvzO{U3j{ z0y~Ue;G#5l7;(a=S1GgA$Ejh4hq)$=Spi27PCH!8IY!6%+&@W)Kw;3||C(us(WoFO zAC4J#%IV3mGwIl=ll+rTpQcKn?s&xiHy(cMOr2unJqS;DmeR9yG+v;C@FFb^uTsAJ z{kI%J@E!!}1CKe)JqQjdf2Hu#MkBjei^s;P4HyjKDo$gOW{a>@irc(IO@Wn$Jf$@=Shp|>pIG;h!MLQhAq#wL@(K+Z2-Q$oA05#}95 znmo10_y_}eysq`wjue)Y&C%PdFFx+q;rD!4+t#Av6DJ1=!spDrv=A0*!d$Xoq6!8B zowE&%yqR$H6Q*zY8C?y?+O{T&8^wkMCRhu7iCItkAo|9t&H4m&@rloj-txp#iBDV= znEb4qsH^BI!VjE(`+xQPz$(;zf@P4Qg5o;kTm;Cj4c6w%2z%Ku1BhkpSb#{PKZR zolo+EJ2!3~z|?y_*@uz=Zq{l5-DLDqqGu(C3GZ2Gy9Ch_FLfi#W=j&*tU517H@XI) zSj4^eBh~-=KW?0O7;%h*jB~6UAv;t!M~;E*(4+(JDcoX zA|op^@_qDtKHs13pYXc>cz*D>T=(mKjobaY->y2DUr&_F8%WGKA^NLC=0<{v+!`cZ z57B&Ei)wwK@%ki>(xD`Gctg-H1(gsg^B{e}y4&6F)5{mVDc_enCz5gwb#hE6$Xawy zfPTCooOJloS!q?uZHYCLA6N8(X*p@l%1a%aR?XOdEC|}XrOUqCkUV_0@^C#aG8O$Q zH|CnIQ03Lvo>OA}+INH=_cR;aVxpDqd+-G^YF8FX6Mu7cqA!z7=OnO7eB1q^VXe+lAg$U zUeF+K>$8=VdnT}-80c)Jy`1?|bFkW3d)M$4_S#M2+NbmF4deZWz>BfGEpd=VXIhhN z$_zd0KC;e?%AxSe)6wHs&KE7yaS47n6~Os+)97tKV8M6vgsUGCaNx9Y61jEi?Ui%mE|*f=1B4I+eJu{fR5 ztiQVHHjA_LUx=-e1fpTG;6?a#sB@xI`InlXIW6H)WtTOU*+bl|(KqO%&`MWYj4qD| zK7DBEhxQR$M4jD-7ln<{kdl`Pn+>D;0@P{e{7sN&A_dj6!5nKu1FoMfkukWF%66 zg(zj8>JpvwQ5ECv$+qyOG!eO@*QRnKqQAzY4_UE&x~qy;rgUg6T-tl*es?HQb&7ry zUbc+RNg@%~Q)d{bftXF-_cNiKih>b)E~H(w_dg3%)O^fFI{8A!`E=@{io$ZB`jX{{ z_>putE+a;}<@(w8^8LNO*+;M1us4a!*zgn4g2rYe`d=)t_3)F^{QOw|CXAq2y_*2N z$J%MG5Kn{prnyIA;b39hBJ0yq47U3TLxkxQdq+6on~oXNt>bT@+KTaS`xcB#A#-G* zOP2-=tTQ*ii}8J8H_S9)?Uo>Ae7<<2@tDe;-^!NFihqIetB1iW^+35BQp7TB&P~cq zid@6zIiealN=Fls!yB*%57j2w@b4NCeRRP$@|=DmS;2dZNA%b&&+XM5zt+f+0&U4G zzgF(h)ZJtkRoMJFsTIJ8FzyZvetmJ2aL`&Yb!5$zE|N;pUZZ*dU+?$Gtm ztw|!r4q0(3k40&g*dvYc!cH88O8Vya1;mmb*s5o@Srm4b|KJqf=d-`Z54|5*S3R4e zrhpj7tNcVI(?p(WU%Gc+pvG=VWkAHG@nf#HSk>4I8E5sJ@_lX%3$Qj4xa?7s`9s-Y z1l{Ef=ezsEULqXITBEOMJqHu!KC2QYOvb&Ck!rdh3oCm`|NIuk&td1(NDHaUl`{6L z6dienRr`JiuPwWCzG`;f=?oO$y?S?fdE6y%vLW*!Q@W?%ateDhMM2R+_Y>4gmom>Xpz^92y*@#Gz z4e4f$@>=qm;XIn%)}#FMu1AeQv?@TAxU`DhPC%CFOTx9O*l^M@$YWA7N9%7tjz-6# zda2)&xk~s_@Y>|6fE^Kcyj*@*y=ybO%mCA==)U4^Kinj57Yv)b5x1#tzwu`NxjXmw zRmqG)uMHkrWqTLDU#3?EBVgEozJY*9GLApg?IaE5hz+K#oNE@7^PSrpX4t~t$4)w= zwVi7*zlGS_uDo+Im88)La;9bS_7IU5VD(vzeH%4AwtxDRS$~!TpiMz?WCL{8RR@HozAQe`7RY+{^eF9C@Kd|#3&s8X*S2i4Nl6{AY%@|&(MyEG!br-) z+lr{#67pY);!fm8y-r6mE#@N9Wo>Wlz}r!FY>wcgvRBbJ3;QaXR@z6vI|sh*dxFoN zNXtAoXYC7j;2li8*_-6iri+K0Oc(B z|VS;0!v z2y+1~puJWb37s{5Q93)DvDTf30-K7q(zKt^?+@N zV58GJTr&%=D%350*N}QdJh1X}Ah%4~QR%cUcOc5J&df)HTwPfZ?W&p8Iiw>)(cPtCx+(L*^W&w>{WwdOrG$uX0_qA*l(vW3?op%QnS)2(!U+0x z11zL7BaB9I_g?;8-Rr5e8JQC6v-mOw#>2dR`KSl*?o68xEfHM89uYw^XEQ!eFL)ZS z=h?ED{LcLK;AcL2MJ1KZZrIKWzXbNdSY6!r$hsPpuZmad?NqIQLGGmCY%OQJEk+#7 z+L!0~Z8&BXT6JQkG;?1M+EAL<48A}bX9-7L&f|_!c(0cKQXO--r2XvbEu?IEFzfTH6M;+Z848R05>n zyI({8O!de`0Zr*xvk|^a?1iBa)%EVu^;4czXRQXW+t=qyc2>I9-o-T-1ipNqrq>xH zc`~=EZyShN_HCS0O3aOlb$mD91wUp+s3{rx zINAb1p8Xmy(_o*?{WwXco#5Q!Hj#YKIDov41o~v)xIs&%#2Ies<7c%Mg@CMn#;km0yv%dM753{hMjONwa zg~k8|S%{;5DiMXFE4uRdTNXj*nOKpX2lCnZ7x(jw57pz3ge_iw7(e&*pI~()5BX+r zbN$ zScOnu$}r5Ve<=Q$6&vJUUL}Rq`|loB@MWj?-Oy}Bb$?kr6a~QX&B%T3^Mx=5Nr1*x zgOZdNeIIAZ0EuQz>t(~F!|=^KcqfR}sC7r-HM1wL)tCnM>Rzl~vnNveZKj{^_$af2 z)0h`1SPY~4LnCfKg6GF-ggIKgdHOcbZk_Dp^7c}k{s^Uh@9q63+SmK9C!U2dP;;BT?1Lu1qF3l;#%im!$bIz_~=4NIV!R`QL^kv^m zAVi^gkt1WlG)w$l>NBTlDaUJqo_9SXx^Gs~2h&*Tw$JV<-W)O4uQ$ITJ711`Tf5x+ z`9f%?Kuhed+w+U&5yT?s2^W5VyC1pG z`ziDes2C_J?EG+Vz{vgNnCez4nJmD9s;gzlp^0W4Ldo80l}@`WP=cui$XMyv^g7;@ zDOs(63-Cn)Rt@?xm=Q#Jmg6{D|5;f!9Mn-3$%}OLTtK`j8 zIm#>`y-RAwbl6bD6YU!lEgoJjw}CU3oD2nXibcCPlYhma=cfZW@lJYEttjBo>)mVV zI&$p};1B#L0^ycVU2D~HlR-BfLnej2YP4MqdI*8E;=z1iUA zO5n_S&ohSNFMQjbHp?e$IY`T8lYagcBaPynYjy2mEe=e8FJ;hf5F4aKZZ?|LjGPI0 zH_ec9b(`Te@m%CT8QLX)+IEL)&=U1ynhM(13zERZ9VA3ln ztm z`1k@jX+}S2P(yGCStM~X_m=f5iN{n^R)#5}8FKj3ud<3^}FyBf+>N2+_PxCR_2}cXbfvIO6iTHa!==mx-xxh)jQ}I6u3eI7uIG& zdH;#!MO%2q-uuUkK)Hj;L#)WMTrlRhbpKN6o^&LznmLW9_Gdv$)SjcrvGC;`=)&OK zTP^*ynQt5-`W)HMNeptI>w<3N2Wun9qnS`mAe%em$yv2gxx%Ar>Xw2r8_(-=%0RMC z;$KqX5ws8h|J8}U^@0!dzD0?klMQ^i>FVb3F-Y{wl1=^hyaGGoSxQ0JW`X6<%@q9* z;zvI#eRi~$XbI&a$UPFu)XQodzw2;|Obs^bH2qC}N>AZ?kYRDKC*1dPG3ZsNp{V8B zuc~!IjkqgE&DUuWz5{GI4>W{IFTn}sKG2To*xe0>5b1(W0?d+g{mZK;*4ddEW3^+Z zi+I%%xw9Z%^hb7!7yqc^$nun05b7Ao-~&C$u2IOni>=sDCG=M=dqgwj{P2h%&DoL3 zbu{R4deqQ>c)Cdz=LC zVBVt;ks0b})~JKuT=*XzGBz4)oEMF3YBiW48{9s>2D zv~qW+gh9EqCvn@SPdWcj0-g!$HZFYURe7L*7Cz(bJO<`yrjSK4IG%|WV3kPGzIqR^ zDaMHpte0LwysQ7l_>@LmAS3uyb{=*w;P7<`) zkex8_h7d(?;8>9Nrn0~|c>QlS#mLJF>`lJ3gC5WyKuIe&3pm8rsC|buv^_2DVfM9b zxvR>VPM}^^&ZOtusG8jF*Ekx#SP*W4`V$lqQ(dL=vH&)ao~@3ur1;{i{?JfWRTd05 zhvYLq&zF0^4G)l1147=yfzMD#$8AUccWM%xC>E1XEU`RxAw(DFvGLTuTWCtq#e