From 56df46871d86c7eb6c7949f5991ef78228385a5f Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Thu, 26 May 2022 00:36:16 +0800 Subject: [PATCH] `no-array-for-each`: Improve parameter reassign detection (#1823) --- rules/no-array-for-each.js | 34 +- test/no-array-for-each.mjs | 61 ++ test/snapshots/no-array-for-each.mjs.md | 750 ++++++++++++++++++++++ test/snapshots/no-array-for-each.mjs.snap | Bin 10745 -> 12354 bytes 4 files changed, 836 insertions(+), 9 deletions(-) diff --git a/rules/no-array-for-each.js b/rules/no-array-for-each.js index be0a55e2cd..98cbe49f28 100644 --- a/rules/no-array-for-each.js +++ b/rules/no-array-for-each.js @@ -317,18 +317,34 @@ function isFunctionParametersSafeToFix(callbackFunction, {context, scope, callEx return true; } +// TODO[@fisker]: Improve `./utils/is-left-hand-side.js` with similar logic +function isAssignmentLeftHandSide(node) { + const {parent} = node; + + switch (parent.type) { + case 'AssignmentExpression': + return parent.left === node; + case 'UpdateExpression': + return parent.argument === node; + case 'Property': + return parent.value === node && isAssignmentLeftHandSide(parent); + case 'AssignmentPattern': + return parent.left === node && isAssignmentLeftHandSide(parent); + case 'ArrayPattern': + return parent.elements.includes(node) && isAssignmentLeftHandSide(parent); + case 'ObjectPattern': + return parent.properties.includes(node) && isAssignmentLeftHandSide(parent); + default: + return false; + } +} + function isFunctionParameterVariableReassigned(callbackFunction, context) { return context.getDeclaredVariables(callbackFunction) .filter(variable => variable.defs[0].type === 'Parameter') - .some(variable => { - const {references} = variable; - return references.some(reference => { - const node = reference.identifier; - const {parent} = node; - return parent.type === 'UpdateExpression' - || (parent.type === 'AssignmentExpression' && parent.left === node); - }); - }); + .some(variable => + variable.references.some(reference => isAssignmentLeftHandSide(reference.identifier)), + ); } function isFixable(callExpression, {scope, functionInfo, allIdentifiers, context}) { diff --git a/test/no-array-for-each.mjs b/test/no-array-for-each.mjs index 450cc960d1..aa77f39e2a 100644 --- a/test/no-array-for-each.mjs +++ b/test/no-array-for-each.mjs @@ -441,6 +441,67 @@ test.snapshot({ // Arrow function body 'array.forEach((arrayInArray) => arrayInArray.forEach(element => bar(element)));', 'array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element)));', + + // Destructuring assign + ...[ + '({element} = bar)', + '({element: a} = bar)', + '({a: element} = bar)', + '({[element]: a} = bar)', + '({[a]: element} = bar)', + '({element = a} = bar)', + '({a = element} = bar)', + '[element] = bar', + '[element = a] = bar', + '[a = element] = bar', + '({deep: {element}} = bar)', + '({deep: {element: a}} = bar)', + '({deep: {a: element}} = bar)', + '({deep: {[element]: a}} = bar)', + '({deep: {[a]: element}} = bar)', + '({deep: {element = a}} = bar)', + '({deep: {a = element}} = bar)', + '({deep: [element]} = bar)', + '({deep: [element = a]} = bar)', + '({deep: [a = element]} = bar)', + '[{element}] = bar', + '[{element: a}] = bar', + '[{a: element}] = bar', + '[{[element]: a}] = bar', + '[{[a]: element}] = bar', + '[{element = a}] = bar', + '[{a = element}] = bar', + '[[element]] = bar', + '[[element = a]] = bar', + '[[a = element]] = bar', + ].map(code => outdent` + foo.forEach(element => { + ${code}; + }); + `), + outdent` + foo.forEach(element => { + [ + bar = ((element) => { + [element] = array; + })(element) + ] = baz; + }); + `, + outdent` + foo.forEach(element => { + [ + bar = ((element = array) => element)(element) + ] = baz; + }); + `, + outdent` + foo.forEach(element => { + [ + bar = (([element] = array) => element)(element) + ] = baz; + }); + `, ], }); diff --git a/test/snapshots/no-array-for-each.mjs.md b/test/snapshots/no-array-for-each.mjs.md index 714f5dd1b6..da2d17333f 100644 --- a/test/snapshots/no-array-for-each.mjs.md +++ b/test/snapshots/no-array-for-each.mjs.md @@ -4125,3 +4125,753 @@ Generated by [AVA](https://avajs.dev). > 1 | array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element)));␊ | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ ` + +## Invalid #231 + 1 | foo.forEach(element => { + 2 | ({element} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({element} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({element} = bar);␊ + 3 | });␊ + ` + +## Invalid #232 + 1 | foo.forEach(element => { + 2 | ({element: a} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({element: a} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({element: a} = bar);␊ + 3 | });␊ + ` + +## Invalid #233 + 1 | foo.forEach(element => { + 2 | ({a: element} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({a: element} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({a: element} = bar);␊ + 3 | });␊ + ` + +## Invalid #234 + 1 | foo.forEach(element => { + 2 | ({[element]: a} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({[element]: a} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({[element]: a} = bar);␊ + 3 | });␊ + ` + +## Invalid #235 + 1 | foo.forEach(element => { + 2 | ({[a]: element} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({[a]: element} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({[a]: element} = bar);␊ + 3 | });␊ + ` + +## Invalid #236 + 1 | foo.forEach(element => { + 2 | ({element = a} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({element = a} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({element = a} = bar);␊ + 3 | });␊ + ` + +## Invalid #237 + 1 | foo.forEach(element => { + 2 | ({a = element} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({a = element} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({a = element} = bar);␊ + 3 | });␊ + ` + +## Invalid #238 + 1 | foo.forEach(element => { + 2 | [element] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [element] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [element] = bar;␊ + 3 | });␊ + ` + +## Invalid #239 + 1 | foo.forEach(element => { + 2 | [element = a] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [element = a] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [element = a] = bar;␊ + 3 | });␊ + ` + +## Invalid #240 + 1 | foo.forEach(element => { + 2 | [a = element] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [a = element] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [a = element] = bar;␊ + 3 | });␊ + ` + +## Invalid #241 + 1 | foo.forEach(element => { + 2 | ({deep: {element}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: {element}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {element}} = bar);␊ + 3 | });␊ + ` + +## Invalid #242 + 1 | foo.forEach(element => { + 2 | ({deep: {element: a}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({deep: {element: a}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {element: a}} = bar);␊ + 3 | });␊ + ` + +## Invalid #243 + 1 | foo.forEach(element => { + 2 | ({deep: {a: element}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: {a: element}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {a: element}} = bar);␊ + 3 | });␊ + ` + +## Invalid #244 + 1 | foo.forEach(element => { + 2 | ({deep: {[element]: a}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({deep: {[element]: a}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {[element]: a}} = bar);␊ + 3 | });␊ + ` + +## Invalid #245 + 1 | foo.forEach(element => { + 2 | ({deep: {[a]: element}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: {[a]: element}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {[a]: element}} = bar);␊ + 3 | });␊ + ` + +## Invalid #246 + 1 | foo.forEach(element => { + 2 | ({deep: {element = a}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: {element = a}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {element = a}} = bar);␊ + 3 | });␊ + ` + +## Invalid #247 + 1 | foo.forEach(element => { + 2 | ({deep: {a = element}} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({deep: {a = element}} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: {a = element}} = bar);␊ + 3 | });␊ + ` + +## Invalid #248 + 1 | foo.forEach(element => { + 2 | ({deep: [element]} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: [element]} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: [element]} = bar);␊ + 3 | });␊ + ` + +## Invalid #249 + 1 | foo.forEach(element => { + 2 | ({deep: [element = a]} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | ({deep: [element = a]} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: [element = a]} = bar);␊ + 3 | });␊ + ` + +## Invalid #250 + 1 | foo.forEach(element => { + 2 | ({deep: [a = element]} = bar); + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | ({deep: [a = element]} = bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | ({deep: [a = element]} = bar);␊ + 3 | });␊ + ` + +## Invalid #251 + 1 | foo.forEach(element => { + 2 | [{element}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [{element}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{element}] = bar;␊ + 3 | });␊ + ` + +## Invalid #252 + 1 | foo.forEach(element => { + 2 | [{element: a}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [{element: a}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{element: a}] = bar;␊ + 3 | });␊ + ` + +## Invalid #253 + 1 | foo.forEach(element => { + 2 | [{a: element}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [{a: element}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{a: element}] = bar;␊ + 3 | });␊ + ` + +## Invalid #254 + 1 | foo.forEach(element => { + 2 | [{[element]: a}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [{[element]: a}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{[element]: a}] = bar;␊ + 3 | });␊ + ` + +## Invalid #255 + 1 | foo.forEach(element => { + 2 | [{[a]: element}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [{[a]: element}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{[a]: element}] = bar;␊ + 3 | });␊ + ` + +## Invalid #256 + 1 | foo.forEach(element => { + 2 | [{element = a}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [{element = a}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{element = a}] = bar;␊ + 3 | });␊ + ` + +## Invalid #257 + 1 | foo.forEach(element => { + 2 | [{a = element}] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [{a = element}] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [{a = element}] = bar;␊ + 3 | });␊ + ` + +## Invalid #258 + 1 | foo.forEach(element => { + 2 | [[element]] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [[element]] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [[element]] = bar;␊ + 3 | });␊ + ` + +## Invalid #259 + 1 | foo.forEach(element => { + 2 | [[element = a]] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (let element of foo) {␊ + 2 | [[element = a]] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [[element = a]] = bar;␊ + 3 | });␊ + ` + +## Invalid #260 + 1 | foo.forEach(element => { + 2 | [[a = element]] = bar; + 3 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [[a = element]] = bar;␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [[a = element]] = bar;␊ + 3 | });␊ + ` + +## Invalid #261 + 1 | foo.forEach(element => { + 2 | [ + 3 | bar = ((element) => { + 4 | [element] = array; + 5 | })(element) + 6 | ] = baz; + 7 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [␊ + 3 | bar = ((element) => {␊ + 4 | [element] = array;␊ + 5 | })(element)␊ + 6 | ] = baz;␊ + 7 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [␊ + 3 | bar = ((element) => {␊ + 4 | [element] = array;␊ + 5 | })(element)␊ + 6 | ] = baz;␊ + 7 | });␊ + ` + +## Invalid #262 + 1 | foo.forEach(element => { + 2 | [ + 3 | bar = ((element = array) => element)(element) + 4 | ] = baz; + 5 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [␊ + 3 | bar = ((element = array) => element)(element)␊ + 4 | ] = baz;␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [␊ + 3 | bar = ((element = array) => element)(element)␊ + 4 | ] = baz;␊ + 5 | });␊ + ` + +## Invalid #263 + 1 | foo.forEach(element => { + 2 | [ + 3 | bar = (([element] = array) => element)(element) + 4 | ] = baz; + 5 | }); + +> Output + + `␊ + 1 | for (const element of foo) {␊ + 2 | [␊ + 3 | bar = (([element] = array) => element)(element)␊ + 4 | ] = baz;␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo.forEach(element => {␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + 2 | [␊ + 3 | bar = (([element] = array) => element)(element)␊ + 4 | ] = baz;␊ + 5 | });␊ + ` diff --git a/test/snapshots/no-array-for-each.mjs.snap b/test/snapshots/no-array-for-each.mjs.snap index 022e5555db979e7900fd67272c0c05cee17e9eff..79f3f00f0ff9e7c672dab772f1a1d4b3d4c2987f 100644 GIT binary patch literal 12354 zcmV-IFul(~RzV6^+l^=@;00000000B+ zeFs?7%J+5>D_Bu4c$Km!Dj=YM3W9=2Q7kBmbwylYQ50CDhzi&{ih^K6MeGHv*M^F{ zT@|~Cy$fQ&d#{T9n@qAxHk-|s?5_U4=g;%Jf^R0tnaRwVGc#w-G~yvh4HT(iz2ZiB z?8=+_ZtglYYUmRb!GGrB|4iw%ZP_N_SCd6Xd)`lri^U-Ooy2~S5PfuT_R@1VmejWO z_btc@55OR6g%LOhQ1#S@C-?P3c(unTn)Uq7&qE>Gy$XWV%)3-|I@0Mt-7I0xy6XlW zKq0#gKu>?@?Iy3{J*qCbG|f9%bOwWLv#JEn0_gFR8pfOKw5S$ccJI3HFe41I&8iXD z4WPHak8QmH7k3?MRJhVVqS;FnvR2g*M8D674Qp?GIP?IJrT`}cK&pL$|u1GeSP!XTSN!bT54>VGQ8 zoZRnC=@i4VlG|G zpaFsy^}cpu>CsuA%m)TWEHhg$6NBt_5?vc0NK=CvwYtvzxV!hC{nu=rkrshLb_)rQ zh6rNp{XO8H;WuL!9xc8ZZ7-UzIXxj*+_;$vs`dh5u@{Evs+c!0Fz#zMpg!>-| zVlwuO^R^ZDU-;cMTlux*Tn-A^^#G>f#vKNptl2#CI=}uwgKsM^$Tl)0upPkk-ov+k z2Ufdu5v>?D*yW#*7-YYbNHanZvr+klOCv0bSGZs65Pr^I4~49IV+7$D@;chq3+}Ua z%AX}yuey1okll`7sTeL5wQmBhb&-7aco24)5huZ z;!j|ZEhNFW1bI#hnPA$(f;aEO2J3lVe|<+G``HRXTANn)N?CBA=OW&*b|yVfw?ZL1 z-x{>~Np~h0)#0}+F}pi5=uPPi46;V82|NI>Z4n+ds7~4+UOgKThcn z*?OXoy$#U5>wwhl53AMjDlnPuZntvRNc7J0OVjro-Mp?RGB_K6qBVzq@}Q46@NA{=-x3 za}UaT=UB5e{&|PA-9te6rztlCK8E0BEX%U0h`$vLrhqFGe1pWo+w0E)1;x@ULrWw5I z6yNB0Ck(PZI}x}8(7EyP7j~^!yp??;yZx5ZRUmOmJVg1F-Mn&4jE^RLUyz}xH1sgczN@PJL@q^U&GSP;0n%` z0d$=*KQt^d$I`|3^{nR&^-3_vcIZOj5P(;%OVg|=%^LbW%FjM`^w^jxkahMT@PI^a zR|N6C9&WwVwxVWj(MoF{$4S7j!C5y?P!7!poPW;87Mh*A_u1O98u4C2HCYFTzo)^W$TWO zf2wye=E-;e_`_9%7-UD0xCYSO_)0CC>y3PZYL$8x`QuOrAefS1a1QKOdqmz!I41Q{e#nw zqz~-10)=ef9^lH}f6k}fcy?({V)Bq$@7j;WAe%*^Sx*G%^RYF*sQ%h|S-JM_-)DYC zQOIWDSAO_Bx_Eg~ac7fe>z-X-R0o6XdlH$wz#HtY^^W$R^TA;10gDSQ4f{6 z4PSI#@WH#m^NG`YEX5#e(ucq>U@*Uf5rrdJCLvO@w0v>yOcbU9S~pjN%T z3r*+o=WQ4U`YfE?4KU1WPWPN8{cDU$YHj?n#f=&mWY-NQu$&K4{O7s6_h$Fn<3|o$ z-_3B(G!(K`hapIyLxN?W$>nCD_Y-T}S>rzrgKQ*;8i5Eh+^>#7iSwa@?`k-hd0RgU z!5}+=L zaHX*NHc?90$vP>q1{Es<24Rr>NMgYksK)~X4A_7T(I(xVt;zmV7<04Y+s zZRoHg9xHk6VX%*XWex^e%U}Y<03ofj>ozEM5oMnAepuhbe-sMYg(2Wdo4e<8#>R>C zOqR4NTI&p~R-COMF+UWf=yvL{=c~`%gQCnA^)<|SgF@Co2(G+6{~;@Qzy02g_gek8 zChrFZ*?uIh0)&QFAM)2(LD2H8ecFmF@(M7>^1=w@0tnBXm@`E0!}Emf527ne{4y}e zHXcb}7eH9w-5+|}Hz^qx?BEe#SpOypS=&+IO487)*|&Jf4kQ1I__NBJ8yI9$NSK9# z6tgode&l^$dUEZNnXR*~)WRUUi$wHj1Q~g*+K)~(M~*pD{y4_6@sz(&$hI2;#t`Pg zIl~(KTk}@!du`?#rh+~TXLkdPnd%zs7WFK;#@M<7(>0$#tHN262m*Tn#w>WTVrZ9o zbzj*8%xEzv&k2L9X(WL|0Anusbl>y&LbGzGt}{*=R+OWV?G**;ommf~D;_07owLjT zI&{1?Xm2?ChQwJBNO8x*=;P?dm;F0Bi(Eta2QbL~B#{)2AW^jsdt`(^_}Aj4*$Wu|guB>aFRNZ82*ATz;y~?9qQOKqOj4g!4~)`#45bsj+o)FJPnK>_rkIV?n=*UL5rD+1(kPZ)E(ve##&p46?gPbc_Qj zy7%}#|1dh&|4dsChxZ;^G03KoXb}%m3@n}CR}gmbm_z;59vwSvK_Q!tUs+w@b@=I~ z$F+~v4{=UQScO6M2?^0SU?zr4&Lb?VudgE&R5QS{pLvcEO+};OyvR z1et35a$WO9tCmb|xUt^$r>{~m$Q~yVFbP4Xy%KKfu@SY3+H<4Kwef)f46@ruxJ^co z8FLc1<>nSgR{wrDAgeq(27~N25<{ne6tC;t{~Yw-^ajjtXH0S$7&qf={iz5tyFi#_ z+~M|3yK_m?&_)A5&A{0SBx+3qnylye^LN|WncZvCZ|j6~FA)aWwIsr(Bgov#iyb$J zrsh`jT*>Ra^I}~Tvd;nLwY$_m_)CMrr)TcBIP-qTUKFw!GeA3kp|^hC{w4d@&WPV= zQg`P>46=SR3AoJy8m#)haEo(KhsKRBkKB~&Y=}bk9ezdcn*aEcsJtIYn&U2WlTR3A z-DVTG05E^S9NRZ$qnmH!7ft&3efU)jvJP_y+yPja=JeXx?^f<7cZ+Fl=2YZhknJ>= zz%_tHhiw`jo$CC>wprkWE&*@np^zOm4_tZi#i6Z(wSKDitLLq^3P5ef*{38Hr+^l5 zC9mw{u^wBO=XCio`^D+e7-XN5h@THyMeV>I20QY1oS4(q$N23kVAtSm%LN1)rGgZD z>cv-&wcc)Zw!?ob(!PNH1!wsr-s360I_FRS=kK%M-d2Q(TI@1GA-i%RkfDCddvj~1 z+Pef=1;lr64O%nKejqVp5lG?m8X0zP@8%ObDsmoWM?b?L`;f$hG>~F?KyTA8qNN*K zWUpRsI_f0~S@U#o<#@Y`(TiuC_G;$;_2;Jjt5L|V1IV!G9bK3mms^WhTD`1Va}f$z zgT>%Vr$vi=Z9fgJ*R^4;yPqkrv~hL>iKlpqv$i+g^VW78zidk{Uck|H7-R=z5U7<2 z>;dEFW8>GFpBD&Er1so8pa%-s?f8}HVYycQrcV9R&cJJ1=!j+*WLqvFZ~^^$8lKGKEjRT)pO~D|WL!!e<1j$~uev$9V#y>9~UAbee z{xdL+#MyZyj8`GZ8sj&5wI8kZ3QYT412cV-jX^e@gy(9IBD{RZq(1AO{gL)&fnDsn z(->rPNOaBytvbHb=3Pz7cYQA}2(mx10Q7G-dlkR({Ot_aQgKVcY z1WExml>c+XeB!Vg9;5g+-jUyvG067IA@CDmqkY5ApYw(^=(s4s?D5{@VJKv`tVNJb z9uKobvofwv_dfsU&GoJ3ppdm*2d>0Uys=UA&v~1#=*5XCMO`q+&LP2D5AN^!;GvV< z+Ckp?ioT9@D*#W$*~R#k_Zj;)-TQQ)+SV_TVL^^ZP{=mefFN71=D#(oQ!&p94f*<+ ze}6s(*)b%LjX-+_`sUeSDPhy+_3e@UgEtw2>|7Fln}8iO;*VOZ9tG9QG>X`PjqhiH zLbmp1a79p({_$g%vxARS+fzTh4IhQ}uKG@bAXcwph89&FSQxXN*C%!!`oP0d`H= zeYoOU)RKhGC!3^%c!1G4&U)p7D<`^c>N~|SzsZ_4UFsLU0%IPWy#laXxaMrrsuz#% zytleM)n|eU23f~E0!IOMU#Q}G=BR)CkvF$XPL)l`Mn>S$PjsU|uql$V|&EMJ@h3rm%eSQ`D+D{tyvs&jtC)xzo`-Vc+ zcqfAF_dC$r^Xh_olY5#CKGv$<02H$K@GIA+=hg`;`76PAI+FJ}KNE#)`Ytf8@!dXh z_WGGSQ*UfHiG9-a1Pa+MyMgugx!t>Yo4VCVTADk*XLNXf6tc7SAjlE3Ps(Ln;s0Zz|o`=NcBUWZkv)*vuDYTW@S@=KZaOBN*-DY%z&RM?ebx1@kU?^AlIRo;ZB-OML?jvd2hx z7Jw96p9bxFbs>M1!?lKXpQk;?Ae%{|#Zd$~*R6h}r(N}jlhW^>eYN&LCY3TQYSV36KD;bbvRC-0N`R% zSIhA?W9}}#ey%L1V;Fb_&YGSea2nv!`bTxvW_}xUHDJzzURXj33fb-_!Ih`8mMpr_ zF#dXK$@KM~r;ouPn@?i+DFi88+$b%-?mtVHCH2@gWI`+$IpXXKfGZK_f6i(WRQGgQ z$HlMP`b|I~%RddSL>gVWrF9rQ-U9WCt9 z{+2ZcSHWsn=b5{p)rwC+=JO_DkoCPn;5oo!=SwDsJ&ru+Q&4?Iyhk4B zVQ^M>65kqxql+-eo*)r;4W!szz1VSCz%BovpD}Sq1q(6A?jqrG z9YLOr&HR2U`;dM4@)dWwI(z|R3!F_R@eNOLxG9$^$QdF{uNP?u{J#<4~4ApEpX+q?Y4sAlZ|UfhOM<6G36l!*+nGWi$HxHJ3fEa z&8iIruYH{Z>hv6eLH0U{g||V9ztAs39)~Q>LdT6xGi=xwg{)^WD8Fe3Mq3;yyfE!r zo=NY6k3jk3>=F`f?jXo(N5PiI)x6fE=ET;xe?7hi2HDvpn%)H|vgZCXX67fOSFPUO zDn9*Ba}2WaB!1#4iaR;IdNQE)%M*c)hChpeRfw|(?|~7Y@aea>NlsYd=%VNYS5H@< zkafKeuIxwk4g}20trz`I!7S%9t{7xjlW6|{LEaiw3|U!JQsSL(Y*5OnE=DM1&jP%Q zHF5blsZ-a^CaV_<>OD=sARGRWfX^dfn>%cDGk*WB+UuyizRfb;G(sU;fnT}RJ>WxN zw!z9p^MezHCmUjr^?OX<3BU(GqsQY?^plq)8sDhL`|`x&W$Bmp0GkJAtzLruCA{P5le{_JJ)@fzOl=ih9fRyt5@sbJ zMKM1ryy1P*?#De3=T-^Yi9)sr;K$`=hMzWiEXQtnGv>IZ7 zChEKK?0HGN=onG7FeYw-yIq(l##<0F%F;4X%q3g#I=k_L1u>Rl#>z^c2Y!-xl|RFY zAKrjiA#VhD#*--MbVbDnuSeet@x7KB>umZMryx&c|bLgt!ZKLQ6X{R zq9~pj9<9D|s^_wE= zMb3R{*e+YdYDvx`-L+)8a4p3CESfqI5H94ue6g(=n4Bz8-HB8qR4g*hP?^K5ujM_P zFj*L%%T<+2iM5JREQx8OF|#R@st{s?aq%%x5_P~!0AE|kqjrAn8H}mQE|2&u!GejP zYp3=%6tU&@eVVH?SbLPx=RqYWrz2LN0@RR0-&Vsv`u*cajughi-rBy6y$i2@LU>%r zC|;b1B9fhSBO&t4V$_Heu;@`2buA>C`4Od>HRP(nHiY(2ArF#4j&xoa$2PMV+or^* zqL@^gX`_rH(HmiwjuZw>C&*|ISGpx6Gxp-kAG#|u3Z;~WSoO;JPAd>L+ZVK>QGS9* zq0E?+T2LDKXfk5bOQeTviO8*=mWh-xZZh~2w{YYXz)YqBkW(ep&nde^^t=v{&1;Zs zF7YNC7ZWd(JV#F$0R-bE@+`qP#TD;q;=-fig|0lY^-9b7T&AoCX)e=p1SHx3u&Kq( zAep9D`zTlWE!)C@x3s0lP^F|ZJzZktiEn3{cwu;)Oed(Fi6?C~`cz#{JgL&q2QkS; zoA=>d=D{pwu8pRa!dT)mZS5B{HV+l_suKM^qdHa4?Q6K#x1o3Y+3dE6K;y=URF9fhyRuvmVTD;t8}#PVa4h~D}2R6!f_ z6ZvAZzy&-yka)Hd<1y`JR)I+L+y=|$mM>oRfWN(jVS@OGxPgL*c%cnt(Te>(k5{uH(M&B7XDm>Oo@^z#OYm@9sE_E4KOOv5oOR$#; zsv=YjVZfZxr3CgKQSdO&2I!NwvqTl5#|1LuG_^22m_$q?n2%#mcn+_7e z9q58P5Q5XkO86Ct;0|=b9ooyiNg}rcU2X?w@lCL+70~bOD8AFNE$vQ6d-6`cAduls zM+eEBj`TaBDoQfNZWGzK;Qz4QPbziAwLb*Yy7D5h`i5jm|>!9AjsbNTs z(G@odGC6D*N;L=Z^NBX0Ttgu5AzOnQO+fsBK-DY1_}0n>z*Ot${h+V(C`!Dr&2_PS zGQ(oIdP`**=wug)SM3B$K0v(IJeh@RS}KMK1ePB)#QpV)d+bHSIJ+uw-(tO0W}cZo z&oo2YtxG&`z#Y5Xpt^*Nw1bX+ zGulB>4RE)EYLab%dK}fX2kBH@q}D`D9!tvLCyMI_I@mZnPjX}_ca1=kniqADEk^wN zNtA|ITgcH3Xo8gDmZVl(o?7^AP+kVxUwCOMFdRW#qYLAQfL^+cw1{QfGaPVuN+ zJlBU$ekqtvn6K061XjW5b=8}tnj}Icrt+e|MCL^S`opxnEP%SQepHH$2U;PUSy<`M zC4G;&h9T#Sc}agWQmJ!M`r~OzUuD-M4H+=HT*i?sM=(q&NhaFFRa4DvJ(~K`m76&% ziDsj;`X6r_@qDc!1`|79v@-4yR0gqdf3mP^}YFsKit|<(j;l zOQ&J6P_U&EjgP0L%#uqz0Tct3P+U&5K7gy$cvL4+D*MAVH`C>8OH(YcJaM^J!4dK; z3#o0N_!dpc4ozZ%rW#v5C9c6tkJI>|<##nRX8#VGwPb8e)m^#7vz&_NUUlorC0{Cf zj(H3-0+dMr+PHrh+vl(XFXoa#s!A5MxmsYOj(I2kS(&(l_s}LyLCT8d=+Je$8 z0uKtJ#;7`$FtV9qe1r&q!1gZUnPEM>;25D`jM$-&yzYQsC%oXLc9=*U;hkj*?~;zf zmuNC?m8+Z5Iiu?(5wm?QKLUUzd)_CK%|Z%3{r~L|`oBFw|3B;zdP&_Qq{J2>wRFk< z?GXCE9YVj=4xvD%2~+LFE@q0~r46eaCj*je5io=@(2TdwMAjTD@9e`hgJK79 zrpYALmxE4Qa1iH*S5|O5ro>-f76H{d`dGQ zL;fjr!cr@;pk!)Od^=ZPEDdBnL8^}mlN>Za>_-jLO^7i^7DbeZho!gSh1l>y<*#&) zWmPMHwWL0V9;TnO{F)7s#~9>Cu1lvzw4r=8IGpj*P!BzkcrUQ_5#sV_*|IawK~C>5 zPfiqZ@e8yNcam8wrQ$COVkbm}@EH6{HCwm(%KZSEFiK|XXvR~cwJI|>omJ3`!Sra6irpf$G$Lb(S*g+y7ksG$C4LK^D^`iHP# zT$N)i+kh0*N^(aLJVTVxs^KbtrQ%i%T^XeB60kQ_{02>$kv^)=(<$7Ik*J%=IfeT% z@PjYq4SN-bHB=#}rJnj#mNB-Wui~0R=?}IzLm%7fW0L*3+* zRUlczQ2Cq^m+`6^EE}UiY-uZd4vLJiqiGvQ4QXYMWZ>9NRcWT0YNgZ#SiWS5J29DN zhrk8v!GsAyO~q(Y42BE!@{V?sx}Tz&$h)Y0E=g%8Dj$AuF6Xrl2@CI2!RVr zoG{c!tT~BizzJBUvrs$GWM`XTe*DWrAn7*0Yjw0_OQ~Ai;?il@J3?WIMqN%gFdW1x ztG+9120k%@D@j%L@p4JW#q=z7hqjs@DoRCt)5`MbY~9W`E4etDBxQDmi9@~qY@4Y(GY7ro*t9y}=+IZf5=$Vt(#snVJBf2Ci4 z$kx(z;0CAD+@c*R?G~QWiwE|B2lO(3FQ`*wH&IK}qs()NFvHB{n5F;a zst#_5so2UD7Rks03@aFWB5aAS9YK{5k*=wf-zmqZhTQl)79CgwqUUp@#Qj)@V>y4N z3s(|JQYzGsf>kU=M_a8qGbj*^Uf@C%Mk^W$Aih!eYdzeZoGL$sSYs)143(~H z39D%82j=2S*FSazq?^E83Phsk)kpcfRw{16ZxKe5MIL%CN2xRZ;=IhuJg2VZvjaFR z^h$PxDc?0neT3i3&5czu`aBl%jy0_wBd>5U9jLFo5@tDiP??&#T9=)a%CgeRg~1D5 znQ{@(UnbyGDw;n9PDNR1Beg7@w60KUi~vcLBtkGAZHhwPJcQWuPi6^Sxu|QJ+x*Hf zjFyC9Q0NNcQ+e)>oUL}!&yWnYe54NyVtAf*Hg5=}1{+F^HMqWVEX!QG5-y%xU(XN< zh^0f5vJroi5UXq=(VJDG3b~a%uA0(Yay@Z--!D3Gn^P9(2Eh)w4%Xq?Jzh`~HD7w6 zv{HU;9WcVVrH1G$<*TPTC7r^kq}{n|Y3)V>*2-o(<`Bs;$FTg$ut~k-_t@03P~#Lc zNg(zx>apl*1_P{PBtQl=aYT+vXCdMvGtKO-dd2L<6uTDG%@T+xeb-bUm znVPh{GA&w}F`9;VHDONTL#l|AZ^gCJO37s@F5mh$IGjp4&r+QYo^4SWy;$U&AKVS4 z7!zETD|44&5t z_DOU1`<6@~mYe>52eB%0N*m)=t;i4g`nB}PpUCO+t1s?`IQ-1$%Ike0EJD`Z|z zSRew58VHk~3aNY(wUoFP634F`$uiR{GhVgP=;zg0P^5IFv=`$vjc#UXe5God`o|p7 zYVZavA$C_H5W$7~moI*6V6vQS$vNMHafQoL-lJu6 zsgWHE$!m)6FMfd~}m&hDwgm_1%@?o?z zR8(@!dGY2P#a)rYZb)O%=|B}yZz-0m0Df}p0ky0FS2;~rt*w--h0itH3_h>Wna4NE z1OEl*JqYI>IoYSCW>v?!ALjx^TP8D`BcDQL<-8OLa#s5D#3IWLhcdC{^VzLc>S*W%_#wM=n!!Vyaa z$^NbOX|PL1&wC8*z!u6^Qs%@K&Xu!|3NvKl{3*S4lF_8rV!^AhagsR>Ew}LZjB#kS z6}o~g0DgOhNi-E_0~tNtm0wflY9?G&AxgJ0fgL%8>Slfcr+D4_H5fVamj&&XjJc?l zM7i_cxV|||o#xANPuUt)w_=TNspGh-4Br7rX+jJqjY20m#gWeB-l|6QjXbuKPqpl{ z$5kb5&`D=TnGfOau!nlf9dxTb)}F^Q*5)+S=Bg4@I`u{B%!uFO)E8EXl-NF?ArJB- zhRn)1kgK0f75vAyNk!_R1nLnxYiLbXaIJ}PN({PeD0{jH+g_7H&H?%~t6uY`(9U6A zP!&I4doe~?&!A-v)u1hRFl81(vBj!Hl$5&(P*RZO>3q~vjbKfxJgF~PYI7j8Ybl!p zon${{;ji7_sM)O1D}=;9kZI?jR#XVr#@n6Vc;(lYM9EiDctnM+4liSqh~ABfyKD^v zQ=byK-J@;W$1P-UY+P@sz+&&s%5{|>>sOSvNNBuqG@uN z>_ur{(&2ImUws%Hm$}i&iJU752EiOTSKhprqR_b-2tPw_KsN4Yr+0cCfOyso2|*N-v7D#Jg?==B$=7aoH=vm%$Xfc5#%|7Xj`thUJ9H{wWPg&_3lgFa_sv>*`udXE);_(8 zv%`Eb$XZ|oP6Jdw{^{{O-C$1bghZ1*Km7|)$o8y;ATGXEq7*%s9aoC47CPihcnyv%Q<7^y>7kG+^?`yg= zyt(|xj*8>G_O$7QL3X1yf#Ed~r1mWv2iy00K~LN<6TdA5sTgF}kg(E0ka}N=7f%`Z zrfjM~`ODib#bp>|_mLQ{iy->T))p3oJ9*hGyj^xUb>kBZvR6rj)dDFhf=v!~S$*yM z_3Yda#__jN$Tq5tAoa2K-Agu|n44C;+sRLJbmx{0 zeeGJ^XMf(&ukoPV{22?wF~}Yw;a49)ntA^8{V?)I%>0tld&9b<9>*ZNgM>!|kmAQl ziyCjSfy=Xk@BXu~i5&*nJtPJ-L=fZgCmpw}xcA)qUz3&JU!GorLbeE?d04YfgOAm0 zx%irYy?y#WR$!1dZ$#iIK=Zo~-g+0UcIw7oF=D9GhtU{h^$iH*0ho;0e{pHJS?LPb ztDVA5`{$*Yx*G_Hx^2!w#PZY98@hg=He*S*W$x)6SXDxFJs*gdo zff0e_0H&MXE$eGqd9n5V&u=!LoC9hVXFVH(EBkLAj!52o{Nb;_%qHWGx5gm5mqch2 z1Th<4YS{Ni#No!H&vn{*>fsvWn|mnmmX*W8mVI75I5#{Og>1EE;7ZNI zWs8TDp6{=A5{r z7-Wsi2;>1+CIwGy-rI~b=Tn~L9FJW;QOLTtMv%76Yj~v3E9$d=bGU??*O2dx!n>$fGa0>D0G+e7y{KQ1)1C|_Fs zqWMP*vQJ3FSb-FG{xhN6WUkZx0b^(Ov3NEdgX{?seXJ3rL-6QF_1l{|)Y7Z*w&pEs zcNDTW0XlZ~%lPMkRvnLG;}ln$Me|X}2H1crFPk6uWVUg^&cKb=Usg^|!63VpM2~g| z;t;&r*2DJR)B6)@mDRK_>4iadIf>To5yWxhLC@bdJC^Y7KP}zc)2BZM*+>!}@DzJo z1GC@R*DQ;B)@k96VW4(#c7rW~bT(Yy>3TxTeRa%irk&m1?g|Q7KRX0*y4?L+=DfMa zmSuR%c}R50@{nN@nxT*#(-~YDjBL2HY1Ezdn0YUQvQ6L$&Xxgm zpE@@rG-8dpQ?J*l&l>2w#30+jiNHPpj{>Kr*;89I@P4>I=XA;8an&H($(g`i68T+# zjJXzOxzxI{W^MjTOE3G$+9+hZbVU%amVRfR`D61~|7L zo*>2RHQqJPg)MDgdiKXA{dgeparO#{5nc%5GvBgD2-@Q|FDB#PmJPy_P{@`8_-*nX z5q2`y>uceB!@3LGRAP_~=|ModCm2gd?awO?Zoi~(Rn6Vq@2>{q7|u>4(Wn>DP_*tw z-|pP&`?_B1Qk$Oa+X{nh35o39AVs$WrT1&q-95kg9RE3aBY+ggS))E6cOGdy*DM*N zJtnDbv(K%rYh#er@h0$l07&uCeR;o4uC)_J4_@EHVCQrcvSWRKWU-4k??0u&B;;PA z_MKdx2^eIrk%$(%J!^tOR@)C;xmaThKRxtVo%9&}%9XxDFvyM| z@fKiIjpur2QWv&q;y>$9^PsX4j9>>7s5J!qo!%p_)7CibX$n47a#L{P|wY03<}v#_?345o>?3wAaOLfpPuW3xZFg_D+va0#;V%rbMI;>j!S@fVF>KcPItJPIBxa5TDQ0Dv{VM#q^w`=%Guvigu7yF? zFp$7afYGP5es!ridfds1N73d+Q_rH1T`>x1v!+37M%4dL&6~CFwwrB`0Y(CxHR2-3 zxM|KoE|E{8w8!glo9BLAia|DoMAIOUV&3x=!@Jehdu8Q2qt%c?2Mn?^NSFqL6c@aD z?)-YLMTJB68OIDND^SSp0EjT@ZFt%3<#5NGid_ee)CRo?X9tB4u;zgjciap=k2SjF z)7g>l9PD3&L6%42F+gPPgKk-2_y1$|!sM6n)y-DU&>!%L!!XRrDMj!_udT`l9@8Zz&hwbXEcI(__GYZ+-W5G;D zuk{%3V;}S9?W}h7EjoE2m>1#f zJ%CxoyzFM3Zr`vuoirV7=m+W>XT72c+y+SNlW^wWb~Yw=+YQX0nCZdCAj^*-U>^(S z#FrM?=kcc%Xt}TCblrAd4~6UwfH@s53<~;I|KgLA_gbBNzjZeXS#BJHq(9eLKWFcf zy=!O0Z7|l`HVK1l(+LD>#Usev8hgUbPCpqQn@|z4vB1#)h3rB6iq2J^gqM+pzmSFY z+f9wXV34hqKwufb+<9r%Z%oFv+~9v}^5>r;uV9e<|1(mjw%YS$`Q?w|j#ESMTOP z=fl}PDFiM8WSz3U;aa%1bHcLCeL21*>oCZ6n?c|+!189##>cHSJ;UW4&FGWw*Bd3+ znE)xF1r`IRP5ahC-(yS2s1_Jx^-~G#0m#5>=_c1W+TYjxGtNv zH>ueEv!XcA_UJqyM{!nf4!H8{?F!SpYR&6khz#Y`ng?e0I6IL<>vS-CtN3u;bkYcI zw=w=!o)JHjG04s*(Pb{K_c!?ZwQyMd&I{sA9_>yZfkO5SG4mN9tc<#CNeY{ICcq-0b z#;?53+Pm@Ymm;nFZxNw^_J>f&_MeX+1*00(TJyG(crAn^vxD7~E5r+pXTkS3qOM*((4$c)6#VRzH7a+uhX_8D0~OG01jU zOyDrUj&s$VPnP(^9eQ*77U-~~Bib1x7ME|8A zMGnVr(#cpC}i)g zM37>44(5@6>&cn0pyfkuy$3o2&RVP@kPlGOv{QcX5te5C7GkE6-#s^DkZrq~zzu*S zUswO~_c^QoE!Y2Z?UKBk7-Y?I2gjtJWPg#ExDM#fSNeR(81*!x@lYS^W3|=8F~~k9k+L2^PWc>;S^T^_ z|N52|oBbCN87U)dcY`36=i`&uM`xs=yNuZm6RMwx@(tX_zG?US zV)5xHWJl+ND^F6FEV$kv?pnsnl=WXz#$k{xC6T-ZNa#fk7w*^luyk2c?=8b7#(=p4 z&T16^i4lJ0cWRSBy%Xh~7rk!pJrRZMB>YN*;pLllrmGtbI$5-<+Y+D|Mvu~_d zUA=$D)z2B(*8Cg_*?wCQ=VAgKYmD1U`~Dyc5ja)0dX%KFGRrf55qM=j*fv<0H;? z-UY6lw!3eA)U;>numZCOMqX_&$W9}nwHu7wuRlIZsohCuOl--;-W_jRVvwCmqV*mG zdE|J(_@LXN`~8b+%!qR<1acc^H{e%x)F`!I=6lm8@ON}<33omQ*>5CL_JVSZU;OiU z&H>wsz??TycgUPjeGjLV~}mNk3c!VGyjTz>s^c= zuq(VWYi(w5AqrXEesJZW^_Jq&V@9d1a1R7--Uh~_9%E!HacPKLW2eaP{__bgdk! z8XN{~fcNA_>|_V*;@DeJMORK#qL5vNU)hW56#336s2la6IMwl_GX~l3Br=bHnX_T# zu$8x7zVwVgJS6>iH$xP%W=Fx?&~AfEv-j_`UPl%VXp!}%Aqv@>0H3@KA5BQtO?t-b z;pTre(-4EK%`pP!06wi7ywAuyZoij1Kj2o65g8a{osJW@2T&RPYM_x`gJO4wYNwZf z+}jL=Y}XSA^3`*dPQ0n%#Rp02Iv+?!HeisQPom99kYdNxl-T1^f__D!mId;>n{`2kEvoXjTo*|G6@VoEi1@jiy z^9k8p(Q@5CO~E*gv$sgNp9LwNMy~7V8MsdSJ-NYS%*_)8T(SkHs|zQH8*MINEG%?6;FrXy`i&%h z9KRSIXB2qGFHSHoCdOQl zmP}|N@=k0ELY7|oLxr^={v^Cgq`gJ5cEo>7Yb%7Tt*}szc_^Q6K~!5fud32`;k*b? zBe2du3To{nf}8EY%{oLib2(iFslmT&oxxRma5Y)9t`-RD3OtO`NXQ$hwUS6Jy$S_Y zD03Fhq7@Qdl{;yfv*K{0qq!4>jalR~G5sKZH17v5Ve=JX0a2D1M)4J(L+aHL$ z37QYl5kOJ#k57^oWGS5e@mjHo;zyZ_wJdC!%!V&)O@jYhu+sXa=La+c$(9xx7a1HI z#*gG!a;h?xn9OGDbD`9*tw{a)2Z5diTNJn;(x!sB;o;_7D^8Gwxbz~5U`we_m<+GX zs+%a;XPA3zJ3`66zfi=4b7NvSUZ6!MlHEl|2TBG|cYx@C6Zk(mf`0^vm6;oDh2Kex zNgz!p$p<=!KhRO|z|QysX$LGXyt6>TA(H>~g8VC)cNZe>lzJAvfI5H)N%pE7?JPN< zQ+guaOF2nN#7jAxaQ^73E-CVuWU{SLZ=mmm)MwC+z)VXth0=y1`5`=48^OTuYD3C5 zdD@GV`&7_fHVed(lt;R%Np)dbiGyTF>O?>|k$?INbj^U|WTEIzq$;6;EQ={BY4q}1 z+Or9jh4#5jMY%|}R?%ilsM@fmHib|HLNqTnE;>>u4mk1PYx6kN!LK8YGF3I?5uYW9 zI|&T!)bWOrZK-1)du;~mh*HKpDCDFJ#BxM{3i;5rX8ET(C~ovaNHvlu{c4(JSRUtw3byzMvnC z@#aSGB<7^lielxXNn}&JMuth&NT6iP#G7$!bR19k935Ub$QCD&V-9q8XI%QmhDFBl zoH+uGPOLs=)73|yc-v6D$Wk&$vNB|a49$R3}$tPjw_M+cc(h|RCL7Lwzk=m+7_W)?S_3G9xnDn;&c zCsaZ^KK(pOYyyQQ$e2HgE(wS|Ms4#Yg+KWp`r@(%0I7YE@n6&M>hluI5m5 zE?hXY7u;lPD|VBuoz$D`g*SB&zX|43hZt|g?&>7G%R&4uN9lJFS&xg1=7F!m4GQO( z!(rS`m~lJtjN1_z7uPWHE5eN1iD%rdqtu&(`L+|!x1FQlCT=niU|jJ#I}7f#Z!dPI zy)AjCKR1BpPJ27yo%Z5)!kp`Xc7*?j%(b(BfY<|snYI_tw7nzs0iDSQn8SrHkQIEw zAo{Eh!m93ID>)*TVW1<*u}l%2kWnv`)?KP>CGtCq&?+mxs}MQQ4)r{^e46^eD_J1y&Hvy+DM`FoKEEUbPOUCcNa+yGO)zI3c zgpMFGZNbF(&N5{JWn2brQPxmiwVE$_kE(+? zAVfZ z%9f<)!abei!heM`l>+|q>U5(LUpy9mQ}s=NS0f6UC)lx0{H>pzej!9-pIy>TQH5fX z?ygmOifR+7O`4rZshn#urO{7G;b*S2@0N&Fk;a^;oZ}YLo)AdeVClDqF@9MLWlU4W zG{QIoUCFP@QQiZX!=X2mn45DHT7Cr&V1I7GmlW%8dta|eH~cRs)`{(Ygn5*5O;z{ZhyN^W6lRSbtrJHNYN1<;(!aRs`L6DJsCTjd4G|I#HsO3|g6g{f&|e%1)G zLZLF^s+2aumMS8&H%Ju-f(vci(u)JC7nu6&A~d-WtITnd*>JT{WISS8l|7|cSUF1B zSj7}PY_T*eE2;6Rr0}uah&m`D+GO^C7*WBdyewf_gdTK#TYk@0aKCg_dR4_FQ=u(1 z32+6Pn#yZ4Y*e?bg;lkBBWKApjj-X4tllk5xG~;|L;OjG?nq9Sy`_m}_AXW_^WtzN~*&bG_*;S&9YUkB8ZkuT&d>MYbet9l(8wh9t$0*<$U`8`A`4PfBOG}|MUy0 z|Fi<`(<;f5|9MaU&wKi>@}3T$GsUPULL6O`1hr^Z>9RJzF;c9URzV+{Dqv+*eUi)) zE54}Cw17S`rsK*lyGYE-m&%!!tF{uuw(3OVU{e)U^Y3)95l+SBo206$-r8D_N{X#I zMI&B2GBc#aMrHLxs#q!8UawHh77fL%h@+8CLE>Tll#d&zOqjp5%)Z_q%!=b%6w9` zz9@B_!(X_Pl$b0wX2Er#p~P@SO+`EU42A1q(qi(9+)ru7SYCvb z8*xa36EwOLbR@-hRm;F9lDLpmRvs@G4qSB4Qgs@{{2QOA!cdTtfSx>M3Szg zvx2R_@~%*`?hyU=f;~=hhnrA%NIZv#DMw$A$?A3L#C;FxU7h4l+2p%H>8Sqw zX=ZADbX8OmMZ)|1@vuyixe>E7^%MCb)QFHOxJOHId#4Evsd|hMHrnBGjm%h>pW_&- z#4;sxXJmb?a+F|2P4dIBbDS%!{!BS#Rn8f!GM5A6ME8@cvg?{@i3I-L@^lgQj-eJh z084wMT5R=9dt{b0Suueh7NW@FwEP%IOh4sVsU~t|RDZ%yS!Jsh>fJ!;rX7i}C7Sj| zQY4Gwl4`WjH%x;w0G`tJamJAZH)!5U&ODCb7*%u`#tRDc)*CekU1YMPK<|jF)|12J zs%HU8G;ta6`xW_Kt2NoQmCmbJz0f$OCU@!0t14`;6c1w2X9x#xFVT3zG|y9yPa02T zm{w?%X8OwUGORZWxL+_;EVoK^U4l8^B2|exUSGtt29G{>dG^eWgoXk-eQtZ|tm!vKC4`A4;V?olL(x)$AY|Sz6J- zjd2zP+ZU;E-sr6#^5@V@^CByXd7z}WR%Ni}B#H+Of@=@5cWYKvaUh#hVqvC4qP);K zo2_7E<5s}Ltx_pyEZjY5`XY13qiJ$9A7%ZHn6^G&x~9RZf9FVX6R8XfDN}u5y8_yb zIyVtA&HqNtdvtW=w08!7b>Y~7zuLA{#bYRk;o+5vtXr|xuQ3PFvss0QCMsx@WAd&4 zf{4uG$4XM9Tc{EzPhve#ib7F!MxW{duKzphQ>5_H_Gg7Edh#LaB10FbItZ^yDF~8r zbQ!&4zu0kl>O2oJhC11y@m7+v4~4m}RJJT%Db@FkurK%7-pDjVrcq8K8<@mrHbLwd zY876HSofD$YZYIGV0Z={-C8*ONm~$vKQ?#cMafj`MfV{Hx39xNN%mpiBE254^()7}$ z_X$$=3zcPmy$Xn)T+6n}x7;qFXsn}s$0`m`pqZybMqKjlxR`KlZ1iJpH z^wHZ)%hQ{tJfZj*wZxzPg0}`FODUF=z^tjXuBFl*Em=yn#ANNRq^=~#;ZT#I%;YX- z50oKUR0_u`IY_b)k5%oiL~&Ava$&?j`BQbKS&-qFrpRcA+g7+j2O%!8Yk<5_U{De3 zY>PF!pFyD3m1Dy0_2nZ8sIg+=L(DCL+4=?>1)mAJocrb!!H<QYU++pDCgMvKK_rQ}qRV61A2 z7sM>W8*RKGb#08372~ZVjk!Tdy9uq=qvC5*Oa$mzNHzKwFp8_Tm&K?p ze=N9~P&=hI62(HAGktTYD&3di{(@Z1Zm(dt!vNn6Lg_*@hiO1(8~ITNq~5B+-o8Rv zhkK~m`G=`U%G1c+gitmee^5`U(-W0vC39rVN*GN_n2H1%*IbsoGm~gOyo7V6>YrQ* z-^?u{dt)hEV+9MLYU@5szfP{NhmWMuFUJU;ufCW!GLIgi zKQ&BUt`>?cqf|M6&}|D*OB-g|dV1@sIA4%spUsfH=RvlCR^1j_uCy+ro{i#Jnq6Q~ zWt;dwnjEsJ*LqNznP~JJ!buOt%As$1QUd7+ck