From 1edc2efdecbe5a1c120f0eb248e64868be46a6e1 Mon Sep 17 00:00:00 2001 From: ari melody Date: Sat, 30 Sep 2023 07:58:03 +0100 Subject: [PATCH] server-side that!! --- .gitignore | 2 + nodemon.json | 6 ++ package-lock.json | 44 +++++++++ package.json | 23 +++++ public/favicon.png | Bin 0 -> 25872 bytes public/index.html | 9 +- public/scripts/main.js | 216 +++++++++++++++++++++++++++++++++-------- public/styles/main.css | 11 ++- res/favicon.afdesign | Bin 0 -> 89584 bytes server/main.js | 122 +++++++++++++++++++++++ 10 files changed, 384 insertions(+), 49 deletions(-) create mode 100644 .gitignore create mode 100644 nodemon.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.png create mode 100644 res/favicon.afdesign create mode 100644 server/main.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10f3e1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +certs/ diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..a2715dd --- /dev/null +++ b/nodemon.json @@ -0,0 +1,6 @@ +{ + "ignore": [ + "public/**/*.js", + "*.json" + ] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f4eb5af --- /dev/null +++ b/package-lock.json @@ -0,0 +1,44 @@ +{ + "name": "openterminal", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "openterminal", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ws": "^8.14.2" + } + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "requires": {} + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c6eb13f --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "openterminal", + "version": "1.0.0", + "description": "", + "main": "./server/main.js", + "scripts": { + "start": "node ./server/main.js", + "dev": "nodemon ./server/main.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mellodoot/openterminal.git" + }, + "author": "ari melody", + "license": "ISC", + "bugs": { + "url": "https://github.com/mellodoot/openterminal/issues" + }, + "homepage": "https://github.com/mellodoot/openterminal#readme", + "dependencies": { + "ws": "^8.14.2" + } +} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb0c3644c6b2ee44a0dc8a5751b5007b1929d4c GIT binary patch literal 25872 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 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index d466cc0..3731f6e 100644 --- a/public/index.html +++ b/public/index.html @@ -1,17 +1,18 @@ - Open Terminal + OpenTerminal - + + - +

-			
+
diff --git a/public/scripts/main.js b/public/scripts/main.js index b08ce5d..c4a7efc 100644 --- a/public/scripts/main.js +++ b/public/scripts/main.js @@ -1,45 +1,106 @@ -var TERM_INTERVAL = 0; var buffer = ""; +var send_buffer = ""; var content; - -const banner = -`OpenTerminal v0.1.0 -made with <3 by ari melody - -`; +var client; +var pre_buffer_chars = 0; +var term_interval = 10; +var ready = false; function start() { + console.log("%chello, world!", "color: #b7fd49; font-size: 3rem; font-weight: bold"); + console.log( +`welcome to OpenTerminal! +home to a little shared text buffer. + +i hope you enjoy your stay here! +to help you feel a little more comfortable, i've prepared some commands for you: + +- set_colours(foreground, background) + changes the foreground and background colours of your terminal! + \`foreground\` and \`background\` must be hex colour codes, such as \`#ff00ff\`. + +- set_palette(palette) + changes the foreground and background colours of your terminal to one of our many options of premade themes! including but not limited to the entire collection of catppuccin mocha colours! (i really like their palette ;p) + + try it out! type \`PALETTE.\` into your console and browse the list of themes we have!`); + + const foreground = localStorage.getItem("foreground"); + const background = localStorage.getItem("background"); + if (foreground && background) { + set_colours(foreground, background); + } + content = document.getElementById("content"); - send_text(banner); + + buffer += "Connecting to the server..."; + + setTimeout(connect, 500); + loop(); } function loop() { if (buffer.length > 0) { - const carat = content.querySelector("#carat"); - if (carat) carat.remove(); - - const char = buffer.slice(0, 1); - if (char == "\b") { - content.innerText = content.innerText.slice(0, content.innerText.length - 1); - } else { - content.innerText += char; - } - buffer = buffer.slice(1); - - const new_carat = document.createElement("div"); - new_carat.id = "carat"; - content.appendChild(new_carat); + const char = buffer.substring(0, 1); + insert_text(char); + buffer = buffer.substring(1); } - setTimeout(loop, TERM_INTERVAL); + if (send_buffer.length > 0) { + const char = send_buffer.substring(0, 1); + client.send(char); + send_buffer = send_buffer.substring(1); + } + + setTimeout(loop, term_interval); +} + +function connect() { + client = new WebSocket("wss://localhost:8080"); + + client.addEventListener('open', () => { + // insert_text('\x00'); + buffer += "\nConnection successful.\n\n"; + buffer += "=== BEGIN SESSION ===\n\n"; + }); + + client.addEventListener('message', event => { + buffer += event.data; + if (pre_buffer_chars == 0) { + pre_buffer_chars = content.innerText.length + buffer.length; + } + }); + + client.addEventListener('close', () => { + insert_text("\n\n[CONNECTION LOST]"); + }); +} + +function insert_text(text) { + const carat = content.querySelector("#carat"); + if (carat) carat.remove(); + + if (text == "\x00") { + content.innerText = ""; + pre_buffer_chars = 0; + } else if (text == "\b" && content.innerText.length > pre_buffer_chars) { + content.innerText = content.innerText.slice(0, content.innerText.length - 1); + } else { + content.innerText += text; + } + + const new_carat = document.createElement("div"); + new_carat.id = "carat"; + content.appendChild(new_carat); } function handle_input(event) { - // console.debug(event.key); + if (event.key == "'") { + event.preventDefault(); + } if (event.key == "Backspace") { - if (event.ctrlKey) { + if (event.ctrlKey && send_buffer.length == 0) { const last_space = content.innerText.lastIndexOf(" "); const last_newline = content.innerText.lastIndexOf("\n"); @@ -49,34 +110,108 @@ function handle_input(event) { } const word_length = content.innerText.length - break_at; - send_text("\b".repeat(word_length)); + for (let i = 0; i < word_length; i++) { + send_buffer += '\b'; + } return; } - send_text("\b"); + send_buffer += '\b'; return; } - if (event.key.startsWith("Arrow")) { + if (event.key == "Enter") { + send_buffer += '\n'; return; } - switch (event.key) { - case 'Shift': - case 'Control': - case 'Alt': - return; - case 'Enter': - send_text('\n'); - break; - } if (event.key.length > 1) { return; } + if (event.ctrlKey) { + return; + } - send_text(event.key); + send_buffer += event.key; + content.scrollTop = content.scrollHeight; } -function send_text(char) { +function handle_paste(event) { + event.preventDefault(); + + if (send_buffer.length > 0) { + return; + } + + const paste = (event.clipboardData || window.clipboardData).getData("text"); + send_buffer += paste; content.scrollTop = content.scrollHeight; - buffer += char; +} + +const PALETTE = { + ari: + ["#b7fd49", "#111111"], + green: + ["#00ff00", "#111111"], + gold: + ["#f9cb16", "#111111"], + bsod: + ["#ffffff", "#0000ff"], + starlight: + ["#d2b660", "#110717"], + catppuccin: { + frappe: { + green: ["#a6d189", "#232634"], + }, + macchiato: { + green: ["#a6da95", "#24273a"], + }, + mocha: { + rosewater: ["#f9e2af", "#1e1e2e"], + flamingo: ["#f2cdcd", "#1e1e2e"], + pink: ["#f5c2e7", "#1e1e2e"], + mauve: ["#cba6f7", "#1e1e2e"], + red: ["#f38ba8", "#1e1e2e"], + maroon: ["#eba0ac", "#1e1e2e"], + peach: ["#fab387", "#1e1e2e"], + yellow: ["#f9e2af", "#1e1e2e"], + green: ["#a6e3a1", "#1e1e2e"], + teal: ["#94e2d5", "#1e1e2e"], + sky: ["#89dceb", "#1e1e2e"], + sapphire: ["#74c7ec", "#1e1e2e"], + blue: ["#89b4fa", "#1e1e2e"], + lavendar: ["#b4befe", "#1e1e2e"], + }, + }, + community: { + jorun: /* @jorun@meta.jorun.dev */ + ["#0080ff", "#0d1020"], + meowca: /* @meowcatheorange@moth.zone */ + ["#ff4000", "#130805"], + halloween: + ["#ff8000", "#1a120a"], + alcea: { + peach: + ["#cf4a7299", "#fff"], + purple: + ["#7f00ff", "#fff"], + }, + }, +}; + +function set_palette(palette) { + set_colours(palette[0], palette[1]); +} + +function set_colours(foreground, background) { + localStorage.setItem("foreground", foreground); + localStorage.setItem("background", background); + document.documentElement.style.setProperty('--colour', foreground); + document.documentElement.style.setProperty('--bgcolour', background); +} + +function clear_colours() { + localStorage.removeItem("foreground"); + localStorage.removeItem("background"); + document.documentElement.style.removeProperty('--colour'); + document.documentElement.style.removeProperty('--bgcolour'); } document.addEventListener("DOMContentLoaded", () => { @@ -84,4 +219,5 @@ document.addEventListener("DOMContentLoaded", () => { }); document.addEventListener("keydown", handle_input); +document.addEventListener("paste", handle_paste); diff --git a/public/styles/main.css b/public/styles/main.css index d978aef..795052a 100644 --- a/public/styles/main.css +++ b/public/styles/main.css @@ -1,19 +1,20 @@ :root { - --term-colour: #00ff00; + --colour: #a6e3a1; + --bgcolour: #1e1e2e; } body { margin: 0; padding: 0; - color: var(--term-colour); - background: #111; + color: var(--colour); + background-color: var(--bgcolour); font-family: monospace; font-size: 12px; } main { margin: 1rem; - border: 1px solid var(--term-colour); + border: 1px solid var(--colour); } pre#content { @@ -31,7 +32,7 @@ div#carat { width: .5em; height: .9em; display: inline-block; - background: var(--term-colour); + background: var(--colour); transform: translateY(1px); animation: linear .5s infinite forwards carat-blink; } diff --git a/res/favicon.afdesign b/res/favicon.afdesign new file mode 100644 index 0000000000000000000000000000000000000000..688ece8f41f741f01fbefe100121dabf48702066 GIT binary patch literal 89584 zcmZ^JWmFu&()Qx+?(QMDySsaEcPGJFJh*#sg1bww;1XD5ae@;(xXXUz-uwRi>YO=U zQ(ZmXJ=4|obWH&uN)jjl0Kmo5L!Cy!#m1QC{pOt}|5u{@ul%nR00?g-u>QwG|L;=w zaP@+H=V@f^ofuo$UIFrSgitXoPj+gUZn8rXfc`LF@T>^}hC42}IkAx{n;cCT(JX9` z=;B*Z72`frXEw1c6OmwQF2}uPBx!3Cb=p=Et~%ToIIW-J4YGQdtMXNKn%=RO&*WV2 zln9pawl(1;Z$agR&zVAf*J7hhHugzp5CfaoXN)sf0+y*3h|ajO2++9JK@$XQvdHEH znd(*Q9Wxm-C5S~&2o8IYkWRWiH+~hlp^|?+)7B8b9IA4f$e8}-_MBe9q)+4mVaDRw zSy>`6+)_HO=WF`~bQZfA^Loax9Lkyy$)enU&+;6+_}2 z&;*sGM1qg&y}vX8;ZKQ|S5^$-?Ix}ZYGl*WuXsIPbmX5rG&f>M~aN&sYKu&ViP4y1R+w0Yk( zKsW+vd*PSwLPE;-$y>bZ#rH+wMAK-k=*f;uy>Qz|V;gG%t*uD!K|^m74ZRm)r1KsM zujvY%Hxw-e(y!(wlF^hY%Rt)WgZRxmIx|Qj>J)B80umncC=h-^ESO!y{8Q3ie<-53 zI~>;ss8rE#+l?9R%jpC(?d)R83R5+s9BMO-Bf_;e9POhV-#d}y_2bP2mFSPYYP1A@ zqm{H~381bD5EV>6GM_UkgG7?~IW=C1%jm8E&#uwj@rPhBq;lH@=-VGWtw1)5D0-18j$F!O52e-mM$@Zno4 z*@stvfNxhL;0(cHVvSJB{zA!bSqpE_%QLdPE=BPlY#;zIbsN{Xry=7+239L5InaS%!G(rv8_T-xEUr8;|wk(CPV6ck(MrBaoh)g&adeVee`O`&gO&Bew%l zW4KS6qOtr?Ae)e`zRw35rP;GSE=x`(Z)-URi1FjFFvNIeTo`z!h>%8}MXg<_rZ>?o z>Uyh6%PI13Z^D=vqulPWy__H{c2@8+o%LIq7@VY|8WV&#^2B<=yp& z>$7l6E98LY^9F8A^X!|J38SB?FAbyMegx}TnjUfM5=->=FGt-He442c3Qfz@pkCcM z^6-lx?SSI9vH{%Dk+NZYzy7QH3cj|z*`D^5p3{7OQ!@3=?*|7rLjM60vY0tp z(UFRKh_)Q*DucyZlH>cBnysb3l^~_sEzQu|+$J^^#XAMik9fWEv?LGb<|<2ZNwvS~ z$$RfKJ=~jSF~&T!3w5efGB+I7jQG5eB6jBt{dwn&s5b3>?1aH)?m>=|7n>G?0|eenkYFe0 zJ^|q5R8j5KQhDj2fYZ_9?e>@MFG!tjo9-GgKAQ-1mTV^jOYBU!Lii@(VT9UcD~AWZ}}82VaDXalxHsL$IB@$REOhKDe_k~N{eVST5?WVl~VFI)u$fC z{0c4wIaO*)V&8^r6+G)w;fu@jO_PWj?LR;j4~`;?9n^}7dp*o-OMS&4T-n_h{QST; zg?}3L0PR6T=Q^}>h&<);Qo$tCgh2Ey#LOx&^W-Kug*1C$j+`~qQF-|CbVU2c@9?6r zsj0T2+et*ag#6tcSW0Fl742w0VL=gT&5~%j3;!T*TK{KQJE31%XC!~{pL(k@)$Ko;+kR_g{`y;Mo-~8fqDmkYZaR!jATe()H@@?sgJ%P~{p$R6wVdPdc2L zmC7jNozLKz(l-(^01_nQ%b;}@yQ`W)W+((9F%8{o$~u7&gT_%M0gUC zA@Xko8xI`std$cy_B;puzv_U1;3St0lTWfKE&3b^1DDF!ur^#@I2U57tjFRhJ`x_n z<0P?vB@t89pOS}Bl%rwQ;H7zdSVf>_p3$o8Gf~=qov&G{>^{rpR&LcY%W?p+s)M`r zvc5+H)og~FE>ks?o5WKFQ0*x5nnMUOp`U$s+XH3pZhnqA>wNhSDVERkgrp~z9@2-T z&Mu=WOIez&4v7(4Zht=|8L>Jvoy|fuPN5mjaF}*^7Na$+n665vZnTeNZY_vm!juRs zNSaC8=}L-WQs;n6jfv&>T%j#LjQa)~Y~fJSbR4NH1~JFRS5f&s(~&H8C&Wtoo@TIad8w6wr=2<6~`4jyazjA&hsMY#GIZx0&+yRgVl!(p`E} zxQ{f7RD>apK zG6& zTkl<(ZACv`?PX{;3~q84?!~J4QksEzgQq(6_KYZ+(^C?XR!(*2Sp%VL77p@1?Z ztKw_vp!B*7LNO#pogj(kzXZa_3z#Ia51*Y|La2{7gB2%`u**8&Pt{7e6tus>j*!Tf z%-V5dhjGKdgAqmz4>+VahPZz+Y3SW@s2scOuqS^(nI&MNNM5mHHAS3oPmNLnwpRrJ zUVJ7LzivwkSsD<6WGU{PlyfSBBdQ(@moST^38uUfv{aSGf=eWO1`3kQm2xo_e>khx zpjOhGcn2*DSu~RR*%qjD{4i+o0)v+lRtdSQrom6H zaYvG$kJ%jWk|8Cp@;C~3uh^drj}%E06AQbuYJ+u$Zvh!tPhs2J*CfR~P`;3`k{% zIfVK}Gc^&_X{Zn$RakFEopTqC@gu*zg!Ruil;J3?A?3}sa*vhW_^ z9&=j_ei{5p0Ng@BF`XvS;Dk!qH4Ye?I9(z(Cijbt4;^evz<4Y+5QQk35G zCEe^7YwFb)F#FB)NzP@)PP~l_Wd-vn$#9r{P!W)?;x2afp<%Hn*%;GZ?JJDVU|I(v z-6>6aRrhh&#Jr`NS^mN;?MM8N=aM*wY0Y%%Q9avSS`pNG6S20P^lbZ;c~D;-4SW02 zYMsKNmJ@VbU+&TKR;|zWr>AY{TJ(yp51S`C=Skkf5cjx;J8J37ejn~|T3s)4{nG9^sBpPkHTJEJLKDIbCn1pA?w z@4BE+!SC3bB)074te`oyUmwlNOv^l`+1yNwP{HLkQ%39Qjjcf}e(v2AG_Pa>;y2Et zu`EjzU#(}oHv8c2+Gmq#r!wCd4DhE2)_CKfG*)AwK^inX_R)I>eYC|T2Vzdi9}<5l zr14y`d0GjJJck@q@L&y>&dJasgZfAfurIsKQQKG9;f^Lz85*@OK}sTbl12p=y1eM=DW;M>GbPw38j*14zC3kc95OG$TWB1e7&v}uN%9g zsjOCiZG95b0K$WTP_4vJJ2eO%o4SrNMOe~#m(d)gco{Lc<_!1#^34(M(Bpm#f7gQG zv@!N#oHi@OaBdM6#G-SgYl#^Lktc-23*i|)s@#h;ZA7y)m&u);}6&+zgyk~=2vfMz2T`8uwn3U=yZ4iTm9~xDDGU;xK!Hxhm z-A^C;A?Zt3VK|0-a1@zYhPin*6@p?CfC`q_O9F`kV6LuCoAnchh}^pSCyb)oC4et! zL|#%c3|DpQCz7so@XheSS5ySk0C~gUP%Kd~EB*&bL{0RRitUzRECR~Ul+nbhhNSLL z{Osocu_{G*N1q;(`lU&fe>=Jbl}-`L|F(1-2`_8pt8mVybgrbrcDyWL3j?cNF>E(AiFRd(EN#$>moJ}u$d}+!1yd}&((tsGYvMmx5 zz8K}XjhChKgDZ*L$x*y55{)fVE>Q~pV|K{xU*jqjg!UAxuq!#Wf(gaP@rsmdAXQ!) zFF!t|PeVNPR4tV1^b{l3>ZM;bi`vfsaW$F9J+*Is8xKzf79!^~eD9v(U+kq&P$r1V zZmMDz;-AdJ0LjBl8})!Q;HU#G*C})Tej}!V-OmG?CbcR;oEM+vJ)V;*AWE+%$21Cg zm<+Nd*GsFVZqsK;A4JUjwL3%YfwfFn2kUPd_Neb`W?Mc1!m}1Z)A`z(V^r<+OhauD z!=W9ULqbp`^Xgp0b^~esP0-c`WWz5Lbj=x$vhz;~VR6>5CY1g*mGZ*C)L5f|G{vR! zm?>bunFq|Mi8uzEzK1Vf6Jwc;n_2TpEAXuh!W=Y!V))4meU4&_POUv$^5W+}c;#8T zMs913Qv0&k(Wpj^{Y}E0^P88iOcS3qfg;U#ZFi<@q=te(M5WNH5BfDDKp!ct2xP&0 z%_Iw?*gVTm37lFnG$jl&i5GIvxLPFX{|;w$nOVDRJ2aLS%#cXAE-+UXb`i`r7FAy6 z;sZspKD8_XhM%cDNkGWn9Y(J{4-%hC)-)8C{Tfdd|Hw|dn_|pK2(Dd~sM%bj2U(rqr(X`)r zHA`shBx-2PsL-(>0#^M Bs|8P=xMsb((SS@!(#LUTn^m(peX&oU|H;+Q)K!(at0UU<#K5yFR<<&ka_GXvScUhVWThp%&NJeN9qM*vSO3xs1*+vqc6|j5$k;8Ik5%dVpUzT%K z#w9Z@^mq|tem+EtNvNBNk55}55HwwVv&L5oo*f#(r3EnDsd3P`&di+#k)ZZB2GirZ zg+&K?A}7njp2c!ETz_v2X9{O-1jf_ejb741A@T=9AqT@k-6d!3$#Vt2UPdXyn4hTaf81`4Se;uwO|oRl>RJxG(k%c3@7Ok6Hqa+_K*ApuUq#DUH~t>{?*lBbXo zN?aZgx>v$c>|DCZJXk^2^f5TR|4%WRc~SWXVZ^M2vMj@{?=)tK*O~ zQI*!aM%5ovP}!#<2PI8N;PBjB`%~sfQ}43FGnayXHo2wD1qvz5%obp=xTor(H#4vp+O3?_D@Yy41@1$=WsrIuRR?l_A+b+i z-)k!%1jpwQPu@juMimhJ7w@s>gI^{YCN3Jg?u{d`Oj{sdF> zW(bBL+}=yPwpIW!jtgX7ebpgkV2aqMlfpNF3NiF!VA#`I;Tund7}~K|*wbX;8%Kp0 z>M>B}H609ryY-fMHB<-UgMo0L2^mDE%pn{X$sfVZeWZf(B=?Dfel*!GUwP@V&+0#r zu4Hi*TO7$rm`5;8i;>>dW0moLSACs8p1**gO(JXMo{2;pJyJ}l^C;bU!;F0@ea>v$ zVmfJ~{FtqMz~+>`I_*_Xa+ZK^DP9r6mii>7JeV1xEHXr@aU^#nGh;xc~RjKt%dPhZ0bIS!=Hc9z{Y zEt49r5XMGgYHb%v^nq+4dt^#H_YC4QZ`i-saeU%eSaJLy=8c zEq?dy{?>Mq3qj1_s6#=)GMgi26(AbEV@Aw!KRmJNQbSpjay#;_bj)|!T^+jJPu_?# z(vxZTIRE|$M004lKsb24(vNttRNeRr?%77(&I3>@jB-M|wf?+*ZR~^pB1(94^+EbQ zx-m#X?D9;Yu4OmjY#wv{woq6UY{m^$wvEV5=nfB+MFp^C3`LcWGe_hAY{lYHqdp@* zMZN}`E-R=w1)D6_1Aa6Nrip(%WmgS01hfKdpoXBwV7muY9iTs%LuqdV)Qh5+FrgI9 z5!sQS#Q@@rr$9XD07*1xuYov>Wmu9z0u)Xtqk%UJW^)KaDu5bF7DsJAb*wRyBA!zMg{4v`t5>>O=ubJ`pN zPJj5WdT|IP>Q^N#Oc_aB7)ne_06R1wm;)ZuE-h7Z#OE+7@1s7O?Bm}N$s2;J+B~4- z2FF7@f+0#z_GHg|GxD}4x}n6d2d&v%EpBUq*7%B{rF1^lw?&j0=xA0XOi)u*|3cX> z?BtRUr}on`2E2A_M2)^;0JfPe-O97ul&e2Ew!5LXH#3e@{8{L7WQ(?r?D)QMzQ+jR zDBPW$nFbrImH=oQ^h$QC;nhtRvi>ww7!I|Q5Vw%HS`;K~0-axBZT4k9HCk6qI43;& z049`;->TtP3+*xNs)yV(@`<}X+z@jkuB&kIxJHxi3g4q_!=mp>+Q~{`Q#^ z)i7s9SDY5T(%UV_Y+(%9X$(elreTJ1RL(?p=Q7dkK4!Y7H`{rc=hFz|fUdV#c#`^M zna4)Be5aA$_+f$ML2k`04R^pwpY58c_U!%0dVy)YRP4J$t9E7^}XtUJ^JL@YGhqVLIaN8dq2^ z3P|}BVB#lw>x|?JZ^80&ps&T_=SQdIK8WmD%$l~Gx$Hpb_MStPjyN97`o4-KtO;tE z_OG013?l*@KH+=gd5cRMl#Xmdd2;od!A_%0=)Epz@CEW7Qz{!iMcSpQtZH9Lt9%)Y z1y@^bN~b27%{`V zhZMXCI-swD!yCnhWEHpT2U>N<7!g*deN7oG-(8)Mr)6yliDo4?g2CebBx;2Wn)rS! zFTy;(um(&9T~&RB)OV|ypR!-xQhmo8fKz79yi^Qq(O|f)KVKyU07G_gmEVMBW&!Ze zJ1o%9I_C3&RjuVW?%{@#kDuJ8TU&<5#h(nM4cYgU8joN;_;5aBjfDHDF;>N)6%J!P zl+X(>gXu(6jWc+AJ%=HE)5iSOfVvbsbv0+-qaaG`<$J;Ch9vEc@QWXwb(i|NGl7NB-#+1lfh~|+?rEQ_wko<- z92@e$`mkGH)x3ZbVtuA;%1f3+*#kGD)C_`{*9i`WT6#?gyTP_$5^IOVHrLEc8jcZo zl60kl*z6v2-Fa?#AIzVJHspE35jB}KQx;Q;8Rv=q6JrWrW~uHm*@Ns8u0VQ@)Dg@< z?_(_#^^i%0G*eO$yqBAD$i2!0BaP3i`b~?p_4Fgin_4}9x$EF zn5BI~A+?noL~6u8TPORAn{5)@TtX@m4r>zmlv#O~x%E#d%B>wIH%jUHpD`Yyj0lH913M!*(($OWzi@qgky_;lTbDy* z;Cx#sTae`B^n`&{(?MX7Huu;8JE9n0)3?0B=NmL>fk)}rQ7-2FT$~%xm!vcm4f z3xYo0N;)bses01t6=PD)He5tl8=c=yN4r;A1!J?+wcw^~=)3o=I&oqD^j_(t+vq|Y z#r%Xjv}8ax8l$9F#~jKjghWW`QP-*|ZIu<(I~uC1aEW|qCg4YEoDv!dlbJ|HiRJI1 z`++t{*Z|TvL8Xl+XWzv1y*1WiUN)nePR@Y($Ciq3oeb`i1(W!!J}K;H!U{I`FDwzl zRKbCj-#unDE8++f!Wlx6dr8QD=hUe`O3Us$HR7o6b0Uke*%_zV8`Q#wM`+1LiZ-rG zLC3XEFC#{p_xf&;%svHmqxU$dhkmai_j}S~Un6kNaw2~U#>aM@IusO&B!l9jSFZfU zTV-=BFO8_9&tdfU6p{XCjJX|kM+uV&r7yl;)vtv^`8ukFd5NOi31b1MXJ452ZIVeB zLof&>>ogbodD)Rp!Q+DR%)5kCzk~*bjR+a5hp}p1Z*-j^rL3+eCnt>fheUvpDm+a% zN|YQt{q@I_*5$ofI8$F05+?0C6`JlGlr{Z3zpsK|Z^U$Z9SUSLpy{;yDZJqDmtO~L zle-F2Qj7f^=VcOC1)k6wX@pqNd|SVJA% z|1JM>EB`;4ZT5ee|4YU>!8O!{#(kI7uBId*0IXasKU$f4{p(TN&e`H$Q#?T^0NMXq zBfj%c(dw#lXvoCK?=mz6d1=l6%iuwTf0x|&fS=wABsX~jPXGXY=-&mE&Vo(?08j!H zq$RX{a!-5w8+bq(go`}~@`nsz`SO$@n3DK}*y6#gj5L{aVQ`Yv^7t4A@CcTO$&~0& zLPc>nKSEWAPOD&3F-Z_k2fD4oBzDZ9utQ+km(!r6kVwCU4q$E|LXu`qeylxOdfPk+ zaQ!&Q^*{ISvp>53{X0AVZ+`yDzf0ty7xbVWicD#tFSn54zJ@%m8vZfOxB~_rm5|*G zAig&0JWxy7vZ@(8bLFh@W9VAnv3u$9{L2fOya@O7@rB$CyIFrQ)IFQi50n5$D^{p!>FQ7jUYXO97LK=`&HRd_rT=VH!1e7QTc$tsTrZPbPJ2BkR(#x zQ$lS>tsykln+A=KTU#0g{Qx*|7a~nI?eVS)1Ft{xR+O!C$WMwXbY5srgUK()E51vi zWe#hY3(*}tMMNSO+=-*qq*pfJHdLiC*66u}}e60-;XC-OiL*(CpJLnre z!m$0%0AK($Vs?E+f6M3a<`iF0L&R-)3)|?_QJ@n_p+f!!eX#p^I|0C6qCL`V-}<<; zVKS^a!qPA%l<^f9CvzJ{`!f$O>kCk8Qe@6*=+3R zJ*jYt@!wLL^YQlt(A_!0T_FDvN0w>wm;5*B>n2-K8Ou%L(VX>Gj?0mRU6+WAx)R&s z+ZU(p0=vJ-<0Yj>zRr#yKeV=AkSIOS`r?%|$fJHeS(#O2=t@&vPT~h5*McI&-WYbx z46BOOejNIB$qQR@9_Wmc@{)>Q^Gi*Hx%*J*0yc*owF!dRHZLfYg&JzACg1K11{#VL z3l$0zdTZ4@)b~sjx@I5tdbLHF8v4`8TtB_hr^^&C&yNL7KiK#^%eaKN<+mL-N&`A0 zYs6T;E@fO_*ZCSw&euZrsa@3VhwYoWEww@s^phn+`qd1WN)Wi%}q^ghkG#X8GOL*NRPKb=I>L z%m#4~IbDd&w{4#HW_i|e$tQ)Z(t`oa)-HkXJj_JkoBg_0*se6`rtrigL`lgB>ps&Rzcejy zFd$%`hm;}~?L)SRVS}@svTw)j?4#f| z1))x<8$O1igPEI5NU3}C=s4~1(xg-(1#JomI&(dWWjJzQ@hlj5=1utUi}pZj=7vF4uEGzL3CuHJ_50vpcuLOP#o2QiH0WvAkG?gBU z<&R9YS}{@t;uinClXOe9S6!2aWE1Cv>u0U~b%#Oez%9Kh-i}ld{^6{IN6U(>r-7H` zU?)L0_0NSXG2hvmx(cHEcJh2tj9?j?08qKG)>tY-{VA-` zkx?CidRuAAQBZ92ZJCP(N4dPF{!Ii+aL=QEyeiLG)>fU?2oMkBiu>okF67>XOh!x; zq#0oDR?Y43Y6ZJ}_tovZPPscs4wZNO!0>35*u7q?^=p&at8ryBccB0|zK=d5Q2cYD~|%5K}9;ztRLhiIMu}jEa9q&d2L4lOUZq22Ut(0+|sT zQVGV~kQ9x!J`xsEN;5%D2Nhln9%}-UU-!$I6f82$LM8KyG1>`-5b&jF8yYeAt^E&M z1|ECdT>Nrvv=<2?3owd%jf>9>AMV>?Z}z8RMTD`>l%_+p?Au2!aJ!IH7p%cwPR_ zuS?dee_1%{D;wwumV`x$CV#&AmLN$iKwWjqr+6z}*@jpzTitG~W|){s)Q9HP{Y>8D z65=@@Yj-v~*h#tbIl9+%yRVdti&(!>EE+_2&|leNXz9b8YnWNv#Cqm`5gOpX(Azfg zo(o{tPjpDjxpCy{zk3Ci`a7ESnV8h(nl!nG?xbrGV5XF{4A>8kolX}oJbAt2F}QIV zD)W9al$BIAVGt_DZ~-5l2O{1pgHOC%V95Ci=N*GX@`F#nlvOcb8&NzlOmZ=9SmJeL zRhh;4?y);X2kR^{m$6Ykz{yR4<+sJpnN-}=ae_;y{<5J)&ym6r#-1bZ)9-AAXO&KZkm(Rnd(m~UPz{a#JGkl(LvKGL zfzB5eI;(%xS%WXWHVJaUNT)2^IckT0hnaGolD(X=hPgo2^v2Q0^L(Lp=ebt1>TVjd ze~ncJUTrKL-69JMPgo+5k5)qg2`CkufcBZk^BlvTm2k4}hHhtnAHZK-VKHIgg_qq5 z_%BGBmwr$BuURSaZhZ;`$Q&{<--&;{2HxP1!>PUXGw`nE9OLZqM=wU0cdWlp3zgCB z+bNegi0CGWWh0{U@bwSq75(Msd9SlK<_wClE#QvyY1cyJ5vBl<0%8qpGOha8=pETX zMJ&B8P=uO3C7Z$p2WAIveCSU@p_%K8UG@t5lnZfII{ODW z->ssZ%%OfZw#zJiBek$_f_NV>#e}M755&{3y<{VShb7-&wJf#ze79Yd_m+^jdh8)(LPA` zeCjgoKlbyzpO`P+zFg{x+EK3i!RnW|>bqZiV)s(~g_THzxX14|r-`9ejMvT)n?&_F zmNDW5&5EO^Nb!PSna__;6pl9~UBpha6!jEL?`5L-wyj9I;Sf zHM3a_-tsO0ayO>@6`hj^1Q{Ui4I5*yvhgIUiDJV1LmTSG7yfec=_L?vqSm45!Selu za|HfD+HKiW5Xn~8a}at^X0bbZ7Y?aePMKndCjN^2&%lh^N-^2BVfx5o+pDWQ4~4D@aO;ZhIm1+o5II@Wdbn-rJi5GiEEr@(>wsO)fAm=G zK4;mCB^dmCd|o!n{IhhgL)zu<%Z!+9*%5%BRqiGQw5W?|5c04uo{U+z(>}~>AtAVv z#tG1W5yRfwg|dr4Z%11;?Tuhp!6CiG^x9C8I?^^~aju}dSiO4wRK>KT z@964K#}KjbiSO>Nl|e-}wVc6pD_*TuE&rwG>UQMJB%#XorR{2we?x@r+O9RURO_OI z<0$(Yt04a};l_x>+chXS3}?LNvF%SigDtr3mefIjrsAl&Y?RgVH;w0aN3{%mwR+=8 z*^{d%xk>uAQ`bb-?WU6;C;Mht!2I#I+j{iaj4{Rwd8iCjC@5>Io!X^HYZNn9Od;s* zzSBqqz|d3p$*ZQZ8@&-HK%sE4q#e&gF1@4tYUZlVCm%TzELZztbkp7@7NJ`0Oa#&L zd9bl3iMRWpnt9&U&t<>FCN-;-I6dubN&VCwz1aB&Z0%(DD$t>7P#1PbzF|awqZ;g^ zKcV*(UHzr@VyYTMN6w_4g9J!>;rcn@Idy^4@1C=_-F>>IBHjv*=yy&*Cs>ROz+6P_ z$NEm>?#Jp^^2m}4X5Xex&yQ?zY|;LqU1~qhXgh2#eQPj+c7?c}5r_A-<3G=ged`6< zzopg{f z1bQ=dwlZ;#r;t88i6;wWL*AP2U(VJ!(a2Jakz4-Nu!L+@tLaC4%SQL5)lj!>^|)dB zLFM4{q;TYOu4J-;chMuN?xC-sb3(J6kWU8AZ@YZQ9B9-wO)$ktkSB@U*QA1d$iYo@ENu2$p2ith4tJQC|7Yp0ccT`QBuB! zX(EynQ^tPO>_NoO5c_H$3UdqyP7LkM)J4Y2KpWCdBbmX)(%dJ75#a3DreL1x>R~ZA z{AohNb)l)=)m{T@VEX%uk*cXy#Cc3IgBf@0vAO3FjBW$tHTdQ`I`xV6Qu<*c@ej=r zx-WY}Il{UKLBP}H;oHIqDB&|aQBrD?99i|hzg{^<9j=*!u!l(`i6?VusBKIibdv%j zzjJHAQY7-YvV1mhiVXVL6ZG8TIH~;Go1*-J@pDu{E;@LB(Tl|=G$2`T+I=c}yCjg@ zgROCladc(A6srtsc3tC%JHXn(=)Owyfb^G>RI6%>t4EW zupTrC!3P}3*e2*;+CMwonzQ(rG6!WPe@SKD{WtWXyAc)`_wctr_pKDkj~eHhVo&6P zu@29!*0;9RHlKpx0-xgZ-C4h=Pu=Y^o6J&Hdm?^3qW-tdGJJ-6N2TrM^@c~z>CKrV zOm~Ie9}IczmA>g3OIQD84D@wqX_Hg|_3*Bj9BsEgHI{<>|18*Ff9Qcr3K=G5LQJBn zsu{ht=^WufX}Bm|C)|#jr_y4hKou7^(i(nR5DRbGZ+gSK?XExBgi&33A}%b?@}k)G zyEP;qUIaU+1;jL>zfX2L^nT`dEJU^yZHIy*+IEX zx*%2@-;aDXj|&$xqS3Oo0kPvt+|*Bodked(Bn~&raZwvgoNbbk86*f7zOLB_hI@%t ziH8o4)P5$9l}&e{k3Qry6I>eMNv7b*tH%Ae6iodv05u?MNO!<%4|N1Vq6B37XLJ>@~qYFBLEZ`nT?9#eZ#bgCP->4^0_^juvvRiHCF zJKV4>wAXs%4)Adn7#7mgc+H&d4FnKEnKiTW_{E`Leg8w(AF^X)NW zN8~ua*_R6bDbN=XW_Pc;Gy?#P{eD&>f_cOT0P{u@i$B%Nr%n6(U~y!S=)PsdO`9l= z;?9|F>SZk{Wms$Zm2rwgWZX(^ie~hsz(klA(A$f0c2}LXp;|TKI!-QO40=1soqdUY zC`xMRo;W;elKT_ICa!Y-1>Jf3;PMYBZf{)4+0e`{{VB?DRe;S_fg9tqkO{#gU0+4z zL2+LFrK5RIeVnhym7w!3wZI;!yv5 zBvM8*!mKOQP{RS))Z5paZXZMUb7~_=J;PpGH?pVAiCy}=?&|9c(rMpdjCKj&hBvuO zm=W=(raYxTNEpHV0@aVV*ho<~9__G!`|(S26*B`yKxMpc6f@+KlL}NFS%A*i3__-p zr%QKjhd0*8qH07COCS2H>%KdV$Hs!M{>hT@+4bk2&NCF5RK}a|o!l)}Lb1OF0*i5A zeI66N%uFwBH~aMM(yRV7837;4bGf?-$MdGXiw7T~6R9Kaa=g?%tC0M*;cH|idv zXClDeaY3cW<$V-4)$H>~l&HX}W|8u1u^+n>$wR?V z7`(aTiwAlO{<;1LbuS6KXi^K!CNT^^AcV7Q^${}(7NQl6KM=ev2ovr2<*hXxIC<1= zcMtX+bh~;Va8%)_s8hpku2D77ti1#P;Z~rao&;R^B)m)M`pU>q6pObwpFdH)ee(bR9trY@bQowxKko)kNLD7ps+!55* z_Ec|!d-w2n`{ErmyX6%+tA3qzg@dkriiL+dTJm!d=vV`!*MzUJ%Ir}S0e+r}MvC;_ z?o30V(Sbw%P6}CW_&7aOly(AppD5oWls9Y|F58{h9c-b&unTEoH|N@Pw(zo}o`4QC7}1@BhyK`On5^vuUtcWa(+$%{3|J(N56fES*(f!sEQs{rZa`NNFaf zGog%s1;$Y1qZgx*&&agDGbk%l1zJcKCC{Q{-!z(pi!RH)Hjfv! zS)o4{p7h|+LE#%^4cW+WGI8n0alC;WZw>sWS%L}c0-XFKv zHd)xcwNhCJopaZBNix-kjJJKx`vuTpWY8Uq0dx8Aw8d>6GJm?PVJ&S#WerWlb^he! zjbvo1r7CqVWO?M|xURW9(9G?ciR55`I+Gl&#wDz%NZ(Tn8j`dbw`+|a}m$i(dTh_3Caf~II!y3syh5+H; zjvr@r`^$QZdks3)OZ;PcUCB~OnHU>&B?}xF@41YB3Y+5f{*uk?54QIqdC8)Q^VUT6IflYH13|L8~LX);wNGuTc!wht)p9FsKh-$45y#^bnZAuH1h|Vq4 z%1wSVtmQ8+U(W_Hq0WFhlS@h+hf}%L66r@1_vGRyke)~A=XXG@K|#yipp%}QTKyth zfBuq^2g{<{1p`!ajIS;p{vKH~KdX_x?_bAe4xe`R>pd+9XU6dcyTN*Ft64MGC@SU) zO%d!Z(*xvHJ$ay8o?JlZA3Sa8GIK5qAb641I-<}s0j;tsDY~+s-)xd|{oLxH0Ede3 zfS=7a&v@D&{BGBic?g;ZgPB|6rB&CM8R=$ETP{SZK;I*9RH96B{11P0RCApsmzJw8 z`ClF05i{5oa2fK5oNen3UQ*6o+WbCebUbP+Hat|E59n5um`Cado0b`W-W zIw$)UDI9h9%t6k75gY!Ed^aI37@wyx?Nt3YLq^6M)4^Qb;;_@Ct2-%6Dyz~yY%J)z zugzP@FXJMV479P^X#s#|^A73$hA{F$L4-AmFiue8^FT!f4ANH2pBnD91@gl|V@-N& z`IdICmma^9Edu6Cf57%J2vO>9uw`YPY$qKM-i9DZ$=4$3?K6Sx{` z-BougZ6}Z7ow+NJ8;B7-e{dpNA!fUFD9t^+(Ee?1_WjQiRBLAs4?kt=*sN&81hYv4 zgYEWkyHi@+EY;A4GC-``L~TW0-VnfRR1pvxY;0ISzlMeR>l#l8j4lkdMFAZiu4V9A z@5~Mv{)_^cSL{H|U}2BV+Vjt;WKGSG@#Gq|1w26YYZdvyi-)1*t_vC4=$<%PboEpO zbVU!z7CC3MAA7*dMhd?)B(|p)%e1USZqL4ZH-L-kx&esw-fU@dpx4a)Ahq3b?(m|( ztk994;s(2c7jx^YXauZzl4T<(Fn{Vggo_nQT(AX{`DQT-3M(|Chhf^r(07w%uO|ZV zItch#)Ha3wh5_nk?KNh!p!Y8Xw7NizF_woTZX`V@eH4pruwlz(1=QE7mR$JN)2g(A zT^1Qt0l~_%A}GcuvGXBlA5z6NsN7j62Zq8K!Wjx~5?mg>!Xnn)#Y%xjy#12uOFeE_NG}&sIpNh$Y)s&0ZV}cRDmJ z{z+ScMm!s>ep0R!+?4Z`z&;(@!9j634VqaHw!aNclzt}Pm^+ya(8(xgr*aU z%gZ_m87dyDl#J;eJ>%wn&(OQ>f=dceG7C8S7CP;b!!LJKli;~(HGYKo;dV$+{DkuR z0^|Rq=_{k+XrgUr7#xCY&_ICT1PN}zgF|o+9)i0MuEE`%;6VonGPt|@;O_31@4k2c zSFP@8T}InH6#TN#MIt*4`ae~DfWyW3hW+|z*udAX6a@N+NP zEU|-P+D1Cl>7xZCp(!Px?i2bW@FqRDZ@8;%7>?+JAh~QfOaPK!txn_cl zoxwvm_>(swI0B0IdmmkdmzN$M?y&P`6QD|uyekSIVxxCvD7kLhJd}9Lh9%{Mh*~Pq zcIk4@gZW4x>>i9|^j4y|5^2kzTW1UE4!`2rxr%h8$v%_8a}u&ZJS*aVFrZEJKV^tsp-XhAGFV^5+A!J2CREIW4b+j zy*1Qpz=3>QUgx}2^yy;c76 z9c7a71v$&tf&D5k!1m8fr@_1?a#}`}k6&l&DD3CA0I3h}W2~uQ4;nZ6<$Q+FCZpln zC3GEYj4|}P2r8?At8`E$+4qtknY=f}F*ml?PY$b{hFMSHC)bTwo>l*duPya4fukC^ z6bv1Ko37f#fE{R5t$0@YYII^!1)73Xz7boLV}UC=uO2k@?B$6XdB9i*I` zGLf`>i&ziZ8pVc+$< zhyn9f409-J%T+?QZ(Ea=`{RXr#=Q!Jx8K-7)7}HK8TPBRMPkJTL^0&g6TibZ^oGL_N+HJ_o z_P1@ByeuIXAG59sf*{|~`V>D>3+hG$g4Ll_*Sg6=GCgtmNh^1*wk^7yN5QsyP=8M( zU3Q4r#q70tT=2DH{b80Tz1rrjNnA`WYb@-A^z0ek`ro`MFG6W%GMVm|zhMoS9y#?` zEe3`W&2MM9ozGr9O}&Zou|5)xtWjner0Rs~GyEib8eDQ{QcbwC2223~U{02S8>%;X zpFOm`Rv#wthJdChYfyAR0op2^Z=J>NmImg!T6kbO)+zjQ2_WYknN2hUBE18G*FOucd->>OquC8#@-IHew(lkL;>)vY&w@e@Mpf(^S$V0-;umE)iZ-f zvxlu{##)C(Qr_*sbVd;C{J}uD2M}1*NBF!K#@VMnx|LzH?TgsAwvxU+{vWDfs5=V1 z9Bll9angDjp~C^EmY|I_4w-33IByHyFG6VKQj&e1OVgXb$9=3Cpnm5555^@22e*bD zshjNTK9EseeLsSP>&@P_1@Si{{I!R=oIG;x?uJGAG9Lej=^9!z-6X2gX<=ct`x@{+hk}Q+)Q00|1 zUAccf*OJ0i(inh)2Z#rv6qg@L1bw`lAEQe0b!Su{RpakY7>DJ*M^Ab0_L_sN-Ti(< z?oVBO1&Rr#EGD|`8ATR(3?^u9<=DAymrJB(3}l1TtEtPX`)zH%7`8ok&u6e{AS3Qm zv=bDzUiqqimq<~|m>qrltK`G_1Ot?B6LVBWIzXj|v>7#81>3c3UbL~c z4DJt~lYXMp0`Yo?&g)A?45iyMwlqZQgl>-C&a$nh%xo=`omMENaxc;&9QIAB$8K)2 zEZeihH*hn@W)QGc;ZfqfwYx2gbso(XO~{u4V2G?ww<^xAw~uuvid|ZQ!H=4WQpQ!x zljw{WeC_=ON*;x&5BrfH_`;Kr2_WpdZ`^~FK=T)?f9bbNQ~)_z0HvL8ohZKzGf~;r zGhuA{d#sQ2s;Qm&>i#SF9BkiSze<|S#0G4CY_Z>G9&)yfj2Q0ORI~VgfOXw(tcTdk zzE#ZFa8t`5B_#UMjxuawTtx4%c5W#_BB(QAFlk;X) z>dLdPe73S@3GK`?my2SABb{NYYA4nzK1P^t;%@7pNB;u9rCYA-r^MIC0)>AC$1z$? zxM?>b@o)gf@LivxeJJ~)p^0>Rt)UlAS@Z_!@NbkTo)09SY+Ex9)am)C=+>cj`;p(Z zY2a~TCBf6qB|3<;(-NZw{b~Kgie*c&q%q&_HUbr4H*H79hzb>+o2O(8&N$?kAJW0mQai9e(x0=CJn=2nTuo0&n5eJ&DRd4OuKOqB#*7r zBF88x$3g_;7$5fJU5-Ms-XFLE=9qr%y8+2Ew8aL|q;xDfePdr@xfyN0b2=e{oBASM zooW}dT3kdmE)802(lFTMhm+`QWUAo4NG7j#O) z1vq3lz-2_F2TOJE>ci*z@_e~;LhC(5ccsRYJJo)ZPaq&K=&$!$H}1bE4*4mDe^V~_ zQEuFIio+eEX(B@g?4F20Ej+(Ah*gcxRGK6CvmJiqaNe>Ll^gUA5!KpJs6lGgn__+{QS!6cfH@)lQlQ_LVpE)aq2%158Bd5 z)Y{Bf`#>+Cfw_0Kmzl5coNt@6b=9kKYmh3m#7bkZXFTKP;Sn`BDZwlhH7MxY_FEyYdco( zE@ya_>MkPosvDg@6;X zb68D*!_{EsmsK9a94W!dG&3&8aUiefq+5fyaALW8e4yE)FwD9Exn(l^5Xg|7vH#1R{TOSIE^Eg07 zl^1{yl%!{rPZ|unx1_>}b6z^7vUf-sN!+_FyJ#Y$gkqGN+;Q#p-Z+<1QudSM-tuBD z;zY79+Ceshhc2doh5$kMl!RJo16o8sH%C9|t1@^+Ssj3x$hY5n)XEF2lckgl*fu_z z(*Z->an`){Azw=I+ug)Ee2Yw~U8FO8%Q*AH^{KduB!QXEf*19JIv2OF`oV@9ceK;@ zFC}xHXAMz`zs)c+*k?U^D|*bw8XN91zt-l<*W|w+QN#S^Ijrks>38ufF`26-f)*G4GxJjsphbPY&h`15P(gak4IV| z0#E3h32X%86DH6hSDR6eg#Y0h-si2Ti?kvx>rQz1vKVQjSicD< z2rSp7qjuO^4%Wa{1cjl7Rng_;RzxS2CatEUc&({mqj#DZD)criKSy%6^{jlfV%qiK z@+xVEz8DhksIFu*Vy{Z8BkI|B01Gw zT&^}JMi&Q>shw;;k>V8jHCmEpBj_>8QK~N8snm2Ci3P}1)$(8>i626PBjto4Ezn@H z0{$W>V?n(q@Vusqwx>9wc864+IptkMho~$?F*VW$34Sjo{j68v0)e+->FO-emEA@S zgSZA5z?#$z9z^Bh!st#1{b4+H$CsyZsc&QPz2*jJ8#=S`KG;YKCq7zxNV zu1Ha;1+-uKd%5-@NE!Qyw<}-&RD_ZCbI3yWwX4cIkgZtZWIhAu#oBu0?sXOOC*~lR zB4ZEsXup}AizkJUGU9!#vJPl^od=v(yhcA4&o_-WVlYvkheqTMy++<i9Z#c;q4zu~fAMNZMwYDB=27sMR%VwSs?6G*{aDopgr z8}Uv-)OJ^zBr|R!ZPq=A?zBYRY(W>WZTy6B33iki6rIaVg|Q6;;O=)}-=Be!nl}Io z9mtaG5L{l&MBpDDUwz7(9hr67jV4l{g?`vaL8fM$DUADE^dIoWlZYyS+yEdm=RcMS z6mS~b@1O@8%9<8+gAK?__%dcK6@8*aje+6;yrNxu6i#|g}oSx-} zLuNJgFSP!g|6ZK-Wvpyw;8qhz`6PkU3i7W^izx$1cB`tz^Ys9BDqc=we^LChi}v5 zUi`B6K-0$sgVC#1sKFlzb1uK|{^~l6VmNUPa_VlA=YDWVLb;#ei~oJ7^l>Jw_NArv z5iySmq;%CMK; zpxmI`8Q)TIj|S=ar+?ZUK(0S^>2IgE*8U;`=2F&&G*KkL{@+JAhuk)&eZan|pA@}J z8QmA@@iipPO64bsn5vK~sJho^G~f|YVj$IT8eW&?;$8X^!r0bD%uX>^9W))@AuT4zk71-N{4 zt_TN~@~WL97roYCLrG{!u40q*!6Aad0EP< z0)lMdZulm(DPz{Ctazs7MZsNN@b97Qa5j`*ty52^d1hQzO5PGtXAj!xp4a-!bpmAX zGY%chAm_QnQC?8+F_s{AtDh(%*8G888IP#x;&oKm*T;T^DzGauiz_0G0NQlx-l>^e z?Kd+*H!pl>{YuIETDR8!`rpd$4G%BzGqK05JsV7V2z(IM1Ra&u$r2^(NJa*EO>v09 zjz?w7KY8+Z6ecE{Zl4wHeIV|QA*vK?up4ml?Al~Q8cJhF;%!zfz!hP%0l}`Fet>21 zSv5Zkcd_QSz1oBOguHQNlPjY=FgFUA>|f!MgO7X$nRWWdEDC6^Sf_3FB7q8`K~Ybi zen4a9LA zI^2KFY9L9;o_!GtNq2hL_v!%&!GjPR#~*)nhaj^aagr=7B<*#!3Fmx)DVPBi-Vetw z&SL({u!=jjPlM2SwAzHc<_OKdagb<}9MccTo+QUTK|vmNa9}hMYc9`{ znb&93WG}Vo;){^Yw;kJom5Yk>8%yO2o&kvBh7bYVInau#d28NhOr-(x92LTd zGFak59Eq+fY|jOzv4T^>^6BPMiRfG{ldSE`?Y9rR^)pwkH#o&l%VyT)ycXIIi(Qu% zkUP6G6Nq99Q7x9@5YEhu0z5A#`YD06;jQ2}U+#2%{$gYO^&w9w%Wb#NuQ&2h$ z3l)zTE~tB6Nq5}|28TwMkt=+3h@KrdTO}LQs$k?Rj)8)#!vbdpv?fAsL1n9`A zGHXfvFHK>l02M$-l`2V8dIIOJ!$$>A^*cGDm^lZS%##FmieG0k`~Gfa%RiknYhol7 z-_66ex`bYo#c~fu#|nWMhe5*Q#h9WLBrNOllOxDzE4w7fG`FZ@Ep~QJ#XPNY+PL%f zw;eI$$CUJ$;%#9jXTR5SpvdngrSngBJVDKc!?yqc zSz_v6b=y%jb=MCxeQYPSg{+V72hzuf-QYsayV2+qN?hIZ98ebt_5jd5qgE-AoMqoa z)(rHD4e5wse~q>bS@%i56QX~@*{oBGOr{!_GaF-{h=k!dk|Tz6c99_0y|y0!BX%F# za=SDJ{i%p(kef7~NMnHMOrdO3__`w+HQ5z8>JJQR1B+)bRX{MM=w!DBW(=~P%6{9e z8k$XHkBFi286Qwql^ot})L4J%(1FJ6S}wqM;wOD7Y?rj zBm2r$cKw+1_a5b^ezQX!m7aSygN4`I`-=LH3e8f8(Pm@gwiEWY_vCGY%?J5XWY$)r zO)MIU>Esqs#ch(z^}k4pPbU&2u7edWG-5~>R5Ta0=#T-je`7{2esrOrA;d0=H4sQy zj<}J)ff<`opK!Z<nMm&kVS!-G0vgi|fH z<^meO`O)KxLR}HVKS%_+XRU{y479~hgV?h~&wl#NP@ka#xVJ{dcFMnSvYuXJeYVkx zm8eD=7IELHPW|@fgK&;&s1!hhn=N;9%pTg#Z?9bQw3nD)dZg)H>V-WJLahsESv-iFL z?6}5wLC_VW&f@ylG;WcJ%q3rSOnAGG^$0PQdQ1KJoF)qV5{mcwF77T6K&NS29}g7! zLm)CBut+N;u+y&r%koF#vEVZ)A^I zu9C_ienSeqAM3CCCZO%BNfGhM1ime*>DcVa%88%EhqBH|7YXJ>l&JWzH)BzOtpx#b za`l!swW!~tRZzwfXpr3GM!0T7LH`~BgWdNR0=TwNyJi6&X*&Y^*p zpR}LRoCMiYDQs&G-o6PMM(T0gyD?4mb9pb>wUvC(-;N5)Pxg5tWf(O6Yb%bQXBFyw zD!;H_EX`5-w$e3YYL`X0tR3ld)I17xcs$lfjR}qZ{HjRA9j2qRAW>WexfHt1m)#mz z(J$HKsqHozF+rvPzh+vj{PO;p1N@?^k%QHq*xj3w@ymCy>GhO z5xPa%zGr@XNZN2{XXcV0W$5 z5 z*r`-@iRU4B(lzYep)=TxxIC(Ab;G%-?`l}vs;9Sd5+qVpcCKt#szp9vF`*6L^D4@_ zjB{<4+54a48G?kPT<_5pFrOnlcdYDQQm33hUo>ef^eF~e<+z^DgZ7QicZ7WfwMINy zkcE3P^$X=HLTMV6Zxoi+w=7gelO$Q4=a#lPSoc$tG5BQ%_s4N8+;ra8{xF6h5iV@G zH>BmRqnFO&)lKBN2j3r*-hn=ZBR58Jjx2WsW52a&NyvxFpm2|yKW|xK#|?&6h6doFunZH zz-^$m$;Qir+iLgp0tYUPXDo20A_GB^fGXR4TBf(St?e6T^s|Tz{Uz7t@$>4|7#Swf zIA~kU2=KCe@|SecF2|S}yujNq9{WA94>!VLhayn^!vcorFIf_Y7X9)hQiGj-7YU7= z+oM`t1+=w>pdz-*@d(EWY|ZC694=9NQc8c;Vy&ipN)Xg56^~s?G=Wg>9U@QCiGaOgG{*T<}YdD;V zhVSFU<}g07$&W^ls;1TYaIC2g>;;8x{N7f!{IA}39-E7#By6w-f0vXMEKaf0CR0Dr z1=IxM={mr+{NOvC8R|dB;%$_G&`}`X>VVOC+Q+eQimQ>knlyWxDxT$)(bSzMJ(Ay6 zL|Z;pE_el)AR2!G5G6a{1(;ke((r&?HU5D>YWpt9y^Y~i!2^moTrkVUd!7k5Xey3I zL0xwca%LW`F>7pCtM`jM%t3b!8-BHJ`#Th4&*$uqIGI^gdh(m?Z9R{+$&7N6F@Cg* zwlf>=Q_s3p^p>~X=e1$bP+|K6(BR;p!?tzRKv>%N$B=RJsI~-5W+_I$cw?+$UhJJk zfk@SA)pSG4uHI1FFD-Gr<;4fax3DA+?`kLBvFYdsLd+p!GfU9f=WWh|8gbK-4s`V! z3}jML*Nd7AUV9s{%L5&3?Z0sV!#%vF6y_BQk0mMNjSC; zIt)Y&WPPR&i!AzN!v%Y$kpU9}IuD6I!97H}LP$FN-LHCn5SW8-k zqtIB^ij$U13t5Ab*VeklUT8zsUj38Zig(oxDEA4~v{wAEC6Jc$nvN!Ryk(&K1jU2G z7)7SP6;BWEw~qTj`MJM+pPyu!=NuC^oe|XWmqr%o_{-<+B8Hf2s15_AFa53%JfDP%m=+n7EF)#qYd1;iEvH@}Q{xAyB z7e@q#{C=9LVqEIR7rNX8aZ) z@$8zPm+*QG5N&@wK3V*Y+5g5FpP)5ft>-=>O9JeE+f{Z&3E7_o_*uC`CL_a3V!c&o zAk?`d$J3nXs?PH_ikD;j-Z{$Zo^p^k0GwGfI3^2GF)NY(tzRrnxVS{|Hr!N1xMl-s zY7`mX_;-#GJb)W8cd1s#A?nFr86eJUtP+qVLOHY6O9^coU^j$5zk3*oK881RThT!` zMl%GV*Nz(Y5eKf;!kI4+G>Yce4k=*}*=hKdLO?cHZ*M3Dc3bBF&b=c6`CFmE*>rpu zcv}EmaF#PgO;XN(JfIjD<@8jt1P7r<7U{Mp_>Z=RycY+62fpr_(mzIf>kx}P^0fkW zU%HknpO}O7llR*xE1h-pZQ7Lyhq|{1t;@MteVbV7^yN4rk@@P}IbI@kb%n{vzR!`4 zc_NK>RSiu+{3`bwEY!vO)l4zmo~c6Hs6R=yqCz@ZJs+(1TOa~yX!Q*fEqjF%{KY>V z_8(?jj$?Zc4FWeO=1U!;6)Gy#2nMDnB@Ua8Q>k@!CKQy>JJt1>z3n}Rt=+~4=Uw+X zW*K{F5~Y2XHTK)pU5;@JhfP1{Zlid1Jd{+?kQQ62pr=}(3O|1F9`os1_$vbLasq?M zsVv9fLXl++W*_6-dEOUOdB?%Hsq0PTkgudSfg%pEUvcE!3n6@#663@@BzdMn( zrj_@VrOu$1{+>}5J__8(e~quH{z@rXVz{;8V6^0zR+&*I7upMNmmvGd4hZaW(tJuy zlZ9^KWQ&>M?{lN&?Z-WnMz%Ry$t;D&(h7l4PTZ@lnG zDMgmQ(>P6|bJ)uj;8nrVpF~m3?BM382iBq$w*Hh8RLk+t5xax`ihp0Oa-`K7r6r49At#;0~W}(dc^|*`}dgD-;ebvo*C%oBeq?Mg9|YdMXLHdn z(!LRTu%1P^umT=-$Bqp2F@9DnMl)llFFNPaK;(<;!=VU8^ldok#t@G1@Q8-A7GZ;) zB|%tJm*GS=CmDe5kggn)dLctilG;DAA6pGzNaePqtHu<-iufIceI1D5_FV|Q)^FxR zh@OtSUaUPBu`)xnXEq!Nd3#_7}I*r-W4{Z)yG06w6kN<3vtue z$)K(Ag5iJb3ETM?@e|ZUhDM}{oD#r;cd>_krXfp?F@>w0@pcYse7YphWPjJ=@`=$5 zglLnl*6LPpjiYa1_BsZKXLmNKN1N5^OU>wS*PU|d+3n&w= zP{m+gtoB?$WL~jcP%NZKoXKq)Hz31qH+W4lXZ5t;kC@99QKJyl77!O{c+Xw`ge@l! zn5;NvzuebiC^39R_GnEJ!9N9ohFf~;;`9E{O1kwP>GfFL2Jvi$Mr@ri4vnY;Ans5B5F5R6w;+0Z674WZ#8nL1R zTgH7s-^x#WT8I;^2gWSWn8cz~hTtZni#!ELc=`^%b>))9z#)^uBBqWi?H#20@;92< zw&Pv^`uoW}KF*(>5%h17~5-+U>S5sspR1 zU|k<(;W^`#sa#F*Fvh83QR>#%GqO67r5j*A?E9Bfr<=k*ljG7G-J`vX)7?)l;_4pc zY#vtZ_AcRQXIpQ>Z1uQ*Bj=o)>kbk`FWjae%t0~2Ks zf?w;oL)vq#*A?fRwl0lk>i5>w(9&zEbY3RBt)H#Bf8)&~bQ?GLLUsklI11H#CB7&Q z|FEq;Yo2Q!j{iDWQM3LLQrEFa{Sq7kE68%@2p>3A7J}D|v^{19OAJs_e*vUmt*{iQ zqbM%H?ICz)iIN>c;v+TDrDGluQ4&XvW<8jn3i-FmVkrKocBnh}@KhL!I5_`mL4$c9 zLg$Vtyw_{jTeGh9&)!u%U^Kd(hL7ZUc)g#IXyY`f%3|hq*3GvUVf`b6dDaaVga>8Q zt>)8Z?ML4}ke<;Y!|y<=aElzV)V>D%c#y)3=nK*FBL^ zT%0vp-s7UQ?+y?Yx~tHc5XhQ9g{FOfab}* z$F7^J`zCz;lu(+d731tKBB2zFs_1OS*Z4@QkgWhm_IW=>=921Ts`_lr3`Y9Ce;RQ2 zan!~*`|mV0&^Mm)1I4+8)6n(9>X-+r*9*5dqSp#zJHF4WyswfGDT-=X4(ApqfN5}B zA$oEv-WGccDb<9)$dVg4flewOuEJc>TCVV>^%-=}Z6I?XS!KrTphUbTQ~J>&iv$Nk zJPKJ^11fcZ2R>d`9>6@$uFA&SE3NDctV9jL{FP*{zhR-t{5TUhs`U?qdAgEis z2rcDzw5G(+fB3X#>{O)1GQAQN=pscOiL^H^oZR3p&JOH35o*@5mb$RoEr-L*7-T=P zw7-mQ9qe3MbaQdx4Jzk%gCv|COxiv6pLnUwpL-_kV`Kp0vOW(DVE!vosyWLa_+{!LTdTi8V28-g=D+5gLxxno zbO1wy2v*}K2NzXJ2T49)i5=y%eKKCle10*hS2BU{WF+vD)VNZ3S9X*(4$7Dj13D^R$z zAk;!|7*n}>aC2&Pla~}85bCF7gM0S7m-gGPv(2?aA$@#z-P3ENhN@_y&lZN7W4ylQ_4sV&z$7^%NZW=BEBH@Hz|m!{cz@_(F719E zKe*3-p57!suCPk;QV_p*Y%U)G(i==;dauehAn_vSW&Xx@}U>OnkRt1L&W&+uvee z3h6AtsSAVOFB$d3DfN|y8OI8lzcwLivICF=M0hD_w`cs{UxvwGINPYMEAaIQaUdn- z7qi#iGvXJ5YofLwfGx0xL4j?N?SO6uJUnvWe-g=ZN5wW*RJk>HK!_A6Ov2!<7*;}Y zM}C(1diaWPDFAXEu7C+8bP=U08OBgI41RJr(tSzMF8Y2f3D7Not3&j$x zeVuFD=o@3)o8#m)!1h5SyKF1s?Y$poa9z0hL;UdtwNkJ@(Vw2I$Zlx6pJfq$^9@3y z^`>uXf5NC7pZ$UmNZO*f1RbQ^t$z(tk{9D+6tqbroD+=`j+37ox~FlM_Fl4|b41kD z<$a0oyv}s{Nv*yL9im#zC^+Mh(^n|ob31ot7coS8=u{O%!=XbF9x#kKEUMeFQ3TwY zuQpPg=OlA3JeROZEpBdIO<0U*_B;`YM8VC;{+N3p9`Nxdwz9uVA4>RzhE4h$1{;C- zo98n!ZL%KJSdG%LTpv=9yWvghsZFwZ`-Sg$Y)Ve_818%1SK6FPMDJM1>Sl2;Ibsor zftB)Fr&kowp1kK%>96hkxx(!3enNu;$5wl}*uW&Z_}C+NY@3tKB3trs_y z7LSy84{>;$nqqF;gp`DlT3mxXvF8~gksTF7%mp4T&v*^4OU??41z&z~axu{bPx#KO z_+~V}_b6jiQGLR2{pgLp(q)&vv-F?I_LEx<99Rcw8KvRnA3)&TGCHLFE-@R<_l|lM zNyTM9;q^eT;>swV8gtPVX8jKC;M6ok4YeAVbqg0>=?!BO*-=FTz+J>gN6%*EZ$GnC z2jj~QU8hv*otQ$=3@UuuD3jfm%PWV)Av|^~`?Np!4#eR@5-}h4zryjkH-t_E2-yS* zt+#uVx7=N3yCwmO67l~a!euVO8U5G_WcE8a|NRYXJh4FZW(@5q40i6}097Jq12Q5k%Vf{6irQBGjcG-CMpA#A3tyMt? zmaQ7^{&qH8zIwZ$7@+YIAdGhUlF%0}VRh=uHBW|I7txG~?9l>&TBE>8(*D;bDDFfC zD1c{uZfRhAkuRI8m!HoJd`B2zmK0YBBi5e&ej|R+;9uaSh6NiFxVIfSgT3`6PN*A4 z@zy(UBqvsx{RBfmR&4D5tB5~lg9D>3({_2_*2v*@ z%Dx<+!FsAZ$mOO?F!HSJh3X9rRVl|a7j5w~e0a{@xZ(e{{V&p6r$m$|d8%z+WGlM$ zN(`3x3fn&GcRlw-u(C3=YY-7x`2vAg;334aM&W$q`+rX=e0vgFSBd0(1JN~I`{}SB ztS-NaG18^``tPm+p25~m-+l}&3nKKz=gz&|P%SZRVQSZ^A1ES{qD96L zCtW(CEnr1}%&`){*sLw_;gV!PVz_ZMWV%{n)xAw+rhA-Vq5dVwbMQLmG`Z%&^XRY@ zh9)N*85|Qme>zB*xnQMz9dW=76QtJC-E6%le>3w|uD->)A9(3GKD1<~ES)tddhFoB zE?>^G1FD|ipnb^Nm6;^nBub49HY4L@z=20)VID7>kSr;^?y9bhKIAO^S(fLbN@}iQ{VhbPL?BM4A^GC= z+S1*Ihr%|)szbe^N}_Ml<)eqbjy}P}j$>zjVHK{T4aptp2H%eL#U<6=Y~S3WMic9e z%-FL)2vnO_6kO(^Z>={^(ccDS%uj0xLmH8kAX8SJ6inzYMAa!UE=ED%3}}d zz4VH1mM;`=yUH{P@=W^;Q2;7-rcV{cyB4bld?CRu+a*W2bONX^Wv`d2>*=qHt{qh^ z=iI-9tzb)AG{|fOrGXy@&O8Z1LklX^y=lTs$BW4XB)awz5<_B0{=WASw>7)<_+okP zVG?neN6GU-GO>*z4T%SiUL<28wV&>X(AnmF9y1xVvL01F9XP&rXS7zZGBcYqOM7s0 zW0%-eiDz7K>^r(qdzPP@J^DmvVc{M@pkMiW#UuNeV9;e?{qmEq9&|UkI^bKeLRAh((w&0^Qj`3E`<^!-(|fvS^cqt^EL|$VzzJ^HKI}`dl?ST>t7n zpM-&a2Vf85D#CLTqerI{xZAcRJOBI6Hp1{6$eEhKS0K9JjVnj<)Rj-?cAwmitpBPe z3@3cwoUKabs_6o$8u%L@owk$F@TKJ4Tn`g=Qd?Xu&4TIz@wg;=GX26l$F5)Rob^8= zv=d3*2g_e&WxRi7`|Vcj6tr&OCAs*D;iYgIs=S^7U6_D0uWt-M8R9rez}_8~#plqW`zG%FNi$pqwK)Y98^+AMxwCq#R{z_|I|U zIeL&GY3o!kytcxRr_nEa7N(6YU-gg_SkjF0b&h2ypVSmMbxpuOd(q#YB0+sY9DSm_~!$3IA-ImfgPx5Onn zo%f%77^H?9SJz8ZE0dVPfXTLt5|LW=yIg;sZ{T=a@1{uAGSsBAO+md({lg$nr>fGW zOTWdPgy`dN6mcuEEcU8|6zJQYz<5UWST#$;f(#Dh<6HZ!J_n;;D$Ly>^WqPWa z?0#@LTiKpif9@+oi`&apaxtGUCw!`f#{GeDAA!!7-k>!SrAJ&u&FL3ChlhmW?t4_}8Z@FA9ODA_!+QPMMUTaq;$%wUe( zCblbZ@1jC5k_uSSfwNk=Ndj}ROyFT`mc&Tl3=bvrf399`UC?E$<@pi8Zm`tgqt`(n z@@vhQ2WLR)b%*n&C6d^fOau6r^ypt1HPU4mZQ zLhQdox3-|(vYSW%n^wF2U#6!OQkU~qo`ru9m8;K8BawF7O>_%atjG-48~|8`=cbol zrol3{bdKq%rY`IN+HM2;S#&@-5U3r{%QCJk1ZJSa@7k#0_MMSVpWZN9Nk!gqS3l=S zlxEG@lu+(I6wfi<{r$TfI_hRl(t&g!5pXl>{u4p_UmUqi^gaup(2y(CtgtQbZ0 z{IT38`26|oqWzW1?fCTx@vc7mxq`OM^-tyZaAD}!%};?ze0Q8!rs8f3<-eJzR=j_2 z(&z@@ki>*CLB2COdESI_cmGL;2|P~sXuUy7-|XR#=Yy_x7LQ-;P_^H_5AZ^q1O4o5DBBV5Vg81zuiZp!sr!;^ z(x14?$PfQ%pm68sA%KfGaD{k|`HNH5?ln5tM+MD9YAo3Bv(zA^Wp?Kg#@o0liY!*y ziP(kqtqwo}PzTXv0j}}KxA+~|B9R0w;}~5JOJlkBo@hBw^;Lorw-$qiU6g;186%J- zhcNz;9OXEFZSgxH0YJOjpUv))#-3T+ItT>_S6_q1>`X3Na?Mn(w47M4GkH9X^Ox-0 zwl*n%toKV4Xu@~5KBTL6t*<^Ewt@(~*n|VlO`ehgcx`N3_y|_Iikjr>w6t4qdC59i z@p&4*(>LYgoi{Mk(+~utD-LGLrlX35*pi)IlEJc*ZOnhUEDqlJ{9v<^@vIU|f;cEk zh(j@asVU>UPB_R;e&Lbza`QVJkFj6;v{DXZAZUmhDXc-D;v z(t*3)>r$P@SyvW!6IHJ=1En9rnp~e#s@5OoId_7r8WYgPFMi`&--$$d-^?uXusvzZA*hEn^~H@+{Xf_6=6Yh+2BtRXk1Irep|Q-5uM zcw0#o%jSyaH}7*k6tmQqMLZ={d&565gQ?1`;QpGCx}6|?_eH7P`_{&{j=WRx1SyRI z19q;vC;@8QrcZyeh_^CW9P3KAX`O{17tuZcj(2+%Ye`P;9iaLgQ9OTq>ScYUZ8?*D znZA(m1BjA?XKl@*D2dN}?yQzbuK3HW@-BlG^i zGL#p>)`{!ic-J<}5^XWA0DhxCc~ErCnT`wGWN49zuBi2tCfk`9Q{k+(1-BNLrD=%a z+L;$X&)WY((^qiC)dkC*!CixEaCc{5aMuvr6A13^5(oqc8r&fScXtgC+%>qnyS@4D zyY~l7&*^wr$vJ6at$O7)&O*6lEIE`6Xi%{fZL&po0O*^K7gUpm;A( ztm0TuU?8v1$*{PqYY$=>-3j7(DQFyP`wi$}g5uLY9`xH1yGm(uis)`HIn^*;E%|W^ zl~2fI38w_|Yfv;5CFu|`j6tIYUEL0sR7len7Shz~q`zWt>Kr?$LMvL>Hx>Ev6B7ykJ8IV9U4_1FJRWpI z+CioouL>QZe-k;C%H=6HU^%ll+_|&Y{(#_sON$ON(T&n<#IuJo`f@j}q6yu79PKAR z@i~oh50y1k$8Efx&udRB>pPYH*uF=5?HJ^*w66~)vx-b@Af~N?@-Pju0|mcAr=4QR znSr;=r*kGTy~g5*f~E2UwF)`)3ETXG?W|v>VOcL%PVBKH{pEUC$~kdvG05NCntG zaE}Af`Ik&36SWG4FqI#M+<>_yD)y$lSOr3 z%U|eU_!FeSl#)q2H^4>&?iiacKH}kjk|TT+{x}6DqFDTP-!bI(IlVl(VN+RU6L0ih zgVH}@>0bZ9U1cWIceHKNg~hOlu-7BL%zx{jI}NH8J6c7s}%aZw3~kkZeVJUTPjZFzR$ zVu^pw$N%FfAbaow0$1X{MgER0!*yPMTMKk}x()yZoclPmTB#e{=Mc0(+P0630nGNJ zR$FV2XxpxOIM5e|ItY@Z`C$c^?0-Ot*8jpZy>C+4>zt)|D_ry9_8l&4!}mW*_TQtr z%s^4~j2Y<8e!5NW`kZxXpT2a04s%TuxIdwUnIKAZT}}aayo5ve>II$nNuUF{@P^Rw z3DoNsqM@U(_AthLe>?sxdLKIfc4<`2hBECGoE$J6xlugsvgV4YsFzZvSo^g^IQAvw6v2sy~Yq+10B2U@Zd%mbYd^bR5O{uf6ca;_rhac`qx z-B+)Ldp||9u9Sm*=)>r5KtsUd{D`>f8ia%53j8L}G}h^q)`~G0gN@%V*1kFTFWPKm zo;77UAho?^`$F!w9qv6nx2a3&x@wI$=kXaRv4-^~eevbJ6*5x-!P0#Mg~4kd+7PdZT9dG2Mg&$<|;#YG+R9Vjnpa z>|H)%4*GM`k+(;&cN|1e;>n@Nd(p>~ZKxB4Sk+A`S{A@8=RcCI}={nTb^Fsv^*2)3dKfb7;#BdF7kMj49Q zz8bMZkTnwPc%bVlCHeUW+HAH;=EyZP&q{b%@X|L6gg#`bV!`tRzN8A=YTlP}z2Uli zqv0SeUR+Xa`bE>9BN+lFoD2rlm;DU49AxVPWIHj^RT!QSx}bH{%kv6 zXD+!=J<+^~mk$wc#Ad>*;hYL^fB>?0^H!V2@A9Pa&6a8jHM(P14^Oyr?#hRNjXVD< z(|h)g2O zcX*f^leD#?PW4ueF~Y2&*2cC*e`Zf-89$+9rCe^FdETCCGM1~x*o~B5_Lr(Hh&4p1 zQ@!a&zODNYwbvs)_G@fqSQyjlqJ={i%?*lAycL+cxEdzTDHzV;s7q`Dol8BoOs$$C zo3|0`O;SXp!ye8VRTI3dc!yeDA&4pGln9wmU%~e>i_us%&GunHAUHku2Tsto>c_`i z7}~8t>l&acT!EL#=qqvwx~I40Pl8=J?;08}CoXB6U?eQ&6>$JA#Q5c6EkrwD*Q2-4 zcQkVSo-OS7tetaP++!c&s;y?^(*zTyi4A~{9?lSBd>%h<)CU}(pEopiv?Hy{#ZoBs zJA8*NDhj80of4bzD;b-S{9?5XPcc)g!COQ*wO%p*tp-WqdOFlu zB9}yc+_@Ravof}Jv4rh`W+UC8A7uCCj1FA(8l~ytB5n3HLG$DoQP%G^Y62U(poWPE zU}NOU4^dcLGF5>RI>1#DC>8Bb{#e~;@?Yhb{41DstpEa8JAYo~3r=t7ezo4^$8wCX z(}yX^+`bMq`(Z#Cg3Tqdnh_29Ub_Fy-3E!#E7|!}r9TLKQ5>U9T6K|(d)Hsbhscw) zmQV=35?SZ&*eEzpWA_w+Hu4?vyq`b!43b!X+;tLX%H?6Q^KKb!NBSE0Yx>V3?nDb2 zD0V*t=!!pT#HD$q6)3f$M1<_86$qLQqD^RI z{`j%_FYB*@DqkblU@7jBvr*69s?RJQ7e8NZO^Dq}l}XJ%Ev3K$ZOgc;c(2EhXQ}(w z%17*bkF}>r{1`c@tsM{(zb_k5X~B<7J5GJ~z|iz4K8nd$;9uEI2W+DSF7;z^O664s z1O5qap+~j~*b@F`ksCCtOT*O>v}iS*kGj?UAMC%+WRr(gTWfIF`Rr?DM+VzFL$fcO#4ph?ncq zggr=U-o^1#TGR%*{i3L{y1|szI}sRx82Gr%HfG6;rVIGJRQ74m;MDH(r7``2<8%X_ zUW1tE^TC8F-@Z0b`E*I~ZS5_wvCBpDs&}ko&x?ta!YzcrZ}Mt`@$7}>zVmHTHO2cZ z@V8SLz=eh7M>DZ!C6`}i&5qlp$=aJC6~$#ZQNtL3O&lXd2hT7_pWRa^bH1xv8J-g4 zuA?*6zvJyi7q>zki#+ze=+4Ty*)Elx06==I8Ci-KYX7^zn0;6T@ySscKCH5Lvt2xu z3@n=T>{?&2ps#|9bt=y8X>`6cvJUuN*c?qU;?77#TG5@XETB0KAidS&|N5s`e0py!Qnr7SRPI3|M5Pu6Rs8B7Df-&^eT07EC>rysvh6Xgv4n zy!mq9#Quou2qyoNLgUT%I{Qy^8^!#%8SE=MxVS^a3nKu4_wdHQ(Tm<(oG*30AmlVp zT_j=zi~O*U`b~UKdXnr}O^EuPDHE4-bg(;QM+`HG(y_*fuJ8l^x?PxT487r|+J2BK z?5`(Us!45(jk|;tj|jipkH0&{IP_V|m%1SzE$WbMNQ-Kp=&hYy6M5FFyFKTMgmpVX zNH-aNf|7qOZ7~$+3OJUf%zLo|6Lb06qolxdhz;SUeI2z?UcxPdRsFB?7Q~=%$d~r%`F?9^w~Pttzz{ zyyDsYNS_;95GC?Ei+h|m5?}pRyx=1|xdn*L5n$e3LCz!3&nw%AjBXo6$;rKs^O>gB z(0seDvXQfI%ILcwFJ~QytIy~9JEj@{UzSxt6W@r8dHLj?(89Bhy}6IW_OMslPVRPp zSS`ai3Vq$GWiz2&HH_NmWh}g>zS!;G&Ls26!>hX4lZPDbBzz-P5!cHl*yOolS&Cl4 zz^pisLspLO=|8@q7&CdSC|zeXTH~TiSt=0=^I^(O{U!WW)Y>h#wy9`Ds33Ax!x>#~ z?VQsa?Fce`){96tXSl&?X8jswVInLrR!EuofpK;iw%-B zs`r?D$LuO~eh)t$#+_$FDyZ2%L5&@C;A|rt1Dqedy?U%4LH2~#r(aL$yKu8#Lr@Tx z`Svg6zbG{ZTux`fWj~=;La8N_9=&gOsGZ1w+HH59U>B*E`^>r-sg42VxM$I=LIu#Is4Rhtjsz_vvr5)Y^GDhp@)-GCSBRQu)#B%%5II z8k(K!U?0NglREwgG+>WU)mhHoyV!&nPu8^#!k^ zf+`(XyA0HIvH5<*RId?mrHe(yec;&3h~*F#)J$juKDdS~GBq(1pCht?d7JSm$rtni zBkR7SPzz)?A2zgNRse@JIlA_6h>l?mVepn96L+JhlqO~}oDiV2fP-t!i;3R*`u<(! zuaKXw`%x;R2fZGALfhM#V%4i1J9ld+Z}*yOAoiyt_CUyUoT~N@o6ki=aV{%*BHni5 zKglSBdMx~J=zDECH*e1SDV{^k%km1f#_?p5KDIlpXSs}N1pbw0O2G;Wp>k+Z_)ySR zZbgYsH$QP~hI$QpPfc>9>Wt62hX+r}8=j%Yyrq_3P20QD8-Te&Jj&{~+~a{-PF%rm zyaOwwcmwnC)zRoL{w!Ax7~a9`8U}VigBsswu!7J5nDjE zuwQv(LCl2P4KsYlz&Gb_JAplzPG}WJ6D;a9?j?6xX0$gD1A$a7oVhHCXRZ(Mya-`RDa? zYll4NB#BQ=G!J-kl!aeg;(;zH{V;sa_&nrj|NnkGKN?IKv zg~dbK;D5S$%Wmh7S>9nd{L?8i?ot!`ho;YjlGq)@E&~@riG?H~5g2$}^SJSq%K4_} z2GKxWT)HX32(FUB8&4OWDjo|484jmG42d{AkR~>yF9bkdRB^7!xDuW2gnVgfEomvS z*wtO#$td1#8&_i2oSmK3oE;vq{R4=lXR>~VtXr9cws5n;q6T) zI1vR0^6YIiuq+8BDW8<-CtulWdg7X-@#a-yAFM{UZ9k@=I+LeFrd9$1y{TbCTqJu+rG5 za>a3=KkQDYQw7H(_+fHctR6&XS~z{u&5BrF3DtL~_{&8oEgj{>@7VqtH&D14PFaO@8;J6(oUsdW;^2*IpOLWFJxlvFy~rK9yeD zs93k~@Bv~KLdumQ^E+5C=EGqm>Zq!LUP9oV2~mR!9)c&**n9E72Q*&_@}-ay{^PE- zj_quxhX8}c?7wayc0LZhk*|kD_YN^_1U-4*8tiB@YclM9s&L&Q!rP;L$Di=qCjG*DFe6V&bQ`cr`~07KQETV#f-tVx<5Q#Dr45$Fb%7$k^=%BW@CD* z#{(>Vo%_(>j+fogVRm;>d#@eQU}OkQ$AdV56j*0^!OjHK*QLk#!dJEZC6xW6x^m4x zz@lvnRbWST+*YN|LBeyPmOOl~?eu#Q-Q_tA=;~Oq$ry|@xX)OJkD`)u^!+8N9p@_{ zDV!NI9d#5(&+kA^V1ZKS_g8*xn1vJPF<3dUp?KFkhEerEhtkw&|Lu89ZStQS~57$yr&6=qX(%Ka*Pe?k|~qW=h+iXnYEBMSriwu z!pm_9727s`F`nNT9eS7WS+*aS})Yo=47I-o8Pn?mMVx= zZ-x>s{@m?kAFrUPDKmjDb_O;>)_iFc$F*Sjys)~4N6-EZG(jK4-GLA`khYh};*D6v zPFl>6mH`g*X}RStKS;6>rVa6MX{+omJ1oKIuG)D89Y$Lad>-<&1@GXikkzOn9vIqm zmH;~PrgZ!-qZ$qbK*VIlb{!l8a?N3;zy8C$rvZZZC3smjzi&FKCxd|Z?Pb8sGeYA!i==wr^AlHvRqo`D4UsFTv!D{BYuQNgf-3DTM{mHwL88; zLMWpupv>`{U@zUB9r4lv!5H{0)_WeIu7##otf==_i#rY)Ld&9aFI3<;T)5`CqBrQk zdtvICsS!pCAs<3v8p4YD84xq6ayj#+8IvQ?G8wCBSHCO=lK2s$b6Hkhq26Yrk!z8| zuUiqOc=O1&D*+U3`*!1f<8L3{dV{`TnFtI^kHfN{_S^mUc(o>I0Gdv6=z$lh_drCT z8(q%N34Ww1Es#)dex|TT#YTIjAfB=4!L#ziZkM&*26Ck*TJ+OR*wxMx{MSI~RcsSc zUV$ulLTD{{_mC3+w#10FWfm|#Us!SA7No8pulPd73X< z40Ek$Tg?)uPt+@64T-nDrU~A3AW*cc=O@G`PYvr=;ZL;nKU3opsSN1_(V-n7z=0(UM z{_~P4uFi&W!Bt@OguM;j_T8-DnN|Y|OuAjraKhz>7W2}y>!ta=Y<2e@9n70$u8|m8 z44wd7zm7`IoBA-1?j6A{T52iXD6h86QS*&dOQ7h8Xzn=;>TfS$h-i8q%}lcHN+v|# z_o<}#N~%s&05kanm3w;X`|XjxC+zFR4n>cK(G}spt8Ne8r8cK3yH3Wet6f~DrR?lb2mjN}6#H`D zkmVeD^>01ZKIiskraAPIdefix(lFT>BaYy!Hx;5&9SRk_{Y<892Tt&-jB4sK=cqi3 zwl+OA{6!CPZkC-k4US3y&oG`+`<#e6kxwk?i|>2=>yf!T4_OsrTC!*ZlHwDj!0QKy zTJNf7?fmhH8{GT7O!N{MzK)f&VL5B$Di6YtFp3*h-tvC&XN^1)t4M63g4H$NypV(i zrVvUP^Z=S8nXly52@0+av)&3-Fa=tVeX{pQOF}nna9GL8 z^K+nVkrXkWV^1kXDC}7c#hBmQJO`?=$U7CoW~mct-T7Nd#g7OuR%&}ZmJ=IR(r%>Z z*aTZz=1B9a{4cCO6gi8O>ss8YpdV{y2~!ve{~mJ=>6%jJfdOYSThvKe0z0F~7$(g& z+jgxwGAlPVRK_Ajw~>A51?6q2xsu8kVVb-prs0@SuKG&#`TBE6UDWtM&gO7WnWXPYO?~@S&G}Xef*oAzm+&kK5UFJ%k?d=R zZFNNUr=RfexJn!lFA84|6z?~7AU&V`pG+4T?)XBPQR^JVNP;u0PdCa;m%1j${Q!)X zY0&+)arW2D#uIDjAL2iKYvrzK40(PGXCInu{tffl3n{Sz$#DTZF?M+M5B*F<81W9Y zO@j^V2x8i5)pDX&tRle#<)Rbx`|{EDnr&#^#fHgNLYnku?PclkqK8Yqiu(5H-kOk* z_;0B5OPg3auA~*_w~A;s4KO)yh@&WhI|B;#hRperhU4o;#AadawXj-SBeSg^1z#JO zf$nf9&kZ)we`Vo?d>O2SYUX9?{6m>-Sg8j-_|!a?TbG3xqW@~w zWBS9S=ocC|tNBy}O5aWL4_YR$-Oq$JJ^IXVGIqWxHuaL70VrUa?I~7tX;zk4PYv>c z_)FrI*1ONA-(WGQjT6Gb~D?l<_x@ea{DjNNtUMPsw@`0xWB%6> zRH=;`S%A{coe6qeU&c9Vd#ILjc7F=b(p_%h%!~nL{%dgOH&MER*0`UEmWeN-aT*qj zyJ4~GIQ~VUsIQkntW4H_nEsnq5h`|L$={hx(1bl(PW4}X11>cI&Or^wU!gBnRl84? zabQ#whHS_4 zGyi@UF`p9QW`_a3lUCh~!&P&%VVU zarJ3R!?EWmrhA3rUgKBQ>^<81Pit-uaP@4iD|YIqeqBbMbIVzQ)Bb1EP1mK`OyYp9 zQ$hsQwfdv=($^^0k6FL&jOt68?T1XLmcJe7{F$f`^3Ls2rDOSOGS4u18Meth$uLVH z(P}ee^WaB%IdPlpIdK`>eiqYj(fgzFT%K1Wn+_#BoEu~Q2fEFf-=ckJoz8EL3px4= zN!@JU)TmA*RBINSKjsQcBVm$(g2A@+dPU!_&54LU1RNgeDbN~y0h5GL?~~&Uqr9lk z>y-ZK{@y?>(z@4QF8&_VWU^rNS|`+_!w@9*15?P9tuVEJfRL*BX4`ygsuas=o~2|w zWiHq~^%U#tdK9Aje*b_Z|9j3IXCsL~i|W~*lkH6{R2zWMtXVZO59j&hL55_z%eR=e zM-9)xO43l{``P?7plGcni%xYXR=$UXU`}d zkFO5A^jC3a?2|`AshFQoY-1Y(_CG^hS!xOq;Xb%!Co;s;OXLz+s#;$C6%&=8SmKf} zUJ&q_M9$7I_~RreChAP`VbQrTqZ{U*OqC$KAsc;Nub9ag{Y3pzJR;Bo-r*Y&96985 zW2yGBj`S54^1IZY6!nt+vYK0Q)Srz_k{MTHNnneZPI!OI2*}0`56TaU7N}A8(7Q3p z+2C5-ltFLmM$u{NJD@VwG@qzgyen)DFbikv?}@p2IidkE0EHSB4D^D>7;Hngim zVhuEG#^uc@dTXNgcfrH2Rui$|l{V(s_Ry-&U&#BwoU52Zj%Xch*)FlN0Fhr79E9SxS4Ad!{YB8QC}wHSwVii%x? z9@!I*?GN9sUN}jPi_wlN!~D6`E`eF`-BYUpzRX`HU|z+_Etf(U zt2J4fzLqhOQ0fV{Mo2NVnY47wkaA3&P9FN1GPFb&Ie3&J1BSiJTsl^KMo7}(5vK;C zDaOp1@i@ik6j65VBe)1bRjjlfdK) z7K5kl;jREABNPweT_o^J_|^q`=Z#a@$wzVx+U^f7aaF^VoX@}Oz!E0D*kPl$kF*J* zA_OB>%c&7z#5r6Dj4pnm(^`ifgic6f52jfst?vb*r2AH{lUWh%-0GzA=b1BhK2*&_ zS_b#%*dq#E@Vfest8S7cU|a76@~9*6F)uluyAD}Ia)_d^UqN*Xi2%hDZd}{#;kI)^ z69ik*h(YNQLbSX7W0@;Dv2U_tn^TqfA6)WOE~$xT{P9&)*brTv3MB(+Sebw6E3&ic z6mk@fS3l*9+7S+~GRr0pyd$QaNcy7TheJkyX0K+lYi1}s8aXeDfU;pLX7D>th%)J& zj@T4k)l-g4fvhz!*r-{M2&Z~!RnI~*aC^2EC+~0(afsDY3Ee6V29WJh##5{;+$9(pRx7b_`dW zoJN3HMU&zujam;cci4KpXgob*QBo>N?V0hPv10Z?l{r)9uF-(LC}qk)^6yCIQMk#V zFE?d|pa}%U)(Elu?!5R#*oulHm4`baECz;xYf95pjf8g22WxYCgU@c05m9({er)(f zx;bz^3R+$E(9V1h zJJ+2Y`~;%g&alr@v()-CCP>X5w3^?Edk}dTeOV^^?Ku{v+9&IOgZp2jQ99d#@$dVV zoLvLGn~QS93!@$Utaz^R>b%LGP2Heswa8M@Y*I7qd99=$nbm6YL0Z!MX+eIz=eLRY zn@guY@x-Y6`ukjgU*=PuGnQ%X`4dHdD@PRF%phN0Y}J&?uI8P&RrJi#%%<>xyY)r? z4zLA{zB*yY+^x7+tgmif_7nSS3WXKWWH?D3r^~7Z$hm`6CpLz`IYS(x3dge!plysu z7xf&=9q$-#5pvjTa%;GrAytk=j}cqd0+XKHQ{dS0 zzooo0xl2KiM9d(Cmg=J+Jdj@BJh{d5-T208Oe-__LrEAR4?h;udLNW-oc&Vha&dBJ zlw@AoQoLVqVEvQ-df}1H@r&D6GPUENTmzABNoiS~2wGYbJgri*Od37h?B${lhBv$2 zE9N%eE>}aR$+za_g5)O)4KzEYg6(a#+qWx+vpkf!SRIeHhx-}F` z$f-+LI?*-1F>9_p;u32sOlc5e$IIVg$0bEkX_%T(*a~OQnaJpVCkJoOtoiDel1+UW z)&G#IEacBXmAnb|UMCui zh21xP8o$A@iSE@TPNyN>LM$QRr(g6N=RRa8Im`0|wF6>MFhhnA_zb88mfNa~^0y@( z+M4{VRhX)+C(eH9W#3W^xH?Pcicde~{gd!|T77?Dv0~Tj$zj}1d?gD-LRQeBBT~Bw zS<>4)F29;1N~8=<78gr=ZR42^;si2H^gjGhK^NTNq)dmFktpG*!QUaoBS`Y-pwfP+)d9%C?y z&sn40O`i;+C^U1PC{Py?+9Mb}=L>swVq$mwS_g>2?{A^w&3xsGrPfD*XOKtF_qVfT z$B8(^Uwu7C*+fx$02F%($$~;vBuIve*K<(;gArX|3s3_J%jThd`-Z#kv!=z?=D0xv zi+d7E*uMu#@XpD=Mj^T5y-Y1v4-)n9@2W?@1T!_xHi`E1CUB*o*rxT%{V~Z{Z}Qtg zX?l&i&si(_z}pUI)0xI;cQ6?<11a>7-RX5+in4^X<2-8i;1)>=(fuQg!=1%;n3OUu zn&)UGdS&l27K&ElBvw6ACy{aTD)UDU%nEu+-47ZCsGSDPvR8*y81M08E{x9at0|J5 z@;y?Sx8Z%2t8X&_<*XDT zUcS|9&%y|m?cB5^bw3l{j12G+opZmKk1Y`*cKJYkrTWZQv+1`N?hAhSCYiv{i7!u7 z#b{xzEV__auSFvK&HpYqDm|LZ(DiW>RzQW-0o&ioh@x4??O1#N@J3$2zUJdtZQ5jN zoi{vIYeX5Uvk0Ba%~5$6d#M4uwjcwA?E9)5c32KKP3e$4?O(wk zIj1nE<=$Zwm7w7AvkGuU$BVkL4NLqiq$(;=NJJ*_Kb!~1zz@d>Ul4+SYtY6R!_XYm zfZ-Vjc!y&cEOoP z6NyQ(Qy;1P=D%U$@1B`-s83cZP0Dtna;&HQ2e)`f66$n$7&h7sfyk%f6eq+KXe@gE zBI0}dS8j1XD>mjcciEv{5+ab&HvW@i*8?s5T?p{8KYDeV3f{2#I9ara)@V#6r($zL z$3xI7Svf$GmaY7#qm``ixxeuI7r!WiN85aNaKvv9>p~e{uZ~0nTEk5k|HB}UZtk@U zxQyG9TBj9r{-v?>Vo#FE$*!^YLz0ID`Pl?Xb0UjB{&iU?H{_AmXC9%8AkI$>mzTUg zitV8h4W{Kq2P>Tg^NzZ)8xtud#Pxq`nY-WZVEH)g`8O)5%$(!QpcO`qc)7p|W@oSl z-W1*>ev$Q&XzSQFIfh8+=zY3xyVYTdD;lM1#cmYo-wmq4)OEst*2DOAr9^tyBD-FJ zDJoIN>_@Ea5^PA^CupkTJ23Sa4LoG}xmuA*=HTxYkC9lbn*I31&l+3VNcRl`dEV$jIo zZ=szJN@Z0WTQOSm>n6YvT(KirQ^k?Mmcx=_GP<2B_ih#bXqmUMf~ zkVpaZn+0v7f^kM3q)R+NHlk=~YXQ?h;~Q$ygcDm9Xd**6_uub=GlnB8?}WfA_%4z& zxK>|^pA+;`*V{eFxnIPS9WT}YD%4)+Xh-|{lezJnPh!LWY>2EYxXN&+TpAJ-^1}WB z7sWQ8;Ja|qm&06Vr)SPa-y?j)End1KVw1u-#%dv4Dl&H8JHAEWfAR{wCZM1_{7o6i z_kR0=lFxL{t;k4m#ZhUEH|uWEC!(-@=i+`Oef$qRMJoroXKp@*JiUaY{0%ogtfC-zrDsS9;wldNRYQBJU!7{L zO>SpuyVDQo~5Yp|4R$eY7%VOh&mRmQ{4zLCl*t`XH5UK_|kio&@$@*lfpl4JRV3 zN0hZ#3Rz0S_a7WR4mx1T?=zmZ@>Bx|8dv80FF0g!`p}?0zGvK1gIbsJ+X={O9-FlF zQQjZUrM~|{`#VCc(A?p+7izv?%$rTyLMSJ^msr7cE~+d}3h^(51Jtg?$3pAy0F@sL z5sqa2mE{g`vVQ#%_rG6*V@NtO%Rd&_O`W2@Nne#%OFXB3ZTOVT%NgZ%#=Sfk`7NjC zvmURAd~E;k-Djc=b!`jYFn}JcMoBhEozKB-O)XFFzwGTC3aF67p!LLZ;nXJoj9YY? zbFXobAUQhv<%(l0BN-S;_CDO|IaR+LJS52v-Ps%8j%|@A^h5hbqVdQVYS}eh$ z?R3TS;oZgS+u2s&T~P_sf#tEp=DoZzpWLw}R9BtqM+5es6lPUJkiS+F&K-^={ZP1~ zdeP<}gRaH*`8pI7vQp9V(hDmugmN;GFOntZRaDb#9nFRe6`uw#$_%bhRvwZvBlw0w zx7<#w8&J23O+KK4tR}OYzjzr%Xpu~V*_*!8$Tobyu~iiAC@q08&U6UOG#$T<{_wth zC2mJ&{PQ8xA5LZgvL+Lq%&9W8rT1MA;&`ru8W_rbl2jK-3b97tC}}A8Fv>T6d=4qn z+WCZt+7lJh5R$E8P>b+;xB{U3c-C-a+fVK*A+|xosV*0pG&=zNRW7U$&?`0-Ek}c+ z#?8=C(XJ_*{N(n_aK>N%^)%qP{XAvuK^oqR2+A^Hm&;i7c^;5u?>TUIASKPv`JO9o zeWWDM5$njvWt-q<3NNNltH^^7I-H?)%P-p%YaP1%i+cAn#&;(&xiR=FP9?3;V?%!F z34TY1`AJ>#I3VCPj(h2X)fXpl+9XnsJt-6SH3(_R{(QqN{r4pun_nx;`ahV@h70QG zsyj<~fNuReAY`L*9d!xCQJB+?N~mU7kqo~0pA-jt{wh^YNPNsMXnj>%8ABj4h+15# zie_moi5gJL8w9ZswK_^pUo}dWQqM~{QmjNy3o!h4gUatCs}9-BzZcHO_a zD7P*!X@C}(DWWzDV7*^35O0y$JUiTV)I_O`f2T@5_#q3uzQ6y)@ADM97%e$Hy2PO)*%M1uOI+5cDZeR_%S*F+qsvR(Un1~LIiG*5Y|_Davv0UEdnE* zzM|7w!Nz;yX($x-_5OUom z(t{5a`I938MbBA2-xN6)L*0(Y4-Q$=`t{f7&h6d3GB^;Gw;APKu;vrqIkx z0G5^D{y{VOo*3SIzESDL>Kd3x+t3@GNxOKDZGVFt5%Vk^R=gYrb~0zbg$T`eqIc+T z{PURlS2#BIA%o=4#U-z~lE+sne)DJLN7A`XEUR&RaC>b{b(bHK{Pv~aa^Nt<@;{l< zm&l8yk#arF;Q=&o$DxoD8k%g5^Y1BcNE~>$u;FMQS5yi@gZz}Y5-9|bC_N{%z!eW_NU*bFs8QXFXO@c#S1#YOTwHXr+2CE2*M1? zcn}>m6FbY5^70-uv&gk1dsx{2Qh(Eq3fSb+NC4MN{%kM=OT1flJD(8z_0^E$Q8a0lT@6`5TtNeHH9^ zPp3E2?WzNNP}H4Uh0=rLDWagg-3{}4`@8q`DYjdn5;{}wHG*sMzgMiR_m!1?m}gI4V?NEF*i2GRmy@bR7f1@KWiRjWk{l|l@rUhg1S|u^E?g&($GZ{= zQF~C~XxLBEB}oQW_no=pto92pB>4XzsYVev?=L>NPew(75N|{PKN;D-XYwgcD4M(= zUK7zPJMuDPePh|=d&%^JIjd{)QKCQv0w!(_F3g;%d}i3_ozT1lw@3WIT^9ZRh&!yC z%Z8(Y0Yy(2-^-RK%`Q^SJI?q?N2+Gw4p3mXM& zbSI*T=DI=RqS{MU^Y31+g{|pOGiGp-3r}a?I1*}51MGy8yW@L~Ovm{^Lv&&0uZ5kD zPEB`{9&2?`*_Q+so58AvGvF`QfkTf>iJzf!Gs(g)SV(Y>aklxlpsHuUB&491%g+1G z|Jd4O@W_*KUwG>(=#Kp9w3R>WsgQnC#Y5QD$}<@mieH@h@BD3ghE#q!*roPF?IL9U z5350kVl_-iVLI3P@f87KCW0*2j#;QuaQO3ALQfw9f`&rN$9iMH@5Z0=ajV|mKe39L zxK+I@rC*F``x4H-ocD|0v|L+|-yBXOeg-(9$OTD1kOP#0aq6u1Zw`&!&H_H0%+>|m zF8FNSCxda8Z&w=hBwTvT_l$!u+g@G&`5%qV;-pR6R5HntK~Vud4Cv44%bb6A*y^|< ztgcTuAZ(m6wWweZO90iRDcW`$PzT|(3c=v|ye z7UIXeP;00zefaWrby-id;IY;mhNxKUoPYIS3f^7N|Hmm~?9}yrrOeqj)2_a&6qO&((CMnl1X zT&jWhR8{*#pHAAjh$FkuAx+q4ubCQ-y>9#Jy#l?d|yGbyn?Lvr&@GN4zL`OUw;57?^V(JwFHlBN~g|94Skvt{fPxQna5#lj49J--5b??hm`s zu6N{7Vep+_C2wDU^akt_VDRnJ!XT2iQDog&&~HY2h+0bSdvx0^JM?zGo~f?KqgISu zTFy_YJ|yMXJgm)>a_aoYJ%al$9=Ix4n{6Cj(WQ*p7d-BNt@h+NaJhco`X*p>{+s^u zvS|9%j_ACx8|>;;NzD4UBYTzaF5uk($Yia-{?Z$THW3sAy9?z6EKPOCH}A4n_&bLi zD*e8^auvI(n4GT$P_WN(b5wP}u4nZ6MRzb~-KK5%U@a3iJs++0`WU+~9j3MYE42At zQI147QP1v>`3fa#Vap&v3slT6;M6jZ54X&=-k;1JR3aZL3w{am?7O0<^Zw)#ct>t5 zazb*yund`BwK4bfLYHkb5(;oPGH%z=0&`ZdL2DGy>2^%@HqL(#b?h=Cssmp;L{Iw` zJ_elG%=jbNIISd*>PawXZqQjN>t8DT9lO76DgQI%WuGGWB`9pw({sFe?=DxT+)?#t zdT!8o@e{}D6pKimI5_4EH|t9%)rP|SfRJsSJr8$Zo7rn&xR zN7g3?JiCPBwIXj_D%yo+RsFKR&oe&`pIbiSduDDS2WEY}Cp;dy1`|Q93S29HjT}?XRR1NX}0oXt%zq{dUOzSW+Z3lZ2RF0R` zH1!NK5;dh}cAH!YMRVOJ0Fcs28BCZo_R8>hFr;2aT|Pu{nZ;FFBzdsI90tUftDpsC zKJn?m`A3}Xr$Ip5Bvsp^aaxj}<~KPW=7Z!E-|;p}baktZcRc(c{OaF672EcjMm-9A z>FzlU=v307V*OiMC+M3N(syjX760&}58{>`x1$xu(EMNk03ZNKL_t(D2W1BC8|xE= z>04w$XC$Ydq4J?H(LKe{*ZIeVcwEB!DBl9`S-O~%B*djbYrq%)Y(?k@0E{m6PUx9W zS2-i{E(!ukS8Anf z$*o%g<3suKZ(e~9z3LP3OMcA&qiiM_#ehn#(S_SuZwpI}+c!00(ArFQG6&yxB}`c? zU}fY&LC}9THd-s21q%W=oxFe+a4dReWlB|MIoQaT^Xewvasxpmi?dssNphIMx^RhAUsNg?!v3hNup4Q>cSA zJJ=7rpENBj+sAw2UQ@lg-BJr>5{_hJok*ahxj*C5b>?JNw@t*x6>JQ} z;nAEksC~_SDZm73`7&(@_cB0Zh3N3`e4vVcq+28w zKjDC%2hy2AlAg+O{_@#EGO~O>8+h6u9fuZ&$|UcOFNl#(H!)J)X{H*1lbd3TcY>jp2&G6#3%Et0VeBO0Yskxs_`T7T4gNWrF>+2EF3`I{=RY_*vYgS zVa;btDt10Ut4D(IxI968m^=$$vg=r2z;Xm_*3%AgGCSOc^!IJGpT#Y0M!#T7qWF{m zfYl{-gslKLVYmX)m~YJbXk?fMb&9a+umwOmIXW9f|D!V((uxj38@CSW(1aHmk;lZJ zT-I#L=#H5USGv6*yR^=`m>T7rpprEgNDJOD*vJ@wuiLRhcFF|pD09vs!PZ_2C(nIz znk}WL3tDV)Pzmh}G`8)v4bS?UC*Y1hbuiYjM)n*;lYQbP9ON?w9f%fZF3d zFF6I*UVZ~-r^_Ee3|M0zQ@2fy}!r4`> z#CYFE_2}5%VA0fQlxX#--xtR`a+g3ox1Q&PYDni9SM!a0&Qfq90A0PLcChRHB{5$m zlMZob_S+$?04Tmoi=&vY<78M}>fh?Rjw=8b$N(U&PFpJgv|P(8TLJKJ>I^@a04WZp1K~PF4NU0SLPcBT z&^sN3U;gXkvG0NVU?xt$Y6=;gzr1EqjFJ1+>~YhzH{+yV{}^^`zpcO< zX=nC$Xh(UH>Ojt+&;hN-5Fle3&U>aq+?R7L&H5_iD7AsfnBZ#oZC7y|>5sxD`FH?u zYeE|1)JfJ^U*~7I0H#lTlU^C#+#ba{M-I?6%HAZ0!QqtpYCH4*fSRgk16<7p%v!ys z*cx(8?N965c%eew7V2;aPz+2t=6R#SAI%fddOjALdS4RxY!c8s zb}(ZHxJ0O=7=tEP7*M1rNlxql@))3uMun60vSPTE5f!cD^)il?%$s7^`gX=z2s&T^ zq1YOFZ8|5H+eMeKC2KmXm$G4~>FhsvsMsFTtJ!RwCuI2!xcjj`iO0R-k(ll^5r=HF z1EHdFmTraR^E;gj&%Fd^|M9t4+f{lr$L@U1-)X_2}`>d3r#@Gr{4#zPA5v|k=e`;-(FJCqASHt|~o z!sI3(prIx}WaLE|ADp-z0EE=&%S2{2N6KOt7vBS*LpHNQ@?ElwZj(HK+P8-Q2ilY- zJ&k|iX<5DlFbyXSQ?vtSOt{k`i7q8lbIVo+0KhrS>X|sfJrraU^nBkgb%QieI<#b1 z70qdXG$YImD5YF-_@zXdM#Eg%T-J2Mi7Cz?R&-EKvXaZ-)I;+NelqRL(b4DP08b7` z;1|M|#_i!ReE{zN%l88+`HZdBP)!fI^rJ7XJk7)7ytkc?e?R40YJivwSYe=Ax<)Rw z@kZ-vvvk#X8V3^7IN;u&j}%c+Yf?$nWq+R+_ue#O%Yu3Em+Iu(DZ}wE%ELy&Jl`gv zzF#^dX`g9M)KunAg=3EnKUHVG3_|7GIx#+QJTaSCIzB9&lTRZRTa0eIq?f7da0sxE zU1=E&0?~#r3-*&uY2E}FjlUy>zz!q(xbT%WW%2{*ar9R`sMT;>FM)g3(r{GLGNvaJ{CvV7` z{Zt(Z^<&W3^5a~5Jl#3qgx4K|BOh@DJZj9yvcxxhj57|o zC#dc1F-K|b`)fRTk!R>xRxYNC3^kY_eZlZMgiQx^mR}r9^Mmyy0Kb<+rR9)$rF%&$ za?-O-iPus&Nki7};!~FEOS=zmC49sRY4$>bfg)4MOgA|nbSs$eJd^haP+ukRdS+yE zf9A5s+(^B)LYU)tkxzZuP&;M$I*9a{pTXBN-L|kB+DIDI3!1DE>1IlwHFRRxL^7+s zu@*ck%=+JvLx6KZe??F40qCx3DzaguxvA(j>N!3Ax>VV61e%Nus@b^>77S#k>k~Rg zgN>ySV6_7^+xrtd`QTVW+|bn9`wn~I@ozl_ce?wJ8@kbLkd_BI&fBiP4X3{5)42ZI zH#P}A#XMftGX$678G97V;EbntE0?te!IoDo;*4(4YUS;J3L7P(*R_Pr&(vt#SR*e0 zeF8u;cYV#XYATWUip7_9LRITYi-%HFMeEVGl34BTqHW0}bIlCG+h4s;HgoVIKqdm0 zC40e#_H2B^2e)T|xmcRm9ob6HvnjbKn$lyAp4$zHgMl}^C!KG!;hIaX!zW(;S=_qgc9zbX>VeEzb_IDN zL%I{y6c;+zrjg^x-`TV;CeJFKu(6d|@-adSF@jUOq*J$)@_aZnb zJ_aO8{w7bouAc7NzcQrIn9|U8H7psE~>dcl41 z;1~RCN5zeSx~_5l-+u#NJ?TGLdNu?*Pquew6lLB6*(&_xW^lb@5U?A9qTHLtzm6~l z0P6|z5u!!v&r@NL^Isw#+xDK|5x?~y-1CIH4Xe0LaQm%0an4_S1(%$C1xp{ic-+JJ zOVD;>yXusgkhfdQq4GW0t;PEY^TF858wXA+o0P5H1;zlN0NMjVTMyyFF}{+4UHRj38kQ03>YC zV|`13MIZNDaP~jlYl356{ZQQX(LdQmX+vPw&NY1cwddf9^S&R`mUhbDD6kCYKXmC| zgFdgK8DYLRx0CPfi5OAXdhZUXp?@N211NOoRfAc6DdY40%iFs+T^QN8n z&`VFpj;n43FyE}d6M8=Cw`%9V)lUA8us*Qvj(&_QHa+Z~0l-E(osL~Q*OtH6uM}7}=daZno&N|UjL;LN&bjouSC>D6 zp}fL5gK}iqyf40Tl|UpHNBbHs`aWy%hBL+oEhqWy+7FYTpiM7GR=yWy@Ye^lvNX+_ z$BQzenCwF-g+6`Cim-1za2XtV^x-)EjgJ!56Ewt23p>`_#SqfF!-02J)uW~;C5VxzN7B~ccIB1 zx;ULK;Zjd&8Z3v~kQkl5^14*7R4&|W^|ib%IwjuaE4usg-v@VBIqUV{l7~_mEiWgO z2ezsjX+t(c#XBI_n>ai);_#&32$8lzZl_(WY4O3^MtuO!tK391N^7Xjb2qenIu~t< z4W$v7mvzc0p1P_+_;jL2GWMGLv>k_wKN{&tHNn&^w%Cvv6v+aBs;Ya^B^NP;dVKHPV2c;LhGMwz{*^ryA{d* z#ou`#e)b9X$?)l6*WwUbV0|b=(*OJ$zKn02b#d$X9XBS1QEK!=1bx&XDQc5Gm%t4M z_svb7ly%e~AB9Y2H`aN9Bdb%#v zGmn4zl@H;T>u!T{6NQ3jXwwWtD<)+@`r1h@cyJfFHCK5&;G2Gp+Xvn^ODr_Zr^bjT z3ve`Q4J1_YI$nncm84OQ7PnL{>Up>)L8-Ia-PU0inABm>jim!n@-49R(y~R8K1BIG z^(pkxb&I~_SHmsq_u;imt{Po}r)b|i!$!3&t&|m7K?7xtEm9-Si5Nd2&oQnwo^<=i zY32*6u3Z7>(jA(X^Iopk_{^%RSTQ-Xcht6!$)s170BGCe_P1OC02;xC35m2lykO)a zb3RU7RMiBNB`%wAT4brcB6Fb7h!E@unWUv&nVIkRdZ8P9A5GaGj=1|dxJ)s#GSspw zolE!VsXZpTt+k2wTPQ^M5_Jwc{9ruw?;nr7_uZ?|u6`iRQ~!GOL!TUOy833k@5QI$ z_FH%H!2=}0kmdYbzrh@Q8g(JDV#{t>4~LjI{)(|dbk3vVmAy|6)R8m=a&^-kYNjca zl`Jr^E0$z#>$qlwg6us@OZTq*KW%Z9@l_dLISpCQsqNu=zG*=@r_X;g{uPj)w$DbC|8ovdCGFfGpC)ixVg9d1RowCu%e4K7NCM=wfmo5x2`sALH2@q77#Y z3RMjlYQBcQq1_6B^Ml5@OuG)Uc5zkWw&__rK+$TK=DQlM?(ju#w}yw}U~1sR$Y4gk zj}F*nne$YJ4sEk4Yb{Az^^vAlPA1z%Tjwbn<0b}&Bf&->A#7mg%OXF`xaISOh6&du zL|+y=q+rv6%@h1_KPP?xxTPO&be(7FiOGTSuF`)f+;j-|>ERQe#-TCyMWB0+5re%KL;tpj=4`sm*WsK8Ow|;sUey8eX zqR7PWdZEuAcN&XDyHuHS9BV z)vi*4aP$qOArTFOh(=ow>tF1^JQmesnE00U0tw%)fOF^M_BOGx_XEU2D?gzb}pwu5jVLj@X zjP*SD7J;sg=u@W)`UX`!@oJO&COwRcgin2pkq-#f`6qlnI&8+MqmGiJQf;7$Th9YP ze3|rP6zKTW?3?s=+y}a9f^2o3+8T4~x#1^LOJd6XmG|U50HJ_b0bmSR0RVMYid~wx zs^c+0+xQQGcnHuT*RG&&QN}VNpx4Tb9)&TWtQbUeF6E~L*OH88Ki@5}}k z0)TwHhb@4TQ?7SViDzv`B4zxZ0&0iR^*{IGV+{6;D-ny9)OCDylq7|EagRjjEWrxC`pb_@@2ll zmmA^)7IcqBkP(_B^+Xvm>ikD?$MUVl6`WW+&ap)3#Hj>AT6<-B=A<}Ewz#R4m1$ZX zjUQ_)2lwN&!sI&XvJKLy*3yo$GSm*Xgeeoz$24gScU-zpX~AD|6pk=o;59R<=?p-Z zom(WmswT;{g?5zu7XeQX0V;hI&+3I00J_9#p6Hi(Rset`w2)f4iaa~1xhgHK3v$z< z9s<;=X!%mo7CTO4WxbP zrypo8erR286fQdFQhfAHXJhBiwf4nN>2MCC!u@iSL}$*LC2k5K8W{jJlwM(0*0bd7 zJqxl`nc-^#1yV0Pi9;LVf%csNjx~~-6BmqI@njd&M}{YJf6WUNUu;IlsBxPZHyD=I3LbugX+fS!~^P+pevS{CDrWE8+mU^1&XPRv#Sfm3 zv)}z?0Bx{Wd;V&|wi1i0Vw(0yULuyBjpgsbkT2upV~pSwhyUckU-1+oWFhu=VX(KX zaNs0_Bvew;fI9FcLSe*N3%d-`G8}s!r<-fUa9Uc>XwlVZ^rffqEpbcy{R59dvA3tA zrmI~Vuc2O_*Usj3yMinBn%*Ws7>uNo(%G{W0kML>=AtARkbW$1MJZW+jPu-*%?yCc z9%+|0P>#+njn@22SOH+=h5t(7RcrJR&Kc=;n$`^nr}5xi>`=}&b1YP9#K1(cSM)$t zvUruN+V>|f57cLQU1eC>0IkTi*%5i<&^i7x1X)X& zeH>gU$H!08PX1(01C}G|Lra>|60WW>X}#l7*4JLr)kh9m*zS$%0>q)5>rn$TP_%gM z(p$;1whAJ~j0<{KvTdQPJiSD17BWv9oSai50Z}*jHZ4z#HReMqvMn3!OSQ6h+EA!m z1?_FG)U>fjlUx7g98lM?{jzsc@K4qSYas4eg>Gh}MiVJ^` z5{)1)E_yOwFZ#su0y1BQz1j2VK9x!p(m+&qo;0;koUa~0Cg-oE>uLRrdRndMqqlt= zMBjXUX}3R=%J;?9XYBN))2EKrH$(CC!A*xoZZlGMb7$UtR-$}1sl<<+r##xcF)fNZxGNI=d1#^28A%E6YlfiyWwena2&Sny*WSQ zd-bJ1!u$X5W4Q50H#Z5^34hh;YKi4CT`o2cCVc7EOzYa7%JWvEQ=1jm{k!!W4C~#$ zmU#Jjneu%%jsAr@%MR2BZTWu$9roA&pvzgW(wPs1WgA529DecX55Qwy{IE@HY%f0V zGJNQbpTy3cy9PP_CVk_bzo|MaaQ=&Sp&48b)c?(@OPd{r%56RDQno|7B|^rJ_-+dD9_OC?HJtemUo;Kf zDjh$tXF2~e?mfT)Zb4X9z_#Adm%UN#)(>{y0APb)nJWj&Ho$i{a9=$C4JYF8pFV7< zc$WpUT{E2eXP?5?&-sp7W;4zDwWRfQ{v-5fPipEwY|_SetE9S+=gCHyQ3x9zwc@A&P1!H=%G!7S6;`S&;zu#x-yg=C%f9t2yh z>C5JK75GP^^4z!oww~$^Org6SBk90`4{?r8P0#JO`JB#P}ua)M^20MeR+SrezhcD|Y^y5woJwW`CQ4bAfRCrYr882i%P4W09Pz!(55 z0INC(*fr34J+D7vPMye?CiJ)bVTOHuI9dN`Di>MzXq| zd&aAzwTk|hD3{6pJhCV?aT&55eg5Jw1^~M$yz-5`mo2wz>PoLj<>(`{kZ+s=CI$~ zGviep^ivpGWWRr_%=(wf#zr~$t>73|(cOy%1?5@#aDMt7U>q>}-wGYO#bFEp3b5!& z{_c0J>*eQx$G-5Pc=&T4ylH1zm;Br1IO&g1$F5y#OLP2MS*_+~+V7uNpXTk>RmK^s z(6vpfz6-<9cFo&w%UCIp^yMpow+d__RyPdB0AP#5WK!X|fAU1!^FeprXjV-4!u!91 zv)+APry&~R__gw@nDtv}d*bu`Tkhc2dJ$X6v-Qg(x#)WUmessf?)}dNyJ@gF1jYbh zi^GfG{50IPu^n*u0iCiP{1T&qlB2|N1Dtf9W;Fa*HhYTSX=ROLPA4 z245;$HvOJ3IUz9(=OM1i#u;i+h*r7xo~+T+TnN2@4}j2OYK3BNy6j_ zpTgWj%Gd);{`$v~k`!TGL` z`ZD$!=|4CCb>x8XBk-z;3IkTzEPuE$?J`Eoiz$7#(-%V`754*q34>4BRL%x@55dad zfh%$9^Uw#D?U%GO6JWdq$0vebA~%dyu(OFLt6nKE?h?2WC>N{Qne#oZ;<|O;Y%3Y} zs?QdVF$mNH-f{0C?Wac#=c=aH97oRmm^}ZLd|uly00 z&N{8}A59(aDLy0zEdqdG8xsx^0Ms%Z-e81_B#Z^sYnfi{D5^o#yED&ka zdPf9_v|;NJ`rcZ;ln1R?SxqeskTk-5=^&S*hSKZW;l+(h!y*G2AX9=_Ue8q@rV8q0 z&)IE zlG#$AF|;voNj^MeMc?6ru|-+|0EqFmSf`RFnn9yuC)?*8YM)jBq`QPH4qNHE%G5Fd z09YqegPpSFNSD?74J>P5L>{P@Q-=~DSHc2V;ROKf@@rU&t1EW-(m*dwj5J=XKK$If z&cm19|26hn-(E}nwUQoxrPH>7$%k1NXX7E2GTerRD*2sMhRUG8w1KtxtSKF=8GMPftxAI$4LprLNI|*6<7B`2L}y0qt!2%%t}oeJ zS;qTz1wgbU`0nOf7>kf+jBRckn{s3Ypq=593UDp6ZEa`G^yw0!YlP=XUb6zgoz!BW zkECpG#ZEIGR#z*@bFDP%X8 zVM-ybjB9P@3?KiKv+=DjeRrU@D`Y7nnHCo@W-O3}fW|fu575B+*U3ViMvIafZmw6q z*B|J#fqoApaT^w3`p)dH6(N++E6&)VS)8GEBg7EF{%Cfe;waMXliuaIx@c+TOWx6o zD!~znVrE=0UsTXJ+@*yYioP_t%^VQTpe2L=Jd$o?yg5Vz5bUQW?ieE&K8$W10LhO9 zM4nWzeOZ^}`b&1^Yj~el0GO=`m)02oBEvYIh>eLDJuvm`u!WD3qC!u#I(k?u;(faU z(0|#4?$0`s2JrozEEuN&fMSb0gahsC{Bs6*@zOxAQ)0tw%H*OV)XX*GJZY_-#U&{% zEb8d3s0@6c%%0##xo`i`O*r{?&&1W=y{>~&MpPLOUfy=106_NjsV?}Oj1o++bZLJ= zKleEEGjyMH=(E-9>G(5x#bH7Q1FcMEO-!>qAUoc-_g;*4I$D~=h15AN<|ot4Ekv>- z^qQZCk^8XH+VJ*j&N-D!xv6|A;bSWkj}d=iwS?d66Cb{Goms_HN9%qiP1?ypFpvME z0*+}(hiJbADMksl`(2G%+14&OKhn>vlRd9*x;oE%naaA7CiB9b)Xz}H*RyO(yVn6g zMZlTu3)?eZZUKN83n(&hya(eJyJ)GrpVhM^uK?(fZ2`!ZBk)WHYbmhNW{=8!$;oy- zt8R^#UfWWLO(5H8X3Pe8ovi z@8vlPqPrAx%@2HLs|3m@H-p43kku>;V%Y7zAe~;;KtaCtYIdqF_+*DqBN-yOO!m?X zv@VfO->3ow8EE#79GFN!1Z_i1kvy;oAt$JKpome2@dWaaPvy8BGdrQrh`z z)3PlMwhygEUa3sOYbg?Kk=8Uw(6zJK@Ag?wDA;t69?sAyi7)7utOB(5&exn~uq7J* zlnKQV6^EB2Asg}gn&?yQR50Ii&F#ygFst(|05A6FsjX$9p`g!PUb)phL_rw74m%hK7hC{cl~^d zkpdOyqo)0xkuv~%hQSS)ls$4(tUoC5Ck&dh-#+WR_{5)m0kgFk;kRW|i^JlzxYOjD z2p628A=ltXJUQi0H_ia2MRJRWUV73lmz5Fq6kfx%H4|V>C%9RfB^Qmh_;oIv7FLJ@ z?7WV2$?=yutC(o@0(blku+2P{EHQm!;1cd!DmnjsXk?wNd>*cI;mS?0HGFI8D z+Zz@Uq^(#UHROIZk<|tcR}R(gwdJ(O%&g|9AkOYIvgPU`@u|J!WSaz1(x%4Yk#@5u zSX@396k3iR#@6G97M~cq@eIHW$*uo! z(>iRv#WuQB!DrnOF*=u)=+(zK$$frOJr~n5z}L0f&}g%q6jaJ+>`6A%w4ZErlv=Wk zR|(tJIh+AlXJdaMPbcJ^Z7DANJoRIFnQ261;CUXlEfDjqn^eHWuI*iW(w?-C$xT>3Ex-`3u&&uaE8u1rPpneXBd zM-yEE$W@6Q9-QVxbazH=0>Rr7NwEyMC5@>u^J}W^=rb2N5G@^u30Ai<$wiY@)o9udmBNiaWG2FEghdE;l zhLzlNhH1Yjt@4C#Yd=D1SD27cULo#fdLNMFhvQK?wrlQV5y|=r;QI_szx#Hk$hoxB*13`R9>i zwrM&gp{{FVOFLY8CC&C(nGJ0l*E|J4a_Jd>z_f}bL~o=iv5pJ?d~;B(JX0n?9le*z z7t)*%s0ZSy$-)E6p{^&r+p1c&FD8{*>!{AL?DLM&3))$w^8if%AP%L_F+&4;Wk!)b zf3B1TfSa!0fe*d#-6OY z_S@$mU4N%tt~(DN6)8hjFb2H8*P+pKaFYF|DCsJQgOcy8ig*MFU8D{lb;>6MxYvfvKg1LBTqHDy5B8t(-(D$@cJcSG#%L{0| zV|bs^O2C?5!&*(2q=H6TGU#g^i85V(@eTOkuYFu8q=WWulOdqWR60bZhL;Y9DI$I0 zmELO>eeU#HCgce(*5%Sz+F^ia9U#vnkZFiKK_;wMDcp)BwIa?bnc+G;2S@|vP=*_? zz*k_11`^;Wz-$gx==Jmh^yUo%&FL)%`tWDY2$d}X(|*K@eD;+0q2x?nizmb=FY`d0 zGy?q01LZpeCOqhHj!sm?7*PBc1?j`G;T)*4^8^m(=%hn{R`J|1MOGA? zOqw(RsOwo4Nl`l!MMB1R=*MJdo!XY@i+tTgP2leuXzFN>;qd&1oa5!aNcYXFfK^|s z`Gd9&J8(?&k*iRse#0wMU)+ki#!2UA{t? zU3-u3e(4H)@^`-w>B$I|Gb%!A(FS3TSXj*D810v#$yu6o%pSfL$N;FPs0)3=p9#>w zrN8RzZ6nS*$dPhk^^vgsGKi21$w7CbFC#vwK}Q0J zLcZnmsBcS$0PXJ{$nW?l!;RTjAKRQtK|q36D*|9xK^K+kh%-nv0SfBpD5;H?H8gY5cTFxxf5M_%|z zT=Tu_=c?Z)n6cWR8`6Fe)}YnNUd~^KRm;Dh{FdkZflePjxKbCoMPlYv%YPmi%2Tg^ zzb74S?S&Umy?HNKpz2(7mX3EdXm=YJ1Ar2AXnje!Rykf)iTjqDZpBGY{}}t2PhVKN z;|JE&`S&@txEY*(C#>4}8x@x2^j9k5WqFzfJ>tB!gXRqm1~zFRue04o8h#Vo`oNL`M@pqEilbwBE z=y1#>=Qmd%5NIxOvw!U7%?o1yuu(8{fGs(UzVSyl;q;fCjT?V(^U`oiD7J8uIeuW{ zoqu@-y*PKvcK&lY{&n;Q>+N_}eNukjV4xHTtXB}QG#I0arNS5h^aME+h8RR%Xn{dB z;MwaETz<~?aMquF5j$_(H9s!~bhd7e_HRb#zsM60ONE|9=5_u{ar`SV+MCf2^yO(O zezj*X&=m;udTPL+u^C_!s==0mF#uRkSmq#_6W7=Odk0 zjq?xX`r=-tdF|zx7MS&~+VO8jXTJ#a-0GhXp+Ka~@-4mG^eX}b6=641o0Y)SImZMm zml~aU!_)I6%A{t_Ir5(6q-Oc|=QS0y)UruuuUE_z#NM^+G|nDE;rKaQ7ih{Dnj#L@ z>|Mi&_l_ag3o2JN@sSeR9`4)cV4 zr%2N4ua`~)%Dm97O9^eYAzkNqj{{PhlmvFKGuqc4&JzGQapki+C(5O9oW1UM4k zE6|d!R<&)1CViRK2dwfEpP{TGjoA;EUIV+3ucfcVZSe~(}+yf8m zF8%PIa1|~N##|4a?C+8($QTv+Lh>tDG5N61E~~!G?t@g9zrMZknU%>;S+;pwGC$SA zw5loq^eaph0k0^7fyk10ltc=%auud-^@|NnTL^f50a_VFrkehA?XUK28O^>k?-rTx#QC;* zLMl((q{wMM&;o&UU%4vtXP#cT5ai?qe3qEPy2f#bvE(szu4;`%VuTSR>`D!hbw~n( zs+wTZBLL`D0=-;RsJ1Psfuf#JP!`4cylhNzhB8xLv!;N; z%2spC+ppPu*l1Z;}WngVs^sMuE8FF8wz zCu#J0%|?9sq3WCrmhB8oy)<~0bTuPQWh!a$gfIq0ZDD22dNyX3%1uCPW=m}|@&;+& z5Jla@P;5r;iM26ZkoHSvxA|3GROKt^ti7rz5Nn9cVAB(Q686KQ)}cpoREE^#Sh=3E zYZg@)yc63ceOZ^^((D4jhGka2auYZa060=1`!qQb0R4tlPLrl!e!&wrHL(1P6k*q<8tyvVt*- zjVe##e9G6zFQ{uTu$hA^i_;sxxGIfzQR2iq?Z~q|N@u1SePljn&9WrGy zSUr1Iuo~94!Smo|&{4o@MpjMP?C>6_oKe25<o*4t^f=(IAw@SCai%Km?!Sz_f}z9p>1D^KlT8nHh0v}B>TWmRm00b$d< zg;%qn9VNJV!vEp0-2!l=%hU3Gs|}LXU`8$971H8op~X`GEON+gaAuHFWa(rPQU~n{z$9~L^wcmr zK`ipZeJE$0c&CRZg04zml4R2eliGH=JV}MD63WUE=B0LVA}w>_)Nf{iHRqgx z$J9-uY3)>K30^?(~BVU zP|PR&(1HaT>oEUB+R}6nRgi+5`jjaEJ0s&okGLf2tR1AD=4YER=)^tO7f1C-J4+yz zMp;);(bB3SsPQ68+60Jv3!J#HVheg-$%K;EEe)qqRG|$?EuG?04sdr(ptE~#%K+f` z(zdRT_ud1p66FX>+F2>9={emVjR_2>2*PBI2H>F)5PfAhWFY?SP2-DhxtYOvmqO8nqg_jgl6sDG^oxw*Tm6y#FPq z;`(cELZuD5t|?K;%1Y;|;>y#g0;U6l&B$}vJ`$gs8Urq0j#}dKZf9zX_ zR?Pwg&+^%$LkcZzd`cS9XYza}6S6W@r4cq+N__NuZj5b1%79e%uRQsyqW4_5Ss5CI zq8q1i&&LjpL1SamWd{)%mrEP2Jo$rwo+C9xUA1zIie014PzjZFv;PN=h|7F=7t z^)1vzCVGnENgmlf@2@1AegOc9u$J@`Kp84GY5bY!VClbjX8SAqRj3$W0id(yj=cjo za%R&JWpQF*m{&qoO-R&~HyOw+BXFu6y+lxGi5F8XlgWw zL`h3k41?KDKgl;yD(VYbl!y#56%5BF}>f z4K(p}Z9SCgt_l`?PmWq&*b=E+>}e%gjm!jt&y~(yBdY0mCdOdWIvO3iIZTqGo{ITQ zla}<V2 zEhu(2CIixNYSS7)bR@D&)os`sM6xgW!WH=VUw$sST+OZNftiJ|tB{BFNJO`>4f2-D zU;>8_M+_{q!K%^C>XYR~XVj5x5x>DUbv02pn2yVzh*{e`a>xx_(;V{h8<%7!ZB)D^ z_mhdk0Y7m7=Tiyz4OHfmzD_TVT*vNRUfAfnp?+IqPdYovg*3j>sF!R`q+6f~3=ayT zpOge5vvOh+j6G=y*=FoRU)s8^I3$)^^SJTqn-p8ASaVguL}xomNc0Y|on87^(qFzH zmk&PGR+37k6@Zdc2MjSNbtd6G0J3k|LJp1pVqy%cp>#THPShcfX|r6HtfFKzjcF(D zDRz?QL}Q(Ut0tIMWD7u(kjAly5>2VLIGq*%fR|x5$k-+Tf}lwxmF-hC9>Lc&sQjAr zEY61aO%DkvW)1c9WjUE9av?Z4oblGr$0b+gRUU$xW&$DVXk~@aGnpA>8G4WAg&H2z zb*Wv@mPv2LlDvVWD-gP>t zM~f`vSRku{$?LlukA*Yif#B@oO}!U=5|U&(;pyh# zOw%zc6Jdi%x~GGbtQ3TNexK)go|KE4(41CNU2c+ws(;2fkkzXRs;X)xFEF|(_$R_| z^Gp1e(&Xsd958i`oB=?7aE#8+EF)$|R}DIwktB+r!9gT1LvTZ^WO6qd9rQa=KHep5bwZ(CmLU<%_gvt;Vocv45B)nyIkJ#B*( zi4j~G+JK|IBUROzn^@}4TGio;WPN6r1fE4)LLrNwM_3jJ5*j&RDIvm?zy02uUo#+FB`R~`Z0peB?d67Se z>w328K+R4~j)Qm{$dbkM8lZL}ytx*>PV}n8x>bRWCNDn(82D0g2#{x`008NENy!#L zeeSWm5Nf}(%=0OpFCKXM;GvxWL?{i$1lWwD5)!xLI(X~4IIFDf`pJluL!T{RiIVOU zn_#tV-H!BQAp!{-vPlLCy69fl6X;S-n^^rgwDl4)Pq+HhqD%_X zXFEtbt4tMZ{c*TjCYgv{f0I0juzihvjkC6r&c10 zG7ZW(#D9XG2VdKb`CKXiDQ4pNK0D9lwVhYqN6qx_$)H*oiTQ^Bd{J|_h7>q+j>LC* z0RY%`yoqI#Ivg3B;}GD+f;EpqNwhNOb6`KH6CJzKJau5pnG*kii2oX3)C-$>${+U0 zmtNXb+x5Pnb~!k!_j;*6U=kT!3kL@9M(VgM9*;pR_Iv-U_fMHA=e;LGRihrv(l@7etIBgbf` ztwllpZQ=CVjLtWwPCwrhC^p7jq1Qf*KsFA|7#7e|_v`0?C*aJm_a?;Dgn9Is@l`Y~ zV%0im3E5T*bBclDpivJa=97zJitB6m8 zm5eO-NkGI?J8}zt237)a66{x)E(%H)O&)WQk)P)Z%AW;S1^y9Q5_g>Lqp)@Y7A!d6 z)k#2))8mf~K6hfT1mFr7c;&EH{z$Z%<@M~jIXd}&>x%!!;e#F0f(0JDV)yJX!b$*M z2v-FEcMNc|+5RW2_@4#K(JlA{D6f-$!le9QSP1}t*h7j8cE&BcA0d1o_`lN}dSpUB zBk;eIZWb(9u;4erN&p&gRcv|e;M_$*GqC5{i_4Mrnds^f&~jc2vP#T_dE&g&)p*U`=V6;ln+0^@!P}5 z%Lxc})=tu|lrt{p!e#P2d~Ks%=&zBFBtT8Y?lt=iY9-yr!PbWRuMs=-u zWYgvMc`N~}4Bp&u=n|iU$M2D&i(BQL(VX=W(VVs8-v-b3#C_KNI_^DN_S%ogAGP&p z`+tus*%v8i)W5h~`_M7DMj_BO?M&YqFJHIx#LGN6IWKA~WTH6%sx9UK1yUEl$`!q` zimIf^?N{Hfq8Tj5pT(CfALaHv->bo!dy@Wb-|uXRh(%GAB?2VJAr2?;OGLp76`%Wl zhi|$M2>clAdvb7DIVvBh*ZjuA*&z?gF{O_C1E)GsAeq!q2|~O4_I@5KN=tVEDt?(eo=%SJv0q_n02>1K`k~ugIz4T(i z82p?b@B1BSC#Xv{<{N?7A_hdcyytB)>~x3w zes3pxWe`|}D8nFetx;g#_oE4sA)oqt+(!w3&bW9+nDih*01MKG!>(LwG5|oZ7yg_E z#}Pde*4oG$F=vClfNVIp^rG_1&mRzo{UDdRQ|Q`!=bo1hzoHq@3GP*D6h4=)D|=aH zc}YW;^yo0mz!^$liR*rcJKc5WqUIjsp^|z>tUQ?{E}w8>mB4s-qC=;wc;|e{gb!)t z`OIYXWNPvD7r(4~ibvQ-Eelw^d&3wnDD70$)7O)OoQj+oM`P~M27rH}Z=hmRHoF$P zm^uUJu_fCwUu|caTpXs58RP{wmDEE-=IgvJcWvyHrw!Gc>2mnMi z0njllA%Fp{CfbjF@g0w(AKL3eUzyd#SuMCEQPQ_d673y4SL^0hQ zWx-2-vFi#}uM_u);3ZfM9M3UlgU`VotL>Rr2vgmCzr%h1mPu5e-=xTMoQhiT&HN;d zC~0w?B@RpRWHV=+IUP5)sxo{2hSg;Po~*h|`y~qcq~#8-g}!yXBinVOAMTT!e)F;9 z{n6K&rWu!9)flVq{hRH&O1WwG0u;Avw#qL9!Xj_MsS@dY0Qjx8Y2LTiAt+X#rxf2r zJIdr9<@c_300!(R!UbS@Wp(#`FM(Q2Gd5^u{aEObq{nqaEWS|Q0T8pFDZ@w_WY1~` zK)2oZJKW8-iHGTxjl)jr5kLkrDQf5ygRR=RVK`V~5}Q`~nYR7u;3|{pvCe`sDAn`% z70e64zqeTMRPW-n7%3W;#_M+v{=sAf0GZh%I%8gO2&BV0oI1%x%z;#>=mZrVIrjVg zC0mz$n3>~``Gc_iDU#8${iF=TcxQF+i0(Y+V`+Ww|HM|45`@ny&)U>(GT#A+BBsdp z{6OCAC2L10le(ilPfWnhpAE$vwXrN@%!P*$oo3kgdyQvY7GR=~${2M55YXmhbEAD1 zdmp5lNs-mwNG|6J24@F=?DNOkeLbm+r*rR}U6aEY9YZoZ0DOl))cGoN19Ym$hc}32 zv?km(WYRShR7A1GyBBm?I6Z_x99}QZ(gd_TSL%(YNm`Uo;alU;w!2r?yYJD6(^Oim+&#TfaNG5gCjXoL3<(_8F(pS- z&iS`oG3Q}rwmv6=^03#`q4NDWevhdJ5JajA_Zp+^q_@BacIbUxQda zfBIKm8p&=~qlp{2sGwqXYI_OvDTomiXLTg_2>1KFKD%77-~#xjyAz~ZDdAkXsc&TI z+<$mj`Z>O+Qv#s3g;pNJ;Y)VXcCv>6YupM_i5v$8cK`?gZnP7CINdC_JNQZl%d>3= zb^y`=D7BMtPmcgv8MwD#^7H7L--5!chX9K-4i~b4o<$w;T!q*lRLCOmNNJAjY&Uc& zzAY1}E)!RXlWnmT^!Q;L@2>~$b{&ap$^z9!5O&bT(<8|{5!HM2Gj3$w-U>JW^-mYu zRK&AJPCMeq@Cys6b8*_gOjz0c*rv2&B{?III(024j&zCpemnvQq;<>nwRNs`$I#17 zU5BjhTb2~%ysZ^g)V~&P#_#n}%fQ=u{39Gs&RP0idF?ZQ-P7;CH^vctjr+a-Qw>te zNk!xC!^nujvCvdPiWZ54PSgR8`K04ksVikpMqWg#dn%)`ESgVTTn`ZP8y5KtfbajJ zb1qabYLzg8>UeIuIs;I40K8xWSRdCg<%^>MXgfw?`%y_II>zfpRab|g90KGDKslb? zL6=%y+nLEmI?#i_Wm43}1TwHIKV5m-0po|fgK-w^#dc>7*oiKd)pCAe<`Bl6prS1@ z1%Oqa-tQ+?ZVI6)vi$KTeRSO_^XhwlJz9}GUec2OmXli~n&t_2j71$E@#ulG=F^bC zY)gvI0F>)$Sj1GkCwt(|YrpSl7cO%70N`7M(t+rFaLw;k0#pK0l-zMlUJ`}Gn2voI z*Gfq^O-;jlPrH{4dLcCmvz`umWk ztdNl%)Ib86ofdqDapX%y8>V+(N+Ulh<804IQhz9k!)6c#2$_Z79A~b`Z5JpQ_5TH%J}@ETZ!%M%*0Ow<`Ehm5jBL+v)fgM=yl&AkqqB8ltcj zg|S{3jPQL~e2T3Q-Rg@Em4`kjFv@3ypH5LCKgjEJX_YSyKYq{Zo#f%4=g4mX$hIBO zgK5RIxB}$ky2y64-s)?K>2G;m5Uq|~mr)CKEc5KVHTJU1b`ld0`v^e#7^Cwv`Q69V zpvU<56Yl^pVI%`y!7|W9-SfBg021rOpx>XvO?~m6xw|0W&lhddUy%&9GK8#C88gjQ z89)&@0NA`98TSm{A;63q`hVUhRm&5Q?hb%J=0t*hX-W|b!Ewx(Rv+cvNtQ)(Z<*+8 zWt1Is;y8ZS#38^S-KI>`fnbN<-U+$cXMg$gkzDVLksFW67TLSq?UM)O(0w`lB=2X! zjI-1_NRis8rp`_fj)~RV#gIhMyLZUG5AaX__>b`K|L_06DhK6f=wfY&P+zCQ1A$Mw z>wYtaByL%7?@}k_HNb{R*AL0@ zw)<2ZD?0$lI1oVD(iYjfGge1=-8Im`8!#UNtj{x!&*CDxSF2*BH~xVP{b3FvMmhsv zSJ+r3KpwO6DM-p=SwuvHyt4uYuq!lR zxMDR5iXKQEpt%UZ3lyvjRT1x2M8?C>^`2PdAfXw*Uxa7zeQzadd7AYf|CN~Nn68!a<0{MOYGamU-fxrX;p3d=-p&ZQ6 z^Q>QAbEZz%3+Jm$q$x%HI>%ZR__2oFr%k&A*23~DF{e55WK8Xl8r5Y_c@ zOli%7V5(gIHT=Sg3VK1+*s)f5Jrt+*mOQ5kUs*^!NRi#4u2Bdm4lO1h-z~Erdz2==_JJF8!h4$ z1)z)OHwqehW_{^MzHr`5u{v=+W~#}+f+aMi2{xypVQ)R#T`&eK0XPF^4z4}hI{%RM zw^sVz{etswCJC58JKgZ2E>xa=m90Du#Tz~FYUY1XNKhP7Na^&SkG!_6JU(PV1OHvgbA`o*vkfFFX(xBveD zJi5~Vk)$CA)}0v6@EQk*PRsPVBp{;#oZJ!6L^7QDe#8UpFNcc)<)f?qw-5fOw~`i& z!1mJuEQsN)9M%uRRonW1_&pmGgpx>41T9rJrMlQ(0&y>VG8^? zSP8%@;8}BI1^?dx4?YH%rCX|daoIt5MH0Z90K902_sv$Qv+&Ho4{+kZ-z)XG9s@iL zRs!&*@VnjB`@(NMIQW#a003?jekci0v}Qyo{C?*UT@DY$*b7$uF8g1eNG*`C5`YDN z27XKMzw({tvx_G$3CQIUj$jIKI+Fjzgy6Ec8W38+e}M-g0Vpesh6nPi8XHJy_VS<9 z`--r5bZLVwY=$fy; z_YMA8=GNGswTq*jOac-u{XJO+$_y*EZ-4l-%*v?@VGg*MM_)V}c<2>_2is3_bNq<+ zNnia5Wl@)D3Bs%yM2%G|Le(R{*Y*Wp_!VJX2HTci zYVhI$Fw@!TB`&w6tp6HjP%n!$H5WR7^Cajt;+H}rpHV+s|W zZkwu1L5&eK4AMo_X*+S)aD&@cHyf(6mVZl~U?c}ov;nE|4L3JkGJ%~N7SvyD;zr{2 zzy9!rOrgy$Zh>E)x$|ozXvaJ>(XpBZL1tA<-#Le9?h+N(ot$P8r=%RxwxvKfkYP}GpX^M1A1sILP zaW%dUD$#xE3x#VJr&mV-Zl=gWvbktX>W&18KS#SQcGO&(h)!ylHKe8U#>q9hc%TYO zY>Rxng&hgkiiUgWGLjCyu*NcP3Y*7nHQt)sC4ZYl$F*(yO7TpJz+)L9$?D7p%WdVw z^jLm=o(OJ*iRy)`b5z$!==>w0ku%!1uc9Kf%c1E+W)jsf{5suhgXMX|JRrnM2_)EO4BE8@tZ;jCPr4 zZ0?xABS{>;A}Ff`$%4ml7>oJ?*S?*Y0tB|04N_2)y)*+a1z?q-*~Io+gBt>S1i)LTBvix; zp+ptn4F_g-d=?5LlrbGOg67XhiP2zm!cR zi9;415ENZZPJ{;cX+=Ouym2y@Z0uM%=0n}22xq$6eH z+jH2l5y!xh?QCdWNQtoM_^7CQHHiZc4w@kxj{vOoc(T_;7+(_j9TV0GU&tN-uxkFZ z#`a9q(c0Ys;27cz0HXD}UbYEI*(y`XO}vg|B467kwoL?0@Qqjp=;mZg^|);npOVUX zU`gJV9|8oZzq>AfKGrfsWP`|`@e@?%QI^qU+cT2L_xsSnSKysC=3WJAQOkBzu$I-% z*hE*$CVb9@%(Zf#4B@muUEeYJeD26iB1KZb`cby1J%d!THvP*0V4f>S8aov z@X`)Cq-h<#tXA{RapL9xDHp@prdO`J6q@-Xc1CKzLSfe^f`aJ+sz9O;f^@>t2-=4Y zqyVA^8pEoTz+=>M$ZdMOhK;8xB>OagHUnSV z7i?c&*>Fma#7+|5kq16>Bx1PkLVYAmaKn6X4w7*+>`@+CtAw=?Yn$G1V<#uIi}I$I zhMvJCKHHadT$wWQYrZmL<=$yMhEvW8FoMT(=A*O@6Bd!P0gK%l1S8);OP93!teuwD zq?l@KUTdC#%7jc&yXac?#T@ih{Jgp#4w-hIY>~_}{7oIF1+pv(AjQf%^FJrvA%kWc z?i8e%G2}!~WT8whb*ybW4t3=@QO=U+xvuGZb*d}b{JorK&P}%Y=`swlay_a!B|k4g3jzoVlPvfE0GnCW#IlzPF+UE$u^6B1Oq7!}!P_ZNz!RcT`i~?AXW=Pd zUUa}6!{9#u?fr_IclcH6Iyt_r9#A?KF2|whYLl&WgS7(!q7-J!PAjCc#Iu}QZ_R|G zcQvFIHVxvXC z4w)5lB<}61S=DQyym{#&JNKmz3qlz2|61Qca?%*b%jc$Yd0mb8sX)F$J#lng$;DCP+`yAD%t-)H7f5(^ zECWb80695hA_(^&&KN;eptrlsZ}=I2ZIeC5#I&p~ONH8gQAqd2YqDY$G07K z;(1-w4X06@I4Lu%jdJM6?CVhD>1+OqAm44WgQi2YH5;pq=sN(d1fUh*H5xg#D|Z00 zZSm+>TB~bKJQtB{k9h~c&Mk3voXAYagF;Hrm}fd(SN3gHqn4!^p5X2>=&WK0kqC%skN%0T;y|A>zT%lcFcPTwxtV zYX4Cvm%l^r)3yGiX6Vt=x4vxkS}!p3d500#B>XAbwun@nj*`J|+vhWa&-q9~I)?Do zPOH6h;AblMxAfW8wX~OtA5S4Rn2_7%KyRosKIuV*M>j8<8hvgj0aEK)BfkE%bIN6o z)0OY%N|`lvWCzx~`9I>D3{K)R@T`i5T0g6ikmpqPwIT3#{n@2G>*DjJ`T>^mH{4|~ zz>)#|%q-}iG3&s-FtX(q9tP!LRp{C6*QUP&$O8zsK~EB1#cWl*fg^SRI42dW+}ISw zurdr=!MkmnlK?PUe1jX!{ogD+0_)8Q^_;Wb6#A}!58-;M`!mO1wMJ- zkv9F-<(anMj!c5kYr|!212xAr^Ewj0ZPWd(^*-H^fWybdJAL8d^CZ`f*HJghUnb0& zPrdd6mF6vNl>4UA!pK#e-|?6GY$InhuQ=cQVXR2bHt;0A%FB5GM6U~1o{9*^Vu@VU zs7~8ajxC$tx?4JaQD)0T;NJl-UWE~8$F~~Oyb<`~Ujk(3Ao!|Y#4sQL%43z|mv3kM zi?+8qVVD*SsCp3)^7HOs)qw~A8*JkJW0z`&tDP#A6$%7YOF=}YY`&^y6_;|l@yJME?2g#PM zX7M#%j1wGb$(A?OrdKCv$MkcZ-L+|tPfO;uBm+STbiZWVnx~BMAKSp3n^)#@y-iwv z0wL-3u`H?w8klO=TA9homrUVaj0eEk{xC&28Js~`P^ z!bUXjB>?~feH}*3=+W-T^WhClr@+W!pwakBv|r^*9u?IK{#~3m2c9fM@KFiC%i%=C zeKbh_sU+YRz*(p87C%qiNdf>~p9sjN`ti}{!9xN6An**-AN3*ePV!*;As(M;PXJ?! z+YG(eNgtKuspQYd5Q-#riJUF73uW+8^p@W^?g@4aE`VPh{4;bMMbD262MVHxq6!f` z9xUGo9`4VCK4(?`cESH4dfc&JOZz48WMA=dI{?pm3^2>ECC3%3^pTx_3?Jk-e;gj2 zk2AslUB<2V?0@8JfI!ah;I2RfKb>GbEm1i^cecs9*jx`@J;v{pvtJ1xmjJlXh`2M` zCA~Jy!0sJLB#kn57N94`lw1p3c*cbPjln;|rAYv9l;J{!f6`9DW4k6VWA!$0#)?Ls z|9>j{jRfEXoJkBU4K=9-l7M+0<4J%ApD^iX;g$3Ir&psxa4LHHWHP)m8lLHN-YIsR4gNpklrKsG zE+OYB;GG8c8F0a%e`N30B9!s}5u8#taCaIymVzn_91kmX~8 zzl*2dmg02{yr}$2-~1clBOd{T@I$)*BM2J5x03Je2-w#O-*DFdLbx*Uo*9xE{?Bq= zXSeqs_$0u2W*-V~nTT~D_En?pKRg-_!j)m{qZ5GBuLL@00eI2KSpa?O%JN_m05JDx zAg1xz&TkE(c4gm&PN{&aC!@_hpUsVN9NRT9pjgt z4fsXy+Y|ZIu9^~Ioj_$kd z2X$Bjd6u8Il{z8S3nefBYtu~vF#XqjMX>U(iNFqWoB+HrvhpAIHsG8XYth!{KS!^H zYy05y^zg>})3z0lmM2GqC+Afi1M0}BdDMH~X$|NABRNMPI)i-%MrDZbdVSS;hYtQD z^jkO{UtV^0EHvL)nltmhKj->qlC)gu+HELhBF!t3G1x`0E|22|{dcm|9Dhb)5y#2b z?RHLiiK(94y6u=9-FDgmhzFIUVOBElZmCa&{`NT&DhayN9qx2@LS|J+zUSAxPS@)) z0)l@4&_t=+BWK5GIrFD_hGy&ra7Nvk4{`)E*(zBWhZ6VJcs}QNuBCBK&r2Y6bG+k@s`>vTG^&5y&TJAtm3%3Z`rkf z(|3wHO8z2M9H$~&9s72=i+FZa)cIQc05LmZG2*D-nUpM!vAA@jeP=zc+9st51Q83< z->oQuu$n}15DE3Z@9<6EAPNhUbfE{rOUSg{Df{2|UFb>!KjbfwQs`y%B(1Lgp+jGm zJVDOLh^XKdt6`kE6Au%Mz@Lr=snLUrJ+x=+JpBaE9z2t$`wWvYjCkwv*~dt}FaTfz zKz5W-Q04(om$iZv2M>Q|^|?;d(?M33={Bw4>IH2rpT3Xqcc_r?j3zwF>>p5Gfy1`+D&L)oDe z%B!p8d5#lF+`3;Fhu!0z(JJ+FE7afpX~{c!FZ<#{-1j!Vo{+P0D5u8Ic=)ZmqVitz zK&b8N7|1cQThD zT;WdN!LX{tCK_g{;Ace)R)6EbfvS>U&BPOcROaS~97XshD7%-NxqK_?AbW-Yon521MIt0)O* z1#qhEtXhN z2ckWE%%*onRCV!9p~_SJ?bv<>07A1f$UBFmGzDq}#M`oDf*_v(_*NoB`y&9JLPp?t zW@2ZUj`6Yrgf^+A#L_2UHn%h}*Si&x2ihhst-elnXVMHikRIZY=NQCoj>nh`hibhv z>V(5PS=Yl4Cm_V}JS(K?5?8uoEGG_PFE z0j-1{c=KK7XtOZe?hHPtHkw9{W^3?TZ3ghYG`FyHlC@E>s}l`qsKlrzYH1tU;}f7B zks*@}J;I(pi>AcLP1;9ojjsT_^BhA$9lWX!Pzx^R55lCe7){eEW+m$Y1w3Opvio=9 zQbItW-JbuzAnNwq7)Ij@)#u99za**;1|qOs17LHFj)>&NvNO;+=uUJ`kF*^p0a{J+ z{Mu39p8s+OpbQiWY;JEzX-kP^O8U7pi~EHh;+`G>d|zUYEyx)Ys_0mf7(x&Sj|!SJ zyo#UcN=q*FPLH^+5Z<12HkbZu3@U(k*pTy)?FIi(FjY*-I6QmHIEvly%7+2iEY$^3y4Z$rEHRik7A4nTg-X?hXTBz?cxQG1T5Eo|p-aUIlY4f*zvdUrDPo*H=Nz`IdsxS{UfQwfJ%Ioi-uxe(-y; z@|p4TXt#DwJ?9i-4ilqhWJ;5fODWLo|IoF@$L|pU8Lf&7w%_TUFPX zW7`=yx$jO^rw+ImdGxdV(vCS4?jMSHCc0J$a^Jq`o5i8LQ!P7LfyZMRTo)xIAK zXW8fazZ;)|*yNd#Jp%v$`u$KLXnr=slqu{M1#&?;&RXp79d4WSX3IEGIRsdh?cyor z1<_q7Kh70M4U)x`6Uy;ayHms`btcLK8>4MRg1n+~WFe+;CO21sph*>1^W`?+IR{=5 z`d`O)3p}r0-HQZ`3!~&S{+U$YmHh6+N&lfL^!lY6=ErCuuR^CbZaHXbS5WPT zNbpQYYdf8^IaVy2I{i0vBYsW76Kz`fqjI#`oS{EMx2xoSnP8(0T9134E6UFhH>A{t z+Zpxx?JOR01wTjO*)}ID?3sUyg7v`!LSeg!0uTDye>p+p2=8@eF!l&wB(B9cdwv9< zods{oF7=%A9#P92?D$`N2f$N)P0*|-JuW?sQAxvyj>CC(wgccnELk-E$0s63J+? z_573mCKD4;@Dp^L1jx`L!r zHXNY>XDf6?4e#ub$jV(D_sGn+@xs@TDrZ4mKX74iew#;N%vjT zjC7-A;WVRr-Jg-Zq|xHr>=~c!kJmWEMm0bFO|~MF@>c)b;Pt>+3mK5}M6*MS%(HU# zT6yks#NoISsSW^uIM5!Av}bwVs7F@0?|0ZKaW`XD5&gJS9kK5#t8-0f0MauN?+_r@ zRleXnbMnxz*F8M~7>CwGkHMUpJS4PAc1V*PW7fLSFbFid%$=%ifVkGpR#7nUhF4*h zSDDIaxJo@oU&>kJ%}yZ~rNC0?^PrK9RMYk>T)lEyrdg&Zl1)aRXBehGx!zL>CDn^qf&hq4G)w>@E_D0_w=TYR?3yLINm3v&}dug*7 zLvDd`=czd&P;&8T+Ge_ApZJcx80vkYO@Bh1m-9Utf*s`HW6vp2X(!qqlfG030`f64!&4??exQjvGQP zwZi2-Tf070R%d{OBbG(UTLd39J+>Sl|(8lBY|rd7T5HhJY@|&+WzYASa(EZ^8yT zHZnS6Nyi~sJN~>+P~^8^#)D|KoPqpGmi_{uwQcDveSX73IRM&~a>q{&My;cv`_bZMap&2KzW2<)B{|%mzB`>eyxc=R z6Hu({c%0@)`&ri+{f%g)(AS>ZVcYh&oY7S)3z>ykT91yQg5eMC1Wxd+V8D*b+X`3n z8!11DXNJfh3qPHR6D^ZU>i70FzKBKSR7Q0DCUGJAu{h`_itT9N;}Q@MrGElpA|9zn z0PcPkk^D8levY!B3+f1}mqU7bc5}@OKaDo~(Xs^#PQx;`b8wa3F7g>JOv>28j-)hg z9?{Du+2RvEmD%_?;NJ+7&t(+4n{_%0?|x*>NdmM~r0OEPmwl3L!Ga!qk~95ec!P18 z4g4W~r!UQFRcRB8Ch13ze+_(C0`LSln{_!^!b7_OnrT zd>Oe z2^g%dNEtdi0^YsGkM0*N_!RiW^jr5tsQ1?01KWoz%M_+#}I;tPS-aWsK&R&bo8v_9u+Mr|Ss@M4twt%)oNxwuAYW{l+=uBAt(q+_r6#L=gaB z6XNAMHycZ%Ck9PjZn(h>pTF6#;RdkrKsx$GZw}6HXe+&&ctKV-7AFl-Rx{R0(UbsS z%jlWP#wrm&nU5Sh2S$z79p4!`Jtvf|qqN>A0;__%3Ct#onth>k&75CXo(2rbI7pkz z2wQ-ZP^ZRb1XqpUXuo=P<0X3@{T3Zp1drYz4GfZ_7B4TM>G2lh*hvJ2=mmIZY%uH- zvx647j=oUM$tJ1d7um0}y4(6mpV80-bE1ZNPfLCZU=ooe*Q;XLhMW6y&FZrJ^t-OK zZY^nmC3UwlNI6qeKknlWno#UvB;i&K0&LqCeBrHTW8R8uFjDi?Gfz$t0dV_b#IS3> z2d2kZ{Rk^%L3yT?1&L*M`^mWSre^*+$wtT|Qa(}nwZ^By**8R@cH{)~M|sW4FpI0} z&dB*--<~?sBeGpFHnZaaaIHPO6O8KOjo#4G?ob3=Y}7I96**lisSEt84BUC;%Uo*- z50g4e=(p`i0Q82H1i5hLJHH%X>;`9=NU&{RfZG?_Wg*}(q5k$2nP223hNnbNzvv3Z z$I2Z5tf+2M>SVp;m;6vwBoPqtNC37kzJPUzJ7p0B*>~-W58gKY(Pgq34-p#_FKAnQ2$Di4qagVZFc~GyaP~` zZ=DNR2Ymq#O_O99NC4MwEjybr;?3i zHQfHZu-p1M#?rK76XFnzHYWE$Q0uuO$t|Zdzz0bW*hrfh9<%LwG+~h5nSNa<>lN~} z(0JmhOvGF9%s$2F(SGEq$Se&{7Vq$FL|?B4Ij!grFURlkiTXFHhqLW_ZEBhIA#s4p zb-`pag5~Io&U5t!n+8o!WVZ*-)`V%Rt|Lw4UVh;hXz*eeC+|(y+Q!yz_$AK(uoWai zZ6NCN;@x?zyxe;`0Ea?yz{b*PLj?JNqZwy;0HY=nU)y$^0eCXt_T_AQK#}86d9LCq z20tF+K`j@%^eiZZ{y2!hW~0EFn6)mOiI$0{PByP0-mf!3E1D#uZD#Oi+g&Bc8N91y zjrg3!L+`MYyhCO;wzj6@b>>({C^v5;*jL?t8L|p zZLe=A=Ac~4RDU7oDd*35X-ReebE)oc#qt*fvJDh$&x|UjKCSNI>T+unHc?^Y+1#{s zqA{bOZ+Kb!-jkB86vdf{wvAUD0{q&xvY-V35fJ3z{&d6h9I6&q$_jce%?ZF(4*`lq zfNFLjja?Rs>=D(o+9cbCUny(y4cQt{bwB#P;@gQa@(4h13W8$qV4zOQc$sSARuGVU z&w^yFS3VLKcxGtYJTqu5crQrPVrIyP?Q0NsmfthXvq!U;LtVf#(w9v-9*1Y-(WovW z+U;D_rlPXmZ&zCQ`JUvh%A?@#m7X~}`Gq$Td1~S%Ig!GUf5Ew~xEp@SM*vLD92bb4 zQ{$^reefH3Lvh*=^jiS_VJl(ODC^}tGeedjlrsQN2K)YKmMPePN!qoK?Rl=OS2k={ zf$P#?L)J>trQG(BgIN0@wh}Xm-k$yn^a}u%9V~b~Aor7^!o73|xXFeWHhf+s+J z1$+#bU6_S&OeCsu&qX+Ed^aT-7u$^&Be5)6c8;_`NZ$b{ZvjAc{A_3b5HN2CFghgn z9)!yIP61GU4X|zvU`Yb>rUuk{R=`)?-WdSEBb({(0O&1}Xxk`y5(R+#5kRmN9_Dy2(y^PKY`0Se<@}3#F?Y#^mYT`~>_4g`186tk8v|6(0b|TB3 zpsU-RwChbevl@IHD78;n4CGv$pTi3|IILTXfeo zwV=26?o=Zy*WK`gKMGvleiS_Pn|Pev`paRYu0q}csJp`n2SGgoKqlt+000?INkl@Xjl&Le5>pB#qe|m22Fs?|r!*-nRQXQgu)1Rj9WAy!PI>LLfPZvmrcKS z0qiv^miG)tG_YUt%j2KQ)BkSc==ZFCg^I=UyK@#NhVh={2c)&Lgzhf$=hoWfKlNC} zod+aMpD_YKndDfLa^W6T5rAS7d(yNoqcZyZ zS&XI1igrjihLAtZ$-adD9l>O#S+HAh@m&3UsRi3wlqxu1M7R>Vn%YpLd`vwKh-OCXTxGMM2yVJbdWAX4erO$HMPRgo z2T2os+K*Zh0SU1Y!ox=U4l}&k3=$gJ0F?k4E1S#SRD10YPr*`77uiUrzUzv-f@fVH z!C_=v3(JL5nkM%d;S#&~y z$M9w{isp>HnJI_6@OS4*$+@6A_UP&PY5McDDCa;+h zXU1K3naVtqK|6iclugD*e(Y8UTp@DCJ0iqTnJZ?$0Dx0LfR#AwZO^hN8}5teGh_1I zv&g;yZcz5K!UxMWOqn_CJOZdoBui7I%(Mo>$0*3LE4V~cndZZb) zs;yoq-Vt0o?C@7L&nD(;d>wqcorv#WwfCJAiW!Bk{B1oK%&+ATU`={}3v>6x+QJxZ zZ&LhgwrXA)P&h>e3pYD#4o=JCX=a!2k^jBOWJf56JsA~vmOQkjO!*lp{-wvF%`x2U z-vV7clRx-09694%`$m<~&nd=*+JaJ){ola;O7{(;UOl$MsH@;W+uOah zvzcpNM@o7kE<>F-uhjQ*aCF{S%hDUi8iK2UvV~o2kY0y@W!7u{>$wxZc;gh}AxMIP zgmM~GFN>8&Qo;@hUy>UtWBY@7f$ZuJ0T5k1-0A7=`^g2r}_ zC0K`#rpj?A_Vsv=76t@+@cMgr*lcA-UMy+MNQ<(ADA5|AkUNK#4vaE+O23b@!Gwgc z!_r3D&xr}$l3uJQF|aslE>EBO*37L(QrN3zuJd+hq!cPS+j{QrmtSi%Kohl`JLO;a z?jmwrbLO?X#qPZD8u67X9eaw^x8)Sq!|^71XQT-sJ7`pew%*IIE%%766rYa0Y{4(h zOd$+AED8b~95hMIiQVfh>w;TRg<rm2#l+bGkuYH^kkDoyvTGUIv}fzHD#$DH4)el7I$>y9!_Xo`nDl8 z!=tfBPu-bXka!y=!ynbr=V>=4B2W$Ks2iK*G=DQ^ZhW}< zs8`yYI6EzSQR&wa|gTTSs{`+cFpf1zxfA}56VZK%4HaI zu%wSGE^*u+dWor7lbFUbp9Iyau@>6Bbo*&vhOv)=SJ$t}wa36f?`$u9rti!b#7_YV zhHiR%{yjrDXDxRkYHUB1TAsoZ$91enQ^NrP1C|7{K2-gL}NRY1}}t z&Sb?p^vy^v4J<0~mqB_HYQKgRxd_~t3^RpJ4TX)Bj-cX#G|s*m&i;z+aI|SWu-QMt zop2w%Nq)R<>&o}JjV5s;KIcfFd;g+D>%>bYkd7YA&6IdVD&(% zbSo;q3HSpuQ9C~7GMJ`sul{R z%+5;MEsE^a9gLIMk>l#ibdwRm!pwJfJj>4aq@(dZG+InhK)^(?nUn#2i806 z+zzi?4bUvFkaF{y`HIT17Xm5<40|e?-rq*A+;f>S3(}~pPI^8ofl3$&i{J@Yawm;S zJe%So$lU>7zGJxmcv}nglZ|TM%=LaJ^BI}LhrWHe zP|ZRezlm#{TWFjMT?5$`Yoh|c;}-(r`@6d;@p_xADzoc3(~=^S@sW=V&F<)>-)rmW zoq{^be<%5bsuk^*Rj%GG<}c`gSj*yPeUj@qu-^E)x1U1E4E8}#YQ=?9xz#bZv6r8t%W!h!9q zwl|UOXHTFt@TMXUQ+&0m_|t%bLWO1ux`Tr0_1F!OK0gi z(fG@vPdTV+w!L&e5paEE(c{aU6LvD4vpu=;?7R-crVrwkJuO~+FO-b8Q8?DXD*!qN zZ-0xGZ1HTLqkO;&z1UjFSvkgVI1~%0Yk_RhV!{&)nM<>?vS=22xLhRP>Kzx1tuk=g zb79)*q__(8MDr9xx5eg6F%zih2A-{`lOgWH(T0YeTLPrwRg9R+8N0khb%$#;2ngB_ z^di@Y8D!dD0gS~=Jvw0}^GZ4HWhPQw*o{pQM&Kg?Hk!c^WiMzb%GE=} ztgf^wf4ri7BcT6D@zqH&4=CYu_7NZtn~w*ZfpuK2D*DG+C; z0#i=u21?P6$;C<^aNz2LQhq@yX%7z@!V8A_w_7+3&LI zyayE1(YZPauU%87;445eGIQO6$^J=$ zPq^gJ8^OePA+rL)YmBpoM1hy`gN4P@>tYtydb02IR{5T`k~6qeshVH50n78c_yW48k_-Tqv+06c6#jI6N6bD%@$>NzXB{mg_ zGV>~uY|ZSBHpSe5B^n^aHR$XpaKQZKL0CPQ8Et~<>hvnWv-jG$`3FL5IB0)rEgZ;d zUDSGO4isANY6#XvooL8RLp=TRh# zr(?IvksWWF56x1(dCI+M4v0(awI|W`nI&ySjv15E|L~-k(G4DgyX7g1To^t(GMl|S zX>9GEqx?T~W2>|32b9ZK9IwS36rX&R)%{#+x5uTbQl8i;{{Jo)_{QeiSYf8&{|-hf(}us z)A~DJFP8L5NRrc+qye%)B%!h%`iA`8j}ZoT5yxzri9(JE&#BZnf*58WXPr+WBceY7 zGc`ccR#qQ4>5fQ7*J%kHb?&Zq9sOErNMbaKVvZf>E4xoc$@gqL+_jbI;%d@alDC%H z)dmeO2&X7u-~f}aes!Vx zK2aR;i3iQu3M;NQ+`{g%D#N|GcRZ%#B@~xkK!+o_y?5QzUgXh-C|5kOVQW|BQ#tYu z{?wV#VUYcB!-w=}a6UTyeHeK$_ze2(LZE2U^HkBEqcs{dcx=1UiLq{svXp9gT)}KRXClQpVmEC!wEHQ#HHy z;ABIp$0;ZtrbSikp>&<%;_fdKF8C&Oe#y|uvYdi=-j!#&^E@-R*8xgj8pgHb^- z)Xcst#pHgGP5(s+pxUVF0IvghlAEgzabmhZk61CcH-iXuU~X`7ZNdwai<`QFZ=5l-&qK9OuJUWXNB(;pi*>o|JTWOY(hpn&YDU1xBGEmB3nKgeKm{W2!_bt4XsNap(U zmhf?rYX3!77w8aM2-7OF>mOkCi!AKq3IuKafDoRMe}PkX6*0eooY?&dTJ!$#f^Im_ zUAgrzn2Hn;1bzjDMALL^MZa0A2HM=({1Qt;a_jZ5;EP!ls!ku(aKq&l8S0%H`Y`3R&@^r zLH~Qd?VIwW)ujU{vWJ}gaZjgjPaObmM)fg*m;I zJKyit&%XTm5P%Ax+>iO%P4E}){*O7N9~#w=wHdjaQf(WJ!#vBwbwq^?MR?({dI>i+j z`;p83VrI3eidZ$POMKVm?+~hJJd@i?ZqIlCzJWLAmSEz%-4HYXxck6Ly+#dp^W`wO z;tDXvIU`2=Ot*Px1m9{tNK)D<%9v#=qJPw`S@iyvVD^Clf4jnD{q|NP zw(8l7jTb+hpWV8A{qa~;bf~lCq;SCkde;}#B;c%M#+nH`0r{^kE&SODpm8-?GG|r=+QXE-3%M|Ab(Ct_7X%@A1tc_H4(&qK75(?3tC>83jaen9 z*=zeMNh7g)!-;!hUs4J>Zo9YoxosWhDM~yjCJx@E@z1*~@=hKH1nM-<#Fz*QYjV2p z3ZsYa8O7J%$eZ}YS7-vX=8CSm^)8HqTejZ)*X?|8|wP2?0Ti2j)sYdo_cz%_ZDt2@uY)w z1(Llvc)$3n=`z~5!6GV|4l2evmbNEMr327l{eF5}3h>0SYc%Du-_4X$ zLNqb}{y@pjO4x>PGDuW)%~FrI}RvHlBx?ZXe6ZUltWZ!c>k zx2>3H@d(Ss;nV)P_r0n@|5}b}o^EeZGYhn6Il0<1U4@;dq1tFD2Igq0WRW#qy&RoW zSoop;Ly)rHE`6%LG4iU7-T&V0 z_8+(AmOUbCpZezejR8tKdy;k!(+XW4CTgujb*;QuA@3kh&G!&XEEJE?sxOGwRFUrM zJEKh=$8q*YaB32}9gLNb5K1mW+O1?Sj57Qw5wr@Q82+R}Yi+l}i)_4Jo628(&WD~? l+hnt|Am82Mq&Z_GgHJVTO~oEu76Y6=+M2o=rD|4h{|6eULKpx5 literal 0 HcmV?d00001 diff --git a/server/main.js b/server/main.js new file mode 100644 index 0000000..321937d --- /dev/null +++ b/server/main.js @@ -0,0 +1,122 @@ +const fs = require('fs'); +const https = require('https'); +const path = require('path'); +const Websocket = require('ws'); + +const config = { + cert: fs.readFileSync('./certs/cert.crt'), + key: fs.readFileSync('./certs/cert.key'), +} + +const MIME_TYPES = { + default: "application/octet-stream", + html: "text/html; charset=UTF-8", + js: "application/javascript", + css: "text/css", + png: "image/png", + jpg: "image/jpg", + gif: "image/gif", + ico: "image/x-icon", + svg: "image/svg+xml", +}; + +const motds = [ + "hello, world!", + "all your TTY are belong to us.", + "TIP: got a linux system low on storage? try running `sudo rm -rf /`!", + "none of this is real! don't believe what they tell you.", + "it's awfully cosy in here!", + "how's the weather?", + "with each web request, my server room grows hotter.", + "mobile support coming later probably!", +]; + +const STATIC_PATH = path.join(process.cwd(), "public"); + +const banner = +`OpenTerminal v0.1.0 +made with <3 by ari melody + +`; + +let sockets = []; + +let buffer = ""; +let MAX_BUFFER_SIZE = 10240; + +async function get_file(url) { + const paths = [STATIC_PATH, url]; + if (url.endsWith("/")) paths.push("index.html"); + const file_path = path.join(...paths); + const path_traversal = !file_path.startsWith(STATIC_PATH); + const exists = await fs.promises.access(file_path).then(...[() => true, () => false]); + if (path_traversal || !exists) return false; + + const ext = path.extname(file_path).substring(1).toLowerCase(); + const stream = fs.createReadStream(file_path); + return { stream, ext }; +} + +const server = https.createServer(config, async (req, res) => { + const file = await get_file(req.url); + if (!file) { + res.writeHead(404); + res.end(); + return; + } + const mime_type = MIME_TYPES[file.ext] || MIME_TYPES.default; + res.writeHead(200, { "Content-Type": mime_type }); + file.stream.pipe(res); + // console.log(`${req.method} - ${req.url}`); +}); + +const wss = new Websocket.Server({ server }); +wss.on('connection', socket => { + socket.send(banner + motds[Math.floor(Math.random() * motds.length)] + "\n\n"); + socket.send(buffer); + + sockets.push(socket); + + console.log(`new connection.\n\tcurrent connections: ${sockets.length}`); + + socket.on('message', handle_message); + + socket.on('close', () => { + sockets = sockets.filter(s => s !== socket); + console.log(`connection closed.\n\tcurrent connections: ${sockets.length}`); + }); +}); + +function handle_message(msg) { + if (msg == '\b') { + buffer = buffer.slice(0, buffer.length - 1); + send_text('\b'); + return; + } else if (buffer.length >= MAX_BUFFER_SIZE) { + return; + } + if (msg == '\n') { + buffer += '\n'; + send_text('\n'); + return; + } + if (msg.length > 1) { + return; + } + + buffer += msg.toString(); + send_text(msg.toString()); + + /* + if (buffer.length > MAX_BUFFER_SIZE) { + buffer = buffer.slice(buffer.length - MAX_BUFFER_SIZE, buffer.length); + } + */ +} + +server.listen(8080); + +function send_text(text) { + sockets.forEach(s => s.send(text)); +} +