From 4ac4026187729abf3d045a66bdac679af7d0b85d Mon Sep 17 00:00:00 2001 From: Last <253458536@qq.com> Date: Tue, 25 Mar 2025 01:23:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 ++++++++++++++++ index.html | 1 + main.js | 52 +++++++++++++++---------------- package.json | 10 ++++-- public/test.jpg | Bin 0 -> 74967 bytes server.js | 29 +++++++++++++++++ sw.js | 81 +++++++++++++++++++++++++++++++++++++++++++----- 7 files changed, 163 insertions(+), 36 deletions(-) create mode 100644 public/test.jpg create mode 100644 server.js diff --git a/README.md b/README.md index 6fd7958..eaa6051 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,17 @@ P2P CDN +/data/path/filename.xx + +缓存指定资源后, 假设资源按 16kb 分片 + a1 要求返回第 1 片, + a2 要求返回第 2 片, 如果 a2 提前完成, 继续返回第 3 片 + 全部分片接收完毕后合并进行 size 和 hash 验证 + +资源表汇报给 + + + 持有资源变动时, 通知节点列表 获取一个资源时, 先查找拥有此资源的节点列表 @@ -34,3 +45,18 @@ O1双向查询 建立连接后交换资源列表及过期时间 +### 最短响应时间 +1. 请求某个资源时, 先向节点列表伺服器请求拥有此资源的节点列表, 再通过节点列表取一个建立连接信道, 随后获取此资源 +2. 由于节点是持久在线, 资源伺服器对节点空间位置进行节点网络分布预测, 返回给距离请求节点最近的几个节点列表(减少地域距离耗时) +3. 同时向多个节点建立连接, 获取某个资源时从不同节点请求不同分片, 这需要预先了解资源大小分片数量(通过并发减少串行下载时间, 且能从更快的节点下载更多的分片, 慢的节点减少分片下载) +4. 建立连接需要多次三方通信握手, 且保持连接也需要续握手, 如何减少握手时间? +5. 每个资源都从服务器请求节点列表效率极差, 如何复用, +6. 建立连接耗时较大, 如何复用连接? + +在线与资源分布计算, +假设 10-100 同时在线, 每节点储量为1000资源(1GB) +100 设备储存 100G资源, 去除重复 75% 则 25G 资源被减耗 +高峰访问不均, 利用率上升 50% 则实 %50 流量被减耗 +由于峰值浮动, 在低谷期减耗效率仅为 10% +在线人数越多则减耗比率越大 + diff --git a/index.html b/index.html index 666ee97..cd3e5ae 100644 --- a/index.html +++ b/index.html @@ -2,3 +2,4 @@ PCDN + diff --git a/main.js b/main.js index f75ff3a..d2b86a9 100644 --- a/main.js +++ b/main.js @@ -1,33 +1,33 @@ -//export class Node { -// id: '' -// name: '' -// assets: new Map() -// get(name) {} -// set(name) {} -// del(name) {} -//} -// -//export const nodes = new Map() // 在线的节点 -//export const assets = new Map() // 在线的资源 -// -//// 示例: 查询持有某个资源的节点列表 -//const list = query('xxx.jpg').map(item => 'node id') -//const 测速排序 = () => {} -// -//// 查询某个 -// -//// 示例: 通过PCDN节点网络获取某个资源 -//const pcdn = new PCDN({ server: '/pcdn' }) -//pcdn.get('xxx.jpg').then(file => {}) +// 连接信令服务器 +const protocol = window.location.protocol.replace('http', 'ws') +const ws = new WebSocket(`${protocol}//${window.location.host}/api`) +ws.onopen = () => { + console.log('WebSocket connection opened') + ws.send(JSON.stringify({ type: 'init', data: 'Hello Server' })) +} +ws.onmessage = (event) => { + console.log('Message from server:', event.data) +} +ws.onerror = (error) => { + console.error('WebSocket error:', error) +} +ws.onclose = () => { + console.log('WebSocket connection closed') +} +// Service Worker if ('serviceWorker' in navigator) { navigator.serviceWorker.addEventListener('message', event => { console.log('收到消息 Service Worker: ', event.data) // 接收消息 event.source.postMessage('Hello from main thread') // 回应 Service Worker }) - navigator.serviceWorker.register('/sw.js').then((registration) => { - console.log('Service Worker 注册成功: ') - }).catch((error) => { - console.log('Service Worker 注册失败: ') - }) + navigator.serviceWorker.register('/sw.js') + //.then((registration) => { + // console.log('Service Worker 注册成功') + // registration.showNotification('Hello World') + //}) } + +//navigator.storage.estimate().then((estimate) => { +// console.log('Storage usage: ', estimate.usage / 1000 / 1000 / 1000, estimate.quota / 1000 / 1000 / 1000) +//}) diff --git a/package.json b/package.json index c30cf7c..110a080 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,19 @@ "name": "pcdn", "version": "1.0.0", "description": "P2P CDN", - "main": "index.js", + "type": "module", + "main": "main.js", "scripts": { - "dev": "vite --open" + "dev": "concurrently 'vite --open' 'node server.js'", + "start": "node server.js" }, "author": "satori.love", "license": "GPL-3.0-only", "devDependencies": { + "concurrently": "^8.2.2", "vite": "^5.2.12" + }, + "dependencies": { + "ws": "^8.18.1" } } diff --git a/public/test.jpg b/public/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c07dfe600b8c77d2bf2390c14f3e1df9fe16596f GIT binary patch literal 74967 zcmb4qWmFtdvmhQIxCPh2EjWWEID@-OaECC1OA-j~gEQzLgS&fhcXtTxK@&(wmhZi{ z`(w}9A6tF;p4(NoZ`G};t6lwX<=-w+yu7cY9TJk78WIN*5)vj7Ix-Rx>Prq8wfiMO z{_i}>1`<+)BNEzw@GrMAGSPqIU-C%E{75MOga6Ot3nB^g|CIc14C?=@&j0(}e>+G7 z$_gNb|1f^x^pgBrN0LRtKtsnsN5jBC$9VM$0~4D78ygD?n*hEF|moUv5DCz$tcK8fDk^dv^{|00v6x0`aUtzvbDPJi61^=7)Qu@EB z|JIOjUbKQjfJ*R!I+c-@#zXFlR*J*Y#*t}c1SNPMgPA?f1m|T+gfoU0Vo`tB0(`-y z%(e{c*9D*?$t58x6Des<%)iOHs&osrI7ueVQ8yHZr4fr?tqw z%adBpJ$SmBE?7TP5wh}!sGi@Fo>&Mzo2iXVEKF1FEhGk+qa3!SEDM4d0HH}l>e13P zwu}nod#nN6#NST)qRb3BL(!4)SKxgeoMu0qUga+o3X`+W8MNg(o_KDkVMzD{Uj&D74UavtFNz**MEIS{~({s)$VY#7Th|#)4A>Jw5 zndnt{^)#90>{K;kh-JHC;E3<(5O$akVw4v|jSkV(R_2BPD;%a5VaV|gs5pR@V9g!E z5yHBWZ_1HGMsEa9!ba}1BXkqnak(U@d;OD3%&T2;+=5Pl%?-1IT+zyMNhCU&G+s5D zT6K&l*r+xRFYKABz#NF8SUEAx==TSf&hq|sgy3TIFEZ9?aE~Aa$yq$7;qG1E zYjIbR*#$Au@785`uN1ty%LRpRaHrgLM(^e74WKl`4-#3~5A4$dt>+iOy>eH1@Ki&@ z*)y%Pn{)ePvMECt6(Jr>nvIRJSos1MvRFTi6QVRQ(`yudtcfk76l29K^Pcfb2dfi|GMI6ck>7^oh03D9!T(K=plKq!Z z0RL+(Qk7zQVH(0I?8qWZy<~nEYHHKPQWPvwi4mj*5tWKDk^E)o-;}!%$1A^I+~cNX zuiE*y01=?qkUdmfxl@=wVQDX&rf;rNv1iz1mD9{+Hr>!eRv)f<1Fws*sNt36`uv#^ zBr6+65=$S8lB!ia zox};Pb`B*VR#9S(216T+7gniA594~lG7N&j%B7nXJZ^SrpLq-URq~n@1SeX=_7x;V z986aO`IhbyffnNz2V3}U;Y|nIUwM|=jLX1x(?afLsj%lO=4J2eeEqgi?T|!lWTniV zDu`RSdYLY8gjwC?TgBK8X1QUBUDc8(TP$opbXif6XH$R^UVEX`c{JDh+%~$C)_CV} ze|@|Np&M@f$fg9&-w_VI1kGFE$)nh*11GIO+Dda^bjeb*A!gs$sOu3W!-z&9>V=ua zIsds~N6WzXqod@^)@x+s zNdQ!TKs!Hsk~F1`=_srpw(z!I=6yzjvrHmEvMB|V@6MN*r6jg&2^3Kw6Vm90fn@!} z5U2U5q}n)wnUAv0#xY|1A1CqXnqX}=++vvWt@#jU@J+nUrt zUVD426;_^~;$465tG50W4XA$IeYKCpef=^#g+S5bpx`9qLjg~R7Ha5P&ISxpPXv>v zVk#_JC~TTO*%Gru_fvHaZFP)tD^E^VP~#Q2b7wzx`JrYTf0S|h_ym0|iG@KOox(`O zT9mdi2xC(2%Xoimigmh5J^WUV00kR5ZNob{OOrdvh;_V0z^yBTNgpPKGKY!Fm$vra zSVb#}i3F?&csVPPVxQ(@6#{mV_Gzo$A*l zJx0wF_`k||Vs#e3_z>~M!}6@jVJaydB>^! zgN-VbAZ4Y-k0e-MG1EIR-K3>VaP>sPSwtnzMz*17|GoB?Q3hJsBwMQRM1A%T8DShC z@Pu}srL9ChN3%6&k7KyHqUw^fIEV-RHwoE*o3#cA9S|Eb!1hy~Z3M^J@185H+NECM zp@Q;3-o*2Y^DusMI@{>V*Ufw>qv+_4`qxPV^khr%G^pE*>~eB`GVG0l;kTOktazhM zU_&a6^{sF9LX~A{oGk$Uidmf_hYOrhH!5RCrFSj~!e~4anwMv0=XOyl;K;9c^Qew> z9*?|(xLU7wROavH(x-5_tGW+7LDYxsSZH$Oq~}X4A3stjp}`cHFefD4 zT+X&hzQkQ~9g8}jofOWf=IchGI*l$(=|*ZAK155SLFB5^*m2HuFG++RyT7E6syl}} z8}I0}89Oux5*d|dvTD2oDpnAe(0vQ2iMhGA_aaxFE?F)Na#tK}l?HcivyQp-P=I) z3k}oD6df@uXGOmPfD~8l#(z$Lav3U_v3l7^g%YxmCD8X zVA?dhLIyTKo|I`tRU4#4Mb}*+Wq`jFVm_k^mSSfzJP6TF(Z7vQJw2RZ%+B6`VHy&K z3j*SUxQyWerlbLSUNPpjCmZHsH?7Ys`1p0pp1A?rKOfU0z5fI=_TeF?0kvMCBSpz5 zU@OV9B@G6Uj`HM|E*$e?7?<|SA(X>8T#YS~ z2mob{e&9?2NkaLJxmFs~Rajs^L^kZCAoz=RDA58MWerUP zZv$SzH7C!X5*o$KNT1j*C?C;S24aE;HsA(MQui&?_a&N*w$~JMvoskog`Xar@-wBf z2#2M#JrrYVE0}yuAu*or$nvdIR^1oQ*spU+i&EB~$TZl6mb6pAoRz~;E0SCs>>c?> z3%%={D43Q-x+$EePdzvC=n9S>ehB!hr+>YC@*QLPWB@4E9_Ee&mckAX8;j8arG+-h zgZww8oF_ozwgIwwZ>M7r2yZHR#d3szr9OM;HLkdpYKKbR+H$V8aX&oijbf=vH_zcK zS@tw`O8^`I1?XdL6FPj6$d^s#)^UHQpa3~qSA6%0oiwFdUl924PpfG zcm!}e+QiwM?Vq#tZsbp(77Z#m+nL&^D2y4w;Tgy4ZELt+4!^RRum}r6uIdlFxxb&8 z^NQNmNQ#VgSx*C>(yCeAb30kJ#!Z}CK%S4GU%@9j1&RBe~^3&+@iT3+1L3d76}qu-Tm}<>GiH zIR-!xeOT4&Lf+8b-aGBAm%(wd&V0}WWI7um%kQMGtV_;f+`jUZq@L6Y;#x?m1Ei%m z=&*!c*gI?2*J|W-kJkxbYo6PlfuLLh4Z`M^5QNke#u*&F(W9BK(EEbZfViJaL?nAu zXetio-9L3H=04T#rV@}h(>4C&1KX11nZ{o?$EUxVIN8Y|HeGOF)QpS(Afhlv4@10t zAI2@r4s23Ol(?5N>Q9?V+JMp?ld)}@a&gvcP~A55ERrha$0JTt!S*ea3dhMn2tr{> zYC!VbvzXZmWRs+ln{jit%C_;F%&04>EjPA7f7OLRL|i*#h<-s>O-7PZXDISx8;A`A zcwanb6|#OkF1F-U9pP3ykU(d`uOdcTNv`i?o;fo;3-_6Hw=>S+83uS~n`P^Knsk0c z+%M$cVO5niE_^{%>{p)Y+tf92`$QWzy)kq0{Wd-;PvW`jB;LG-d%jn4%o!F7vJ2HM zBPr`$QW4ZKy`Bi4yo6jXcqRFA72)MFLX0PB0-X$sNYU7Z*hnwlry3s`<)}Z4$C;Uq zPAVOQRc^X$vO#)N2|m1R5BSad9NHd3*S#*@GQCZ;%kM9+a}=a9DkG1IbA|lYBb6I1 z)GP)QA%ko%J-(8PKeg+?23(TnRFAC{rL`YzzU?t7AYzm3wufOs+!HZfm}5;DS)%i1 zxUd&Tt8#*EwJ2ZgW?2bnG8X4eJ`02n*JvPiJF;TUW#>e(x^feOuXri!LxLV(o3BL? zvazd?q=a33Dr%7Dq!z57?J9ACu2GRza>e;7?bVUggOt5;gp}pD>-);1DmqDRa``bc znPM9Xx9#HYsGHehyV=CRZj& zsax)$TxwCP$Y&o*Eqj zjIJ6{ps7iM@ieTGxuj0l{Ig58?jWvGr{!F+fX?Dae@$w}#JPBBQDmk9d0D2Q0EY1_ zq&x;~ILQQqy6rfk(pkkl*)!*FM6Ua!(MsQXj!9}o^iuB2xTB)IsbA@EaN-Otgy$YP zrNwbpc)98UW2gF~_pa^~Y+SAev-+M4XcFYR$0vd?Zo8KoN|MOh%9AurapEBs6H zez#tg`p!~=Dk8I-vWNYr>PbbZgX~7;^Vl-S%5Kd!6gcQkl}VFPg+csbYk;&pn7|$6 zu0V0b5#f0rUEW@}djECUgxp8?y(^j+ zrOo0Bw*s)Uz4Sp2bO1M3Q|pq6p@%p55zCs3<7sPFeFdyTxW}j3Ty$G&vUSIPb%g8g zPwt`r*?~!kNMT(}bJ9YKR+;C`-4zhx+2A$y2R{grv*xh%uA%qn7{2`Y56Lk;ZKt+n z|JHT&t=}`9j+=gqMY>tFLnMD|1i$(6>BxiB?O|c!`qXjr8>1Yw; zp>KGOicPg;Q!b31%S$nHO6=<)Jc?Fuym;?egc1UYgQ>)yt%T-jFi6Y{mG>i$SLggf z;02gRpkO*sxr-TCkwIpIS|bUpo+>`ejYF?iYTVb9me!I+7aTD>a8}kAPdxJzI@~|G zwO0>t=e2Ur$_>){)??2dUkJaI`iErN%-2j-*E_ugp06rTqY#lg6kY@A`%)(B@G5@~ ze8#5Svr^hX6x|!uveePqwhQeu85rrO>V~)gdDajwpBMP z);%3fhE$Qd0zYCrdzWE3swb1j=$mPA56W{NY6&spV$M}Pn${r$EaXVD$NAff*J4a` zSj`x78~36$DR*%}hi-A7g2W5e*I|cZ(Gj_>ITBC&ljFc8qjj%L;$yi~cinkNqx2HW z$4sQA0vHVJh>al^S(`6Ec5gaVb-rFG2|T6ofF0g*$;=CQ4M1qW_WLWeD$#C&BcSV} zUT+}YSyVv(QMGtnaYb?YsN?OzZhjS?bu_za2H8CwH|Rh+ zB$^QykQz4W`GsJ_IipNSaDPs;X^tcfuB0S`i_s}U>O46)ouEbzz3e4)vTZP2ET^iR ziP4YS;+3Ads}eiMVgd$UMQEAaW5{Z&cWv~v-Ua~1UbQ`;?wn@H(p7gqMN2nh`~&~8c>!pLzJ zm?>Ya62gT&ocb1p(Fo`&EtAzf@HIgv()g~Te(Z!Q{J?rE@&m6_w+*@XJ$)1^I;y3T zPLlQ;p%JKRQ<9Lih6?dsHd;C8HKqzZks}HTAO$5@)6e(J1U(QK6LfNQP`0=bjW(SV*c?e-`uv^?U!s+n}uZHcFW;1?`L-a*!?J7XqjJ>D&Cg4^<_Vg z^`igM0-<`%$tpLBBRENo!a|ciX?u&4AoJ@?K=34ZrU9oo5r=P7HhVavE7HkH-*PfS zJ*>PPbAp|rh>%2!k$r%IP&(<51nh*3<{U!sACor8nvx3j3o@n_Gb8t+$a(qwIIm&O z{#}(GA%ylr6%bpmf>!PC=kI5-f5HH}p9%4$E_XOEsS>4KW=My7OEk>-^2FrTR5)iX z_u~eT9v=VrlsX8xzjAw=&aV?#d4Al7s8Eloc>L#lQAv*ZBS=AStnETPF~^jk-PY)g zXrtnT&8#wO!eX`WbXZ|%1wjy6KiMlhK(Gv?mU+Tn= zB13I_;KYVm^m65+z|=lEFd|_)yh3wgr<%SCjJ}ijbM4rDyzhjyn~4}1Esi&|fh>+L zjVv<(6z-Noe0e$W9XjUIa#}>MG`siu^-g_xq^=BH$i#kGRoOMoR@oexTP)8Gzf4-A z9L5*72Mp#f-lO#*KLMK(eX+S)(T}y9wM17WGLE@EQ?LpnH>;e|C?m{4uT7q%!Q6wu z))}UVl2jh}TGpB#@f^FUgf$vopb2DVd!3F}&xRCANcl!@Rv#Qir#eq^P=WoL2%z1> zC{&G2M309}=zz^`5`V(Y&GBGSrTS}Y0U|3P?WnCK!JuXb+ven@2eawMdi zM4+u7JO0+bu^v?{92iHw|HVc?rkxw2uTP+!7_NphbNc3XZX%XxYo1dJb>=-Bu38p0 zBgu69E52FfTMUu14SgjWeJJ!r8SK)v4Yv@&j-&^;a|3)hauW=mQm> z*va2%}p=p!csc;SFNS)04_BQMKCa!1C~?}LZqY`2=0f{&aG6~ z1)C`6{06%$Hg0%3t~I{V4nl(y;D3bo4W$FKyZvmdZ`CGu?_ihV&))_Pg}u z0=pC7{ais345YB1D2;*hi+^tXecHD9y+T& z=&WXlCU{biN}UKz8WdE^ERg{jFB5gMle|Jo48dey?1JT3NOq;OSb%h-)Kl%ZUMnxj zup_Zy=37pCxB?X<4wvJ3rXKx0%uq2#Z$T47G?+5I_(+wMm+vT9RB%~ zUOFAz)58E#75(aPY!kGkilY?3MNV8-aPs0UW7X=wOkcTHIX%9+b_n zvC70~&Q)O1th$iy*J7^ojX^t=@tbf%4p8lKlz)&_Lpth}Qv=Eh#-eP4)`?Xi+O336 z-!}TxO!O+NRcDnJbmTdJC}Q`xXcIFfR;pDvRmN;mtCe-jgsbJx_H;#u&8*zo^M0}i zxebGU&k#>9lPF)p?buLC2<*X+eedXxc`lUsE-(sEhF~d-o6O0h6sQBRMcuEswl>-e z4+6;SHp6|uhblr$Yx}sKR!#b|+$L}B?92-DrR`FC2Se!_1A_GroeY>3j>L3BF1@Y+ zs3e1Y@MH2+MG;1`^)f&9m6A{B6xqUkx%r+&QG+AIpiu8DJcwO#24P+uG-pt^m_Iyl$NN1TjRUm5=AO3Ye)+1% z3!=s(&e$DcO3#qY8IE8!;nT>}H#|bC^p3|Zawxw6gwT43xE(kXLuiBr_?+z=+tHF8 z2&zDw!C2}!<%8=&l~o)q4Z|8}I}ln8al<5?9%)Y1p>!=LM;YU>%A<9EyLYB%rjh2} zoy&6)73sco%oe=c7ycSzcf1;dIg>sb6ai-7z?wygzh}n z*5lIL3PiW9`hB#j^3P+|_lHW*X`EGqTncElaxZm)sJ&qa!R%&%larM*bLH7$lR(oC zkt{6M_lYRTHdxHq4;5q=I_5j39h4@t2f0y_)qfB0)Hc8}v_wp+%& z2|y$=pxV}bw6n}!AnMofC^%6+2oRW~rsK>`0(@nLAH)z$a&oR#P_+BO>@d28+f@%+ zrIDJhE2pE5&&?`r+XV52`ml57!qBF?aIqche;wEX3)1=7t)a@Glx0*5p08L+8!3Y` z&F@zk7LMA@RVp0-IVeibW|UoQk*6t2OtGXww=u-}^@=6xdvE(fwgSmk2Z~D~Xj;Pq zrVs|wXgVEvWQVt~GZO9Bxsd4dUzZj#ptUJFPzS}5Tfn-ftN&+7fv?p9ojr?>6m7=K z&gE$8Vd&^%gZsJE`$>+dyKSC)cMw)*9u>)0=vV>>4l*LC8#Byhx3x9V1Hg;(0uLYf zgvN^qQ5FKh3N?W`Z0}RoeMHx>*y#&{aSr6hiOd_6*SXTzS#-XZ0g6CK_9t=$ZrV>* z@t=fF1R&oRD&{l`y7)&S#wSIZRH|v*(!aB;wW`G9-fYZ$e<+*IGRf%IM#eN zG1GuLVNy=~A%vx^8JG|&uw2K9NgtP%w8H>G$M&|ew-{fUFs6XTHYSeJ&&eYdW0IO~ ztdTbrCY0rN@VW}Mq20_=~jkUtz8ums~(oL37(p&?eSer+EL0raNyJGG~k$Uf8-Goy4x?`y7FVe=ibKXA`W-eKMrHe@2Ul`s*cu<~ma zXvA`#{TDo?GaI-Czi=MX%Spw1S8KjBpfl-fQSHa-$f_^OT=}!&i?Pqy7p-Fv-*?gp zxEDMgM@oK;vI{=~xIJTFsvQj@my~XAbO6gNTRkvNylN1T_OoJCeFWU;{!G$@UEo5i zr>ZI5sp-OMf>06k+R!DTiWTVJ6-Nwn0bwIW$vd932u|Ahm`2#we-u!K*6YkE)o3Ax zc5aY;11PQ=b4NN|4C)p4zIR3XJ`9=VWj&>lWM$DxX&Bk32zOZ>#iJUC%$$z44ExNn zMs3fWEB~RZ^+P^4edE{5vN+bf9C7Mrp_V{3@bs#$>QeZL#CN#z(Y`{yJHQ#~CPgS*to29Hse2w*Ap>^skekbs(lDFCfGAJ^q9Jh+OX-?x9{spn8T2AcNsag!A zYp(V(rVgeLOFUo2+>5Lhbjzt&d7SBIhTe#qvbrCF=I{OP<8p~B_bcocG~#L`F7EJ2 zXIIX2vJZkvLiukbO(Ik)XjmFOwqhnd$F7Ke;^Rw>7B}rnK@Yp*NPs~mmgfz8DzxsW z+O%Hhe}&GY_RPN?Z9&bAPBQ{G{qY5+JYRV)>RXWi)F68J;k#V_y;X%D`_?FwtV}sgM)fvXp69Vds9&0Z$ad35?vIzVRhHzey6(ch z_R#gWGF^AXIE!89x6GH&f--Z%G^5?x)U*UvKgY+5&${)0)gyrRvfs|Hu}#u|JWtPh&q z#vPKy4TEQ<>b_rTc@)p;u6NGhPpxDl)+KmUrlQS$^v#zD-;3fpj8a9&ax!-6pQ+?A z(JfDzF5_CS!^WB$N__3YCoYeKR?CXe&l7o_D@m$t4g!pU4b%(OSa{(@(L(O_POiWt zf}>;miJ>1C-k5cz%>p$W{DP|-4$~Yjhp}aWYzV)n~Se0M}_sN)r~EyRLRhkrs+xk(7Qx>L>t`p{+P{oH6)vsOZ+n zIeeR&Fsa5ZR>CP^L%Ts}8B}~TkzykSV#TlvtsxFkR_+dUOevBRvjkR?Q_p4utWajn zDKe1hH%laqQr)lC8je**v!AHDw{aMt5Eb1+;^N&iqC$V!o{i+Uq<1}A-7s^wzFq+P zE9(hruQCNA9s+H&A2NRF^OY5q7v;&)^CDIb#Il!*8ni&h52;GbU^I0{+e_=+IeC^^ zWe~dateVGzk6+ozEYem;+!OGqLH+xZQ2?(D3%39kpr%QG>9HgG1h{$I0C@+RE6!jx zGQ|lOX@2(-ekMrp62^yuj)I1Pg8JW~eE$`kMu<*8#K1?-Pt5pM0E2{-Nl=UhB9po1xjj*5@&^ zoJVGuS=?oVz^U?PbM6~?M*r(#*Syz_6tu zJbN2Z9Q43u(llKtF0V4y>BTM%_5UHkx_+jc1q1e7^0=YS*$zc&;uiT_pf8bzUcKrg zH%U1)3Ks$kW`b|T(g=x}P{_tWC3)VZG}XMnOdp!euGH*Orl_?vI9N{HL8kE8r$MTN zXHRjM?hK50Dtt(2L=r2f!=#8I@w9&4-FSrN>A>rZ*X9-+DIYTN{T)}W)CEQBDyo;b z*Pt{+vk+yR#JZ8MeF4YCu~^k7OE+4Rf~bG{9}@CM2hVAb=RR%%9;2MEI)8>Jc$k8oP#Yz# z6(2EecBq+Xsf*uUU@cO6;aU3x6ggUze9BC`H^1O^HUox})siS<9*jDy7r~cfvgG=k zi$p$--&53un}nZlnQluDn|!OieZFtC4m;o4fWC+e4wH8pRLN1oX9(c zO@&Pn&r4GVC~|B_-=NA z`>6|5d0-0*x)*x+!U=ex>;RsTFn}slDs>hy@}u~+bbs!VC2BJKmSt!rTyK2><3jrV z88AY%$~xvSfb!ITrLfc*_VAR9PSHU)Q96`%RQ84wf%Xa>pI5(y!tubZs%rJs;mdX@ zdromm)e3yprWd;M)?B?HBSIzp?5A_YYq~i$7cdQL@ct(*S2QXC&hzZU60*%>+=G%p zHAGgw6raW09AHCyn@}p@%E(Nd2})AerM8~(-K?ioYRT>uY4VdLXb^bAYS#;uAJ=YY z@3u#_JhsMPCL`OLgR9rv$7Xs9j)dBoByWYH&K+HKJjWJDxV7-#<$DwO70Ko^ zq%NO(wefv=>O-fAqF5WQ3=@!0a?DxU^Q(X79!p z@dp)GbA5<>xYbICNjw8!o7aQ_y*?;jw zbQ#|JRlC_5e$pLz+5_4RA3zj-JE|wF(ug>~%tzTRetQmE*_Wes{yhlEgK7bw9D<4{-92qi2ULjZsix9=}uxyNQbe9Yf zCe4yn1#gP!Zn`%V@(d2w%GW~J7NchrXksiZA{65TYKmo(?ViGFS^Wf{YVo^m_-N<% z=|%kk5?Nhn9M>IHNBlt+nm=^}GG1Gh8gy2iwUe)!zw70Tm>HNQh2MwJ)1)}NH2zms zOda933HoyU2m?Yj;9`$FS|EMCFa!XBUVd5oRF`;CT1TkpE>|9YA@>idrOb)r^f4rO zY|Owh98#^B)ecXXkVGj^yFB&bxroDSm6(Fau5IdG2J};4dalaur&o=zl<+PD?(<6$ z`utt5A7-2tRJa(SCnVEbUy^4@rMe6@hRqu3+=4>Bv6T8n4NWfS1UwDN!VgDYcNCnS zo}Ov9i^C7pL}=9B+eY>D7wV?;DKtYXZ3)(Az%+F?2^yEOjiz3@;wn@EhEi67Csxp! zYw8_i^sy}S%3*1X<`R|ymmLVrtMGtGb}N@zF;;C=F_fI%d)546XhMJC(uUCS?psL_ zbcExRD(4A95VHubFG~o#;-LI|j3X|{n&nPnQzW*pzJ9K;ieu1>WOyZBjFJboZhwuI z7SG}&2t9E%siGmjdBU?mz%$41NNR3}`!L~I3hkkXO(VU8swGk3tICreFZ1F4Ryue= z2k*Aj%=@17Ib4fWOM^z1gPpkuVosAI_g%Ol8{;!kk~`P-kJzlNN!WrU|F`T#?zJ*j zJPI?u(EN2z>tWp#!Ebn^)+yW#L8w!*A}od9_VmlcuQR5g%?Xvb0{i$XGh?#wo0wrW zMjCnXw2#C<3ccOL5ff?cSsprVD~z*<9mp>sud15?FM(2jSr&LIsDY8zbXcLd%2|3` z(*Rq`^M|!3>HF{&V;k?&non)V%xc&rliHGW7c<23zTlLT_>3*z-w+D5m08PWZLU8( zEwYJYO)_3`SAe=4S%z6gduL6xG4+*J3BAFcMaewZqA;`&M0|QY{8U7&WK(f1+Fjb) zSkvi6o1DsNoXxrTt+ST%;&*a;KAMBI7qm__@?G2AQP}Qydese%&6(MZ86jBDJb9B; zO(GnZZIF(XV`JL6@Rxa|{W!9V3 zgNQ;ryEwTYx6~PW6?*(3?NLcc5v$XdHvORq{hcdsnsSjuG9JNkdVTu369;3s>gw5d z!y0s+@A}8E`12$mC-<`=|2S#Tq3~)cydzv*s5_=LbRSS3yZyFK#5ZY1)<(2UI6Bnz zSUhsx-#qYQcOyY!k-M?ho$|BoJBRU1aJls;uCR^TJeybs)>Phy{mV>oqqRj|XG6rB zcZZ?+`2p&uOf0V&s+XqnhV*vWDeZN*P7$mF}sM72Li{X~{Aij~;M| zps`S~v_IA_v)qAaLgY9g~sLDA-C zx>(NC+%hRu6HY{0+32e1W1=3$M2Seel|Q05_;=-1dcFO}{&}@amXA98VE5OwcG1m#-^(r2LPVVGD0s78OmGbL)BK_AUaED| zh1f;IPRprhTirb}*(AR~6WibIDlAYRv+w{NLNJ|~Gt;7e$CP!oE1Z*)CBpwCDAa7Q zuc}>=t)R$Mq@A?OGF_!NzjNHs@m>_3I;ivPZ9J7)X0iFpbYXaI&P>CZM&X|EBTh(_ z_Xh&wnQ6gYb#oRd;<>GqT1JF;qg(HqrI!3iq1L$<{zUX+L5#&KQ{k%ByxPl`Us5>E z*D^u-LB7tNS-wf5(0DUB{nWzG1z{g0P`0s1+F$%>wyT>$cdWQ2p6MX+v7PZx*c&|6 z(dXJ9xig1y^CYl8VwL{6*NqV(uak8pk@3~K1i<}=5i{-G-twd?4`O@#E=`PjSK3*} z%9&#n3vHVCKq{Rf9u(})A3a2xU!~Xxm)jOB@iBR)Q_^*$H|mYY9N zwaipKVB34BzA4pdpD3`+F!;OCrLv8=Ez_Kt>#8X_^=?Fq^#`%9>QCydAs|`1lRX#V z68WZZX@-{wPP(p9s3d*3yzx#Quw2;e;``X<8v_FaePiW1{fS4j*Y|vvxC%jTv985N zI{4iYaP9odXGGbitp;6cp}a||6!>*h2kEQkDcw^#_nDeMkO2Kf$qORAqGu*iNjzUQ@`ExlC$WXx%vd9*K8- znCv>>6ePy?`H=b-X!agm?POz~IfXSa!mkoSeT#k)+;OD7V`}?|bWKOT25&BvYgTc>O4LNaHPKl3dr zI_W=ST`DBUct|#T+YgGpo?h*dwYf`5h1s}(%==+3hYt=@F@+y zY7)X%q7TX56m%i^(-&RuM1e0e5(=*Po@iQ{Q&#re=)iDna6V@JP`GmQ6f_JCqwOGlsX$1+XS}@ak(O#TH4&MKOPo)r2 z&-6i4DmfacC;UCxp3qDE#oVr}4ze$5XAi0-Rk{3S1h3G-M+(z{xCjCc&v>txTE1T@W@iew+ymApogGHk1n1j=dTdI|v!~eLkI+--6 ze|X)B;!~tSy>oqgd$*5VLAI{yLP>ozdck7gx6Z2h z+$Gkj^~^Ebk7^Z`<{ZwK&D!--C0;kBu|p5yhK^@tpCiyz8yMop6fs(iZI?rS!d1xC zqtfDHoqR&IZ2W{(SjKXnvkrYZO3hN-Zps2|&Lh@iGDWrMOCC--Y_-4#F@x2xjLlZa z{XCa)-cU*ChNS@gOTQoU*biG)On(pwzay(AHVr=xvu$rPso-YDOi9KNrfYqOVf9`W zTGOpwU=L6%w7Ad-fOL*CVMLC9!>h8^T?qyY@o)~Z*Jr({zp=mTdHmNL5u!#MTZb8lov)&bPo%J|#E=ql9(nw6 zqbGDLiEveDw0dgwR9oWZKOi{*jlBogASQVc)Y93H%qIOKmK#6~5uCGsGOt zS;?WnF#e|G$3EIxyrm$JdicFG`cvr}TYevIw$QC$C}xw%+Xbo=#Hp0k4(ksX@!($Z zg=|qp!GZp##kA0sQ7tXWF+;(LpH+%)^@~F%cU8wSOq=CU^3)er=8aB8S2Wl(ToNqU z&M=&k$`XRN*v;9^8I0$d_zPvqWRU$!lF)E`L|Oy@(JBFUzgC|N^X$QB;} zPfrWIg~dx9Vp2%dKF|w`MG!L!)(xFt@{Hq`IPZRJC1s@GF;Hmfd4k_`;t7bh`I;*9Qq>H^LMI8Jd#TB0x2sSph8vwO!D+!!3qGm?P&kdJ{JGfVE?-=;!KtrD{nvWOteqN ztg_d)xgM%f%>z$7Ng~+aIizj$ZL-)gqc`nU3y?wQzFFeo2TF z^mso+^Ey>lh@afr zrk(PAg!ceJYz>yLJeepv10+;!?%nPHBXn+vHg|x@oLHxzz8=}voYBTD$OIimsCVPX zCco&Y86*3~=XigSRwp1{RVP3gFGulOwJ=P!45X+>1<;^cI*+R0CYw}^kd1aO;yx@OGI1#>7mdQ6Up*ot< zq-66V9S@qvY_@t$@&fmQFEujtxzpX~d+TKhyryc2GXORTus;v8{n9~4UKNkHjvA~^ zE!F{jm(TiD5%DcI2@E*|Qs-a@9J}+VYKIZ$+@Ne)MfdkYyD2?sq^wlivLmB+M$O=roLY{|_ld zktH@xUG6W)E`(yM2=5U64U zOl$9+j(otM!-08LbdU8%ooFD%aq*7>8q{UKT5;%*tw<_kLTtF6sYnaojGtb}55-@z zZoU7IMl;taK!<5<0uA?cK(v4l2YNpLkPPcTBg=SOAh^uw$WlwjW!cj5SU*-UT<^rL z>^3+j@SRQhd^nb10TU;S8ywr}tV|7EFWfC^U1;HI>f}WHLt;E_8&)HBCAI9V+PS8+ z6p!@N%l=z1rj8PN5ty|(R+{jwqIWy1b^OiO{xp~lHMCW-=Ld1!t*EDX!h-4F9_#q1 zu)UbN9Jk%huJ){mpZHuoe?mz8Ix-KU)ef8_{ufhk0T;IuwT)5=#ogWA-Q8UmcXzj< z#bNQqy*MmRaV_o?TdY8FD^78{{NL|;@4cJnH;H5;Kd7Wcbnq$yU+q4!_&JW_Okg zIvlR4J)*tj!4WO?e(!;DC4-B39IveG3aj1oX-lVrr?q|!8!o!C+xDmkZclChMOe`o zB?&fteOMFHK1AuzDk9uVuv5xlOYISUYH`OA?AMzpr z5K?Au`4!k0v(p9=T^I_?>ywcg1C03;4dq#rs!By8wQl0bqCOAgk9f*b$A8Ao(*7MG zqHk>04+;9^$v;+p*=I-JGdOlcFox|=pC_t>k5c#-7`kJG!<1^?erZq|!6QMLp)*2} zIz-yz*;XD}wxvTkdW;D5T{VLLig6;HS42Ok#sVQ>MCGLR9giYH!vo zSqcAEOqI{m-zb`@2YJMF6_#|NFJ)E`^;gyQ-pIrLV$|+ZAXFxFKa8EN7J+*&V15v_ zh}4*sw6so{M2_C~s}x1yorIA6dhUp2u^CvTRjbus9houZspK}#X(_?Fcon%|L&b86 z6-(f=`w8U3oRxCydP3&;4#gOZhH>vT_&X-R{jO50odGOdI1~hKB_k|gN&kGiAQV5M zw@zq`G>OfI$u;lZaPD?2APf#xb^i5CTlKoP>Hoz8jj1gfMO1Ocn-2{%x|II3KC+ta zo-ggI{Aupz*{cFcSwq`sin7z#m!)f|U&r|ya54P#cNV7~ADB7WX?b$L(>;Y5PjR)+ zxd;FQv|%g~W~ome9qbfYGT7QcR4#(VtsHRIsM*H__N4t~#;wchnQLK!+O~DW$`#?aqSx!AIrMG%uj~AHm|#?X=)t!`0`1)YrX*liGgO zuGyiN^fs7$^N>=`8&%jSRY4i2is3L@{D1QQRtUSl=p~`dc8)!^xM z`Y7cp=L9XJltPdTSiaWWaRF}H>vE5{A8axD{&t8_YM87w4rrKJBn<}PG;I26^yG=w z#KjJI8*}c-N3OnS;6}NAso6Z^Z?9Lwdg|PQd>oe_exai!IAQ40z zOWH1df_OB%MD$kfJqi*uLB|24%^y6NxwiH;V!8gK=>U>V{FO;m=qIqnv;c>W{P#EMqYKMMk+k&c1wmUXLs(TUMRqZRY| zJU6o0>hs_N7;WT5to*JoL#uv??v^^~MRo?zj)v)w30Q+2dsyzo>I`cVngx8KS@juH z7u1ywfRWtl^K^H~6jN(8EqOssIU{Wy@xq4^6jgB7F>lRTLsd|6xCHW9-0qluPn`r+ zqv_}rx>87%cZ?!;fmdasq%jYbXniv|N-ORM5-&(~>}lqt8AC)$J}S1;eu8MCT$xb( znB)_O#p{C|p`aqcud~75c#J`-Xs&lNqFRqhmiqfyuBqs1Qqe9Js)$^jlxJ&{Or*Uw z0Ib2)S*#pl4i&ZOCh=T^#OVtZ8Dd#jT)(X z%r#vUb!isNq#hxUXyc_?)lWQ@D1T5+kLhgzXTu-Ws;&ryw7R2QbmuWkHKDA8xuQy+ zJ-bNjwME9~^M5;yzlc<66QA6{eTOQX-ObNDvf3M2Z`S8Oolzak<|Ls@{@+Rk-=Smx zD46V<)H8yO;@J;Z&kn4*_pMTtXRsh+NBF5(@L$QnnR412VC(5%^zV=Qb^oiMz7p?# zhE*)E8C=gJLeQOsXVOZ2 z$I@mr>zJe;6-Um=&h4!1uLEOCucDku;VnX!es*Ybx`=qZE?1ckK ztrF=-!GEiO^9SXT4+LG_F?}*9R8m?qL(X{oCJ>e5q4H(*SXHS?qzvBG_HvkA z^Yzncg&k3Xd^sz}TitWH-;10=aYs3#Yn}%uAEN%nFR1N`4Bm6W_)8hWb-t=8{b9^e zoVL3@tj4MN;jej5M5i3DYzJ|J^?xFRn;!9c!uw>7Bf~O#U;_!wL9c@hLSNcKK3Sdz z-A&cGwT*n~R~}}1TSLB3SY=Gvz1`&FPuzx_TD}v$^iiv*pq$+QX@>CzoY@HhtkHs> zNPEu=_#MiI;!T+JcY9KVU>++>i1#GETNY{JE3sl1p@^oWsf6}W!u>G&HX zWBa(8aSZwP20opg0TOEQk=Pl2Q#CH{P)x|E0i|Vmyl@WAX(m_70^?XF?(;kyW8P5T zr1-G=)1tLTBv1=iRAz#g>X*oU%kKQ6TwPiRHYmDOASQt+&)A#4pDlN13&$*z`Av%( zpA5FGKi|sbFO=G;Rhdw&M_7SA8z)axIt@0(>xnE2$cAMxwt{^fk~lgmqfQD;V)2(- z{?(VOY=|b(iOO#fB(1llcTp5@sj3-DelD84r`|x z57D|n6?FWS6~G-79p%sF@}1O>wv7!_+R+GYT7<--Q?G7B;Idr@_9j8Kn#M68Gh!zf z5#^J<+Qvt;q9iIrGgV#}r+u)-ewD*uq2Gw}gx$YNvf$`XwsRA+V~kow*_!G-EeJak zd=y703o@P1$&~|)wnhzx-@RI3*7sGVno5n;$;gix@=-hjga;GDDsEKXq4E)h(G=@M zINRJRUZR@y@u14nuqi!L8MMeh@d~jpPE1Txw3MGQ0i}g(T-OHMNoeF|Y%P}A zmSwa%r33nI<^CK)erS6gTJzp)i0s1~?Try)8GO?@0lR|If73r>b=h0~*!=r15*L7? za;<%n>jA4cEs15pMQ_EG?2OeJW_LpG0Z~6IA&3w(ibj#*tKzrCYCD~E3j5SJV(FN* zl3Og8MV;eg?@4kv9ehiSmV9xzME@FlWCUb^$tP~R-@QmfRE|Pe zcUX_*)=Dob691CbUy)p%dcs%Ofh!_9fi3mU+AzoI-HbkwaoT|pYgo2Wxvk>gxG5pP z%)xi4Zw&cWDXXw5B>RsstlQRT{M%I6MK7dT!^=bX-?9UFWbcq|(W`)6CoPlzFSggJ zPLOl)@0?ctuJT3)^ z9t)P(iP0zR{!ewJz17iRfo-r0hk;%8OMLyFbqF=nBZcWW;+wqgwPYU%Cvs<|Ix8-8 z&+iD1-NUclX3S=!Xi-DsieklcUQnz-s^}#h?JJ%&w)M>pq!`4^nGW&xSi`USQ?~N@ zr6_bq6sh_+F3tA`>h-o^+DMc30}A|($DJD9r_irDGDo}0okG@$fhI6qCTJ=!5 z2@B^HLuRaUix!Lacul$cFvpiUt_xkI@a?m**sJxI4pV0J3hxbgkgys82yWH_2fJ<% zoNI{UgFv29)}mb(2I{oCq<5f*3HcGe_D~fl@Syi=>xJXd6rnAM>+P{%}zg+$3CuG_JJo9%b2Gw58 z{6H;ar{V{tj`epag%Ix9g|Xgj#m1~`oM578t=_m}uj>CnRkQYNXPqu@F&~0Ce>pB1 z#4Y{Sh(>puIGw|y-7M*3Mf0f@v&t$=(JXMZl`7rJfkA9|$eo}p6Rp3rQv2VW)<_tE zDz>fD%;>Eb=eAHroIk9GCBk8)m*rf~zb}bpfeDh2gpt=gOnVM^V~cDlm8Mkcy|P8- z+^L-P*aMN~HDyoU^us615Qk+5co}lCyu`Q+`HKsy{sb1dl(){v_##0DTq*>bkO4v` z`XgIqlf_mg&H}Z2iC=_mFMIJ{+Qu!hZtLHnzW(N=>J@sMkGl*p#d?PVKgfM0o7DGC z+zBRfi|KYa;O6N=e}`&}#;=YNt6fgN?cCRj)rQDi7P_ze*FiizDfKaE?@*w!(HF#! zy~#%o^%v=5+H^rQd?|EGvdi;|cPJv$5r~x-oBFTl@YNUR5F%~ufsFJkJ<^rwIPHYR zkpyn6VDal8uB#*cfcjXWClgdk$oN!V{Thx?>5%vlN%&0%rqm^>~F0ia5_A(h(1!-EpngUq0D+I-k~fb7bITy+ZPG}NW<^6*V%kO)SSOi`p zMQIx~Th_EQG@87VM3q-34N-plcG`o#uEcsS`<@O18pV{dIanWlTwhW-5yA?F_KD&1Eb6Ae4tooT# zXTn5-uCcAmxlBgS@HYJA_CkUK5GcN4{iZzpk_`mc5gfP1$x<{c^_ETr-EMe1!5 z%`6xLV5;07Hz$Y?Ok5qt{ZHTlXf~l1O@75hEN+T!K`QWI0UGbOXKYzxVAlY*Jjx6^ zdhc+&2z_3Camf!MsxTcnUcTz|j?-vO3?zCbbhTf9P-R5XsS?{!dSpGFqTQ!&kGPoK zZjhU>^u8gHiwxlDx<$=4wMN!e!9A|J+r3-uHzb?W#4ZQsg^W`o zs>Ko>@b@;A=WxJM^$f#>41w?7t^tcH~IaSgo(~h#c@&6QtrhW#`-IEwL2P1S4`c&Tcz*c2To|y z7C06k5{X!-vwXN8a73)M*jG>5r}gttQ-RL~cE#M~2pwa32}^KrI&hzrmId z7KKK26F5d^_z|WUUw%B&n|_2}Q^vbCYZRQ*=S6ypXFEo{w&2gLvUMGDZt)R3E*Y%a z(9nG2LdeG6C>tx^lcYQ%!tH!Sjs78UqN0LY^MCW2 zvtxnF6NIrAfjC}}vnL*=%-Q4R{~s3lt-0xw4Xrf?o&xF6as&^*Nk1@`*F__RWjU_B z*?*?NSwU@^o98UZ&Z2wVkN0vnBiol8ks?xk$iO1;DjfN){vrZnL%$mu12dg&LL}VM zu$AH$B2{7f0hw|sm~y>DG%A`wOD}$P)zgIGy81ywoxa2tv}h`AZ48apdl6(QhSp^F zWC`MeMU*B2)aa5y-@hLo++96aKjcrU?@CT>?NxXISOOk7KBxv00TX7|CDW()3nDVj zEyJ?HRTs0%7U|Fmjy9R(QAUJ_O~i;BE^UT;b5@F|^deZ^+@1Qco1Ul!z$L)ak7U#8 z{bz(q&(yR~r7D7WmpDwCO|h6TAMwsxG{LF^@|Lx4hecH#I!K7V#*xrK0s)kT++K6y z%~<8#?^axu!He<#7<;lrT7B}sTKtoDb6{=7&Y(SYsqN1{HwM2o>i=uD5&SZeXzUJW z&0?id^TRP+M45W1HXjRMfQURw{&97xdD9*a1l}7~abli+j##L4- z0+9yICqOWmML=QYJXc zIkjYqmkb4fmQD*)(8G-Vk>zJoUInMWvsM?cQ;8wdcEJ=Brd%R#4&J*HRewpBrO1>0 zKT~9lc?q=1v;n+2jg`Im$g4jbH8SG_@hIjO7yVKvxp<|WgzH}UguIY}xy>HY;>Xq6 z!GB8Lp}P1d)I0^y)eGnCuj`x z&zR&e6zm-0SdXe$pPrQ1!CSwDTKFukSX5D=XA{OhvjVUIYS}uniAHkVW-anKUfC)&jzGB6ox+x}H3^}4; zP)>}G#7%rqL(V-_>ZPqkHZh>DW0%&2%s(-Ojg$~){}IeD1Oo9pipfk>s#GJchhv#U z1c#Ob9i9);ft0ZgZp3!C)96pjmTHymcdXzI3?Ci+D#CLEyT$ti(?A`{hzKCP9f%1e zExN&|MfDd2s2w0%A3Wd{JF&_0m6Bd^o0?~WgX*xmo=7mbD&&SjK}^b4D|ohLFZp&a z*q-ZJ{w3a{S3??)k-EJY>D-d4nm%8&rt~={c>@D{H9}Xz%7WGgUo2c0EAC#yM%`G( z(uA>Sf94~Gqoa$f#6j78D&1r4_s4vj&}GY^_KJ{c2Q(#f=(lcy$1@=HONl9g(4}-| zrdTMLSHXhvrVl4WE~4G5sY+upxM|%%?s{Yv;-?FA#K6mcAcMaQBtOpi>yw|){SF1m zm*(w5yqY6JI(Vpa-x?C8lDUXP`j^e!V#Z^%((T2T?rDS{8}LhsF`Y!&LC5RIJCu&M zV1SA47n!(SKc}Xln_z8b4$LWIF8yG67s|UP)BSG{b2lrQt8R_P!i3zwG_47X3A#av z^Tc^a$C8S|pb9`)%O6@=iMxkY(j9GP&Ta(+Y~fM*LKK3t6o_QOwjhh6eS)sJn_nE; zj+Hc!zUV>yhm>BFhA6^ZNTz&HVxg|3U_RTOkqNUV7IV`i+t`pyh6}SRQy(=mMe#>D z=Eff-nU_n6t2_w^Z+cEvB`wQv11sgOd_*z#*BU0U{o6Lvzp&-#lcR*~CLIMU*Zw3h zoTlf@ZIDccUs8%>&JS0&SNa{>I$H8H-zhe|pqm<8vSOlNQB#%YD<+l` zSy5uHone_~;JuQP@fS0l8Z9Hh2S+IQ(5pHAFujl3wk%()hvdwzy|CjIOkT5o1l&oQ zZ5XlZc?wWd!|>AGUm!fhWZDX3?i1V^K7B(%1_|nGS1u)}iHMdj%W0t0JyOEgKg8(! zy;*~}Hxy^ejFsp^_7}+Ti;*T@p3vL59y641`jn#81iico187F*jqv(q0+Ax)Kgy3P zJR0ot83w<@vU|F?W{2ydmES-)wt04Q=Ax-_sGWjE?c z8BxuW5Cf#_rHi{{Lz*10{3XYz996W)^lilcmpzVNV`C$H^v~{UTvI`^FE<4IPZYH# zSZo#xiuJDpn+fJT*931j#2?LA7!&L6p z8Tub+Z<^#IisbtGh_aJUmb|IozOHY5(WU!6Nl)4oii6n;6px7wmQT#&&TSKo#LtlQ)zNlzuWvCi$30D_J+^7&&I*C?{ z2U|l1Co;yZW*jMpdwBfHNQxI3SN@5K_7N4bih~XJsgTTMik5#=_R*U$ z5hbDO+7ndMWD(Gm=?)Y$UKIw{^6ES$0*7~6DOBAtw`@)j#RJjbfJmW`F9Dxf=F_An&IW@zkFIWaZVbqWAS2Y)l^gB zxL8`zsH4ZNE_C{gW1TqVYZ26AH8HqGZ1K#-72#K%C;a>F9cs(~+l2-2(kpNV=qm+ZmFJS0>a+>0^=)7lc^Lcv{6|6_COV0ihAu%IIUH*C z^oTe8Vg>TY^R;30Eu-I0;$)A25!c`_2Z9WDI=HPKzqU0aS zcoa|R9(Yx{`nn`XYLY<9E(n)_$9W{zwgvjZx#FoHtd=W4jiQlePgmxoxgle=x(;Gw zeydCI40fovVd&Fd)>~MA%3)lFiEP{eJcRk7P zz+Jn9iC(>%KF*mw*I{2=5s!#wIqvksz%meE+#nZbj0h|d=IhAouxY;JzipE9U#wG< z1IXb(ycXk}7SoH@Kz}iH0YDEGsSK~CL0RowaQ9y{07i}?EB*cIK~KTN@rWcUQ4L>M zEhS$HR$n zSR=Wx&eMY=HsTjqgez12TVr)&oJA~;TnKC#ddzkdA2Xqf6BR`Lt>$@PVo#Z|>VS+% zT->)|#96>N=|{)XrcdmQeLIb~L(aL#%G%>O{-2-Qv4_e+3=?FK&HYS_b?AWFp0t3} z9ry3j=ymNgxV!zzbs*ZQBj!Ms-zw7rv@7mW(be&9uiGG3UcaDNoIXE4X+y!sBVamudfsWWqMq?dd1qZ+ZQ&vDVi zN1SE35oTEY@y~RxGy?04X`>y zL1}BhjfUvzqL~kkV{kLK-L+d)e)AgB))XIZ{BlcKT4UUH^us3GtE{`{)Q}?Ct*%bN z>4W4L=KBQ`wYLNl+wccp7AVUi+AUS(J9YY)N|W@fb&+oSG44rUGb-Al9%x8m^&}H> zQuIBk8a;=$GK-=X_w*|ho`knYZ2z3>QtIZfC}6zzP7g;XYd3czN;`AkHkzy~UdVHD zjGkKDw){@=YSwXYe;><04s<_6*!rrge;n-OC|;>79-hhaA0ruy@o0FIK2 zZ$k>?`0%}0Qn0loGpb|aYO~B-N_cHwjE7r5Pot%~7F?99A)L`pnFLvCFsI*kyOwF6 zQPv9xuMAJzJ2Gq`PLAPoh#?*gpM*CvY5kU4;7p-9uBXxV~H*XPZ=ZmSz?}^uGz39+*BkKeu@jjY=^tFV2`h=U_VoEo^S{>8MXjmu5&goUK!l1JdehQjy2$QtCfvth4rwVwTgQoIR z=}|Y-K7vy*9EWq6+r;o%a}#REmWf(j`?|I$VAVCY;zT#Gy2Bg)JgDPc6NeO@sk~7h z0*NA6i&lfnPi2()+!RIW%%2zMrzcRpS70$1CJ&?W)7j=LoMb-oOSwYfO9F_zf@_}# zp^?vS5B}1>3dT){o+?IgFy{LOBx~-u76fAS!PaPATkj9MJB%$tcUa(t*UfF7STPr~ z&+)h%$WId}aY{S=G8pD_-MFeuD!odrNb@P#SyW+=r2_Wuj1z364yQ8*bC8g#Q$9@8 zA~8LighYR+=7T`VKJmN4svHt3rO{=S`}gh*i~=szRA1#%vL52>r}_qSR#* z{f1C)KAJMnx%Dk?Bs@?*_2m3Eh5BT@>ed`|EKg z^Y9xqyiE1Kit9*lv%F=mak0l}q;x-jvm--fy%CGMy*BGmyv5ZM`TZN#zru>fzC#V`WNnNK5jB#c zg6-E&431o8E2M(=-G5_$_RV}Jd!lUT|tRnjTju4h=CA<_sAmB19kgv6MN1#7DaiX%JKj2&8 zM}I)vXNt;jNbNC>y1uuGT27jh`{6TNN{sGyDaqM?IcGT|zYj9*Y0)ACmUqPrh_Cnn zk5_%88;XTFiU$(K_dy0)E56uAA*I`HM3P0i0OKO5EwlY;_A63Sk1txL9sTTA<*X@P zY!J15!3QGs2@h1Q%VNMeLdi68N}7^S?vf@#;tqR9?mguKxZNjr%Xz}X?M63{zUoSa z)Q31U6PK(~E%H?gPjMsDaT-4S9jYG=MO>Uq{MxWqPGherg3sD$45RxoJS!*80my^$mRZ#F2UobE zKddaRaLSqmAHw?HB3lRv2*4#6YA?4*ZENn7=lmlLJ;#Jq{u}l%rvsJ}bqI(IA16{} zkCJb!f2Co+9QoLLKFU+`xFEtGorB5VaNC^DfcVQ~0L17~Z|~+HFW-EOfO0JPAwpt3 z>w?)i@lR=aPiIqAolA5tk*vNnrDV#lqk#;DDipx74M^kbte%F9=wLFZOe4`D_d{^| zALI)}ISt7|sPpQtzJqp?ZmRHA=f7BeDxjJ#3|LdZUo#DhlbiK%|J$S{M4{O#=?LI}>{=N)(srjM^<*PWnPW8go2_`-couL3_h`qHUL?LuRd_&WZ zYy5hGKTJS!WpG@@`1On47{g_Lm-O{EZM*M}JgvY)#Om4fl_GCdiLX4yIzbTSbj9ND zIVE_oOH4J*+70>J$|vl%m1PL3GywKoL-R2zYJ-FPzuyoRxP4xty5Ax{+_u%+;eV_5 z!B@#3X0f)YjLcMy&4PI}s=mwSn?3RFqDwrj;-SVQoEbnL~Pv}K{w8=T;}e8YrD zZ#B34=yu}RVvgIeJj%`ibDfy6>Vt8s_0`TKk2x#l?>^}Y%Z@2CN%y&e6b z5JTOxm?EP5pzw&;F)1!095uE;`N}D{geKtAjE}~CCKIL7KAx8LtlxSleqM;#Wygw# z9QS$^W4dNV#38l^qTjU|f%Q6L-pviccYb~9BisEU1;WsE>rJ4iRukf_$^^WHhtJmu zzZ>nQ4vgM3BVRoy-&}XWuKg`4`jUf036rYsrh3LYa2?#W>U41q)&y~FS^CiS@K5r& zuFrwTk-z?Q<=86vGYteoFLH(w(D;`h*hh}-%bUYde^>99ri)Ozg@te$v`j`O_kOPk zEt}3?U@vNR5QecKF2A148m9UB8JGb;-D00&s`%s>(Jyn^Is4#>XxFL9*y*nRRutQ4 zer6ZQUB3H?RKLv$Vhox?sA6NXw|4tnpxvm%9!bG-hb%GDkSmr-IaP#!@CT zL(~2u%XcyidO?oz0dt(v+n>G+Z+7bWiDA?Ur^F(o3(wWo|2z;<5084WzSscxV^vQ( zpnDB0vdEgJgIbSt{}iL!a@zB#a5P^^k!)|zsOkcb%n1>3=0!FX6cwq(WCmJPfKzzw zRL?4lDr`z^EB0i>!pcfmQ7}>Y zmw%ht5JSsV=OpV^krc1b?DR$L2vb+aNgF<5-Yc)m=J&?Y8$M*`#?jB2=J&d+N=xH@ z_8^u_@KKR-`f~opJ}(i*jp+_WqGNGfgKrToZh=lmxbpz;2H$v$C980#x-tBG>|Ca- z{?3r@p~%BwPh4lPCnaj6(2-KXnRMRNTjr>jLb3;=1k48>w!hWr(xj zlI}YcjeJC(TX*T|BWwDA%1zT(o=b&Kdofm>lI@@}r9*%rGTo5|c`$(_+z`Q!TNTr9 zw&Mb$9-V`boV1~dHTaI0wpbPKV}IIpuAE*)&x@d%Zc{dC|FQ1l;1F+!^#uSD>HCzr zBc>T{9(GsP%(-YG%2%3l0FI}(&?<#Iq?v8zdt}O>N8D*YR$Rk#5?c^5&^(6qu>;1g zT-yLdbJ%+qH)5TEys8qe2I*Dz28G`LC0_VDK?_CsJ5}#cSeO4|Ht?KuU36VE0;blz z#l7~R`q*_35Mx9+Y2K2=wX)H^Y7Lm&kjINfy~&TaZTeQv?cICKX{o{FNzt_a@m}NG z@Tt8wt_}g68J>6PJl8>b|F*bxe*7t23E%Kim)r3GR0IEh3R1mZWRWa_Z(_HH??un! zfp8PWs`3yeV9SX+^O3LAdHu?9lI7nJ>yRPC5PU4UrS(ubw0w24fABcotO0(|R8H#h zZE5&NjDU~81e6?D_^5=G&QY>;Y*Qto`M`1q6-@Ynh~ow~V_}UYA%^v^2VX%fgsyJZ z0lX{Y2(g{)xyJ8**0EiswNm@0-cFuZHCwT5*yW*$L{76kb*;K+R+;+40yED(^e3pU zFcRUW*UOggP=u!;yBcIL3K8?MwSk18?@+B>WDl7iD=?3HaYBm*BO3m|_l3FjsGtX` zR--%7CI-9^6ys-i<5}ri>00csboj{p@5J3n@GH82a zI1V@PU6-P+S-c20`&O(ooJ*g<6gEWDmU`1iETtjBu5a<}NdJm>k*t(5=Cxn;pX^N3 zr>ezD-}dSf@xn3MCSnDi<~g4}>))^GD_6A82}eK=-^aoY7;VozZ2lnR^ETj1-^b19 zjgpT#w-XAum&rW%c(cZ;KQqmKhjMuN^{lluV-6DY4P4%Dry85RCQy>)M zDR0=K-W>ut(BmCS>$%8w$Wxv4l{K_@_8khx12->CzT!|u5KGPwdCPX$yPd#8Y z>Bpd$niGvx6s_^3U9iLz1dU!qQqpgtn)5%$zxNKsJ%8BiVO*-_<$oozNLI_kk5Waq z5wJh)EVf=-S+MUceNX=<|Mf^=CX=THYrVGOIsIc+KTPXGWN}UZs?ala@4%2(yxYO= z0*i2B;~afb9Aq-HnuASVTjUf#(e6K z4uR?e`v}Yk#?osS8h|B7J=FWABp1+LgyP$#gZ2N62OIwx7i9S6;8&jb?RYp?@40@G z%xh)YWy%a!W>4cO)%_RosDCnGz-QfRqZ7PJb zPcK$g=8;bWbo(gunRa+mXg?6H^1C&c)95+|=Hpavs7dCBjGJZFhKy@I5=kNi?#&{P zx4U#10A7mRiByJkqZ0pt@(w>8L4WrI^Mk9m_%0W?) zVo8r~Ztiu`g>@c>k0co=7pKU&rS2+gf6ztwvF!gKLLAAS1}XFYr?}HV4Q3n#cLRFF zFghukku{Q%Zvw`#a_*jX7So90m5OD7AuCdwZ`0YvX()+>s0B_COH|gqxBRuPIX9Yu z843KCu89E4F)}abEXF+_q&IVAvZm$JmS>jWNz;!^1-bQJmARe7`MiVtH=9jH*VK&z z>_}#2zc0CqTcnO98J*SdP!AHu#8uQv`40i*PXIaFtP^q=wKbN5yBN8M7*|)$uGCGy z+5`u$MQBa>${bC}>1x%Urg{p(130rb_EUQIGx40?=in?vV51=yCj}NLNLwlS!><}) z8C%5Zo$o9hRM-NXS(;iW@TLZG)x5#I955b9g#iS%)Rrgdy2PI871R)2tggl!a&rRb zgDANV^8y3Jf?UJgJ(NAAsImX@YHnNn|5_0~iBTL$ zQD$AwqmMU&hY>(~y6~wI){UN-GRq_xRt>Q*Ba{x(a}82dcC9=;8?X_=_83hRXxuVE z%mG&glXaqCJ^Kd&AEHa7SgEkALP{RT6uU$kBq%ke04#O!7~4wI6s8Ni^q^Cz*w`FU zdAlV-nvV_&+a;2a>-qqy;u3n~JJinxBq2XaPVUAjS84fC=#gk<ZvBtXy;(~XO1IhGHSmz19Q!nQ-!h&phQ8A?NCRX6rb zF`hPnDk=Ijuw!_ZaN$}KE=PZtZYlH^eTX6mo4LkGuSK0rQAXPCE5k+H4Ke&zKb*+K z2v*pLVr^lj>h|esCgqOQdfW^=0|IRHJPLgAC+u-rx-#p3PI_v{k{?tJLJb9)t=JA) zm6%IIN_2ebc$a>Adf9Y1cO7IS%Zah#&-%v~>sknbO|l(%T$|t(BSo=qLnI%=bBV45j*l$Xj?B6sVmgY_5n9!(_2Q z^9#atqVN@Z9(Ryp=q*JrUT&!t7qx=aCG^gATIq(L#cEn^gL&vnDcFLzb~N+Nvi=r& zcBy2rTMMxkTk;^mWvZ>K*|>7pK-k6u%W~WNDEUd*QD~1c6mt`Gm?m@2u{|QL76ko? zx)c0A{-<^3G%?&h$SFPqlB`>FdJ_u0&EZpo6qBw7EbAtOo?Z!rLS=FnW%$NURPMlR zn`x9p>9QDC;uPA1*rl|8L)e(RsTs^fpK4~&tMD{2-wxUGSkvUoB7Pi|Ft)O0kAEmO zu;gIVcwXcbd^&IppW&O@5ZF7eDG8zuGBT8J7bwoF=M6WWe9w5#}<>M=4AMz z)6?hRuVKOQVEc@E+6q`Xm`d9)qTlF?l##vLgJr83kreCJ7(b6o;2jeP&L`C)ji}le z(Y`GPP)K{yXwV+LLSmSjAK1_>$A6AcvsQtu`BN7N@i*CuNG08iqn%tH2``}kzJykz zAWx z?c2sEClm}6VfX96=?uA-h9lewDGnv7_n^)eWelhfu&R8@-HrG*CCQ4QMKB@oIcYjaMXRlbo0Z)lyI@g_ixp zL+qypMZ}R=SjBEz^F-E+ExLKw$&XA2Bxj5Xpg$!uQ{-9Lv$88#9rF?YD8#UD7f}25 z&qiS}Gbi9H1`Lw3q=Ep#-^_8EdAfQDG+&dE_Be5^wpAJJx%$l%EYwQh!8-3?!jHn-%YYZ9gGch-@PviGD9NVOD{uDN=zMh2dkh zqYzf$rnA%-GenrprcRQyB#nX1Y_ANX^)Qvh0VxXo!Xyg7im!|Pq3$bAB;cIXjyZB> zOT62Lj3JrBAf96Py>euLP@&PKVZ1N(rm(*BM?W9Jifbgb*HEgYo>G`=!fY2()z1Ju zkF0fbyoNO4pXWv~3)FA|div=fgWMP;T-v8&mV};~_v+9g5H{}p*BU1dj$#$~*`Y8C z9)50FTpT2ue2`Nx7v}!Nz)|`we9n=iO@aL68Y}#)o=l`Rjrw>**PpFCgD;8aa5goe zxy6JcSN}4lCj!jK52WQ=^LGjRWu$wSDJudgu;!qW2rPvX5JZAUE?rQfsF|6WYlTZS zviMVStY))TC>5v+axkc@wgpt9Gk!L2Tg;9rX3dcx!TxNTp=vLXOhKQyh>@UzO0NCG!hL3BnrS1Pz6Hfkr=Dk0~L@rvjyM zqJ|re&SGPHq0x|#kXYm^zbSKzY-LN7kh&E$`KvcXN5*nkd&Wh5 z|BV6Ql@BK%K~px|0kGULB!kmQ-qh-x&4Vhu> z{|uW|A&YyWo9BZblhHsqW&h|iY$-d--2sHSflzL_4kk89ji&ZzF)H=l?i6@03JPWp zIq`P+hZK&eXi^hpV}yz5p*u;Xvg)_u!4e91+q|Mw)%n*~*b<2%nmp$k4!ujMxu4gG zEA8|y$r&F?f@;1$)B)+jO%{Inip0Wn_*VlGrV`A7OfN~tNG$!*LkxeBYBumFL9JTu z2v&`yG0K{wFh!HNxQx#8l9LF1VY`~Vd{I>5vx5uVgLty3rWO&B_Oo~F?@+hMNimI6 z&6xxxtt3xayGM4@4Mn_!9GnrcdX}^Q5~7nA!TT491uEm{()FRdK~6LbyUrA)@^LbI ze~23#i%`Z=b?shsPeUZH3??w*vyb9wRb?W#!}M;7XN~FY^>B!0lIcvg?9K71?DX~Y zJ>osE8vi1v*tsaHCTbvA;`)@Q;dm4?Z8QC*NXZCjto_2`qlzf>W!ZI_EJX)4(WD~# zkNQzhPKFvR<;>tHex>Rr;+g}25BC)j0*I$n8BuCwz@Dec!hGZx+$E#vJawp8Y4nuk z{!~19BNodg&R4EzV|w6Avu--{NN#F-lhU z*}%8}!m<}ZK{io1uUT?b^PnZLS6jc>i3w+g09S_dv_ucoah?%0`q%|;A1VQ8-Nbq0 z6Lt=r_;saEa1M0C9`wy2LOWb@JtUFHvx|`EbvVrrzeApwn*Zw_pPI{=HnEwu8`B5y z^73xGX`sb=an_(QIJg9+*g17mjPU4K5s0&_|A^ccwsYn@DEZPvkjop1&~W#jz)vp3 zSy<(qfCU?U$5h4K%0(C^SBrvg;JO{~Y^Gb0lON(Eh$BsF=Wq4?gvEkwHa0N*v>$6v7w+ z2Nl%M37?ii^s;#5YuW<_8t)C5g~Z(9FfiQ^juZ74k{p5y2uvj`5ZnQ{U;1l(US6L6 z@MEs27I9J#z_VpZE%z)}+{~8xP@m=)GO!ZG%G`-uNc(A1T%n)8c`@uc! zq`HCB;%-jcHQo3&1Sd)2#JLPI!A%&UIUTX&A9FXQ3tRO%s9J#A?q|b=1Hbvxpc0j} z|It1D#?C4+cV7&kToYz|>sCj}E6+P$)L!>G|3~-sBU@@5wD|&HID1Fs&zV%jp2?l4 zNO8^eL~SFDapSMbOFZ9iwTb-tp5k^*n<%?ICEkzI74VweX=!pWQ4_txP~~QZJ!Pt_ zgRrvrBY1~JI2G&1MJ!22s(I^UU0@XcjI_C~IWu$Fih8;;FQX7#<9=bny?*f;FB zK|CHNQ{Kj+a1!2gV*B8OVtZ&|*`>czwz6wFY8mQ=kIUbhl*DsQx|PpoGZ)7kKo^A{ z6o;0TTirCliqMX}TngRXaU>bkjv(g3WH&(^c zs^E=PmpVV5p$R{J@(h66pn^qmpSvd>qY!Q_M9B(!d-P}|Ho&i$Gk(}&pz=0Yh8gR7 z3=fGv;=Zt0ae%kPm0gtcHBrT*6Vc*uwI=s$trlQa3Q&}mXpnLR77W4NU|blFUqzIGxzpvC2! zVPe$-@ck=Nv4q5)A;ei(k@vps-s!-cH1ayps&r87*z8{hI&&o=%T^#Xe0j*ubXEJe z=-lqk_W1So77Xovw78Ylb)QgCHu% z8XJU8lDL{jpX%rbk#dpQIduIuj;4I-V`IUHf!i{uH2hC?2Ce4Mjd+P!a4!L3bNGxL3Yx}Q7|E6c-s!;6Z0%cS%}Hx zb#bfPi%l%soS>Jp;^`AkK)vPEH{gL_!kPOFpq|yoPWE=AT#}R|p>`SEu4mGe52U7p zP{kbSAtGWOBZ>`*b?(A_O<&;P2H(iT^3q$HX>SMlnZ}qT^m35HZR60pT&$e@UmByX z?FKHMNhZ_ttE#44@e^@2?P!Jw=d%mZzukt%zodz?*DNgDRB`uN?aE+z!*!~gJy%_O zV_Er54n{b#`?{q0$>fl~j*I>-s_{|9O#CBw;V_7bfaWFcgercL52n50_Uzk1$>{>; z`oIl-G!>6K)LYO|E9zL2=rbET)gq;gD-xf+Oz|9BwQiof0iIs!f;^AMiqT{Thq@2m z?MHrPb)di4cZ9`^qP#?WJY$wZtwcTCA01P=^-Ak2D{!t{0oc7^OT<=4eUkaI^25nx zar7q7PRlEJ93;}96oy1*S0t)lt$Xtx75pLSA;IMTbjLGW-gavhiol=+qFIRgbxxs{IXY_4vbhj zB(-SBm}G%rfC)K^aJrhf9K7kC#xhv&C57$JQ#|_1T-2^-UKM0e;j@mCDSt-dm4v@H z02)eOPT}uT?HwGfRi$gPl^xC>%{j9bQ~;I&i?raK_GG$Pwl?$zsZ*V~Lr>G24}}@i zcr{}2!Zifda{Bv4ObVz-7>kKWNgw}(?|oYpTkzaSRq`hdchN}R>(lQlo_)VTcy{x? z27+*jU?1~Qg1F70!zJ_RDrCJ zGceEGf-qVBi)(r{TQsrGna@tTF}Tl%){nuk@i@1r0i^UhT{~*p?i0vtR`teE2MSGR znu=AEn6vIFJH59?a#fZ!s!N$@-fVVg>*VE>;VgZ+bG7xC>t#K0-A|HNg^fV)6W~<~ z^N$NwJyv%k*nO7xzO7GXg(hl%#rItZLzV2$lXmPP3^x7ZFP*$C1@g_7eHfWg)oMg| zVOivsgCvV&`Rp_6MdmpYxDZVboB7xVr0m<`0#t%Pf$T{z_uEe|?}J#>^GhF+t(EXK z*|usJz9<u$s&&+KOK|oINGBm>I4?yX1UCzNS}xrE zO7xqTixWG4+HTWd+HAt1P5EanO-EZ16m5RQu;L| z&{g4Wt7a>)&14co47ev0i}Bhzcg_k!Hq7rdZMy*E2yJ*Cd_Xm)en(JEVQI+4qDu|J z3^r0`s_fot7FvANSE;_zpe_E{L)9R|_etC~25Q0akGs-#HGWCZ@H0s9oXxged4a^h zh&z~*yqEO5OR5Up5bCBSEsnW6<6^ip#gnmVXug8_%<*A`o3|f)f?f-lLojU-Frr^b zc){+TU@W!>S2*A|G3FStZ{6qZ*o_J_s!EoSJcLTQ6zrG?ET%7(ZiFY?o)8>^wXXa} zhZY2bf#?B2Fx#%e!cBg&6rgEk15`4LB{}#q0xIbb_U$BgEQKE+q+v>atlU4ZYE--@ zVV7AgXf=<-zMz#&IJlO5lH#6qVqk8!C2vNZq}ZA@?wTt(21^6y+T^QycQqD73_SI5 zGmJ2=Al!rM7jydbC=yxx$t?1{Je%?JNwb=(94t18R{ng)$r5Z!yWlMVsd-Dg8R8_= z6gWmJJ{W2l6aKv>x6ZJyh7b8v7K%cgFBtEIA9?VF%b0O4iI_7X5<+L;;rVn1BVG>iU;^JOu#wQ@M^Qvox$-)xJidpcv0hIWib$c6bSNW5_;dk zhg4mifz}~p%(?F(r;fEQ-XRedZxU+q7Dk*5L~-VA4-WTK@ebX*y!^qt)WJsdRkD_ zWV6~)zgRC&+D2dYb*?(`lh#iq({?9MU!H`+R`2|#MccI{c$;T54W8f3zVOq6xLpJO z@1jmw`jVUqy>avxrEESUbJ-yEQ=T`C@LU0l#Fy_EvXp9q4f&eA{#^I^GbMJ#=z#K@ zZT{Ziyn7WIxrtS>9D~2Af2xxnVOX+n_|_?4(WqrQ^XFuP-c+4gUKMM#|DG+GWj8LM zD~+vHx`_v#?gG~?$)NDM;z7W*jlH`DW*yqB-x?wMS@59*zVZL))XfpOzk&AhRk@CQ z9fG}CN(7%O!&QPeTQE-bJhw6nHU~Gw2do7N`i{Y=qEmumHUW1~+F5-~U3IicNw_N7 zSpTbGC$0=O3h}~J!n?D7WPcFj$7JQ*^lXtK9gBXt%_mC>|6%IMX^uKb@>Kr_sQ5&# z&;#UDb~tMAu570n)j3US>ljq}&I>;485u~w-lh+*?jO}Aa|($qbZP3?*@3gb3?Hqw zp}uZ5sxs;#;g|g5dly)~tVARk=ZE+r{Fx{HYqp8yR!hN?hZuAuCPcrS#uN}k48vam z%RDxg*i=c7{DBc^Xjd7j$_fAMdFq>Pp6nPJ!PKV1BKt8{K0fQ7ulOBNu#u>p=$|z6 z_}=a7BOFSXv%ei_jMx5U%*j%j;?ekzF7B=TucREwEHD6ZPlR8w<4>v^TwT(?j~|g3 zG#ENy-{fd-wx=4vZKSSEdU;20Nlq!VJNXFbY6J3*V@2J}6?C`=(I5n1<~?7F2WM&i zGL~Uk^`+idY-n0DILx^kCyB9^HS@U=QxIxv8h3;T!dY4p0|U>TFDW;4{zq4ef)L}6 z{u)$y-Vsd4&`g2;AW%vw^4!CL2@$wkcITpnn#Ui4<)n+OH~n`U_pCkM{*X6AGC8|E zWCVC#8GBh~q{w1!o=8+%jq3L;FPgUz8u|yx-z?vDa8C`8*x6%oZ~MkyA$eaAhwi%< zQFmkbPYUf5qLvIQ5%u=n3ET=eBU)*nMrxQs<(Gk=%f*o2yMtt~Zz{xS@;l?a7M6U0{#6 zRzbpXg0~B+dAg}4C?m{CO+ZxNiCxkjP5BW=Jh#2EceT_HjifukqR+nRebO%Vu+thD z6t#L!MHYUx58yB{7;*Fo*o+oq3YE94IUlYB;9uC*Z^Z>3v;0qsin6S+6RpNOil{)g zYb*M$A?{V$l?j@%l!CUo-dx0eQf^w8w0BO~{PVu4yLj>tF}O5*@cX?Wf1iAB?$SzNJF>H;ID7<1`Y5Tb+kTTk0O8d_4fy5gv`U)HeqY!rw+N zd?5-ELe$`C)tN0jzQML=v@pq%<{3CXb08Q2F4cdML=9?!QX+dz^@#Gh?<0Qo|>P{S=i0)sog!M8`Vj zPm>lywQr^tmvXRZCB>lNMRgNAX2Y(z!+A-=W~eHC8KQh4cAHB=&D3glJ8-#ptkk|8 zu_YT`)Vrabp#Y?xDsfKoovhC$pK$&OP89$#Kv&l~<+%Td_f+<`5k-!NR8L^3uT${A`hReTDW zeNx0zIX-l!PfJRS$s@CcK-`@cBLfS9M>RHG9aMQnu4=v>(n#6cR`q=JGwJG`K_~uO znj~w#5|rsxBeU|$Z>Cg#vD|{>L#cI_jz7__oCw|iXF%pKoF8=JBWSo=?SxFD967Cx zl*cx3iFI9yS25oNW2@}AtO{nGNR_^dvWp^(Ew=KPa=vznpr^k8vqWp}af-O_mUyvb z#AN6+My!;+@Nh>}&;3)&$l?VXu}toq*~BjCOyvAbqrmYmbWaL@HXS0UCSq>gCBbk1 zq0wV_A%;@Nu^h9q@hH(5O<>F}Z*C0j)Yj;GmRx=Fl1>+lA{LMWW@aGSc5ur?1Gj|G zKv4yxfsnh3dW~gVU6e>HAPv=pSg%o49yq*|s^;D<`Tm4O1ipSewQ9qAF}Q``;LIt7 zSfAK19f(c&UX|P1w7tpAM{pQX|C4Scq4c07E&jX=%s`y$YH{7+=wfG4YW?v}>2DPP zmD$Q-0*=yAW#*T&Tu33@bEcg+ub{b|HKJV1W z?hg*|UAfA;yy{#kaKvhgkRP9rY{M2Q%OkwET&>xz2I^Zr2-l`vHubCx?0sgY`T{`x zQh8b_SzfJ-XbA(H9&=s~5uKJDtsefDF@$lORl92tml}SldZ4oLB%uFcPjl$i(8JCA zRtbBf#o=|?Z-?JbQoyUOhQX!)g2kY{Riud>gk#lGd{I7xfxj=1HyBqH81=V48&d*l+s9>{~#ZD$}eymSj; z8fpF^@T68mifMQ!VRDjz*~0wdI$6i%X=j@aiR4BAvSxt)3pz+ZuJj|iE7b89_0d#yl}sQ%+E*JaUPMvcou ze^D8NOYZzWO!TJweCdo02c2pAu`e>~LnXd^zArLs*OZw@Hh1uO`WGu?qrKaR$>yT( zdnInrsLf)DF?`NQYN~K(3?X;Ebq+K)7c$|=WKx)n0m(9(5&Arp0u#-s*-}@89sBP# zOHKM)__28s_BFYIe#&Z{0yAu~8f4AY_q1%`J3K=zXmSaa{S(9#ahR)7pV@{M6y%BO zHlKUKl#BA`ZH5qrlM?v_2$H)&;u#6}^5-%iH~?uftfu^_6PEpz{=j&JXF^$DhfE-} z5{ZF0valo1o|s52FG#k}*M-f6F`thclYav;P>1%^ver9!Tlv^1XMOHlOd;}ZbMF`K z&@2YkI|Efja!k8+y~ItDi$23hQ-G0~hJDW(8xNn?p^JteO#2E8qP$RbBaSpi<5`j0LF)m+yh=5hq3*yrsnB%SkR;>gcU|6gEm)Uj zUsnO!wHKl}BmI=aYoy|%WHq=)I-ijcHAXCnn0DS%8$vJkb+ORm#8~c8_%Ly8SA2QL z+AInn*yTF@c-&2{5d9usOMUdY$MQ)UB02_c>TIKu9)WS(Fair;`tN1QZY_kwPlH2% zj@~)GPKc+BkAICHeAZbV1%1ncs#_!`9>Nw@bK838r9#6`irwAazDaiqRmr?Rkho~< z*Ql+R&DBY%Ns$fOUfyr=4&4#Ch=!wA&SC+YKaom`Id*^l1gAIOtI_ zi=@Ef;!#<8pT_Sv;Ic7cSsL;W-b8p-7Wku{ZIA}4&sp}E%>Dz$?LKVAlB;;~d1c?gGHd`r z=1ccDwE~7ZqVc0c@10h%{Gsu0-zjP{D$5TF@~q&6bBSb*s?`qc$HZp$-tg zrkRx^2ib|@|CaUl1^2s4(a@(VB9xJLTn2|xg)UHFbfi*nZPqJZXE1$}d3U_VISE~> zHBh;CG91C~!$>5*1~4V$v~DsGZ0{wp)A$(bWWh0E@shZ>hpF89x)tZVJf>q!rb?ZnF2~TM0k!L=MVjsJ>P87h(&@a+jyi4?MO3?p`vIZE7u*~$D;2Q zszU52Q6KD2YG%s7qq+$w#L^=(J>wurms;XvBI5qy->lCD&3$byERChi)s9FCY+3_a zI@&^u6Lj6WcMiKP#fp1NUy1t^5&S__#GzR{B$0!;C+k~8z97ZS#LXC4sSm#5(V=_H z6gPj&_cty8(O|TAdP>@8fe_lG(Ge_3KUaz-7ewr|gbXNzW#kwGj;!BIjBE^z;D4-) zpH<}tNNw@nGmPg+YRudf`k7|Zl|p+ZOo@s0bVF8nMj*QcE!^$I$!l- zdgfJT)3?4Tc`x1e5vNw2^j#|j@uXZd?VlABGSrt*hXlh@KBMfvczFp0_j|G^t6WUu z;6g4{&PBT0Fo-~&TZZ)W1YW&06%Mvh49^Q!MX^$-jdCS%?q3BMYQmD6lfI6LZX;NX zE>4(Twf5&_SaqbpZ)<_r_j&bOVUyh?N>1estGSZaug=a$3c)*~VA1p^AzYp-p_o>CVZEfN-)hwa!(N?E2uf?tB3&q87|%o8+0> z3ERv}0Hb*!jg6o z?f5BW?x*5Dp*wr%tjeX4{NR3wMsT!=f!3c;O8z?$goxoq6;;o8Dp|NrBg+@V3M$H$ z$Gf+`;!Wp`x9&}A8O*f7P~)1u%d<$fY02*x+WhkAJv zuayiK=Le;*1Y^co|CSI%?6SUa;DK+q%=SZm%!pV%XFKB=$QQKcv_c(JlqykY&)pl9 zGPfuH7Om>RHXoHv zOP7mia(P!vuqY z@XcTbJ2Ju=7NRUYmQ(7$*`qJMxCwyh^R$1i_0UT_toztx*w3UdxV4MDYOMullydY9 z%BZ+t>NuN?pr_TwbxWP3IUbu8ouQ~7tQyFed>gWu*dw3g>eI=dJ^DIDX+gt+i{m=( zJ4daO$?fA{JYG$;aJpr`06RYzG?X`qWQAyLIOEU~-0tomXna4{7z1(IpE!)cPGc9{ zj*dh>KsHq+zj0l>>)ql$_{mrkY#K-o4iKEp@_fpL`IiJ6QQ{oS%RuXeNlgF1rUGwz zlN;CqO4{3+x2mnws5`&18Gjf(NJu2# zAP_?yD#6U!K1tvM@|YR1`cIq!9nK{GqvKTMKLEVk(N%Y)pgP~iN_few9~&JT9ZCG} zA!7S!N4c%4ykA*5<#YOjL{%5}7nLC##+Y6~x)S9EF`xa{&uWnT{D*Y{~2qA_$d!_q~6k@HStjU|5%&0h$)@UU< zxMgB|FBQ{Cc1OiXJuo&*LlCk+Kg6xJ+pI?MsDer}UXYH6sXj0=l1Ae&OcWfLG*5AG zO^(i2x%G2kY;W1<#OE;K&Uas;3>1sr~ zPY!2*^F^pG4WO6Gvvq~-JJv3O)U)agyD5`3K^g2@|MLZJ5#CRp_YM+dNXa-MTkm;X zad7a4+{{lQzrA7saiR`8w-0eokZBG(Ai_odbjUwkOa-^7$PD^)q`$fjC~4kNT~L>p za%q<{s-%WybLVyxWp=;K&O8^@!i6wf?i_LycsQi_=%ser(!Y;c|Iz(Nw|xVO`VB4* z@z)peWqfS8Bs7=Beg-{FVc1E~b@%E$f$tR{6-bNCuMg;-*7Dy4**55UT#NTy+2m2} z`B@#?cgo~(bixsuo0)3>Z1mBbKe=$aju#X4OOEz+`I3Zemy*^cZHqDFe&`VqS%N-5 zTh&ywmH$-l(GO0xsp5$6_)Y&jh5saE*-0#|?LK(xk&Vxnv|(l|1`FoA1q}QN#-I2Z z3vW;+F3D4Ff1O+aR$usf=VPS^9_;P4I%5JKD&5d_6tf_|1I=Y_Ael`(<0C7x5)0*w zrkk!cn$fGi{=BcCCD($6g1&oQxLtR}Dv9Dd z8S}~WS8eb^p~a2oMIelY#L)y5Xs~TV^UFV@75xf6;JDp)Z={m9^9mV0KhW-(9c7}u zGTvDD*^WBuD;F=c#+lq4(5BLYGwp&$Z;|@Q-Ha4P8LkO z{u}tbN0DXD;CkQK1wh`N)jI)%$AZMNvQ7M5_$|q+Ek1vfdS0%c807Oub6iF9hPDK# zC&9R_oHHuhh2!X(&xI9sg2PheE^KWjr~99m6v~hys3u!XW(Irt>_M|sbQcPAY^YHu z)iqUrI`hIF>8Oj#hj-+ps@7Hy>EoYVB^4^js z*HFTX9!>B!ZYcF5?ReIm0SrQXmY7~g1%zkJ4I9@SHJ_-5CyDnEQjji)T={9A@wzoy1Cy56UrU$C|Mf}^6xl_e@!|9x@JTB7UcOZ5zLZcI(AN@6gTm&)mb{{VTCGQ|e<+g!DWp7<+qglMp9Tt){Hr?dN4e&B?j@gIyT%^#~>m6~w8wXwHhIwOwlo?RLb=SIowrkWZ6uexJ^m z^%RPK>?r^(%xrep=gE3L&-~(Rz&Rtv0w{XNu%hrL{Q9G9v-^p9InXO7c{nqJ>@(xB z4kINCEn8Wkqng;NjD71Gb;bu>fn$w~I$xM?1=gJC%&EZvwEHOw zOz}tC#6eJsdN~*M+vTZz!PRkk5{WK_Wmo3QkFOe3@v4Tq!xj_EacUM7G@T3@M~DSV=d z7*8|K3%pvPf;-VFNV141lt}$;c)vKab;MNsSUGf(B1=7e&Kz)S4E zF=NN%?n#WDX4PsjvojxdQ_nP-ZNWxrmhdGhXhC;rP*uLDPS7_um z4$%ii{n;uS_|gdj+e1)?{YsSyh|i#aP-WgU%3uP2FKKTi1@F=mZ+pVWiwfk+z&EQsTjh1QDF+<0-)X+M zs_)VCJ{tM!64DJ3mTr&I87T#%a`b-}xmV;x5bcH=)C)(71ru$Ak5SXHF>F9flr*%X znSov8-%A#sz|7zvR2N~Z*!;0iu$e9Ln^fwCE9wTYd&@PjbbSGQJ!1A14!vqGf%kBi z<-k$rJPKg?DeeKWo{4iB=(~J16m4K_qn4Yr3~ydM61~pfWDvX>*er?7$%c^OqJHqg z^SN1K9`BwYcV&hgE7FeF?tWoRX))L*YwIoY!r(S}%9^uxvPtY}AnTB75MCTjYXkJi8VPV^%$ycc{|q zK690RNVcRhDvSjYDti96LL83_MylAO-SIh{PQy*ji%Pfrh|4putEtyKQ4EM&P|D{k z)7*=S{=}FZpqx?@x_@TFx}xc;szE~yy3W2^k|_3$Lk7umLOcmKEPI?i{~LM+XTR2hPheP;)IfnEg9}FCQQ8S{Gff@xzi=T z-#>ouOWSd4V0dJIY}n#Z)Qk1PU^-x;X@G}7!8Vb-<4ehxX8mv36pig)S~1aqwJi@&1x zE|s*yMx`F+kOIPuSp>PT5E8tiZ*)PO zGLJcn*I?6!*1Yc%G3qO^>SGI0v(J^kUg%47kOlBU#+`-YSwucF*(@ui)}hKepT#FV zgRVS$h+@CI{>x|Y-tY3?YRhRwpYJtF$d+{m<=*akih$F`cebA4)8_YX`gdpkN0+P? z)%{UDl~euq?IhPb?WUrZPdR>0q)>R(_8+f30eD+|{?5ts>eTtJuZ_r8zs{MA>!5%~ zoXL-Sw2pslC|sZUb2Wk)0^p2Z;eVp3Y(Kxn!=Or+9Hxph2)C;%=7>r?xVkD>WfGF;c{XHbX#TA%o4IspXjZh zUj_HUvR^0e?ErGW9xX&d)g(UX%Kt}qwwQJ&qv(!{#6%ohZHt)Q%6(s%-yf3)UVuJsV z{R5d{tVsuV>=4tZyR4!7Hpm7cx&+h8Y2Qwz_7@ZF4v=$M7K@CBRd;EX(QYz(**K>Jk0(%j3872uSVPTEOQ!oFG{L~zB!uqT0J)jIcNRyD{ zS(TDCIP&-S_{RbN0o~mY&FMZn3%^$q8;jV_Ii&KTO)y~=m-956=rw|_y)oev@F}~C zfX%HH5tqBeXG$&8znZ=sVo|;QS5zxVVxy>e9{ns#ZwTR2Oo+sON$xxShFA*CLcU-lDQzR^7+N5wuz58E8+^JSQG%d0I~^G8{lYi{$+o_5rKJ=$qW zQ&=>;(>l6=$?y+_&hr0x$w~hTz@jjtbMSj;pI@u#bMfl*n<}R-&iloIiILmc{%?Mr zXu&|Ew}pswKbniz!BH#BQ*vnC}JtO`5A# zW?Zl)I|QDu*=SBx-c0R3I-`UY85Ivhd$@O=R{lj)2!?)p0)F>}v1lT-`i>1tCg?~S z%%br5wS#$7eLZLV7@t(#`8$5P53USD=Wl@ZKANFstRRDeMZDaGg5x!#=X7et^w|qS zHx<{Hj25FSvfUV4V7&ki^WoJ+JaaV0s&CrrU};jVn-LluEq~DTsl_tL)&PF-)E86+)^qNWDp3&#z zfJ&tdJ{kEVw=n_Q7ZGTL?_ILt?(wr#gAFn7`zuhs7tc! z%3tAe)ie5RrX$fC<(w+B_3;Z{Os?+hKf~k&n4dY9dWnb@&dPVkLD4i5YFl@K@DL-o z<$f#jrgx79qx$lJ%*0Qh6#w40U!GfDy$H!C-r(I-tmJo9tuC!*y2oRF*XY7=brrz# zqV;2ykRx33YcmC|7is3!tJ0i1Rk+N*qn_Pwmq)RA%hCez?APU^#0zqb{yJF00xwA$ zA!W;=Ca!yZyK?UQVJa0q6`sXO*InhB%ZF^MNh%K!3X3b>N98ZLU#oa3svhV%IsNpN zw4ElRW!&IHm@fmn_TLPP8jhqGCzq)Vhf!%H>(-@ztd@1W+H>F32rn-j-(X$4oX?+v z(al?5${Y=!j+x)uBb#xm_Lo1A8u{#&15}8dXX#mexTJjK+EH@s35(LP>$&H9gWt%cqY$qff%l_q){=ffb($BI>a(VuK#QO*P+uaon z&2ovV~+#akr8NS!PTpt#{?aNp-mDkYQ}2+Whrrt7p}Fo(dO;VpfCa z0&)cO|D&{@tH;kj|G$9ze_+J=3fAs%A$|WV96#5V>q0)bg9@++&@qJYCC%#DCAeT< zhGjL3{RJC{hYa~Q-G|T4H1#TWxe703n0SXmqs+?{>6&E)0ism~fFHiNglW%Bse2%I z5I@JfSCFpaf$oT+(vtT3wZTVNpe0~Hx;p*aHKlTQB@WPiu#67RAI2ftPFs|%Srtsm zG&l5edD3Am@S2kjt@>2Q(^^u(9KQnzf|P!8cbBQif`OTBsN$!Pmku~HG?!|$pqU+e z$U49bY9b5Ck27)Zt7M>c5Qfc{)Nl@&X6P&K@|{N$73SAAVFyx5_AWARn{We$4`~Zm zX{~P;2VtHFHgy5e1AO?l7~mj^OX~Cr5O?ekXb#c2q`r|~MU}18+C8wD?mjTAJ!5#B1GpO5F80 zJ=cdaL4!?!rM!Yi6(lk4b)Z?Lq9Pt9MPBcRgR5eAVeo7@{{xj4xEoT(y4A$NI{K}8 z3Y<))wV|<8;%($SHTQ&9*Z|kf&_HT8`nJWZ^(D!t+g) z^>(4G6c*Lt*xcLJERPFaq4*LXqob=Ad~sI?xeM=Bf@Q8aS#^TrBWq!Drb6@6@9HSv z62}@bf~|9i&3Uu&JINs%1k9Nf&RmuM%De62pwK`QCifi!+I!TDp+kvu>Sk+yw5L=Y*j*Vug$yUjEEnlin^+gORu?I{U^%)nsWeRdymYhf@Ua9%W3tZ&bifvO$I z{Ok?SPu+NKc_!{6^uRm$rR@L-d_+8Q!{olz4<_pwnzq9>5(c9ch4d_i%U&H+(&ZtZ zu?r~>rx4tG?po(j09l-GoteqFn3QRc@fZ-{KwOqHvrOrGHz@lkQS+7^%IGaO2x0XQ zl05!HE%L5pNS>`wZTu#X+7f>r=2%cv22XtOwn%W(h3xR46n<`U|;;we)b$c4ykrVH_k<{7kvqtQb>3cE_h6&Bl z&bt|F+qlkT>(m4@Yqva3v=7sTSGde*Z9%{#vFx0)rN`Dc-;EHZZac~Wt-%xH5D#9s z9T-bMnaf}8^~KHij!b;#P#0N@GhN{>&c9l#IMacim$iQ_m|IH;HbcYY@{wW;v^Nl3 zc}UAwrLKeRU|{*65W6D+PavTo=N8a*h~-?uXw1kh9C~|C*rFv>lAmxOjdptt|GnYj zKeV)c{|A=9ag(^dHoaArMxc&m6h1c~tiY<-%}P0=3^WhKU;~_fXT$gvp)O$pLMsAz z<339K2DiR%76XM$K9^$*vhfL5U6DBzs}UEi`cwKb_5Sw)<~RgG{$0i&2Su0`v-TIKm0gL$CpYbB%|z*8@`Z*lrDoY3M-ie5ma|x)}muLNJBYppc6R1M^e?5lTzoYsB0RtzbKZ zA;KRG7k?ORf>L9n1yqn@P?u+Te0+}x%BBJgk8r{r$>NG&Tfz%7Rc%Ns8(>X}N*#69 zXCR8#>yuw`d>Y#zrf}{Lz7o!7qKeBa5X`2eIm*f)C=Tm%E*}cHQVBxHBATW%yWy9a z5nAu4bMbxt90)RZeB`;bOW=Ldqi>+_=SjOCphn|&VdSMKnv`G(0?EtC-tFfAz1G&42q=@&bMSi zNCD8wm8Psa&x(+X(_hKCoy4SIf_|8SeLNfi6nhK;tO4aftXBDvS_?KSS)gw>g|mUe zgi)hZWi#2jCznBxBFAmmdtD0(R`?Hjd;b=e+Vu=Zk548XNdV2BUY+*?bk?9a&POAh zLkAQ^Kw1#qCW1&s3pNQux5*s3l*s!uAI+*Z_0w05* zDR3P;t!XD_a(DQK```NWOf33;Gx0ef{{P9u3X1xAR{ukD$@<@1{6DS$kiStGYxcK1 zC0?;OHWj~pSp*8by6Fmid0+`+64f&oi!IwKM>8y<5E}x$4 zjPao*nr>?fzOTXe=>UB%!`9Q}+ahrm#H_LKh)PZlpt~ zwl=U1pM8X$jb(_3OJJ8mOcbpFJLSwU&n3{SRPC#$u%r#bj3Xj?`g_YxXM7}qg99D^ zftfi!!*J?xMS%#1kYPUss!#x03Og(!=4zH*HjT$e;q&3CvdL4r)^3l&t{o`bY9YM% zd4i36pZ%+18mS&%S`CeFFL#4o9JUKo$>x<|(o$@MA z`$f9XZHt=z0cwH!QlioC9o!!m!@5a0SGC9!;iT`xLQAZy4#8UMh1H*YSK%We?ESz4 zExAn0Zan(%B-0s2afpxL-4_r~Tse?keA|dvIz-2cO-*U$%S-mXHi(`45IYKo9u{<6 zGCc`L@7tk@c~#5K2eT(nD7uP~E^{YWcjK|^(VO#FmYZ2g(RVMWF;9yGQp4;(0xNx?D;7 zCnEU17#JxRDh|oRr`n@kr%X@$IT42dg3b~+nP$&b}=qd%VB2(kW9+^lYo_R^4!3i<4!igxw(=)NE=}3eEPBirkgoK6x znws7q6csYF7&+bPVL;okw~<`l`uadL&@!BWP?)1kq1tT_ph7ex9*d;FAz6Ut%LJ%# z3+1kUFaj4dq75l}i-zC`|9eRhnzAO`3bcgTO1$%Oz+>2{rDoLaR+Yl@ttrBfq2@zH zxm*%o-|7FM>a4$-aNoE;x<-u}UD7#5cY}n|9iv8wNQZ)wV}yW6Y=m@*NK1*pMvq2H zM3^#xkCdpiK75}ao^zf*;lA&4uKQf?>wUdnOvu2%0Z}tE7gi4lrFl-LL-)PiwO=kw zymmjC7M|zTj7`tApjOc)5tuX*Ca8%B>Bt6nx6<>0V1-IzW)Xee&;UHo53P5&>-5(v zCwZXMTT`MVAFVPkq=xj_T5&JW@u=(>&nn2STei1IGUG)73k5?u@SXry+7Qp?Ey3hTkI?72 zF({CdvQJz0y3o>)C`muUH#)GyAh^#*2qzm(V*xDmj(nqF#=?+hVGqfy zH0KR_)X*Z7v6=*fa_})mcjg0@qvd{W#5IU>9`tKgwA*f`;e!) z@k>-x-`#Zosg>bG&6peVc<5-YB-!olcEO64zVyPcCc~TUJiQ^LA6RZEJ@jFci9BM?u=vkd2;h5r3$t@ z?@T_|Ha?}@@zGjjTQy6|e_&0mHkyj1HTZ0r;z7E@q>mFu?!NgF&4R`-Ymb>EAb)}A z(tKy-ww-FdT&oNc2tqOLTJ-5;uC$GUNZmV7UwouFNV%h1(Jbv=0LT78ag{quYNfP`Zc9|5p;u}L%QAt*7++cbXmM!5!xvy@sN#1`wd4DXKGmRK4l=#hhG4-VAs}2;741CThdlX;>qvg zly^yia)q7U0c^5wcm!?xQwQ{SB=&#;GA4Kk zmgQj{eA8987Zzi@?zIP+j#PvGaEK)yTc%OTWY6T!q05aL&o0qFMh$l&nN5D2vd_6y zdU)h-)yZx=*a8oSE`5!}CP^o8li43D4lP*Hd6d^Fb8$gK$oP`yJzOT2T$;T{7=Xe0 z+w;ILX_=#8xc8HGLRm0U)w2@WI>Sc4d=t|~IEf-+lK^Vng!8*DP1K@w__qrepHC%X zUHf!ZOJ)73Ydv=tv}u~3|K8w~9Erb^Esk~}^)Y4EV_0e~$a!!_ywatkTw59Dg}w90 zqB%T2x8Djpfwi;=523c1+=>l?5kV%1Fz@{2b}EBAMm1iW5nGzl`z4N`bjZH?ht^pc z{w@#-Ak$8oQAU~UNB#H5OzAy@UtB}YBT3S^W4I3WhUC*mGh-U5$WTk#!zQ*(hEjuU zcFcK^p0fx+m~-P-0)i6umwXkaDMZu8TR;o+!&_P<@{bqGvf3vtk*fCyk|jhJtw8$u z{(|aXGcOP+r&^-|T&fs7!cD1O#Y>pk{wi1_!gMebC;O-cShb6heb$c2pUeD-^vbab zc&ow~Xv`M`-sNn7?=!npc3UEce$xVLda@y%g9Z(@c<;d_x)5>FjTXR|EE{Pc(#p`g zQQA^{OrN=0flHWislhT++Uf7l%td36^5kQW01LEZhi*mXS$~ zW++L6!3v|f4JuafDz6Ga|7PiH_kUj2{&#G11FahS9DcjoLCye3TdYN z`E{FS&t2_aqsBv$d!8xYu;)`5(HTHGI4B_NdiYllu8Oj%YB%-5Nf=KnVgDlG1; z7sWdA4Z?bU$Y1`4*7UXVWuo+W%cS6nnDJp{7Nz#z+9wXm2RUYt$W#zf-iaTgD5mBDeH? zvG2b_d7jLS+j(SFW8@8KeaVH&LN2j)`_c$5{bmT476~W|8SsQjRBZDBD^h;Os^bM2 z=C|i1s1+;)2?By^c!UqXx0BL`1BTs8 z!Q&s|jLqMFpA+H>ib9!|hw%wys}V?Un4IQOwJunjb@t4)o;|V%fBh!{3TkVlD>vU4 zd}AWr zP+7W#C9_V=>1_68yhhO|w1$orcJX)`#0ZMtqO7;HPWW-OIDTpeI=EyptkaA=H5s(O zW4P>4gKJ_4G_k^ifH-3-K_MJ|2KTBf2MS& z4kuh)<=DiO2Zn`*EM&?m39v9nb|B&OGrc&{FT^oH?N|gW+e}ngWZ#r%eCh=Uw zbcFA~qifPNH9m%g$3jCDZw3okDLQ=Qz7c%oVO@KV977Fd++n`6OG_c^TgtpKiI4KE zfrB~q4PnNFXSaO{N`y30P+Qr`o-O#33eu-QyaHDZSa9h=Ho##X#SYX0KHqmt$mC6a zV+AZ)4q^@E@fCcZB2Bj#V~r}t#z^e%@eYq~`$Ov4ggQYIU!>s8wjOJ{F-EWgyB zXbKB?k_{(;D$62i?5U}DTShj$`sWd$A9>t^w+~p^6J=1C+(4Xzk3BTIA-uNHQ9Fg< zr5F*4)x%3cKC5by3&pe=T#5Pqn~UlqEAN(|w%qWrg^qfOXVruC1w*8U$;;~Q9MZ2J zu*U#~(JIOX3L)PRp02CF@7p&zqf_S4VO-w~hKynH&Too8B7eyrgTeXp@ke(FqR%lQ zL{g-Iu55qWGJ4$J{s(TFq!z&oEe5ua3|2d^2zKJ$JSz9FX6Y_y!jX~$2OlVV8Q_*q z*)RA)c+vjW%4q&9LR$s4!Ga^0FKLKzo#5Iy#CaRY3uiHWEw@w159vN0mG|n1ERQx4zoflHf%t#~>5B{hI=Z1|#TFJ2SR3+krZGTCTC~MotHvO0vtH>#--sy3U!LWv?R zhVx*{EN8rzM?Rb^9GZe_?-(EiOksHNe|gt8XlS3NT|JBGqog~v?`ZL~Vfq50BU^|O zJWtTyF5S8)q>CMPU`jKV_O2z?j(=yy6pmZg9epxKNI)9%l?EUl26IGcBnp~X_N1yg;94%(*JhHuASZ7KJt{q z5He(`B?{|OMB!-QQ%`LUHq*1On`u|lZ(mcb@3kD9Rm`PdbtLfrXLLgcAzy87F{CxH3}S)xInGwLF-+zV=TdXwAx z-%#1rdnzDBck(&MidBY@4DToppF(#^#=kCtQp{mV(ld7tttMAKMVv~Q&RZFwp>m!a#z}2kgs8CwVy= z`mi|9G^$Xy%Wpck7gl^!P|GMozaElZkBDU$ew)F5%S6sxcRQk+7&vhD{=;tl)9fhI zeI7yr3YhBtkz$h2W7SIMvC+`Jwd)VwmmLHcp_Gv2cN7opJE|8M9qX3}?p7nia0@RV z&wWZW8?JD?^bS{VaoWDsrl+{SpjauXi3%x6o0U^PlXrD3tVDa%=bpoxEEGj`)W_U-X`~P8ET*By_0Urkg@bBGE=3YAaq=tsA3*3Dl>Ak&oKr)?(Nlolul$ z@qlqt{kcyR4>;$Ohs?vT;#YkiTA>SXc~!aIYfZAKMX&z@#GoFvkzecX!|hLK&2G(Y zY@w|r!TEE(3mgfa6QQ8J9Yw~^E`Hr_iA{Avs8tGgXo7?r9U55IY)py*EX!qwp3CW% zzW7LeRy z^(IVZ-Qnz0$$XFr<_8H+w|dx&A4#Mx!_Es){%AvTc9>ap4E)Wn$@U1Lm7P8r3?!kM z_{+3G@xZ|wwoTTW1N+cvf0P@eFVXnl+DFda#46=5Py1t>GD7IK6kx&m-L16KTb6U7 z+|4f8F*XLF8;@konnM64T>8ycA1Tae0;?*6tMUB$ED+#6CVK|+Pai668N2ITi##dL2L?$-KR`Bf zVZm`NLCirP`rl`&mB_tFz$hC79-~e+Ar@1gxLH|jXn_uf3rQ2AgQ$?RWoH6BEI8N6G44m*0OLew9?7@^QkQL@aY)6q{oR@d{hnQkqiZ8Ow?v%fldkMJA#IP7V zIFb#%A!nx?L2zN%GfBd+jfaoLf3l?(h`S~q9m3{g(P;U&;o5(I{f*(jR9~7SrB>SC z;kgqYmcCl(4J&@yyl=fb-Kt5-=u~v6SDYhE(W+U4vzV$cFfX?WTx0#%#yIW)7`wjw zMWC)qlBJ)Akg|)1mf)QYN+NW>n=R}FJ&mc0;p%9 z#J)x@WQKu!uW6?ZR~6!@h3M7!%-<#6}7R=6{&+3^l6xz$~ni_7aP%;mfuC8I9F}Jg3ry0ngQNQQZ*(z(`D_`>$TjH2-J->UN61*1iGl>RyXCEqxF3b>1 zA&M?>&Y7*-d8vHWBOOmC_C3kjJ)*OH%wN7>#0Z~@b5o^rQ$JZzQZs3J+wU&yQ4?`H zV#)}GS}kmSm968t`$%q=oMAhKD-#>?UXJ zmej?R2s`X0Tfi4kFa5tyReLob#|m0v=1qU3Ze}l;O~?49 z9ZxwmTB54?p1;`bH^GMg@}Tp0i}#91%lCBftj-g`vdTspzQ7eFvqVt`dCB2^%`!n; zu^W z4MUiKtxv36BNvIQI$GTs+c8(#79*IxKH(a{w^&BPZY%3ho}pF z)E7zMgVf9_n(FAat2DCy`mD@&J}%&evYU;1OkjCnq^8MXgeMF1%nJLbnu@>wGs5=S zeSV4mg0A4dl>3NwrSrnEr!pZ=#YJ?wADnaYwSkw82o@qSFM=u>;_18!g!HL}J$<&( zyGC`OPwe2@IcyA5#F2Ch?%_Uln2z+__`88$42RlG$~6Z_IzNpfu66lMR;La} zZT&N_#6$?Rv~NFdr~N5T)re=z!1+n;esTI_lQw#@igp1!QPh6I-4f<);;IuYFEriE zDkQnGmN`zSAV-hvY?m=k+)w#Xz-fjf3S;D9Vq36%2UOrvP`LW8btjnE{U?r5I)e;6 z+n9pYafgZsp3#miT8z1duLE^Smli8#4Tc}m5kT)JkzZcqH;ovNI0oX5HNFmQa_~aQT+>W5k{`0a z3iM$;kTbRr!C4JY;o3pY=AHFk_A$o{)TFl-MN3_mo-h`b5{+2X8*V9$v=1BNbXXI* z{X28}e2qgy*(9i;<&g9IhpplyILn6d5s%Dgq1A!B#d)^tYBHljdJ7>ExTCW&%cpJ$ zt@|83<%qlQSBq28FT#7$2bLcA{TTA&a7})w6m=3EYb} zq<`<7F#Utmp}787)Jq_^RpY@@U;2`LbC zG0NxfQ=lM~J>1LsHXQg5AW=jQi3Q5)!d#rXhotnG#!~|L1y=kML{TiWeulw?YVl9K zEZ3=i=X}ea$O$`9o6MIupL>S-UMKEcgLC7c(@e-ep9l*!RNXEQcd>|X2pu&P_r!U8@co&9B&K}YQn&w>(NTt!hYxl)v>C|gxi7hXEpu1Zs*kD`5(8!BegRwN z$u9~%0-hOHiFQ$d4#%lXO|Yg&25;lu05|9S*N_VzkeCD)F5P&Dw0Pf97@axsq9Khn zEQJy-WC>~ro$m$Kq*c%FK6o30C%;dnBS`7V-pnV?6ieOscrZ` zbbCS+ojJ?ar0&cG;^GnrFnf>}#2;^QXV+PGtV|ZcdZ@dybyq4Lop_;L=U|zF9 zj}g)qmHL;0cE5j?^+XBqHq@`hO2u}`-VPw&V_p?S>-;en2!i(04*RQN&@&GdFs_p3 zJZCskxEteZgh-}&r;ODJ8B{Vb!4gBN&i9&>OrI(c!8ix;qyO3sZ4nP#e55 zcrZz=@t9FG+-3^rp+4k~udV<2*9R1;ffcJsqw_WWDI#jc>x{x3T_YRL%Oc<6Vf`42 za1-i}GI%;!m{S3*!AB&ZO`IN5uQurynP>V#muZ;jDW$yHXw#vgHRg!wprfIRmFwEb zUGS7v(ATOF{A)E+wUoRt(b3MV#}`8SejhkgG+(H)z2)6cRU;B038l@3*wk82 zZk>nFJq}CaWhD6Xz`V-y>0ldR)bOHJp7F8^S;-QOTR?@mAsns~B_&G`+NDOqsRy2O zO=C^0M`;9sXd`I{?mx-$( zG`vAA_#YtH6Pzjn{9C6|wjjKPQPIYlPxGW$tC;hrM$wSqyl+?1rL6l`S3oP4PdcIF zK=QT0A;$$sAtk|_h@OC4PITT zUMY@#o^Q$e$&jB|yb32GM9x*!%u*%Smck>H;9jN3^dBAOtmqDLP0m9FfYmUnxFzGK z&$E%oK7!Yut!q{7tvIq%d4{^AgzjA7ZE4-MJ546(UO)GEoVjiGOFgpJVADr4Z1ylTH6#`K!MYrL*MPR!y*9^qq^p)x(89={mLor@ zqnvIIS(E!*>7|IrNX}|`E8n5UL**f2LX9R)aMQ0io2g*#xANQSjiZIjoF#*xzoJ7j z*2ca|a<(4N9EQ0>nP=|U5G7Vo=?xCsG@TZ<%!Y%Gnt!rKeScBHf00~AMP%|rpU9JZ zn5;tv?Hj{}w~Wn55_?9>G)6Wnz~l@m1vy_(RY^nkbJ#H@Ek+i&%CAXgJ~3Jk<}OY4 zwM7t~5R1rm`lRg%ypzU{P=%lH3Rh(p%EftbO}W}f*Ha5@ zWp|quJ)fdR_Z?7R`PxFxO|>$kA7`*3Kj^|9?#%oUw#}9cN{b@lB~NW5Q5=lR z68^=1hDqHcGuM~4^$mSMpaRy2WP}_lZZb`7J$CPB|FdUi&OXC6hJHO4#9qBji(&Kj zbXmgj@DGughA5y4MACF#`8ddaYJeYsCMD}cI~JwiQ7D9HY>jV3HWNOAwkmC;{$udH z8zssfEj#I)$y6UJWixtsBW+dD6}2Bue7(nGF=qKTQyU|3Q^%wqr#-b*1~ea!@{kB4 zI4NqiRo8DSS5!gxwnc$>$!wi7>IG(EH7H`!4!`t-}?IF=DOojvjrC}Z5pf( zbOEv#I=u)NaF*gyxtIkXIgemEztDJPGgw1BKr}bMFOyN~ltrsZp8Ohvb35f`u(wjs zr<;5~q^v*|D zyfaP}r@Jo@CYIm}McYUPaOQTfH^TLUZNNrd5@%_BpRUrHJ|pOw>!QObvOHLWr-(v* zF00{kUhl+;%W9JFBr8u8g4bW;U;{rOV;<{nC~49?^Gi?HpKrhu>p;#U(AR+zUAFuEZR~}vaVPc;SHgQ3!wu%4 zyH#ef1to~MG4i(|&R6$;E6*n75aah1`!Y07t|7AY&=a_VGG(q^ETiP@+EDpDCREsO zZa0{+H@$D_2@Rn$+OX`1AbgK?W=(Iq4b%v#RLFbjRHl+XK=LADZ;T)lzOw3c-z%ZCAii{yq+B{oc2TF`GQ(i0kb^C*uiB?YY6F-sg6Okkv}|P64qrL&cQhDK%@>OI{P} zA%OC^yiMq@_;;R@2h_!8)(|}N!@R2ssVKMD$)JR^R}+R0i*XK_fWsS5vFXBEQT1Dk z#NOavs-+ZSxdxNMqGD2CK>-uK+17p2@@iZ0;<8^lw9Z@q0ls6x_J*{Yp>|dRVbRIG z$DSxkEl8~-3K2kLl_r^#F5oa<&(7Y^^$!pj-uw+adEdU$FN0Tq_5L$EOP8^jP2emO zASThGm+3Pbaq4R52ReiUn4Rs#wuS;QFYGJ)<*<&++&gm1leay!9veGzrwa^tZVXa5 zb1pcgro3=vQ=yrUESF$d-_ufJ3T2jsL~+;&db1&=`MN0?y1ZnV_U@2j`iB`;i(I~) zmxV~^YN6^SzFg%?fge>)PP93O$#~FCiPGUDT!yp8eZn)Ao)U*+MXK-qa;$%x=&n4w zF4G}a{>ULc09p&DFF2vij-7G19~kxdyuJANWx=<|m4F{1YU?PSSR?Htv$5a+ehX*Z zn|7&3$13|_?33yf7M*LjnN@4{SWJK$_wN*Wogg#nG6hEhi@C@jGgQGE0R++xt5P7JUoQAmSy~Y zKGK}*;|CN=@eRhY_L3%}$<*JX?+Y-|$@_v)!1@_6qP=tM3CEFMDjw8gUFxd&5}LO& zH~m-zgM`S#!f;XQc{aW5P)Vr}lG15dYhn3_KZ&BAgU`MuUiiB@ZZb?Ns2g2-o|lhZ zttR_KJ*Ho^O{eLjsp7(A(#Kbv%DchBTBbj7?9l zA-7#j1)3J>Bm{`mUst6JYWu6-a#l!{nBlv0bywk@u<<`Y5Lhe^&*){DqecaPT&QWl zS!vUyPVre$WGM8?pJ#*Q$6x}5-pn)z9nSSdF#GS6XS(#r+mtWJh!`QkB~I7Akdl?F6^8a;$5t^jVIym{(+2M z)JX<~``cg5Sy1Mu{gbg~mxsJJwi*-97!@nYh>~RDD|VgUmwR?6Wdf*B-BM|aac zFI}~|S`udoXTzP2u$=?oqwngqygS|6Wo*2eseV5S*KN~gz)u|_QEp~hU8Ex3!F=Fe z&R-rv<*wg?NBrjMwB|fcRc0)LfU*QG=-uiCGIwY{o*79BlP2e<0+&o~Zw*mx5P8W2 z+4-bG=`N_Fm^kX|tCWxd;?$iX{9z#$y?M&}yuA;$6|&|cg`7Es18;HA9|FOTh3GGE zoO#;f3R38dc$I7pB{tTMAo1ZDc07xB=TG;UIzj?9X?6%(OVG0=L%(c!b40y4UAbDy zKuA~g^vW6x=2UK0@I{4RDvsQOJizc^f7apn3#KvpLxpSS>n~J*ZGE!c%o7M zTz0saLZI$nRym;U`8gZl@7vkwRjttG|0?Qnde>b3vW z(>Ck6ow_^QnOj}bC+WDx|G6E@lhLu8eU-z&4<0`Uxyv`G@lIKgL9G;A=z9F&KR}(V zsxbK<*^=6~Iv8>=c(*BnT3Y;h<5Qt!i1$_+Vxt8o6{ZeRk_f5jg4>QdbomZ4ph}zh zC1kbrA4sjBPcPw!WP-`#XKf8CK_D&T^QX1+0gZ?gQ>0-0X= zbrqwU4(mr=kWhGpVk2V3>YXfv&H|fcWVs6$V2gW_qSYq%ONZXR|Mff~CPN1ILGF5L z7eXud4#=%beI^!TJ0ZsX_Y^c3#pQLv6#9b7l96bmp^dG5wkMl-kbU_#X=5*r-OLV7 z9s-72hcWKF4esNY>-^ijO}8ljWV(7;=?Ve6e1-!<20USekHNmaWFpwBs8hgjBl4`9DA&Vl}Z_n_JZS9mQwtipQoxh}&m_&%N-9u7F=)Wf&HV8@{;p54whrqvI0c zN(Fy3cSxedK4W*GCJjhRf}qv7DjmW8&cVrCZ>oHFIPf+7ToF{^M1c!9HD~_uFD|@_ zm7|o9$4CL z(mQs^tRxTkmbRXLgK@Ux4d^=vQyKzW;(lq#UyVooB|J;Qy@?z7?Rz1;{iN!Cnw4^i zwry=it6vP~{RP>=9mD^=W$wO@_KD8VDmdIt<#4aVE19R4-fRdGQH&W$m-239JxjpJ zn(1%6Q6fu1sd+Gi3T4DA9LW;5gk^tBJ*Q)1mQCdHtpf+AQgcuqmyb_VVPwohlz8AT zhq$D$f%$`2ocWB~C2=tXvRWp;KD_cN`O{-grOJu{eX(KcDQ*^&)Sg z#y>z$_RW*&nC$&A_w;zLjHiNP;0cdrY96kqHGe*5;3s~HY}_e$=I=_`ZTnwx9|#?Q zJ~+Ff{s8rKw0Hdn@Z>VD&73c(Z6{t0xcIADcn#fzJ8!~){!eiv!Zj5YMPgNqLpVy@ zMTVPDyjhmA;$(gZ#68CI@sN$y8cGDRfoCKDTf=ct49#kcA4mL$@>Kx{n>zvGy^w{a5bXPXBD!j1& zCNPYCn_MGp@>#{E+`#wE9Jj|Pa`Ja#oLeP&zu+=;1X!bLOvD-cpi!FV(zT1hdlj8z z^epEPtrPOE;Vs!vQ(H}qrwD3DJ8TX7e#@KFRTW)2OYrJQw{?juhCVXZZ2Ej6O%L4) z2?w-2xli2v`}b{JK$eHL;E^612xHC&S2miz4;4!=!qTqAznYI?_*h#0d@WyS z0p=_8o~aPWi88T|Hl(p#_cZoutP@JJ^@rc5xRqkXoER&LNP4tCw|)(VNr>mQx4+qp1c zf3dp7<3fn{jPowspR&t(diS;beu>^cfE3Q;Rrz*L#1}KdDXpv)qhavJWQ!w`uLa~V zYwN#+hbo|qZ)4^Yb4Qg}O9)w}C_O}TtyqSW%h`iQXG zjj%zNF}7WqGvUVCZ}44crdi#@gWJP7zJ6?}I%5&Pa_V0lB)6Etselo&ABGEOtSV7k)B1H2ec>O#K?k?&+m$tJy8Ya>{s{hRL5wl1iYTCtj)1Ki8A0 z`6Y71ZG=9v{yEr?a0|Q$+Y`*G07V9>p8{I3-?snz5A9lZZQhpCoQyHVH;07L02vmo zw&<&&ehM@n8gk9?BL;=&U_Gav_EoBQH^P2aZG{4g?RGavPHOmvvEaK4RvKP84g^2$ zXrGiaOvNNAICI5`V%gAJC+l?S7 zTOclTn5#KN4k~OSf%l>Rq;~|o+_@K1{61Wf83E+06;HF?-R%+YxqcC+;(q^+A+=IS zS)7)PUOz!1h-sQYmcA4tbBw-72~%vHEGeVEw`ex@4uuF5{QMFiiIj42Uk023hz>obcGR4v*r|?9Qe$s#m#SA!n8} z9~_18!Kvzny(n$EXH+|)^&=iIr(D?hKi+LdCx!Mh5?qdyvnpl{tGc+9mkZbkDchm6uy$NOi|fud(7*=m z<~3YFw2|V(^RxUO`z8>gByP9mX~$=>0h3BZ_+&ZZ;cU`PmjBZdo#~*A3Ari-A}*7d zhWTH)_g!YFAsmC%O^B>gh zw*)Gypvrt8nh&yRGQkc@x@S@LKMR-4{7-U|<#A6gomH1IacJp&+>hFw zWN8Of7AHPd@*h9}7Zw2qT?!RAyoGysuV9s*r0&+3sJCz|Zpx8jBMm>uZ8}r5`WoCC zu9SU2e@MkN7BBw+UeE?yKwmBxs2T+e4c~SYV|gNGut%Xeq({;{S))~kFRakW88|!+ z-+fc{A&jqVG~fS+37212q)$^uCjWLSlndu9yApB<%fVRJWaTjr&>@kYiZaM^zkIxX zR;Rd4J|*l%F-A znsA?|c*<}W{{VwoGzW6;6+Z^Qs&%)S zkK$@h_q7Z#KUvtk#pu7Vtt7E@KTKt~QTd&{p`!J1q&+Op^OeAOajYK2i-oJQ!?^Si z5dUAjoqvG4V$`urOeb>dVGkFU%8UH=ce| zVx@X6gWQv0Q$&BaKrxkkCp?6RM+#oxs!~UJyR0@p$Zh{%983OK_E7$ILIh5Q5S&}H zDP1Ie{=1nbN%O7b7^d{A8C2zW%!c;k8p^iv;w5{+H*CL+3j4=*V8i`&SPrzmZKv0b!LwC{4Gl+YGk9R`akrCw%fpcuC8fg)6&$;+TokRIzAoer`zGZ!9Lw+Dn3NcERO>VYs+H zf|3HOe>g@noCyWlm56L!A*;@>8^2}Dwxem1ajdIZMogAn z9D3-}xh+HoSeGK{67OP){6pA-+_B}!0gYcE6XdNz-Yb@9L#PxYld6w}@;jk)=AKF>R! z53yeA@$11oVC5PXooH~w22wW@e`dz|Q!q$Rw{KdVoC&_j?;j)YsipnUMu6$RWh?HeeTlgbKNnmrJk&+flB)ZUa1aF-O1hr%` z*O;}Z1#vj{z@C^gy-o$A#M;UEY?>friT0ww8e7w*g{^80FMlt7J&_=xH3yqNW+AO? zb{2jTIo|pJ%dC-%517hwhgi-)Hh6Qz;}#x55eLB%OQ3~RPGl?1Udf=zVhK<``j~+{ zL&G2gJUOf|bVZf!?yW$vO!=kY)j}0){7}|~@51z1pYO&Tns6#1;b$4KX`3L|ycZKa zQZVpBIO~CypE4`wo2id>kICPK*>O!(JCtl)Pp|I%7LD7=noSJ&6*z)?X6Nyp-}=^j z8(Otme+~G%-EDTM<4vTw@P7j9AQazhVlpvOwOCax1x3-Ac%0sg!n%J8<+c2WKko3? zLkBZRF+boc+*X?YJP{_?&66_*mf~RzP1iLPvQ>+gIF4nijbJr#cZ!#B?F)tV~k7<{}B8hlrkmhQ@xya^Hyg7qmAf;&?4>m_fs4n4nTo)`( zIo`ANimgo-D)=>Z3uA_H6jspBdEen@%v?AajBlvJFoNSzQ>b8>mt`y7SGNu5HWrfz|HPgf|oX1#(rq520=2dTmsk^E6vD$AOBog@R z+@pq6%ERI)?j~T))UWdgIZR{J)qUWbO4*j;W(3KafXL=@BMrkI>5Zb-Cb+hJuBrxg z53u+574&NftkI779X-~6P!J3LIi@jm%&($UhNdFG$d0ASWPu4Gt01OTgebF_aC=Iv zO+&MwBdLYTD+X7jgK5XyALrcQJHgH_38~_2MZ*l6h=eh-E?VLjKM%_v+&APXj*pp; z^)!QU?w3UbwOk|%>2TRw;}Ho#1N4kE*?<98h}N{CN}~&Sh%ln#4o+r8ll2C~jh9bM zioqIg;4Q3UX_Qjq{g2!=Iu1IQ7;0?v=?-VY!Vr9@ew=pkEiH`a@I^8XQ=p(C0C=8s znNx+7hY#i$nnHH<8DDYY<NLykLpsvrV)1C@@#{)0ON~DE5@s0(b(4R z#%NFTLTL>{iK77WLENflc?!PMvi)oL5T2rwYzY?H@PBkChbaILzH zo@P-qxN?AO#FTQBHNIoZ)NT-em_r;~y#_GU+3C_8$6jQIA8a2>p!Q+=n7x*MW}K*O zO_IRMm~kpZ(_Q7`@BB|uWBQB~=^!nN;Ay#VzyhH$fOm^4xrsB+r>@fC7aNtMn9g8i z?{XfW%sfqgAjebR@UnQCxnk!Kc_#WA@J4r{a;c9IHH|_aQ!6=&r3rUhio0=gf>z*% z5W_pp^XDX^5MgHsK8*a3U`9!N5L4z6X1qge)tOw=iFmnG_?1;gz$`y`kh4j7;-zn{ zfY(8e@Tr+|!7}^@@h&OBT<)4&0u(*N8Bra}Q<#(k7pjmiiyO)+)R$Cy!Az^nV1v2z z0s=fQ%poJtZHzTGW-~~09eju@*w3<`Ydno#xV<&~z?;6ElRa)@ubGVCA!_X_rtUtq zDhtLPO-q%r-ODmc0#S7ykXxHGJZTSe5N{VYznBzFogHe5%J*#{`He7$J;$Ka)N7cS z6Kl!+om&wV31)FQ&QW?IE{TA}K4TgeET?I599$|5)Zenp)#e@NcyTr8H5d!nfp-Mo z!W%xJubKAKN#+cFPjW(8N^?_^9Q;mGPJ+fHW+J8?w{nWPG|IV)oZS0ZdjftH+UxoDUc|MTyY@7as3H(?3UZt_ZZH45oR+p zNOJ;^?o32-cJnYEBJpeal}pUg>RD%I6O0zjmzj&+r50*<>909vFz)<9FpO+nd`&AT zQ@pU!P`kQLCd6XD2uSR|L2;Z??cVne!pQ)NY?o4YeUm4kFXYtBhf$W&uzKip!eZeo z=b$kJy19@+wqg((hDvHS5+j!q$iOFz7gCt5%{0KapoXzInnJG`1-mS{6;a^m{*=)3 zGY7>f{YUMga1v@H_h%97P;g--%b?ZiMB!ltvAM}2_&&!oSp_W4hW z7>8VWVBEn;dAWHFiG>1$K$O&d@whQKynSVI=ON;1I<&1{KcD2~HjQ$I;j-?KQXS&R zj-kx%MgGoa7xOlO_89GrLqM5sX-k0}lR!ty314UEVx><}Ug{FK6Wl`sa`p}&FdV_l z1PpqFJ`o<$d!UcJz~P(@8u*H*D~gkYrr3Ysnlo<`lr=leqH+5_-sMXra}#_eGk6$* zQ@q&~AjC$sa4MsVTuKNxdAWCNu)gqD!47dQ%rKXjvF$1k5YHnylB*8g95sf&Qtmip z?e{ZVoV`Xovz#7-6f$vwIwAo@rIp>Sp_?(s z?<@nf#E@cz|1m+KA!Iq$$HVyFr!-$3dvn9O4=Yj59adJdwk_-hMff9H;j- zE5UqWI>naXGCMUX;1Fv`6=(?^EooI>Hv&6o?4 zu_{sj0NNY_Z-@X$JVPb6%~%4{+`&E(c;+(SOnK<)8<)%+!or+ouMp*-l`{jWX7MtF z1wt03+sy4S&g7u*A}bt`F^PDC;I>K+6mRX7-x6P`kU1fyi(+hqP*!F!)C^34xEb>= zOwQ~fVD251voiN(8>R)`Wy{CpsjPcTh`e-CqC};8DM6LBD)Mpom!Yjp#ktC1bGrud zFNmus(1J9GL8ClN(0Pq_*o4cXI|G5J{#bK4&F3(3Jjz`_+{ig69}_lAAnh}x$?QX) zf>B$q?LIY{)WYVB-aAY#D~1R;516>6sDRLF2_2;7j^@n3VX4Ci4{Q9z5BZ6(Xhve) zGXzBkEC>@YoJ4OrjWb|I%VIR2SU|3epALkPR%)Q=PGAF6F;kB)6JlPXg958NoS*3G z%1-HZZ9pr{K?*}h!5u-Jc0mM0m zvjtGmgiliPsbA1Mht^lhVtQsO?Qq-PIX2B3_dEXpM79pZWf@YPrmUtg03WytGVyLu zA=40U$hCqa#4)Jgsg0&~%IH_-eG&nAVusr&k%kIkgyDniimqkpgGh2Cf=*({Ba!5f ze-k+2{^iNwO&*DfgfdN-?#sC8k22nL!c&uRTX`{A^HGhMZ4FKtPH5BSRz1Gbx!aD1 zhEU_KoJ>oXE(M6i4qBAstQ&}yzgT@y?SjX{CaK)|M1DL~~yHy>%9Pob9y z@f&qPnFNWNHp;*tVT=bG`n@nmuDBgD1>&Vu;uQxq3tEe4u*x=$=9J=~mbfv}VZXgj zP*^QOWdc=Hu{?7#)dLyaIfN!<&3(*ZI(-%E|cpOGZib^zA&%|S0+S( zYlu0CxZ0@0SnJ+cxb%}b+zjGm#)VB7v61u)=FBfI&S`GR`1bT*_a3<+f+!!Q`P)Xm8#E<~BL2tJG| z1QKPd!!%AIg2hz27AFvhea#|nT1!aFN5s10TyzCVa@5OE%yxqv=3--^%tb^i9n0XD z4a>_5wi_tEv;o<;4P6l`_k$t`Habpl<_+B2(qKkI%Pb(y#-~OL4)9TpbHu&-56O+9 z^d~6u2zND`Gwvg=^S@3ZpmM?kGekNZ$W;L?g^9Y@LaE&yKXM$pS2>2^heb+x5W=832~w=As?@20>aI5e#sTp|viXMDLaVsl zN-+^prXV*pgO+G&X57GdhEirjXvUt^A0dTc?st~vb9RNUaV!!NQIbCjXzC=ftwvY4 z_Rd5wLnO8aNw9gu#S3m+BgGJ_iAy9fR5clK#H@)%L3uJZ%9ksaa7VNmNGlL-4q=On zpK}tSN<)c{x;+z!@jZU#LbSt!#0o?HjB9R5fn|;lGX(&&q^SrSiEwHkcXbVUxol&A zM>V-h+S%$Y#~P@p4Kpen5|P@dDCmKg)-M522MOqxQkbg2h)TCKt+wDVfuI_O7!TSN z1-xztx~gUrw3UROBiF>-TpDsp%LqLs^(>Z5sAS*tWv1v<^tvwwsC!?)$kW?pjObsh2^DgFjlUas0FD?0=jNl># z3Iz|A;!|J~$A~(Y%n>-eN*RPeYqYk)?M48(4=J6VsIH|{UPW5MPdW z89rIxih;Atu<*zNsJy|5XoKD;L^aw04Gf?*lHdCz_p#T|;f^KBx}Udw(Z- zma3+c>9~YK#%1M32-82t6%V_|sg0ySyqb3{rLL`^n1?E@S5pQ)+%9YANB;nrO5dP^ zg>SCGNNX?_;35f(>Hn-L5$ zN**J0M`cvpHs~Q;9-&@ff1v%$>i+;InS%JmEy8P%go#|Go22g~;-6|?;3f%*UbBPy zfl)~=O8JbuN~onb03?@UEt4w75YFMK401wcnKm54?v7_G2x3_Z4B3Weu^l*@R&zY+ zp`X0DE@x!bl{T3eDPVdp5mmj2yeKW8oJ1C!MUJEVAkWmLh<(_*etCdL7r9D90=Z`L zQ+4B=xXQ#N4dSiM z;(fftz?sPd<~DoMi*T>($Ploq*AOdwZp}(;VM5j_H}e-cqfR11Xa*}#X;urYLB*jS zvX|XI+wPx2Z!5bL+u{32OI2jQDOO+^Dx(1Xq4G$&<}vHE2gE5lNYV1##R$T%9wiz| zWR6SsQqT2$r}(ebRP>lQK00W>$(H({HHG@A`<4A42vz!1{z`wse^dSw`k(Nh)c*j4 z{-EaP64myDKq?*r{dDXg{{ZQy{q+9;x|naCaRfm3BNJ^=??3B*sK7hu^o_ zyE;eV{kf8h`$zpBPyu{m=(#(I7x1Fy2CjiRIAqL9cKAH%{!N>vPw5KzYx>q^H9U3-1|KnTbbirW|VH!dUbaJjYOC z^c@&PfTr+m^A}SW@L%FOzTi)R{{VM~Lq39k&|@O4VfP7@esO{Z=q-PFOel-T^AMUD zHd(LQbuRB;vxaqn=p`LLN-$_ms>lS6gDl+J*_5&XmbWP1IEEpRg~(vyK+gRO6!2{+ z;=(bAz3P%?i3I5`!Kd6(K{Ro(pXHT6=wS+nPmk^7baDr=c@s02{wjRq`GoblHA&{&|~FfKVS7?jP$vF#g~Br~7Z*2|wNLA)ohog&*$v%?WWUj){Cy z(zc|$2G_R6@dQ-iafi>Dnup9qpLQv4+@AK5RK!3l^2Yx5ld*U>gi!!fzSsW%Wmfx% zs%EAq8A=9sH2IU7WK)?i!7f_m{kmYp=a=r5(Gfo46+)# zsDHHlbWg&6p3>q~T@kRMj|)|J=Ma@wQew;xlghs)?cu5l(|GR z>OEr@n1BvBmSACFm6j!@yGqs}iOs{w;%N?Mi48}Y^C>fq7E3b%8CDI$x!zHTa*Gp2 za>vDVhXNa>nA4Z|i!o24f5|8NN&eD*l%MS;7XHk>2VhJ&5US~_`_4>G5;dmgYwW|% zgK{Ks_+kG52`l~)H!tc9Wr;lnxiCR_>3xg|!D|Yr7n@EQEAb1uEc-%JaDtsr_ua!@ zr20?uhK=v|!)8N?zVGEWE|VL-<#R;tC*d*Inex9&)m;Aoo%b!qkvzG6<BNGzB13P8*f!o^f@`&&vZ9m6C7`Gt=C)Qor46pTM zYWp+eqYcywCH3r0l{+F+3ItIsEAKRuT>@rGQ>Rs9!ka&ES{&YSz4*n=D*ZdZ=~4}?6LaDKHObVqM7jKeNXw%`a{yyD}5Do~|spa|Yld4PgcIm8cf zuf$@ME&S9XfYO|~e&v6G3!w$ZQLof2tk?8P9>!OQjJKO1vLOO5yxL>+Jp;`?hI!XJJhY2Q!m%dsyIg>Ij4EL6Fqj>?hp+04dqTW3~>&xs!VJE&~itt4zxC_#T?} z5z?UE;rnyWsXW$@l0cOy7lON8MINb`ybJ#TcZDteS$T5?B0M6Zg@ruIsiAYy#6+Fu zb)Ve-07tYgIWnBfKq7^vFu)dJ28bh9tJwh0-ywgA?cj>ps`#XhdQfAWaBCLBy1as2 zMctwtivIu+TTm_%x=5H}6crcdPs9;@IiGfGi!WHkxSE6xewhCNVK)8<{{VOJS&uw1xj zGdCzF5M`F89UVWYGI&joGY7H~)MXL80~Uex0=h1Q7ir!bIqFjJkQf#1)0lx6?g>C* zAgOxBC|o23UkPL7WF}$D*hZ0VZt|Bg%|^f-xQs`b4A7Mkyl(nW_H8rHPrfWyl5JPg zz>gyWT%^@dV)JHt3r;?tXx!0YjEP73kIX6m07uq#{;&3x@t6E=J2oi>7`ouMWNL2N zj4$o`#V3Wm%2V5(rB49T(RGtNz$rjd^9im~O0#hyEri=)m|$9jQq_8y{{UtLD7uSz zeHX&E#?Dx+T@6Inu<v<02bKJI+t0gU%sFzA#efwQhA}g`wDoWVTc$HOtdT$j z;KJe~bhI@O$2l%b&-$Do7{PdmwHkrX{mi~)ktR}@B-)%HVGUVfRZ-PYaQV!q1Q-{) z(S=lbqJp;o$rosBCT?pAgAmBe75ACa*FSjMBfRkoG;nBK!cg3V-aX55M7fNROT}(gued()(&~Y2S2R;0486x%w@ai zDzMFB2B9+L-%Dath9uhSo`F-2n}S#CEZv)j0dNFbU{awZLe25fY?%aKN+KGYVOB9k zNiHHR77G-(&K1*k9y(w?aRDhE$X)2}%)xF^AhDZDDga!gY073_FvBud4b6m2wKXni zN$$tG5}{h%MHKy^$D{)gMvT>oh6O_+K_Y7e!3{H%?STX#cJ`Ko3`^7?Q#6iN4SSkT z!G|8DE3x~P4oaFm%^yVYmI84RGW0BtBXHIFVuOMdC56J!X;Sx^`KDN@7#RSdtyCCq z1g*w!J(gKRo?(Qn{C^5!08lv@`j`nHS$URvh?~d1?plY!+`Rym$HTmgz9N^X?GA1a zW<3j(6HJ$=7~)lPDjdU@>71fwRv07Cm~zdgY--e0Ga-rIUQ_jmR&yOtLKG#rfV0f9 zfn329VWh5OY_NSterFjBOR{k@BaoP!_>VJ*!!Wr{7CcKhX=J5tqFm@hb+ z?ub&Qix`@g3@KwdO?@Vv4Vd6%xMdVU#Sq286}IjeRkALo zCkSYYCK%To+$qFni3LRTF?|`bW3<%T5A)_y8e)a8`4!mO8=OBKHet-t9b7YULlI_am|rn4)Fe%koe}^ckZmLs>5DS= zesB@vFcz@bmLrJH9rWTlXF0Rf+b-@(j*bKb3p0p9CIJyqgBhIEt05g4K9wyUHp*zJ-kN*H?+Cn;KFZX#l5%wyL%H7Cxgs8^)o--W^lv({_i+X zf2scf-_+ze{-##{0Jw_k>;C|W&MI@y5mP>YQMi{KqO1A+Os(4g08yCAe+2LI`j}tO>S^fyp~?69jxXo+9AD4s1ux9e z`GHsS`kFpps51Hee{gSmFVu2s&i)`?j{g9toB92JaVq1B{{VJ_Kbe05{{X3UzGr`* z)Ybg{r+=T+dHMZLUZ2#%)B0lW7=9mlb$=gtDENQA^AES)1rNvGV80VX@fANvG<_zB zZoR{w2v+!l0V(~%YfN$OD!+-Z_n0aAec`Y0+;}{(ikUh3&s6 { + res.writeHead(200, { 'Content-Type': 'text/plain' }) + res.end('WebSocket server is running') +}) + +// 创建 WebSocket 服务器,并将其绑定到 HTTP 服务器 +const wss = new WebSocketServer({ server }) + +// 处理 WebSocket 连接 +wss.on('connection', ws => { + console.log('A new client connected!') + + // 监听客户端发送的消息 + ws.on('message', message => { + console.log('收到数据:', message) + }) + + // 发送欢迎消息给客户端 + ws.send('Hello from WebSocket server!') +}) + +// 启动 HTTP 服务器,监听端口 +server.listen(8080, () => { + console.log('Server is listening on http://localhost:8080') +}) diff --git a/sw.js b/sw.js index 9e7a71b..ea5997c 100644 --- a/sw.js +++ b/sw.js @@ -1,20 +1,85 @@ +const CACHE_NAME = 'file-cache-v1' +const FILE_TYPES = ['image/png', 'image/jpeg', 'image/gif', 'image/webp', 'image/svg+xml'] + self.addEventListener('install', (event) => { console.log('Service Worker 安装') }) - + self.addEventListener('activate', (event) => { - console.log('Service Worker 激活') + console.log('Service Worker 激活, 立即接管页面') + event.waitUntil(clients.claim()) }) self.addEventListener('fetch', (event) => { - console.log('Fetch intercepted for:', event.request.url) - self.clients.matchAll().then(clients => { - clients.forEach(client => { - client.postMessage('Hello from Service Worker') + //console.log('Service Worker 获取资源:', event.request.url) + + if (!event.request.url.match(/\.(jpeg|jpg|gif|png|webp|svg)$/i)) { + return event.respondWith(fetch(event.request)) + } + + event.respondWith( + caches.match(event.request).then(async (cachedResponse) => { + // 如果文件已缓存,则返回缓存的响应 + if (cachedResponse) { + console.log('使用了缓存:', event.request.url) + + for (const key of await caches.keys()) { + const cache = await caches.open(key) + + const requests = await cache.keys() + requests.forEach((request) => { + console.log(request.url) + }) + } + + return cachedResponse + } + + // 如果缓存中没有,则发起网络请求并缓存新图像(检查网络响应是否为文件) + return fetch(event.request).then(async (networkResponse) => { + if (networkResponse && networkResponse.ok && FILE_TYPES.includes(networkResponse.headers.get('Content-Type'))) { + const cache = await caches.open(CACHE_NAME) + await cache.put(event.request, networkResponse.clone()) + } + return networkResponse + }) }) - }) + ) + + //// 先尝试从 webRTC 获取资源, 如果失败则从网络获取资源 + //event.respondWith(async function () { + // const response = await fetch(event.request) + // return response + //}()) + + //event.respondWith(fetch(event.request)) + //self.clients.matchAll().then(clients => { + // clients.forEach(client => { + // client.postMessage('Hello from Service Worker') + // }) + //}) }) self.addEventListener('message', event => { - console.log('收到主线程消息: ', event.data) + console.log("%c收到主线程消息: " + event.data, 'color: red;') }) + +//// 检查通知权限 +//if (Notification.permission === 'granted') { +// // 如果已经授权,则可以显示通知 +// registration.showNotification('Hello World') +//} else if (Notification.permission === 'default') { +// // 如果权限尚未授予,则请求权限 +// Notification.requestPermission().then(permission => { +// if (permission === 'granted') { +// // 权限授予成功后显示通知 +// showNotification(); +// } else { +// console.log('Notification permission denied'); +// } +// }).catch(err => { +// console.log('Failed to request notification permission', err); +// }); +//} else { +// console.log('Notification permission denied'); +//} \ No newline at end of file