From 5aa43f0b2e24a9f6a07f61e9bb418e80629610e7 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 18 Nov 2018 23:19:17 +0000 Subject: [PATCH] Initial commit --- Copernicus-Semibold.woff2 | Bin 0 -> 76160 bytes index.html | 12 ++ passmate.css | 160 +++++++++++++++++++++++++ passmate.js | 238 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 410 insertions(+) create mode 100644 Copernicus-Semibold.woff2 create mode 100644 index.html create mode 100644 passmate.css create mode 100644 passmate.js diff --git a/Copernicus-Semibold.woff2 b/Copernicus-Semibold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..691f717d444c639613cdfc5020685ce1ff2377a8 GIT binary patch literal 76160 zcmV)IK)kQI1_|`0t=fw00bZfiFF6W z2MmEZTi;jIAoRbqz1hv0%L_i5(^gQh5>hCL$Po)W5wy5;4l$X4EuhNu&oDQTL$>MY zk*&i^^)}poA*4DP7pbF+8L?Kp7kR~Bmih_r# zX2@F}*O0fQPAH?%q)eNXnGrQB6s*-==tNMqVG%rPT(bna220Q^nh`_=UiQ}N5i6^Z z(P2^7JoE?aah4@0iqHl&Lx#;Z7kVkm>nP=U*c!rh*uK$#HuM4nGFQ^v-|Xov#Y@hz zgjBwj4fRT-9&&H6H9|X3g&XpgpfL`(A41-(-A<}CQq|o$tz9dOi#XH0dse=xA zp$=c6Bi40EH|aChhR`#}Uo$#VkLACSp1~4lmr;nA!HjBFjur&GCvfnHOwrFygOgwQ zZylS605zv3!hV%utX2L9F6Fl_D&(=)4t@R?QPPossf*9@|Caxc{B!v|`Rn(@e-Y7P&0X}w zo)QhT`7h6QsKn)`kFDqY|0;lr|6hKu0(2|>Tz-2&{8#zMPV3O1)ajM{J^4rSQ#f=S z(F@ENuhWxnM98?Wovz?Iew&ittBT(--jf+w=@6ZaMv%4G-8M3iobn3isfBd*9R-#_-Vd?8+h zF!2vA+;I+7d3-Ig>Qu-IQ=w|>|9_kRxXwl7oD!%>;ed|RnxbK_MN>9Ry6g} zpa3p&_U=AaqzbggrFptlz<`898iSDk0Ikh_DxR;rkGgL@c|MaTGDX4w1q>|2YGyR{ zteL@#o>S+-m^x$HFqu=O+fTmzOAxXhC@{!T8?|+FPN&^@z@^_45R%dYY#W}>ciJCW zfOhJ%td^4!FQfJm+?n@{*VOVov~CI&jZ>~ZMLy&Xp%tuzSRKnAhwQHO^#0b5E$c=v zeu%DQ8l|xu4-D#=Y(C%m0x=kD+u;#0G-r-T{!7I4M4C3{SkzV!@nKEzP+)|6i=2gO=DpvSiDg#KD0({s6RFQPXc*+>`gqdJEux;J5kR_219^{b$s= zoGwhXr^rJ@hKhxhC@G?VB112VAa7s3lq5DbCh4~ksmkMH{&TK>4pS(WHche8iQj~f z8j^$ng@1ToyBo1IO`mw>K|ciAe1X;G8(K?!6ykBqj$(lsG&xB;ha`Av_8qWMg#3Mt}nR-vA6b8?xD8 z41y|WPyip8GEN@>2eRZ*26q7|;T!{71W+K;{k0hzkPfFYl?wQ;rsc;Yt<+cB zqg>j#6cRdiWoTq(n5hXfVB`@l4v0s(>MsJZS!%Ein1xGiP5C$5)V4q=beiLTj>cH4 zrpwMzFE1S95fU9DJf&3!YVDqp0D-O9?xm6lg{_eA=*sL&tHgr^a+1dX{#DI$Zg~v= z=`NEp<=*A>)-)9(BRQ*#qlL(fLqX%^mj|KzN4JUxgcwm|#2C@Pt~Gm7)K`>85L`=b z*8K|PJ~djS!7Bl?!o{g*2f|GgxU~072TQdb9h5kkm)qPxD1=8o>{2C?w0%Ex=~wW+ zCs^YkqzRF2fg#~5!WY>0Kkst)F8VF1wb1rID@yP*6Ba)~>`Snmp^`r>iE1 z6XCW3V_20f({t`%~vk$^@gaJGOQfIm^eIN?dbHfy;LIhcxwh{#xFYY+LiU$^Sx z=tl(&vrw}M(fKz5tHdbeavJB`nk@i_d4e!F6xaUBHn+E^i@*{btjI~&7&~Waq;3pT za#z9J?@f*r6iUO|PSCEi_LSzjY=tdy605nK~hHlf@~F8Kd@ zRjcj0|C1s>*{!tv989eUL|_Z~o0ZP*9vn z?QhRPyNg^w3W|av7!F;bNG3}+BNRb6bGa(I4jeBOK_Z|3r=R>g+hn<2^`xq`Juxu3 zivJx|4A8$$X762_Ecvd&*(#u7*^I%0umq_Q5`%O2;a;cV@>~%LixQXXkQ#n2Z6P0a z7;DM>aVhE-p)eA^?6!t^b?LA2m0Z5IACTS-fXj|b(l!j|B47FbrNF+69Z88~$!V{3 z0l^;#c>6s5G1)TyZ6_SY`BM?Atmt$(YY`YXmE7+6regoXI z^lbyuo5Xno+Pm~=1BB?7BZ#Vp>fw6KLxF{R`x{f-lHOzi=4J&34E)JOI?o?uB@Ez& z@g3bHP5rE#W09OEiTuEb|3Mz>!H`>daz?fe2z&iEc1Lc`R_*kIVHd7-w;UJ;#zOs# zZocdK4<$GK&OiDF-{$-Mv6sUeX;F=FEaHpU6er_{*oxnx98EX48ClF=okQ+8i|hD| zbzl56u}OAdpxhy`xj1-4lr*#qOw25-9Na>(N-8=QRvx^vmeqctT@S!u2_!OqQ8xq& z6Ja#Wu)|GkHfCGeayIsK%B#oq_PqWY4Pb-ExP97FjcT5$rsTrRjoIHO0?n0Zuf|kIa!1S+ zW7iE`E3XppG}oa$lm0}8lFXH3chG>W&tfQMR4JzFlB=pf zR$rO92R4_nyRN-;>~BXG+BDP*Efu$Rq(XUhH+zXXYe8tvWa=n(M<52n;X>@ss8AT^ z<#ImqGZ~5-RfwsKeA*Hg{+vQfe z6Zu?ZnqLl^g5XCXS0rf0i(0F;kBR67;qe-oZcU)%ziX-hl}6 zsPHxywyO!dJG1wBVMiO+g{z=>7@M27uY<%rD5Q!jqy{qfq1OhI6E|~!_S`ow?!c z4c60sy^Yk@N&T%gIChJrdtZIL>9b2{bl-;)z0x7PW2=8P>#lI9)d9z=XjkeDzCHzR zDJn7`bf^xn{ybsRAu+6KwH4KF4ek=20}stXp>C)%UtTd#7gm3XP5_EN zOqz6bFaC00_GW8ByIiU}#p{gQ&DIs69$rwrP1RSU{_+h#C$DzOvZpE$K`W4s1e{dT zRlVtM-QAtt!Tk6(C%w8y6Jb*v^fDZ=v$k%;bt7^dD*Hs4d8r`hq z|5U=3ARQelR1DZsp=t6DuAxr*5$H^# zdwc7?n0tpuen0qdoV(Hw?55P%Om>)a1{@6eQc?ISNb(9v3RSPk~!U zJGCEuZ0_p~UQN)Psya1@x7!v{gNha5Dyzn1eEn}2Do&+k#mtX>XL7UzMlgTO z1}tESErK-uJX^&8Um~`DVvF`=aF`Frg)Lpb@wSPKwE*a4z_=H1&f~-hj@`i4@<&Sd z7<1gka194Th_@dVG{7*G*e5`my8>jRZchFnR1WD!_Jiy5rVZP?f!l3Qit|xZI?Z0s z!dDo=DQi-L%#`I4V3DlfkXPfYgy}lZ4iFjD=!Y)V)8WXirB#<|JeqW@yS(Xu;zTmL!$O+}4 z0lb}w;R!r5pG!N&t*)X8_{_73+!VJUK45pbLZ(_f`tLr>PTG%uM3kBQC6GH6Ag6aZ zwS>pPYZVAkO$w#B`8ico;}q!O{U^5K_rI7Zt9y)D$pYgy+J+yj`t5T-`F}eY2BF#n zO3zuru_BQTpm0ur(7!GG(H3}$%i{zYgN_6I7p705)tHNI(THICsy#b*0OH)Yn z3x`IB>f=-2=RBRav6zsg)j^telq$xkb zBQld^Den$L@IgJXNmbq!4_<+dUXEavU9xR~HHl@ux+1~F zvSkh_eXy{i96s~mD~{>oDmIR|smNI{W*oPm^NvA_bGUOD4owUg`l;l5p6X{m3fj4- zKa00o^W;FxO-qswW<~x z041YtaLtOKl{OGw+4jMc>zz$N{u{dpU%8Z2-FPpP65Y9N_Qvk2MTfuSYf+6L<<0lD z72nzW;-H|kpZGN<`IWlwoSKa&!`lN+D*!cKlZ)y&YJxJjB{sx)$hwj;f_W6i2eYrr zv_)g|A~|>}E{*D7lXJrF!Rum9n9?TC>vb`L8y=$y5R{14PG6&QbrYuLpK~{Z?nByV zG;JA>NL)J<-o$OxLMAQ@i zwHBq54&2F*tNT%}HXvbNtI0U4VATXLTM%kF?JLCp{xVS*Rf)Oue0{dVPjbQ%(B2O= zEZE3%N!Bf&g{j`%jcqL}W1;Bj?fRn-{F>AHr{gWH4nz#%X>%QY5=YQva5>rlnpA>$ z=kA2*ZXyomm4TG%$aHN?q}XUw3JIcZ`X-P_v&FPZH8jG^8pN|GC;~mqtoZe9Ttmvx z5kv__EDFPBA#rMg!8~Wrg^2YN4pp5?MYRUzz!-E>g}W7W(4m1eA<5%XR zFb4YO2hNa3V^pMhC=43aZoN!do>C)J{SYUJ$oik7u0FdwJCX`?@!w39Hkg(mS`TZu zLahCux|L6iW9OC>wyg;9N`8?5`;olnsEPECija0A>HFH8Ju%>A&M=f9l;U*iw2vs^ zw~>OLuUBge%ked}$`|}Nzz7;rY(&J=ujR(-;fh{R(}Jnr^dOvp6!cD^wb&R~Sv`Ra^7Rb0%K zwY+&RwT@DplCB%I+tKQEH`_`5#2v0~Jz$kGIAM@?1LB*rGV_QNc`YisN#qC{q_jv= z4JyJn=WKTZ9M25&OAI0i^X}p>JvU9p@oOZib4TJFV`$5{A$%w}AjkV`nM!b9)PX9L z%@3Kj@Z|>1?F^u(4&=EuNc$EF-iH zaiv?9R7LYys2@A|Fv7`#OZ)T{`@z*lf8B%!Pr!#+5|q}U9S+ky*P!Tr&q3C5Gb>@s(bb0kTD zJmhFeuw8edr*`|y2;Fq-prm+xz!0!ray$tR)Ilbpt-~EHjttT2vZHF^^pFFlFuAVR zg>HdCX+IQAdX5Mvv?tg6hQZLF4JrhbeAL3^KYBu%9oG=l>7Qq-+BETx-^u=`XPy0p z@1Xb(2==fg==n|9*LC_0Q-OKAJI{dLwv^0Qwrc9dXfeM*ISwxqD{!sIW5f+39RUb? zY|*j3+m~vqrn$L}J+OdBNWc1Gzs_iK+8yKiCp|uBFd6Z~hv3VPi?-n)l^=cVUOmC!aSME(Tzc0~4F}hW zjJ&p-650Y&Z1!OacUL_))ZI^HOyP$WX3$z!4$b%k^%R|uX4Pyhruu(a7NXr0r$qtB zh?eX7I0WH6M}{?3%A%t=_{oFH5H@v1YgwX?gOb>{%xjy!#+mPwjKN_JVTF(xpS;kKsbf#e%9+_!vzlP#W;J)PZ zb!31Y9T#QhH>fqHc*ZFj{w-2$+wK5rj9E{uBF#1^hMd}Volc}v^A*oPBpa45jDndZ zDavsHa^H*-twR-JGWE3Vy2(AgHbJLt{ik@+n-Z2Y*ckwzsWfnh|20P& zB;dIWcZsRi)Y$p|-QRVBbMU6x&c1{6n9L zVLpZMwqWyzU(u-8K*w4Q3k^>yC^Echq85onBl9VKMj(al*rS@=_eKxfh zK&Yj}u_EpQZD5^O|8A&)e-YLu4|P$|B_eclS^~g+$V({Sk9juBnPl|&YQJ<4_NPGm zauID@dE;v}l>c{F&=`&eK$0fdTsTcPD7si^d}4Gn4kz5)M7-+6Iy!uMdi(|k0wyMc zW@bVV3t=lOQ4b!(#L#BV;!QS-+X8=j#5XLJ!Si~#;+ih6A<=0D#Z_O7>%1Z<`# ztDhvuBgJ8fu2+U(z(1{{Z2W}v^)Z6~KPTG%&`o?yb;uJt{b++GB(*QzxVI6_gR2|ez-6KLsyo9u;%Le?$EinidD>m z^;`dWxVqKNX3eY3-GceJMO!pqw`5DE69l`3?x4Y)YXAT^e|8Ii z;9siMY+NNvDk^Z^Ocecy?}ai#+5g_KvU5Va;N|BP6c&|)@d4|L@;+b;D9*fSscf#L zqYp7LH8Y3Ea_F$K(R+be zNN@64TKSS!@_lE;ohh!|Qr3!1l6|ESWsV5jo!@KfyhUQ*nv`Hts|T0PDBvjLFg zlZ4e&+8bku(;UU79(O~4PUBunV5IS&NAwJP(h>E1vy&#PPkU{&T}R%Vuu3OiO^S8K zAYybuk=o(d0QVkj6e30+(su?Dm{e-6dbzIQ2iQk@`Jvhle4ufFoz zIJjK!@bL+Wh)Ge&(8wv!1Dmy5&x9+t8JG`D9Tq0ABnJ^wAm&N#OPGW@QX&a}7)$lc zNI?d237f)4zKu@;uq8t<<6Sx?=7T-F{~@^mc!tIp7o%>*W>3)Mo{Ue-QojI{l~{$7 zBKaF1@*N>LnbVCT6R<1jdeHOWx2n7{QO`3^wJq#(TO`~vsMN_1s-BPy)}L{(0UPbs z;1`!~ZjDT2C_&acp~!JmDOhSH>(fE|oK|j}xJhvnJ-5YY*1HE~(N+(kBm=T$X2$0( zhBe}V^NPR(aGL{210Y+V-t1I%22pt>ncTHJ7pkwIYGPsI3gao`69QQHGAK;fDp(XG zUxFllA_PN#aQ`P*m(wmLZ`=3cK2R4#kc1C5tt6w(iq&N<`7BocJ*r>(PSSRO`o1=0^3Veu5ogXkPAdDK5 zB9**w!~PQ&$X8!+31{#X#J?$A!Om<0LyZ59qK$6tple27utW)f9hYGVz-4E85|@FH z62ujd^s82MeQL8BV4raSGL)hCwNF-A*{32ZV=_K*fb^0ooRo_Zcdysh)73Q5`H+7$ z29*ar4>q#V(onO~Q8L)~nZc{*vDMT+#b!~1odE#Ao*dW(lb6^fYP(cGeZY9!2z6m{ z54iCU&D7@qR1=OV=fF7*0Ro4 z$}KJlB`piz7VqwI$~wB{wyy>**|E?f6yr;;e4;Ke@yTfzIk*Kx6;w6#jV;}KWro?< zCjf!1y!L)ABP63@V&>tOlvdO>GO_a13vabx>AA1}*gUAQ*LTA(sFV-O8v;6&^=?F( zR6*(Qo^>Orvg{wjZzHJc56e5y8P)jiM48m&cT6^@mfYNbPDN6S(f@AmDpq3Fds47| zSl*AZS6kkl$^qG;9e!GLdh8;vi?&>>zxbo! zCqRHf0Kw%G2qbpyB^e8kaE8F#zTMLZkA=Z0?-W8NQcwwCr4-!Y*9q9QAE(B4CgQe* zJ<-_^RSmn(p5DwYEUm0o?S1DM-nx(< zIkG*6x?waM+gW|pUyMt|EnAWos?HEAZ){PcKbzHaWVFo8EsT~{);4U~U|1<{yX`u|txd~<)hCj6P!6E1^#*gvXtcWEd!wX}8U)TNv5de9RPGSxE(is1y8#~1j2 zgb~n*uWHX^YTt3f^9UjdDV3@824@$gAJNd!>tdBEMVbuha@43+s7{-1zd@lHwMM6P zbaMCb^ycQ>hfi1EeEBIO6N_;Do0UzZe#Obb#mys`*JPQpWXqMOK)xcy%9N;7p-R0* zO&T<7Fj0 z2^P5xuAL+!Yayb9Wu00QlTAxvBV7^~_a*V!Jdltz;G({Esb0+OhqG7+Nt#t(^U3t4@d75YIo4c{+ z?~h}r-2KOeq|Q7~M_zEn4Jqz;;E5OB$ne3Jp~z97M1>kZ{0SiNhsXP0RfBq&3wf1O z`I-0mKNn+LWA5&#+{yoGTlu8NSxqs;R6Tn2nP$2fX6iS~Y;(*t&w%*`EwIoci$}7; zGRv*7(kiQivkHnzu9a2QG_=Z^!KDHSO3P zm)CiddwIa;G%y1EI3=hoIdJd@C?FlSTqZ0WaZ>%#9JrfoRBM_+j1arz$dxa=@?|p0 zK?=Lew`Iw(%|yQynzp-NH*Ir%Z1exvrvpE5Eg|Cp?uLj`+B{1Gt)M(y$%&3rq?_*e z8q`X=wnhZG4m3grj+E=V-)w&wgOjbB;j@LCN{p(A&AFHySDxaa?J71E6mYJqewVIheGiK(Pr)64ac4o$$mbAu_S(%+VnVWf; zp9NVs^Rg(5Gb2l~G|RF)E3$F}vns1+78nj01#rp%j0qov2oY4FQaMc9wDE}HTU(8@ zU#4rm#Si*Ao%3ye%zyK4e$1HfU*^NSoWJvVzRcGd-QvyJLJ(&{MN3hFCdD)8z;WOP zCm=I3JF9M5NeIR37UzcH&6aavq2ZiR6EpMa-5KDfE1uyk5ljQow@u9KOCUoi*y&9{ z{y*XrR!V#`Cm@=X158nPJwFhJigiKYDLmQR-|q~o=WAZ3smP&^r9emA3{%kQ{nsGz zE9Adw*}Q@Ig9{ceTD)ZGiU@!2s61C_D_fuS+#xGk@k-WZUDs`;>%JcAyJtX%f

|a_%82yN#$A|@MPAvF@Z3eZpVX}@r>`PlJKefv)L^+kz z)J-k*^mWD0|L0qMw;%E&e%hN4-~J*4iB)Xk8J+0IERc8}-}OS0H@-}vZ)V|%rXV!+ z%^lOZLZvaB%y;%rE^i-SezdSyV!2h|t>S~$u#B7{nX1ZiHnVl`F+1N_RuS@mh3hFi~kY)qxq-z8R^-$=kd=gpAS9X`Eujiac`%;W4_~msQei9G43Pk zW8%m1kEcF<{rKbK7(#~60nwntT5Y}?Z~6BdQ~N)_kqE0J6Fm#VPC)E=umH(PPA5Il zBlaq-!ViQ@t}h-i7l2JHwesCQvqf!=L{r_4|N549RJ}Xs-PzOlwilcnc+w}{HF~rM z0BX8MRuh9D$DJRuGCukXc9>f%OaoZ9X0@_Ine<>4nxoXh-b3H>;4rl)t*k|l<}K#= zYN_jPu+6kNTMVCp=?%-D?|8W`G36cQEyF%We?)#{eAIOQ!U~~r&5u95`}Fyn&r2W} zJmM)QIl*zZ59(uKqZ3DKNA07wQR}FA)bz)_KTbT!dy?@a{YlCb`xDy}(-Xs!#3#@v z5p)*+Kj%OEi+}!iK7A2S;nO_OX?6#7d(fv>QSX=0@)v*bE5Gp5Z}l6;3Qf6=tv&wu zO=Kt+<1?YKjD;*tg#@gyKgKnTtB@=aV7?hT#hLR!#>`6@x zHB}WQMFn|TDldzqp-03@096GZ(qivH7cBLlj;dEY+#AEi%UzWKRM z239UvidAV+Z=CUJwQ5JDL=h82`pxt^xgV~6#v*<+)19V!(X%<%JoyR~DO0LKrDly< zG>Dx0)2y6Zu1IsMNq%uUWX!k`qvtXJKvdM)E43TAa*%F=*~yKbkKhE<5b|mJ<4elq z*zc-B8(|QlK%_GP+4e$OSS+;68XK&)(Po=$vCR(KRfi>e>~22bkY<`SA8|5Z*{M^- z@?J>cG^k@$p?Ef_RWvqcE9R{6Y~&ADJ}_UKGjkf4?<&y*_>$u$%T_k+qo4D0N~z{) zlx2$PmJVZ>>cQELpXw=}3diP__6eM+vu-BMJap=E zSPpMK2P@X(uYzx{f+ec~x694jOi>DKOe+reJfo$QrLn{!pNCpTUe_$RDc1LnpU97SAnW{YT}KxN_sSu5Gxj|qP{$)j55COqWY*e zQc3Jt7m@YM{5T@_L^r<;D60(9AYQ9RJFB41YK9OC(L%b}ARy$* zMDg0N{;s>ICUr^&7#yDF@}CS|wGK*g)Z>ZR`wwSe*2m!BFIzzq(<=CIs)BAZIXfAp zMhw}1VkIRLbxCULgqH! zXlg!=fRvXJ*XExOHUi zflfYUr-~5u#uRGX&B2**mbeuQ0F$#8GLrVhhPlt}GFIEzQZ=<{$wg9BR~*7sZJa!l zio0Xk6>y7JeOeS0 z#WZNAf!yskC?Z&%L+et659)az=l@JHNkUi{o4CFBId&)>y=->af+$hyM32u+lhr!U z1#o%$t;H^h_Vf&;c#IVI-M+pczYagedABn^h2I^kcYi|$k$ud#jLoc)-N=Y8h*|pM z2*#CAVOljI@zl*~ME7Hhe@00FN-tyDGeUzSg<4v}ej|dgIJ%G=Q10ETreIqjMd@23 zl>v`N=HT+`3F$!g9+Wh0SAF}t#O)oahmADEpNB>uCDfF0JVcr2(%c?j3@w~k6N&T? zP!)HZrkk?I120pOBY3%13^8FNc}XSBr$#(C+cqz##;y~j1SK}-_$I(DIR2vM&T{AM3}t_L>up8Jmh-&WCAd`2%ulPfIJB}yYQt4sjCNmp zGdwS*7sxugmZP2Q8LR7dtNa<)f(W)_O`|IY(<2RHBL5nf_PZ^z0wJ9Ead_O(cvl{>auZt{%QczSw8vyvC3t z!71eKV_UC3D_d_5>&ZJU0~DH<1^_T0fCBtK@b>`kw*lXORq<^Xru2=%cQ0Lj_2)B| zrl962XqXU!sXaJ%*J43Hm$NTVprSMc^6yp^DfbHO6?S3IzZIZSJ%zHHpk0ZhS2 zii_Kk4@J$&2Y2>vW56Yy7~y)jGZF(Il~9}9-))OtYHqQpD>V?i1FK(G;we4v+xYy8 zB?U?WbF{ZoFY)4d)KR`m>@!H{A`ubPBOSLROt^an;;--FRGJ99un8@ut+j4ay@NA7 z#i5p(_pEK<8jy%1lrvXL5zN?OY+8}Tq}zYYt6x}Efs_|@_TGUYp#x!_GmNvkhns4N zYG&-Msu&KuS~u(^mH7NYb*dr__`FLb{JFrnaBb7?zYe(Pm;sNY8Vf`CHQ&ORj13qf zF1$?c<2+YkGMVShhEpJoY<{bf#cdk&v|sLC``Y_v7e$)15p_D&gYVyV#SLxF1R@6Zv0M3^9m@=%pyVUh(<_T5r}5Q0m9B` zAu>pmK^%~%j;jQ>gorblBQd=4HQu0im+XnT_ZUx}xfB;cNHa}B&dVG)i(|0*P&9Gq zkanLGOb8KYGKZ_ZO8HGmKpT}=8a8M^^8(B|NasWV5h7{0Bo3C*811rCAdk4k!qd{N3%j=m(A%4>Kyf8G=I)Q;N`y_#sVLk5S9Y|p^H zrX_tw@3iyK@FqQypL^E6mi1ZHBxJp}xz;%vXxmsle_9Q*?i?aI8*N9Cy4O3&7$!AL zi!gq)gLFdb1T=Jttd?=v-eJyUq0{vEq?qo?Y4fqP=^1|Fq8HS!hnz{1cUpm z#r>_pC1V&Xt)hAj#;;EED5GROMLL<(PjxLkJ=HY$8Bescp*+#YwLU&Rn_+SOv@Ept zFojl1iPBz7=EG$)%6GYk4h|8U%p1}zaCewFyJbd`MsdTI*h`}4l}ID$YVg5tuc7cLlQIF733F(;gzgTQfAZh)GiD?_8bh7}Be zL$1p!MH`T=Xd-ri0tTW5?C|X+dFxw*fGs?<#pA+p0)h#^Webxb1ls*GOgsuI3Ld7C zF3Lot&Ai&(O&+qcq{qXAqh`ZK>(^SUY}U==ybtc0=l}k<9_G8Bf1JC!Vax`A|5`AwK#9@W_1U4Qk;yIBnt+pPiDoD=0P z(`KQT8z<3)QD+zoUc1t?a-QoceuI7?k#zO?s8lz8&DGg=nRf6y^x_?>$tEZ zzQ(9I`q;Lc-c(T;Kt`CSf48n4}T8Sy++knUh}81;eXauYK$cNa~Q#Ft}LKuYY7t z*Sw}rL7jT=be+(EtI}zte@u}rWKAg`BwzpqqZmE(RFlBI21@R3asVf4H-N4m9 zUOho6mx)2-tRrFF!&>0HK{^h6XxPwCe#n@B*qmDVH;W{^x+bG+W{kdc?pJMVkJAjS(;$ghXT1GkC7*rwtm~uQX!0N z8pl7$m)Ai2n;4BjfT5_2@*9?5EFjE7?6+MI)>nyl)>9qyG2t8of$L@(3ivpyIScu{AzZ5&Ao&C1jo#3X{~3xV7;M@jN9LdkB&+S{gn!5mXq zI;y_nR}l33eouq6zvz>{;IJof+giC`kU67K3|>tf+c9Mw8}k~Dnwdo*r61M~>MIR% z-WI9{;RDawFr@Muny`97-yCr|wB zt5yd&ZBl_bA~8I=Uz-!p-2jhB zfuZ&DKEw2{l(zG^nIxdq%=KH`hP4vDcDTmevg0a%_&grh~k>iQMD6 za|ReVYG{Uu&>M{z8YUv~B7PPu7XV>@$O# zFlH6dwRHCCv)jwCtmz29xQjejnTFi(wmeD_Tc?UC{l+|(X190L?y){lAD)Kf5!y07 z+xEvxRF{yh+t}FY<8Hg%Oo2Dl1~vka9?P%d6(o6Zi+`k zFE{5fr5}=WSrUB0KKie0ZB_+AmqT24wxM(}9IB%-V2uQBKnNQy-T;>g^CX$12#|r( zBP25X%+f-UyWNRKJ$7^-NaR}Dj1M`^S=#5r-}70p@Cv|valv*_%F zi1d3-bMYY?lF8eeR+YoFeMWf3BUZ>PN!a%*_zbv7Bp@HEY95oL5L#Z&>&1&)xsCCf zx*7(mDMD(sl4SQ+pWp@qw;nB}kzz^4x_ypA8#k@9Bwz^1@KLu@722baH=a!Z1}%`P zG-gf}8io=FV?`$azEK3rmjN_`^l0#4T^WZU-XgZ!Isig&ZR+Ngbo`Tg9KVLt-DW1f zzc^sF#`9@mn2hQAAA%RJ!(|5YoRvtuzkUuRfwBok_yug{N{yqSHE{P$`l8I`XVGZq zR8*f@cs!&)VaL<{>p3OP-=sx5)&|OMcW(}wpy@$YZhK5{fAm6N)MfS ztn~aKlR8eeefkb7Cj(iw85$XrRMrG?3ysY@z>&F&kR>-O4S3n8U!^u|fE${VAXiDWmg8Ubf_mY4 z>$?h(?xC@R-taQwceD0+DpL9hNH?B@YUKYbDTt8=1M|(s!D}p3x0&3AX+ohr@_DkB zw46zHQ^LxGH0E@DEKGM<=;}YPZeV>h6uP?Bx@n5CPza6-@l94OpXbzLBfA56I{N<- z?q<6!1=^Vz6&79=HZ$R+P%(1`&O9E5-FNkoabOxX_e~s|L~?NB!+TG^n~x9j??3s@ zyp4Z)ZSOwu-tS02c;~72zo#7AjqaXM+TR84nt|?sQsB5CWW0+k_3)ZtM&0l*rNbU% zOx(B2eFS)8F`^qp!b3di?Ay|*7cQw6CDP|Qa4F*OzEU~Xl-~X>@8j4MPm&~aHd(=g znadQbBv_q|=0}+|od9v6k7kIr4`s01uG@EAJ*RTk?wm{2n(F6T55$(}1DR=JtgV65 zy9%=C(`4k+h`Nt?k1D-*1Y{6#-e~drHmHNsPo8WyDNv`yp6cAnTvN&jvo?6f{!mrI zhN~>q;#BfbOK9Y7I&tOW0Q{&-2`Ep>W6WPQo5R9l&nU$U(MMF62b&@DIl;=uF~@iD zMdv#eB^}ysi>ox#?~kV&qBs*n3#D3v1@dctTc5VUN^Q3tb`c(5@K~a4$D(x(VMxC-Kr*0|85E zEHXqz<;;~BTRJkv#Z}?-RIK}E=*c27c`igUzh3n;j{&~UEe+3?v6#179Ia3>KrEKW zQ`W%w0rQ!pTBf9|UAm&^+CwO(_BB7}Qu_cwK)%1V(PzCsYQ}O=>^{| z^&LvKAm74S-Sv5f#g6!EqNqZfr6L$rX>$afw9u}i;xVM`(v-`)M~b8ZbCjWuMVm_9 zY%1qEvenpyT@IU;F*EtX&~>pLE3&H=e?NWrMR_va6s=XR+^%7*TJI0V4QOiK7%4F7 zI^h$TI&@qnFmgJZUH&)Ru-?t9+m_9l+qcaXmiDUe*zpZ)ZHBk!pmIU?-P)=7$Xzvs z3JVl5>Dc~^R$3*#TOXL2p#N5@(DLfS`hKQW3HZkI201u;VdcMZRy?0+(e+08wB>V9 zg>t&Cl{-~sBAW60Fdqa?RXFqD07a`#18nHJv46m$uq3sO5-QgQ$uklbOk@$Xv`lhu zJdP@)Kl^``mVe@slIyHhsQm&3-P@9Njm4rv%-7?t7H{wql}v0eIfv9;F~1C574y)C8wn0R9Twd)05Hb1(q&Ny=zQ&4cr;hh4RI zc@xTiq+(!L82&k4VjfK4*UyDW@}7P{*k21m`ltTpj7>KWY@W@OYUk%8IJiSg!1vV` zpmc)ycnQGcivL;NIc)WR??3?lm(w{@e}1SX*20R?PXwIvkyg|xC~Dhg^;m+oIvP3i z)Epf1IH8*TC`t2hUj7fjFMxfg3>WPVz)!=Z*`}#@QgB;V-BBwgZ7$6eN|e=+Agc10 z6Mbs^TQoOAiw{&DCb$h!ipMdkeN#%>L-xw~IM9shG)!SrR(~*Amj`v`_bqXm@P@^T zdpXp?85~}gU7(%TidM2IasF1kOBJ#ofg&-SX}6e?qm#=+xiRA4HPDY!X=L3+PM z=k+z{2e4;*^dXv>s|CRhOYO9pmc#8C7->a%^;32y9e^KT^~UZ#qP;!gSL!sD5C!OS((s=1kk_eCe-hoch8=f77C=32xk zBo&*gB9wsVhKCMTc4Di($W2%wY%f=pCRK$zB6R&Q%hCy*ee05}R9!`|3tdtATqfB;84MD8zFgP1b?e)s_)e z5#XFILH&7CAI;C{aOt$HSAW+1*TWe8bU7>E)7ONZcznGMGoIyvlk%&4(Xx}1ky$_p{TSuko+P0Z9q9hh{#|>pb z3rW`IhbNZ7)j3*&JMvmw;24p_j%Gbq4gq@8b~>NzJC-XZ##S!0mh#iWq?r6yRS3^) zFY3@wdi0h#3!>1UnqPL(%`!DLHoqirU=xj51Ucy`;<O|Ue5sxYf@sfUsntv%sJNUZ~^Hy+X@FKi8 z-N%^Ly_WZebTmz&Wq8rM?uP$yB)3?Zf3rDSm0+c2(wOas97It$I95u)&7Vu<`*14< zhbjCZ4!5q%hi8^vt)w3|8C{@I)J=G^HrK{~jq>~a+@x~D@sv%jID2h~y z^vawON)upx3zI;i60mYzB~05KBs`NAF@|vUr89YkHlLb-4vL{{eEH((EWbxlB-v>$ z6=?BeA)->jon4L@rW!=IOE-%2Zb&tad#x|^n(&rVa}fy0B-=b!Wnj14Pejt={J*!q zCZP7%+VYC=$Euvu>oBoZvP>u7Z(MEo{6q6E27og%-VpXlXH{3G?~`t8JFbRHc+ zXXCf{s`!qm*mZPbLEVW_=P>;(DAG=kwzSU;ByJkH`E97h7*rnmG^9LCCP%%BDky!J zH#iKIbuZ_HtCU_j_{7lgEw$nk>E(r|Z1uKy^HX~-8+v-McKdMn^n+K}Ckyed)yk7~ z*E-NAk@;yW*caB^^+i_^#HlyvpS)URIN?#~OG-hKTQi>WV$x%OwUQ|+QKrQ;br6qP zgsR0n?B)>)38lyuwxQiD=q9!K+Bj@z(eoP2au!D?qrDr1%tqbaMkD+QDbSQ8y~1`j z+*$gc_!{amU|l56%m_ae-TPC0<@~`Ql9={DcjD1(B0hRu{!5=xojXlF22}3zBmww} z1oN;<+lVeMQqw@vreuzqZ>aC**+;p2Z`C}lQVFzPApiHE(5FIs!?2VZ6LeZBc8 zpX;+;(8I}Sx^qW5vL(N(ZsXx9#g{f~)$?9f4%B;5hse;Dz!GLvt#D8Fgx;LZAAt3jl_+s3HAMav_1jmy}}NUcG%ptP4#ud~wr^d9@W$%-ZHh z0R9Upo|=@y1{0~d8@pSZhgm7*BAjI%KPo~K!2Jmz1lHLALX|dM`+EXw)#7RMC+)~@ zh+{i)_9bHfG2IAxx_1Wix|;OUo@ z*rqJyH#b!1o-Q(y3rK*2*rwwCWgy>B#5?-gBru;3m&=I6wy7s5K@g2mB&0y)OvZXP zZL6$;@NizOP|sB$3;Py6kt*3FOn|4Ac551^vrX*48Pmf+2WjM#xI-t$!60_on==2p z7u(~*3M!$ybw?c&#o(e!WXLjj1%Lp*$Gp$>hl;n7_}PwUa@xiHTD+m^moYT{#JD{? zIKc>4GTK;Lvw7R7WAUlr4L&l@l7TTdxlI(%$Nm=LvZkEQ?F)`p3mRzjdJNqS5tS3 zzXVmS2G5hUjK4aA)euP~sD#i?;ZZ#-s)4yo+6^k`bVGGSl>Lz0@(FYf?_|HX*Db|dA~ zOZ8jq1zQuPcdeF?1h!TWhdmWZc*RmuoeD*ja_6VI^zb`kR+!qVw|5+k;SD0H~ zEWF}zpyAx-BWfT<4(B-aA}u=^p$?|1w6+IeWS1oV=XlN}k#=V3Kqn27ojg(kB|9l) z@P6e_`VtiW(Nuhl^3%(^UOE#CC^KhB7kb%Du*1GwQBdtA?TumI-H{1Fm_pb! z_7)zw=PY@tA4mdJvl5i>9%3mX^lf)vIpG7KBVp?w>%-eP0*_jyt@=A5l~YB7V7kW^ z2qy#K+9@}$Nr{2M`2!bttTL-G(|+V4Vj~1qHP_HD-h8)x&1=>%!HAc`Dl)G|>+N+d zT;3>z+xxi4S_Vt=?A>M9#F-i-fpIhEq|D>sWj;F}xI^Z1@G3*t3iafriNI19(BR|;1v%+0EL`G8Zu?VC` zq>vFS1rtq$q?xq0!%>gBIht+`H+)*WLjc0phm=ePTqi2*i16-ZqD-O+H_U0PSA*@a z`T|=nvz#zAR&8yTyjDSqA!i19CaiETV}N|O7UR-yWuL7GF5B76GTfG#Hl0yyUJ9$v zrMBDdUz~$|BHu506xFjB%mSIPFdWe;X0A)((z<5%!uqoV4=`EpeWrT)kfy8#R4uOr zM4LkMZz%7P+y&ie;=Z8&lx+gG&W21aVsD)cro8ym{g85v3uDz1?^Vrg5kNRwiX6|e zrw*dgQ?G~v^)k)Se&)oj_GC)kKPy5LIs7@x)7b8!rJv6*>Z{)5@@syq7=;(X29Kpk zxXjd$(Q~7TPfdWB5lqc(_&ZaS@tA-F|hv+Au!OSn|E>r?D~{LUBf3JQ9G&g+dDaJd0NQV|7rZ zJa&x4b^dPN-eu({7i$T97#HY``Y-Qa@Oj*`J$hn{10=i}`Xqy*nPW%S9%l`G5wLnP zF|ayX$p;0*aN^;#kSNpIo~B%#2RTW)Ij_Jt%KtYtWM(bk0&@F@8<#9?mI#LlHRRUJk@r1H2xKEXWMhxQ##{ng9Ym8% zC^{At9}8OTa1@);(gO)cJX#99T7a@^fMzGCn3}~@UJ3(v5C4kqqxc#gP=t+fz!hw4 zQ5cls#-t|0^vh(Jec}9iBB3pwt$U`$b1j}<6kShtzLS_mX-CITsqm5Am+U55H%~Uf zqIF023h%~Y!LsV^Na9`hnJGjgQ~2-Zy8(L({(2;ZEIowz>6L~eH;WI zH+4n115%O>>C~3fx(4_6To{IxlpmMl`4{`6Q(<0igKHplInVh`lD&o#s$8SZBv6d8 zpw@M#O$4=MT8+N9rF@g{U6h#`)1cB*9mWQtcvUB*-A8E5m-CQ+(rqU(znJB)>Crzv z?98aXjXk3UDm?7s*M-ij)!!7Onz00GkQCvF>RCAk9{@X?`ak$?XqM-Tc?WSOEuV(w zvjJM~+8mLSFCpfu%1R@2BgKANude?&BaN=quSp{4c@tWGP?jQ1ITKZ%kp~kxuI&>9 z%}ERU(!#EEm7=cxhf*t%h=%Z&)xPKwkF>0jIPZ6b}fzz!etXIwWV+#!e85x6h(8J)Dy7wchOJ8=;qcfJC@ za?)qi*!0!PO=n1iC8@D03UQl$6%ZXlTMJ`}YX9HSo-)pwyj(iG_8VU-pEoYfC$a~s zjAepkwDZkZ5H#M>ATMD3*+>ei$)kp-9FL&XXT%E~rT)}DM=^}-jn%~AsAc2mPdq{u zFqz>C*XCiF<3@;PmMgdSVLraoTXUA2-BaZqP3vYElB*_P1vor%^kUZUD>I_yrMLbI z=7pB~nH#6({Z-$#Sif(eZTnVmi$ciTXXo~IB%Op(Csok3Ix5I2cN^2R2)&l4LZys8 zk##gLxIW<;{uHIW=e-!`FYC-MvO7Qjy_qmyeQ}M2;Xh%CslH+qooYpo;;XYip)cHp ze_JAxt+IGr;f6u$D7WC47utitlu z-<_!O!$#kDt7XV^Fq94I${SoA=AZPSELPAu`yw@Cv zSKJ|5`bT`+WXRg|ktw5?afwrz!&4InWUmvYuQwv3wsd>gl*DiK+%TPM#aCWIFZLtEnGI?q|LgFf5kx5Vzf ztnYQJEPxhg63W07kGu+(7#OC3HjBG{0mB1_A&v}vqEs*cw1Xg8uvg0Z0-$w9O^U!I z#yLbr6qCuzMOcSe9L#Kwa}Y!>c9KYhh->};+RqkZa=2w-3BdV{`>U*Jr!mw;GZ?g^ zy>rf!1RKt}bZt@3I|XiW3EU;*B`H`)%^zBN_YuBV#UonQc~L^49qHIcp*^!3N%fCz z4a#|nMgd+hT-Nn4hbT|NxTAya5p4?U)^DF=JoLTd-(NqF8I?i{m!H=q@27xr<}R-N zr?%kPB}xqeSTV6r!CrA$(EhNs^s4Wa>F|e2CG?1N50L^yi^8a zMDT^EZBgdHlR|&tNmC$U1?uf_rny%eH3QPmpI1!^EC(et=I?RD>sL#S9)|uU*_>pz zklY88VjjeRdR{VC+%$1qxhkQmw7Rd^YEVr(07)XRCz@CaUWQv$Nl`dHj`R=uFDw*^xO{sPymHBhuMHrSKBC zx|Y8J>I|5wnQB2^S+i(ZkRcfETXO}eafPT0P#ShH0e2VapqQ)YXc#vz|JLl^vY7QK~;=3#nbFuO8>|S*1}oF3~1 z&0?qofipi1@L9jhTEvIR2WN6*aR^Yju4vEBFj5s+yq~~X`}tC=&HHKR zU#Z46rK`vWv@Sf3%jMeRGxM=>z0jc zSeuxiyOik$#eW=9)ixY8%$VfdUDuLyVPN5zwC3u~iR0?kOEObMJ=xh4xK{o&AhLbu zus&eRhQ**ZO$o~7Nji(DJFTcmk;u%teV$1w+Y(nCofBe%qVCf_J6KhY(opo!fWSx4 z4E8~)$S@FP%l(glL3v<$puEaEV?&il*i4(DtX^M=89X~RU zR9L)3RZ$t=?<~+PX{cTz&nWBVR0eJp6Z2aox&X(i_!s@C4tNSAdg74!*E0(ZTs&?9N!otn9gr4 z&@#R;(hqR5p{P<}RXLC|W}vz?$ODTqp@yd{CR76u3#Ar?^)_-Cn-ajWKHB!tfLJ~(vOf@D}k!{Q5l_i;; zY*$uRNk!RAhzBxRms!r8YN_&+Cvm4Gmo@2i5!(t=djS~z#Z9_0m%hMxoXbceSKUNk zm2C+u-rb)0+T;660hFs8)?A9UJ#?%7@u&-i)7no+Ma%r!Zx?-CQ<2@GHj>^q(Hen0z~2+Mh<%7@IkX|d zIgAGYJ$QYDp*q>=EVozS$N9mT=6eV{`p2<9xUq-&z-EC)FffP?Ep=@?Hqb2S?o$;D zWTjwqUV1hi6~5o>XPD6YpCCs-5HWH>qk=}(UD|qS@ zy=*@xukBqs5)>7hBhwRP|A@U46xI$9foLpbuGL33KTX<$e8{__;KV&d?*1_O*6+;% zlc3v+KycRi3GXQT1rS_plSof@{7=3bb3xAW`?ZSvbh~krX|nS4@zcu5WZ$7gYb-#>-o>rd6jJ8$n<}gi!@&AzWl;K5- zXazZS*-8&MCvuf_s~auW0c3K4E5Z@$==Ucl2owWn7V z(PJ#F*Emc)w){_GUgBu`D_B78yDZpc^kzwD#4Yy$Ql*ogo;vmwgQ z&DVh-S${Pd!6$Au-v^@^+&{gkCL@z>bcvdAc6}b~%m^ADwO>vDT1Y~??+*wrXPJe3 zvh8Uax={7&q!_+iWXr7)h!{c4toH)8UW~ha_#%-P~K0f5US;$;9h!o*!a z@T`slgne)3mAY*lEZ5!_ld7Bojl_A@fW;g6k+FwcIG;Js)S5NZP*6%wBrIUKo~lCc zL&?7-dk#%(Iee`-ybEthciBng#%~~Ee;Ua_*|}sBb`f_AgiD1LbI4}U?H9%Hqc6Bt z_`-viCkdo)sznGMEv1Q}1)_=sQY5#^;iKZZ;{mpBlz}OPr5*dgT%S^S+RhInsv^3{ zL@QM2z)F{`f}Wr%&Pwi+0G5QXw9vwhzyOpJ%>lXrDGhVp^L)s6%C2`hE16sE>Be4) zWgKX3!gnWdkKw-7Zagf?z&)s^1T?Cv?ERzXIWT?|$9sb4% z*ag+`>o}Cg-d5RPL(~P>kAXenMw35x7^0>mrlH&5a$1{?h^hHihJvIAe`d>LpwI$n; z5sY3)iRElZ;seSe#B3%@PdGHk1DD=$K=MDwhf}hBC7a%bF5GXu!inI(r$a+iL@CwH#pz=wT2VKV&-@&qp?}6W9%r=aF$0{k15P;(-&XkXhGBP!s#x;`m}GXH%Q; zfH4MNzQpb=tL-m8vu=I650!&~8}$Yez6f?5jyfClVIv##6_RMzT8RWbmjItn9fCiB z_!Hr~e$@~c@hZp}GcPKE5Irx*iF`%-yY{j{1RCL9(9CJ{cA83I%uGkWqX_cUx z=}x}2H*NKLq9#qa?%#PeS5q+3u-JjPQW0;+%q@MMybuE1e~NKx+jew?m}3_7&uB|6 zRw~fb=*b+`ZVtYEZH#Slbj4Zm)!6a!Wy#C?PCmfNGx zGbU|{7=S^*eIGqD%vdEpDj;1GUCSSc4 zKA$2@OvB9eZ)7SoLK$<1KH5NILtXt(Q;#fz{Rpo}!NLRL(1%a45F4WdeH*J|-lK>y z{o*?;K`9&gdVwmwi-u)kiHK>4U=h|DJPU_xp4LgCY->nkS!nQWN2Tp2HB4%W-64KQ z4Em?L25gPti#eC(#XW8~S_F>~p~vyXaCF@hL2N+V#x=40mIodAkD|m8KS##q#YQiQ z=!snTHa4Y>j@8HNur#_JOYWAU)37?yQgoUQ8{@T*G-K-w5^3{0XaCmC@bm2SuU>ry zX+k2E8FZxKodL&Y8*uMX209&O47`v=Hcg_mN#33S%;>2>3}*1uC|2%zVR^CKvOK;u zKc8g6n)1F)iW|yxoWn(}EWr1c&JZR4TT?a_%6!415%lJLi0y@Bi_5I0@~(KaXY1dK zHGwvxjCzZ#i>7*$6PZxPzC3s_tDl75m`z(Ut4aZ-jI+Pa*E+}Z8q%THX2avqrp-in1M2bVMpa?te zt%1;EuyJvi#p@B{*wM+cgM=MLG&^m|Y+_s!IWEJ%dMbL=$0D2Mz>x`76q{^Pybd+9 zmSe`nqV;qh!CGv`a5ezzG|;(rEjElGHhkMrS;t9@l&LUut<50)CX5L*5tGAB@tbb$ zy0L3h`v+RM!J$m%C%6AnH0O*osRF<;q2yQQ?$gf%9kt^2SU^bo<5#xYP2s1sf198E zWt#W}R61G*oKxPBolBL$YaIqHv zy$CftyHD2Fs$)gAc*JGGKeCi7i0;&wXyk^7{c!yle?wj$*-s3kS*J5?fm&GFqdUi1&-l#<#126a5A* zxqMFbsYic2f-73zr-+`o`i$ARe(CFgf&heYO@+KIwNFOY*i^B!E$FB%y7_^4Tl+eX zdPZ^PAAti*9KA80)u1bI_#E23B zL_k%R2ELEIPhe@$r!3i0pJ_VM9?Chu)ypwgu4-7!0$t^o#{}6O;_2pn&B#j4$UX&5 zY33cYVz(m!dkxU!u71<_@)%LNi>v2yxCY*D<9mufcDO-sP? zA0(z|nJMPS6f|8WKrVIeW@9s|Vq%Mse~XBtleN**9RGR+eNsvt3ykB^3#? zk{SWCir@x?#1vyf71_3&1>$yZ{YaI?!$IGjkCNdt6E(SHO+{Ibja*YmyYe+ntW(k~ zd=P8WTG3pNHs)9c9HB!PDU<+^^+-sr*2{9``RISATwj1!YfLg3*OJh%za5ttamGpT zrw~d&oKeyb;hKv6-vaQb5oDm2Y<#Z_>j8JE0TJmFWd!6##tS_vsw7cvfYV*Jpza6p4_k=!;rbgv))L4Hx zOvekv_?R{Jol5{K)hEnxFml~{BJDqD5>5Sd(hh z2~rY1xwzp<8GERa`o!&2h+&xe>g#K+q3wh;Jq^~x`cmoU6C!R<0uK!n;&%SE;)d9S zK^#&D;;}b6aJYVwjAs)>g&AOTJYaq~mytp<>9UWFcQMD=Jmri;bur6mrQ}O=>`J?> zl&%0y)L#=C|C_796TrAsrv5VrVEIPrnf$mkruO3xC?(BSHsyEk#FGldx**LgRnDg; z`ilUb&qC_H>su89cnm_YMOJHuEp4WuMT8X7vQxQz%vf{MckFoFBw-cY_{HDjajiI7 zfhdIQf`3qG3*{PsS|FdHCeMTTSk)d->SArZGMUU5LHo?V0_`I-+DTjB98A6Diog7_ zw%eM;Ng+=cb3Ppj%2Ra?n=nT#B2vdhHr;YP^Gw&ygIWbFyCMfk5?8CcIP(mk*#KZO z6A#rEeV#8$h{hc*gjJv|mKNIB3+qZ{oeVi*;2l1WHdFsW$&pkP>C^mFI?{wx?S@lH zX*JS>wBe@EV-xgCp{F8`C!EASj6@!0PZIL-w)kC2(C&@0P0Ab<%m`NL_L}yLGVlU2 zHbOTbssK=jL*;m$)&TiWgqmx2Yc;lBIu3-d(I)EJMob`YBy}>LzxIv`SzK1p#OohEq0jR{jP{TM2Vg)HFC|_9fTKj9(i+GfjXsF&;B!&Qc8b%#2iC%hlr*TN$7}33BKb! z6j^Cw(!X6|!trZn@$fx=THPL%Kd9pE^zk~+y}eOSHz7?(zBihMSnlnto%#!DLOM`- z^>o5l&Xc|=U(%#)V)JA}PmPsA|E{7N$Z2_Z2&U!D0EW{ zXO#e_|6?if_?c4RJzhRPBtQv&g|Y{ubc3r#_lfie_vmJ_M=TgFe2>!1Vd^3J(TaBR ziHPcCz|@j3;bih%_qKqH5mN>^2E#S?bit5wn^s_oFgCQ%DO)hW7!KJyY6PeHY*B%+ ztw_@!1Mn5|8043Y9Non-tN+v)ab2;zSnx}3f^}Cx$#$lUYhBlxt-_dF_VM?vQe(1zvhuC* zwb>Az-Pt}(M>K;iU}Mm#-ymdC1NJbGCM3u&{#@9petJtyjjOMj$cUy~RVzj|({zu0 zkGSk+P1PaPTTbaR0THP(yJ)iv&;}qc0Yy)AfZ6B0%W`zTBlP1MKi7wHTH71yOX@8; zwBto?yy_NJC^BT6{&)3F((5XQa_$<#m*d$vqTll4T(*R85ZA@TkZn2s+owIXuQQQA znEGj`293AD-iU(2Dde^tz9OnwcJ zKGSY8T@*vUq9mN-HxX90t%e(Gjnj^M6OHCSV#1D;xt)0PPm)M(Vr_hChBIie;RC?Al-%j60y=6OYNf+^WM3&G~kB6Qg|%MWSXEz z8_X84KC@2`I&makH-h-=--;L{e#erZH1Dl#Pl(L=$eSfIf~n3#CZTIdKzip%;DK}o zm1iwC^K6vw*JHA_ENV#1Wd zJn%GEWc2NzCg?uBgv1FwOf!K_cxMF`ph{2)BrYoGq zuOmnkQi=oI3n2og4x6q`yUv?X2?fTS6GP_>IPw0^Xc(R{qvn{Jlq6%?-5a#JE;IY< zS#5RObhy7HxD=7b!d{;Gh?Ug7U)bBz%|4A}kDgU()C{3QnFcddHhzL4m@iOFI~-$& zCJdHX2uq0CQRO~!XB<(V+e^C8RTKD9_Z*do+L-lD{mau7U7bv(qj<1fw{DrPf)HKw z9LnH}1BLnrmXzfki;D$j0t`Ksz*o1sIE~!&b1cXFf7nehQ0EtRe(4Yf^EI)SAEc2J z?g-u0hU(DP&~creRaPyZ1@qoXK|q6PhtN!t9%6}H-zV-9xaXpS<@~X7zNY2Bawa)%*peVGb4*v;ilszd62=tOY$5x^2CJ= zt>PzYMWPVRpJ&>^!<{7(&*Gx>l3^bpog<)bq(4rO0m56*IjjH}sqkmOi9Pkb&{LMr zNLcXiz zGLQlwXOrOyQj#=2Nl6+Xo>RJ(x2h*3OWVNQ!#-FQzN3P*c^rq9<`dVm`j;cfD(nTq<{ZTzgKeaXE^;a z^9jIuBEjrY-&dL)=aZ6>Vz*2@N<6Ulkq8GQ9xKL0{u6`wKz3n%J;3`rJq29IqB}3Iyt}ov+-kU9vhS~VJN{RL=DL-> zg{G`fH~O$XEXTFoAfehWhgk};U|NQXMLqOM6G!tVB{HDQeTfK8-jS@2S=gNXC@pa_ zLzm*Pu-@2pFiLh=ZJwBxZ*f*j3}Fo~;PUze* zonp}D;n0sBFbfj0u-W<18sa9VHpOmX;WY{!oRVEmy@mDCsDN;TAd|=3u%r0c>pAgr z=1Atuk2+6661=K&bY>WB+{^RFA|9&Aqs0gzwThiPO3{7esE7*T)JSH#A zW#j6ppbnL#r(8#d#rQ-a*Z(WTrt>r=DxdTB??lt@l9&^$4x-!A2zrx*^})I_Q6VNG zIIKA1afrz!SLbbdk7GC^5!p zI~`9$pozw`;BSw^dLg&g0lj7Byi|1;13|vyAQ8i1#7;}2?0WjjeWYPY>>cMbtG0Y^ zTwq*q^AEWwSx<>H{2xt`3zv`jLYxe&AhuT(Ek``0;D4?=TdQ%6 z^T;pB(Q9!+{LUEizd{3izYwEMu@@#Y62+=`&?J{d>^uOh#reDN3;!Ww%hB-C1Ca_0 z6V$}Zh^w&{e1njNItvGm;5#r}kzI81eZebg;j6fXXg~ib<^XmARw%*#78y~98%In? z{WbO11Y!fO@J9shHylcUU4tEvNBPI1gW-eWkW%!Ndygg2#CNeBjo8iD#+kA2h|!YA z7p7n#rK@nK9C+Nqn%>pO||+{Mz$3i)7mj%QSu?I!Ii^$g?(OwW#U~^AWY(dH)61<;I*Ix-^AvqWmlCz-Z47)pY z4~RG-p)E41zOIooZ(&RhUxpSxyHmm{d3Hw(K~IH;qnC;AJllHiJnI}PIjrSe5e}I( zZ>%++#Bhl3jfl1vSq4@3uHlEn!(l1|MAQs#%Y0!7Qw>MUcI{M!&Gw(~w8R=U4XeWc zNTpO1g8j~{3YJn`!Zundg%T~N!fq|5OXMEjYY#0e(U{56x6k>xYD&&mtws-=7| zuu6HvyA(Tt6PuVyd_pK^+xq@D2quXLxlQZ5fE@g0IPlG0Gg8I6N6Q$1)XJn9nV6l< z*X5Z$4WJmLRhV6wc$VCaJ`*{SNfW!UW9fiS#KRi#p8&3jH0)M-CU)=H7Z+>7YY+g) z`x6?(2yJR_ud@F4WxA5d3^2ouYzcBoc%w8fLoZ;49{L#C5)_MM#tDV|IS#k#WKpuFpM=yE_(BS%1-Hcdg&>77 zv7Wl?3uY|{4(%PXwIF^#__IkbL{J=_jXWFGPU@|n>sKs}<`@c2zpAmn?KKM9(zC{k z48~T`0@rZkcEOCSRztz=@`w1vOK2TmP9T(zZzU}4wn62rB8#PnC6|Xdt7Q$BZ_8M% zvc;OcP_`OEv~MrGooYh(1s7}h>w-K)Z6>0$f#;r(BBB2gU6DZ3b^b@zjH8fD`Pdmp z=Jd^ZbGEzdVOJ>G{jkdN*oU4iUuM}7IkkSRqHxx%LiyUd?#Rv7Ww=cpoS}gm7{L>G z3KK913t&;u5kefUEu{XAew;WxTi9VTg}C(Wbz=3x-zgn*UE97o>N*%e*(V5A1mAu4 zkwx7eu;c7bI(5hBS1R>BHuEY`7@iz!N1Lb@sc2KIJv>=Ryqbxn5ekQyWP?M+UcS6w|1q@X5Zo>miTYCsF-ftt&u%G0dNT%L7O))>K+hst46Wf#f7Qa9B>>LSR=PqSY@`=G(fT$jiSq zhQHq89~Y*j1lP~pw0LVw11-HGy@JLeELm&ohVoz!^|}=^%gSab-R_ynMOMy~l{4g- z3VDX&(o)PIyC@HPLKz2-11V=wl_2YK+BHl?0<~00t`kGk@q4c0UQ)9CB z_MJ_%b`pR7`PAaADWFGN($=yV2JHCzM4i@Gc=4EI#wvu1P;h|XU;(+$b43bi3QaDZ)hesr z<}6{#)nCf_)JaZ2>)x&HL1(OLZlGXlE4K20Nns-KV{H8p77Ea_wt!ThAA})6OeHF| znf*e^g7EubVw;*hol*`7Y^zZ+e>_PJ!*=pDB7}_sTW4s^i3|{DbO8T_VT+iJC!$j2 zUZm=Nf?ZQsQv838GSQmt$oN5#ckV#q7V?c}u_}SW`o{>!p$s>7Ghrh&qxn~9%B_h#I zun>161O>FiLb9e7I_?kM1P5;O>8?OA+OpveuErH=K)bi~=UN-kg050$j+?XA|I`A~ z*wdT+A7syQqzM_^DbcDN2{cvUHh-_q%+_I^AhmQJ-d<|MauQuaFgE109!KmWGgXjH z2V;K`_)w=K;QqRBEfut96eI}=&QvRwMbX8TC@H?4BSfCqqQ$Q1DZ!#9y;{QkF*Bl? zwqY0O1y8_f1vK~x(56hrxF!Lf+T5yUakAQ`l1sHlTkgJ%U;CQEq1<=iZ=fNp@%U!E zcE-z>-QQ9`BKVFA4Q=^Rb*cQJD8lcYS+!aM4k`B*RT?dXIdh9{qz4q3w3a$|MHz*g zyWU?}C>C5Xr>`QKSm$c^Mz;xJ;6*JyQ-jpo8aWOpy-aT8HF(_(ERDGY|G)n<5Mgj7 zXt^3vN30tZ!Lqmp6GI#6w-BJR$TTg|ALErv5t$-QGC2Xb6<=dkPb<@9p%u!kyn3&_ zma0z6F-rZGvX;g#VWU@^ZN(W%SQl6&MqKMkl9Ay-D}Vcq&&6&<@R;iuSv2kt|K;FP z)8?xS_1~z+I@uT4`;V#eC|_v~6*1XTjYa0S!_N)S0* zy^+RatnnUQwy_qpI~ip%6TczF)x^@r&iWMh{Rv7SPmA~lJEcI9`zpyv1xlM&7*-f+V}t>kp%J|=Cr-)~ySIk`w9wP+U6;3B$5+7ptInKMX~ z+Y}9y{PaP8MulYjZq7pGkIaVYuqU{<4xbQRDeewrh9Fv#WK>9=fk5A@WW?vJ))b1X zHmgupi28pLcw4X1fee6>ydnvKTDrKE&L(RwdtpY1e?1xDAg|+xsCq{zzA>v z4-M-ZkFO&#T|rRpTJR?5{jK5b8-|emzN))@I5g^N68Jkf&~bFb+2tpWex47a!KCdG zA#2Lh8uIJQ2ZAH!B!PFqlR+cPhPU7TrE&lyf`vPxLU*>ygKr;>-FZ|9Qoyx&(8%4b zd)oJ=Yl5J81K?xOyM5>3m>QFNlND;Ee-d(^?n1L)KTYT14!^_a|G6HCo|&_oyKr5D zb;=aku*||FLL~!OVdDH=!W?dbA3}*%fMxc)!o9F0= zFW{_;SEs;+m0_souyywXqzUQw${zw%e5p};mF!%uUCP>$)^e>uz=0AEm?=Omnt|1; zQa%!74|KyWt<$y-uajBaE@|pl)-=j69qNYW_1K9O{bL;{;bqa@| zO)>i8PqBF2iY>;PEu>9im=doDGJyC-+O1CkT}Dj5oJtUb7DR!EK?z8$7chHh$;cKS zC>LtYNj=J*TP7WynSNax@}~y`h7(#JlvI5~C5hkl@%`Ny@SYofVJi%Vs@{Q*K*PWD ze%}~cdJXLMU&;>O;2P~rZ?D&K2Vuyv2xsU|^uK%%v-LZ8{2DG02d=v)IuRf2H?~G< zu5A|hJ`L>OiDYPl65{h7LXD7Oi7Oyc46t}7D5PZNY{JKR9KC&22(6FS!#Sx9DB&6G zK%oS>DJx8$Hm(UpZiuJLr4>H%oKnMNVJF`tb#z^ zSX6RrjG07lW)q5_D>Vh79hHUfG5`BOaE>UNQ4tC4<(b^Un2L^6Qj3bP6;xGThrr3b zU)EBf1tL|LitxQ4f{v*CZfJ-$B}Tfj00lHgTF`~4w3Um7#HPx+Ma0i`G!Y@$q?rDN zM%Me)7T$=>ck4tX!J!*P&@M7VXoF~|iR+Yebl)2}$M3G>0*XF}D7fa{^IFT(a2f+# zg((o`+{(ojt*KEEfTy){!L{+{Bu=Zmv#zbQ<$`mp8~FZc+xSUgwZ-~2fBVI%Jb`ui zh_{(v8KGI6C|j&v`FZ;_c{Eub?Z{bKNV!oNjZCVX^JUL5D`aclTWw4k;io!cBM+8B zp_!VC#mG=|2z)b_q)PChX6B(D0vF_|rlG0`h~9c_`0Bkfy}a8V;8UYy4C>ZXtKKEz zv|2oT^5B{>y>|F4@bdTo8f6E^;0=*xVdXXlV78iQ#R1&qxdf%rTs+l-0r~Nv+WkxJ zof(5{iY)06D*^YTJv|yeNk?{hLvC6hzCe6q*lzFAO;MRO@oT&40E4pX{T+93pNoGA z%TC=f3vsYfi>VjlM@&mXp4M40j3N}Y#Z|RgOz##{#BY)|pWoqfEK9Nq+y7eRpRB?C z5b0+k7v^^Zif_OeRS>Zr(9_-s(y0XPLAK`4^=zVMs~i4U7=LI2Y3PNJTX!i!5{d}x zLwu^OMj6-#uner_>4zinUAszP*k9KDM}r>+<=}A$ZM0^6^#I)({OH32eB<(F_}Y(< z{ihbvUG=GJgOjKA`U|mev<^;@usgTUF_WJDS3a2t6>txyiazaNvvf4g4ASUH1QOt2oVlxNm2Zp6Qm8* z2e@>ZV-JF-1z?+k&f`$jCE1(yhM=|f@dhOhbw)6JLIW}Zu{faAy z8DnhHVEI;u0*w29AQ1yZ)3RF2JJ+C2dc>||wO%1<*E!pTGB*-k1=uUoN+-Ypx?N~a zU5)`jq@n-8`|PmD4l;E;71~}qTfDGwM^$Y*K>d?So*5aME3- zT?j~dneu!SJ7EKUW%SrNT+*}O?gO-F12ob2awjD=W+jdG{+NO4Y@%GGG2XDk&U`}@W?@)$fQ>C+*0J~-Y=d=s3^3a$-~)=X6!_u(X@(Ir1@nVY73cmm)6~n9F^iL!`-FQqQe?H8}DN$a$)?@tpa(EZ5+2B9Y?^4(P%M_5XXeAf9DT}uY?A7#s=rNKUKSi&ux1o{QxtOug(LNINOD z%y|MZJOg(mv>MeprNSnd_sgdb0jk>jN+tQsa)a9g!K z=B;iWFf|V0Yy6q?8xq}!{w4AXcaKB*8z018B}Fq&{NbzKwmbc`#Cmun z#;gY^e~>Qw_c5WdOK4U6O^~Pj?s`gxTA$v6yRS+JUsEH=YBxVx@e1~pYeR0GZLiw# zT9!q;kHGwOPE=iVrBBL{?{X}%bbph2k12K~s62+G*%))DnW7fnUGo`1(k4Z*2WvuK zQmr(~*TafWa*Ji8wO!y{}asLne+bVJOYf+8@KkIoKKTjmBI6Y)%T{FsN{4C-8Lci z6jGsyW%&@m91w(vs2ho&I3k@#NhXX0Bj4*}+aCnBpdABwG?{pq_=h(R;tM!K9P(Lv zJ0#kWXgdU_i}(--e$V9c2qExO`qxsBP=Cc|Hw=kArOO}HvN&a+JVI~LkwJn6?LFS= z;IOHy^nu+t7?uK=Bi$qzA%+x9DMXdg>j3ebuygv68&CI+CHQ|Q@V0CkV6ji!3bR2t0rDY>iTqli(ob^(e&3AsJAvOYH5{LMud zwxXe!jBFiy@jA71uG+cidGA`Iqv-7`Opnv8XR5~`DwT-_&&osRrHNgA=OYEp62C?!ln>Q91#thDe!BOMb z)zvo|4H*U>L#E-?Sd1Io9`c9J$3Mv~BpP_0^c->+n3*&a;^|QYvLjNEl@^(XM`x$B z)yP)$(snqzAcIsE<|uqIXJqSu38j1l)xKQW-fY@5TXRf1W+RLZ%Tiu*s2 z)Vim`+9RIv{)ow0PXTE}b&oq+o1|$nS%fLLGOgB-YoX0}lV;blI7EGDYB^hX*(pX% z<5M)M>8T+bUcVUHi{)Tuj5@I2gfqtvOaAlMk_By@TB`43WOA zO{8bUbPx8z*h6xe#2mZUmjD|#*ccr*{7)@AzWB$(E|O1+qZ?ZffY^sv9q=^7z^6eY zYR7EjBRicD5oZoCLvZIzT_(uY(^z=Cdekxkk84{qu64Gu=2yyabH&#W|H9r2^A?`1 z7uSz(I<#mbN!2>eNTZi!v($-LN=DEo#t4>Od0o>wco+dAm#seALI8g#B*2U zwH}K80oiP`8wtG4THnJl5o33-g4*$|Whz-!VfCbD6J0X%z~3%%FMe(?!=WlA$P)8W z8g|HIyHCMRs?qGwhXCd$X!@Nn9%b?GPW<%$M~|iy*};()L_=Fr63>QoJkILh?<=G; zf+~pRM0Fc~1Jo5TT{C?|`s&k%Lqk+Ks0W{^=~=LIh1Q`nnVtvVo++G!bR|rF#D4F? z)3?(Qi<10i5=yo5$8u_xL6ffrtqJ)7GGo;m8(vMb7?ho>fZU6(02RrpW0KK&kFSyo z*H3_qi!xBZ))m*;F7wd`^aS3b3$%V+s=SI#vL1|~Oib$UvGqSnbn!#Ag-V03G%!tA zzAMRXG=y8 zjD`72zd#t9wjPnzE6{PO|41|OgoL13%~sN7|H}lY6`s76AC5w-VH(FB`?AnSFSM0d)f6+vL#0!kz$U(fW$>U}jVW>ki%Ja*rv{XGV8mnO@ zNQ-k#9dtvYg;Frd?1d&lF*j>uYa!ZCy_Vjas;?iW3D@mFRBg>-%Y`ZU2SA!s!zeME z3Mevtxxko4Y0;-9EUBBgEISvzv6=EQmjI8I%xcDsRI{cyHS=#xaQRZe^(;lYG@Nap z#Z(?j#}yEl4wu|NINzRQHTiI#aNRa!)s{@QT#(A-YRaXx z6PIV_!2s|@do77is<3yL_Jn9K*Xq9!+;&S^AKPwLf@?>zxLLCMTKkZ*d8hh=~<$!|Y%sSZa3b^Sc3UatAnXX)#G@-VUc@?~6JqushQ^@l*`FrI8+QAD|%%8r)S-=0}k~#-IuBNZ^`>hxfnJmhg=^CH>#5}02Wsr7m zWv0AvlYIR9?lgCy1#7|2=|v+EXv3HPkdXgxPx|5Yn|c5T9RK?$iF=-y$H*y#Ze&koLfKZce#@4kiLje0k3eIPP3L3>=edc1l2vqAyp64Qh;2U2v6 z$qIcMyTxt?C#7Xi5_&vdx)$2hR&CcZE&tQBQAY_h<4jD zx9*mLe`w)tg#hLWTbd&1MGq1)RZR3$R+fFSDPlc`{;aAPN_a2DR6up+C zn;hmn2S(e^0?icx^O2hWs1vs~nta=J-oH-&h&RHfMxt=FUCB>G8!4VtXm=C2I;1VW zq`}t%i=fU*Js{4ssq;xvQz7wFzpiz^YstJ1Xa`hMY-l`i_xpmrVh>k1a1W-;>fk@DdGf|Kv$%``Js$1k3XvR&G>|IWb0fM zUCd#Twj)WVkS*Z~3<+`)E3&*cbQG7<@b^D4geM5pmNBuahBR0WtJ8(Hyw`j`0h1j3 z6O*h9v;-BbgsmYB*1Kw2+J0X1P|sy>ue;)+_jH_|d?rI16qk3B`!~0E<#5N(9m3^R zVJC$rlbMjW+(hnMI5YXE@My?{g=rsNl_oR^-!>*p624JSa>Myt6$#^nZ(9<&`G2XQ zZ$MWnbi?lU*kBj@W;qu;hkG_&$SW6@+k>#lGP2e@a$26T^E|5h1AX9J&4w3AW}qG{ zWmiOXl!V}eMd(Dq|GGit!`J)E`{NTd?+4xzquA5*2x3}zDL0c_F)|D=Xdri#PR(ip zQ1|K_(LB%^<++I;RL*XfxW0)Q&*8n!Xq{a~t!)`8HN5QT%8}!HG8MFkCT3Z6!-qo$ zeVsL@U^YOB^UO@VgiQNI1**YGCrUf^AM|_1hlT#IE@~eBup+uXrQm-h=&bT>7?zGm z@=vH;u8-%MKX2Imy5SUeoGY(2)+FhvIG|>_Z@B~e7KA2T562H(I0kZ#T^Pa>2Jao? zfXD6)KDTyvSpk<;=PG|`B#Od~!9yZHm<(Rc)f*oAlt$9l)4w?@=>0%g|2IVxyju}J z0L)|*g3#~`h#rtnNYy45Q}oP3a;i2r`Lv3X65-r`#IOiiMhXZiT2(PQ6RfkHFs?0MAfOYqNb!84lI^zfL$zeko}TOA;;qFN zjKzdGMfwEvj;SRW)Wnyw9-k>w1|F%#NL0-stz4rr=$F_B_-}b#LMp0u8{jG{Y=U3< zU5st=FS6YyWgdimCSWhk&ex3)spwFq__B#NxW#E*0i+BHHnP#lV86ChLF6-^n1NI`i6>=+CbU5A$BP zR@%^&oRp^1&kmZfV=j{Y}e%fFM{CzG8+EsuX@L^uhDocQ1T!9 z&8fw|zw~W~CY1ndQOX*Nh>8Jd5#c*weojWt5gs(eU~}9KO`c!yCyKt2Ro|fB{K3EP zpuxbb>`CMl^BF3bTflQem2A$~^;fpBvf(?es3ZuKVDYmJa~KX?3eX>4*M}M+l^eBg z!BfmW-_-bG3e5iUYH?5xnutJ*jU5%ZQ-djgk&7}%<)Ed6fVl$PaI9QCuA_5`6I9Im zKp>rb{Pi@x^>0U;+x0T&tZ?nVMq@?@i4HX-fO;U?^4%FJMEK%8SD16su{o>0q;nL*>@PJ%^(&bAzk9VWR599+dH8(AKI#|r^ z!Wwg_>yW!#E^~0I7f6f&i1-p73Ldm!`pCjla|UQ{8yy+2PXBDoZKX_A^p!BePE$Dl zJ}+3f*(3!mHjT@4rsyj)T8?GL7BiS)u*~+_Er2@s8dt`JB7}6&7tYnKa3Go~kQPxW zF<=V4oP+iN5Xbo4E>&zbFqCi>_vs#`{@$zsA>ni2fQV7P&uvrNWM0N18$)nWho!DoPnhD5Lg0hMRXH z@RKTfs4m=u{mKas=>dVy*M=ejwi|?fASnvz1v}qnz0iIg)JD(c|AZ}FAZ!sRsDqJ- zv7?LycXg`BDYz*Li@!|QD|1H_BxjYwxTo8;mPtF){-CJ{goiflIf71n#jmI*4^)6c zA=;ZvB(Q5zgPfHfTLLIFxo##^f&cnoG|p`!!V}cyGuDsCi`Jzkhwa9rrPe;;t!l=%fD? zen@m&q*F$_?*pfE(4bef3Z;br1)O5K*B+448C~Y_mmSI=bC$hHuLcolIZvm8iH_iX zoP>-g?6iA;GKUj37?wAqK_o`5aPLNpvIsiZ!rBa}hM5oRMQ%Pe@x7FpwQ<~D+smcqg^&z#*RyQk z9dlp|)G!c8(Nhl*5#rJyqxx|%K&s11*-hOi-vAuzw9lkRi^B7hMd4GRfT z%7?K{t1dY6zGQ@4Jf;CnrZ^JhHtdE`KDBvyIgS&beNponFfgPM64 zWp){Ar^`(+<(^AZ`JM-9>qr=xmT1(DYI`di5}T^IpbHdz z5YMQ5y2FB{+;mfeNNWXtvPDF8p72gK*x30n#D@fom~94-`DBQ}h{2J;pwp_?0OEw8 z&qQluj*UT}E5vft?KS2r1}Su+Fs=~eym}9gecywLPMWPBEuF?2@p%Yc97MwS*?8DU zp@5v?aP#EJTh$dbfUOw>piZj=9COhC+87NcB-bsY31OsF?@g@dDrmb(PgM_ZjJkb>S9KT!dKsh)oIKJ^i z5ls$9Jlj7X_nYIzVKhk`o#wIID+M1-wssfkI8v=e-0rakCrLbGODvLk8PVrT%^DO< zntB#q#dA|dYM=*?TjoS8+~MQMY{vz!?FlGf_AGiP-22Us*@3SigQy-iD4cr0=Ui22-Cv-s2ohNj5_dBCake)-|qMz ziFhFjlE~kV(bOr>A~1~`V%dH}Wayx53Tai(Fw@s+>V6ln%UX$-bD%V)mOdlA{gLI; z4O_@&)PMby&DY4*=>@{0K^k+4pq;otC(_sOGn)w65?*L5W2p!86ma*PhT|h0>fCNx zxZMe}C?jb6h%w*>T@{bX?4#?5^yC6+yFu($hMAkLBt?!Bq}>I;+7V2ia0Tf)_|QW% zsBetIRIGnAE6c-egk<4dzTlh4N2)SfP__UwQS#dgSbB;y-r=&bXGyAePukNN^P~#8 zD$@dGWSnO)9=3<5t;wUp2wo)}Jl)eb94r#BV!guIfj|;v`BaRjh0*ZJ{lYs~aHn0o zE#JIb?(8BP5J-7O-baS zIbfln8`sq@(p! zX1*>mi?!T;XT}wqRhOsL-prM-5{0mq@VWCmm%N-#*s9#?Sa>{0j_EPvKSJRq-4G*K z*Mi)NFPFGc1?~#Bw4@2EWRmiV!3gN=M%%`eDxc~jc!%M070Bief_t9t5qx;+8#^)L zh+=KM6$UFOt``rm1YolebM4mD!Ln=hOf6R`F3@g$V2~`q*Z!q$wE|x-JC{7CXY{3Pt6(UC7G+EObakfN}Q-g!O!xlwd9)JJ^JMMP#B*yFNuK@T%| zR6HP6nOw&O{ognu0NkO9_3vBczk}isy!1vW7)(ISIzZ7OUjZaB)RtJ=7q7{1(tPB# zt)U^_M!F3>L__VG3c7GP#rmR?D=61AfE4{}@q+IeUA2Tkrq`VfI9$#9nq?R10TIU= z`T+QOY^wC!#J-7a8ql)jU5I|hv?t8`m~flpZWB$@@=&><@`Vu<9s?)>?Gg5)D4!2{ z8SLn(lzT)OQc)HLI@0zmy9yx_*b-(N5uVLMF$;=?(4awd0MGu)VeSVm=hsB(*q+D~^ykMLy@(S+FaknH0y zqQRZV3?g=)!AttK>o>jz$^7v_ zC%-~meO(^*Et;*irP7hxy)!X}_}_!M(#p_Q3J>BXgE59Ll(%&Bl?MW>UL(|?eZN%27U64Z?EuV_H9FY>>(tre~h3xW&^q{EJ58KVz znAmVQV8R2WJ<#Us2gEU~cAo_PRarYrbA|MZ6~M0SR7Q(MP0LiXg1|L!VuiLZ0Kc7D zoufmcN-8R*HxYgmIiFtIiBf8Ui3UBnjte32R(6t@>Y3TNgkzsO=2)h-PKue!tH;dv z>{xVo9zwjR>-7m*Fc8Y#Xp?86G@w3XW6r{6)yZIHC&nCyiw8_-9z)j!=sJlT%P0++ znQF^6-7negfopxgv|g%Q8e=g>osRHP0i_Q^kCpBR~-+4Vh?KcbTc54fa2(F>o`3IzBUWGsl!qA((`7@O-LKVmH|& z#$7LJnTLJ570S?GXAUv(D1zQ9)1lbIHuuZr{v&-12v46M@6X5OcDX?w!cC5SwZsa1 z0s;XlZAO4tB)0vtS(u-$mc?g~uf!NHUOmMpYkSiG82h?+&Nq+Wzz*AF~?U$X@{j zeAC9lq%jfM=23L&m3l#2_+_){m}Eft1jj(qLWH^UDB`VC*Ca~Tp8eVoDgwd!&mQ^s zAQDdyzMPYK8dxA|4kXGrmYxG(jj?p(GK2F4&^dKf+HdquNIB_2EU(-pG7CXhL`Z=f zVlDRSJ)E*?0X*;7b9vUxdO zZE}?Xi9H-Lw3+9lwK3fqZ2FqlV5TjZn4%4V6hwI)a?r43kDvmOqlHwwTOIqRlBw?! zv}UE=wNL3Z!3#C8rehs*J>ZQtrUMhwRMICgnr5z@#%P+lW7R$G+)h6sT!B`- zW^_MLUBilBIl4G+pxb%I6v}&+62u!%GKzd;Mm8( zhYpl1V9y2{H`bR3)%-h+rNemCv5)qfsn*96{CLocD?Xo4D36|2?8?!_`2x+(FRs9h zgI#}!>%3ytqnhbGX4U27;^6X*-5&b|9KvY4;by6 zri5;a>_lhYBx}g9Mj?eZZ7Ak2J9uc)ruYp8do7D8I(Sb*T6@jbk1lOOW**yU%gjEI z*k5eET`E;v$JPh-xUwdQbc-^VbUNqHoMHyLlMYXsY*pD;Iuup9*f-$1?)a8)3nDpl z^>~+Zmc=>UuW`QVGsmzWx~j*d^n_@^uhRu!l9Pb1J24%OXHt<$T-6%F73L^ZDb`LT3>$R8Mts`Gnu|kJJR-py6PV2+MzJ*KuwI!v z;CDss)`!hD*oClttDt#>Qjq=sq`78fln1#ayCz?7=|Q>IDBA^ zemN#(Ny1``6JAVRVc|p6e6?R{<#maoDXw0PRBhJ{!2pa_e@hE2MXl4}oA-AiO9POihGJwOZw z7ndXf)R0JHhamzlKu>bx?cJ4Cg)L*&aL*)3YuXi_Kt(C~iXOh6+4{aY0uR;>t(V)JR5;!G|qI?F5FZ)r@45_)jOD zg5#Kf~(TOTJp&5q^itW`Hv93=bucz<{~zCY}5d-}(_+cEMTW-Wy% zNVz$7#o#&g_pO%Cgy#nf2W>Hn!o#1(9|DxR;@%W!0tWSz?I`SHc@V$bI*yb^N>)BdKy>&z*91hbQ?=~&*#&AckVzhNDEmAcG#+7 zx7f{z*f_D-^=b{mq*by{BPp0CBeo#Z<`~th+7WKwpV~ZF<)gi-bmhCq*>CZ#xD#F) z$i`ONdJoX~*bNWamw<4p5egq6QL0)HG5@q4My_~1uJ5<^rpnSd5*PO}ag*z%HkGVP zm2z(!4As5s(1H(P&R{|2(syd-4tt3%rXp(Uu)CDKAdM&i$WCYmg(-IEa@@ZguFu4X zVFyU0E1efMuN5J3uvsI5Oh*2^{Km3*^bldbr)RAcR;mB--L7S1I}ZvV@#^xzeFB|j z!P&%zVN=B+#j_p$G6e~!_~sf!AdM0GEJ*~9p{FuklJ_{W)lWz7&)cPMOUalrWj!At zcXiVtAdBW9%+$v^Zypb?FwEdRtK$ng3KxG(FXB~)*YEHsVQZxGjqz)iXq)>9wIO}2hZL+kk8EH;hvQUg=Vb!=aWv9w&xr? zm_9xLH5oXnZ-0P{>XC)(#y!AfEK|YUJ4Jk<3WY%Ku0o8KbbCg?T*p%4(Pd7!F1)D^ zHNeS(PM)7(Hyk>Zi3RFW7`9`M9@wt1XfeWENIdKIP8F^(rJjp{0^_+Xjit8)a_TKCpw( zFbn7BGCG2T^t|HS6T#(Is=ILVZdS#wi7Te$vb751l9bb$h8EW%o5w!(d6V=k&+E#s zIvM50k;Hvax6Yi=dOGpb`#ROr**m-Gmq6K#2n-L2uI&~XKT#kOPbu%-L+Roqs=IS3 zIa&>b>&a`pHrUc4W3A&ySdIER*yqSc2zJ=5M}-XBF-ds<CK`!}8KUkMjH)S>VTXMS4@NqRDHe``${lCKBI5HaF~gR`^+|Ah$l$9t{HC^Fku=9Nt%*D8+6JUCH* z|2wVVBQXoE)63rMnhPp;yx(BMn$kpq3k8VHBCzIa z9XbOH2B~qLXfNIw=3KX+rKZ1oCpBnXc`rxKz5?QP$r?JIh zOT8pCbVKO(fCC48{WLPJkt~fzYHtrIiI-Z`TfG{kMU2!*eY%&fJaW;LU@WW#w zc7{tUYI!lIDfdPTa=3qJmB?uhB&wPC#H?aRQTGYcIcuMfGu}W$QhjQpmV)a!LvI_& zAR~8ii7((H>Ky1`3h=qN3RP|i3&@JgJ0_l#t*fgSfFhu1nR6t($UQW1pg>uPoTfq& zn~+b;TCe&u|>iFi+qza@b2U zRgt2^=zHngrD_JG(7WN&>98cKpwFZkyuOTYS6yQYb=B9Zs2bND+IiJKt=oR`6SdAc z`QW_jpVnO;vV7=A-s$;qy9}qcIV@31R$5CA8?0>`IBvVNpW}l^NUYl zWe4>rE}?QQDFvSo0`K7Azy?LYbpwr;t2qE%^2PK0b#R?V>tvyaw`*a~LD&_j7ZTc% zFpstjLYN&3oJ;I*PDPGBbM98R>-jM}BsE5ByQg!QMN^XBc1CJaX$E3sBe#JC9o5=r zDdmpNTsuvpQRCT~nNOq(L91Rvx*yVl#TB}8@8k8RA6H=`wF%L`|L8qhPo=e2q22d?&9PsL2+9FZt;p@89Y#rX|?ssM+p z4_&IFOem%VaDpP}6+#A`C{ZqCY=9In94DvOKaK&bHyF_r6vSd$&culdAy%PxyU?n! zs83plpP87k%m<|$vQ5Lh<0z;rm1q=~)uZOTDE zgg=uhA~o7*07F)}8~l%Fmos+(KU$$^GYZz&IvFl^l>nQcq>F z9}r;Ok1g?jcpDlyIi!7EAK;gQ2n*F^8i#?)C#P|`q_?Y)cNTtfvsOhcx{VA=3ni!X zY?3`uPNwXO*`Hx5K$7rLLAi!!MFG(e1Pi`ER2Brkt~tQ0tF?1r>@V7_uQrAFAOGvE z{Q0MEzIsu@yr+Qn3;2?g%*p@WsC~571n2)L@-FQ!`OpWaz`IIMt%wR+>NTSxou7&6 zr*PKYV)wbT8kZp;4n(HPg|2_U4ezX_=~4iBS>$qw&LoD*%1@K6(s{EvaFdT!NmZQ< zz4xIxo3kk&7GoJqpN_SQiq50fKga@NCCRx9zEe!qif1SCczL6Or*w!N_wiO z7J#tH5U4UH5Y2I@m?{)HTIkZh&O7F068eld1uO`771U~CWPG+2beVJ0FGY)?l(_ME1%gjMjY z{i02A;?wQrOq5|LpJsX< zgv_$c|r%x|y9cQ2%vpOq{ zOyh=t%_no1^RqzEyQCC8Gqk>?%9QYF>xoN}qH>ZS8KO*n97qY{p z(&qm-Wk_5fq}?=GfQh~u79^+)sL?^9v#^IqrH`6eP38DLHX$ay3RI4qeTkbCIRfm{ zvpJxnd3-d2&S7sdQCd+koQEu^5-lR3gF;Jt@L+wjS#*tHHlTUTj92*tg5+56sByh9 zoGMushGMb0m{(dsWjBBYXXg-Z3gql#+^YD|P~xcI{-%YR6tqUbrfsC7L6^BM~rA;5iHVvgP@XZVduN(mE+%?E2r!Ruv8Z3 za1JH3xVI{1G=-N_pt=;Smx(}tl858fRa8=5g=xtZis$nWngLqh#Djy&3i)$}21!W7 zKq4`wUNx|^yygKB!kvoXqM@d2AcFF6%f%c!t;wbphiXiX7s zGiV+ECF3P2>iS+|YQKeKm_?!ce3}m96G!5Pta-_+ad|!+C>I5yD*`O8y-Z{BE*X%# zK?iL6bS>Tojbg;b({T7wvRsp(B)5pYu8PrugzgZ}v$2avRT460UnT=zQlxz|Dj1YC z$7!|%)E@6V3X>5NR->q|nvAB-$T4!4zvx#vNFrA_qmRuxp0>6)V(cOP^sKXU08(R0 zDj60iSyx0e9M$9>AAVKu0rMa3OO=GKb2%_NDW;u-t-R(z+;tQ8ttsM&cZrHUS8_{m zE1R0t1@WE4T*WULQV5G`qDFpXWBY0Vf+w9;f%&szCZjc}@jqb+iw%_WP0Px}u?iVgAX| zqdrD2>h&Uj7SGT}8f#1<1*s__uQCbJbDFy6Sbmv5#OGsEn`ila+A<@iqL}085`vF| z^!e1B;?EYkpRQ%=R?6`F!DeGg3Iy}Bir3}O*R6(KX275q^kI+T>WaK#h9p+@4&gC9 zD7JDq9mwqIM<(5L9uSwhm{nwVEb^WJFAyope40|xA%LyL$-u#XSP5wY)|l#qS?$72 z4x9tw14KdQa)#^{9(KWJqlJToUysAjdpFLaYs*5(0sjMimywZG#v6L=AJed}>eTVt zUMg?ylQ$@t%Q8!hnA=4tt8E4w?Y{Bv&sgWnq$(}^^|gN)T=rJwNA;nkC&;bK9??VN zqz(RIEn7-1Yg+PJF}%84V=3$Uwb2o;<~5d7mEjcUce?*L(iN}R<45IgvUQakBRum( z$i)bW1U3^6iekJ75cs}#*h=EP?`N(f2ZZ%ERB7DPfgvW1{UDLZ8~>m>P@XQ?Y02V8 zv^wFL4wYS~wjTMl&`gb5JHmK^_aEoW+{f?_!#Vo1{2?@Pz=*3H;uKusW;f;Zm%Q`U>s3`oYXFWwalgLG%3xkRH%N0O^YoTkY>+(piM*!RXK%QNYVm86 zZdo$x6k=BaIgggP^ByC3y1vNK&xM<(1N>wKk)uz{@DuiA_k--26AXW4)JM zHn+05R?l=t`+(ThfPgcnv$HLMx-jfMwD4}Dv)ryW1?X|xw-TjCibN0>jKnBm3Gt=@ z$xw_}-tP9<3P23)_^4#B*{gB;Rc`}gN^n%yWC{dz(NvL>`@LRXUi>Y{ZB!^!S3w(@ z{~e^{K+8<}cdDCUQ>0OZV;iwhm>zC38Hdh(Rq>r*acx@n#+-YXGTlVjW?Z=CxJV+l zFgY^ifGKfSUV?P^o%Zv+!b}@U{`hWS@4|0R0bHB>wdU;gW6rU=l^)>~2J`e)6)arS zlM0M05CC6EAc6Reqxn#X?HL)U3(wK;WnG{>(oipmJIEk=FQqF=vAf2bH?|z{{7QRI z$7YQBGy5(j^YcT?^#;Obpnr*&tVq}>h$PG#fInP2h}oiT3v2#Ni@Dip%K)~%QUY1_ z;!KgJ@hM4gER?mJu~~?bEh!?MEOWkc4VQk35BUA9GSm@86Wrs`Ct%Xhbi|t?BgamH z5d#}E#fHw(ArXm3;V-R$#v}6rSbS0IMB|zb!I85al1%x+Yf;?BNM9fk!ib2hI-5y0 z^5BC20|<4>nD(JjTESfwPFYF4h7231_;i9ARAp@;D+msxqr4|g8537}EGvHA9A+ex zOV4>Pxb`$~p;H<3NdlGjRdLmCKxzo?MCy|&PRZ*q=a?3F8V(fmavc35sQCH{L=Zx= zlTrjayiPkAO5>p@7dvKc00MOG)C_2j=>~{o8JnUf0B2wcF~u^v#OOpqdyMFOB9D3C zznH%qd#*&^HnOsqiIN^GPa`)n#U#ogg6Ej-yfJ+q`0VGQP^wgVCbCqySCKIG;{<~J zqc|zsimdP)oBopO)u1amOQyP&q?6U;53{n!z1n*~%9@SD-C$_XT6rpnRJTlK-+g#I z4zBUzpi!1wWnXb#XsipkO^!ys4jq^4 z{`Shc!3+J!WGY{FE&0)cvxdHWt=CkbJ11?bV)rMHzlYG-1Q4z*M7bRxxuNbp2O*H3 z9xtc5%Ckf`yJgaSv1c9{I$U4=GzzH#?^>+%5x%S2#D?|Q135J3(G5pj%=5|S(Q$(^ z>%|ayKwX0?uI7k+A+x&>&nyqZi1pegtH)^slXP++Zz(>-3k2%RdhEjwL?&xVHcP{} z233OsU7fdil|1jtoRm%MYWqlx4#8cSK~hsH!&XWbu2ppw!ObDj;{^Nw)Qzd3fkb<& zR47gaA&9LCTBPBGHrl8tb8W|NSg4lu!`&_#!{9>r>>~b;#7avD)?l-9JH&kph`OA; zikBch8VxI(1ijp-uA(2tZ4`=l72X2&(ba|LRF6Rw4s_ui04K^WB^Y!wg0bY5x#eUU zVv&=r6z2$vU?ifUU93P56>W17j)ARwi`7|%BSa`W6B51T<@JfSsmHtA5^NIF1yo|( zMA8r$ER3|%8m!K6VoWK9`%Q&uT2c-8ST@BQ;_4*RpkeNQg)Btos8v-+0GegWsl`fR zkn@+1X6O`z@>F*2#;R%wcbhH6!4(HvfNIo9s$vS4f+6X-!IdiQH zM=3t5m=G&0tgfV9WQ$FW5&M{E+9&-p@Rq+B$s{59rL3brdoF(BTv~nz*T=)ck^v2@ zi1iV;G)GWYFe#9lYj2BUu1bCs;#nHSl?CX_--O)&$HJ?SnN>!mIEn{BYN;(hH*XL? zWpS^584=o9@)j-?_#euinMIzlcMkocnShu`1dzi?L7QMGk4A~8)1WD*><%!c6J_G+ z&iK8JiU=3E8SKfIsq+g7Xz_P(hUNV!9%iA!Z*w2EWS{7fNGfL*7PNA9}7pC*u zO-W0Xh)Pvmar#3w&CeO;fqobGO~lRg5uOZfT9__h=|^5wMOI2%w&9(C`?ISMF5i>< zk!tsh{me{}p&Gb&Xm)Xi~yl(`%s1*w*odN1EIpn^g0m9EQ$0$u8f$!X?U>gW*&UzkXW_9qRH`nf8S zsRm=x7zOIMC+)&1cr^Y0lw0Y7K{;hdeGo=y$W9FbJb*mTRKF&>T^1ARsf-SyyP)Kz z8PE@KZ9y=zUg02weJ`;1ILPFr%5QsZ5w#XUjaaONM;p7JxXUay+$n`ga(mM#uG$qo zU0pE<2@zK#!)$-!%W1XPH-)l~WhzSJ4x&n12W>xgjOJq33|_u5dpHS^fg~C?DxF@k zS49p^=OAB%rTQn2VhfV088YLcnnVXbXt&ulo2$zEbB1JZ*s&dXs~sYu{43!oFK=Pn2&@ zj$7d_-I0Z`v+s!d73Zo3ffr!XHfO>4;WX}e5dB?nMg~mF%=PzNn9foU{=-J28_Bs0f13P|! zaybA%-DMN%GzKk=7u#A>sWt^NzEQ$x3c1_yh?EC=sOmO+P<*J8LU|PmZfHe?p3*dH z)dM;y@%aX=plu9{LGQC@Wh^7l%?fq=$ib+X&-Odu~+@Q`Op47z00G@TkH z&i|b+i}G3-F>tK28tI4W?3*HXUl#>%R|}yV8qOO45tWz%(fnXsl-W&J-E>Foy z!eyD1PqsW6!`s>v3KC6Atahw$Hm~Dq4|zo+{`reGwBBsSiO=`sZ$|4Nco6|SbJ4~yKzo#{xo{+R^xJk4q+tXLWmd3`e(KTd`cd-V^~zMd z7&XpO315EMk-^f3x2uqdr6mSS;~f6CcQEQ-iSxZ$vTjecsI+ymBPTjY42f43*d*TO5XwP+a_DD2^*1^ei5py~VuHDvYq z@co%9)EF&Cm%m>RJ9)j`g2UVM@~{5aOlB&uAIEB{8titjno>$tRT6st2o`FL2Q`lB&Eo-l0;J;edI2B0Gr}ye*VOy6x`*5A0DSin8un6h^IZM_wo0+t`7jqQb1pEwr0w=$-p5;l;v{AT` zJ|oh+onRBS@7=r3LjSDn_Qc;J`4lUB;R}=Cl0g|rJ$S|#v+(-QFtwP$`8>vKO`d1; zMOdT30;Ko|#Ds?}dRU-1 zhglf$meKi#KNx`~|B06(Xp)4ZxqcKRL&HX%N;m8p=FlU_$?H^k^jtq52YKM??J&}D zY$-p=R+7EbRsVP-2CmV8<>(xw65&*XP(S-ut`R94Q^GUnp<5{%hP+)W%HUon4nsM0 zs@A5W@oxP0zrCI}E3*|vy2O|to(Qba|85#1o5lgvZcH?>YR;;G!`ZXy)`|Gd4Vp=T z0Jm^(E)0%K1d!KpjHMb6!I^2ga?~&;Ej&GkD(v!iIAHSl*+0D z*hqjv(zs-Ln|#SF&(=$_rgw)gA)h$x^vI_Ea5wdqo!LX{Bk&Uh4w^N z1jeJvYM}(T^3o7tggUKGL57#|a<2fPg0IDf!a4M{bfw7DcLo!#DsL3lSjcP) zdaKvjI-KddjMJF<-f+7txe-v(9sYg4Wrr5UY*U|QFDGxE`X0q_30ZE$;7d{&Dy~vM zK7v`>bX(My1VU19m~P#zqG-r1(Hqy=9NKH+I8i&*nx4h^ zz>#0Xvia28&NtG3ep@Gzzc9Y)(Kth3_o(c*ubWluF8ii%>E5FZ=l}ZquRmRPC24nk z!p=lfOhx<}bMa<4r!l>=5FTqK{(9(4otrRLa=2|S8v?ZIl!uDzIu^{r$SO)E9?>ZAgb6MzCEAdhzz#JQ)F{M(xdMOty&v5V7waWRhc_mEnkE z=Gi2Z7FRfM8%4A(j=;2{R+oxUH?xS<8;#zt)bQf0weWnYv-Dj&{$8SFh3GF(KrJ#F6u#)nhy<%X#+(CX4_x#bUxzWRlG<@w9-Tk`f8PVG-ySC6Thvdjou zV6D|%f>;`?2EjmGp39ovz}%ks02KfG8$q-CHi`E~!>w5Xk1)h#c{i#bgB4KHQ(1z1 zrA@T{N~u{2X;7DiARE3Ktk4H({9FWgb8NqL-$3^Dt+l3pB4R(t_ld?J$zeNDjXc5Pd}-KQ}w7H8PBnic29)|PX*aP+s|A}E|ij? zc^@;?N(^h*xabK==cmyqNb|-a#!)kjd8Rq6p^#IQ2dxgLmVmfAy**A}=dZ+tGx;FL zJX$nLGn!R*BD7v4!oO&ic4V0D9^8af^%j+^C|oL+Th09?W}TI-GHB zV!T`?5_d$Hw(pxtlxsJNokRXCK2%iuh2k=ugwds3bYe@y5Iqe2D)yK`8Vpm)ke+Am zvskbEV&)(2x3QXGos#@-&>&Na2(MAI z4tYXJibgurd&dx^xWv3;Ek&kl&UeTBK=8oca7^=lI|4rouyrp>J>wgkX9%x)LcjUr zt_Q3F_GQ;%qD&iV<#4QiP<`U6mzQ};Ap|~1r@hypSJVb1)rl(gQ$h*ZE-FWuFeJ?9 z-V9(kQt$R)mpkc+N!)K7pXOkRCl02t(kc+&ke%asRvvgC5z(Tru0CV07#*xh3oE`{ zH!vE=HfxgDbFIK-?OW>BzH+=J?^#f^LboT`Vy0|qv;b!q+G&crbcYjwH|CW5yFptm zGSvW8F9|ATyO12jkQcU1KGbcHt_F$tMb4Jw$OVBBJ-U>b?d#K*f^I9?nw5*yi29~clvY!DieQ>{yq zi=sx7@wT}D6FeCzE*gqLi1E!E@!!FY|;xDTT_ljCFc*3 z52*K2qmi9{?3onDhOOckA)>;QCqd@`)yI3<{6rj5+~a9w*JG6+2GHgjOD1ZyV9Gic zu~|oFFYbXl;TLvRDbO6u4nD%i#Ai+6iYDKh)p-bVGMF+oQ|W1TjN)D}gvjPmovC6? zTZE4@1_cW?g^9F|T}Yt_9y#_p!pjjREq^nO8RINT#u&PY!sEcKNf>H}3S!t+oK8t1 z6H!I!<4Wby`y!C7uPT9}H7uyy-A?PXx^g+AC)(wLDs*#fEoQ!2Jum4+w+phTtO()Y zYA3ZN6X|?1?X9eQdH_DS*cV>vK)?z@lGtsvvBIPYVp&db1;$EsPT(rGWu>EtR@}FB zxyYv6pwS-Eg$cKUvvr8Hwu%V5-x`dZK91C~?1?qa7e= zC6~$s@aCb{?xa1)+;g+bGbJ`{s8QMuiB88ylx}0nDLEvd4{3Sc9Uo|Ds3blZ<*pbd z6$h1+Z`p+|R^6NhK6W-3l~jD)3KM>JlU((2z%saoY)NkE3K9uitzO?M!=Y+;(#RcWpt(r<3_hc|s5KZhjm{-lJM#lmf;B~jyY!Xa?j6`*05$&|x!xFqM6Z2bfhFYFV*<$kd}qc&<4Qf@6Cd7|HC# z!>|uVe6|8~X?J9>^?-S?(;5d@EVYTi%{+{beQ1gBJqGtY+05Oy$a3*Wr*(|3Gvw0Fs`JZB=)20OEIFm8 zr)Qe^>P_LXn)UbZ6S(h5+xs=>J?nwPRiUVm#hw+6+a5NVQuj7(zfnwq5yS6w)xia8 z-KAqk&9HFQ;=tU{?uEhGE95}5u=$?W3VE5GE#HB!=4IpUYokR`hOl&Nyqf^EiBByM=lZjNtv>dpP zy9GLoCq1Q<`h-AyP*xF&{E12tNJ=VP^wsKW# ztF)WG$LU8&(H^n~z?{P^$PFDGmJx)If+reNy=4fK>jX8nR4FWQr;9>QIQv=R6Y=;7 zsO$y2pdv7$Ok3R>P&dRSvZ+^VCY={*m6#vzrFKs6t||>q1DA6N?5NX^yifwS6?f z*dA7^3vE%px+p=;pg>wr!!?_tP;e{Do;6v7&K8ARO!mRlLa;jFo&&=rs;=9(HDH1X zS%(^pwsA#ltPeyH+X5-+upP5-AY>2ALbd58nr6)`k&=zhj;U%>tB9f8ULmK!1^1mC zTp!#Syhm`KR-;<4uDqMIPo)mkos=LaZx>RVU*ylv8}-f~82N&YI&5_b4#vBd@ zH%+Um3tf-%YbcAM6pWkmYp9%D4z3RFblxK9io?tT9+1mzlM;vUFjSyO> z!7dI)LKQEvq&uprHAkHlJ~^SJQ2n%>Q(dUeP`J|D!Y|@z4-RG+Ts&A1+|4#JYs^pn z5?8KrogAIOD?v`sC}8Nd2KP9WNTVDz&=D3fW?eD!GrEw&ppEr$j7N1T`Ab{ozDceR1QmmX25}Z>{n8RFH_<$y(e6B=avU*iIlP(v&+U03I!G3og`mX+H zK9t`)t_D?7=+|24*W#w?pVHTFezfje-o)*%I}_8ObwS0IBRUgf_UN&%_Loa1hMYU5 zCjDihDd?iZIEcKqt;|scO)RUE;0w$8YWRdtwzpHCROy!lq~IFk!KNxboK<;c5$I^B zs6C2@B-nJ0Cs-h{n(yX*fP^f|^R&wuLsSrA(~dXPxtfSrB?{Vo3V^r%QKXT`H9pry zo0bt*liMz0?7Q%fT(;s4xo^@l8!0e6U`!ZGAuH>g&w@T1xsTHI?bkb8o}Ho^_0tnT&1xmNKI=>FqtMzaG+PS zEF7Lp=@5A=#uLHZMPp`Cv))aJrW$aDLsvl}GmrF`aGMqrl|{a`Ck!XHoXk7rM}Q$7 z_Hr5&AA%U$L$OE)J4R|sadm6K^CP#EF<88D{wWuiv;av~7I*MT#D)t>pL8J7J-7~W z*+zb~i11HU=6EayMLW*beJJ7xA#BIiv~@!ZMWj92v9q<-px#p}3r|!x4px}o*|=p# z%<)=+9Hy?7{nPN+SP(0vVY)@ddbQP^txH)OFKQWOAY98qw6*3{oDgttXy`N_nDdcLi4Ua0j}u zbC}w0Q<&seV9#opS?8X=<6(DN$F44wjIQyO*8}# zZLoB87Xj5&iHhq#$_UX>bly zRi7gKS5Z0%p5W$vkTg}PUUd`pv1h@{yJrP={zTle5ddQ%kwKJlcH$%j0h+IGb~cP% z>`ysTL;0%!dB&%FZyoZMy#dNECZe1vqWmg=FlFRxYyGx(8|=l|M3SJ277<}Nt-YL= zjEcQj@}5~WZIP=9r;rXo5V$^L$+c5|e({gR3*g?bZCDu^ji9tzaTCIT6(Q^PxN6{L zg3(eXq+)#oT#8o*g~6?#t$Eh+S*wTjv*@D{Gvg0E`Xjw3llogpw%vuj*z%;d@(~?J zM)3`#v`wX*qT%sC(%_~9*xOR}(MVbotVXn>t*Go4p{{PsDoo72Wif(?TZGdhr63?> z4lAe2jii$Q3UV_jJ}6>H2quLn-BdBIk4tOs$u{zc>FOXG7sj2eM z;xio-^XP1u$vODg=lk2`*y)foA-WAc57jM0tUnoI-^zM?n3i1fnvq!l%Zt2Tj$Kve z_u~HKWShx3=&;jqo>#5TZ0dWb?0b5)=q)BVFn%pJ$@_Hx?MIq;SB@UI&>8Q130?Zo ziKFOnUTng5B@T5~6k=W59YB7ha`^IM7ezx=Zibl!u4p1GJmg|QUoy39t=TrgsWdya zZb7!Rn%=2bGDNRSRNA?%baQC2mSIfoJyZVjDC1^+xNs4Gu(w+=Ef-8WOd5D=i$H4z z299!0Vb=bfpn{=5Y8A!@s(MMxwmTP*l?;+m^>$mdU~u8?x7~IE*mpXWGPmTA?mZ8(^=I9Y=2LD;1Dn(9S^7Xu%^Q;lFl ziyA|?6PtX%f zO%EMs^Ss${o={{7^R$|itGHTZd@;uFXsOpyn);&0Wb$qp`gx|-l<{OqL0u*60=lS9 z#mUh0G~=8nNJZin1!)gWw>I9PhHd2+@uBBmG<`#6w13@fDR#g zexWJSfnNb1(&OrYD>SdzwUqbDcKt@FpVZk-KQe#9FK48sqRbsZQx~&TGi#=r* zBmL`Rg#;#c1dpvUbz6m!kRLodt&jGw7d3H{p3${k>E+VPjLx07m>E>Alo&p|rYz;G z)+*a#TS;&)qX|Y>_7OegPqSVE6t%L6;Yy8RL4N65D(Wnt1>4~y9q={l!uywBUjIdm zcU|iRMcPUl3wtAI^r@p=Aci5Q6eWWK*ulm!EJibWlq%@3ay&Go6HRH@c9BeLg9f#E zRj57ew9`YNDe6~Bjmd|h?INPQah^u+QMB!#QE`*BR}1|F8|tWE)8oM)YMxe)nN!vA zR5ffjY^xu9-Q0`1q*7&-vBXG4iW!T&O9kJ8PZK33r2PA%!L-X|4=j6IH>@FsrD&54 zgy%SYS=>CtOWJ?oe=<-(jq?!G#(lO$+B=e<1+YLNEye9{3gf;&`TY*)j{Y1ELb?sH zx3W-{86KY#h`Yy+!tF0#?(_f`ltV1H5mCNixn@ybVh_ivj{c)&dokY__^ zhc&#GY~V2aSehEZ?^~KVTT>ZC3GP|$Foe&wWYzJo?))K&PAdD|MUy7TaXk=Z`s%Tb zKQSYWCG;G|e0EOiz#te}(!7e-=eh=NZaCa>poNP+*9Ct0>HF`#{JdWFyZJ1F)iK0s zZIVggyH$jWw=QCO@p^fuhS48$%h3;$$QtK?yBjKkftfGjGm2b4#$p98^+NC=1Zb9S z;=3aEl7irqq#EGwYl)_$=}Q_V#Q7jyVJwzj`d=EVMCN zP;t`P*)19w8%`^8%6NM@YX!hB`T4(Je*EFRoOD*(_Y$J41F5!F<`4y_p6_o_EKv zsX2-ri*^$Tlh&F9F5aVi0foo72e;KL7>4~h7{=H#`#D^Zx(;FB5DhASU+a*~%5wfh zCUSj zCEsWWqV(r8xRhlG`{KSIb!eP9`R47uO)1Vm$H>JG8UM!{X<FVt*FG7jFvxt-2n34Uea8QTcRA!*at)Y9~3f{Zz+p zNE^(8rNOH0rLN1tTzw~X&UotEDJa`7w^H^i_w4M8 z4NLKaM2=M9@2cxRKl}SUTW~~-pZJv#d1}H)RDYTiBc&ga%M3FUCieAV z8f$D%1nN3S#l5I-_0uRcJ2U%}X7yC3$n>#t5V`9f%wPl9!p!@c8 z!5p?~HnBY39n5db4uSc z`|Vvu$VNhc@W0jt#6U}BGMdm5U9Z|M4Z`adjF*r65Qih%7NTiut!2;j6e`tq9nxV8 zyAUy3u_3x5VH=LCIT4JQ`JBz@qcN*Ol?AhAqJvs$#2vtHgdortR8!L{6%nm*%gSzu zuhk!L7Q>}% z2gNRw;v?(0V?;ccSobQjL73a+pHu54R^)Z^$u)BANa!30nxw^#f+K7I^?-tn)0e21 zb$NC7689ZU-TpT9BPRC$Sd-BTC5$3eijQ%zZ3@S1>fENZG*wd}eyCHo0+*2zFhv=t ziWK&n>2cV)LAB2hBRRMn7&;4X6!5~Oztz>SN&v#KR7qh9`I$oId@Bj_J9q~w^x)A> zMDuS^l0jq=mEYp-cHBvgG5=ioB}^X%gtAXaiV)d+Zg*q^pV??qvG4%X9&pcI=VRTP zq;=qZ2Mqf99q>RJeD^XE)$dx+ihM_mZFSO@cHw)D563~#mS$nAe~-h$$ZYG8#UNsN zs#5wo>uL*lP!omoo9|s=6kDFm#-;U}06I>y#Aopvk5%`d2_$N*9(mzF4oq)TTGL;uq?0CNY%f>;`gsmZF*yWj?HgRiwvU)it+@1x@_v=>VDDmWEsI9kWr z6x!6=ZDfdga^(;yu=xno%JM@mDomWzn<=4Gq||n&A^i!Px7$9o9d+GQ%i|Rqz9s#9 z>V#*!zsk&G?*IVjuZ}qEzc8`UbBupBDa;k!Ytz_H^N%A(|DCy4b|v^#24AY2mbl8u8W=kH zm{t+5fE@7N3{e%+cvn@s%=!bKmf~Nw8S(cIM+Wr98!?_SN~McvwNA>He3i?O#j|~8 zC)I$f3uv^qrpx|N#y)HH+&9qIphD?F%L~m*RGEXu#rt9kztz29|4~bjfz-Lt)xF@P zcyXmC5o2!n!&%(oxMJfgcKE_IH!d$2>0k3F(Z3rN)7z`9xL%F4!lqtl`jy}UB!q1r zf@)QVTAH{nrZ72Yg-qi)H|`Q3Z@ay@Lk5+4RY%>7MIU262-PhygH^g(cB^G|#-M;Q$ zZ7r|a6(Lw332CSqBi3PH1d{J|m2U!&!1^@G)#&kY_I?I5H{%)BFk0nR!B`B*^f?!z0MYp)Y{;3K=fn6qDKbJIP$j5<{Fqb9Ycijr%`pzNaiu@bLw>zU~@5UZ?u1X!>${oi%#0%vpZ^o7Gg&L45#we6Dp;rut?_rScuh*?L|VxlYp_LOp3 z0)EiASo|!ebu~_>Bu*OEwH=p<4_5npaC(&K_uuQL26u^V+2MMafb7Q@MX{~ z25E(4Q&4PmtdNlPMxVTrM_vyPWPsPmj(^FX31??cWMZ-(@GRL|>)dL>RibYg(!t{1 z%_8LE<_n2sa>jzo^9i3XSjw<6YDx}OOHiU9Z7)Rgr<5zHGva3BW+9b6$T4#>o#&$g zRkx^WCT%BSb4Yzl<)F_4H(|G%W9f)H6EWF{`nXZ?atD!AkRzkR%ayyNl!#Y|6RU)v=!<<0|ysO-2B`?1%#&t^CHj%Rh2&`46+tlTD zWX~2*Ry6_{3;QPm0smY@NDXQEZ5hjfj5V+_BDDmbF;9$TOPDvtc10*nln3UHOl7*4 z8la3(O0Ebc-j}UY)Zpe}ObhFlySdO%-Gd0xjH=+-eNWlg8kzB_&>kq!OiQTR1f}Y% z>KCW-c-0Wg=uBh>))Pxgw6rwG@WG13a z2W@q1H+x#I6Be7cbFWe92#xTB9PUAP=WGP~@N1vu+ ztH$jPsK0?e-afDDzvN48`T7c1!}rJ=63lgFjVLwueD#;oDrbh#LMQ~SkSC^vPzZXB zymOQr-D<>5)95qHhtVc{lGvCy8o>QbeB%+y>kD&>i`O{JzGyzl1-QDa{4l;pC~MNo zgC6_&Pxgns}*lJvke$Kg}3D}H=WNjd?8rnxln&q$QVDfBN*ve zSfqz&*g(@{+R28@^GGZ#7bKtp3j7FR4g$Me9jI|s6^IfPg5*AxC?AqpE<0qW#w;NR zx*)KWTsspk1<}}CRd%IRrRQiLwQSJ5qXVGCk&AaoKf~h^$LM*3Ru=(*RWH<=$lVzB z5J&>9yh50l1j0bjTdv&V`TfGRh@0i4`a%87(ZdLthcJh^^m?KifXFZZCpfxs#zmbla`*pVCifrj z5>aB}+|Dd&mq*|?yJjIc)sWRf%GqCME|j;owc+l}>HbS7=Qzk&fLSwn!Pw4#fj08-xpEp_r(=+~&_YHYo`4Sz&tlpKQq1p#wv!f1-B|J- zB1T5iVwBY4KN;osv4kbR%eFBBQ1}Y1X_8}M4_!1E0CfA8KLd`B{}Eu*+Y8u*ZBtOYwB9o{ zL0L1%Fumc<1{@yZ*&s_;^eWGE(fEBOy}p!Sd>PC!Q$`} zd`W_wLb>J&D5+f4-k($9nTGv5mKQ#L0YM>Q5%H4EHF*7Tbe`VD&lN3DG!QL4!%*96 z6b>SsR6%8D7%~DLfDZ92B?GWYrAy{d2NUpROH~{I z00000000000000000000z$g8`KisCBA-rjD+UcC7w+!r=y}bauWZEm$%=Tw-$(qf{ zE}As2#dxpDwOX$YUb{FdM6_bCIQ#_Dyn*t;FCZwStATJ0MsG+A8!>9kcoRXJ#FS|> zTU53*N6T3&V%3^;n{Cb4Hg@bL(c!RUIx>oI5sLOGMsbypl#=cwIdkF4jXRmL4dqs> zyecRvDXVlpYt;>LJ;<|diB+fW^}q)KvcV4KfN<8=(138wZ48AYN0S)C8?ol$6EJ3C z(_%q$&39^la0lX0Sw&S%UE^q;V^xOz%fJ1{fBnyfr%ca0_u{o;a$YObdTbE0**KdW zG}yB_upxB4wSN_P>Vm=z1BVL-fI~b>!2tFW{ClOB$|+f@9NIZIAuYrBz9!8?h5-No z0Kk_{d_xeqVbbB)2t}Y21sa3J;fW;jp_~=4BugeGOXbkcSy)10a0C*C1~9nCE%kQ| zC(0rDw3ealHA;th8(tdVWn>O0XTw~?e#z{O-aN9po9hw1`VwhRuLC(tu>tHjDV~?# zsPPF}ze4}FQonmApOr1e5l%&fCb|U=x9GDa%gZorq&@ZVFwgZXHt2jVXl|>%DD@>` zC7pDvSS?*!2F5liulJ6(@8Rtr+r?$&u)_V%Sf5O@SVpdN`&kY8fLGf1l<56mq zXCO!5sm<4b3^AJy*b~)A*`DEhq4tt#X5PL*X3?xFiB1?S4nM(8 zgM%Bw@J88rS@ph--bHq-0`&5hi=qy=j!P|JQR$*MK$Hj{+h(XbQ~E{eEhX`DE7 z;mVCWnR1I*At|Z!uZaBz|Lb0R&#JD{@$hV$vg#g0&CbDDpVI(bb6Z21wa71B$4agp{m&MUL`Id)UB`OAK`HWDWPD4-s8VBrb6z z&-E)e=yWc#xrKdE>Py5*I_X%kTDrCjj5g^t`yOv=OxtY7a=YfTa`Fm_x6<3&`LwNl zfgI}PFt3N(1ZIThkj|;t8_p#C~OP2Rk=Q8Eo zAUGF3x3nbbSg~5#DFfsC9bhi|)~l+js;Yj8`Q<>4fv5Ish{bf~BdC#RR4Ez^7KfkU zT@qwU)lRSP6aKdgBkxT;yJYmsNarlLgGfRN1CBtV&;SNE-l$NI*SD%aooJzuSz;iI z3jhEBU+LsWrPxr(Fq7fnfN(~$IhZ-gT$Z~bPnKBKUg-`ZpEriulEjZtF3M9%F4+rDBenMXlkqn z*`7)kY*U-A4z3;zL)g<9jpXkc*o&-}FwM-Fg=EcE$}TmT=308J1Iayp9?^bBMGcEi z7%UDyL94+K4Pn^GM%{1B8m9?u5>uu(?9BH|}K0EoB9iRJup?czCuAR-L*BF=FT7tj}oxuDSU`-3zx!7Sxz)K3hyy z90|##Y}1z!Ww145>s0%LI}nG;DynMg8k#!>oj7%NoS(CBwsxqlL7avN=lV3ERbc{0 zAW>)lgBx#{r&C_|_yve&1kDzT;(>=f!edV;!c-AjA4PxM0-*2q)^uC4wspIdtem`p zqS9+weV)i(1feZT-QIs|3j1s0N`!2?LHmqR;>a zH(pk#$Lm|-Hz&G;r3N&}=c$ljotj;pQ@yOgaELF{sA;FuNiP`~iS8M&7v^3v?G-Vz z>Au0tB4o|xXBSPH*CML5Ek{F6YE!PYi|dfwbIb$xyXaA&qlrma9DaiPc_+vRzkr~S zt_GqsIAud(*vLlx)0j0*6S11alxZ`~PS70YEo@QR(h{^>)rwfPwsp7Kw6+4ZEq3fa z-qd05l4k8NP_lItG=;(xnXf3tR9r$*O1hKe%!MmA?qtd~lw1Gus-UQ(tkOT?_OIkW z{@49-^qyATg4aX#Y+GX0se3)tgP3Pib}$Eov%ZD~glldQ6pq{o!NVtD%)~^-Z(#Ix|dHeEXl);iExS4p>?LA0|;b_Vlv5K@~n)yw+u^=lg78d|>lZa;^P4-+_I zq$^Pt4S*R-7>>&t88hDfJcIKpAHP7ORgGcX1R;?mYZ9_4)6Mt=sYCz`0>Ma>F?~D% zNzs`FWw|_pD3wu;LRl4}I%%{zy}@WQw_t6f<0^Gpx6b0?>ej>WNw0?9>)A(qPF_J#=_>PiqAw;firSj zs7XwjHnRm$OS86|wIWunS-08N610sSyY0~dNi%ggIN2Oggo{Yge#I!R5|UEVog`;2 zT)A;4Q?{Yp3YS*}MI~jG?&q$$jjjiIwk@&h)V&_mApC5wgE=6a^))mgTyx8zaAY(w z7~TlV!zW4SB34aZ;S6y{;- zL}TXcRlC*ZlmzGF!*Hml9bmn+-GX33c|vy@322r9?uZF zz#Zu{c0lVf^)11h=u%AI>b4#Bv$m_^koO9C27XA%s--Xy_qJSV(2&`~c5d5aw`QSc zD#E@I`w!i4lQ^d9Q1U=1Sj6H^Ku0&T+THZs)ba1cjkfHl8l6&BL8cPM<^M>_N%E$( zO1mPFQl#!JPB3qB`Ygz@lwrwm)H=}V=u6@_V^3~%pEtPFKh^{4CUBWbW97FIa7W1d zSUu12ZU+ItQl5z<<*QJgAg}DQd{M#3W$Mmz?X@ifXl*2xss-uvX_n+`TI-!^Cy$Tc zAxVua3Q%e4d5npZG~Oe+CznLob@FoZU{^>=z5Qxes^Zi;$K;IPEL7x#767Pw+wBOG z&lbVImHy7emL%$?!YTXV7K_U=;TDsUQ35|4-B^&nd_&KPlkUq!Kw!$4yla5#G@yQm zBNDebLN*-#+%%!O1fxcxMoj0Prb;=1=qaE~Mz$Ti!T?;K%3 zLeRWbsV`Oz*Cf#w%LnWku*=SDZbytD{ox)XjbPl>i`i}Z9+Rpp{h|E-$Lh2)Bxp!O zxRJXFA_-FyeFr{cWNAPh11nghUw^fD?e0HfV)yyGOm$na-j2N46O^NKUQ8|!AE8CB z^jLUoz-mqnZ|Hlg0xM>%7Nt=m5mgq>UR%{nr9QJ7-cg>R=1Inn+KOcZ$<3?V9?$hS z{A+SkZ5n4PzQ87C76a3rn(rSjIoahNwPmrh)HTlwx70lMxg11}4X0LbpKM=*+wC72 zl<4mP#;veqIBN{5K>;rCB2kGQ40$vuR&-VL7j7j>4r0@t+EOz9qhEP2S8=3*)ZtG2 zelRHVtoM9M?6R5KhT{d7q^|j{OCQL8>bP}FSRE43qM=D$;ijy2_(EK>Gdb)1iB_#j zzF2^P3CtY5i+Ber+V3jZ)0TUXw4#c$3;}8)KucGkMcIf8cP?dOJ%X zTG4T%G5l->L2so3jhvvkW?;u^YJ3~xjacjZ{#rs{f@2C$E^)0NEOWwoZc3;*iZu$4 z`}~D)>ADd+H|@b&NiI+vI;fLH7ih+c)(5t=CVUX9@~y5Vcat)@i1L^9Ya`O|9SCx` z3N>zGIrGrwSHz66d*t62J(0u6G=WF$h}pl$uz zadFL<=X5o$Jq;>}a?JefM4Oa2-=a5DL zWwe?6Xvy)sJEA#>_$MTsdEhOuHMK)V9sh{iMlisc*HveHtL5jr<<1J^VxcWy6YsHB zDz}R{4d9JdEKh(F+=i*AMHp;vQ>N$m#STJ55+>RJLPni^to4o*$Fl4Wm;5hICKo?6 zKUVlw#t1c1zzObE$=8Akc_>S6^Yu}Lwx~B*0G=fKQzlDelDr1k%JBgqYY73eNztz464P&jij;t6s3~?6zRA zpqf#oQ2U`8^E$-f1B~hSVkt~DG+@Q`;IAgVlQ)F#3DIvC0=lh1)N3R5zu?l>X%4hj z{f)$*%4yF&-jpc&)S>)DTJa8jSq^PJRJ^6lra+i z>DswuiGAMX`4>O;rNX)5zwUbnlNQe3%-@8D=Kl%d@PAAHCjLz|#J`1q6Ta7DXNtI9 zkmCF#y98oiRDx-TW+a!}VsY792ca->p#MJLV*hCd0fKK25YK&Za=i~_qb$EmzhXu{ z8xv}gLpL9}^{kEIfyC8=9KOF>=D^9ZS*02Qr)q4cVF#6ON7ndxrwgHHKkA=b{5O#= zveDWUwI(JO0X=fDEO&jXYLW#fjEKTJhu99uN0Nj|=r75oRX+Xeu<+2(}D4#yN$q#8KVAOL-Uvc*eoAyzB>rYFE zFBx0`%+-)*E~)10N)Rvs&_oadY%8nd5)%{s8_JOHr52Bzhn`kI?z8_AcmJCKW@z}_ zc$7jPKuv{9^UxkZk!adFT=ZWt&k^=9@kktjE3&K_p6deW6m7bXiF1Q!E`U0!ytAC_ z06fN;W%sahssE+FPSbdj+grBoA6xsp{YC7qS8R}_TTrwP>d5C(ve*=Me{;He)^fDk z;_hKRJZ_`Q*O8xo<}DErXx#TlR9#Pd8wNfXY`1gfJ5|HfW@7O((ykNoWt-1JXrh8A zD>yhrymf@e9{*5*UnT~YhPvrmD*>9TxKI!hbt0A6qq+L#)=awzjqE1(c zzgYoijFY*Otud-S&MXZJ8tmFUVsvycxdYpR`0kn*7g2>_Y_)#({CkVNs6ao2zd1S4 zS4oEqH;uJ>eos6Uv7B1|>T`QFe{wWttv0vYa$=_F z=Jrjy3k_4jp$hWp1h3cHVjsA2vw|Vp6`Ny^+Xp`jf*}$~HytK0){-8xqvun4sRD6W z_`R$q<|kp444sb8E6s6ccqWBcXiFQfD@RtYc7<7b8uxYycFwOIa;@OdFB z*0K}9;_FTy2m|ZGvW$EX7~*q%z0$ZpOK#P8Cr4!Rzd@!yGX85s(K4;{yXHaW-$DGX zFn3ZRzm9d^)0DcuCqen5Qj3z%EP6TVAPk=t*Lk)BQn3<*cLUj|5jNur!0Hlsb{ zF9k7i-ViZhm~|(HZ*Zhmh__XozEo9BO zbQ_$`oEpO<*G}1B56ybkWk4C^CuTJk|3{(!Rn%%4T7aRGmh6r?-lEjaG^=PPGhD3W zls<33dg1;2r|Zlaw)FSKsPARy|LAVvBO4&H?5~CWqwF@bAal_9`y%J)tK?m6y^H6U~0l&1t-z!s73@M1}Le{ap-$k#$<*d~+jf0offh8%C!tJN^aFLjO_ z3oK}KFWQGkhIpJ^$zT%%dFis|r)60f1Dw#x)}Gh+77Ui_>1CZ;O}El@?^22UxDlRH zRot|62R`2t66V8#V68^JB^Q#vB)Hw;DJU$jPQGw?P#D`Ya5sbBDFOE%lp*8zpDeER z>=U;>u9?)6_BZW|c&z|y+ur=bTN)%<&IkSybf6vp@F?4@@$`-dyA6) zk;A{}7yi{o;*q)%r~qsfoz9xmqh#k8o!kUBX?YO&0YVw8;L(_-o?Y6oSy)usfQ)3j zN$!%gvQl7D2(sP8vg9_c+xKfi&m=Z^`n9#S?K7(uEiJ#PsDDq*d)o)od~+v9?c=YX z4s(9A-@}{HR9k`0nA75+vRJ+Fl@gbfKrmit69$cC8{zs;*qkoQG7JPaBq%aQ_n2@e z!XiQcKln`yyVTBmSfB?FLD&U~tY{2Y?09DY2P%S94wZefc~&MH6^~LMgr#6bU`Umt zzs!EgAKotTDC(3!_>)1Vxe>*}$MGn^E;PkNF7riv?U3qZF1zRPC`C<<9AY8gkr>fR z(LY)(6|tEo7pIw|LTxuM{52!{XOdK2qkloSf7nBtr^PmH$HbCkf$OfwakfW5BNxnx zw*;o+bH6$bM90U4uZxCCDdWZ2@)HvAQZ@ap5f2t>JOd5SCtwS%nbJ9zvN^hV>XU{N zy`NR3FmveHiP@GM%3Q|RDxMu{2sEHd=+k~4Azp}_o+SCI>vEs22r(~`Gv1wq%{Zq&axLOA4``x7{CNb>9|lxjlw zree&(b%ryH7jPq=4g*N*>USt6?Ro3?5R@sUydIusGbe8hkXCYHA` zj)1y$gWYc^jl#Gn0K?O`f=SwCG0vZv5wLb!ue>3**x>v$M05Gq?SuIKdFxEp7ew z@NyOTNo3na>$b-XVeno5pUpY{+#vE#|JJFuTm=ltp)$L5ylQM+ zWu_ngeh^mfzsFwC`P(Tw0Sw+deu{U`6%1*-4^np+r2hl}IEra`3VYzRKC1m9Lp(f( zzndH`+|u5=qxX^MZyCfOeer@Az()c1fkZ4jTo#v!mo*zw@U`k(3HAwdqgdL7D5}1*1}7ULzc|yX90CFc z3bjP;v#@}0M~%k8p!&J-m3V@5DzSb)YdQbOOk!k;x6+w#n08G$Pd~I=x9)ZyFY}4p z;-)AF@XrM0e%iZK>j+gqlOI2ctricHJ1=7B`%wicj-yh4m%M+n#TJak<)k24dC&NB zllz8yO`AB5mFrD);!Kz8qD>JWe`ABG)XR&|SC0H0j=2o#Tc(G1TZO*BaR_XpnMeP% z8@n5uu34e+xaub5Sz~S5DYS=P*ZtkohsEfkZHoZ@Pz%_y^I6m5-(M84mQ#l)GA|Jl zpfT&Xb!K0ErQ+i>Aw)7pi>_NC%nv%*I++k|ga7vO?|TX}ko zzON0AgN@iyLBI4B>VMd^kHlcR^N4yUOTPKlIH4bJz@X!}!u&L6jHA`TTM(}6IqVcRdG zx(_T9`vkE5AnBmq`-vf{Bp{d%bW0fDDJD7#{Q&l~{&7j8fz^50=n|mM9ZSe~#*~oV zLe!^h%$X@k-0AZ8J`?ZjI#NAJ|2psnr>dtTlW9@0(b`X&l_M?c< z!2>dsbY>CG%#KN}=N#35k-R8x12)caqGK%@UKMvdvn=ZU3jV$rq`smC*Df68F1D2tn={`YD{0nRtZ`*OX~f*wUKd+9wl^!UB(SYlaCy8p zFW+vZXk;n$o+mWhg3g~f7r-7E!S62P8Hs`9x$3j`yr&E^Y>u=gSb4cpJ`r-wM&NX=567Rz z5ueO#ZFn$<6o35cpt>Ua^(b8uJ}`$LIv;E9B>&61xTI4+qZ>Z~SlqyV_{dIQ>YB;_J|Wa#1ta z5<8dW?`~|m$@S0~&0wKC3qOkkDL+X`g#NuP9(KTgbQmc^O&H ztQ_IJ#h&*{S)JVg0rnf{4r-j>PadJgRJej7bo?h+oPo#q7dg>RIE1(%;dbie4rRcJ z64cq2<1W9%wl9q@P>@%IQboh)ECRZ&3DI!fxv0ew%(DT@?>L(W(01uLQY)2DQ|B8_ zQeFn_8vjrpwSN?GYId2~D8f_S8%Xw*31u9uZr2*+aqgtZP~D17liDWlNRi{N)KGn9 zDea2e4VgG?b+a#0kJIId0*hvmX7(U?nf2I0Qp-h`<%m@iiRf^qL0$;s*;Le!($`f5 zXnFsuoN){8t+=!F`4Ov15>q=d)X%7)i-_^vB&bikhJb2nU0viq!~9eW$H+^R=Qjle zAL#4P&O|*dXbHKdC1?rE#AA(pjM)ublu3#bbE2S*oezO1mOh15CmQCT|5Y&mOP|V! zhA@OdEm1#nY~L*2YV;bTuoQ7&>I7~xM5+w8kZC72<5>?r5gz% zSFA?#K*&|h9)=%XHb#E1w4yE@Hyv|M)cC%oPUEDE(Oa*d_@VJ~FCS#b3GT$$l4wTx zEQ{E0d?_cO%4_l*Olh?5f$hiu+2C=B2;yPieZ@I2OmnRI9?;abCRBJXCRo>1gtAB~ z8Aw$snb+7R3Unr~WeiEO2asN?hK$L;zFbJbHmr4i3?C&8eR^z(>?}o(Oh6Xhz>X;& zG5qM9p|x}M+v~4r&Klo7TK(9bz<%-~BqoNo-|Y|>FAf;Gmai`!qKXveNR4g&eBBfm4jU~KgB)+QdT{yPw! zTY{r6wc-F4xgv3?b)}71Bv-*rTtOplvzwFzZNB)i$*`;RK@Lv@6PiB#NGq9XgDJiA z!Hn>%p${iTbKTq|j=f|7L651voQS6~X#Culx92Sz$4qWfgJq+u3u&I4PVGe~D2qtT z8D5$rWe133$OZF z9ue`RRT>9bGK|j#&GS2tRt1o(;x9YDpXpR4%fFY3XzY4N;`l09b^E$*06+d2+O$>6 z7jzRJa&N9nsFnTd9R6E4&;+WFcXf~pufei?*G^SX)yxWk(rM9S?vXu}pC2y1c-$O* z5-Cj}ki*C^C?Cl*)aC$f{w;?gx+Yy*xM&w=EG^j2Hwn%|OOxk|P#Ba4A;a zwG{dC)6P{}P$8?q=_23L<_v-8{W(Dq&p~}sRZPDVhFRF_cDFjP`4J+%-3RZ>=rdka z%(rcL0CW`FYtbzJH;=<9sA>AReVE{4agL=Vjh{JuTiqe5Z}HC1Lh5)!;~%#+jK}(= z7oP3Io9{@>Z0Uks@iBVXNDkL}&kaFi>{@JHF3xG3o2Pi^UpQI=^Ck4T`5Tg%OV!D^ z)9`wz>5!*>(4$$B)q)m7|WPDX1RA>r~;AZtY<8eg?f z(ixQ^zUHTqjITEoTX421@Y&ddHb#umgrt{o>AJtuimoaXF23sxcbJKL9caxkqWFpY zpo6n|xN15U^{2uQIP>}5c)^J}`_an7*VEmjk^I(1hAPFQTTf%&P2?Tm6KvbgT_AXc z4l^@HP=rLdNQ;xwC(wr)((%4uc*5(oT>MGdbH}9uzh~#f<9ti+b3d2V&;at-<)|=x z`$`Z^Z+h1B`zaft(UAn{y}iC3=RDD70>$o^z1xS6ZK|Mpry(od(oktswX)4^(5|Dc ztVR8j0P?;^^Wg@4LQ-j6hsD(QW2$N$OP|K;?D9YYwf?--Z>;@ta-6K|C^sMF2;^C{ zgy4R3hLFTa$e?k92_dn-=RI^4adZy~M*DJkH1Y!j)GA6R5{_kc;$?-@ zDcI($^U_7yTn`(8X1u#Srdht_V5yP``&EPA>OEe3M~@A$J1aJQ;Qk?pO!rtaFDC=R z^1V6}4+@&lhaJVrhO4S#V%+>E6#CE?Zt0k%ECr)422EqGf~i!uJk;3WWZSZ)5rJdc z7=rQ^v{;=&kZzEEB6gN07_(6*Crk9>TAi}x7}ma(mpYTI zrTU<*Z4HgQ=p$YEA8+*-nDy-T=?IF*mQYwfzLKc*U6(5u(p0ESOIUZdQ`VQODt*>N zCm~lwZ~Ou+WIT(#a4k8`zv@{eF^YVy%~lCyli{O zUmL{V(@lFj5xFb^MRw*Zu;md}e1-;e#pf=qi{a}UQJ?V`V((}DDgftyu-VgY5#>i_ zXP%%?9VjtINfm~Wo|XX0q@x}wL{dpaD#{{~qA;8>{bjbOwCCWzz(o`Xl91Ed+oQ$f zMC(QFAN~3!3EQJhX8#A5(MtK=`jtnbZ?Aw%yt#|7i_v*32}z>%88cVvT3)B;`k6yL zpGB^0@zd@R1+A8XK62$;nxJo2OIi}q5Q(3%&lj)aeGCz**~WbWL*z$ zp0nR?;PoinnT9o>Xa7krTto~d)PBhqm00_rvZJd&Ado|`Zmy%d{z(^!pdb>Rq}z

puy66O<+PQ-mb|vR0uQYf(W~eU-3eWgT7XlEcBg(L zF>ZA$3!mR2vFKnsjjx{`x>-gmGAO-mxtjpe>d)72`~mfw6DPZiEMlv?aAoUBb_cYr z5`cCNdx8b9u&{dKUUED6B_cS(tj}`{mRu zks17erj2AxyMw#?4PQ>RAQTh}T;@96bWy1_a#9cVKbg=|edNDNI6!@Z_=9{oXufs_ z+;=Sb=*a$M0@tGt5ulY{)$_A?5f@eQK+IIu%F8$83a_8F(1)@|2MxX@&b6oBVRx&s z5X@2IJtSlDEfe!zIXX1H23AoO`oKf;h8Pv|wUASPHMX63xt;H{R3}ZB)3?!u-&|32 z#OrUi4#q2v4U{^MecR=6X&+Jip^~}A<&0y~O-NH?9Ay(i0Q;Y#^lO7F%=cgf zis;9H9TdR2D|&Si$6UNGG%xh#Y+0KjS8TgwA8U9F=pBi5^zcJhdeSR!o+@t)W=`l0 z&N|2Sl~_w;x|&fF%zJyV00#(>;ndJXfrrYL?9Jb*TZPE+;*Y^ zC>OS@S{wi2488wk`NUS3qufJvB;W#>wld+_R;T_I!Z`J->0~F$!gcu0DPMn Ms!E!?AbaBf1J=e23;+NC literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..cdb681d --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + PassMate + + + + + + + + diff --git a/passmate.css b/passmate.css new file mode 100644 index 0000000..6341fc4 --- /dev/null +++ b/passmate.css @@ -0,0 +1,160 @@ +@import url("https://use.typekit.net/hld2vds.css"); +@import url('https://fonts.googleapis.com/css?family=Inconsolata:700'); + +@font-face { + font-family: 'copernicus'; + src: url('Copernicus-Semibold.woff2') format('woff2'); +} + +@page { + size: letter landscape; + margin: 0; +} + +body { + margin: 0; + font-family: 'proxima-nova'; + font-weight: 400; +} + +h1 { + font-family: 'copernicus'; + font-weight: 600; + align-self: center; +} + +h2 { + font-family: 'proxima-nova'; + font-weight: 600; + align-self: center; +} + +side { + page-break-before: always; + page-break-inside: avoid; + + width: 100%; + height: 100%; + + display: flex; + flex-direction: row; +} + +side:nth-of-type(even) { + transform: rotateZ(180deg); +} + +page { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + position: relative; + + padding: 1.5em; + + display: flex; + flex-direction: column; +} + +page:first-of-type { + border-right: 1px black solid; +} + +pagenum { + order: 99; + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +page:first-of-type > pagenum { +} + +page:last-of-type > pagenum { + align-self: flex-end; +} + +letter { + font-family: 'copernicus'; + font-weight: 600; + font-size: 4em; + margin-bottom: 0.2em; +} + +page:last-of-type > letter { + align-self: flex-end; +} + +blurb { + text-align: justify; + margin-bottom: 1em; +} + +owner { + display: block; + width: 11em; + + border-bottom: black 1px dotted; + + font-family: 'proxima-nova'; + font-weight: 600; + font-size: 1.5em; + + text-align: center; + align-self: center; + + margin-top: 1em; +} + +recovery { + display: block; + width: 17em; + + border-bottom: black 1px dotted; + + font-family: 'Inconsolata'; + font-weight: 700; + font-size: 1.5em; + + text-align: center; + align-self: center; + + margin-top: 1em; +} + +passwordBlock { + display: grid; + margin-bottom: 1.5em; + font-size: 1.5em; + + grid-template: + [password-start] "passwordLabel password" [password-end] + [website-start] "websiteLabel website" [website-end] + [username-start] "usernameLabel username" [username-end]; + grid-template-columns: 5em auto; + grid-column-gap: 0.5em; + grid-row-gap: 0.2em; +} + +passwordLabel,websiteLabel,usernameLabel { + text-align: right; +} + +password { + display: block; + font-family: 'Inconsolata'; + font-weight: 700; +} + +passwordSymbols { + color: darkgrey; + border: 1px darkgrey dotted; + margin-left: 0.2em; +} + +website,username { + width: 100%; + border-bottom: black 1px dotted; + margin-bottom: 0.17em; +} diff --git a/passmate.js b/passmate.js new file mode 100644 index 0000000..6dad9e2 --- /dev/null +++ b/passmate.js @@ -0,0 +1,238 @@ +class PassMate { + constructor(container) { + this.SAFE_UALPHA = 'ABCDEFGHJKLMNPQRSTUVWXYZ'; + this.SAFE_LALPHA = 'abcdefghijkmnpqrstuvwxyz'; + this.SAFE_NUM = '23456789'; + this.SAFE_ALPHANUM = this.SAFE_UALPHA + this.SAFE_LALPHA + this.SAFE_NUM; + this.SAFE_SYMBOL = '!?'; + + this.REQUIRED_SETS = [ + new Set(this.SAFE_UALPHA), + new Set(this.SAFE_LALPHA), + new Set(this.SAFE_NUM), + ]; + + this.PASSWORD_LENGTH = 8; + this.MASTER_PASSWORD_LENGTH = 32; + this.PAGES_PER_LETTER = 2; + this.PASSWORDS_PER_PAGE = 5; + this.VERSION = 0; + + // how much extra random data to generate, to handle set misses. + this.OVERSAMPLE = 4; + + this.pages = []; + this.passwords = new Map(); + + this.addPages(container, 26 * 2 + 4); + this.addFrontPage(this.pages[1]); + this.addInstructions1(this.pages[2]); + this.addInstructions2(this.pages[3]); + this.addPasswordPages( + this.pages.slice(4, 4 + (26 * this.PAGES_PER_LETTER)), + this.PAGES_PER_LETTER, + this.PASSWORDS_PER_PAGE); + + this.generateMasterPassword(); + this.recovery.addEventListener('input', () => { + this.onRecoveryChange(); + }); + this.onRecoveryChange(); + } + + addPages(container, numPages) { + console.assert(numPages % 4 == 0); + let numSheets = numPages / 4; + for (let sheetNum = 0; sheetNum < numSheets; ++sheetNum) { + let sideNum = sheetNum * 2; + container.appendChild(this.buildSide(numPages - sideNum, sideNum + 1)); + ++sideNum; + container.appendChild(this.buildSide(sideNum + 1, numPages - sideNum)); + } + } + + buildSide(pageNumL, pageNumR) { + let side = document.createElement('side'); + side.appendChild(this.buildPage(pageNumL)); + side.appendChild(this.buildPage(pageNumR)); + return side; + } + + buildPage(pageNum) { + let page = document.createElement('page'); + this.addElement('pagenum', page, pageNum); + this.pages[pageNum] = page; + return page; + } + + addFrontPage(container) { + container.setAttribute('data-pagetype', 'front'); + this.addElement('h1', container, 'PassMate'); + this.addElement('h2', container, 'Personal Password Book'); + let owner = this.addElement('owner', container); + owner.contentEditable = true; + } + + addInstructions1(container) { + container.setAttribute('data-pagetype', 'instructions'); + + this.addElement('h2', container, 'Welcome to PassMate'); + this.addElement('blurb', container, 'When hackers break into websites, they often steal the passwords of every user of the site. When people use similar passwords across websites, or simple passwords that are used by others, your security is only as good as the least secure website you use. Security experts consider this a much greater threat than writing passwords down on paper.'); + this.addElement('blurb', container, 'PassMate makes it easier to use unique, strong passwords for each website. This book is generated just for you, with high-security passwords that are different for each person. The passwords are never sent to PassMate.'); + + this.addElement('h2', container, 'Creating a new account'); + this.addElement('blurb', container, 'When a website asks you to choose a password, find the page in this book by the first letter of the website name, then choose the next unused password on the page. Write down the website name and username next to your new password. If the website requires symbols in the password, circle the ?! at the end of the password.'); + + this.addElement('h2', container, 'Logging in'); + this.addElement('blurb', container, 'It\'s not possible for most people to memorize secure, unique passwords for every website they use. Use this book as a reference whenever you log into a website, finding the page by the website name\'s first letter.'); + this.addElement('blurb', container, 'If there\'s no entry for the website because you used a common password for your account, pick the next unused password from the page in this book, and use the website\'s password change function to switch to the new, secure password. Remember to write down the website name and username once the change is successful!'); + } + + addInstructions2(container) { + container.setAttribute('data-pagetype', 'instructions'); + + this.addElement('h2', container, 'Reprinting this book'); + this.addElement('blurb', container, 'Keep a copy of the recovery code below somewhere safe. If you ever lose this book, or if you\'d like to print a new copy with the same passwords, visit passmate.io and enter the recovery code.'); + this.recovery = this.addElement('recovery', container); + this.recovery.contentEditable = true; + } + + addPasswordPages(pages, pagesPerLetter, passwordsPerPage) { + for (let i = 0; i < pages.length; ++i) { + let page = pages[i]; + let letter = String.fromCharCode('A'.charCodeAt(0) + (i / pagesPerLetter)); + this.addElement('letter', page, letter); + for (let j = 0; j < passwordsPerPage; ++j) { + let pwblock = this.addElement('passwordBlock', page); + this.addElement('passwordLabel', pwblock, 'Password:').style.gridArea = 'passwordLabel'; + + let password = this.addElement('password', pwblock); + password.style.gridArea = 'password'; + this.passwords.set( + letter + '-' + (i % pagesPerLetter).toString() + '-' + j.toString(), + this.addElement('passwordAlphaNum', password)); + this.addElement('passwordSymbols', password, this.SAFE_SYMBOL); + + this.addElement('websiteLabel', pwblock, 'Website:').style.gridArea = 'websiteLabel'; + this.addElement('website', pwblock).style.gridArea = 'website'; + this.addElement('usernameLabel', pwblock, 'Username:').style.gridArea = 'usernameLabel'; + this.addElement('username', pwblock).style.gridArea = 'username'; + } + } + } + + generatePassword(numChars, src) { + let ret = []; + let srcIndex = 0; + while (ret.length < numChars && srcIndex < src.length) { + ret.push.apply(ret, this.intToSafeChar(src[srcIndex++])); + } + return ret.join(''); + } + + validatePassword(password) { + if (password.length < this.PASSWORD_LENGTH) { + return false; + } + + for (let set of this.REQUIRED_SETS) { + let found = false; + for (let c of password) { + if (set.has(c)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + + return true; + } + + generateMasterPassword() { + if (this.recovery.innerText != '') { + return; + } + let masterPassword = this.generatePassword( + this.MASTER_PASSWORD_LENGTH, + crypto.getRandomValues(new Uint8Array(this.MASTER_PASSWORD_LENGTH * this.OVERSAMPLE))); + this.recovery.innerText = this.SAFE_ALPHANUM.charAt(this.VERSION) + masterPassword; + } + + onRecoveryChange() { + let recovery = this.recovery.innerText; + if (recovery.charAt(0) == 'A') { + crypto.subtle.importKey( + 'raw', + this.stringToArray(recovery.slice(1)), + {name: 'HKDF'}, + false, + ['deriveBits']) + .then((key) => { + this.addDerivedPasswords(key); + }); + } else { + console.assert(false, 'Invalid recovery key version:', this.recovery.charAt(0)); + } + } + + addDerivedPasswords(key) { + for (let [info, container] of this.passwords) { + this.addDerivedPassword(key, info, container); + } + } + + addDerivedPassword(key, info, container) { + crypto.subtle.deriveBits( + { + name: 'HKDF', + salt: new ArrayBuffer(), + info: this.stringToArray(info), + hash: {name: 'SHA-256'}, + }, + key, + this.PASSWORD_LENGTH * this.OVERSAMPLE * 8 /* bits per byte */) + .then((bits) => { + let password = this.generatePassword(this.PASSWORD_LENGTH, new Uint8Array(bits)); + if (this.validatePassword(password)) { + container.innerText = password; + } else { + // Keep trying until we get a valid password. + this.addDerivedPassword(key, info + 'x', container); + } + }); + } + + intToSafeChar(i) { + console.assert(this.SAFE_ALPHANUM.length < 0x3f); + i %= 0x3f; + if (i < this.SAFE_ALPHANUM.length) { + return [this.SAFE_ALPHANUM[i]]; + } else { + return []; + } + } + + stringToArray(str) { + let arr = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) { + arr[i] = str.charCodeAt(i); + } + return arr; + } + + addElement(tagName, container, text) { + let elem = document.createElement(tagName); + if (text) { + elem.innerText = text; + } + container.appendChild(elem); + return elem; + } +} + +document.addEventListener('DOMContentLoaded', () => { + new PassMate(document.getElementsByTagName('body')[0]); +});