From 03087ffe4175b0e2223f283b41750fad0fa900d7 Mon Sep 17 00:00:00 2001 From: Siddharth VP Date: Mon, 15 Apr 2024 00:22:22 +0530 Subject: [PATCH] db-tabulator: show live status of updates on web UI --- db-tabulator/app.ts | 25 ++++-- db-tabulator/external-update.ts | 13 ++- db-tabulator/preprocess.ts | 44 +++++----- db-tabulator/test.ts | 2 +- db-tabulator/web-endpoint.ts | 88 +++++++++++++------ webservice/public/images/loading.gif | Bin 0 -> 81572 bytes webservice/views/database-report.hbs | 123 +++++++++++++++++++++++++-- webservice/views/layout.hbs | 2 +- 8 files changed, 237 insertions(+), 60 deletions(-) create mode 100644 webservice/public/images/loading.gif diff --git a/db-tabulator/app.ts b/db-tabulator/app.ts index d0b56f3..393c6cc 100644 --- a/db-tabulator/app.ts +++ b/db-tabulator/app.ts @@ -7,6 +7,7 @@ import { formatSummary } from "../reports/commons"; import {MetadataStore} from "./MetadataStore"; import {HybridMetadataStore} from "./HybridMetadataStore"; import {applyJsPreprocessing, processQueriesExternally} from "./preprocess"; +import {EventEmitter} from "events"; export const BOT_NAME = 'SDZeroBot'; export const TEMPLATE = 'Database report'; @@ -45,12 +46,12 @@ export function getQueriesFromText(text: string, title: string): Query[] { new Query(template, title, idx + 1, !!template.getValue('preprocess_js')?.trim())); } -export async function processQueries(allQueries: Record) { +export async function processQueries(allQueries: Record, notifier?: EventEmitter) { await bot.batchOperation(Object.entries(allQueries), async ([page, queries]) => { if (queries.filter(q => q.needsExternalRun).length > 0) { // Needs an external process for security log(`[+] Processing page ${page} using child process`); - await processQueriesExternally(page); + await processQueriesExternally(page, notifier); } else { log(`[+] Processing page ${page}`); await processQueriesForPage(queries); @@ -85,7 +86,7 @@ export async function checkShutoff() { const queriesLog = createLogStream('queries.log'); -export class Query { +export class Query extends EventEmitter { /// Step 1. Parse the query /// Step 2. Run the query @@ -138,6 +139,7 @@ export class Query { needsForceKill = false; constructor(template: Template, page: string, idxOnPage: number, external?: boolean) { + super(); this.page = page; this.template = template; this.idx = idxOnPage; @@ -145,6 +147,11 @@ export class Query { this.context = getContext(); } + /** Produce events for progress tracking from web UI (if invoked from web endpoint) */ + emit(...args) { + return super.emit('message', ...args); + } + toString() { return this.page + (this.idx !== 1 ? ` (#${this.idx})` : ''); } @@ -156,6 +163,7 @@ export class Query { const resultText = await this.formatResults(result); await this.save(resultText); await metadataStore.updateLastTimestamp(this); + this.emit('done-one'); } catch (err) { if (err instanceof HandledError) return; emailOnError(err, 'db-tabulator'); @@ -260,8 +268,10 @@ export class Query { let query = `SET STATEMENT max_statement_time = ${QUERY_TIMEOUT} FOR ${this.config.sql.trim()}`; query = this.appendLimit(query); queriesLog(`Page: [[${this.page}]], context: ${this.context}, query: ${query}`); + this.emit('query-executing', this.config.sql); return db.timedQuery(query).then(([timeTaken, queryResult]) => { this.queryRuntime = timeTaken.toFixed(2); + this.emit('query-executed', this.queryRuntime); log(`[+] ${this}: Took ${this.queryRuntime} seconds`); return queryResult; }).catch(async (err: SQLError) => { @@ -378,7 +388,6 @@ export class Query { } async formatResultSet(result, pageNumber: number) { - let numColumns = Object.keys(result[0]).length; for (let i = 1; i <= numColumns; i++) { // Stringify everything @@ -391,7 +400,7 @@ export class Query { if (this.getTemplateValue('preprocess_js')) { const jsCode = stripOuterNowikis(this.getTemplateValue('preprocess_js')); try { - result = await applyJsPreprocessing(result, jsCode, this.toString(), this); + result = await applyJsPreprocessing(result, jsCode, this); } catch (e) { log(`[E] Error in applyJsPreprocessing`); log(e); @@ -584,6 +593,7 @@ export class Query { return; } let outputPage = this.config.outputPage || this.page; + this.emit('saving', outputPage); let page = new bot.page(outputPage); let firstPageResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; try { @@ -595,6 +605,7 @@ export class Query { summary: this.generateEditSummary(isError) }; }); + this.emit('save-success', outputPage); } catch (err) { if (isError) { // error on an error logging attempt, just throw now throw err; @@ -606,6 +617,7 @@ export class Query { if (err.code === 'protectedpage') { throw err; } + this.emit('save-failed', outputPage, err.message); return this.saveWithError(`Error while saving report: ${err.message}`); } if (Array.isArray(queryResult)) { // paginated result (output_page is not applicable in this case) @@ -613,11 +625,13 @@ export class Query { let pageNumber = parseInt(idx) + 1; if (pageNumber === 1) continue; // already saved above let subpage = new bot.page(outputPage + '/' + pageNumber); + this.emit('saving', subpage.getPrefixedText()); await subpage.save( `{{Database report/subpage|page=${pageNumber}|num_pages=${this.numPages}}}\n` + resultText, 'Updating database report' ); + this.emit('save-success', subpage.getPrefixedText()); } for (let i = this.numPages + 1; i <= MAX_SUBPAGES; i++) { let subpage = new bot.page(outputPage + '/' + i); @@ -667,6 +681,7 @@ export class Query { if (endTemplateStartIdx === -1) { // Still no? Record for edit summary this.endNotFound = true; + this.emit('end-not-found'); } } let textToReplace = text.slice( diff --git a/db-tabulator/external-update.ts b/db-tabulator/external-update.ts index e8da10b..3306fa7 100644 --- a/db-tabulator/external-update.ts +++ b/db-tabulator/external-update.ts @@ -15,10 +15,21 @@ import {metadataStore, fetchQueriesForPage, processQueriesForPage} from "./app"; ]); const queries = await fetchQueriesForPage(argv.page); + + // Send progress events to parent process for display in web UI + for (let query of queries) { + query.on('message', (...args) => { + process.send({ + code: args[0], + args: args.slice(1) + }); + }); + } + await processQueriesForPage(queries); if (queries.filter(q => q.needsForceKill).length > 0) { - process.send({ code: 'catastrophic-error' }); + process.send({ code: 'catastrophic-error', args: [] }); } })().catch(e => emailOnError(e, 'db-tabulator-child')); diff --git a/db-tabulator/preprocess.ts b/db-tabulator/preprocess.ts index 83f36f9..5035653 100644 --- a/db-tabulator/preprocess.ts +++ b/db-tabulator/preprocess.ts @@ -1,16 +1,12 @@ import {argv, log} from "../botbase"; -import {sleep} from "../../mwn/build/utils"; import {fork} from "child_process"; +import EventEmitter from "events"; +import type {Query} from "./app"; const softTimeout = 1000; const hardTimeout = 1500; const processTimeout = 30000; -interface PreprocessContext { - warnings: Array; - needsForceKill: boolean; -} - async function timedPromise(timeout: number, promise: Promise, cleanup: () => void) { let t: NodeJS.Timeout; await Promise.race([ @@ -27,7 +23,7 @@ async function timedPromise(timeout: number, promise: Promise, cleanup: () }); } -export async function processQueriesExternally(page: string) { +export async function processQueriesExternally(page: string, notifier?: EventEmitter) { const controller = new AbortController(); await timedPromise( processTimeout, @@ -45,6 +41,9 @@ export async function processQueriesExternally(page: string) { if (message.code === 'catastrophic-error') { controller.abort(); // This triggers exit event } + if (notifier) { + notifier.emit('message', message.code, ...message.args); + } }); child.on('error', (err) => { log(`[E] Error from child process`); @@ -57,13 +56,14 @@ export async function processQueriesExternally(page: string) { log(`[E] Aborting child process as it took more than ${processTimeout/1000} seconds`); // FIXME? looks necessary as some errors in child process cause it to never resolve/reject controller.abort(); + notifier.emit('process-timed-out'); } ); } -export async function applyJsPreprocessing(rows: Record[], jsCode: string, queryId: string, - ctx: PreprocessContext): Promise[]> { - log(`[+] Applying JS preprocessing for ${queryId}`); +export async function applyJsPreprocessing(rows: Record[], jsCode: string, query: Query): Promise[]> { + log(`[+] Applying JS preprocessing for ${query}`); + query.emit('preprocessing'); let startTime = process.hrtime.bigint(); // Import dynamically as this has native dependencies @@ -73,7 +73,7 @@ export async function applyJsPreprocessing(rows: Record[], jsCod memoryLimit: 16, onCatastrophicError(msg) { log(`[E] Catastrophic error in isolated-vm: ${msg}`); - ctx.needsForceKill = true; + query.needsForceKill = true; } }); const context = await isolate.createContext(); @@ -95,20 +95,23 @@ export async function applyJsPreprocessing(rows: Record[], jsCod if (Array.isArray(userCodeResultParsed)) { result = userCodeResultParsed; } else { - log(`[E] JS preprocessing for ${queryId} returned a non-array: ${userCodeResult.slice(0, 100)} ... Ignoring.`); - ctx.warnings.push(`JS preprocessing didn't return an array of rows, will be ignored`); + log(`[E] JS preprocessing for ${query} returned a non-array: ${userCodeResult.slice(0, 100)} ... Ignoring.`); + query.warnings.push(`JS preprocessing didn't return an array of rows, will be ignored`); + query.emit('js-no-array'); } } else { - log(`[E] JS preprocessing for ${queryId} has an invalid return value: ${userCodeResult}. Ignoring.`); - ctx.warnings.push(`JS preprocessing must have a transferable return value`); + log(`[E] JS preprocessing for ${query} has an invalid return value: ${userCodeResult}. Ignoring.`); + query.warnings.push(`JS preprocessing must have a transferable return value`); + query.emit('js-invalid-return'); } } catch (e) { // Shouldn't occur as we are the ones doing the JSON.stringify - log(`[E] JS preprocessing for ${queryId} returned a non-JSON: ${userCodeResult.slice(0, 100)}. Ignoring.`); + log(`[E] JS preprocessing for ${query} returned a non-JSON: ${userCodeResult.slice(0, 100)}. Ignoring.`); } } catch (e) { - log(`[E] JS preprocessing for ${queryId} failed: ${e.toString()}`); + log(`[E] JS preprocessing for ${query} failed: ${e.toString()}`); log(e); - ctx.warnings.push(`JS preprocessing failed: ${e.toString()}`); + query.warnings.push(`JS preprocessing failed: ${e.toString()}`); + query.emit('js-failed', e.toString()); } } @@ -123,8 +126,9 @@ export async function applyJsPreprocessing(rows: Record[], jsCod ); let endTime = process.hrtime.bigint(); - let timeTaken = Number(endTime - startTime) / 1e9; - log(`[+] JS preprocessing for ${queryId} took ${timeTaken.toFixed(3)} seconds, cpuTime: ${isolate.cpuTime}, wallTime: ${isolate.wallTime}.`); + let timeTaken = (Number(endTime - startTime) / 1e9).toFixed(3); + log(`[+] JS preprocessing for ${query} took ${timeTaken} seconds, cpuTime: ${isolate.cpuTime}, wallTime: ${isolate.wallTime}.`); + query.emit('preprocessing-complete', timeTaken); return result; } diff --git a/db-tabulator/test.ts b/db-tabulator/test.ts index edaeeda..290dd49 100644 --- a/db-tabulator/test.ts +++ b/db-tabulator/test.ts @@ -36,7 +36,7 @@ describe('db-tabulator', () => { row.id = parseInt(row.id) + 100; }) return rows; - }`, 'test', { warnings: [], needsForceKill: false })); + }`, new Query(new Template('{{}}'), '', 1))); }) }); diff --git a/db-tabulator/web-endpoint.ts b/db-tabulator/web-endpoint.ts index f7d3f4b..021a091 100644 --- a/db-tabulator/web-endpoint.ts +++ b/db-tabulator/web-endpoint.ts @@ -4,13 +4,14 @@ import { fetchQueriesForPage, metadataStore, SHUTOFF_PAGE, - TEMPLATE, SUBSCRIPTIONS_CATEGORY, - processQueries + processQueries, + BOT_NAME } from "./app"; import { createLogStream, mapPath } from "../utils"; import {bot, enwikidb} from "../botbase"; import {getRedisInstance} from "../redis"; +import {EventEmitter} from "events"; const router = express.Router(); @@ -22,16 +23,33 @@ const redisKey = 'web-db-tabulator-pages'; const db = new enwikidb(); -// TODO: show status of requested updates on web UI, with JS polling +router.get('/stream', async (req, res) => { + const {page} = req.query as Record; -router.get('/', async function (req, res, next) { - let {page} = req.query as {page: string}; + res.writeHead(200, { + "Connection": "keep-alive", + "Cache-Control": "no-cache", + "Content-Type": "text/event-stream", + }); + + res.on('close', () => { + log(`[W] Client closed the connection`); + res.end(); + }); + + function stream(code: string, args?: Record) { + res.write(`data: ${JSON.stringify(Object.assign( {}, { code }, args || {}))}\n\n`); + } + function endStream() { + stream('end'); + } let [shutoffText, queries, revId] = await Promise.all([ checkShutoff(), fetchQueriesForPage(page), getLastNonBotRevId(page).catch(err => { - res.status(err.code || 500).render('oneline', { text: err.message }); + stream('failed-get-last-revid', { code: err.code, message: err.message }); + endStream(); }), metadataStore.init(), ]); @@ -39,23 +57,23 @@ router.get('/', async function (req, res, next) { if (!revId) return; if (shutoffText) { - log(`[E] Refused run on ${page} as task is shut off. Shutoff page content: ${shutoffText}`); - return res.status(422).render('oneline', { - text: `Bot is current shut off via ${SHUTOFF_PAGE}. The page should be blank for it to work.` - }); + stream('shutoff', { SHUTOFF_PAGE }); + return endStream(); + } else { + stream('shutoff-checked'); } const pgKey = page + ':' + revId; if (await redis.sismember(redisKey, pgKey).catch(handleRedisError)) { - return res.status(409).render('oneline', { - text: `An update is already in progress for report(s) on page ${page} (revid ${revId})` - }); + stream('already-in-progress', { page, revId }); + return endStream(); } redis.sadd(redisKey, pgKey).catch(handleRedisError); // If no queries found, link clicked was probably from a transcluded report. // Check if any transclusion(s) are in SUBSCRIPTION_CATEGORY and update them. if (queries.length === 0) { + stream('looking-up-transclusions'); const title = bot.Title.newFromText(page); try { // FIXME: use the web replica here as this is a blocking call? @@ -79,20 +97,36 @@ router.get('/', async function (req, res, next) { } } - res.status(queries.length ? 202 : 400).render('database-report', { - page, - template: TEMPLATE, - noQueries: queries.length === 0 - }); - if (queries) { - log(`Started processing ${page}`); - try { - await processQueries({[page]: queries}); - } finally { - redis.srem(redisKey, pgKey).catch(handleRedisError); - } - log(`Finished processing ${page}`); + if (queries.length) { + stream('started', { numQueries: queries.length }); + } else { + stream('no-queries'); + redis.srem(redisKey, pgKey).catch(handleRedisError); + return endStream(); + } + + let handleMessage = (...args) => { + stream(args[0], { args: args.slice(1) }) + }; + + const notifier = new EventEmitter(); + notifier.on('message', handleMessage); // If custom JS is enabled + queries.forEach(q => q.on('message', handleMessage)); // If custom JS is not enabled + + log(`Started processing ${page}`); + try { + await processQueries({[page]: queries}, notifier); + } finally { + redis.srem(redisKey, pgKey).catch(handleRedisError); } + log(`Finished processing ${page}`); + stream('completed'); + return endStream(); +}); + +router.get('/', async function (req, res, next) { + const {page} = req.query as Record; + res.status(200).render('database-report', { page }); }); async function getLastNonBotRevId(page: string) { @@ -101,7 +135,7 @@ async function getLastNonBotRevId(page: string) { titles: page, rvprop: 'ids', rvlimit: 1, - rvexcludeuser: 'SDZeroBot' + rvexcludeuser: BOT_NAME }); let pg = response?.query?.pages?.[0]; if (!pg) { diff --git a/webservice/public/images/loading.gif b/webservice/public/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1b07ea2e5bbd9c1ebf7d719a3892a7d2917f253 GIT binary patch literal 81572 zcmeF)Wmp^Sx-e`C6VOC>1Z_i)-bE2t%OwTIKyK3FX(^ z?3_5)t`6jC)+YsJI!PT{ovWWBFYK*!^h^zG>2wXg8e53cZ&lRL(;4fF(yQ_+a4J~6 zGB7fhcCQQrAG}YWnAF z4tly@O>9j?=_P*tg6`)wUs+lk(DAZ!vgvX1anbQTXXkp(DfnEFm5!T}i<5(kn}d^| zjf+!=mtTmJi|%hP`m3#3>l+HalYH~HZC$++r8ly*wG!gsu(Pvcx8q^AwEoJ$B`7G! z!O6|R&CPbzg3ZRk!dAzg&BBJ^&oxLI*yvdsTiF_0TG0JmqmHiScUw{Vt3Ca72>N<| zt<~zgwb`$A>g#bBm>HNGSlHTdaItg!JgPqq*WBu_#uhg0zYd*U&(fU3UdQUHA?M#W zR8aWuo0^;d)!N4Poxy(`+kd%Y8x;pD1CDnFHkRM5^$f0>GyL2qE1_4`20FHu)+&~k zW`Fj$vXP~&rHzrL72T`%ymYF@7W$TUHosacCgx$v8-F#jwfWmAl`ymY+mxB{&yE!`)3Nw^wL5J328KG{&1~t#>a(ssiUyWumR}v{ z*y#T5oLd{{>weeOH8c3t>sAJqR%Qkqe>N52_<4HGjIUPyYwC~faQyw|uMYXD6C@3+ zjei*Ezp=J7r~B3SLdO5NTb}>JL;KsZ`v16Fc>m$D9DnZQ-+em&oOSh)|2g^BwRZL9 zudCI-;_4E$zPc8#VJCG{*H%}SmlhZ1=VoW7rzR)H$3{nn zhXx1w`+9r2yE;4C(Wti8mgc6$hWfhNn(C^`3S@a%X-RQWVL?6u4$I5U$m zNlr>kh=)SJaiCaWOmtLaM0i+eNH8EMFu>o>*T>t-)5G1()y3J#(ZSyC$9G#B>u*+; z7UpKACdNiz4Gr}5balRb*4EP0P*?k;`tgIx`*&}Zl@t}^N zH}={TgRX|k*(qz5eBX<&Vo`-pA)I$EY0jS`zSR5s zP>DgxxH_8DY2-Tb99HMiY%EgE?VuDxH1yTibJh<<#zCo|cx^VWgLi`n8YDYaMM?dL zr1=`3|Jc&z6t>gRb;a?7ZE#cMny|(DavP_19kB#$9wEim;Ssf(_^Pw=jTcoxOL)~Q z$9ppd-`UajOv-zX-SLpKkBWGl>N}qFT|l`hDFR1yL#_Od* zqR>7-Ye;i2h(+IE%l5^Otz=ODt5N$%VXElNs9q_}6qgm6zSP@x$owdzX`To@dG~PR zXv$KRh9Ya}>H(EqvTZaw&YW@T^PjI0?|@dNy2>Ahs~jwRLfXti=SJp9W0~ zI?lXM%H?q1&-u)b--?Gt&uN!6b_0iZruLR&z4KQ1^o6>eI03$uJHa>|GxKsCfiA+0 zUSIoCw(P~ojIJk;?h%2oN8R28wr|YxG~o-zV)FE`yWHcCo|zcEQlGZEEpd1DslR>0 z!@!q*vhzB7E=#o*K_7*e$FN- z9{rv-Wt8)T0$24*`vIK3qebhM##_rw+uP0xCOlZ^;jl?BMA+*r&;7t*|HEkV;0{*l zHL{V`A6^9!jETAq*(1H3DTSF(GtmawZuDYu5ki#B}bE*R;@-KbGQ#Z zn!fq!RZZX*EsWdyq%SuLQ|gEsP7H4N1b!Bzigi+i!5tI zxpO)n`2^radNv9C*a^}RNhOj>ZWxy26xv%3s@bhey9NYQ;IkPe>fIrCw2#gLR|}#&R+J~MB6pF4hp9b!m>4Ad zl~6E2u;Y8PRrHQLp6Jl9{j0;h7!K-XraNBUK8D0MPR6xfbHw!oi&;n0(WuKjjO%qR z-cR6y8Y|rL>Vs}}q_U8!z73`7PJ5aU94~!0P8~6j^y45$hsIRm%yY0qf|9BMhnso5buL@UUOsHW&S8`Of1Kko@3UDL+Kty`2TGxX_v*dp+XdG)utADXj4*n$y~>{=1P@%d+}KTsLVL@_P( z3mj8Y?V`j%v~OCC3u;dqPV#M{YCIPinMXT(E;rooPAsQej|kZNYNx{=&?x~O`sMfz zKvngts&*!Wc~$tZ$X5n1th2Ox+&>CxOmwf;e;OU=T<|TL=rkaSbs-$YM-I`@+eukZ zc0`9@Tu+9!*kIDr1{a4Gd3sto;?A>N1@@nng48!!Kh8h-JQJeg+JQn12#2KMciL4y zP9V2p{&Fu={q68RfuYRmR>i4ohn`BNdzFtd_t`aI&fA0IzP0ag?Zkbt%Hq$lVnrYD zXEXSjS}eB~q7Or(iKb3kU1axxYk?CEZjU+%+@|s|6WL}M`>CV5zYr=n^75PQwj@Wum%V-=u|=clv>OcW{+b)IsssX3(I2S4%> zi^fp%E`RX%@Op7TE$pxAHRI(GO(W5&=_=t}wLl{*O(EM#t8h#%MnTUZ;LTe0n8C=0 z%IGN#qYoVgBYCX%-A~K}jK0{hteCI9+fwW&8NTyJ92-l%jr`nW&-~Kup0|AU^MA%y zmEmVQ#Gkd~_wh(D`kB9gpRmW0kK3_`d4`Xdw3ynGzaNG8>t_K}OA=f|UXM#((PRV= zlfOQRp-3=#GxNi1@~L#&B1HzSO#Xc@7@u5liKpPLAoZm{ofg@UX3El7InN`H*Ef|D z`6=lKmA$5&?i@Qe8sRRJKUe?){1V+tdfYn8aJ?3&?+FBlV||zi|1dlpJb4^EO%XCH zfC-uZ6tZX^vK$+-S{AZC9I|;FvP}`XD-gQ>DfG}j^f)&3v@G;|IP~&3bT1PJTQKap zTG&m8FkDa=et8(-NEq=+7$Fm%0B87Jweb56;S`{7s`7B^k#O3RaJrN5cC7HnY7tKz zA{apt_>^3aMk3fxA~-1{xy!>F6C?N>A_YK^eC2FBBavb!k>VqfHHnduYEf?-qHr8o zB+8@YN1_zf!jbM#?*yY&j3Xj0-Z5A-S8{AkPQ$q=9J&8$EhP0nV&xJ#}jbqRwkbc4F zSu*G_6EH;?Ivx-;1cFYlM2(F==d&WGDC3v$qUO}%*Rvuf!{fJ4BG*RZ_the{C=-q; zBlpx2&R4=F!V|DoBhE$=uE&L8C=+p4!*SFT31!1>#U+wvgOa-w?=r`XkR?$B#@ta) zqRz%4iA$nHCen;1Jj72XV@_s}O*k@6rU*=CLdCP7l1W#SIb`FPm@p~0vMIbMD1TrI zmMp%oY%CiMk=s#IXAOm^yyajJqziV}X>ayj_@C=_m-rYZzcL#33q zrA?Q|eIAA2(Wj5dq#MXW5(3h@%R#22;Fy*4R!Yz}Suj8*que3ZPCd>uD+4hCbXf(d zU}t6u0=<|)7RH&epqPNbSiQE)0%L+u6Ci{>%bPMfIy!C zA#>YDb30FSyQ%Wb`*Hf!^9I%PMy_2SMdpo<=B?Z3O;cfD{n^wL>aay*-V!5hl^Is^ z4YuhBn=6CuQo%}gV2AkdNdfq&EIjuc{L%#0R|dx>faUDKZ)(6A1rYeAdFkH}#OOS% zV#MvBJm?PMeh_Ttc|MgeEcRPIZBAZaQ9ivBx?zA*|OaG|Y!A%75s;923b2d_nhi^K?ugeqRW0vEkDEs`>okU1-2IU|=x7m-{q zRuZOoFIT*$SF9XVtd>*U)lmGArT8 zTDT16Sq{o62alCT&X)V;lq9hr4PPPwYsDGpa=Bz=jwv!vu8bACBA=zAP_ANKry@d* zqP(JfxvrvWt)fPweDYCcgIs0PS=q2hWo%F(+O!fiQ`tpO)x%O%D^WFIS~Y~OL?%^@ ztx-%6ROVl+o?)q;ldDeGsa|3!TnVaz)K#~kDYtT}BOlf5Y2+Ue)cAYUoIId9Gp%u* zslkjPuB}%&O4O$1Jh%m@wMnWasC+=QUTbu%E7HKdB;|n@B zN;~76PdCVqH;7X=nzG!L)NITMYy1dkJnn8(UvJF7YKj@V{a(H)&8kTs(6onWGHP#1 zpKkgrd`Cy5gjciK8qlyC*8F3S zBW;5eAZpv|M2NfO+hKGaY)%-`0g-|sK*tCn@fcwTe7fT~3+YT{et~%B!a30rpmQa+ z^C1E0Ms9u~R#%5v=Nl*PT)(UqTIix* zd!s*@Zs2h+!G~b@w)?>K3IYw9-h}M|3!=e9xqcJ! z-H?sK(D&f{P4}UhQP{>6elx{e8oWO^uz%O{P7BL(;J`_4J63#Y~xK7}6 zLHvn^Fs^DOcw!`53kQNVn#4BxeS%nujW8p4G!8LZR)q(<7)2=b7eIR(l*gdXV`b1W z5Mr!yVvOoy?1lniz36zX@_17oUaMAXBtmR3e(_vYC2vM)iD#ZgaR_ zbe6oDFxeS1E4fa{Ts^xsF?*MNmJ`-Y5z_jcy}rw8PC$EFXmdnla?W?0(2;unzR0{} zeB-3cymZL4>}EsPbkn+feGlovyUtma%|WEgf>`G~XXS#@ZaD34~zT5Rc#=F+;;lD%Tf`|2fU;w4wbw!ZFKpy={|^0H^{lKkU=%N!*gxHFo_DYQFN{|K70eYoBh$w-$EsA~BYGNt&vSA>s+Ag?q1hFbR zjt663j3-?KDH2UQASrQO%b6Uk*c|ZKSQ{a&+Wk^7uDsstx(-)dO{-onH|>ufBPt`t z@4dwIf6H4R>qb7;s*S%~N$TF{Q`~T!B*GqFCp%y7rrlWX?9-uHo2;!-6|J8{Y%Gaw zg-f4aP{w6*s(^x#PP;Dgeh7JUC0 z_fThQBa80f#OUyX_`q1{@Sye3yz4-G<6t-Q;48;QPU7J{WJ`N*ecEpPgG1NS6|IW3PjV zrHh5L@KHQ!fBZipwyDwZnNpui`llMw2;B;wpAp;G&ZHI{(kFrAl0C_7M%3@KHQOR) zT7Z6>A&>yPxi&CNeRaGolA%2T@UoX0M3(XPlV~Kf7CuR4-vdg&PFBYv6XNtwg(epV zca2oC=y}yek;SB+K{Hg(ktlc6z1#T zJ)N~lbGbva(PCg$BNSY^GZ*bVr9lZ9k)6FBE|&mvE=MiaC%mc=s5;wRo%y7z+H74R zzO}67b?ceyc}C1)c}7Bw{YAs!rf^+oO-Qv{?IBspd)N5o#?Nk;C-xuRu}dTqUC(Iz zBRub#G$jh)h)G9y+*bTF<0q=+pX5cA+@Ryv@1997N6%jWKH%vae_a-q!Ps{}&Fk0o zctkp4lY_;ddh5}PZhU$lD%MLeA90h2@_qQ5!7!BwS#Dzk5k;{R-Kh8P%2Cl@sv`}Q zm8r6#fS-M{4EgjT%F{q!lhwN8Y(Ms;i^;xbGJsgey<1AC9cOBN=g2*<#N_@IV-lJu ze-GK8{3XyQ(891UEoHlwDz zfi(6r{?EivlY#ui{Bt2vlh5ZPRAJl;F<)Id7vt;{*_Yz|Xjzw&fiUKk^b9ek)$G#C zXKSz)+NbLUL!FN&N|xA}Hjzi#&$g;>kv!e5Cx19U)BNnkSqO?BBMj)2s&NkJRkeI_ zF!+_^@!_Z)NwV*xA4b$;7O14-x|o4Ua9S-@nzG+)3DvgQ9h%ZIKV0I_`g(fgrm1~N zFpcr0uf^UqWWFgseeEo%_9n3vJux8h`ZMV|eD!TliuS~t{H=Awj{MtRbc9K`QquLe zsS<&*GLTkG#5w|zJPNrYde8>mLNeFfT+i0xV%XivBO#0is0{XSKQ|D7e>!McO> z9{c@&XG!5N;=th8|I?CkAc*`p*xy+asGu&t=1)s%t?w*o|C=S1bd5F)|6xhhV+)A6 zKP<^}aT~Jv%aZbTP79BJS<=lBDdk^xCPju;ncm;+got|K(;#=gzD|~oq~~>1xw0f)(59Dc zF|%xzLY~P471^2!>`Mdvezwxpo#~>r`4zf^O}Ka)Gme6u5y1qJ_It908jA3#nxpQs zMDr19OsT}vU0@@mP-($K6$-33=DN~4MW&+0yxwCI|Erq z=aPjvn;G>4o)1cQ1+UL%&V@|wOY4b>XEW$yLL~1S&-=fy_MeMj2PPvtZmyo@QW|rLhL)3UOLc-J0(4KH4Lv4Y}E{EhuEg;E%DngW@T_W9}0FR zOk8JPPHeo3G=!Rmq%0=`PG^@>mgyWjQa^ljY)^{~Oflw#{8%;SN;JV`va*O#pUFx{ zr%Fl)pIlkZK_oNhc;pPG&*$A=99@Q08mi~;*UmEMrZwJ|X32?o`e41F>bXX4W{WPv zMp6H!?nd!60M%YH{sW9I?bIbO7no-^vM63&&49tzO9-Ybwwuo;D-qGgaF^rVWO(I_ zpAa7=Mx~G zU9RGvT8h#7{@i_tzKqCw$@F;2>WtogF62eE>ij1q#qwHTaEJUX%&6L7Oz?9Ee`9j! zq}`CeUOaj>TXpk@I}wiUv<|WBY*>QbiWl01okkRs z>0C-b+w8gXQ0QP_%3AcWMf$TWW^W>r*ya%ZqQm8+#CZyESOUMYq&7d28s^=u&p~I+ z{v7xxr#uNQ>%i)w6*l*p>4#kBxA3nl$-e&V29D^JCDFreJjxT8cE8qLXjyttJ$`*d z*uHM$;0lnY>F|t`#I+LhcXYO9+B1eMT$Ot3 zdr`Bx!2RFB_H?_|2XWr?^IJWjs- z2Q&&NpXW z-)@zw*FrYZ8Sl0jntEnSW1j6ivFQxxhQHdbjTnvRQ@=4&4W1 zBfTXhj{PC~#zmp*+t}F?xxxlXay8a#;S&-aMOL{O!1Q&`s z1JS-AC!ajnm@smM9Eo>y`VwT~JyzOUL1C-m10ITUtF)w&l{2H1$e^JnG{0 zmK(ggyO#D`W z*v4yo`CfvARk?BL{%o7gK~kE!lnG^2Oiv|i-W`uNZ&EZ5Z|4V8kj?Cx+-%Xgvl{++ zT<^(?VJZd1#^8#q5~Lys^`T@pbU{V$0mI@Q!SrUJou(F-DMc$yC!s+igqIf%>R9_; z2Qyt`14Cn`!vY#kBX}yK*t6El4jv5qewdNwz%31H3K8SkEY6=WGq=2o{ok3_ zEBaKZ3jmL7a2^%XsBxVlax1o;+G#AfY%X!NPcrPit{yTYaqSwLI>okcbmX$KCm)}_ zh@YwLP2tjht~vF_=QuAf*2+UglbpQexPiA?9~Z?egu!-b-7zDLusjc2epy~+oo^k( z(75pASxWI;ZX1FjNH@N(?8yw+!mHN|6Z7N^@TKGJ9LTd-D4$$ z0B+7jkKN$-dY5`DyUwN6a;M%0at95gZ0qo7&M|m4q7pvXEsrlOL;*CwtfzGmtSd&>1Nb#Cj07GT!j_Jioe4u=QX^h{Cwy5-rVH(I60Ksz3FE@EZzC$@pneq zl0o;vkMi+`Ph2Pze1Eum9V&Ry8D3kq@@2#&Yw_bN_4f|53Ba`tv&U6Ea+OsL2vW8) z!u}Gsj2j7bO+5+-pLUuccTW9;*KOxA0t^I-f8Z~4g)!nkI&i`f2r7#WLY4(p4hK~q z2h~yl>IDFep8(DFfYw+5stnLR4Cp)tbW;TP3Iz9m3Ldl%9*zwjEejqW4o39j{MVMW ziYq5Z`d?Yna42j#lKx+oG!hoY87XpQNireVq9R`kMoFrLhHpnogQB zxacozt_J+!5b93{bj$+g+x)a7KLpT|5}2|F^mPFGa>fQa#DHzCEU7KV2N4@F5*@V{ z8zUIw%?XMVj1IN|#Ro)tAwbEXDCh|&eI&}0GcJ21(%U8uCKHua9#=pa>AV+Lf)`x~ z0zXv)myUp0v%s}#(YABoMo>hZ1LU3{q^TT29RTSx4nws;dRM}_)Sx(Re0?A&p)qv4 zEo3+gI^7mJAsCM*$T#Bds`As zHu%bt8bKfi+2m;Bn{e=e9EEHhs!%H_5G!$n6fy zsUObmXU-|Voj2^5Q}ZcrJTN;WB5!&XlU+HSH=msixD8v*&MEu^TUXCu1;9+Xdse*NGcLXImEG77_N(|(RziJfUNhvW!mzbXw9b=b%LKoV|m7;Y^wFwFx z)=Cidr7l6GZl=Z2^krUhWj>~uG9%A2eHMnGv69cTKP@TTsYLi?d9-Oc@IeV(a=A$k z0vc4laSeH8Nhxy3G96?_5Hf46yr2%5XZi%rQl9nbrzI7eR>XT$l*=J1a*)883a~I^ z9l9c1qO!>e*1}Thn^cL`VCo2}bh}p7bC%afP~oamWp~Ctl2c_{S2YpDF-1^q_Ne-s zFxNswvAIX}XM*Qz1Z6ri)oK;IJ1jLHC2HQUQHgigToPO_v8n+O+&itP$y3I`h1B8$ zYDITyh|g=W#__R5imq$c3a{Z4K?0ROWpiMq}f2e zxyZfQnDDl#S$^?!vm-UxH_hf^@s{rpGP`qxLvD)&A(;zx%QeE*ho)p+tcbENt-kA| z0pl%KkaUBEER?XVl&&oTLK+QeEp=}T29Sa);mGN>NC0V)SzDPn3KK_~p$X5*Mdh%P z=CPv6vCuakkQR=^D!-shsY$OasiGadb4pUv4y&TOid&+aa$76h+uHynXn9!mbbA*e zX^&YuQXJE<;z%;op4XVz(XdW3vEDI7*g36EGN+lhVAkm*-@d}yQC-_PB1Ez^p4&{< zwd724klR`5-qkZoe5RS(GTnu7#ux1FCcfw?RP!C%x#Q zo9NEw?76GebDt)6HLRx^*+cEpN=VboNz|Jm-g{_9_$)7XF0pqoj*v~XE0wfQoUJcS zypLClke@A2Ft2Yjn^1J4mzJhqnW!gKy#KX%zf>M2?jKZ$hU3r$b5_<(CA zp(-0(Ew8V)dqC&BU*}>_Phrry{c0vLvnY|-#Ng+PL1!pV(l1DoA|j?#AackXO6bN6 z1rp)A(+qo>_jp%z4Ok6ZLWTpYhU2@3LoSBbsYiy)h@!McVy#Ai7kF_lO@r=T@uKKq z($RN>_^Dc>AeT`Y$S8Dz2t7`8Wl8a*V+Fx@MOtG+Se=vG=t;!bYqOE+iJ?N8ap7^I zR?TtnIZ-QgJf&(pmT0{5V!T@c)$7tStvn%_J3ibo)KN9TdQLPMJZ8#DJnPahuQjRT zGP!(FH(lF0Mbo%>G08+dwM#UZt~IqnLu?C~x(^_}vZShusYQh;?9PVOyr!FqH7jA$ z_^uO##6!fF)1O3$Nt*CC)YRImwZ;<^>AhN;AwHO|?`n^RATG5rAOEa~P9 z_W10h%URC&Iw#S&w_0<2o3(3JH92{eo85B+=X2u318$=8lG^hNPV?2^d0C6bCzJDv z?DNVN%^TZQ###$|RtqZa^XjyH-zFBcJBj;Dhsrca^tBh&To;Yv7qt{gTGkfRO-a77 zHybK0y}Xz=p{?6PRLJC&A9XKLv*Noe&ZTfJn{E=rgNXg(mt8LVf{FXy6RjL^B3InY zF0EE#<5xT^mh2{1f`WRi&PW2a@l$DgUv;cpY?t12sj{M7O5a{hvshKWBQ(yGDgSuNLI*QHr&jbC@n>5^h0ZP;Axwpecw!))}^HWU*#4aaXZ z5^rQ;t$5RtDwuWHJCn|9Z#Ko_FT0X*=d|O1Njool$2NzS*w^;8QCQd7iFY=)VQUN< zTe#ogBodvZ;ajKG8#(UVcw{iDncVv`+a#8ox3)G&J#yJ!ZI4!O<#KNM2kuZl+#=)H z@y6eMM6$yG-<>qteP+4M(Y52ryvKuCg^BNa1@3jR?+RP)jW6%L*xJ2Kv^UbaE2y+u zT)Q_Wz5g1%Bf+shoVhQTuu?L;|H1O$ZRl=M;=v&9f$G$9Db`^>^od8z55YMBDNN_!-~<$N$l_RiS(wk2%RAJ*^TyZ8SQ~cyXLHby6F95<;?E zgLPKTcvh&ibY)4Et*41sU6FWN<$qT0w%AB_UKP65=ziMLbyg^S-UMH0o<7gQz37>m z?^C)+FuI6?A9lbO8(J?WNRFD^&j;Y=&9&zv4^Lo>mvd7`Yb2L7%V)5}%N@7Xw$RHJ zlJgcUT=DNbe@w(rOM-PKRbD;)Uow!? zI5|}}{>Rh*!F{W1-OHfS?VYMk;Pl~<_x{hP|CiUXaN>6PW#T35uRod5z-9jxvHf^k z`Wv*7?iP=BMJr+s5k&VY@VRQf{_`-Z_lwvo`Dw}FoO-Bzg91aAC}x{p{FQ=dDIjq# ze5g?&V|JL(_uc)ryRF?B${tiubsXcXe__Df!Kh+W$?P|;wVRMCIdX8LzD*ocoB81= zhK@rOxl(ri67#0&4&3(^aux144;nP?ENWMOyKubQUbgeB{wdKzK8p7{x-GFhN}ihB zi~1-RHlBWY+i?NhokFH7*f{v{%Lj8EWj(T6<>wj0!I(v-@Tl|$_KmsA*5KcY3|XBr%bY8 z*@QCs#BXSg{UcO<)X%?FyxkTZ_2R=y+7ngXfVoHwYr$5a(YxD=;+mp(1|Y+9rmsvo zjtl9khC;kc@us6PhN=#mZA;Nc69LbFo}C!Aj0AOBW`ktw+v>{+A-lN7aS_~cDe9rx zr%xhHC<8xc#DAoGtd$&MVw|Nt>d%~(-P~%DLpK<0l1thtYwA-{9~TpVj6<2igL`k7 zAykOZO!Au-19Kzrv45<=Z-}wv+Ic9*Z8!}+1#6d7^MSQWhYp{{mW&BW!Ack7AHd4W z@-*1>gOkw4mAjoms#RO{rfSs{n`n+gkK&u#8Q3J1S$dc&OZosB(ExrX)}x9sysb2@ z(&Y8#je7Hslg9i+Xw^;bFTh|zrte6o=C%!U*C??qJ5R~yc7cYEJcgo+>xG>cm#q8U z?d$UUJZ*A~TIAGWWQawm4jv+n|VaGrMj!pZx;1}!;(F}?f zf(sPdu#-@b<>m>1$dz3v@F>{g)O#HY6Y`wN+Z1v`SFt-e7k5}xI3!HK&VD#;YzlA5 zT(FCD=o491e!E2j7ulX=t5Kr+kIbKcMr%ZVYt6r;HMW0g&E-F%G3zj-wdS|h{Lg8P?LXEU;on;GTWkI| zY0djTwPx;rLTki+X$|jht@)qT8i6aV3BvggtqJ>YwFdHAYyO{U%@xr6duR>O_1{|a zTWfx6&A+$S2>cUT^Pe(*qQw6lw5H_`t%>`sHUD?5c})6SYkq6ZUul0az;L18TJtYy zjpJWhv-?kL4b5+@`K>j7XpO+Xt~HatwdQ}J)=XS!P32!&^WsWt+{;QHNUmy zx7Pg6X^qN1)*8OwTJu|L{x@k&mDa5Noz`Go|L<~Z z2(SOnt@(eITO;uAqBX(4b8CL**8I+``8Ut45&I{!M*KhJ)(HF?Xifj$v{;4w8r8uty%qNwPx>kZq4tJ(Ec0=jrd>At#SRWHUA5> zX5dO|a{tmAkt?ln_^ma+wdVh)T7$J+F-2N*zm{Pz$fKcR`j%ALy<0J~!8`Rcr!YTk zLfRdE0?rTjq+;E;LYCY(zhF^smASvz%v?T~BY(WKFL9sFJu2rMbq5oJ-iQv01yVo4 zL!5N9KooSDyqE4D3MM_IzlMYBvOM%euP{WB{RRt7!+kX@R8okIAl1a9G1=3BtMSpW z`yp$R{EIO9h}@G9==wtm@$Mdr30_YWeQ9>n*o^k=n*z{H)PW0WKQ_RuD7Rd-F^fBO|8OWycSln^p zYqg8SFwJpTec5J^=qY#re?8C5CClS;p)QxxdfQfSD)hy+!|$SdJ(Qa$+sHlXniwAos3dbaQZjlt7I^aeP|f*y-td3Q9gBHaaLtqN_?<$8 z*VXW9HbY)wj11zqZ)YT2I9gp_*n7X`rNfr?eqiLSc>IAW*Sjnb+&NF5M(qJC@< zr4rQe1JDpF`^?Bl!QP~)F~Gv`NujSolfCH|X{)Knxakyt!DFilMhq@6_D8+{_c zmIEFZ7Jz@wgNOiirD?XRjjf|1YFBLAqWBUJu#B(%~f z9C6C1Un8OYtg3T05}NF5q-Ms;V;*6U7OFjDX^0qOL`Ok_F>Z)uO|<9MZlL9pDb> zri8u;5bjWe4mw2p(?LhGp!qh?$rGp_0y;|xP1%DkIzW9n<5wLZV4L{OHi!=*es=^M zwHJRV2=V4jI28m3+az2DfV~h2*l}?eCkZ!4<2*SN@kc@4Hi^Wtad^nY+f*Ruy~O+Y z;5%_izG_M2qe+0QBsz7l?Of91xY$RI$=?N&pCFT+1CrTIVwh3M+^aDh>M43{7(Sl3 z6f@%#5mb~wc8WMET2v_2SddS`F;z__RTe+)O<<~`Y_uFzn)peIl6u-Zsx%e#G)2cW zS*jHEz*J4yRPEC=399s0s3d*$bVF2%QCzwZ)pb*o6!X<|ZmOhjfyqR&8G%t`K}*9e(HtKaPW+BH`zw@XJ#;)&m5#Fyguf;uPmPE*OCi zM(F9`5T7APALR3tBkpSC+xQk@b`F9+O6rJ)N z3yR*YA#R-%eSGljJ-C=}JLKb7vH12A^_=2~FR6R(IuFinvF-bIP$eO%xcR#YVmSw2?%QoW@<^yo{-7cWJ%QBGkbE)s*YlvlB%-K zaIKEenex$ijn~Wiht!nM0QE9C^-s(w*w*W#u`vxS=j1%{4HBjex7W!9Ayr$wbt0_Q z_B##Y0FE1+ja99E%zm>%yWbm2Be>({+DkA-iGT zUFzPA3neAk=ql~TawhCiJ0ra_QH=c3gBMIn+0k8Qg%!Ns^A1e<$fcM;q4x9f3^ za?)qUk;+&s3Ijq;B>x|KcNG-p!>?-^Ndh#`G?E0@B)A242qD2CA-GF|I|=UY z9^BpC-K}w##-(w$Mtb`HeQT}SH8oYU*RH9WgT1Rb<+OQuuYP{F>TykP=B(&3j`s1a zF7uqS9L`Vo8bnX$gmlInd$wJ1#;UCP5;V_hj^&UxcWX0mF^YNBI`1|L2YR?y4}cbY z+yTO%#TcQ*SO~x`e5yAJ9F(@OU%5aLiiJ3dmLs}|xO)~|21p2BOln)CDFLQqS0jpL zk64TO+RJ(FfTHmE{>=GOxjN|C5^oAtwf20j-g3YDa$eMOvo;n3WEoEY*co0s%(hY^ zv^3xjiIW2ix2^O=jgDzIY=9vCEm$+!kSs3`|fLp zqpRCsET!;;^W(*7(Y0&$)m!a#VGsb;wg#S9Da8gNk*}kWk7equ6954i>y{9GjUOj1Sy; z&9cSeF*29A_~RH`3W6;#wncTaB@%%l#tVj0Qk+-CQ{Pyp`CcP{T) zY~w#+s|t_El<&Nf-_(v6UbR`cX4*Z#0{)EHF^<@M3EVbMA6gUL)|cObFaho5ht;k2 zOi#9*J%-mQcUrLaDzKp5IzztlP{)Y9z=*+3q+N3`)GG`a3Ecn9vJWlWjZYs;AfIzD z-PcS7rk(63A|3c!L37dvpqWtJumic$gA$!Vp_7As=7XyA;Z3j2I;%sDR$x>4Vf5JH zg5^dB@MueKOR#ja;h*bggD=XDMotb#J-`Q@@WF3kTYam*S^0tah~xS2^<|HNqs$Ek ztP|QJ;FkPJi`B_M_{sj*@sZa)Ch6*_FwVI!ct`%UK5gyRWAxYtY2vv9F4uK^c8Vl& zilV!mqj>h}6zJA|`WVr9vwrrQ34p76`a<{YTJ-P|6N2J~LyG9>z|V8bAOsZymzl^g zkDe)D$6eG#-{=J*!Ncl_bD7$aCfEMld7hVfDKLIX5Q+0v;gYDL=gRAn&-#k_^g?P4 z=N(SJSV#Ml=#>QPwUWX$^(hX<>A;86Ud{3AZ>QHW;mgXWI9L(a<)eK_$k*BxH|Ev= zR-DV{&Xe>bprPO`FcR>mV%2Hw5}68q)M|lK$pk{oZG0mE&YmDc_~i5Y=qvA=e6~Bs z@f%ADkTu05ve+d0Bm0S>+#6P-QmYk_}%Q<{SL#^wDr|r z%O|1zr?ra9a-^qi>1R`G*xvY)VA1p8_`~t(Gk@??5$K^>1g;N%zQIBNj|_UC@PB5| z!-EhRbbo>W%Altu{NFO@RlNU|L2sxjh(T0!!aDP_5mlY+0r-D*&I`rFyMtc6e15TTv~ja`vb2v{cCr1OF%bUq1Th$95R!kk}uctOfXVkrdj=UG+p^l z!BV!t>GF$z%H^6?v(|C7a-U#)xVy#;gejJLM@*9UV{zbMw61su0liN0X5rnf$H?{fT6ppc?|xH-LS2&Yh> zeuCXV8p1qYg!HX(<3FJdeMb4HwC<}!mWV9@_|vQBOC?sQFNY_esOP`=B1oTuD?Xy&sBJ zERWr0p?T>{6Cv+{xAS*SHVIQo1t$9auZErJu9?mzN`Aay4AD%IO?T|C@5=@y5tAMIvAHKFksOa+C3s1lJ|`)F zUow~T8{#5w_OE8sqV!h)v*L*IVFtwiE-v(?e#88+Mdj@wjH%5hOJ)^?&w!(>Pv_E1 z>HWz>rIodFM&>nIG08`j9EeM3(c_=YX}&F4kr+0tmZO*FZJtP46-)wNTQw7xkDN5@ z!2qm&b9i~Bwb0dv%+||f&6$?x-Gqwvg{99nU0cYcY(YxbBbBabG%HqZV0l^g>hH&g zJFrrRKkAac9^{_xXIDm)EPjo5ZKT={ z{dg@?`^PloHRq@}>u7C){5V|DX6AdzoWm^tSJ_{4!b+oDQ@Z-t^~MH~%#~`o8Q~gB z`a)k{GLZzj{ zL`SKRB>?L&F%@hTMMczl=gwVTNhXGz0wQ(ZYYgIiBl<1HvKw0v=eo<`Fc5 zpML%136RbG@+D{ROZnEvh%h7mUFsoe`54;2U?U!v>>+upDe`ozo%jA!(kd@d{(Hyb zc>WJ){V#!**?)o7&HprLk^G|{S1;@MQ00C z^9+&q3JvQ<=4cItBjdz6o;3%5Z%yxOVOzK9Uzqi`;Uu3&yI=u?$=bQCN?OPcAC$Gq zykO~A(FD`7irbHJAAS-YH5~PO1lnRv51SeT}}!qXmPo! z>Xu&5&B>0A%-{NxeMH1KAlG0Mk^*j4=E$~`Wl{zF1}}S_(La+vJLJHtZnw-=YpiJL zw~c;0CXFnwvGi^sGl}6ch`vv{%v|ieV$*t?-m33zo8HR(UMQn4-+r5cH%^UHFcTn;iQky^N}SQO{DcGq2gJP6>~lP;bU*j z=HoS!%(xKzx?T-On3Xp)L-w}V&9j}QA)_4Yp(qjVF|D8=EOKAo=n3Cla$SJk?Fl_R z;n?L*>vEts0^nqzx713ydW32ssKSbG0a29fP*nh?4%^%P*tHi)1(;|aptnOL%j~?o z0GxEtTlA<@bkDAC#l$oJ2FWY{k0j!=6cpI7Ac_({Ada`X87SK7f5_PwO6;;3Ak``X zA&`t9udlTI_U_f$uZ7QyOQ2x&T7O`jiUiFKPMChF#8smcKC1^xh-t0FO`;PftqMwn zZK*$KKM|Y9043bHv=47_;VTC>D9Srm;t^d6Q$QXiI@qD_O_39!$SQ73v_&7`^4u5k zY!rB8(vK~WqneaLI!attZXYSp5a6pYN_>%n1mNS~aB$*OU|Z-<_D_;SUo<}ARnFuw zzF8b`d&I*_B>2VnL8@1yF$TBmNB##?waQOZB~C+e9~c?fq(AasCWa5@bF1TaX(VqZ z1qbc&YO?qJBEI~a3EJaV?UHd^x=4Q6yD1o6C6#uMm+l$2C#;MsE}V{^x=#QVRhm@r ztjEg=RNVWdUiH-;_98n#5&Bt)eb9iMATwcR?@Rck{P%p6G~Xzwq1^Wbd>r+huV0aslIq0^6~hk{sqAKoiLa?j z;93VpY{V}L%EgQI!p%OFO3&pmAB`Y0e{{HYyzD%b(x+X8cG7$5}AE-(L zJTuRl8F{65&bM(Qje$Qx2I8?0U#%&0MD0To4*jG`HiOM7j2^13xDZ{|eQo7XK%#TL zWLRy=b;{b5f^}W&NP0YaYPE-}flT}+L*X+k$B~SlEmXDR%Bf7kJ4^dBx)ae078^J( z&~4rMYA(Iwn#Mg8cLQA^vHSI(uTmo^8?TIKnk_4((f`3}e zIuAn&p>|}^KM7L)j%c6sCv*r#L>TaLAm#i0HTB-*cXb}M01gCgX<`sN&Vp;pIFe7p zjM;oq+kwpIW+(utDZ0jlA4_dkoBobdANN=c=;AMhr7@Qb@%XBunf`lrZwU?;>(%wE z9Ga(nDP5Y9oPf{hvX&Tf)9SM&Hx4CY;n=kwmhkfCWWBz*V{4Tp&$f)&bCts%4y9|6 zIC~;AtHMW3>1kUg<|wUe9%Pev@C4ds#<;30jt@*IH3|}K#2OUBxorY9SDHWY)E9g+ zHFu|8a67NBC3`wC)YM#!`5WLP1-5MIwO@lA^OTEVohf|X>R$fEqSd}|g3Rc)u|X)- zqe+IngTm6HhWoNR-qzM|%W;cT^;OLird^KKxjBf1ufH$LHm-n_==$$#`rJ<;AvEH< zGxC9>vEf+nzmg8Jv-^(+VqGOg=In|)-m%*O8GhJo$0|QKPs;&U3s08_4ZbwYj!Y>f zlNlb0@s!VZ$Yb%q@3JCI{ihNm{&+SR9$Ucs(kCS-YT(%?rWt6fmt&Z4!cYi>$mPrR z9?Qrs{AZhN3AbUZR;Ti{p7Y2K|4C-%sG-yBi@%OcyLrHS##?Ru479dsIKRu(R`)#r zDX=rW)TIS8_qzP8QP?a&+M;#y&6zOz391LCWq~x+4NT}v;3;ZjeEH2i&EHS5qAWYC zBBOY=!WHIK59AnMH5wX)bGfpgxRyV`KvI91d&k|f|8}gDEW}G#DP!K?z}}q(dNO2> z(}u+rKi{DJWQq2a+yz8rlEm*4SkE(IrDV=DiXmmif){4KowXZzSR8+9Bu z{0FXC^zXDi!~&XTnT;j2{IUW{-!obAYK0;ProUvgSJRBq4@^_0cXrZ9?F#hnqw`Eu z&!!6U%A@rkR4eojvU^P%I;dK`5oC1zJ{qbrC>E?d`!0b{Wg{!tr;a9#P6ZVuBqN?W zCsBjmAmrgURS})G07}Tmix3m)P|A-XVV{Bv34<$rf?DnZN2r4u)Pi=q1IrTwu}}jC zoC3JT14h*RRk!@d6aDOI{HGIrl2QHU8@<|le3l12=4pJ^oZ#-KTV7jgt~ha?duqv?!Acpz8{2TH%t5EIVk z<0R?JhJhhB7@(*Y8-M2iD=2{98KdMir^{VzHk+zEUGV4s1TFddI7OoWC(yc&*F&Uz z{u8uJlKz_g8?^WoL_rC5dT0;l4{-^~S+&IQh}0{@``AL0ZXKw$uXp${VP11kt> zE-+{=bY3d_jR^cO6vRju$o(tuWBE_uCts|y$oQZrgFpWhL$UfnPF`_-K}hj;vz(Hp zJReGw@{qhr;u7WJ?7HS$@{p1yest2x5@`(q+Vv87GxRQoQUMpi{*YYa;!;kSAmc=- zNCtBWk^3H&V=ljqlKiM zyJSpBRZ#I`+-jtY=2l!{q&_95>A$Fi-eaIHr+OPzitz(5G*ha2E8Cj@IG7pU^i|jQ ze~DYFNSCX~AF3!xs;LF4-)UBVaIL0Gsb*-YW?HUhd8lS1sre{S!>L)r?OMZ|Qp4X; zL*a)i{7@tMP-B0I`dPE~i)*bBQLS`Kt*|-A*N0j~&05`|+8-meDEM`1Bz2nVby_X8 zyD@coC3Px`bw-DE-FWpTm~~3(^%fR0h+kQ(cfhPIz-w?aua#48aAT|ui)rv; ztoyv!;I~}sg4Y-%Q_HUoZww=$4Sr}8(TfQaXyQG4ABEZUMye?ek@g8~!pv*RTz;1( z(ERYCIje;xC#5->Q7(VExv-=;w?w8)prrz{rHVwVCZ#1FlNy0&!MQC>DbxtiGJVn7 z{4dZFHEQh~X&Dk|W$kV4M}QV)8_v5nuq)N3AAxhcCCkq4^hRxwYT3(FSq0#EpHRwiw7X4#~KzBC+ zv{+N&9hB5PC``>%%)@#;Hu`ZMS!|gG z9K;5Ghp{?_4OnCiU|6ub3wBr{58jS&`i6Ds>kpona0izTs&ow=9ujja4*j)2tv?%l zhxIx}aHwn@HIsBW8*5m|b|~L%IB^A#+}f79GBkY%$RQo6K0@XA2egKZTZd;;2+ALa zOW8&`nMRmwM|#6XN;5~0O7Yu{Mv6h;F(xq8H}I4NxCBx68NnY}Y0Y>9uP_Z$vcpH$ z-G<8bM(1Sk7fD+yS4Iy=hlz2=PArC+WXCE6@b_d}YAeU?WQX6Jk3DJ)Z842shT&aX zjPIw8-?ffEfyZl+CXli5P>-AI^d|7ga4{g`b)6H~X}CD<&A7~yuds1nr%fb4)POjyAOG%^72ZOpj-qJLkMzajfMUdMW2Mk8yrm&O3(BJ89y$Lh9X*;q&;Tv)*NM z?V<~|0yu%%_5GO(p6)o|%nPkZi>AxKSV-M~-eQ6~KtK`k$+lDg0VG+@^mZjo*8a)bbd?#qqZOU0E-rI4law7LV(vWmcR?bBp#+VWudazW>Ege6u7bNv?Oid70$ zU)w@%)XGBHN?zy6s5aJkS^Xq4B%lOq)^epj4FU~c%I$eNeIiyAI_L+sKtphB8;OZ9p^VSCGHrFb)Aq4x2$98(uwsZuB?CSQs*Ziu@>?+$1 z=d}9Hzll=52 z6Y#3M_Zk6O8K>wOXW8qg8}c~1Oh7u(-W$<#nA_Rg3P{!j64u%o(pv8ZbI&d1MJ*HH zJ54s=c&hQsCw;fP$x^+G0QJ-)5%+0R4~TEn5%1t6k6xk$*|8N)YG z-G`l*R7aO`I9Cdu%X#a_61qpvHeKmY{rC#!`4iV4L;$^3m+;R1eXr|u@D)P2%&eD2 zj&H0_2f84GNavTPp0_Y<05<5RfgBEs(z;n>1pPj}@`=1H(7Qu4ep*WB2h2fU6nBx< z8wHujG2{Da-^Q%4C(#h5)p1{BgQP?OBRa<63bl~lrTq8o_y>)&`k4td^|oEtpw(E@iAekWtHmCbHv%4o=MMQ*O-;{~ zO!yKaw=b_iTIbg{{z>~xj6wJFHfN7dsyE)QUS2Kl-rn8A9@Y<@;b{wPBx-V`=$6-b z47FVq|4RG3L6O9T@cIzuh1*wF(g+13(mtg0rP)%y-f|RMaGjuiiez(*{ugKk)7pnn zH&hoe*kKz0p8nJnPUgTI7`Wo6_J-}mbDlp**A>qi$kf2-_G*orEWY>Xkjd1SzAKX+ z{q3%CBC1yPYil?@l$&|Jj%YO6>7ILcrNgUaZqymaTF3q+>DXn{xGduPr>~@ogksPWCsv&#g>*3l+14=6J1>eeqQx zYlDD0sp|u9td%ckqt}*%HF3PhWal!~d`%v`xx;?H5{5rup< z%BTKjU|Kx1n>OEgzZ-As^P?cm=~YO4y6m~s2T9&%xN~S`*x%2Ew3K~K;*ue|Q_#F* zL4awlyHBrXUY#C;+52QW>X=;WrkBOcIrT8fqWl0qGfDEyrs9%D29!gUfK67)z_{TpV57^(z*P2>p-*97VS^CI&oY?!th`E^S-gh{C9Ofdfv(95~d90M98t1ebC2YsC z5BbUrW*G;px+#ruSPrpIUfw_22TC5-aZW>t;O-9f637Cav&(!>oPNrdBiGIvSo6Fj%-|1GeR&3dYKIY!~>c(5ZS;vR1=q#G+(ZB9XW zYv-&m-QOHKt`_5&6zK{(h&(lXnA7wZvN*3`rO`W?=H&3XpUw!lQxz$pWA(x!rbHh9 zkT7wM=8f_L#}KB9pQnuOb5Sz>0@Eq}p$q=f7voCakWMXjn;y-Nh%~}b5?$ynlg%f! z3k&mGLfhMJ8@7+zh)5nG2}yn>OHz_P=J{Svzvvf^Po&ufAwfix)ZYSsZs_|YHVU;Q zehB7{&JHRZY#B^_70MG0c&q*ucgd@YPKcCde+oI3gE)`VY-O1vdFxBA5p9H1*k>|q zXtp5iTcqM+4(03G0Wso>U@XC0YStfv68zP!-fp??jHd^sG^%Z)TXR2rO&pSQ!HWrg z%%$^P82Xls7n>!R$1tKgtlW%eP~?`!^ew4MeQC<}PfH$4>^pzmV;Onh@K1hwQBl`?&Tj-YrW*K(l6o!q+?c3!mM*chFJSq+FQ?LNlkrLK_zL)A zanpY{UlR5^7YK$`9dAo_=dBl9YP8*17;SO14yqRrY87j3Jl|{*hv|&DHFU2( zg2*%E)0{3sM{78~n(*9p9juq=dKR`l{_&nLC&U_0hdKG}Zn5Gd3hO;QOs`?aA*y~I zF!(xcrY-Dgdd++69#u~SmD@zy`<9X}%V*+#Yuz6-N3#)NsvI=#Px%Wv7VvJfMo)+` zpKg=?UA>cnV?88xGmJ5NIy>|xm3KUhbB=H27vy|n#pjIngL8&hzGR|HKVkKY?JI`*LEVA@nD=K(aQ{WAkSf2e^W{oh3Loc;Vw z2eZ+F%m58=A*uX98h>Fx;XziZJRx14OMl2lX~|qjW(m7TQHgKs&B38}Lwm?>W$&AZ zk*W^65XKxZ_n`&r#23wjTF4Lc$}t})yoV5&?eOU(BtOEU{phk z%}$bv*47D4Yu+7}oC>eUo5Kn>Bzw)#&KGYcIMA&-i*)O}FNnMcei1_oSM*<>*3loZR}No=DrD zss6?%?iG`QwBKA7YX&@aP6L(>T({NrXKOq!BC1whFC`o&f*6Haw`Q)iWwv8j%XwtK z)A~AXCYh7hZ>7=rIzxSKWnC)4ZV|BUl&?y6rmXNM{-Y{ZLq5jxH5M3j_^4d^v>h(o zcoNxQ>3ZH+5bm}g#X8=4UW}F@$Wow?!9O}DKK}b=X)mn>&fcB!$?a~rA{Bg;tIpvG2s%2|w-|uYj*>TO&Om<7g=08nzwqU>qkOBFfWTW6=X;R`1oGbU1M#$^B@> z+iO$_WctKVEVU>PfNb9jJ~gp>TwnJTs{U6}=%Ra1)V}G2RG8NKU6=o$J9;PmwfbwW7^pqX@z%rT+7Zu7Qz7Z zJ1{MXt$IvBbUOVO>Me@4gc=FG%tVLKI>Um4J=>MYUW6BZ#sozBX%J*#lKrH2z)<`n zdzFJHHz@HnS<#2__St zq$Q)$oBBYJl8;r7Z~%a==|*E%f=x%sgxZ*wEN7bQ1I`RCSD{yJoe`ctr`b#~i%@x$EUNatsm}9o2vJcm5}r%jk%re+q#DAUC-240FtYWrF-FkDX*8A=x zKX_Sni@-O2P@=y-T07MUO?9(ZG_2ArE6k8g;l2ZMb{?4&wpra2Kl1tJBB9Fyn>{cA zeE-{yYXa*hyxe)fQsp8B4ONR{JZa4I`4!qpm@)VMeUVXb?~83xY*G9BRs^nbO1By} zx*1G*JeTGiTI@+uI8Ox%GlxIO)(u&~CZld@bK`N%zQw*LNMzySkPqKoDRvp2tgNP; zp$<{QESs$T!sTH7WU4|lk)c*)FkcTRwUA#4Ct!&IYJJUh7+j`~{tKTG{uB%}(4CUHYN5c;*hlLFdRQ{*R z4E@0i9;Y41&#K;EAJh*}CC3QbZS+TGH*g&F>W^Y=bbgRd+;ld!ad|LBxR$=9$hZ~y zEPU~1%3O$c&3c%*-R|$(2d_;Zz8)iCd*g?mT_TFjkq!HSy1Spk}BtVV`#U4Uug^PpO z%m=Lt*d({h^_ss9Q#W7Otm3-i!P{$+l9Rj9i(iP`J=gc1398U$a~jZVaHe-~c?-Iv zEapdohF>Q*w#sp?X^+X!zq2!wfJ$`WPZhlVtMxHBR~#k%%MZT}P2yKn=G+9*oB5|V+ZBHp!H&!;rJhffMxM2DTf*k!7w%I& zvX5KFGWR5hY*)10tcPf&tt+~V9lf6A>)D>VnD(AEZ)D(ZeS}Ye$~7on)?7rWPRfY} zUiz~{7*M6iZZ9P+Vw?pfcWUpi@x-sul^lG$`M5|(c)uHLdNak7Qki^H{NzK)MNWIC zB%JL-rA*13sLY7sYgk9kfezOsGVl%Ap-+T%7i27 zhnL8L(dhdM%J%ft|B9C5JkWo0p7U_Pf6kG64K1LqfEWBVAR&;yF)+Y+PoR7t;3tnz zGFsqQG?9R>f%L|rcC^$V&i=gH{w=E($dT*dofxQSWbfZ-WA)CCRn0bZ+a~?(=$$V$2o5Xo{-!|hqNGvLOOKiw;@{dAwg`8xaf}6 ziRjVBA*GI?VP`Hc(cM}JF_scMA#cOtIz28`J^P(7e%5iIHHKw_l$LM3C)C2{oWd6p z!sB!pIBW$SbwT8>h&-#7NkJ z4DUqb^IaqoQ4|Va)C={fSI$xBNl^gjsJ2{G;C&Q`C>oD1nm|1o!D@s_(Zo&B#QOlu z`)JDlSc^ru^+wYr#r%6M_Qn+Oo+$PsVl74#tGFG*n-q&!i}4Zxxb9>BS&QvQa`eXj zdo2cX#t>hOL*N>fl$i9t)?y4&7>fT|iy@nes{9Mr@Q5(9)c^jvkGrG!2iKJE(Tx#n zvHMtP&p&IiFN^552wanjSu#xUxKChiLU%>1#fqZ9sQ=&^NfNsMKe)yh)t-|W!_^0(+msxvj$U}5?2^P+%9r9LgGC?+fQZHNFSz$=P(~+bD8Dvgyif?Bp_oIhQhUbHsFW*|Y}R0<3Jo1s<`&Up|%0vhGs8!4R?CT)v~h1cjB) z!@`gFD<+2-&s-|zhQqI#D+Y=g?qC(8$>ERul|wK(B-hGCK=_N6%9$lv^oPn3voI`y zDhHIRHzTOkyj8@9s0MabZv{d~TB^tnt0)BIs9dWRKOxp)vb3Sq!r9eqp;cKk)tnF2 z>@C%ypKJKdYj{FyjB{&5N2;i&YJ?sn#4u|a5zmB-pTCmSN|n^gjEKp(){0}+NiT~k zE!QfW*QsKPs0-8)b=Rqo2W_&pDkLByX_88gx;+a4lZrGc{D4qmr(4iRfXzX>C@F?jl|R2-tMf zrFPS<;FGU(vpjZ{fw~O@y5E(;>&i2`c~g4?*zj3bdRRz%K7#9{zV&c}0sL;gd|*7` z)?N`XK+LU?9|3Kp07T0Ru8GzF8CI{kTMfrXzkm#;-QxhG1@0fgLDJHG=h6YXt^s$f0k6jaAK5`) zSlfM$Z}{F2QVL8bL<}*M(vB993cHg9$>xL#1Gp zE^t>W=D1chGSw*72pn_PViehXbg^`F8LJAuK8m@Fxp6cyFFRJ$iiwzt-DQrU9%3FJ zjUgeA@04O*hE?9`jXy|Z-7}3ncaA?Djl&-+t|=$3q$ggM4Q+)@oF8FghF4s!PaK(H z;aX1IicVsTV!p+$IL@5hcEKV$o-EKqWr9qx98Z-YO^wQ8(L9wO>P@YLV9}RN<(y3k zKTR{00T7!pPVMRSVjwT1jK6IxuQ#*L50uib80wtClLII|&3@Ac zAc(C`Z}vQ7Rvl6~+&L=;nbv!nW0eCK%FX?>oWmdinljgpbk13l0c@V;*_Z+Lkf9O1 zdEC%>b!IrW8}^_T_Cf^nf-l(+SZ{taYG%4}A?$cQqHU2I1c+u{jJ2Fw_nMyZT1+kjyd2#LCz)#snE8kqt8AjtxJ;UOmEIlIyR7KvJ0@>t%fq zo3ZV(ku{rDDD%pJ`|=uO_2g-_hji^P7Vt`_AF&@x8C`|7^{!2<&6f>sg4R_8*Ixh^ zUU{qwV*yK!*7R1^ff2nR@(oYz6@rNM4YnadogQfA2I&}tTxT7hd{Z-Z-C1iBKNSw7 zOW(X{+l+*4vUm(^RrY`M=;YMd;(uJ>P2ak2+hR=xDm-EnwE{m0Z$WXPK5q(< zcgq5|<)62COBcTb=YQzzFt-BVl&Br2>v)MqjFFQ@MJew3g@5KVG9f5%GvqhE}vPjUI z2M{VYE@8$wtQ|m`0YWOlJvPHdY`|VxUpxVE_ZT>6GERxd0eGIpJdu|moJ)3*ViBAx zR@N)2jz|gXtM{i@0u;sHSg*%U0OG90s;4Jn71zock=m!%aum}F){!!i*F8Fznvs!) z3O9T>H~PAfrWH4hR+yFwx4&_2zmDJ7Q$$)@-7II-(R@PvWB*R?)OY!1sQuq6|kK_SVYH7 zMFuns2NtJ$-zo~*4ti*UU)Nbb9MCg!P~MKCv%%IkQe1rslvE>NU+od&}-{hlZ5`~@<6z4N0OuPpyDvCeqD#suGk8StG+ zI_hU#ewxhuibl32!~lyZ;U}cSD+y9Y^!-$)(Ouw`4w!dNFWDcPgdj=Hc55V&Lx_d` z`-M?^Jkc+5IsU2L5LTfPS0W9E{rNgSfq;0dFmCDh+0nvH%6Weo zOpR4TtjvBDB$Q(m=Z4xz9mM6Q7t^celqVaNX!$dk#Z`})z1OH;9X2c%2^eB5t|Z4O zjcfrvn5j0B3(&;cUu#%|jZG06)%MDp8`O=LOD5DVy&1G@p!7&#t|5s?$!^$X37xAy z$X2sz;d_p^Y9&{>d)o*-2s~}RLhiTj*nVQP?tDmpu%|NF z!rocU9$?$=ZYg{6i<~iau9wi6iloI5nUUt9aFn?|5qMd%6@{mr6bWYEo$ zMd;@5Wt*I*KPwIjLXHrp9yiBTH=b6rD%0+ASeYXK=cpEb=W^VbQ~2kk)wR*} zw38x8|Ew32RquRo#8LMGoHC$uIbr=)=W50gTkCq^R7LYinWfuJ1bP#MmCnNC9MCY>6F)h zO{eDmr>9e-|36KqP`%($;&{&C(Zcz?R1vb-(Ct{oFZXkCVk)LP@v}xnJN!}+99{`> zK1AV(hWSeQye9cYyB{s;`NmS#(Ls9&_EYM6LC5R&qv>}4=+2)28WSEFJXluNFeQL4 zNh^7uE+dMZp(r2@Wqv2`^{-@ber$G4A(ycaadF{5)NoNsd_c}YPU)MigA&Jnm|RW` zi&{y3!<)jfqM57agNlw9Bw0nxAI(br2mj%Bu#4G#P5YO_k=j=(nk4)SpGufnSNd9cgCn)A=OfL% zVIR2}@TV(AZ#PnF#y&bu*RT?ylGRQ$fx^=!Icaig9c6otuB;SwW#y)nC{*iaRZ+X_ zXZju5uIA+eAsf3t>3A0OHSKv=L{i!u2OJ*cxTl<5h3-}y zLghx+>fe>$ZJP3&-01{fcGs=P;g{cRC7n_`W2d26@X2a0;ycafrRebP7Kt!9AC`BF zVQrU%$@3ql-;!aUlvs@MpSC@;W1SU4<=u`mC@7klt$W%Y>k9-ZT-kFJ6x^?eC_RS{ zl*~KY;K!qa3NkmF9M+HQs|nd|umfF4+kGiIh4ACK0Ag6xhR~h!3qy*hAGktePpqE& zj1=(CJT0gZk!~F(x^$fdoM_S|wkTS9EEC3JFFvrbp$huL`O!t6aK(MnD|KH=-F5Ct zu=$;sQ(|g13hQK^;Ss!8!V1=J8oAyK_`ALi6e6s7YZmo}uXYjSydZAZ$wt61vw_DN z)I}kTOF)xqfD!zwk7iCGNMrjYTCzzGqYFxy{>moWZ{%LdcU3=4YhM#t8}!R$vPZaK zQj)bLhA?e@3zt~gYOuqVc>f$7ywV~;Lbfp=zB}m`Qo8jHz$^Im*&r;qw2zv|_N$C= z3_LV?+mL>h_oD(zNl0>>(K~)q>3%Ubiek6VG@AEAT+IftL3Hm(P3Z?@t5FgH_1?2; z?|)JY`A87gy2j>uKiuCN6Z=u?1NFE25n~3QIO5n}C2mOoJ>aK=yqR746lZ`nz~Jv@ z=}$^pJ6TyTj+A{;WA+x)QN1r5>C^9M>05*4f;RAp>~oC;81<3#pJNlbIA5|oIJ0GK ztY?AxkiVd4jJbGBXQDNEf8lXKjr@F-Lm6M_M5h7J%I2UXl`E1K07OSM6XeqD6gXxg#kRt{KQ5owaKi- zscHhUG&xJ7Qw3E$)uCiaV(MwC4zIAb;8zwzenv2=>_4RduMs3oI5|k>WZO6yF zUL#tAW2g-=CK);;(vjO5s-&ZqEJ6V-DpDu)By(+6ywxd?y-&Bet2L!m_=xG0hi~gP z7b};z=D?{+PTSo}G`Edq;E4{3bA|R>fioGsr;~&Z1{6z&Q4?KLP-EvRZzbGsc4KW$ z=e+UOoz1U>Y6GKSt5t&DifX21#Mb1l7x$zxu|JVgulkR{jUg5KS z=#Q@=HDVTNBB6W+Cv>G6nT6dCt8-ueom|)^9Jzg?X!9Jd{dR>28du};0^y}p+4|9J9Z5z;=Q6rt)epdsQc&5vgx{><(uK7}` zO7p`9$As&?KK50$@U@f>GBn9SXLh@omY!`A+U#m*&8l|o$k_nFf)^o$hgFWf4Y4(4r$iPCzwuryMqb5XJ4YDZ?Z*PTk8kp0Hq5yZCUlZsAuj_ z7mZ7yPuQ%wLxxJJO=4;G1XSP9_QqOaaM6<8kyo?#qSE+mzit zNHFv?(AaMCwY8zjl@@hdvBdU!3cTU*rq|`&LB*UM&e$!zm+`9pxtwYl?oufIJ6kh}lizFjt27H2LZ2{VZA2b#sQd2DUp`f9`4s)&T)UU| z_HcHGr>A|Ey_B&spD{(K<428=tJMz@IC7DH@e?I_$>n;Ol>7 z;SU3Eo(eSZP`&c~-=Z%3U+vvjRMUOF?{NebNa(0Yl_Js+5J5Tuib%5~U5ZEtMMZi? zO6WC&-XTEfy>}9N@4fflA?J_IJbU&zGiT49i}UO`i`!i0B5P&6e(%p$d0*QxX^#wd z@%>D#W8Ssfgv{@o>7Aejw{JdEDsXo4VkD=0qy(LIvTGoxOMUAv;cUi8!4&@1F5X$k zje;ZfjRmI5TSm$UgXq^Ev|XOMQ3))*QsB8F{Nt_Yq061QyOPDPv9w*kh0x11zvQWP zZU086_(MfV+m+{)o1wECZJ?`vpo@aOOF_4@)-&g>FV5 z{G96W_JQNKMf)!n4pxJ{9%yl z!LDohanVEa?sq7&r`GJ(s7GHM5-o(jSVZf7Nn-ZOylXD?<#TtU>9ZfEOLt9_=)DgU zjf8#}VL!wPedoei^1b@^5O;Gu7LOmuW}LJG=j;QBuemL?hh6V& z+-)+ay)d6(aYyi=^D1>E{lIxcZ&T^2mhY#l=$Nf`Ts?CSmZ@t z{DPN6{7J=cbKhkRRP_x3Kfu%(EgQ9Nyy;plV7A$B{)HV?yv+7yIiDG z51=?vKsr?tfMSS9FNt9H#7Q}dK*$IKx|45pp*zVkLV)gM7+mO19zz0v?)V7cbXrB(vqbflL^-qI3?4;&kr5abh_+ganzV}6D|s|q67A+0 zyefO{W$LWaXd9e z0=XbMf!8pO&ns>Vnjl!3Ks=lvdK~*0BN5D+C}|x#Z;*J#5-qbFD~n9rPm5Bdhy`?K zLni5ML`=J9l5%>aDl(~mDQTT0Qj0aFQYLw_Md%YU+8{l7fCXkE7@dWi(g}^QD2+-q zNNGBPS|KANT2hLYp$>wP{w%3ExMFUlFn7x8fz%LIz3o95D@_-wfaAFM=+ya~Jh(crI5N)`#v~jxuj< z%De}%c@JR<{3Ce^@pMakbzbTOKV> z!D~usC8GkC_ySd-C+ao@n!pwyNbzZrD>ELaG{cqE2RmlY&mRYnX+ZxFqR_kvJ!Y%8T?)a ztb_-%JRW=x*a8G}C$fy81zry5PAHhZJ>cHqW8e9#fuRc2=1GWHf zcvsJ@kbzrE_ou4~<;aNHYcM2hZnoYcGcKh{sPP}UMJ-n%hgDlZd5dASSYM}>$@nG< zq&TYvi$}Ol_yZcuPF4P5tCnjN#MfCTdRiwkO3Eu-FQrzOXZjiAf?d~!MFz143I{7qb3!J_GzO|Iq0Kt zp|DeLPn^8(=w3cHAtxy zBtjTTM2AW?t}Bo$xaEZ6_Xd}hqX?!@xp=KL8F?g+TN`Y_O}4GLajliM;5PPFoGWcy zaBvR<-HM~thJt{HDmV(!E@z#SDf1EQQ(!<_A68E8+aXC#<^(m z4!RNWfn3{KMn_dS7|@+Vj85_uFqV8LhF0fE1{ilO=b*ZiSQd}ar{kQqi&Vbrrh3kv zV;2bCMTw6(TJ6GK1JkW#?}&F}8sRaubsfZZ-)RGLm}IYE^c-8`J&^B7*~F3%>6Mc2 z&HT_aBZnuTp1o4tv+ac^hTog;qW6t@pF}3;Syb=yir)Qn0tFGo3+ldds@`|%{cr6+ z$`##>)qQ9|0?mr-7TSJhd61s^z$bN(L1uqLbwBn>znMrbl6F8xr0=`>;1hX}RVI4C zrfuL3C4qxa0g4s?9+12G&{GbOrw9sFJ;<~&XvTpbXwu?pGL#6c0NNp2s|Tky`+A6m z4EsYk?!Kq)@MX>9|OlfAu@!-zB7+_RC`7bAssBeGE=Th8w2&VK(hC6RJ z9_~NBY=?hy4S#nPe>1ZQB{GrgGro`CG}hU1jNb<6&biMR#`x%-$RvsEnQ)~FhY4a)L$SDfbA*%7IH+Td!a#P=hr|+&eT%=PW6=SUHQ&av( z&dT~lq8T2}3Es*n7WYVLULp8G zQ2$k9!A*YTNA!YqR*kJ_mHqjGO~xFMPFZR!!bS;htPXjJ5<;Szoz55aOojtRmsTCC z;bWD1{!0<-i;?3?(VR=W)l~_V75g8S!^)S^><3)Wm!1j}ZmtY;*bwH@G{nDHF%Sg- zz_Tu1x!Ac<$+_~CWA&rYV1qs3APm@+B5WOBZ8u$kw=Z`Spv&deOVOJvN&ai^dT(@YI%*O+m9+Ya<$qX#eV7-Gkzv`=R;qjq~%; z`)x&-P8%~Cnf&$ZwQVg#Zx7=U?X42s)!g3j?R(%y#C}3V4is}I5CzHv83WIWycOF zA@P~l0|E3VR|klB0xrL?d(UiFItKpMZ10KRo~Bp;P)P|X?!R<^fAZU(T?Z-q!A%r5 zl?V@v?gUsU9_Tpqe%$ca+Snh`0DmS7utFRtnxPLYC;S}<58F+_E{H>KvqN=7uwRwG zTgPFoJvb!BKkWXI!N#GdgMZY`2mXnH@qbkDFbLLZRhr<%_lT(k=7O^8#$LX>DNqY7%cNMr)?5sBi z)IR|Rs_>DHv*L}jZcV>-vD1Qc@SK?6g5P;s*7?dEzbVbLnGNv7eLr9nFj4{U;2)<` zu6(e+rc+VSWLL5ONT>3I|464w{z#{i69L^xKsN{GbanT@I|6@i0gjDN0O?dv+r<{3 zSMSPd?ve+v1vs>^w-2OKo(rdEk;l%%xN6uhI?G*fOm3<*XUEk&Kc|mSeUz=8?}q!J z-KIGwLHZ|&WPE~tjxL)!#cRWp=G-Kd8NH5|wtj9hYcQ+DwslKhN{23w%Xxx9o}OgX zGlw%ZWd0Ie+zS(4cEer$Zn#38;TrkdRLS&v)Ed-f1sOv>)m`kb8Es7sCVrYhR)oEq zmn<}CsC*(=gwQnm_T)>wYQT&}r2{G3^;_>Z)oU^F@3fZ`=YD+dBl+ExN_l%WI84&} zU9j@BUi+%B{dJMjZ!6uzBJm1ipC6))28!A0_L*$>3j7Km&eNP*T2}d0Isjv*{>2t0 zjU731qCSi}^BushDkrtTo_9aOtXJWj>AzV${KL_~{f;oBG<%Vg{q4z>4dyB+ z>NvaDRnz|DX7dXNRQc6Ow)^5@g+&a^H}922#AG;i2U|Xs%EH zh{itkgGb+{6uk&j;}1EncE{#vdCtm3Z-_97Qk z9ZM49bIumsAhE~fbHQq&uaZJU9tz9`sj&9VLA`C2k&4=!Z<9Io8;^n`B-L5&zBZet zUx;?;EWv$kQVLCxuw7qDc_Vub&AJ#Xe1l>kPM#%#F~LXBIypu`MsO)MRO9)l6NR^MOW`;j2JvK~F|MJ|(&(Ji9CE98oxe``c8?geb-F{}A zQ>=H>IG39f-iN3T#Wl%)9`VGa;Dv^bcE~UVJfvX!OSnmKn=kxh$$ayt8Af`s^Y zZL}tZ8AP**#sd3G%_sb4UuwI~Zss-*WUBEPdsg7(negPPMQHO)2rIW^@;5#}er~|a zZ~w;8pVwhVJ!YyB!qLX7rXaS7AM){)qP%k7Jq|A7N?AvJm}~lW8$NtetTwIc1z-Ilah~ekH5Ply)_DfZ$G7;Q|fQdg*~E<3=TR z2g7D9SqEKRBa;LDHj@8N++@3S72R&PlI91G{!b1SZo`&nnuGD5h%x8sFtnQ8d`i`U z<#LfC|F`v~i9)mOfjh&-`wM;#b&n4aysGEmNwhJ2HD*6M`*pd=DGq(zf^P^6 z7$3er9&8Vt{@OAd_Q4%@F8o!NPI8z&PeO9|vOjJ+%)AlW8u>L@XMz96d|C>(?Y=;J z%-B`nC#C*Isa}+cZ^B|c(-=juLOgKk>8gMxMK}*Sj+n?FAqZfe7a#^+zwbgaO3T8!_;~g)f{e6W z3S0IW_}VtTTL>*3I8&*L%!}&=Ph{MIxPBdGH~mk+L{0o}S0rUHxIGH0CyC6y)G1~V zd2-Csk=iwTF-UB=$hJNu<=(1iE3I`aVxDHmSZrX{3%I3ie3cw^_=LqUz$@)N1EuPf zr@W>CBwr#K*n$U3Sh`V`UwRngMi;$!S?T?pb)QfxYc)%Ka6BIU+a z!6Gl^xFak2EJe`HF~C$IIWi$JS;SDh!@9qkVWl-ibclt<(!SPzLGGsr_VZ2~3Edc+ zzE5HZD^K3*U#YJ7Fh3>@?DSfHO?O`JDkR_}U}R6*m*6hp;} z#AgY8)kB67)Cap2lKvqnMJW6EJNtbdc*rxYH%Y|(gmh+NmD6Y_1b?$6kH zZ~T&3;3Qtn};jiDV<%FN#XXi?e?8ZH=z+y(}$0T(_*E z8{bN1D00W3wl;|yKXxywSijly;FD4h<@YeMJ^W3(EtsZxuu>5WGUZ@FJb9fky!zVr zSLizrBR&Yz9Ki7l&G>2MKF}DD5hs3|bzXvLVVi~5QJ-J8#U|Fa&?u&0Y~OTwIjVsx z`8pLIH|ae@p+g=M-pJC}=rs|bb94PLUxafD;-scSrx*^8=*k)9iqyTM9q&@1wx*9j;(-1>K-iN`((oRK4azJKkHCthM52<`UNXiVbf2tk`r zv_!3c{`44M_vLG!$Rxgpy}B^Nw}^@Jq&Z6bu$(j((H6BH|LayIxz>L$?k{Zh zQSfn3dD zq6KdrpP7u1xsEvzvOrKGeVT+e@aFM6;~5c?y6uyed-8{oBC=a7DDGLN7!K3{yfzY{ zR4yf!wGm&bb@s(B_q*(gDWlv$4lDa+(KqfHP1cN7!gno+nrR{0=r;m8=ixlh&!66u zKhsKQI$gQ(@Pz5r=V=FaM#?MiUusG?(zsD!d%Td3cO};hITt z8D8KSSa4|$@2blgOjbRbLa+<2spwv$!4>vl(R2gZtnoCz+>fw#C^`i_rHt%3+>{MV?;fmeDvG zv5Pn%MfS-`Uj7)i6a2R6&v3iL>_!f}!pz_D_t@t%gBWhwUJLiGJoK)<4XJ$u0r;o! z2c$V1f-Hu#4gznqA)U8kPAqBpnhT1ffom%()LFxtv7hJX;TYzK8=lh>1{{R? zNdzEJSiuL79NQk|^93zM-Qil9s4x7Qb=a=y?|Z8E7=20N=t;G&(hU z(;#?tDS9`}Z_6rX{(babNz9>D%yCJ~?oiC8RTRc@G-i7ARh8HUtJo!$NKk1k9&0qg zaqJ}dRbpfm>GQZjD;U{wWL{d_L`xjCbtD`&zMBQ-4p)4ea{RsY$e6VFY5^z^_N3q@ zQ~`<4gJGDve>@)umL8NKXblyKh;YG8%=g3rhV-CmVNa0}-_jDpal_k#o(7?> zpF_0_lAMP`l#$^|ElJ;5LNt+K@+`^5R>2<)p+SzxDh7{@yh0x?B`XL>ejW~q5l@l8 zePU?{ONdQjO_R1041!~%el+lNNe`VZPK6Ao`U1;&6lsBiX~Dmi^TIEd^U@-R)1rYP zev1Di@ktls+q_78vIY4>Ui?mcd~$)r=Qy3yHhE&;{KqI!$&oxV?R@bO5r7$G0R-|EQiSEdWGi@GCIBQp1kMGo zMjol2rU4-NB|%fUVdP%;p9pK2F}nnyM^7;sYFn^7FnIFjB}PQS$wS5!lZI5XiiYA!?-r zKp;afeS%OCsZnX%2u<3rgHV~?lo$JXY-K5IltAM1&bbT*qX3?t0sDDXE95}pgD+d2 zXG7j3Tj~;D-attX9E92gRiKP+1Bp+Fc170-*$}*95m`~PLN);|-k`6XktG8TLLE9+ zE}?F%z>7#{Ds@M0ZFv`pOICSO-a23_R86QlF}it%D#(h%x^7!7_yLTeR`Pfa9aH{rx28idh?g14EpKv{YIY=NQPq?N|6kH=dT2G2cB1P4JvkH>7 z&F77)=b@}sC~qLiAbxe)fSpnMmMZswQv;(cSS_;grZMq{(Z=g?4LWj-%vz0~G8zmc z8;w^RP2|A9kRI*hraP)&OW|hXxF%CIu-$4C`IY9|Y|SpVO+;GF)*02Fklb4}&0ue^ z-)S=eU5mS1OUPlM1zI=R+{3a#;^?-u zW$*x`4I{3tBLh6fjyS+*pL>os)7pCep&dwkmLjwEs@unx+c)Hz+t@osR>6DhSv!s$ z{f2lacpV3m9XqYyE18*V;+^f*c-TIjDb-lF?7D9IbY;eN7Rlk^M`f;HbTxY60UDIx z-^Co&eJc}0HP%IQ)`d(bptsAotKRLe*2Nmt!(s>GIO}M{=;;w8cyN~4@}cKc4kQ@W zE2It*S?g)Q=pAA0m9#@3KlJk3bw7{lBbNusuk|Y8_w7&+yl%@yedtr72B}2#Q*eOP z?V3>-{U@ybk{tMYnT_u=`+v0cn^ZKlV)RdQ_4K?L_zu*r>Vv{WAe%PyfE|9{ByD#u zAV6oh?jl36{)1i>gLlRTud3tw`!oS3qJr0OL+ysb)jJ~a+xt6*qJ3~<@rPr$hCdkN zU$Gl5hv27IG{kleXK@T?b2Q|d43CMojhT-Wui=(fjD&ZNRNCP$t>QPY;@7X$$JmX! zw~Zj>>&J-N+U1cGz{#h!;a=+D7Q3;*sIkoQF-JUt@v-_I>Tx%dv03#xAn~b@Z<@{? z7atv8&+Ol%o?yl!2!V`0x1BiTr~|G+8JrEDb4*NiHesIEEWVh$ZaRu{K7Lj)`9yd^ z=XCN6MnEDuHK{&jWjA%3rg7#)0~Jjb&H2>b$Pr*aZ$^EZ97ucwPVun-p&6gXKA)CR zAL5CgVydj>%bErfA9}e#;jBIYfyl}UFyuyhRtTOd)I5uxRrVPK_VX0hD__``zY?8O z1ordn=Yah@vr&RYwgC-M!VlvOZ$;+?GY5eEyw&Oo2kP>@&UsVLd2^bDFQ)Um7!{W1 zrTei9MyK<3mA&sp7bt`Y>)HAeYzW;oYUBMEMMOamg@tv;vPGh$K-0x%CQAZseNcPC z3>ZPc3SlhGGSK%p5G*Dul+Z;Lp}CflI+t17dXvTpJx)3&VGGu#pyKsqMD!fGvm&*< zGQDy+Lv)p_tp`FtG{Dw#4kjw(Ty3xHFQr-Q7DX3h;TK@mtQJMDbr7tLj;{%>t|(Kj zPmiw-`GTP1i&wN7Ca9XRyVlp&SJQ|#uygWyTC;IKuRW4q|B1g*HolRCN7S-PbQrx+ z*WQioM}%=gw1!8FDYiLV2_lXmT23b(FeE1P+u9)5S|A|qTIRtQTff=?I;BaYyT5&$ zwM99R%7WM?@7R8z=nLFzBJ2QB`|nH_?+E*?WOZ&sSa%02x1VTk&v@+0IP6g3?~cFU zk(^jA_^>;*xT`3(E!(j>@oewy{pCW(z1M{Ms&{tsH+M9ud{pl2huVX6JNES)_C>_@ zjr@E}HugPz!JqvOYJ9<0tGaFP@AZTqSWloAN;(hv9v!3-9bOYVw7l=*?r>;c33f$8 zf)tN*Opn4QAW+2vsg5HHd!HD><9GLu6RHj!s=&SzV6P5HlG(9#2N+QWfmDGqH;$vs zAUXF>%r?MfiV)xwlnvo&&3#Bw2dKpCG(Zzlr+Dgt1{d5vg>QfX4N5~mItb4~H1V1g zy#WM*Z2$+Myr#@{)D-dN2)zIV(np-Hn0dA+f(HoEZG`7L8=$@WXIuXefqcXw{)#}6 z;YnV?seeHrcyg}0;NL-@zytt+;?d2a*#H8icZB{e0(t*JAYTB1a+VafkS_%g$oV${&AiVA5C|VYAn8IAcx9hJ z5n@8;+ml=Xf#!Z8P~(kX2&78$4nUweX&=c#SE`}SUkJqc8-dh*A<$emv3k4$ht)Uq z(}7~ry7hxEe2@DIN#|*3EcwlbDpM-(I3tTKG8;R#l__WbtD{QjfZqxAdn`2Kpn@3(Vr81CpW_t9Z;uNW9={ro&gBt`x}8? zxey$aOu0|WJwm?vg+M}|_31y*2qpjs#Qr4SovHDWoYw=VUkLO*9wLmCU|^OT^U(1X zT<)F;2s=HLc`Xs&{U)G{mSyhlbAkrlAmztty}@b{Z<6jQKWvcKG>V>}# zR8E%AZqf`QD-4`R$Ru?pVd8B(189^gE>1e|{f zaBTko987YB@<*RX>1^0EvsCHK?Qwi$V??Qrp3D!1`Ptd~ms&3O-_g5+P@lB;vnrlT zz(JRKJ}n=wzo8VVu6|wmqT;b!{cJTRY~0$s9AdoPvXw-&%>!J7%jM+KS@1zt^`4Hk z-Crn&wcZX|e(*zlhW%^nz~(5b>lst#ZuhD34DbCH6HMPaW%)&RxRs46fZvEa@7wxH zT{$KP)xaiu0}ZJad?UJHXWzSKkYluC-$vx|hl>^~_$Lh zP9-rc+n;LA)XkhI?moFD^rL2IPun?ck`~t>PFy24n}k6vZf|*^mdKsnoo9C(TT#F6 zdOFw7Ed42Y>t{80FmrB72;&iRYt=K*fBsqeL+h^jq7-%a3(srDPe|d-UU&N?y!>M6 z$(Ae|jM)Q7w5bxXQHKo=6zF{nb?I)jg*UvZ=JtIYsYAK)r~+&HrIK;$PfEJaO=9!h z{-jeg*U$8uwdiuWUA{`uQ6AMx$74b~!|yVdrAoj1K!PS#9o1#ze&(%6ArTZmdzVFB z3n}5s6Oyi$#Ke$>^QQL8%_zAiY}d30m^=SgkZ!8l;$ZJ+4$Z%e=Xbi*U?+Vu|f!rZduLE+@gwU+WWR9 z&FV|tMU`X48+J``6OzJY!Dml49MDFZSMvC)h8i-_A2|XhRoQ>k;D6_`kK&cjQ@HJO zGr7U-exw$@*=@=Vj(Vp|7JhR`c>NW=92Wt+ij0V4503RlZ)r7c@|a=@mU~iFuMUSB z*KaotZsvHF5l?L!UT@MOT@KJ3)nODHq>xvr_bE#&ELDIa-xhBB&Ari~WSA!vNNxmY5Vg3H!_EVCq zc%Ef7_=-MQFUT1)HZc=&S|FX($$y`x4S@}ZG%OfvbESTVcF%5+be43<*ZAeo{op z_KNE16^bwfk$fKQlO-)xC7XYL{47>2#}ZvRQon(`X6q-ho&4^`_@>a~({FictU>Ia zn|=!%ukI?UHq?E(m;CC<{KJhK?O0)JcY0)Msl=>@BpP~chZgX^8NYYDxwd1ptWn>66VS3=W{#1CnS!{4w-IK2v?Cp%Ooi+B1_z(CB*K&!6+4tFAG zX1?a(e2UF>)a1Ne#J+<~&oRiccHqQ)8_hNK(`9ghr?1JSF^snZ+qIORuTI((D*Y(? zr>hOWU}Tf4`cI)iY&V$&VS8yewkA=-pKkbM;_swgUJpE$z;>ZylH`ys+Of@10z<9;4lDdH3&*F8lH>w0c(-&E1)Ch?{=$ z6?wS&TX^Dp_5XpRbYTBn$1Ly?;?-kh4e*`}0V}QZ-qQ&@-Pahc(%!7c9mn+tzwqRqmDhJPi3Odk7B0CV`o}m0N`9lM&U%n4wGL6 z8%E(T$99v$fbrE#nYbZ?I5LXJq_ntJ0C3V_cR=y=P$$X7Boz#6#8{3A^9luF)P$iCNWGoR9Z0nLt3J5Nr*f$Yz!;O zojl|AO|1vSH}smLz`xT+Qbpx9%ou9|eB&3g&T5Ryx8pLIx?!CT9zPK0goq zA(g^W0S9pTn;N!K)+S$U%6$Abg%AqnS0M;eAG{VMc9WMyD6Nb}*xt6<$ID z?6SeD-e-<_rKbdDPA;R<%Lg-O)6*d&S&QlLy!TnFDsbz-tW9Kk+F;f$1=E%_g8zjl zu+b*A$$036aBoJOE+f#O?1sD9I3stjm1P&XX5*GI0DyD!Tn4Ckh}d%QPNZ*^<&b&j zkfWYZQs$n4=xJ7R-rmingV8e@0cF(O`(uP$wkFOSx6gSVhGQU@-A7sa#8UB8*Rl}r71wgvr>{#hCZ~32>z`UFByX?zyr86Q@c|Fz*VuSZk^hkf|-Us&|j8UawGy zbXJ{@U=^BILBKbU%c?S~v2Y@*L6B;Zttx`kYK&13rf~jMwQ8Xi5IC}iq801Gl^UAU zYCv^FU^i~r)?{SYFlW@TZ`H8l)n?Gv>cdGHjce2W(Y1UTwRByzf~&P~j5=-<=>xSq zY}-1ijB47Px@V_VS(A05vZRkAb8oBFzlyA;2&jLzT1D4de_M!Du{9^3tKmay^{vkh zx}#OH84aos67|)FmsE`(gd0D~HRd}u8sL!_8RryCHd<2=e^zTO5O4YxNo;wV4GgrI z;t|_XHC@4LzGFn}!k%6Hq1kMiPZYHWxXz_&|tY<%rVB zmLLcb064|sNOS~IiW&l_c;M_rne50C4AgZ>qP)?p@(-vYDx#7MR9P!(>zJ^rHLHTQ zH3oue$Y?GDt{*`NQF2+8ldTrgL@OQ17}$ow4lSRax3aW!H>H-OYvHog&`7Z;Z#3 znK2XF-5-I+A<~gZ)FaN(lO*2rP#uq-BU2!=XFVNHWUZTqy7vWsSE6|D6O&%)%&e){ zUWPI}0C3`n`aV#1#f$gZm*XjMAe1wEx;y){PJ6Y^`hkJAFRj3b1gs+X#$)}OXZ^OB zSaGxi7V-nq_ypwg_*R(%F`eiEFMNQDgY1QT(j4;b@|fTp!$g^^pOL z_VG>Bc=pH>}r#zHl*jo+WFKCwhi@HKMc7KGq* zY@*_9VqSg%v%PLPv*Efz)sp`t$bJluV1VEpINLxVCp@*NI(4hECOc}1B5RC_pk@i9 zZX&j7g$t;7ChifSdm&NNMC((SqtkTf(_GOtHX<`G)o1wDt5?jc;F;y?oipIm8F7L> z2cY87n4Pnkt%S`!H?3y`0Ect-g=yp3W`%+J+>ZI&o7Pzsnx4;Na~kagJwO|vN(fXu z%D@4n=y`Po!lsq^WFx}QoQ--43le9uhBP%h*<~`BB?p}gRO}!}g_#7dMWb~Bgg1dl z^rGE)j}Jl5Yy71HuF@sP;&bz*@aQEc(*?`%C2#L8^AkcZ4NxLYw`AMW*=Esoy9&UC zk~f!=OqXAr6ZW1g%}_4Ki!PV0cRmnV#F#2)QLn=2S}xI8)uvu)j$XBfcSy4l)vYgg znyxm9qStz9>Iw)N2BX*N3D#0EmRxCwcZtT#l17VU|6;H_9NqW1Idk@bNE z&XrvaB*v9ig01zsf=4wn}lZT*c)p^P8pn% zo5PhG8C)A4UR&gMHi++Uxq`Oo2)7sz+vED%OlF(+JGPuzcOIaZv&6SuymmS`w}s4h zMi+O)HnvIdcZQm`1r(PHs&_`7?LI+l0cVf~Q+H)!mI^0#fq3Vo-*$fNUO&#B(!^pB z#(ppJzPjR$vf^I1$G!n#=cC_lXY*ca_6EHVSPu;`Meob`9ekO9eAPVojsRPAKx}}G zw)cvM##IntqfHm6cw!(v6Wgz1zzz-1-h3Pjd=;_B6~I`V!+bsMX@%cPz2k9H$4TC^ z(+0#`(nujQ&{!V!sVBU)Ov#MtCvA)`vK4tUevObCkt=J~MH!LU>-a zc#;)+zU8po;&;A8cnWN^iTu|aZT`Z4yU`Xb_%|DE{{P!XTj0e;TULAA?~S%NV56<( zFB@$>zc$*Szc$*!{@7?+{I$`>|7)X-@sEwRcfdwlR6Q;B1C6rg?3rwD-~bY@QjRXK zKgH{L%%z;9_y8^){$3G9^I8T|iO#dCcklg5S1xTk@MaQ(ibxL?N*Z zfWI&>9v@_ZkyQHACmIcX{1+8Z8_sJ}*)m5g$~slj zd5y}?XVy1bi?^6+@8RF!yZw4g8#sWZ=&Z&wuZy(fc+e|X%KOQSM+_CjVhwDxK@=1A zGbpssbNz=OR<5%PO#&NjW;2CFWsio(D_>)ET>p9~GSeADkB#$HU-5ZY0wB)YZ(P_!aJ0BdzyDBj>&0`6bD=N|_xQ=oho$X-=Ud$K`d%fl(dLrb z40^+9ilqbb=v+)-=gT5_>suhzFhloiqb(gzCXwJNje$qtoA0%=FBM2yLW0HKE+sK4 zX?xBDseTb?4%2@{GB2(sg8LDwm(22sMaz0FSxHau;X<_0u#BFP)q2Z9i2j%-Q~g@*NG{1+0H#Tegh9D|5Jo`?h$KaFF?AVYGmcPY{D$nUDh`x+XgX$*U?CZ#tv z8^US(Lku&B+MgS_71lzgTdzx9j_9(a#( zHMfFSH6yi2n_(@#cU^m}U=o6CEgbz0Llw1agH0aIa_XBFEH0;HAyx~)lVzKYC*$SW zAqEJ$!|ixP`IMe)Th+n!)wSwbHwI1~9ITAZT0B3c&Hs5?^RMSNm6uxcKTvCi0IkXY zLupw$l9{$oA;Y+Rg zbG3#a&>EY+(VE!*tJY*(YR&&Mtr7Wm(VDSKt+~{iORf1g*BbtRLTd#7lh%m*8)(gL z<8Q4=zto!lT5EI(FSX`UYkYkD`~w1mfX0)#HL=3mkp<3F_K_@C999qLQ1xzrl< zZ@i8J^u>h#a$941sWtxtwdM@an$thD<`JMZpD(rMQfn@?=2B}ewdT*$n)-jNHR6|A zbE!4|le8w`uUZrIXK0PUFRc;0)S5q6YaRkxqxv^m)A@hZn$b(G`G2N0{QoXmV|S@F ums)eFHUH*X^YEY08j=5`HT?euT9f}5tr@=5n*UmBX7Mkz=Kp)G5&B>3!qZ~_ literal 0 HcmV?d00001 diff --git a/webservice/views/database-report.hbs b/webservice/views/database-report.hbs index b9bc4fc..5d1372f 100644 --- a/webservice/views/database-report.hbs +++ b/webservice/views/database-report.hbs @@ -1,6 +1,119 @@ -{{#if noQueries}} -

Couldn't find any transclusions of \{{{{{wikilink template}}}}} on the page {{{wikilink page}}} :(

-{{else}} -

Your request for regenerating the database report on {{{wikilink page}}} has been registered. It may take the bot a few minutes to make the edit, depending on the efficiency of the query provided.

-{{/if}} +

Live update: {{page}}

+
+loading + diff --git a/webservice/views/layout.hbs b/webservice/views/layout.hbs index 97ffc1b..93a5f46 100644 --- a/webservice/views/layout.hbs +++ b/webservice/views/layout.hbs @@ -1,5 +1,5 @@ - + {{title}}