From fa56917e856dc1396bd1977a5b7c3bfe55d9ee22 Mon Sep 17 00:00:00 2001 From: minster586 <43217359+minster586@users.noreply.github.com> Date: Wed, 14 Jan 2026 05:40:48 -0500 Subject: [PATCH] I'm rate limited on Copilot and Google Gemini Everything I try to do never works I hate big companies that want money --- pom.xml | 7 ++++ src/main/java/Main.java | 9 ++++- src/main/java/TikTokEventListener.java | 47 ++++++++++++++--------- target/classes/ConfigLoader.class | Bin 1076 -> 1107 bytes target/classes/EventLogger.class | Bin 2034 -> 2057 bytes target/classes/EventType.class | Bin 1129 -> 1053 bytes target/classes/FormatLoader.class | Bin 1076 -> 1107 bytes target/classes/TikTokEventListener.class | Bin 5482 -> 5636 bytes target/classes/WebSocketServerApp.class | Bin 3179 -> 3188 bytes 9 files changed, 43 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 8b96f61..22e6506 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,13 @@ + + org.projectlombok + lombok + 1.18.32 + provided + + org.java-websocket diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d6beb4e..d3abd4c 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -82,11 +82,18 @@ public class Main { username = username.substring(1); } try { // Add this try block - TikTokLiveClient client = new TikTokLiveClientBuilder(username) + LiveClient client = new TikTokLiveClientBuilder(username) .build(); client.connect(); + // Register event handlers + client.on(io.github.jwdeveloper.tiktok.data.events.TikTokFollowEvent.class, tiktokListener::handleFollowEvent); + client.on(io.github.jwdeveloper.tiktok.data.events.TikTokLikeEvent.class, tiktokListener::handleLikeEvent); + client.on(io.github.jwdeveloper.tiktok.data.events.TikTokShareEvent.class, tiktokListener::handleShareEvent); + client.on(io.github.jwdeveloper.tiktok.data.events.TikTokGiftEvent.class, tiktokListener::handleGiftEvent); + client.on(io.github.jwdeveloper.tiktok.data.events.TikTokChatMessageEvent.class, tiktokListener::handleChatEvent); + // Optionally, wait for connection state // while (client.getConnectionState() != ConnectionState.CONNECTED) { // Thread.sleep(500); diff --git a/src/main/java/TikTokEventListener.java b/src/main/java/TikTokEventListener.java index 8bf87a4..a87e68a 100644 --- a/src/main/java/TikTokEventListener.java +++ b/src/main/java/TikTokEventListener.java @@ -2,7 +2,16 @@ // The actual implementation will require the TikTok-Live-Connector JAR in the lib folder. // At test time, you will be provided with the download link and instructions. +import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.data.events.TikTokLikeEvent; +import io.github.jwdeveloper.tiktok.data.events.TikTokGiftEvent; +import io.github.jwdeveloper.tiktok.data.events.TikTokFollowEvent; +import io.github.jwdeveloper.tiktok.data.events.TikTokShareEvent; +import io.github.jwdeveloper.tiktok.data.events.TikTokChatMessageEvent; + import java.util.Map; +import java.util.HashMap; @SuppressWarnings("unchecked") public class TikTokEventListener { @@ -53,41 +62,41 @@ public class TikTokEventListener { } } - public void onFollow(String userInfo) { - Map vars = new java.util.HashMap<>(); - vars.put("userinfo", userInfo); + public void handleFollowEvent(LiveClient liveClient, TikTokFollowEvent event) { + Map vars = new HashMap<>(); + vars.put("userinfo", event.getUser().getUniqueId()); String filePath = getOutputPath("follow"); output("follow", vars, filePath); } - public void onLike(String userInfo, int amount) { - Map vars = new java.util.HashMap<>(); - vars.put("userinfo", userInfo); - vars.put("amount", String.valueOf(amount)); + public void handleLikeEvent(LiveClient liveClient, TikTokLikeEvent event) { + Map vars = new HashMap<>(); + vars.put("userinfo", event.getUser().getUniqueId()); + vars.put("amount", String.valueOf(event.getLikes())); // Assuming getLikes() for TikTokLikeEvent String filePath = getOutputPath("likes"); output("likes", vars, filePath); } - public void onShare(String userInfo) { - Map vars = new java.util.HashMap<>(); - vars.put("userinfo", userInfo); + public void handleShareEvent(LiveClient liveClient, TikTokShareEvent event) { + Map vars = new HashMap<>(); + vars.put("userinfo", event.getUser().getUniqueId()); String filePath = getOutputPath("shares"); output("shares", vars, filePath); } - public void onGift(String userInfo, String giftName, int amount) { - Map vars = new java.util.HashMap<>(); - vars.put("userinfo", userInfo); - vars.put("gift_name", giftName); - vars.put("amount", String.valueOf(amount)); + public void handleGiftEvent(LiveClient liveClient, TikTokGiftEvent event) { + Map vars = new HashMap<>(); + vars.put("userinfo", event.getUser().getUniqueId()); + vars.put("gift_name", event.getGift().getName()); // Assuming getGift().getName() for gift name + vars.put("amount", String.valueOf(event.getGift().getCount())); // Assuming getGift().getCount() for amount String filePath = getOutputPath("gifts"); output("gifts", vars, filePath); } - public void onChat(String userInfo, String message) { - Map vars = new java.util.HashMap<>(); - vars.put("userinfo", userInfo); - vars.put("msg", message); + public void handleChatEvent(LiveClient liveClient, TikTokChatMessageEvent event) { + Map vars = new HashMap<>(); + vars.put("userinfo", event.getUser().getUniqueId()); + vars.put("msg", event.getMessage()); String filePath = getOutputPath("chat"); output("chat", vars, filePath); } diff --git a/target/classes/ConfigLoader.class b/target/classes/ConfigLoader.class index 8f28212695404b21e96383bf16beb0215a40e118..20829b305cd4151070a3d1e8f6b64acecc1c63a6 100644 GIT binary patch delta 589 zcmYLFO;6NN6g{ug_O+c30@C@w(E&sT+72Tskob{E2)ij841|qI9fnD@X$ez}JAOmc zzkqQoiD42+gcT%i-MRNSn79z{s|(xaoO^rEJMW$MS^KUvzWw>~6~HsBa!3s3dK~Qs z{Z8!f^$t1Yv@$csAg{-JJp%>kCKRYymn9>{#`|vXAPM4Vz%ibMQdHn5r%&su1)Zao zzN{CkxFr_U8LTXoCW_kzEZi~Cz*Ks??94EfUirg9x;j`9tpGuR6~|MQAS1}-S@+>D^V4gPDH*62F~WQ zQTS3l@m&iQoUw5h=i()!S(TU-X;0-VPpSq>L)5vj!dotWmVa|qcxK(2cTtH&UFz1iBw$#0l`KrFRC z5cW`dhx~1`T{ZVH+y2TuikM|g1q+N^BBt1ZvkYsNca92+JdZhIja;u&qpnEhC3^H5 zb#NJt#L++#EiT(8Yaw-{r4m;pq=a<~LZWiS|7ZT6aga6Xi{>GlJlR<&vHFMJpMH8XHXv~^PM$=YO zg9~l}D`6<(%Zn3>=JSl(g&G~_;bm}ai6RW8 zlv&b7c`jVgQHMMVEyWTkV&Oxhj0OgGu6N9gM?zDp$;6hq7_)Tv(Zsh|lcrL~ppJ_O z@ncrg)r=Mym;WUZ;o-4?Crj2wI+}>b+xBaGO@pFoMg=HA6$4>+7AVl!ggR%DBVeVGK?7=_b|)*?EU;5^GY|6$mKi-V zQ?SB+O11pEV{M1gvx;S>JJZ{el*tQ`W~3edeJFcm*r1UVVIlKL>ZbtG1>~tHgp*Dv znW>Pd6tKVy7XAp=tY6wkai`>wnhsEUh%-PI=RDFEbbEHBENXYrW(ZgD2rqCH4je-X z8oMY61m8jl1hc3Q92p-F2xM{T5Urv>#~yKZ(*69@N&um<&ZIu`+PF!bAgfm z4Xu}ys-92*+bKc>nnmYZs5~7E0#r&Y{QyJ7;RB3kF*N<24*s96D@RWN?U>8O?&AUJ WLP9N4p{1O(5TP@T{8g+W2G3uQ8=eUO delta 941 zcmYjQOH&g;5dJ3FWHy_HkRXJpKuj=!gcy+EBlv`Xpaek>1bncNH3ajZk}WJwlt+)& z9KCsvn*|;Mg;jd@CwTMf(VHH`-iYYbR(DVLH$7i>&%SK1dK3C2edRYO7VxpW3&7I>lKwc|mQL zLp_H}MFZRn4gX;_D~4VWeipSisyKlrF~#O&4zG$9_{0ti^l_Y0aT<08+e*Gv(K*@} z8vmu3SuK~IYs-0EK`ZqGe@Bp3Mq!ml2W0{P9bTnBgBr6q#`g@Jzx{4dP$%yW{6cBD{Ozy{!iWG*$ zvXpA!xW(Wc-q4H2cqyCJ%M8*`DWkudGDN*KDZW`k?z(A1TX~k&)@RHHa6Az6)_`~` z^*LocX0R|OV@d4Uf^L@`%L-PI;n2-OpNg+iSk&2Gi!Zjdtq~fwxvbO&8aK&N+QmsT z(zeJR*e)3sjFB|Mro2s3{R6-qjML76G$zPn9{vf5QUR$C;PVk_4~}$qbRX&gJU|uA z-Bq02M$?3;x3=L-N->{QMSJYiHX76Kah3vI2k17z@m*r3z>78-aXW$tkp_BbI6;b- zqymsh%7k(dP9daBadUhM5^!ROUV%wCLbMb*e;1QfP694W;oerQ{1m1!LlEMO`(!c9 zlAVD4kh0NpnyY;rjHC6C9=&wzB1g^3e}D~g1YJa89`2(~bR0ET-ABTc+{cwF26rek lJMLyL=*O^Pft(gB;vwmJvNVD`s>vtFl24)iD%OyP?>Fz>oc90# diff --git a/target/classes/EventType.class b/target/classes/EventType.class index 14247ceeddef99a2a161620b53c790afd7e58f3b..cfaadf07f26902500665b2a5802ec1cc1eeab106 100644 GIT binary patch literal 1053 zcmZ`%ZBr6a6n-uXyRfWil&1JnrX`?Bl-djA$T*mctIV`Yv(u-AHd+T4XIYrxxAZ3p zKj_rt^tm6^bnYF(?L&Ov+~?l&ob#OX?62S7t^vHpD+M8jSh;7r{&D}@RuE=LoLW6A z*RtGZuIzTt805XGu2W54v4V)#vE@0h~weu+Z7d~|ZSTr24( zWrIO`{|_@-Y_uHL@wXYIbf(5h?GJVo5fuzc4YzTJx)z5iQ)&H1k>Pue+bmQvwHW12 zX^23MLg8RWgTg_SgEwd>x6A?dv>|hA^C_Yx!M|9_It~IJp>5vR&B8)1oE%*yNoV z?iE0hY!ZArB J@j}Fxe*na(#-acK literal 1129 zcmZ`(?@!ZE6g_Wk*RDL+9EdPM6i_x$CJO#w6IsX*Vs*yi%;KjqDwLGYl#ax2{z*C# zAsP*z{iBTcJto$mOWNCe-#O>KbKlK={QUAAz#}}?kzhzw58NQyc>m5#fkEZakYq@% z)-0>`nxV%!TQ3QK!I2UG)mndA6@?xSE()5xR(UBaeH>{Cd9uE`As`nxva+zUR*{7P zj*A#%&?oB^>s8fe;BR94m>9yajzNwbE|YT8Zv`&HK)zt@ItNbCcY^I=ZFARcMkN!Y zxT0f><0`H(^!));gZ3V6ap3rExAvA{As=I}_|E=*DORwf&IO8E>`oX+8Q=!e2C|}Xi(?i=VOJhzpN^R?#0``5?-g~WwMAaj zmKV6s+k2aCxZ!O2R2lono`qP`7_wHY>G*Xg^aP_zQv+v@*xB<|88Xk@Xs5OH!U+iz zxgi})jdnZ=Dcjo)oTwcVRmm6XbnoS+-*rD4(-J)@$4;?SVleGiJ8ZhEo;Y^j+4#(g zt683-evH!iC6|ZAqyZFZpk$;ul98rIMj9F*lM}N-42^KNQ6&BxW#bgZ&+MT8GcKKA z=p$tecj%pzYvh7v;w};rKTlCG%q*Ke#>fenz$gB~&r^k;qOgE_l-;LCBiaW6r5S)C z#pWm~w4_hZj2vP76MgLMo*aWQV@#c_=B18B vOnPN9qst_7jGKq(7yeE=o0DD==q39(+GUDvWu9skT2FLMmFcfV^keB4vm(k@ diff --git a/target/classes/FormatLoader.class b/target/classes/FormatLoader.class index 5f9bf966a1351af68981d21c35e597f2e58ab979..552459c59d03225557e24f85753208d82a1e072a 100644 GIT binary patch delta 589 zcmYLF%Wl(96rAhWzP96(7V11oAZ;n6wH?B%RN^5~p|Xm*DFStaWYSOtLR=*VvFkTj z{sj0$*etNEnR9&R&b@O#7~hS?w?7|00l1Ad2}QuZ7mc2W zaVH9QdLs!nsVvS2sCT2Co`nKT8yfVqE8;0@<5jn}7x$y#SmI9U=Vf#hgAGCvT&q5VTHqJvA(7JK8eon)E}zDm7<>wf`9 C<74|r`eVBI{r9KO0Pf4SZ)Ds699Cx}+AQR%fYrrk*Ru3!S#-yBoo9KiY~$t{PadkketO z1PYTkbJ-p3nX!?_ndv*R-kuZ4#oqnM^PNpK)Q+<@ibx40dww`}CCUP`vB+0J-`RdT z3SX!vzH6a`b2iT7!gSTBmn9Yj>~=UBsHhXFU3Vm4-Vb-($)jlc+Ne$+8~4_7TaoJR z@j2T%LBbK3`5(=ty`V2(J$Tu3hmjWsV~N(}XE6O`tQ;)xN3dQtTzsE`YUE15(~}u zgaZ`bB74Vdmd!)VH@|R?Jmwiw!V)7_i3xV#EXA7UouR@a&tidCA=m3vsLNA%nI8Q{ zEnGn@cGOTugUdF_8c3XIsl-(YDPi4)kSLw-|C#@09K=(JYqXfOUdIh~2G-cG$KB08 DERAKS diff --git a/target/classes/TikTokEventListener.class b/target/classes/TikTokEventListener.class index 30ddc0599095b9fb79d1bea1e7df3b5dc2f18768..d5251c7c5365384112cf21951cdc39cafe8a4257 100644 GIT binary patch literal 5636 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 literal 5482 zcmb_fd3Y4%8UIaoH#12FgUh)H5iwkwgopxa0*HhFkt7_6prGPpGud6UJG1Ogg4EWt zrM9(q>s4!8+hXkrDv@Yw4-0MWec$)pfBRqiJlfwoGdr0jiw}=ap9iwv_kQpBdyns% zmtT4QMF1P{uX@xVq9UpzhFS$PZ!^Y?_MBm*+jkD#W~Lkkwd=E1*4d~avSQ`lI%ud< zQLm!`x`J7Q+0j9Jw0qpNoZf87F)g!5iIi=PWYY>7dtG&7PBz!xXB0X``T`w|B3e6Q z7xRWAqziS#F-w7VxHMoE$3?~L-hJlKfSnpO9glQvq0p&e4&_WSR%*aJ%vX`nu>cn- zm{DPfzNSsOzHEi(Kq#KhmD5QY7Ac52=IxG(iz_e~aEe(gEw(Pvu>_aWM;b3484&Fk zuJCoa@sZTofTdWbV!4hLSXtqeE1+c^vuHRr~ZcL$F-(?6U4~*ecdCT~qp)j^=I&r2%VjrH-paK`l|+VIGOI zG&*#2V!eWSd1KV>bOSqYt+Bj$c>pQt|bPp zH?EUi8KXF09vU;Plv$4^bm`cFZpKM;-F8RMw1E49=F|=6K4pcKa^2w?k>u$P>d7H~_|UjDtD#dZm(w1z8Y@oJA#7oL;$CiuZ_) zH%RxY*;04D;2hELMu|9^GXo^<#9b=x)^QK+<&if&?Q~iuUtP{l587MFtzdZ-8`FUi zt8d0zR2Innw9e)1!;-`I=y72!UU@%Iyv`LLWXvoq z$0)iFjOe&gBwlAF!@F2t8w1~_o7zf;&s%QBfMcXa8KR%O{5iWV+$68dSe0SRc9fCU zSK^e{WF=F8&~V_pw42W9O}S>zGtlXYl5A_Xwbho9vqw8L-ESDbpL~ z^Q-jKDk)XoRGV$vDLF->&}TXsdzgdiHwtQ+mBw29t{%U~A5{EN9%O$~&^+~O%39<0 zsM+q7lJ`d2YNYtSC+0pwRs2oC(rK|(b6Led6g0gyD|6$;hf8=d z)$lP03n<^nzcZ=pLYyQu>B(aP&v8dhz8|s@55&9K@&!a)r?{T$ zQyS=_;+{2fRpa|T$rayF{7dhYXDCxoo}E5_4YwA$jCb3w-B$^d;XbEi+Nd=GKa#>xbP}Q1_x`djjo5VWVH9e230oiVl?WPHA z?ogk6_2q3TPZXw1bTUYtqH=ch)3FVzLO0~g^=EF||L z+{bHPuo@x%0W8Mzc!4<1#39TfLQ!%IE6Y@G;fod|55pe;}GG$qe)y#bL|(Jddsnu;d( z-#it;KT=wN|KO@uX)_vTf}#={uK>TnLq3=IR}$Gm!x~j*PT{%(nU310kxSH0pxAZ>3)&`d`=gk}!#mtVwJo8Z z!kbthGtWSmA7Q;uO4m!#y-*i(z&ja8y0q_|YZUH`nZ;>xTnOkv?t0-*^!sIGOoonziSG8{WOG^s> zOE^tz1nx%Eyn=mYq?;Oj0KZMf@8B^1N}oPJm6HD@FW~+gpTpbxTI26v3kYV(_&X=? z?tcEX5}o&*-L+TKsSfsEC+l)O=f#Fl*DeWyT7vJ=Mcy{7T&bZNa@YAmN!Nj1A()veP@OC5Pm?1G-lK*{pD;i$wf3k+dGruR`A2~1N3nZ(8sF+ zx}DZ~=;w8WXa@o9{l5VEBmCG0^bCEMmfYk6D$_22l*^BD+DYEId~i_+-X{d!STg=Z zBASR*;M>F@0_9hyB(Y=>eS`a*BV?s zEcH(XHxILP1`C;#Pfy~rHN0hJdTaN}YC8TTqJ4^YgKWX};0EzhV{ixzvGY_RoE@nucq};Hc6x}y19hy#QNlOa_N)V8w6r%D_381AGskRgwY^A6;O>Uc^=}erNh8ExN z7rtMJ`q|I2lt*35#kM@-A~jtMj-hLaP#4ca-Wp;e&A zcVtN~HOxyni-BCuk**tsjy4_5h(^(X_39}muq{#cUe_d@oY2rIuzofClZKmT3Q=^R zOF?uCG$fJ}QEb9y4Lt%IR?iOFg+joAjxE?qBHSe_n|Ex>yd-mk5r_x=LvE7QY^0mP zAa$%klj6~|K@ATGwEL$1+su;d$$1?QVLz?y1;)Rj%#&%SPCKUMWjse3 z^XV2G#KRg632eDr7wLEej|z0nN^e}w+n%iI6oKAEP=@+#5k(qDH5{pq(PJF5I*#En z0j*>d7UbBB!2R{IEXQ6>%{NQOIDi8>j$=@ud!DQg+E&)^CQUETC)YD9k0q@FW6E@x z4kE1ti(&{*YB(X#;d59`l8%#L@wKAjt-$J66=DTdjg=Z=l2NbvVQZ;j4qHKBU%kWO z`|BBXH>d!woHFWlV*%G6Osu@sv4l&kq9qpzR-Hzm7HZmG)$y8Y=SEjrIR*HJjyLfZSH7%J9rm zQPw$ruHyWPx>jrj5Q9dckYS7GDU&YmVeh zxBApq_>5!E2Vg$LH!cgh6ROtf%kl0y*T zeRJO*(9dqZfps^~&gYJ^H?ZL*HvW#@Uwy+kuj_osR{n-W(Zkht?sb*TaUXVYMIh|N zE`n3)u{&@w!!s(Fc;9d6-E#|x2qv##AD<2g+{EE!JPusP6L)%wF~kmRL#OX4Ud9ML z#qkuLrU&9;1f%pJa0+9*s>CjFy{5wF=^CGzx;{73dJ}#2_&yJmG3xp}!#ovraXgEO zAht<7M?wY8Vk(GZEXci;3HLAK+#OD%K144m-ByugYv`~wOtKZv(~U~<1-ux5j|brG z*Kof7I;NMAuZzC}Z7ho_SDD225WhXdZ-lK1N;Gh4RkR0zUwIXwX*BFNU+h8 zz6+hkGznY?6fqpYT_#*3-z8KZ+``MO*DvVYdkYH!f8pS0KRe=;2)OaOz}4ITsD5Z* z$RM_|>t|ql(aZa8epOb}NrdSn@HR=}$ZXw+D=6Zu`f ni{L%H&wHGezD&zc{p;uc^-KTywSWB<-}96jn=81ApRnmaUF;bC literal 3179 zcma)9TUQ%Z7~LmO2EtHiprtoTw6q3FiP{#msa1;9qEITSV5wS%9e z!Z~+APP;xt(v{Albdr;Dx`>(f=K`IHk^g2)bx&w$64>OMEO=%H3*H^g-#7|9e3bPfu>d8d=F}jY?dAee&h{n zHaRwZo@lA=sRndmkA}TE?m|MK#oy|iq?cV!&NFy>fl+KOQkr)1lw(?6+H<5apK3%8 z_G#$Vu^)W`JFAo>j7DI~tn|j^yzR+~stfE&1Uadyic}PL;~ow7>NtRdl|FiOW>!F3 zH1Z2_Y(`*jwJ3|e7o+lbq+%3gzmEHGzd-xEF((IYD`R+*rkCTJ>lv2EVpf1LWO9|N zR}L1%VWc!1(W!9?w$;yJWv1w2LFFxPttmtabwbtfVI2difOQVDv?yad4*fAi(66dA zq~o|MQH^w*C{AEl!(%!g$4H6McWG!TBMVB40#T-Wl&8v=l>%+06qh?5Lk;?)l;4<+ zQ>uV!OK=urs71eWDy`!*o)oAzJ?R*p?XZv~Fki#N!8+A2iKjH2(J_Uy6!NMJOD0T1 z&Tvo4B`S)CYD(>RM#r-_$8&D^%ax7>I#oI|bWE%C*1FQ7oEy^StYvr$4ueZpo`)kN zx6)ziXo?_%c9t8PM@&neT$rDh&S_&h&z0DSoiXwghGVLEuvqKmOv<5cBouS8x$tNz ztb*+@9x=?q+16M=GWTPNTl-M$*PLNx-5j-;9L$^2@=lcIY*J)V9e_ur+Ro4|deacX z2=rAm4u4-q!|K@9VBU6_heNjsV0itRnhM-hiKT)KSBWsT-Y(F$M>8=+hixlV>4Dp@ zt_M?`+I&gn^nb{4ltlagKT>#P{5(hGQrPV(PZX0&{IqANYHyr&Y$Ka7TyJQRwG!AM zi_az+WadVVLZF>!+Fo!n^0=wg)gD$V6i}Z!C2VTPY}<1^$0&?SFK1`ndb}gh5!%Ny zz9!%+Weox!}} zy3*BfMPSdmn5wy|;ai@~Tbok%#khD&Z{_z4*xqC6&gV13Sp->VeCOv6N6D2*_TUJg zJ9>VBIJ4tAYOX`$yME?6Hr~LdpV9uKzj21+MmBSxiJvV|Z0Bs2vn|E#$id`{Ksb*% zf(zs^ACSz@M(vFE{Dk&>H_;Kn=Rhl+@41GPeyyIUN|B(@x_t_r zo4F;R5O@to1Gr0stL1MArGuLo7Z~lm3AWcOXy?n*0>7c>aVE`dv2ZA9cRL^VwQ$&*lnH@FnRn|O=Q iI1BtK&EEFMcm45wfBeuNKgQRzQvVt*;~RX3ZT|vkA|mGi