From ac641111a6ab29e75d0dc84701a1488ed3e5aabb Mon Sep 17 00:00:00 2001 From: Daniel Mason Date: Wed, 7 May 2025 00:05:31 +1200 Subject: [PATCH] Reupload --- .gitignore | 1 + OneNightSansBlack.ttf | Bin 0 -> 88920 bytes README.md | 73 +++ dist/gomatrixbot.service | 16 + dist/update.sh | 7 + run.sh | 30 + src/cmd/gomatrixbot/main.go | 39 ++ src/go.mod | 46 ++ src/go.sum | 144 +++++ src/internal/database/main.go | 55 ++ src/internal/database/pics.go | 77 +++ src/internal/database/quotes.go | 139 +++++ src/internal/gomatrixbot/birds.go | 230 ++++++++ src/internal/gomatrixbot/commands.go | 370 ++++++++++++ src/internal/gomatrixbot/faceswap.go | 83 +++ src/internal/gomatrixbot/files.go | 94 +++ src/internal/gomatrixbot/geonet.go | 95 ++++ src/internal/gomatrixbot/giphy.go | 286 ++++++++++ src/internal/gomatrixbot/imdb.go | 99 ++++ src/internal/gomatrixbot/matrix.go | 600 ++++++++++++++++++++ src/internal/gomatrixbot/metar.go | 96 ++++ src/internal/gomatrixbot/ollama.go | 119 ++++ src/internal/gomatrixbot/quote.go | 79 +++ src/internal/gomatrixbot/remindme.go | 76 +++ src/internal/gomatrixbot/snac.go | 64 +++ src/internal/gomatrixbot/tenor.go | 107 ++++ src/internal/gomatrixbot/urbandictionary.go | 53 ++ src/internal/gomatrixbot/weather.go | 297 ++++++++++ src/internal/gomatrixbot/wiki.go | 38 ++ src/internal/gomatrixbot/xkcd.go | 134 +++++ src/internal/gomatrixbot/ytdlp.go | 45 ++ src/internal/ollamago/api.go | 347 +++++++++++ src/internal/ollamago/client.go | 233 ++++++++ src/internal/ollamago/types.go | 320 +++++++++++ 34 files changed, 4492 insertions(+) create mode 100644 .gitignore create mode 100644 OneNightSansBlack.ttf create mode 100644 README.md create mode 100644 dist/gomatrixbot.service create mode 100755 dist/update.sh create mode 100644 run.sh create mode 100644 src/cmd/gomatrixbot/main.go create mode 100644 src/go.mod create mode 100644 src/go.sum create mode 100644 src/internal/database/main.go create mode 100644 src/internal/database/pics.go create mode 100644 src/internal/database/quotes.go create mode 100644 src/internal/gomatrixbot/birds.go create mode 100644 src/internal/gomatrixbot/commands.go create mode 100644 src/internal/gomatrixbot/faceswap.go create mode 100644 src/internal/gomatrixbot/files.go create mode 100644 src/internal/gomatrixbot/geonet.go create mode 100644 src/internal/gomatrixbot/giphy.go create mode 100644 src/internal/gomatrixbot/imdb.go create mode 100644 src/internal/gomatrixbot/matrix.go create mode 100644 src/internal/gomatrixbot/metar.go create mode 100644 src/internal/gomatrixbot/ollama.go create mode 100644 src/internal/gomatrixbot/quote.go create mode 100644 src/internal/gomatrixbot/remindme.go create mode 100644 src/internal/gomatrixbot/snac.go create mode 100644 src/internal/gomatrixbot/tenor.go create mode 100644 src/internal/gomatrixbot/urbandictionary.go create mode 100644 src/internal/gomatrixbot/weather.go create mode 100644 src/internal/gomatrixbot/wiki.go create mode 100644 src/internal/gomatrixbot/xkcd.go create mode 100644 src/internal/gomatrixbot/ytdlp.go create mode 100644 src/internal/ollamago/api.go create mode 100644 src/internal/ollamago/client.go create mode 100644 src/internal/ollamago/types.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ab317b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +src/main \ No newline at end of file diff --git a/OneNightSansBlack.ttf b/OneNightSansBlack.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cdcdcfbd0701c7ee641017ce3f3981b2798ad4d6 GIT binary patch literal 88920 zcmdSC34B|{y+1m0jy7BJqTRNKp{;j<@QpbEpS`PR-m->Qf^x)m!``fi2T04Ig+E8r0sq0-}gSx z$4&(2_c*;L#up3&LWZT>j_a>nh&_Wy!T1Sdt`MGYx?tP7&380dUtrAC%UG^`-N=R8a6cdQ*>E}5vEWN%6-`C)~Z~f+-7d`l%<0Zx<17o_2 zHf>!!^50v(b2HwDL!P#IiR|DR?Wn}Z(&Yzd%Gd6w_?T>8Rdg0E8f16du zc=r2@Wk0LY@){Tjp)MqNd9dw7^!ADpQ>&93}Y%hC}U5|TPG_Noj z-({&xI?1%?+aYNHh32SdzJk>fHY8&tX?4h%$d+A*l@g zz?tK|ya#aKWd`X0tCL>F_4jd}i(?v&*YW*nR>!?K{uOoJjC;kbPQIH(0b7Tz7fCm! z&iCUP+AghT#pq|9^l!`{{~ODezQH6Zfnz@2-HCcGV-n6b=?mz?9`ye^z^9X0q%PEH z!#lcgl%c=3vwU$qi$%EsI53PqEd|7NR2~8>?n|8lK1y)>8a(?CX5jyVaxJVJIMK*P zrje%N-StezpJNW*0eb%!ZRkKb;4+PS@!na?CzYdJ38o_$X*bK^w_teh#k;S<{Rr^3 z0yqQir3$pY2IF>|HA{WKeArunX=e(*UzE4V^Oz#n;Mm2=fcpZ0 zcf$RoL%sv|Xe?+PG7gM`EXKk+{x0{9KO?;j+@;2W#v=1T8>3=;Xe=@h8VigW#wsfC zPPm_R$lbU{V}WtVJTL}-##mrH#$Unlgj9#;>2aX3$UJ~w@twvZ^T1e$v8FLWT~Zu4 zS`0k@0qtLlIzU4-juSLPgUocKrV(e&+r4C7l`IJ72K-)O@ zZdNMyvrA;+nX&%!2dj@lk zt})(_3i(nN`hz(mX>pj*&tI{8tsh4i*YB%`R+qYdPpuDgHedS(R;T@Ml=%?Pmf-#` z$N&6)_CUXWd7k4}=ea)_J_AmEnbrQEJoty8^Ya~l_#4m8Q${+-OgKU~DseY%< zrtX#F9N>qTTkwk%Kj80)Nb1Oa)7qga)S z{QLOEaj%$ZKrxJ6z~W5H0+5Uc*f_7@?R+60;TQ1({6^^q(sR;VvPL$@COIVEEdQ%~ zQhv&9a~HWw-ClRVUF~jhPjz>?zv1zE0-l>Zw|XV7&YS18ccxpo#`F+uJu13 z7zwQXR2m=0`*I);@5Fni^96hu@3{o;c?R!!O=hxA&X$7{@3FcI+{JFUcu#Z2dk%Y! zq~2r3dkQDsvnKT(K0ZGFr}1~kpC146_+{f4j;|Z<8=pJglGG=4r~i8TmD4{v{qpG( zr{|xZ^4Ygf```KLJ1@QS;yW+A^TT(Ze&@tHPrP&NojJdFV)Pg5-X4GZt+)U9 z_Q!93^!5jD|Mu;--+ub-ufP4k&pY3E=#8)IphuxM|8M;1q-=T(UN`xT9GZ*zmp-Sy ze(t1}l%c_BA?@_gp0ZdrGcps#BbVhtN}8F4S(yzq<6ur!zzU&_xIiT(tQ2z2%{t%gx0b9uW*&?=>Enx#}kS%4)*brOJR>-w5W9$+3C_By`V~?|M zv6JlEkkn7I57`d3hOK3z>?3v&yNhjO8`)pkZnl9N+12bQq|=4m#Bwuf^rbBX;Y z&tjX{e)enj06W3Hz*e&@T+e>Qv)Q|BGrNTSH(SLnV^^}TuzzRIu=m(+*zcgjz0dxO zJ;8I?_t}mF6$h+bVeN1a54Vp=wvP5Ozub|KI{GhiCrk=1I!4wcG`$xclOze%Bs^=2J#_b2 zuAR3RyK$+sAG2~Ro+$~|JFs@}n1d5!MM4uz$dQD-V}Rb5aCCH}09@`h?!;5Q2~A+> zu@KMc=vv*C&~*)X60(1A!Lk7WyABPw6TQ8-6(4lD6HRp0G&txUQ=!qK5N@Tuxf9j& zyqX}N>K$+c8;3^RiR|8iVcc=kvuwI*psR*q*YM!rpbOYam^xM`*n)usn?t}Je0R-B zl+sn{oRP=#*=mA#T+3Ds4z3v)Oz_CyV5$d$?ltI-(mq&`&_>-|?u5oafn~QE~*eZaaz475e0vYZUt<8=e%gSXPUG3$b3BoZ(&n6_3S__Y$ z2_5MAu)FJ!GD3qYkj-2)APKh%jZC)^L#vE*s;|g7Pw|8grBHaHYng>|iT;)LM{-O| z?!pkc6whEeh&V4gCP`h1H6xuBiTo(K;C3hSI%ZSPaDfp@dr%gpdzSd?~mS0WeW zm!p8>K#Dfp8AcnvRZzeo2&}BVy`3;&LqqUv%w~uru8p|7pmPU0YmZbUoY65(=K>&} z&V|u2na)MgF%6wv(J?KZi=$&YI+sMp^mHzbjv44&79Go?b0iA1r~{GE4FlzhyE4I- z)3m8bL^B>bCLV5AA68^M3`{)Sp+0m+St2iTz7A7gA65HG9nI{Y2mN!SU0(E$&I$5=W_Iq&XrO3R57EfqCj!Mup8Wu4-;{W;GC!= z;;oJ*sv?OhOw1b0i5Vc>bIwdbi*Z5;f&xT5j(e0C%KO zjAfwbd@yxUcfDwNJ!(_y>H0js02?}IYw1379EV6_taF;uG*-v$)Yk^!106VLnPJSD zk*117W3(HSY$_((L0Z2fwUx=nA4!0LD z+yW-%NH_te0blhCurU*BPZ&EQYY$Z_ZuitfsB_BMVD3t_zJw05AqDMD3=?yS_YFLv zackYKM>GL#(O^5V+-z`fydN!4x`z`wjP}{{7E_ByRPm(g7+#|!w2-dgdYXbG!r%A>ORRB*tK9L2wWylUjlrM@Vc@BV>H0 zSn8Q~fmo)daRFUCp$(*Pp-csuS|=VQvcW^#?rvoUy_80ATKbvjjEd<5>mR6ePlaTs z)=TP5R5~#f37sF`X5rC<5~B{{=P7SkNsSgnKt-Z0{WgL9)Nl=xrZc(A=^>7Te^e3{ zyA#fifnFDct9$BT*)el?^#dV&w83Jn_1uF5*^V*OC%E@T`2v+&S+vv z3-b|oi7EoYU zr#;jZ%y4UEq5-pf_Id8lL3P|_O*8_gCz@!+X)a;03+Q%tLmH>CH7`m8otO(W&yOBs ztQ!}-xZrfr7d^(sodviMcNP-N3_R*57`j+QFm$n)VCZ5=^bzpF4qOf33PK)NgV9G| znbFl!T&ee#5gey`Lj)(TmJ^(~T0wB)Y9+n13t+?aPP!POchbcwdM911CYYJHSVJ&$ zv6f)y;sS!9i*=%1ow!;r+C^8RqFr>gL9~mmHi~x9)h5v{y4oz-MORxyyXa~wa6ENl z0Jn*6i8vl?S1+gIat9%uz!L5Fb|GXfE(vC*dPy+51PnbOnB6GcI#KH$@lBMtNWG*I z7ps>9z8Cehs#We&F9~43dPxA60Cw6$eFwxhQQxKNC4nDQFA4k$C^=27?=tn004`TA z3E&FAwoTM`rT8Z5yGp$z@Gq*D1b#J2wyE`9qh1ogA@z~~u8kfu3Kch@a~;!2au=*8 z$g;uqNW!o-A^UnSN(=M~60tA_pIrdelHUMvr<#A;#+bhSIE%PsR!*1Ss@Av-7QLLU zeyfv0x16up_$lc#D5ZXV1>wmi>yc z&e&}nFm5y6Y<$qfOmF9yat3m~n)5==XSu%IExAW?6S;5a8S+ATOY^SCdnR9#za{@0 zW@dJq=b3ky?=}C#{D~!GnQa-iTxNOD^1S6e>niKZHj8b)?Rk5#{eJt~jylJKj+Y(3 zbKPAO2zl{=JQ`!@Lw_zwH-_8s><<9p5bTi<8?ZvTLPgMYvO2LGM@WB!){wSmsS z;=uaA-oSN%9|dOy`-8*5O~H$TR|F4-dO|OR-Uz)H`Z$yfXNMhOZ@4miD10P*cle?3 ziSRSwpOjaZ-&lS}`Ge(;l|NnnLc|@3M%p7gB1a?1=*!Xfq90diDjXHwioF$gRyuV^zMY*;V~jE2`F4?Wo#c^<>qvRX?eEv+BL7kE%YY)>OAtUs3&y>gTI} zU1O=4R?}T`xaO6b_iFQNdun&qUJ>h$?Tp=AXR7nn9jbewKDWNJ{$TxM^&d6_8dfwM zY51hEw6V8wL*tIdy^Z%a6*LVrJ>6W~+}*sb`AGBoEshp%OJ&PI%R?={pR#7k$5XGE z`u*14*1fIIv?ixzw*}&L(+Ap*cdYNs?sRl|J1aX|I=ef6)z#2-sOyF9_U@-^?&JnxSA1@mv~&F{Ua&(Jr!@2Lgz z7Cg2vcj1x#^8V`fi{D?;x#Y$H%fQh=+u&tO3ziNqePh{{W$zF54t=!z z=!)DGx2rCrz zSoi()mFpAhKOQX_-8Oo1^!FPUY)EW)W#iP1M>oE(@zkdFO?Pbi(Pqo$O`8vI{_U2| zE&W^8Y}vWxiY+&9xp&L)E#Ker@|It3ePQdLw>h@$#6--VCp94{7T8v*2>f=0P4{622*LgmX9`>-aRBeQ-JISPwij@YVbi>PPTI)c;SY zI@R>SL4lk2eTDWs*;tlcX3RcVWXqScOUtrL4>STBl7>s`n5Ko788v021&&f|}a+@i~|j2gH;i|e#{-8xp<%(dQ9?I`nx6z^cHYD#4!tP9n1r7on50);jH zx|(%Bp+D;OubavnSk%`L9j&ddDAxo%zTiNB`?}OWXH`@g_{YHckh7e?!i{L{i^qMw=CmIo^s7Jt} z7J-Xu^sEX;B|;h@^iaX!LGYshT{Yv#18gg}f-{21n%$Pm6_2-)*Vj$sF^^>$E-L9x zE*_QQ4hz)RHNjV@%qw@M(NngTCCHkV*Dc&Fo>rslT_R?$Gcp#`pDSGDnr@tYfv)df8+J^eNfWl)F zjX+%ToZ`t3cRJ-+AU z=;+Bk^2}AY_V?eq>a)jJ-MVPet*hjj$zwBSwzSNgF(vs}e95eMPk-`&HOp3wF%voR|x$B@G{a<0ytpKsBdG+d+2&oN{fE!kS5A=~cC$}X`PtlDe~K=VvGZI;ep z$*il&%>q(blZ#Ss|FdE_;gGa7hxV?$N6V=FJ{=vavVf3@V7mrI`lIeP?(@Oe6S$!%-a+_pshde{t ztURqQ1ukn%7Jar^r?XlOveoDiz*!C>ikfrHfHwRS>;7Wc;|bG|yv5Sd);)E~%wRBA z33kQ6_)vTC3IG(wa@4HhvnfwdSqJ#QUijR9ymkSEgjCiLhTQcP4 z=g0`v>euJ#B&L-m#3T7SBhSk6&V_~`Daig}Wu+y>DB~(BEFdmnMQ>AohO!9PV6!2(~HAS52aYastcW$!rHjhIlMjN`lA~PZs3V~w%&oit@mub9e-Qz0m{*l zoblVGC9((6;4m0xWjs<{74VmqxQd*%98;D-Dd!VT?B(PyXphj>u-(j~(=)X^= z$Lz12lKr%X4ZRJ0-{Z z5$-6`Z`2oClV9`}7M1G1zz_v57(XQsfOhf_?kEHMpTcgOldwa1h#0vxn?tigf|rgN zz$-Q|4CM%oZfI@}&@Yde^pY$q@;p~Ob`EGs^3D}SfH2S^AVo3#h>7dxdo_Vll>Js1p@l?H>Qd@SQpS^DPI==|E+dC};++S>V1KKFDd z|4~#?5Q0&n$x!CA<>}jk9*SUT-wHeyBP*bq-J#;p>dBHMO?lW=;M8g*P=QwNam6R! zm2nr!Fd^Nq=Nb(k0l|pL%SLpv#8`N)forwtFAV7Ro((6j)M1h|!yXj*YWxsrwH?+HS9ljLm7M4V3V#I$fS2r#FLK}#b5N!an9_4{S1Rm&r`?sTExN)Ibb67N#))sRX9V9Uj62Y3z7jYhmLV`Io8=U%cqYXos7%rL zC44~o0HmRNBu~$4BM!9-jdsyer~Q+|y}gH5^b8I4Y`^%#g%_T<*m8sYuAMvYvfn^& z0KM2S4DQ{6}N?$L!9IW3xQC@oea}{vp$X&@hq#r_=>Wa57T+k_Nv_&Q(7@O2% zfV7dd8u?%r%m=N^4(K@sopCJ^EijQrkpCLu^G4T&qLo12XJaNe&%<|srgSH&zzgNc5d$3W(C0dHb4@l=uHIU$4Pjka6hq1+?B`)8*(j1-3#JzQ|$MIv|(N zK+9A@k72{Og;;}Rml|O>2jU7cT)Ae6mO~aW;2K7vhOdOXjn5ZMKVN4kj`&Hz0;eY> zOR_({|A{B|KmO^z|NHJ|o)Ptxjz58%mmeeRr!?-;X(cv`XivyZMG#;v%PAlNY!Dh~ z5c(;YN<-}A)SkG}X{u_BSNu3$+qBr0>nM?$A{Atu+t_nFi!Xw7D2OBH4Am{6ccEnr zEz5_(5wSuN+5Yq=zUVsKEQQ?u1bHn+mZEG!4RoLloVn2uJLZ2jQ{rxr1~T$UWODCZ5;F2Ii40O) zZ21~PQKT_u*4N`BX7{-7yZhvwN0P={`M$+>t~mYHt*8$5AxB?oK%a_89-{{gwSj-4 z-h=3$W&~scwyKT@kTOrP1kL$cgDc`ko%KB36K600lScGUr{`^_PXC7cy@df!q(*v- zckEl(x2rYYd-UjDt}m-9Dhsr>X&3K{H?3-&x^0fy4jXVwxyQwn#4eMf=QE(kTN#B`XF={k6q7STGM$+ z-~Q{hV^VD>R8tvNyz{>NF@O6e{^+g+vv*88xXn@5R38b}Sa$3`dT2A@hV-g0qD{Fp z+EAhR9OzD3j+|t+UZ5P!(X9lFQgoy$n$4Dcy`d!H_taZsvY146Oej8-eEN4!{qDf= zJ$sH{bA;cXTz&iPN3Nmzp+`v7sK1nr#^IWgv`&XHo7A(OIf*bNn;SiqSK=k;t|Vzk zbdYHN%$~dArMSl=@XXN+*fXdZjOPMJrL2T-6wninQtE&=a5j>x9=k{15aTyq(A2fR zZ|5Py*EQ9_P<2(P(Q{iJe>nMCPHhK&f7<5mxx1$CyucZT_EBC}AK<%>tnvX(Vs6X> z9ThS^ae0ebk|ie$D=!Ck?}4agVDy?%^dlvz!RR5L)e$TL6&Cr6eC|?|FHiyj0|f3w zOVjdJwG`1vNtlsdogSmi9~_<1bxH5C%R6UXJ@iu5L;3OO)U3K8xw<;!ZZKyz`S}l< z*LBR=(mHhe$o8+VI9b}+*Ec2kz3Py^G7zY&!TUM$paWSL2OU`gn8cEpQPN6~9;suD zsoYJ+bY_bN42j!i#poql$-Sqal)Og)2max}n6`-d8l$zuc+uRcJ!oH#G>~O6wLVXc7lGJ-rPyX3}VOh%r{jGlY?qp3NLhb$pZGq4A_~MT}=$ zl@k)n_mUgNtfx<2$+8gUdYo4#>LV)56YNs~lP8}O2DA}kUHnBU2-?s+0*kjc!gILY zU+?EHCV$Lh$wB@#{>?pm_C9pgLn_W{*)9A7{u(Gj&%AM3dmv0NFfdtK0_vyvEXgEu z1%sw(NB^K^C%eS)+P2l(Ccjsr_u94f74Uk!hD?u)N_XfIxz8YjLWHBL?OdJ~wq z5pR{iHqj1AK1i(?!Pp3kLNlU;!W`DjD=MNn=P&SubPyF5p)LsU0GoO5e8Xs$fW;Q<9Rf+~V-mS%a3aU-z{v{k-1Ttjb`$lKkU@;6*ElPpp-f zOIzVeo5lVxCy@s>=jdoJDzs=dl7TZ#J=d`Yc%?K@`cn_GCOv@OPsKvy+0)7f_^y$b ztkbV0?2dq2`sW(6Br>}|j3gi6hmHci_HV$$GE0H0)>pb@y!uQbU@}VvpH*K*w)DA* z3=YPf)2A~web)4utTm>aQ?X9_c7q8iEvy_M6{960f1q+X^YwhW2 zJ@C}}bx-bhx@Ok99Maa2#P;2n&z{v2pWc^kDlRDWl;!pIFBv>uP}Dnn=u7kazBIJ_ zaG$N)u{yDR``DV(f2wIUWkqd;V(bhUz;A(1>Y;r^;-M@kN4y8b1nSa2A`-Kd!9JlS zAP|~u$R;8u((=QJV2xQ7IjHB~|7r9)AHM$na|_$1f9XroNtlYRS7;qw9qL|(y7S;V zEo1fZ+B^sk(nW;aScl3i{hpx5FJzl4|2<}paG~leIe7_d z8|p#ZbR`9*cV4=M&`)^I9g7C< z+OYqDg0Ye{KeCsUzK!=S-M1sSd&`OyTQ2kNyBza{@bVz=k_}%2Y4K`w zg{f{FffAtGWVGZPttM;0ttEZglh!jmesrFErRF*=@BG@pz}I#rPjh+E@bIEp(#eIl zZQgQ6|7{lx4PB7jk1-VQs>i#GtSTP;+n7gJjm$_okC`y z`*?%EUoh@Nh!X6KuY;XL3LI(Ysv41rH;&%XKWOM?>4p>UojCEHm=k5mU&6&VPHadW z7xp3Qm6(K~A2jZd9@@UnGEA|-;M-7n>e+3eed6d*^cL$GQ65eac{j?N7;p}sJh(LPQ582W zeM{AXoC`F~LR953as~gb9vAmmrKgLpxciHR$9>$mdp9@w_?t-|e=mtuamgNj92iZv z5$+U_COowUvW}q5!72y8qY+ZuNpx#5lcN}eD$|%+&C;De{mrqDo)<&^^iYL zfl#Med=RMTSjU3KjDY=v)xu-33in{_!<&}@g~dJR0ve2GneE{~jg?#*a34FB;2BX$ zEK-kFr$w#98H`EqEtp;LaG^U-MIb)k@ki#yVsj&lXLdjQmpdyjj7t;9yryAc>&m*i zm92w2v}0fv>;_#dZRm2J5scPe8h^h*+`kP0x$F$Sy zBlW)Uz?&Tx&)xHtoMZatP%!Kc^liO#=4Fda2iDnRQv&YdGDCjo__X2rb(?ac<(|UA zB11kr>7Ap^XlF5SGy^!&GgrKTm|~j$s~jz*7IVQC>pjwpCr&&rMI`s>cO>_1)XzHf z^J<%*@)Nhewtn>08^71H^WNQy z1oOBx3Ee0;i+_s_G2U=-3%x-2_OkVeTT*jXW(?kx=1LGY7K??D;R!+slVfmK%U1rv z7xumM#&fUk-1_|UZ~gq|d@G;(gC8Wno=o|K(sc_9hP>(LK!l#@Edmj6l{E@XJeYj& z$#tJTbMs+p@lW_~lW%Ym^uP!CQNqAS7U>lR2qZ`g_ z?i((JPydN~lJE0m^4+6HujOAkdQEbjpodF%we0!Q6v>(_rK{r>9HcU?{G zli&|LD*SApDhp&7XK5jjW7>8_;29$O`(4uf< zT*eK!rqeN-0vdbb>JjMkWU3)VsoH8n2}nI6H;Ix0KnFyC#!?2Gx-484B4y4W_UVbV z1Aoh+at0b;Hl<=R187=o?d+xNmTWC4Ec0vc%ssetbiY39R5+){Rb1?}me10h(Z5U8erJ=pl7(Ou^*QwgUb%FC zO9bO57oBjFMCPjAFB&E?P~)D-&w(E$1(fc&je>q^pbu}hm~DRHC7bYh!qq54j|BTp z`^SVz@YLqm^0w;kJn2C`CYd{`@`FKtpu9XFvFk7H-3^~lJ2=ZH-ca&DeCpIV9eAPY zo1`%*VxhRds4zE2_^{ASK7zJIC^VT?tf5hRNa^!sNLLs=X#o#_sC34!G`OV zTt4BHLUsx?PT_7-Q&glv{-BiCUEQ`k2CP=a^QB-KonU(HN+iC!7f1~%TzC5E41B76 z(gUA%NWj*3i!mD$6L-ct$>jj$%k zk$^FWqs9r0^Q$kFli!!aN~85(%megs`pCTFJ)^Y}Y~^E75bEPCEkiB_ynSwo(JCg&SIuV6eI3E~W(p z)9Oaa_CNdSU_1}FN7EHD>8u9mI!srB{2x`k$3&RMX-7&>UGatuiGhL9;ZWF}FLf7| z6dy<);=2!&4X@N6f}asI5d}>^+_Oq{ok|CJWn3%gb4izF5DrOKobG5c?xZ5b9yDH6 zerV$9bb@S@31?*m5se?@giaA4Nc((n=#Zjd@lb`|76=3s>X2WA9Mrr7C~mEMG6B_} zH6NwIj$N~QHn(UV*80i<c7l3{id%dmQ(3l|Xu z!9J;jepdoTOXV5-sg;S2KzSk|Ic79SZ1YI+1zs@N+WaZF!~2!+sbUPk{9uQ^2g~2W zHa?bbBHaj7Vg;2rDEK89LOD?eFe&0taJ`k_DHs=?LysW;|HQMiZwoyTp({AhaEG!hOoze} z30mmszYLQbEJX)C@Jl08;_fWynP?WN{-6YEGX{o%F=F_ku)#LBDnZpeZ;bJqE`4%# zWg>CScX?y-xgRvaBbU4i>wW}nu{TlY`F##i&ZIm}@l4m=xz$ zWQ6$(zjzSB0U`g-DKfV&k8NI2)nS&#R2ghaOI`+{d-3%lZ}JoABt&qgB13YcNyrV- zCDOWDKAa7h6soRS~luM7ncYO%tsrr6NdaTN7POX+jxTNWpwgy?}l}l3Q#3 zylk*$suz4c$pclnP*t|qQk{I3>y)6XTtH)k*Svc|yAX4gUyL!!XQS#U<-+wq%o&b9 zu-)0v!f}$*HzzWuC?Q)K5uPlJnJ~Z+bWukz?Jj_(CmsyO!O8H3JhN3HbCQwRP6-e( zR(!23-#)z&#GT*P1Q*$@Qhe?k{M0~9jjX|FOda*Ejmpb8+BrV&nTUQk$4P}~$49vT=(Y~Z_} zDlO1_F>BefA060N`^^L5-R01E^RWUgk9-frZ^VdX`ZbW)XH|qL?>O77p_C^Sw_8d4 z(exW$nEXvB8V%9;H=ru}+ zd>RuH1}{9XPeZ@`d-Hq0xBcFhCATbT5j7Vle~t4Cyp|5pR*;8;XOLroxN??H1G3}1 zJ`LoFBL&aOcP$@y@{zm$ZQiW!+>tlDHqrcMc&fj6m4R}Mc z^Bdv8zlr=Na}s7Kj2<<8Y6sfJ*)}*rFg8oo+z;>&sEd8jEJa751gw$RbxggiYz|G0*{C*LarJg_$630RD6|ZmLZ`LeHM!^_;s~`m8DtcU2XOD ziK{nExn85aYD(Lbi3?yDIzcgX>5niujj&xQ?+tAc$!@A*A}Fy!nwL^_i|tmS=u+OB z1*R%-LTZ53K`GkluZ<0j$EH!1d|O0s^*F2zRaJEsyVoYMX;I3Nk4{74z(7lPn6l@C z)0>yfCjAJFk)e|oU}rHzVq8T9PP@&Vi^OqmqS=B2Dz8x03LKO<=pzeRO&doOGP1=3 z&U&4lFU`6wckSGHYj*8kJ#WD}<6WAv{gsuUR@vtd8a2dh*=B~9 zp)}&tBUFkM3owG%+5UDU5yLj-c_loYG?tX{wrcIvt+Ur`w|zrfQanxjc;fNEjfYB_ zy;p@QyEn9qtagV2{o#tMXpC&ES8_<3Km|b-kGB>UI4t>jNLVpu8=&9lz$|*4W{J;6 z3Ij4PI2y{qF^J<1;u%?P66^DYqJAu+iB7MZ3|dci1(cqO?bZ zf2_=y+f&utT-7sohLU-me0*9(#WXs&t6}Ecp2EVOxicF&Ix?=S;_)gvfF-m?hXzob z+d=t%HqNp*a)TKJFsOdLj?(VnK9tvGBkclXtkEc%c~}@=A-@9sLBN`%$NbW2B;vVkd$$0e)oZe*WHr+P3`pNP@P-Z@E;*>Q~U0o9k=E@q;C!fLmvOK zUk8+13yVD7?FGiNva?!r=?RU;fehc=YH6lJ%D?H6XXgWZ_ASpZ?PGIz&@jk&x zoF-841ScVemgxql6+A^fx1wrE*1{a_ZVG6A{C84Djx#v z=V9hfVJpPj7dACU$~9Q6(SsqNfEffV99bI5D9Yw~S*IUGS~~2&L7b4_i_nG4``m8I z@O4jdx75d~Dnfz$vi#Bl2P)1D7{T+XrJsw@VwoPfLsL0Dv}$kC7-3GSxgkrQ+qv_( z{rjG~@WSWzt-g1~ihI|ty=VFId)BsXp3=H?#^MX}FU=|s);2fRhNGqfwu}4cY!UcPbamf176wl17oq=aU+w$6+OoeKu3qsYha z=R2^MZ3(pT?s$j0EbX!<4?RsZWKlrkVCI2!jKUv+B%DFjPY(@)^_3!^QyM7sqkso57rs@q2 zi>1(EoH}iK`{C;HIsS?)Yz+z;LSA2pO@R~kKakh=N0=irK0gxtBgC*PA*VcoY3dqj zQqm}V3^Pb1-VrC3_UxiIcvHLRk;9~4g!w#$lA~OP%rDs_Neby*~j9QIB zi?vv^TzU{E;YXKQpDSLMDkUHM9~2vmml8e3YN{&AL&1RGr+70c(v+ge$;q_owWn#4 zY@p~kA_!*6`_sp2DPf8a?dk5`)77hwAH>);BDxzqDn_KyB&VLp9A` zs|^HdrDxlBbaw9O=%CN`WLN#thWde6-C%vgVBNPI8&|F3u2{6B1VjVGGpUc)NXP%7 zSQEq~uSvcr9bb*2Ajf8YJ>Mtr?qW@123OF11mQ+OwKPvB93_~i=g7ksTqK?HlL~8R z=1+Wcc6s^iiVE>r>1>-to03ktKzmnuE=QEUe4I z?nRGF`IPx8o|j44yj|Xc=SW4L{9KIFKO7UZVzsVvbfX9gqH_2nU~iSdKC-X{kLJ+8 zU{+8*yNlSogPf9fl6*o-!j)EApao_MQBs49u+dB?@r)8V$imLo>5H)%#4NHTp~)h& zicCto5>30+YBnTbr@b$HYDv?Q)!5dB+G88vCvpyQnG$!yR-(~4NN>4YO*wlG9^AvHUManPI>^6u!OE2vi2PypOZEx>u9{uUK41pm zIPn3Y7C3!i~OyR5Uv<7s!b$>^DA0Tx%7zdI3xw z0Rpak@O&_;;}ISRi`VZX$0Lz=TF(yFmqHV$hofH)3;BWi{`x{skzKLWRa!i@1*WQ~ zuew63?bhmwoZ6dd*$wDM0o}L-U3~EzbV0IX0d`$}UdV9d4585Z=HFx~o^`h4J9FM$ zGCI0=F^&?Cr-Tl^V156hb?X-OuU}gk4p&u$!w5hi-VEL^W50JT-VXhrR9Vm#=nLpt zf)k=oH1*hgq&%puZn2D9D?Yh(=k+^xUeDL4C*2R#KhbA!;u`5>zL$R)GDTs3=Ita~ z_#ys+iW5A~J;(E_Q_m5R#(GdHk9fQ&57ShX{}bVdVpn{gu%G;FO1#O*B~1Ya92pSM zIS?j42qXJkA00D*xm>Ft<@mA!Cx=wbu`f?gOlw(0XZ0VcszEyNAV~WJ@%XJeqnrI z)sIMWPCF<`;YP-@B(k+td&!#4es3haURpS!cL&|)quG*3~}q4TSXs@mJD zT$TB!JLPzx*&-gF{y9>lK`Cgzd=+e@Jj?{F^ESg51l1M0avQWdSVjhrz5(K9BBvHT z(TgbotjrVQ(2{RK={(hDG8<{JlHC)emP4SB?dimdO8Khf`f^Ismi8xa3jX=oir=?Q zKXQb!wJDkRN@@$`Mf)Vmi>_o}j9V%z6fYL5J8~phV}i$n0&K+Mq5y+(dZ8aW&?IbVjh z4R?q-AdODxzI(Q7YtCYcIZLmYF*z^$k}v2Lp2;Uy8CM)#b5@!*CNJg$!bwuSm^Y!+ zyy+Em$}{H8WSCd^x6cDZ^G2=bHT<3h(fjA?p*f+#yv2W~!ldT}+5_#9eJI)!Rola! zI#)eBk^%E7k4%Oce;0$@CR2OVdS2sgpM!Y@Fw10Wj|%e^Uv_qTK)d*pz7N{Xg@ z^M6m}xX+uH%5uN>;)z6eUVDI>PQOFx?%NI=Nsrl`qHl;%fY-e)g(mk+YTeC!nIn@TheS5CO!6;Ls5oA zK*Ztdd@_;PFCt>Oz1Pj>Qi$jkjR zEc7yXk~-tloi<4$`F%x&8m-1?pv@#`fv9{X-ovjt@YFVORqsCBn%rIbjeJYb(5WFhOAC&y zz~swq-d?RBhxsG?q+lGF$ZD>|q@`Oxt5#w>S7_+9-m|ZV$bk-c21oJBY>v>>k z%+z{blT7D%!F&#ng$#2Y9Vn{tP-Y7kx{b>R!5 zibwy7*odB5$k{`SUM4cKPwY!&WcR5V*_TQu zH>OjvNoPMLEdoC;Pe(~}%fZOAU_6t~N?R~w-Z-=SLg|ENs?n&+^;M@9(r2Olf~mvJ zolW_}AcbI0Jv?{_Ffl8Ta3wfPV{X1JA(! zapL~l{0cGu&>p!G1QWshZe=IuBnlx%i^6ax_!LR6X(*PMzTTJ(BgPDOh8E*;zK2;_ z%08sxJ~$s3*Ryq)zZ4b9)=64zWUdJo3719?pP&UHB!15c2AWF&%{9UMI#FOSUJ{E% z!SQ3Qv8mD8XiZfmT3zlB`;n-YL#bYq6V-wu{7s5#TWYfrb>SPF%c=A=b|zI*dibnN zwzf4M$uls0{_@Ps&9zfn7pJn@l0QymaAu~t!HF3~d9b}FOys`p>z@D%}`6wO+R>R0c-#v$`?{|VfmCsFv6#X$L?{8Q#JN`eKIl$3-@g5kn|FrtZa zp+=@XMa~$uN~>=SP^8(eKPzG5{krRSEZW`Dv}#J+FIin{+AV?O1xsT4Qh9um`GMY> zZtU7Kd)AgI-s&pf%z}~@Z`n*svTP!cPwhYaNYu|hftS}gw64^6LKB40x(vz5hCYC*wZhQN8~b|2?oF1A7J7V`4G%2g*cRozDEhZYI>6&mA=Tk zTQBc!ttxv7GLyzvITv zAu^z@a0K%@YwkR?8TnkWV#mg~x$~^NbTykxzG8A-`b68QPiouW;{S=ZlgA{z#fnjVvbrEg-T3oSqd z8$iM=xPV;>C94MpPHf$J^eC+1ONw|~@_&0S@rd6GMS~Wjej{_oON`mr#SO_Du+Gnl zP}?mOq2_wvMpSBVo8R;#2-&kLLouTSTFL)pQoj9`$(`a!k+$_ZE_TqS8xW-z2LCzXmfi2|S(#Ba`B z02)&2Eh7A%ej#!+N<$&H8(WLTLbdp17Z^xB1(+!F2E0Bc2Wa-|L~b*!5cg8>eM0&` z-6c)Rr$^8hQACzjh2aKA22f5>v<|uc`v+IXJC~_xp36GhmhAe1ocv8;wq_3xlqFB4 z@;+blDsD>uk4Dwh&uH}Et^(ILON;D05K4YJkqC-;Ce{-Q+qgm4Ebs7NpKY@MM$PFX zzOz{Hk$3o41b+dhVegPlq}n@gNs3xF!zO}+m%^fc=-aTp-{G%*u6_qb>=7Z)mZ$26 ze--oBKE9tnD%LBk{rq|b7px8GDoi*ygdwfgQNq9KcG5vgVcy{B#F7Pof!>zjgiH-` zBy$8`&aq}8k5UV;=?h#A@UbEl0?ChjqhDuSv%5XfzG8cB-bKTn!UD6@?F-B}Ks$LH zSTVd(d#y&amr2!pNctIa9RAVuUhowvjWOr%r%l_od)scQy1)Ov`%o3}uE}+sS*OU< zb!z~dSfxnO0PNsFiVGh?P1~kTlYVyJef|AnoR}JmLtJxvs_tf9CjAI}YYD|H)Hzaw zmm(Wt2YJ?IhBalF$;kdejyWQhl$nNy^1*XFRWnB6yS8}6vS?~cetk^c;v!~Kh6-H8 z1w)6W=9?77=ek9%RW`aC03<<@o#gsy304~#;e2G|IMi#)-)QW&Jx$*!e zN;I<%q(7pV^B;&APL5fmqNkae2bpn;t}b%qcGZvvmt3`yxxI?~w^i*kRJX3BP>k7l zHGX+E4=YnsSr4!&knEPL!-jXW&(%jPVU5r>WYkBY3Q=wVt>&tw%+lGjm$drAl_f>_ zE?>z@u~@84pO+Udu-P?>bg6Ny=9hrpTLR9d;-!+8tnnhD%#!#%OJqQ$yFhbkdvqnY%fbBrFm(cGj+#I zJF`*N?nEw{m(qGgo?1<`DpqaE)8(!_b0uxBsxK|p>&-P&(ieCQjcbH&7i$*v%rB^= zh+2xtOnpjEW{5Dc5R=|aVM=(NM5yvrHC*}d!!!@ZJD@Kz=tDB=px*?ZbZ>Y1Uh-b4 z8gM@Y+>hxufe9{o`NX}K={JPMy%!}As&pK1+vzuj@yD^BLo@FEGv^k|m|MwTPM%%V z&!}WU8{R{^{sS3(_(S_Q;x~U8Y$=&-px-T zJA;oG()bux5ch;dg|d6;H_ zxrxJxxzZs%oV-&#ZbpkypN+l1ujReKC+Y(-aqm3qe>wWVuT5UVdoQ~zUG_z3JDBU= z+Jg~FpG{hR`X1g#g|Ma@zi0ke;53){;vSO`nT6_0k;;Xaj}QoP>s*#Awq(r61Z{Nc z^xwl)kTvSAkkXa36J&Z@$Vqjl_nD;ILX`@gwa=ueRe!F1CZ%W7HL4p;5*=bsFtL9n zJw^Y=v`N?0sj?ZT#{8a`XiLc>P&;sSjkzQX#1)3qe8L^xe@C&y!{QySH4 zAOf*x_mP*KufL*o>84I@6ZVjRA4034eKrXJYJ-4+R9lJ*oa6v5n1~IZL4}*za^`Es z4xHR`W;f1BSW34;G)mwL_+igNJA+>!iFNs7OnN-Y)EpAvq!?@AlgQr|`TCG6e|LXT zm6X-}MS1cYhrWUT{K)CwNQL`fe;q@TQKyx)#2c}#m!w}};5uwMCsg_~Y8^s|64EmD z(tH%NvNM}ki$u`W#z9cm(%YHZ`2uh^*q}!e~x6#4s*#!Zb#Y?r3!+Z88mD(4_l#` zcs4es-vD00M{_gM z9qsIFYN8a!&c4px*)y9un%bvLbvL>j>T09qp+E^%GUi+Jt@eP|Lcus-VZu-WKlCF! zk(nT@QG*hnGiY=fHcZO3kJMrtIZ<|D&*|FqCe!>Y*n3(kPO@OBy4kcG7MoH}iB`6# zKy;Nz?L++`&IOiiqs_^GJ3l(H@ARFtHOKeGZq!lb1$C3^(o*$tY3XO_Evf08=PvV> zfjN-Om;ytQa!tU4gk=C93^*GpIh0BWO9AVGV8L6VQ#h5-nXD3(o+gz?QKYA%XvW6o zYI&&V_^AUPKC1!^?N86&0ez^ylQV@OryCqgh8>ImKTLK#WvQy1mNp7UirEN-Pq9UK zb+yl@?hWp%@>TksA!m@Rcoql}`KrdGj`pwDeC|%B+f9?9Tl3`}*>0(?r2XyPw%la$ ztgk;xZFisi&-A|cU+B?QHn{6rTkE_{)iatZ&;I(=^fve-=?m=1I}F@Jg+6fZJ+8QN z=XJ@a@Jn5(J(*~~*k1uZVYVo~02__!kWmATl$Ki(CkNiXaT| z>pIwC&t|Zpxy1VNvvsAB6nFJ-7?1dGrFBtOK7ZN15k8GylG8feW*W7ArKS0+R;dr0 z2N^aduYdDRcx^6x`Q_yGKtH(BSEXkWzjTnEWX{dWhP}Xhuqt-8k&C^a0W?XzJD6R_ z_X%HLAc$CVJyr@(GEz+1wQ%9A%6Xkb|5tBc0v|_l2Mfg2w@Y*vJN>v0xThfkc1^<1B8%c31L|d zlMn(9uvqi`-|Oy~p3z7$S=gChcUN~;*YWDrtM^{LdbMntx(B$(Q6%9Xcp zI&n$M=hYmS7)zn{Pq#Rt{0Dg79P*Qv1u%16vr$*To)$=;s#^cT;O|#+&PGnySp_st z>m0do8`Y-#hh8&7KC)M@S*%0^V|V03)bR(%*Bj1<_iju<#8JOgD=^#r+oULpgk3uO~%Lj@)|%1v#S zY#YHhSLrM*shTmfG~}%cZg%C_W%ZZmtzWRH?4yqAQs2zdg>yD7{IaaJ=eaifD@rQM zsBT`d7CxNML4NS%or^`DW)^R;$Gw#2RdBte2~M~GLCzCEWVh>W6)gd!Sx;$JTn0+d z*z;<}Gvdml=C@L5Qg*2M<-nNIESJ!8&M&tP9@eV^wg64s#JhjbLB~*<>`4<|AFYwG z96CH#EAy0{Dm>F&PIOR46&0QpMFdasO;6Rc?(Km}&?ez-b zt?&lRd`PCC9IlnEF&mob&`qvGK-S0&smJJuclFV(`Il{8d0^hGUEwuN?zQbj(}NvY z@X^(n;%P3bteqB6p6a^)yzVbbqWAC6l1wBE0jJ1TE(AZk4RZJZ%eR_8dB_!zuZj0l zc}d*A!{r8_44ayVF$GW+t{~MJcmb#(FGD7#%aLasSAY?SAwjFd;10}Ge%EDV1K<0` z$$$U-O=B-8`#%05;UY>W?uP|w2IEGPI3v6WW1v#&S1e{)u5VffH-)GgX=etk#5@a2 z7hQoCfSZOF4b!SCW4PfD`kjOuniK;=Km(yGkwnhPQisRCV%g+}HcCeo<=FP^XSJ

xveO1>u6y(gM(rV3l`l35P-%o%S(&Bm@I=+mh$p)279mqkhQfCf0hf-lA_O=z}raUTil@xpKjk!_a| z0$)CPR9?mqFPm8n8wnj z;8C0cezj@F4qe}-=}!$@c}6bL{mhm?HXL1_?jlaJ6A4~7d>yBmg~Hy1zHSi?Q4r3>njegUD)X-n z6X5z$K8%AVXsoa$n{v}jPrvli)2SmPBXY~w-Pjio=O>?h66Gt1oH7+Cj{%pfNXt^? z%YpadC1??Jfi7GG+u}frUtSjoGLh2-)Est-qFPC%!*!gdw6>K~@8#8h_pF?OU1>Tt z7MY7ScEB6_jFs=1e>A^g$?P4A%!_u+UeYlC@po5_E^6;;YN)GgXzFTTG`jMA8CuxY z-nQiW>zA~(cP)I1aEZ#8hcadhPdGgblWbHzao#i^)lz7NS||bwA0Q!c*CKy?aa> zGF0AMIisno?c!OA@>tWxHp=0B_$_=DMU_AP9Vo$g_%8Cl0mLVsc%=riOObb6B>54MS;p|J2tIsXm716u}0mG zj{W=cYSjTL&Trmdb;xGh8g)SWEPRiu9!PQKK0@{XRQ-=G->Ui_UA5xaAD)c!Ke}|F zVC>_V|4}p9rYnzvSD|^95>X~D!g@HYm((;EK9^M2z3p_GAlyKymV%jR+Tx0q6=E%K zVb~vyLQ|_{%k_xp<*{g8VZYCpmq*hyzA|4~UP&HpVg@@OS8TaxYJxq9&mhQF!1ocX z-3uWifqxDL+S&s0*Ej`nbHnRDWvlnE&Y7#Y+XD11c6{U1d@_I^+e+5&v<8svc~M`o zkil%WxOD09JWx{jH$(AhwKa&N zBDoLYUp4#v&2&7X2M9Lsn^za7dE@uhLt8(D^t4a8!)-_r7m{kz=7sTDOf!3_;f7Y$Vu+3I?`{r)0fFzBnOuiooUtF9Yev1HxZ z!yQHG&816%xeII7Y*DVX*^cEbZ$5L2&F(6ezCcMyfQ~U!Zgz1>Ciz-KyVRgv{!w3Q zmpwD9fqkj9k3IGCnQ^|<&JsW2xKUAWK!0L|d*X!zxTqIeV<;_KG<; zD$mZM`CP@axBn+_adh2v6`@DGYtH_+AF+d@C+lm9dEAC=^Un<9_5vQaO;ip`DtP<~ ztju2|N0%O_jhM5Fq0SQ}aJz)axOAipC?AXf=qmG$K~?CFH8p`;fe5&Yj@H z^lpz#Pp^*V4~uNdJ=F@+t#U4et6R8Sl`bH_9OQ_s)5+wLilLVI^i#k-%;Dh7nW50k zMKc$6hC?$#)6t#avmh8K^A#2H3?o+6mS)kGdej+V)IuJ;pw*<=MxJqux#;9KEi}i) zVj(RSPv&m+e$|C%G5PbnG3wE?*n6Y${zQ&wN65ve?(x&$^%IXuGADLY%X7%)h>ADz zpxVmrc&q^(QyY?=W4XSLO|+gN`pC`L0g#H%6L81#$#4famEd-C5_~Z_B%KsT#ycwoO~D}d4BHYliRtoQ zbv>e|$_=iwI)ij(%ci$MU%0d|%ny~ghd=~czS!UbPEJ%UhaQ~xR`mw9mSF0( zLPrjI5m=sXhYw5a0taj(8^k*LQ0ay}0t5r~I}9#WWT831SF}{Mae}YV`2+f=sZJ1z zxctaTX+6Xv2qtJ*V-k~pM~IaCJFS#jR!GIVHCn%L9V&%Ppo)arMay)O4+w=og@ov6 z#|&aaT}@>L98{G0G`2l2H_M|rdd)~+!ThI7k-$IztxT<&{nyx{i71f#V!W@|?n&rQ zJ>1B$HL*KV6UC$Xa!f^xf-0|K7uC>Z+GoQX{4AO7HZPmsh9!-_Cw^&5`clKI87kZ4 zB!AFV%QG0Sv>Q(5hJ5nELnl5i*Lm``GC(dBQIC#>^Ry($JVNJhFFe8anr| zJ76A16&L~X*a+vf#8Wki=hd;%6B`>FYO3LDiAF(ssIgM|Lv0ug#4$|TXaRN!Tq+nA z!yrg4S&3$k9|R}-AY7piL|}PUzGkABARGlvjrG&&YO5*}h8_1O7f7Eh{hcE#XKy8+N`s>*usegMRb`Zd_5I#>x3KNP!|8Dt)m zKpRSvsi{d}s}1+j_~Bp-vg$|46DGi7RId(Ij{|J_Cje{!_%A00XvXnLA^CN($^gw$ z^?3xts6KD0uIGb{YSjNN*Pml-|DhrN3hg=cUzQ({9}Z}XNncp6zy=@bL#DGl&(CSV zGl@3SwaA!daMN0}U5$8DT`1`)#5#={xM_ooMlDw;Q=+%%6||PJ6d)FM4DEJ1lviK~ zu`eBHHwo(Gda-I;l^pYah z2f(L(xeG0ps1YE-l$0!yjzD=-(-9mou;)j{s|ylHO;mTla-(S}f(B;UeakIf~F1yav zBump$NR~$oUUZKbgv>a1y5v!p1x{1sWaK-_zd}{(goInh_GIX>aJd3EZd%Ma@Xdhnp!+j&vPn+FriQ7+Dh7ZodeQ6a1kkexTilS2ZNUW)Z%DiPE|1GK&s zdZS(_2?DeTupU#7X5PCC&Kk`M?832LHZD3ChV^7@Cb!XttFYPvbtq3MFY^RZ30eXh zUkOY*s+x@w8N^UZTBLLtSEZla)7j9}clPGp@_MDDAS2)7elb?Rw#qYW=bhER$s7t` z?O|csL)+ru9TcArXTZ=z$#Fv|Q(l&fvXj-F19h$h(6Qug7vp@c7oStcslwWP*>n!Wn4s{1hyZzz=QigiF-8HYb}+Xcw>%8q7G2$a~}R<<~AbcFWy= z(yRGk*Z!S5Wx?31`!M@!tXl=ohliILp37AIs zA?d=!My+Y%K2-r%n=l7M@2A}d429ErKip}xl$yvVs@goToQbv%{5FCFY#7{lMs=y} z*|En17iE{_dJA(4ij~8bz72ZO@9SB;d~Q8f4HlE3&<*(Z86%1^m*lKLD?xC7x zb+gKC{(=hoHNKzx(Pkaauv`l16!10S5%sXGqhqLllqs*SkBrz z#|GcIRWHti^2+XmW7h$AhP+F`C$y9Qu7<)4kO@}T^Jqf8Ixvp(kkt*ZDF7*~txZX( zZLe($1yf2>eAVNJ5hiOD(ZNJp-;)`gn6c3uO`GO2*;vxH%`MecojqrE_0BE}^lekB zv$H(8g_T7mrBGwX02*3UTQ@s9Fnz|n)$r%gHILEvpFyb4qi3*c?l( zlC88+s|oyz^3*&EUfLRMacj9g)Ddri8mW$7K}@2Y#qD4!c7VAk15@D#b79(icW?Kd zXD`;+3t}yZ#kiPQ3t}-0eJ5M^h+Bg{CGb7KUFt3t^C7Ag+-HNez~m0tqMeDA!D8+V zssTB!PF{n|rWPz<#x6qHrAZ6jeE9O)KX>t1e|%wO&6^z;b&g$kFs_W)+vz*C(r%+M zi59JapD@GH8B3T|0tOpia3WR^G#gx<+3Y*O#m8As6=E3UPi%)y`x{U`A!;BCm6w(j zdkbL7kcAq@`ITxnAzxe0E<` zL+3qX!%_ZZvDSWLUnq3Da{?jrrv9_$)t*_|c5vH6ad2r6cZM_km?{pSM_Q)U6`Sl) zJ_X~p1(w2bFtWgV344UI0hp>|NrT}zkK6Q(Jq}2de*~G4we{xI-RoCpb`s%<((7#D7fZv7^I#dy*bd@si()(MmN1*?w3>GU zkDS8h+>wa(q@*PFgmIsilqAP}_}0fB$4xDmas#7HWGL3~QE|ZXr@L=Cw&YqcF9}^B zWuNqpy|#1besC}GWp5N)!e^HkD`wlYx+0SUZke6b1Hibzy*x86JE*%lY-Z@*9Ow!T zXucA<0=HIUPD4#q(2wRSiME$(s`j!~z{IiKW?*mHz}_Uq?ko`2vh0fja`v+}U(FdC z2fH@(Sq>}31>>6Rc^}vuZ;7<-Z_M7je09&6i#&N`;%69tvN8Hh7k%OFHPxtjo^+TS zq}^ds>kf_-y&qN*W-_jTn?Z-&th!T{c3KJ%PY0$=qv}taKCPprDW@(6u93@p*y>O1 z+Nl!)K(SJ-wdrWxn2I)=fk`hwpe|KO3W!v{t$bG9vYMeyo!c5(dgmSWU1P5(Ds{p? zE%bBIaaqUUv6rji1K^B?<(t9ltUNIHvb^BGWM>u@!uJBaJ;dR$S1buHEQBd1dBlf5 zVIVa83dOJiT^(#~LjAe%y*Xa;pQqK@F=4H-NjG|@DQUfiZ+%DJaOb$z?2~&Bc8~3+ z_KWdI+2D|9CDWPVRkIt*@?Zi=tJXXLYdp!YvE6pRvgu~ z)wWiJioIINCnhio`@2^Wm8lCc2f-E(ScMYFWSWWfG|9X}(h5EmD4X5eb!JazRdvhe z_HBLN%&x|EZJwOs>|8k8&r7WNn6txExd2SnjOl^w*>$yxLM!HqNT%ECGUw!Ec*g#i zpOukqb>w-o!CJ-PcCF|j+^z@Wf+{(xt6(~+;kMSV?GB3_GdK>6!w%}$HaPIGS;xVt zu8vx_uA{EKxiP0U2U9Agw2kFdxDCT@XrWbhBf2aLgcv?!>j1ThA>=5xm9;P4GPH5- zmim_Mb8juZ+F4%cOR-_ECCD|206O(tb#+PC5+L@_+?D$~39&P?b;LG_M(AYTit1$M zhG!GDt2!C5Q>2ptZj(+17Z`^_)P{99DP>^N8&%6-FFmJl1RVyGr_zj4Bl~2uc9KKv zQ(uaRAm)iQGsHZRW=8X#|M9nysAgdM8!cQlod5(%}Dwj7(}8bi3%OeWF#td zV(}3jFd!PlU&513F==#!i0O2^1-aSSRfYO*LW^nQ&E%RL14y<`uGonIW)jT~C_lsJ z1dj(90&858>vkZWl5U4=h2=KTT2}6$fuY{v`B|zDZLDgyPMm!YtkjBiYx}JzNQEKh@q~e>j6F{)%6fQ#_4*Z=m>N(D0>JWHDwQ87?nNvAPGK_wnvDVzK0gU zWM(AAM{UcTNt8YYST#?o^NGP~GNn%pHmc4CYpPH?vZ{&dd{9T!OCjEs?5)-dC|l9l zFk8b)A0c9DpQyA&%xe@cvGz<;m|_u$kw-D|E{1yb-?Mr1J^jqNXsRFLT8Mkm>a@7) z&Yr%zH!Z#|iS8%b)};G^3^7jkgW5r9tm=LsaP1sdDIrutom?#QWu*wo5Xmb8Az0S} zB`yCmnieRb+%YwfVT>a=@X&XP*uA}~2bzX8N09qyS)Q=d)+%-g!FI65n3I8I1n~#+ zu%zK2pAgvDie{qt3-h7V{RBp}WuA%*QvE>dk2zIiQ|SvOOBKvMv93pNFkK0xycH3# z*1AyRI6E|jkK3pOQXbM8P2IX_>;_fglV;EX0rBGC(I9S|Q2$e}>3^uAR)P&SV<+_w zCTg%ilGQ(nz|mAjb_ULAeS=vWENX%72N2RUnpkk297GzaOQ!Tm4yCt~Ykd;nG?CIL z#xs!4XI=Qr1f7qDiJ%b!a5{IZpROEepq5<5WM`3{O}6#J4b-3W^_iGsxt&VwWhBwN-M3Px8h( zF_Fe6vAHHv_!#Ld>3cSXyAt$0F-!)*Rnc8A;wwz*o|v)+n_y8dcF|giq}2xT zm|D$~y!vB*n_SV80EMaaJW>898>{Cb4Xb({%q^>W9z)A(YM%IdqoJYX!7M7OOLOPR ztBW1qNx!3<7>j5m3ha#0_og6G2$@kb%4VOdL2W{v08`J zw5-+vO6zK!c=(W7C#KX1`lrBQsJ^CD=OhQr-zU}QB!Fd7bq*>C`NniN_;+<3+*JCU zZf2t4lzlsUba(Hy5@%m7$_ZZF!7(pl;R!shdF7xT~olu}nA*uC1vljd~!x$Qq@Y zR2igJU@CQx)|yEzd^8z6+P|Ag1}`pxAeo1LPQtiu<1?{NsE_2%Zr#Y|^mIZ556~{? zgeohkB`cdNu@cN3a%1v&6_2tCb z1L?Y=KBKOvv5`vDIID4HZM8e-4nRLJAx-%Q6h>;w%^v zun)pMDKYz?33Wz&V0k{V&M1bjp%6h%UG?s+aI@aPFvZid5_l+r*=|X)mX=;<5f>d z>h`K`i)6(05?K2k0ry3weySF#QPV2H^_LrfLNpqlYt?1Anu$Wb52Y=pDKp zlfkwLohMGlDuHGcmO*8jRTJFbl2wz|!{RkuCTO^5p(bbyE+&a3E4X8ZsIHc*-PFy( z<2oFq76%4>Y5iy1v>YOf^S?niOrUP#rD&CL<6xv+dO5N^& z?H^f6SS=1{fi;vFzo)uNPkl3eGpPNW8fw7^8rq-gJ7r&rwtv(B2(ElI1E~oSV0X+C zDmPAHHYo}`7B!4A7)ucj82JvOOY_B^@UDh>#b#}VhIcNMV`NDJ_`s2R)U@3NO#=aH zAeD3vup)y=3HK>nbo$iMp@OJme#g8yvwZEow&uoZwG{yakkU>ENJ&hl%1FtkJNhN- zsR@C#A;D~_fK+TQSWRWI{nVr&dm!G33RYFmkqs5uQUPx9I29x>idfddyXIo8gM~I| z1JEG!(@X;FsH{84UI`=|7ac@2I1vqw>nS7)PK7yeHAq{AOjzxwU|4m>t?x`$J!LJ7 ztmIxGc#Q8X5v^jbSWe#P7SC+0(X6bZZ4d7(w61}yhs-9}2a*{qDnxvSHYRm;wzW~E zI+u4YYn$5^Zmf@MZ*n9wRn^Gxx@u~LO{Zg;x?pm*=mcZhDn;_}Qh| zUKPj8vCd6yg%#g-$UY5yXF9qJtil{sl?shXQQ8vMXQm)7s-JAtVomjt-B@2+9SZ&< zeTRTaRdub7Cf0dAeH9J4x)L`C(tc?h>V4^_12+K;q;IAh)hg-qz*jBpTW;4yAsP3uE>E^Tm zTohv(g}iT0w3!O|>T@c}sWIKkU7zY48>6QtW$~%6j^jaJUaZ>KX=P1=2ToYIW4|cY z=3yZxxq3K6CC3_#9q8y-!=+fT1$cacX(>_`+$fWkJC)I3(@xvbaj|qe_GYa#V-*_L zxGTO4Ud*;$3oVTm2AjGSJ67>2Cgybnd@9m>GA)nODK%_)v6z3ou-WWeh23Vy^koBV zl<0@h_?L)saV(tSfiLdNR46Hmye^ZKx6dS=uK~42!^FXX zeRP9nVM`_}rq#y*qEY?E8V88UKLW=GugZd^^2{aX;(|Of649VR+_MoH$tEeO#Tg*k zM&2!Ejjp5P;^Z@uzfFLN2dhspV}iZdXxuSD3xj6WF%nV{EweK#J3-@VqF{$`IGv95 z!r^dk6;6k9C224SJz(|K`Ocy#2$ykzFyevj;+FBcdR66)6A(E@Gi*9 z@{moA25%Zn4DgOJPSJ&PWLX{scupLvWUwZW=va6v>8#>QR4*gVq8&hM#Ex)pK|X2* zD_RAH=QfqjYrQE2h8*NWAKpx`P#GrW*ss-2Te>DxuBeErM+`IV5L#Yp_L>Xxa@=VS z8+R{aA*q6%)0t9~8fLve`5fZdM|yQ9n?4+SN~b#?GM#o}FA(4vmRn;U!;ZB|R6k~L z^ww1Euq|+dzaH}h)~(=ptlW5Mso43%X?CJv*bg z>{p8E)G5&8#riBE?`#3~S~X-=T}c6Iy=j7&cvJHIf^9e;kGT>05dKG7$>iYVO(g_#VQ=3GW)a!=ZCMCJewgCszXe~W9_e?&oH-0U>*=$ZTr(rF9 zhFe`rpHXUDM9;<0m(PFvt=NMgb$a5P_xHKLZ zlXQZOu-1S#9;}N`H_Wm9->r*BeLZH6x-OphW#UDtP2;B0)Rr_Xg-81tr_SQ);-hu& z?iA3UB5wvr?I&3WkJ4Z~=XLNIZgm}ew3jBIBvXq7>)zG+PC5If)_cmO?x_7_vt33U zbkaI^^20EGu50`{cQh2nZusVOtLxl>GTH)n?hiHE(stlUY#z&i@9J2Mb?sGI&bWE3 zWb4|4L9?00^D#WH*$_{{?_AFKWctm3`aL5nT$;3Pr zM&Q^y72!~vZ8I(723Oug>j(bfb?h`$#|CMvV>jTCK7~4oEwc)csg|w-Ad^l(K{9v2 zr|T&E3e$*;-K{ZGOj;lKu_W(AvYR}+!a+Hye+<5(X#=?&eYvB?Oc|$-Ub%Yd(yO;@ z;d95VSsiq^Hrz8fc+Up)eCMw1+jr4{tR(ucP`cpU$tlXiKCJzV?c)RXPnfo0=DOU3 z9S*a2Z%!;7*DZ%bKYHw?W8XgYi(BOd>yB+X_4`|q9MY>pdTUUpd~w!yPyu*KRvm4@ zQ4{upfQJ@EVUv99gN5ku;vw0AZjt(097_7W>w9GG>$aey2S^T7Uk~H*5Z~+ip83ZH0}6MWI=9ESG$-ZTsxm`{t`Z+z`HJ(uViknZ$*KU;GKd|PE;n|1w<}|mrREO%F_TdX} zyGm^n7ht##*C(3|=klR71aNxyK6*s{J6;%gHP^@wpTHgVJ^_bo9>WYOdj4PIs6YTrs z!_g6vKkwKvZ^_`SO?Pykd;gY)i|4OiGjr^R^`T&GFgUHAkYDR74?~&_gv-#`X#~-o zIRo@iiwN4|ly->rm}vug(ovVTC~JQAlV6X0O?mj>sYjKv+YkfNRu$l|j^RMI4$a|) z8ehJPd{>j1oL+aLD|+24DhdiJ8Y=1wf&~HWXHMH8>8Ol(X?FTOTk~mTBV92zG*^2a ztX=RfE5p>Y|7s>asD`rd~89m^=$M zmZW}(28>}IaMNT0Es3FCLYtPyw`ojot53%oG`I4`&(B|Sc+<0J&2Y_3NAsq612Yy} zw940-;cO3t>gz+wQ?b@uJwt8Zu}6Zzx`z5t0F)19_eDOEyJRoiP-cp%a0NZXqUwPd zMF+VfKbEdcm&cvP-YS`*M+IbSIpAAf1}EJIHf&hF9LF^LtlQ2yYa1QiYw-i_lmmf$ za!VrJ7V@&>bX#BXQC_}e@!4BDPi?+6)IDu1vYGG@y+DRh=3KElO0&t682tHQC|0ly zH4qHj^Pw^^ijBS7&CrXQ4kdX@^csvA(Z@E{TWTFArq8tfa$xM`+w#*~@aVNyu2?W< zxj(dZ>*9-YGF`6x0(0lm8I8V zC=^zhsB{|LhqgV}={RbU@V4uF8QEC@Kb2GSc@K9N$;fza^_uX4Gn7G@o|%I6i8hb5 zu4SjR%=^uZK>MP(?ddsLnJ#yR#k{b3%c@EO6Gn6)dr! zoGmt~jC!ef?5iWAgEd3V%|kQS|NJM57M(p4X%}N(x;aR@faLhROps^~!vhk7rUr~r z=UB%;u?j>!yb${RM37t2+es6l_6R~b=vUzx1H|}L=b3Xlmzd8{%2G3mbJMmJym6x` z%llsE^yv#`H>H(jWR#}oKC-DWRmb;bz@0p3C*gU=oeuh&1NvLa^cRH%^vR$^Ef^Mz zYt$EQlaE#R`TqR!k|KPa8wmJ``fBY!y^~x8$b+8&=k??{BR2xEzH=?km$>E;oEkftOO-rVQ}2it?~e zrMoC3l@${v$*FF6i!9rI{h#!^)O2U+kJD1K ztkyJlD(bG%CqsJ`qM6(=+G=bkjmXCOQha-1#)sO=!^{`s5qF%ZcFQ;=_Q%AgYD4?M z(Jq=Q9gQY?ceioyOhT>Z1Qq6-xhUmW4T4$+ZgZ5u@MvYn#21m z^!M`nhW7<{ALj25Cw*Un^gH=`VvjiexbF+`eGk9CD(U-Txn9oU_g5!oRy)r6g)$t|FXPlXDPj=87pU?C;mi+lrT35Q()G{F0zV{U)eop{sk*H zUpBw%==P3v^&P?KMeS?dO>30lagV|rwWQgT(ijR%tF1is7EVQc%dFwzAz}^ByT2c*L+p=uare)`z|Io3f1PBT>|r5gjW7W@PwF{r>7Q=&s;s79M<5=O-~PROP`@kQp*t^MBGveyWr`^|@afK6vf4nn3xS zf!SLQrG3@W?ky|x=DUM6^`XUu3uWz71LvH7PRIKE?8Vj7*VnCGThdupSnRu|t}--j zItT&;ZtNKd4CUV{akmymon(m?#w@y=qlHbP2tuJ6-z>7^Q(D-9UGF~B!dBr?YPGOU z1eI&GuwA&7Uu$6p+#5T!aEd4~ovnpk2>(C}r^r~XgiYw*w6KD;iY;2$ggqJN zYhg2Bb*C1#hywY0Eo>Ejh342OO`BMzgtf3;_>}KxVF$vmYvB|z+f=B9T?k*Gg;SMl zOuyB_X=1kRxE6K`uidSMu>{>dOAVum5Ti$hPkbFmqo{|x)Pc};y!DASqEGaQa}aBk<8p>+BmuV5D!@*FD(ln>Vz3Xz$LULEplmeS^Kj=hyk>?%wU=Z%2H? zeTa5mUoTQziGuVYvlWIapUH)%A}r^O2ThQ*Gz& z?jF3Jyr_nB5(=t)zK$Da1oc##Ay!bau5Wl`0I=c$=ow8>*kmRAH1R^5Ub_M(82*H~ z$q@`l6ORi2&?nRxMv=#KI6avr_Vd3E%@&W`wW1$SjL1C%qz1pdb98j?^l8)f@84h7 zqZOyNU&G9yVT$k>r#}y+8bKaIz+@k;=c6utC@rBL;s0Kga|oSmAKz2QrJ7JjPS&Vu z=hwS>NX*A~!${`_$o>$e{;mb|ZBnJp`X_)NqvRGmQ5>bjKB98FuOQAuf@% z?Rc-(QibL&eA|O>MwrNTA>Ka3+k-Q;gb!a0@pTWby~wQ}twPZ2#$7jZ9M$f2BSb`% z-Vw$P3L=P98hSFS{Z9RzCKCXE`Li-Vm zTGWRSk$LJ{1Z#o><-Lbfj8T(*JX3LN>J}99_Kl1V?eUGCzqhZyyQj~$cX+6GUr%4J zuYYLRK+iRD9-6;zxbHw^jjy+FWMIc2q7i}L(>=HkACKZ)FAW2Uy}Zu1cF4EA&$n-M zU^hkujuRs(@kw)n-6JDIJphehk=;nwhsq6&?(7@h zkMj6>c6JZ$==0$owH_SxjSTgV?(ZJ%^X(rP-8r;x)VH^9c+bEH)8+nQKx zIb9+Z9BexF`pSUaXD0Sn%!aL9E;K*+P)ij;zgGmArUWG@6=l$F`b9tlF*6tf*{y<9 zQ3KD;br_zATWiG1wq{r?wL+e42k$l=T*yqU@0%^=h%f-siGg!I>bFoV5{tzW>^r>_ z*nMh)cy~;t_E~ye=*m z*NUsf9pD!4fv|g(cu9O-+z9=SMSKCKkcY*O#2=(h+$ru8?~C`uNyrcXB7Q1pZ-5;BN<1rmDgG71$UEYC@q&0xJdd`1OS~Po6Hjr%Y1Q-ERcoLi@i#U zWr_63QgMs8P24K}BFkjC_^P-;92Ng8z9?=IH;ex#{W2gP6F-zeSs_CZ{HkQNtdX^{ zPEM2cvOzXN#%`7^vK8C>waX4UUCxj*8)TQgzuaRGn*UB%->*V$F26>~rN!~1v$S=uTpb;}jbEvB zO^qC{v9X@NZ)|96b@UzR+1%q5Zr2`bTXX+PBxqR~Apym%T&# z2Pw72h7K*24o)5SYU&LgT(`!?2Cgfv>V0c#gJowQ1~BW=x{;Ck2J33|vW72db9Sb8HjPk|QzjeE%f2)4p$>9M$@8a`0eBOl?kHy!0EbzWS|N-`E}1SHI)>>Ni?_qqk}q z^jo#Q`kh)|y5stCKre$7iENk)hqO`sz2Fmv*Dq zSG(2f8@=Ov_3sGQ1NwI=yrZ{T8T1d;a%gv2eQ~GOmjZej^!nnNR$mV3`KtBBBfY*9 zjOC@(mp)+}LYHgeJUBpkP(aIrf@&UWi1OfgR4E%h<3;mm*6Kk|)p}6K#(9kPTd61DLUkDJx2wHiwBN>kfUcA>-c#A} zUQHDNwcLonr5^29;nF)ew1>;g0ZNksTA3-RmRSu^${df<=6GuA98}Zih@1n5xXgq5 z_6&0#9H2ZXpyfe9H4imJd2l?+gX5`ra8S*IBXS-TN=3x2d`E=MxqaX6-F@7ZQz1+A z4HBs*L{ID91Gaty!UU5$;sYh-X0RhNc)~Os+rZxt2bqfFc|3gqT#5;N$_EI4D8}$K zf<_+H$Ir$#89XMl7K;yIif#qV%#60Z;% zia(F++dCpY8bwShI?AWkL4re8%S&f+$FJ61g106euF7xI(-eN^U;IGY5zTA(n&YRO0O!YgbhpE=})gF+VmJt8dKHwQHw#Jwv;$(XJaA2c&ts zcK?0t`Umy71&&0isuopmFD*wo2b1L<%hMJuH>+Z;QuDP=w`%EFht+u2gVwvPKhxg6 zXd@FI)WqhtwX5mc7Hdz|*$%2X+HTUWuc|TZVeL9!yTUSvN@OS754vvBuD#lIw{{)X zt{0+pXNp4fkdtD!%oGl26NL<#U*gxDMsK5Eyd?WP_b@SUA9KUjfd1 zD0l)!jy-Zeo*V&Ze+i_8RlwIlc>qto1Wy0+kRDb;A{mnBK z$WJY3=}a71II?l%;K;?1ha(?H0ggf(USN}gn4mg<{$-%2Dn;?&9mOSEKO)>Pn#B19 z&|jiRh>VmKq*8`ZEDq7!KZ5$l;$mu0Uc~pD2Vz^%qVzs`4?03QP>%6&G3$hK(HqK7 zK!3oV8j5cL2~KIunkmxz_Jl&{NV2Hr2DQ4qQdqWAge zUG<2eAYBI}OI2RyUQK-(aUA&9ai1m4#|rMRpDeZnC8wP@4`HnKf(FzewV9v*%h3Bb zKugjKiocgi3i*GfEa&SAS;p7pRB}9DCVhNeiaAueUm&Y6V&|(h(P~wJTvo^+&dZ?} zP{dMMjPnAjCy(`18~UaQPhCib=@p)tRQiLERi1@+dJCx-mxg;Rucha})pI$d<8FEJSZa-6+g$Ni#GCyHmxnK2vs5lV40ZHMONJ-&Yb80Mqt)*rHomWURlU|8La)Jn z`-NmpkL%rl%|d?XVmiGJy454#Uw;P8?--N7sPl6G2X}96Z96}Wkvo6mNoAp)`y633NcXcQ;}L0Vq_z3LF5KJjeSE; zU(vq#5N}_>+yBBhS&_H#=2g7;KzsTIWCcg$1uh9mL)l21^2$Yh^H9b@&hK?m9(hIH zfv-)7p?^!NP{c>=iO4>1kaLTBw2HXS;m?9rzP1Adkw^9E8 z!{2A0D{A$Z$ce}+fMWC)IfbVmewH;IpX;ZcC%4u!sM+76)#5wYLG0Q(|Lv#`V(?FiG$io7<*&v zd%UNA!blifZ7sIvm(C*9FYU~O#W#(Yj@+nOMDXf1HL5+_IH&1 z#bglF(j`9nf5~Y^euqBzpUCUak>BGyNouImr!W>_oO_i@A9-1=!}v3EEzZb$h(pj! z{3+1LW#aEjLnE*BZluwDUq z>99O3(x64XQn;Wuy$afytL4?u%v>X{5l-ktzW}}G7okJTfY$9g;elrMdhBL&gSO74;F|ckCM8@GTEUx-I8>8zu0tuLM?by^vK>(s-c`Vcs21Oo4Ra8Z zV+W`Gs7yi?r4cLgXY{I_*c0NO> z?_!nVLf5X2){1E>J%*s3gP1cX`uYeuTlZf*a{w=Ur`YF=<8UBTAFH{5h z_YK%yy@|gUc1b4?ej9(U_$&TiXjM;&OrD>s#>_&NsDO4Z2dg1+VL4O*O@AI%3gkoY zR}HPCS2SU^p-9wX4iEm8WTmVWLCgfft_$`*)p$qxft6dV_Op57 z7@EcXX=6GT+gLF^NF&0F-9!byw5;3#{c&b2#CrqZNlQupZc~eidFn-$^zp<7Je}#Lhjj`Oyb%2jTlsFyv2*x85+VE{W zp|)~ix^4y6hjcFoVC$8IIUqmapM|-&*_aJjK`qGt6_`EP4qeb7&q^G?%nbegm{ZBZ zY|JzAIkeg7>p%j+5856Cms5qK7QAdd#?3~An{l*3M(Kd0JROv5M&!3*X5@Eb7T|UX zzWF?kOL1I=<8mBV;5dxqN_=+{j+=2D!SN*=x8S%9$CvRvjXmE)5BV|fe~SB`MNUd^ zTQVo|qRhp$68THuDc0TK8MV=akrN2L2Z%oinUC&|<2`Aa9*jJ}F)8#MLNxR6Ah3Y$ zzk+)QLahD47$!Ma3H`@HJWT~PxC^DAoU+g+si4K=Z>t?ScHqf$q%{-Q+i`ys#~nEC z#PMZ3`zemsalC=!Egaw(CFKGgx!5QRkQQ>meKF2Ypv9d?-zk}HZ7=G%m(vz%>Uj28uew^E#Aczh!3Jhg!!N#Y*&~E+@rZi%zLCX z6IR-uw7&{mpN5|EF-GyfMh=4yI3D?~a7J#3jDZVzCGsY?iXY(m-N-NS^dY=I32uf) z{y%_+I2w5ku$}V9{nrhB7RFSh_+sR__)h@SBtQBJ{KW@=U1O5h|I0_lJQL|lT+*q~ z8^(ULZcF8gArqiih{zwgoG-@GFzD8Z16YXi6GxWx7rB_y(0)#690|t2n8?pT$Eg00 zVfg$?zH=i;mD(6gM8YY%jC=K)v?pGYfi8yPV^)$I=DA6gz<8fY(mw2V# zgs-RuYM&!Ib^<->DD@^>Ntz{j2d4tQIrJkA2K7qLgqBqasKs)06Oyqm~ zh#4b+!MV14oQruOyt|(8$kUib3pJJjQDzsaru$P6PWoBkvD)xKgTzP zkw+M^s*L|^wC+?UPy+e^L!z5$WKt)EAZ|KrZ10h zt3AZ9qPpLJ)Da(F6CSLJY>Rvi@t(u;e~UbZl6@|63*Kt-IBKQiE5+vTP*=)Xg*hNd z5T)`^n(90C4kenYg<=;fsrDmEg>O_E{sv0>1m>CIf7bZh*qurPs68h5DHyo}_)C_v z6i5{n=tm*^P2dnJF~XDN<=_<@7M8!#Ad%Do(`m7xjb$-A%V_B=qq$i|%K!vsf~z7KEfW&dVdPFSlmbhJFCcs^)>v3r zo^psA@wc#4%h@_oAA-~^hBUs#f{U$bo>rd1xx8J*v zWllz3LP{Ei9v3?wBhFE@$#_m74Q)hphepa=Di4eoaCLQo2%B@0C zpcPM`HJ$*^`e!u;b3YTON0JjA1b;x8#$*-WPP+`TF`oE^_kq998EY^_IyU4>+zjcR zDF6RL?|ljU-bvz^=*JlGo*GVacHvn(#|-T_r>RGldSK!!aXsLvqrdTZI#K&YKBkYD z>b%Aw!o-Q8o%9{*I@wnYU$sp*2S|QsWpJz7?;q6&gb3dFjpy35gr~Ty;xCJVJH;6P zNoybd#lerIVeOTgV>F%~h}B<(9W03we#Bt|vKmfDUlKP#D{O68W4j3a)MET?%q2+X z5?okwyA)g=t-Ccr??@WRmH1njd$59cI1}+nNA6<2!OnbxgZTz0^9?TM8&a8XNMpVs zo%seg^9>oy2V{W@_!p$}09MkPm=DNiJ|Ktr01xv4R^|h2%m>(*4{$Lb;1-YJZ)0x2 zjg_sBBL&iq=Q1~7V?MyaV}Axl^bE{gc%%oj7^Kx!c>K=9%GW~7hLDCkk4NzoS_KQe za;YS1*m7Bpw|?ozS3w!XlL}dZCsmScVM+6yg7I?!^MGU!H7vc>wnfuFR z?$6E~Un+BOIn2Ak10eo|%)5D+cPnD9&4E-Gz#5Qvw-iIGq;RX0aH|xfO;#cf@o_2K z5-HpU9&Q5@w?RI)ftlOD!flYvZD8d#$Yb8k$-G-Gb7w`|D(TFfIhZ?3;kGH}wsCXY zWN_Q0aI2(ntE6zNQ(KMt;%Fl7dp zX(pFx7MEr==P?I)z!DQ!;1`S0@)fX##!6?vTQRZD6BhZ`peK}|U$HhR+N(ZcfOSx> zV4W4o#bjf^^AR``r8>d%VUiS~XJC2>iIn8+qd1 zDO6`!6vjx&IHAtCn3z{r7$;23t1FBXH0QIBWhWC$t{#?CJuExrvh0+{vXh5pClAX` zX6|{CWv5K;e-`e4R_=c`?tgZcogCZ?^SS>i-2a?R6=BN{dRWYTPT@YMaGxvSK9|CM zE{pq|i~C$Q_qkN=b7|b?(s_nZm2N#O(Yjfd^{}MmVM!^I`=XtDVLtal#n21A+zX4i z7t&1E_W=o-EmXJ{W^pe}K&ExJTMqUQ%ghI`;%8 zOF?cXO0sMA?ii0x&&iozPp%--hijGlq4^7V7z{o!tHDQql@%*Ql7q|=9`ZwSk zVLhd*FwIq1{-RmBT*euz0TUF)1b9iq-)z7H3%9$SThqbq=;U@x;TE)VODWt^7KV8W z!#sr{X<_Ku8E#gF7_EcIhhBkZQ0)vKJ8+(6C&|JVzR!SFB17kRMAHe=yQU9JW3)>Y_F-`2oMZOlTxN#G*j#6B z#(BCqY+h(yW?qBv2J;r2d(FFW-fKS3e4+Ug^I?RqHQ$8uZRTS*-)sH`YA4LVAoKUl zkK+7<`DZvkYkmRe-VD(vp)*5T0wcR?~I^TMRb(M9Ub(3|wb*FXEI*OHw zhpd-FFK~_Z2AprP-f6wZdY|>U^}E)Gt&dxuvOZ&d&iaz|W$SC!6V`XFA6Un1W}6c$ z8FOr2TbV6ntFtxRrrW}{g|=ljK+Lwm28h{uZGf0wLM|`neAEI3%1|cAamPZw}HR3y=VIfOD?Q-m)&E}vlrX__9}b5z12R` z-f3TKUtwQs-)P@v@3-%^58DseFScK5zY2={>+DDDN9}jpzh-~H{%!k1_Q&i`+Ml-n zhy6wSAMCH%-?YDDKWYEip*+04TH}d$o?|ZKx63%3%HdQFlU7;EUve1jhVU*9 zAEL1GEiS_$ezK6?E{wgE>hqQSd?i0O&>h*x&l~wU@B*ow$Ej`MC)@e$b`ApzknbxT zUdQ2e9PZ*U?N9+np&YK{a2khS<6$3I7pM;x_|Zu$ydc<@9#Yx2>z zk#;(BY5|TJpw!?Ch`u7t1kSN1;!@7*0e=2~@hc9O@$>WfT*gnd5+;T*rcxPxOwTc{ zQTPoG)4Y@vk1AIn-y#YtlIvTeWF3#n6G8BP+TB;Zxht-_#R8J_E_&CTV9?vPADWA|78P_{Z zRN4y&4)OwSM-B5$l;a_WkB0eN&Z(Y^|7!db$}uh-&Nr@Ka9&eAp_Jp}P|8|Q;S`Mh zRO^G>?s2_Fc?n-l^#q<865@=1^5VESf5Vfn5Dek(i10IwaX{^laea`>Fx3;vF+L7* zRC^_O8RUYVh`LPq1nDHip^^u`RZp>*QoP&!(V z<`j(dM1MXGG7SF)u44n!uKO8c_cQLr)sACo)SG&NPKy{aI(8AJX>^$5XjFycY@?KQ zs>10X;wQ!tBo1#mj)keNg>xr;q7*++E(fpb(q=kn-EjeA=gr{6FMhFT%g$>*K$yDTF|l-F=>Re%+ds}%Ig zh$|Y?2$h!smBf2+F_4J`WMKj6SJhT_;<^~e3LI;3fJ+tIkm^4!8z2GH9KWY$-Te!? O{zhE?CG~pa%l{vqcO8QO literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc7a7f7 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# GoMatrixBot + +Listens to matrix events and performs many actions: +- Can upload text/images to a [snac2 instance](https://codeberg.org/grunfink/snac2) by reacting +- Quote bot - React with a 📝 to store quotes in a database +- Gifs / Weather / IMDB / Wiki / UrbanDictionary / XKCD searches +- Downloads videos from links and uploads using yt-dlp +- Fetches metar/tafs +- Much more.. But this is constantly evolving proof of concept :) + +This project has evolved and not had much love, but it works for us. I have tried to document as much config/setup as possible but some things may be missing. + +### Setup +As I have build this an run it in an isolated LXC container - Beware, everything is set to run as root. You can change the config as needed. + +1. [Install Go](https://go.dev/doc/install) +2. Clone repository + create directories + create environment file +```shell +git clone git@github.com:idanoo/gomatrixbot.git ~/gomatrixbot +mkdir -p ~/data/output +mkdir -p ~/data/reaction_pics +mkdir -p ~/data/the_greats +echo 'MATRIX_HOST="" +MATRIX_USERNAME="" +MATRIX_PASSWORD="" +MATRIX_ADMIN_ROOM="" + +GIPHY_API_KEY="" +TENOR_API_KEY="" +OPENWEATHERMAP_API_KEY="" + +SNAC_HOST="" +SNAC_ACCESS_TOKEN="" +' > ~/data/environment + +```shell +~/data/output # This is used for temp files/uploads +~/data/reaction_pics # Used with .rb to generate text on images +~/data/the_greats # used with 📷️ to store a legendary image +``` + +### Commands +These may become outdated and may not _all_ work: +```shell + +🤠 react to faceswap iamge +🍌 react to upload to is.probablya.bot +📝 react to quote message +🐫 react to save picture for future quote usage +☝️ react to set room topic +📷️ react to save picture for future lulz + +.r - Returns a random quote (can search quotes) +.rb - Returns a random quote on a random bird pic (with optional search) +.remindme