From a03b05aca5f1ca3cecaff789504ca51ac855931f Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Tue, 27 Feb 2024 14:10:47 -0500 Subject: [PATCH 1/5] screenshots-prop --- .../src/broken_links.ts | 32 +++-- .../src/link_utils.ts | 20 +++ .../src/navigation_func.ts | 32 ++++- .../src/storage_func.ts | 2 +- .../test/unit/link_utils.spec.ts | 55 +++++++++ .../test/unit/navigation_func.spec.ts | 114 ++++++++++++------ .../test/unit/storage_func.spec.ts | 4 +- 7 files changed, 202 insertions(+), 57 deletions(-) diff --git a/packages/synthetics-sdk-broken-links/src/broken_links.ts b/packages/synthetics-sdk-broken-links/src/broken_links.ts index a99650e..fc241ce 100644 --- a/packages/synthetics-sdk-broken-links/src/broken_links.ts +++ b/packages/synthetics-sdk-broken-links/src/broken_links.ts @@ -40,6 +40,7 @@ import { processOptions } from './options_func'; import { createStorageClientIfStorageSelected, getOrCreateStorageBucket, + StorageParameters, } from './storage_func'; // External Dependencies @@ -117,17 +118,24 @@ export async function runBrokenLinks( // Initialize Storage Client with Error Handling. Set to `null` if // capture_condition is 'None' const storageClient = createStorageClientIfStorageSelected( + // : Storage | null errors, options.screenshot_options!.capture_condition ); - // TODO. Just to show where this will be called. uncommented in next PR - // Bucket Validation - // const bucket: Bucket | null = await getOrCreateStorageBucket( - // storageClient, - // options.screenshot_options!.storage_location, - // errors - // ); + // // Bucket Validation + const bucket: Bucket | null = await getOrCreateStorageBucket( + storageClient, + options.screenshot_options!.storage_location, + errors + ); + + const storageParams: StorageParameters = { + storageClient: storageClient, + bucket: bucket, + uptimeId: '', + executionId: '', + }; // Create Promise and variables used to set and resolve the time limit // imposed by `adjusted_synthetic_timeout` @@ -147,7 +155,8 @@ export async function runBrokenLinks( originPage, options, startTime, - adjusted_synthetic_timeout_millis + adjusted_synthetic_timeout_millis, + storageParams ) ); @@ -169,7 +178,8 @@ export async function runBrokenLinks( linksToFollow, options, startTime, - adjusted_synthetic_timeout_millis + adjusted_synthetic_timeout_millis, + storageParams )) ); return true; @@ -215,7 +225,8 @@ async function checkOriginLink( originPage: Page, options: BrokenLinksResultV1_BrokenLinkCheckerOptions, startTime: string, - adjusted_synthetic_timeout_millis: number + adjusted_synthetic_timeout_millis: number, + storageParams: StorageParameters ): Promise { let originLinkResult: BrokenLinksResultV1_SyntheticLinkResult; @@ -232,6 +243,7 @@ async function checkOriginLink( originPage, { target_uri: options.origin_uri, anchor_text: '', html_element: '' }, options, + storageParams, true ); diff --git a/packages/synthetics-sdk-broken-links/src/link_utils.ts b/packages/synthetics-sdk-broken-links/src/link_utils.ts index 94d8899..bcf403b 100644 --- a/packages/synthetics-sdk-broken-links/src/link_utils.ts +++ b/packages/synthetics-sdk-broken-links/src/link_utils.ts @@ -18,6 +18,7 @@ import { BrokenLinksResultV1, BrokenLinksResultV1_BrokenLinkCheckerOptions, BrokenLinksResultV1_BrokenLinkCheckerOptions_LinkOrder, + BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions_CaptureCondition as ApiCaptureCondition, BrokenLinksResultV1_SyntheticLinkResult, GenericResultV1, getRuntimeMetadata, @@ -272,6 +273,25 @@ export function shuffleAndTruncate( return linksToFollow.slice(0, link_limit! - 1); } +/** + * Determines whether a screenshot should be taken based on screenshot options and link result. + * + * @param options - BrokenLinksResultV1_BrokenLinkCheckerOptions + * @param passed - boolean indicating whether the link navigation succeeded + * @returns true if a screenshot should be taken, false otherwise + */ +export function shouldTakeScreenshot( + options: BrokenLinksResultV1_BrokenLinkCheckerOptions, + passed: boolean +): boolean { + return ( + options.screenshot_options!.capture_condition === ApiCaptureCondition.ALL || + (options.screenshot_options!.capture_condition === + ApiCaptureCondition.FAILING && + !passed) + ); +} + export function getTimeLimitPromise( startTime: string, totalTimeoutMillis: number, diff --git a/packages/synthetics-sdk-broken-links/src/navigation_func.ts b/packages/synthetics-sdk-broken-links/src/navigation_func.ts index d7d856a..ec66145 100644 --- a/packages/synthetics-sdk-broken-links/src/navigation_func.ts +++ b/packages/synthetics-sdk-broken-links/src/navigation_func.ts @@ -19,6 +19,7 @@ import { BrokenLinksResultV1_SyntheticLinkResult, ResponseStatusCode, ResponseStatusCode_StatusClass, + BrokenLinksResultV1_SyntheticLinkResult_ScreenshotOutput as ApiScreenshotOutput, } from '@google-cloud/synthetics-sdk-api'; import { checkStatusPassing, @@ -27,7 +28,10 @@ import { LinkIntermediate, NavigateResponse, getTimeLimitPromise, + shouldTakeScreenshot, } from './link_utils'; +import { StorageParameters, uploadScreenshotToGCS } from './storage_func'; +import { CaptureCondition } from './broken_links'; // External Dependencies import { Browser, HTTPResponse, Page } from 'puppeteer'; @@ -104,7 +108,8 @@ export async function checkLinks( links: LinkIntermediate[], options: BrokenLinksResultV1_BrokenLinkCheckerOptions, startTime: string, - total_timeout_millis: number + total_timeout_millis: number, + storageParams: StorageParameters ): Promise { let timeLimitReached = false; const followed_links: BrokenLinksResultV1_SyntheticLinkResult[] = []; @@ -120,7 +125,9 @@ export async function checkLinks( if (timeLimitReached) return false; try { - followed_links.push(await checkLink(page, link, options)); + followed_links.push( + await checkLink(page, link, options, storageParams) + ); /** In the case of a single page app, network requests can hang and cause * timeout issues in following links. To ensure this does not happen we * need to reset the page in between every link checked @@ -165,6 +172,7 @@ export async function checkLink( page: Page, link: LinkIntermediate, options: BrokenLinksResultV1_BrokenLinkCheckerOptions, + storageParams: StorageParameters, isOrigin = false ): Promise { // Determine the expected status code for the link, using per-link setting if @@ -185,6 +193,21 @@ export async function checkLink( linkEndTime, } = await navigate(page, link, options, expectedStatusCode); + let screenshotOutput: ApiScreenshotOutput = { + screenshot_file: '', + screenshot_error: {} as BaseError, + }; + if (shouldTakeScreenshot(options, passed)) { + const screenshot: Buffer = await page.screenshot({ encoding: 'binary' }); + const filename = 'test file name'; // TODO pending YAQs + screenshotOutput = await uploadScreenshotToGCS( + screenshot, + filename, + storageParams, + options + ); + } + // Initialize variables for error information let errorType = ''; let errorMessage = ''; @@ -224,10 +247,7 @@ export async function checkLink( link_start_time: linkStartTime, link_end_time: linkEndTime, is_origin: isOrigin, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, // TODO: this is temporary in an effort to make PRs more manageable + screenshot_output: screenshotOutput, }; } diff --git a/packages/synthetics-sdk-broken-links/src/storage_func.ts b/packages/synthetics-sdk-broken-links/src/storage_func.ts index d8a7136..fafc1c3 100644 --- a/packages/synthetics-sdk-broken-links/src/storage_func.ts +++ b/packages/synthetics-sdk-broken-links/src/storage_func.ts @@ -139,7 +139,7 @@ export function createStorageClientIfStorageSelected( * @returns An ApiScreenshotOutput object indicating success or a screenshot_error. */ export async function uploadScreenshotToGCS( - screenshot: string, + screenshot: Buffer, filename: string, storageParams: StorageParameters, options: BrokenLinksResultV1_BrokenLinkCheckerOptions diff --git a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts index 3b177c5..22fc3a1 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts @@ -20,6 +20,7 @@ import { BaseError, BrokenLinksResultV1_BrokenLinkCheckerOptions, BrokenLinksResultV1_BrokenLinkCheckerOptions_LinkOrder, + BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions_CaptureCondition as ApiCaptureCondition, BrokenLinksResultV1_SyntheticLinkResult, ResponseStatusCode, ResponseStatusCode_StatusClass, @@ -31,6 +32,7 @@ import { getGenericSyntheticResult, LinkIntermediate, shuffleAndTruncate, + shouldTakeScreenshot, } from '../../src/link_utils'; import { setDefaultOptions } from '../../src/options_func'; @@ -210,4 +212,57 @@ describe('GCM Synthetics Broken Links Utilies', async () => { expect(startTime).to.be.lessThan(endTime); expect(milliDifference).to.be.greaterThan(0); }); + + describe('shouldTakeScreenshot', () => { + describe('screenshot_condition: ALL', () => { + it('should return true when passed is true', () => { + const options = { + screenshot_options: { capture_condition: ApiCaptureCondition.ALL }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + const result = shouldTakeScreenshot(options, true); + expect(result).to.be.true; + }); + + it('should return true when passed is false', () => { + const options = { + screenshot_options: { capture_condition: ApiCaptureCondition.ALL }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + const result = shouldTakeScreenshot(options, false); + expect(result).to.be.true; + }); + }); + describe('screenshot_condition: FAILING', () => { + it('should return true if passed is false', () => { + const options = { + screenshot_options: { + capture_condition: ApiCaptureCondition.FAILING, + }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + const result = shouldTakeScreenshot(options, false); + expect(result).to.be.true; + }); + + it('should return false if passed is true', () => { + const options = { + screenshot_options: { + capture_condition: ApiCaptureCondition.FAILING, + }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + const result = shouldTakeScreenshot(options, true); + expect(result).to.be.false; + }); + }); + + describe('screenshot_condition: NONE', () => { + it('should always return false', () => { + const options = { + screenshot_options: { capture_condition: ApiCaptureCondition.NONE }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + const result1 = shouldTakeScreenshot(options, true); + const result2 = shouldTakeScreenshot(options, false); + expect(result1).to.be.false; + expect(result2).to.be.false; + }); + }); + }); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts index b023a50..7bcd902 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts @@ -34,34 +34,63 @@ import { retrieveLinksFromPage, } from '../../src/navigation_func'; import { setDefaultOptions } from '../../src/options_func'; +import * as storageFunc from '../../src/storage_func'; + +// External Dependencies +import { Bucket, Storage } from '@google-cloud/storage'; +const path = require('path'); +const proxyquire = require('proxyquire'); // External Dependencies import puppeteer, { Browser, HTTPResponse, Page } from 'puppeteer'; describe('GCM Synthetics Broken Links Navigation Functionality', async () => { - // constants + // Constants const link: LinkIntermediate = { target_uri: 'https://example.com', anchor_text: '', html_element: '', }; - const input_options: BrokenLinkCheckerOptions = { + const defaultOptions: BrokenLinkCheckerOptions = { origin_uri: 'http://origin.com', max_retries: 2, link_timeout_millis: 5000, }; - const options = setDefaultOptions(input_options); + const options = setDefaultOptions(defaultOptions); const response2xx: Partial = { status: () => 200 }; const response4xx: Partial = { status: () => 404 }; - const status_class_2xx: ResponseStatusCode = { + const statusClass2xx: ResponseStatusCode = { status_class: ResponseStatusCode_StatusClass.STATUS_CLASS_2XX, }; - const status_class_4xx: ResponseStatusCode = { + const statusClass4xx: ResponseStatusCode = { status_class: ResponseStatusCode_StatusClass.STATUS_CLASS_4XX, }; + const emptyScreenshotOutput: ApiScreenshotOutput = { + screenshot_file: '', + screenshot_error: {} as BaseError, + }; + const successfulScreenshotOuput: ApiScreenshotOutput = { + screenshot_file: 'bucket/folder/file.png', + screenshot_error: {} as BaseError, + }; - // Puppeteer constants + const storageParams: storageFunc.StorageParameters = { + storageClient: sinon.createStubInstance(Storage), + bucket: sinon.createStubInstance(Bucket), + uptimeId: '', + executionId: '', + }; + + // Use proxyquire to replace uploadScreenshotToGCS + const navigStorageUploadSuccMocked = proxyquire('../../src/navigation_func', { + './storage_func': { + ...storageFunc, + uploadScreenshotToGCS: () => successfulScreenshotOuput, + }, + }); + + // Puppeteer Setup let browser: Browser; let page: Page; before(async () => { @@ -74,6 +103,15 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { // Create a new page for each test page = await browser.newPage(); page.setCacheEnabled(false); + + // Stub the page.screenshot function + sinon + .stub(page, 'screenshot') + .resolves(Buffer.from('encoded-image-data', 'utf-8')); + }); + + afterEach(() => { + sinon.restore(); // Restore all stubs }); after(async () => { @@ -82,10 +120,18 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }); describe('navigate', async () => { - it('should pass after retries', async () => { - const pageStub = sinon.createStubInstance(Page); - pageStub.url.returns('fake-current-uri'); + let pageStub: sinon.SinonStubbedInstance; + beforeEach(() => { + pageStub = sinon.createStubInstance(Page); + pageStub.url.returns('fake-current-uri'); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should pass after retries', async () => { // Configure the stub to simulate a failed navigation on the first call // and a successful one on the second pageStub.goto @@ -102,9 +148,6 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }); it('should fail after maximum retries', async () => { - const pageStub = sinon.createStubInstance(Page); - pageStub.url.returns('fake-current-uri'); - // Configure the stub to simulate a failed navigation on three // consecutive calls pageStub.goto @@ -125,11 +168,11 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { describe('checkLink', async () => { it('passes when navigating to real uri', async () => { - const synLinkResult = await checkLink(page, link, options); + const synLinkResult = await checkLink(page, link, options, storageParams); const expectations: BrokenLinksResultV1_SyntheticLinkResult = { link_passed: true, - expected_status_code: status_class_2xx, + expected_status_code: statusClass2xx, source_uri: 'http://origin.com', target_uri: 'https://example.com', html_element: '', @@ -140,10 +183,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, + screenshot_output: emptyScreenshotOutput, }; expect(synLinkResult) @@ -165,11 +205,16 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { anchor_text: '', html_element: '', }; - const synLinkResult = await checkLink(page, json_link, options); + const synLinkResult = await checkLink( + page, + json_link, + options, + storageParams + ); const expectations: BrokenLinksResultV1_SyntheticLinkResult = { link_passed: true, - expected_status_code: status_class_2xx, + expected_status_code: statusClass2xx, source_uri: 'http://origin.com', target_uri: `file:${path.join( __dirname, @@ -183,10 +228,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, + screenshot_output: emptyScreenshotOutput, }; expect(synLinkResult) @@ -210,15 +252,16 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { html_element: 'img', }; - const synLinkResult = await checkLink( + const synLinkResult = await navigStorageUploadSuccMocked.checkLink( page, timeout_link, - options_with_timeout + options_with_timeout, + storageParams ); const expectations: BrokenLinksResultV1_SyntheticLinkResult = { link_passed: false, - expected_status_code: status_class_2xx, + expected_status_code: statusClass2xx, source_uri: 'http://origin.com', target_uri: target_uri, html_element: 'img', @@ -229,10 +272,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, + screenshot_output: successfulScreenshotOuput, }; expect(synLinkResult) @@ -268,15 +308,16 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { .onThirdCall() .resolves(response2xx as HTTPResponse); - const synLinkResult = await checkLink( + const synLinkResult = await navigStorageUploadSuccMocked.checkLink( pageStub, timeoutLink, - optionsExp404 + optionsExp404, + storageParams ); const expectations: BrokenLinksResultV1_SyntheticLinkResult = { link_passed: false, - expected_status_code: status_class_4xx, + expected_status_code: statusClass4xx, source_uri: 'http://origin.com', target_uri: 'https://expecting404.com', html_element: 'a', @@ -288,10 +329,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, + screenshot_output: successfulScreenshotOuput, }; expect(synLinkResult) diff --git a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts index b7e583a..9d23825 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts @@ -164,7 +164,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { let storageClientStub: sinon.SinonStubbedInstance; let bucketStub: sinon.SinonStubbedInstance; - const screenshotData = 'encoded-image-data'; + const screenshotData = Buffer.from('encoded-image-data', 'utf-8'); const filename = 'test-screenshot.png'; beforeEach(() => { @@ -238,7 +238,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { }); describe('Invalid Storage Configuration', () => { - const emptyScreenshotData = ''; + const emptyScreenshotData = Buffer.from('', 'utf-8'); const emptyFilename = ''; const emptyOptions = {} as BrokenLinksResultV1_BrokenLinkCheckerOptions; it('should return an empty result if storageClient is null', async () => { From 941488ea594b05edd71735c5fa36bf71bd115dab Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Thu, 29 Feb 2024 14:56:50 -0500 Subject: [PATCH 2/5] broken_links.spec working --- package-lock.json | 21 +- .../google-cloud-synthetics-sdk-api-0.5.1.tgz | Bin 97194 -> 97251 bytes .../synthetics-sdk-broken-links/package.json | 1 + .../src/broken_links.ts | 17 +- .../src/link_utils.ts | 69 ++++++ .../src/navigation_func.ts | 6 +- .../src/storage_func.ts | 63 ++--- .../example_html_files/integration_server.js | 8 +- .../test/integration/integration.spec.ts | 8 +- .../test/unit/broken_links.spec.ts | 228 +++++++++--------- .../test/unit/link_utils.spec.ts | 87 ++++++- .../test/unit/navigation_func.spec.ts | 17 +- .../test/unit/storage_func.spec.ts | 177 +++++++------- ...loud-synthetics-sdk-broken-links-0.2.0.tgz | Bin 0 -> 18445 bytes samples/broken-links-ok/index.js | 4 +- samples/broken-links-ok/package.json | 2 +- 16 files changed, 424 insertions(+), 284 deletions(-) create mode 100644 samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz diff --git a/package-lock.json b/package-lock.json index 9318920..1f224fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3360,6 +3360,12 @@ "@types/pg": "*" } }, + "node_modules/@types/proxyquire": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.31.tgz", + "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==", + "dev": true + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -10935,6 +10941,7 @@ "@types/chai": "^4.3.4", "@types/express": "^4.17.17", "@types/node": "^18.15.10", + "@types/proxyquire": "^1.3.31", "@types/sinon": "^10.0.16", "@types/supertest": "^2.0.12", "chai": "^4.3.7", @@ -10952,7 +10959,7 @@ "packages/synthetics-sdk-broken-links/node_modules/@google-cloud/synthetics-sdk-api": { "version": "0.5.1", "resolved": "file:packages/synthetics-sdk-broken-links/google-cloud-synthetics-sdk-api-0.5.1.tgz", - "integrity": "sha512-gNUsbNYcBYt/lLSdCmx8YJWA2Tqb9THrrQrKuUtb1pAnwy1M+pukfYoUztp6rX8jVsdj2/lVgN6iMx9ARLfM0g==", + "integrity": "sha512-kCevsvEiS6DzeRJmcwoY0RvlOm4tvwGxMUGFw0H14ELTUW8QoY6Fj5paLZgSlmC9wNQ5IZZE9g3kNdJnNicm+Q==", "license": "Apache-2.0", "dependencies": { "@google-cloud/opentelemetry-cloud-trace-exporter": "2.1.0", @@ -12275,6 +12282,7 @@ "@types/chai": "^4.3.4", "@types/express": "^4.17.17", "@types/node": "^18.15.10", + "@types/proxyquire": "^1.3.31", "@types/sinon": "^10.0.16", "@types/supertest": "^2.0.12", "chai": "^4.3.7", @@ -12289,7 +12297,7 @@ "dependencies": { "@google-cloud/synthetics-sdk-api": { "version": "file:google-cloud-synthetics-sdk-api-0.5.1.tgz", - "integrity": "sha512-gNUsbNYcBYt/lLSdCmx8YJWA2Tqb9THrrQrKuUtb1pAnwy1M+pukfYoUztp6rX8jVsdj2/lVgN6iMx9ARLfM0g==", + "integrity": "sha512-kCevsvEiS6DzeRJmcwoY0RvlOm4tvwGxMUGFw0H14ELTUW8QoY6Fj5paLZgSlmC9wNQ5IZZE9g3kNdJnNicm+Q==", "requires": { "@google-cloud/opentelemetry-cloud-trace-exporter": "2.1.0", "@opentelemetry/api": "1.6.0", @@ -14437,6 +14445,12 @@ "@types/pg": "*" } }, + "@types/proxyquire": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.31.tgz", + "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==", + "dev": true + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -19031,6 +19045,7 @@ "@types/chai": "^4.3.4", "@types/express": "^4.17.17", "@types/node": "^18.15.10", + "@types/proxyquire": "^1.3.31", "@types/sinon": "^10.0.16", "@types/supertest": "^2.0.12", "chai": "^4.3.7", @@ -19045,7 +19060,7 @@ "dependencies": { "@google-cloud/synthetics-sdk-api": { "version": "file:google-cloud-synthetics-sdk-api-0.5.1.tgz", - "integrity": "sha512-gNUsbNYcBYt/lLSdCmx8YJWA2Tqb9THrrQrKuUtb1pAnwy1M+pukfYoUztp6rX8jVsdj2/lVgN6iMx9ARLfM0g==", + "integrity": "sha512-kCevsvEiS6DzeRJmcwoY0RvlOm4tvwGxMUGFw0H14ELTUW8QoY6Fj5paLZgSlmC9wNQ5IZZE9g3kNdJnNicm+Q==", "requires": { "@google-cloud/opentelemetry-cloud-trace-exporter": "2.1.0", "@opentelemetry/api": "1.6.0", diff --git a/packages/synthetics-sdk-broken-links/google-cloud-synthetics-sdk-api-0.5.1.tgz b/packages/synthetics-sdk-broken-links/google-cloud-synthetics-sdk-api-0.5.1.tgz index 81d4a1b68c1e61642ed206424f00af0b01afa958..8e9d4a8f5922ab1e489c9ecb18d12b58aaca21c7 100644 GIT binary patch delta 37345 zcmV(#K;*xw_XXqk1+Z`Df61*h&G}rvqBcKCX2nW(_+8u5?Ch+%t*vclWYg-kHIvEG z00%siN+yG1kX4nf)_>pUMFhzRzeIRMI8#;C(o9QL40iwyoXh(j92^Y#7<*=2gH&`(Jqkxxaknn75CahXdDj;KfmOo%Blw8X8r? zNvCsYL}RKo=~0f&$%{CTxQdB9ghMF@r-ajb1sxPf8@tl?IXz(Yac}FtcW>^&41j*S z^Rv%|ar}oaKuRcx&QTD!ms`W#+0r!ty?=|?%e@IrqmyCOi$-z%E;xQ2N zpK`1NIX?Z!^Wq!j`=bBr!&3e;JwQ9IAU&cegSp2_uqVS)ulnN%?dX};y>|9~+vOVv zm!f~jbE1_~HfnqQolZFVmiZaMMo}Nw;ThKVxrM%%j=uZVteNYbH5{F|#SR_zMluAW z2W7AK<8lCWe|%WG(DRVfIKedU8M|j4IRK>k3q2~|ljrn?PwgMoJE~H>BYVe$<6@k) zH-Zt+w)gwVr})mu0iAKo@8A$;fx*33{(kK5-2By@(nzn9zdCZHZ^``C;U46{{MGqK z5sTz+b`X=r;cfc)~u zM}L&*)~|KKba+pM0uIB!?uQw+cN%O9I`2mc;$;WAP2k9m(MTWTaf0E43#K>ke8?&J z&HTeye-npj>hrvul;S+>D7Nvcbai6&f0`t9Ou&EA*|573`#i4Ru)bvC>z-)$2NdtH zzWw}DWfPN{&`%iLvxj~B`eGi2DT8~zjsxQzgF4po#vbf!5#0|4{cih@dh#E8dqm@{ zoU%nUoTM|-(kAWjE^6Bq{ISHe-O2prXa^$(Hn`uxlOP{|^Q(C?{`>vCrLhTLY-?$_ z7DL2&OsI#yFNZEC$G3|qkNBU{to(%C9MQkS=xbM#A?qW5{xbeF(bJAx{ym=m5ypfVJpXw)JkcM-E{qtrzq72|mkTaTH{Z6&%N~CJ>gHzkeek;v?c5|5ehBSjj1B7kvv*H-#Xo1%eD!Rv4xRcR zTgM5|Hhgk9`1Z2KXCC-}Y2fHl{8RfHp8FrRbo40xshtkb{|{T5>~x?O=N|tbG;}1^ z_^fB=rrq?KInrHrVt4g;ciGJD^3%F2%JJ^1lj9`CSjMU%{*#slu+2%l|6 z`0R9JvnFQamUd?18Kg~qYnqf__OQwn!ug4E>M6tI0gVi#7oB9huAhPG&$VLFH0%zByYS#S0*w;b{?4QB0Jbc zcC3qRMi=?PF7jht!LW=#dGL)|FHJvue-T3CwbfcaqB^QV|T7* zXiwR!p0YVTWruspXZ4iN=_xuposTj8H{Hrtr@FfSCro;};kWGV4j$ehh&EvCk=>(B2OOM?_w%fV(?4&2KRbBa z(sU)gsiBVFpm%ITVoDqjGsgKl6od4>-o$VI)=y&@6dru>jVIO}d~Sb{ii0C7JCY)E zjN6SouwdHE#ekDellN7IXU zo$ojaJlaGy)kHSCiF~Swe0CFm#Z(i;j3!=OT#r^w*7w={eZR8L$!xAy>8Ixoe>FMg zF&8&Yy{5lp{L$kdHARs6-!sQI_Ecruk-QksNoKcK+wz=2Pu#V6*y$W+XOmfb>t4EE z?+Zqg7cVHzd5UmOr1?!gKg|EzF8$;E^$RDBt95hz>3W#(_UFfN|M}g2I@~ZDtNVBM z=H}(K_u=84eSi$R$A_?!1s9uJ-FqdWB|Cq5xc(GYj}PxYUEkbX57X~H*&h%YnhV3< zzPHy8?>YwXG?JH5+=cs%xIM>q{_@xDB|EDJd-HDnBwfe)U$Z3PcKu=X@NPUqa9*n3 z^jgf$;hSt?!8)nWVsQF@*^HNW50!b^O4Paed@n6bb~2RB(@SCv+nALsvoHEHDr9~4 ze;l5xs4j8%$&t*worAzHZys)ZU+~XO%o}NHvfCY9J~uIMr-{jK24>-i093=0WrHU6 zI{RN+H*g!ru~STa-{!tz`8u8>`(yMM=cMd^z589b*I&2)`dhmH z{FH|EOdkL8HC_Em|Fu0_yY2Stzkc)l%v8?Y(-VWVt+AT$2hHfr+~9#U9d30x4Rc_m zmq?L(_pi^*_L3&Q8l(;k1~4_-O?`B>zf_XkVSMnj$(}m^n|{)V)^?orvWM2n3-bIn z-u(-t&Yd~P5p?i>qo_@{4;?ls4839ft%}q=!H_eGH@sH%+ZcZN@n*p7!k!;*PT3GO zot4$ISc2Hb=n7+fPLmTe-A0kp)^+X;VVe{*^0#LTzx(6f4Cv#w!~6DNg`oabaQi6n z4^M3X+5X6P?lrkTI~QcL)n{tj5tz4_I4_^CHi8L%eJT8tyzvQtWdAyZogmX#Qj0p#R$!p8gm@mCjk;2q!fn_v9Gw(U1xPew%aAD;Nb)*YVT=}QXK zZt=Y*`xq?~{k;73uit35bVpME@*FZb7Bk+zuJdpVV`puDdRKYQd~YmAawJH-pC&nY z;M}yv5wF8*mt4j%S~cCuR}1-=UK-!Di&?Bz;wb~(W=F+;?w+!^u`>$9IT z!_NQiWuy9|Ve$c~oT$A0;;9GB@j!CYsQ;a$g=1Y0yy7V9`>*>xb}S8M&mj)@n7U4m zd$s*Hdp}N3!@eUL@~8u^j`^1cYI^;@19ECuKa$z z|HBDhm!?kjhPIbTwJSrHeDF5WY-WDd*7qH*e>*a1Q@TDp%j>-!j8tM5=%O`3`+U@Y62YJElgz9@Ci1i$uIms>I@3X;(j&-J?~|xXhnpA)#D38|jfFy|`_p|!{o8k_F)e8z7 zTCM4mieEOI_XUCx`|G(-XyTAgE<{4USd%>U7=O=`j@$t=CAmE!>Xm{%503PpbcuCQwqQAH`)SPj@a|pl=sYyq_m& z+J95d9(9TiW{;D|L=Li&;vaYOkjAdB+XRl!O(mH~*BNj7%g~?A#GOupo?O$AHEi^3 z=#38epyzj=RAcYiuNIi=9&_58>c7bj>ewp03UwLNjEhste*`pUIAzO`nGsk2nhtf} zL%o=zu?@c`4cRjqll120*9-Q2rWx#*;eYya+dPB)sFS(LpoRXm&YLm`H>=j_=M7D1 z?H#|Xipj0N-uyYan5qm%vJ_Dnw7fh`>Ce;YoTcBwB!L-B{^7&o!&{>V4g5%{$GB+z zCme0{as_I3QZE&r1-yif!^Y)C`fMN`v*yS4|j%Ba?p%m#l z_XNw}d*A){P22zdsp;pVEjyFu_9=gx;{DZ8?SC%K@C6CbVE9YXpCj75V9wK*qdo^G z>muTF7-+nnJ3rtbC#>Zd9U4=jDLb{31bQha8L8DaMLtFzow$xvH5-E;gnf=Boo%Xi ztsd{&uwT#Y!QLy4cJFVX#1Fcz6|sEz-D=$w(`NsWRDLKg`ZQHY-~a1*CZQxd*QoAH)1gRvQf8M-HbJG z;JUppo{v}0&&PWa>JlVmnsvhZ~ z7}D(Bw~t)$c~C6o-6p!(|DJyo!~I*pr@x~dF7)6o@Tul^Zv{W89@^N&;1kKCFShMS zH}!DIdkq}!=*d)b;p=Zxr;F5`R>`&Yk+^OAe~HdyGKSzEj`+CF&t z+m=O}!dhpIYVpf2_kr12W121mcBVAF;JDKr&?{V0IRt&bJ|Exxy&&0KggAC5=2L`e zctB$tGf-*(q7v-w=&yex2S9$L=Tdg#Vf&jjFEN7Q_RP+2yBjmRfwcX~M=ue9L1VkW z?KZX-f!k|sm;Vo%+xv01z5U?bUW0pdf6(Ioue(i7FXis^Pux7Y{c%iGc7lfc0`fxV zhxZEZ{5H5g@Fm(f(%ut!pJ?*==RuLZ-C*TVQ+C+;pyj~>gSLNP;+?~mp9%VSyDvZQ zwz?B8-D~lMj1P5s=eHxZwYFi_$vR>eJWM6fc%}s`ECjzy@=Jv?gWQcYuFgt8-pG-~1WG5rB!zO!l=s*1b`LCulv{##a~H=mRyW_DuAvCRC4%^u)x0 zqnP=e+qo7`1vv7ZbN2j?g^w2q(vF8chuq;n!JD7gan64|FE`*7V<`-Kj%+|4#@^U> zRYQU>_D;_ijc|amxAvE0i1QCE>#i>ufceQ==XQL>7+jw$U$*B7#^LznyE~SC3~-OV zw`4yS`wh(58IH3)xiS2F?PMgDhL+s+Ax;fe_$`bI`A=5jmMvVxp$fSfk@f* z=~oDl4JPf3^!pKCa*)z)wdt@cndd-ysrMt=G1<=U)K3%O;mm&#<~vxH%c<}Y^;iT~ zehIRCaB9wE&xgJBYxu-zCo^tmMt@1%P}-+##~jM>@?ei~jNS-7Wu%s15YH3&l7Zj* z(=gM1ry_4yGiUeqQ}`ZSxV@(R-FN9Q@BI0d_u)3&^S^VR-5lkKHJ8^1Ubug}6~~0% zK3Lt&{&EY;Sk8PuU4Dd+^k-l^wY~S$aw+V`=XVO)|DNan@#*m=Wf{Qyqkqj`QVjOM zN>7dYpEeI3AMc>Wi?Za8h}j8wwbLUWZ~B{&Jp4n$p18=OFZXlqj_wKVyZ^mu<9}?M z*t;M4z_rjLnf?}>Cm1pgU{-ZOK&M{@f|)4P{uwPWV>r%6@^zT>COL62MA zUr!j=*Q^#?U-~seGyLm;#V!3YCN3W{&!ZV|3w+69DbG8X(dLYHmgPNR_|I3#=BL~w z+xHoN*fz0yk!*gG@cb5k>IZRVp#A;O%h4Bhvz^8*>L5UKLYrgxScmAx#NY={?vA=| zK&QuhpqYaMo#H+dqaAL zGjZ?az%(7Zck&=zpSX8&0N3KZliwY_H1cTP-)PF;WVYXtM8A<7zaEc1Gk)JQQrp<` zQ$+q4eChqTT&M{W93w?y1zc<#s2qCVav%mIKeXSPsE6Eo`)QJmo*;1 zk54ms3`Wklb#V^Te4*Au#QBUapK#_d*L{$&cQ{#Zn5Q>XmZEpT4$^2`V`N)t^tr>g zTD*BPW3y(w-B~+0qpvQvt@DaEQ5iZ)Py}wyGdo%KoetcN}?tb;K`ltBJ??31o$c^6o;up`*Gul*) z5w7w5^K%;v@Z8!n7}$Q=%Y*Uj_FK`H9eH1mjJ&z|;3MyD9vXRjGpJc3e}8)W;ln-s zz4^CW>+q=$tFL2K)9}>PW`SANzy4Bk@>M(|^M5~H-#o-4CjXBf{g1Ez@d?51f*Af~ zi~s*)i(>c(w>j~>zfMosGd8}fL%;uxwuhgU?5SUv@mHcVFTcbN|Ka+!qmzI84G(Po zu-n$Z;pBH;5!PAV-h3Xsf4cueuZdp2fB7pfKzsfL7$u*=8vOo`7^%IF_`|>a@i%d< zfA#gthds^Zzl6{0|JD85Ewk7E+~3powoP8W4c`ez?oQRl===^N^8C*4)Wq*bX6$#H z{_(Z@!~GpJZQBmxq^Zqlcb@z05ADsP5C5=v{-3|u8}jdd^P4|zf5-Oq9+%lGX{3Mo z)uxQm6QX@qJpK0V`-fj_9{u)z{I~z_-M{{~fBfycfBv7p|Ls5h_J9BKNqRSedKo25i+Lj^p8J#J`N3NaGVOetfvT`BuY^ zsujN@j%xq6%`ZFkf9drzwz<20|9Bs^O+HW1^FGcNSZuJ&lYZ=Qwykb&O|DdXtCVui z`xmM7dk|DP*8F}8`)%&%=wHA3FMt1!{&Q#BkNC8=4%PB+AJ&@%{`O%V|9~A?UEW8M zBxRm|J@)q`OUpc~zWy&+Q6_0xmI==#X`UAa|NA8-;8DR4e}=NaNAjPqpa1tK@}IxF zxw~Jzzqg;>{OT`nl-m41EimWJum14n+i%}){{Jlu|J|pRf4m9nw^HAAdw+fR@b>1~ z>HoeB>*8CF#Ju_Dly^*$p7~mN-fPu)uhr+h)|~a4NzR?gc6A@lfA{7lw3{0b&ubyZ ztL=jhJ)PHpf1*l)Z0Ej@5P!N}U-J47pU-{yK6IMCb6;P7{^V9S7ry;{xVeeE`dpQ= zf`{K;-$rnBu7Yj()0uCtKR|)}r|@ZY|M~1TB1Av;ZNUD`x$o*1A7^oWuA#B(&$sP` zs><>CJGTYGoCWh(3Y_N}w;-;2BO4dMRQ-n^ZoL$g|p17DyWvFS_NX;+^L%Q*-oHPl;YYtq4PMZM{&wB2->%#`+if{^BLvws}D-4CKzfkJo&?m6U(7cTay>f88%&@3zWw^&#Bch5Pk|-@7x~3tD=( zw{2L)Vr`m={~fE9g^Sx--`U%Dmz$hTV@j2}d_=MA*diac%Ed;4&Cvr7$9{}x-k99&-U*9+0yg-vXo|AnpWxYP?31W@kJz0C#-m?fS#@r%&O2(cXK%EY#}VjeY1=_n+eHU!;%I zY0H_T*WWfR#y#2VFEwi~{c5x8m3mxGf3BWeUR+h)J$aXf8nurPtDBWQ)wNGIc)ImJ zq@Me;H)a;%+Np~2{lokx-zt9C&U#^!g0!C3_UGI7-G|lcxY?bZ-NzbAMHbh>4)z>-#x76Jn6NMJ?lZ-@$G8;fIofLez3Q2F#aFY$ zcJsG6Pu_-EdcK-9#yedpG3U8(-_5rKCusKF$xM| zJbBW@Jj`=)8>T$pNIg7!p7Yq_{VdUld5$xl`>vk#)GQ(U-mb4_J-53581COae2{X? znwx)*TWj+%$mW0N+0qMf=av2R=R58GokrD8ZFBpVg`tE*pY)^mK0QN>ZO>gauJNwm_;a|fZdUKlZ)PRW{^`^8 z!zC?5V|BGNq&XW?2V1^ZzbHye}nbP(^g+7B@7f19gyxb^3o{-d3& zKdoP_i_O86S6`01)%qcJf_c1d?PdCUu#+AQok9V)r_Jhiw zTy4{VU*!wpUp`&Gf35bxS=Zg?p3q*51g85t3$4F2dwUz&D3}j;s;lm1_5HbR`OmkO zr`**b0C7??*Q>LUf5Atr#rk@Eg^q;}t2NSeZ*SMnsPochFZ-^W^H+&iuf8+qzP--Q zfAh*+;=$M9Y?!#dJ^$4|pZ)5m^~dwS^`^V}WN&fk{_3OcKHBqJ0){-SH*MWtuyzse zU)`=AuDc8ULCiYAsGUnB7l^04G`46+Wvtl+x16UsSYkTXPyXX>C}{JSZq{kC7D z&8P7$+v?>r>mF}E+w)Q^wy(az7?zaCk;X3_Z)+hkxBlK<`TJ|k!=j>dpz$TAMmp}*s9)BL&c&2Ds;T<-*=sb)yf9XW1sL&>-Wzne^ZFb4YnCRf* z>9}1lI}dy9EvRz+h8LXKUdwX{=cnsW;e^K(MmphfxE;j$&fc$2V!?l2pYU+_;SS8J z2-p30AqJVR+bdNaIO(%q-aX+pxALD)|GMpf7m)j>mij(x`}Z6BIe*-%&xJd=Tn~nA zE~yJs({hq4Km7wPUCqv}p@E-YbJ)W!E?>)Gn@g_cSnC&0^s>U-y_Otz%gWcbc6SU- zzS4*%ySRAl_xA3?pKlgjw_%%$PQ^&;m(RjoyYLk3HMs2e_nJQb@gL$LjMeH>Jd{7* zq3XSN?{vBBiNNQ|pMTyB@2%GJKj->>bvyTS{BU{>hlNiHT`7BbQKjxR*h_c5xV?*yKlB^CdEhuQ0dwONjMq+5M#b z_7)ZDy_OgEJpF-RIVNa!7H@gM86InXKGJx=Hmn|(NLzVoX~{(ywz;JAkF|d3EPSs&oLnjH)Hau# zg|XI8orR|};OqTThPvA6(q^t_o-aS%(&-B^*2-eT*{|Z}LuVgv9%8=RbsMf^7Z&c~ z!)pED!$ZGR(GpFs*00p??wD0k;nl|d3XN~8BPG4k%=B7+h4C+A1}-QmIM&?r_r7)a ztMAd4#isYA<#7AmE412{3;`H_^}OHuYFpCq{5*(R&7MBmUI6o{i7D1DhYJkeo!KVDoL~-muT?3V))~Yo$kfQ+u78l+HBNc&8wj_r&(Q|aee!K@pezX zNTnZVk2l|*QN6s^&UfK{eJbLd5arWVt=CX&K$cJGc+$N~8r%1MuhQs$M&urJ=k8){ zeh5EYVSjYldYNC+?6$yx}{0uS#c_55IWZ@!zg}toO2T507`7<6-*O5;U z^hWJvyt!b?cL?AwD#u4*~{?h^NlAPbaa_y zo^D0uXEyg*NIQ0$I@487Hh7NWO*VEq0-tUQ!Su0O$};V3)-hIpdDfkAC*KNntYI~H zmaI%R%)ef@7u;1ez2u91yIR^to0gKtGcJxgwluL`(%w+@+%jGCxWQD1uhH3M*m-6r z3!1JAK;^L&-ro4Iybf;LzrNkv?fYsStgmH-UqNKH?du}RS7?0^bUU~8+gEA)LX>;7 z{Y8-OG#t1SUd6D~=FTII*nLC&-zkPX$ zdzUZ0arwf#mKVBZ`J(%k7rj||fjgBizfF0Wdz6>ELHW|Vlb63WdCB{dm$)f;kvo!? zxgB|-dyy}^5&7b~kT1Lid5Qavm$~`);yaHQyX|?vWdI4>zGd>#`uPt5yzNZ#<(F{a1T)y}$Q# zY9p}tYhC*CFvObM510Fc-J;oRd1)M(k%9@r*tG>HCL^M|~eU z;PB<5as5dgdvyyl^%pdwSTI;C+QtP|R(gZMU9B#EZ_IwbzPOFMo5%O>6@=Pe+jFtV zEj3e54cWF`Jz~?Ju7vcu2k7F~H;?EaFImj#yN2hfimGm{FEOEh_5JO-#Si*RX5@s! zYWLT$%qyo$jc2@tah|&sxjh7R_3Y$McqvwDeER3j2Ftl`KX<=ArG+^YxLtyHIpEtp zo zQB}BE-M&BU=He5NpZwvcVi^ke*!^ie`?*i>mrr{DI|9f}VnOhmN8heL-#&Z@K$>^Y zH>d4BevdJ{{zUuRTzwHcy?Uh_8uM?vi{}j)2jWr-qb38 z9V@W=(#NypOpM`xBJ90!hivMu(LVtNkIEES?`G~L0^77gz zDbvyvRp}~UB*7-3Y^s4t9+B&!r5Sd+KeWOkhXc7l_n_*W~?c?t|?4Q$1X_|KEk)2C-Wu` zb(*=n$pRmkcdcu>Ht{u0l(nz;#WH}r>6$iSP-$S(|0XFbh@X$}+99 zrp=8@J=0gkQFN?H*JdrVXlwdvOx-n=<@cm6L+0DM;$w=CG_`5lI8k=On3k?ha%a0Hq&BT;V{Pv1fGifFv90T>vJP32&h9AB5#q9T zSP=E)u69XQATNpj!pBLLi(vB1WwSf7&X_boynNzK-Xd*n zTQokg{H?9qF3+1fOFXNW@IP&lXH8=B()pq^0U4d$QCB(7g4&Sry2;ui$+DusOR_9! zLi0)CyTWCq4^?N-VDD;MsKd^uD97xMTJ$IFToa16MBQ1Uyh`eSEFd{~(xk3+p>W>i zX=197A+ydQuV_hWo4Ty#uTkww1lCw)!4~L8R%0T{qG<92eQiUR6roMaEWrw(4OL#( zrfJc)0wqm+GP|P$6M%}Ftf+%4tAMSJMr;oQ0r<4VZ9V!`wQ)ow!hC zzO1^$aWF}brlGF_T>U4_9jWnf`U*VvHeEIj7Aw!Ww}lXY4* zjm0i|EDxTcEGr~~KhC!dm{VUc=}B(*494y-pGAw2L&RL}s!(Ed(*_UG7WC+g&erI7 zWvZ;h0?zJ#2)}|TnFa|$KW$rBZ_1=@%L2cbBJs5=yVTWLp3=P6m*hAc6R=V>#(Z{1 zW!h#qY|p@P+AMn-(zG#oSq3~HLcpjyThxeHimPhzv_;(|nejMxJlK2_lxrz6CLhUd zyR^&b&?a4z6wGL-eVw|zsPnu-_|vLFxqJr*C|g&50|3hTU(|IO2EQ<9B*KKhLzPOr z6q8ru3~+*3QC5ZRN``{%@Sg9&$b}mB@4NXXDDxq$Tn$3VO=(SsyyN~7*EFukEG{~A zm>Pt{R<;TrP*Qb`a|s_;^YnbnkYa#JCOqeB+NMS>G6S$PAOI{H#wZ6fR49N$ldybw z(xr%hVi#P}@Q?HL2x-8k0tZToT#YNrI+t~}12g2UL*{V1NK2YE%q|L$0UMc2kJ&5R z6Qs^|X>Py)4SJCyZe1%!BVX92fSR^znxtXU@UlKjP&B|-0L10kTENqMa8j|bX#mzB z++B*-DI+2ZfCgLS8iXlWBv({EG@Wfj01*3ss;Qb9A2Qz`)eWni8id#)61FJ;b9Cj> z)PX_q-?qlvwFR<`s-+bctF9B9V$zEe@tfUI3PJ^Slr=h%V#YigmDF_$sK%d{%qLRG zmo$y>CJ5nn$bM#QmKckln(rnmCZs7WMjT9lo52(XY>msaG69@4Z2+`eun+SIZ!jHy zfS2`hRqIj&WxgJcS-Gvv||=A)~HMYsgS0^CFr_COJOfRZnfXW+ z*{W<)b#;mr&yXzE*(Jgd;D5diAYG$P7@LZ3$5xf8yj6{D2Vv*)J90=j{*t-kpArKL zz)B}zBTN|{&*D=7mL%W$)Q-Zi#ijl7%R5vDCoWHB)W32u{V!;TeQ&VqsG zJ$NE9zQ&Mi~%7Uc?#gS^A*-ONLpcP#%a2MbHju+EuwBi$LwXcC|hYJ0H{ey zpWrAfpeA2dm(I2GrLGa6$F|U<&r?1KWLUA<76OEX+r(!TpeRk!3a*HJATZE>fFkm# z@&xOhfdRS(M3=Xq5_wMMsTCl~fJ1x@e5=Ti@wCI6z~_>#1C@6LAO`p}->7CuC71}L z_5$%hV^@KuSo*{QmVt;iDO|!w(<{GcVlAv;fav9&pAR5GGN980#*;zhAe)J-0b(3- z3_xCbP)OV6;;6WB54WhWvp{lx;H$M}zQV%gprj)5Kvm!(E~ib4T5uPeTIJTHONh*wIJ76@2jI;1*DkqN*GvuQDb zIC*rrktOX)28V?xA=B7lz)_7`t7}m>J{fH z=}c8;S=#YU#^#tTqfi2Wghfqw+kl9?ylIKIXmKA+2HOvyQuv(%E*eEL^1w$`aKows zw92B?1(2U6f{^2 z*y@X_G96qUCsD#)I=O{BPY`;EUYlm2u5##Dj5b*o44URZhfq@BN0UNEvK;C1kd-Nf`3A^`_2 zrNE~a(~DmRs1^WD9hwm1O)Q28TVLa}5CO=5WvGxeiA9T5PMR8V7CMKsGEJ>8 zE)J|pi>M=jI){zP@pnZPiZs$##8=+CWi62tfqyt92qn+r&v=X+&(c(C!rHchlES;; z2Y^H@ac3%j>wq;*tf=#8)1YY~2OqRGunJI|G%_DPM+<2J1;ZkOhaHwLh=gHO4Pb?p z4geRMIl5*#5=@FM9I#gS6Ex+D5`~gzB_(FqRiG(jOp3#)aIv*z<;xoG%%tboZ%_)V zg&{HlwJQ^YLSl{^tw;e2Wcq@wjKdmWmtl7n3x#2S?4U!CQv{_(;#ew0Nf0sKOac;M zHj4`0VFd7#T7x~2v=pn@fs@ljVbHE}sca{_EkUR%cuR#{ z1UfhaL#RDQRdBpPok|65oMLzxU(9#$N`_K*RgBGG%UV+-jxA6OJA~v*2`VH#%|VH_ z42*|=DbEVeZ?Y(9X@S&OUmRat)DmEgqxJ<5D97*tgItL{sI{hDPJQpUzq=@qgL4t=;gA7@0xz$`4a1COGYfj6M zCq*qrYE7A$N>KyD+}A8H5LHT!CblI@S%Mb9Bw4COg>T~Xv1Q;pk){;!g>ANIVvA1T zHGP!@tSUgZvzRM`|BgC`+*C3ARmdQJ;4wliVuwjeJ)VhW^}s85O3m-QQ?wQ+Q@gtD zSREW;!1SRT(Ox*{0QMet6Us~h4yZd+5hZgKHtqykt{h6(V3J79kC>k4@?e~Ifb$wt$OTp=`_14uXn2E@|`C$k?g-c}$MpWNCE zcY~1-0R#E~aacUyS|Ze$<}QGOK{`3W#vwN?g3j2Q25QXTFhwD$jP@1y63|-4w}!mo zL+jGUMXi8AP^T0mTjeqqE@!QOvQ&|En0G*^D}^EJ0x|6>{?oN7E;~b^%ZTP%ZQKB9 z3f3wGYv$-!odVt~K$V0O@ifd-3vKUUjvc@OzXFOz$XzMYhANc7Hn7PQlY(W)O5};< zY!v8V-f9-35U8veEY=P%npmVJ=`cspY9&~7kf6vEpJOToLhxb|Z*6ja07(qiTN`BB zG|OAugiZOdg0IN(C|W5}Q-;E)E@*cufcuLUiYR50Uqc(vQ;0Jj2?&arG{~tF>xWF$pDv)}*%KAB?%gfa$+a6sG-Rey~9&u16;3KkE&(kBBojZ5f&+VhGt3$W!r^taQP=Ko z%efYVk7dCB7=v%t<81|i=j-qZ6*fhC2nmv!Cs~xqhFQmn=ZN-^nE0C#_?kfdk6u^WMe*|U~M2F9S=73;=75E`*YWOFZwSuPOanZnGmR zXn_OE0SjFXbfYC!q+qO735f_WAM6&sq7C?0tX-+FEtmp-;Gxkvj;^^$dkw!k$C*kuK9NM+4&Zb4uy<5OG>gtIQGQm7U_ z55t0;Lol#^S=<;iRn3zU}qirF5}4RVjdWvXUNzhfT0JzdyE@X zO8Xuy2e}s}at{cy(l}tznfBFiRCQ{M>`P;R92P^7O^cdkFsN4HK*wh@D^*nlG`9D- zc!jL6zR4Uifmy?lyA+O({Np1UwBE}wCBO-f@z&~1R5@nd}0W^Xke?o&^A&nZ6z1tg+LjDfLDOF2KH`X>*%6? zHe}Hvt1{#Q1e1#A7K%d1Z2Jyaf<-S-Fj;UuZ4)fRcp@jb zP|!{(aFp_Ipq07?6I7`{ct~+>s2eJO zUO&1mrVrYW3V>-^!rg`6YYZk+s@NUC1&4rlbvXooyl7;G zPRL{cq6NWAJV2d8&hm)$GGrxpwU#RvU<29X$g&Q*nTEQo;CLX$#2m9Az)Lw^#6j^G zd`pX%IE6n=4N^tyQhbmD+Iwt**S3Yh$}6^%bP>s+a~UgHRhmJ*Uy!1S3#47LiVw%l z<0b(z9*HdgAgmKiyE8uX5r$!ZpyaE-i8;#)Ox5mHVF6FIXgQP^_yZEDGpsN+7_Y01 z%nY;%u8r|3E4l^%0c`~sc_NR)h=C$j*-cPd9w@P@8ACy)OGt5pH_9*=+7Xo_^@x}D z5a1CloB-Wu7=ZBwJW6jh9W>U90(E?5A}7_Psr-z0n*cfV($uzqyrhtSz66|^;wiEm ziG?cV6?PYfq;MESEcHU4W$sd^v;^L(_hk%%kf4R2nHo!xHh9xi!U%9LAOzS7sHLMF ztTv9j?G)2O{7{xu`5K3p9_7G1;CpLrOgmf-bfISUQbqi+)Jlyi@l7BjZ53Ljlz0*G zJkK^^ThIjHqUH$}sWw=DmD;$n%oS3E;e((s;Y=`Ay#-_7n=|N6DVFMS=Mh687g-Da zL&D*G8Dg8mzOvK{x?o0H+vT|_lv7uvz_Glk| z!ulajg>jW{wY$<)7SEZLn1-@4Mj15thh~0C3Bas?GI>_pgCRkGt4-F)WExB{stF!9 znX+U6NqBOLWMbK+S%@YK_3+XZX#q^>d|D(SF9Fif*9^IX-K0oqh70wXVaWk%fT|7@ zVd@kngt&s6oMtgF~A=~izYP+iZBfgt>xHag=<5r>>wo#pemixd6K$FqQT7K zo)ajiL;|gdQdROq8hL8J}x3+Q+!ljdQ5l5^i=}nXeO#FhXRGb zPb;ikX|tx$mXEq@wTY?B9Yk0Dr_-*tvw7e{4Bi_kBK5_dwRMN0e_~R3AE{&T3cVKa z3O!JO9()%44+|%b3f~n$$O`}zlB+~jr9oi$z#(v9?3N-N8P*U1gF7bLpNLQ&rW9Z} zN*YWH#2ypLY-xWPy>*~@Ve-s~LfQ`b2NA-54dMgcz>?`hu=qd`rN%LpFbyCi%%b6? zq|z1@(uGF^5e3{4f2`D`ZJMI!X`MieVmfRF5s+P$CF_8LOe;Rc$Xq7ciH2+_r_Czo zOM6n<(eJ=ncyM%G);cC?;U*O~hfM$~pe!CzoYt*K7$e6gf#Zyzw1$V*KptAig2koo zt1Rs})B`}JJ^=HIco&IGwRWB$fl&?Mra&HSxj-3Xg&smHf1vS)H7RH(xH3`-44T(o zt0_vE-H0kgbnKHH*v0`^Ic?MQtW4t6cMj!yzE0~y|Aax9$+a_UkU6llh zeHr+ZxC)RJ!!D`{D+xw8G1E3vm*Z`)GmtO7lr;_7wy3oISs1(w5@40RB?ST@SYxr~ zfmzLEmg2r7e{cgf(OKwoql`GknOkLYR2Cluw1?tgBei@;uCffYmz=P;y-9Bc5?P~E zyJ+xyOe|ooQ6_a0iFU>;VRJpU9B@!FA$&4k3T&uX&}?7!m2pL#wk;z zP*@4B>S}EnDv!uS3)SgiI4Q{A;KmYV3nS=VY9M|R{Wkctdj0Df~eD8B665f)a1)e@z;m)gT9L@`?cW9tNz z0cA*NQ6qT)%bvuz8OVvISv#vln>W2oXv`(j81Vkgh$1S=0P{-ih4RFWc-A|HR}&=_ z*CvUaM|{X+;mA&Z>AjE@h^8zo=-smuV`g2?ui+{v5}J zY+x%CS807AVCSfUtaXhW%MavYIK;RW(-A066Gvl zh<(fwNvk@@nkwuOzzHE$yao2D0|F>{&`w5^6s#Ve(1VtpcB)|%*h?_6J_Ow~fu*a# z6L4$M4*GGJtPazbl(2C$ysec;&2&P6f7{&GhOSVcR$QdTU4sE&2Q*WPbR@NW6Un9au0DlgbVAo)np0wz=8 zU;`Hep_K5x;Jn;9v|jsT%r!D&0EaG=HN;Y}U=zV0gBC_Y`%3f~s-hI}MuC$We^4jj z3V-yuWlF&?*t4oqCNEY9zLfI6ISvartsQIT5ctKarNDUvB~LfGzQ6^fsA@wFt~T0e zk>xFNq&rVq<@{rLss{Or+6W&(GOJwPuu>>V=F8x^rJL{%Mu6zSd}xDztdqoaPTPMm zz23vXgqWcEFqul`zKo|U@XZDCe_du(O3Y++9WIcCbRBBP=o1)U+#yBkY{^Rw z{>vXX86X%C-?Z9N%w3sCxj-$Y=rqGJ0w6W6qZV8!urMNcj5MYY0!1X9a_&GMs3Qgq zH8f4xX+I1mqWlS~4NhE~@-OhQhISC1PMLR@m`$o0%9!DAT%vP4+N?qjf8u)L`Gxaa zc)db(KB-}Wur7#_(SaA3G{#zU!OXX939HVO9f2!M;R_iH>9teVDzlbR0+p%`zysk)9^4Dp&6T>Nd{K!OYmF(#bL*HD1RPTY zZ<0A~I%WN(ic4D7(x>wI%!Utd=${75vU=esq1XGxU zxeATaha3t75#Sq9G4tc*HWj%%C@y-f=vl&UX@BiE@E^6aRw*>4RT)fN^&95iAMx5{+pgavj=M##V!AWO8xm`JJNkeO3}0)J_7 zPdTU&rw{z}f@g_ws6xYVj6#hulf3XszsSW{Dkfi;yNK`~e+{7NCh6)fQ)CpGl9WKV zY95nRc2SgtkX8?LUB3}e+XRwMk-Af=ARj_#43D?E0j3~ zi^E5o7#xLvVW(KI8gr2YDnPi*J32p>q1zjz&K>Ki_B1Tnkx|w3bEs{}c*|C2$zN`z7X>p5OIM?JkxE|yP ziKi36a)+VHBT&jR^;d#K@P`!+9IULvplB%uOQFv+5wGI68gqojO>N@pq=u4~o8%&# zB!~yY2&HHMBsgs}3y2A|Y0z>VGOHABL0beYe|Z;R0eh?@$yqcxEFjPbw~qDJc|!0M z77dbt`$8`plPEpPSRI1#Qnu734OWLw!`8|C)=;(7)XK=z&RO1s40{=P8m9|HVk($_ z#vpZOaLio`&*f_h)XHcS3ehW$RiU1VLRe)jq*qmRm?|SyX^fj(f#`p*Ee@f<+GbYS ze{nGeguOO8WMM`75?rU`2qFj-NBfyvoD%3NgVz*gl4Ct2`m!FSkKh0sS<0)HEI^}N zH55_c)a#HCKk#Uw;~7Yu^UBpLE4&-b7h}?x4U2ajB7~{6sqJzI6}-ah^lz&JwN(rI zR-$QB;6LTifSRJc!O7yAbVDZEcn~G2f3ik+3-lr1!N_n9P(F-w34=z)Xu@U?TdM=m z=zk8sHFaFn3Qv-u0Lp3u)g;<#X`}k*#_E)!%ca)BH(90qDJHybkUJf6F)?uhpqMKW z5K$KG1l`jZ94TblQ*<TI|$B4D|ZJ4P0AMT)U0U`VS?EuHt`drSj^fT+|~iJeUi+lgle zpc+VkLW)X~w`r?Phzwvy&n$bbe_T67A5-R0=L)g%+FlH(rN#CoF}zs99D?u_BC7l( zz#bN~LqD}hUMB&WLX@g4b@UyD$x2K-=pRfNai_R=W=dEo(n6@Un_1 z;o_16{--^~ROu`h$J*3d)XKu#jN)&s7jCIzLMwf4*HkgT1ScBM*#PWOf9xVCVCo#h z!8NzpW~&dbf_tJ7CMU<33K5ZongnE#56#-gH=>LrupL+8o{ub5`j)Z zb8@&tDQ<}!!(c;I4g3lZe_zV%M3hr&pGX;{ZH6-|9LAg{bQDU@6_XRtLV7e`HJq9_1lh%nA09^Ngzw&~$a5JP|wvhB2=nwms`j#dGiOo6EeuN)Um+h92& z!}xGMF=%e^G;M~A0^w}j83EYI)B~PfhagqjEyo}#OH*M+uPj+*PwAvf+!SG!OdZb~ zLm&_lY)Rpjf3@5qBx00EKQO8TEioOvP}u!+#!d_2a6DJl!ZH_dhGw}@%Dil;-7<0vqh09FuU7q7l#0blMv)ES5lLC4l>Np)AVQ7e&cD z!JTQkf2ngN;p9!Kbgi}qU@D3d6u+oLCx_Jm)P$;9<#cN=4CbH4v~`?}Qz4XGhRfq6 zQGl{GSzT${Kc>ne_Gq6tyuz3{D$=N`g$Q}6q~S~k9HBM}$E&GE!ta=Ni*E|iA&Q>o z{LpSdPRH8B;v+~}iPl4&o22$QP5RW)s7_^Le}Dtpk*t>TW;x8;`LYAR)tNT6jjB$# zE(ls8-Vj^_O5n53K_N7v0uIn3x%)b96kA{v14%)v4j$SRCYDZUVVEM^z@Z!u;*?CF zxJlh%3RGJL?o@8FZFQnGRR&zpCW2Kw5uAlFNwm8T7aYr|UkBP!WuAhq zfpeWs)aSy`S+@bWxw2|V&kvMz-!VWk;&4LU?yKo0N(jB3X!6x%p;s-%BRI zP;4xINC|m@iZYf=luJAIDP%|if7>Lta;RNQna%@)%dv%k7BVTq!~zJ^6-_Dw3vo_bWwmOvmq9R$QfZhL zZeGHEgIqD=jbIavMF3rwZ-a?CPgr1y(F@!X-UQojYBBs)#a;L(cw2@lNqM6)RH(Iz zSk*PWrYRNu0{fuiF&`eO#5B~}k^~C@fFy?K3Z$@B>6BEp7vL6f6UAllnN_ShBfhLK z4hrbuqCyyLZLHIA!c>>xIsp`aQ9Ai42W@#B!OM|TraY6`O*A`=YwAX0N_9L-XD&ja zIBJft=DxB%hPr);CC5*Q(&)5(aLWBsk{kl7jA2YCf(zm5fcRJ*9Ybj75ru1FV6{!G zN@_WkAIN}7xE3A5lcP+TG%qNtRNht_UHGz~BZYBWq0{MJ5#qKku-i$0rJZwD14S$< zRiMF|COO~-O~;sZU}qN8D8;|gZls`^D`Q}_X%vJ~PL4|xWF2?J*MrL6EM^% zPBGQiM~2IS!2{5A9txW*>C`D}yf58j01)@wD}G;KO(k6&4o+d8hLzTt=2Uf|$~=d? zcS_0(%Q&nGN}e|j+#g4OS!!#^DPW!GG`;9G#In+XA|+(1szsq#Zx>W01%#SzfQ-&3 zX@A4!l9^12TRJmTRIG5No$CtWmo;oW$fRI-D`hA%981HJi&EL{As+0`8;qaw`npob zwyl&_jIYoZLDujL2E-@$GeP!7fGOrBcA)l(iDsq)CNBl0HcNk!-S99T1Ve!4DgQ`kp3A&q znSmXk>JUA)wp~+ag_jjG@XqG#_q9f}2vE2zVI0E0_8kH%oh5@pHgoI<7T@ix<8mY{qpovJlT zXNpL@Nm`w9R+<^@CknzA6|0Y>Wc~A8=vO&j9avqb`z33Qsvp{NbL0Y|A=Qt^C~}Mo zq)10XFxjd)hgt?aduDX*PMLj~QeO&YL3M_7<}ikTcb&rertYi?Qz$rJ!8TP11g{Qw z>5__Rp=}+3s$u46UJ(K|KY=Dl&G4073L$Hh>QYx&X6FmOKH=#?nUyN~;+34oVgneG zM!RoN3;Y+*C`NpE5w;j&#$+xoTy;9%)GH1AeiSnr;udlVA9qq)3p@+;>(gY2IrYqu~|HpSA8nTMI9Rc3w>&p zO^hZrIt9fS1J}JOPIWr|43UxzY89Y&^)eQm?~l>LN`-wAtEvG2qIkTysqkCc^FY*f z!cKp~UID0-g=`x)blYA3UQO$wcHQ+QOE7i3VTD3-4C(K#Cn-#{dQ zRu!aKqNVhr1mAA5M(JqqfX?9BW$#n`v9<{mqfo^ylSKq%44(|i;CcRz0Rj2KKPtU2?6;0 zRENky3}rW9`WSEz{25Kt+04o$whc-?^P(4Br#wkir`5@%G;#;*VU6-saJ@{YLE>JH zlKUA(+htPHQjuX*Kw~hFNv1PVl)lt|E~pOOmx`eXkH>rxuvpyVOOmq0&H*6{9oS_R z6YaSdIQO9Qd%3AqMN+XyqgZ8w4@rSeqRK_ASyJW-OanSImE{wgks$|v8J$;49FD^l ztTLFS^%z1MOMEI<)PfXZNeAu5r8@DHYX1i_3QINMepExLKS`x+`_w@aVp39ngX$|w z0A!%zTeXh~K($i)_%^42t`a<283rs7q!maNLxmM91_vtO21<-}w!#V^HnHFtKDf3D zbSXCO={_x61(s9%R;6=yEiwm8)yWy3R4P#zvzCD+jdE6EtVPGSouXcN;HHeVwA?mN zp>Dm7%xeP@uLE4ol=2y{<~pu_oG{NO9^GU16?ayhlv){Mwene%#qX6jjV;WT;sQA? zTgC{-hprS@EF+d2kK(Fa3Pz;CPozHK5f4=B6x}Rqk^Nj1Ty#>nt_^~&EZb7~Lzp{S zj}3ZW_< zO|`qIj3>vmLKad9e2Zo1T-7PQp}MuGQ|-NWGm8k)@)DLv$0Y$45yqoru<~3QAuVpTzgH;{ z6K0w>tcVc~P~PmO?ugFESK1OZMwC^WYQQscFtQXr@ytC6pBA-$5@ifHo&OkZOIdA< zJJtTumZ__vFK(J;T#-t)Kz*}N7OaxXj221f7A6$JL8mtFAPF4!CJ? z(PhSu3UnKlFaRQdVd8a`i&twUjHIbWBV|})^vf3skS;Mgkq?;1psLtc$B#y}{4fIA zP*0Iu3)ph1pN06AIyCJSZjrJlI9{jR*H)DtGC(14hj~)PnOearS#S7Fr;4ts^JKgi zpf`A>O`aXI*QR1l%v6`Fj4~!k6?2s>SL$3WT8%5?AHmLl_-mOe-zmQ#H)#y-`YN8! zK^iT_tkM~8;H2_J00c^f$y9mJDj#1-*+vPJxp0$VinF?lVSkKMh;ddU7Kb`Qxmlu8 z<>fNSj}nGpFbGyaGo1<$maXf8^2uZHLG;noInGVSH`?tQ9IUH z$pzlhS|=JOhNK8XJb+zxf(nJUVSqV7VNiN#l&9@~H!;3eC)`;`rvel;=3Xm_BD4yk z8o6n0WcVCFt8)c9xMkpKtQQ75#xHcltYS^+Mb!{;$eWU>ltBV#S1cejD*R%F-c;Dn zDa8^(u6k?nAi5A!1||kc=Bfizw5f{0R@#@TRBH~OqvKBnGn(n-cdgB1`9(>4w-EZp zJ1G%=0+(+RosNJYpb|1e1Gj?Lhz49mq$?4W2>4&81*dg7%{c?gYZEJiQIxUpFlcl)ts*0g8z%JUW&XI$* zQSmjbORh|(#=@jCRfE?lbPTxWrLHmGN>f)6+n9f;gkjZPNwo=Lbi$`*RlzE0f(Utk z?d}8*15GMrP8yXs(D_p|63y&3-V8s|@gJ+Bfvw&ICJS<>O4otYm8wwC=oq5PQz$t- zsD1)Sv4ZDmI>E~YmIKWwb7dQPRk2Bu9Hx!$Y*f2I7ad^!SkPL>0TZ2<3!N%Rv~f=W z?xO?<2USayb7NKJMV0d62?fYRJit?bVW6<+R`rlF9mQ?H?dVdHECbgBY?{D=W>`(Y zx4}lLs$3gG+MV_#RT8O!Drl?0Bu2;Td@M;Lvty6}+u%m6nY> zg-z{r)og%W2_ZFzx-z){qUkc4s?bZV`eX`Nh`7N)b*2zD5f2lmh4zhG9G7f=FP=_? zU{Fid_(Q*AG87mdURq|_m~22xC5Bf=n-D2EQ&tBQ;FQ*aVFrVv?Om$9AN*)iFXTr= zX;nmpk+qeoiokc29^^IQ_(?{o=xwfGZifR)wQG#cD{;XXi0DU@FPH)wFhX*YXa;;- zF(vKZ!nn~mnJp8K05qj*1$V@M#c&W+x=@M*BUC+iAXnEaF^%=lc(_(fhKA6RSYtt< zF&pAdAXz+tnd)K%97YTWVIM)PMn}lBpUvcFI#6j_G@Pz-=%}C>QtO2Bf`~PKv(QZj zT@-MY6jJiNRhp}!gLP2qB{tUrPqLunQ9eiKb)G`|_1Ik{E`pb=iwBc`h3G4%Gs8e^ zCDh`eD{V{`a95S2b8rd8n>vN9E0MoWr(UaECx;RlzJ`(W5!x>-T8N#=asN1#T=U=Q z{I3m|=R_%23WF3nM$EtqrP}+_ZwlSP;T1H{SxpImSAjsJG>b)%;i*_{S&EqORI1Ec z8w;cfzm_rQFlq6?5W%K@>{P%;dFx#&SOJ^Y(d;0WEmnmB810r|TD%HyfHuqc?d|e^2^lb2_oQ@m7gW%y zQ;{nEpH&rAI)`q9tND;7dNULQE>m>K44Re{0l&-I7nOFfa}`p9id8BBg2_Z+jS`j1 zSo3yMHW|FcV(J_q^aI0S`5B?cLr0@(e5JB=Dn#Tv9ah87VvaT`4@ho=uDJPHH=!tY z5wluZG{@?sD$ALF!9|!~S7grSMoH)vG{=AGSP!(Su4B}-EwV(uQipH=Y{;|+hAD+o zhx>9b$F3Txv5Gf>D@+K|RQ0jiZOUh5`Xtl|0Tj_p4IMF`p@ovxN`S((=kdr&Cw5!a zaPt~TKtj{Ff1Wqu=CzI}H!8QKWA)lr>r^LI)#NfX!Qy6rfW?){Rydu;6aQ5Crg-`Y z)^;tKpt zC6mC(wbEzgS@;sg4UmR9ZtrPF($z8EUB`m5T9F(uUKYBQ1cc!$V6Rv8ZQ~N95FvRu z7`Y(K3vecXGpR`%^imZYQLD(!>Z*+gL9|BNzgNY7kWYsh#D0kNZ|b@_-7 zDbNt7yxWA2Rqz?chwM48La{JR$fYj)0AMyApP#gX;IWcICkq&>7ddZ`xM*@3=s}G( zo6JUH4Rr|0j6+`(sl>Rbo@S;TV3xAURG$$kEE6k#S{WC$RV8L&)JBY>)6c+&pyJ@c z;HCk1PL=qbCKB1z+1ElFX9fowJv&&iNfVVSm5{;jngDNwf8&zj&X7CDd{&{>se5R= zingYD!k}}pBnZ$y}S319&(vaM!E4|PRtPSJEUqA=A z*Ia=GCNbB!ZNNi|ornkS@r2f?0+@+O_^R4}!SDeXsp_j)RiCVtysIlxS_y1w6!!uC zw@S=erp}l+j!K2=h^P)5;0EA5Nem7H1bp780z42#2YAX(75h{U8;whpx)M{eawJ`+ z@D;YIDuvq%B{gURDpAl|ysA@0fL4D}0D$EN1XU`g8p|7~KZei5y}^nN6e^dnsRHRer!q zYw#rTcpmbqQ{oXQb-Gu`sBXWKV^j!9TNQNJB)RvGXeNV+>D}IAPrwB1X&^Q z+GvichD@ny!gN7rqKa6i3IZ0YrdHkOq*B@%CJWLZyEg;yybz&{Rex zrJX9b7DWo04jA+dYt8@9p@lhIq7vk)Bx!Cr&d!0r9kTTlE8L5q@9SU0uE2Eo}t+pnt(Qwv@zVeBnlh)A-;Hj>BR+vzX^CO z$+RMQiD=66kSrz2l?Y@OcQ$Q#mM9Vky(NZ+1OQx_1O`q?q+=oxhA19?M9rx**8;@z ziHlBj&6G@=B%*nF@eHzxv&ivNi&w{bd)^aHTQ#rY#fP#Wyqswh-I^LkqvW$?3%2bR zCnC9{(Btn(=JOIojFrTHG&KN~JU5)F7=p#@3@K9Nl|05%#9p*e>{G(`UI7#&(;7`0 z(8YjI99MC}Rr^aD;b2ZQIuO1Jf~b^a@pp3Qz{!;Ct?`n?dy1B+ulu}6RGlS_Yx+W+ zf$)(?BY|hNQZm3F2jFu>iyY2)fWeNuYcFZAJkJA8HL?4u)!`oPnAAVtu$o2dNs9m901;Vj#Rud0nQ z%S=>AN?|$z2+jo``DB7Zz~~Kq2zj%DeGX8OO_J$^#YM_e0HvOMF!g>V=k=J$QPxL@ zSWJ#^JuLyeC7zIf7E1*Yeq@-dlt0rR(e_)Ai2Q;t z#sq->{nS2pRsFL6g2L#}MLEH>G2HruP6ulBB&<8C`^C4ot*rcT%Kv;^@WsR5g^Ib9$*43b0tnC3(m>xP461yZ^00BhN zy{Wpj8gfRaV4%i}FzW>9_pVg|AlgPvEHQxu`k2MZfi<={@}NrtWc>?pcCv!1)Gl=z z2pmbKB5(nJG(hqc#SolC-O2W|C^x9euqR?rJuplS$25>3JxNHH*ykqToYYP6erf6j zWXo-(AjWzUH7T~K_lp!7nlj+R4GBzif%HT2>Ioo;yC+XaYLz~Q8izn!SfR_5^pP3^ z35--;S?7kBNW~t&&?L04z>$czZf6FutVk)A#6}%|%S37{WEa1J6by;WC9I}lur3Tn zcLGi)fk(N_)ENUJXcaMHai7HXRxu@w<^qU#0ZN5o*XCq(r4kKoiT6%z?53kg>D6K$aja znj_&CpV$he(`-uhP3wZOLnK#X5W0~$=iPo7OjOa<4pTmMXV6a{`F`RJ=$)f~`QpOPH9E zk9Gar@rs;MK0wcj4c~s1c;>3K7HJ$y3u(apMe$k6CT?tV0^KGobZeXzY=p%U(&7G_ zg+%q(~|fqt?TY3pscb4t!ie>CpU zl7}chbBLL4Qo;bK$YAl&i)|ra9Mj>F^hHD#u8VYjhY)sRh?k-*k^ua6K+jppRwYb% z6~{HpfqEvk9f`E|RbnF9XZW5l@PXZbWZbP3<5LL+u~f795sB`Vpmnp_8xx z%q*2eEy`5n%%T`~RvTOqg(abRu2DjdNHKtw=Y};bfJ!Rm7d&jet=OcZSChF)*=4Mt zGr3%%cLX|YR+LCfQyK;Pb`FT>xctR1B>(!ulKj@wTd|@&?jRtF-}qo~$`k216Y8R+ z2!ks_a3`(~psA=N5?e1st~619;*y&ENs7NVf1C~r$mFiWU}Uic;q}2Lnx_s zAt+YTml-Rgq(TirPF^1v56TQ?(rE&vrQ;_40lHRPSq(=;QX|d*NMVlDGUX}AVfvSFuQ8Gk*mK^y$Z~qR`6NED!g6aL8+F1U2}s%5JATw zj9>brHk=g=5t-7BT==B zgc*`CMK%vG`m90;$%&HfS7;$cUeMtH$DGA@cAy7A4k3q<6zCAPrBYK)uiWPbv>~!i zR0*{d02YvpF4;jH1XF&0o~cw5@RC$ZS=0hLH6RsPuf~n9nWjz0z zgt#4lR@*>y z4wtCfm2hdf_mY>yjinTdXiIX}WQjl(u`?Vog)m)hv50k0q6J~GJ8V~rW+7iAw{k?8 zN@fRY5oLaW^6(_1GH;h5R{=YJIFAMtt@%5Fha%8GTMVc#(m@Ulv9vmgl^{ugY*Wc5 z5V=>Ur`&1?AMmlrY@v&gLoYFI#u!0HPn7(nF2S9F!I~_R74$gULVh-?CDM9s(wfMY zEEQaOiSFo0nY6@X-76XYj$+iBMQKI{$=QUJ;Qwf)_1??cy_dCnFKhRIUe@lttlfKA zyZ5qo?`7@Y%i6t{wRcS|J$;5@73nstIhq-t~OTz1fY6@mU93HYNw3KD$+|h+VM%7M(dc| zks_&*kh-1D&F5(nK?TSU$Zt!u&EPmK+L0?kb0S6(!lk<`6X=S6R&-2TS?nx=Tn1V= z>G=Dk?-hTI=Bk%YCs|d~u;EG%1@te}Qjs|fj5N1WBc`L|f?w3A}WY{sPAQs>TW^79y0hWH!Rv zB(Z2Cg5V(Gh1eJAq-e3BSsFo^rl^NHy;1*$RCP&d;>iRIiad!nOD}eqD;LSKg-ipf z!iyG4F!vI=a!`3^2P~F6vk8Cn64|0?A5#>K zmh2}nZUbwEN>&DT1Hw<%O=Mh?k>eq-ak6+W9~KX_2EyV5cJc)4OC#k#rqTb*-BbY3 z#EKp;&-;bKd7(NG5vg!@N~zolKBW@Vv|#4Zj1z`OwTEb%UFx?;GcNdpD0qoBB49Qe zgNgV;eHIQ`D$Yp>EzlFOJJD}xdv!HHOtXW74S9$}FKqW^ce8l0M0Z@ONFY=be$5ECoqsLD;ggtV_E_xw-M1&r1kpyemnUG|Ta{{f)0#$#>5G;nUL((XCZ5zN6S^z8MxU^%U zblfmmvIU+Wb$i3grzwunVj88-=#!*4ijV-bC=q&t0ZpcKV_5W(J~OzLo-`9+v^GR- zt&?Rp>6Z#9+E|CxL8T5SmI(5i@lGc#QIQ-NK7J7it`^$uLCc|BjgJ=QB!*6+OOy&= z0sVitXtM)-`k<7n$QaoMV)Q%ZFik!=gLD-wA&s2H<(%v;;E@|b59Gohl!{4i1#n4f z@h0AU^54;MA|7%AP5GHQ>N%tnzZ$*se=~YLw48+L@?!|L@}dQBQ}yqKo^DCh`f`SCJGus6I$}LTlI&d z1-8x`7AP_tUDSSreR?rHFh_`4z;1uAQ|Yl%xK!ebc1OgsejdcIAhT-(0B_jtJO={Ujq7y%)Qw zKgep+<^{2_5<9nOla(0|8K8jP%#;)v;teTlOBl1{D@joc-l`G~?Kf0ZZAE`kpj`?B zs11}vl@zb$3Z|fD7O>>#mPza zwYTf&uy90e>x~61H3GvEaVT0Er?Vo8qTU2-XkAgIKm<(RBg%lc$G_>_Lg~qZKg^3# z?%?|dvhe)`m^xKlD&RLKpiqC{U=X<_Ju0_V^G)v}20ri!@xWo+!c&mN%S1^)zRivh zO6S3VU-5+MV*?HrEk|HPSmj&Adat#xgK@T%y&JvdP9iX&|&k>KP?cIwH6!hA&jDraq8(`a$K~*~%Ba86(txASKpi21r=FnTTDF zFm^q&QdX3-%_@OPTh9|uExUW zzJ*huSk%aj+c{8EWI<9EIT6*?;&<9lMIEHTjT!-AmMSKR1PuucNl#B*qx3*FR>JRa zStq9l_my}LtQ-za2`mSR^NG?+I2ALHj*?`HCy>v|e0h@fR(yX8g&N&{DH`cnOGAuY zj0Cd>u!V%O&sdNrs_|v=2x_qc7}PSygRvc?l8L{kf$xEMv8OcW@RZPVaAP#m^O; zO^i_!Nhu;Uc8=pl`$$+0JD4{8$ zuwN#~H2vj!_aRaTmw+llg=V1G92naYn@-mB1ga4AmqgK!>_8DoJ1t@y_BawAKbL@F z0Vo0Gm#Ja_Dgp|_m(^kcLVsVjtdy48B2`Q+F@xGHLA0|<`X&7`tmIZ9pGF**)IL6N zGU8<=)JU8QN{J)!BvuH5OPzZW{e^gc3DQ_Zp&__3G>XVXV(N9?3&F-}83bxl2w7;} z0vmQ}V;vy4QMk@aFcEDI8U%|So;)#>Gv-mWLCHf5TqQ!xLgEcPwjAc&fOgkHO7GM# zf5pZ%Bx3$MhE9MuCF4tI(%hG_V*!L3=PR3kz~w9L!VJA++l#zoO|m$(MQjCIf(DmR zWC1pR))U+JU=&MB7#D7^wAA-8T5fw2|&O*JCwEa`LGq zapARU@jY<|U;s>hDlY&P;iw!>FttQb%B9YDhU;dgS#go5?NS%qqu|$d_MUwccJn{QiG`SU!FF@^Alt z^7*T_@=we9>G;E!T?^)1KD`{b>*B93$Nu-rdVG2rSGF%d|MKPK<7;1B+R(@LY5BUm z+B$Bhj+cM8%04#Zndx14WU9$7uCw=&&|yA^+Q`=(3G~ykM#poXMn-%>Ki#ADy_SgAkV|;dFW$mb^sBevf__;)9jjeYC;fCB zbYATReN<2{MLYG=u@-^2p?>o%6naQs>-9bDKxfPNg8Px4s!6}hS^d;Pt+zN$fBI<~ zOkTgBU(`>_(dn<#`c&_t)6hE3>3*;Kz3x|Uqu2dj_j%o?o=30yyzbK%hzVbtY`Vr% zqRBWH$B~|$^sGiioJ04heaF2v_QAKYPxH9{I_l@H*-3Sr*W~A^568HCJ?8a6V!+Rr zb@J_r^w7At%k{KA-+TA=<~lA1fBl{xeF3gP$IwZc+Jk(yEOaG&2NWMD^fy&etLI$dbbFeuDt2Goebk) zbw$(UZJO@)jA0a&6I*_0!jE;p#oxRzo=xM3&GQ#N}RlQb1n4l=y+tcGb1nuZBy_tu0GK>eWQ45Zre{-|;qArYE z^p>Y>p)=!}D2kh(t_{kgZw3}-_tb70 z1E94O#`2dish_%@pSqsMo5Wc{Tgu~F;_SGtk1W&E_13S!D70%t`0d2Rakz63U8@)S zydR{S7>D>qo$pQ5aH|)Esrjh|Ykj=xK1OAHvACiX%E6u7^ZCa+wX=eDmedvf=5OzR z(~mp!SNkW_v2f<_bg$hv&Zs>JNTI+-^^|0!F!RjVQ=<1TowUR+)w;pLgf8I zJDJ-Btv9IwkMd@_@_2iGxb3NNe(CL<|3#zYU*gM>9$F{T!!z^soPN3w!4r`Q(Nj`e z6g7%GFG3wf+v8Z9ajbp;ei4E0Ycu+BUU$WKe}C^d3Xfe5zxh$EU(tOt48L`EY`y<> ze0*=;o=@q1q@P+#<@t=!iMR5A(?)a1^a!)sMh<}z$y6eiLykm#L}Elt)S_^Rh+1$C z$y7_oA&hDXIV~ZlCFI0DoFr|h&EnWC+CyHu!E3L1?KQ8x=Cv)o2)38t<0bfb30zWO zePyPM2_xbtE`T7t`!lwS0X<@V<*MoYfd= zA^S#fF76xZ0|(CSdCjEPOnS|t*DU(NBRM@i4>6z-3)%=zyoH`{CYHAxXY!9dl~8P4 zDWqqSL1UwDmpp3$C4VN(N~-a?`~Ec=uk?1*$7WBBIBQjocRW0qavk@Ld3+v`tN%}9 zl!kPcVjj|aYfaOeuS;XK#Lx*&ZYHRyESUJw*Kort&6DL8nq&$R%H7o zjgnSl617UAR!P(wwF4#7|3^;C@$C0*` zI_Kh$;Plc)-uzo)b6s_=-%-ce`_rMdXGG}!RD2|Jc7H~FLFataP98@?AH6dWJ6~@P z{~G-aZ~OUlrL%|lD5bh4N{l|l-}>6o$|I@2zTKw4Uj{=-Mbqs&m*bFzOQ$?GWv1d*Zy_CGls{vUL)17J^jnYH!Gvvb6>sn`nJ)( z_$V@5ZQT3Q#(%8TA?P)E{o1oO&Y{ozZ-MihGxB;1{RiTpJ6{4Tud z43=v#3_X{I8B0gE6b89_x+gu|=e~VPKT)f|@%)y}f7_CNoLAqpqEf(!F4m=$(pu8_ zp)oza>3X()^M>&q-=6L7d02sOdKDgeHfZltfAjxApU2nt{v$N$o``oK-bZe@Hts^! z(0_qp@uvLDjrKc)ARHdtKiWv6k4f(tb_Q?G63*g@2sowmyWiXVRn1++)yL7Y=j?vH zQ6fMp@$or3`|$qW(&JfsdwZjK!rImQH}XdQ)xU=$>-p%l_4K!TiO=mgkFUq)?bywq z^!@iZhMI3iN`d{A{!eSDeD=5WzxCFgIe)Raa#C}j_6m^C(R;k0pg>3pT^%d9mkFoquTt z=LY}OUz*SD^XK-3=-kZ#6YQBbWEg39HLKVR9HC-^u>-6~FqK;NY+W zyc~A#bX_Xf)2(x6W@ra^H#ork5$qQ2o@fWHk2osquVZW30b;yeK~}djy;+B_Xb0(f z;oPrWJkFLAV)d!gbd6 zs=8yA4SXT(QfMmz&ze~=yhx%c2wwEjbSxZhwzqx22WkiS^*9i>HqF!rynmv0FkhFn zIjv>UPt#m{#NlWMuHTc|X!*XyaOW94!pmWrAubP7fN){hEgClS&U+1HX^qtWDUbu} zj3~j}&iLEhp2Bf#2UpLvA zxE^Y|qK9nDA%>WK7p6Y^csiY#I0DkGnM!av^ot0>!Hyu4(T-yKe0-zM)X#wYYq|{n zhIY}L2yI6^X{~7wv}TcyC+iTBifa!{*OP4mako0xj!J(HiPPvX?tcbnv^TIWjoyaP zc20<)|1~Myj*#1}f5?zVh4J7zqr<@{zx77Ep!I=u=GzgXyftScmK`AFTQA@hMwIa} z^e6iyK;@0j;$Cn@sc|;+n;Lb%YwV18<7a4}n0x23dKx{);oy9`=KAy5^awkG1+{az zw*X-`N*}P08ga+*(0^Terg2;z2qWs%1Y0}B{kgjrnkgKm#C&7C$Be-9brw2+Xw37jwBBJpx1O++8$D(@G&!&@Q!~!n-}X%&GSN(R z*-Y_vj@C^E&6mw`0WN=>_ai@!XwUXU89kW$cbQ?`zSvCb?I@3!@Sb&OBFk59bDcACbK8%KT|-R}!yHttX4agM&UbN5*rt+;#3 zWgN}p=<1bcQ8s3Wuw&c~Gk4PfI#&*tdn0raFLi;_+qfBHjOKs5=o*9Ttg%ZUvpF=3 z)n?opc7$WYxMb~bsa+Q^cTbbSV?UGn-!4$pi)T*VF@huBb@mzhximK+4ZnN)E?-(Z zK3?t3{cor2e!RK1o~P{LoAI5d0o1;Gy0+oF@{w>!7`sl*fn(QjO*J71=hbCq zG{pk%l_@0UI)i_2%QO~(of@;w=HIeL`=G?!UuRw~)1La7(mPMc)YLw_e<(g4W8n!8 zO=IB%vNVp3Be8vB!D(hk`8w6#nlDMXi~5b7H0`4eL)(I_3te<~{bVOUeV3+Agxa4z zS*_VlmilgPfBK5+ORA537ub5|x|rET$*y7cCD=5hKF@!B8TD1vmr486TI{`vT?^`J zK^GD_ukReJ{pp?T`bZybM%HH5!kTPGW0&v~>%in3oD(f#3fDvnrotKFP0qm`(ITR7 zB(%_}$mID(?|auW*NpCGi;}XVuDoaENT3W{q;L$9-WNZ=qpW z$bEAi(a+|7<894C#g{dUlpA4Sd}BKzjIX&cUA??*m;Kw%SJY#VK-1>-jXx7<+W392 zNV9I?Zt-SVy{{vp(k^>xj~^qJuf@d>r&=#-c8?$vN$inj-Bg7Q+c$?XT)_AX*6Z$y zhe))zQrzveS>$MU#4mN%o*z!_a5=|`gX(|bXQ@Z0;XMdbTPwB4uqBKjjYaq?Obxqf zXsjR*ZDuPJA=5Q`+}s1$(nVW|pKaGV!Ax-)XDs&C&RubAsdEVIuDx|4ahq)o$9voP zG4$9r?6ocCEp^I`MK?6chl9TNaNJL{>}9ZQ@omXMe%njkb<_muO?);5wnY=5;El*U(G#+E)ftFT+cLUQFe*IC=t3J zZXb?+|K-cq*JE!v0Wa@%(|5b+yWRBNZu)LFeYcyw+fCo?rtfyscf0Ak-SpjV`ffLU zx0}A(P2cUN?{?F7yXm{#^xbay|Ez!A)QFE+OGCP>r6FI|(qLhtFUQZz=hu(hA3rWX ze*W^JqnCd=zW&`u;7`79SR&wbgq}}UEQica8&*dIZ-X3>c31d&oDC} zdLX$z*!>0!#2o?x)1JXVSi)5C#?TXW$`#j{pt=Sc%_) zia?xWo^k_jFn|qL8cKsVXoU{AF?G<5)FBl(KQ{~o!%BeJz$$zLICk;0;plFb1W=7{rE5U;uv}Q%5L(M23z?0BKAO)WgiWrGa~tjwdjO4)ozW6u{hJ z0ZIq{n0ktTgm73&KSrSj29kOjKU;b3z#zWo<+HI;Przqu%`M^Hz(P__u(uu2GwJ6B zBEq&}8(Gdgc6`f*@4zCyXUG?l-CNSTfsFW`1@UWc7}!8!~*ms%Nb?)ge&{B^bAyz51?0? z>6^&vjb(bX6t^214i=~zT8-|%=~J1l8w3klb%RQ&fg2Qy7u~Sg-=I%y@tbYR8@unu zvSK^kcqvQ%27!NVd90QxYq_i~C)9F5v*moECZHgo8r*Y9j_jnT`2V=pVX6qSf{Zi1jXq&@rQ&UOBRYP35bNDE0M^OghER_V*B7$3YHYq zlX_V14*a+`i94ky*|1+gnqzOUAK0>zwLW}WUXPd8Km4?O{_)uV`1;a>pAX;tj?=&U z_4CKq-+f2@RWj1g$G`r3ye|9ly8P?$@2_8%?e)vo?_Pd6w(s`uUSGh^e87hPZu%~M d_>aGN|L^_3_y6Ai`=9#Xe*(Sns^I_t3joeEEN%b* delta 37258 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 L*YL5e|nhx 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 s1{PDnWTP2X2Y@5^v { @@ -198,6 +198,7 @@ export async function runBrokenLinks( runtime_metadata, options, followed_links, + storageParams, errors ); } catch (err) { diff --git a/packages/synthetics-sdk-broken-links/src/link_utils.ts b/packages/synthetics-sdk-broken-links/src/link_utils.ts index bcf403b..06cfca6 100644 --- a/packages/synthetics-sdk-broken-links/src/link_utils.ts +++ b/packages/synthetics-sdk-broken-links/src/link_utils.ts @@ -12,6 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Standard Libraries +import * as path from 'path'; + // Internal Project Files import { BaseError, @@ -29,6 +32,7 @@ import { // External Dependencies import { HTTPResponse } from 'puppeteer'; +import { StorageParameters } from './storage_func'; /** * Represents an intermediate link with its properties. @@ -224,6 +228,7 @@ export function createSyntheticResult( runtime_metadata: { [key: string]: string }, options: BrokenLinksResultV1_BrokenLinkCheckerOptions, followed_links: BrokenLinksResultV1_SyntheticLinkResult[], + storageParams: StorageParameters, errors: BaseError[] ): SyntheticResult { // Create BrokenLinksResultV1 by parsing followed links and setting options @@ -231,6 +236,8 @@ export function createSyntheticResult( parseFollowedLinks(followed_links); broken_links_result.options = options; broken_links_result.errors = errors; + broken_links_result.execution_data_storage_path = + 'gs://' + getStoragePathToExecution(storageParams, options); // Create SyntheticResult object const synthetic_result: SyntheticResult = { @@ -292,6 +299,68 @@ export function shouldTakeScreenshot( ); } +/** + * Sanitizes an object name string for safe use, ensuring compliance with + * naming restrictions. + * + * @param {string} inputString - The original object name string. + * @returns {string} The sanitized object name. + * + * **Sanitization Rules:** + * * Removes control characters ([\u007F-\u009F]). + * * Removes disallowed characters (#, [, ], *, ?, ", <, >, |, /). + * * Replaces the forbidden prefix ".well-known/acme-challenge/" with an underscore. + * * Replaces standalone occurrences of "." or ".." with an underscore. + */ +export function sanitizeObjectName( + inputString: string | null | undefined +): string { + if (!inputString || inputString === '.' || inputString === '..') return '_'; + + // Regular expressions for: + /*eslint no-useless-escape: "off"*/ + const invalidCharactersRegex = /[\r\n\u007F-\u009F#\[\]*?:"<>|/]/g; // Control characters, special characters, path separator + const wellKnownPrefixRegex = /^\.well-known\/acme-challenge\//; + + // Core sanitization: + return inputString + .replace(wellKnownPrefixRegex, '_') // Replace forbidden prefix + .replace(invalidCharactersRegex, '_') // replace invalid characters + .trim() // Clean up any leading/trailing spaces + .replace(/\s+/g, '_'); // Replace one or more spaces with underscores +} + +export function getStoragePathToExecution( + storageParams: StorageParameters, + options: BrokenLinksResultV1_BrokenLinkCheckerOptions +) { + try { + const storageLocation = options.screenshot_options!.storage_location; + let writeDestination = ''; + + // extract folder name for a given storage location. If there is no '/' + // present then the storageLocation is just a folder + const firstSlashIndex = storageLocation.indexOf('/'); + if (firstSlashIndex !== -1) + writeDestination = storageLocation.substring(firstSlashIndex + 1); + + // Ensure writeDestination ends with a slash for proper path joining + if (writeDestination && !writeDestination.endsWith('/')) { + writeDestination += '/'; + } + + writeDestination = path.join( + writeDestination, + storageParams.checkId, + storageParams.executionId + ); + + return writeDestination; + } catch (err) { + return ''; + } +} + export function getTimeLimitPromise( startTime: string, totalTimeoutMillis: number, diff --git a/packages/synthetics-sdk-broken-links/src/navigation_func.ts b/packages/synthetics-sdk-broken-links/src/navigation_func.ts index ec66145..dcca8fd 100644 --- a/packages/synthetics-sdk-broken-links/src/navigation_func.ts +++ b/packages/synthetics-sdk-broken-links/src/navigation_func.ts @@ -31,7 +31,6 @@ import { shouldTakeScreenshot, } from './link_utils'; import { StorageParameters, uploadScreenshotToGCS } from './storage_func'; -import { CaptureCondition } from './broken_links'; // External Dependencies import { Browser, HTTPResponse, Page } from 'puppeteer'; @@ -198,11 +197,8 @@ export async function checkLink( screenshot_error: {} as BaseError, }; if (shouldTakeScreenshot(options, passed)) { - const screenshot: Buffer = await page.screenshot({ encoding: 'binary' }); - const filename = 'test file name'; // TODO pending YAQs screenshotOutput = await uploadScreenshotToGCS( - screenshot, - filename, + page, storageParams, options ); diff --git a/packages/synthetics-sdk-broken-links/src/storage_func.ts b/packages/synthetics-sdk-broken-links/src/storage_func.ts index fafc1c3..2580876 100644 --- a/packages/synthetics-sdk-broken-links/src/storage_func.ts +++ b/packages/synthetics-sdk-broken-links/src/storage_func.ts @@ -24,17 +24,21 @@ import { getExecutionRegion, resolveProjectId, } from '@google-cloud/synthetics-sdk-api'; +import { getStoragePathToExecution, sanitizeObjectName } from './link_utils'; // External Dependencies import { Storage, Bucket } from '@google-cloud/storage'; +import { Page } from 'puppeteer'; export interface StorageParameters { storageClient: Storage | null; bucket: Bucket | null; - uptimeId: string; + checkId: string; executionId: string; } +let SCREENSHOT_NUMBER = 1; + /** * Attempts to get an existing storage bucket if provided by the user OR * create/use a dedicated synthetics bucket. @@ -52,17 +56,19 @@ export async function getOrCreateStorageBucket( storageLocation: string, errors: BaseError[] ): Promise { + SCREENSHOT_NUMBER = 1; let bucketName = ''; try { - const projectId = await resolveProjectId(); - const region = await getExecutionRegion(); + if (!storageClient) return null; + + const projectId = sanitizeObjectName(await resolveProjectId()); + const region = sanitizeObjectName(await getExecutionRegion()); + // const region = "us-east4" - // if storageClient was not properly initialized OR the user chose to - // use/create the default bucket but we were not able to resolve projectId - // or cloudRegion - if (!storageClient || (!storageLocation && (!projectId || !region))) - return null; + // if the user chose to use/create the default bucket but we were not able + // to resolve projectId or cloudRegion + if (!storageLocation && (!projectId || !region)) return null; bucketName = storageLocation ? storageLocation.split('/')[0] @@ -139,8 +145,7 @@ export function createStorageClientIfStorageSelected( * @returns An ApiScreenshotOutput object indicating success or a screenshot_error. */ export async function uploadScreenshotToGCS( - screenshot: Buffer, - filename: string, + page: Page, storageParams: StorageParameters, options: BrokenLinksResultV1_BrokenLinkCheckerOptions ): Promise { @@ -154,22 +159,11 @@ export async function uploadScreenshotToGCS( return screenshot_output; } - // Construct the destination path within the bucket if given - let writeDestination = options.screenshot_options!.storage_location - ? getFolderNameFromStorageLocation( - options.screenshot_options!.storage_location - ) - : ''; - - // Ensure writeDestination ends with a slash for proper path joining - if (writeDestination && !writeDestination.endsWith('/')) { - writeDestination += '/'; - } + const screenshot: Buffer = await page.screenshot({ encoding: 'binary' }); + const filename = 'screenshot_' + SCREENSHOT_NUMBER + '.png'; - writeDestination = path.join( - writeDestination, - storageParams.uptimeId, - storageParams.executionId, + const writeDestination = path.join( + getStoragePathToExecution(storageParams, options), filename ); @@ -178,27 +172,16 @@ export async function uploadScreenshotToGCS( contentType: 'image/png', }); - screenshot_output.screenshot_file = writeDestination; + SCREENSHOT_NUMBER += 1; + screenshot_output.screenshot_file = filename; } catch (err) { // Handle upload errors if (err instanceof Error) process.stderr.write(err.message); screenshot_output.screenshot_error = { - error_type: 'StorageFileUploadError', - error_message: `Failed to upload screenshot for ${filename}. Please reference server logs for further information.`, + error_type: 'ScreenshotFileUploadError', + error_message: `Failed to take and/or upload screenshot for ${await page.url()}. Please reference server logs for further information.`, }; } return screenshot_output; } - -// Helper function to extract folder name for a given storage location. If there -// is no '/' present then the storageLocation is just a folder -export function getFolderNameFromStorageLocation( - storageLocation: string -): string { - const firstSlashIndex = storageLocation.indexOf('/'); - if (firstSlashIndex === -1) { - return ''; - } - return storageLocation.substring(firstSlashIndex + 1); -} diff --git a/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js b/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js index d63ecd3..9f94a98 100644 --- a/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js +++ b/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js @@ -14,6 +14,9 @@ // Standard Libraries const path = require('path'); +// const proxyquire = require('proxyquire'); + +// const brokenLinksSdkMocked = proxyquire // Internal Project Files const SyntheticsSdkBrokenLinks = require('synthetics-sdk-broken-links'); @@ -31,5 +34,8 @@ functions.http('BrokenLinksEmptyPageOk', SyntheticsSdkBrokenLinks.runBrokenLinks origin_uri: `file:${path.join( __dirname, '../example_html_files/200.html' - )}` + )}`, + screenshot_options: { + capture_condition: 'NONE' + } })); diff --git a/packages/synthetics-sdk-broken-links/test/integration/integration.spec.ts b/packages/synthetics-sdk-broken-links/test/integration/integration.spec.ts index 8923845..93a24ff 100644 --- a/packages/synthetics-sdk-broken-links/test/integration/integration.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/integration/integration.spec.ts @@ -32,13 +32,13 @@ import { require('../../test/example_html_files/integration_server.js'); const { getTestServer } = require('@google-cloud/functions-framework/testing'); -describe.only('CloudFunctionV2 Running Broken Link Synthetics', async () => { +describe('CloudFunctionV2 Running Broken Link Synthetics', async () => { const status_class_2xx = { status_class: ResponseStatusCode_StatusClass.STATUS_CLASS_2XX, }; - const defaultScreenshotOptions: BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions = + const noneCaptureScreenshotOptions: BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions = { - capture_condition: ApiCaptureCondition.FAILING, + capture_condition: ApiCaptureCondition.NONE, storage_location: '', }; @@ -96,7 +96,7 @@ describe.only('CloudFunctionV2 Running Broken Link Synthetics', async () => { wait_for_selector: '', per_link_options: {}, total_synthetic_timeout_millis: 60000, - screenshot_options: defaultScreenshotOptions, + screenshot_options: noneCaptureScreenshotOptions, }); expect(origin_link) diff --git a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts index a29ddc3..0455511 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts @@ -17,11 +17,11 @@ import { expect, use } from 'chai'; import chaiExclude from 'chai-exclude'; use(chaiExclude); const path = require('path'); +import sinon from 'sinon'; // Internal Project Files import { BaseError, - BrokenLinksResultV1_BrokenLinkCheckerOptions, BrokenLinksResultV1_BrokenLinkCheckerOptions_LinkOrder, BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions, BrokenLinksResultV1_BrokenLinkCheckerOptions_ScreenshotOptions_CaptureCondition as ApiCaptureCondition, @@ -33,9 +33,17 @@ import { import { runBrokenLinks, BrokenLinkCheckerOptions, + CaptureCondition, } from '../../src/broken_links'; -describe.only('runBrokenLinks', async () => { +// External Dependencies +const proxyquire = require('proxyquire'); +import { Page } from 'puppeteer'; +import { Bucket, Storage } from '@google-cloud/storage'; + +const TEST_BUCKET_NAME = 'gcm-test-project-id-synthetics-test-region'; + +describe('runBrokenLinks', async () => { const status_class_2xx: ResponseStatusCode = { status_class: ResponseStatusCode_StatusClass.STATUS_CLASS_2XX, }; @@ -44,12 +52,51 @@ describe.only('runBrokenLinks', async () => { capture_condition: ApiCaptureCondition.FAILING, storage_location: '', }; + const emptyScreenshotOutput: ApiScreenshotOutput = { + screenshot_file: '', + screenshot_error: {} as BaseError, + }; + const successfulScreenshotOuput: ApiScreenshotOutput = { + screenshot_file: 'bucket/folder/file.png', + screenshot_error: {} as BaseError, + }; - const defaultScreenshotOutput: ApiScreenshotOutput = - { - screenshot_file: '', - screenshot_error: {} as BaseError, - }; + const mockedstorageFunc = proxyquire('../../src/storage_func', { + '@google-cloud/synthetics-sdk-api': { + getExecutionRegion: () => 'test-region', + resolveProjectId: () => 'test-project-id', + }, + }); + + const mockedNavigationFunc = proxyquire('../../src/navigation_func', { + './storage_func': { + uploadScreenshotToGCS: () => successfulScreenshotOuput, + }, + }); + + let storageClientStub: sinon.SinonStubbedInstance; + let bucketStub: sinon.SinonStubbedInstance; + let pageStub: sinon.SinonStubbedInstance; + beforeEach(() => { + // Stub a storage bucket + bucketStub = sinon.createStubInstance(Bucket); + bucketStub.name = TEST_BUCKET_NAME; + bucketStub.create.resolves([bucketStub]); + // Simulate default_bucket not existing initially + bucketStub.exists.resolves([false]); // Simulate the bucket not existing initially + + // Stub the storage client + storageClientStub = sinon.createStubInstance(Storage); + storageClientStub.bucket.returns(bucketStub); + + // Stub a puppeteer page to return set Buffer when .screenshot() called + pageStub = sinon.createStubInstance(Page); + pageStub.screenshot.resolves(Buffer.from('screenshot-image-data', 'utf-8')); + }); + + afterEach(() => { + sinon.restore(); + }); it('Exits early when options cannot be parsed', async () => { const inputOptions: BrokenLinkCheckerOptions = { @@ -69,6 +116,16 @@ describe.only('runBrokenLinks', async () => { }).timeout(15000); it('returns broken_links_result with origin link failure when waitForSelector exceeds deadline', async () => { + const mockedBlc = proxyquire('../../src/broken_links', { + './storage_func': { + ...mockedstorageFunc, + createStorageClientIfStorageSelected: () => storageClientStub, + }, + './navigation_func': { + ...mockedNavigationFunc, + }, + }); + const origin_uri = `file:${path.join( __dirname, '../example_html_files/retrieve_links_test.html' @@ -77,9 +134,10 @@ describe.only('runBrokenLinks', async () => { origin_uri: origin_uri, wait_for_selector: 'not_present', link_timeout_millis: 3001, + screenshot_options: { capture_condition: CaptureCondition.NONE }, }; - const result = await runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions); const broken_links_result = result?.synthetic_broken_links_result_v1; const origin_link = broken_links_result?.origin_link_result; @@ -93,6 +151,16 @@ describe.only('runBrokenLinks', async () => { }).timeout(15000); it('Global timeout occurs during checkOriginLink waiting for `wait_for_selector', async () => { + const mockedBlc = proxyquire('../../src/broken_links', { + './storage_func': { + ...mockedstorageFunc, + createStorageClientIfStorageSelected: () => storageClientStub, + }, + './navigation_func': { + ...mockedNavigationFunc, + }, + }); + const origin_uri = `file:${path.join( __dirname, '../example_html_files/retrieve_links_test.html' @@ -104,8 +172,9 @@ describe.only('runBrokenLinks', async () => { wait_for_selector: 'none existent', link_timeout_millis: 35000, total_synthetic_timeout_millis: 31000, + screenshot_options: { capture_condition: CaptureCondition.NONE }, }; - const result = await runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions); const broken_links_result = result.synthetic_broken_links_result_v1; const expectedOriginLinkResult: BrokenLinksResultV1_SyntheticLinkResult = { @@ -122,10 +191,7 @@ describe.only('runBrokenLinks', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: true, - screenshot_output: { - screenshot_file: '', - screenshot_error: {} as BaseError, - }, + screenshot_output: emptyScreenshotOutput, }; expect(broken_links_result?.origin_link_result) @@ -134,14 +200,14 @@ describe.only('runBrokenLinks', async () => { expect(broken_links_result?.followed_link_results.length).to.equal(0); }).timeout(40000); - it('Handles error when trying to visit page that does not exist', async () => { const origin_uri = `file:${path.join( __dirname, '../example_html_files/file_doesnt_exist.html' )}`; - const inputOptions : BrokenLinkCheckerOptions = { - origin_uri: origin_uri + const inputOptions: BrokenLinkCheckerOptions = { + origin_uri: origin_uri, + screenshot_options: { capture_condition: CaptureCondition.NONE }, }; const result = await runBrokenLinks(inputOptions); @@ -177,14 +243,23 @@ describe.only('runBrokenLinks', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: true, - screenshot_output: defaultScreenshotOutput, + screenshot_output: emptyScreenshotOutput, }); expect(followed_links).to.deep.equal([]); }).timeout(10000); - it('Completes a full failing execution (1 failing link)', async () => { + const mockedBlc = proxyquire('../../src/broken_links', { + './storage_func': { + ...mockedstorageFunc, + createStorageClientIfStorageSelected: () => storageClientStub, + }, + './navigation_func': { + ...mockedNavigationFunc, + }, + }); + const origin_uri = `file:${path.join( __dirname, '../example_html_files/retrieve_links_test.html' @@ -194,9 +269,12 @@ describe.only('runBrokenLinks', async () => { query_selector_all: 'a[src], img[href]', get_attributes: ['href', 'src'], wait_for_selector: '', + screenshot_options: { + capture_condition: CaptureCondition.FAILING, + }, }; - const result = await runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions); const broken_links_result = result?.synthetic_broken_links_result_v1; const options = broken_links_result?.options; @@ -245,11 +323,14 @@ describe.only('runBrokenLinks', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: true, - screenshot_output: defaultScreenshotOutput, + screenshot_output: emptyScreenshotOutput, }); - const sorted_followed_links = followed_links?.sort((a, b) => - a.target_uri.localeCompare(b.target_uri) + const sorted_followed_links = followed_links?.sort( + ( + a: BrokenLinksResultV1_SyntheticLinkResult, + b: BrokenLinksResultV1_SyntheticLinkResult + ) => a.target_uri.localeCompare(b.target_uri) ); const fileDoesntExistPath = `file://${path.join( @@ -259,7 +340,7 @@ describe.only('runBrokenLinks', async () => { .split(' ') .join('%20'); - expect(sorted_followed_links) + expect(sorted_followed_links) .excluding(['target_uri', 'link_start_time', 'link_end_time']) .to.deep.equal([ { @@ -275,7 +356,7 @@ describe.only('runBrokenLinks', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: defaultScreenshotOutput, + screenshot_output: emptyScreenshotOutput, }, { link_passed: false, @@ -290,7 +371,7 @@ describe.only('runBrokenLinks', async () => { link_start_time: 'NA', link_end_time: 'NA', is_origin: false, - screenshot_output: defaultScreenshotOutput, + screenshot_output: successfulScreenshotOuput, }, ]); @@ -299,97 +380,10 @@ describe.only('runBrokenLinks', async () => { '/example_html_files/200.html', '/example_html_files/file_doesnt_exist.html', ]; - broken_links_result?.followed_link_results?.forEach((link, index) => { - expect(link.target_uri.endsWith(expectedTargeturis[index])); - }); + broken_links_result?.followed_link_results?.forEach( + (link: BrokenLinksResultV1_SyntheticLinkResult, index: number) => { + expect(link.target_uri.endsWith(expectedTargeturis[index])); + } + ); }).timeout(150000); - - it('Completes a full passing execution', async () => { - const origin_uri = `file:${path.join( - __dirname, - '../example_html_files/retrieve_links_test.html' - )}`; - const inputOptions : BrokenLinkCheckerOptions = { - origin_uri: origin_uri, - query_selector_all: 'a[src]', - get_attributes: ['src'] - }; - - const result = await runBrokenLinks(inputOptions); - - const broken_links_result = result?.synthetic_broken_links_result_v1; - const options = broken_links_result?.options; - const origin_link = broken_links_result?.origin_link_result; - const followed_links = broken_links_result?.followed_link_results; - - expect(result.start_time).to.be.a.string; - expect(result.end_time).to.be.a.string; - - expect(broken_links_result?.link_count).to.equal(2); - expect(broken_links_result?.passing_link_count).to.equal(2); - expect(broken_links_result?.failing_link_count).to.equal(0); - expect(broken_links_result?.unreachable_count).to.equal(0); - expect(broken_links_result?.status2xx_count).to.equal(2); - expect(broken_links_result?.status3xx_count).to.equal(0); - expect(broken_links_result?.status4xx_count).to.equal(0); - expect(broken_links_result?.status5xx_count).to.equal(0); - - expect(options).to.deep.equal({ - origin_uri: origin_uri, - link_limit: 10, - query_selector_all: 'a[src]', - get_attributes: ['src'], - link_order: - BrokenLinksResultV1_BrokenLinkCheckerOptions_LinkOrder.FIRST_N, - link_timeout_millis: 30000, - max_retries: 0, - wait_for_selector: '', - per_link_options: {}, - total_synthetic_timeout_millis: 60000, - screenshot_options: defaultScreenshotOptions, - }); - - expect(origin_link) - .excluding(['link_start_time', 'link_end_time']) - .to.deep.equal({ - link_passed: true, - expected_status_code: status_class_2xx, - source_uri: origin_uri, - target_uri: origin_uri, - html_element: '', - anchor_text: '', - status_code: 200, - error_type: '', - error_message: '', - link_start_time: 'NA', - link_end_time: 'NA', - is_origin: true, - screenshot_output: defaultScreenshotOutput, - }); - - expect(followed_links) - .excluding(['target_uri', 'link_start_time', 'link_end_time']) - .to.deep.equal([ - { - link_passed: true, - expected_status_code: status_class_2xx, - source_uri: origin_uri, - target_uri: 'CHECKED_BELOW', - html_element: 'a', - anchor_text: 'External Link', - status_code: 200, - error_type: '', - error_message: '', - link_start_time: 'NA', - link_end_time: 'NA', - is_origin: false, - screenshot_output: defaultScreenshotOutput, - }, - ]); - - const expectedTargetPaths = ['example_html_files/200.html']; - followed_links?.forEach((link, index) => { - expect(link.target_uri.endsWith(expectedTargetPaths[index])); - }); - }).timeout(10000); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts index 22fc3a1..e84a8c3 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts @@ -14,6 +14,7 @@ // Standard Libraries import { expect } from 'chai'; +import * as path from 'path'; // Internal Project Files import { @@ -30,12 +31,18 @@ import { checkStatusPassing, createSyntheticResult, getGenericSyntheticResult, + getStoragePathToExecution, LinkIntermediate, + sanitizeObjectName, shuffleAndTruncate, shouldTakeScreenshot, } from '../../src/link_utils'; import { setDefaultOptions } from '../../src/options_func'; +// External Dependencies +import { Bucket, Storage } from '@google-cloud/storage'; +import { StorageParameters } from '../../src/storage_func'; + describe('GCM Synthetics Broken Links Utilies', async () => { const status_value_200: ResponseStatusCode = { status_value: 200 }; const status_value_404: ResponseStatusCode = { status_value: 404 }; @@ -57,6 +64,12 @@ describe('GCM Synthetics Broken Links Utilies', async () => { const default_errors: BaseError[] = [ { error_type: 'fake-error-type', error_message: 'fake-error-message' }, ]; + const storageParams = { + storageClient: {} as Storage, + bucket: {} as Bucket, + checkId: 'uptime123', + executionId: 'exec456', + }; it('checkStatusPassing returns correctly when passed a number as ResponseStatusCode', () => { // expecting success @@ -130,6 +143,7 @@ describe('GCM Synthetics Broken Links Utilies', async () => { runtime_metadata, options, all_links, + storageParams, default_errors ); @@ -148,7 +162,7 @@ describe('GCM Synthetics Broken Links Utilies', async () => { options: options, origin_link_result: origin_link, followed_link_results: followed_links, - execution_data_storage_path: '', + execution_data_storage_path: 'gs://uptime123/exec456', errors: default_errors, }); @@ -213,6 +227,36 @@ describe('GCM Synthetics Broken Links Utilies', async () => { expect(milliDifference).to.be.greaterThan(0); }); + describe('sanitizeObjectName', () => { + it('should remove invalid characters', () => { + const input = 'test/@#$%^&*()/_+-=[]{};\':"|,.<>/?\r\n\t'; + const expectedOutput = "test_@_$%^&_()__+-=__{};'___,.______"; + expect(sanitizeObjectName(input)).to.equal(expectedOutput); + }); + + it('should replace the forbidden prefix', () => { + const input = '.well-known/acme-challenge/test'; + const expectedOutput = '_test'; + expect(sanitizeObjectName(input)).to.equal(expectedOutput); + }); + + it('should handle standalone "." and ".."', () => { + expect(sanitizeObjectName('.')).to.equal('_'); + expect(sanitizeObjectName('..')).to.equal('_'); + }); + + it('should handle null and undefined', () => { + expect(sanitizeObjectName(null)).to.equal('_'); + expect(sanitizeObjectName(undefined)).to.equal('_'); + }); + + it('should trim leading and trailing whitespace', () => { + const input = ' test name '; + const expectedOutput = 'test_name'; + expect(sanitizeObjectName(input)).to.equal(expectedOutput); + }); + }); + describe('shouldTakeScreenshot', () => { describe('screenshot_condition: ALL', () => { it('should return true when passed is true', () => { @@ -265,4 +309,45 @@ describe('GCM Synthetics Broken Links Utilies', async () => { }); }); }); + + describe('getStoragePathToExecution()', () => { + it('returns write_destination when given folder in storage location', () => { + const options = { + screenshot_options: { storage_location: 'bucket/folder1/folder2' }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + const writeDestination = getStoragePathToExecution( + storageParams, + options + ); + expect(writeDestination).to.equal('folder1/folder2/uptime123/exec456'); + }); + + it('should handle no folder and just bucket in storage_location', () => { + const options = { + screenshot_options: { storage_location: 'bucket' }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + const result = getStoragePathToExecution(storageParams, options); + expect(result).to.equal('uptime123/exec456'); + }); + + it('should handle error by returning empty string', () => { + const options = { + screenshot_options: { storage_location: 'bucket' }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + const storageParamsUndefiniedCheckId = { + storageClient: {} as Storage, + bucket: {} as Bucket, + executionId: 'exec456', + } as StorageParameters; + + const result = getStoragePathToExecution( + storageParamsUndefiniedCheckId, + options + ); + expect(result).to.equal(''); + }); + }); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts index 7bcd902..7356095 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts @@ -23,6 +23,7 @@ import sinon from 'sinon'; import { BaseError, BrokenLinksResultV1_SyntheticLinkResult, + BrokenLinksResultV1_SyntheticLinkResult_ScreenshotOutput as ApiScreenshotOutput, ResponseStatusCode, ResponseStatusCode_StatusClass, } from '@google-cloud/synthetics-sdk-api'; @@ -38,7 +39,6 @@ import * as storageFunc from '../../src/storage_func'; // External Dependencies import { Bucket, Storage } from '@google-cloud/storage'; -const path = require('path'); const proxyquire = require('proxyquire'); // External Dependencies @@ -78,7 +78,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { const storageParams: storageFunc.StorageParameters = { storageClient: sinon.createStubInstance(Storage), bucket: sinon.createStubInstance(Bucket), - uptimeId: '', + checkId: '', executionId: '', }; @@ -123,12 +123,12 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { let pageStub: sinon.SinonStubbedInstance; beforeEach(() => { - pageStub = sinon.createStubInstance(Page); - pageStub.url.returns('fake-current-uri'); + pageStub = sinon.createStubInstance(Page); + pageStub.url.returns('fake-current-uri'); }); afterEach(() => { - sinon.restore(); + sinon.restore(); }); it('should pass after retries', async () => { @@ -339,11 +339,10 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }); }); -describe('retrieveLinksFromPage', async () => { +describe.only('retrieveLinksFromPage', async () => { // Puppeteer constants let browser: Browser; let page: Page; - let pageuriStub: sinon.SinonStub<[], string>; before(async () => { browser = await puppeteer.launch({ headless: 'new' }); }); @@ -358,7 +357,7 @@ describe('retrieveLinksFromPage', async () => { )}` ); // Mock page.uri() to return a custom uri - pageuriStub = sinon.stub(page, 'url').returns('https://mocked.com'); + sinon.stub(page, 'url').returns('https://mocked.com'); }); after(async () => { @@ -416,7 +415,7 @@ describe('retrieveLinksFromPage', async () => { // note: does not return `mailto:...` link expect(results).to.deep.equal(expectations); - }); + }).timeout(5000); it('handles complicated query_selector_all', async () => { const query_selector_all = 'img[href], a[src]'; diff --git a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts index 9d23825..2b108d6 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts @@ -24,7 +24,6 @@ import { } from '@google-cloud/synthetics-sdk-api'; import { createStorageClientIfStorageSelected, - getFolderNameFromStorageLocation, getOrCreateStorageBucket, StorageParameters, uploadScreenshotToGCS, @@ -33,6 +32,7 @@ import { // External Dependencies import { Bucket, File, Storage } from '@google-cloud/storage'; const proxyquire = require('proxyquire'); +import { Page } from 'puppeteer'; // global test vars const TEST_BUCKET_NAME = 'gcm-test-project-id-synthetics-test-region'; @@ -45,7 +45,6 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { '@google-cloud/synthetics-sdk-api': { getExecutionRegion: () => 'test-region', resolveProjectId: () => 'test-project-id', - getOrCreateStorageBucket: () => getOrCreateStorageBucket, }, }); @@ -163,13 +162,14 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { describe('uploadScreenshotToGCS', () => { let storageClientStub: sinon.SinonStubbedInstance; let bucketStub: sinon.SinonStubbedInstance; - - const screenshotData = Buffer.from('encoded-image-data', 'utf-8'); - const filename = 'test-screenshot.png'; + let pageStub: sinon.SinonStubbedInstance; beforeEach(() => { storageClientStub = sinon.createStubInstance(Storage); bucketStub = sinon.createStubInstance(Bucket); + pageStub = sinon.createStubInstance(Page); + pageStub.url.resolves('https://fake-url'); + storageClientStub.bucket.returns(bucketStub); }); @@ -177,82 +177,100 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { sinon.restore(); }); - it('should upload the screenshot and return the write_destination', async () => { - const storageParams = { - storageClient: storageClientStub, - bucket: bucketStub, - uptimeId: 'uptime123', - executionId: 'exec456', - }; - const options = { - screenshot_options: { storage_location: 'bucket/folder1/folder2' }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; - const expectedWriteDestination = - 'folder1/folder2/uptime123/exec456/test-screenshot.png'; - - const successPartialFileMock: Partial = { - save: sinon.stub().resolves(), - }; - bucketStub.file.returns(successPartialFileMock as File); - - const result = await uploadScreenshotToGCS( - screenshotData, - filename, - storageParams, - options - ); + describe('valid Storage Configuration', () => { + it('should upload the screenshots and return updated write_destination', async () => { + const storageParams = { + storageClient: storageClientStub, + bucket: bucketStub, + checkId: 'uptime123', + executionId: 'exec456', + }; + const options = { + screenshot_options: { storage_location: 'bucket/folder1/folder2' }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; - expect(result.screenshot_file).to.equal(expectedWriteDestination); - expect(result.screenshot_error).to.deep.equal({}); - }); + const successPartialFileMock: Partial = { + save: sinon.stub().resolves(), + }; + bucketStub.file.returns(successPartialFileMock as File); - it('should handle GCS upload errors', async () => { - const storageParams: StorageParameters = { - storageClient: storageClientStub, - bucket: bucketStub, - uptimeId: '', - executionId: '', - }; - const options = { - screenshot_options: {}, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; - - const gcsError = new Error('Simulated GCS upload error'); - const failingPartialFileMock: Partial = { - save: sinon.stub().throws(gcsError), - }; - bucketStub.file.returns(failingPartialFileMock as File); - - const result = await uploadScreenshotToGCS( - screenshotData, - filename, - storageParams, - options - ); + const result = await uploadScreenshotToGCS( + pageStub, + storageParams, + options + ); + + expect(result.screenshot_file).to.equal('screenshot_1.png'); + expect(result.screenshot_error).to.deep.equal({}); + + const result2 = await uploadScreenshotToGCS( + pageStub, + storageParams, + options + ); + + expect(result2.screenshot_file).to.equal('screenshot_2.png'); + expect(result2.screenshot_error).to.deep.equal({}); + + // TODO + // sinon.assert.calledWithExactly( + // storageClientStub.bucket, + // TEST_BUCKET_NAME + // ); + }); + + it('should handle GCS upload errors', async () => { + const storageParams: StorageParameters = { + storageClient: storageClientStub, + bucket: bucketStub, + checkId: '', + executionId: '', + }; + const options = { + screenshot_options: {}, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + const gcsError = new Error('Simulated GCS upload error'); + const failingPartialFileMock: Partial = { + save: sinon.stub().throws(gcsError), + }; + bucketStub.file.returns(failingPartialFileMock as File); + + const result = await uploadScreenshotToGCS( + pageStub, + storageParams, + options + ); - expect(result.screenshot_file).to.equal(''); - expect(result.screenshot_error).to.deep.equal({ - error_type: 'StorageFileUploadError', - error_message: `Failed to upload screenshot for ${filename}. Please reference server logs for further information.`, + expect(result.screenshot_file).to.equal(''); + expect(result.screenshot_error).to.deep.equal({ + error_type: 'ScreenshotFileUploadError', + error_message: + 'Failed to take and/or upload screenshot for https://fake-url. Please reference server logs for further information.', + }); }); }); describe('Invalid Storage Configuration', () => { - const emptyScreenshotData = Buffer.from('', 'utf-8'); - const emptyFilename = ''; const emptyOptions = {} as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + beforeEach(() => { + pageStub.screenshot.resolves( + Buffer.from('encoded-image-data', 'utf-8') + ); + }); + it('should return an empty result if storageClient is null', async () => { // Missing storageClient const storageParams = { storageClient: null, bucket: bucketStub, - uptimeId: '', + checkId: '', executionId: '', }; const result = await uploadScreenshotToGCS( - emptyScreenshotData, - emptyFilename, + pageStub, storageParams, emptyOptions ); @@ -268,13 +286,12 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { const storageParams = { storageClient: storageClientStub, bucket: null, - uptimeId: '', + checkId: '', executionId: '', }; const result = await uploadScreenshotToGCS( - emptyScreenshotData, - emptyFilename, + pageStub, storageParams, emptyOptions ); @@ -286,30 +303,4 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { }); }); }); - - describe('getFolderNameFromStorageLocation', () => { - it('should extract folder name when storage location has a slash', () => { - const storageLocation = 'some-bucket/folder1/folder2'; - const expectedFolderName = 'folder1/folder2'; - - const result = getFolderNameFromStorageLocation(storageLocation); - expect(result).to.equal(expectedFolderName); - }); - - it('should return an empty string if storage location has no slash', () => { - const storageLocation = 'my-bucket'; - const expectedFolderName = ''; - - const result = getFolderNameFromStorageLocation(storageLocation); - expect(result).to.equal(expectedFolderName); - }); - - it('should return an empty string if given an empty string', () => { - const storageLocation = ''; - const expectedFolderName = ''; - - const result = getFolderNameFromStorageLocation(storageLocation); - expect(result).to.equal(expectedFolderName); - }); - }); }); diff --git a/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz b/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..00d41d62eb47f0ad19c016c3ac497858b8dc9d00 GIT binary patch literal 18445 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/samples/broken-links-ok/index.js b/samples/broken-links-ok/index.js index 1c298fe..c82326e 100644 --- a/samples/broken-links-ok/index.js +++ b/samples/broken-links-ok/index.js @@ -18,8 +18,8 @@ const functions = require('@google-cloud/functions-framework'); const GcmSynthetics = require('@google-cloud/synthetics-sdk-broken-links'); const options = { - origin_uri: "https://example.com", - // link_limit: 10, + origin_uri: "https://en.wikipedia.org/wiki/World_War_II", + link_limit: 50, // query_selector_all: "a", // https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll // get_attributes: ['href'], // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute // link_order: "FIRST_N", // "FIRST_N" or "RANDOM" diff --git a/samples/broken-links-ok/package.json b/samples/broken-links-ok/package.json index 877a424..1f7050d 100644 --- a/samples/broken-links-ok/package.json +++ b/samples/broken-links-ok/package.json @@ -7,7 +7,7 @@ "gcp-build": "node node_modules/puppeteer/install.mjs" }, "dependencies": { - "@google-cloud/synthetics-sdk-broken-links": "^0.1.0", + "@google-cloud/synthetics-sdk-broken-links": "google-cloud-synthetics-sdk-broken-links-0.2.0.tgz", "@google-cloud/functions-framework": "^3.1.2" }, "author": "Google Inc.", From e8354c62226aa478aaf5b95f22263b32dafbbec2 Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Wed, 20 Mar 2024 11:19:53 -0400 Subject: [PATCH 3/5] fix naming --- .../src/broken_links.ts | 5 +++-- .../src/link_utils.ts | 2 +- .../src/storage_func.ts | 9 +++------ .../test/unit/link_utils.spec.ts | 5 +++-- .../test/unit/navigation_func.spec.ts | 3 ++- .../test/unit/storage_func.spec.ts | 6 +++++- .../google-cloud-synthetics-sdk-api-0.5.1.tgz | Bin 0 -> 97251 bytes ...loud-synthetics-sdk-broken-links-0.2.0.tgz | Bin 18445 -> 18605 bytes samples/broken-links-ok/index.js | 2 +- 9 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz diff --git a/packages/synthetics-sdk-broken-links/src/broken_links.ts b/packages/synthetics-sdk-broken-links/src/broken_links.ts index d2a74dc..a426c19 100644 --- a/packages/synthetics-sdk-broken-links/src/broken_links.ts +++ b/packages/synthetics-sdk-broken-links/src/broken_links.ts @@ -138,8 +138,9 @@ export async function runBrokenLinks( const storageParams: StorageParameters = { storageClient: storageClient, bucket: bucket, - checkId: 'fake-check-id', - executionId: 'fake-execution-id', + checkId: 'fake-check-id', + executionId: 'fake-execution-id', + screenshotNumber: 1, }; const followed_links: BrokenLinksResultV1_SyntheticLinkResult[] = []; diff --git a/packages/synthetics-sdk-broken-links/src/link_utils.ts b/packages/synthetics-sdk-broken-links/src/link_utils.ts index a13af03..e26cb6f 100644 --- a/packages/synthetics-sdk-broken-links/src/link_utils.ts +++ b/packages/synthetics-sdk-broken-links/src/link_utils.ts @@ -331,7 +331,7 @@ export function sanitizeObjectName( .replace(/\s+/g, '_'); // Replace one or more spaces with underscores } -export function getStoragePagetStoragePathToExecutionthToExecution( +export function getStoragePathToExecution( storageParams: StorageParameters, options: BrokenLinksResultV1_BrokenLinkCheckerOptions ) { diff --git a/packages/synthetics-sdk-broken-links/src/storage_func.ts b/packages/synthetics-sdk-broken-links/src/storage_func.ts index 2580876..6f5ea14 100644 --- a/packages/synthetics-sdk-broken-links/src/storage_func.ts +++ b/packages/synthetics-sdk-broken-links/src/storage_func.ts @@ -35,10 +35,9 @@ export interface StorageParameters { bucket: Bucket | null; checkId: string; executionId: string; + screenshotNumber: number; } -let SCREENSHOT_NUMBER = 1; - /** * Attempts to get an existing storage bucket if provided by the user OR * create/use a dedicated synthetics bucket. @@ -56,7 +55,6 @@ export async function getOrCreateStorageBucket( storageLocation: string, errors: BaseError[] ): Promise { - SCREENSHOT_NUMBER = 1; let bucketName = ''; try { @@ -64,7 +62,6 @@ export async function getOrCreateStorageBucket( const projectId = sanitizeObjectName(await resolveProjectId()); const region = sanitizeObjectName(await getExecutionRegion()); - // const region = "us-east4" // if the user chose to use/create the default bucket but we were not able // to resolve projectId or cloudRegion @@ -160,7 +157,7 @@ export async function uploadScreenshotToGCS( } const screenshot: Buffer = await page.screenshot({ encoding: 'binary' }); - const filename = 'screenshot_' + SCREENSHOT_NUMBER + '.png'; + const filename = 'screenshot_' + storageParams.screenshotNumber + '.png'; const writeDestination = path.join( getStoragePathToExecution(storageParams, options), @@ -172,7 +169,7 @@ export async function uploadScreenshotToGCS( contentType: 'image/png', }); - SCREENSHOT_NUMBER += 1; + storageParams.screenshotNumber += 1; screenshot_output.screenshot_file = filename; } catch (err) { // Handle upload errors diff --git a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts index 239209d..c16775f 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts @@ -69,6 +69,7 @@ describe('GCM Synthetics Broken Links Utilies', async () => { bucket: {} as Bucket, checkId: 'uptime123', executionId: 'exec456', + screenshotNumber: 1, }; it('checkStatusPassing returns correctly when passed a number as ResponseStatusCode', () => { @@ -229,8 +230,8 @@ describe('GCM Synthetics Broken Links Utilies', async () => { describe('sanitizeObjectName', () => { it('should remove invalid characters', () => { - const input = "test/\@#$%^&*()/_+\-=[]{};':\"\|,.<>/?\r\n\t"; - const expectedOutput = "test_@_$%^&_()__+-=__{};'__\_,.______"; + const input = 'test/@#$%^&*()/_+-=[]{};\':"|,.<>/?\r\n\t'; + const expectedOutput = "test_@_$%^&_()__+-=__{};'___,.______"; expect(sanitizeObjectName(input)).to.equal(expectedOutput); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts index 7356095..1c5942f 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts @@ -80,6 +80,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { bucket: sinon.createStubInstance(Bucket), checkId: '', executionId: '', + screenshotNumber: 1, }; // Use proxyquire to replace uploadScreenshotToGCS @@ -339,7 +340,7 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }); }); -describe.only('retrieveLinksFromPage', async () => { +describe('retrieveLinksFromPage', async () => { // Puppeteer constants let browser: Browser; let page: Page; diff --git a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts index 2b108d6..7c32625 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts @@ -184,6 +184,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { bucket: bucketStub, checkId: 'uptime123', executionId: 'exec456', + screenshotNumber: 1, }; const options = { screenshot_options: { storage_location: 'bucket/folder1/folder2' }, @@ -225,6 +226,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { bucket: bucketStub, checkId: '', executionId: '', + screenshotNumber: 1, }; const options = { screenshot_options: {}, @@ -267,6 +269,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { bucket: bucketStub, checkId: '', executionId: '', + screenshotNumber: 1, }; const result = await uploadScreenshotToGCS( @@ -288,7 +291,8 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { bucket: null, checkId: '', executionId: '', - }; + screenshotNumber: 1, + } as StorageParameters; const result = await uploadScreenshotToGCS( pageStub, diff --git a/samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz b/samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8e9d4a8f5922ab1e489c9ecb18d12b58aaca21c7 GIT binary patch literal 97251 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

{YZXZ9bU-ENrb^dskkUcf^8iRUDj<{N2 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 literal 0 HcmV?d00001 diff --git a/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz b/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz index 00d41d62eb47f0ad19c016c3ac497858b8dc9d00..2ee2f821d01b71af84f751c394dfb99a139d64ba 100644 GIT binary patch literal 18605 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 E09Ld~*8l(j literal 18445 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 Ae*gdg diff --git a/samples/broken-links-ok/index.js b/samples/broken-links-ok/index.js index c82326e..59fc4ad 100644 --- a/samples/broken-links-ok/index.js +++ b/samples/broken-links-ok/index.js @@ -22,7 +22,7 @@ const options = { link_limit: 50, // query_selector_all: "a", // https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll // get_attributes: ['href'], // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute - // link_order: "FIRST_N", // "FIRST_N" or "RANDOM" + link_order: "RANDOM", // "FIRST_N" or "RANDOM" // link_timeout_millis: 30000, // timeout per link // max_retries: 0, // number of retries per link if it failed for any reason // wait_for_selector: '', // https://pptr.dev/api/puppeteer.page.waitforselector From 52c0a0b978b51252c507fc8f372ffbb4491e78bf Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Wed, 20 Mar 2024 12:11:22 -0400 Subject: [PATCH 4/5] pass-args --- .../synthetics-sdk-broken-links/package.json | 1 + .../src/broken_links.ts | 10 ++- .../src/handlers.ts | 10 ++- .../src/link_utils.ts | 10 ++- .../src/options_func.ts | 2 +- .../src/storage_func.ts | 5 +- .../test/unit/broken_links.spec.ts | 11 ++-- .../test/unit/handlers.spec.ts | 60 ++++++++++++++++++ .../test/unit/link_utils.spec.ts | 11 +++- .../test/unit/storage_func.spec.ts | 3 +- .../google-cloud-synthetics-sdk-api-0.5.1.tgz | Bin 97251 -> 0 bytes ...loud-synthetics-sdk-broken-links-0.2.0.tgz | Bin 18605 -> 0 bytes samples/broken-links-ok/index.js | 6 +- samples/broken-links-ok/package.json | 2 +- 14 files changed, 108 insertions(+), 23 deletions(-) create mode 100644 packages/synthetics-sdk-broken-links/test/unit/handlers.spec.ts delete mode 100644 samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz delete mode 100644 samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz diff --git a/packages/synthetics-sdk-broken-links/package.json b/packages/synthetics-sdk-broken-links/package.json index 634fa56..ad7a051 100644 --- a/packages/synthetics-sdk-broken-links/package.json +++ b/packages/synthetics-sdk-broken-links/package.json @@ -34,6 +34,7 @@ "chai-exclude": "^2.1.0", "express": "^4.18.2", "proxyquire": "^2.1.3", + "node-mocks-http": "^1.13.0", "sinon": "^16.1.1", "supertest": "^6.3.3", "synthetics-sdk-broken-links": "file:./" diff --git a/packages/synthetics-sdk-broken-links/src/broken_links.ts b/packages/synthetics-sdk-broken-links/src/broken_links.ts index a426c19..968d7c5 100644 --- a/packages/synthetics-sdk-broken-links/src/broken_links.ts +++ b/packages/synthetics-sdk-broken-links/src/broken_links.ts @@ -101,7 +101,11 @@ try { instantiateMetadata(synthetics_sdk_broken_links_package); export async function runBrokenLinks( - inputOptions: BrokenLinkCheckerOptions + inputOptions: BrokenLinkCheckerOptions, + args: { + executionId: string | undefined; + checkId: string | undefined; + } ): Promise { // init const startTime = new Date().toISOString(); @@ -138,8 +142,8 @@ export async function runBrokenLinks( const storageParams: StorageParameters = { storageClient: storageClient, bucket: bucket, - checkId: 'fake-check-id', - executionId: 'fake-execution-id', + checkId: args.checkId || '_', + executionId: args.executionId || '_', screenshotNumber: 1, }; diff --git a/packages/synthetics-sdk-broken-links/src/handlers.ts b/packages/synthetics-sdk-broken-links/src/handlers.ts index fff255a..b45cacc 100644 --- a/packages/synthetics-sdk-broken-links/src/handlers.ts +++ b/packages/synthetics-sdk-broken-links/src/handlers.ts @@ -18,6 +18,9 @@ import { Request, Response } from 'express'; // Internal Project Files import { runBrokenLinks, BrokenLinkCheckerOptions } from './broken_links'; +const syntheticExecutionIdHeader = 'Synthetic-Execution-Id'; +const checkIdHeader = 'Check-Id'; + /** * Middleware for easy invocation of SyntheticSDK broken links, and may be used to * register a GoogleCloudFunction http function, or express js compatible handler. @@ -29,5 +32,10 @@ import { runBrokenLinks, BrokenLinkCheckerOptions } from './broken_links'; export function runBrokenLinksHandler(options: BrokenLinkCheckerOptions) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return async (req: Request, res: Response): Promise => - res.send(await runBrokenLinks(options)); + res.send( + await runBrokenLinks(options, { + executionId: req.get(syntheticExecutionIdHeader), + checkId: req.get(checkIdHeader), + }) + ); } diff --git a/packages/synthetics-sdk-broken-links/src/link_utils.ts b/packages/synthetics-sdk-broken-links/src/link_utils.ts index e26cb6f..2600957 100644 --- a/packages/synthetics-sdk-broken-links/src/link_utils.ts +++ b/packages/synthetics-sdk-broken-links/src/link_utils.ts @@ -162,7 +162,7 @@ function parseFollowedLinks( options: {} as BrokenLinksResultV1_BrokenLinkCheckerOptions, origin_link_result: {} as BrokenLinksResultV1_SyntheticLinkResult, followed_link_results: [], - execution_data_storage_path: '', // TODO: make sure that when this is set it begins with gs:// + execution_data_storage_path: '', errors: [], }; @@ -236,8 +236,12 @@ export function createSyntheticResult( parseFollowedLinks(followed_links); broken_links_result.options = options; broken_links_result.errors = errors; - broken_links_result.execution_data_storage_path = - 'gs://' + getStoragePathToExecution(storageParams, options); + broken_links_result.execution_data_storage_path = storageParams.bucket + ? 'gs://' + + storageParams.bucket.name + + '/' + + getStoragePathToExecution(storageParams, options) + : ''; // Create SyntheticResult object const synthetic_result: SyntheticResult = { diff --git a/packages/synthetics-sdk-broken-links/src/options_func.ts b/packages/synthetics-sdk-broken-links/src/options_func.ts index 1b0a61d..b8b67f9 100644 --- a/packages/synthetics-sdk-broken-links/src/options_func.ts +++ b/packages/synthetics-sdk-broken-links/src/options_func.ts @@ -290,7 +290,7 @@ export function setDefaultOptions( defaultOptions.screenshot_options!.capture_condition; } - if (outputOptions.screenshot_options?.storage_location) { + if (inputOptions.screenshot_options?.storage_location) { outputOptions.screenshot_options.storage_location = inputOptions.screenshot_options!.storage_location!; } else { diff --git a/packages/synthetics-sdk-broken-links/src/storage_func.ts b/packages/synthetics-sdk-broken-links/src/storage_func.ts index 6f5ea14..3cc38da 100644 --- a/packages/synthetics-sdk-broken-links/src/storage_func.ts +++ b/packages/synthetics-sdk-broken-links/src/storage_func.ts @@ -156,7 +156,10 @@ export async function uploadScreenshotToGCS( return screenshot_output; } - const screenshot: Buffer = await page.screenshot({ encoding: 'binary' }); + const screenshot: Buffer = await page.screenshot({ + fullPage: true, + encoding: 'binary', + }); const filename = 'screenshot_' + storageParams.screenshotNumber + '.png'; const writeDestination = path.join( diff --git a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts index 0455511..6754809 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts @@ -60,6 +60,7 @@ describe('runBrokenLinks', async () => { screenshot_file: 'bucket/folder/file.png', screenshot_error: {} as BaseError, }; + const args = { checkId: 'test-check-id', executionId: 'test-execution-id' }; const mockedstorageFunc = proxyquire('../../src/storage_func', { '@google-cloud/synthetics-sdk-api': { @@ -103,7 +104,7 @@ describe('runBrokenLinks', async () => { origin_uri: 'uri-does-not-start-with-http', }; - const result = await runBrokenLinks(inputOptions); + const result = await runBrokenLinks(inputOptions, args); const genericResult = result.synthetic_generic_result_v1; @@ -137,7 +138,7 @@ describe('runBrokenLinks', async () => { screenshot_options: { capture_condition: CaptureCondition.NONE }, }; - const result = await mockedBlc.runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions, args); const broken_links_result = result?.synthetic_broken_links_result_v1; const origin_link = broken_links_result?.origin_link_result; @@ -174,7 +175,7 @@ describe('runBrokenLinks', async () => { total_synthetic_timeout_millis: 31000, screenshot_options: { capture_condition: CaptureCondition.NONE }, }; - const result = await mockedBlc.runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions, args); const broken_links_result = result.synthetic_broken_links_result_v1; const expectedOriginLinkResult: BrokenLinksResultV1_SyntheticLinkResult = { @@ -210,7 +211,7 @@ describe('runBrokenLinks', async () => { screenshot_options: { capture_condition: CaptureCondition.NONE }, }; - const result = await runBrokenLinks(inputOptions); + const result = await runBrokenLinks(inputOptions, args); const broken_links_result = result?.synthetic_broken_links_result_v1; const origin_link = broken_links_result?.origin_link_result; @@ -274,7 +275,7 @@ describe('runBrokenLinks', async () => { }, }; - const result = await mockedBlc.runBrokenLinks(inputOptions); + const result = await mockedBlc.runBrokenLinks(inputOptions, args); const broken_links_result = result?.synthetic_broken_links_result_v1; const options = broken_links_result?.options; diff --git a/packages/synthetics-sdk-broken-links/test/unit/handlers.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/handlers.spec.ts new file mode 100644 index 0000000..a228db4 --- /dev/null +++ b/packages/synthetics-sdk-broken-links/test/unit/handlers.spec.ts @@ -0,0 +1,60 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Standard Libraries +import { expect } from 'chai'; +import sinon from 'sinon'; + +// External Dependency +import httpMocks from 'node-mocks-http'; +const proxyquire = require('proxyquire'); + +import { runBrokenLinksHandler } from '../../src/handlers'; +import { BrokenLinkCheckerOptions } from '../../src/broken_links'; + +describe('Broken Links Synthetic Handler', async () => { + it('has check id and execution id available', async () => { + // Stub the runBrokenLinks function using Sinon + const mockRunBrokenLinks = sinon.stub().callsFake(async (opts, args) => { + return Promise.resolve({ mocked_response: 'is unimportant' }); + }); + const mockedBrokenLinks = proxyquire('../../src/handlers', { + './broken_links': { runBrokenLinks: mockRunBrokenLinks }, + }); + + // Options for the runBrokenLinksHandler + const options: BrokenLinkCheckerOptions = { + origin_uri: 'https://example.com', + }; + + // Create mock request and response + const req = httpMocks.createRequest({ + headers: { + ['Synthetic-Execution-Id']: 'test-execution-id', + ['Check-Id']: 'test-check-id', + }, + }); + const res = httpMocks.createResponse(); + + // Call the middleware + await mockedBrokenLinks.runBrokenLinksHandler(options)(req, res); + + // Assertions with Sinon and Chai + sinon.assert.calledWith(mockRunBrokenLinks, options, { + executionId: 'test-execution-id', + checkId: 'test-check-id', + }); + expect(res.statusCode).to.equal(200); + }).timeout(5000); +}); diff --git a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts index c16775f..a4b3725 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts @@ -14,7 +14,7 @@ // Standard Libraries import { expect } from 'chai'; -import * as path from 'path'; +import sinon from 'sinon'; // Internal Project Files import { @@ -42,6 +42,7 @@ import { setDefaultOptions } from '../../src/options_func'; // External Dependencies import { Bucket, Storage } from '@google-cloud/storage'; import { StorageParameters } from '../../src/storage_func'; +import { TEST_BUCKET_NAME } from './storage_func.spec'; describe('GCM Synthetics Broken Links Utilies', async () => { const status_value_200: ResponseStatusCode = { status_value: 200 }; @@ -64,9 +65,12 @@ describe('GCM Synthetics Broken Links Utilies', async () => { const default_errors: BaseError[] = [ { error_type: 'fake-error-type', error_message: 'fake-error-message' }, ]; + const bucketStub: sinon.SinonStubbedInstance = + sinon.createStubInstance(Bucket); + bucketStub.name = TEST_BUCKET_NAME; const storageParams = { storageClient: {} as Storage, - bucket: {} as Bucket, + bucket: bucketStub, checkId: 'uptime123', executionId: 'exec456', screenshotNumber: 1, @@ -163,7 +167,8 @@ describe('GCM Synthetics Broken Links Utilies', async () => { options: options, origin_link_result: origin_link, followed_link_results: followed_links, - execution_data_storage_path: 'gs://uptime123/exec456', + execution_data_storage_path: + 'gs://gcm-test-project-id-synthetics-test-region/uptime123/exec456', errors: default_errors, }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts index 7c32625..ada0d06 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts @@ -24,7 +24,6 @@ import { } from '@google-cloud/synthetics-sdk-api'; import { createStorageClientIfStorageSelected, - getOrCreateStorageBucket, StorageParameters, uploadScreenshotToGCS, } from '../../src/storage_func'; @@ -35,7 +34,7 @@ const proxyquire = require('proxyquire'); import { Page } from 'puppeteer'; // global test vars -const TEST_BUCKET_NAME = 'gcm-test-project-id-synthetics-test-region'; +export const TEST_BUCKET_NAME = 'gcm-test-project-id-synthetics-test-region'; describe('GCM Synthetics Broken Links storage_func suite testing', () => { let storageClientStub: sinon.SinonStubbedInstance; diff --git a/samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz b/samples/broken-links-ok/google-cloud-synthetics-sdk-api-0.5.1.tgz deleted file mode 100644 index 8e9d4a8f5922ab1e489c9ecb18d12b58aaca21c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97251 zcmV)4K+3-#iwFP!00002|Lnbaf7`~AC^~=pQ{ZUcyOI)$+9fYHbA}=*S&3K4PEN+x zPX{6)i55vP04Z6?^>=?&)!pbF05{2Y=wIv*KzCKIwRiO(Y+Z+!(RwvXyPf{9bJ>rR z=s#xrXJcbyZ)YcPy{A9Bd%=Hf@9u4EZtm@EKsorazlZ<-k9+ttN{3+rO_@O_;ZKnL z{~P&pKI(Ma>yL&}I$V!FhrK~JI>U#vi%vI6*B=d%XgKUdNz$r*N+12l;?H;XXTbOW zi{pCp)oF7sICA&@*52l}wf{G^_IDTi|33aa3X1;JV2NBs!HZ5S>Zeg&`Cp?X?Zo|H ztGZDMeh&MiFu4o1Ha2#=m9B=v!PE8i+uPe}NNB2Ya=G4RsDS!l#dpnj=ZBzS+?tOO^`Hz%(f@9X%wLZuqVr|(XV58mS&0oVp zM3-SVXcB0v5u-kKkXj!FVT+)MR=_YoSq>(K0=$8pC}pT&K!-`(tps5biH9yVx`MsI zx1)X=sKKoq>hH=meVbZZ2hr&M52qZx->;vh<$wR#9sCC5~RtaveBI-WO zKH&`swmLGm9b8QSWu*fxq3KDlIs=4s(Yb)p97IVAL9gs?{J*P&4kR-^@B+|i2-FMO z3v&R|ltih32q4d+J`6&u15>F%SK2A3{P%dY6s$m9{FN-Ns_e-?27y)4PqAbu78Jed z^2duH4A}4xxQgCE4#VgsY@0y`H&jfGmK!*II{F>IFT$VbnWCIBf6sqIM?? zhIa$C+rP!hwM7(e;U%@0=n$?nxdl3X(T!{au%YAK>V<6}BsXEF8=iN?{#WQy1*s`6 zz*fkYQkc;NLET^&pm0Xs*hoR)4h?HK93pR_5fZKCAXcCQT;$ZhX5cN1+iVof{a%n<&5mNtetOfH>S^zh zIgfYFxVZ=O1wur0+!8CqEEBuSfE%<9a`jU@$LWDEz`pIc^^; zWqn%Wuo%D3$TC!ly08J07>IENXW=~T(mJ|LuwI{pk5QkGet^3`9rQ>J6pqs{m79ge zKdt1lqKtN_IN(3oCZLF&E>`Y>ND0ssmX(P@>0LUEdZ|jnf#;4QWFal$k-P+(e&l>i zTFGQBbiIk3n$Q7lX%RbS5Sc*7DG_cNTCL!(tZaucS}A0t>lT}0c8VZ0f;MuAt^evA-pRf8iG zs}OBH>%Nezg3}RWu6(UJl^JE5sZ==vE*U5T6d(zKHj@-basdd3&`Xf;2GI~kMl3%d zeckqL2W5?Z++U-aPoc;7xCT;Ba*2vld>3|ycWW0(1Wz3h>~7)~5^{^1bNvqy3T+E& zz#bdmI<_dCB|dZLaWZ5RlhFY#D08Wh$c*S24gs4Zfi)Zqx~Oi(eVB9_Wu#raX{~P9 zf$?T#mCnH^5)gHCGrHM_-J7Oi(xKgXkpT4(8coy@yieWuE9okz!Erz091+MLNF<=hsU&xAa^aU8`hPKDrg)!_I7=RebhQlM10rn5;Ib}m^H!pjgp6OrSJ z`-)^(nQWcJX}U%OhTUkzBb1-mGt7J#bi>k!aGUXOezF)up?v}jUMGlc{C*`HUhE{5II^$ zDABZgZj5>g7}U6SOad)%8SEwwC);t!P%XIIW+H19=uAuwNJi%RV*}&!TR4YE zY8525lCho%0EXd9nF<8L`=K@&O>!NSS~V%xA;C-2p2KCtz$m_=_`=beirh9Aq%7Wf zR1wuWmu)42ho}{6o@{{Sta!9>@#@IJEoui_zA%DgwkU(REul;O6$B=rv22sJGo0Xs;ecElV(xDAvk;fR=Y z!3?A@ikV7u2|67u{5!rwNF$3rM=gcK6XDGUB#AD=g!z?B-GloA_J9-$0VGATsL0Xn zm?-CviQI}u2nU`!)R_1p+!$dG?Pi%ogI2F7xj~yge}p#iHOvZ&MJrldkyaAgihOw;5U#zVO;LAO^`M9{EjKGqFPpF4Rf3nzllpULW$obj#qqn}X$c)3zkAg@W#I!g4&zPj z1SahLi`q%>=KaZ=*QZU!ZJD>Qi=G8&{{WD7$m>9!8KxEL%LQgGi3dps#dGTL1*|SC zLhDabT*Y3>tc__3G7)xHkn2uLls%1GolH$;M4kIt$r`IVT5V;Pt-Z%pcosv7m0onh z^G=tX=f}u-0}y}uLuvoQ^rOpe2c)l7v|7o$-4)H0 zn^}Ge*ZT?+6ws#M?VOW9M~%Bgdqn295GaQjfsm4S+`T^-_0-r08fCN2 zGQkKNei3%Mql9szuzNA;OW}r?pd%6ly#Tm))$w46qZAenu0s^iO+y@qkr~s&_DzSJ zq!&DV19ku(1QFc8!LuFkq#D#($P;iB1m#7{HOZ)zP4U|mithS$HJydI?lvKXwyxrs zSwYFtsX5!p<_dD#MMU%jNFB8>?6)G;i2*Z%a_Vn`f`F|$_)k!sX4=5PV<6G2(m@1hK7>%a_SoV)1TKZkZ8csfsU)M+UXpaA7e!KZX(>{c0k;XG&eXYJ^cgoi+wU|s7undfqYF@1SPhVj+YZxt znDmGe3E?^$MY)|vNg};v+;R*w8MJa#R+$mCV%v?+@3^obJ9LL5AjdQl=5LkNsECbO zTi60_zG@&}b%nvv_u88`P~`YuPjL##S^yOFj)yO(p?mm^nsS@@k}$lkWQ7V3qtLAh zLadHq*Ce2Z4~12uA~pGoPSkCu0Wb*I?2PE2qn9#*mAUlcbWpL<+)gT}IF)7V238qLtW519F>@f8v2d-PM>1rEJfxx}DOOy9#*yI~ zY48&A3f=R`gI}BhU7+Q}&w5tJCJJyLB6ugN$?O@~CBl0%{F3Ojl z_2YJQwh4v#GFVyqZ|Dl(>qfn3nA{P;Tr;b!VKrRu40PJQK0~`mR16M^u2E3~gn=O! zhEdkl4h%Ie*$yl!L4<=&{%{OBvhXF5k24JWJnMEqGEeUG%B;W|7Fgp2WNi)b8Hnwp zHg7$f;V3a$!l6;gb*(mg$2%lyOH40b9~~XPIy!rIQmZ%5erf&=V3)hFo?z)$8C2+3 zS_QJSPB50unx}7SuL>%rgRpes~o8 z5d1fb>w};8M7{@Mg9=jAD@Oz5ED4V{2C|B}+*JgM5{siHo)S{LeYb;=TCi3SRJL9a z3;-de4h>>N*;#mP#N0wKPb``Q7Z&@#tULIOu*5|2R=#@uuKAS5Fn7q8Ibx>AbF$~P zgXrP{L+N0i(BK1l9k7*@7ZBM}~s0I&BgNq9Ht>ovGD|nIDe3ENRuzf}~X;TaKWZq(m!GF_mN;Wp9|}W%nbce6v^>*A!*AZO{hBIof@%R5%z7h-m3xef#5@nhBm~{xNv=yu< zORIActmG}PRbGx+jc|5@@HXt^(+;<=u)+)x!52meyD;?qFSQW`@jeW&JeBA)ltJec27yjS>3-zAqwYc{&;bg*;jjFHUfA8=` z@`jf*hLCYV;8}WgCel=E-P`akeceB0rB+t$F_g0_L;>EGG7?9X+ScUHE32N~Rl|1s z6gWQg0RxC(9G$H_2#2jJy_`U`>II!dmuSz|kb^*ukuNxgB*~frV^(lwqhbq_8AxL} zq^ri*n}RMZV(WM}V#pJwaoOS|JC>h?PyAWV7jf6bo_reo;KLq4yPj_;OeTJ%-K;V|o^yj<}G_w^)!` zyDg77vfgoyRs`H8;{p|SBnsQrTnI?AX^8?~$uzaqf>C936C3%#lD|K~hWs}lq;&oN z`O5D$Cc}>pRm%7PxH#zo5;;$= z4!a=|+@F48ni!)-^s>sajNdv%dnntym9r2=$W|*poDMN0e}$o_Qi0WvtHD2@!Tk}) zE&uC(!B(P2rhNzh#Ai|j4r}jUyjw1AejBL3P%Q8d%Q#49o%Zs_v1>9)e1U^EL2c^W z#8`_P{KfnAOXX3?*I!okcOTu%5GcS2lWw4~c;-3kw=n1?yckl@hfd2-s^#n=YF8d< zG%7o^a~0v4*#6KIRI3xoS6qt~^36TSSsB;OkaoEgCFh38t{%zK6qZ!#g#r_atjH>T zmabKsq*ipf%N9VD7H8t3PcI^DJjM~tp(#(hz&O)!qkLPLMRL&^YNqpRMws~z2b8LUMDCsI=rf+j;!r;;V;@o|w9~{-+1gDacybz)& zk(y<#9lXsr%9<6)L2b-e=!N=Eey$!wmI0u6fAZodkLR=63kQD_|1YHh9Q8Xxw-*@w zLld}y^YcIM?(gmz{@*S5xxMiJF8sd>|L-^K|0Scz8I#ZtI_#XwPs~h!N+3z9#`jg^ zmn+>E3F9Z-Q&aF0dUKcn5DdWMFQu zZ~MX}-QYoaak7HIIg>%S|DbBvq$Q}bBo2x|lm5}GO7}JJZhT$E$)}Y8HRwf_KMY>3 zN`A>3^H&h{fwl_H3A?4ST?z7G-N~2h%Q15Tes)eEK*{MZ$!(y{ab1?U=%oDk0K8xxFKnW z2EYkE{*b}J-rZnX(KD8b;uLs;qfhc9^(J#YuJq!zI;!x9wcvlsYFW*uG;YfU%ESJD z%BxII7 zwIIFm0PB?jb2Lz|wTcTa<5j%2OVUe@d(QZpSmEg9~q zau_x;LQ_Gvl8yiYv9YhhN`VTiD;c)c>M*XtbcEd%wUGt{(cctkdZhYDR8-pVlCFlw z!wp9)iYUe7`|v|@9#xqlBzsy#dqzAOu56+}>g#y6u39WbqPe`t$`W=lA;O)|qsj~h zGljgFZb+6n;x#@p%jJf~z^$$s6QFZ#<48`~as*MXu^KX^sYLYcmCHEVI0`IR+B{mU z9skRmo@n2NzVV(VQw0F$>wl>ES@FM{8;khgh5onD|Gs_wk4aj7{XqNf7pJ*w=@Y5{ ziElv8|4T~3PwCZ{S;(PEv`v$;CP3>>h(Ovg#GgBHN>ZcIH7RFO5t1{RU&a}-mUN;U z?vP=mm{yla`5Vyb#Qsoh&pO2*9%ch~1Ik^8!n;_O2c9wWk5QCl=~H^qFl>jzkTNX* zg(rs%W9!)r*d5N?TCBSQ$SJ{ipL8+!lpnDY-$XPSW#H|H-F1G7_$B|oezUpGTsW<0 zopqM`fEkV};MhP>NMl|WmDUcs;Z2+@gRsiRU|Fcfx@9}_K;g;LC}ZY)nyP%U;LNUA zeW@6d4R46ogWCMe620>Y%QE9+*jJ+JWfkP^QM!hinl_hLt#)2A2SHY+N+X!U-UX>` z-S&tkVj1$PANc>P-Kc*FbaO4({Af7|Ss9m6A47pv!#--5=2&&o8op^_Szcq+Ap@d6 zfWEFQQ_H5%M>>{n8_b z`6Q^X(UIV@|GWDznFFA}{=c`eVcY-r_ZRZtLjGIGe+&En!v4Ro|1a$S-=_Wl`%wWW z(C%jIbKu`yVwukw;w-HDFKn3>1ZLH$i%0UPOGgnjeRR%dnjJlB0uNm=O~7hl4521d zdwtZ0>l_Z|&CE+@>szPTPnW1%f?b#+yvYD^^g{i+o z=_X0nH@CKTcK7xlKjHdox}K?cjx#5j&L$1Zo_TdBBCD!D!(mTmFjSkj)HZV~YJEi# z5w%}qPB-pez@6Y7>?@E6P<%s8E1i0nX-w&~4AU_)rJuuLc$QZmY+yBSORhyeSB?4_ z^g-MH&*m~or_1?KKL5w&_J)=JV|#mJZ=wG!^uLAvx3K?zMfU%TPLdAa0}~>?1d?3q z`Y^#9X)@(VGU{i?Yo9YpYWWB-Vc};(Xj`Y3QqUt7ca|cGvq6}oT*~u`om75}%CE8V zic|@W!eD?i!H>@(W~q)%(Q(~ha%r4+9B&*B^3}Z7s5t-x*C)ozQKR@ELh;`uFrA;# z;lQMdEZ0Sr_8{Z%$L;52yT`)W^sHr{*OaUr>IBMzDjCQ+-KZH!z=|lNo)R_AD;0(i zIL{DeB8iBp2$SKv4y`wojv6pXcq%YHK7Gwk-Rb2;qfdl#$yZ+WRR6;Da8K*7K zpO|2d*arsW*G&VA?ug+h^wn_$L7EMaHlUio>}y0dzJ_)vGO6LkP#qHaFfPJw8a>k- z9#B6J4k_R$P17kN$A}1mAOSw=u;SXwnKy-AP?OCdCSS9~BY}0C*7VHI8GokMiK%iQ z&}9uq)4@~xUDXf1*d=>-LDnTN%pct4k;}sv46mMQW2c;!F<#rpWMqLVLVM+H8zy#{ z2^s|SYScTA5>KZ%!#ZQ9kY>>_4$ciHVj;|#0c zE=8IQqEz)Y{_F->itnoj781y_A!|lPE!}0Iy`m&3ZA6ZT!>VTv4M zU?CxepVEBUX@k^oD{hYg)tz#%0z#6*D6Nsask9x5Jhm-%OdQJ|)n6hcndbxZT4U~P zy>=#ODK{Te<{_T7hH`xVU|b)Rw)#<+fW98Yt=1@c%0m`@5XlcRpwVXxP8Es$X$j(i zQc0DVPn>QLOz?J0mIVC=mIIwWDoKR@9bf-DyEFzf=2BZCc9SBofvUR^!>c5|r8{hz zb8GzG?-Xz|Rl}kItThwVKp5@JDmX=V}3Ui+XnF5%T~K+ zRKoK$HCY#aK2>`li}MEcZ{q7nO=)x5_yq+2)>T*$>sJ8ep%}2;(%_~;O|PaAm05q3 z_0u81>(bwFDL7cl} zLMF)1cziiEtYe~`D@=q^8)(X<0D(eT{1Wi05Hr50@eXdS#qsu;94N22!}*D(x6!+- zM`-w3S-D8)er~O=OoXlkXXmDE?}AJHzcGT63I8jMkzHs4K`CywTE&}p8FK=PzPHMf zYS=1<#%%wI7|)9^o*Nj?EsT4s8rY`>JlTEyJ;|Alk+5QXsG6`)%8>^JxUCJn&{{GL zdy4VIiw$bSl?^tM%j?U}n02&_0`2?cF{~<9%J2Go?nA}@WaB&Gncvd(->u!f9rOI} z=I+kc#=`!)u>UUXzklES&wg8J=HNDLrbW(kN&FgcOk{0}J z!QZwiaghS8>GNiZt4vg6IR%;B$ssnba&JCPuI;rQ^`*>-$ll=1%xSc;!X2jGLuNQ# zn6?VI7H@+!#oW-vORcV0N3t-$fx*c_#BHM(ir-IzmGiiLmy<1!HFArstv z-Zdtz&%V9FfK*QM&kZdw2K&Fb@yZUpD5{TL|KDWLDqVNwtTmtM^xO4THSmbv3Gu8| zjjzY(NBe>M(f0MDts7!Rm$G2Xa&tSg9+{>~Y7fX_jy9>GKAhFy&3{v~8u%NT`?nw8 z&X(C2=>X9ZNZ|PZ*XS-cXg3csdi5IrEa%eM1*>`hR)x39C7z{GykR7r_Am32kQ5Fz zHmtdE&C=v4^pU4fA+v@z)XOjC#Z=38=iJwwbA#HJW;W96sYXxgWTJqPubeU0+Bd_B z^lCoO_A>htr;Yuz`clfc^|AV5#)@mt1+UO0#2)OMe^lCHJ<)*)OthB7ahmDW6^L?3u zSOd-1K~d+{>Mt*jFu9gGQAp5|X~IU`a2Q zFPOtPTq?5>$_Oo{nUNwU_C`PsUPW1RfKfafi4d8XPGbmpS;Q+|Fw|sMU%tb%G-+@h zMFWuW27?Gap8w$0K=S6&J9Ac6&(JrG-s%;0ha<}EJG*;Nx3Z8PrOI6$uUxCj)J$ye z_wLq_GGNucr<D(*#CmF}cC699HWXZW{EQM=%wHMn4< z7tCV3B}43R(omVJL{88SKK| zZ-!>DZY?Osf^vK{l*7Fw@0)&%w=tGI*>eRYp~S|0dGajiv`ZLz?fXOJ!L^@)<#rUd z&!gzV_y6T-yqa`lvQ5HVxg78^R`rmgBDyJWzaCeoWryRr7U@K<`^4tbQ~lK7qr4+h ze>(%>w`+(i5$W;GSm4}|9=RDq%)sk8N4MMgKZpj+F8N1^`=2&8&G_%Fz0F1bk460V zBK~`k|8bH3@hi^%$b$JjSrX+(Ev*X?smzAi34?(n zyJ7aRhu`O(96sk#N~NBi`9t}xWJJN+hK$RG+y!6C!|Dne<4k(#tTop4!RwFI*4N*okkT9wn!mXYUxg?6x_XpS5m@Z<*7c37ZpF~!i~I{Av5kGFVM z`E-hUWzX5zofNvudIf zc-fYj6mM3IvhMO#Rz;cYsQ#>|CC1ty@MHI>d^SqaEvJqsRJ0lBhK}>U7|3>+(0HrA zCqD_CpZ{@xd&j!}X@7TPasGFq|1I>th5onD{}%cG7y17e`Trj{1*{Mtm)XI85|pCP zArRH*3?Im+o~rWF8NXMJIcv*hC`d=xECiRE>@_Q<-ZLXLi}Ok-XQr3LS|P zsAcbxu%F_F;e(Lvr7Z93P?Sikr&ML-FEMU*BdTG$y<$N2UYy~c8RwnYj`Q6Uq!QsB zXWRWJefzJ-e9Nz|UDp>H7c-*2SD}JpxK>vfcs*$v<+{UL5%sr}EYEreCF__Xvp-yW z2TT!qv&@Bg(sVziNGBYXXfF+DYb{soO=(nNPU@8{?Z$03_Ux2^a<#^aSlW(ZX~hYW zjh|0nzv8h}qA-iXssofNhIxG0_*fmrBFAdc6&48g!*UwIPtxB>yrgLU9i&yJAHU|TIQ5^Nc4M-T(xvitv6}QmVyn4Tl|A zVy&5m{+EdV-`v`?;{P}I_jeZYANTQR5%IBz_?TJ5$0L5YnR`|FA-ig|n)&H2K_9GY zv$l?nHn$h&zZUU-3vTc?zW<}t!4>zJ7jbX} z<2)SJE)22a2^L}C&*F=-sDE>I6DA#;S7cismVY@rZJzuJD*_GNznq;ke?2~hVP;P- z>W9Zi?@wwt^2;Bsdxz7rw0(UR4mxL?yc(e@{4M8xjsrIKwSY-9hzBD~2+4AvTz2F0 zuxs}&W`m9ZUcG+Te9FM^O9kV8_YQ9sWVUm7gxv+R67cp^aGl&R z@-E*iard6Q`O;oLD@MOowcDL#4hYY}VmHq^mQ@vogW@w*)Yr~X3bnu)?F#_TBU!5O z@q=36qj7n$RoA?_*z%ES(C9u?6NGi~>#BPUKKQo)T_XHZxvn^;=nZ2aG7!=;CC(=B zGzZ4w)Y1buzB$qZ=%uLrWo{-J^{@N!Ei-;Ce>CoA=D7=I-Z(yDWl|{f_AQG*VtG5C zo0z&zVhM_M5&_?eZh$5MMG;dGWIG~>y3q~PMdoN+Y=n2EQV<$lc^mgTAYZZzM72vm zPx3&ryHK^t%0-?w-&ipsNp1JVmwc|{I4|cmM&-)TUzJ(PcmH2b55_(RRFwZ=XWNkf zw>G!7w-@sNLjGUK|9|)U|B52!OCQC~0>tx=WXllgM5pvd{=iI7((hDHApvJ=Dzv;B2_F`X5yD#(s!ok2kkIwnn8x7&g1{B$-?p8OJb5hnV z_Se_3zlvHa=UQzfn_kCRku(~n%$k%D zf7sgC-QHa2e+&I@q5pmJ`5(TA!{5Rvc&cZNJu~Qjvp-Dk6z9~bm9JNPIY{E`sQ;qV zzfRe=UpLRP()gMqIBmh&>Ze!n@U@6i9}`4D4f(Eq6}7ITh%n$xy688)Y2eZX6Y1?Uu zCO{3R8-fhXv^~uL>FFqqg?z?;VrqS>;rYcK4Lr%MpcEt#^L%viCi9caq?3k+7o9uY zYajP7^RrT52_+>(uhZ}J!ft*Y(Uec=IxkNU{4HG~;l0|+{7==<0NH^&i?c+IvY^%v zp1*td2G0<|5U~4YTXcs3_6gZ!{&+omv?6(8eo?_L5$)-_+Pn9sXZ07g)6=u}uTI}I z>&J)3%|@^m2zJbT%jA*=9SbC)6ofLhoveunF(2=Tg3n97#!%*+4gAMnmv!fge5X-zwSuE#CgEIkkU_ zw|~pk{w;s|w@bEvo40>^PVL|3?ca8_f7{>wos#X};qBjn}*p!Nybl*-zo0 z>H$hj*URrh)d%dEjud7&w;4#Fr$!Gz476JXXt!p8cFRJ$U4V9b7HGFEv^xc8cV>Zh z$3nYXfOdBlXm>5NNH}uwA`O`uF90#{u5FrFHCiG+audiTO;91)5n`nkfpP^)(;udh zj7NPYBp=Q}E0RqoLJCBq1TrZ=PK0Eu6q2p!kZhMivOOJ=ol;14rbDt@3d!ztNML7| zKq3W^vPjguTaFl*!pM00J+l*(DaKUcH*uPFP??X>BEg*eEwopliMfjg4G|!I6M+B= z(remE!a>x|ROQKRADRk183Qq4HKJbmM!5hO%2LK&9}fTF*A_!5VI$2P`>y*wF6-~08?*{ zNyPY>u5Pywl*{&}Z3ti7Zp=DsnidsX&2CH@|Ckoh>;=s!J#5ode>T2YS?oNVT;42( zEw;#v!G4%EyroyKUo{o!k{+LZ8%;l~9RpQ3Ql&`#<{Rli?Zpd4dc>!1q~UWCHplY! z&l>W?;%TW?Pb0UM544z4pry?}y`)s!-YQ}$lw$d2zLy4ZWJTgF?$LW`4E zXDAAf6;3oK$n)EwbC;@1ZaTN%r*QqbVdp!{BV%ifdv0xjUFF6vdGFkCKd?MLMl|4D z;3`{-Uu6Y@EQ1`)WB+n13_C--G;C=}o^PUj>39c9)P5?jL#yajC}nHzB zJD`e8#;#8+7pH;mi<*!?3)*B|i24{LvBLBFR@hBBXvxar-Ll(eexpzPzO|KAl^)PV zV+=%><>_ltY^(8!v-&XUmN=OS4@L zB}EkHPG4Rua#dfs3e1Yp++A2^Fq7A?WUJkF)a~?EoGs*An^orIjBTQJM5sFb!Dv_s zx>5gfc(rO}+)2a*TU3tcJZVL^Zmhj@!pi=WmwoCjBDNcqQ}1+&C__A8W6ja8UIf6b zHC6bES6Z-#L7WCZ@(T7TOBzQ2=%#7jp59 zvR49W8=20-tDDjs#HT8YJiBd*rDv1%^o30?Q;B$cwFr?*`h{UF;RR(1&hHXST;cx#9wI3>Xdlea>w9zSt@39A;5GBU3A*wSmj@?T+tuIVqHx-B3v5dt_ z9S&t3Olo;lZ;M(O*v4aK>c0Mao7xm2aDVo;$8+q8ocLMv=HYB^D#c<(x3YAqz$)^s z8S7M1In|_oza}146w%atg+W`!1NED2IWVLd2h>cXcLUBo+pu-9XeI_9jlWy-_D@$a zO>Qr_wX%tcR&6Y{@ko>Qv>{ZPw>5y;M}7EaWm_?1KU-(l_(HC{=a=w&P$h{j66|b| z$t}VmZ1uYW+B@Y1Du+7le4HbnEuhe5W3(;bXk*HT_Au%sF<&5@k)6V$i`}2aVip3P zQ|Qr*7b;Pl$bw<6aLtBcP{u+lh6{nQlyv)rzDFi8V2nWs#q0qs^jbaim8w}hG%7ci zwPR{!Ug?Rg*K2nnGd(`L^qD>4okgnU8&+g@)axs+iuHOu4cxp`e625&YWe!*&_$YU zHdd1=`SOPCB2;vD)EE&-TcAY4ue}`&LLnM9yW=3*-ZBv}7z;gpVm)2kvVU)tUEkE- zy4Eh~#rBG&Fy$v39+O`*P{arU3ZG)_tv7B%h&>u4&gm>z;{9Ah25fo9R-R1q zStRDT1sexkg^=aRGJfeL1H~!HOQ={)V)(8LEDm5U86^XkZDR*OJ}vW97=3!f*RMNz zgbp7g)-*|DS5Kr&s!K{!B$e$wkrK%ln5H|j&8~rK8Q@y^p7m^l5_+D_gM>e!_a+h1pUkY&lrjT1oy0<*hSdsmMDgI<(4Q$pA+hua+t+ZHeET% z=cQsQ!#IwL^w`vp6gcHhG>nZB52WZgC7eQ(_H<9DdD`%bHEU}rO{bIE@QO#lTBhSP zVQ0e{1qnO}FvE8?eRyU;%RkFhAS zyM5Tg16uv&h3wKbGz<=D(!%5_vs z#>x2|=p0+eWezIP&!nZ$#gH9n9s9@C+X9_T_SVHGUA?t8k?#ytj{cQRBmZum%5g1! zXGqTU(Kkjj+|f5vn>{T(=mC%Rz~76R=x=VNMl*D3%(2kSnRhTpU6=OR9~Xu(kN!CK zyJiG+G0AC6qRy?ZnMYkrauQQ%t~9Kj19CCR!oxsC^Cq{~%F5Y=F?AV<&?1s9d=W_( zC3s?9@X=USW8-#5J02*$)?$4wS$Qh~kZy&w?~I(6{WZQG)9k9{McnSMc=%*j|vu#yalxze3=A5AcZ#tHwN zA)Ld3f1_phs2WVkEHnzL$^Ez`rV;neiFU4S?}2i=RNk5L!p&uzEibn?W+QQGjhX0} z`2-Q`x#!Re?nPgmM=yUKeY#+LC86bg1mimnna?j6-wp;S6^uXb!TH^d#liVmD-#CA zS{$HX9H9RS575u!n8d@Kf}iys z`HB)3lven^PQPqff%|(%XkeeBX_Y%g<8s9opQ33OpQ0(7Z81AV6Xl+w8PlC=rcAgf zlQQALz;Q86$^`q;a@#DG(zi3ZHQTf-;fEI9BkpyN+8E|}LPcrn_(xRWhYL^{Lq#?Y z6P!}9(GsME!J?GG!nK0`-iH#@J&<+B*_*Ha9D=s9rs>Of9OtZ2XH%G$M9hwK*1qQH z3JQ^T!DrOU;qOeWt$D_OVh!W&$^vL}^>g~!hAPggyUG;^tB&WY7m0&Qm`KEOFRuA$ zoB@BQdqw@@JqM?#O{MQyG@qW8c<8GhAgS%CX_RlW)q%DKFa9XS11-aY3;XcjvP<=u`fmT zCz|O(u@Z@73W|wyA_c`peQ0FsDm?Gz<+fqM;@0QSg=Mx&l-Vg!W;eG?%x;Tze@i-- zoj&U~J4oUlpSatNZ=<$a(75n9`W&@JWKC{|!|*H}#tBTd43m4L5kFso9mm|yQF4{j zJymuc38r+Wo5?WSNp@^_r8C`3)&x7*jt#G{3D!QEF4v9)uB81q+oIEj))~M`BHx|} z`C~Wo?J<$>OoDuO&y9R%Oys+hAm7_@Bi}8JoRh(FhpZfQ=uEz=Uq!9!D0$5wnuo49 zBJ;S_{?7O}8QJ7{^5&o3^@mr{u+zfVdeSC8Iv%cZj+}K+j_?yu9;Sx#z);=#qdibvLa5)6D?%)x9qT*u?A+tx&h72Yv2(lg?A(*$ z&h5{qb3$?WX)^6#h6lwZ+uta`_vb@k9V*FBV@vFF8IuyS(33e`8sgGw^lXAN8kq@) zri488WKJ%o9DQmw?z7G9GOobA`8m+cna&ikMcT+R{x#L+ZXUF__T?f}zZGV7^kQ&W zPraEPOJQ{R5uBMF0AoO$zwT3H3z4DFq4; zZRaA|E<&_j8qrQJqMaf{JEalr<|5iHLbO`~QReT_Gq13>d0A4%5^Kz?DPH*gb~=1d zdXudJ#Z^!}5M0QGC-3g$S(<&V&c7_Z$Qhcy!t+)C@w}r} z2)J`@*cUT$&_DVaOP+dsGt6_yf9+T#4}8iR{$9f0EBN~f{$9i1?hM?hPT!&y;i#&_ z)138i$|YK~qf70dCOfuMB+*Y}JJkMZvSYi%5$%MwL+_s^H?}Q|XlJ)A)ql!k+=eJ( z9_7}x|H9+kg}8P!T$d)U9S^Qc1J`94T)P^sD-+kQ2iKK>>nb0Y6hI6W-kTOu{hpT) za%?+-ks#73s^s^@C4Bf5e18w!MaS)|PnkCRSzc;!5EM5@*V*vO*(Zg-xJ4W-ZTu%+ z+W1e?8WQqy%9nE%tejmd(dap1gT5`UjcswA7yQn1?01c@cXOD!zG3PXtNt@fu0PH; z^9RuLML0@2x~+s3Nw?GMxFf><7)8n5SsHa=jN;@h>~{6)m(lPn91fGt`Dhp!q2dHO zPTEoOG}tg+4?Ddm9u3cWoo=_|j#=-8pJDX^=*a#3HtY<~E}&7Ob$ZJNQNngWW+(mY zi*gBUJPf;MsaV8i+LOYRME&$C9-jF^?TcdEz4JEDyA865pY+(Kgit1dDPK*~#k)&5 zg(&S6I%!&18`4;DoBCELohA0B+@R7vqMmJ(3S3umpUC>qP*wRFNf^&t>T%uipsqI2xZ1(QF6Z9+?X(0+bQ`@ z6s?RM9|SxQzCU6IRq$hu)U=V*kLN>33Y363Y`q7JjdrLNKg~*a zSX@t6=6X8C_UVc|M9Y>Hf2MwOCXCO_rgk(lvs}5OnfW(wsG-Z^s$p=LsjSAk%GjMS zjkhz2l{3v?|8##)4d}e>cAT7PMYczpnYA3TH0R^&D`Eu*$xNM@heI=Jdkx!mlMSPU zdzF}lyvs$il55CR>z9Q@`{)JkFtKYWY+IML5*Mk8`kRCJL2r3i$*C2jegyBo-2mkkgAr@u1NK9sc4))F$;cv1fJpI$q%^G z>2CgWK(6<8kTFWjsC< z9dB?TV^?c=!%SvnEUii0M!?;CoXyp`57#qda-6>180_uKYTiZ|$2;WQ9EF;tV~rH> zEmyR8fu~3YoV#>CKa@vvVPHlSbrJuXLzeQ1L&Y9G=yjfMC8w)JzaU!CLMO`gsqt+s z^i|bHrwMs=vTQBn)uoM2bPJKiRadk~SCj2)v0QCmELU4+^4_R5jqRHE6$$oP9PYYN zj=>tCu1=+Jns8U0acZHinr=8vn5&CvYJsi}<*+c+)wM1h9M<5JT7;y{Wi_my46L6R zbs0-qY#o#7md_rIZL`$^Hw$=baqMPZ__T|u`n5A}7_g`4 ztYV%$s-zJeJO($uhX7K2H9793_&k6{N9{9lRYu&_uP)1v?wmYAQg7Hiueosauv{3B z<0=*-w8sUz;t0STH=E^@VSAqV%M#I3iwL7>L_u@2{mn1jaBaMw@^;re(n~#XkkZ^7 zq2KYv9Zr^HB%-j3#V|3 zJOM=cxaO(}2+n4U$ZY?)*;o$a%Ib@?ua$i?^FcIJ2*(&cuqV_RrT)Fh?>4K_$+srY z(zct(|C!w;t?m@B&@aEv%n9JvzWjUlo<(uXPhkt|MOK`SJ*iy8EooHBWnm6si4{L*;)ftYuKw+K;DbWV)V92bb zZ708SCAhUVXbDc0&ztfCE?qll#&cjqE8A1>Ai{ZmbjMe6!}!d&T@DA(Bz1eAPb9Xx zR+SdLXfJ}|AjXXu3e%4KcLleXW2(`p?NrH&qH1IgvUrrVB0G!QFibG`(RvTU+7;dv zAAKI`AFhVI?pf50dQso_Qq%-_`@G}6Z*gzDBgY)TO@`!?aC`*0$?>U^p0W7X!hCF_ zA&8RWr(<(W;=HdRXRBb$d&tk@xa$H_;+oqB4rY2helU|<TnZZ&es2@BJ>Z$jV(f&itZt@|V}L1#R*>a#S7L9tkqRJ%C^K?D&fS^lt}%yJ0HuhCQQzzGY@@9x1bUaazXbTFREq2@NDMj;WF0g zqV_kNtAk3&cWs#=_ZUhWo$V`BzS&+v)z+=2uacHH3#9tZ2C13J zHJGZs%>t@@w4v%Yb`7j%RmGFE&iq~^ugEjQw0)I)Nhs3y{SgZ{1?Zj+4S3TF8Nq2~24XP?) zt_#HP^zcEI+FFsXBhS0x*_N8}RP5I9J2E`*6jG{tJS_p5uCNrQKy!gNmXm$WFV|b9$$6%+ zJ}u>$s=pLwJoDZvs_;K8&6%OZOqAlxW`SBtGfR&t%xLCCqVPd2qnDw~Omz9G$`G~d zR~4m31Kc$Lcgtr66O7TTeU!=zCQHuXc3`)Pl#>uFpP|k-oY88m<5ZAr>P4r^qW9F7 zwD89|wO^(k^E?%#cWB~6K{}XmB2j3_N(Q22_YM0aO91k;y`Qc1j|owyVG_;INik{K$ubKCh~5UAxiUW6I>U=4!cg z@ugg|0N-WB45=Ioa-RHgYyvMd*O>YZ3HFfQv+W>XQ2RQM-H*$M{Ipp=&|~hfiO%yl z){1W{l@ZHj!Ca|a+rEA=n=Q8)OWE0U6devyawJD74000oqFa#8&Js3<;Lqf6Pr)jjI0WC{4>zKU;}}ty&UkKMF*k~K z150kEc+ajlJ7ExCa)2!P3-2UPj3)tO(sui#Qciz77blH*&cty*X^bN#W1TK>oK4C- zShCPvO_{-BNPlycw3s*iRKNfpD*yE3IS+`H1-4;`{Rp!p~W*ZJCA8Uahr+D2-@W_ zj!nBvGxKz$Yc+3_3QRHu!{ZXWOW+uT@Og(~Ji3=V24(Cz1q0!gy~|=7lXQBAWdh1+ z-2H2kx176wElODK?%!O?Q^DQ8me@>p|K5yqVQ*pVt}|>mH)6LSSl1D!>#zh(RuDBEInxpJ@#uNcXccpSpk$q*@o@>Y-jNxP zzE42ji^ioSR|v+bSTsUDDcL(p6Oem*s2mjEx{FqEui8|<(7$>=chTm^(UadHYXq>K zYeBy5*wwOe)mqr95>@SqSS^aFp2pYfG>sKsZnU(N>nC+W{T^;EDn#(uLSU}Sh2N*N znBZBQiyMQ!mm7l?R#cU~j&r3?&NV((E&f_i?U|Tc?)gTYIcZC7$I#c88+%;3IN$4O zR9T3xt+B))zr2E@GECnj@i0E>#^+)8-4(kqaz&99i9W%81U`2u3lVqDR@0JW4amYA zr3o#Kx)&wjU@;Gb+fKh7-~r;H?O$i7wZrDw@vC>uqvnYwlrjAM=+>UbDup+$ zEd5H$2xhE{X9!`wufl%dfxWbR&+A|cbT}3gJgf&Z`84Ww#>I*1MLy6VoN73lK zT4tSRo*J-kFFKc_Bw~%pMm6(1@J*u0)O@b_royS_lY?7GzuUHqnt(`~Qw zry28reEPq=x4mc4|GnMa1^vHA`rn5gjKp8x;*uP!rS0pra3HAZ(oK}4u=labMs>Hk zDc-lEw3T$|(j@%$3P{(_r$M`eHkk7fiI^ak0??rL<~TSVM6J$6hu@zBqB`iOFdxBr z1lnqE(CvWYe%l#d1s8D=fOHaFCQuY)XL@-=O%3YU)Zk^@?+jzKO9ZDT5nD>4L7d{} zJ8TrIN7deR!y&-#nLS04`zfp53p>;swnx&WwGR4K^tmcaptzm7inOc4RF2I}BN_mk zjry&Q$wP~2D?tDMwyT@jSUajY<_l`kY0~PtR*f3GPW%z!?o_v{JB|W^7qT*&`|zKm zR4)cVRAzIdx?wbs6~O^zB_3BdVZCfP%7B!>Rt*QU=PHwNZY;Nj#kSO9T93508eMr@ z)#_pU)}SBP>DtwBIAE=)Zf;k#hAJ)G1JwFAtz~Q#Tx!+0~=2{40NFZnB|H%wdVmy6D4e9MISU~LVagCBla|3NN8Ds~$VTUS`n zKms-3KlZhv33!8$q>ZJVR-yFA`=3(^8>TeT(YPccCv7;4&IYLDW9jq?hQ|DGHcYFj z)=+_en6A;H4Auq#j1Xzi#MA%^mRTpXDUcrnH_(Zp*$HZ~HkIv?+c<_|L&^p;Ozzmb zwP6yrqBUkQBuRN`3pTaBAGCVwd>e08_wtL4hVdGDX_66U9|{@$5F2l!y8T37@JLgHr zc)=5M8^g-U79Akld90JOTO1}fIzWq!y5Z+eoQkR1*Ov?;juXj#g5!RxDmX*8(~A0R zOlly4T}5j^*_Q4_S{Cx(d?de8^56EJCI4;i?(Qw*zx$H^#*_ZsvftMz`AsGF6-j+1 zWInINH-WS_fuxr!4MD~U6vf?c^z9d#c3Y$U#8&~=&EqRS8b&V-;m5{c| zNLo2kmRG`ZNLOt7{gTx~%2nT*{ZHGE_bUHw?CtMb^56dc{zCrys{B7PNW&2i= z*=)69JlLBUWH44RLO$V#xKDdYJb3i7mW9-^#9>hq7-{($fMH*>*VkM zyver$`(9q(ZhCAFV+DJo%*w9@YwuRuWTIFYPW~@ z?K5jv))a)dK@Xcv{Bks+cHPt~I{+f3)(jh!y#`0y1hjWY0Q`_ZA68!0YA-7t7=g|~ z1>PT39>ed)2NkGIkp672BA4*`k{9_Ae*b6}>A~wBFOnkmdR7ElN=0HQ67wSOYqj^H zK=X5*6}W~1*Hqx~!Lwr+rAFnKTJ0Aa&dTdr?KQq^SB`77WA^T}Ry)Oa7s@+?gzx^x z`3|Az@U9M=NQ`%NL?YUI$Ux)Lxo&1}Z<^1)xxa`vZ#p z!4XogkLg*oXuTnOyTf0=dT}>b+n!s4k(TUsMxk zQ|Sy8?sFuv%IyDsF%I*dc_w2b%M0(FW=w{Kh>@C2ye@Tf8Jt8(bi_SeX;*TX^-^Tnkw9eMTmD zQC9xh4#Eb43{RaVJwZ<{;pws|zWo6({;1QF7%x)q+#BHD#+P4Zx0wcR+ z6_T`v3IVOCZy(SSWJKl}P?h@Ovkv~tUWD)ockH3Id795FJFu*G8n`8P8~SXO4LR!7KvFdw__SQ{X$GD zmyK-bwj0WFKE}O>qo%AHIi@YxN6Qbd}$`(lbTZbej9%ewEvkBDK zDXzb^Ca-KCaDj!dM`;m9>Nz9}GI|KHl(-8A(7Ei?)& z^#89*|L2om#t2ZYmRd>Qwn@PKhZzd))CTU=QBB7OPyl`;Z4iq+IZ)*96kexXRWo?W zG4(|j zn6o6h1Uh}jy{gGn4uFF5pLEv8u>bGvZ7%r#gYkdg5-95caM%Cl**)X!XrJ37+v9#+ zSaDx+6_jWPDdmhyBY7Cs4dXs4vJAUayql)|K-Hn>w_%|JE##`9s6d(}@%kVm;J;{E zjZU6bSpS8yIycvOs&7;K5A)SY z`1SdqfvWKB!F+g#Pycgo;mH)h0{w4$W6RS2_IDQXUtb&jpHuj3Xeg=+-m4$4uPlMG zDqmLRJJ9luK9M8)xI>NnbWqvBrV*xYqq5hm9i`ZsBhc(H9^ps&vd%3`=(g&qv=Dv_ z5A4XSjD=z4gj2_j0~8rp0d%F_%IL0LPJaz%j-FQZvK^zLvHlKyaX*rybDfVZ3uW?> zZZvfMp*EK>8pFIPgDE7f)&mZZ7j4%~yCHIuNKx%Hf#4JG5$|YWh32NE@Jb_I7F@=D z8PO1eDM8PaVO4}H$#{N2rmbj|M_J&=ThiR!^)m*Fta4CSe7n*;EVRwfd^HgNH>a9* zhlmvMDb&);-PG#ha8MKuv>>j_KrpE?V_iHBEFnN|Lt*fzB1(om@RoYcsQcwxUnL;=|8)Njs8X{%=irr9CI!dF?0$H?x zieXdH*bQ??xefBCY6IUopa>~zuQPLyEGL(V468XNQ?x82L&#)^&oMdkWf?Uxg0}vT zrqp&!?iYfPRinVh15E}~0~pm%#`xff1@4^^qAXge{;5s`3gN%2{MaCh$-)_RyN%py z_=~3fQieH#0IDxm1pP`OigJF9l`DU7`l@au9BeUOKkKsQ&*Im41C_auI^W>k%ccws ze9(oM#&4k5qHxW;Gk31$Qv>QuYLg!PnTV1A*2;hk3eD{@JQS-H>+XAQ$IV+<*7JAzUhvvY=eB0-B8tYM9s zzC_j=;%B>o!C|d$O(F5w|1x=Q!kCZJ^8e=E_NMLs+1y*ie|!b<|D+~A9l$rO5-?jH zMpBIE6R-<1-w`u-!mL)8gz~CU>A=HddU(>PjNsw6L8mGjip7dE4o|4Zu1daZQAlmjUvtJfv!YQj1x0vv8z!`Pj z5d<=h-u3Lbc<^=0Q7DD^fji(~ijq$cAJL`7SJz8W0ga znt4k~MBmw4b$IkOkv0_XMh!1%OPb|bzSz6*fhDrZttROkl8tTaFquN-tVvX8lcZ^K z5)FlyO_AX%HkPkxAN!q%xkGa%N_3KMy*n}p*9GSr^w6(Y9@k0W4&|XHN$m`}_j_hf z(U#7y*<%gIyiv$a^jKB0U^Es?VZjs@OyL2Tf?S-gmRvo5h?dx~9-FftkrHPgROd!^ zykYhuV%S_=EwK-q5ARJE0m|{DG4oCnDa`9MJ^toAa&b%x(*=4hK^q8~7-^syhQ|THpV}9yio1sGYq^m@oXo@a9k{2ZY8m(hwC$EN@Mn8=EC#mxOj@< z-{@#HEY(iKP_P>XXRWp{RfKDO_nV9Ly;$ER#?0b@zsq=>nXYfH^XV}qjWTD#%ve_? zHIGAi>{~j+H9G4v1;%k8!_r`c0`Ny&*GG1(MQbDx$scRI2sh&0p9PKSFh*6~sUj2@ z(s9(r;g)^={dpF?ccb<(36hIY;CqVy6}KGB?snFK^Pd}=JEs4CdwXwt;s1Xy|G&KG zqFnH=lKu5NIm|;|e++7CVoV!Q;!%?l0@X->!BgiQe5iq<_Tv%Bkc{(U+!62JmWUHR z9DrDPtR&MCg@B`Uj_t}AEA?Zec6^DIpFcUMq{m7gK~Wjr?>$#i;)(YdqWWCPJR^W2 zGU&q|HG9ygY&|zxv>=}g`cDx&*>yW{U;RCKBv^j@*Vg8~eg1Q6asTs!(tm5##|Z(; zT|nRUkxwb?^TUi<+%%}9+R4uiH0;rrE_0~S1IFiTr$zA?K6S6Tsh)~3BAq2_p7lqM zQ&kT~sLH2Nm!gU z6us`$E5&DVv_eg!Y-EFzilcF~psp&-$Id(km|FNyJ)?_0+qy55?{h-|Y@f#*9GIta z=rcB5PsNH$#YnxWJA`Ejzv@1gLDnuimRt>%pS^igpJiewW|}w79$Bf08CpZ%%?8Bs zxybP_4*uwV5Y?(9`)>Glk7-{{;{f{{?LjYblh-I^Z}HL)6q-tX>yD z5v=A_-5Dbck8Sn~`^A4wWTYI9i(t$++vd<3Sw8ge;wsCFj#%VV-4J;ui%d%nXA^Ym z;w_H&ist%)yF4U!Da!|V3Q;{sr!hU(GE%IwQ`8IovfwX&H~yjp;&~2}lwmTZBcPqZ zZiiFioiN;Qzd0q|2}9Wihw~q2M=0O4y`3mr?sH>GtVQm74EpIk2jSqkq3}QV$TAbj zC+qcvv-TVI|0bjUu+xjqdeJa!hr{qJ`iwV1595iG02kzc+_3Ne+~40=_k0kS(=GQsJwYRs(3i<{Id-CR*XrXnLv=}kK&loZ8XHJ&uATkoD%9;+wP zjl?X>c=X2s<%qgzXkwt2w`O>tCh9PwxMV-FRD;$nf=BiZD|X)gxAL|f<&pymPCU>! zlB{R>2rw}(WtVZsUaL^lWH5SSef^u3Qb*h@7G)Q^Fz#a`ZCq2 zP3C1=zo36a-ktXhO%Ig0=JKF!UzjBF^vF!rBCJl8@tN0#|2(8r#LWfs{;vK1l))p1 zdXF6kP>}y|Yv0WOxV5#hvB>}URr3EyGr|;s{0?%&Xjl9Eafl}mc#arp$51o+YgwJw z4@}RlgJDvJwgZ3qWuuDxM{ut}kylc=T2==>sJoye$NC>78z8bW3gcF5zQ`Dg+|K?i~AMBe}9SQK>iqtc1BUA|!M#jr? zoN*Fh30sWIO8RFG$P#z#*bc+(9DtL!E41`&H;#k!N1D5WHl$W#)++I^D9S?bA79bW=cMVL*I1``=~MkCJd0wbutp zJdD@VyZ-Ph8g^QEcgG;^r_s1}z&!bXYioaZf6tWvH@CMJ^8drh|IR5dDe`mcUx`)p zo!ke;E^48Q2SibC4|pglp11gebb!wX>^5K-+Q?%xICa~5-p@eS$gg{hCa%W^wabHl zaXZd${0-_D$CM&q56^Ru_ORci^BgSSca2}3aSNYsStM$+vUen+1L*Vcfj_gh$o7`tTM8?N2RNv+Ce~iI-Kg{7%Fe zGd{`g%CRoatiRz&k;o#b-WH|?B&Z3znX6w*9ZWCZv3F85O&ox9|9W;u>jF?QAkBvR z>lA=&&+G~NAT6~Nzl~se=3G4Y|%FJg{~Xl@<|CU;Cs?(Ud}0?^lg@ff7vj!_@$fX#NGHv zk$fD(^3=%34%FVE5#OW{e~c52hc3KhZjUBeMGjeO3})7?+m*X30I)hAnnnYvIoy4;pM!{n)Jif}83E-&8;1ojpxXV*hx-8$x^G zq_Xuw-#EP&e3{Vmn@al9vsYgH#sTAAS%(dJNDsfL4{vL~Y#ypJhwn!i&Rb88CfzGy zWZ$vT;f=7pnor7a6BUNGO+Fp@VbGNqzvCEMFfm|rQDJJ^Vsur!LrTIHkp|a>%(jL^4aj)fdyQdVafXj<7J z4pnQ*YiC-xQ}WTj&8{&q(!*rC(aL0_!Q+JCuUlNHs-5|F&hW+PDv(oVWzcfPw{~H-Qoj33b{wh zE(TY-wdjO0aEVkL_xrQCgAmIUzBgx?p`1uCQHyb9^%5PH45^)jDM*RPpA$sj@wwJC|&2Flj zCwhaf`o=+G+?-QujQn4|xtJGvc@{qx{pUHMm#1aiG}7>R<#uNYw?DkR9Y;7k*@GI^C}}&RbF$Qbn~4&C_!os z*Cz?74Mpm6p)<}R7)k%i78Z&LsHQG-1}y)vB`*S38|+DXsoXE;3!QN)CLf)*ut4{usR$_fr!0+s)IF`O?xKpcFivS;_1hawsfDxx zGVvJP*6@iB4xCy5NfEAuAd*9RWqmV*#gOn_P$lE@%JJD@EU(Odb5I(hOAKl{&ckWc zDrr0mxzXW;6O(>zs!H1o(ce1`lIM8^{I_Jkaf$U_sFIa=g?H3b54|Eg4=6IgN*3iy z4{tAauaNIs?ABE%QV10r;M}nR9ux0+ONZJN1NVEUpaWyUS#>M>b>z6@i``QvkqI!5 zsb8mb%KU09S=kmkYbG}`ZyaH1ay>F*%_Qt*tUSx1>#AMPvc?-A*crRAcFZqUlb?7c zyP8Sh9UZ>$3T8EvUb}|NEmyfnuCb3?U!`#o)%HWrI+rWVb=aBZgLW)*W`y&LLv{4u zXZI1adeS$Zs2O=AXOjQub|~{Wj&_&qZ{|B;nd%;zrYXL_g>kBD?DD-ajZ?c#zx_b7 zT}&^D8N<5V_F+;B3g%X|Zd6>7HTlJ#bR)lM6jClgPJZM9pkFAOzP z8)~@wR-=cX8sEO5#+6LMp`9n+r*S|Y1eD^Qn z4V`1nVtsz^fQKcN*5_R^?bu2jPYg02jWbWo`D|q}H6Z4#h5~&)k7j!RG4xTCQI4D@ z0ohnhmb$S_0<$!Ylv9jv8<}D};C0-3%eb2Hu;I{*ZyQoG-W*FfvAKNBBz_K6Z@)e> zMN!V7OEadgr8Q%9oq0)ttu*f+jj88rwb$!oDw22bd?$|Zxbg+de@?Y~V$9Px@~h;zug3*W-M2CCPOLB4v}oV0!pghDH0OIcP0hu}jbw00 z*W8#5RcE}>_DT@Wn39E#IE9YL_PtI#cE1B1@qv{zn!953^K$0Pno>+MmSIzu^QbkA z`Lsr^k#SlxY<$<+;61Bnk_Efaxk!x{owsln&!)-)E_B{hu`YDp!ooQvZn*TK^Gf%w zBHqHn`}(Pbwsu=rQ$m%|*5>2MlahxQs-#q2`GUpyd!-5&RJjFRN1=W4gnHecSCnv} z%g-}+G8#&~D zk!^OxfGbJ$=)9Am89W}-(dG%KC>@LK6^6^iVwVmPo={h?U3?zQd}eIiyA$KKl7g_{ zk-t6m@m!oryvAHToSTh>4mq_B$xSzUx|Oe0hm_?}Z#ggLwi-uo*>21`D0rOKY|g1Q zYMRq=+S6?=+Vc?Yae0lMM0RYa@$mZ&FuxB+pwML3oA=@*7U*`HnrP}mXma!dlsUx( z(!tT+2jNKHw3mrOh5=`9Sk^d&lmw;-$y(iRYtp>@Lz6 z5A#H97ebX&t%uiwAuroaAwr!pIi`{Um1j11}QktM-;{=d_EjE$^g*ZX?gd( zu?5mUVn+|~_<6-TmYph~*a0I$!tI#0u^Y=aCRw;{DLE)(8*}9;Xj&-)`b9zL8s-~z z5%bPLL3qN9dSB(n^cL4P2tG+zeit zZwf?Hc!0U>z&&!gp=(4X8o9?VFUtBxrS!SZ`-K{9G_`BgC4BZ2;WHVF#M-o~X0B(K z;N^}jbuCEmF+%xOJ4U#D=$SazF+y$Pu9~wtM#z%I^0>?Kj}cB2C7O5Ku>ahY^Y~pI zLekqbmiHfHMu`p%|CYxM7m=|K7#X`bJ^5|O={$k9#zg*HoSyu~19KN~!Cy~Y@ZwnL z_kS#O5#~I@Fz2uBQ0gBndiJ|Il)4DXE)kM_|3_CZW#siPujAI0$2BiJahVq`o6@|{ zJsd|eeDI^I-)`LZ{13VEyOoY*7A+$Sl4KvQcfu_3#Bx6=&OGki(&*&Ym=37Trqj!9 ztEe&$zb>3g8)3kCH8gWKJUp>VUdu?KMX^!4de zEvf{_R7o|G3QYHK&is(wKR3VRMnq;RQ&LJL)q|JCnQ4QhjEKyPj8{fR=5Umgm`itc z2JWhQi*0;?JmqaAxyzk&R5VV)T=FJU(4R;YThH4^(dDt}a?o-Zo~a)TI~VkAPINRx zfeIsb>6x~{r29m58p+E7#%@e>>Z~NmUfD*OX4J?OI+zq)S~GroM|4NR-Akosh8sw} z+(7EL<*i;a6d@ zO`Xs}E?%FT;k!ubH?zY7f4(Wa4*xHFG0LD)700tX!3ss>lYg2< z>>O%VTpwr$l4~1HX4%9ZEC(44*5|6{A(akGZBuNiykiry^UHc3_vT?U`z>k&UOt0* z9%TiMr$i68XA0Bvr9JN}DT`3EzF$)FZBwIM2BtN-iX2Q^PhQYLMBux3Gg|w4JEqX_ zxi|Bn@*m1!b{P_yie5={YfeOS8!AVd>wWAC&c{~Yjg6Vs94kCz>-%LaxGcp} z9H|<`(;(#2vs}jD2O-S($kAqs)gqs%0k7&a}1)Qiqpn0ZAY)4;~wZHslqSwO3^QCWaUSi zi23V~s$Oq4QmxvfJ)Sp{-aDO*P$Q{n6R$)!Cv?&9J?X-PaF*U>v|Y9?Obz+Vw90m7 zPT!Z;)2ya=QwkCvq-f2Iz<(G;Y>!Dm%nsgvQR!6btf#o13W|P$3fd@4wdG(V+89CoIR8wy%)4 z9N$)3JEW4<$bfz+RE}>X^I099+)`(|`BUbUc)EPnk&@5)XQ7b(GbyO2YR(u0{z?O( z-!6DHeWZ2ai|rq0>nJYH^o4Q-WfnX+Y!Ne=f+|}*T{Y_Z;Q5Wdv_#|*CoMeEn`;#&N2N^v})GnM( z=fm$W_M-#ov~~G(GaR-P+#D=(vZk&^MpjGAmTQ-%o}TTcN}0p4HK*Yq!yuL`Fh1X7 zYwnYidG@|BC-lnEi$dJtwC7ze?J-5-r0*znJ>PZ6d6P2M?T*(WND7yF6TmT2G{#95ix zPz_V*u*MzYF%y;Xx!{iLH}`$n-u)$_iOH-TM1ps^j37m^Fmro;PPp4S zyl+ZMeH~Y6^0zDaYGXexAY;B00ZAOfzIYuv)3KT(_~uBPwWCHib(5ty$pob~E?X$x zV0~})>0he4%ai^!d^1^bqJL0GMuch~?%@7oPaevMp8kyzs+-ldLy6SwB}^N#wPtnjLC)K%{(d!n_ffs#yqez=<= z3ny!3giQZN2RCFhE~aBs%E}JJ_)k$5iP-tXL04TUPm28u7T`#btBc&KDj?0S;rZ7| zcK`1<|HdPyltQu}A9U5b$)4wU*i>IOZT8tq8XqSsd&zk-i}GpAna6CC_A#%ItKEAq zTpzccOg7m&4RcM}r$r)_GbmqjKZz<){D}}*>W(+P&AsEDwXZ!aI%H7}-%AN(#oF^% zy6ZOEGrO!aZ)Q$(Uw=O-)?&e?hzY!#w1Z<%qbBiIdjgaAH?oLjvF%uphz=3tw3y|J zj9JVkT@w47CeQ3|DMoYn_G3yAC^kI&m1f#>f^mL{HmaP=k!W-MW>(i-xq#ShQ+cMg za<~M1m0kCByy|m2Un5!|ajP9qpV-)^Nfzl7U)zd=23!N$mUMFGPqe=#w(mKen%j%^ zA{8@rD@E<&%qmi}4j#ice7V0k#r`5&5>XL+eem@67dgLETm9N7a0A4GlB1_`P;y&+8#rfV^?gx~6ibUgb}w>@#dn=3iG9H~p@qe_9kcju$>RHS8jDY- zRG2R^VOn2QY-ik7sdICFqpfg#>?hW8GCT97{hG}Eq@{UQ#MFb~7p5M+UK4G-_W3t% z>aleY3voOHQ!fWel;tp|3+QEC7X8X7VrMqqJZrm77i7t1^8zRAV;hH;`^rq}&`A!U z3+PolLBGS9*3>zeZ13*2&Ba1)TTaezs&ynMF;(dQjZPA#ih3PX$>Y&xBpLQoMlMx3 z2r1D&m`?y)O%9vfNRw3-avEt_@--=_cH_*fJ970}D`#}vm}=h1w-MvcX{XGZ&bW)r zT5vF{a2(Fl4H;(ZYB(-_%8C6)&Dn@r5@?)#O_E#tR&6Swi^-F}W{wH3Ye#0ERVreoz_)nnz_W8LwMMsDL}A3>MTBuw$_T)8q) zJiAOeQ?7#;y#kIG_>o2a#6#z`{!1Ao6L^N2yIS7T5%1Jv=Ob3oKp1LXY$ab5Ja)c* zFx|P_*ngxH$U2vsa?{CE*|2>K2lMY6v*e2Cr3n*bPIATixSN$DnAa!9oV;22^0A#z z|0b??Ouhdlg1J92=H&e^&i*6oGx1fD!}9s0I$4`6-PPDDe6td6)ZD}lpKWPOg*KgL zFL)_QXo{5w;OF5xGy6)P0DeG$za#mSFC~ejR=(Hnh9QdKoIK~JkstGDssua;dL4`C zE)bX#`p9L~>FBTbzJ+7&PwST6S)b&N)EP`iUz-#92kw1%^?A0a?(fa#A`dl=p|fQE zJSdOR%TVZqM~QXEYR4WWzC3sosfy3Aa)5&FKF)@RrMlWmKuw1(>S~Wcm-=z&nzZlx z6uu82x-S&>Er*x7n-gs-m9GZ)L zp3ahcpQq4y;?zjj-{=I;)6BAd1Qh^sL!HlT$p~yJRO$Sr###SH2Ec=zRG-g)%g|ve zRB4T;1_=K~S#c9ypphEzjE}&4XpMz1bx@^4kQ%7`8zmRbu&w~V5=$>)$5e2o;MSay z?ez7?i|!x)S@g7dR#SupuxFcbW-MDqAyEG#$Dxo*-QdfxjKC(h0C%skqrduH~`F1(8 zQ{tEnd)4MrNv5Sn(;||os>u^W+li#qn|w2`+Zf2M3u--0r-=^MuV{0KQM7(E^xjK13d*+F=)7;6-_8gw~Veoqn>P(SJtG&`Q zS4$D`XyiBoZnya<*xVtH`FLM(dC%{gm?&d5<5IVAjZ*xXtv8c8G&9N%eM`Db+P{TMkeW=klc~<*%*eddlgXJwW7zITE_T$) zEQPUVM(3Yz?)4rXycf*f(^5X}8lIW;no0B=x9~h%qA5v$B<9A%n4{N%t7+z?OEZN_ z!xTo8w?x^*r|i;j$sJz%`j4qH`kXiO@qE;)C$%!Z2$8{@(hj-QrnY(sUxdo_nNk^B zyn5kWguLNF`jPSIJt*60_n_$3sP0T=cn^w~b`Q#P$kmfeJ`=sO_pIG^)sWPd&u8yt z`FwSMN|j&Q^7*mGjkY#1O0^PoG$>b_vnu>57)3hiNQk%H*5_ua2B0>az}`zRDhaCW z(MA+vjj#2?@BlYY>^5Idc=N>NoAf%msdfc6{PXoJZkxF01S#n@>d-|kz%l4jKPGf1 zWXg{XF5S@D-+G-txDs{|qNpf8|Fq7WCzHhSN!jafz^%YNo{7 zW{QdoXH_OU?dK;q?tD_*B{96J!4hwqEmks|R++Opc6guT9S4z%47OkAxyWEXDLK-y zOob{0#!I=LG`1{2kuNINFqHD|q+$C2j7MORLH!VW*{g`#M zxmPSS-#U1V1zjVUzfO!f#(Ef+F2j@4hbI|t$CBOJWtG;MRcXycfB9U4GI0qx-vX?0 z*_&B^H4nDbk7H6Dlj?p>b8a_97UR<`xEh7p*q=1XK@A&EZqElrv$nH@+e}NO##+-0 zT|R7H%i}HANYLf4gQKxap;f?u@vAsM^1Gqm?0ex-~%LSpkJy~_x!=w!U zfjURAHN#m?@-Ghi0i!=Uq)JdO>`Yj{ti3Ohyor~sk(1UHtVX#&uQNU;2I`6>NTq5c zpU2XQ_mDps9rPx00q-Y{P4cu9HS}T3V?wbE8(<+}wcg z;Fpc92K;*;12FOf(*sgw&`J0)!hfI0&v(Y&rRiK)efMHv;k)mQ&l}ZNwf1}EG6;tL z&ieX=9bAsis$F-m{>F7L`qp0G9rZr;&EVYi2J8N<6I@z>-SyY}-qo7p_N*`dI($7e zJuCj!9NKHw2!Eqmt){)Jtr(U1M!mVVQCq7wR~C?}?~K=@3**54YWWKb-y5f%eQle4 zqf3+6~1jh4CH z>Ykac`U|sne)eL!+iEp>EvvO*Zujb~O*t9OIrDZigSVT4w_!3iit~1YufN;ep3T&3 zZqwA9Z*8}Ft?k)N4F}fkZ8o=?8{3w-RXgi#nvIQSbK^zNY@Tm!nP#_FSEpva>!gvf zPMXR(*;uPJbnE23d1d*A_0{T*0^4;AyJwi)uI2moS>G~j#{js-$hW*@-{=BCI76)$ zvzejR3!0&=7iV>lF0+{-4y@5S+uq!&b(>pf&F*%yVb;&A?#B7X#@6|E>)bp)mowCu z^Wte_ES^SW@zmMy!4UetSCt8w1kR3uP+&ZAk&7|psenlIKG>7$8K#xrjWFk8D#N8eY z?thd&kN8LUe?!j=-1X!3?*9AstX;rt|8JvKZzlY|&8@A{|GST$(@WbodbVeEL0;T~ z;R4ba1T)DK;t6B-;~|KVe}K{p4AbdJk%HfX_z6g?pM=t)TCVsfxc=v}@^i(1wpv^9 z^}o?-waWE>A3vY}^RqJ?7}u8PgAFE)1AA~$^)GF!-}9@syAI#1U$6hy1=$H}T{ILl zMo!hgzF3hkZf(C~{-HiqD|aX`=3}abv^<*( z$iBhB8zZpx!OH9g_O%7p|FzY3hxkd=II?bp6YU!VFh^~t+aH0WcIH{;mF-+`ryC>~ zP;dy=soC$7X}YlR#~*(z;5garsj;@^n*e`YU#J~gm!Ev3?N_k446?F}gOSrEtM`}s z!U8kD_?!34c0+oUQ9ua{QW~x47=Y`#0UUf`1*;^UP2ccG-OE*w;4n%TBO5vh1Jx&~ ze(By|NWr%PV>AR%zC9QM;&TBjxHJRwVVV5@V_f(C5TjnD5jr#d%Z2}AuyL}3@YiBP zmZO!R*IzsL%z<^|dRI7Q#2VIDllnxxK%;f-+(JhXl@v0j&}F_Jk!&I6E;4!E$O$Lq zXBh52@Y;L32mjuH-M_FvBnVan{do<;&v@1JZ*k~>ESwIQNsJPJw-8YHU=YF}LT@}f zAcn*^0!<1sy>ktYZO=HnHO4bc)%f)ioM4k85(F=RKf{SeDj9V>q{>F-k(wRe`mkge zW?U&}r0soh))e&1_?35UcVWfA*dyirzI%goi1o>);tw0v|M+@hpV+tH`vKXtJf`jac6lhX>+U5#@~q_;H!s z4lTz0>{r$f#m0r@Se_X`56?Y!z@8J9Dwj&M7~_ZE4g1`kV1tJx@A4bt9LL3(eGJv6g5|k^@AO;_0py{yo zebBfg92^7;A9>NK4+WOQi_J(xIWBix#C8P}5ORoSwA%lYojkVuQ6KvB1_xXG`Af~X zE4sefYJkOHosas)JKMQp0Zd{jpNUQ2R8rdp3%#tuVzi9U7Yy}U2$x4@ey>!k>+nC; z*k4ckZha+=XXK;Emcy2cNPaRNnfx|HD43eKk|PNlbcFJ$(rZA#LlS9U2&g@`tHcmJ z>%#PU*q`w#a@DxDeGp)uX`)mSI0!#qm)307S9)ULe^D_aQKkY7IWYrq_{}=t!;qZQ zwT6Me&W-pr7KOBZ*ZIz|Zq{sPt?u;JV2(7wxM=(*ZLsI)|J64)HWL0{tJy65zkB%s zRlnyBZ$10sGB7awEEdkYcY9!9p^fzpEIbFzH0D~7VgPRSx&~TIRvu0CR*uz^9I$K zdEr^yZgzyJ4)V-B56B4sFg@E3Jo{`EL`F>zNf9^s0gM|MG>f|@#^K4L@p|{<@MIN% z{Car$^M_BT#;?1_$GbaL9{py#Jv`c9H7uL-sqigO z>ykOtqrp3|tOyC`Tppu=VV{G75B2bc3u44UNeRyN!1jI8oM2BPn7%!*nQ-%y{Q~ui z^27WJ%5agyMq?2ySz-M!F(!p(bu&o^Ht^BwVDK){*`pCapn)C0Crj+# z4sKUf;WL~f)Qt4qU}%x8sSXj18yZ;+rHd$C18N$dInYnYhG1W+V~t}) zZ93HEmC;mykuwqp#rlv55ZVcFE#NYOcj&NhxuQmQ)$?dofZ^y^YVZoWiRHxSyAHa{HaPwxU{AJ(NG2~s2=fZk0}L4SQTpI7VaF&4fg+it zE=p~NO&~ZyDCEfTkf-~+KHTiM9%Bag_Ii;pd6`t_Bu`Eubdsx`uZLg<^R3WUuFvW<%|V<|sC z<(p1KbhGK8mz}OVasovIq`~6T0H9cyV2H9$mEq`GYp_tC1d@6_BwV2s!h>yKZaNWs zjePjH=wbNsp~EH#bj_S&XbsTH!{i<0Ci6Vt#ztoU*w;~nEsk&(*H+(RLI_YQa*+6d zu^-pKrg33kTaHYrSoY~F28w8i=t0F`A>;yBoJHe-gTGQu3YpAd`xLjcL6tMBlWdnX zYs0-_jH+lZj`YbYuW=gXh9W|t7>a1`RE5$=hdWlCXp~7a1eaTt=oLvTQ}&9zfTRq@ zt&cH6cvBU^?Wh3O0`z#et820tkxk({oJYhGVJjX13MF%$*q)Xh5D|=gY>D}j!vL6t z`6{M(MHU9*#lC$7-edji*F}mPg1Jsn{=mW%SoL%M;l>8AkKmSL9<(^2@AmLBzQDll z`T6wpV-g{D#Ddu}cpD-jTqFC|xruA~+U$=ku^j^JOj}DTFrN+k$?5Ltr<2a!yWNwM z&Znc3kL|s~gTwYd49Lby?ZQ)GfZ-n8SRi$38ymEjSKHp!z^(oL@3jqi#hlY=66^7`>046kXhdx&u~L;zy2@F|QW;$KTwGv47!6{lrz(7*p2^mH&GLmY z2(Rqrgo)m=H}oCF>f`#GoKZ4iq)CH^DPXuSt?m`Gn^Y@JLf7emtAxdwjv!_X=0qYa z!3eT?K4eUfr<;2bn2mfe+2?5coS`Ftp*jtQkwdRA7MHLm#~@%^mM})3S|Uq9WAoEn z_%2~W=Ec#-iKC(5*er;nnG;7-!Ld~kM=K|emV)C&#PpPFW{(zv_hHDQhoN-);Mo^o z=#M;`S>Ak;543C7GeHiZ80K4rNFm=+wVBK4I{jM#D2&;jW7bl{3~~ua2XUyv@hIMT zm!~kS;?687{?wRXPS80VBx0W&l5;s2@5#?{@4FtI$syqvZGi*|NhtiYRMXyUpoljCVt)G{ED$l?;05U#mng5 zi|l)rF5oXp_Ey(RWJJ#__^-t#PqI34MYxQs;TVAP?)IXazdPck*n=7l1Fzb%uGazH z`fxNH!t4Np57CrCtbk6e`>Jt@7Em@kp4tc?2JW9QFD7kmSR%Z6KhYJ;ykALZ6 zX5r9015-4(jqOu}pG1ui&h10!@7V}|1<0dd2%u~ZlO)e>!}Fc7Ed?LO0Kj+pZkIVm zBK#KWzddt^XSnuYMC`~qF^r=RM{QM&fpXeC1a0?5<#)r_efLh?u((@LHyfP5bNfC< z!5m_9hD{j}-{_5q)WpC^c9Q^M4mb^>qY3&sicU9tqG513+)3UBGM71$W%A8rwDSfN zmf1XT-!w68vS%vy*45}%_$g;#wdWx&gr91lO32${%kWs)py2x}3J>;-b;Gd&N)qJR zl8PZ5E*nIpY;C88e-)9*ja}NQhGoB~laGrrHA%5xTHxW%b2NyXCY;5eQby;O(9#k< zaYtU)>cp*j^gAeZlHOnrpLuOxgjtKx*rfy!iPp;YvN2ljV&h!4i-1$`s?pkAr+Z1e zN?!xRbrb-`r{lv20F%D#(3fhMHey1kos|eNz#1_kImpXk(C>(*s#SHO%t`2taS3gnG}` z;wpB~bZ)bD9kwHDC7HxP>z?x;<z?W@}cuP zjDn5Qx5w=+@{ahKN2AlZ`GYyIe5}L;|ybFGG_G3T5*ms>?X}5pso}TYgJDux zu_mgnVo#t84OLaqeDl3;R8>(2L#H?R7c~96q2Q`0JZ3IYAe%`aTFNZO!L3|BvW=<3 zCO%j3DP|hR2yhFGa~4Z@Jz+MHu%g%o9nt~Iz&;0A;u{sKdQnx4log(Kgqikd7MWG3 z7HEELrSL}8z?SUe3ltDP3~oEjV4%IdbyCM`c5kg#Z>)<_LL0Sp_!EJ2>>j>Q!p8z~ zr)LIcN7!?GV~_K{U^ZWy{-Co+CBf=k*;fEP zFk&{42d*7THp{uTJ=Yn8N0M0F0QHc%Ne-V=-l7c}22Wq0t@O5Y(mwv>aIeh{$Gz?F{mc6}|6Oa=YVrL4#^z>O|L?x)|D~q?f4A`6)XD$fO`rS!UGCI>B)D+mKQ@|0 z+W&Vm$ol_oc1i!=%_QglyRj+%BrUqe+S;%`0;}}ZB0Cv|O0qL>dm}s^Rz0&FcEYHO z$B@m_L*mTx63aV!iMi$Do-iCzCqS;9r$AX`|lTw z?~VT&j?O@m!ms!j9Yqc^H+>5{!O@TvDL@3|^GWkHJbC~!{|r1Qb|hhFIS4AC$QkZ2 z0vG_oavABMwud>wl=ets%;>upv?a+5exAk-&*^W31s`1CnIul-(TCIa4nMRC^fEby z07S(C>-^lJ5+nWFRZNR?Kr{IK1Afe#;8MXPs&qixiKcVQlNr=Q6?E)bcA9G*cAj-a zJ8s{vFW}jC81J6d?PFFgJDN(IH(GgHGqyu@nK;=|t5Fz9tK1cDpV+A`5P0bd)_|n}iqL;j)iycu!J~?{Z#ayR?X|i<>FEHU9jc@{wT6I|Lj0aB0kNVFiZ@ z`D|V8@ahjAVR72N^#gnQW9rPp{9N-z(={p4l~)3zu{_*gr6WLAzZZ^y%)6m&Guod7 znh{*ICs~Z_F~lDkp2HrH4dWU935?1e*MAz$sNY}B$IFqPM*zS8l)hh5|6|Z-edJ)B zYn>Hto$ML!tHm1v zL|$X--G?`C4v*e+PLFr@+MTy;JXf_WoN@*gI?4)(5{%`Sv6d$vcaO$2^kGO3d&!o& z??1k4@8`kVVFj-=FxtPgj}K3O6F__mR*@at${zMHU-#5K;V<5sLvYKD&sWy1@NIq% zog6GDhP*{v#5=}v`}p|7@iOui2pDkdmq8>PVeTA0LcbIq9UdKgpubV*sec2$GuOA^ z(SG~&C)TECosBLcPkeBIZ}%r-vY3|UHFvcDP#FoDLnJ6q1PJ)3 z0+WkTAmp}OPBY`ayM?f5WEKm+r;c@#%?A{O!ZMI)oKVJ-9!WeYBaQ?UEsBZm#DhtK zQS5W0lEo}5JPsKtADY#mswJheLdhhCg{FE$;d&+yvmW+strT+3Q8@xeB&Rnt2rgc|{9F z7@3Geq!9vS${wOiaN_sha0b84vca3?V4CLJBHfIKt}x8 zb+2|{mBT>na1+(DPyp_L6vuyKc~HQNm{Dq(&X1u!QGf8{1@qu^LtR6Hm&(JTOJV$_^pjT&*O*C8ehTj>KAKcq~x-pcEulP*>+l zqUQ!j{5fIz{tm4A2k)xC{(q7UIjgDg6W`o1gB9E3WL5D$cvQst8dO%Q^zN{C_s7d| zR0*>hiP8XKCiQqI(!>TpnhvGW$XuUSuU;vhP?bX)k5w_s^=Oku`R5bj+X@3!r4Lqq zH-7pFP2+>zPw!5blX!a;owelXm$4rmySM!N*e{t=agM#p@ih^X8>)_gyU5>ns|(sc z?pDO_ih7Hk$ckR9#>z9rS1)Z2F?nY7!UL$TI3|Fr@7B1136EP!)j~?0`&YtDnUiwo zi!Mad54AC+wKC%<#a>BTOp3l#moe&0vWnvSVU>lHg}Y?-OiUZMG6~k!<%6S)Y1b`LCr&0ve zB?HR^xzNQLI~0wT+ESU?vk%K7IkZ*fJ>$D8>-NCzTiTELyU2%_pP%(HzGn@Fawk~x z`7p}9kF5NJEpz%+z8Tuh|DRTFtOZQ7wtQExv z0kMILOsv-BPY%V6=`cKFiOAYjd_`XRL|oJX{@`l~uB*Yy=p4G4-Kgu(O2x2(bmMN2NRdMQ5}L1h{|ZGK1?A%r#97DsB1 ziJnTTTrW4Xr_KM+OM%G}KqkolXqNlGW&TI`bHDi?`ZYg&0?3&B@2zGc|GNbyK)L?Q z{EssK<4NX!m|txdyxqTyUHnDV4++x*==E~A8~6x~PZoff$n;e1*%KH}2*D@3b&uRO z@=}2<#e1=thh>gE$L!NJ^1vGJ`TOn-mX%lxuN<1XgqhS3+AoSoQQi9i(175cxGL~mBZm^LRN87ypnWj93gDGY10$ZP5G zEdQ#pJo48p(+_IPD-qf*!fV_3kuMr9ANV?`EU!lcfE>pw(d;w-x7xRy3y>#kM(y{o zP8@m5?1QK`j~N%jqsNF0>%Z;O=+MD^{*8?23&)?HSC-l7{;=w~+VvRA?JTdd6c65y z$d+aT?k6WK$inhM;;r?ufQ6#||0TOS(x2|kR{{Os+)DWWjaIWf|9ijZzm8eSs#PN) zuDME)>0iX*bbH80)5Cln{vAGEqmuJ$LwZrEvt&zk?rS9-l5Y%;;R1~?<*6%u&>46Mjg=TiRrutrNU!Kc5O6`DML5gK8 zXiP9*E{km_SL{-4N><44dseQJUam?5=nwbm4%UY z;lEE(u7~E8a`7r?HOmAqu^qVGOLJB5uK*~o*71#Nn@F$XwZ56bHr-{ykx}Aj3q^`R zGDpRb1#mEk9~wz$HquSJ;-I1F+=4Mx0h4=23Ly`}`GQv?$GG70A77@@eU3GNKf$0& z8AU~MDkPS65~8arKl%LoO6L10?aw{_7g_-mp81+8{#R>lHtMDRFXMmZ&wa-K!Zkl5 zyFcIguZ>1?Grs=o^?GUlm+`+c{`XYRe--d1|5B@5vYLXc3yJE4nnxY=0y25Rs=96i zWnZUrR~IOo_L$Z16G1h0+9u2fl8+_oc-6m-#UfyCK3_O;fKHQyFA?d^>LQ9Hd6a<6 zbAK?bDe`PSdSJ`qUCqlZ+8Lf{3hn&1G~j=x2p@hNPSslYdQCZ0r8*9gOs<)G4?M(Z z`F-07)?h*55?ym(z}M(-knvxbP33nzdl;;-uhtzG&z`|@wu3cR0XXzQaB|1slt*G> zDTgdnnsHcx4=mPiJY`iEG5=~GW(gBr-NTa)JneKv=Htr|I~FxwW6Ol6I7U#U)bNDH zvDKqAj)aBzsSI_tDu3~=uBsyx=0&FAtkPAK7^R4ZSa)DduN?O#JQ0!&g5nH3bc-=r zfMAGtILQCD8nYDxL5?8v+g_!6g$Z|$1OXygSqbY5rxF*t^DxYx&5~1M*ww6VS+sfw zf3M0cIQ2cR56eE`f2d!Dw^8mWo&TwdkB?#iaeYL;!YAxHqzFj$&deBC{wfOkuIQ*$ zqc>Dy*VuKJm~g!u3vBZP9ZoOL8j7u+YIb$ow6`yHkkm4);hNTcsZ?3zRO`OdREkaN z9^NY++mC^WoUJPZsbwIw45U6#AT=|9`UI??g%yzxKP5zwL(S~Jtl;iWB(y6JiHYGA z$<+K{gfgzth&00e2klg+8?Y-YO5QY8U60ROs;NM=v&YAf7xD*@sh>ii;}=9*bzlxF z6)M~wIWZ^98fLuz%EY3u;X?(?8iq=rsnM0HKRRQ~Q`uNGHdpA_fW{e6RR2%oL2a%m z--C4!`8>1(Vo+Y`yC4oK@!_CGT>CRD00CG*8J86DVBvbZL1lyWk>v=K<;{!i|C9GT zyUqXc@&C<@R$~8uqqR}S|L!IJ7e50Qs#L()V{=0#gxX{1l#2Y-FZ>t|7_*YIQTzy{nxe{ ziTHo5)hO#fmht~G{{O_{{~B#_@9JbOp?d}R7^T9{Yt#xE`!U6`@ZgF?lmCHf$QK?F zp#DC2CP?x8kFBkGt(5;|{zv(9|NdXP9GuiC9Ap30@Lg>E!=L5)e-QsK8BzAEp*tM) z&48cBx#+uRWV>#EIYtyrF#PRI+=jHGc@8wlvSzh7I{(|v1IDGTzco)Y6D_+L4Sbeg< z!JH4h1*Mc^wYskQ4Y*spP`X4#U81aXksR3~@f?i&o)k-=NaoM+^3qzCs=`3DK^9ah z>SHC>LZlhWm+(t}gnTn(#h zDUnnZzRmdTnn~}MqJ(>NsKe5d3B<7}A#{|7!LxfQZFE^y-c2;%h}AaB@#>_H*E`Pi ziq+(v_{cq`jFe>jZ~XR5(Kuk1{nx5*)SAiqZ(Cbs{O?|V_<@toV1sQYEz+c)jn2RL z>jT@d2WEfqrT)%N@#V)*tuC^=DF)$ksg8!o`7-%h!lGg~=a}|=3c8ISabS{$RzCiq z+O-T4E8NaQJ;)N4QIC%70Mz8-5HNvOyftpDGanu;R*m-n%^vny10PhZBOqRy*US|1 z5o}-w@X-?cm$K)1Id@p*R8|?E%U~9#4zr=j+5(k|CT&RB(DcDju7<7QS%*CXg~bcu zYw|av{XNIhz(@*q8awaH!a3?#@b2?6_VH1wh9GGK&~gS_!+}3Sn{*%si6Hq^qkT~| zJ}<&R(gOmysEn_GD25qc1(zOLmRQ|*@psM8(UAIL06+gOhY)*8$@A1YKEJl_iVI32 zgDG?GlaqoF!7NF_W4+0MD)RJGU{dZiyHm(i(|{3)$xxh|c7NnqF|h3VCduC&{FT)Q ziWWjZWoH~J7s4=~K*3DO@*d}{j3uO?_$$&2b}b1|%+6g1Le;Y;vCb!Wl99uYo-l4% z#Frzl&xk}fkK)Cm_z?~Zu-pF8i2&Aj-K)`XG0G~j11|AN*d;>_X;%_y`PaV4$$6!vH3;oB-`@cG=Z={OA1ap!6%o8LH%nrt71d z$O)00xkPijGJ~4#G#Bt_vpQm_DUJn8t;DZ7GMvmVNq403)(uIveTXKveOFl2F6wv4f5Zi)#!d zd99u8lLd*_B(X3W*<>->$-Nq5GO=S8QZFZ^G2Ki-=gGkU93hk8;WRpLW%olwk@JW< znTI#WuKdi#&qg1oDvcYMa!Wa{7BO0$zShv$0ODAimizJ=0}HgY;e9Zot0T=W2E}1U zSxnayuSowh#_8Kvma$m>`gL)Y9oa(|l&uF1)X({c8yky}^aaVY;vm)uHKK!ie<`My z3QHkP_6gpyP}P{x+m$S@!1U9B(&s@r>W3h z85^s5oVCCI9dJb?NMtzAtl$Q(t*LEnPz0>Dy{$)wfL`HeDTwMh5!E@OdK#iSA*!b$ zYUD)J;D{P&h#G{bk&3996H${RYNjD-5~5}*qE=2sEsm&_hNwk|TB(R|`zMA7qom_` z4I9$rbI6~Lj@x@5-W(nNKVrVMn$&K|+JKpB2$iPyK<}bRDGVUjJc${xbUnCa(tbhY7PoZkU|u%J@*RO?Hyht zE331FXN&cHq&C>Z*VuOyTOk8j8pL=@Eim1s)xBc&w`%uCka2x`mCNc*M-_84GSLYy zV^(OnB^7feW(A!1o$i&u|F}7wV zw&sknwKB1_a$*y=w4x8*S6E+1w`-`K|~;pfBsk{ z#m`NP65td5&_|5B^N>2*{5uI;54Se}6$Z_jkAviaxUoT00>MPZ z`90u%;EMYZnP(v6Q`Nw>;`0m4R{3FY+c_J-GzH`)t&>DuvwLf`dSku5QE#qo)Zl;X z@F#-l*gbp^b>IZ}4&`zAtP3e#5@|AD8_iUCjtO>8C0*4}IO;+zri2R$v1Vc`=mYT_ zIJY(nZ}7_?T+SvmCG6sMVv$ug&^8O$W3Gh&ByX$4ODvEc764B@7OV2uA{#^-`1RYtRMz^cudXyC8GH&4mCDySzGW20FY1P3;AH1HZ zjiT_zd-JP305{GYkm5um05^ev4k{Xg%Z?nvu-Xh#i1}uCZSIh>%&LGU`rn|P+yN|M z+qb%|)AOUuLLEUw?kMQ6&+>)w1i4Bu5qHqoJ&{<7&16fC)Jo4K2QrX1xmp6wzyI|= z;!cQ;aGF8k{QF=38zppLe(iXaN0F02l_4UdcxJ(WEjFVVP+}8|7PM3nVK1%V((M8L zU3sE$C)|eRsd>X;;8lCp^*X>?AC87Ym=UVO1{N@41$2VDtHvqV&tu^A@Q!2`rnEY6 z|AZ+qDdW#_);^uALrZ`CSLw$ZZiA6e_8h+;H!K*%V4(+qH`JJY`yAKg$m>U_f-W&77ixN0LN1nGS7=dvv^-i@ z^e4|YQhXD}-JuaewzU)B1<=xw;OQ~4+nb4n69$;keCo)Qk|L|eI0+SOa-@Mtmk)Li z-yI&kStf%)hMRBf9%wRBs4~P9g6d3UIdvp0T3d>FXCGZ~IxumRq#ZMCNHEH!!xQkX zEq2*37nP}Ts>$S~;<&*8z3qHB-ftg|k6wvQRf=Cx7sByN0TT&Z9ULB?oOX@?_5l`E zG8Uc1gyF3A7u$(8uZ)@mbi8}C|KUBrIfjV^wZ+yY-vZIY;Z0r{_2Ti3vx&wyCGIh) zf}1UIu{gnkM;h|hwdJ>~z6<-TL zlp)Nv;#j&hcVk5C0<7A_xOiU#r9GU~+_;>omg^tKG^!L=AX|&3C=rMJ3 ztfbuW6fZ>-^o(`Gu>wrEA^#qeA@WKAU63j}lR;5EJib85q+rf3>NL+{G$@cOAv9Cj zi9ctj^NbUB?jb7PsfKL1e3n%;8#fy5&u^0uOt;yO5#@KWiaS>c(WwX6J?UZ zSTNTH5^!Rd8$QqHlrJmH8}e-D(CNCK2Qx2cco~mz1SG>xng-0eROcB#`yRIk+L&2$tU`) zGPddVo)v-@Vbn=ILj0 zYk8bSAG-`9agze&@|}w`R9Wr*r=64p)dY`Zl+6DrktmndoY@`Z-}n(2x=rRR5%|ex zs-p)I#2a9Cm#ysLgZvpW4K0p|Sb3ovI@x!B; z5z(hPI-3^bQ<@wba}ka1oY?uC7Hh}2GVj+-&8^! zA-`CqgWQ$}OxYQ1RDY#ER@6TjX25_DY==Z3zCC7Fv`tws=@A@4)ywq zii!a`*ZTtT&jMy+Ybag`Z&Bg5VAI7SKOBPA4=fD1O5UNPI6tKqkS}mnDR#2wC%Flf z0ao%?9wG$yDE8Be}9AU8WTz2pq#)8g-+ z7ga8WzZvXMppH3^7?HD~yzbNs;}!Ux)f&m6g(eVSIKYju1DrL1W9SO8G&NX~a8+nO zR?ff;hF%=1U{j3fkC=yN_J248J}ph((lRJb-=yi=X=&DAr&gN3C6kxtZ)yIP=5Lny zyO}0C=WYORO@O&HfeV?yFLDg=ER5i7EuL{^u!s%Ar!njI?&Y|cx1@1=^jm&=k8yB` zG-pIS-XJ|TF25`gCC{zKim0$mYoh3iEV3GNuEbocFx7I%x8S0B;Xa1B@^r^}>B$nG z(Ed+~^0W8bcdF zNB3bKTBDf@SE)A=dZU%o_e#?oX?K9;?s((X}HskenEkY0tXE-im$8(`&J&tk5%{z$ffOr7uXvNAHwSz`5R+^|6x@g?v>7pWBemE*L`v2`Dwe2X`6gF+ zrCjFaGJjsne5qvWlBu5+Qzs&O_rlSI4}U0{MMmkS&x(71wNoh<&l6lcOOHh6Ri6L6 zEj{~AYPspz^>ECA6rD7G$b%{c=}FJtduHn~rxu-1sE#?@GG`cIw z>`eYRP(2rwPDN=KJ#kMtZ?^5`nC+`XXg&9)RYt@=d#kF9$d>}B6hLJ}zKqD1%e-9X zWkkMY>XNCy>4<#x>BcfDUoN0BDqlwB%c%U5iORnyD$nO0m*1WtMP+1uW|8^Y#uW21 ztKfXCR)~n)@%dUk7u+&LUwRqebcnvz7<=eoOq4!()IbxQPdi``t6rXVv>^7`+z%DR z@MRt+(0&^~ND%v|z!3uXYMf{hRpB3?65S&>&p5-faK(qZQjYbbs806u#wINnGQwff zK8eYX4*$DQ?W0=8Zfp#Gu6@{4A(_1cTMD#Npp^pcISRB+n$I;yp_XmFW{S0_;hKMP7R)WgR>~ zsi~4Pp8#i$sm_p}J2TZzj49J}Q1Uv_G|iLza_;&ji852mqn(qY`lM`eO;z|$l_ zcu{4V00=*r`??P?WiI#FSMgOIzJ5q^an3p~$5IW4A=e7kjQl;DG50iLW0qOUs6|(o zGFYjLDtRAj>hel{I{$^1#F@S1(!NhDzT}4mmLXlCTqKn`cLR}1ox8!v0W!On=2<^q z7C6%a^{-zGeBCJYb+gddt(;%GL$sTd+otT|X}sq=Up(jvhIU{FIif=U7+KzJ$G7^x zU$At|em@5WymQ?Q;G?rqVCCEUCZb%gN6Scey|jF`cWHI6Ebjvwiw-{e;PtXPLBMf~ z+#Lm-f!*)hevYmW%K0?MsCU*DK^&^d=85@VHPoQ9Uicsy-h@#phb<^Ey)Zn?N{ zz7xINUjK1HgDIuyqy|(njVaIm`~b@rQjq6g5Kp%smaah z6L9#9I6H&0e0St^t(;;yFg=u``93zC?j@RFprvzseHje;9S~D^L3_Ttpp>y5H za;0>VODDN>l1nG~u{g;~Pb_R#w6G_iNIbh z!PdtM!5snwcbDL}cX#*TY~0-?xVuB};O_3uMmFrr`ObN`FSqX0)T-&OnwOqg zJ+r#k`u!ukUo5?fjZS8=H;Ggz*ppV&DmYi#4ywCYarmq6bdj5>_VFGmyPqotw8vg_ zvu$B0|9*Ey?n;q6qJ%#DQM(DKOjbH(JJS`<=}keYC~3c7QzKpuHee$r60~{@`gulE ze76UZomSrSgZf%~7aP@8;x+y{9s=|o^F*dBUR0FDG(~`o6^tQDTs-19cA__sl~73? z^CRDo@SUs@raKb;No)M>a7^7ys>T~3IUz{58K_K`YTw75?AxHq^x{00Ce!l(l9>tk z$n9-;Iyn}rW-U!6{ayr7^1x68VTQG%Bo1laJQljMtBb|9Mu`V5s%QgVq>2!wd8HkJ;05#SS`c*w_x)nw7`=R=UP`F|q1rcex*72li=y#HrNh!1h&7yl_I&)vM`5 zi|BhL_dIlfmPRp__hDq=o#^a5uac?*cA^>3Exx>m_q!I*%fGxwEpV-&PxAC@@>;zs z!uS`8!$jsZ-}ZwE+CI$KFU4k<$yDOfFB-7Wn z6uw+x;`oooD-+5TCF0)&qZ$?@wX6@6((tW{%?f0-ZHs3Kp>A$d39L@I*`09+oo0Fh zTh{uytlY$}^qB(XUAp^DwDP?KCQgFq5D-hA;rk7FX$u*Aaigeos`0sVi4?uPEb5fr zQ$946z=kGJs^qBakVd0h#5&XyOkh*~{%E}!b_b2voG~-rTI*on1-J>ZZUPU1Csyg$ z!cS4~o%s1y`Y8Gm#>^B(?eWC(6la!uxL?sklHSN7jiv(DYjd^C{`p1XDvmO*dc$bG z<(89&Lyf$@IDFPi?~-G)sP-dO^8EL2LWmH@yNo^8D1L}l<{#b6G)@$y5<8t@r2WST z+W^{0`ou<9V0QQwYoWF!#9GHMvNe;vIrQqtZl()xtD zt#WIfJ2~6X^dMU}ygl2|+}K+gJ!0wjTMnJ#rsA~bV9RtAsH+2?NZIvoOUwSvYGfQ=<-LIYqz+JX2&u3m^gf*iNADoy7)T# z`(>N@cuT9yi~cxJxkq?63d@S7pSV88!92+~K)HvLW?PQt*y6As;Z_J!mmenFHW4ld#Ozog@7pzRpD?^w~Emn1>Gq=&C;VY-s z)iN7PZmjczdC?+n%vx--mg&Q|PG zSGL>D99}Xos+nCSV{h4*2bsV$QVr>xxr^^pTgUcKEzX2gnQ6P786-fzj2@jZs0WkS z?b`&;>M4G+zk;k^R7Q3%Z-`|Sg?_Fu7CzAZpg~@z$;V!u`%bwsB7MobL{HqRz-=dy z>lAeC1R01Bb~z*w5hcA~B?yY)6fp1X&?TA)a4XJ5%-lt^n*4PQ(4xS^`;u9bV2&4B z-N?OZk~gIX7`-v8w76__swQ|Vk6=qNLuVvW&$K}OL$HjAQ|MY_GZr`n{~MxfA_4Qj z@e#px3&6_wWpbNt;bf!fEsOxgh!Byx5O65gC`Ch67qWq4fnEpF7!Tb!9f-W8+9S6_ z)D!#KLhncvX?xFe1+i-se}%noDV#!XoS!gX;v-1tq6iJy-2B#F12L=WNT)piTfKgr z1SR`R?A6HaZ^Dv3_RhvO11b~~ZCv4GA)HhbuN#Ms6{p%eMoh?KND7Xm22~|>`o3So z)Gzh}yaE*Oa@gLWn8@M?1EpBS@`QizVfe9x{}MN4?*HT&wAV}8eAXWYf5#8g;XrD& z#I{UOud7$g860>-rK$1ZFe7N zmgWE3g%t1JyYkfxrm|UH3H_oUDdezTjctew(`$SLCVI6;yD72Q9&Y*B8J8Wjm)XEZIQzoZapbUCiO#H!*`+Q3}#(D zG0SPUuWb6la$Wuv8;|oc3DR`p(yYo+2|Obu&PK^dMY_0N%B$CIYFOQrK3(BKR@asC zp}nifJ1&tvg;_(yo+;|%X0I`6r*jm^11SzJ{%Jj9ab?asjn{7Cyg{cAa)N*SdtyHDm$X=)KVkRU7*XBOF5Ms(#eX1{T0XSCZ@KeUAL1Bj;W-+e9D87x?_;X zdEPImKB2pErc9$s8LuIM$vM-)e#GvOSG!eag#8lx*23f)D8uyk@U}&Og=g-;g|^G< zhwLvedA??yniS{#qK#)-ZlUp5z$s8S?WiMC+pBB9bj)+1DZ$!Wt|s%VwTV+tiyxi8 z%x#vt+CDdPK-!fEnHuq81S1|GmN2nAi#@g6rAviP3bX`@%)2j19uw+Lx5_JRTXZh* zeAPPro#Ot(3NG1xMfPqcRoY28DoHszd9OI;OyItJ`atW4wuoxAp$e?0w3IHa=QzX+ zH^EMY!=ysnmc^ek{my0o4Ud&F{X7j|X(R-l7!*NcDRZ~4_UV2~s+g5lve1@5)b!L1 z$oMb_m4!(V`6#>sOoe@Lpk-w{!hx@31EA%r<>VZ9rSc&8qg;%o={FbKhx|qk=RY-N zmJ(UZq{CKfC0&%itrVlet95rX$*e>X<@Oe4EdT3`$!h&wlNag<4mq6uCMCy{;P=&r z3mi$1_xc6cait;%9wkt+_e9YC5JpzoVBBV79C1K;y&>3+bvcvrq$HPtp?H zcNy0q?c~Fsi+K&dB%W2&PiWDi(>}9^@AA$1I*~ooAg>z)EVYQ6umu0}9?e|LHTG8D z<$G~6Q*Q;fOMeXH)a8~-0v<4+OCbbOb!fQa_(`jK6}exBmRS@8K+P2x@?IgR zK~CBFU9o2kdy4@Gx$s>`xup!(*es{fefUDs;!I9?{P!_Z$jbuptLfBBI-bym;9#b| zn9(?Cj5A(Iqz->N;?V!w5eX1Frs{*4$U;~2Ob~(63BccisP~F5+g_J!QcFverX`9> zk_V-^?d8egOyeRrhXv7h|HQmb3I$x1h&yQ6^Cl*b+3wr_+xqW(r$XG3zFiPq(y%i) zA1SChz9aHKZ`{>^7h)8=RkTrObJ!nV5sc8~)|N<+PwCT%((7KSPId;?|J^JR;Hy)X zAF-u2so>Gk$lX$8!c#~zS0-O?R3djOfSY-?&OF}~Vn0wJj6E9ZlAt(G4OcyUp1qS4 zp36(p9iRO(Rb`O0ppn~~qT>~3ewBDD>mx>}ore-my=vstz?pWUHQRJ)Zt_hqGxRAt z*&1jtQ6(^;7w?QyyaAKZ4{Pg{a=c&siHmo^KP+zV?dj@o#Ogal$^AUHZ%}flmL|>4 z{PZ_gH@eX7uHSm5kCtM5IHx#shF#{QJ^nPoO55bSj+!SXx2XQl)v##HT#qv(JW9uq z@m=Kn@J{H=oIVYd;I?zVg-`C@qmYSEb*#_Tm|u8+cJqsyW2R*M)3K*8|cGj$ebkR~Evh1b03J{L`X9idC7K$j72DiG0P zGe_4>BbHzW^(0;W{}nSpsFK;PLxzq0CuZO;c^q>O#_7zp_)_;7GQ@{kU^XWL;D7IZ z`ZL(?ZkLvje!l%XG^t~SSHTBV@c)7a$f))I1PwofVEXWT298Y; zWl=OrZ;IWK3uC-t@9-UoD^Cz-_9Zm^T2{f3ZSPXCre*4;VaK>rlV*8r5u`|p26(j+ z?!pkx`gm`BNk1MSYY*_WTyG>~1qPV4WzvywgS#EHL|CQDgug`1JLW>KoDde09ern0ysS0ne%{@$BoiBufWB2?*C)a7`kO)D zP7*}NLz#~mh+thrLi4R&`el@a%7*TBkNNpgcsy_Pjh*8YyaQPBtL>C;HZ)=dE`{e3 zw4KkL+S_6r}MZNNK2?ul$ZnuNaXc0wrSF`jwO~K zw{vcAgFSY9dJ}E+AujD>s`+u5q+efa{2}&X#~q!3Lp%an9QxO}gt>pn z;|)H`Lq2X!7oOdK&z``OhdMuFUmmU}A;L?NTw;Ho;9k_2&7$p?)^Lfps^2gsu%17z zyjP$|=SOavyg58+QnAT)H_RwsM5=7^*7Z&@U0A>TG}LV)9Uxj*5t$%Z5t^<-gMLCs zPD#t(_wjEqSPTn$yhfRTTV~M=L7j{D>+OMX&8PP~{vylK8#62f>UdV}g7C=^rm1(~ z;sfv1qS=lTr~5rimw!ESj!+O{YlrEuuV43&=sx=oc1cX7h!4MTQyFDA?F+PIW0wo2 zr>s8RFKPSF3NNKaKZopJ;dS5IcNn|!A&xUNQ|+_#V17ZyIw0G}5}Z$lOGK;f3;t*b z_gm`Y?kFAH(aT)6J@JE<=JpNLPvQ1cJ#Bo1@qY`i`(nVB8DmfY$5YE<(B}CoO4GG# zT&GeaHhu&(mhnSls4(W?(RbmRKoZ^^m;b794BmLZuM<_4#8SL`98!7PDJ8d``$pm~ z7>ZQ@dbAe*GP?5C3*&b@F?!$US~Z>kYu62V+e3V~T}Lo2m*vGcmX@0oGVv3@*UlOz zPifu5i3oY}2a)(`)@a$6f*`q+&|&X*L?xbEZBN`8NJ(?UjdY2_FXq*M@6HIe!O2z8J>jS=kNRh)sKs1F!51wx!76edZFRCZgbjuafd5$hO1Y zL?!~_upUu(DvWy*pM}Rm1xI~>gYDR^%u4j1(zY6xBsnaKe#_nXC^%FSqQ6XUS+`*@ zj^=m9vznp3^NgBuh$DQ`73ce+9NG$R`5IIC*%8@y@%&~DH4!9cHOC2Gh!YywL~FeZVy|_j zAAqhDK-b_4rG(H_O{=#Tv-kg39Sbkpggw%S+4^h9sC&@g<(QoSx|23IT6T$C%s+TG zH0|*KD$A>WMlZ@b?^k&4WH*rU}%XAbK^0k_41M#%KTgaK>b*dQ3~VaDSxUb7d4HYoFd z1w>T3$lqt4iyaJtYW2ad*o?NWwnU*px*m}K%gN$t<})G7K*nr1w1-aom3|VR7@cGT z;X#$g5dY5cFX`Z1^8UXWSP3fMsgcTw;B;e#|3AnSJ@w`nI>*%b9~@s}$oh=0^?!{L za?dGkb*pOD#>A=-^{j1!Q9a3($=UoZ)E!NNRBP>Q^9LOkT3X%8(I*)|lF`Mvm{K_u z73T>H2vUMDQWP|auo83sD6G&E#Ss(DMVEJth7~DhWgT~EKC&2!{bQNQ)^1h8wMXCmNsWbN$4dLN&rq1 zjN#RIA}(s4*M!_C82AZxrQ6m8&7Bn5U@2G%H`cCf;_ znmGTPV$IJ=3bBuc+{`58V62w?*XDd5qK>1qq#aYU=GZQWSB|2Brvl~Dt~;RWz%r48 zd2}}%W}&BefhCJg6-*iohqYji7kr|lH@tK>Wov8Kf);}pfh?OI>uj&{o*Ppw-4cg3rQ}=EnLVl=CiSI8NlhsL zv=y%#{dPPLyhip%pVaUc(M#r#Qk^(r8%^nQrmX)-pnr=I9%E;R8w&3od2oMMVv)lP zCKlgbJpYwg0qOb~CJu%Sd&|BMb-_&k(q3 zMnq0TnrO?xWLl)j3NniXHCUO4_Ma8zf6&{*7VG`S2-mdlUs^+;+s8++O7%(AJcY-; zuPgKz^A#T}$1Brfni{|!Zi8P*Hv1<7z~=!}1qloacbMf3KTWazkGFC3l}MJW*-}B~ zd*7QSOqxAf`E?vRqShwAfK9kX97=eQ#--NsIfRWL4?e097h^4-Xf!VC7yAAwwS6oV z=f-?U(yHqLQ+2pc@&*-kNzs4E8%b`K$F*SVoa*bG>>V&a4PgyQoa$aB&ZT{vvHLu- z(>uM!c*1!g@66`)Cn?<%Ey>*1+WOuQytB`WR_8hM zy9ub6&VP7D$b|S`O{MrDB}InaJZF@9P0_e9&x5Z;EB zd#ur7>xLPMr~?VFi7x{@(OBY)zWscu!yauNabxie(GV95_ye*nyhS!Sv4s4~@_IHf zKFz_N%-vU$7wGBh!uG4ud&fFkjVf$rJ;u?+(t1ZvY=qiVybZVRw5S8Ka0dG_Cx+h( zOLKQ>%#zZ58izcWu69_&jqc*Z+4>=SbMF~iK>-kWt4Sziv47e>L%CAXtXkG7yuA6{5=Gsg z@J~g_4ZO%CK##&PtQ9KOJvv+@;q(UYw`n$#-=ZL?A*kY)FdXCz3-?cim_?tD zRF&+_Hd(I15f|wlAz&0)5Jw%7-!>Ri@a}uYC1y8=l+Dd`JIjFm_Gn+62=WjUxAGvb zxPxdR2P^uV=iyd}gCmrBgZ$n{NrpjhF`J%~3j64zJP(WnN!;3i;(;F)_4ZY#hYQE% z$UHZD7Splf0q2wB-%>WOk$Dv{!isOiS*2b{eY3?G{(VIEr4Wi6jhyKr<*Qkd`w8+^ z!f_HT%!6z+Wuw&;+D6RB;Yp3|1Cs|xHgV}eCHtCAWK$UX$g*=Lhd0>5??t#Mf+m}e ze;^dh6cvf@_wLt_GGntQC*6ky4hg=v2L5|M@w3w5%rrQmH7wO){K#&0v&|00z9QG5 zXw$$;Z5WK>KWg^-nZ^H{!4f?%5_tf#s@XEMiRM(S#D!g^Ht;R78lFDE!Z1=GM4mlz z=@UdEvZYN|gyTSrpjhRXOu4rkY>6xNy#WW#vrty9&1S+*9DyVCO|}GhC$X4@y@bNs z;&S4uHxr_jcHd#ULS7r>g8G|(${u2iP#C80iVApf@6u!~Oq#d7;%P3RIIjeC$XI;5 z#Z&d$t)K2o)x1$X_kE1>b(#k2->d5wq&Z9hz6Kor*!&4^qYU% z30Wy~M_5s+3Vs6os$c2HO;+}GcoOorH{A9VuTA}uW$O;Z?yT!%WaxyM%6%+(EJiSj zbg^2m8bwCioI(7-efY?3yAIY(>`vW_SQ3g6&Q!+WNTo0DevKZ=IpUr)k?3=vh%((_ zdJgK&ScOMlTq$576>CRZu^;*>_QJ1YKOi+iS{_d#f|1GQo8~ErIqsOf?;%wEJ+pti|Y0(POz0q!Ef^&wM_vD231iCY!7g^4SAKIQ!0w*R6V;-b7;(fqeX@g0F zXcD&UzY{s~iMBTd|9{9GaM0^GvaCgX@XABO3=39VM{SQjY2OEv^{s|vS^HB^80e~< zZ^~N))Wp-JAc;VF5sW=CzsBzCqd28W_dXkB~Bo%h9n2XKW=x!SU5_+!GAwvO}+3En=w=syGz z^VQVn_Jj?(za(l5bXXvJyFuSCmupxPFsN}s&YClH^=W-ACshCPJ-WNZXhpZ8(0cA? z#3wLN#c0qi_5!aUTuvQ7?$vxH`W*Zz03v^ro?yk1M1cttA1lc+iOVt7K^$u-1dCvm zknHs@1)*FVPa&uQpW+WpHl&I(jIa77@K29mxv1r?%{BF(C(qW7Iu^0v(Um!_=kZ(3 za}C&^q2PgMem$gTk)U_XfGTpViO?;_@i+A!UvIES9lDeyQ2SVH)jW~vo=HTOxj&d4 zZj=jR(8wU>Wf-2mw|%RFXF&Wz5)aKQgRE(&4?+5Yofm|y6rm{k>!ye#05og)hgJ=F zafPtf&Tm>stR?V~sH)u?R|qAan2my9lI z2mygSGBG?`9G~}bicb7@WYL-9fq}ZQNOE|&IldC9D>Vs)Sd$!^Q#D874^cUJRa#gY zGAs7j;-wJ|%7lNuC20U%e^zaceFnCqlTH{ZTBQzC+v@lTD||4BMrZFvBJ=@%)x(G* z24x{daA>j_JyjfZ7bo?SrHsl=rbkh#Vkxlt5s7_Mx`7T+;W=Q=_^OHji&cjKQAFtp z;*|4Vso4QjU3*fVVoIsm?=?;2na-LBWLnN~C&tGTo)R?-JK*_PbQ0SfOdEDv#tKe+ zS5ysfR^20^9FfqDm-<`KvOJhlo1~ZlSqT}*jGmi1Wn%l)Dlt8Re@y?@c#`mkv^$6)yka`D#YjTR|$*cI8HID5NV5 z$W_-mc#fKTjhc&ErPk6wa%JIlWw}-b6+?yr{s|r;i^MOATLCZ}I0Kn2bc_UM-5ha; zluoy>CzRLJQLc@19SP2TWP2nUv4bRLTIa|Z^m!U7_)80O&!;pyuPNoOsL{GO1r&_% zIrenNjS~B?x%4av8^gm7V${9r#J{pM)oiEcBFK!<0-~637ZQv)i`O~5owB6c2m1Mf zGPmLyEtG|*m!m&0Ef%h89b0D52ZHqyozq)4BhhNr??Wu7;&LUMW_hIlxaYGVkwbbZ z^4@Cl3q`4~y@B4Wn_#E+jNK_k`vsV&$%S+DTt(gMJR?L~}^mczUv; z2s+nv$281BR1oCVNl=!cPiE4_Y z6gnWC5|T@{AGP(MR1)Z{&II%#!wuUQJps##UQAs8>uX%noH^8=Vdv^lF$#+pn?z<; zcV0pj(SIU1go{9}YWH*BdxRR?~YkqU_(=Iul}@s2J<&R2f2s&&@>H0X7urM&7CU2U%=*~Lec{(oUpOD zI5z>d3H2_#g#KAW7WN=ZMsL;^Rll;J3U)n;I?k4Hu*J1r7R6XK$JC2%Zy}ekl=-l< z$Ftu0+{MM8j_PVVbJO{=X3nIsIS4p`Bx&jp<9M}{>ZO3~V=?G4_+C*@Q63ew#W`6S zHDnJ6)a;2jVnRaXS6mc?O*;UT(V#aCa zradsG9PfP;ib}bA0hcZ$k?F`ozz3c&%G`ie#!Z)2il3o+tRynAiSw;{}K@hkby($72{D z`XcbT6B=6vl;fFuKyBmut+atT6WtRR&vXEkb%R;R~wKjbFmaPspLFWikljX<^i-tMGAz9(7~03&U?cUVM!8n z&H;G^4IiBx&U-x^uKJM!{X6&jE4Nf8!Yb5BEF{XFrb}yu2W=8 zi+?iCb2tfe+J;eyp2XRpi{Q*^f&0!7uD+U`|L)`GdHOl7@j5Mtcp-{kkp$_tla3#L zD_oK+@>eQ%Q}~RA?i**fa0g@jYXQEEl|4`Yh0Jl9yxu{#2|Kog9=C%1 zW|+P>+b|%l-0^H9>j3XE_J9wBQG*N5W3rd$Rib;4LI&YGw=k-=R|6xI9`hfzAX~pwFKgx8C-|l&fmCM zNs@i1;N1|UQtoTtzjQBCpg~Q{aLcp%uFuVFfeYG}+e%kA$;wIkct^*QszGe+>OR?KhUc&@o%~ipWZmAeWDP)rMnU03tNm$ zG}w3hH-PsYiI0!yesy+(7)N$7``jG$;)tDp~x5`p|}EIFJ6IJk|CxT+}7U4KO1RCd^ylxe*-JujX~OHyJOFu zc)Ppv*KovM<9R|ifA_!d+X`!Xu)9G7K&4Hh2@`?@`R{!E4}ivZz)Q}D!QN3DZ0_xr zu?b>-@Y#|1qu)&@+T{l2H-Gp`lNgkZ;8TGX6Z5}i?me_X!Kyw6V! zBNoKZ0aiOFN+6Xt{M335P4?((@mSHCOx`&? zcVmx7Pmk5ftGoFQhVk30yNpfjGB=H*{Y`9%&h@qO3VZqXvd#dI;kqk$=V!`H?VC_j zav8Gg!P!zjE*#NAxK7sKU{0kZt9Abj@pYZOSkh$P2-MXce4d^7^M$KPBenT{s=N6f zUa_3NO=hyeQ{6b$z)Pg_87nSOWh-&Tsa$yLm5?HSe^jT;1iBLBdG3l#HVtT%l^`ML z_IKC!pA|A_0ZCSk2@FJYLEIloXe-1vO)}$I)q^CnDiYK!;vNv-K3+Ngdh}~`(QL=d z@`bZc4Z>T39&Njt`{3lfJC8QTM@$r*Rm3d{W-=f3l8764xvBjiQgbmm6dF%y{k?v! zfUIirg3e}|jb}M7E{7LA2A$s-HvlTbPVNExikg-UmkEC-OpOXC{9?m!B#@AZ&TK9+ z5_-hN>4-^TK$_y0p};wz2c zzrDJh)7&peF^c`;)Vs=@>UM`CzlrO{LfhM`<4GFYaF5q5IK<10^29(xb4!POZvb?U z5ihlHK)ba1a+HEjkg@i;GEr7|+`0Nnf~HoyRzHJD)f4B=I(~?j{G54px02hJKeSxW zB+;cZ;oq}b##2t z$a;6|wq9JK5^s@4a2Z}CY!=DE5oX5#@BjRs7j_Wl_gtTIrRuIIh}+KhuoW?uCPZT& zdEv(jdFa_1a`;$MFu}tj_PvdzSt9ba4@ig#`CRNyBzK8fj}@phT$?;V2Y$7Tv+c}o zYiI4yV<9bKmxhVsWVu_vRSq&ii3M?O{!0hsl1EC+M|*@m3<(7b}?|!`vGh?B!B*KPJu z?k82Vjf5`T8L3ZooAtZwp9&kzUMr`B78XfbKIi%!`qxO}NjS{3(_T@I^2IN5Lc){a zb*A_I_eUg}*eW-d_fzlmo2TPZNASxg-v$do)tkrD(a~WuaCbMyFA%wNG`ube1}95r z(}${nia)@+?E_04fOajUx4of@Hh(R&N`j7;i8Q#~)4Ggy%?EqKk(j2m5%w0_COGQ; zakqR)#a{*Ib8r7nsWP0|rNPaDx}BF#=e_>- zph?x~jd{$Frt1348@Q>H$&H;L4kCLuJ`@+j;xx$wUtsOb)KemLFMcs9GAs+{x}2YD zORs9;hLP`0<5(^~M3(z0}V?+4TIMN-6YwI1UcshsoFNW()QMp_z8W9&Aa<|cY zb<~1je>{5>cbEFpIc?M?E6#RdejL-rMGNaSjP%xY z9_GASu3&@!KRS?(cBuc}sre{`DVQ%bhjd<3IrG1^GW#Ek8_#!SHb*$3J|MtpCO%z@H1C-wOpN{ zMbb)6A@%IP$}s=S{Q8zWlK{-w-rXH)<*=m=w;D;u}es}i`PAfkdW2-p$`jCK32tJHPdEO7tg@+UeM&7`; z8aSRiMB9&92B3kKOKt-NanT2o+~>h1qTKCM8N>zq+isdS-0zt0U7*L>ZOc|y31#pd zAsg>E_O0HUdq-pw3p;NOuW4TgMhRz1$?iOAUeBG4rV)(Vl^JS*g;lzgL3z9-Jnor` z(GD7R6)uoB+qfTNOLyM$lPI9<>o!+U#qxuwsL#qUZMz`;{8sOxtw3;hyMhIOYfgv!jlem9>j|Fn&530fFGFwHkGy=&(iq`t0 zzDEbOWiBy%mD|vEu*Fm;XHizhnDfSY-k8TeI1RosD|#(5x`V99F7JBZtALxl{oy=U z4$dhKGtooq+M_*x`}{1sGoqN!kfA=OcgV;2G{1BE2+J!B_E6y8l|$9Wy`<5la&QGu z_?r_$uARvMV81H_#m$kl4^qqy9j?qK4X@BhGXE_0OKc*O1RrbA48vI@WQp*Gn0%OL zTFFw+$O(A+i|;^VoENNI z@{hk;(j=Q1MACe3xMpq5{TG*jL^T2YY*s2ALdrJnpTw0v%?{#;%}3uz`1si^$u-V@ zd>P$l8#EHF4ET6K^%J?7XIkYi74IdUPoIbu?UJt?+S9QTPTMR}I=om$Bz6<*cIh0H za4*Wm47>24$OzBEMHup*6^sr0RrWUTC;q-ygnIc2l53kIwmz+bnpi|aB-E}xO^Pz$ z$_By&W4xWWD_ZWw%QK1o>d{;=_6}x3FeVJds@-n`cn*kg*(OrS33bgR#ce>c4SLJx z(rS~U-kL=$P*@ikkSaDrI(-&LKKiw@zNnO(9$?TR$wYaeS za}LrvPiR`1;-*Lg*lMk^7xGYG`rgZhkIkhFFSEvLhQ7bB!k_?;C zD0ndG9=!Q2R6Rk240L@{} zV>XeHfuRA;M0ML1=}s@IN9maB_ztM1(b@wTT|B1<%2Dd9DB3CNw!%%5hLY!6Td;mLmN4(<)= z6v3f@Br8VSEI(*Si7B+-lS+x84xg2>^@z@9XD%ww#FFhCtKGIq9;EM|Vpal;k@Hp# z2`J*sYTpY^`GC+9J3ia*K)H4Bd&TK-(Rcm{Va}Med3}me{Z#VrA!K{b3qTS$pq`N|ymlQ#UXO{|ujHX7ec4x(ui1(~5-PXwJ#^TyQPB za`}aKNND~X;u7Jj6w>iGCqaAD(co1qa)}9v6X&$Wsd5s8kc9fhQRUcGx>plluh$vO zT=Z`-#JXQQqtnMR`P}c<54ABbmDGclFllKk= zwYG@-Am4!>ML*7H0$z@n!i3QnD#x}>YhPr{QJD2RZQ+nWwAQJYf#EJA?0QuflU2|j zvm?AvnT#sx*?8w0A~eS_Cn-$(zF*%odL!-=eL!5AC)rv$T^wsdp0DevVp#*)7O~d1 z6U@M%RV|ZDCTRCkj_#edd7^&|y2`xJe!W5@+wa|^tGb~)?lea#p;n$hObFN&tsx4( zUR<8kQo#N2|J-7B-#2>8;$UVC-hG;!cIYHv?+j{sAD3Xp2>NN#*?Y;=f)liEW0wX- z%UpkRYVCgC+0+m5aSiyl_fgv^C(nF%^`NjJ(EjcutLh&7`|Zo!uj6na;uVOiP3VSd zjc0BP(<{&N?&bJrLieWOp`wcW%4_~%KU7GI!CuZ_Y97L?XD74pbxQ{()27XBSPYt* z_i-ylb90N)(%78#Es&k*fDr#lgtOVZTQ?Jzmo1n5+K&)v@hUIZ+dOz4V=Zs2zCnM- z-PFJ>ZA$L9EzOta!K0_YE2a_d^ep_g4tcV2qoyKHOPoOv}o@5`Ys8sfu>+RnZV0i9w zT%JIHFaQqxTwJ(d_{Q#!{;a%Zr)fcE?j39sI%J9 zPidwR_h{eGYnbr@U&eHf-F=5~b@LbvT8oD$FE3=4sx7Gy_O{9 zC$ID7j~Gm!u4n$?MZUkGOs?X^H43$}f_yJcnbAtN`zm;81Bxy;oDkl%uCL>09~Aie zd&?+liYQe|T2_Db`q5r>_cbgnLUY8VaJSWdfNj=F zC&_DH^FNA=4@?pkXQRmr+v@~qFka*qyGxgZ^P9wcXPSAl$!<3&j^9a*%QJnA_@RWYOe+vk=QtxUWni?^}4u1Xacr) z`9j;)C){CMFKj<{&wF#dHBPt=Ja66dlJEfGi9}_0gfz;8WsL-*UkT7e8GWJx#7XZ& zqt?)fr~9?<-}tQMUw@9?{~2R0JKBMt&jCHNT5=UVLb+Ssi5zDXj4@}6B+v-EeC?aM zJdVK50-a#StW0+&`DL*?T_5yu5OsRok?Q5Oc{oEX?{z0_6ZLT1S#E7xj&GZ`Y$u5J zCJ^=#1BBT9x7n4~SMF6rKX83d-`jLAe0?=%W^X8v!O+Bhh^(7RU0#k>eA0r~i<@na zM!3rW<2(zW2lAQ!#r#dx>wLT8;GJ2^?O9LA5d=Z>@d2jI~W8QJw)N4DUaPCw4w+D^HYK_s1jU4aSLwGQuR zZxm?Vy;{6J?0510zM9}G|Hr!5vggTb;S>D7v0I=$oSA>@YpO9AHMj5gE(FLo8*A*i zEBCJ0gC$oVf}4^Aqr|RfcPCy3%*6@zY50vFpCC*O`?sT;aYibyL;so zR@k|EsziFhu`S_wDHjz6>9-n%?99DGsNmh#mZGG9HxxA6kGl1x-rWNa1B@lD%`IQz zt`4wBZKQs0zzYNO51$VhT&lbQe9#8~x1t;HJlG4m<#wtGczm1)7o0lm4V^g$FTSsT zZ(Ig%Y|lTn$mw^ZY$Hfq$uEwafKVy!K-1R?L)YTw7amz3x6N;Z??fDS>!|z16;qZT zxo?+fms3S(;5x65yxvuUyKDdZEMfc6r$^$nRR*i#fS1M6m|4t1KXrlkr^~l+16$(v zrvOkZ_xy$SAYVS1Y?rqK60-Z5CB(H&lzq1@q)qdO@ ztvhVne}KOugEz}k0=f{+Ta~xnd;*vWIM9?u)k9md&D9 z?c#CwQue2y{B+KkyBo=L0Pu*qDT@GY#)fR9>M{gXFlRZiP&(N5xCek9(4lW|_llM` zW90^Z zx!@uf6$aY%eN44qpW%>LIQi8S{67FMK+wOj>(96Cg{rh|><>CJGTYGoCWh(3Y_N}w; z-;2BO4dMRQ-n^ZoL$g|p17DyWvFS_NX;+^tCdg(`n0@qu1XyEyg|B>n}BHFa2t>>y>(3 zPOhF?UR+h)J$aXf8nurPtDBWQ)wNGIc)ImJq@Me;H)a;%+Np~2{lokx-zt9C&U#^! zg0!C3_UGI7-G|lcxY?bZ-NzbAMHbh>4)z> z-#x76Jn6NMJ?lZ-@$G8;fIofLez3Q<;bzurx9gdYz1>E(=RLprWUp^$K6w?s3o|Ef z{*&Fzr%w8;4-XG_bDuMFADq=Qc0eV?SF^-+^S3!q-iBFvzM3`0J6$O;=ecm-&9?+6 zX!hOX?dNvoXMOpfAH)6U!A{BK<4TH$nuSxIJxR3g!`&=}WyoQkMc6!f(jd04$d=)A z?oWB=``~6i&5Xa>oUxfD%sMYQ>$&T>Bi=lD(!@N>b8;J|Jl{w?Jba$>*yH^y(TI7D zGoJgdp7qo$A^YC0uV+2Cy8jsN-#vVga?F~We~(*h^D)Tgf9KiK3vuU_{q*NM?f#uc z)lO}5`i+uQPoLD6*6xI~t}i*eRsV6Zrk>@8rf~i1hecZ2+y!%PQ_)Yj`)mLH zvhVudKC~Z(Ao|>fZdUKlZ)PRW{^`^8!zC?5V|BGNq&XW?2V1^Zzb zHye}nbP(^g+7B@7o2zxW_2--Zqn)fjtzWH+&B2vdUyi%g`XP3LdAx4zW%_!slX%W# z>jPh*i~I2UpFtn%>-V>hcdyg-gUX*=ZPS5YZkR`^S||`yZU5r zap?Z)qwPN0^IHOjJghfu-CwYF5$|8!t{$$t3;jXNI>D%&OC%SFr@S<_Xh>zO*#)

{YZXZ9bU-ENrb^dskkUcf^8iRUDj<{N2 z)kYd$aIr>Ozj!(x+jypES>YWvy68NNHGk)Gn@g_cSnC&0^s>U-y_Otz%gWcbc6SU-zS4*%ySRAl z_xA3?pKlgjw_%%$PQ^&;m(RjoyYLk3HMs2e_nJQb@gL$LjMeH>Jd{7*q3XSN?{vBB ziNNQ|pWY4ct=98D=lXtiJNI+`w7Q=C<+1U*mA`&GZ?;%?{(4!jK5TPIDIIJ5(pmU; z8-7@H3VIDL`Tc{YXK#?UsyK2AKl~UzzrVk}JK>FXwfcA+PU%AueYHJ!bK+a^I`osi zXJw(cpYB%caMCxi8n+Ku2pw<6Q*Ed9dD_$O-rcV-xA#kk^=jGur2Y0573#f~7xz5< zfnPeYH}{WMs!^r%)mNI4$u4H2wD765?T6qO_}-VcmK3M4R+pT@@%AsCi`DJ>m0vdZ zec0xr^Dxr-BC{Yny7)BgH~RFarQ2O#20pLhs?gZ+XEP z9&3I+(s;l&tR9z0TX||}$we8qxuo=uwSMU=e6K&8Tq*9-|!O zy4vZ|X0B(RFF)SW=?gK|%3{OWuj1xIXCH4KV!qpT8?Iy*7VhH1YW?8DL%&qf5>2nx zuhj7Fm{n2X)yDk_jc=7-JXkuTyBR?AC`)#T=l%)`f6L!@ccZ8S9HL*Uoq0etjz9oDk*HRjt=hY(SPz>3Gt;OB&nveXr8!M&urJ z=k8){eh5EYVSjYldYNC+?6$!YE_p)#gk9V8nVfxqO#qnme z82|h9OLj&*61x6=fo7hr9J#zDnV;3;!{rU_S35nkk?-&A-Q}&c_U6Xf%kb&*jVBv) zbeUwHZbjv1HuqXcJ9e8o(^XD3c#h&tHg-A!pKc1l^s!pXGVN{FF;;ojopC4M3U#bu zHF%b+Og7BFUbh$ARW!Zii+#IV+D4m}lE*VHjykq9v0l>NQ1#q0UG%uYREMw8*=5*y zW+w}pt_wiru@&Cl_^`YVZri`U-Q4Z_Y8|YvWrbfsWVY?=BFR^1eGzm!xAogsY5YQz zd$j#UknS`bxImS9amX_^JlryrKE>yO}S)m3fi-m@mDFd6_$yFTZ_x ziF=nXy>a=%yOtNaW%;7}l^4BPd4W5XFTYKBnR}F%yFvNVyOWo{HF?SVl9#wCd67Gk zm$@Bzp?i@pyb<~0yO1xu1$l}4kC(am_~JW{7rX6vnR||xyWx1*yNwsS)%f!JjF-8| zc(FT-m%P1r@q3Gxy0Q4OyNWNprTC)zi7&mGc!@iSFT0KS{CkL(xq*1;n}lEY4&m3h zJ^0Jt8~i1241SHff)~Cec;Wkj7rYsGnLB}B;Wps+_J`}$dO){lKfd|H?8gs}Wwm;L zv%U4@=Gxuc`_KC}?{>Y3imuOVVRN}MJAj6MG8`-h81eIGjD z@a3X${Ye~qbqh1~7c`?-FjyxK?YhMe`b%cygu`n0 z*Raehr%R1zyoGU|yA`=T1a5h} zS>3)r?B?PVkDvVEr(zij_t^buJ^Q&&@Rv_}06PN6O=3atn@8WSKi@ul2tb;5&o`&- zK7Nley#7S{+vLf2hzFCd$n@@Gn=u`j%r(~MV|Q;qg`Iyqy!@M#`uOxydG_I-dSACq zz+ca)rT4*JpIlDxPj*%@JQkoksha%y5%6GHn}<_h(w*$5ymNiKy8YAo-Mh|y3|HIh z*H3(X@cecR4`F-P-|jzuyS@wU{*#aJ>TzwHcy?Uh_8uM?vi{}j)2jWr-qb1`E3o_0 z$Ft;2jNyPH?7eY^Z0fGjKLG`g$`n}dX6_{d+sZndlB4-4uPFZL9&hA|uiDjjQP56! zUte;yZa;)i_Qbb}6P_P6l!ppGW86-w$b%?+IOPj&b zuo>pp!(ZNPj~>1G)tl0mF0ay1g**#s5xTOgyHKW;HKq-DXk8MrJao2fGvBpc zsM_Fs))?2ew(*9sSPXLeu>PlbB8DF(ombGn1V_DuNi7C_46jkXe zUnIdMp=@}+F^%bXqH9f3nWXatO_(aptAdW|%C~7+G+Ehrn|HalwKZj)lv$aVChu(H z_)1r1rmK9D+rrsk+KeWOkhXc7l_n_*W~?c?t|?4Q$1X_|KEk)2C-Wu`b(*=n$pRmk zcdcu>Ht{u0l(nz;#WH}r>6$iSP-$S(|0XFbh@X$}+99rp=8@J=0gk zQFN?H*JdrVXlwdvOx-n=<@cm6L+0DM;$w=CG_`5lI?p@F58YmwvaSB29DK6lL8o zwOym>s{$*Smaa{5XS*h(Hmz!7ZSL!UEEb`$t?R0?4q1}U?kLX@;<9#G(IG4>Vvz-y zSy|d7w{7Z8Qe>`nNmd{)iT=XJNtTOX^2}wkJF?E0G(o(4;!WNnZEagLKC%3*t=lfo zn>tH8tC#RUZINe9V)N4ZqBH>+o!wDaInRRHkny_7+9JuaqQOhDENMdXN#VP~Wu*^Q zXV75pYFnto&Zj8H?2cOWC+%Dlinc`ES)#m3>MS5RdD5h=b)j(HMSJMr;oQ0r<4VZ9V!`wQ)ow!hCzO1^$S)mfg>yw{iHI2;qOQZ>eWc1LB}W;krmz;W6vdm7TT zF?m@AJRm~As5@KKh**lNYVov1-6fgvICnhQd=r#wDKaJ>$!)u|%jnQ1U6T~dXsCUi zy1c0KyhHfYszSMZ2M8!zR|5db`Crs^83w;FXe7dfzeANuycCmH;|y?uSy5Jn?MjA% z?eL!O!pMah_wT#;CMfeEty~R4$W3WYhrHwd64x}Y$Sf{8b(k82#8$Qn9#B$sjdKYf zSM&6I%aCG#N+vw#YuctpE;0kKGavvg8pbFGGgK&mLzA$4dD5kbVi#P}@Q?HL2x-8k z0tZToT#YNrI+t~}12g2UL*{V1NK2YE%q|L$0UMc2kJ&5R6Qs^|X>Py)4SJCyZe1%! zBVX92fSR^znxtXU@UlKjP&B|-0L10kTENqMa8j|bX#mzB++B*-DI+2ZfCgLS8iXlW zBv({EG@Wfj01*4CshS!eGT$H74Xd3RgxDeywkZK~bmh|2fkE-#w#M7F1+tB*r4<&d zt`nPL(u)%Do83_gLIrh{H9C@F#ylF8)O8D}#-EqWCsN6mG>!2l2;p|fer9Zz7>l2p z?S6~QUqnb9VkJk?TWNx7BSYSOaZBorotuYx}B;fFkm#@&xOhfdRS(M3=Xq5_wMMsTCl~ zfJ1x@e5=Ti@wCI6z~_>#1C@6LAO`p}->7CuC71}L_5$%hV^@KuSo*{QmVt;iDO|!w z(<{GcVlAv;fav9&pAR5GGN980#*;zhAe)J-0b(3-3_xCbP)OV6;;6WB54WhWvp{m- ztF>mn!ouaCq$2V_Rp25nr%j7ma2K0e<<_K4TjHl|#)t7#2|5O4y3|@cV|_TPV6pMC z`v%U8FM>i;Pze->S4xu>2v}h{q&i8F3BU@oX)%E~d33pvCGAQEhlMC1)7W9aQH@)x zYf(5p9Q{ig0UCp`uM0@4$F*c>s35If8VOw9RJ@CafYY~K37Uf^SB2PR*|eS3#}sXC zv5l|*%sIjYNGdTDXhEuPgbf&YKpH$=6BB|h2>cs>7m`?}NH$)=XQ_ZF*2n?;YegX% z$8Wxs@2P?@O^&6@(eS)3a%82%CIg+pd3-cg- zPdbOI_DKphU~1r}X$jMYEhhqv7;abkTBB$iKnV{AFh5FFI%LFFJ~vpZ+Jla9{CF}H z%OE9nsu&PpiV@Q^2*y@X_G96qUCsD#)I=O{BPY`;EUYlm2 zu5##Dj5b*o44URZhfq@BN0UNEvK;C1kd-#oyl04e0;t2UmRKE{5aUfOh6r0< zRBFQ7wto5>IucBZEgY~`_!BhciV}sAXeA|P z*j1n@V@!&}sc^BiW#!8n?#!g;*l$n@s)Zpk0kta=gF<4C8?8tI3uO9&t&GDOV3%Qc z77K-8?4U!CQv{_(;#ew0Nf0sKOac;MHj4`0VFd7#T7x~2 zv=pn@fs@ljVbHE}sca{_EkUR%cuR#{1UfhaL#RDQRdBpPok|65oMLzxU(9#$N`_K* zRgBGG%UV+-jxA6OJA~v*2`VH#%|VH_42*{<&kE0PvM6b3fz()E9A8}25@3y^_5~0q z$M6AzT!}rZvI3dR9rVb-+p*917iSc_X5L|jRe}6!F7gui+rW4Y1laJEWsO~CjuB7` z6fHcgTwN=oiLVMRt>igQ%K;>etQJG&Q@9P5J zhIgtY2tqoI@QhDzH67Bc=oy9&Vqq&(5m5v;R!&|EBE#q$mcB>;WLgMXYcZczhA&N1 zgB43KCs}5&3~D4ot4H0QuK|?7FS=vsNULg7Oz^S*su~a^ivk zxQp|8&=i2#idTW7m~w0fu1h8!8!qIe70GR)U|fObu%JCUXo@r7-+Xkv>_;5B`f1*|GSwzHTkga3{?hul;#{8h*x;4wliVuwje zJ)VhW^}s85O3m-QQ?wQ+Q@gtDSREW;!1SRT(Ox*{0QMet6Us~h4yZd+5hZgK*dNPNnq0$5Up3GjkDV1DuI3VAYriR&=QM$?I0AvB!> zNH_xq#M1{SvmY?tRv;Fi+}aFxgOLyc1Ns1QSUlibBGj4YE`WkTIyu0`AvZ08&e)m; zYRum-MIot-_7(UN&|1c~hP>fJ>(a(Wt$;yLrxYYxJ%v1|)?_iD{zyZGkiblv? zDbj{2l)*Nz$rO`|87+BC~s+=NZ}u!671@+evB?%gfa$+a6sG-Re zy~9&u16;3KkE&(kBBojZ5 zf&+Uq%o+y5;dQi8*Y0o2xfX+uWx)R!gKyU3Z3Tem>+lH`Hbr{~36h#8S(M3!S;vXz zi1v|~_?r^=nn3-L&eWn!%x1+phzXTdXyE(87$AVgMX z%CiJjiLKM71u(!X3YJ0-Y=w0K6KfQ}gc5%QW)(z-&w%EDV1gC+A!};*Cz!Q@rsL%S z@hpfhngDi%o0)F2BP(cu1IqymT@7@jC03+htW^n#2rwV)7QUhl_*bl5sjw}W0^p-j zfYMSl%VpAE#0EbMF-6g`YI+4m zwzLRUs_-$O)*?|%1NvZEjY2jH=F}x6&|9z#N(@HyHB`hajt5*s)f^fT-8*(J2jODH zKze*-L?ME+pl6gO)vjlxVSrO?HwK1JZjp$9hXBEp+JUh^CA?SOBnG1+lK`Y<wY2L(W~lno=tnb*u9#GO^|0C7d9@Pp%@Fvs3ONEBRjxKNwzkF{0wvjp<-4~UEP z0OlN2qpt;9b|A7AK3)Nlu{9tIv<>s>J9rx=|8TVMO;*v4!5d&_9r`Zg$m(Jq7@%j! z*dlRV9}ZO)o@gGYK-hlV;mMkkxh%5WiY5#;Xub{ zGb>e91T?nyxp;-Fu)fJ0GJ#pckh>I)kNo2!8noWaFeShVkMY*#y>AivDgZd4vxh&o zHhEIRXF~%Z!K)?u$3|%=sbdmoy39+cJ_H&rk9=YXyl7ynz0fvNEo~(i;)OsNgMe3n zwg&cYVC(3jHe}Hvt1{#Q1e1#A7K%d1Z2Jyaf<-S-Fj;Uu zZ4)fRcp@jbP|!{(aFp_Ipq07?6I7`{ct~+>s2eKe;Vv1CfN>l2Gp{xnuz>Vv+cbfi zK*vR-OFSQ5Ke{cZ5896kfN5I8n42141SKh8W1EOZo&hx!Is+O6eT@MpKu@3|AbHVl zOch=gG=ZgesWzc9zAV&uuAX88&Wt>Ao7)`jV=EfN&I32=P(s{m3?@^m*d4$Hhk$o= zIRw0DWQI=2WB{TC!Am?qokPy@i1jjLC3m%!D;Hn`+2hEv4!fC#x~$-MAjZTTvmn4r zIbOs;@fdtdiVLB3y*qKONn zU9yS~$Ias=0WuzmEdU^_6HL1^KJyWVVW8xzz==7_3ryASRbc^7wP-n%82AGcsWYrF zHW;s~jm!+R39gOtDl57M00C_U7}1`XNq*ag}eiyV6w_&zY5&hO#n788rBZW`0Tuz^s5Wc~;wlAwjE6*2!cVOfjkn z9ygh?WB^Hca*JeQ*`-;CCJgoP(iCX{OzC`DBq1*W($Looxr5!LNNI)(^_gMG0cwD% z4isVP6efhYg5I;pyAu?GCBremA47{KH42I_4Gpd3*kXliL#yl{B@Lh|ozi)dx=5nI z%;KICD5pdMt%y^S;S9S3dv3u31sa^l>1qpuCLk3GCGZQgp2S#o!q}|$2FhljNi2D) z+^(W#@?lt6hPf_Why1iPs>dROq8hL8J}x3+Q+!ljdQ5l5^i=}nXeO#FhXRGbPb;ik zX|tx$mXEq@wTY?B9Yk0Dr_-*tvw7e{4Bi_kBK5_dwRMN0Vp4e@sbla8y%z8aJy3ui zd=~u=3nz{W-xWc~3jh?7t3*|$L16g6A#h>rmLeP()(`=MJ0{wnh)^G<6ks??8cYks z9uvuIX@42Lb)b1+^2~@r+79^#5yF2B;sf2llIcUR_&^b*#xa#J4Im`UqT!{a(iRoc zg+~Mt1>6y=)TC{iqUdRzK#O8JYz7gKU6v*5fP+jcKE=pfCfbRHY$&JAD(6dkQrgk) zz*%^3bY0duCTig(6*q@X04ks?9#WjvtwUQ;VRJpU9B@!FA$&4k3T)N%0!X)1vn^789x}5 z$d?72L2DIt$7;Y!K*Uw$l(|`=oKQc0YMla-IaJN|fMsD)lQ@iAjzL6+K+#UyW?;b7 z6s$W8qDs0{c|wqi3|jzxb2ccx?A#F+R)f_NrMj2e!ze^CTL5G01e5_~NN7&9w z#JCyAiKbaQt3;bOy-aA#CDIu1{>+FXD#`%!O6`U6#Ep2?JBC*iB^B2uiJV7#$YkNj zPJijWkQIogEG+2Vvm~HSuNZ8jgt;UHkDu4}N}-q@z7nGa+LMEiLE91-s|3i}pdw6} zwt(mvXl|Ug9|A34Co{}c9y%mZ@!`%1bEA?PVC!osR0#)j82%i`g=}Ce6jy0|AzfUtaXhW%MavYIK;RW(-A066Gvlh<(fwNvk@@nkwuO zzzHE$yao2D0|F>{&`w5^6s#Ve(1VtpcB)|%*h?_6J_Ow~fu*a#6L4$M4*GGJtPazb zl(2C$ysec;&2&P6+uYZNu27&>T%^Tag8^U%G*gOnBuRz)OEPN<{4J20p*e&|nOv#1 z;kyQOsqJ`EH0~Z6Kl<>abyxcjo zUi)LrH8NuWhc1*g#8R>tV|l6u z`HI>IA3-v!T;8x!C`sna;JT%o@DE0S=)rtwgMX}(#B@&Ee=)t@!@z`?p!zVGO6I)Ti$LJFnU)&)@>TJnN4*ts@HyI!p5Z|=gQp{bM zNVz~QrRX%nG6EnquA>%QD6lXhc#Jfr5CTOcopSC#AE+Y+4K*}P*=auvCZhZas|`+E zoboU5v4(aKo=%x}n3zqf8p@dAZ(O2tJld>64&r*^`Gxaac)db(KB-}Wur7#_(SaA3 zG{#zU!OXX939HVO9f2!M;R_iH>9teVDzlb;m8uTF1K~*?+zZ#umAa#RQHd67jVZ@->zEY;98&~uk~wZVW&Nd!OIp^_r}zPg zS?g%ODui#UxTw%foeNP)RVI7F2Vfw|82qka5qL@jQ<#If3XRf-90~*x;2TlpI2Xug z5Y`Xq9v_bIRVBizO-beOI|cAsZQt-5|Abv;BJg*nG-V}a&kAkQv$Ul)`cY({63Q6& z!~pqgoRnZ|=p5}!1I`LS$ajOua+;4pFr7BakypgQHn}p^ zGaNKx4!6p5=7a@yN=C@Q86Zov#h6H`;gFeAfC7JMaZfp@5vLFQ^nz!Jai~JWaEwBY zF_XOTO25d(SSlu8n7fGZ9}S@CCh6)fQ)CpGl9WKVY9wTZO%~>#8Lz}De2XiTIR=ZvN1GTNg@0kESg;y%kpn6~xXeAy z97(~pW8Ik#xLTo2uGES>G)5-6@$q~jG=ka7weWeC;18>qO)smK2)RKsjl#95frhaR z+QT21}vOG!d`jw;FSV#Z7JE>ZFE}mYd`voFs?`!w98l03yQvX@Mxjq8AzS;%GE0?yc^6H zW73!ni+3F&gsHWu?Q#eeyu$1BZ>s~fRSWx8qG?m$KjqMXnxehI$>N)ILnhjI5GARy zMtBSKA>YBsa1KyDjC2WuM#gBuW)NGe1JLMy4!<>ZT+|9rlA!>~Y6I0I+G=T|`sc># zl%mU}*1|VgrTr-;yl#*?9da=-aRQ*2D-jS;7VQMx(-<5nWZF}7G>OeqmZoxHvxIrF za+V#VD&va4fvucKsTAJ^0PCKNgSmTK9P8&3Az(Emaub7 ztui+|1v*;rD1bS`UosI@n(?DoOkPwb1B0filFNXJNy4)cy6SAWFd|^Nkvm2faz%=< zDPTyeO)Z`G;(JU3gMg^iR*9WW4cm!l2A~>9fI^B&lDBEAOo$9%N6##Ktz0`rA5-R0 z=L)g%+FlH(rN#CoF}zs99D?u_BC7l(z#bN~LqD}hUMB&WLX@g4b@UyD$x2K-=pRfN zai_R=W=dEo(n6@Un_1;o_16{--^~ROu`h$J*3d)XKu#jN)&s7jCIz zLMwf4*HkgT1ScBM*#PWO>>?;&>KwztHMiMjs}HV%d!i90C&#t56{=^%j{tvlrZZJa z49v8{0fGV)iMwm77sRYE6|Mjet>Zfh^b^McpRXC00%a)!geM#PY@_`|ND!n?A|Fu%OIf;!HhuwHR=dnNrdAtG zI(3EO7YI@bZAKAT3^nDda3D#UA%1%z=%JG2;^005-KsH_K}U%OhmU z^QyrnC^yCwF+CDEf|Kg7@xH{PL7Bi>F=hETQeLx2&o?X;ho znnZz)Rsow#fvE<8 zQ(;E0ELmkw>7+~C6k(Q39nTv>AP^C3N#T{X+#)1mlt@1?ssk-CE!g)GfC&1qvg>i1 zs>r((I<1V*j@8Jz8sej~4>$po2|&_zwMAF*0%%{0XX^~1@&+0O&Lb;I6xZV~2siu{ zAEUAom2xMNl8=`s0$?!F+9K{UrEbHn# zxQeGkk>e;ZnE+N0jbZL}b|b+b(0AtWl%f&O(RA7y zFD#ZoXC;99b)hWE))z&|Ji(o5x~X#|;p9!Kbgi}qU@D3d6u+oLCx_Jm)P$;9<#cN= z4CbH4v~`?}Qz4XGhRfq6QGl{GSzT${Kc>ne_Gq6tyuz3{D$=N`g$Q}6q~S~k9HBM} z$E&GE!ta=Ni*E|iA&Q>o{LpSdPRH8B;v+~}iPl4&o22$QP5RW)s7_^LfCJi*td{a- zIn3MnvID@?nKreJs!q5r2wEcE5L^UG;Iqy_AvB@_4$vaG`#NqETVNCeNkOX)9@-Qp zmQHA4m?GT3p&Sq5luV$wN!?)zR9gn_RBp0ub)q#@23*i4f>k^boP{w-w7U)%cP-F8 zE0yD_u#qZ9K#!~rb~WfqB$*{vUk5|m1~hAcY+jikS&XO!l|HCSZO}VavC$cZw8#_{ z%yjm%?d7>Dvrehvz_moCn3o|qR%eBM4YSv_GUyk&Q7cz0fVXjQkYYH6vCWZvp`f#~ z$adX2@LKJHQZIEPrc&?>j>NxL+8zqNN}C9QjFMb+XoY#&9Cd63WmCk?D|T&^1Bbtd zY3i^FtX~J(Qe~ckt$}l$PSoeZ&{?+uxVf@wa-Hf{WgjKpqqL<{79}#;p#o0n#Z@Av zNq=CmM9QTAi}GGJ%pMZkDUZR5^TCLdT3{L7EV3?zEn%e@cMUp3TR;x*1dM9ODiqr| zb*iL)daWQ|Is{u~xWTT}@lKEw!skna?rQ5mCq*!pRbHwLRI1#{P4X2WHUZFTGY^0* zWF+^b<$&|)gmS7OdIz+qQ7PRIP;4xINC|m@iZYf=luJAIDP%|i+a$Mgs9j8%&I5zXvqY+|-9S8J z>LNzgDFzsH1v|jOlsZrsV}kU+-?Y8o0tFLgEdyK zTZSrmqcc>fwTf8PHN2)N75xJHpyDwf9;w7M)Y_5+3ju&6hUf~UuvY1mRJ9l27H|{A zW$>9*tU4pUtS}A==;5M57;SB=({aL7#lQFz#TT`s348)1Dl!ZKL@xA|Q9Ai42W@#B z!OM|TraY6`O*A`=YwAX0N_9L-XD&jaIBJft=DxB%hPr);CC5*Q(&)5(aLWBsk{kl7 zjA2YCf(zm5fcRJ*9Ybj75ru1FV6{!GN@_WkAIN}7xE3A5lcP+TG%qNtRNht_UHGz~ zBZYBWq0{MJ5#qKku-i$copV+LMJy^+puw6ZIp7CP$C!0sXBN~b#lO*Rq@bEBV_>yu z6ogVvj!P3{9e2dngWOOk^t3}0Fw`kdG1b;bhRcG%1JHCH3Y#qH)G2GcFWqAR5ck|G zeqUfsC0!j3PGO&hmDZW&RCS@sJcqq^O3Dn&IIIdvo;MBLA4gegYso2Ko#-^Z=rzQ$ z(t#o+WU8t~p;&JhR3!z3nr?uM&L?Sq!{(BiOo>}MGgMTpaHXB=3gMSEY&^)MV0kNL zC^H;O!;*_q+3q18?9LmEpYr;;QpdKflva$d&=x_~@C*jTC-^f#_C|my<|THZ_KJyS zrUND~1*JAn`o@7-RYL$|9Ke=nS*pTJt-|CVtFaJs(hLxLyo!(UKF`go#4u~^&uU!az;8;rbHk7o$wwjX9U;rdpb!` zRSC4oA_lJ9Mny{*357ZgHc???z&0)o@KlN`U^yxj0~@ac35^a8psJ~I;k1tuw~wt3 zlwy)G$B-TV2{kBmgp@I$#7H*?0g{?mh;xG_Nt96GjZ&`4m?+^qbC(6+76R*(?56rm zc>Nk!-S99T1Ve!4DgQ`kp3A&qnSmXk>JUA)wp~+eAewAy2y5ILQ}S1W?*wZU${7Mb1w~B@0BEUg^;~(?sd5<`IatVyH_9PT zbN!$Ag3^^jEa`z*GAr;I-;}6gszVBj{(6jEmgmaHQq3q2YLLSc(5Yp9oiVnqyiwAs zRU`nTl(tohNGj_!5mZ;fJf^9YqpEefRcei@;0U5;?>Zfd1&k}G!+HRNOF56mV963? z$>^LyrS0)H(_xmNd@7x)HA-iSNWDo~opM&18SN(u!WI>)kELY&^IYgxIbI!DU8nmc zYmKTO+H!N`0-_<+kH;u-j0>blM?x^!syc^S20VLabnZ@>eVI~U3T8odhIHmIhIgI9 z`ljxz3R5UJU%@t22?VbWcH1AeiSnr;udlVA9qq)3p@+;>(gY2IrYq zu~|HpSA8nTMI9Rc3w>&pO^hZrIt9fS1J}JOPIWr|43UxzY89Y&^)eQm?~l>LN`-wA ztEvG2qIkTysqkCc^FY*f!cKp~UID0-g=`x)blYA3Tz3Y~FNcvP4d zWKgCkmag;BIU5V#KqP=x6{K0BrSzf%-)^!->1gnP&fwZ*?^FD-wh0uYP{l2iMFea! zF9|qNniW1lZU%omV<3fS_W1QcP&A{Htbj2o_s_ zF4UmLj1TT|@B-8c*Hmk(mlf64PnrRK8mu7W#g<^O170w?WrM|2+D@ywT8heJv>Jf0a1Z<$P1D)T$|SZ8Nu@>FoWOs7HOUXGIc8AjV>Qqoe9VO2n5Fpx>6Gf|Yj)GnwF-It1?2#?2n60lg@ z<4cmV#LfXB3mw>H6%*~b7dZEz^Lx3eRYg*#-%#(lxqJ6GYU&J;C@s?sXs}j zZTr+g5@J$PgX$|w0A!%zTeXh~K($i)_%^42t`a<283rs7q!maNLxmM91_vtO21<-} zw!#V^HnHFtKDf3DbSXCO={_x61(s9%R;6=yEiwm8)yWy3R4P#zvzCD+jdE6EtVPGS zouXcN;HHeVwA?mNp>Dm7%xeP@uLE4ol=2y{<~pvNFwZ6)-DCC@cUGO0S{Y-t@>!I{ z@0B-=EzFhT0y!>Q#t6rUt`t}-BbFSG;;LKyQqvO$FxEgQVD#EW$0YhDZZh)wWw3=y>>H;2-i|9x|9w~u44_E z(@}~dX!A>f^+K72Iy8v=5P^oHz_~E8xk4&Q^iFkp(LAr>yS2&< zfD77MX$e5vQYRXM_6SoIVvPHpxz3M_5FdP7IZKU-yBeTy zU3jJ4svtvE;s2wWf$5B#1Y3mjGpsI{;7`a%MrfV=VnQAFxN5%3ImPp4X0TvO) zqhzr1TpA%QZneKxDG?K9nm4S75e`t^?56IB&c|2U5;R7XRhnwRGjcGp6h86HJqn)| zwGw3vIGz6(ZA)2gj62o-(w3>KqAzZmWn7U;wm^NeP!_D0c0e+GVZ_e?jkFReP-%?{ z70RwnV{8KmXoK?HB2X%P&`Ag7_$5uQqg}a@AV2^ZPm6}-+JKMYLeaYrSh&o{2?U*i zjmOoCT&u1$fDX86anWVQj|y}fl`sGzVd8a`i&twUjHIbWBV|})^vf3skS;Mgkq?;1 zpsLtc$B#y}{4fIAP*0Iu3)ph1pN06AIyCJSZjrJlI9{jR*H)DtGC(14hj~)PnOear zS#S7Fr;4ts^JKgipf`A>O`aXI*QR1l%v6`Fj4~!k6?2s>SL$3WT8%5?AHmM}YndwF zDZe2%X$~^dUVsZ~74TMwQ$^Q01$he{I#KdOrvOu_ zwZT`$yj)Q`)>z2}-qKnp8YhON2tz!8U3P*Bg|=aUIYD7idT5lV?Kd&LRwvw9NT&i6 zHRfI`i6XQLq8hnrZDjZyK&x{FI=E%vYOEIqJH{_`#H?aX=|$BLa>$#KsgywiXICsB zG%EaJh2B)y&nd+cLausi@gTYoQwAmmN#?2pQ?#jy!B*OrsZ?tYpQGbX1v8rI1e1Gj?Lhz49mq$?4W2>4&81*dg7%{c?gY< zrKn6OW$s(qwA3k`RCVbAhzh+a<1MP0GLujdQwuMY0?!Ixid}X(R-Oi{C_S#t0AU)r zC^4eE$OshmKn5=6$CFZLVK%S_GR)L^E`&2YKEtI{JrMT~^ilH&U zF50Wkk%P8T@inYVu1u%K!lW}*gV!l^47lc{t})+AQ&$n&n188+VbxtpwFzQ$!l!0c z!76Ej2zl-91P=pEDrHU@l{nD(Q#2CI>^9yEKhp6ZtD}Lf-UKEKa;Hkyfzy?$P|)ZY zqRLY!IX$R;0!Xof=V>~@%LSGL%_wta8+ui-Ns=6U6=vMWRG9ATj!0qT#k}Lz)1ZU=CoS60z>;_dQEEqf?klIkV|d=mNSctg6L3O4OHW3dKr-k;7TO5~c zFP=_?U{Fid_(Q*AG87mdURq|_m~22xC5Bf=n-D2EQ&tBQ;FQ*aVFrVv?Om$9AN*)i zFXTr=X;nmpk+qeoiokc29^^IQ_(?{o=xwfGZifR)wQG#cD{;XXi0DU@FPH)wFhX*Y zXa;;-F(vKZ!nn~mnJp8K05qj*1$V^7a1d3xP>Ka3R6TbfSJx^rjrGrXxK>PthR~8& zV?m)Y8{$nMSv-N6>S6^PMhpjGA3>}}N656F&E#h~P-$BxA-xh&6t* z&`kzi6mXRkQu4i3nyaFNbx`UhHrE1AvY_KpK1b(uo9E2lHV zKx`${;-D*SOcrogm85fU3B{W_g{>=*zfPxKt6V3C5*faRk@FGSFDzP!oyl?kIF(%U z-|76X4VdRdDOU=E6go!Czze0?`_gX;-NE4%G|*X134m9DK%_K_MUmmDSZ!H~nDA7p z%vu`@qzS*4G3PL8@xTzlrtDO}MtSR9Dp&!V*U{`CmMvC=0vPR9kGa4 zo?;h3VLI+p1BshLN4hP`uYexhwRTw}@8FxPRotfyl~fG(P*sr$6w%&wvE&p6HZ4n) zegqm>K44Re{0l&-I7nOFfa}`p9id8BBg2_Z+jS`j1 zSo3yMHW|FcV(J_q^aI0S`5B?cLr0@(e5JB=Dn#Tv9ah87VvaT`4@ho=uDJPHH=!tY z5wluZG{@?sD$AL{MVMb#WX|SBN$3_d$A9Tq545VTW7M@RvP8a8hj0LF$g~HBDTPvp z`*JVGt{SSbiZ_BQObF6c^|9J*%4cQzB-9B36wyo#9WkGwg_71vfWo!s@yJRic3ahO z^BPG&Lesc^o;Tv=wT>t^Dz~L$_1aeJR3}x{6CBI^{1}?FRF4Mk&w` zr@Y&Qk5%v)#)s@VuR^gfOvt4!`~YA!9-p7Ig5a@|LMICts~0(Mkho}a8t6fdHk-^w zVhwc&%8Wx_6sg3xsGeq~9AK8R$yA>aDJ&B!S{WC$RV8L&)JBY>)6c+&pyJ@c;HCk1 zPL=qbCKB1z+1ElFX9fowJv&&iNfVVSm5{;jngDNwf8&zj&X7CDd{&{>se5R=ingYD z!k}}pBnZ$E@JQe^LN|?N^9^W@pvBc zs#D?-D0RA5$f$0=l4Dc|Nm~_#YFsFrDPxK8Qf1lU$U!NkXt9fyAxk$TQwKLyqgX<& zBb=-PbB2L#l!%+eDyJeiR+k+p=B3lW{8+XsM;!NxD%Qv;X+(<-dsHfE#nKfv-dKVL zA^$2#gx~Ratx}uKy7~lSsigEMo!T>NJB)RvGXeNV+>D}IAPrwB1X&^Q+GvichD@ny z!gN7rqKa6i3IZ0YrdHkOq*B@%CJWLZqKu?s6uZ%eT3sj z!aLmx=Fv?V=pX@WG_?pdMx)U6DQ&83cox>xsuAjotUw3iK07whR7NGGohr8$MGBe@ z81xKl&HvA#g*jZJ66C5RYNct@QpJ~T*QspV8$Q3&p`IX?uFOj0$o>EAo!g2fNp`07 zEP1`Dc00TEZMOss5)vbHRTRRHRS8*{MMe}740?C{-!gOCdq6$C0T6AUP~8TB9Cd02gO!IDWb}P{RQ8SVjhL9>e;=-p^Qv{_z z>h_Yrb~~hc{G(`UI7#&(;7`0(8YjI99MC}Rr^aD z;b2ZQIuO1Jf~b^a@pp3Qz{!;Ct?`n?dy1B+ulu}6RGlS_Yx+W+f$)(?BY|hNQZm3F z2jFu>iyY2)fWeNuYcFZAJkJA8HL?4u)t#}}c2O_s6zErL z#qJ~~E=dz>og{diftmbbeYivisTz}&tvDiLAiPd|4715Z6~a@?OjJlpVLAc`&IKR& zWP(D#=nZ`cd9#9j4p5OzlIeuSMaohDrJj5+^?oJi^_a;~)<=j~Opb6pEdjhGo{$zx z1vtU9U5_2;P#ToRI_zKoVxHya*J!ghEGRmHxu+0ev$Q2o3=9Yryx^tO8KC zNIoezdJEVN@D3@<5+b9`qwWF`DUg0-n5&dO(;m_GTabwSf-lAdfc>0jStIr5-O17!URaCWkSs?;uZ8VDRorXp|wG(hqc#SolC z-O2W|C^x9euqR?rJuplS$25>3JxNHH*ykqToYYP6erf6jWXo-(AjWzUH7T~K_lp!7 znlj+R4GBzif%HT2>Ioo;yC+XaYLz~Q8izn!SfR_5^pP3^35--;S?7kBNW~t&&?L04 zz>$czZf6FutVk)A#6}&I*O7%_ag0Vv+ zS7H#lkvZqxei%$t(bf)AK6Yo&TR{Q@5FEP|J<|-5wog)b65m-g5M*5yBE6hsK8YVC zQy7mh1ON;S`N+xxNG&Qa(V>i4EU=m3Zc= zv=(U`OABeh{YCLv$|i1Xa{}EaEOcv}7HovY64K%Rn}tQr=u_ur259ldc{3SUY6yrK zaRn-8KITcwOiO1YddUD(zNJ)i2nJqx?SBSM_OD!z53Ve>%q(~|f zqt?TY3pscb4t!ie>CpUl7}chbBLL4Qo;bK$YAl&i)|ra z9Mj>F^hHD#u8VYjhY)sRh?k-*k^ua6K+jppRwYb%6~{HpfqEvk9f`E|RbnF9XZW5l z@PXZA;HEGVZCy}xq)_iGdch=)W(iCaIS)W7Ibgv~vVqB@BW~<0?7&&V9N{fi&1aRe z0M0cGE_kYFSPb;CCU)Q?0*>ZrfrSx-zlHRrg)n1riKSX95{0PtN#YWyN0PiPAd!_Q zMjBBwC6^G3B%Uly?H~_B?H||{9F{`*5v8G%umH>~l|(JdROHN}7fR*QlH7tNiD&-eEY`v}6q@q`oxk}k(te`WwT%vabI&4;yNJ~>11^admi0HWd z#V{oQ`oog^*3(brHk=g=5t-7BT==Bgc*`CMK%vG`m90;$%&HfS7;$cUeMtH z$DGA@cAy7A4k3q<6zCAPrBYK)uiWPbv>~!iR0*{d02YvpF4;jH1XF&VsZ^Uy5{Dyr5s2BB_UrlVDScK3li6v3xLs7w>DUZ4QxkhQ#nF$ zR{JPzSrI&{NK>ke>{`n=(=wLczZ2W%R_y@LW-Ww6B9({_2t}y#l2j{2*QD)=nE;V6 zk#UddH)L<3XT~&2T^D^=+h*E+gm#{Q9s)A!i96nA($6LD2ON5s&SuR#+V{EunNcj< zQ5)G@vTns7n+ZmZK82d-H2N%_ywf(Z2Li)C6PRk94Qf@YR`}# zr9S8e>HFGrq9WOfnXR}Zq~4`0MONEDbPkuO+Ldr=x%ZNn#EqpCifBu6*JO!66|plM zF@-Q)ZLx@TP@)B4u{&&6i)JBTBe!xynM!5{Y7u3Afb#GpqcU&e&Y*a22Zm?uzJu^x zV01S?T(sy?tCP||CxQNsa6Bn43z>??HWM*Mv`D0Q*Y30$4)8-3Dt-dcQ1{AIN zJAsEH&_G)Zs4vn%4h^xiI*FAaNq}rq$tDoFSEr}kY6u_jvB+$pi;zPvF>b~fK}JuM z{G~3zoq@rcERq%UINL&gHmW7kdT!F1$d)V>TzZM_=t-Hh#ADqn8UK!A)S5+UMhD5+ zgq7g`Xr=Yu%i6t{wRcSy{z4PS-bbLcJF2F-pks(m$iE@YxiE(?*H4ecJI~Z z-mA_1&#pFC0R*6WgO+mu2WqE`$|}-GHI$h=9?#GLBfje^0P{-47a(;cnp;{YF#<@c z1ZRqo5!fhkj6k!D!;3;)lx|rmWrh@)EUS8AWlmCC%{@&mkHxyWQH*Ggm?$N=h7~!` z6O1n*69XdI1fbUGwO|FNaG2UJF?c2W(NDqR^+-?#z7+UX3rr!=nlx-GlSpiabz{-T z-$Pi8Sy8mf7qJe~RW>|h+VM%7M(dc|ks_&*kh-1D&F5(nK?TSU$Zt!u&EPmK+L0?k zb0S6(!lk<`6X=RobWB@W>@0#@23k1j`1_>q6@QK9s+UeDSyj`p;Ytq$^e@y>kvRgerLsg@ z=>`eBbdvr8#{8-X(=yGOpAak!rKyxR619-PgPjU5xn< zFO=o8Yeh3#8=S;P3><|_Rk1?Ss9c(62OT&pdr>@rieYeqSuZtufm?be(IHBB4;7>z z+yWC=tZ4H91|18YlT!>)%&C$=0aT1=n=>Xb6Bl}r3pHa_l`@6=H-q{qZW{=-lOD1s zU^PTi9TioqS|pz#sn2F4Y2tEdu|rZaL!Cq$C?}YJI6zUscLo~}ua%Og@k)mn9p^cdiJDpmHfYjqFTl}INkAq0kMhmtI&4)9_pRm^;d2T0i1D{-ZPpm2H+ zeu$iyPtB$Fprjwt%?^DCwfQ7T%+lU}u*WA`;DO>Dg``5XqD(bg(E=Cnb{s@WiD@jeHuNm^LN&YPIIZ60 zDG|ex#nf`;>!vI=a!`3^2P~F6vk8Cn64|0?A5#>Kmh2}nZUbwEN>&DT1Hw<%O=Mh? zk>eq-ak6+W9~KX_2EyV5cJc)4OC#k#rqTb*-BbY3#EKp;&-;bKd7(NG5vg!@N~zol zKBW@Vv|#4Zj1z`OwTEb%UFx?;GcNdpD0qoBB48SWiTFZ&77ke|&PfR^&=avc(Qj#c zbu~atvx9>Td5Ah_5BoRqAiE{AwF0JPK% zo6Kw6e26>67;smglJR_iC6cQJ_^sGZXw_TE6Lwnv%#Q;Vu#)61Iy|+6hh4KsQniG0 zB7LdXbxNLI!Ov0qh4Nzo7{!e(ubGf!j&lO7%K}x&5G;nUL((XCZ5zN6S^z8MxU^%U zblfmmvIU+Wb$i3grzwunVj88-=#!*4ijV-bC=q&t0ZpcKV_5W(J~OzLo-`9+v^GR- zt&?Rp>6Z#9+E|CxL8T5SmI(5i@lGc#QIQ-NK7J7it`^$uLCc|BjgJ=QB!*6+OOy&= z0sXjWvjctlpp>h~7}*A5^gHD+O+Gn;bQLWjjhw~hoa`>(ksCq}8@#Cm(~C||gp@y3NQ#NP&M1mR261r)*f|pcyorQS@itKdVge9~L@A0C zNz^!4W(~RQ<>QZ^m)Bpv9%|0?p^5zZKsE-IQx0l^h-9*i4=fG9`owdmq*T~Q8&uAN~W^3x#P9U?L>0Qzc+C2dzZfDNY~=28~mu=v11t^{VCa8e%|h!FkVB3?=Vw zU`1m1r7Djox|WO-JrBO0I0h9yPomBwuukNBE(y48u@5bYw;xEoVXeyuA*Rw;-NCRI z`IICl#<-(iBc-j*qqAodpLM+9B8eLxnBpng1au6M*(5qwl0_x>06|d1xhKG2!LmKL zC}N$!c5`UwhpB@W-a~fS2}CgEqC_#HRwFi&NI(~b*@(Q8m?jDuK@(c?v|IIuqXo9k z8x|-s99`6YgnfE3JupXzS-@_vQ|Yl%xK!ebc1OgsejdcIAhT-(0B_jtJO={Ujq7y%)QwKgep+ z<^{2_5<9nOla(0|8K8jP%#;)v;teTlOBl1{D@joc-l`G~?Kf0ZZADR_T?zxJ4U|Nc z76e{^nEHq3;%lCYOf!l?qcw=C|Vk)vm%P3-UMuDT~Vb#1Wex}%7C}WzvB)jW%!^X);QI!$ z@cjgsI#paM;5R3rP~cz?xg|X+w^j2^?;-|1@Cot2Vcfz~kj2YHNkG2Mju1-c!GK@! zgz94h4i+s(U_@BuTg7^>wZ35q4rII-F3qVel7SJ*7RJKja zxlkYqJpE|UqJOSbomdT}PL@#MW}ud1cFI~0lt(zsdJNEQC8bhQ0>xUWzJ*huSk%aj z+c{8EWI<9EIT6*?;&<9lMIEHTjT!-AmMSKR1PuucNl#B*qx3*FR>JRaStq9l_my}L ztQ-za2`mSR^NG?+I2ALHj*?`HCy>v|e0h@fR(uPE8r^;=8tGX}LyTOE1hWUQg@m%t zSdb^G@n!M|YOw+s)H26|u^pt6iNB|ULqJj<_}r7#Se{8O+bxE}gX9tR4L3f?SC+mL zfm{{6uyWxibzTk($`U3(xdrHty1MHY2sD!{W3_#Ea26#_?{90x&lR0bj8PLwDI$rK zpv-7Ss#HP>h!9m$wjkk6dPuH>_-hN3_Hh~>$}?%n<{uJ26hk2ITy&V?USqOe~k$Ta=sd-owy z2bX{n6ydE%tQwS5ao}dAUG`=!NzJC1Zq+US!mt@8+K}A9U!<-xXw#35p50{1dAP>JTa6r=25gk$wLfWB|^+X z;tf2u=G}mH*Fs9~)G&X=#x*2j{yTU+JU=7+g0ossP$9bHu%Q0k?uIxV>L)}@~I_p;k9bt?1|agnI)QWxCgk_FO-A8sGMe);nH;rHLClx`wGdKp)?FF*hC<>ljRUtHSI$M$LYy1d#tZl{iyfB3Th`sw)7=hx%wmtU^a zKikOyL;2l~D9Qs@MC=-+z2zWWSfbs`1nRYk)PjDfEBEpq~x9XMCqyyD^39 zV7}$+WXw0+psC5%)e>$c-)4WC<8@EEjYi_b$=;g34$}RSnvLZa=Uc2iOBdC{a7*z< z$Mn*oNx!8^PqMQP#9L0coNrnlSv{<`GTn;16@Q~k@un4{j+JsN^G$1Jo^G?Veumqe zZnOGaZu5Mb>#bhBRm;6^<^JuxldWUqZ~?RcqnRdmrC;Uo2wf98Gra<}^m41UK)! zep$bI^C9Y2ZjuS~)3HX!bDu^=d_q6nqxQX)h}V!yc+xN4!c_FDx8Q<)Sw9`CT~R0f zbR2YE?FD^QP%lM0_0zEyfw-Z5^DPv5NMGyqJ?%he%lLx(k)Enazsy(iS*F8xXbmlKHq!y_U1Y+2mPKOeF3gP$IwZc+Jk(yEOaG&2NWMD^fy&etLI$dbbFeuDt2Goebk) zbw$(UZJO@)jA0a&6I*_0!jE;p#oxRzo=xM3&GQ%i~LYSZ^+S}9P zJOu6NFuj?Fb~20yuTcw*pMP_+_M$F~TlAKvZJ{&cnkb5!pRNtcqi+qiCmx&Dwg`Sa zu3Z(pdwhKCxS(AU{OD)k_ehpQBQ(CgSqCBV)7L&NYl)RQGja7zhe90>Y9!;+NXBc1 zg8iOef9DqBFCo^a=SF9=Q>3}-_tb701E94O#`2dish_%@pSqsMo5Wc{Tgu~F;_SGt zk1W&E_13S!D70%t`0d2Rakz63U8@)SydR{S7>D>qo$pQ5aH|)Esrjh|Ykj=xK1OAH zvACiX%E6u7^ZCa+wX=eDmedvf=5O!Qk2~~N`zO?~aOUuIuiZD!s67ctp}m-S@@Bj8czb@h?Wu8o>Fu5WMWf?i z;>(gAS|`%OGxPPFe!36A6OjqgQ&L+LHHthhLLEih<5-(zoy$H6K;NvCucnMrmU?oWCK8HY|`y?9rL110>PyPM2_xbtE`T z7t`!lwS0X<@V<*MoYfd=A^S#fF76xZ0|(CSdCjEPOnS|t*DU(NIXyiOF`y9(+6Yg) zg`RLGmbV;d@{c{0P;6W&q-T*qW20}Q4KCO$W-5RwbqgG`5CXJF-V-mGW zqE<=NDv4U9X?$H7tfu(;$c=C6-%#BBuE*wwF4#7|3^;C@$C0*`I_Kh$;Plc) z-uzo)b6s_=-%-ce`_rMdXGG}!RD2|Jc1C?c=X}#n9!EnTy)zIyUvCfp8vP7!`}uUG zvxoR7rMf0cj6THQ`r6UTBdNc><9^oz3wpl7h-)^SX2ZtZM!Sz7V|I;}jYhtWuePsz zoQLqx2bci8o_l|EUw{lV;(Tpv?8v@a_lb?Pp6R~m+9*h>bJ#91TZ+kAuSHN@d}J() z7HbaDnmSW0V^qdW(vOGr@i3=h%X^>7IypAl^rAxHj%W*3f}r@uvLDjrKc) zARHdtKiWv6k4f(tb_Q?G63*g@2sowmyWiXVRn1++)yL7Y=j?vHQ6fMp@$or3`|$qW z(&JfsdwZjK!rImQH}XdQ)xU=$>-p%l_4K!TiO=mgkFUq)?bywq^!@iZhMI3iN`d{A z{!eSDeD=5WzxCFgIkCBNQgff=<_{^&8$!qQw%Q#*-3>G~Ka#sVCCzKmeG}$Kfq>Jj zYpqZ1ETr1L)LxcakI=ce2|X-zhmCateYJaXY<$qsY;@XnjEr<7w=bxuoXwTuc{QF2 zUN)mr@fSNU*Rj0fB+-2|kJ3c*C`~kvC52`SHpAw5vFA~pX$I#8|I}Za&+YT)_J!!& z%>fhanKon?X?QiO*bE$@VuP^*tUZjIzE0raumijtcJFjuD%aDkb7p2} z2Y5F)!2J>I7VVyB2d$4dD(tUgYuN!}yj?+7w==z2hp=b|>3ZSZuUtLQhU^EmANc7y zaMyvq4#IVFzRvVjG+pE2`)c#4|Lwi@z1O&B+F-Qx?odLE_+^Aa+g*s4EOm&5w*#n< z9cU{u7#>QO>`ZN+h*!+W2p$rX1@Mujc1fG0+CjJ(X~K2Z_NuyLmJNI%?NVqf0?(RR zF}z5kDF|Nl(R3^vZnn35zz1pv`1Lptw>Hhx2fU(oFkhFnIjv>UPt#m{#NlWMuHTc| zX!*XyaOW94!pmWrAubP7fN){hEgClS&U+1HX^qtWDUbu}j3~j}&iLEhp2Bf#2UpLv zAkyKPYY$AsC3N`DTC)95hn24}Q4ur7_>hR}9Sh@t;ADcz2c+pT}dkVb{^ z;5wtj!6?7=M!cZ)fpzBF5u&^`XCjszAmv*x;1x!c@iFu#`y@c+jn3j;a7L+dHuRes zb--)vjCkW`XrGvS=dpSkJ;&kTe7olQ^V#$WJAwtZbGf$wVK+)2u#g&Y$MMizdZuw) z9tb1q)dX8R#r?Uv7n&&?rNn$=yvK~d^L5ZZw00V3E{i6~;k1aY1L!T*0gRDGxA7V{ zBi#56t|Rmr8zPuyKSBa;%*9Mt)?T>UBeWy7&+P+_9MGODCcE2RNYyqv<=*ZzuDWr~ zk7qBvC0N9Pu^iJ?jOUo9VNAz#2IDfOGuV+y<;HNrrFTWsA&dc-{$p}SU#G}_%^!}< z-{lsZ61qt_BA4X$*4T~1_zxO4G3#x6sUJs|wK=AEokQr$ts_&nPGjV6jj$JT>rw2+ zXw37jwBBJpx1O++8$D(@G&!&@Q!~!n-}X%&GSN(R*-Y_vj@C^E&1ROjBi_^4+uZMK zMtwVC2{(hU8Ts2e%-r@aRzW{Xms#A5{_VbboGaJ4d9=cu_ai@!XwUXU89kW$cbQ?` zzSvCb?I@3!@Sb&OBFk59bDcACbK8%KT| z-R}!yHttX4agM&UbN5*rt+;#3WgN}p=<1bcQ8s3Wuw&c~Gk4PfI#&*tdn0raFLi;_ z+qfBHjOM)P8iVVsu}dGbIW&ybX51Qfgk!_FWbJRMT^BHSPm{r8Ka=|3E>P5qXHMNQ zf+OB__8I!QG&dm)zkB;GUs^jpUhU2OZ>Q{jyt%fXr|LRa;!Ta4@tvjt)V_PVw&A<- zk#I>EyH3r4W7lv^H6aM+)n#Th#RBh@DJ11OgKx_;7J{7`v(DzV@J|1J?2@g$U;RLcYj*TO+ePh9CW=Hut)!&*gNw|ypjh!^@qYXpb zf~^Z(ba(w^CqI3crcQ*~pFUZw*-n=FZf<}2it9_Nk9`-|dgr>B*+t2&VfH21G^0Mx zeHryt)R#&7(^~AkiCqioYC#tgIto`Yo?D|L_ZAR8+*20=>Mq`)o6YId_9Gnv^ zVhYzp3#P&u;Z4rL9nm79a3r+QsmSE{M(=yqGS`gmXN!`uqprMkDjz%b#~IOLsBn$+ zH}`49Nzo#%aFz7FbSi+w!<*cL8>0nR;Xr9YSGZ8TNjJDCd}#fQ-7$&7rQL`7qeWfe zY-w*#IB!k9!Tj${zKJ+`O~ApK(&Djjr+AZaa1pe4D_k%w4htuYZ`zo)h;JIGHd%|i z!iCUcvT!=|_BuVmRpXmlI+yOWi=Fnwt_kA~YJbgLYDazSi9$3<2d6`Gp<)^GvCSI6 zSw;<9?5@;=Gr9-K)*i@(`=P~oCFjRc-^e(%O=>@uemT?y<)$-yUr2e z+1;ABiCer6PU2>5Ew{_I@4H(&4R~$iBcjqSdufj!BbKkl#So`jFKc#>AQMUKk!9Uf zg$>&`hcR5h_zTwS?uv&AhF8fPr_*3MmVY^iey z?5@3aB5|8-4aa-i`7!j^Hte-6<}G!~jYT&!%7=r#_i)@#wCrWDZ1HW$LVnvz-F4Ir z3z%Yq5y+G;?r3py#{N6KW)OX|LzW(7hoLhxqL(>muO?);5wnY=5;El*U(G#+E)ftF zT+cLUQFe*IC=t3JZXb?+|K-cq*JE!v0Wa@%(|5b+yWRBNZu)LFeYcyw+fCo?rtfys zcf0Ak-SpjV`ffLUx0}A(P2cUN?{?F7yXm{#^xbay|E%5Ah>uxIL%OV`Az#+gU}2&! z$Ir{>*N@vDKQ2Fh{_>)umw!6G{@q95Prh$hBH(m{o=;XRhs;hJR!0PHgB+1~>rfxH zqkYWTpgty`IA|i=L|bO^wZQoxUX?&xAUf2+YS0&$DjXOdAXp@W_o#;O(U3L_;X?#D z8{miN{lL#KGaz~(xjxwa1`Na<0s_;X!9ZBT<<#IG9-$eq+F`IWhz5gaXz&mQ74c`_ zA%Kqn4gy$---3!joMWDH18y*Y4ObdUgEwe}4!ALO(2dj~6*xaP3QtmJYrNbD+hD=}p9#cmsfJBClNC0U}4b;QTx}|}8l#VAb zhYs}NI~2g&VF5}9{+N1-e}r&YN1@)hJ|*8UWG=5E`=V24rS>EWwOKq^d-v~W%-0F`?T~7 zRFV&%SDNXY$m)${db1R_8yXH4s2f_1?!W0%nXMZH3tDx9N~wVx6pI(#u-V_BPi*m< zZOR+F@5ZuXJKcCGOa2CdZF#JgDQmf`Ehp4+L9^w2q9&jqpc>qBN#n>~MEq~Lq{(tQ zEtfR+L=d2UTE1(~(2SO2iqMX@j-YOtjqnG{4V_z-qvenKo;MnLo}=&Cl%;23_MFoB zDF?G>IP(6vXFZ0V%V>FwEvM0v6Ul}oE$&K@`@cw!Luj_jnT`2V=pVX6qSf{Zi1jXq&@rQ&UOBRYP35bNDE0M^OghER_V*B7$ z3YHYqlX_V14*a+`i94ky*|1+gnqzOUAK0>zwLW}WUXPd8Km4?O{_)uV`1;a>pAX;t zj?=&U_4CKq-+ld6GSbh-zy5r@F8lJj{Oj@WuV0t#^~=}qUVb^Y@AmIrU%=0Nz=r>B g`YwL>kH2~U@BP2`|K9)mpZec_0=@C7;Q#;&018?uiU0rr diff --git a/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz b/samples/broken-links-ok/google-cloud-synthetics-sdk-broken-links-0.2.0.tgz deleted file mode 100644 index 2ee2f821d01b71af84f751c394dfb99a139d64ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18605 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 E09Ld~*8l(j diff --git a/samples/broken-links-ok/index.js b/samples/broken-links-ok/index.js index 59fc4ad..1c298fe 100644 --- a/samples/broken-links-ok/index.js +++ b/samples/broken-links-ok/index.js @@ -18,11 +18,11 @@ const functions = require('@google-cloud/functions-framework'); const GcmSynthetics = require('@google-cloud/synthetics-sdk-broken-links'); const options = { - origin_uri: "https://en.wikipedia.org/wiki/World_War_II", - link_limit: 50, + origin_uri: "https://example.com", + // link_limit: 10, // query_selector_all: "a", // https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll // get_attributes: ['href'], // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute - link_order: "RANDOM", // "FIRST_N" or "RANDOM" + // link_order: "FIRST_N", // "FIRST_N" or "RANDOM" // link_timeout_millis: 30000, // timeout per link // max_retries: 0, // number of retries per link if it failed for any reason // wait_for_selector: '', // https://pptr.dev/api/puppeteer.page.waitforselector diff --git a/samples/broken-links-ok/package.json b/samples/broken-links-ok/package.json index 1f7050d..877a424 100644 --- a/samples/broken-links-ok/package.json +++ b/samples/broken-links-ok/package.json @@ -7,7 +7,7 @@ "gcp-build": "node node_modules/puppeteer/install.mjs" }, "dependencies": { - "@google-cloud/synthetics-sdk-broken-links": "google-cloud-synthetics-sdk-broken-links-0.2.0.tgz", + "@google-cloud/synthetics-sdk-broken-links": "^0.1.0", "@google-cloud/functions-framework": "^3.1.2" }, "author": "Google Inc.", From 9a4cf8730c6adf662ad532a25687018e004938a1 Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Wed, 27 Mar 2024 15:41:25 -0400 Subject: [PATCH 5/5] response to comments --- .../src/broken_links.ts | 1 - .../src/link_utils.ts | 3 +- .../src/storage_func.ts | 19 ++-- .../example_html_files/integration_server.js | 3 - .../test/unit/broken_links.spec.ts | 93 +++++++++++++++++++ .../test/unit/link_utils.spec.ts | 47 +++++----- .../test/unit/navigation_func.spec.ts | 12 +-- .../test/unit/storage_func.spec.ts | 8 +- 8 files changed, 134 insertions(+), 52 deletions(-) diff --git a/packages/synthetics-sdk-broken-links/src/broken_links.ts b/packages/synthetics-sdk-broken-links/src/broken_links.ts index 968d7c5..c7a899f 100644 --- a/packages/synthetics-sdk-broken-links/src/broken_links.ts +++ b/packages/synthetics-sdk-broken-links/src/broken_links.ts @@ -138,7 +138,6 @@ export async function runBrokenLinks( errors ); - // TODO const storageParams: StorageParameters = { storageClient: storageClient, bucket: bucket, diff --git a/packages/synthetics-sdk-broken-links/src/link_utils.ts b/packages/synthetics-sdk-broken-links/src/link_utils.ts index 2600957..b90412c 100644 --- a/packages/synthetics-sdk-broken-links/src/link_utils.ts +++ b/packages/synthetics-sdk-broken-links/src/link_utils.ts @@ -346,8 +346,9 @@ export function getStoragePathToExecution( // extract folder name for a given storage location. If there is no '/' // present then the storageLocation is just a folder const firstSlashIndex = storageLocation.indexOf('/'); - if (firstSlashIndex !== -1) + if (firstSlashIndex !== -1) { writeDestination = storageLocation.substring(firstSlashIndex + 1); + } // Ensure writeDestination ends with a slash for proper path joining if (writeDestination && !writeDestination.endsWith('/')) { diff --git a/packages/synthetics-sdk-broken-links/src/storage_func.ts b/packages/synthetics-sdk-broken-links/src/storage_func.ts index 3cc38da..524919b 100644 --- a/packages/synthetics-sdk-broken-links/src/storage_func.ts +++ b/packages/synthetics-sdk-broken-links/src/storage_func.ts @@ -91,12 +91,16 @@ export async function getOrCreateStorageBucket( }); } } catch (err) { - if (err instanceof Error) process.stderr.write(err.message); + const errorType = storageLocation + ? 'StorageValidationError' + : 'BucketCreationError'; + + // Using console.error rather than stderr.write since err type is unknown + console.error(errorType, err); + errors.push({ // General error handling - error_type: storageLocation - ? 'StorageValidationError' - : 'BucketCreationError', + error_type: errorType, error_message: `Failed to ${ storageLocation ? 'validate' : 'create' } bucket ${bucketName}. Please reference server logs for further information.`, @@ -122,7 +126,8 @@ export function createStorageClientIfStorageSelected( try { return new Storage(); } catch (err) { - if (err instanceof Error) process.stderr.write(err.message); + console.error('StorageClientInitializationError', err); + errors.push({ error_type: 'StorageClientInitializationError', error_message: @@ -175,8 +180,8 @@ export async function uploadScreenshotToGCS( storageParams.screenshotNumber += 1; screenshot_output.screenshot_file = filename; } catch (err) { - // Handle upload errors - if (err instanceof Error) process.stderr.write(err.message); + console.error('ScreenshotFileUploadError', err); + screenshot_output.screenshot_error = { error_type: 'ScreenshotFileUploadError', error_message: `Failed to take and/or upload screenshot for ${await page.url()}. Please reference server logs for further information.`, diff --git a/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js b/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js index 9f94a98..5e57389 100644 --- a/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js +++ b/packages/synthetics-sdk-broken-links/test/example_html_files/integration_server.js @@ -14,9 +14,6 @@ // Standard Libraries const path = require('path'); -// const proxyquire = require('proxyquire'); - -// const brokenLinksSdkMocked = proxyquire // Internal Project Files const SyntheticsSdkBrokenLinks = require('synthetics-sdk-broken-links'); diff --git a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts index 6754809..0599d4f 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/broken_links.spec.ts @@ -387,4 +387,97 @@ describe('runBrokenLinks', async () => { } ); }).timeout(150000); + + it('Completes a full passing execution', async () => { + const origin_uri = `file:${path.join( + __dirname, + '../example_html_files/retrieve_links_test.html' + )}`; + const inputOptions: BrokenLinkCheckerOptions = { + origin_uri: origin_uri, + query_selector_all: 'a[src]', + get_attributes: ['src'], + screenshot_options: { capture_condition: CaptureCondition.NONE }, + }; + + const result = await runBrokenLinks(inputOptions, args); + + const broken_links_result = result?.synthetic_broken_links_result_v1; + const options = broken_links_result?.options; + const origin_link = broken_links_result?.origin_link_result; + const followed_links = broken_links_result?.followed_link_results; + + expect(result.start_time).to.be.a.string; + expect(result.end_time).to.be.a.string; + + expect(broken_links_result?.link_count).to.equal(2); + expect(broken_links_result?.passing_link_count).to.equal(2); + expect(broken_links_result?.failing_link_count).to.equal(0); + expect(broken_links_result?.unreachable_count).to.equal(0); + expect(broken_links_result?.status2xx_count).to.equal(2); + expect(broken_links_result?.status3xx_count).to.equal(0); + expect(broken_links_result?.status4xx_count).to.equal(0); + expect(broken_links_result?.status5xx_count).to.equal(0); + + expect(options).to.deep.equal({ + origin_uri: origin_uri, + link_limit: 10, + query_selector_all: 'a[src]', + get_attributes: ['src'], + link_order: + BrokenLinksResultV1_BrokenLinkCheckerOptions_LinkOrder.FIRST_N, + link_timeout_millis: 30000, + max_retries: 0, + wait_for_selector: '', + per_link_options: {}, + total_synthetic_timeout_millis: 60000, + screenshot_options: { + capture_condition: ApiCaptureCondition.NONE, + storage_location: '', + }, + }); + + expect(origin_link) + .excluding(['link_start_time', 'link_end_time']) + .to.deep.equal({ + link_passed: true, + expected_status_code: status_class_2xx, + source_uri: origin_uri, + target_uri: origin_uri, + html_element: '', + anchor_text: '', + status_code: 200, + error_type: '', + error_message: '', + link_start_time: 'NA', + link_end_time: 'NA', + is_origin: true, + screenshot_output: emptyScreenshotOutput, + }); + + expect(followed_links) + .excluding(['target_uri', 'link_start_time', 'link_end_time']) + .to.deep.equal([ + { + link_passed: true, + expected_status_code: status_class_2xx, + source_uri: origin_uri, + target_uri: 'CHECKED_BELOW', + html_element: 'a', + anchor_text: 'External Link', + status_code: 200, + error_type: '', + error_message: '', + link_start_time: 'NA', + link_end_time: 'NA', + is_origin: false, + screenshot_output: emptyScreenshotOutput, + }, + ]); + + const expectedTargetPaths = ['example_html_files/200.html']; + followed_links?.forEach((link, index) => { + expect(link.target_uri.endsWith(expectedTargetPaths[index])); + }); + }).timeout(10000); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts index a4b3725..e59d3f1 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/link_utils.spec.ts @@ -265,53 +265,52 @@ describe('GCM Synthetics Broken Links Utilies', async () => { describe('shouldTakeScreenshot', () => { describe('screenshot_condition: ALL', () => { + const options = { + screenshot_options: { capture_condition: ApiCaptureCondition.ALL }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + it('should return true when passed is true', () => { - const options = { - screenshot_options: { capture_condition: ApiCaptureCondition.ALL }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; const result = shouldTakeScreenshot(options, true); expect(result).to.be.true; }); it('should return true when passed is false', () => { - const options = { - screenshot_options: { capture_condition: ApiCaptureCondition.ALL }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; const result = shouldTakeScreenshot(options, false); expect(result).to.be.true; }); }); + describe('screenshot_condition: FAILING', () => { + const options = { + screenshot_options: { + capture_condition: ApiCaptureCondition.FAILING, + }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + it('should return true if passed is false', () => { - const options = { - screenshot_options: { - capture_condition: ApiCaptureCondition.FAILING, - }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; const result = shouldTakeScreenshot(options, false); expect(result).to.be.true; }); it('should return false if passed is true', () => { - const options = { - screenshot_options: { - capture_condition: ApiCaptureCondition.FAILING, - }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; const result = shouldTakeScreenshot(options, true); expect(result).to.be.false; }); }); describe('screenshot_condition: NONE', () => { - it('should always return false', () => { - const options = { - screenshot_options: { capture_condition: ApiCaptureCondition.NONE }, - } as BrokenLinksResultV1_BrokenLinkCheckerOptions; - const result1 = shouldTakeScreenshot(options, true); - const result2 = shouldTakeScreenshot(options, false); - expect(result1).to.be.false; - expect(result2).to.be.false; + const options = { + screenshot_options: { capture_condition: ApiCaptureCondition.NONE }, + } as BrokenLinksResultV1_BrokenLinkCheckerOptions; + + it('should retrun true if passed is false', () => { + const result = shouldTakeScreenshot(options, false); + expect(result).to.be.false; + }); + + it('should retrun true if passed is true', () => { + const result = shouldTakeScreenshot(options, true); + expect(result).to.be.false; }); }); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts index 1c5942f..c751827 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/navigation_func.spec.ts @@ -83,7 +83,6 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { screenshotNumber: 1, }; - // Use proxyquire to replace uploadScreenshotToGCS const navigStorageUploadSuccMocked = proxyquire('../../src/navigation_func', { './storage_func': { ...storageFunc, @@ -101,22 +100,19 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }); beforeEach(async () => { - // Create a new page for each test page = await browser.newPage(); page.setCacheEnabled(false); - // Stub the page.screenshot function sinon .stub(page, 'screenshot') .resolves(Buffer.from('encoded-image-data', 'utf-8')); }); afterEach(() => { - sinon.restore(); // Restore all stubs + sinon.restore(); }); after(async () => { - // Close the browser after all tests browser && (await browser.close()); }); @@ -282,14 +278,14 @@ describe('GCM Synthetics Broken Links Navigation Functionality', async () => { }).timeout(5000); it('returns error when the actual response code does not match the expected', async () => { - // add expected 404 status to options of broken link checker - const optionsExp404 = Object.assign({}, options); const per_link_expected_404 = { expected_status_code: { status_class: ResponseStatusCode_StatusClass.STATUS_CLASS_4XX, }, link_timeout_millis: options.link_timeout_millis, }; + + const optionsExp404 = Object.assign({}, options); optionsExp404.per_link_options['https://expecting404.com'] = per_link_expected_404; @@ -349,7 +345,6 @@ describe('retrieveLinksFromPage', async () => { }); beforeEach(async () => { - // Create a new page for each test page = await browser.newPage(); await page.goto( `file:${path.join( @@ -362,7 +357,6 @@ describe('retrieveLinksFromPage', async () => { }); after(async () => { - // Close the browser after all tests browser && (await browser.close()); }); diff --git a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts index ada0d06..9a29019 100644 --- a/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts +++ b/packages/synthetics-sdk-broken-links/test/unit/storage_func.spec.ts @@ -176,7 +176,7 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { sinon.restore(); }); - describe('valid Storage Configuration', () => { + describe('Valid Storage Configuration', () => { it('should upload the screenshots and return updated write_destination', async () => { const storageParams = { storageClient: storageClientStub, @@ -211,12 +211,6 @@ describe('GCM Synthetics Broken Links storage_func suite testing', () => { expect(result2.screenshot_file).to.equal('screenshot_2.png'); expect(result2.screenshot_error).to.deep.equal({}); - - // TODO - // sinon.assert.calledWithExactly( - // storageClientStub.bucket, - // TEST_BUCKET_NAME - // ); }); it('should handle GCS upload errors', async () => {