From 9a9fd9b1e27db502af765a16670e76e57e6b474c Mon Sep 17 00:00:00 2001 From: Jean-Louis Huynen Date: Mon, 15 Jan 2024 15:07:06 +0100 Subject: [PATCH] chg: [changelog] preparing v0.2 --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ img/roles.png | Bin 0 -> 25295 bytes 2 files changed, 41 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 img/roles.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..726ba03 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,41 @@ +# Changelog for Cocktailparty v0.2 ( Stream distribution Beta) + +Welcome to the latest update of Cocktailparty! We're excited to bring you several new features and improvements in this release. Here's what's new in version 0.2: + +### Enhanced Stream Distribution +- **Multiple Redis Instances**: Cocktailparty now supports using several Redis instances, enhancing scalability and performance. +- **Roles and Permissions System**: Administrators can now create roles and assign permissions for greater flexibility in user management. + ![Example of roles for an instance](img/roles.png) +- **Public Sources**: Sources can now be marked as `public`, allowing all users to fetch data without needing to subscribe first. + +### Introducing Sinks +- **Sink Channels**: Introduction of `sinks` – Redis channels where users can push data (more details coming in the next release). + +### User Experience and Interface Improvements +- **Source Previews**: Display a sample of the latest 5 messages from each `source`, allowing users to preview content before subscribing. +- **Connection Indicator**: Addition of a Redis-instance connection indicator to provide real-time connectivity status. +- **Log Formatting**: Improved log formatting for better readability and troubleshooting. +- **IPv6 Support**: Full IPv6 support for modern networking compatibility. + +### Role Management and Security +- **Default Role for New Users**: New users are automatically assigned to the `default` role, which allows access to public `sources` only. +- **Mass Subscription Management**: Admins can now subscribe and unsubscribe users in bulk, simplifying user management. + +### Developer Tools and Features +- **Enhanced Flag and Dashboard Features**: `FunWithFlags` and the Phoenix Dashboard are now active in production. Additionally, Mailbox Preview is enabled in the development environment. + +Thank you for your continued support, and we hope you enjoy these new features in Cocktailparty! Your feedback is invaluable as we strive to improve and expand our service. + +# v0.1 (2023-06-16) + +## Initial poc release + +Cocktailparty inital features: + +- subscribe to pubsub redis topics into "sources" +- allow users to subscribe to "sources" +- broadcast subscribed pubsub topics to users over websocket +- basic CRUD for sources / users +- user authentication, authorization, creation, and self-registration +- user presence indicators on websocket connections +- seperate broker / webserver nodes to avoid downtime on deploy \ No newline at end of file diff --git a/img/roles.png b/img/roles.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb4c24f92a86eeb781851f4e9909ca598aae26e GIT binary patch literal 25295 zcmeFZRa{%$w=PUeTimU9fdT~z6nALR;spv6g0xWFH8`bM@!}qeJCx!CDek1Wy97&c zf+i<@&$j<}_SJWD_QknKM%MbRIp>%oD|3zUJkLzTI}IfQTpC;q3=9J0xANK;7!OA= zFdjH#KSZAyi637>8yx4i25uM_ggt*>50beEX)!RKVJOSLdGD2VxC}JX(eK7Oc5|X+ zV#4ud`SwyPg*kFY3(==#wOk%+n=@+*18J5oS339`TG8v);4*J8G?BcQ@8$N5!?)~f zL)>?B|CnOKzxS6xesXlw7?Xl-fmZ2p$opL$p~wFHXt%ElZ82JZei!(A{Qlp}RgCci z42&;qoE&>bpSKzk*)=UJEotz>`l@12POkk#L>kAkyOm;mD*bOgi@fk~5kcq~P1Sjw zBoNRF3wv_YjD_G-2i{+3=Tk*xp?f+ms4?$nl%iRktGBjZ1_Kvcy%SxAd+w>xgT@)O zdJU>R<;P}HitFPwY3*sU*zkLTc1BKF8Ty2XVFBGn4eSXM+-Rc_&H3BeJG4uERkADs zj(E?k&^<`HpKg`@%Za4)^!Yhm>(6}-54P~p6A3pNSRK4lie7v;@OQ|Mod0I7mQMnE ze~dM`Uf)zMa`v~gbi+s%&=)Y6Pn5=Ui(d5(jD5;h3UK-P#UJ!gRJ}_x5!^_`SoexE zo6i##{Y828?()h8NwfS_m%|;pF#@mTrVp9GdJK*rL12yvZS_3`+aPT z%?(02+%GoZ!Iqq^k`zo)9&C*Zb54)ZlWFy`V@ zc;Qk`9QgPmNoYP#AU;qL9xDR`f4JRsZPy1s!^?Ol3tfArlrKV4+~SXvwe<-q(;ogA z-QH61oa@4UDFaeOL{ob%&oQQnf${pR%Z}s(IT5!Lckpr1oo6evj_o0;nf6k_DPjTq z$%MA^jQqD99~`mF7Y{%jdhr_B9xh0|R$h=F39#!tw8?Mr9rh+)=d8ZJ*gJxHu=&bi zU|7$1F*x;DT0)Ih1ef*Qo#NM~8MOt@erX1f+7{3VAuL%tL#rKkb$cIAvo}^)SHX=}?AN+CSN||3md|<^_o%>Vz-k2K`DS~NRAmfyzW7>Lq)c(mW&+b*akg#zp+Lw5=xSV(}P3-h%x&_ZO+@E9|nzt_h8) zD(3v*JK5)U#lU-hu8PZgweklYvqO~htEnZQaJccZFIJn4$!{j=$_p8gaiFJbVwZu4 z&2N;Fvev_Tn$7va4SW3l@ZXdRb`tsyqJWXDzN)CqMUO10LhVO3+xd23 z;rfc*fnU{mV5IOwyCvUtf8gEWk%VDaEnbeWll_-9%kye3LW|TMUeszt019U5dHbi` zZkld=9$|EKvi16GzYCyW|G?z$8aPU#lcr<6J%y@0Vl(l&ukHttT#Xpr&SHJiZsTnH z{c(F0h0<$@|MsARPNpzRSZ|$i?kiO_4zA7MrcP&2!?{A#7Yx-5ZfTE075e_4SsKZy zK^g*y(Hq%!*;F zz*m7iuL2p!jQkx3;!+824)h&g^?<~HyIvfs*buwZR8zInO|l&ySt-YZk9f!o^7CEn z+@1h3tILLhv;(lGNyQF!%Ych9Z`6)Q={A=1M7cXax)K9A_>03OG|8@J*s+~K&k)q{(Rbj$4axkhipel0mk zkvsSNH^GXSAlclPzO6I;ASIV%ePM38@iyocYhaHR672N-G%JhVJA}AFTgUQQMaz$p zNR|-(Ge_8U>w`#AAN(t?`?BjdX0rIyKz;*RY)G-3gqQ+0Q=KvR5-uq#%610Vi8FUS zD$sWcan?Oy^t?PnTwEX=P&uLmO4xu5Q|o7~l=q76@Bf78g6>x{F~Ju(cPD)zUsLbH z&mUl9a943|&ptL~n0?!|Vj|p3fkN7NnMD0Y-({qaxEFFjso5@9u-6ZIYdu_qxg@-w zmu7r>xbXN%NPVJSax!1S_n%+ZJRdM?d++?&JIy$Hee!v1WraJNf;nR}5+vh3He;{1 z%Q%;zNnO?Jpvkj|f9;#6ne0~Ast!Q(TS|j8ooV?L4BT(|nYbj5b{cHBuS1}R`%`~X zHE2!|uQ?8+bDT`}ZWmF)M;b$=Bbu?ufR%B9BL@Sqne2B6@$gOLe4C(P4&pep?gR6V zmb~V44F&^6M{oc3jAn;TNFh!kAw3 z#>hx=GjvoPrcOs^>;jGJw|^IQMIH(OQrY@U@7P@DF~CJ<6wfg*N@TjTFI3xi=^HEh zxnMX00AwyZhfs+;P3S*}|#b~DSpIHg*vRgB$l#LiE` z(D!sLVgb&!J+;Ud>L(jmA9(SCz4$v})mM7pzUb?~(_Zp8C7qCIqq!RR2Y4HMbL3WZ zSbKO~P_amm`PCL=wx2%c`jerAnEHq5c?YnQKnQ7i#0y#M;+H(7CvK(}>^8KAy~WtY znm3!16kyG4v3B5U=*^u*@c>83L3#ely=_L^cjgMV^?nGm0JSXk>T>PlIO47)(aeG! zY^D(Iw<>B@*tuTZl14VNCB6?zTguS4;ql>eRwy}B$dSYaL@s=DlM%UyG5`w5Vl$b= zf!x}c{jLUP3iJJX$ot9ZmOQa#*l;oa*z=`l%3LAc=UF6N<@%ECDCl|{g@>cAFER^N zJCHutMFe)9h5I;}Kx>o&=Bm?MdAkHxd*8zvKu_TAJ5vzP-tYCUmZFDM=f5YaFO!`m zXKNV8Y`LDba8Xs$h_)YnA$dbdzM2~-Z^hATtIbCozih5OlOxN9ye-Y?cxIfw9@An;-(01FN zdmR8s*OFHkZPQc2c7U#QWohWu?#p#>J5=H%>uu>ae0xgocn`7dJbNnbwwBW9xx;sT zGECKn>UMZ#C$YI)<6B&%X+AV|ccX4}l!LYCMTm~b_66SbJ|-#~VFM?2+SypOBP|z` zO>aC}?M`8n_d$$cB~l@VA(bcrm$$F`1F8pzU^+IucY-bx*|RrKM8CObPkX@sKlMz`*z`Q!0wmW>shR+Kr-cDQ~O zcp@+$b0vqqsjj3hD}iH#CtzG^Bar%KrrSqIA!0Ec8=pgIv$k3}?laHvSwX!Of^H;m zDB?+jGjz7R2w_CGC9;hQtIYWYJ6iQrzxV&}`z{SnXNaRT^jld=lkN7nO4rtsM)lU+ z=lk|$gu)<~DT+Z%!tZPUH&adgD{X_`RIV!}B$=QMxaG~l)&ukH=+mghz_zP_hi|?$ zp}zOKJ#jm5KLn`*%|xV(cO|DAaq#61-WFk8-OYU9T+dvoAiqm7>@&q4V91q6Z zldtAF?aJ>`*qp9;u2(XTE5I*}_?P0@Lgw6emlh5Wdu67V+piH`m}5(YE>{hAWvz*M+j-OvtF3M{%&hJy}yk*4v*YD_*VW8d@0 z4=-IksR+@oK%GVWht+=oh?ap!Y1PwG|cg*g5<<%4HsDD`?sa< zeZtoJZgR|uDgs6?r_-w&S5EHXq2^G^fb$%ZY{MZBF(|P5_VjF(cMqGXY!1bPo5I7u z@ZP}i^E=b~wR#TkqYj}Wa7S%nUD@vCbu_L(MhWfZkTT{K0{wVRZVswyfhu*95yry}JeH7);4Il${nb18w8)Wki8S(4 zhXD{fmqJhTe);V7Mfr-GRS2Cy%KP5WiuVix&C4&aRyjHxTmZFx>W8IV%@%bd(;dTq z_T1QjZq2@DkE^E(7*lE6?}hfa>doTxxV=K&X<&B5x)TDLEpONHM9!vs+CyV%!N8B- z+k#l+c@YOBE8^=ahV6#KI2MGUH_M9cd{%Yr?Q`h$B*m?geQcjFdpPnAnho$nt}zv_NXYbfBk#k*01`6UO=puC z)hcn<*7hSx2*w?{YnQQj#)DdAHo5yr3EoWM?q1!a3f^^D(YvAxNZY88YrG*VU02#M14mW z%zxHQDze^ubGu#1E~{P|m&mF8c%I8>P+-lp(}T=x z>VQpj3=3Te>%195zyF)@`UVLcha24$|9c@#)ZE-GuOE80ytE_^BxDrY7uq!8@&3m*47JCz>gcKb2gvcSkjMW!`gic>|9>PhsH-F` z?u%FDi);^Sezh^+bhS+Y~ z;G2i$@2kDd&IpmMu1+bjEaa;rU44bRV1{bXGu`88En$nDKSk!gLH=zSsa6LRGc`lo zCadUP1?vJ+1+baqb7(s(@<&HX*M$|+l}sOH<(5S{P@K#hbTZ2&i=W*E(c8_~t!6E* zPCw=DX~f&J(}#H2sIHpaM<0XGy+EL=P<)f}SmeG`{B2edku#O_%_Bh4&mBZ?qmZG7 z{lTLD?k?QXOaRd0zp`~zpbOhB^_CLX}8 zI?7=fMo7Orthw@%7k)hYoU}A8!SIETM@RBc9`5`sHxi5KIl(GHi`$*^CEwkI4<|8K_Cn%;w>_|xwe<6Hw{mQ=xC8c^ zSF+7zxhgoogr&`Un?qvukP9zI(CSy^&Ed>wpn_Pd0LSYE`(iN-(-b%96WjDD$Vw}- zh0>_H051fb&U$n*Gv!IDs8mpQ>T22Uv8qt}&})BKLc~#Kla$Y8M^wRMe=KI454tb{ z|9t&p>r@qN&Yx|XBeMvo;I8~pm?V8Ma7jM6*0@5D!pBKqcWo_cej0bzETlYcb;>N0 zzO!GY4nUEQ_|z6lm2!@aH16LAPGW{kixuaI*snk@SL~2s?5d6-Vd$cc>Z_Ip#ql9H zI@-CtoqK=C97u<|eR=5`@nM6Qe4m$#t0G0+#su z?QI*;D*lT@p#ZRn6oBLTDW$RR)rpfa%bJj0U)HFT-DKs z7HL`H(xy*!O$^Dt#%4--$DI0>LIWmIM=D@ur_Yt%Rq9_-{7k0fi~knA7c)smnP_oA z0=C7ao_6Fr=Jy_q?K~>iggY!Vue0fSe z{`9V~YNe85X^FP)l?MFi)$!~a0Y(3yLf-vaBMGj)C$8PRd)?cnV5HlZzMCd6dn)7u z`d((~54xKOPM?e3_3()$jwH>9_-5j?CfcUb{lcljA2HP?`=Ld*FoosLQe^hT@G^&w z^S9B9l((ag1<{#(iT~ujVtRVSxdpnd?2Guf)+K-3LYACxR1RhQYz>w`B~Gz8lHIrR z=NGk?hf+ct?~D#3HG$&5U5Ouox8WjDuC}`A14AmVh~A{01?>{8a)XW2-CLZ|(QBXV z*z&^9OFrm_38eR}STM25zKDCz1!LnO{NP(nNa6gWPp!FpVx=E5w1lDjWH$*-oyy|ESWj0&{riDIQjpy{tnkBN3DOA_ zK~@_at?*xT5|5f^rmuxm0^YQs7de_NbkRX9i_K~yP-41xAR#J?4Z9lp$?+U@=I!Zphh<(a^}1x7ZvqfToK_lu8s+AC8ly{ucGQ|VE1N!A zm%P^{t7hmgi{nLJm5Db0vs`{=^;Qr&5+KvZ%@q*?$thn-R@sKiaO4@Y8LAjN8bdW_3$~ls>+2e5g za*5ZesLY8$B43b)+fXKp&^$s1)rD8fm%KT+Ks_<)xezd!6vQ~^H;QwSfG zHaS;32RRS`;sR4M)=TUu20VuJl`nq##=x*cu9MIzV2fyenQZb5u_tAxl19Ol#rCN; z?~$w*59UtWbU6d`H4R24RmWKc&*!^LmbP9r`Z2d4;Y%Vr_f>~Bf5V9)NzcWsIsnho z{r!t-c#OC^+|wmF-T(E`xAkl~g%B?A&->YusR>TK&#-Y0Gp|5Xyh!3M@0Qo{70fe7oRe!8cm>usssZ+juxnAs2zAa1aYr@zGm% zp%m-?BbCx{%b<;G40F3kjJbO?_)`JLEC^~pF7XuX-ni6#S zG7ReJ`JBAIKkj`|eH6D4xT9F3_jz-<6ml#rjhpdm*3+*gS!O+$$wX4NEKxtuXXJX+ z`#vk}TrLxsHOBegE}~#`SE2fGlnO7}JCPHOnw08en1r2nNlfm}mr^kelP|COlIiX@ z7t7zMu3#r7OO0Fb6pSs0B7M#yMcep@#&SVk+< z`z~kyH3{-X@MEyzWjB9*$HkCqZ9;barzUh(Cu%DwU$R#-t8?vrdSlX9Fm&vUY|mX% zRrqMF#epL>*sAqlR8`^}y5kUT47~)dD;s)bqN_CAPaX?FqX&(>x2+-riNvyt2%m!( zX$`?#FFzHa9ioqZPkIv?>pE#1WkO4DbHER!DEB?;OUat|{;(&qeSfWSr=pwuO>>}o zSi5Cn$;f5*P(+sECgE%x(4ZjUqv6C0)|Zl7Palwh3}Hd2*SIVufpGD`u+e+bk+7ul z^8~02_2i4WgaQGZ6qwH~R_Wa)vnG2vW;X?zaMUr^?wlYo z4t87(Y*uQivdG8}`(r_llZUP>N`3X5mOYl7JQ;6`byK)H>Ll1EuP?4^+j0583oVKmpa2&B{{P^XS;O9NX8U zb{ho7VI5+f<7xoM?`H=cm?4$~{&U~vHlm=Dl@j=ehs=o|ZqD%$Wi1{;;kok6xf;p( z?>cc=8yYAPh$z802=we)vZYil)JQ>rHGashSCg#e$j<7rM&#~MmXzuCDmb;HvZqVz zYWgy=!p??*h^PFWU;H;7-XX5(3A513>BLXr?_?un9hn+E0t=%=WCR4DEA(y^{9?8j z0Y$fU@wqeTq%1f6n-3o%EzU(oKak;+>@vYa#Z3pF(SLD}MY``t$n>`z^EX?2sN@6f(GL zsq!B!4Vh|IhTf~nu2S+c{iLW!z;Xt*oiru0x#p43AOroPyT?M)6~m)y%&%mL-Haq+CO@x$}dk zbHb{_`-Rf}-I}m_EF@yoaj`)v{2b3|JerO9KD#HXP=g-R-bQv;ud|YyG?A>CO<9}z3W z)jOx@CGE*xTBGk7udg@FLx{Vm%M7|hd!pN`Jo!1al1rYt9Rkj6m)gDOukH3cY zTP@R6o_uC$Y@_O#YrPt{zpiBG$$~j{TJ-sWHSP~-bhP6%@^?ZAMkH%39Jci4zozrJ z;yIYuJXZQl&Sazzp>4PRJRgSy`_aNLTukqwJB4)R!q(FXZ7CNLDI@KJFQs;5Cip^6 zoQD^HR7Sc(E8Nh>!B*UdYtJgw=8k(K0!^;KQWX3ux_PZ4-=FH%BqR*7l79-7)z&f@ zB=KHWS5@YIzLZVMs!F#TuDV}~c?i8@R_IP8xv3@@ZwPu*<;|WSyE3AW=BJ|s+@|rF zvN)lhpdv#}ReIP~U6tXmR*GKALbPgX)KppCp)b|b3=9we5#)eh+*q-c?#=>kYAShk zwh-ErsTqI*K`Eb_c|%{n-+;-gd#ATNtNj_x60(V|r~0YSpM)(z9!Q49sJXFhYeXm} zr|OhZcr_4hvG>EIQnkuBc)3Q0z3nHP_rIPWCg9Su{Bp136L_ybD-f<_IkwCecTf^z z%IM$rb#usV(k)3>oVmg6J$Bvn^yp5%P}7jzVChYY9OcUoP0lM_p=XrsZ66gyXw_9t z)w2scN*bm49A~c&Nn?thi&Ve2G8s;|G@-!py)+r(<}Uw}w6&A8E2^C@lvXUnKTI0w z9KG`U=Te)^*A2YK^4Y27e9lSlUi_hgZplpKg-t})x(X^Ht*Zg!)T^DnQqr& zL+VJ?l?`R5a$oinzNr$-r3cilElayxDF&6PRlb~^5#I;}<-W-q_VvtG<{Gz7x}NV% zt|v@`(zC1M>lhbll}>Rc8y51E`!o^M#2R*q6UV12h89l6%8d=M@IQe9g6L( z(k34`hWd2LpLZF+&K21Nfqs~oQ&Hnc_4Mv6MQamq zGryAQUAEt^_@fT${}U5HXXx=xUi~@%^9ELL4I+a51#uzA?oZXdn37)TrNd?-&S}}L zv?+33mENyK!M(1~`+b~pK7rQlj6Z#`Q0)m^&{CVoH-p#=F5{&(Hj_4RL}()x^kIF? z4lq1hs30xJ9=k;E>pXf2o385-^P9+Qv!#B;Bh;@fcODnd*Nl}C=(Yw&ah(06K00qf z^&}dzJ+D*$`%GPGnEjJEew)gB3sA!8A?2!`k&XPLLDW);>TW;qLTKxac5wtO=1y{M z7QHnCMj!2Fk^5OlLY z={#D!-d(Kk{{?bMrPk5S@?@>7dvK&6_m@Yp=A6so7U){=X=)M|Z*KO!33sQJzV8+~ zF)-XD2XzEgm^xqmwkW1KuE26dOCVqCbndA2Z-uB zhJZN?!mg^x45wy$3i<6#BxvG&A#%hP*{@VZJtl~vP{3>W)`tT%!(b-VoMtUn!{P=HTCbUO&qH+r-E z`@%IMxRB{!st;%q$X@h~CF|yHYycBFnOqTCn4~+tqj$wXhK{0zC8OwRhs>xg_uBa^ zP_g*wewK31yX5nWCXQiG6YY%o#fitzhCn`-%bPl^K+MP#@w)T#bNfA8jsj475nmdc z)vNhE1N?qO`Y&5(yIiq$tUn#wGc}*B(~jB?;9M?^992=^T_ZL?yUyvXeZzNDPC4u@ z!~Nv6-fpqTd(Dgx?E_N?aS+h@8-@B@Yn>WQz;eR3DPhiZ)?`u{9N==^wbxUdS=6v) zGbZ1+)XvEGXjw*vG;pJ5y^OU=)hs@P0|>U#%5iTty?MpYZ4Y{<4( zvj{kMzS}QXgN=LnK}~~6Ykf+j@z@WW3}V@HLvE&>IG#qvc1e|m%VN_Rm`Wt_(`Bdm zJh(xV@6}5t$y<%hz7WG@QwZAV~0dWi7$=dTH@l8t%{vci?p0v!FXUMg7| z93KxFXTwngteDhZ>Auq%x{ghk8Ci~gDmWjSRZA8( z@!_paPkdMziDs6gVu7K&iFYAE%k4HaO(KFJJi=RTLZuQ+c2|E_Wes}oC zt;iK2eKdy0DS3EsgJyT<{bAP2)4H48cXz>el5G!f0^BG~xzQY|*H`3R!k-xsygirX z=%}f3Q{w#Y3T$H{*;Q`GR#+)%XgDq(czM=&=2->{8==`Avl3{4z$Rv@9lq!f3s<-L zzLUd_e+0xO*1nly46k#dS`t27*3m=zD2d{+dM8X`dXF6Yj-jOGVN;6cn^qd!AjIq$ zm1`1L;E1U`{p!!QuwdpDgA*51JXr~Rl=ot!_x*x+I;~(CXHd50m)i8Pw~K$N-a9R3 zJAEoHzR~yk?{^=&TA_GYDE+AXKVE!hBw;Fmr@y}%LisoTh^x*{pPMjL83y~;IKVbO z!InN7HUG-`b%}4oRBDN{UY~Ub`!y@kq(U&1#~)vxR+=zfQ$*5;9jHWrzBkk!nKGdj z$bVU3Yc+O_tOYPI&=>+=2BUf+bO;P`*dC5fwEpNYdA_UuN_;C?vB7;0SRYV^fG>BT zKM|Pz%LV*|G}9od+ZK<5S}RDq6^~!(4}%P<^Vz6JZ8&|QS>sorD~!!EKdOvE?>B*M zZ~tU|lrOqocDZ7|xj2x+_I8$a-J3W{d1>GUTpz~&&vBWzqS@BRHHD-hME|9~ueYz! zQTqMfSvp_2$(IF@z=}6`kBLnuMJ%Z57L4?X{~^-(;ky9MYB1z1IF3(x`qAjb(!b55 zsIQ&m!Xmu-`!w!<4#Tq*-RFLHHP|BE0+gBVkIS*YG87UQR6YCpzdPG?UM`5A_FzG% z1_Y4)mu7cue>u@t6n@nde*^mXFMIw!#Dt=pOpLU&Y$|-vF1;pWich00e-XJUYM%V} zJ3oG5B!Uj%zX}8X?;m|heNwDrSp-dWi!qL)da7@nk!W1DiOm#t`ZZcs&{GHTGm~LY z0wZ5`%$ngtaFETRxZtCij~{bx>si_L{OVr{*N%mmO6=x<+#i`$wPA zn#DvH_w6BbYTn)w2QT}Xc2gPTw)`7<^JXMCDt!6;?dpT4R2?;3$F3ivh^Vg*Ut1h)d}|NSfjno%(2TonT=l?1YLuB09z5$rxY0WL-Q@#RT}7T{os;u7Kvd zciy11Q$U^c+(w_@b03JTFF$TAK;ONO9HzY&7MY&Jz5<#BeA^Biqen}b$W86FIwFFE zo;I<~=@@OtG?~sC5jPwNof2pQ;x&>JOg%x{OIbT$6^qAaJj_j7aGg+qf z*j<8ca0=XhSt03`5R1gt_xyBQtyNm6TQRVZuhVmkY^Ov+<{Wb%a_Vr;3>KSxXMp*1|}v zT)j)_;~`vb_BwYWy5of}9~YGf;i3+G$og_#@wiNZf$+9wE7hev0PD10sa@R3nGaYn zqM?#k!;OzAluEFr+S1OxE4dy1W(Vz$^TJZCZ$6Q+iayPV{X?a(80_!6wlBvmLD7pI zcZMk$I(7K;;w`B;Sv!Iv3{C{leRkUGPYIu*NN4T>jvEw*BOLs}MD)wc>UYr#`>vWt zk&@2nZ3aTMwi0G5$ItL0wMro>yW|aedV4a+Ge?M};PgSrhcdo!LEV)*%koWA> z$n&(b%(ELYzP)haBhhT#k{MFv%<(7_Jj!Gfw0BM$*=F3P>x;mdf_JoXqYrf4vRW}d zMRSSW^f&4Ur?ir=arx#A8@&Ie9V}g*DBR*$1}ShLbugh4Iw0k?qx`zm))M^tmQg*#n08IUZw;zBymAY z)YK|4wYd`y<4EXqYNLH={+{L%Zh@gfDegA-Lr+q6yp`=V*Br09m~s$P$vZMfG`O>r z--#m|3z7|GpV;$Cv0v%*Sk$J&f_Tklrh4u|Mi&XeW3Z#H#JYXqJ(+uouKha9%vq-> zgtyaocBYVqql+0@|14|SldB~73_M0+!oLqfzg+~TY!eorn6Vh+(nGAoaEsNR{hV+b zx;@LjN-pCh$@w0hTIgQb+`RE;-YJChoE4hiXdmTyp0#4)S?v?nh2F6PN+tpc{MH{T zI$H8bAjrIRNh9FU-(!UY@)v3SWL37Bc)56SNu+(h=$e!{&Lv={Uvua+SQrc$hGvH#rG7}Z)>SdJ>coN?a$WKuW_?B`@2wLY#J{i_V zRIIcdG_4*=Uuu@W)DN%$sui6boLTus)fZCKB{8cZ<7FDzIBwKTw%8|)mg{W}a=sck zT~?Hn7l}%#A4u4`n2H$M5vS8mn2Fdcd&H!PuWEMMls!&ycfc$XxJ^>GMy5rxXcB&` z8e4w6S~$Eb;yXA>aNRHBa3xVy2zi7mwyeqsb)!f%*XyUmiUIMhB!6a%TlpnEvjJO2 zdOT9Al033ZY3&E-EGj>xkJlbL%be|@ZNU$8`S`$jfGPR{!`)pA202kt)o|vjKbI z>@{_D-wi(i(%lROBSIaeo;(&ae0#Xyd9YR18elv~DhrqsH&p2%wOiG2IOL4P;}Vm_ z&cz<>0B4hruZsD$4|M=}0|61CZpY;?3WM1RP6i{r+$&}hW0NHPvcg_mKskFiVQvU% z=#s4C0aAs^DZtWltW9F)gN5tV{=FK)hDEN@JLH|L07*X2hz{))sj5Wi&r(6h`&aW& z$j-tOti?0=O4+;7iLvKYztGxx{V}6lxmzMa*Ix;PFe7_zG{uozYE^x*c(FgP!W7@Q zyU-mMc;NFyCtnD(G9cUB)@H<^I`3gi*Yt@(UIp8}fno-}u4MFmZ3NL<^u zt5&anVwiEYi~G4QWqd}KSes)Q{ku#16O-25KyR1?P6P$=9xJpNFi1YbL&$GZi5Vto zo+aq!L9k{Bq)O`PTQRg{)2qXFf|l`eYRlyJ+mesz7P1wbE+A;1u6?xG`{Vh#VgFehPn8QVK-qPIdsu^{&7Y3jB85<+!3>^rh>=Sz$1cpQkcv9YG z8lSF9_-ufO{0^10*DjaIuLZ8xnW{ZE+Vo1;3fTJDAlKlU!?oufizRhBapUF$w?ubG znad3hzJz;JD|yuF@;4F@RI1tHPv#~<{#1Si0G_k4TXygd6snb)QJ6%AKlonWTwqlA zDM@6e-FJV*JjGGBwD2y+J|-jP?gxGq=cbzbNV?rMjg;nF-CAi#OKlkGEm4jkWh483 zrujoOeM#bfzx9s@W`D)txr&(s$5hGmOBXgE(Qr;!xpuj`wg^`zi>fW{t1XVqC6Zg|4eHDWa`Fq&EsOAjCgDRUhGov8Fr;NJFfrpUebZ+IJ%$>_F#mOs}?UPh_(=~;h2 zTGJ%(zBUXmg4*90_E|fRQ;TnFMg4V1!c;?u)vW(bUeH(^q(#VZb5POIm-kzZ_euQi z89>uWbaDCXaP+lj_RYLdQ2|4?;wTPnnz!Zf!a(J(#{$M%lnbpBxUmB-WSb&M3un5N z70H;1vFj`-o}4CKNAV}BcyAXL`fM=!G!@J|(3xdxeQJxpmQsJj(^Qt!1{lM80x_KH zeDfjw=Xw+ws`VJ?%lSE}Oy1k+8DE(hD{G?ai!R*Ig1puQmeZEZ6g11wB*ChZBKn6Y zb;=5B4sxv!8OFUb;n?m>h+)$@r6Mf?wM>xM+RasmF^D$+<&HLAYP_oQ?&R z^el#Eobr3TvHV1>gx!zUki-h?65u!IV0xhiYCDQU*`zU?yv6Uij_nx-G-DTidGg=u znCNAsp3N1xO+Vh7XQdEV{JdvvZdp=QWkr}jk_A?0nAM`~kiPMG+@B0Bg1#tsm$!$O z5L=g*XO70%IVaC1=v;7zzx?pidA&6h56bQ5+ZpXBoRPGZDXx6*&dJ|wsp@Q=l}26J z(WG>&HH8({#z}g4*p>t^)XU`<9OW2yDNwX~rD^y1KeSc8laG3-aKDN3>YJ~<$bI*N zcWf}QK!M=@qp4aDDhZam?4-xBVa-UW3n`H^h^7CE-hLv{VBHD!-#CtWsGDwRP*v&C zgC`{yET4)v6i?L48-HuRF|_}#aQpcnbwy2w+EaD?!WuA z4YUqdI{K$zm^Ki#S`i(Cam_~3g7$*V>BD44jSQeAIS<>Nnr}UwQ`KR*(Qq#B8}v(xJOIrkBz|i zxXMurb%LN@$9^6+BRuVL?D%oZXwU%y;1tX4x|oj8@oia_IbMH1d+9VEsA@clLq66X zj8=J+-oWEt2q2J~Ez1TBWScVOayu*P{ch9ZD)xJ%qA$BNtw)~lGgX}qH3M23Sh};e zEfJ}Mrh9Xz=bZ(1_xE4J)ytP^1ss?8lR>2F!V_>vf7;zZPlnszb9&G zQ_5OiE=PSz0J$IH*PmHd0|gdNl0O-{<~P2S(C$4B+2IEhqO)@5)#KRWhCX}M(<}y> zsd^9FrLb<3C@imI^wKd|z_{81)pnuiP8Gj$kJ`0XJuCTdFj(G zSlRPHMX-a_-dbn=eWo@!ROgBWYt4=PyA~iH!E1Wi7)$z%RnMd{lsq?^!CeOx?mv41 zFRaK2)wyesE7t8%fZc7X62v#x(@R!%bfBqO*F$N0XRUM4YQQ(aZxN@pxwqHFi<=#SSIW*RuEUyi`5Yb&3Bq*820IV zAo1^TIMG3->_7VoWU)WFHH=`}9jtHc?{4kv>@iL_T%8lm_E_1(=y)M-Y63dfF;lZ` zf7denvt?iXak0+!Hb=PuC|#cUPbzd(6zn^#wCNLfy>8S@0x$YZy<>VuQ3^dfat)Kd zj@x7L@x;G$0XnTyOqef)2No{f8|EYDB$&ox;ce|;+h_8PKu~I8)Z$Mev6oEfG}oyZ zfqUv=x4y}^V0Dut0ypLQbjD)!q~3o1mqT1l&Y{NSD!_I?=5q2d2-a%Ya_dPWd4vcd zO+llqB1q)No9|VyRzMTj`!V9`_-${;!rwn1D3brPKC>}mu@S-jwWhSX7B zAtASvloX)F5Vy3r+6KR`$&q>YZZN(;mE%?#ZuUknf=iEmci$+Pdt{(u%i0@41U#Jg zJ?si4*gS*>W@bbAE#yvn@q8(CyWBqI?GBufe$81Nj~6VYu~-0)t?U)}uG%00DNPK~()9!JsD(DstJX3Mc; zOWQu{#(Q7nWZ}UTP(R1N)!~KgBT!JK1^K#)s*1tRP3W*LojxVXB&|Fuf7Y)2=qYw$ z;>G7Zzg%KqIvQh)inKs)kIl7F$;t3jfYdx57rS3VHQ%*fm6HGK9GDa!`l1Yb`W>(Kr=#-k;LlKjZIp`nynu@a}j&v5;8y zLkbIB_fNW9i_UI#phpWzpgG|OL>6QI^`fUm?($A-RDfzW)UGeL)R4jm3lc zz?V}}zS;=n$g^Q-JM~RI#j!PfA55jWg#25Gu3OzwZ8A&T%>4ZE+c#sqTMya(T*iA) z$0RsPTqa)RQ_&et1WuS5gcBMGw%Qu|HcM6uOUsu1$V)n-7YIxPQ}bE>!V|M%XDAhv ztwgUJ8G;S`>@JI`c>1ft?<`@8vB%ITd1U34i~f5~t+|3wsl&(erWwY}?hVDwe$sKo z8kvc@zlotOmYOQ&Oobd>MXOB?&ybSAK~rK7nm9iGDCAVQv8?Pv3CNX1Dn(Nq-K>I| z7f8zVg8X~gCZh)dKI|9;TlRiUX0?KKY{kaJ^!)jHyHm3~@jLm_$eBbRKzY@S&#a-t zMWs|7+z||3uB@7vv7Pk<*by05bCzI#)7NeNjd=ucY#vnjLML#B3=;XFNA~dQ{_b(& z;8r>mF(S}0ayIfgpzLz&>f6asAc}mRj}yL~Tg|;-(4#F0Pb>^Nml z3P=h{GXLq&ss3NJon=&8&AP|iw*o~9lmaajZGqxYpjaR+THM{CxDy~ifV4%51lJ(+uLwZ zBo>y)1@-q!jY=v29WKhHPx66QYV0^YEO z+}ZZe5J5#14LZ!J( zSp=b|<>auTgSIf(v8Fy$xwxp(`DxgG*#xoZ!^Q>KWIoQ0X`Rm-H0en~ki+X-R>MnA zK8_$|<#Zy!zy!hkX=EkxOvt)wHW!>6-Pg$htg_EA)xCZxj(Mv&Uk~K_z0XG=21X<> zV=1E;+*ta@52?{n?nDT$u<&c{BTL!1++wY&tyv_{(0)^;h0?NX_esVRhBGgZfWbgs z4+;8O?2VH_LB9PDaXB zR`si^SUK6dJ}aV2{0f=FFbY1awZ8E`y##} zIVro|uYC@{@7&Z0r&oMtecS*2^au;B1z#!Gc4~fj(io@7;kai1n`c4U{eOjva@#8s z%5&19UKY3cO7VtmFpQ6lv1(U%4J0T>MiRxb+zqV@unRQ z@1?P|oxn7f7xo!F+_jD$#YAu#^+t6hlG};d@w5a=Cw(!WgVQ8p>~6SOOAlTZl3nEa zpsd+i1Endx{^J*!xTfVbiSN2SiDOC+QlU-Bt2MDKn&FgJb&{FoF6n97|G1es{($zV zr_>@NbLq2=YSbcLS!=T6GCX4~4IX>l-2?#8dQo=BgTa6HMF5thr3E6cb@D!3xQ8Pt zrvv0!J$*R*aMZJD(dH3n<;ci8O-(Y{c#M7?PIQQwBJXjM0sbTa-Wz!2fuYU!5^(=n ziu&8FhrQ=-b0WQnKZyNHEe#TLxCi1=|v zD#kP^XNDA0(BjK!|3~}(|J3&XqPI)_t(zo|JhFL{v-^j`oKD6&CB`vHHYP<({Txze zKi$sSk3a0(lf&_loNXZwg=P2udZv{b>AilYVODbMWhL{mlB9DTeQSIaIbv~p&;6MK z#Jr!Nc`Z*sG~s%&`R-Qf7I)ZMmrA$hDoIhpERJ_HF14w?hB^n!1j|UrOO|Y@vqb}K zc;VXj8UsN5hOC+Pt>Qk{)z|9&`A; zKXi&rXxtjQyFT+R0WDCWZsjP_-Yh6{NkZz$Si$D9?=+z0@j#UC5AS4yGJPmlS?mv% zc*8*VyTPWgvlZFtN8+wOPhwQ$ixz|Haos=CA}xs!H?pIP;qRUOYO7ZJpWAmN6MY4U z9!OLxf=!Gn@HXf?p0jO0>YAoi7XZsfA5-9uo*FZ=yqW%jRS)yrwn*X!>2*S20 z?6<)rvTKI{i5onV1Pr@^9>r??AUqh<^|K+6A~?Tq8jjdjOCK?!$ED)5u`Uv(O}^~d zB2XY~JMuC^U*9S^;b%Q6qsRJbv6;!(#Le(YoJceS4cbfN zM-4dSaOj#M?^Dd#nSqv+$vCXeyDm*F6Dgcguxchj+>a(QHT$fYB29NXreFL1h_;El zMGI^=9DScdRj;g$ zjCVgt;Rk=QD9oG9?aW8Q`MX12@qKD!TI=Zi*cAEx4+yE7)!yvA8roojO@yU%54?Oy zJHe-u!NMO^ceEcXO2T*+{*tQ%ng?4So1`ki55JURx$t3V*GN7;sBh#O7gRt!AF=4D z5n0G!jM0EzO$`k~*hy`)Y_9e-H^RaY*)KZBVOg-%NoH5k?lh_gQUrK$qkgp&yADa` z(YF9Vgw!YRp~Pm&Lw5_b5tzYYF~F`HryrxbL-U}0Co}xUEk@n4Efx#L4%TRW&E>0y!ze6&0W;g zVT=l3rJ(5o;PqJa|BE-$^ZOZfEa5h7R?U`gp@so05m=uKqqA)-At_|Jy7PACZ@!$H zz`x>n&VrC+3BOfcr2K6V53#)(dQBE=%}=or&(I{m6LH5wNmDXf<%${Fg9`g}?o{K9 z_WcMlJL$3b?keoVH>6%)mrzf6DgbP6Gu|>~s#W5*-;3c{AM_U!+Q*hS(&_!!9cS36 zM!OAo|KYfY1W!TRQEZvZc4$s1-2ho>Dtmg1SWBKQ`w{ZZz4ppyq0Fp#GWnq*yhiLA zbtfBvy9GM4JvZxbT?+sH7&H6F-ySWJ|5hLl?#?~tb1R;WBLg@MX*t})qN;k6QUHr+ zGw802&`U2MJf_qpq2_MRiP ze7ug3+7-qQ&ClqJkE-_oZCyhbZzdwg-r}!VG`}z?gt8uEIy%uk0EY zt?F0U7<1Sjb{IIB6M9BQG42_ez+<2SvcC$i=XHu+gs)`v%^;Sc(k0aLPYVJ2j&?lC zy=TJ}5ysqNZ&aGrRb~?9g$TY6QT;xwX>;b?0PnutcfXmR{z!+3pT#NpF$wP<ad)ZRO`v1gGpGbmyIyz||+!74@B(sV%n!gZCtG;(wSKNhs*$s$yj z|M=+HRf4|dRl@ay@b^X~(-`spG-yuf#_WC9Nc%SQhHV_^t}oaBRduQJ;cr8#R8qqhAknvQZ^iMT!K(x2z@UAzC90v!uQ&lS1yO1`|? z6#8H}N+^bF!h(bkfquV7(JSUpvDX;t8O?|GcjD1M$2sncddJ2>C?qhwu=_6-Vk1D} ztYgO(*^@|hxg4~+V@qHC^z^-+v4UGIcriWFzS?AC|D4JoxKNXXl@?JPos^>W#tnOO zxK~?O+n}FF6kEd5r`<=T!;xj%MStqct+9fMZg^gNeIITq%6bnUqxVmbD9L}DKQT;K z8-0`6`!xNbN$r5fI%>Aig0ML)?R*F(pb;63VDR1K_LhS^2q%;=V*9MNM$i1(&~}5B z3=!AoEhsmVmh}1z*WJcc}I1K`d)TZB0)HUAfI?xdcQ(!-_Pqt%oRWb4f)_K^%4# z`{}b_P6+|+Z1{~-_oYD3t7{Xfvm@rgAtuiq^CH__RJBQMrrhTSS2|saI8L64Ndso^ zzDw+3qAe%t$!=DtP04+}X?-OVDKe~}s!wR*$WdMdP<~2beRSZ}Yf2h~F?Ply zCu{Z4gVWm%e=PFbHGX3k%5DNmPCHc7Sj;$d7CmhDi{**FzK%u2+w!RZ%W?9sDPYOo z`WSQQ^7;hStFCz2Fs$;dU@frejgas~%Nm`380kJ<5yfO)>B`oawf=ml;jL?2-I2nI zwr)3(bbE75!`1nLYyQ=wkIx5kaz0z}(hpXnkJ9Wq=)|hvf6M)mLg3Ky?R9pWJhhp| zy&B+4?o+RN+jv#?=4IbiubE##J&r6_wpEZbY{o>wIx#h=*`4H_3mZM_rcX|pgp;I=&68fr>Z4!iKb*^*Eua_c|AMZY^D_oY9 z|5%Kw5_k6lF@DXo>yNFYe5RKI{;^fbzk-cFFDT03QP|DNW-2)y($ou?MgVFvDKR!? z&L}JMjx=6jPjWB=oBOjrlnj9^*l`mrT|;I_qZtU)0f9$`x4&*%0mWkQc%yktL+*$ z0Z!`(h12Up-@>K_=|9Ro(AimZMck){QTC-AFDOQiJN4oEN_RmYz14r7mdx&hqHb3B z{z_uHPkScvqax^)&;l1|eulbuF>$vhU9nym7c~`J ztE-L^S2J=J50J;=pUM=@4&b2cKz_5#9f~xdmx}UfHYg~{S5_yT)8O)R>|05q-|~FG z<^+lxzVxJ&nx3BBJVYAiDKW7GqwzQqe*yMH!~|c4+gnn+J z?3@OLfDBF9J2ldH5v9zot?N0Q(6HtHdA&D!-i`3n;GK0H1b8-Rj@cEX7|-(dx1XnL zv=ptsIN!H7M>lKajO9J&tz*z_prK(oMUr(#Ls1UZs++ z!mKV6n}fa;;Tistw9AfugdM^`D?`;LPEYb3-MB_`ox!WQw>&T zq&BO=kZYmR^XjlN<%%B7jo^2qXH*7YTPaE#dN)VhtzFXHyL}xmI8rH=k1)2WdEmN2HfZe#*<;4S#F1==bE{rv`e8 z=zXE?$IHw1pX#16pEssG#(I>#GO_f)YGy)m?f2WdJ3M=e_SmCOw$M=9yB^Zo zlR0*ZH&*#0E%6uli3gHitMtQv3U{XtR`+ly*(wNp%tlaDhliD$+f+sPENhXNr8N5c zuzjQCNkdA5)8<#f0LHRNL2zX{Hc>!_E3nS0J1+V@w+S5t+z@lQecM7{c(96@=W~aI z8klyy%qZLAYaVxp@1Vtx@|vQ%Uq-v#9q*~7RGBJ;A4Ff({qiGBDl=XU;oF@`u2JmP z4nmdCD#*{Vv*A%4bS3CBL7;lIRd7;BhrCZNlo-FO(n-iF=se*C2!iZ0gOK0m*qT`Q zjNPGe!vo|#SavgD^#0EmpdBYDSgb5`R8@nn+}lX%zJ%o{?=x*m-$rX9+saL_I# zH<`m=cemF(CcZ@}V(TfIkbt2d+uYV#63#Qwra4=bw(M?0Js+2#gpe!Lw1Ae$Y@@)N z7pAmeg+ff$i>PBwy>rD|7jp{5`kQ{pwfe0xBwtP(AmnZMEHsn2LCa&BXT^po=jt-- za7#@10%Oo29uIauIx}RQcPSqa#ZTl!a>8$sMK6!;PDh_~u6EaKm)Pk7*qfr8QxzR| z%CZ?;qKsw^Y|%@IojMZ;R;*G1t^0H?qq#>62@|#sf`jZtS)jM9$o6@6tz!|_i z&RDC&zmyZOms?IEr7<8AxV5w~d$87d#Y3h zQRc^V?xBaJ$j5j0jrPpdOT0=gAYt%*jxtJU_(Q`@RE?Q7ua0p zH&x$rlN?gBHJR9p~OOl*b_k6+|2QobUPvs3x;> zoEVN?N<6+emuTQIU#>e!WN5ahkR>Qi5YCcKYj*e)ZVYM`Qa))hgX;ImQDd%V@ir(v zG~96XIh+G&bm-#==^CLV>w}pHG-s5_K^+|MHSdI6+YI?W$Et*}i>`GdILs9coSJAy zX)xj)ti3N^zTAU?nNlkX*f_>;Ud`#-g=TN45?gRAXdHBxC@ax1F8(=%I@j&wni3-{ zFIS#mPwBn}brywbBrk8BqCk>uOs8G|pstt%7{gO$P7EFzLOn(ua`z1Em#~mp;C&bDR9xuXC&SC$M@j$aQ6G`3~knM^ewXQ{u%xyi}mlqz#ea*u0tEvj{V@C{A5Rs!}gDtgg== zw-z9QPhSlT%r(0uHXk0?B({N467cy-7fi5$=WF+U{u0Iet972ow-*ReXm##NHhbV5 zKd)b(kyis32iD;$cpuh#95pXQ7uIr*ek&NQPGmH|#OSoh`z!niMMqwsY!~-XxMHol$f|-dOL*_my+P7@E(&VIOb7z;D#gP2{P}8un8O;?P6HuJH3s1ph4eqBr7HuidxZk}90g z+0HzSJkde|29w&|ettVX6lS$0`qpd+SVD-^cC}hjV=dtltw+#|AdM^v`3;lXt zC|Y*DcI;YC7qFGV{PjETVCCZMy@_AbEvp&JgVlG%(k z#&5-M*#)f^=Mr;{ye1_vtc2ygH#g*iltoicL&d_(a485G|1Fz`c0w8Vz3rt- zo9yjrgJ5=I?4|hmY^6NReqV4vE0Vto{3Uc{W!T|elLBTZ0sTLF1Pl;+NXDnJA1I@F zXc2oc9L+ywfgO>##VStK_V<;AAzIIdW?Cdx9D#k#D1f2ChyB&O~UGkJH{KXjwS#EoTLX%;8L1^;gsvjR%|G_yV zsF!izJ@+Q?i`6`ae;3osDvEm#FOya literal 0 HcmV?d00001