From 6ed2cc4b732a0be2c9781bab3d5bd26f5c7cbbce Mon Sep 17 00:00:00 2001 From: PC-Admin Date: Wed, 9 Aug 2023 23:02:59 +0800 Subject: [PATCH] initial commit, simple hello world module hooked into user_may_join_room() --- README.md | 51 +++++++++++++++++++++++- hello_world_module.py | 37 +++++++++++++++++ logo/redlight_logo.jpg | Bin 0 -> 63990 bytes style_guide.md | 88 +++++++++++++++++++++++++++++++++++++++++ technical_spec.md | 2 + 5 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 hello_world_module.py create mode 100644 logo/redlight_logo.jpg create mode 100644 style_guide.md create mode 100644 technical_spec.md diff --git a/README.md b/README.md index eb8636c..4cdb1b9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,50 @@ -# rdblock +# redlight -An advanced abuse management tool. It's a Synapse module that allows server owners to safely host rdlist, or use rdlist to prevent users from accessing tagged rooms. \ No newline at end of file +

+ redlight logo +

+ +_"The red light means stop!"_ + +An advanced abuse management tool. It's a Synapse module that allows server owners to either run a "redlight server", or to act as a "redlight client" to prevent their own users from accessing abusive rooms. It's designed to block child sexual abuse material (CSAM) and other abusive content on the Matrix network. + +This software attempts to resolve the complex problem of how to share pointers to rooms containing abusive content in order to block or report activity. These room lists are sensitive and sharing them can not only aid people in blocking this content but also direct bad actors to said content. + +The goal of this tool is to simply block this content as efficiently as possible across many small-medium sized servers. + + +## Features + + Easy, setup for homeserver owners via Synapse Module + Private, hashing is used to prevent redlight clients from sharing room_ids with redlight servers + Decentralised, many people can run redlight servers with their own blocking policies, redlight clients are free to pick a provider + Safe, access restrictions and ratelimiting are used to guard the content of rdlist + + +## How it Works + +... + +For a more detailed description of how it will work please consult the [Technical Specification](./technical_spec.md). + +**Coming soon...** + + +## License + +This project is licensed under the MIT License. + + +## Contributing + +We warmly welcome contributors who are interested in improving Matrix Lantern. Whether you're fixing bugs, improving documentation, or proposing new features, your efforts are greatly appreciated. Please ensure that new contributions follow our [Style Guide](./style_guide.md). + + +## Acknowledgements + +Redlight is a community-driven project aimed at protecting the Matrix network's users from harmful content. Our thanks go out to the Matrix network, Glowers Club, and all our contributors who make this project possible. + + +## Roadmap + +1) Get a basic prototype working. diff --git a/hello_world_module.py b/hello_world_module.py new file mode 100644 index 0000000..9efc316 --- /dev/null +++ b/hello_world_module.py @@ -0,0 +1,37 @@ +import logging +from typing import Union +from synapse.module_api import ModuleApi + +logger = logging.getLogger(__name__) + +class HelloWorldModule: + def __init__(self, config: dict, api: ModuleApi): + self._api = api + + # Log a message to indicate the module's initialization + logger.info("HelloWorldModule initialized.") + + # Register the spam checker callback + api.register_spam_checker_callbacks( + user_may_join_room=self.user_may_join_room + ) + + async def user_may_join_room( + self, user: str, room: str, is_invited: bool + ) -> Union["synapse.module_api.NOT_SPAM", "synapse.module_api.errors.Codes"]: + + # Log the event of a user trying to join a room + logger.info(f"User {user} is attempting to join room {room}. Invitation status: {is_invited}.") + + # Log the desired message + logger.info("Hello World!") + + # Return NOT_SPAM to allow the operation (joining the room) + #return self._api.NOT_SPAM + return self._api.errors.Codes.FORBIDDEN + +def parse_config(config: dict) -> dict: + return config + +def create_module(api: ModuleApi, config: dict) -> HelloWorldModule: + return HelloWorldModule(config, api) \ No newline at end of file diff --git a/logo/redlight_logo.jpg b/logo/redlight_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..573143ff52a19b5408e52533564504aff9eaadf5 GIT binary patch literal 63990 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
RLCdEKIQ!KJ@!>&isBQOyZG726*3njI6?g( z+}^<C{jPBAGzx?eH6P+%wzpBc?qb-t8;T{r%;bUyg{}R+ zh^49|98qlaS@doy4WDBd8EmSC2;q*_X@wHDVo%^Eh>crTjjnO=l<21-I=#KXZXC6h zH{deivG&2Rhw#~_DmY8tsFi|Vag7iJllvq&BV73+iN$)tmN6Qo3G({!xp--e`nmSd zTvZn9Hl{Nf@?~S0sx&&~q3<1A32v;*owD0{1@ zV#r9#Wo~z}UfU^;-X2?5K@OigpG0u;@+VS;VNuj&y?T-%PFgjje$?d*QuI6Yj&~|f zZ*A|$tHZnzsDkydU6n-G&~T7)LMB9x*xz9do)xsN+P#S|lM#;unQwqp(Zxt$as5!y z%9xA;wP?9KB=`t0J%42gRwpc#3)hp=;GlIg8SYY;=wca?@ z+-9Gz-Bx(+pg6r46X~$E^Kl(*NO9>A5Ugg5x;cORX$#~e$QRN((v;0BVpnxj>L?bol}!I-8Paffu>u@>9ReJ%&HF zuj){W12doR^m{U=;ZzW`BC$A8PK=@|0KE;eX$9GAUvo~ZgccQr_1%G>53E+_k*njl z^9eFdcQ|L2bE|$%Xf^kw+QYTwJ9;3Be4rrl%`=vgU~(77w^A{DKof`nBR>9H*qjCE zEE3k|$U^1^yb(E16Q)Q~=?#4;`>DiSlKQJkZ@pao+hrR_ef;51xrvY)0l{1b)K$TA zzr-&#*!E+mRGUufV1Xb+0NtN4sLXf5a&H`J5j_1H8B&VuBjjulsfzD<{A4|Zk-?LN zwl9}Nj=M2A&W6O(C4eFk9{5dyx^#7yCqsS;Q9$ohdPQQiW`j?ZOWCDL_4GlGc8hnk zYlMV9mdzdTibm-Hp^nkWoYIZ90`E=kcXxVlJo3G_5yyX#bvS%MF#MVHmB7PGn_Vybr?% zHUwvWvVrHkGXft$RMark{J?Hc+XFFPxrBj9hU~7UWgm)1vBa_sxf?5{VF}uWdS}h^ zk=~8E<&#V8YfV=qXkunV#}B{wM^4CokT-2k?&dd>rezl;6SC2p_JFccx1pz=!P;Zq zYpKUphnGx2jX&b?f#Zs2pc}yJyHy)9&8BFvUF4^Far=)6r?$8D6Kw}UlA?`(xSaqx zJBGDu}l99-65517s=vhnKYvhVv;!DQHmhvOp z?^`Rc*DY;xTw(D&W_RH1@C3+*Sw7b&?umq}hY^E__LBd1-k#4>ecEZZL}(kTXS&n5 zQJBvJx(L=c1v*!eU3))Gqr{L`x$6{?QSY`3G1#gw-<=Hay^0S+6qizHm;tAoro>qjk2x`)J;QwnLku(`Qzm@yDt0kRsHRvy+lS#>7i$NvZjv>hZ$> z7m(|fbk-b}>}y!~n+f+C|9FPsXkPWJCuY)YZ~$t~OLTrT=c)Z)IC`^C`YbC?+sWf*@-$BIR|?z`YYwQ6LZPP$e3W_ z!heo-L{!Goh4rN8F3BW9Q>BNl>R((Aom=%nUPvYEUd$I6IwVdRN!e$O#b3w?9lz{$ zD+xSNx<&{{R4^siEnU3EwdRl9N!(G^tDpacll~sN^*ndOlCg#1eLuu1ZZ(=V(#vN& z;?&cL*BX~Vjim_$-%pR5Jr2h={@7>+5FZwMX5Epzj6FAEnugu_l)s>{2h1s^b}HDM z^=YiDzz0+>i(4eG4>*X2y0}&`KbrGZQLUfl*WGMswo>dKqHo&KlMxSd@7j)Xx~m8R zq8(f8NS#(bd*gZE;i}K9{h@ir*Q{Lvd zrE5S&h?Fogj>96K%?|N?>Z0vVKoM}3J9KyH-%Wwgr#8}zyJ<<6fIKr28X(`n+VI3< zX8jkAy9etL^ShQF?R2Byqr}8tI1hi&E>Um5)^BuR$2mRfR^mziL>GQLeX-y|aT_t3 zMdMR@l8A8+A`{it0TUV+k2dV3|CKr;qUq zd?4XL_+tii&*_O0YYJAR>v?&1@oGlvA2=2y-L-ZTh!t>ty34a%blC(j*o}Cw0t!$} zFD=Q_s5Et}j!_(%3|=@=!n=Gz8U-p9zyKG41PDLN;JMtw>YeoehKq455lfT_H+Y-(O$>2d)n zPHQKCXgQ|7lsUikCvCUWwO7!@D!3PVmv|$$4bv8~@;dJdZJjQB#>)J9Jsu#5Dn%Ua zmcR4%EkB0OSo{5X?Iy?*v}#2We*yC4khy%a&KsjROO&QHP_bG{myGsQ)tKkfg(Us) zyH4(x@VFdo5et6}8xbqQYQB7yn>JjjpSjh_Fe*M|U)ATuAAfGaPuqE5Y(s9x1q8|Q zleXz~NF1mw_>nPPy}H0Vi}RQ@)^%;%33B@NypoUI)Rv44Z1+UbJ3W`$?_;aypxs%) zd)AIgHS%t9*4osD(~TE#2=uU|LCq< zqrJhjT1-aHOu957QC}a-JFu)5$V3R4=+AE8{2DT;R$|&httKA7|DtuGN}KY{ExUpD zBBux^eRO3$O3F8}+Q|Ju;Eve3^PZD~KBz$E2I%D*XgE_^%0O~_vfPpM!J#| zuHW>~>QVmLmC7{5^?$LD7F1?!TSXXt|KzM_4@i(;e38Ucwrji>Mw)INGDD{S3zvYo zBW@{WIX?DBkV8hj@L*X(?(*sGaIr+aEAh-{?b0IpdfA{h;ma}UchZp-pA`#Sl&PKy>gk!nB7{x=M#11-mr{be2M*FvD@<@YaA~qVbD}vk~ zd9-hOepI)lW?&w@DsgfCd6i@r%Si7*pla=uXg!tK8dIpHo67W=x#5TjIC;kS2J$sS zqMQ$M;tsM}j$Z3g@fv&L8uxK4r=wL*UJK@W3Y0h>_${n)kbhwnQ*+R9p{!|H03pzd zu9waZd!WV#pw$W7#4MY=eP9$tf<=;kHzCT3fb>p4tW0tI%W!&u@%AS4ohtXc$hKf3 ziXo1&k$!d|2nHF~;xB(?g=mC!L|^~oYe~-{zOF3xNVE{ zRezOhL!3|VC3N61k8%E*ropkO?V_$KxP~cghZ_L}SHLB2nX-NslkexAa3k<~WLA}_ zM!Vps&1AUO?;~)_iBZ|MY_|-sS-4StH+%s~dyeWz_M)JGrEI9?7rqNKt9Z73=n8mK ziD%deVm&}!x91O3>p>veNPRB!tGyqPeTjdGNU_x!e${B9SPzT|7dw^yBh#~@&!PPn z&N6z;z=6Op898rvY;DqpG-QRqc>95)01rsk^wpN?#xkK?5ON;exa-;iRI!+T1 z%A=g^>|OF&KA&ULT&ePIq%K3dJh4`0E?$u@d(~1DDJ~Hc^$YfPL&Jro_6B3Cy0jm2 z*98PI4Z@Je5O}JduO=xH?=k*<-SiRbYT8O9=u&(dfuWu}89RdCP^iHEyJKHqW{d3N zY)yaSvHpjP)SC&;pH+crK_J|@df33~E~l6pp2O}L^@6i=avUC*mAF+0slEAM0S1?s zwSS)QWS@aIB4XS1Jk$x7Wj@@SJ3!fvq3QXfgFFA536D!(tC za>cG4>?L8lXn&FC>|IpgbETsb`~)346&|43fj{V=?baMNZyYcgtWhg%^iP4%)}vwv zpZR?W2sE0tiUYUQquO`bVA+=^+JN1eJy*xAO;aJ(S*qsXHnvNNIoUoXSdjU2L&VdK z^7EI1R{XHW@~I!%6QzCp>wtg$*11GCdX_|0kOhm*#W%5A7urKh#itTpRl}g|^9WB$ zyOlrO2da%1tI%cLk`$MTjoveEmnU@E@sg~Jp6;*;yzom2a+b@^`nb}wi<_ie>=5#o zQzuV*GkB(5+ITYJWZ@}}98~+HXKk;cIr0(!->WJ$OTiG``&DJoI7v%5VTknGg0_$ zE&E8O>~d(PX`lp+vA#0i?h@B5=hBka;xb;AAe7>bem;_vLx(WskI3!`7qRYA#1x!J zZu^A(P8p^FfemBkPo`VhL5*T>tM~8K`5!}UR1 z(4xg$kTM=Y#B>W3kN{~~ya;Z|z~`DHfr$&P1ZwY*`{@#Q9ZC15$xtJZQX@61VYy+F z+e3(YM@SjbDB{Bp9)#u+8yLo9dT;ZEXIJmn#+Zl6R4Cg_N^{RtKZtPF-Bd(9s z@vYcQMdj<4dNPg41J>P0EqLAjnL}^k!%inykLk~;JLfTgY1Ki!2QX1$|Gc;GK&DC@ z-En&OHoWKWg6zUsVT}m)BeWpgd#S0UrWFtIp|O&sV?c%x<*@b&ctQ$CxypfY;7EE^ zmgF68LJ`&L?;E$$_a2J?3tbZXPiTbV@6inAGu#+gdtDrR+?ts8D2K3l`&G%-0>jFt z)Ru&WXVW;vhFs2M3r?B(IAVl`YePFYt-eNxn!NpP!U5*#r#u|s9T4j7L4KYmXB{+XQ=#RG;?T8&`bKfI;QH?T%^_)>^|7uS`T^}t zj9aG9`;HdTSE`duiA=@JeI&d_z*})oH#;YV5tcl~1`64x&syu4Xc(+3u~t%E(qtTQ zMse()?36q6gQGXqbvaTCpnW2Rt4cXlIG5}DQHK48GS> zs&LgOzRjnw3I@)pkJ4Fu= z5SHp7h;c5gnm6Ef&KS?E*k1w9RrvcbZzmIKEimigq|@?H>ObFE;`c*=vx4_0EvGc&NO(BQQ3`tp(4W(zUlR z09~Ef`3MLYKJnx)#I{^DuGWFa87Yf%+}H$dR1gku-f%}Ai-#ZeDBUpV%`22(tZ#h~ z)@wbmi%qn=5+@+2Djm&uVPvr@b56}37nflJB2|Qc@t*$+7b*`)3p>ul8O}LeOpEoD>QBxzBzFm^ zb}JHLF4?om+_nCr>Q8frTgcjc`c!x4%u|$7eHkI@$Uh*6C40=`Rk&+Zvkf_lPDQix zy;EHcA`cLNF}Y6qCU}>JW;YE84`|1(&t{4#OaZ5PaeeAO>RwwY4qEAc!h4f}YJ7GG ztkFu%_uM+D?Yvf2+m0SlpCn}4N#0qphn8o{CDNNAZ5=g2pKft07DD|vMh$Ux<<{&9 zS}p}SN(*oEI??p-O* zkWKVHj6P*d$+a4~9xqnJ~xPsJVsJX(RK0rYX^{*!^Wi?qK?Q3ac-P9hREN)OUIyPiX zbq&Xh>0|u70WsVf)9VY`wK%M=0V^g%N3HSKL9{LzX6EC@zyX7mvo%8%zIZdzM*({B zZ7l@=S#_^T-@88uw_c6YiRwRdCvlkJn4h$)%7QCHg(j?4lI~pEaoefpXE7}+^?@ar zIG_BS(E&0$05<>b=*^1r0x*GUO)NR+ zph~rLoJFA(2M^KD?U041srooHZ-E(01-I|V64vmW0z@*z4!*}E=M@Upk zcV-}uao2QZfEAMN6ftb!F}Taxf6mG_{1j#vY;FJah_N1XBz@C%n3rQaQs)UAB0Qti zmZQ!$mN-Jn#FPSexGGd0^NybEB}bSZ*ziS-GAJ4* zQ0svuRTk&X9nGY|K9qlb;##2WDk~pKfML&?(F!JuVSq9S^>5T2X!Se$QEv1`%etJT zJW%A|^CI~euk%@xhMlKx7_Epi?Vgw%Z^wWaUA*vq4%kf7urw*%=1Rbd+5etD`0p8x z*n~PvtjT1}x%F9LG7hP3$-fcIha^^4i?dL1p>!OoxgEIT9hL)m0bc-Ac~?E3duNNz zQb-5?!mZR7->3g+TNTW0DEtfOYx40g+>Q=hR!*|g3@xqjUpSaVgBhXvPbm_G3{<9M zQ1>5EewHaZ&_x4Rt>3gsrwe!*>1Q5$vzN);$+?@TUMx{139`mTkB`lp5?)EZ{KYR~ zTC3Lb@mGp-b84RzH##Xtu+gkB|4{8%ja}GVGHz?K>jmDFl5M#oY8uS-#437UQHQLOzh8~U#Ih@`KS;(qF?nck~7`S>3 zwQd-Hd@*_WV^Bn@l8svPO3cy^t#6p=>o)6QXue=hcM0k-VNV~UZ{g3GNmwk6ATgnQ1D&_g_TQ%mCogcJ@f_jvhOx5fMHg`te zIRrteU8pI)*})U^4HMKZX2RI`sMx>(q_>*Bns7lO(f~QWzi_sh<}>bRtovF}V9EqL zc&-cd#jh?{mK)okrL1@WQ6zv2QR}RCH(T~Q`oPiwI~a=VJ>mo_aaTltexxB|j^(Gu zf78g0T|P=r-W}AG|MGfOLx1eoc6EWAXK2@MBC`4Qx~KnhPv`*{3as~6qsxcw9lH?l zG;nRg;MxchT{pPZ13FNwb@D;QC3qCyJORPW?&D3mMIR0Bj@`1Q)LL9>7gw4#paJXW z7j*`HX%ZF(U&*|nfH0YWErDLPP}{~?z&h#;#dC(l26O%fKb-1wd@`Vz>8-^85d22z zc^vW!Zds)ww8yu0!wxvYy4!9*f6@@MHU}3iDvedRdk1wyYmH+vvQz~t#BSF?%>{?exuzsSvY2UrVH-QL>u0I#Y=n%d1F85@ zJ2jgy)W(`xeSfVW8)8igaEym1t56EsvBw=`{!X4 z6pSCykBJB15XP>b*FtZ43oMbj{$(T6Fe3*AHkSgMr40N|u=HaMi*fT2obGGhXMdK7 zv1v$h+UoqJGZo!>2D2#`s^(%JwGNZDNi)ILLDISz#^?B{e~2GTRhWL4&8nc?rS?xF zV9S=fU&q&8ZZ}3#6l;>vs4vR1^KWMnzP`f>Xz;|E_JOsrzJs!T_`ZiA5p_|Ieodus z$&?$ab z=s(?op?3X5FGqH(m4TylH?YI@aMY>Bz7k813}((w422qX5dI4V?u8_;urHf`hb`Dw zR1$kbTjFoO!elw$yqS8=uA@UlKl>NU#m_v|kR{4_Zn6z)NV7!R{f`JLrTW&?>o2V$ z^92>m|F9-lo@vF>z7Sd6Xd@N8zLY|Q$ea3rS}oi&G=)e%O#Xv1YGC@EN=wjKlu>=V zQ~n9cqKF7b9629lHNp(}JtPA&JgmpM4%?wGH|Z$%C0hD)h0dUge)gF5lu%5I$!017 z1OBOh+JK=_&AS@OmYA(qO&ecjI{*&QP4|L)Af5hI{zw1Y-Rkszp&FUG==#pS+6>T4 zMT%R~e4OlCU5P>ag+gibR9-|d+VdZjjo47io72H+*mjA*qFqN9wGVxZyr+HNzfLt~ zZMi5T{AYM@8=6uS?vbfi5<{hT;sY$p@vU7mKbMZaJQUy^)phRjADBZQXm^Zx!tAlG zLzc}tpy0{)rXW=r+MgE9uN(%SbZHzC4rrHn#Um=dXeKG6K${@)P6ght47Xoz|WzwTWL z1i#wCFLGsoKAd8_{2nzGD=Fmv4~kCf${^k~pF4Gx0a)|w_ug(qeGIAs*u@cZ&&gZA z{12*O-sS$QZQD9IbLae&M+@V?Bh{6~bVyLm`zbfR_iV}kL3#I1Hed$Opdh8KnY(*r zF6d%UMA zjT1lt)yP-3>D0)RhUSA&L}mnNRzdpvMJS+Nk*50PU#M)p6es$U1-|3G(RU(|cLQTT zzPPiMJ;*E4%R#NXHya37fGMzWItEN%{+gixnUy*XHRqm$4|;V5NfU;1jOj5L&@ndy z!DH;{MhNM1Kv2vgI)&Nf($dRuP*$4K_Q(^eN3rQ=d@y>`9TeCAgHp5sL(8OI6>?qh zoH5|fschhA*%{wgKdRCt{i6Dq#s)T`hXsgqWnj{ZGgb+O)RUlW)iFL(RI(y4SnUjU zsYVE1Q_-eD*}lPu{cfc)BcD)QLo%)wKHSotV~id=u?ALDZBV2-OzH*82k$~{bd&*g zm-O>76!T>fd2k@8!TZ1BB zM=-9kO*+)f=`S3MaxHCflC^?In`TXQijhsak!(sEu(?qOyaKhK1Ed=Pz-UYy!XP4a zQEVom<6IzNA6)|!BOOYYZU|Ld0fJ|>+%;{$E9l{#B^<-oLHp}>VL<{$YHHYr3SkBq4%8a_3B&7OsD>3fupV8+$K5I@AJ_=kfPWg62`g=aZPF)z;0YTZqkplW zHYp^4d3|7+2>m6@9h9{h=2XGU9kwtCWgD~HZ~*yGLrE8PD>3FXF?)U=>-C;h2bP_n=^Gmwnb*gILsm&cD;y~YgFpC^J7d8L~tIn{Ooxm~*_w6}5KI^aDK zsQ%^3$6(8?hKxg;6>0eM5GTgkWun}ePo~ILY&vz^6SXf7t-n*Eys;<|IV9h9+M0qm zkGiVngNO)Es~IAtU~K52%^;s;!}Y?0_hs&PLaZPRQvQKHXP>*)N0J&p?w%MvaZ27e zyzkO8Q;Fk({Wc>Q1*cNmdl9V>Bca`#wh6=beP_6rYn-IheIFPJD1b5i#+x z)2w~T=sr?`Uj`0*`2?r^IXLAemPkiP53H$Hwi;fNWSyPRLR-Kek~!AjMOM z8Aw41*a9mNWOc`L)y>xT0Vj`w`{$szDZ(V_R`JZ(NUHqu?NFQ+wrlT3s=QTi9sRDO z^-AhR7MmLc>GObggqPZsn{xjpp7?)GLTVv1oT9d>Z^sB?E5%e2B?4=;|tmPpWlD#dv+{15q z!b_-<-O(GQ0^!VRbrSHFBSd`=$ep;BTpX!*n^WX&2HpFu4WhTwricQ#*HS8}n@boS zg9^(xjF0g0^{rrHG19F8(CG##%VDI3kAQKuTOz`PWg??=4tS=){*hEXvcJ?{0vU9e z>(=;oi<53g#q)`c{M34oG37Tx07)1lcJICNW^qJ=F)7)5o9QErsJ#g4FI$Q7{+=%M z)M)*ew9su1&JkP1%?(oKnVQzIdCt@gCLi1=M^esYZthLl4({a@q;{%dPMT>fPR52m zvMG5P|Uro-aexO_OlEN>9n8QpX z5n^*QnL?i0QNH|nj+Ww)d4xi->86wKcOp_56C;E=`8Sy9#s=uDt+r0GEO2;@`DHSQ zIc55IgPBuNG<-hr>7s}}%h@&fGm69<8B)le$_C_;j-593CGglalGm5T3?3Ddv=XI~ z-$>9-lTkBw`^6mV+#Br%QQ_TH#oHD1skSviLYTn+!ZUG?Qedr66OnRK+I7xdPCAzyH5 zj2Mtbwl8lHG6oCDpi z?|bLY+>iN`nRCv6&faUU^IIxhocVA@dbLv}39FAvEgv@E@ZM{h1`KU{OTJwyEah}R zxlAgY%72xpJAJvQ(K(`Z3MCd!?vHVAPlVgCdaNBC^VoYAj8|B9(6BG9Xn{W}2lJf{ zbUc^I4*bnd_vQ3K<1eM|1A-`9S5wN}^EFA+y0>S8t3m;pANS(IyvS60nu4Cco`@@Q zZ!xBnrz5*vFHPfQaGue4FTYL zx2$1#PN(5e$j(Q*k#Ll?A{;)0$u=jok&dbn<22d*l={m3cf5*s$Oa`?#6A1%=I>mG z8*269ROp!8ZrC64y;~r2WWo!(MNV8p=A(NgK}axA)8^|qvXB8l2NkptTidDB$tCG0W`z#mr`QIz{R~f%r0zLW<^tpf{BFh zx`l0q3#1(Xc0CI|k%X44VQQ_wV7^SHH>3^Dd`xNX%0q|eveR&#vy!m0#p8cq<5n|3 zM%%*EdNOuhb%^lPh(thb;CeAe{5cuZ-JF8toApF`S2@nbpR8d?Z0gR`xP_379sHL- z^2LmR`C$Q?51=7q+Iyghw*-gI9S8SeL@!V`IT!EL9YlAmnWp(tBR>h3rrwZE2Zi;> z(kT+arL^OIr`8g|*BV@(W6`}ePa9Id3UE3MK5SzMSsk-=tm*5 zAzi0Bv>PS}b@;p(C}ZfnH>nk(NT)WO8o#++u}Z2s3)~E0dIi#sqyIqBz84y|i5C~e zv>3XnVAV1mJxI?gcO@j8%Jx=D0UyM@cO-MW&W-y@Qba?e*Kp0SP28FO*a0$i$JDY^ zI(3&-|Au#7P+d|zALvx}G5M9RsBX&lkck${o~*sJMAU^Kv>{9aLBk*=@kW`=5UPOK znva&F2Z~i9e$mC$IcsC;+`s0~lv@q#B1)_kmH65C40O8Z?N=mB?1a?1q9iY;LNqJcdnuN0UD zSx!M$7MQG1YWOZZnF$u#Mt#+~u_Bxn^U|SQW|3eaS1Yo_GjIBh<65%XlkVZZ$vER~ zG$;p{98L#uR`?Q}AnQy-Of91ZXk$|)PFPbi4r5}-=#kU*Rc03?i;qunj*n+hTgafD z)l5E#zsgQ8peQ+!zxt{}BE{8CaxN^&8ByRFM(=K`gJ2&K7j#?J-z)+!F8 z7JDV`tlEL(cJgsoqhqQ45IIJJ8JV_`LO>j>KgB}Y7)QD=98rFUv7o@BmyS)#|v zGEEg7ELNzSbxmQ+Jx|NAzNh03ZV={rm4c+HF9t&n9HcaU-qS;z8r6m@RMsG2Kr?K6 zlf0)Mq!7;NaKu2N7BX}ym_iwX$#tZ<0LKeEha=wtQd8XEQsUlzZffDIH6k8qn5VG0 z!RWPMhJ!-V;u=^Rw@naULtPEb2YN6uDPjmO<&L>}x=hxCC8>=@Wz`1*F?cuJUa{VD zDbT=Zt<2qodf+5QgY~w`+R7D59(Lflmw{ThvLThDCXkTnQ6QPY8_Fd}evS!YE~a0v zBH8oeIQ3x4C``%+oY;yuEU`(ka`7(8vmNt&dCR4&Em?pn)k?=iRjAi1GON})PvA@F zF_~#);lZ4em4wv-c;s-|1jI+p6|wQEkNp;VR}>~4#nNo?TCn*5n&+CiGd_!)`d5^{GnORkr_bGmC| z%<=k9%)_L&(xVLq-5^O%4}JiLGS!dj>=v37_S`-wY-O9~5*Gk+nN@q@_m1sEl%Ivr zp`vcNblqdym}3@v9Z>C}9N{EN@;!SOCLChd;`ej`T2uFc1C@i7mty+FDXdon6g?D7 zT3MR$g=5FN05Q`sv(hO<*2VhA*t8NTMF=bPz#Uvwv^;*EqIj)AbAg>X+QF4}(#A_u zCdAnl6sx!vJj(P+H_cT?G7C>LIQDZf+>y!uhB%LAZwBD3oh9JBmyM#6-`-0{O%ljI zPsnP|(@X}`)nv$VtAVnT(}#wm-zYj3PQYh4yDvmjiou!=UOm7c@mzVVkz}Hsn6Ez zG^=RiK}y^;ZtfQly4>C61(jpWDR;yOCUO5LaV!{T*p{?mYA5f1TD zr#{*#gtmwA-oXXORr1WHTS*9$lw_jc6A4k?J`S-KG=(M>+uDplYO0j7f8Z^BtT|?+ zLm`rHSjq;7fitV>*BiYWbGPgjcQ4X-6Z>1_hH~;;TgQlj?L(K^g#_%I0)eKx$;+&# z>V^7s6?L_b+nn&Dxn?R7^~4vNUJjt@>Na8Fq-=|;z#hWsWKS7wWwwFg z8K&5x5^|2I*;B-+ez%p*4}yhy9slg9dq(o+48Ebke3HS8&kGsn#sM@X6mulR^z2Kl zKIFx>B-N$F9gMkI>^z^&r9u4{Twh?5AB0(P8x@{XbIJ=Y))im7M9GJ+!rms>KIhY- zmm8*_Y|J>($|wb{uMLLj5QQ+dFqx=ROMgK7704#OIdTC!`Zn}m#)Qco^a#NTVoo4kP>n3#%DdVYWVY0$Rkmy|0 z?`Y_n?}`hMEF(h@uc*>@G^hvgU04=JSrhBeo_S{E4R9Y@ZwIi*7 z$2v$*3N4i7i)5dv;fG^g+DV_{8Q@g4&r}s;)v5P`)Qu)1orC8aNqH{K0=Vw^TcGj< zZmZL|;0KcvEf3ADV6B?FBagGy4X0U-s;F=C8N@$QWF#>>7vzfXxVi^Fa_>#DKlq#c z?X%zX6VLTSvcAAM+VHLX^(y&6FSnD9ZwS6h#8Ak7dkp6lZu-sWZexx5$jU+GzsA20?PkzLMAG1Re{ zwRr5u;#L&=*Q-y}!xYwfm_LIoObj8^cyfK-;aT?B>AtGBGB)FyH_Hhd4VV2|f^|*6 zgvO%TcQ1RcXIH?~lBxit{CzF3Lik2Or zdm1aDtSOlWh4uhrg%sVb%HYrS)X5|cNx!zrZl*3897ofvPwi#J% zOPHJp2nHM|ZN-0ku}rVLDs#=!2Z! zRFt1%F^|M6&fldKWuEsHw`?W-_cP*+^i=RUKuz{s&ee+@1SZp4#;Zx2}JsukW{mjjdz6ZuJ%E1O%BWxhA*u9T%&d83_CHKghT0d8_ z0_Fj!Ga_9~AHfYPN0?K?0gllV;2Evv_%?O!7{90a-l>GH+BLPxTby2m^sIBP2R+5= zM_YxPzq_!})wndrm0}Y764R#-!f8&|V%}4Y%+~-#TIQH@=}6#^j*qUt@k0+Wp`^OU zW#s%$rW(YDgL9kMQ-CByWa>Vv(f9^&!2@A>ij?kE4FT$EO1KChd|V@#ujmC!$72L( z*Exo>9*G_W-w}lqTi%X8K^*+Ui6kZqx$YX5zP$0ot>F{%eMh}@xjMh2)g!`D!bDYE zt*vik%K}=bbW7-c7z_eQuYnd@g+GklxW$RlSGa0n6L4i{4YKqr(j@|~Ig0zS#J~aOSLA;`>W~J%^GRk{pT>?=B+5P=8aJZ&&tT;T z@B{J}yYs|9oTy5yQUCJ;cg4~}7u8+I^ZXfd^8#KZBT^K;skxe2hB?*1yXOPY zD~bigN^R$uO)ZV*B|j^gz@KF;Si0Eji!I+@gJw zEAn>sk}H9YkJ4s@vCa#a<|t4_zo72IJ0GA|-q;NP&xaQ8nG#^Z3DqlZ(@UEN(c_jP zDsBBHSXHm{z7(;OA@>y%V${CG>8|D-tWbH&x1DL&lm)$%lleU8u5ebm^y}VRo-cy0 zjuuW#YwvMgvnDCik-)ItPQYip6u9w++rNFLD!daBw7Bi7zfUV(*0j2twMMQztggMi zmy0amTdU^kNfx~lV#y!+&Tb``Vl?#G=o?GZL-HHVxYVzahXctEGuW6EfrwK-ss?L5 zAj2GpQ}VRkxriJ8?l{Yr)8bV0>aO}wBDOl^q~zwV`n>kc^2DM~>>V|{GP4V-xiNN3 z@C$6%Zv~Z|G%}yWnBKuOWD?ld0#={4{^Vf+c z2vw%^-^3(dWMWc1^<2pH#zprqA@065pg_v9o&AsQYY(- z?z#|p*>+d7=AP{3*DE~j_t(ch2fb5(sG+3vW42$3jFo80yNosj%1?BukbG#hn=eW( z1=qe?wD|cyxubN~y)LA{sQYm_zP;k}6jjhnBHeK^i*fyISuD{;L#sUiyT$q-m7`>13p*YttK&q!Ob|#z zBu|=|pZ~+T4qn&$4mb$9Bc9p$4T*eiJwLy2ZDl>D*kET?-bDn9(Utj!LrjO-!%|$k z%1(U47=7WM;L6j2*Sm7``>|JU#af>4{*oh8Q%7JeCo(GXR9HOWM2+m+so@zG zvE+P|5>C^v%ei{@+%|hYXlhOm&7#CyP-ur=^^aFyq4GUek#!&yxIoKjV&DYgc3s7p*myrx<4__OesVhk^DAZS zD3t$yN1@m`=>I();kF#kIX{U5+RS>I93ZedO6LD_HQ zo#T0ca6@6Qi~=lNxapQgx;icAxfnJ)X+w4ULT0Z3abhP!W8Hh;M^pSt=j`YAv0qzv z>oQW}mcf2&6FEsI^Tu1?vP;>c0G*J%d5uBF#kd&;hCB1s*aHcrR3(!`0sogdX|!*d z*?j!Dv{?BmuEE+c010 zpr{LNlYHk_%(gn|IbOnV7E@}inegzZ{VKo-?*P@2W*IW4Qk%dBXG<0 zzPowFvY&LR*Vlm%w9Fs-n841lvAy89;!Mwc+Q?h4E zV=kOmd=)NHF=sg$k=+qn-I$;N$u64|9~`v(T(Z4cl+wA(GH*_r7Wh4aY8=a={#KKe zfDyTogy~2b{q+z3fHTA0o!i94MKjoXR2!dYx69bc`1z5yq3{|gy~JkYmCuRII-=IT z(#HRw?2lp!>L*!yj0@Exx!O^hU)3FbUru{XcWnrUX)+9E;^kh8iqJQUS0rIukB+d* zvKGz=e2eX44z5!z3CYHL{Oxg>Rf`b)Op0p&LB-(6yv@C|>D&&+k~!{}b)b%-j|l9 zk-s1apyxUr&kKJdj3Kr4seL@JTcyEa%g|=9sCAQaSTlQUWAD=c%vi~sbtPkU&vgbd zGZgBA{aB7`OLF0#!qY2HpT)Q((Q3cMRYn-<%F!_yuqLI z-&92A2No*nXNCA}z*uEOiBx&bl!ojrv=nK!R_2vil|vN5oG%R7yrdTvHIwzrep8g5 z91HKg`cicV{lt|%NG-cn9w!8_@LtQivKp7YCTc@|2dFwxr!kZGpNO1vKfqYC8>bRY zlQ089!MtG1q{i>?$-(X~rLP)eY?Ror`^wv+K4N^5Xu(|q&(!5tL>9zw6tx4eLU?Vsn^PJu^tyNJNEkjUX6EexeDwAEqCI zDpZfp07xP(;jkfz;}~lh3K#yKrw@~A^LWQCJ|#Wuf>^;jy%y*&qnWWw`YbIr>|Cjw z_J1;q&ekv`1V#iQ=-&Mg2VT)eK&Ac*1&}H|kbGTL9pd+t6+gCFTaqk;uAb`Ys2iK8 z0Gz>$;aIc_UL@-tfBRemzGVRkapB#ig6!1NwyeAnWa8-@33q(0!+MtRcZQrqlnt^w zd@bQeHOj$m|6GfJn%_;viRWa3iDt!vMs4nd&boL1ZZq>dxL3A+5O=SoWH76+Y*-Js zZtqqSx1{7&=}U55WxB3%QYXkLwZ6V6c+J+NtWRc3{ToZRtjr+p;_%GXr+_ytSUJ;$B!M+T*&H4YK`eY{>Wbqv1u2C`=S2 zrH=OsD&z8`k~Tm}r>QCE3#>Hu9DQkL7V;83w#+h=6DETBj_qk1G8%16F+&qXdp5Z= zq$^5w&_F13tCO@MsUD>Pu0{B zFIeX?lyk>`MfH0iGz)8S^&1HM7F|RMf>Lic*}^Ufb4AT1&`4y4OEar@+@+o zgcO&J^b9x+ms;qS*>TTpN8&=bl~p+Y`-oAUSWfmAeG>T0ls-+5m(mHy#=R37=$=Xx zKjMv?Z}^q%Ls{dNZ?kH-OW9$=93_^G2}&iE=T(0olCTnH`D@?j^UF&}h+ale%EEYn zf_||aTI_F6Ts`b6*xP%q!Tc(rmw5?4Zae>0>Vl-FJGX{mQ4vwILQ zGTvRt%23M+$+%Q3bfjc^ZopwBp)wEj-#kt^F0fT~@P*`a70Tx5?D9iu1(Nk}f)2_i z6itKOPzNH)bgeV-s^ZX}W0+2HgP!iKSwQpyUipY$akzSZG?Q2($MBGSbbC&=jvRe} zPXX`mdIrrI{*Tr@y<>jI;pZOw5cq+htJU7q&i~eE1`wvG;>9JK4 zXPE?7d{TD@xk+ts1JM!9BDmqyc!ECK$%R+u`}>tb1LhD>|R9=ZCu zZi;yDJ-WR;f+RiefD?XD#*@G1*}U09CG=c##fWV98VhNU_aQMXMEhVRgRUNm)3nO0 ze9W<-va`ZonT!;d`ze=s;=~*7r}LcDiF_2VL#XT>xt4%!lgq}V5}`DEU7GzQ(=-cB zLr0%Ncwc#~**PjdRzIo^Xk!9&;BQIE*9kuQ(-Ka3>jG#mdX=bHddm7);w||g=O6}T zn|)6Uw-E_(S-&M= zVztxSCizw;*5udSIk14tdP^Ka`!(BVg!j{o5iTWf5~c>Q$uB3wYPgMcLX+KcX=`c+*`$~J>lYr zIOIU|Y;$d~rqL#qtn6gi&RAwv1d1*vUfTdpK?(Fsu zQ|=j@k<43QUs5polxC?f_1UEKcqg)6F`!pG)(i}xemcTfd7*2D?Lyy?EexE{&MoJu z^?1Ix4^}*y*^zV2GoB@M&BA#auUc74e4~7MQTn>}@>U^z{Xj3djruZ;vv<9{P8rwE zuwu(2Mfty?Y%!nEe>k5ij;&ovv*Vgp@%0}abWpt%B(h}fd>?z^8{?^?ofmO7>B2eE z>$ETul0c)wJ?NhC?unwiW?J1Va2nnhkQF3S#v0oQ94|#4U9%5fDJ$rt8;KYwOf}9n##YDlbo5v_0dnsCtpWw zfw$~Ae70V%`dw<>Ofz2qn3k>;46!18Sf+r#=^l7nx#4&2wBb!r_v$nt0jVQQI1w6& zseP<}=@g=YmxgbL??n@pC=o_T;YnJ!G4=C6MsGyi9;KYvms4?_8fHtTjcN++d>GOR=%$P^u`;0l+cy!q zpFbCUXnV+3)Qq1nz5r!0y z&z|8b2>ad9lg&w_(b-`l`VZ>h$LOJ#<*;ySYF1e*z&y`+%BQg2<%k=8o_v{oP};ZP z`!J7n0X}u~$wTN^OKT}hAV8U$GbPnW{0G29eIphQjdO;P+wP&Xi9wg5}gn?7vj1;7l zokQ?rYq04XGr>lzYhBUr+UqztF7zcdTOjKcevg6Ln0kE`;x(haQZ*IhXfIfM9uO-~ zN9)$nJ0}$oVM3+9?w$gC{MBB|KD?z-L@XpUt`g^jV?4iZfqQhTdfAYu1CQgOxCe|f zq}PX%)1UjCeS`+ZY>~HS_mp#=z@m9d6e!B?LBc%(05f+TcwUe_@%vrW`Z}D1*XFcJ z;+`Y3cDAz?Dfg@d-^||qTEz%@1UNi$SevaGE@uVsht`5 znH^qH!<%I*RT6rp2CPynlZcVJw($5$Rw`{gy;mTt88-lI0|-6kZeBRO+3mIH`07D6 z+{Mb9)FKB2+Yy$ztLbZT-mr+Y6b9Up>CPcpSCqslS zf!e0++{ZLwpmAYgi1L*E>pi!ZZ$4F@511cB<@xV|8Q26Ee$T2L_=<9O0VcD z2psqH-6%_5+f}8!uCTUPv(^o=GuGYl_T{VFzKQJ+YXfVLEMbj&svGH#I1f+wbbDTE z$4;st@!Rk{41vFXsE6`}dr%eOuD_vAOuQplonCKQ%{XkXE32sUB1;Y-IWD`6b^BW< z7Ck(5hFSCWO(9NC1trA|cd=>y=mT)gZ`S|lRJiNde$3y6soLEwUVkH{>dq-1X}BrB zme=~O^liU@IZfIHwH8R;ruB-FZ{kLHr1JsNr#>CwzpUn{H)l2x!e~!cBIWO^PaaC9 z?svaAz;MNUzzRKAG7tC!Zj$MjUyA15mmJRZF!^NfdQ!H+$llsk@EBO|5&6TPl|$p$ zD+^G51o_)2U_U*hYa;X*E6^DUms@f0pAiD=81Lt;!J4s|#(0$_A4P)9)57&hfL`(f zQ9K2G#wiC?N9C_iChCYIETS7tdAHjD!&UteKAC9(`%Q*${Bl z`xkppIFkv8eXX5v=|TGBNpr2lI66v zPFcO-1mzzg>Vm8v`+mnm<=d@B*|)=?5B{;05OR+{iGpmB zx600xYCqV?%Muo_LIy7xHl*)=9o>)rUsfLu*3*r(bd&urxfb1d>={r_6JAK_qS z3>zn-jasO6S~B|6MYKY16tVP~G63e%()8B4@(kuv;m7{n}z~Pe>ltyuOqb$*tCRUb)Ghq2zb?PzOSbpv~_IxeV=9O^Nx~bNat8} zX#R~t*=oB8xcMsae$%I)5t;fC$~R|DCK6HdWQU3fmGQe}8kn=`{}oPLHXWdGB+d)| zDKf!cD(*8&Z0DLB;j%B-UFTAIldmb@H3LWa-{jFld8A1b5pQE)%Y<=e?5(B-EaZMa zY=GhfZyNGPM`=3HvomAM)mMk6eurl5y%Xg|*V)TcCyaH15_M(^-_1I<-RuoT3pqVK zDQ5>!ChGfU5#0Oc@b&y18<4M%1*(OBZ)a!QIQsEMgV@$=d;d#H_$(8bBpQg`D> z!A++~azxhn8)d#o)*$WbQs2B<3P-LkLt9#Cw_{qE$yB^H__Eb?RpZ6+=yL*L4gEMu2=b96lZwPy;_(JTeU;t&m<>U$C`{Kh0mmaeHv%%+b2SK;^=LU zBn8QI^ncv&*YiT%>kAMV9lAu01)T6>uULyz!{wI)kjM}28zNS903T?XA;8QC*OzJ4 z|L>+;wi%~83#kaAhytE_#@p{|hUcPKR$zh~QUuFBA3PBn*ZSZEdso}Cs?G}Cu`3IF z+GhaG4YbNhcX>1m-ZV}+hobz-ujBp4p5iJ_IP#SVmm2ojOg^oSt_&i1F;<-O+(8;B z6ex|`_U@8RWFG2=ii$KQ7YCF;Y&Y!F#OfwkgYL(}CIeUKf_s7TNA-3l7kJe;U}%7{D)lj`|^oIZ5J_LL$Zf7*GD+TN_0?z zMHG@dxDZ_J=SMH{Q36Y3OxBN@awT;yUy%y@tUS_N@)oy!fSsZRVlFB>_<=>CkmQQHpVGdV$a+4OE7x=7_x}g$r#9uIwb_sAF z`8ZL&-BD(@6H)rBhdGW|vUXlgeg`VqS;wiF!> zcM8PM7#Dy$DnZoz06A%6IzslzuNh2aH#jw+zw)b^Pl#MpKJm(JmWzmnYJL$S#oHuS zMkY!vO3jtxv2T~LREU5wF!^%MqpCB(i&x!1XZK!L6i%e=Ls6)foRDHlr zMP%0Agvgb&a`v&EC$19bl9N+knV@4*OEX0H{JMOcXTGW8c_*D-2<3-L~ zMKW#Wm!II#9qND$;bblTAJX=-*sz{A-9l!r)sn)g;i_|z&pgx~*fl<@M!N>6h5f){0e+(OQfKiSx<(0jicyr2jBp=Z*!&Kl9{vCK@E{kr&^gqx>p7 zlecW`u#LcsDRLX@n6@mWZOENHk&h2F`s8aWD)#M!T&NUo>=8R+I{TKT$!)Lg9Eiw6 zB&S!SF|w^Wfw9Lpfu-GR;LUbGDs=THVHWwmmDJ$>gW=ey&H;`k<{h>64s2 zV{&O3^e7_ODC!{<0re~EMR%|oZhg4D0WUnl$@>AaQ(DPv0JR;7przW|p_R=6VAyHU zMkIRFP{oF)HJrzTM=OCFX4=eR?+%SP!BxH?sZPRGL4{7$A06Xza&nj}n?{;}i3+#s z_c|!Ev2t=x5RCzEdoZHBG+h>M%q;R2#*XSbiyp4r4LzqcuT)C@1Xh$`MF-K7qCdiI z^lZqSc18J-foQ4+NYAWw4?l9%V6w5tTaUTb`|pm^j%(m!1hB2@MfZo=vFhK9x~%;O z!5}oK$pg_lDt1<#i0rDQOz>}}QGdURrV1D-a20|EMx1nSQn(>IoW@SiWstspMu^eB z0uB6p)MFmY?VhrhvpVB^)L}Z+wJNz>axC8_$3UU*hx(7Q8^*1@uFosj*537wt{Dor z^q|`r-`a_zm!!q8SUI_UDdHtlJOXdTVk+x&hvL?xhl7o|GJ?E8K(6bTXvH2hsyZn1HOtaZ=E zHSyc`y^iXnH8$vtYjK0kvyIA9ppy0l{KVl}4;nTQ=rbDX20USAanB7aG|rAhKbEU4 zZk=yWF7SP_*Nm$_wmvYubFkitfGOI}1*kxlf z=ZbAE--p*451D40f-0oX`8b0=w zWNyU6f#A|0=S__UhsT2Eksp1zaGMiTpHn|tW?-BJZHheiF38vIjS;sQ73z30Q8r-b z#E+URMXDtCJlbG|Fgby%T*APux#e`m(qZ5#hg^t@56ZQWy9qM4{n!6l{tHhWVSh#p zzcgVeNMOUU%;ZdHjx2%;8WDAr7darw^F=@dV*GUXNQWs*<946*BJPYNIL2awawmXl*1GhK~e{WS5J`P4N<(n+oqq;4gA({G~2`rreMb*&#Er1)TUVi)Kq7qHFA{LPl{rY{Vz<*>YMNy={A%L$aOTMft%bVFy}N)+Y?Ugf^cd zcKy(#%0?%-{0alDV~co|*|DEoX@jm(g_Oz`VM`2`1_uz%^O3$m>}H2aGb^3-dJgSS zIoH5;wzY_HqeYTz27+kli%`MnCAb$cTAa%NKgfm4ORrNf(`F{}>*$K5ZjM00S!PfUCZAudurMv7SDm-p z@>PGgbf_5K_v;Zu1^F5_>=ZNx=Ah_HEzxn5ABIr(@DIFgF5S>cQ@w9hNm7F=l@HsJw*61_HRsA$*!5pb-csZ2iF2H_qv zZOPRz0l}-RIgOJ?+Iy?T{o6B?Tr-Numji3nOmCB`r5So+!g^-g)5lt!?Odt1dxQ*p zBNV}J>t&K(svMfm&(>zoqk693Mh#C4N?Sh#-Nhs7Jo#T$cwtwZQ-G9H%daLb8-73d zqRsbPBHjD4!fY+&YrYd6EdFpaW#G%G zK$QxHDtyQMharW5;HJRG`EoDI)N7a3hwkOO3HExy;MNG?>6Q(u35QGM4sM^pZ&+QI zj(hBeN2TF1kE`26+4AUQSqf;$*gDbl!9lvpv(=oh0Hi>cmXF;YHV)kJ{_DTxNAOI( zh4vkB8Hz=mv|ooj-Cm_~o}#orJH@FDq_VJ5gi_wy!cc~h-(j2Y?lS!8gB?vY`c;~~ zQu*2j{-r*#$SK@JT38DQF`D5AjVw5oyVn4gmxozLrt_LL#(~CrF=c-P!MHn8Z461jB0$vzDk9p(6-c+-K%u>qrZfWeu6yrLe@1`L=&c(ed!CSd=`xSdCvF` zhknF>9Y!X&Co7?}&e1Iw2#cjQv9e*_AqoZ9r}O`omPcsCwK$n*_6!#Pg1qnBlcchk zZ!}Y!9rL7|DC6uAwcW58IHQ^y9y+6!A2fP@bCothv@db;^y)-PdA85`ysfWm-|@fb ztAb{st6EXndo34n>5opAxDh9lSIB2#ophGV)nVhvjJE$a;5N&WjDtYV6=G1U>0{0% z=2i=I^lklk!6md5~t00 z4>e==6Y|v))nJFjD5tTvUt7FqAuQXMt$o+z$FAa3V)rQJK*g>7B+t&XJzqOMUu-}< zqKEaTs|AvcY|f>lr>!C2aE(b+8WoAewJdz!lx`777Dy}x(#-`eA+4wQ>7({>WYS`o zIL(!&KkteQ;c=phB16=3;zf6GGVH>EM6*g`V`(Q6go%Ol5Y|E$CoTT{^jHH?KTsttdMIK#|IWHF2q06`^)QU*xbzneVx-RmAZp_IYD`;ja3*} zUa6evU{|cymHR;zS^e(Bm{U1mstY~t>Nxybh7PV&9(tP)KG1tftg#I3;OLVqzEe}w zncp$49uu&e*zOO6;<;^sUKIUC4>Y2OY<0gX3oJ3rnaacl%kE3M7Si@vLg4(lk90=NjiMYQ@ZsLNZ)6L~ zuCm<;G%PO(DM}OHF<0fjl0>E9XI68(9Ph8nWs_|0wjGFhJ}+piwR*-M&5g2L*1XL@ z>1ZQ!0!^9qXT7FdArL$M>4)9M_8?LGoUzr?xnf6RbCeUd;x8lV3)I5iG><-mK+Vg> zP5*EZvH_uh9&L&5L6Sk`&fm?+9(SCHIId$0h(2MQ9DceOHSqXAIj;kOnM&_!0Q>YT zk?(6l@jO_&@$Bd_`dc%)`UheD1^Bkpg@!gst9`??_jUl>xNp^%nAcWIj`b%k27+tY zg9C{|(NORoDYWJZ-$Kd?r^#sHxBN3Z*Jg8p6Q*zQRB{sa%0!!CbE5R#Hh7BdvcNt! zwk3d{$s!QqRh3!Li?O$=^XU0Z^Rk@EEA9exE%?=Z zn*4RhEh0$UuI;}b@#pOW9aNTR&AjDpLn*2q3j@Rti=WO*IAmhWUC)DK_eW9#Yc{kf z-dUq8sJ0QD)ZL$HvsakShq!0BW)4k#aMu%KX=cOH4b$D1g67vz zzK51sl0g1?mk@ZqdVuCG;Ti7SS%dZ*jR}APgn!&lrq-Yf`PJO}MuF!tSHwUwU%u3zRcjEpcAd zEb&$ANpa>~B zgN@!Lz{D%czB0+%Zha?#I{GtRw67{z+@Spl{W+GE&uE!gd*h;#x+8{7(j0uxLD4U-oUl^;xsmP_c7WwLP zg%sBpgSBS>PSxLBCz(L;eY)PfCwi{O!m|sD`c%g&dWPG%&Ahn7+oC4}o3UW=tUe@m z<$^|2H~HG~{`6%#18xR1IG2UZT3?(={b4ordl+4U>bSwpH_@Ju9c_o@8=LCY4ad1M zCXCfbxE*_z=v*nhDkLw6v5sM+6XG^$$iEV*{&p|`r5hZbjrSc_qFKFpkTy0WMZZHpfoLCe{A2I~B44TTj(_LL=v;A^ zM=U(m24vFZFN0#$kTwX|E#ZUFbh&q`q*Ni`=>^>dw8g4R-%tYLvxZTJDZZ|3XDJ!jFN=E+ZTa~W>R4Q_sXc?LFb+(EZ{9E+skg`^+)j3k)uxdlJwf6!Q6~4N`q|MIpe)=jtlunrn-*GA zPPqo{w*b)eBW_dt^9DJo`lb@uGz|prPf@36U#H@N5G> zy3=(9LxCJL`l5*ruqV5S{wPQg#)`A%!g$vDN_EkIaK8N&14FoO(Ro&iNW4iKgx}Z9 zk@_t%Pc@rcKVZ- zfhCWLfxgB+1{Sm}p0mgp(6%A8$u^$lW0g%NsCaTUc{a0rA|d@@32nfsnm`@7pjXQf z^UHc_Y><>XLym0^HQlR6(EavJa)mGk8|({%b>61Dw<|LmjV7?nWMxI~fQ?h||BDwRl%$)md_6 z0hdz02Z%2Dq*$yP-NcjYxh&Rvs$Awc4u&a#dvGeHM_ljDvc~c0L+&h9c&e%&j;9Ve0yc zJ{JEc9y8(0tW-KBA#gU-L#N=}JBk{EBcb0=1&Z_iK)B)5R5o}bsX}0=-vpqm`kgCZ z5y{(μ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 literal 0 HcmV?d00001 diff --git a/style_guide.md b/style_guide.md new file mode 100644 index 0000000..3d41896 --- /dev/null +++ b/style_guide.md @@ -0,0 +1,88 @@ +# Matrix Lantern Style Guide + +This guide will help you in understanding the coding style being used in this project. Please adhere to these rules when contributing to the project for better readability and understanding of the code. + + +## Indentation + +Use tabs for indentation. The code uses one tab per indentation level. + + +## Functions + +Use lower case words separated by underscores. Function names should be descriptive of their function. + +``` +def my_function(): + pass +``` + + +## Variables + +Similar to function names, variable names should also be lowercase with words separated by underscores. They should be descriptive. + +``` +# good +my_variable = 10 + +# bad +mv = 10 +``` + + +## Commenting + +Inline comments should be used sparingly. The use of comments is to clarify complex sections of code. If your code is straightforward, there's no need for comments. + +``` +# Good +def complex_algorithm(): + # This line does this... + complex_line_of_code_here + +# Bad +def simple_algorithm(): + # This line increments by 1 + counter += 1 +``` + + +## Function Calls + +Function calls and definitions should have no space between the function name and the parentheses. + +``` +# Good +print("Hello, World!") + +# Bad +print ("Hello, World!") +``` + + +## Constants + +Use uppercase with underscores to declare constants. + +``` +# Good +CONSTANT_NAME = 'Hello, World!' + +# Bad +Constant_name = 'Hello, World!' +constantName = 'Hello, World!' +``` + + +## Default Function Arguments + +When using default arguments, there should be no spaces around the equals sign. + +``` +# Good +def my_func(default_arg='default'): + +# Bad +def my_func(default_arg = 'default'): +``` diff --git a/technical_spec.md b/technical_spec.md new file mode 100644 index 0000000..9743d59 --- /dev/null +++ b/technical_spec.md @@ -0,0 +1,2 @@ + +## add later \ No newline at end of file