@xyo-network/image-thumbnail-plugin 5.1.3 → 5.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Plugin.ts","../../src/Witness/Config.ts","../../src/Witness/Witness.ts","../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../src/Witness/lib/checkIpfsUrl.ts","../../src/Witness/lib/createDataUrl.ts","../../src/Witness/lib/resolveDynamicSvg.ts","../../src/index.ts"],"sourcesContent":["import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailWitness } from './Witness/index.ts'\n\nexport const ImageThumbnailPlugin = () =>\n createPayloadSetDualPlugin<ImageThumbnailWitness, ImageThumbnailDiviner>(\n { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await ImageThumbnailDiviner.create(params)\n return result\n },\n witness: async (params) => {\n const result = await ImageThumbnailWitness.create(params)\n return result\n },\n },\n )\n","import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { WitnessConfig } from '@xyo-network/witness-model'\n\nexport const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const\nexport type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema\n\nexport type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'\n\nexport type ImageThumbnailWitnessConfig = WitnessConfig<{\n dataUrlPassthrough?: boolean\n encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n runExclusive?: boolean\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n","/* eslint-disable max-statements */\nimport { Buffer } from 'node:buffer'\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { exists } from '@xylabs/exists'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { ObjectHasher } from '@xyo-network/hash'\nimport type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { Schema } from '@xyo-network/payload-model'\nimport type { UrlPayload } from '@xyo-network/url-payload-plugin'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { Semaphore } from 'async-mutex'\nimport type { AxiosError, AxiosResponse } from 'axios'\nimport axios from 'axios'\nimport { fileTypeFromBuffer } from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport type { ImageThumbnailEncoding } from './Config.ts'\nimport { ImageThumbnailWitnessConfigSchema } from './Config.ts'\nimport { getVideoFrameAsImageFluent } from './ffmpeg/index.ts'\nimport {\n checkIpfsUrl, createDataUrl, resolveDynamicSvg,\n} from './lib/index.ts'\nimport type { ImageThumbnailWitnessParams } from './Params.ts'\n\n// TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\nconst gm = graphicsMagick.subClass({ imageMagick: '7+' })\n\nexport interface ImageThumbnailWitnessError extends Error {\n name: 'ImageThumbnailWitnessError'\n url: string\n}\n\nexport interface DnsError extends Error {\n code: string\n}\n\nexport class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailWitnessConfigSchema\n\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get encoding() {\n return this.config.encoding ?? 'PNG'\n }\n\n get height() {\n return this.config.height ?? 128\n }\n\n get ipfsGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 4\n }\n\n get quality() {\n return this.config.quality ?? 50\n }\n\n get width() {\n return this.config.width ?? 128\n }\n\n private static async binaryToSha256(data: ArrayBufferLike) {\n const viewData = new Uint8Array(data)\n await ObjectHasher.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(viewData)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(viewData).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): ArrayBufferLike | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Uint8Array.from(atob(data), c => c.codePointAt(0) ?? 0).buffer\n } else {\n const error: ImageThumbnailWitnessError = {\n message: 'Invalid data Url',\n name: 'ImageThumbnailWitnessError',\n url,\n }\n throw error\n }\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n if (!hasbin.sync('magick')) {\n throw new Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter(payload => payload.schema === UrlSchema)\n const process = async () => {\n return (await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n let result: ImageThumbnail\n\n // if it is a data URL, return a Buffer\n const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)\n\n if (dataBuffer) {\n if (this.config.dataUrlPassthrough) {\n result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n let cookedDataBuffer = dataBuffer\n const urlParts = url.split(';')\n const [, contentType] = urlParts[0].split(':')\n if (contentType.startsWith('image/svg')) {\n const [encoding, byteString] = urlParts[1].split(',')\n if (encoding === 'base64') {\n const newSvg = await resolveDynamicSvg(byteString)\n const newSvgDataUrl = createDataUrl(Buffer.from(newSvg).buffer, contentType)\n cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer\n }\n }\n result = await this.processMedia(\n cookedDataBuffer,\n {\n schema: ImageThumbnailSchema,\n sourceUrl: url,\n },\n contentType,\n )\n }\n } else {\n // if it is ipfs, go through cloud flair\n const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)\n result = await this.fromHttp(mutatedUrl, url)\n }\n return result\n }),\n )).filter(exists)\n }\n return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()\n }\n\n private async createThumbnailDataUrl(sourceBuffer: ArrayBufferLike, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(Buffer.from(sourceBuffer))\n .quality(this.quality)\n .resize(this.width, this.height)\n .flatten()\n .toBuffer(encoding ?? this.encoding, (error, buffer) => {\n if (error) {\n reject(error)\n } else {\n resolve(buffer)\n }\n })\n })\n return createDataUrl(thumb.buffer, 'image/png')\n }\n\n /**\n * Creates an image thumbnail from a video.\n * @param videoBuffer The input video buffer.\n * @returns An buffer containing an image thumbnail for the video.\n */\n private async createThumbnailFromVideo(videoBuffer: ArrayBufferLike) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer.buffer)\n }\n\n // eslint-disable-next-line complexity\n private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {\n let response: AxiosResponse\n let dnsResult: string[]\n try {\n const urlObj = new Url(url)\n dnsResult = await dnsPromises.resolve(urlObj.host)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: { code: error.code },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n return result\n }\n try {\n response = await axios.get(url, { responseType: 'arraybuffer' })\n } catch (ex) {\n const axiosError = ex as AxiosError\n if (axiosError.isAxiosError) {\n // selectively pick fields from AxiosError\n const result: ImageThumbnail = {\n http: { ipAddress: dnsResult[0] },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n if (axiosError?.response?.status !== undefined) {\n result.http = result.http ?? {}\n result.http.status = axiosError?.response?.status\n }\n if (axiosError?.code !== undefined) {\n result.http = result.http ?? {}\n result.http.code = axiosError?.code\n }\n return result\n } else {\n throw ex\n }\n }\n\n const result: ImageThumbnail = {\n http: { status: response.status },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n\n if (response.status >= 200 && response.status < 300) {\n const contentType: string | undefined = response.headers['content-type']?.toString()\n const sourceBuffer = Buffer.from(response.data, 'binary').buffer\n\n return this.processMedia(sourceBuffer, result, contentType)\n }\n return result\n }\n\n private async processMedia(sourceBuffer: ArrayBufferLike, imageThumbnail: ImageThumbnail, contentType?: string): Promise<ImageThumbnail> {\n const [mediaType, fileType] = contentType?.split('/') ?? ['', '']\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.returned = mediaType\n\n try {\n imageThumbnail.mime.detected = await fileTypeFromBuffer(sourceBuffer as ArrayBuffer)\n } catch (ex) {\n const error = ex as Error\n this.logger?.error(`FileType error: ${error.message}`)\n }\n\n const processImage = async (encoding?: ImageThumbnailEncoding) => {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n\n if (hasbin.sync('ffmpeg')) {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.invalid = true\n }\n }\n\n let encoding: ImageThumbnailEncoding = 'PNG'\n\n switch (fileType.toUpperCase()) {\n case 'GIF': {\n encoding = 'GIF'\n break\n }\n case 'JPG':\n case 'JPEG': {\n encoding = 'JPG'\n break\n }\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n imageThumbnail.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = mediaType\n break\n }\n default: {\n const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split('/') ?? ['', '']\n switch (detectedMediaType) {\n case 'image': {\n await processImage()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n default: {\n imageThumbnail.mime.invalid = true\n break\n }\n }\n break\n }\n }\n return imageThumbnail\n }\n}\n","import { unlink, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport type { WritableOptions } from 'node:stream'\nimport { Writable } from 'node:stream'\n\nimport ffmpeg from 'fluent-ffmpeg'\nimport { v4 as uuid } from 'uuid'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBufferLike) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', err => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nconst allowIpfsIoRepair = true\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway?: string): string => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else if (allowIpfsIoRepair && protocol === 'https' && host === 'ipfs.io') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n const pathParts = path.split('/')\n if (pathParts[0] === 'ipfs') {\n pathParts.shift()\n }\n path = pathParts.join('/')\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch {\n // const error = ex as Error\n // console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n // console.log(error.stack)\n return urlToCheck\n }\n}\n","import { fromByteArray } from 'base64-js'\n\nexport const createDataUrl = (data: ArrayBufferLike, contextType: string, encoding: 'base64' = 'base64') => {\n return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`\n}\n","import type { AxiosResponse } from 'axios'\nimport axios from 'axios'\nimport { toByteArray } from 'base64-js'\nimport { Builder, parseStringPromise } from 'xml2js'\n\nexport const resolveDynamicSvg = async (base64Bytes: string) => {\n const decoder = new TextDecoder()\n const bytes = toByteArray(base64Bytes)\n const svg = decoder.decode(bytes)\n const svgObj = await parseStringPromise(svg)\n const svgNode = svgObj['svg']\n const imageResults = (await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svgNode['image'].map(async (img: any) => [\n img.$,\n await axios.get(img.$.href, { responseType: 'arraybuffer' }),\n ]),\n )) as [string, AxiosResponse][]\n const image = imageResults.map(([href, response]) => {\n if (response.data) {\n const sourceBuffer = Buffer.from(response.data, 'binary')\n return { $: { href: `data:${response.headers['content-type']?.toString()};base64,${sourceBuffer.toString('base64')}` } }\n } else {\n return { $: { href } }\n }\n })\n const updatedSVG = { ...svgObj, svg: { ...svgNode, image } }\n const builder = new Builder()\n return builder.buildObject(updatedSVG)\n}\n","export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts'\nexport * from './Witness/index.ts'\nexport * from '@xyo-network/diviner-image-thumbnail'\n"],"mappings":"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","names":["ImageThumbnailSchema","Buffer","ImageThumbnailSchema","axios","ImageThumbnailSchema","Buffer","result","axios","encoding","ImageThumbnailSchema"]}
1
+ {"version":3,"sources":["../../src/Plugin.ts","../../src/Witness/Config.ts","../../src/Witness/Witness.ts","../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../src/Witness/lib/checkIpfsUrl.ts","../../src/Witness/lib/createDataUrl.ts","../../src/Witness/lib/resolveDynamicSvg.ts","../../src/index.ts"],"sourcesContent":["import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailWitness } from './Witness/index.ts'\n\nexport const ImageThumbnailPlugin = () =>\n createPayloadSetDualPlugin<ImageThumbnailWitness, ImageThumbnailDiviner>(\n { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await ImageThumbnailDiviner.create(params)\n return result\n },\n witness: async (params) => {\n const result = await ImageThumbnailWitness.create(params)\n return result\n },\n },\n )\n","import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { WitnessConfig } from '@xyo-network/witness-model'\n\nexport const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const\nexport type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema\n\nexport type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'\n\nexport type ImageThumbnailWitnessConfig = WitnessConfig<{\n dataUrlPassthrough?: boolean\n encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n runExclusive?: boolean\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n","/* eslint-disable max-statements */\nimport { Buffer } from 'node:buffer'\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { exists } from '@xylabs/exists'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { ObjectHasher } from '@xyo-network/hash'\nimport type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { Schema } from '@xyo-network/payload-model'\nimport type { UrlPayload } from '@xyo-network/url-payload-plugin'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { Semaphore } from 'async-mutex'\nimport type { AxiosError, AxiosResponse } from 'axios'\nimport axios from 'axios'\nimport { fileTypeFromBuffer } from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport type { ImageThumbnailEncoding } from './Config.ts'\nimport { ImageThumbnailWitnessConfigSchema } from './Config.ts'\nimport { getVideoFrameAsImageFluent } from './ffmpeg/index.ts'\nimport {\n checkIpfsUrl, createDataUrl, resolveDynamicSvg,\n} from './lib/index.ts'\nimport type { ImageThumbnailWitnessParams } from './Params.ts'\n\n// TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\nconst gm = graphicsMagick.subClass({ imageMagick: '7+' })\n\nexport interface ImageThumbnailWitnessError extends Error {\n name: 'ImageThumbnailWitnessError'\n url: string\n}\n\nexport interface DnsError extends Error {\n code: string\n}\n\nexport class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailWitnessConfigSchema\n\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get encoding() {\n return this.config.encoding ?? 'PNG'\n }\n\n get height() {\n return this.config.height ?? 128\n }\n\n get ipfsGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 4\n }\n\n get quality() {\n return this.config.quality ?? 50\n }\n\n get width() {\n return this.config.width ?? 128\n }\n\n private static async binaryToSha256(data: ArrayBufferLike) {\n const viewData = new Uint8Array(data)\n await ObjectHasher.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(viewData)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(viewData).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): ArrayBufferLike | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Uint8Array.from(atob(data), c => c.codePointAt(0) ?? 0).buffer\n } else {\n const error: ImageThumbnailWitnessError = {\n message: 'Invalid data Url',\n name: 'ImageThumbnailWitnessError',\n url,\n }\n throw error\n }\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n if (!hasbin.sync('magick')) {\n throw new Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter(payload => payload.schema === UrlSchema)\n const process = async () => {\n return (await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n let result: ImageThumbnail\n\n // if it is a data URL, return a Buffer\n const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)\n\n if (dataBuffer) {\n if (this.config.dataUrlPassthrough) {\n result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n let cookedDataBuffer = dataBuffer\n const urlParts = url.split(';')\n const [, contentType] = urlParts[0].split(':')\n if (contentType.startsWith('image/svg')) {\n const [encoding, byteString] = urlParts[1].split(',')\n if (encoding === 'base64') {\n const newSvg = await resolveDynamicSvg(byteString)\n const newSvgDataUrl = createDataUrl(Buffer.from(newSvg).buffer, contentType)\n cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer\n }\n }\n result = await this.processMedia(\n cookedDataBuffer,\n {\n schema: ImageThumbnailSchema,\n sourceUrl: url,\n },\n contentType,\n )\n }\n } else {\n // if it is ipfs, go through cloud flair\n const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)\n result = await this.fromHttp(mutatedUrl, url)\n }\n return result\n }),\n )).filter(exists)\n }\n return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()\n }\n\n private async createThumbnailDataUrl(sourceBuffer: ArrayBufferLike, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(Buffer.from(sourceBuffer))\n .quality(this.quality)\n .resize(this.width, this.height)\n .flatten()\n .toBuffer(encoding ?? this.encoding, (error, buffer) => {\n if (error) {\n reject(error)\n } else {\n resolve(buffer)\n }\n })\n })\n return createDataUrl(thumb.buffer, 'image/png')\n }\n\n /**\n * Creates an image thumbnail from a video.\n * @param videoBuffer The input video buffer.\n * @returns An buffer containing an image thumbnail for the video.\n */\n private async createThumbnailFromVideo(videoBuffer: ArrayBufferLike) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer.buffer)\n }\n\n // eslint-disable-next-line complexity\n private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {\n let response: AxiosResponse\n let dnsResult: string[]\n try {\n const urlObj = new Url(url)\n dnsResult = await dnsPromises.resolve(urlObj.host)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: { code: error.code },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n return result\n }\n try {\n response = await axios.get(url, { responseType: 'arraybuffer' })\n } catch (ex) {\n const axiosError = ex as AxiosError\n if (axiosError.isAxiosError) {\n // selectively pick fields from AxiosError\n const result: ImageThumbnail = {\n http: { ipAddress: dnsResult[0] },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n if (axiosError?.response?.status !== undefined) {\n result.http = result.http ?? {}\n result.http.status = axiosError?.response?.status\n }\n if (axiosError?.code !== undefined) {\n result.http = result.http ?? {}\n result.http.code = axiosError?.code\n }\n return result\n } else {\n throw ex\n }\n }\n\n const result: ImageThumbnail = {\n http: { status: response.status },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n\n if (response.status >= 200 && response.status < 300) {\n const contentType: string | undefined = response.headers['content-type']?.toString()\n const sourceBuffer = Buffer.from(response.data, 'binary').buffer\n\n return this.processMedia(sourceBuffer, result, contentType)\n }\n return result\n }\n\n private async processMedia(sourceBuffer: ArrayBufferLike, imageThumbnail: ImageThumbnail, contentType?: string): Promise<ImageThumbnail> {\n const [mediaType, fileType] = contentType?.split('/') ?? ['', '']\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.returned = mediaType\n\n try {\n imageThumbnail.mime.detected = await fileTypeFromBuffer(sourceBuffer as ArrayBuffer)\n } catch (ex) {\n const error = ex as Error\n this.logger?.error(`FileType error: ${error.message}`)\n }\n\n const processImage = async (encoding?: ImageThumbnailEncoding) => {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n\n if (hasbin.sync('ffmpeg')) {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.invalid = true\n }\n }\n\n let encoding: ImageThumbnailEncoding = 'PNG'\n\n switch (fileType.toUpperCase()) {\n case 'GIF': {\n encoding = 'GIF'\n break\n }\n case 'JPG':\n case 'JPEG': {\n encoding = 'JPG'\n break\n }\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n imageThumbnail.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = mediaType\n break\n }\n default: {\n const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split('/') ?? ['', '']\n switch (detectedMediaType) {\n case 'image': {\n await processImage()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n default: {\n imageThumbnail.mime.invalid = true\n break\n }\n }\n break\n }\n }\n return imageThumbnail\n }\n}\n","import { unlink, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport type { WritableOptions } from 'node:stream'\nimport { Writable } from 'node:stream'\n\nimport ffmpeg from 'fluent-ffmpeg'\nimport { v4 as uuid } from 'uuid'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBufferLike) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', err => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nconst allowIpfsIoRepair = true\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway?: string): string => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else if (allowIpfsIoRepair && protocol === 'https' && host === 'ipfs.io') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n const pathParts = path.split('/')\n if (pathParts[0] === 'ipfs') {\n pathParts.shift()\n }\n path = pathParts.join('/')\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch {\n // const error = ex as Error\n // console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n // console.log(error.stack)\n return urlToCheck\n }\n}\n","import { fromByteArray } from 'base64-js'\n\nexport const createDataUrl = (data: ArrayBufferLike, contextType: string, encoding: 'base64' = 'base64') => {\n return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`\n}\n","import type { AxiosResponse } from 'axios'\nimport axios from 'axios'\nimport { toByteArray } from 'base64-js'\nimport { Builder, parseStringPromise } from 'xml2js'\n\nexport const resolveDynamicSvg = async (base64Bytes: string) => {\n const decoder = new TextDecoder()\n const bytes = toByteArray(base64Bytes)\n const svg = decoder.decode(bytes)\n const svgObj = await parseStringPromise(svg)\n const svgNode = svgObj['svg']\n const imageResults = (await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svgNode['image'].map(async (img: any) => [\n img.$,\n await axios.get(img.$.href, { responseType: 'arraybuffer' }),\n ]),\n )) as [string, AxiosResponse][]\n const image = imageResults.map(([href, response]) => {\n if (response.data) {\n const sourceBuffer = Buffer.from(response.data, 'binary')\n return { $: { href: `data:${response.headers['content-type']?.toString()};base64,${sourceBuffer.toString('base64')}` } }\n } else {\n return { $: { href } }\n }\n })\n const updatedSVG = { ...svgObj, svg: { ...svgNode, image } }\n const builder = new Builder()\n return builder.buildObject(updatedSVG)\n}\n","export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts'\nexport * from './Witness/index.ts'\nexport * from '@xyo-network/diviner-image-thumbnail'\n"],"mappings":"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","names":["ImageThumbnailSchema","Buffer","ImageThumbnailSchema","axios","ImageThumbnailSchema","Buffer","result","axios","encoding","ImageThumbnailSchema"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/image-thumbnail-plugin",
3
- "version": "5.1.3",
3
+ "version": "5.1.5",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -32,54 +32,57 @@
32
32
  "types": "./dist/node/index.d.ts",
33
33
  "files": [
34
34
  "dist",
35
- "src"
35
+ "src",
36
+ "!**/*.bench.*",
37
+ "!**/*.spec.*",
38
+ "!**/*.test.*"
36
39
  ],
37
40
  "dependencies": {
38
- "@xylabs/assert": "~5.0.11",
39
- "@xylabs/exists": "~5.0.11",
40
- "@xyo-network/abstract-witness": "~5.1.2",
41
- "@xyo-network/diviner-image-thumbnail": "~5.1.3",
42
- "@xyo-network/hash": "~5.1.2",
43
- "@xyo-network/image-thumbnail-payload-plugin": "~5.1.3",
44
- "@xyo-network/module-model": "~5.1.2",
45
- "@xyo-network/payload-model": "~5.1.2",
46
- "@xyo-network/payloadset-plugin": "~5.1.2",
47
- "@xyo-network/url-payload-plugin": "~5.1.3",
48
- "@xyo-network/witness-model": "~5.1.2",
41
+ "@xylabs/assert": "~5.0.37",
42
+ "@xylabs/exists": "~5.0.37",
43
+ "@xyo-network/abstract-witness": "~5.1.23",
44
+ "@xyo-network/diviner-image-thumbnail": "~5.1.5",
45
+ "@xyo-network/hash": "~5.1.23",
46
+ "@xyo-network/image-thumbnail-payload-plugin": "~5.1.5",
47
+ "@xyo-network/module-model": "~5.1.23",
48
+ "@xyo-network/payload-model": "~5.1.23",
49
+ "@xyo-network/payloadset-plugin": "~5.1.23",
50
+ "@xyo-network/url-payload-plugin": "~5.1.5",
51
+ "@xyo-network/witness-model": "~5.1.23",
49
52
  "async-mutex": "~0.5.0",
50
- "axios": "~1.11.0",
53
+ "axios": "~1.13.2",
51
54
  "base64-js": "~1.5.1",
52
- "file-type": "~21.0.0",
55
+ "file-type": "~21.1.0",
53
56
  "fluent-ffmpeg": "~2.1.3",
54
57
  "gm": "~1.25.1",
55
58
  "hasbin": "~1.2.3",
56
59
  "hash-wasm": "~4.12.0",
57
60
  "sha.js": "~2.4.12",
58
61
  "url-parse": "~1.5.10",
59
- "uuid": "~11.1.0",
62
+ "uuid": "~13.0.0",
60
63
  "xml2js": "~0.6.2"
61
64
  },
62
65
  "devDependencies": {
63
- "@types/fluent-ffmpeg": "~2.1.27",
66
+ "@types/fluent-ffmpeg": "~2.1.28",
64
67
  "@types/gm": "~1.25.4",
65
68
  "@types/hasbin": "~1.2.2",
66
69
  "@types/sha.js": "~2.4.4",
67
70
  "@types/url-parse": "~1.4.11",
68
- "@types/uuid": "~10.0.0",
71
+ "@types/uuid": "~11.0.0",
69
72
  "@types/xml2js": "~0.4.14",
70
- "@xylabs/delay": "~5.0.11",
71
- "@xylabs/ts-scripts-yarn3": "~7.1.7",
72
- "@xylabs/tsconfig": "~7.1.7",
73
- "@xylabs/vitest-extended": "~5.0.11",
74
- "@xyo-network/account": "~5.1.2",
75
- "@xyo-network/archivist-memory": "~5.1.2",
76
- "@xyo-network/node-memory": "~5.1.2",
77
- "@xyo-network/payload-builder": "~5.1.2",
78
- "@xyo-network/sentinel-memory": "~5.1.2",
79
- "@xyo-network/sentinel-wrapper": "~5.1.2",
80
- "@xyo-network/witness-timestamp": "~5.1.2",
81
- "typescript": "~5.9.2",
82
- "vitest": "~3.2.4"
73
+ "@xylabs/delay": "~5.0.37",
74
+ "@xylabs/ts-scripts-yarn3": "~7.2.8",
75
+ "@xylabs/tsconfig": "~7.2.8",
76
+ "@xylabs/vitest-extended": "~5.0.37",
77
+ "@xyo-network/account": "~5.1.23",
78
+ "@xyo-network/archivist-memory": "~5.1.23",
79
+ "@xyo-network/node-memory": "~5.1.23",
80
+ "@xyo-network/payload-builder": "~5.1.23",
81
+ "@xyo-network/sentinel-memory": "~5.1.23",
82
+ "@xyo-network/sentinel-wrapper": "~5.1.23",
83
+ "@xyo-network/witness-timestamp": "~5.1.23",
84
+ "typescript": "~5.9.3",
85
+ "vitest": "~4.0.10"
83
86
  },
84
87
  "publishConfig": {
85
88
  "access": "public"
@@ -48,7 +48,7 @@ export const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBufferLike) =
48
48
  const ffmpegOutput = new FfmpegOutputStream()
49
49
  // Execute ffmpeg using fluent API
50
50
  ffmpeg()
51
- // NOTE: Uncomment to debug CLI args to ffmpeg
51
+ // Uncomment to debug CLI args to ffmpeg
52
52
  // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))
53
53
  .on('error', err => reject(err.message))
54
54
  // Listen for the 'end' event to combine the output into a buffer holding the PNG image
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.data.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.data.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.data.spec.ts"],"names":[],"mappings":"AACA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.dynamic-svg.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.dynamic-svg.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.dynamic-svg.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.https.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.https.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.https.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.ipfs.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.ipfs.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.ipfs.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.sentinel.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.sentinel.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.sentinel.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Witness.video.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.video.spec.d.ts","sourceRoot":"","sources":["../../../../src/Witness/spec/Witness.video.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,47 +0,0 @@
1
- /* eslint-disable @stylistic/max-len */
2
- import '@xylabs/vitest-extended'
3
-
4
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
6
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
7
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
8
- import hasbin from 'hasbin'
9
- import {
10
- describe, expect,
11
- it,
12
- } from 'vitest'
13
-
14
- import { ImageThumbnailWitness } from '../Witness.ts'
15
-
16
- const testIfHasBin = (bin: string) => (hasbin.sync(bin) ? it : it.skip)
17
-
18
- /**
19
- * @group thumbnail
20
- */
21
-
22
- describe('ImageThumbnailWitness', () => {
23
- testIfHasBin('magick')('DATA [medium/png]', async () => {
24
- const witness = await ImageThumbnailWitness.create({ account: 'random' })
25
- const httpsPayload: UrlPayload = {
26
- schema: UrlSchema,
27
- url: 'data:image/jpeg;base64,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',
28
- }
29
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
30
- expect(result.length).toBe(1)
31
- // console.log(`DATA/PNG Size: ${result[0].url?.length}}`)
32
- expect(result[0].url?.length).toBeLessThan(64_000)
33
- expect(result[0].schema).toBe(ImageThumbnailSchema)
34
- })
35
-
36
- testIfHasBin('magick')('DATA [medium/svg]', async () => {
37
- const witness = await ImageThumbnailWitness.create({ account: 'random' })
38
- const httpsPayload: UrlPayload = {
39
- schema: UrlSchema,
40
- url: 'data:image/svg+xml;utf8, PHN2ZyB2aWV3Qm94PScwIDAgNTEyIDUxMicgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pZFlNaWQgbWVldCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc+PGltYWdlIHhsaW5rOmhyZWY9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZ0FBQUFJQUNBTUFBQUREcGlUSUFBQUJnRkJNVkVVWEZ4Y1hHQmdaR2hvYkhCc2NHeHNiSEJ3Y0hCc2VIaDRnSHg4ZklDQWdJQjhoSVNFa0l5TWpKQ1FrSkNNbUppVW9KeWNuS0Nnb0tDY3FLU2tzS3lzckxDd3NMQ3N1TFMwd0x5NHZNREF4TUM4eU1URTBNekl6TkRRMU5ETTJOVFE0TnpZM09EZzVPRGM2T1RrOE96bzdQRHc4UERzK1BqMUFQejgvUUVCQVFEOUNRVUZFUTBKRFJFUkVSRU5HUmtWSVIwZEhTRWhJU0VkS1NVbE1TMHRMVEV4TVRFdE9UVTFRVDA5UFVGQlFVRTlTVVZGVVUxTlRWRlJVVkZOV1ZsVllWMWRYV0ZoWVdGZGFXbGxjVzF0YlhGeGNYRnRlWGwxZ1gxOWZZR0JnWUY5aVlXRmtZMk5qWkdSa1pHTm1abVpvWjJkbmFHaG9hR2RwYVdsc2EydHJiR3h0Ylcxd2IyOXdjRzl4Y1hGMGMzTjBkSE4xZFhWNGQzZDRlSGQ1ZVhsOGUzdDhmSHQ5ZlgyQWYzK0FnSCtDZ1lHRWc0T0ZoWVdJaDRlSWlJZUppWW1NaTR1TWpJdU5qWTJUazVPWW1KZWFtcHFjbTV1Y25KdWVucDZnbjUraG9hR2tvNk9scGFXb3A2ZXJxNnV6czdPNHVMZTh2THpEdzhQT3pzN1oyZG5ScGhtV0FBQ0FBRWxFUVZSNG5OUzlpNVBhUnZZLzZqdXpIbkVSQ3dSeEVVYnRsb3hVaUVJVW9vQUwxTUNGS1poQ1U4T1V4K1d4eDY5eG5FMTJzL3ZOSnBOa04zRnNiL0xkZi8zMlV5OGtJY2FQNUhmS1pxRFZhclg2ZlByME9hZFBkOS9LaW9LWXlXZHpRakVyWnZNWlVkN0RCQmhCcUtxYXJxblFwZjI5OXlQd2djbnE3cEk3cmpZei9ORnJtcWFYRmIwckFJWXhyNTllZEdnRCtLNEJNRzk2K2RBbGNoVkNBNUdiRmYvZ0JRSFE2dVBHeEJjMUhaR0dTSVUwbDVkcEsxVnJsOVBpMFlVc2Q1L0tvUHgwV1NoZGppVUFaUDJaQ3FUSGt3cFFwQXVuQUVEaDdGRzV1THBmVkFxaloxY1g5VXBzZ2JlTzljenEwSEdrdkNOcHg2dVZtZ01oUHFGYXE2b1BBVEExcXo4Ri93Rndkc3BONitDcjBENU83WS94cHo0SzV6YmFveVhVVGl3MWdqK0x3OUdnYjNkc0NnREVkNXpmOE45TVdPdmV1WUNRTkNWaFAwWUFKRUNpL0U4TkFDQU5yc3dyVzVLN0x4QUFYbnhwU1U4b0FLNFFBSjRnQU1qNnF4ZHlEUUhncTJuUk9TOVcxUytHMnZtNkdGdmVMYzNKcjF2NUl6dC9Lb2xxenA0TFhqTnhDaUVna3JFcEFaRHVKWGVpZm5ON25panlJY0NjMDZSamZtM3NtSVExaCt1QnFtbm1JcEk3cUNjYjVxcEh2aHVzdCtOa2xwY3hsdWZXeDRCS0M2MWUxelRJOHhxK2RrMUZOZW5CeGYyU3dnQndmbGtMQWFBMFAzOXFseEVBTGw4YUNBQnk2NVZTMHZWU2JIbTNaZzhyemgxeDBFY0FrSWF6K1ZLSWVOTWdBdElDSUJJVUg0SG1ON3pQVnlkOTBmT1hwSTNBcW0wWXR0TUh1TU9xN1VsTUVYRFZpRWlNWk9WRTgrZHc4NmlNMG1OQXN2L1NMZ01HZ01HTGVSQUFTdmxaZjNsV1VBcG5KK2NQRUFBcTdaZGcvZVNpSEZ2Y0xRa0ovenNaQW9DSkxUVVdFUUFnQ05oOURBQUgrNFRobmpoSTgzNjdrNzlwVXhKdmFRK1ViYWNGZ04yaXlYcmZNSnoyMFJEekJ3M1c2cXdkWFV6OXBJNTZ1ci9BQVBkMTMyMXd2bm5kNVQ1djNqUlZyOHFQMTQvS05RNkF3Y3ZuWTBrcGx6a0FLcTJyenVnVnFDSUFHRmVQaUFRQTV1aTVGRnZlTFh1VWMrNFVDUUJHczhZMFFnSUVaQlQrcSt6ZFF1MzJmNlh1N1hTYy9XaGtiQXpkMjRrM3RxK2VnM216ejBveU80aXJJeFZ6Q0t0cXgrYkcvYTFqbE1NOGh1Nnc3N0xQWTJSbnNmUnVHSmdiMllMTVR3dUE0dlJwL2RtNHhBRWduZjExTEJWYmQwY3ZxZ1FBQmVmeTR1SnFKQ0VBRkNkZklRQm9Yd3pVOVhtQ0R0Q1ZoVzVGYkRWejNXS2gwemR0WWFNYTRlb3B4ZjJqTi8vN3Vyc0ZBV25lNXNQUWNudVdNUEgzOFZkVTdUSjV2aGh5bnFoSVVUZWNLQW16SERqOUk4QTFQWjhLZ01ydUVHYVAwVGppNWFkZlBYNEh0YXIwSkd0WGc4TDQyVjI1K3d3QjRObWdwRjJOSmZYeDU4OEhSU0JkVGlyVlovMWljZm13VkZpZkZNc1h5QW9vSHI3NC9FSlBHQUp3RXh5MENxSW81a3JvUXl6RzFjaE5sSVdqMzdveSt2OEg0VDlvMjd2ZjQ3WjhSRTFud08yaEVGb1JLc2JvdUllWWo5bHNCQURBV200K1dDejZTd3NOVGpRN0FwRGR3UU1wRmljZTQ5MmE3Rkx2aW54SGtxVTd0YXA4cHdpS2QrNVVpbmVxbGJJRTVLS0NmOHJsTzFKVnJ0MHBsdTdja2NyeW5SS29GV1dsRk05L2NJdU9nOTJsQ2QxV2taUHJJTzIvNjc3NjdlSERIdytTQVBCeHhYNlFkck1FQVduMGhNN1hiNUFzbUZPM2J5OEc2c2IxUHVpYzkvRTN0OThiUnB0Wjg2aElyRXFZZFZSMER4ZGtMeWVkMFpCd1gvTWpZTmM2ZnlTNnhaUjZNSjVxVkRhQnFxb29TYmNVOS8rYi85Ly8vbnJ2dDJRMTRGTzlBWEFIMlBSRU9SREhCN1BMOHR5K2ZYc1BtTE1PU2ExUHgvU3lQZkp4bmhIaXYwRmRRZkRRV1E2WkxEQnRhejYzSUZ6YUd2UDhlQUpneHhwL05MckZsUHJib0Q3WDBmaGVVeFJVVGFXYWNJc3JBWktWZ0UvMkNtaG9uYVhMNTJ0MlQ2ZU55RWRGTjM4TmlIOXFrMm5kWEhXMFE0UUV4d09BSndHSUJ4Qm43bmlQVXBjMkdmVTF5bjgxNUUvNlE2RGdGbmZ1b3FHcm9pZ0tGbFdvb2trSWtHOVJIY0JNNVArbkJBQ1lwcklFSTdyZVprTGR0R3lxc1puRzZQOXRZZzZmREkvV2oxcVkyZDNGeUJqTkxUTGlFL2NmK1FJOEFCalROaXVXL2lIY1o3SS8rUFEvaWhDNFJSdzdaTUErb1k0cVdzOEVBS0NPZi9RYVdRRjc1dlgxOWJjTHp2RHA1NzhmQU16aHplNExNdUgwNHZ6c1pPVzBtNGlwNDlWeWpNUjYvN1FMb2FuM0QvdnJPdVk1MUk1c2cvRWRFLzFMa1lCL3ozcXNYRFkzb0RJRUpFajkzeGtIdDhpVUIvazZwVEpzS3dBUWM2a2Z3SG8zR2psdmxvemh4OS85ZmdEd25ManZTNnRENGxsdWpRMUd2ZVVZVEhyQTdKODJPYlBKaU4vd0FZRE1BZG45cVhORVBVbGMxSEJMQXNTeitYZVhBeFFBeG1DNlduU2dod0JRamRjRFhSWmI3Mjd2N1owanZuOEdQcU1BS1ArNThCbitKQUR3UGo0KzJaMFBVNDYyeHAralpXZkNBWUJzakdVTGU0ZnRJV0gyWUlsVnZqWUNBSjM5NHhMQUdqUjg3a0NtWlhxamZsejMvNzM1ajYwQVRKcWpBd2pUaVFBZkFENFRQdnZteWQ3eTUrdC9QMFFBMkovOXBOMy8yOTdlMzUxUHJ3Kzhsd2p3Mk5DK3dKOUxiYjUyK1cvZWJ5THBEbVlqck9qRDl0U0dzTkZHQ0lEQUZRRVlBQ1BOVSsraG53RFlVRFY4eWU5VDdROUN0eUF6aXBjbUNGUy9GbnVMQjREZlhyOStlMzFuVHpWdk45LzkrZmk3emh0cjd4d0I0QnNueVB4UEFZSDJVbitQdXlHVmc3M3grRDc2MWJXNGVrL1krM0IraEpnN1dQQnhIaEhpdnl2OEFiVUpISmZqNGNuVE1CcEErUGZ2U3JjR2RWWmhQSDZwbmdpSWxRQzNmUkxnYmxYNzV1VmU0ZVRGeTNlZkhWKy8vWHB2RXdBQWhBTU1NRWtDSXpFdzFCVERDUkdFYnMyeVBFcXQ1dVpXNXp0RmhvU0l5dkZsZytod3pTNVQ4eWlYMjRkVE5PQTNtTDd2QW9EZFJhRUQ5QkZucUxycDR3OUlnajhHMzEyNjFScndpczQ2YU5CeTM5RTFCTlZ3MXdycUFLUFgrMy8veDJqKzlyUGpYeS9lMmdRQTM0WWtBQ2ZjZ2RqWG5ENGxOQklEYnNlc05jNXU4VU9DbkRHWGFOMlVuQ0RrUEx6MDVqZHFXQjZRZ2I3UVh0eG96SGxmcDM5Ym1NMk50amZ0QStrdHFpOU9TSjl1elBDNnVVTWMvMFB4SHcwQjFJK0tQZG1IWGFoYStJZHZERkRIODFYSXlQWUJvUEpuNlc5L3YvM0Q0ZTMyZjVBRXVMMytSWnk4L2t6NkphZ0Q4UHQ0cStMdnVjWnFkWHE1V2sxREFCaWVpN0tTN0lqTW1XY1ZDb0NhTUprSVBrbWxIOGRNMnlhUllVMzdHaUFqdVRWaDdISmNXZS9GYXpUYWJzQUhrZXF1VjVlVk16RTh6K0lmcTQ4bjB5MDR4bE1wQnREcUVJN0dxNjdUdzlvckd3TVErdzJnQmwzdGV6NEEvUFRUejlkMzk5WS8vM1Q5NWpOa0JRalhsK0ozcjcvL0xxd0UwaHM5RXdPQUVwTCsvUWQ0SU1oa0NoVXhJK1l5R1ZISUNnZ0FwYXlRRWJQb1Y2WlF6QWdpam5Zb1pJUmN1WUxTME45S0FXV3JsZERsbkpnNVhnaFpLWjhSc29WYUlaUEpDWVVFMVNXYTRQeXczaDRqSkxicmNHUXpmczhiSEFFb3graW93NFNCTVRzQmZCS1hlblo4QldtenpiSDlENFVEb28xdHp0QWdNN0M5bkRRUG5WRVAxVmRYVmYzWWhBQkR1NllROWlQU2w0RnlYTHI5R1NMODVjOTMvdnpabmxoQVh6N2IyNWNMbi8yWjV6Z0lBRUQxeWN4YVZldy9LRW8xb1djTEJYbFVQYkJ0YzlLWEVBQ3k5eWI2ZnJPdlQwYXlOSmkyc3FXS2NIY3kwUVh4N2tnZlRlNEpvallwNXZQVzdMQWh0dStmalNzSGQ4ZlRmalVyMkxZeEdjaHlSSWhPQXRsSE9xMVJ2VjB0eTdrY25nK3RnTjU2ZmJvRWtnUWxxYXpseFZvVENZQktYcXFvSTExMUxYdEtCdmNCOVMycVNQaG1HUDVRbzMyY09YWUxWNzdlMVdETEpqVzJGOWljd1M4Sm1uTSs0ZEdjaFF0S1NTQXczUW9Eem5BTWdESVFWa3Vob0R6VkRvNGVycGRuVlFTQU8rZUhHV0gwZUgzMDRQeDB1YndjWmtUejRYeHkwVC9RTDArTzFwZWFZRDZTaEtNSDQvbXAxblNPKzJYbGJEbFpuMWNPNWhmcm80dXpYSE9uOEJEc1FtU2RWdXhUQW5seVJSWUhsbkJuQ0FTOUszWk4ySk9hZlJFMmw4c0ZWSkQwS2ZtNnUyRU1MeHpuaUJSRXdNQjlQMzhrL3NjRDRJUzlob1hIVHdoeEFDUjloYjV2UUczN1duVW5CQ1RZZnhzQWtJVGl3ZkJjT1ZtSXhlem9VaGJ1UHAwSW1kbVpLRGlIZ21DZkYvUW5wbEE2UHp4QUFDZzhzZ1FoTHdob0NCQXpsWXdnWDFyN2MxU0E4VXdydEkvVEc0U0dzWEtuOHNYNzkrOC9lM2ovdnBFbmZKUEY5ZUVCZUtBTHZRdFJYanAyWm5TZXc3MS9aSUxjWVY4RTV1R3cxMm1adXRwZXp1d1JVd3lvM1VoaC9rZmlQcVc5L1lQTnhGdU5HUVdBTnAxaFlhQzJadFNETmVwN21VWlQ3MlYyNUg4OEJNSUFjSVN5bEJrK1dGN29ZaTA3T2hjTGhjZHRVZXllNTRxUEo3WTlmS0xvRjNKUmNPWVlBTm5qOWJpbkNRY0lBSldNYk5uZFMzdC83cUN4NUdramo0YjEzdGEyNE85am5HTFBMbmJ3Z0V3MksxLzJzbG1oVUJCenhXcFZ5T2N6WWw3RUFKRFEwSUMrQzdDY0V5VUY1TS83UXJtTGNwVmdGNVNMZWF5bkVKNHp4VUZWLzNqTWo2VmJvSXM1VGVwOVF1cE9RbURob1MvS1p1SUdYdTk5VkFEVWtCWHcvR1M5RWlVRWdDd0ZnSTBBY0RrWklnSStBSWpGL3R5NTdPNGpBT1R1UGp3YURoOVJBRlF3QUFEb3pqZUNPTUxFV0lSZms0anRkbHVwbHFUTHJvaWVjYmZiMTVGV2FwdUMzTDJEQVNBcVBXM2ZzTVY4M3V6YlZhRjlNYmZGQTZYYmIrUUtRcnVoOWMxY2dRTEFZQUQ0UHdnQnR4Qi9jVGdGcnZnVTEvMTRoaDBxZ1RoWXVHQmZkbWQrQWdRWUFKWk9KcU0vY3dId1NOWXZiU0hqQjRCNE5rTFdRT0hBRHdCa0Y0aUxZendFSEF6TzgwTHBNZ0FBcExadU5RanBDRDFjVHh2TTZRdlZNZ1lBRURzUGo1ZVBqakxaOVVpNDgxQWpFbUM5RUlYQkExRjA3czhkUnhrOW5FMXlyUWVyNWNXeEtKeXUxODdsWEtoQnorZW5xdHIvT1FoQUFLQUJpNmplZGh2VjNjRytvS05XSU9LbHk4VEJUWmVGUlQ2WkFrQzBMMGZ0bFFlQWMxR1lQcWdlK0FFZ0RCNzJHNGZqckE4QXNqUFVPL2VIKzRjUE91WFc0NjQrZmhZRUFPSnNYQ2kvUzdUTEd2YklabW9BQTRBa3FCbWhmU2xuWEFESWk1TmlJWXNBb0Z4cTJheDBrRU5EUUVhNG14WE1KNHB3ZWxZU2hwZklZdkFRb05LWWlqODJCUGhjQndaQUhZZTNvbnJYRDVId21tb3FXTGI5VWE3bzJqRmtBWlFmVUFhSWZRY0JvSlFibmEzNko5ckJmSVlCTUZpSytjcnhWQmd1RVFCV0NBQnRKMWNVdXlmcnhiMEQvUVFCWUk0QWNDS0o3ZVhhR2VTemxia2ppNlAxNmVqWTNwL05FQUFjRGdCZ090dFhER0d0dlcxUGdhRmoveGN5K2pBQUtvS2tHL2FsNGdGZ2RxR0ptb2dBSUQwNDZqU2tySGplRnlzWmxLdnpSQk5PcDN0Nzk1NVVkWjhUNEkrUEFNTWxBZ0RRWHZSMEhMUjZvbW1hYld0T0MxOXFzR0VOQ2NmR0NiV1didzZBQ0FRZ0tTN0lRQ2tLSXA0VHlKQlpBS1RZWjhwWlFUaEFmN0dYcUZoQVh4UXBpMWV3b3E5Q1dTUTVoUkplMFpvcDFsQitaQXdneFkyVUlPSmJ2RVZRaDlzTVFvUE80NjBXazRHTkJRWUJBQlROOC9sazRnUEE4N1AxTWx2REFNaXFzK1BUY3hVRElHL2dYQjRBQU5la3VCWkFMT2svSkFZTUw1aUJBd0RidzZ1WmJjenJDQUZ6UnlXYWNRUHlVSmZlbkRvMzNvUC9VU0tBZTN6Ulg0WC9JcDg0Z2YxMWs1V05hL1J1TDgyOXhTVXIyU0Rra1Qxb3hGWUJzdTRvQUZSaE9SZUZlejRBUE5FYWwxWUdBd0RaQWhucGZJUUFrQkdPbGpuaExnWEFQZ0lBQ2FyMklZQkZBUDdSRU9CTmFHSnFlQURBbDZ6RDg3WGpIRDhpdWFoTlEyWktwajJXL3dNRDRPTlRra0dJbWQvRy9uMkluYnE5QWVLWlRBRXdYOThEczJlK0lVRE1ISjFYc0JLb09LWmlQdXdJcHl0ZG5KenJZUEtjQUNDUEFGQUNiSzRRc0RVRjJoOHMvSnRRa1A5a1Vvc0ZoT0Flejc0QUJnQjNTbVBZQis4TmdOL25mYkdyTjhZZ05FaGtGd0lBNFQ5Y1lPZStMSzF0RWVhVjQ3Vnp1S1lBV0d0QzkwVE1WVThPRC9xT0tFOU8xczVJRkl4VEoxZEZXc2prVEJPY2taQy9kMWF0K21KKytDREFmQUtmNkZWVFVHQUJFNk5iak1zOHJKazBESis0WVhrd0F2RDczTjdPNkQ4YUFFQjlHUmtzNXEzb2dTUmljNm5wbWxZVFJMRUFhN2xNSVMrS0FqWURNeUpTUDBTaGpENE9rQjVTRXNRaStwVFJXSUIwa0VJK0t5TEZReFNMR1RGakJ2bnZob1dvZnlBRXRNTzZQYVpiTHBzaFZ3eTg2L3pic0crWTZFMXV2am5JMXJwOVJFazVtRVlrMHRBRS9MSmtXazlka2owN2xLb01rQ2hReWhWWlZCb1B1NklzeTRvc1Z3ME5yOG1TVmFOZUtWY1VwREhJUUZhcUtKY3MxK1JLWFpFck1wNHh0UzMyTGo0Um9MSjlRSDUvUXZLdTNRNnpId01nOEJQd1NKZWdNM3ZRZDlENzNGd0NiSy9lUnh3dG93eENnd1IxNG5jbDZob0NBRis0bzlJQS9yeDVzaXdWYVZZVytVbFhnNmplQkNCa2NTUzRHT3VrUFJ4MkhTK2NBbklBL0VGa0FGNjh0aUgvQWZDVVFBQjhBb0M5blM5ZmM2aDlWQURFcnRQNkVCUmhFUExHb09xYXRnd29iT2hiVWN3SmVZVmxSR3pza1JrZUhPZkRaNDlVZC9Da04vVnRkRi9QYVFNUEFUNkQ4UGVtc1BoM3lRZUFEVGtNWFgwUTBidy9tZWdmRVFBQVJtM0U4NEhJV29YZjNYQTFkcUt2THdJWGNVV1E1Q2Y1TVA5SHptSHp4Q1JSSUlDdEFsWjFqYW1Yb1didE9ocHdmWUowQnZ3UDRCTnErd0JnK0hvNTVBQ0EwRFZpT0hFM0FJMFRCR3BURTI0c0FsSlY4bU1pQU16NjRSVDZWa3ptTDRLcW9pY09jQVAwT3ZqUHNxZXAzS1JBL05lMW9BQndhOTdYZ1JzUFFwb1VxaDlSdUcwbmF1KzJXUnlyNndMbThYbTMzSXFHWXhqWWlPQmFNdkE5bElERUduSnZqV0Y4eks1aUg0MUh3MzVvR1RGZHVJY2Z5bFhGVUFXSUFEaWh6VGFZcW9BelhOVjg0d1g5NUFsOTEvdkVodEhmMVJxazdLYjg1d0JnL3hzTUFIdTNiM3NEWUdnb3hMRnhxSkhvejQ4RWdOYjR5Sm4xbTZvMVB3cUdESDFvVXJXNlBseFFDTEN3WHJwc2t6eXhRVlRGOE9QeFQ5c21UUVpWcStjcEFDQmtMZmtBZ00zTEJ1OVVybVBvMDhzQUlyNXhUeWNBWUlLZnd3QlE2WWVzQU1xaE9CV00yTWtxdlVYVlBnb0FTTUJod3o0OEJDUHpFMGhMQWdHUC81NkdobmNGMkhnNHJvN0RKS1kycVRPTEFBUWFrdWZqenJNbEg4Mzhhc0NuSHdXWXJVSkV2ZUZxQUFZejg5emRTbTdSS1o2SVdDR215YkllWW1BQS9OOGZEQUNqby9sc09qa2NEUWQ5bjRhK0RFcWdqMFNqbzRiN2ZyNm5UYVBDdVNIVXFIcUF4aWZ0bEt2L0h2ODM5R3FJdzBOSiszSTdBRzVzQ3ZNcGlBYzV3SGFiRHVXR0Q2czBxcG5XaDIwUkU3V2hDek5tYVE4eGNBdUlId2dBK2pGem1XQ3A3RXNmTkQ4SkFzQm9hZUdPQ1R5V28rWTUyalNEVUFQYVM0M3BkRnBqN0dOL3BFbkZ5SUZNdFNSdEI4TkkreFRrOGg5M2ZoS3M3RktvSnJkdSsxa1VmQzEvVnJ6NjZVTUJvQnU3aEdkSjV5ay85b0JwR0d1Z3F2NVpBc051dDZNMHdPa0FUNWdRNGE3MXJhWmxzZDZVeEgvUTdpSE9VeThBSk1yenA0RzFqd3cyNW5NQUpEeWFBb0RmRi85bUtGblh4WnNxQVlHaWtxYm8rc3RGMy9qb0NEQ0d0aG9Fd01UR0d3Q3B3WmtqMUJZTHR2d1Q5M3lyMjdHT2djditoSDY5NUxLZmhBU284Rk5IaUZPbHIyMjRnZW9iRC9kcWZndjYrNy9oT1g1b2d2OG1aUHArQUFCcyttUkNaQTZQNXozOW96YVljUklTQUEyNkY1d2FsZ0RBNnJ1TFBJZ2xNT09id2JnVXBkNlpvOERvSDZWY2ZFeWlaaitnd2o4R3BENEFlRXNHbUluajVxZEFCL3hEMDdYM0R3cnNqQU5WalFGRGMxWC9pRTBHOVhISVBUdXBrL1RnTS9FRU9UeGhxanlMalJtNjdHZEZSWHV2RnJ4NERvQlBhUVV5cXc5NE8vejZycm5mZUNxZURPSmNjbDJFWGk0bXhTZ0FrT0w0M2dBSWJPUVFMd3VnbzVyOW8rUEZaTGVWWHVrSTZvTWdBSFFTUVJybUpORkhwcnk3RTdDU0FBSmY4NURQVFJSYk5sUmRoSkQ4SDlPL0VTWm05YnNoQ2Y0SCs4MVcraGU3Z2ptVERHOVNrT1hpWlpDZjZzMEI0Q0tna1hiaGxuN1VOOUdEOWRIcUJ0dUFiaUZZSHdVZE0yd1pnUzlGN1k2UFRwWWphSTZoMTFiSVROSGQ2VCtlRkNYRnByN1I1Sk1Ed0JVQS9QRVJUNzVOQ0hNbEFJQW9nOFVIZjJvU3ZoOEFwcjZSbDdtbXZKKytoM3BQQnUzbERUYUREaEtyUU1OaDFtZDlISGhITS93QUNJYW1ocnZTOHRUMS9CQ3YvaFN5VUVvM1l5U05CejVmSVhrVUJkeW53QURqUDI0N1pyOUU2UFkrdm5nQTJFdlNhMTNYSWJoWmJEQXJSdk90TXVWekVyeDh2MjhWOHRrSDh2ZW1Cd0lFM2hkZ1AxTjNTVUlEMUhIZ0pjTXpCSUM0LzczWWFaZHg2ckVYSHVCTi9zd25vNzQ5Q056Zm5lQzRBZC9MTUkvQSs3N0lGdkw4L21UNFl0aU5NbHM5enZnQXNKZFFRNnJKQkZUbjNRQ2d0NGR6NTJqc3VYMENsVEo0ekFXTjl1WDFZQUN3T3I2UVlSOGxieVFSZWwwQWJMemthWGlFKzhYRXRFZHppMStlYkx5MlBneFZrTlhIOFlWVjBxUW1saXFhUGlhN2lZNlcwNk5qQjNzT1J4MjYxd29aUmxGWEpDMzNTZmdQV2Fnams5dE1lNDNNdjQvZGZ3RUF4Qk16ZWJTQThaU2UvMy91RDl2QkVPMklXdUUyclVsQWtwVmFXVkhJTVVjVUFkVW13SnZDbEpWcXhjZnlHdjZkc21uSXE3SE4yOGV6MWVLczI2b2oyNTlkOVcxL29FNUpWeDdxN3JRUDlMMHhuSVg0RDZkMDMyQmpocytkbWRBM09tcVJvdWt3UnFTbUFmeXpRVnZNNEJzVGsxYlFtNkQydWF0amhUc0dRTUFaR0VrOHdFSFRiZ2FBemNLallBbnhvVmp2anNzMVdmcjVWZG1iWTZ2MmY2bklpaUo5KzZEc2JRcWwxS1J2RWs1Q0NaQjlPQjRPeGh1Q2ZqUUE1bkxWODIwMlBwalhMWHhja0xzYk1JL3NBdFFWTnZCMkNNVlgrMGNNS05PUjdSRGtHUDJlM1RuRnA0OEE0bWxXMmNGZ1VIUG5qNU85aURjZ0kwQ3hWbjhNQWpBQVNMaHY0alA0N1RjV0FlSGlJd1VBb2xydHQzK1ZxNVhSLzc0cXlaVnlSYTdpejNMckRmNWVRZ0Fva3hUNm1SSUE2bWhwUVh6MHorYWwzZ0tKK282elpqOHR3amd3SHVzRHhpZlhpTWRiUnhuQW91WTFwT3RKUVhQbzZsZEdtdzIzTThOczBwUHNDSUN4L0RmbzRnTjMxaUdPU3pjamwrMlErWCtOemFIRzVmeis1bkVnQkFBd0pRQlVHSXh4dlRFQWpHQ0Fxb2V3bXZLZmQ1T0s5TjJQcndyZzVHSmNMTW5MaTBPcDhjWjVNcElLM3o1YXIyRlJHbHljMXFXU2VYNzB6elFBR002MnVoS1dkQ09jQlE4YU12RzJXSWFuLzd2VjYrdUFCWk1UcTJqcGQ1MFIvbU45aFF0SkR3RDRranVuNnBhM3ZlcHBpS2g5REFCR3UrMCsyVWZldzZKRThTMHFHTFlGYlZIK3F5NENHSXB2Q0lCUWhMS3ZPUkFBdnJ5V3JMZmZ2Q3A4OTgvUDMxN212cnUrK3ZGKzQrMzEzLzd6RUh6M3kxKy8vMWRwOHN2TGY3eFJ3TnUvZi9NMkRRQzZLYzRTd0dQQU9LUUtHanhxa0VjQm9oOFRHaEtJMzE2ckc5WUlVbmVibjUzYStSU1hacG4wWnRSa0ZBQnNMR2pBVGRwZXYxZ3l1TjV2R014V2p5RHZFVEVBaUNrOG1FNThuaXFaNVZLaDV4Qy9uWFoyWUtQV3dRbEsvcldxL0dmNHp2N3FMMzk3VlRDcTB1cjc0anRicWhYTXQ2cjA2RHAvL1VKUy9tT1ZMRWw1TzV4Zmw2U2YwZ0RBM0w1ZENEQW45akpLVHBCNVZJTnJBNFpSbjNBSDd4UXZLS1hONG5jcHFlTjVCeGdMMituMWxoUEtkNVhpeUZVR29IOUVmajhFTUM3d2VKL3dWRzdFSGJzQklGZzE2dldtODV3ZUFGUlYyQkVBQnArcWpLd2lBb0Q1Nmgvdm1uOTdsVCsvdnI3K0lmZmt6US9YZzhZdmN0bTV6bjkzV1piZTJmWC8rZjc2M2VqaUcwbjZOZzBBNEhoN0hoelNIZGtDREswTndqb0VobW1kQ1BidWtsWWY2cVpsOThmSTlwc2NJLzFCT3lUYmFzRVdQazBVS1F3VUFOU1ZUbkhDT21wWUR0ek1SZUROOTVFZlllc2laWkczNHFNVnd3andsam9aYlV2WEZXeXlhMXJLR2NKUXZVSE1ERm0xOWgvVGZQZE42Vyt2d051QmN2eDl2Z3pOcDk4YnYxUUlBSjdXcEhlZFYzOVh0VGVqMDJ0SnVrNERnTjZ1eDhrRWlLdFloSFVHMUNmbzdjMWp2S1dFTlZ2T3hvTnUyOVR4bUYrcmdjSFIzQUR1a2pCeStpUWJJQUNmbElNMFNDKzBRdE1WQTNUdU5uM044SlNmNjZXOHFXbHhhM09leXEvNUJINnoxVzRRdEp0S28xNnZOeG9TM2pCVDJaTVQyRTYvN1BNQ0VUWGM0amVyZ3dFZ0xTM3BiNitVdHl2NzcvKzY4OCtaL2ZJN0xnRWUyQWdBbjM5bnozOGRtMjhuODNkcEFIRHpiY1JweDhMcWlzcEM2NURvMTlYSlljTVlIeS9hUWZITnQ5ZW5ZcEVrTDh6dW1FY0hBbTQ5K2x5Sk1EQmZET0luN3dPVjhoRWYrbS84aHBodW5XeUtBRGVCdXp2NFQrWU1oZzFsOE1zdjczNzU1VnJHSWdDQTExSkNuL2U5YndEdGtTOWFyVjRieU9TVHJpN3p6bzgvUC8xN3p2bis5ZGU2ZmwwcEwvNmEvL0pVZzk5WjZsOS8rZTY3ZnVIQlQ5OTlmYllkQVBpUW4zaEtiSENEQjlUU3FEclN1L1hwRXRtRHk3bkJUMVpCRm1rRnJ4OVVKTjhFQmkxeDFEVTdJekpvc243RTVoSGNCZ0VlQUZnR3czZjIrRVpsTnFsTmk0UHExajJ4NHVtV0UvRThsRktSSk5ucit6eWQ3M3Vob0lzL083SmNrbEVEMU1CcnJWdzU4TWNLbEJHeERYMWpKRjdvTlRtS2EyVkpxaXBLUlNxVjBEZnlXVUovcExJc1NVVlVwWGJUN0hVc3kycGFaWlF1YmR0WU9zclA3M3NjcjFwVUR0SlhxY1VQb0xzQklHZ0N3ejdyQU1pMmlrV2pvTXFYZ0VHL2dzY2FiTnhHelBHQ0EwZ3hEWGN5Z1kwUGJ2UFNrU1lxaEh6RGVlQ0xUSHN2L29OYnc4ajNoOUkvbHVWTlBZTFhUcW5LcForUEs3SlVPM3RtUzhycjVmTmx1VGhmcnMrckJlZkZxbEtZTDg4dm0yVzJ0STVUbytHVGp4c3ZHRlVKM3BTb2g4bWhNYU9mVXZCRkhpbm9yWkdLWWorMzlFaWpZd1RndWQwMnNiSHhwY21NT1BaSTJDK29BZFVQQUYrdlpuQlk2akE4MmtFWGRsQjFMN0p4Z0FCQTIyZ2p4bjlQWHZEUXhIU05rRVMzSmwyRkVWQjhWSHA1R0FFQVpnd1lobExGQUtoVnJyOTU4YlpmZTN0OTllWlo0ZXJ0Rjk4Y3Yvcm41UTlmNTYvZXZ2cjZqYXI0K1U5YXo0c3lEaGRMeXc2Ym52U0Zhd1hoSUZOVUF0VnBXeUFOYVVrMlFCb0FZQ01MZTNNUUFCcm92ZTFCcjQvNXIxUCtHelYzR2JqYnBWVitkQWdoYlFXTnpWZWpJNm4zblErU3dHZ1lFRzZzS09kU05IQUVRVnIrZTdtMHV0N2NFQmEzcERwU3lpVkpxMGhJYW11S1ZDb3JzaWFWUzZqWFJWb1M5TkVBQTZCY3RmOWRyejcvcS96R3FpeCt5Yi82UmlvVlpMVXkvcVZ3OVE5SmVqMnZlUTFwQUs0Z1I4c3JmbEJCK0ZHWWxNTCt3MzhlSFFRUllHeXM5WXVrUVpJYjBPRExvOGpEdkZUOGljK0VJYlZHSmc4REFQcHFMdTExRC9OZjE0bFpYMU00VStoOFA5dEkzQnRiSU5Scm1nRUNvWG1RbXdaVWdRc0FBUGpPbWZKcXlleDh3blkvQU5LMGdLRzNrR1doMWh0bUV4a3MwS3pUWkZkSHUxWDQ2WnVmWGovNC9zYzNoNFhSNngvK2RWVVkvWHo5NzUrMHdrK3pTb3dwU1JJSkFPVGxXM3h5M0ozWGRYbnd1bkQxWlZrdW5YNS9mZjFMNGVWZkpPbUhwUThBK0FWVnVnUS91c3pBVnVKZUlrNnFDZy8vKzkvL0hvbUJuZUJob25MblV1S2hzbnpNNXIvb0Y4Wi96SEJBdzM5UWIyY2p3SXJ3R3ZNZkw1ZlRhN1NPMk5WUEpBQitRWHpjdkRkZ0kvRUZhOVhhaHFDQi9LZ1Jnd0xBQ3pId1RUOEJ6OVhIQWJDejJJZG1BK2l0bHFIelF4K01CcW1ycTZiZnl2MzhxalgrN2JqeTROOTVZMWxwL2FhT2ZtdFZyNS9rZnA1VklzU2pTMlFJcUk1K01vQU9xNjgxQW9DL2xLdnl6OVBxK0pmaXk3K1VwUitPTmVETityZ0FpQ2tTK3NkUk40MGtWQTUrUkFENDIwRlE0enRLOGZaZEozSERVRytzNWovNUZlNWNwV29iN3RMWWQySE1URURtUXlqLzYwVExKV0gvZENFUTFneDBNamcwdkdrRXZIbVFRaURnNTUydlpha2s0SWp4YWN5dTlDUWh2bXhBMm9IOUNLaW0yZFRDdzQrR2hobXoyZFFaQW02VmZwNFBhci9wRmZ0ZHNYejA1TW12NXVpTlZINzJOd3lBcE5LcERsRDc2ZG5vYnljSUFKWEI2endDZ0Z6NTZjbndxN2ZGbDErV3BSK0pCQUErQUlSNmY2U0dFZWdyOUo1SUNaRGl3T2l1cyswc3VRMEU4UDd2dDF3d2oxR2JvZVFCM2dKQ0paMGMvZEtJNWUvcC9pb0dBUFE1K1VpWkJwV2pHQUtCemh2TXhnYjRvTTNjOEFNZ05vQTZrbFRkTUMxVHI2dDhGbU9UNnRabkdBRDFXNFdmWjNiMXR6b0NRT0h6bjA1UE1RQks1Y3Z0QUpDK25KU1ZjdnZySDE0cTh2L0FzdjNYM0lOSDVXcDE5TThmbm4xZFFGK2xMeVloQ2JEWi9GdGZoQ0JBS2Z5SjZRQitXc2JjNGxLWS9RbkMwMlVEOS81d0J0R095VFM4OW9qMmNzUi9uTXN2a0tpTEhNbTNnSk1YWDFIWVhBQ3lGOEk4OU1PRXFjZlU1UEFrQU4yc3M1M2FQY2lvYnVncExFTzlhYXJBUUVQQTNGUW9BTDQvazR6ZlVnS2doaDBGQ3Y0czQvOVNQaWNXVUlKYXhqK3d4UzZYeTNYREJjRE4rRThGQjFTS0dXSUYrR25yZWRGQkxaR1BvZjRrOXhLcG5jR1cvWGtQaHR4dFM4ZGtmVTVYVmVMK2o5VzZtdThkYUJiZjZlRHVHeXUxR3YxYUM5YmZOKzZRamsrUG1vTEVxd081d2NjaFlrUzFYd0taYVJ3RGVyTnBJYzBRQStCZTY5YytCc0RwbXg5LytFOUtBTGoxeDlWV1NzTCsvcDh5a2tMYmdnT2FHMzhlLy8yVEFqdThFZllEaE9ML2tvK0xidGpqNEg3aHJpYnFOaVFYQ083Z1NoeHExRkZINm8yamF2RlAxMEE1MXRsUndNVDdSdllvOVY2Q3pwT3lSZGVzYVNncHpIb0puY1BIYTZKVTVWcE5ybFk1QXVoOVBtY0NkUDBFYVVsTHM1Z0NzbzN0YmhVTVJTNFpTa2MyQ2hKc3EwWkpOcVN5YnVEa21EdkRtcm9LUzM4NmV2Ty9yN3NIRWgwTFhSSHE5bjU2VDNoYUtJclNqblNqVmN6OTluaXhtdllDOWk0TGpRdTQvUUw4cDM0VkpvTVpBTnFHcTc3UWZFQjFOUEsyRFRMenBpakJQZzI1RFVpYzQ3NE9yTlJ3M2hxc1JJYXdWaWs4b09JYkVyamZrUC9jcWZlRGxBSUFXRVJGQUxkcXFIYVZjcVZqSy9nYnJpcHhCRlZqRDIvYnJJNHMwUFBrdTlrcUZaelV1SFdQVm5adlNNSC8xTHJPc0I2UnFDOEhyUTNSd01yMDRqcG9Lci9HWGIxUTExUlg4d2ErMVJYa0Rpd2c2aWVZd2R3VVEwMkZHa2xXWE5jdDgzTzRKOFZ6cXBVUmwxSC9yOGxrMVBCWFRTbnpHR2hZVmFBM0hSRGROQ2xieGtpM21ncHF1bUdwT0NTTU90cDZFMFRMKzl1VjYwMlMvdlN1KytxM2h3OS9QSkJaKzdydUhwZ0kzL1RJM2l3bE90Sm5Fb2o4ODdraGc4R3hmSVRuTVYzRWM2T3JrQzM3Z1JGQmE1aS8rb3JzbHhPWTNLcHgveGFWM0w0ZlFhcGlXMEJXQXQ0c3hUOHNLRlNwTUh5UmFLRjNTV3FmdXRGcUVPanJyYWllRVVNTkhCUG9PZG9HenMxT1h5M3UvemYvdi8vOTlkNXZCNUxyRjZOWFBLOVd0RTh4QVFIaDhJYndkU3ZhRit4M0QvajU3M1VnVjFFMzJNd2NMaHR4bXgzendXTDg2T0FWcUFHVy9oTk5DL0lWeUZ6dWs0NVBIQUpoQkpEYmEyeHBRODE5NnhxZFFuWTlrZFN0RUtNeW93clZyVllqUnIzWFc1b0tWS05WMTFvN0hhRnNZZ0RJcnBsTkcyL1hFUWRKZ0gyL0JQQzlOTzhOVWFVR3hvWW9Db1czaHIrYlVhN0F0aC9DMGZ4M1RXMUFBY0RUOEJ5TXB5RFNlU3VmTnMrOFVxY01BRDRHeTVwTDJFbWtzV0diV3dQdWN5dVU0ZTZ1MHE1YXl5MkpLbElIM1dIWDd3c21IdzFUeHlDc1I4Z0JyY200cmpaMk5CZ3REQURQMGNhbVRuY0dnS3NEWktwKy9rTlBHRzdjQXFPVE4zTEZYb0J0WjdpWjN2VkdkcmJOcFRmR3U1bmNQbTV3YVU2MEZyWmJtUCt1Z0llV1JIYlBETTBWOWZTdnJpcytHYURSTGRWYzBMamVINGluanF0WURXRG5Ibk1WMjIwRzRpOVNHQzU4alVNTGFEYVpidE1NdDRsbTd1b204S2pwbHdBS05BYmJiNGtpcGJoLzlOcTFBbnc5Sm01M3ZIVHMzN2dyVU1DWUx1RUlVb2NzL2VOR1A5UGVjUDdnQ0VxdThCaHFtZzB4c3NFUGhPY0FNTHpKSWtnQW9HcDIzelI4QjhUamFRRk5WZEQ0elZDZ2srVUh2a2FBbnQ1Qk9JOUcrdVZ5NVp6SXZoQWlYNnRVeTRDY2lPNUpVcXE2V0s1aVVBL0tlTmhJcC9OSEVuWm91VG9BUGd0enEzY3RocFNpc0wrL241RVVyLy9IT2Y2aFg2ekdVMkFrQ2R6THYySXpjTExBNUJzTHhuaGxoeWYzWTh2R2Y5cStuM2pzYmhqY0plUkdBUnNOdHQwYjkvTm9yUkZPZERkL0l0NC9JdXBrQ2hHNktJQjZENzJCZ0JKVytid1hpakt5SVVSV2djWTFLQjFycGVROTZrM051OVBTalhxOXJsR1ZSVy91b1BMNUNBZnBVZEZCckFEaWFFTlZYR3kvTTVvVTJRM1BnYnhoTkZlbStpaWQ0TjhnNzRwNzNkUDJSbnd6Y0h0cEJBcUlSaHJyVm55SmhzcjI5RzZRT1RjR1VESnJiWEMzSEp1bHd1eDFJTjA3bHcwT3VOdlRRcW8rVk5CYThnaEtqMlIvZmFKUHVVYVhiZFZzTkZzTnBNL1ZUVHp1NDVIZG4wWFQ2bnBkTi9SR3d6QjMwZmg5UlB3eEdoMDU4TW9nNm1oRGxZdU9uNHFqK0FHYWVjU0NNcHUxemM3OEQxMWpPVXlmcC9jRWRmM2xZWGRwaDBzSVQ2MjdSWGdDZ2dmbEdIeGZCUVplMWFEemdKNTVCM1VrNFZjTnNwVVVHaHFvTW9qSGZGS2xtanZnUVphazhpaHExeVlBaXZjK3NRdWIxVGF4RkZVTmF4dWEwVEwwVGMvR2V4TUdBSnNnRHV3VzN0aE5DWWhoWmlUcnFHYThiY2ZjVGNoRXNRK1RINnZtYU5nRmFqT1l6WTgzR0NnWCtHMU0ydU1CbTNReitQYXgxSTFOdmZ2OEUwLzAxaDFJRFQwMDJoTVZRQ043d0dHSEx1R3VnWHNvV3dudTZvbXVGS0E2TXJrWUc4MW9ObHB1OVRGNnRRMTc5SVBRM2g3ckJENEFJRXRqbWZKSlFSNm5ydDYyN3A5S1B0Qy9nVTBqRHJlRUIvbUJGREROL0FDZ0IwanBPclBvOFEzVXMwK2xHYjZrZ25FYmo3MkUveW94QVZTNkhCOWdyMDZWU0JabUI5RC9mQ3FIUHF4V2Mxc3R6cytxZFJUQXgxRTJFYkRaRFQ0TUdVU2Q5QUhndUdkYjZXZWRmZnovT1BXTGV5cjlrczVqR2JVWU0xS3haT0cxV0l2WFBhNXJ2ayt5UVh4dlFFZDYzUFVKRERRT0hVQmRlYVRmQm9zM2ZPdjJxaDQ3bzNVQU5PaHpNeEQ2TEloVUw3c3prYlhRSGdCdy9HUjZWenltVDhqNE1OOFNnejFkOHI5TzNIakZQaUVXMmRpbW8zdDhVZ1J3WVVER2NkVGxyUW5iL1pWSmQ4cC9YbFFWYkNvZDdqYVJ4Q3l0c3Q1TmMwZVJHVGRwK0JFSWtsSFVBMERiMnBIL241Z0NMZEhlZWpnMFNKNCtDY2tCd05oTW1jdDZNaGYrZkhKV1gwS20yN0lFckFnMjNCbkRXcFRTNlU3c2dncXk3L2wzU0NZSk53a04rTkhBK0JnRVRiT2x1Z0Jvcm5vN2hoMTlETlVrOFdrUWVpZ1l4eDRINlB1YStEWkJmWlA5cGN0czZDK1ZuZ0NzY20wU3doT29hcXF2R3RCakoxN1RwTGdhZitCQkRBRTE0T21EcEFBNW92bE10WnAyMzZNUFFHZ1VNMTBBZElnTEpUSWZaQXFObjNoOFJUanZleDRRbUNqdi9ITUtvV2dBeit2ZjhDY2xQMnJqV2RUM3EvUHRuWHdBSUgrWGV0Q3FJTHhuczMrS1RMUi9aQXNBZjNRemhIUURZb2lqZ3preENWT0w2RUJtdkhYd01VaEZGaVlIQUltZ2ltd3hCdGhRZTBVRElISzZmd2RRSkE5NFBpUUdkNDd6cG4wZzE3Y2l2WUZlaGFFSGFlam5sd0ZVblRuem9FcVBmTVBUd0ZnVm1MVDhkN3MrQ1Nvb1pJaDEveHBxSmtXdWVuTytXTlFyc2x5cjFvRGk4WjhpSU1JT01QUmF0Rzc0a1VpdmN4MUFiK0xkTFNQN0RGZEdJL0M2QVlESWdJL3RVU0RwaVQzUFdFYXM1OGNjMXhYcXdrVzZQSDhYWHpzSDZ1dWxCMTlENTk1Y3lpc1NCb0JEUlFaZEVNRi8zTUh4c0tCb0d1VXh1YVRVa0UxSXk2OHEzTFhJWEZoVVltQ0ViSVFJMWVxZlVQNlR1aHNjQU5PdWN4WXRORm4zaUxSRndtblJJVjhma1ArTURzTXp3YndURjdKWkViV2hWc2hrQlNaTHN6UXBUUG1zS0xDdjFVckYxMlA1cEtCcmY5RnhIelJIUWZIRUxoSlZvVnBUb0NielpZSHN1cUpWa2RxSGl5WS9WWFkrQlpNcFJLSXF0WkRHOThsVjhDWUh3QXhQRGNmdzJEZWNiVndLcEczdUJjR1RQMVI5R1czNEFCaXpOR0c2RkNzUTVKVGp0U1RSUzhMSldJZ0FRSGF3enROdlZTR2ZGem5LVlhkaHBtZUFNMVl2TmVoN2xxZitvWHNVSENla0FMYUxEbThVaSs1NnlhSGx6aFV3QkpDN0ZUcjVpMzM3RGN0VWR3cm0rQkRVcUZNQU1NZDZFT0ticHRJbVFmK2ZhUDUvQkxLaU53ODJwT0xGVTYwQWE4TFIvV2FoVE45R09Ka0xGVlVQOTYxczY1QUJRTTZ1eGhuZlBCYWtjd1VlQUZoNmZSSFEvNEIzQmVCNUFMNTZtUTN4Z0VUYkJJaXVIbkxIRmxZODloL1dHMXBkZzAwTEYzcGpRenhTUm04alpIWlNDWERDQ2dtVm1PS3Bia3dGWUFqWXVSSnhSY2Rlc2F4bGxCY0F3bHp6OG13aTFNVENlaUlLb3BBVkJQVC9aSjRWTTZKY3dTa1pxWWpTTXBtc2xCTnpnb3l5WkRKQzhXd3NDZ1VCalJwaVZVUy8wVi9aV3hqa0ZUL1NnWi96WGpVVlBCVmNnd2FUN0NxRFFDUDhCcTVmS1lBQUpDWkl4NmNSSXUvaGlObm9zV21JbTRIOXplT1ZVeFhIZTB2RWxnYnZUWEVsMmowck1oNFFWb1hsc245UmtJVDU1Zm1aZEdkeFBoczVHUVNBNllPVkxnaW1jMzVpWnpMV2FXKzk3Z2laN3FtWTFSYm5wME5wY1hsK1VoRDc2L01seW5VOG5Kd3ZOVkhmQkFDMVBOM2ZmSHpBNzE4bHRrZVZid25PekgzZHRBek56VTJ5dXFHRHpLQWxwU2xzbTVPVXU1NG1FZ3pVY1R2cFhBTGNkRU51QW9CRzlLWVc3MDNSUmFxeFFRdkZ5cmwxNTZFcFpwU3ptWlkvUHUvMEg5eEhBTGdZV21mM3hleDBaQTR2V2dlZFovUE8vRUlWZWhkaS9ueHVkRWI1dS9jbmFsWmVkTXpsb3pMS1BlN2NQOHNwdnVYNHZIaDh0R2pRZThTSEN6b0hvRURWUXdETnFPRit4Y05MNlVJenRtNEF1SVc1a2NGVkdDamQ5NWlkV20wWDU3SG1Lb0hhRGJkU2dteHBlMnp3MTN0UjVKdk1JMmZIc2VrbjJoZFN4bGtJcGN4NkloUWYyeGxoaVFGd0xHUWJ6eFEwRGdqaTJYUy84MFFXaXhmOUF3UUErU25xOHNoS09CdG5DbUpCRUpSbk9zcWR5WnJQbElyaE05a0lENHhlSjFRZjN0QjR0d3hpMTBQWE4wQW5BTkFYUE9IbVRVaXhhY0hBaHNzZS81VVF1dWo3Mzc0QkFGSm5iYWtjQUNjM2pDdmpFMVlmQVFDZTB5ZElrV3NDaVFXYlBWMklDQVRsQWdaQStVa2psNWxnQU15Rmd2cFVPYmczV1N3dVp2dWRSNFdDZUQ3QUFCQ1BMdGJMZGphREFDQmxyZmxpK2N6QXVmTW9kNUhVWUd5YlBNeS9OWExNbUtiRlhsMzhsNFR5QmFLQjBLVVdkTU41T0VzaDIxS0FKT0VaQWJJMVM2MFdSaGNGd2NkVXEwbjhJZ0hBZEt2cXNVVVNiWHJBd1UxVWt1QVRvNHNZUjZRUnQ1OEVudHcvUFYwL1F3TTlBb0IwMlJTRnFRZUE2cU5EL2Q0NkFJQ2NxTFZIRjEwTWdHem52SDJ2K2RUZ3VZdjQrVmJmR3N5Y3hkZ2U0V1BNWXR1QTZQSjRDS2pLVlptNUVTQ0xKSUoxeTJxRjhwS1Z4SFQ4djMwYjJZbTFXcldxYkV3TjhXY2xBK0JHcXI5M2R3c3lBR2pib2tIREN0SEdkWjhIeEhmVHJoVUtQVE15VXovR1dGYUUwYm1OeURraEFNZzluT1dsK3g0QXpFc3BLOTRQQUVEUUJUSGp6RFByUTJGL3ZoSXl5ak1mQU5ENzJBTXlHMWkzZEw5RElLTGF4SytQSVZBajBZV0Flbzk0SEZCRDU3a3drYUF6Q0duUUVPS3R3aUlEdU5LNStZUjQvbS9qeWxieWRBQnJZM285VUhaYzNRTFp2WVBTdk5UZDZoUEtIdjNBVHBUQmdxaWN1ejhYUkRIVHZsQVFBREpDOStMaDZha0hBUG5SeWVnNE9BUTBIaXhIeTRmNi91UnlYckFlemNhckVBRGcwamNqbk5BRUtMbEN4VG1XL0hMRGtqQUNaTk1xRlMycmhCREFsZ3BBdGx3U2VMcmwzdTBhVmg2Q2xMNjkzbHZ6MXQzWndHRTdWRnl3S3RzcjVnLzR1MG05K0FnWlR0dWdac3kySDRVN28zczVCWlRLSTFQbzJSbEp1R3ZkbVp4bGhGRmJLRlJIOG9FMm5sbmQ3cjQremhXemZldkFISW9aZFRRZnFVS3VZSS95bWVaczBoemZ4YmxMZDBaeWlieXdPYkwxN2N5QlJBTGdnQ0NpTHNqZHA5Z0pDZVh4WTJud3pNVCtxSlkzbWxFN1RYWGY3ZmIvRGZkdjQrMlc5Mi92elA4UFFZYkJad01YR21nbVBINTd4ZDVYRVlRUjgwMHc0cGNlRS85WHptYXl5SlRHdnB4TUpsc3FpWGxCZEk2RWZDWlRLSXNaVWNvakt5Q1RFYk9abkp6TFpITlpzVlNYTWtJbUx5dWxiRVlzaVFLNmpFd0ZtcHY2OVdDak9Zc0FRSGlrZ2pUZ1d5RjJJQUVBemxFWlAyNis2dUxWRnFBVnFpbzl6NHVPS3NMdFBhUkQ0azAyYjM5NjlpTXlPUURnOGJFRCtWZ1hyQzc5M0Y2MStKVkFhU2dLQU9FczVDbmJ6cElrK2toVkdLM0hxL043T1gvNWtGK0Z3QTNsQkM0cmZKWTNMUWEvenR3M09qTUdiY29wTkFRUU1hQmdNWWdCZ0p0QkdUOStkbGJDNGwwMXcxdmpzUTNveUxnQnFueGVjdThEeVBTZENYb2hZVmF2RysxS1NsVXJidjNjUlByengyd2ZadkNuM2w4c05vY0JGN3pVSGFPSWxmNThEQVMvazU4VVFMVlZGZ1BzZXo1bnUxc0pDdWVXelRIRExMaG9rTklsdnpnb1VDRUF3RFVZZjdWNDFTN2pjT0lHSWhDQkhBSUFsLzlFNFg5ZkFPeUNJTHFYdHdjQW96M1ZRWlNRUy9sb3FnZmNBQUhlbEV2eWd6MkFqRGJtQWp3T01hZGtyWWprZTRIejM2c2s0NzhCZ28zbGx1MytaYSt5SXErMURadHN3V2NOeXJJMGVpS3BsVXBSR1YvS3k4dUtJbFh3aXNtTkZhcTBOaWlSYmh0QmZpWmIvQkUxZUQvVG04N2QrUmVHZ09WMnd6SnBweTFNMjlmK3hOVWFNb2Q1d28zTTRkeUpPMG9VZWpzVHhHUWdBVnJHeHVML2pXcTdrM3FqZWhvRmlBS3RER0QxZlAxOEttbUR5MHA1ZkZsVW5oK1dqT2ZFK2QvUTJUcS9ZSFZ3azdWNDVmMHZFbmlwd0Y5K3EvY1pSOXZSRUFhQTNZMUJnT0VXR0wrL2VtaWdKSmxLb3BoWGdqbmk2N1Y5QktBSTBHUDNpSFI5RVJGRmNja09Jc0lGMmQ0UWpMZ2JtS1FjcGpxNm1IVGlhZzNBWW5Oc1NrQnI5eXV5MVM5Sm5iNnM5YWtBTVNOV1N0S0tqbXoyTmVKTk5rVlRPRU1DK1NWZk5DR1pFd0NBTVk5ekxyRDlkZGhHTzl1ZXkzZTBCUm5MenNyK0Mwa0lTQ0U3Q0FLMnJnbUpmQWZvdVJhREFOalludHZkcXhIcHlDZnBWa3NTQUJEVG9WWkZ4b0NHTFFLOHpCdjkxNnAwUVpoMk4rcTlpWTloWWtWakZuaDladVB5YmlOdGJPNFFBQnl2SDBkV3hkMWNZZHZqZUJzSzAzTXhmWnpydGpHQU9odTJIZ05ISytoZkZBU0JmMVA5c0FBSXoyVjZXd0FOSi82cUpSRGQrNE90NitmV0VJMzl3Y08vVXExVWxhcXkrWEtRbkRJT096VTZuNVQwU3R1Ny9NMFVTRDhBMnN1Mko4ZzNxN0JEWFhoV0RJQWlHZ1pFc1ZSR0gvbXlVaERGSFBvYmszOWIyYmhCVTh4Yys3YUc0VnBKQUFCZVkvSHU1YitacGhqZGllTjZ4N2E5TVEzdFVtUXVwYnpzNkxsR2xmcjZJbm9DeTBpMkUwMVV3TlB3UDhMS2lNNFgrQm5VQWRxdXFBeTRBYjNiNHVSRHpLTXdBREwzMm1xM0t3bjNlcjE3bVp6WTFodDlQVk9Lck4vMnN0SGxoSGtMeUlZcEgvdFpOR1lBQUtRWWZoMUVzdmZ3YU5EYWZOZUUyaWxFbVpmOUtLWjdVRUcxeW1ybWhnRnZ4Q25YRklVYkd1bGJkeXRGRnhST0RRQ2dkK1RnNCs1Q2plS1RDUkR5cUlkMFZTQUE2RDA2ZFI2Wmc0dmw4ZVg0SUg5L2RYcnlkSWdETmFNUnNLM0ltRU5ndklwNnhoYmsvRGZZUHJDK2JQNE5UQ01VeHFNb3BDY3pCOHQ0WmcveWVrQkQxWFdaN3pXRlpBQmhmYlhtMngrSWxsaEZDUEMybmVZZzN0SVVXeWlHLytHRVcrR0V4a29Mdnp6MEcvaGJFZUMvU0FId1RNK0FnNnlXeVE0ZUZ2SVBGamx4Zmk1V1ltcVlNQTZ5djNxY0VSaVdJT1FYUGErUnJzL3hWWkEwYjl3R1ppakZpZVIvN0lNcEtkVnF6YmUyRjFPOUtyUGRSbWlPbWxLcktJQlAvcm9Qd1J0Situc1ozYmZzL1VSQnlyczNBQURBd3ZKZWdOVlQ5Ymw1dC9aUzl6MDRBQzV5cFVKQmtIV2pmeUhsNzl1aTJMa29sSGRYV25qKzdTdkQzY3E3d1lyZVhDWDVRL3FYdDFoanM0UlZHbzFrazlCQVVDdno2VjI2QkVDakFIQnprS3RzT3pqSTFWNlpCWlY0TFJkL25OVUhwZ2dBZ0hFZitGSE0xQ0RvTnQ2Mk1ubnJNeDBBQWFDaVpPeUhzOG1FQWFCTkFMQXI4ZWFZcEdrV1gyY2lQM20wUDMwRC9BcnNKUFRvUnZiUEFleFVTYjdGTHFSTHpQRXBJcEFEelZjZkdjc0xyQlBVc2MyRUFNQlhpdkZuL3E0QUFQWVUrRHB5WVBCTUZibE02KzRIZ0N5ZWpyS0NkUk1BaExWUllHMDdCOExOREVNQWNMcy9BRkZuYzNsa1R2dzlJT0VaRWRkY1RySk5Kbng5eUJzOEZUeFlLSGlWOHhBenUrNHRGZlR0YS9QN0FRQVlEdG44S3BTNlE0OWdJc0FEUU1aWnFkcnljZ3NBSXJVQ0dMaUtmczdTaHNsNVk1aXYyblFOYWVMVXBZa3REZWp1ZXVzZXBZYXY4YiswVURmWlM2KzZ2L0ZLQUxaVWdDUEFmUVF4RzhjTERjekp3UkIxVU9NMmdIZk9aTHFYZkUrS0JnQldCRGJUSUIzWTJLTFpiU1ZEWWdVNFlxWjdnb1lBOFo2elhvMU9wZndKQnNCSkhBQzJhNjZvRHNkYkFpVzlmdS94Mzcxb2VJZHl4TjFQK1EvNUhrK2dWbXBpTWtpZEpSUC81YmRYNWFaRU5mOXlRNk5tSHQ1RHZGYXRsUTBOVHhKcjBHQmI1bTYrekJySE4rcUh3R2pQbFNvTURCRy9Qd0RBeUpuM04yS0ZJZHM0SSszVXZ5aUtRZzc5cndKWnpCYndMMEVVQytpTGtPb3dncGdzd3o5dkM1U0VnVTRVS05QZC9DLytTYU02WC9kUDgxVnI3MzVDOUl3QzRQcEoyYnU5Mm41ZHBnQ1F2bjFRcnJreW9scVd2cmtvSTJsZ2FYVHkzOTAwMjhVaytwempnWEpTN3g4Q0dNSHhENHVBdU1KaUFRRGNKWU9oZ3FDN1ZlcjJweXF5WEZWa2NvZ3NVcEFyY2tXdXlSVUZwVVR6UDkwQUF4dUR2YzFRU1YrMzl5Ui85RU8yVmQ2MnZCV2NPR08xOXA5MnVWd3VGY3Y0Q0Z1bEtzbmxjZ1VsU09nVEFRQjlvdlRTdHc4a3FTTExPRldXSzFJQkFVQldqS1pHVHdJQ1hESDJIeWR5UkhyVXNzOTliZHcrM1lsUzZDb2dRYUFrQVNCNnZSQk05MFJ3Ty9MWmlVMmZVc05BWTBDYWUyTUtjMGZaNkxJQkJyNGFlRWw4cEhtNUloV05GMStkbGdzUEpnWDEwVmRycGJENjhrV25hTDJXaWcyUy91M2wxWlZaSkttbDR1Q0x5Kzh1Q3BxbHVhb2YxWXRWTDNRV1VZZW8rcnE3bklBZ1lNdkxSNi9nMzhhTytLdUpBSWkydUgwT3F3VHlqZFArbkZzRXh6WVhBLzJUY2lGYmRHRmJtd3FBYVJEa0NBQlQyMjduL3VmenMzOWY1Yjg5ejMvLzFlbi96SWZmbjcxNHE3WmVTd1dXL3N1anIvNVZwS25hMjJkZnZMc29rd0JtSENhbTM2bW85NHA0aTZteWR1K2VWcGFwM3cvdkcwajJHR0NQU2dYLzJEMGNZdDdWZTQvSVRJa0FpQSsvdXprQXRrVnNKQklyYVpxY0srbjJyVUlHWHo4T0NybHE3VmVrQWx3WEZGaDF2czk5ZTE1NmQxZ0ZoVUtqcHIwZElRQ1VBRTEvSlZYZm1UVDErRnEyZnJ5b3NEQUtGWHhoNENCaHZMdWtOSHQxOVhJdDBZWEVWYUN3RStPNWhIQkhyK1E2N3ZqQ01HelEreVJvSWdDQUUvZW9td0VBYmdYQU5xSWwzWGdwNjNiK2sweExHTkRZa0FTd0pLbVl1L3IrK2hvRG9IRHlyeDkvUGpKL3VMNStOOFlTZ0tVL0tFdHZleVIxK2ZRN1RmbjJRamJabWhEd2hZNEJvQk1BUEpTMWx5YnpTOVNxZFcrdkpiOFpzQTJsTjNwNy9pMWdSQ1VESUg3SjBOYTI5QjhRNTczVzV2aTcyN3ZRZ3RJY0czdGpRbldjQnMxSXJBUEkxYkwyeGlvZkV3RFVLc3JaOTMvNXNxSzh3UUJRMzlMMEs2bnlydm5sbHhYcjdjaTVscVR2TDhxd2JsRWg4TVY0dU1BQTBDQUNnR1pkOGQxam9WSXgzWVlNREFLSjdxZjNOQkIyQUFCb1RlS3VzSHFuVXRyOEFJRGhFT21kM29WbXZ1bTVCdWtlQWVGY2Q3L2lQd1FBU2xWNSsyaCsvUzhFQU8ySDgvay92bjd5NC96aTE3SDY3bFJuNmIrc252MWNmUHF2OWFOZngvcmJzM09rQTZCNzZSWUJYNnpYNTJnSVFPSlBtcjE4K21SV2RPTWc3WTYzcnBKeWRyc0lnR0NySEFQNGtESkNBQmxpb0NyVGt4ZlJKOS9JaDUvRXVBVUFvQmU3RDNONkFQaGRzaHR5STgyNytIS1R6NWd6QTkrSHBqWUFiWXAydU9BVHpreGpyVmEvMG1XbEpvMy8vdTM1eTl5VG8vem82Kzh1cStYTDZ5Kys2QlpXWDk4YjBmU3pyNy91RnVXWEpIWCt6YXZueHhnQUtpbnJDNzB3ZWx5Q3BWSUpTWUJxdVZnRnhWS0JoSTdJZlAwNVlHTUFBS0h4T29yd25nemIzcWpVeDZUTHpYNFpWTkMzZHFVQzlMNXQyK1plRXkraTdKWkl0bTBBaUoxN0k2YXRPOW1XWEVaZzhOMEVRQnJiUDFXZGJrNEQyNXBmekp2a3dQTmpxdm9hcnNLaUlOc2U2V3ZWc29Tb2lQN2p3M0t4SHdCVFdTcTY2VkpGTmdGTDVTZG9rQU02djlDbDBlT2lNbjRvSVFDUWhZZldveXJaa2V4STk5cUdqUUVobDJCRUl4aXBBSEQvNHRYRlJVUHVQNjhBK2VYRnhiTjFFWmdvNWNMZTYxNDhlbjV4VE5iQWJ3V0FHWGVFQU4xZTJ6V1k0MHR3WDg2bkNnWXVzd3lKMVFoS213OE9BTG80ZHE2cnk1YnFNUGxQSjR5VDc5czgwM1pqL3hLOENMODIwOHIydEtqMHBwSTBtQmF4TTlXYzRhWGtocUd1SWdFUU5RUjRUUmh6dEdDUVNrWDV5aTRXR0FEYVF1dnpHakEvQjhMdGc3MERZWDVlS2xKdi9EWUF6T0x0QUJiV3ZnVUEzQWJaaUx6MzZRWCszd25GdUJsdXVKOUpEQmxqdkU4eW84TVRqYlUrOWVFblZvb2V1UmxBUUROOGxwbUs1QW1TQnpVa0hvQXNLUm9TSnZoc0tia3MwMk9Lcko1bm90TytEK0tOZHJxYWc1Mkp0azN1S3BVcnV3d1lBR2FINStzU2tnRFR5VVJDUmN3ZkZsaTF0d0VnMXVKS1kxSzVHUUh3WWpOQVVNM3hXYWx4M295TmxBK3BCSFpPQmh1YnpqRCtiek5hdlNNM2srcm1uZlBHTnJNbEI5RGp1V0lTOXpXdE03WURBUGpXSVpIZG4vemhPL0d4L1lZVDJ6OEFnUFg2OGhRRDRPeHNMYUZpRmc4TExOY1dBR3dOd0V0Qm5wZ0lJTURyK1Z0RXdPYUZ5V281NlRVL3pGRTYya25DU3lRRHdEdHkwMGV0c05hczZhQk9xMHJqVU1sK2dYZ1BPUnE3NmdESVQ1Z0h2czFqd3M5eUUraENZbFVOTmt2QWI4RW9BQUM3MkhpbDRTR2dVRUJqZnlrMUFFNWlyMndkK3pleStuTDdxN3Q5RElpODBMREhSeWZ6Tk1jR2JDRXRRYU5JbmpYeWp0ejBVWDFqSDl0bXZlbWRac2ExSm9QTit4aDlaR1hXWERHWjJpYUtWS1FDTjhNQUFJNm1aODlsSkFGbTAybW45a0VBRUtyUEZqMHdESUJBVFgxVElkdWVFazY1OFVGM3lPaGJVQTJ2ZlJRK01kbDdURElBSWlYQWVHTUxHMU1IVFc4RGFoYWpqTHE2YW1MQk1HbmlJRkhlUEc0amJXMk1LQ3Noa0xhL1Z6akZBT2l0RVFEVzYvVlNsNENKL3E3N0dBQ3JEd0NBd0hrc3FjVUJ1eUZRYnhhY2R3TUFSTzRabG9LTThiSnQ5YnUyTlQzYUZDTGVVNUlCa0U0SHdLU1pMWTAzRnd0STAxdW0xbWpwR3NCbi83R2xJeHdCcVZvVFpiZ2RTZ244MnIrOVh5eldnRklzU0VBcUlNbS90N2RmTEdCU2dGeHdJM0xlWndobytIcjB6WjJUUkRBQ0FMWXM3S1Zad3ltdFZHczNONm1EOVg3RGJFWWZRZTdTbHNBQmR1U21QOG1PS1ZIWDJMSEc1Qk8yR3VUVU1hQTFMTU5VRFZBQmZnUnM3VTgwd09CMjRoWml0Mi9qUFVjd1JuaEJTSG5ZekhaVEFNQkFSZUY3N1hMTU92LzJlYUtJTnJuaEdEQk80THp2SWR0Q1J6YjlBT2IwS05KM3dEdzNYQXJVV2NTUnFxbTZqazhFYnpSMkdRWG9zcGJiSWY0SGZ0RnJleEZwUWRvQ0FHY3ltVVF1eEtBS2pTKzQ2dVlMV1h3QTJGMk0zTWdpN0o0TzRtdnI5MWZ0c2d5S1VUOW1LL09HWjF4aTA1Q2ZLb29EaGhSZHI4SFJ5ZzUzK20xeU5YTndFUGdkMksyZDgzOGJBcmE2Z24xU0lIQXpRMEJpSlZNYUNTeGo1RzZUMitnbVRrR25IUTY4Q2hzb05PMG1BQmozWWk0WVRhOGtEYS82WVdlVWtnTk9GTHpMVkZzT255SVRQeEpFV0gzQjh4cm9uODNER3paS1NnRUF4eTErbzNZZzJYeFBxUnBBM3RvM1VDVnVFQnFnamQwZ1BaOHZhcU95UkJ6dkNJRHlQWGhITGxaQitVNVJxdFZLTmZsT3NWeTdRNTN1VnJQTy9ka3RNa3F3RXlrQjM1bGNVNnZWMERFeThRQ2dDQWdtQnZnZkRZQk5TZ0dBRllndXkyZTY0czF1M2RoNXhWc2NreElDakEvcEFCRElNZHZwdUd0S0xkdmx2K2VLaW43dXJnQm96Vis5L0h4WkF1YkxhbW01TGxUN1YvWFMvSnhZWENhaUJ0RjNWSTFXbXUxQ3lhUFA4ZmRhVFFtR3krNXpGU3RjTWZvWnZyRG5zaW4xRHNNcEFIQWNWNkRud0pFbHBXdVZ5OFVtUkJDdWFKYmtaZGxoWUVzSEYzK2U0VTJNZ0g0ajFUWVg1Rms3QVVBN3Fjd2VBdlBLQU9ibkNBQm5DQUJmM2VjQTBOb1cwSzA2Y1FXWm5zZ2p4eEJyN0NBQkZTcTFPLzRTOTFsUERsZUMvNHlvM0Y0b3l6WktBUUNzWnlYWkd4RFd5dmQvK3ZmcjE1Mzh6ek44VU5MOGplUy9HcTU4SWdDMmIxdnV1NzhUbm5sSlJkTWREa2plTmgzb0ovTVlCM3hWOVN2VEE4Q1RGd01HQUdUNkFWalhpZDZFVDRhbmFleTRZbkppTWRJSEVUUVBBMG9rYjNZWVBVR0VrMlBlSm41a0R2NU9ENEE0Q0tEbnk4cXZvMUwxUWJYdzh3ekh5c3VnUUdmTFNlUThvWXEvQ3BGaWdLV21DQmwwYjIzY3pBMjAyc0ZlMmFIL1cwZ2RrV1pYVDU2dFNqNEFqRjl3QU9CRGhEUzYvN3htK2dDZ2FSd0JkTmNDdWk4Um4velpVcHQ0QU1SdUVCTDZuUTRBTHY4alVHQTBvS3ovcGlKT1Y0by9yLzd5VEN2WUw5Qy9CMStOQy9lL2Vtb1d6cTZ1WGp6bklzR1RYUkdDQWZvM0hJNG4xMDY3WVdCUWhPVVkrOUQwV3FtT3c0bVFCQUMxb2d3YXIyckZGZFlCbnRRZVhDRUFGSW9sMVAwMWhKSTZzdjNKL3VPZ1dOY2s2WjZDanlXOGQwL0w0ODk3WmZKeW8wUFdQaHRuYy9yVXJtMDFmNC85QWNKaythS3dJMVZCV0MzL2VMMGUxTXFGbjM5ODhPMlBoZkdiL1BqWEx4ODlXMzUvK3VwdDZmVEpreCsvbHJ6YzdsMmJCZUY5OXRNRFlIbXo2VURWbmEwSnVMTGpucFVXQUpBQm9JRFhoMVV1bmNtTHZvUUFJT21mSXdEWTY0cmVzcHA0YXRDME9rM2krU2lzbDZYcTUwMW9YVjE5ZmpYTm5WOTljWFhGejU0N0lsczBBR2d1VDVhemNiL05WVjNvSTVZU1c1OFBCUURFOFE3ZlRENXlGRUIxVVNyZzh2cjEyM2IrNTFXNS90dmRRd1NBZHhXcFVEQ3J4cStOb3JSK28xUzh6TEgxd3lsYUNnU3dNcVl4Kzhadkk5T2QrK0ViaGlZb256dllwVml3U0JNNnlTSnB5M1d2V0t2Mm5GTHgwRUVBY0NvV1hnS0VTYlhxTFJ3SFZrUUFrQkVBcFBMOHZGSXVsSldyamx5a085VENhbTlLdFA4QnRodFVvMlg3dlF1UlJ1dG14Vk5XZXpzQUVOTzdRLzQ5V2c5UVpMeFE3b3R2Y2tnSlZIN1R4bStRRUNoVlM2T2ZycTkvTll2VzIxNUZDZFludHZhYXRsM3RwamNQd25ONGFhbm5XbzQwSkYvVjJFT2pucnVEWndLN1MrUmlrVUpkTGhiS2VDS21XSzdpSlBUZm5TVEVNNE4xVTNNQkFDU2tKU2hRa2Erc21zYlhwTXIxNHc1NnVzUDJsb2h5ZHlUV2JNUDBpczJaWWdoQU5LQlJEdnVlS2hqQWdpd05rY0wzNk5vRHdDRUNnSFQ5cUt6K2FsWitPcGNxY3FBSzhjMUtqMmVJdk9RWDJBQzBONDY0U0V2ZUJpTjBvVGc3emkrNlFkTTdKM3V4MHlaSTVXdldtOXljSUFmMTRHTkZLUUFRR2lXaUptSUFLRXdkUkUvVjY0MGpVQi96amFxZEtGOUFlaC9zelFDZ3Rmb3paMFFIV3JxZHFldHNESjBSV2htOGZlVThmYnZNY3dEa0Q5OUlOZW52MTVNbnZ4bC91WFljUndwck0zRVYxK0kzN25BUmdGWGZHeTRPQXFHQVFsWGxUdm5vT3FYMUEvUlc3ZGhsZEtwcDFVM0QvWUUvOGRoVFBEa3BLcS9RWGJJUEFKV3lwR0NEb0grb2dzNTBZRUsyRkh0U2o2aEdBZ0xTajF5eEFCZ3V4eDE4Nk5sMFBSdmRBK0N3N2JMZkpUZXZMTmxmZlBlM1E3bnc1YWhTL1ZycC96WGYvNnRVcmFndnJxKysxcjc0K3V1dnY1QlNWSW51M0JXTEFDOFJwdGd1TnY0cGZaL3p3SXZRaVRINDA2MWs2NjBzb0VmdEJVekxNSDBNSVVFZ1dBQ0FjdWZsOGZtamNoQUEwc081akdUQTRCQS8xMXFSSVFvM1NXTjhNdHc4TENuSnBaS2kyb1FDQUJERVRGRVN4R3dSZFgvUHh0N2J1MmZ2N1lsaUpoWUFTcldDclg2MUprbHlXU3FScVBoS3JZWVRwUUlObUU5UkZZUEd5c1RxZ1o3cEE1YzNQMmJaQUgzUGZlaUxhNDlVcTFLWnBjWUs4N051TmxxdFpxdHROUm9OWFEvVXo2ZXQwa09NeVhJaHBXZ2VqV3NJQU5Md3NJZ1Y2WmxaMDByVFFWbFZCMk8rcEJ4NFc3TFVCMUgyNnk2TzZrZ0tBQ0M3TW5OQ2Yxa3U0TTByM0ZURTZmL24vN3N0bnR6YlU4b3hDQWpPVGluVjhDejVEa1JtU0pPendQTmhsSnNrSFJsdG4xWHJ6ZlpGcTlXcFJvQ0ozeHl0RzBTcGFQcHY4K1lyVkxJMVBLUUppaXlSN1dXcXFOdEFIRHRlVmlCS1Vnai9WZDhwdzNTZUFBRnB1amxPdlRjQ2dnQTROd1h6L2wwaG00VlM1aUFqeWtnWUZMS1piRGF6dnlkb3N1Q1ljVEtBemxuUTJvU2k1Uk9tV3FLbU5OSnNSV282UzJJRUp2Z25vd25heDBmK1VCRC91cnhJSFRETkNCQlFSMWpnVDEzSDAzK21hV2hhdlZuM0trNEhHbkpPT0k0SjVHM2pIOTdnWU1oUEt5T01aLzl4KzlxalRZYkgyUzhwaUR3OURBQnczOHdjZE0wN3hmN2Rmald2OVFTaDM3ZzdIQmtIbVo1aXJBL2pFT0M2cUNJaTVSSVE0TDZDUDNFN0FHQjdBcnZMaWJtQncwU3FEK2FIWnRCeDZndEJpSHBtcWtPeGc1SHo3RlFJdFVGR2UxV3JHLzdSZ0owTlVhOGJLdEFzemVTSGtnVUtuSk54bjgwU2tVODM4bWJZalVKQWVtZVY2NGpsTjI0QXdEcGRpcEt3N0JSS2p5dXJqbkI0WGloZGFMT3VmZC9Nbm1pYTA5ZmlSSUJYbDZoWTJlUTZCcy9TaUFGQU1LazNSRVgyanVOVjd6QTF4czd3enh0STJiWmRSUm9CRU5KSDJZRGYxS05jOUZ3YjBMVjZIVXNEM1JNQ1hwMndnY3RuaVRTTlRoS3dUYXRVZTc2d1E4MnpDWUJOVllabmRHL3gvb1FBc0Q2OGI0Z0lBR0xwc1dRdmN2ZG5ocjdPbGdyRnlRZ0I0R0JqQ0lpS0VRbEh5Mi92bjJ6clpzTmd3SXcwdmtOSkk1dE1xUFpYNDZTcG5kRnN1Wm9hVm10eTNOZWkzTmhiRnYrbDZWdFdhRWFhalRCbXBKL1NEYU5WbXhTNlhBajQ4aGpVNjRjQW9La0VCaHJnQXlQQmdUa09iZHNScnFWdk9QYjdpMzN1WS84TklRQXNjLzJUUEFPQS9FQmJHdFBEb1RpYno1WnhBTmhFUUVnQ3BKUFFWRGwyQjVJVUNKaGFORUViT0NOWHltb05xenVhSHZVcEtMcExiRWZ2L2JuTm5CZ1JSU1lDSU5VSUVGYk5HZU9qQzI2NHFhNWVvRGU5T0JqeWFiVloxUWdmY2RBWTIzaWV0WXdLbTJOZjlzMWFiN1lpdHlib2I5ZjBJZGZDT29CWVdQZjJGMzFCZml4bFRzZFc4ZjVhMWM2TFlxd0VDRFlyTG5aREI2Q09vOGpLaGh6eGZvMXNVNDZGa283Y0pkTDF3Y2tROWZXVDVYVFVzL0JCcmVaZ3VlaTNuQTY1QnoxNjM2dW8vNnlZclFCSXdYODk3SkUwRVFwalo2bU16U3ZRMU4zT1NUNnBxOXJsSWc0ZkFJSHQ0eUFjTjlrTGhJcmFxTDVIM3JhSFVQTjkzMVFDODJMelhHNC9HQzB1SmFIL3FDTGduZDNQaDZpWElRRHNUWnhtSEFBTWIvV1RFbzZXVDFMVVlJZ0FETWtyZjg3Zzc0a3ZvYjdSc21hUGxoSmRUMW9nRWhsSm8zd2FBRXpDRHpZdHMyN0dJV0N6bW5XTFNIaFAyNEFqbXVDeGpxWDdvVXJjemlvTWxSYlphVnhvOGJkaEc3MUdBaUJqM2MyWHMxWkRRT05RdXlUZWFRczUzUklFMExWTU05TzVzMWRvR1ZzQVFCR3dFUzIvUlZYM2Jjcm90eWUydk41cSs3NFVJQlFyR3dRQUlNZThKOXkrcXczSVNrVW9xT3NOczc2WnU3N2h3S3J6czhYcFVuVDB6Qm53cGZpMEZPZ3pXWnBqdkh2UHlXVEx1cFpBcmNKdnc0NUd1clU4UXNOODM3Wk1wR3dVeEp5c2xHUXhuOE1IKzFSeVlsRVdSVW5lWkhxc0VyQ1RWUks4S1dDUVJ5b0J3UnRBUDFWa1Q3Q093ZE9pOEZMdDl3TkFQMlpPdWw3WHRJanFSYVRwWEhUeWlVRFhxb0NVLzVBTFYvLytyT1BsdkdkcTlkZ2RuRUlVOFNhOEoyQUpvTlliemJiZEgwMW1pK09UMWNXMGJ3WHJtUXlBQ0Zzd1piV0NOMEZQK0NkNURieUgxRU5MTUdKdVN3cG1KQ3BXUXAxaXIzRktXanNaUGpNYWtSb0JDcVBWYk5LbGNZUy9YZHR0Q0lvQnlJOUFZdE9XdkZMSVBvQ3AxKzdHWDRxYURETGEvY25TbVk5dDFqdDJCVUQ0NldrQTRTb3E4VHM1aHdFUWF2MmRnYWVxOGZNT0tjdExERXFJRUE0d09vcGRhN2x5bmg5VzR3cENTSTFrdFpJVlJFVURZaVpEbHhtb2VOTzV1U3UvSUpRRVFheHVlWk9JVjBxYURqYTVoSGtQQUtSYzZrcXlxaHpqMnowQnBNaldZZkJ5d2xOcUdRR1RLSEhkcElCK1lBamtCU0hMa3FweTFhKzVwR0QvTXFLVGU5U0lHRjFpYmxCYi9QQ1NnUVY4QUhEN2hhNFgxQW5JQVRrL2FZbjBGbDBIUnEvdk9YVnkrdFJkOGh2bktkb05BSjZHYzhNaGdMOUIwaU9DeEtKellMUUY3a3VqeFE0Q1Rwalk1NkFlSkl2ejFXcTFiSXQ4V1h5MlA4OVdVZHNLazNtR3BzaENSaWpFRlJGQi9lTXRLdGlHelFjMVBXNURDN1ZsbXMxbUEwRGlWb0ErTFoxMEM5VGJDL3J6RTFFcUZ4NzNDUUFJLzQzRzJ1SmpKc3kxTHRpK1QySGh4WDVHYnkyVkNBQjNpN0NkQmdHZk9nZDhYTnNtQ2JnYmtLK1VTUlFCckxCNW1tbGhMRUZsOGVISlpMSzhtR2VZZ3pJN09zL0tpcUlJL1JtVEFPWEN5aFpUVDJKdVpYK0V4dGRzMUZ0eE9pZDVOOFBvbkZJdmdIZUlIRHR1UWtVQWVONFRpZ2dBT1ZBV2hheWtTS0tZRXdyM05LV1FGVEo1bVFPQXl3NWVMaS9HaUQ2SUxEa2t6STJlMlVrR1JKdHlNQUlCL2pTZnlJdEJ3QVlBMGdhR1FJZ0FjSWlHZ083bG5aeUkvdVprRElBaUhoVXkyVXcxajVNeXhRdGJFRXRabEZSUVVDWTBhQlJpOGFDbFdKSUFReE1WV29Oc0dKUkVwZ3FtZlRKLzdPckUrQU0zUmtGLzVseUFIQWFBSkRhbnc2b28yTFl4NlpjcnBVcC9OdElFRVFNQUJ2dWZLMFVnUC9aNW8xR1RBZERtTWpZRkFBSmxRNzd6ZFVoemcrRmN3RHRSQjNEa00vczNVWnRrYjJhbU1ZUWdCVUNtWE5BZTZmdjZrVE83SndnSUFFTHIrTjUrZnlKazdrNmNlU3UzZUhJNkYwWDdlRFdxaUpsWmUrQ01wRnhja2RNMG9xY1ZmQUhpSHRxK2x0RStnczdLZDRRcmZRRU1nT2I1U2tRQXlHYW1GNGVyQjhyKzBZUDEvT0pFekRtbmg2dEhab1lBd05kSDJLdTdpN2dEOHRpbGJmc0RHQTBUalU0dFdVZ0V3RDRJai9hZUdoc29iM01VOEIycEJLaEhiRGNFSEc5ZEhnZ3BBQ2FpSUk0ZnlkSnEwbDFjZ0lQUnVYanZ2Q2NJazdWUU9qK3lENmVGNXNXb0tUUk9oLzM3cDJKMmZYOCtlcndVb3RWcXVncGtLMmtCQkVEeXk5eSsxcXgrUEFEZHBmLzRVM3hqWG44R3JHYzJBb0JRdlkvNis4bmgvdEdGSkpoUHFwbGlQcGRmendRS0FKODRkVXZnQ0lnU3Exc0EwTzczdXJiZGFWdkpBR0FpSUVyMTJLQTRTSGk2TC9lQlJZREZ2WWZPb09EL0hjZFZyYU9tZTJpWkNBRG42L1g1azVFZ0l2Mi9jTkZEQUZEUHgwSTVnd0NnWGNySUZzZ1dMbXd4bjBIV2xINTVKN3Mrd2dPR0pHMlVTR2lXYmsxS01EQ28zdFNCMms0MEhIeDB5RTBjMWdvbEJJRE00b0dKQUdCZDJMYTlYQXRIamxDVW4rcEMwYlR0OWVLQUFRRDZicUlGK0pyQ0U3YWMwb1dGZzIyRFFQQlprYjlpMHYxRGxTdW8xTUNFMWVhZEVQcTNGaHNjR2F5R3djeStJaEVBVnNOaC82NVFFRUIvUEg3Y1J3QllYK2lpUWlUQXlkbGlyQjFnQUpReXhtZzh1MVF5NjFFbWJ6Nk9BVUFqYlV4NkVBRUlBaTNWU0J2T2FDeTVrNEdVZ1NXQUtGODRCQUJEVEJnQXBjclRSdUZzUFJvNmkzMEVnQXBzUUtydytkb3UyYXYrZ1FDUTZoU3ZwQnE1MmgvOW5lQVAycmdSL1RtY3FDRHM5UTNjVDVSQVVTekpCZkJ3MG00LzdQOXA5SHpwbk9Ra0RJQ3MxQjR0TDNRTWdFei9RZC9xYlFQQVVXckxOb1FBVE0zVUM0NDdmZjRpNkJQcEFLQ1E2VHg5M2hlMDg3dUNJR1VQanM1RlVYdXEzSHVzQ0tLREpZQWtHZzZlUFRLQ0FFajBhWHdvQUd4RFFQQm5sS01uTUVMNVQ5bE1KRmFRUHA4NWs0U0tFQ1ZRMHcwZ2RoL21NNFVMQklBSEplMHgxUUVFTkFMa3pnY0lBSUxnVFBFUWtBeUFqZjJBRThpSEFEWnNSTTBSeEJDeGNaZ1V3d0FvVnJMTDUvMU03c1JwdFp6Ry90R1RzZVdjNStUTHFkNjdXQnlvbDJPOTFPNnprNHE1Qm83MS8wZ1BFSGtUUmY0RUFOZ1k5ZDBlN2lZWklmNXZvQ1pONFl1RW1oQUFZS011ZisveHBETi9nZ0NBcklESlErVUFBY0E4RzluVGg1cmduUGN6NDRkOWUvazBHUUE3YlV5Rk5FR3RnWDFDZXBQdkVKWDYzcDQxZ2h3QkJmMEVGR0hoemtsWHpNbVQ5ZWxoYWYvSUdhMVhSa2F3bmZWMHNoQXlQYWN2cWl2VXNQZGg2Q3o2YUJGZ0xrYTFXbW9BYkVQQWZ1cUNNSVg1YTBTc0RBOGhJT1l0WEFHM04wOEV3SFJJQUZESnRJOVgzWW45cCs0MG01Zm1JMkZ3S09TdHBUUFhoYXd5V1dTTEEyZHBMKzVrbG5ZbXI4OGpBV0RGbnFFUlFVYmJBS3FobWNBdzJiYlJNZk1Ca1RUVVZ6dzhCQ21uUWhuV3N0ZzdVUkRFTE5KbWpwd3NzbXdVV2N5SVFpYVRMMmN5UWxIdmpEVDFYSU53ZkhwaVU4WGZNeVd4SzBEbk16emdDTWNZdy9RQXVMa1drSVppbkwrKzczRTQ1a2pabXlYVW95YWlVWk44SzFNZkQycElVUmJaQkFIMURXRi9rRmlna3diWUM0U2FQQ09EMFdRU01qUjMyNWFncnVtTkppRFJ5TlFBZ09tSEFFeFRueXBJZW8zQ3BSNVdBc3RWQlpEdEJza1c1UFc2cnV2SHVuRnNRbk1DNGZDUXpIZXpBNnJRZDJ1eVdvNHNJeU9LQ0VBNmdrMUYvZUFBU0swZUJTbDYrc2YxZy9BZmNZWWx1Y0QyTW9wRFl2Uk9HdHZxaTQvTW1mdnUxTHJ6M1pZbE4xUThLVVFHZnRyMXRSMzN0ZXBQQUxCNUgvYnJkc0pzS3REQVM3cDhpTzAxMHg0UCtzc3hWZ2FodFdSYkQwR3dHdWlEaVUxaVZGUnQ3VGpPUUN3NHNyUVRBTktwQWJzamdGdXVNUmNEam9LNEV2Q0Y1S0U1Yml1ZDVMclJRN1A0dkxNMWNjYTc3a3JRMUhTbS9hR1JBRm04aHJsckN6V1BIWHVGcFVmSW5oSXpHWGZ1Z2hwUmRMdVpZVWZYbWhhUi92WGpqcTVqQUV3YWV2K0N6YmRMMnNYZE84WjVvN0NXczZLMEN3RDJ0eUVBMCsxZFp2L0E5bVVnZm5zMndiRUF0K3dhdStOV1NveDBDcXJHSFAwZkhNL3NHK3hKVWpmNFFzRzYzbXFablJzVWdRZnRRMjU1ZVB0b0tiVmFlSzRDY2xuQU5xQlR0Y2xzUHBzZkxVYW9tWmNlQUhKaTlyaGZXSnZEZHU1RFNnQVhBYkd0dXVrRWpITDR4VkpTUHBoNG1tRHNUa3JKQ3dQNFhKTTlYdzVTcjBHSkk5MXNhZkVtZ0NMTHRScVBwY1Nudk5XQzF6dUwxbWhwZ1dCa21Dc1JqTUJ1SjNROG9IRUVaR0VSaVFRK2huUXpzcXAyWVpyOUU2VndQdStmalQ0OEFQYndOdFV4Sld6TzV5WHkzaDFYVWxIOGxnR3hSM0p2V2YwNzMwMWYyMElhbVF5S2UxN0o3aGVLZlp1RSt5aG12OSt2aCtZaTYzWmQ3M3ZUTzZyYmZzejM1eHIvSklQdUVaVUpxamJWMlBZVDJ1UGxjbjBrRmM1QXBuVzZDd0JTRGdJWUFtbWRPSzZGRXBsL2J5Y0V4QUlnZmwvQTVQRm4vQUhPSXdtVEhqY0VsSTdQQzhYekZRVkErOVhGbzVlZDhrWW1QZ2ZGZTQvdS9XSVhYSVM0L0tlckRIWE5HakE4Nk5vRnNpT1hRNlFEaUkyVDNRQUFkaGdIb20rUFNJK1hCTHRKZ04xM0RVd1dBTjI0RS9QZWgySnRnQ0FBcnFxbGs3UGlScWFGY3p3ZjIyQTB3T3E4TnVCeDRkQ2RQSFc5UHdRQkdsdFpTcFNDUVp2Q29RNHdBREpIaHpjRFFNcGhZQzlHdlhLRlZnclZibGNBN0g2bWVLSUcwRXdiYzcwYjFXTVFFQUtBMFhpODNBUUFKaml5cHZyQU9UUngvei9xbUd3ZENRdW81UVlCWFZhdU1rMEFXNE5UUGg3bzJxUDVmSFZmL2FnU1lDOWF3ZmI0N3lreENYMXdKLzZEM1JtV0JJRDRjN1BKWm1ERllobnZpMTBxVXZlU1ZJem1WZ1RWbzdYSklBQytlUGJzUHBBak0zS2tkNGxEc3RrZEw2QWZBUkRTRGFrSi85RmZ5TGJCMG83WmVLQVdxNTFPeDVJeitZNGtBbXRuQUtTV0FSNXJZd0k3dG11QnUwa0F4MWt0Rnp0dEhwWUVnS1JncytMeTVNU3g4Tms3OTA1cU9HWkVrVTlTTDlLSlFVQnBlVkVzWGl4TFNxRlFRaEpBcVJRcm9Pd2Q3Uk5CUExKZ2dEVUIycER1RkFzOW5BNVNBRkJMYTZYUmpRYlVUam1IcUZRcmlQbHlmaWN6a0ZKYUFQajBnQmhHUTNic3pkNyt3ZVpGVFBzNys1ZGhQKzdBaHNqYzhRQklOQUNLenNYY2VhbkxvRFQ3cW85RmdDSi9ubDVoVkswb1JiRFMrbnl4K0x4VnJvN09LbGdId0NIcXhkVXFJVTZaK3hmc2dHa0pQYjhhWnozMUJjOWF6VHFzVzYzQmhHZ0g5SUttN2c0QXNKY2FBL3ZibkxoZVZqZnBmU3d2L0pSZGpwVk5BRUJpdEduUnVWK3N2QmlVRmVuSjZoeGJhN3NBb0I3SmY2QVU3ZlhhTGlqVjBSb0JZRTJXS0JTUG5RUUE4Rm1sWmllVTdzMEUrOVpjNmlPMWJwcE5BSzBSMzV4ZXhUTUZOd0RBRGtMQWh3R3ZlcEhGdUlteE5udEtTcklGTm9haWVDTWdjUi9Db3ZOZzdsd1pjc1c4YWo3WDVOMEFvQm9OS3dwM0NoYjRDa0JEZ0tRVUMrUnM5MHFoa0xTOUdvc3ZyQyttWVJuZ2lnSGYyZlJMWWlmZ2pZaDFGd0hvODBZQTJBVUJleHU5bjlhUDh6MkVnQlQ4VDh4aGRSSXVSdFFrSnFjV2ZmUVRvNkx6ZVBrWHU2Z1VqcytVeDVNU3FGVjNHUUswcHRuUWdOcDZieStUdDlhNGUzd1lVQ3k0bjhBTHU0QmF1OCtrdnJFYThDTXFiZ3lBWFJEZ0QwcjBseEF1aVA3ZURvRGs2NU1Fd3k0NU9DNUFabUtzTVJvQzVJZnJZbFYrY1hYMSthVlVrVXAzdjdCQVVaWmpZa2dEVkxlYXFtYTJUTk5NV3BtYWlnelRWVDIxQVRLQ09uTnY1UExNQXZJTHNmcEU0MXNSbXhQSHhjQU5BYkFMQkZoOWZMNWZMem1jN2YxMEFKQThka2Y1b0dLeTJvbHp0Z2dBaGM1THMyQy8wRFh6aTBiaCtQenljUVVVTDV3VXRxRFJKdjBXR3FaZU41ck5ab280OFFUeXhSZzd4OU9XTDFqRmEzQ1ZiVFhZczExQVFOVThkRVlHbmoyOE1RQjJHZ1lZaDJGQStzY0E1U1oxY1lYTHhvNHQva3diWCtLZnBvK2NpSzFaT1JYNy9ZSTA3R1Y3ZzRJc0RXMVJQK3pYeXFBdzZLVjJCaGp1SmlMYURYZTlwMlFhN2h2UTZzNVZvSVYycGxBNWVXdUpDU2NhaDR2NWZQd0pBZUFUK3Z0UnQ3T3EzYVF1VUcxWS9mSGNPWTQ3Ull3N252dy9RRExjNmdObkhGTmF0Vnl1eXVRb25DcEFmMnV5aEw3Z2J6SHJTTUtrdG56ZzJqVkF4RTlhb3huU1BiVDVlRFpldW9vUUxac0szbDRMakFMaHJFZzRtRHNGaEFScGR3QjRoMWttNE9OR1pFeDZscEVFSGVqN0E5TUJBSkhhdS9tbTVBbWtCOFYrakd0d0t6V3hNcm54QWoxY1dudEpEakhYai94VDVHdFRYM1NERWhJMjA0ZUZiOUJOQUxBTkhaRUVnOFFUZ1krVnlXRjZtMUhKTVZjMjZTUE1CK2pOOE9aQitzMjJ2amFhQ2ZkcG8yTjdjZ2lHVkV1MHBxdTVPZEE2TTlnSnZwSDVIZ0Q0NEJDSWVRcU1Cb0Evb21DUTZJZU5NUGJTampQNkxnSEFxVWcxTjdYY200b0FmQnh0d3RYL3Y3M3o4VXZiMnYrL0N3OE1KVUJpVGtvaUNTU1FqRkJDeFlvVEswNllNT0VDVi95S1ltMjdkai91dXExM3RkdnRMM1c3bi91dmY4OUorRTJBb1B6UXltdXJCQWh3Y3Q3UG5QTSt2OTVIUTN5czVlT0o3QTZzRXJTOEZGQkR1ekZ0UnlobEdyMWxnZHNBd0JBRnBKQXlhQnl3Mi95REppRDJTQnYzakFEWkxJS2NXU2dSUzdLMHhpUmV4MHNTcEdnc0s4czVVY2duNnErRlE5Y0RJRzNpeTErYmdNSGpROTJTVTVzYmcyNVQ4NmEvMVo5WXZmWThzQTZGb2lhaDQ2d3NHVGRYd1BvQWxQN3JrZTExUVVoc2JHN3ZGbzBzcTZnakxBM3JFYlM5aGwyN0dPanBDaG95UU5oelZWZWF0V0gxSjVMWGFxUjNTdzZiL3V5UW9CSDlGUnFwejBSVzh5MmNkZWRXMlUxY0N3QmR0bDQ3amlBN0VBS3RUMTRsRmRLVmRvKzFTc0JZR3dGeW4rTGs2bDFCOGdnZmxWVzFiYUJVUTVzdXBxUzBOS1pXZ0hEVmtpQzkxaGdTN2dEQWVpRWdYbkgzTUdzL2NNVzlTVTNWcjQ5YnZFNC9nRms0VWxQSnFyRGEva1BTYmk2MUt3UXkyRFY4Z0E3N1g1RUFKU3ZZbXdCY2lZQ3Q0YWRjWGR2ajh3SDZ4Z1dRcmRyUS9HdXRWUU9vdDZtN1NSdVFCT3poR0FFUTdDWUdIaUtZeFFIYzN2NThWR1hIT25PN1IxZmZuYXhUZ1hEZml2NWFYY0hJdGJOMHI4Q21aaTdlczZnTmV6VFN5cUNlajE4ZmdNQ212VHY0ekVoSnlBeTRSYTgyck5BcGVUeGVRS0J2L0hEcmhiaUpSRGtrSzByTTBqZUUxSWk2MmRWc3dMQ1VNa1lBUmpjL1ROYUdXZkFoeXlsWUgxaC9qZ0VBWVNXVDNyWWVsTHVmeFA2MytUVThBREVha2xCVWFtdWVJRnFSa09rc2h6QXNHNTBoQU9nelVtcmQ3SzFGVyt1VVFicEtUKzBvZ0JuU3JnMUFIMDgvaEtLREJxN2FDZ3hFUmxwbnFDOUo2UWl2RFBOaDd4ckR3VUxENUIxUFJyTS91Z3dySi9YVHdQV2dGdEpzVFdNQXdMU3RqN1lEQ3N0aHEzSER1alZTNVJGV2RTOVUzczNtbTAwYm1BMUY5Vm9BZEt6ZHVwTDVod0dBTFhiWnk5NWh1LzdoMHZ0WTJTSlluUm9EQUUxWHIyM0xDRlF2cUdwVTdRU2dkMCtKUHJJY2Jrdy9XUWswYTRwV2NFME1LMXlySzFqb3pPY3IyWDhZQU4yZjZ6U2UrZUlORXlQMy8zMExzaFlXY3JEVVNGaUNIcDhtdCtyOFVDZ1FDWVdqU2l5QXRxNHhYcE1pWWNXYVR4Y1pvZm1qaUIzRERmVWhRbFFDWkdjT3dHNDFOaElCbmRiYmJrL0lZazg2QnJSTFJycksxTlczS200cEZJNmdXRkZ0M2NFUnRLNHJvcUdxWE5VSENVTXFOSlNWSHY1UTFIcUtBb0ljMGpySElPdURnVEFYQ2lNdER6ZlJZbnRlWHNXRVYrMUMxRDlLcUZmL2d0Nk5qZm9yTUw0dVliR3RRd0Q2QUdGQjB0RE16cWkrYzR5eGRsd0tDYUdBWGhQQWNrRTJheVZFWkdzTkhEUnJpZldIVlBnajlibFFlNFhkMUhxOFB1VVp3eGptdWlWQVI1RThtdlZHL2xUUHR6VC9YRVdkR3h3UDBmbzFlMnZxRW1XMXZVTUEzdXV3ZFJDRk5ZT3F4VlJGQ1J2R2prYmxxS2JYOEpvYWpwaTVpQmJkUmc0bm9UdzR3VGFXcENwb0ZGQnVmQnpEWENRK0JnQnNiY2ZXTE5lVU5NS254cXZ1elEySGFOUkJBU21xOVc0UUZnbDMzcmtRQmtudnlCSUZNYVl2NTBWUFpEa0NYUU8wZkFpV0FwSWMxdFJROS8xdWNReUlkZTd0bDh2bGJORGhFNHlDcDNOK0E0YXRGNXpYQmFDOUNMQ1k5NjdHYXBkNFBpdFExSkJOeVNZa2t3Mk9CeWsrTkNaNW0xWmc2MDdzM1NOUzZUS2JYaGowQm82VlpGVHNSOFZBdzg1aXo1U3gzdTBIVGNVNjk3T1J5RXFwU2dHQlY0VFllaktwOEx6T1BIemdZUzVzVk1ZSkFNcFhXY1V3RUNXTVRKWWptSzB0cG9oaWJEb1lsbzFOYjlCbUJGc1NIdVdtYkhwRFhSc2NEOVVvZ3dKYU9CeVdvajB6OXJvbWdCdk4rSDZUZXVTd0dtMTBjNHRxMXhJMnlkb1lGUVFnZzd1YzhoT0Z3QW1TY0RFa1FlQWVEMDd6SHB3a25BU09qd01Bb1FPQXRSU0dzU1dYa2NsYUVsdGZhK1g1UmdMK1lSMkZITTRLUFB4dlRlYmxEV0xQUHdQelEra2xBUGFGMWF1TVdKOTRJbXNoS2FESTNjRmd1cmVMcWVOZ3BZOUJVZFZPWDdDL0V4Q09xczJkYTNVQUhMajZSTVRqcGNOeWtzQlh5NXY3bFEySGk4NGVGS01WYml3bGdFRFVHK042dHRZQllKWVpnY0E0bmt3bVdBem5sM0ZzY1psREFBZ2tYeXF4Rkw3TUNveU44VE5PZkMvSWc5a1E4Ty9NRjVqMTl1QnVxSEViQnRTK2dYNTBxWm9hRjhKb293MDFxclUxNnVWT0FzSkcxRWFMN3FVcXlrcW8rZm4rQXdnUk5FUlFUeDRFWUMrWjNLN3NPUENOdUJDcnhoWlhUN2ZremFxMG1EeldsTDNqTVFFZ3FLaVJoUEY0R3dCeUtadlA0dHIyOGs1cUZVOW5zcW5GUkNtekJ3SGdIUnZycVRVbm5rM3ZadUtsbmJLRzV6T1p3N0VXQXNwejJQeFBQN2xuL202eWl2N2lMNy9Fc0MvMEY2eGU1YTZpcUZwRVZXVlprMFFsTnFBUWpzckduaitvYk93bzRhVU81MDBNRzY5Wkd3MlN3dUdRckRhR2ZnMTN3cVRMU1ArOWdMNzZHTFltbmZzSHhXTDVZQU1uQ01KQmxyWnRxOGVBSUt1SlJXZ2NwMVlkRndCQ2RBY0NrTWM2QUNEb3FsZmJ3WklKYkRsTGVQYVdpeUtlaGdBd3hENHZsUWc4cCtFdW5IV3FXVHl2NHNuRU9BSFFMdTFZN0dLMXo3dTVOem9BUDhqMTUxYXZFWHRVejJGOTRSVnFWZlVyQmNRbUcyaTR1d1dLSE9vYSt0Y3RML1pVRlgwa28wNkNlbjBSVU5TUXJNaUtLb1oxd0JyZkVGS01UV3BFMk93UFFkY1JWZ0dFd3hrOVVSYTFiS2wwdkdOYnJicEk0akNCbDFJNEtSOXc0L0VCb0dJN3UzblFBY0NlalRoZ0RRQ1VRanE5cHh4NDBUSG1rdk9DV1BBdlptVVB3V2N5bVN5KzUzZkVVdU1GQUdjL0ZlQ0IydzMvM0xPNzhmb2hablBiSVFBRU9pWWF6cW5WU3hUdmQ1d2FpdGFiOUwzemZFTU43MC8vOW1qYlI3cVdCTlJ2NEZIbWhOWUpRazVtU0pJRUpheHZWUy9ycFlpa1J1VkdDU09xaUJYZEI2QkpjTFRLMTlhV3VWSUxnRUlhZDZtSDR3TkFhRVlRVlBjSVd5U1B0d1BnejFFdWppZ0x0dTBFNGNOMzh0bHNZZE9XbFVrOEZTUENzQVFJNCtzYjR3V0FQWHNKYi9KLy9mbm43MHYyZHovKytUYW9IMkt4dC84NWkrYitPSHYvQzI1L0p6ZlBIM1psS3dVMG1WTE5aRHZPUkgxNEVVWFVvdDJOdTFia0R2amRjbHVYYmFDN3hRZUxDclNjYllUdzhZMnRoOXVpVFVJZlFsYmdyUjlSUSsxZkw2SGxSd2dBa3ZERVQ4TGhHb2VUQnp0NEhRRGJ6cUhBN0I1emVLSktqUXVBZW02NnNvVk1LWXcxQVlqc3g0bnM3bGFPVGhaUytRUUI2UEl5anZ0TEpBU0FpSmMyWUFtUXo2UXEwbmdCZVBueGpRMnpIeXd0dlNuWno0L2RHOFloL203WG5aWnpsK0x5KzAzN2UxTUFNR3o5dm40Z1IxZnIyYW50cmNJbW9KeEtMNW1nSW9WRms3ays5VWwrNkh6ZElUZEN3aWk5L241VURVV2tVUmFITm1xTDlxb2twSmNyUFpOQzBKa1FnS09EZzJvdFM0RERTcVowaUVvQWp3UUJXT1FydFdyeWdITkt4NVdGbmdXdFBpK2p0NDQ1aHJIY1N0YkZRc2NLYzBvS3JBeDR5ZWFVZ0NCaHVGL0VDRm1tTVdkUUVpV0NaSU1PMWtzRTJlQXlDUWkvSWtoNGtBL3orRGc3ZzdTL1B5am5teGdtNXZLL250cmZvODRIL1RCNGlmeEM1QVA4VXVrTHdLTkhEM2Z6MmUyTnVLbzMvQ05aMUhlNm50N1N1eXpOTHRwa1VMYnU3T3NUbnRDMnp4RlVNc3RhN3dLZ2tBVEw2a1kzdlJVMVlPdG9CZlozSVZoY1c0R1NDQS9CeGhQQlNNUW1yUkFVb2NsT2dwUTQ1WUFsY1dGbG9XZTNWTUpGNm1Ib25TU0ZXMDZhcnUxd2Y3T3dOQlRuQXpRakNBeE5Vb0FYV0ZyZ2FJb0dOT0RHMlNHcy9TMWh4VStFZEY0ci8zYXFXOW80REYvaWRRQitiZ2VnTlhxTS9teTZHMGpJQmFqaGl3NWd1ZDV0VjFGckVSQkZCUUtzbzlVdy9NOTBuTmVpRDZncmFpVFk2a1J5bmlTUVNEWWswNFRUUXhBdTlJUW5DSS9EanpzMlN4NkdKWWtGb2pzTUVaN0tPVkN4Z0tmelRyT3ZIYUM4NlYyRlpEYzdYWXJwQSsydG9DSGpBUUMyQXZBL3E5dHY3OW5yQUJpSDdvOHhURm5xQWFCVDZhN1VENVVVbFdMOUNFQjFSS0I1dTRvVzUrNE5FR3ZVUTZwcGtLbCtDUlNGU0lkN3NDN3pqdmhSTGwrTjQramVYeEJKbzJjWTlSSHpLQUE5bmlvNUFPTVQ4R2pjV1gvSnFxSVBqR3cweVBNMFgyOC9ya3RlM2NsdmF1MHJOY2NHd0lVZDF1VVgyc2V6czNjR0FLeCtpTzE5T1B1d2l3RDR5UlNBSUlxa21SZ1ZBRFNHMzFPR0c0NTlLSUttWVZtYjMyRk5tTEFNLzhxS0ZMVmViS2lxMXRuNGlFY0YwcUVrRW41Y0QwSzVzSVg3dktpamdNU2RxTU1ZUnp2cHVTZ1BEcHdramRQR1M1Wi9yYjZmQmg2TFE3VkMzTEdyUlBPWXh2VjlMdElkOVppZWhXTUN3SzI3bEpMWHJjckNNaWFoY1FuakVGdUtzSmdYL296RUdTOTNLQzU0b1BBZUFMd1V6NUtjUUhHc0YzQW95eGlXNjR3RTB6c3hYdzhNcnkvN2w4TFhIVWdPeTZGbUZBaEM3NGxTOWM1SXE1L3ZyaTYyMEZJcXJ3dTZBWWFIdDNCQU1zQmJqaFVQZGtDeWNsQ0tPL0JVZWFlaTc2cTdoenZYOStGTCtLQmdkWjB5eGt3Y3hhMk5qUTNLNStOOHZJL2pCVzZiOE1FblBBK2Z1OVJ0bk9GOU96d3NYTGpHWU55WUM0RXJLQ2syRDF0WEF3OVp2dkw4K1RiRmU1K3NBdUU3MUswRHRxdWRBUFRXeVBWNlhaV2pmZGNEV0pZbXlVbzRFbFVoQjNwZmtHaEVRakdkS05JbFJRMkgxUzRBVTkxZG1Bc0hZUmZ3MXZKcVhIWnRxdjdFc2JTWU9rMUlxVU12MmxHUFNFYjhpU09wcHdEdksyUENvYU1vTzV6T1JjRXY4VTVlY25sb0NlZjlndVNnZzM3Q3VaSVJGM0ZlSXB3NEYvVFdTNWZXa3VCWkFaQ28yNzRqT2kwOEp2UEh3Y1F6bGZNK2d3RDhZQUJRNndRZzNPUGUxNGRqcEd0YlgyaDIvb21TM0xtNHlBSUFFWk8xOXAyaEZPQWxMK1F6T09VOWpEa2RPT0Z5NE96eGlpMTFDSnNOTlJVQjRISTVjZVlvVGdpV3BVODRoQUN3TEdOTFpkS1ZuVnd1NTJEM25TdDdtWDIxdUozTlVsdlo1R0p5Ynp0UHhncGJCYkhCVmtkS0Y2Y1BRTWF3ZjNmMkNGUTFRN055aUIwQWdDQjFqL3lPdkMvVUFQVXp0Q0lGSUY5ME1BaThVcENpZ3ZBSkQ0S2c0YkdKc053d0cyanNuTnlHQUZnN0FpN3ZRZGpEQTJjOFh5bzlpZHVnRTBpU1IrZ1JkeGd2alFDQVB1SFFVZHd2bDFkdHFWVThYQ1RJa2hjQmtIR1FOcFpnRG1rMXMwZ1dHRmRHU1dza3dGdGREWjJzVGgrQlhnQlFJdkNqSGJsMnNqRVFnTzRvUDZIeFRDQXoxQStBa0liNm9xbTlBczFzSFZIZ0pBRnI5c2dQcXJmZVNveks1bUZ3VjNjN2tnb0JPRHlONFFnQWdZZ2NSamcvTXZ3KzlQOXFNUVJBdUtvdDg5V1JBRkIyakNyQTRWaE14WnpTSGs0VVdBUkFDdmQ0ZHRJN1ZRUUFXOW5aU2EvNHM3azgzMWE3OUNaNDFnREFCQ3hXTTd4NmlnQllBMzRJQUFmQURnVEEyOWxKRm1wMzlaV3hoaFZSRlRVU05TOVI0SzkyQUVEdUhlVklXQ1BKVWFsLzJ5T3czUkVGRjF0UTgzbUhEb0J6dlVMaXl5Y1FnQk1lVjQ0RlZBV3NIcEk0V3hzSkFDRVJSd0RnT0c3ckJrQkJmWklRQUp3cXNnVHZvRWtpa1hTMEpjMjR6UFlGejdNR0FQa0FSMUxzdWNwUmh3WC81bmNDUjYzN0swVktVRmM3ZWxCbHBUbFlMNDIyWUd1b1VFQnp5YnpoTHpkS2dOckd4bWxDOExGUDR5Y3Nhb0pLMFFFZWd0dzV0V1hCR2EveU9nQWU2U2lmS2RVZ0FBZVYvRkhCaGZiVkZxckZUSGxFQUlSZHlWRXM1UE43VkJjQUZMdWZ5bFZwdnJLem1DeHRsK1ZNTGxVSnV0bytHR2h0ZjFYWGxBRXdJY0RyUDN6eFBFM3hRSzI5ZUpva3dkcnpGOGV5VjRoLzE5azlBbjAwdy9CZHN6N0dwSUJwdzErV2VRT0EwMUxwZVVKZzRqWHVKTTdxWnc1d1FwS2REc3NDNVYwUjZiaEFDaXd1Sk5ha21MUVlqdktKT0hBNXdsRWM1OWNTa2lhTkJrQW9ZM1FodTNpQllBVGNJWkNVZ0M4TER0WUJKSy9nZ1kzS1JXSlpBb3NFTDdYN0FFSzlNZEJtLzhBTktBSVlpdmVSSEhTd0FPb1M0Q2xXb0dITGhmWDFkbzdvWGIyUzlSYjZLQkxOcWhXSkExUWhEMkFWQUdBVndGUGw0MHF0VEVzMFRRLzZxbnduVEFzK0YwRTRDUUlhZ2lYMURtUDRQK2trYUI2Z2ptUGpwUUg3bHBocFZVTWJIN0plbHVWWmx1TllRejZCUnkraDE5UlZlTVQ3MEovMnozWHZJUU9QWnc1QXoycTBBYW9UTUlITjVqcWRqSVk0NlREN011NnQrd0NjLzd1MVdQeUZYMHdkREFRZ0hFKzJyNmdiMTNCd2g5SkQ3Z0xUS2JiTjdTMW1TWUJKUTBDdzNqZXNLa3EwZHpyNDlTV3BwbzRGdjd5WjBVaWVXZHVtNk8wVnNMSU52R0FuenErbndlQnFhS085ZlRnUkFNVEIremliYnZMYUNHdmVzWlhqRFNCZ0JQdWpDZUdEMzJjOUxrLzdVZ1NlZExtQXkrVVpQTjRpOTRza0tYbHBMeS80QUdDOUFNQUhyd0FmZWNEd2FtUkFGNlRhc2RaMUlnQUlLNXZ4UWM2dzZWSTdmYWViK3Q1MzdhL09sQUJUSkFhb1Q0T3RJYyt5MmxGQk02NkloQXNhR0Z6SDlwMDVIbEExclUrZmd6aGc1bmhIOWs4R0FGaG94WlBwZkhaN1BXYTI4S0gvdmo2OW00a0h4anBkYUJRRVRJa1lkdDJERjIyN0lpZGNCd0JrUmNQRDFlV0JBQXlxVkFMOUdoMW1IUUdOOWJBZFc2Sk9DSUNHWkMyeHRWdkliSzUyRkFnajdmRXA5Z3pjVFZralhlOHdBSjV3Sk9raFBTNGErc1MweTBWV1lqanBKYnhlMHVVQjVyc05ESnd6Mksra0Q1ajBSdnVhNjJIYmk0QUpBMUNYcUs1czdPemx0dGRYME9CNXJHTDVnMmo0U3pLTEkzVXo3Vzh5Tk53aEJBREJ5YnlpQWdkTGdHalVEd0dBMVlMTDRZOHE4Q1d6end5S0k5Zy9Ta3lvSnlnOTMxb1AyNzdVZFRvQU5CU0tybTFsQ25IckFSZU1MVyt1RUlCdUp1YVgxQ0ZPb0E2QVdOM05WNnE4azY1VThudUhNVnl1c25pcXNsYzhsTTM2V3dZdEhSb1VKU2FnZEJVQ2JHczk3T3dBYU1oeWNDY2RBR25xanVDVjdLOUdlcWVJZDhrQTRNa0d3VmMyYldwVmNzWk9kQUFjckVpQWZCYnZhUTFJb1FGTHdmc3NLZ3JWNndXcDAzbjB0dGJEVHI4SzZOYWE1YzZTUUdPTDk1dHVmZ1RBMElLdFhnTHdGSjdOTGlaTFRnQU9kQUJjT09ENTdRTGVzVm85cEVTanlxQTVvMnA5MVlFKzlOc3E4VlZSTVNZa2REcUNiU1hBWmh0VXN3RmdoTlhXTXdQQWZCcjRJRW45Mm1TR3NDNEFVa1djb1NwR0ZaQXNwZFA1TGdBaTRwQmdwd3BhTUJpT1JDQWxnYmJDSjZMWFJZSHUvdU0ySHlEUjlzYU1BSWlNSE9WOWVvYlgrMzVOcHpGM0pzZlc5Vkx2ektDdTFIY0JzRjRpU0xhcUE4QldJdzVpcHhNQTArNy9OdW1qRHBKY256RFlRczlvTmFBRmFtSm5IZUFqSGZWV1FLenRqUmtCSU94SWpJZHdNZGFuSEU4UkFNdXA2WHh0UUczZE9Mc0RnT0RSQ3BzODFRRmdqaEswdjFMcUFHRElnZ0dsYzZteHZpcllpREZWQnlja2NZRGxHQnJvTXpwWkFMdzAycFlZUFFtMzdiRXlLd0I0bHBEamlvZXd1TlBlTkdzQXE4bXhkNVVTcGdNMmJlY0xDSUJEQ01BK0JDQzlpeFBwU2lsVjBuQjVIMVlCbGNKZU90OEJ3TURJRWQxeDR0Q1VKRkdMYUtvYWFvRERnOS95TEJOK2w5RjdtWmppVHdDY2FhdysvVi9jOURFc01FYmlaZ1dBaXlzZGw0L0xRcy9DcEQ2YUlnQldDREE3RGQ2RmdWQy9Vc0E0bi9RQXdrVUNBamdBY0pBNDQvV2dSMENRT01XUkFMUzNBZ2IzS1haM0FFbVJzS1IzUTB2TmtvRUhiMHU4OE1jUHdNdHhuSStwL0E3QXg1aVhaZEhUSkV1ZnBSbVc0ekRmakFCZ0hibUtTUENsSWtGNlBKU0xaQm1qY3d4NFhCNkc5NUx3TlU5Ny9UQk4rMXNod0JTQUdHd0g5RE9iY1RyUEFFYi9CMHRrRmhYTERBQSsrRnpnQU0yZ2wxb2F2SlZZYi8wZ0d1VlBxTkUyREVBQWlzd3ZaL0RydlN0aFFGVit4eUFBREJBd29NWGlwUEsySUhsQ2NmWTZHMFpjUndBY0pweGVZdVVKdXlnSDJhaUl1NVFJY0xBdWp4d05lbHdPdit4Vnd4NVhpNERwQWpDVUFKT1RVQ0JRNGRyYlB6UVZrR2lLaG94UUZPT2xLSmFuS0lDT0cyOTM3dzlzOGdVQ0xBRnFGd3JQU2UvKy9QalNVL2tOVy93WUU5NVdsLzU0Ky9aQ3J2NzU1dW4rK2RuNzB4a0JRSFBWaUlzbjVWTUJMeFNLeGVwMm9WQ3UrQWtxWDlvckZ3QytjWmd2SE9ZOXpWazNVN2EvTlFJNlhsRHI3YkJoZXdCYW5URE9jMXZsbldVdjJDeFFaSGFIWXVNRkwwanROYWNqRDQ4VWpRQjRjWEdlWmJpVDE0eHlJUlYvZ3lYQTFwdnZiVmlHWWM2cTJOa1dKZ1Z0OHVXTUFLRDRxdW9SU09sVXdnc0huQ3Q1dXVGaUQ3Y1g4U0FnK0tQWTRzYXBRcWpIU25QQzROUUJHRVpBenlrTjMzdmdEa0NpSEZVajRkNHpSRm1SdThEeGxtcXBKMlVLYk5kb3NweW4yTlduTEVnZk5RQUk4VU5UQ0FINDgzSzdkT0dqemtvTS9VZWkrQnYwQVY1ZFJERnM4K2RYL3puRnpwS1l0L3JUenpNRFlGa0hJSGdxb25BbEh2R0ozNE5uOHJpSGdLN3B3YnB0bzBLZ3BRbU52dkhwMjM5WS92YWMwdGk2SjZCR1ZLVjNTMmYwVGlpcWQ5QzFPdmZyOWJpa3FwSmtMUFVLaUNHRElOSDNiSlZXVXp3RUFOQjFBS2dtQUFITmlJUGRQMzBCRVpVQU5jQzhPM1dkVlREYld3Z0Facjg0cTUzWm8rZXA1S3VuQ0lEWFA2NGtMMlpWQmJEVnFJdjNLS2M4QW9EMFArRkpIRGFEUE5tOWRQcm9SZ0F3bUlDZU05cDY0Z0toM3YyaEJiUlMwQWpnSkRjV2pvV04rYytoK21JL0pReGJjYklzNjN6SS9MT0lGL21JMjA4cmxSb0M0THRLcGRvQUFMVUJCaVlSZGFBTHlBbGtOaS85eGJNbDlRSmszN2p0NzFYMysyTHFQMkRwREpZQVdlS1BIV0wxcnhrQndGQUhXemlKcjlkQUJ3RFJZOTdoNmlrQlptTC9nUVQwbmlCR0ZGV0xyVFNlaG51NjhSbzN2aVRyY1FJQ0tteXVxWm9halVhTmhrT2dVV3pvcTR3MDM3T29seUpSRlpCTVZoQUF6NUxKdlRvQWdYcVE5QUVKREFSZ0srQ3N5SERZcTEvZHY1eS9MMkxzbjIrSjl6SzIvbEY1Yy83aHQxTnMrLzNMM0lmenMvTVpBUkJ5YnRVUy90WHFEdDRCZ0ZvTDArcVRMZ0JtWlA5QkdkejdQb1lyNGZhMm1SeEJpMFZrT2RUWUFhUVp2ek1hUW9FSXRQNzlmQkVKbGlIc3MzVXl2dTlEUGdCVnJ3Sm9WQVV3TEdWMTdRSERlYjBZaHJzeGpFSnphdXh1ekczRE1MY2RXL0lROXpBTS9ydTNoTHRuQk1BbWNHM3U3MWUyU0JMUHB5QUFoeENBN1N5c0FrcjVYR25kdGw2RUFKUjFBR1ptL2dFQTlMNlBZVDFkTXhLSzVCYVNwYnJsbXpXL3JPLzBOU0J2UkVWWkNaSHBwL3ZQczcxT1lQeVVseFNUTGVqTnBNZURIcVpaalFieUZFNnk4QitQbzc0d0FoQ2tBd0RjNDJCWUFwQ0xGTUJwSEpDdW1kcS9Qd0U5YjJPWXMrL1FqUkV1eE5KTzd3M0JXb0NqSWxzYXpZR1ZEWXBjWDZYWXlBWUQ0dXVVb0c3NHJPMFUyWmJPZ1pvTkFQS0dJUGdZR3ZqMFVRcXV2WE9NaHI0UEdybmd2U2hPelFTdGEwWG1xZTk1VjRsOTJYOGFkaUFDR1lpTUVOVEZDQndIcjkvcmc1bkVzQnpEd0J4aXZENHY5Q0E1bHJVZVZzN0tKYzRHZ0EyTGM4SW1aMXFMR3B5bTVtdmlvRUpaamNxbTdjSys2dDFEd0ZCWUNralFzN0NPa3BVcm5BMEFWdWVEVE1pc0kyaGdpdHBlRHczdzZrYVUxS2MwR1gyYmNTc1hPQk1BSkl0N3ZrL0VwS05xVUlMYTNySzRpNGVsN0RHenRDVDFiQnd5WEJZdWJ5WUFyRmxrZVFMbXZJcjZKNmN0cmFQRWZCNGkwMXU5c2FYVVNMSndjVE1CWU1qU3dZYkdic2tyUzVDOHB2c1BHT25VNy8wUlF2NE9VOGpNb1JnbG9taFRGaTV0SmdCWVhCazBaaXRlUjBzdTg5ZjFkS0xadWVJbzBUdUh5SFJBNlVvbGpJVXJtd1VBOGFINzVPZzVPMVlMVGtoNmFxTUNiT2FOTVRDSWJEYmh2MnRQWVpaRUM0RUZDZ0JBTWVqUkxDYUFsU3VZQlFCbXE4TTdoRFVBdU9FUTRFWW9GSzA3eE5tMVpUS3RwTE1FWU5tOUo4Y0pVcUNyVDA0cUdpMzRUMDJZc1hRTnN3QmcyRWFzS0YyM3dmNFlMK21od3NjWkZjNlF5VGVLSFk0QmxUM1Z0cjZUZlBTVEhTMzMzQ2Y0ZitnRndObzF6QUFBYldYSUNZMjAzWFQ3WXdxcytrT1dnbmFPcHBESk4zWXVFcWFxdXpUN05NN1NUMUkwTXI0WkFEZTJCQmptQWpiVGR1TUJFQUpSTkh3L1pnQkNtdG5lMElHT1VvRTYzZ0hNMHdRQ0FQRGZSODBBc0hnTk13QmdTQ053b2lZYnE5d3EydnRkam93eXptTkJmY2FOT2t1QW96VHdQbDJ0QTJDVUFMNk83ZEN0WHNUMEFWRFhCcjgvU1pOWkVxdFB0MW95MmM0U2tLMWpuTVBjb3FCRU5OUEF3RHd2QVo3MVNRd2E5SkpvYUJpdnhIcmhpMVp5S053OXNxeTNNRG82aU1uaWdTLzZuY3BCQU5qRTk2SU9BS1VxcmErM2ZMVlRCeUN5UGFSSDQ5b0d2S2JjbDd2d3IvM0RzOTYzZml1MmpwVnpONGJtM3BsZkJCLzdZUldRMmU5OGdzREV2MWRZNk1SOXJ6Q3hwNVoyWWVydUNZeW9rVWdrRUlLd05Wc0NqSHp5L0htTzV1bVRGeStlYnBNNkFIUXQyMm9MV3I3YzZRS2diT1ZXaDUxemZSTmVUKzcvL2dtTGdMWC9Hd0lBem1LTC9TK0NqLzEwQlB3dnZ2Y0pQRmwrdmt1WkFkQTNwcVRjT2JjZ2dLYWFvMW5IZ2JhbUlHQVVpV0lGS2hnTStpaWY0QTN4QWhrTU5VcUFFUzUzaWdDRU5ncnJGdm96cjIzQmE4cDllYkdCWVdkdm4ySFpDR1l2ZU8rWE4ydXI3dHl4Q2dHbzdPOTdNV3k5VmhZd2I5aytZRlViSDN2NVluWDNGSllBSFA5eTQ4VHJnd0NzcUlsT0FCUTVFamJ4OStUdVlITTZLYXFHMW9GM245c1JaUis3U3YvWnRBQUlyTzF0V3VyTW5JUk5SNUw3OHZrYlRQNzA2aGwybHNid3Z5VHg4cGZhK1I4L1BydVFzZDgrbnZ4eVpsLzk4K0RGT1MxKzZJM24wUklmZTc1Ny9Id2R0dERCUnMzL1BNWUk0Zy9QbmozN3JoMEExTGNYQ1BWR2xWQ0RjdmYwSW1OYklxMDNBOXZzZjhYTG5RNEFLN3NwcTIybHNScnpLbkpmUmkraVA1NyswQVRnWWdrci9tSERYbFd4MzU1ajdncy81c2VYenVNUWdBR3pSaUVBNHJPRHlITWZUMWZ6bXdkRkNwWUFxbDRGTUtCUlR0Y0xkTE4rOFc0QyttWmUxLzEvaGN1ZEFnRFJkSHBvNTM5TDQ3Ym55SEpmQ2s5K3VlQmJBRUJMYjcvQnNKYzE1QVBZempYK3pkblo1ZXBRQUxpWUFnRmc1V2ZGWXZFN25tdjRBR0pLcTVjY2RRRFEwSThLbXhJQnBXM2FXTmNpVTJ0OWpWZTYzRWtEb0theThaRStNR1p6amk0SUFIdnhNNFlBeUdGRUp3QTFETCtRdi92QlRYOGFDa0NOOHpLUm1vL2VyZ0tLTzFrSDRsTUlRQTBDY05vQW9ENjhJNFlqSVRVVURjT0tQdEtIQUxIZkpMRXg1TnhFQVpDVCtjU29vMlRqdGVZVkJBSEExbmdFd01IYnhQSGZIUUM4VDVUZjN6czVpKzMrclFQQXNtd2ZQNEFIZ09RNUFOQm9IZURoWDRZQ05Fc0RFbzNmMWM5cE51eEZOTTFQTDh6clpVQW8wTlViTEE2UFAzWFZ5NTBjQUdJaW43ektwb25qTk9aVlJMemkwRU8xak4ycm5kVitGdmhmY0d3RHRna1BDdGpwL3I5Znh6SDM2ZHQvL1JUbFgrSFlRajNtenVoNUk1cDMrQmtMekZRNUluZUYraDA2SC9ES2x6c3BBT0xabmgzcUxHcHNscHk4R2xHM0JHSEUzdUN3cW9WTnB2Y2IvZjJvMGRlOVdIaklIdlBYdUlhSkFLQ2xkL29IcXg2bXNabG40bXJHM2V2WTU4aUtvdWFiQ2hydGZGT1ByeHVBWnRrYVFJZlh1SWp4QTZCdTd3NGI3eDJvc2RsbjB2cWlHWGx6VlB2cjdwK0pDMmtzRVRlOTJidmFVYTNWQVlGQU5PYS94bFdNRlFBcHNsclpHekxXTTFSak05REUxU3dCUmgwTzFDZDRtcXc2MFYwQTB5bWhIY1dDcWtoS0lGSkhJaHBXd0hYaXFZOEhBRkdOYjJZS21jMjRhajBJYksvR1pwbHBxZTREakZvQTZBMEE5UG51bC9YWm9PWXJmOXEzS0pmUU9xU3dzUklGb25DOWZMc21BSUV3MmhoaWQ2dTFINERGS2Q4OUdvdEZwcTB2TU9RRGpnNEFqdGFLOVFZamxaQ1plM2VqNzlvdFBCRFFJOEZKYUl3b29GNDNrdmFWQVZCV05uYnkyVlFpMnRYVTI3alMvSmp4MkdQcU12b0JScDhRSXZicEdsVWlxbUpTaEhac1JobVE2MWt1cWRGSUpIemRyQnNkQUZsYjM4N2x0dGROaGliMDlBMmI4bW1tc1ZoakJqSlNQem9BL2FQS0JxVGVqYWZrOWprblBSUEdybmtKb3dFUXorN3RiSmh1QTlSU2F2VGVuN0VZWXliU2t6OGlBSUVCTy9zaVNkM3JUT3VMam93UFJidDIxYnJ1Rll3Q3dFcCs2R3dPS0hscmhLOGN6MFhNVGlOZktzb2dGUDhCNkdKSTQ0RUc3UnVIQmJwbWloamRBd0ZqN1ZGRTZsaURjTzByc0E1QUxHK3hnVGQwM1VlUHhtQ0pHV25VS3hXamtyNnZrSGZyNU1ucFNZYjJuVUR0MHVUK2JzZktIcm5ka2FxUEM4blExd3hINUxEVU5RZmttcklLZ0dhOWZSOUpERCtuUTllL2lwbEpULzhJcTRKVUtSeEdEaUNyYXZsOVRRVytsd2xOVTJueUlOZTV0S3ZWa1NvcGRSaFVJUkpTNEZQcCtwTkEybVVOQUMwM2lsSDNocC9Tb1RGY3hzeUUwbThkQU5USkl5RTNuMmVwZkpsa2VkL0xHTXZTdmg0QW1pVkF0TEVxV0ZSaEcwSG9uQVEyamd1d0JFQjJ0SHQ2WmJRWkFMY2VBS3NFcUtydXpodE5BQVNBSVBoZVBuMTZLbkE5QUlSVkkraE1xMThZZlFwOXNMV3g1bmd1d0FvQTI2T3VUTGErSTlBWXIyUTJNcTdBR2dFUll4SzVFZW1qQVVCY2xsbTlCT0I1bm1NYmN3YWhsVlVqL0Q5NkppcUJScG5RMkZuVk5xNExzQUNBdGo3OG5FNGxSbG91T2E1TG1ZbU1TN0RXRjFqUEZXTXpvQVlBc0FwZ0FRUUFQcEMwS3JkbWplcjl3dWkrbDlWd1NBM1hwdzgxR29GanV3QUxBSXg0UHlOWmF3aU03U0ptS2YxS0xOZy9vRFMzY3RBOXZBWUFMMTY4eUVJbkVENVdhZVowc3dXQWZ2TkhSRm5UWXduclpVZGcvUGEzQU1EV0ZTWjJESjhCUHI0cm1MR3Nab2tjYXRRVFJyeDRPaFNpQklFSklRRlNmeURwb05RMmJ6d21TWXJXdmpsc2EyZnRNYVovS0FDUnBOVkxiSk9VR3Z6KzdMWUNIYnVzWllnY2JzMEF0RGhZb21oS0tOeCtJd1hFd1BqdFB4eUFLMVFBVU9tQmJsRmdocHNCajF0V2NpTVFsbHRkT3hZRFBZWTdxcFZBWGZxVHNhWi9HQUNiVjF2OHJnN2FHREpnKzR3QXNFSkErOEplc1h2dHI3bTY5d3h1YS82UE4vbERBRkJINzlnM05HaGF3SjBCb0hIemRLd2dENmtEZHBoc3lkajl0VmZqVHY1Q0psZllqdmYxMmE1V0FVREZCb3diQmV4M0JBQ3RQcysvczlSWExCYXFvV2h2NDJMOHlkZExnT2hHZG5mZExGa2JmZGQwNmQwV1hzN245YkxHSVd6SGVyMmN2akdscmdJODlNR1gwWE9lMWM5cXZDVitUajVBenhiQ2JZckN0aCtzL3VXT1ZiMDlLei83S1NCSHU3Si9Fc2x2VmdISzZrNCt0WlBONTdQcFZLUG5SK2tmemdlYWs4a1VHRForQ0RpZUJWdlA5bGhxSnc5OFRTdXZSWG1lNVkrOE9nRHFFZDFpSXlEaW54TUFBNG9BV1BTTEVsSmJtVDk4d3pkRGNqalN2WFI4SXFrMzlRRWFTM2x6L2RNSDczcjY3VHZBYkx5RkFJQ1hmMVIrZjBPV2Z3UXM2K045U0R5ZmdrV0M4TUVMbi9OYzVBTmdPZDd3WlNYSmprL2tVbWFsL3Bta21GVDJFUXMrSUJvQTZsME9PSm5VbXp1QkJUMFoyUUV6ZkhuZXE3NDcxOEE2QW9EL0tEUGVQeEtsSHpXVnByd3hEZkFxQUd0K2Ixejd3TkJxbktjakg5UVl3K285V2ZCMitMenNQd0FBcy9pKzRwQWxNNklRMGhSWjdaa2NQcW5VbXdPZ3BnUWhPVENjRys4REp5OU9uOU02QVBKSEwyQllxdnorN0x4R3ZqMDdlNnVlYzh5NzVLZXpkeC9vMHpWUFlYMEFBQ0hRU1VSQlZJOXYvbHBSUDV6OTU5ODJ1eDJIQkh4bTk3OFpBUG93RHBUcDFDOWxZQmVKR3BiUURMQkE5OXF3S1FNZ0pGSkRJanJ3TFBNdUhyMWdkQUNVajh6cCs0KzdwZGQwL01Lenhna1g2dGxXL0ZQcWpOYk9nU0I3bjUrb0Y0VDdrcDNVTmN4WUpsYlV3cUltSzJIVFBoL1RxR0lOYVZJZ0dqRGRHR0JTcVc4QXdES3dpQlk0L2E4VjhkN0VlU0gvUnpLQkFBaDk5UEtCczB6cFI2Q2NlLzUxZG5ZUktieDZVZDE3RFFJZjZQemJzemZIMG52TWRtRmxENnZicUo2OGdRWU05UThlT0dpa0ZBMFVTcXBzRmoxcVVxbXZBOERqSklsenZCUCt0VVlBRDM3NjlmdnZYLzJ5OXBabWVPNVRIQWdYS3pvQThpZWVPNDhLN3k2VTVCa1QrVVM4ZllDZlZ1OFVBRU4yRHVqckE0aEtRQjhDbHFUZW5vSlFkRks1MXdRZ1VXRkpRRlpTRmdId2NaY1JBSlNQMmwrdkFBOUtGNjh2WG5yS0NBRG00dFh2ZjJuVTZ6T2F2L3oxN1h2aXg3Yy9mcm83QUlUQ1VyOUZIdzJabHdDaW9vLzY5MjBpaEpZbWxQcEdGVUF4MVUzY3VWTHplNUNITCtnTmZmVFlhTDAzbmpTZSsvZzFtdVBBR2l1dkFaNEYwcFlLYU9qcGMyc2VZU3V4eGxHLzVuRTdXQTgrV0xTcnE0cmtqbUJZNURwTEdHK3kycXlvaGdQUzRBM2t6WU1EeXFveFhEQ2dpVGlwMURjQThPRWJGY1pWVE9Nc2hYczhzRUp3RWc3NFNEamdBU3NBQjBFNlhBQW5DSUxFWFQ0ZENCK0NnZU44K2lOcy9QTjY2NTlqV2M3SDB1bjN0UDN6NnU0Wm9KWjFoMDRNVWMyN0FjeTcvYWRnL3JaV0FBVXFHMXBWOEZDZVpLV3lEWEMxc2w0K1NNcTVnNkxzWVBEVjBrSFdqM3ZMc2NKQmp2WDBUeWdQQ0FqS0YvaVRsY2tsK2NhcGVmWERoL3Jsc0dyV0RCenl1VWttdmdtQUQxK3ZsdEs0RjArV2xHQWh2YWllcHVYMTQ0TzRrcTk0bk9GcTNKOHVlcnpIZVZVN1N1Ryt2a2tGaThGRGRtR1NDYjZCYWwyK2xiZ29abHMvOTNNYnBwRDRWajhBRFE2UEJZK1hxS3c2SE5vUnJkWjRnaWhuY1VJKzVCZlR1eTRIWHdsNkR6VW5udHAzOXZVVGZjVHEvLzczZjh3VTBuMlQxTHArcGY4T3NrMzFiQ0lMZmI4KzRFd2o4UzBBZlBodXljRUNVQ3VYU3FYVFpmVUlVQTU5YS9jS2o1ZjI0V3UxRlc4bDdIRWt5MFJmQUZpbkhqWGppMG1tR1BlN0I3M05jczFEKy8yQlo0NVByUXlRb2tObmlPdjFmZHRIWkRVZ21tTXpsYlMzQU9BUkFCeERIYTl4VUVRSEFQazBkUGM0TUJTQWFaUUFXbVY1ME52cFpQTVFmQnVjYUVxYWFsNi9oWGgrOVhVaGFGTWtSVlZDb3R5Ly9wOUsycnNCNEJ6NURJRXp5M2dIQU9zVjJBSVFGNGNDTUFVZndKMnBmRG5nYmJ5a05vK0orNmE3UFU1QXplczNEL0RUSWFPdGo4cW4rL2FRUEdCMnlOaldmZ3hVTndBOEVhNldzd2VaamhMQXlaWVBzK1VTTnh3QTJBcVlhUG1QWVd2ZnBCOE5lSHZwZ0J2dzdxVFVaZDEra21SWmpXb3hOYXhJQVlFRkdNWUR3RFl5RHNyYkVYVnlPa2x2QnlDcU9UaUJ4ZG5WaEVyZ2ZKeWs4R2dVcDlpNGx5UW9iVDBHY0RvdWVKeXE1aGpVV2VpYkxBQ2dGRXhzRzRmM3hhV2dvdGZ5OS94cXNMNjFwMWpnZzEvV2U4MEVvNjV3eWFyL1h0dEhKdEduSm9qR0d2N0J6WUJJeUpnYUlzcHlXRjZDQjB3c1hRODF5c2JTNloySThjVDR4cWtESU5BRVFjSUVjQlJCdUlDWElEd2NTUkEwQzU5eDhNWjJ3a01YUWJEQU9NdE05Wm1yRTAzdjQ2OEpOVy8wTUcybWRyZDJOM0FNQytiU1g2WDM3dXN2UGt4bnQ3NCsxQzF2Ly9ZaGVuaXdsMHBtYzBUOUk5ODhUaGNIK2hCWGtqMml6L3VYZXp6OFRvVzZob2Q1YXYrbG56TUFXSHRlTEg4Zlo2NVU4c2Uyb0w0YXRhdmRIdG5peHg0b01qQmhBSmEvWGNiOEI3bzE3ZmwvTHR0cFZBSXNhL2N3OXovaStnbGYvNU8zTCtXK1FvZnVxcDRVU2JiYnZFZVM4WkdpMTBaa044YWZMcnNncXVyS3NLRGUzVEVnT2YvcDBTYW9BL0RVUysvbnFhdGtuMk0zdGJxYTJLbktJMzNLbHN3K1pNY0l3SGdYTGZlUmZST2FGaHpyRzNxNXkrSG15OUQ1eSt0OWozZytBZjhtMCtoNCtXQ3A4UzU1S09vZktTSC84ZXZOU1NSTkNFbERYY0R1TmFSZzgzanJDUEIxQUdLcno3YkFWZklQNU5ITlQyUXlJeFVlU3prOXdPaTRBRENXclZ3aDlTTkpMTUNDM24yb3AzeDVyMUdaTDMwWmp5Y3F1b25wSE1xTHg3cUpIK3pwYzQvQWczaDgvWGpKK0FnTmVVZy9uRVRTVUNZTTZRcnUzaFdjcDZ2YjhqT0ZOUUI0ZVZMTGVybXJaS0ZVMGoyaHhEZjF3WmVCSERUZmxFcjZmVFFtQUFKbzRlTEVCMy93YkZxREtqMUFUeUtaK3R5eVlPbnJoOXJhUDNRVGl6a1BPaTJLamg5dm9iK3g0dU1IMmxkbC9kd0g2Q1B1N0hWQzYvWVh5b2JCeStMRnJyZForZnRhN1VXRzRtaWFnaVVBQi84S3dPRVkrWmNmNlU2UnZkNER3bjZWM2RWMHAvZkxKTHhjMjFjYmJVRDRIMys3WVd5SUdFdFhkMUJwT1I0QWtQM0Z5YmRidzRjcHBKSmV4U2RUeG92MnZRVDg1Y2czdW9rZjV1SEQ4ajV5Q0EwZjBIMmd3a09qVGpBK3d2OWpNa1ByS0IvUWRDOWEzeDBDMElLUEFyQktGMUQ3anZUcTJkUTFKWnhLSDBlam02ZU1kNmNLSUFBTXFndnNsZXpJdjV6K21yeEhnTFdzRnoxWi9zZGorVUZCYnlrTGg3QnB0RnhwY3c3VmNrTGROUnhpLzljN0Vyb1RyZ3VBdm1ROWdLYjZUMzd3bDhnLzBsSFh6V2xQMXdjY2lRcDBmb2lzZ2NQT3dYME1UMlhRYWU0OVZDbmNyMEdmSCt6ckhxTHhrVWhoTXJOU0d3Q1FsUXdkcVNVcGdWbXJjVDc0MnVuSlNjbXZFOURWU2dUcEpPMFZNeXF6bnFIWldFWUhZREdWSFA1VG5icTNYOGhtdjkzUEdZMGJHN0pxNG10ME53SjRJOWhTeWRhTjZjN0N1K0YrUVNmaW5sR09YaGtBWlBpR25EYjdWQlo3UGN3YVc3ZkdDblowTWFMeHFqMVQwTFNka3VFRFp2UGJzWjE5L1FxWHMraE9KMHJaQncvVEZjbTRmdlNScmRSa1VxY0RBUCtSaDFuLzZTN2w0Nm5LajZoWnA3NVkwWTd5cEo1cm5mUEVHUnF0cWFBQlQ5TU1mRVNSQXEveXc2RDJnT2NGcld3WUZMUGorTDFOM1FraThnTG16N2JOeFgzd0RZSHVGYjJEZktsbUFITUZBQUpvdFV2RDl2RG5walh2QTlmcTdSei9DcnlIbDFZYkl6M3VoNDhUL3BoK09jUWo0VUZxemVnUldINm9KK3orbzlRajhaRmU2dXNmc2NXbENhV3ZIdndGQW5CUVpqaUJGWi9ueWhRUEFmQlR1U29seEZSbHlHekJLd0lnVlQzbzRXRlJMOW5FcjJBbG1kZjlYSHY2UzJlcXZjMjdpWjRzL1VQUEtyRnE1Ti9vQUxUYi8zT2I0bjg5QmZRNm5qeDg4cXhDODZpTkYwWGRQT3JMYXZWcEFzQTJvalI4WmZoVi9DakRCOFFlN0NQUFQ4dzlBS1MvN3VjbVYrVkNtOE5qL3dZVkVzRi82cFovdUdmY3VDTUJnTnA2ZGRPalZ0KzFjdXZ6RXpBbUE1Q0hwL0x6TlZpdUgyM0xKNXNBbGdEeGd4TEY4NnpVZng1TlMxZjQzVzhlbzcvMjlOZm9ZUWU1RVA1dkRiUEhVOW5WdGhQeGI2QUxZRXNiM1NBN2RWOWpGQUFNK3dmbXR1OG53UUFnUys2ZWNFQjUrZVRKNlJIZzFSZDg3THV3bDFaVmNpSUEzQ3M5SkFnQ0pLcjZYYitkSXV6M2Q0emFBUHZ5SDN2dE15SnNXNDhKWEszb1RnRmVqQmd2V2dDZ0dacEVEMUl6dC80QTFRR2crV2RwSW5Qa0JjcHpoVk8vNCtscW1hS0toNU1CQUJTL2dkcjl4bkNReEd4bUovbDEzYzlkM3RjNlRsMU9aNzlKRzRQcGRVL0FNZ0NCUnVrZitJemlPMDFBQ0lCUUNOQlN5QVVmZkhSSVl2a1F3NGdoTDYwRXJRQXdPZ0VFaXdRYXJqZ3A4TVQ5ZXNXdlpidW00aE4rbm1oOHFuNHdBSURXbmQreXYzaFhwbnBmVVFNc2F6WVpkQndBOUpkN2I5RFVtYnFzQUdBOG1idjlWalRBdEpQY0FkaEV0cVdOckFWekRhd0MyZ2d3QUpqZi84TTBLRHNqS041bmUyOHd6N0VNNDBWL1duc1FqeTBseTZXc2xZa1B3M3lBSmdPQndMeit0NkJCZVJrVkloRXAxcllLaUdQRS9Xb00wR3NsbWhzRVFINzlDaWx4TDFrcXJvYzZnWUUyVitBS3laaUs3TVMwWm44TzFZQ2NsRlExSEZBamJYc0dNNnQvbi8zODl6R1pQS2M1bjFFR21QVUUyZDZsSjVmZ0hnRHFvenNOMjdkaVZONVkreE94L0VIbDhVMVplOXdmQUNVVzZsbzdUcjg5QlNENXR4OENBQURMZWdFQWJkOWthL3M3T1hVQTBPemxSUUEwWXBQYWJlZ1J2N0hCSGZGVVNXV1hrN3YzWjUwUVF3T0tBRldKaEtUMklISE01YnFYQlNrNWVmN3IrUTllS3ZUcTRxY2w3TS9peDdkeExQN25MNSsrdzdIOGgwOC91TEgvVEdBU1cwTUxqUUpKZC9McW5meHQ5cC9jTDQ5TDRZSSsraitwOWZNanF6OEFvaHFJcXNhSWNFaGZEZWo5Tys3bFdTK1YvTC9zNm5uUjgvYVordE92Mkx0L3k4VUxQUDUvS2ZWakR2OGxLcjJ1WWU4bUQwQnJiRGZRVnY0SHByTTI0WHJhNlpqaVp5TmFmUitFWnhhdDFnSGJoMmhpUkVXYkFvcXFxcUFvVUUwQXpnSHozYy84ZjlmVzFpN3hkMG5NL1Y4Mi9zbUcxWDdBN3FtUjRtOFRCNkRleDllUlZnT0R5ZjN1K0xUOWRWdmx4RDcrSnBzdytyK1hWbmV6bWZnTUtxNUFQd0lrSlJRT1FRQ1VpQ2pKS0k2RVVRV2tGZWdETUtjL0IvNzdHb3FBMWliK1p1TWZNZXp3QitMajJTKy9EQUZBZHg2WHI0YTZteWNXeEk1STVKMjZXZ1pNV2RJL2tueGp5QVBrRTJBNWEwd1FmL0NZWDFJUEpqUC9iNkQ2YmlFa2hrS2lJRWFNOVlPb0txRFBudEVnOVRkdkFBQXVZOERPWXUwQWFKL3MyT0ZnQU96cGZEYWIzY3VDL3FmMFYvaWJleEFBc2QzK1k5NlRhaG9LcGc4cUtjTUYzRXpCTzBIYjFXOTdORW1wZmFYZzFOUzNCdWlRb3FreUc3Lzg0L1YvOTBrREFNK3ppeC9PemhiZnR3RUEvdjd4NWNWZ0FOeTVMM0g4SGwvY3VrcFMxN2RoS3lEUWJQZ0Z4TWFlSkZlOTl0bkl2aVJuOVhGUGQwVmJXZ0lyeHZSb214c0FzVHFEMXFFMUFHQjJoMFJHS0paVVFLL2thR1kzUjlLcjFTenIrVWJGOE8wbFpSdkR0cll4UHBlRFJ0b2VnSEY5am10elR2Z29zdTJzNlFBWVpRRHE2Y2Z0dHR2ZzkvWHFmaDVOOUJLSzYxQ1A5VW5EOTdkU1gyMXNWc2pwcDhVcUFJSWkrb3l1WUMvRG9nT1dGYndqLzVwbWpQMC8vdHA0dWlRM1ZrYmVFNWVXRmI1dVRyY2Nwb0R4eEhZLy9HVzl5WXltQnk3VVBRQjdYZGU4K0ZtSnlDbnc3NWZmdUJzWFljOXV1dTM0dzI5bmNFRUQ0c2QzS2h4dXJSVFJCNHJDSVIrSmo3aTRkaXVOSnYvNzg4WjBnQWY1cmRTM2h0L2p6MlpUcVgxalJoQmZ5cVlLai9TcHd1NTBibk1yYjh3VFlQUDNHd0JNYVY3ditHWFg5R2FmbWtkT1VQQmI5RVMvSStoakhrMFlIbm1POVRoa3VRZ1FXN0Zrb3hFMUpJZDUwbmI0NzVFQ3JOai9rWDcwS0pHdWFQcmQ3VDhJMnV6SmxINnNWYjYwMitNVlBVZHlXMjY3V3RNWEMrREpKWnM5bnRXdC9XWHBubEVGM05ST1hndTZuOC9KOS9sSFJmM2lsb3B4d0gzMWxiNHFvSkpZQXZIS2cxbWtDUm0wYjF1d1E0M0ZoRXBFa3dJaFZXQnhQY1RPQ0w5RkhxVWZQOTdLR3dOL3RtKytndlRMV1gxa0pJbThncUErOTlmL0xTenpseXBHSVlIdWo2aStjZ0k2RGphakszaTgxejlkTGFkS2xkTFhYeHAxblp6ZEwyMFlFK0dqMy81ekw1R2J5UWlCQVlBVkJNS1NCRnVHZ3RRSUlPMWQvQk1DOFBNSUlWYjRZMVNmNDQ5MUgzQ3BuRnhaV1htc3I1bXo3NktwNFJwYVFvRWxVTHZvZmtXditYSC93M2c4cmM4WnMyWFg5TEdBc1dmQWxFV1FyYzQvdTd0NWZNOTl6M1p2Smk1dEE0RGhCR2lpcWlocVZHdlVCS09YQUErTVZZOWY3cVByOXVlMEIwam9GWGNKdVFJcE5HUFk5alZhQlBpbFhodTQwOTgrZXZEUVdCOUxIQVFSQU9POStMbWFQc0FnQUpERkE2b3NkNjBVR04wSGVHeU1GSy9yM200UXJmeXBqeC95YUhHOHZZQmdzR2VoejJmL2VoZTlFYzNDT21FcHIxdmRpMHFQdXhiVWNTb2FSa0FnSEZibEFPb1k3dDVBeWtjNlJtb0YyQXVvMjlQbXIrcnJvWmZ6c0JucE51WUJQVUROUTFKZkdXcFBiOWt4K1ludUppWFRkc3oyMElpY0lQOC85eHlBU1lodHhJdnVBNEFVQ2FIeFFDMGc5QWFXSHRGcElVc0pxSzhQVW5wRmdHZXpzVWY1ck40eC9oaFY4MzRqY29CVzJYNmNPZEI5d0hEcDBZT3Z2aW5xUHFDL3Rxbk9BWmlFSkZVMWR2d3lKYUFSR1U2T2hFeldDbzcyUy9UYVYxRHg1WG9iM3YwZ2xmVHJMTmdlb2lXZ3ZERVlaaGNmYVlxK1poNnp5NDhmeTEvV2x3c0UxL3lUQjhDNHFKR3Y3SFpMQ0VqOVEwYUdtdlYrOTc1d293TmdYUS82VEJHZUNnQ0dibWNuODVVa0dPRml6RU1HZGNjS216Z0FiaStLbWhvemYzUHlWWUIrV2JkaWJ0RVlKYUJKNEVwM1VLZzZBRjJ2ZHZpS2swaU1sdG40S3Z1NHo3elo2ZmdBdDdTZitlb1MwRkJQbjVoaFhadkpkVllEazBpTVhVd2tndjBzTUhjQ0p5UG82MnZtMFFETWk0VUoybit3NWdCTVJvSWVPdHlzRmFCRVRMY1RuSkg5NXdCTVNHaE1PQkEyM3d1b3p5SkJXWmhVOEpwQm1nTXdJU0dUQmtJUldlblpManhndnEySUVnbmNTZ0JtVTNEZEJ1bkdsaVV4M0VWQW4vM0RGUzA2aTdVTjF3VmdoclhYalpkUTd3bW9FeUFwTWxwNHBmYnJCcENrOFljeEg2NDVBSk9UM0hENURRS1VrQVFyaE80ZHhkdThoSHV6YUN4ZkR3QjNvNjlqVEtuNXZFUTI3Q3V1UkZSVlZnTkdwMC8zQ3B6bTRVd1NlUzBBRktVT3dDMmVVelpSR1F1c1JGanJCeVJKYmkyNE5TMEFiaHNBOXJhcnVFUGQvQ1BKV0dJWFJ1c0FBeTMxOFFHRXhWa2s4U29BS0YwejNnS1REeFIvVzZVYlhwUWpxcVF2dk9obitoa1dBVmNBQUpYNzdRUUU1Z0QwbFpFOVFpQXFDYUk4TkViVUxGSm9FUUFqZ1RiOWNRN0FDREtxK2JDbW9rS2cyK0RkdGNFc0VqZ0lnT1lZWG1jeWRjK3ZJNFRjdkJYUVYwWU9oU1JKNnQxUnJzY2RtRVVDK3dQUVNtV2d3NEdwZS80ZHFaOWlnbStaNnBrb0JzUStIWUR0bWtVOGk3NEE2SllPOU1oOG1zczBVM3k3MUxpTHBPSDJWN1VaQkRQb0I0QnhveXN0c3pjS0EvTzBUemZOdDBxTnJKTzFvZHNLSzVQZGRkdGNUUUE2ckdpWXZ5UEZiU1QwTm1sbmtQRGJvbFlHeWtQTGdDdEYrYmltR2dDMFdWS28zLzVkVTFlNkhQOE9BT1lkUVgzVmRvUGYyR2FnM2Q2ZGtoN3JkNnU3VDJzV1NiOGxhdVpScEc4WDRJd0JNRW5KVUFDbU1KZjE5c3Noc0JnajhLUVVoR0pvT1JnVXlVRWJyODhJQUxPVURMZC9kOHJuRFBUSzgxd2xLM21Dekw1NC92d1FVRVg0c0VmZE9BQk1VeklhQUxOSTkyMlE1M2swVzZVeE9sdnlNZ3hORi9QZXlBOStmc0I0MEN3UzJTZGFlSGdFQU9iOXdIM2tlYjcxQXEzUXkxWTJOaUlzWFN5b1c5OEo1Z0RNTHBIbUFGaUxiekVIWUxBOHo1K1Y4NHNRZ0ZxNUhHZXB3a24xYVl3Tk5JT3gzeEFBMEsxdWNydlBBYmkrUE0vajBuTVZBbEFDTk9XbENubmhXV0pab2dGOWcrd1BBUWlqS24rVU8zNE9nRVZCSjNCeHQrckNkcXU1WEk2Q0FGQzdOVGF3WHZYMlpPRU1FN21nR04zNzF5QmdEa0FmdVZJeXhxWlViSDBIaXFKU1NUcVExdGo0Tm5PRDdIL3Q3ZU5ublB6YklRRFFoaUJRekRMZ0FaZ0RjTmRrNUJPYVJXSGFHOWg1NHBUVE5nZGdDakx5S1lEV2hnekx2Nm5uNXh5QWFhaE9RRUJTMWQ1R1lNL0pVMDNhSElCcHFKNVRBVDFxd0dENzI2ZE13QnlBYWFpUlZRRWhGTzZaSEc1eTZoU1RkbjBBcHBqWVc2c1dBS3JVTXl2QTdNenBKZTNhQUV3dnFiZFpEUUJDY2xjQjBPL01xYVZzRHNCVTFBQkE2OWlkYmNDWlU4dlg2d0l3clhUZWRobTVoZnJjcmRuL3RnQXdyV1RlZWhuWkZaS0c1TjMwcy9aNkFFd3BrWitCalB3U3cwUHlidnFaT3dkZ1N0THpTNG0xQWdMMFAydTZBSXcyK1c4T3dKV2xBeENWQnErbG1IN3VMaVR5eWFzek1KVWtmaTVDR1NiSnpaN2d2dWRNTjN0aEZSQmF6eWY3eGphZjIzOThFbEFVK2Nac08vTXpHQURZNmVhdjRRT0VOZ29iVjJCZ0dnbjhuSVIyaVdvQnNNandyS1B4MWlMSHdiOHN6aklFYjVLL0xEdXBORFdkUURtWlh4OFl5SDV1LytzTFJZcHAyQi9zN3U5WDhvM2dvTTR5MnYyWkpVcGJEcjQzaS9GaWFsSkphbThGSUFhR0wyS2YyLy9Ld3U4TDllbTI4RW1xR21ibDNRWUFEbFdGSlFSTFZPc0FzSUJtZkVManZzZUxPNU5LVTFjelVObk1KNnd5TUtra2ZkWnE1aHh4c0lucDIzZ3VBcHBrQ1p0ZXlEY0E0RjBPaHZYZ0RBNW9KMHZXQVNBWkNyTlJMRDNlWUdLOS9RRGh6VDFMREl3MUdYZFBqbkxXb3g5NFNvbjh3YTYzaExZNWJnQkFNckIrS01WeHZKRE9WdlpYRUFBMmtNKzQ4R1Jwdjd6dEdXYzZURHVDMUszY2JrTTdtM1B6VDBUeGswb200YmRobm1vNUdKUWNKVlFnTkFDZ1BBbmV1MTVqOGNLUnltZXJKQVNBeUJab2JER3VNSEoxWlp6SkdOWVR5SE9tTDg4REFseGJpMUlxdjM4Y3h6d1Z0TEdyRGtEVEIrQUlEMEVFVHlTOHNHdkQ1Rk1lQXJDMWorb0krRHJZM3h4bk1vWUIwR2M1OHppVGNFUDFNNngyK1QvcW1ZMmZDVmo2cDg0VDdHOWsrNXYyRVAveTJVdnN5WC80amxQMDkvT3Z6WDlpa2R5dGVEejdhUFBQVGdCSU9wWFA1MDhoQUdrTUU1OUFBRXJWSXhFbUk3R1h6eDl2amUwYXNhRUE5RnZPUHM0azNGQ2Q3V0x1dDgvclQvQVBJcFo3MDNtQy9aMkN2NWZiWG5oMXlrdVgwZlpRWC9YM1kyWSt2SDVlL0FqMEFBQVlCdGIxQWlXaUVpQ05Hd0FjUllvRkFwTnFFWm9xVHhFQWx1L3p4amlUY0VOMXRtdjcxeHNjODNLb2c4NEFnSk9oMVFRY3crSDF1MlVlQWFESnNHUTJ6dUhlNUxtTml5QmVQMkZKNGJENis4QmtJd0JQZWdWNGxvdDVSeGNBS1VEVE5MbFRJUEdvWGdMZ3BBN0FEaDZzcm1MaEV3Rm5qNllIUUYvNzN3a0FzcFh6K3hoVytSbkRmczNyQUx3Lys4K0hKZUlqajBrWHVIUis5aFlCY0haMlhxcWZrMy83Mi9lLy9mVmFOazdZT0gvem4zL1YzOC8rM3Z2MTFFNnRXcW51UzVpbmJBQ1ExQUU0T0twQ3BjSkhoWHl4QmdIWWdRQ2NRQUMyc2NWVWRabXFIT3hWRHFZR3dKMjJQM1oyZXZFcFpRRHcyZ0RnM0gzdmJaYjRCTzM3RjE3N3dTYjlwZUNmMHJia2hkMDRCM3VUd2RRTG9uN0M2NXlkQVBYM3V5c1BYWXVjR3BWYzBLOVRVSGhBWElaVi9DTHJsSFdKTmphcThncXpxRWc0Q1JUYUprTmZncGI5R0IyT2NzR3hiaTAwQUlDN2JYL3M3ZVY2N3NMZERnQTA0NnRLM2I1dnN0QXYwSDBBL3BKb0FKQ0dBTmpySjFRdVh0WGsrdnVtQUppSnB6eTZTSnB5ZVVnUENaOHlIRG5SeSt3UFFILzczdzBBemc0dyt4OUhPZ0MvTndINFdRY2crQmYrZXc3RFA3WUQ4SHM3QVBBRVRFbWRYcEFqQXRESzRxbUZZT3NMd0YyM1Ayb0ZZS3VYd3VZNXk1M244ZmN4M0FEQS9rZVdLTUViL0RkMy9POEdBTVk1ZFFEcUoyUWxRcjI0ZjNzQjRPNjYvYkUzRUFEczFhLzNmam4vQXhidnh4L3p5SXcvVnJDdDk1OSsrNGd6YjgvZnZEY0ErRVRVejNrTkFmaGdyNTl3OU1mNXUvMzYrNk1DWUlSam55a0FBK3gvVndCd280WTY3b2J0T1FJZEVqaE9vTDhZZG0vSkRsKzFMZUZ1R3diL3grQVQ0eHo0dncwOU1VN0FsKzVoOWZmUkp5MnBDNEJCYzRmR0pYTUFmTDQ3Yi8rWnFBVUFXa0RRcUFZbStwT21BUEJ6KzF2VXdoZGovYm9tQUIzQnVjZjZFOTB5QTZEUEFOQWNnRjRkL2pzelRnU01MRWFXRjVFTSswODJCaE1FZ0FPa2gycnI5T2Q3QndBQVNiSU1TZEp6KzNmcThILy8rMTltbkY5WUIwQVVwUllBNC96K1hpMElBS2RsbWNWSnZyLzllWWNvRUE1LzBEa0hvRU5mL0FrQitIbWNHN0EzaXdBcE1IaisrTmkwd09KcngvdjcxUXlvaHpIbWU2UFlDVHhSWG5jNnR2YUp1ZjA3TlprU29NN0FkT3JjQlpJLzNBQWduSEFDZ2FWSTRHTUFSZE1rNEJnU1ZRczhMUGdCQndIWWNEcVgvZmdjZ0M2TjJRY3dpZDAvMW04MzBRSVJPd0lVSUhDYUozRk9vbkRTdzdPc1JPSXVjZGxCY29USEw4STZRZ2VBRjNFU1g1YVduWk5PMDIzU2VNM2ZGbEJzV2o3M2drczUwZ2pjNldGcHoyNjVWTkVXbWNwbW9WSkpGRW9IYVNmaEw1UktsUVNPQUhBa1M0UXJYU3FXczlURVUzVjNOZDN5SDJvQnVISzFVamJCT2h4cnRTRFlyQUNtbG1YNVNpMUN4MCtERGtJRFpLTG1kZW9BVkFnOHdwTmlOVDc1Wk4xZHRaWCtVNWw0dWNCN0NEV1pyUnh5aTlrOTJCUTRERElIRVFMZnJCQWtlUmgzT2tnQTFCcmZBQUJ6QXNCV2t0TkkyRjNWMU1yK3VoWUVyOGZsd1BscVlyR1F4Z0Z6R0dZcXFzZVpMQlBBVTRuank5bGNObnNpTkFBZ3R2ZXkyYU94emtxZHExdUxVelEvQklEQlhRUk5FWldVTFplREpVQlZiZ2RnTWIwSENMR21BNEFuSzA2MUpoSEVlS2NsenpWYkxlQmFNZUxsRWxWbFVmY0JEa0FuQUhuZ1Nwd0tqa0xhMndCQXJNMEIrSXkwNEJEelI1WEtZY0xoOG1RUFNsWFlDdGhIQUJRaEFQc3JpL0pCTVordEN2aEtKVThtUzA2eXVKOHZ6a3VBejBrTEhPSGtKSkdFcFQvcDRJTVVUcEk4U3hMTFBBNmNQRXZndE9UMzhwUUxaM2lDNVhHTUVDU2FuOWhhOWJtbXJ3V0JaeW1TQktnRFdPOEo1R21LOHJFVUJYaEFVWndQa0NSTjBUd0g1bzMvejFQR2NQREFBZUFwdDB2bW1xb1c1dmEvMjFxWTIvOXVhOEdhL2VjQWZLNWFtTnYvYm10aDBBVFF1ZjAvZnkzTTdYKzNaU2xZOUt3VE9kZmtaQVdBV2FkeHJnbHFEc0FkbHdVQVpwM0V1U2FwT1FCM1hNTUJtSFVLNTVxb2hnSXc2d1RPTlZrTkEyRFc2WnRyd2hvQ3dLeVROOWVrTlJpQVdhZnU1c2hoQkFCMU9KcVQ5WEhIWXVNQXd3aXJNVUJ1bkFZQ01PdkUzUnlSK1YzZDNCdmw1bnc0dnVRM0RyWnlPRkcrdFdzbEJnRXc2N1RkSUpISFQxQVFhRkI5MGdMZ29BNUFxb1FUeWRVWkplemFHZ0RBckpOMmswUWVQOTJHaGYvcVV3U0FUYThQREFCd1loRUNnTGxjTmh4VkR2aWlVU1ZnYlZYRXpWWi9BR2Fkc2hzbDhuaXZ5bUtlL1RUOHkyY3JwVTNTQUVES0g2VFRKZHhaU0xBbEZjUGtQRytMNXZkVExMWVl5MWR5Y1h6NE44OWFjd0FzaVR4T0hXNHVhb2NSQ0VBOG84WVBVem9BZUw2a0phb1FnRklTeisvYXNKMlNRejdjVVBNNUlsaFpWZFpYYjhHK0duMEJtSFhDYnBiSTQvWEVBVjlLcXhDQVJSTERVeVVIQWdBY1JUQjhUd2NBaSszVDVNRXFsczQ0Ykh4RmpGY0F2bmdMQ29DK0FNdzZYVGRNRUFEdndYWlZRQUN3Rzd1N3hiSU9BSDhpWXRpMkFRQ29Sc0w3cktOYzNOM2RQZGI0NG1FeEhaeDFzaTJvRGdEUE1neGdHRDArbE0vTGVHZWRySnNtQ0lCdDR6VHJoQUFRaFp3UzNDclZBWkF3V083ckFOalNtWjNzSWw3YWxvUEJJSStCY0h6M3lHU2ppSnVtT2dBK2tFdDVDcnNNT3VhVTBtUkQwOTFDUVFBd0ppMWhFQURtUU1ZV3R5RUFoMEViZFJpM0VVVURBRXlwVnFPd1VWaDBZVGlMRVdnamtWcDQxdWtlTG1OaGlJOERyNnVlTnpVRGdNaUgyMUI1VFZVSUFDUUlnTE53a0V3WHlnNnlYTjVZVEZmVGU1VTZBSjVLbGNJdy8wRnhLN2ZISmlzN202WDlXN0NlYm9HbUdkWUxhQWdBQ1FCZzREOWFuQVBRTGM5R1ZIOE1KZ0htVGFUWG9ra2NXMTVmeGVqVkhXMGxnVHVTRWZqbUN0ci9EVnZlMkVseW1DZWNTcS9laHBwMDRmeGRrU0pybjg3T3FwN1grK1Q2MmZsclRmenc4dE5QYmhUOUhEOGI2L1lrYzkwOExVUzNMaU9SaStUV2Y2dWUzeXZVeFo2Nko0bi96WWZmSG1ObkVJQy81Z0I4NWxwWVd6dFBWdDRBY0dZQVVJMndtUGlSUVB1anpBRzRDMXI0L2ZWbDh1aFhBSDVIQUpDeG4vLzQrd255QWRKekFPNkdGZ0J6a2R3NW84RjdCSUFIMm52bHJXUUE4S2FNTGMwQitOeTE4UDNaMzV2Q1g2OS9QMGNBcUgrOWZ2R3hWaThCZGk1L2ZQZjNISURQWEF1VmREWkNLc1dkblNTWjFyQ2xWRDZLc2R0MlROdUdqZDY4dWoyUEIvU1phNEZCZTlWNkdZYnhnbG1uWmE0WmFNRkg0b3NPaXA4UC85eFJMWkMydzM5bkZxbHhoejJmNjVab0FSLzdyaGR6M1NZdExJNTkzNXU1YnBQbUpjQWQxOElFOXIyWjZ4WUpsZjF6ODk5aHpTdi9PNjQ1QUhkY2N3RHV1T1lBM0hITkFiamptZ053eHpVSDRJNXJEc0FkMXh5QU82NDVBSGRjY3dEdXVPWUEzSEhOQWJqam1nTmdVVzRaL2duNjdXRzBjTll1ZHdSL1lTVk00bWFUckd0ckRvQkZCUy9zR1Bhdk12MmVYY3JieWZmdTl2ZTIzbUN2YnV1Y21qa0FGaFc4MUFIQWNJeS9KQ0FBN1VYQTF1OXpBRDU3QlM5eEJJRDdqNlUzZjcrVjN2L3c0Ym1kZVBuaExJRUpiOTRmd3hMZzZQMGJHV04vL25oaXgvWStuTVZtblZ6TG1nTmdVY0cvWHI5K2ZWWjJ2MXNTTDVmSnkyM2hYY0o3dEx4MjZmenhpUDBGQXZETDh1RWI3SmNxLzN0Vy9DUW5iMCtJalRrQUZoVzhYRnRkZllVQTRDNXg1QVA4V01SV1N1V0xwVThLV2tqNUtvc0ZQOTY3NUxITXI3bWZNZnQvL0xOT3IxWE5BYkNvdWcvUUF1QmxjZk5kWnVkaTZhT3NBNURCSkFqQU1wWituZjhKQW5CckZ0WCtmK1F5Y2hmN1hlVFlBQUFBQUVsRlRrU3VRbUNDJy8+PC9zdmc+',
41
- }
42
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
43
- expect(result.length).toBe(1)
44
- expect(result[0].url?.length).toBeLessThan(80_858)
45
- expect(result[0].schema).toBe(ImageThumbnailSchema)
46
- })
47
- })
@@ -1,35 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
4
- import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
6
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
7
- import hasbin from 'hasbin'
8
- import {
9
- describe, expect,
10
- it,
11
- } from 'vitest'
12
-
13
- import { ImageThumbnailWitness } from '../Witness.ts'
14
-
15
- const testIfHasBin = (bin: string) => (hasbin.sync(bin) ? it : it.skip)
16
-
17
- /**
18
- * @group thumbnail
19
- */
20
-
21
- describe('ImageThumbnailWitness', () => {
22
- testIfHasBin('magick')('Dynamic SVG [medium/png]', async () => {
23
- const witness = await ImageThumbnailWitness.create({ account: 'random' })
24
- const httpsPayload: UrlPayload = {
25
- schema: UrlSchema,
26
- // eslint-disable-next-line @stylistic/max-len
27
- url: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiIHZpZXdCb3g9IjAgMCAxMjAwIDEyMDAiPjxpbWFnZSBocmVmPSJodHRwczovL25lb3Rva3lvLm15cGluYXRhLmNsb3VkL2lwZnMvUW1aeGhEd0xjb0s3Y2lwWDNZMXFNRXBXVUhFeE43RjJqQ3o3UU5mR2NleFVFdS9iYWNrZ3JvdW5kLzgucG5nIi8+PGltYWdlIGhyZWY9Imh0dHBzOi8vbmVvdG9reW8ubXlwaW5hdGEuY2xvdWQvaXBmcy9RbVp4aER3TGNvSzdjaXBYM1kxcU1FcFdVSEV4TjdGMmpDejdRTmZHY2V4VUV1L2JvZHkvMy5wbmciLz48aW1hZ2UgaHJlZj0iaHR0cHM6Ly9uZW90b2t5by5teXBpbmF0YS5jbG91ZC9pcGZzL1FtWnhoRHdMY29LN2NpcFgzWTFxTUVwV1VIRXhON0YyakN6N1FOZkdjZXhVRXUvY2xvdGgvNC5wbmciLz48aW1hZ2UgaHJlZj0iaHR0cHM6Ly9uZW90b2t5by5teXBpbmF0YS5jbG91ZC9pcGZzL1FtWnhoRHdMY29LN2NpcFgzWTFxTUVwV1VIRXhON0YyakN6N1FOZkdjZXhVRXUvaGFuZC9maXN0LzMucG5nIi8+PGltYWdlIGhyZWY9Imh0dHBzOi8vbmVvdG9reW8ubXlwaW5hdGEuY2xvdWQvaXBmcy9RbVp4aER3TGNvSzdjaXBYM1kxcU1FcFdVSEV4TjdGMmpDejdRTmZHY2V4VUV1L2hlYWQvMy5wbmciLz48aW1hZ2UgaHJlZj0iaHR0cHM6Ly9uZW90b2t5by5teXBpbmF0YS5jbG91ZC9pcGZzL1FtWnhoRHdMY29LN2NpcFgzWTFxTUVwV1VIRXhON0YyakN6N1FOZkdjZXhVRXUvaGVsbS8yLnBuZyIvPjwvc3ZnPg==',
28
- }
29
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
30
- expect(result.length).toBe(1)
31
- // console.log(`DATA/PNG Size: ${result[0].url?.length}}`)
32
- expect(result[0].url?.length).toBeLessThan(128_000)
33
- expect(result[0].schema).toBe(ImageThumbnailSchema)
34
- }, 20_000)
35
- })
@@ -1,137 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import { removeEmptyFields } from '@xyo-network/hash'
4
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
6
- import { PayloadBuilder } from '@xyo-network/payload-builder'
7
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
8
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
9
- import hasbin from 'hasbin'
10
- import {
11
- beforeAll,
12
- describe, expect, it,
13
- } from 'vitest'
14
-
15
- import { ImageThumbnailWitness } from '../Witness.ts'
16
-
17
- const describeIfHasBin = (bin: string) => (hasbin.sync(bin) ? describe : describe.skip)
18
-
19
- /**
20
- * @group thumbnail
21
- */
22
-
23
- describeIfHasBin('magick')('ImageThumbnailWitness', () => {
24
- let witness: ImageThumbnailWitness
25
- beforeAll(async () => {
26
- witness = await ImageThumbnailWitness.create({ account: 'random' })
27
- })
28
- it('HTTPS [medium/avif]', async () => {
29
- const httpsPayload: UrlPayload = {
30
- schema: UrlSchema,
31
- url: 'https://i.seadn.io/gae/sOGk14HmHMajXRrra4X7Y1ZWncAPyidZap5StDRFCtKHHNSiIUNMpa12v4wqmyp1lEe4CxSxpWgpfiIdh-b_Mn3fq9LDM68i9gof9w?w=500&auto=format',
32
- }
33
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
34
- expect(result.length).toBe(1)
35
- expect(result[0].url?.length).toBeLessThan(64_000)
36
- expect(result[0].schema).toBe(ImageThumbnailSchema)
37
- }, 20_000)
38
- it.skip('HTTPS [medium/png/unsafe]', async () => {
39
- const httpsPayload: UrlPayload = {
40
- schema: UrlSchema,
41
- url: 'https://ethercb.com/image.png',
42
- }
43
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
44
- expect(result.length).toBe(1)
45
- expect(result[0].schema).toBe(ImageThumbnailSchema)
46
- expect(result[0].url?.length).toBeLessThan(64_000)
47
- expect(result[0].schema).toBe(ImageThumbnailSchema)
48
- }, 20_000)
49
- it('HTTPS [medium/svg]', async () => {
50
- const httpsPayload: UrlPayload = {
51
- schema: UrlSchema,
52
- url: 'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/AJ_Digital_Camera.svg',
53
- }
54
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
55
- expect(result.length).toBe(1)
56
- expect(result[0].url?.length).toBeLessThan(64_000)
57
-
58
- // do a second pass and make sure we get cached result
59
- const result2 = (await witness.observe([httpsPayload])) as ImageThumbnail[]
60
- expect(result2.length).toBe(1)
61
- expect(result2[0].url?.length).toEqual(result[0].url?.length)
62
- expect(result[0].schema).toBe(ImageThumbnailSchema)
63
- }, 20_000)
64
- it('HTTPS [medium/ens]', async () => {
65
- const httpsPayload: UrlPayload = {
66
- schema: UrlSchema,
67
-
68
- url: 'https://metadata.ens.domains/mainnet/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/ens.eth/image',
69
- }
70
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
71
- console.log(`ENS-SourceHash: ${result[0].sourceHash}`)
72
- console.log(`ENS-Hash: ${await PayloadBuilder.hash(result[0])}`)
73
- console.log(`ENS-DataHash: ${await PayloadBuilder.dataHash(removeEmptyFields(result[0]))}`)
74
- console.log(`ENS-Result: ${JSON.stringify(result[0], null, 2)}`)
75
- expect(result.length).toBe(1)
76
- expect(result[0].url?.length).toBeLessThan(128_000)
77
-
78
- // do a second pass and make sure we get cached result
79
- const result2 = (await witness.observe([httpsPayload])) as ImageThumbnail[]
80
- expect(result2.length).toBe(1)
81
- expect(result2[0].url?.length).toEqual(result[0].url?.length)
82
- expect(result[0].schema).toBe(ImageThumbnailSchema)
83
- }, 20_000)
84
- it('HTTPS [large/gif (animated)]', async () => {
85
- const httpsPayload: UrlPayload = {
86
- schema: UrlSchema,
87
- url: 'https://lh3.googleusercontent.com/N3uFgyMt0xOew9YjD8GiOLQEbbQ2Y7WJOqoHdUdZZSljKrbuKNt6VGkAByzyPAI80y81tELH6tKatSZvFXKfcbBdm6GfCyZhFWxgOTw',
88
- }
89
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
90
- expect(result.length).toBe(1)
91
- expect(result[0].url?.length).toBeLessThan(64_000)
92
- expect(result[0].schema).toBe(ImageThumbnailSchema)
93
- }, 20_000)
94
- it('HTTPS [html/error]', async () => {
95
- const httpsPayload: UrlPayload = {
96
- schema: UrlSchema,
97
- url: 'https://espn.com',
98
- }
99
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
100
- expect(result.length).toBe(1)
101
- expect(result[0]?.mime?.invalid).toBe(true)
102
- }, 20_000)
103
- it('HTTPS [dns/error]', async () => {
104
- const httpsPayload: UrlPayload = {
105
- schema: UrlSchema,
106
- url: 'https://sdjkfsdljkfhdskfsd.com',
107
- }
108
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
109
- expect(result.length).toBe(1)
110
- expect(result[0]?.http?.code).toBe('ENOTFOUND')
111
- }, 20_000)
112
- it('HTTPS [other/error]', async () => {
113
- const httpsPayload: UrlPayload = {
114
- schema: UrlSchema,
115
- url: 'https://profilesetting.in/mier/logo.gif',
116
- }
117
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
118
- expect(result.length).toBe(1)
119
- console.log(`HTTPS [other/error]: ${JSON.stringify(result)}`)
120
- expect(result[0]?.http?.code).toBe('EPROTO')
121
- }, 20_000)
122
- it.skip('HTTPS [medium/png]', async () => {
123
- const httpsPayload: UrlPayload = {
124
- schema: UrlSchema,
125
- url: 'https://usdclive.org/usdc.png',
126
- }
127
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
128
- expect(result.length).toBe(1)
129
- expect(result[0].url?.length).toBeLessThan(64_000)
130
-
131
- // do a second pass and make sure we get cached result
132
- const result2 = (await witness.observe([httpsPayload])) as ImageThumbnail[]
133
- expect(result2.length).toBe(1)
134
- expect(result2[0].url?.length).toEqual(result[0].url?.length)
135
- expect(result[0].schema).toBe(ImageThumbnailSchema)
136
- }, 20_000)
137
- })
@@ -1,64 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
4
- import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import type { ModuleError } from '@xyo-network/payload-model'
6
- import { ModuleErrorSchema } from '@xyo-network/payload-model'
7
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
8
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
9
- import hasbin from 'hasbin'
10
- import {
11
- beforeAll,
12
- describe, expect, it,
13
- } from 'vitest'
14
-
15
- import { ImageThumbnailWitness } from '../Witness.ts'
16
-
17
- const testIfHasBin = (bin: string) => (hasbin.sync(bin) ? it : it.skip)
18
-
19
- /**
20
- * @group thumbnail
21
- */
22
-
23
- describe('ImageThumbnailWitness', () => {
24
- let witness: ImageThumbnailWitness
25
- beforeAll(async () => {
26
- witness = await ImageThumbnailWitness.create({ account: 'random' })
27
- })
28
- testIfHasBin('magick')('IPFS [jpeg]', async () => {
29
- const ipfsPayload: UrlPayload = {
30
- schema: UrlSchema,
31
- url: 'ipfs://ipfs/QmewywDQGqz9WuWfT11ueSR3Mu86MejfD64v3KtFRzGP2G/image.jpeg',
32
- }
33
- const result = (await witness.observe([ipfsPayload])) as (ImageThumbnail | ModuleError)[]
34
- expect(result.length).toBe(1)
35
- const thumb = result[0] as ImageThumbnail
36
- expect(thumb.url?.length).toBeLessThan(64_000)
37
- const error = result[0] as ModuleError
38
- if (result[0].schema === ModuleErrorSchema) {
39
- console.log(`Error: ${error.message}`)
40
- }
41
- expect(result[0].schema).toBe(ImageThumbnailSchema)
42
- })
43
- testIfHasBin('magick')('IPFS [png]', async () => {
44
- const ipfsPayload: UrlPayload = {
45
- schema: UrlSchema,
46
- url: 'ipfs://bafybeie3vrrqcq7iugzmsdsdxscvmvqnfkqkk7if2ywxu5h436wf72usga/470.png',
47
- }
48
- const result = (await witness.observe([ipfsPayload])) as ImageThumbnail[]
49
- expect(result.length).toBe(1)
50
- const thumb = result[0] as ImageThumbnail
51
- expect(thumb.url?.length).toBeLessThan(64_000)
52
- expect(result[0].schema).toBe(ImageThumbnailSchema)
53
- })
54
- testIfHasBin('magick')('IPFS [bad (ipfs.io)]', async () => {
55
- const ipfsPayload: UrlPayload = {
56
- schema: UrlSchema,
57
- url: 'https://ipfs.io/ipfs/QmTkxZExjY97XSCTGoqGNxgYUE4kDakMykjbL1NVnH9xE9',
58
- }
59
- const result = (await witness.observe([ipfsPayload])) as ImageThumbnail[]
60
- expect(result.length).toBe(1)
61
- console.log(`result: ${JSON.stringify(result, null, 2)}`)
62
- expect(result[0].schema).toBe(ImageThumbnailSchema)
63
- })
64
- })
@@ -1,96 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import { delay } from '@xylabs/delay'
4
- import { Account } from '@xyo-network/account'
5
- import { MemoryArchivist } from '@xyo-network/archivist-memory'
6
- import { isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
7
- import { MemoryNode } from '@xyo-network/node-memory'
8
- import { PayloadBuilder } from '@xyo-network/payload-builder'
9
- import { MemorySentinel } from '@xyo-network/sentinel-memory'
10
- import { SentinelWrapper } from '@xyo-network/sentinel-wrapper'
11
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
12
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
13
- import { isTimestamp, TimestampWitness } from '@xyo-network/witness-timestamp'
14
- import {
15
- beforeAll,
16
- describe, expect, it,
17
- } from 'vitest'
18
-
19
- import { ImageThumbnailWitness } from '../Witness.ts'
20
-
21
- /**
22
- * @group thumbnail
23
- * @group sentinel
24
- */
25
-
26
- describe('Witness', () => {
27
- describe('when behind sentinel', () => {
28
- const archivistName = 'archivist'
29
- let thumbnailWitness: ImageThumbnailWitness
30
- let timestampWitness: TimestampWitness
31
- let archivist: MemoryArchivist
32
- let sentinel: MemorySentinel
33
- let node: MemoryNode
34
- // const logger = mock<Console>()
35
-
36
- beforeAll(async () => {
37
- thumbnailWitness = await ImageThumbnailWitness.create({
38
- account: 'random',
39
- config: { schema: ImageThumbnailWitness.defaultConfigSchema },
40
- // logger,
41
- })
42
- timestampWitness = await TimestampWitness.create({
43
- account: 'random',
44
- config: { schema: TimestampWitness.defaultConfigSchema },
45
- // logger,
46
- })
47
- archivist = await MemoryArchivist.create({
48
- account: 'random',
49
- config: { name: archivistName, schema: MemoryArchivist.defaultConfigSchema },
50
- })
51
- sentinel = await MemorySentinel.create({
52
- account: 'random',
53
- config: {
54
- archiving: { archivists: [archivist.address] },
55
- schema: MemorySentinel.defaultConfigSchema,
56
- synchronous: true,
57
- tasks: [{ input: true, mod: thumbnailWitness.address }, { mod: timestampWitness.address }],
58
- },
59
- // logger,
60
- })
61
- const modules = [timestampWitness, thumbnailWitness, archivist, sentinel]
62
- node = await MemoryNode.create({
63
- account: 'random',
64
- config: { schema: MemoryNode.defaultConfigSchema },
65
- // logger,
66
- })
67
- await node.start()
68
- await Promise.all(
69
- modules.map(async (mod) => {
70
- await node.register(mod)
71
- await node.attach(mod.address, true)
72
- }),
73
- )
74
- })
75
- it('witnesses thumbnail for url', async () => {
76
- // TODO: Replace with data url for speed
77
- // const url =
78
- // eslint-disable-next-line @stylistic/max-len
79
- // "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'><circle cx='50' cy='50' r='48' fill='yellow' stroke='black' stroke-width='2'/><circle cx='35' cy='35' r='5' fill='black'/><circle cx='65' cy='35' r='5' fill='black'/><path d='M 35 70 Q 50 85, 65 70' fill='none' stroke='black' stroke-width='2'/></svg>"
80
- const url = 'https://placekitten.com/200/300'
81
- const query = new PayloadBuilder<UrlPayload>({ schema: UrlSchema }).fields({ url }).build()
82
- const sentinelWrapper = SentinelWrapper.wrap(sentinel, await Account.random())
83
- // using wrapper for archiving
84
- const values = await sentinelWrapper.report([query])
85
- const timestamps = values.filter(isTimestamp)
86
- expect(timestamps.length).toBe(1)
87
- const thumbnails = values.filter(isImageThumbnail)
88
- expect(thumbnails.length).toBe(1)
89
- const thumbnail = thumbnails[0]
90
- expect(thumbnail.sourceUrl).toBe(url)
91
- await delay(1000)
92
- const payloads = await archivist?.all()
93
- expect(payloads?.length).toBeGreaterThan(0)
94
- })
95
- })
96
- })
@@ -1,32 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import {
4
- describe, expect,
5
- it,
6
- } from 'vitest'
7
-
8
- import { checkIpfsUrl } from '../lib/index.ts'
9
-
10
- /**
11
- * @group thumbnail
12
- */
13
-
14
- describe('Witness', () => {
15
- describe('checkIpfsUrl', () => {
16
- const cases: [uri: string, expected: string][] = [
17
- [
18
- 'ipfs://ipfs/QmewywDQGqz9WuWfT11ueSR3Mu86MejfD64v3KtFRzGP2G/image.jpeg',
19
- 'https://5d7b6582.beta.decentralnetworkservices.com/ipfs/QmewywDQGqz9WuWfT11ueSR3Mu86MejfD64v3KtFRzGP2G/image.jpeg',
20
- ],
21
- [
22
- 'ipfs://QmWX3Kx2NX3AK8WxTQwktVYLMFHX3pHm77ThynhgmU8dP8',
23
- 'https://5d7b6582.beta.decentralnetworkservices.com/ipfs/QmWX3Kx2NX3AK8WxTQwktVYLMFHX3pHm77ThynhgmU8dP8',
24
- ],
25
- ]
26
-
27
- it.each(cases)('%s', (input, expected) => {
28
- const actual = checkIpfsUrl(input, '5d7b6582.beta.decentralnetworkservices.com')
29
- expect(actual).toBe(expected)
30
- })
31
- })
32
- })
@@ -1,124 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
4
- import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import type { UrlPayload } from '@xyo-network/url-payload-plugin'
6
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
7
- import { fileTypeFromBuffer } from 'file-type'
8
- import hasbin from 'hasbin'
9
- import {
10
- beforeAll,
11
- describe, expect, it,
12
- } from 'vitest'
13
-
14
- import { ImageThumbnailWitness } from '../Witness.ts'
15
-
16
- const describeIfHasBin = (bin: string) => (hasbin.sync(bin) ? describe : describe.skip)
17
-
18
- type MimeWithUrl = [mime: string, url: string]
19
-
20
- const testVideoFormat = async (witness: ImageThumbnailWitness, url: string) => {
21
- const httpsPayload: UrlPayload = { schema: UrlSchema, url }
22
- const result = (await witness.observe([httpsPayload])) as ImageThumbnail[]
23
- expect(result.length).toBe(1)
24
- expect(result[0].schema).toBe(ImageThumbnailSchema)
25
- expect(result[0].url?.length).toBeGreaterThan(0)
26
- const imageData = result[0].url?.split(',')[1] ?? ''
27
- const buffer = Buffer.from(Uint8Array.from(atob(imageData), c => c.codePointAt(0) ?? 0))
28
- const fileType = await fileTypeFromBuffer(buffer)
29
- expect(fileType?.mime).toBe('image/png')
30
- }
31
-
32
- /**
33
- * @group thumbnail
34
- */
35
-
36
- describe.skip('ImageThumbnailWitness', () => {
37
- describeIfHasBin('magick')('ImageThumbnailWitness', () => {
38
- describe('with video type', () => {
39
- let witness: ImageThumbnailWitness
40
- beforeAll(async () => {
41
- witness = await ImageThumbnailWitness.create({ account: 'random' })
42
- })
43
- describe('3GPP', () => {
44
- const cases: MimeWithUrl[] = [['video/3gpp', 'https://filesamples.com/samples/video/3gp/sample_640x360.3gp']]
45
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
46
- })
47
- describe.skip('3GPP2', () => {
48
- const cases: MimeWithUrl[] = [['video/3gpp2', '']]
49
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
50
- })
51
- describe.skip('Advanced Video Coding / H.264', () => {
52
- const cases: MimeWithUrl[] = [['video/h264', '']]
53
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
54
- })
55
- describe.skip('High Efficiency Video Coding / H.265', () => {
56
- const cases: MimeWithUrl[] = [['video/h265', '']]
57
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
58
- })
59
- describe.skip('MPEG-2 Transport Stream', () => {
60
- const cases: MimeWithUrl[] = [['video/mp2t', 'https://filesamples.com/samples/video/m2ts/sample_640x360.m2ts']]
61
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
62
- })
63
- describe('MPEG-4 Part 14', () => {
64
- const cases: MimeWithUrl[] = [
65
- ['video/mp4', 'https://cdn-longterm.mee6.xyz/assets/avatars-presale.mp4'],
66
- ['video/mp4;codecs=avc1', 'https://media.niftygateway.com/video/upload/v1649189105/Abigail/FEWO/Paint/Paint/006266_paint_hf9cft.mp4'],
67
- ]
68
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
69
- })
70
- describe('MPEG Moving Picture Experts Group Phase 1', () => {
71
- const cases: MimeWithUrl[] = [['video/mpeg', 'https://filesamples.com/samples/video/mpeg/sample_640x360.mpeg']]
72
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
73
- })
74
- describe.skip('OGG', () => {
75
- const cases: MimeWithUrl[] = [['video/ogg', 'https://filesamples.com/samples/video/ogv/sample_640x360.ogv']]
76
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
77
- })
78
- describe('QuickTime File Format (QTFF)', () => {
79
- const cases: MimeWithUrl[] = [['video/quicktime', 'https://filesamples.com/samples/video/mov/sample_640x360.mov']]
80
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
81
- })
82
- describe.skip('RealMedia', () => {
83
- const cases: MimeWithUrl[] = [['video/vnd.rn-realvideo', '.rm']]
84
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
85
- })
86
- describe('WebM', () => {
87
- const cases: MimeWithUrl[] = [['video/webm', 'https://filesamples.com/samples/video/webm/sample_640x360.webm']]
88
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
89
- })
90
- describe('Flash Video', () => {
91
- const cases: MimeWithUrl[] = [
92
- ['video/x-flv', 'https://filesamples.com/samples/video/flv/sample_640x360.flv'],
93
- // NOTE: Because of restrictions in the FLV file format, Adobe Systems created new file formats
94
- // in 2007, based on the ISO base media file format (MPEG-4 Part 12). In this way, the F4V format
95
- // shares a common base with the MP4 format, which is why F4V is sometimes informally called "Flash MP4".
96
- // https://en.m.wikipedia.org/wiki/Flash_Video#History
97
- // ['video/mp4', 'https://filesamples.com/samples/video/f4v/sample_640x360.f4v'],
98
- ]
99
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
100
- })
101
- describe('MPEG-4 Video', () => {
102
- const cases: MimeWithUrl[] = [['video/x-m4v', 'https://filesamples.com/samples/video/m4v/sample_640x360.m4v']]
103
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
104
- })
105
- describe.skip('Matroska Multimedia Container', () => {
106
- const cases: MimeWithUrl[] = [['video/x-matroska', 'https://filesamples.com/samples/video/mkv/sample_640x360.mkv']]
107
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
108
- })
109
- describe('Windows Media Video', () => {
110
- const cases: MimeWithUrl[] = [['video/x-ms-wmv', 'https://filesamples.com/samples/video/wmv/sample_640x360.wmv']]
111
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
112
- })
113
- describe('Audio Video Interleave', () => {
114
- const cases: MimeWithUrl[] = [
115
- // ['video/vnd.avi', 'https://filesamples.com/samples/video/avi/sample_640x360.avi'],
116
- ['video/avi', 'https://filesamples.com/samples/video/avi/sample_640x360.avi'],
117
- // ['video/msvideo', 'https://filesamples.com/samples/video/avi/sample_640x360.avi'],
118
- // ['video/x-msvideo', 'https://filesamples.com/samples/video/avi/sample_640x360.avi'],
119
- ]
120
- it.each(cases)('video [mime (%s)]', async (_mime, url) => await testVideoFormat(witness, url))
121
- })
122
- })
123
- })
124
- })