From f23f71ef04b6956071b6b984112aac423fdca22c Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #83 - The Compiler)" Date: Mon, 13 Apr 2026 18:05:26 -0500 Subject: [PATCH] =?UTF-8?q?v1.0.4:=20Diagnostic=20build=20=E2=80=94=20INFO?= =?UTF-8?q?-level=20logging=20for=20config=20read=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added [DIAG] logs to RulesCommand (token length, channel, messageId, isValid) and DiscordFetcher (fetch attempt, raw messageId on failure). 1.20.1 only — for Otherworld debugging. Co-Authored-By: Claude Opus 4.6 (1M context) --- ...26-04-13-rules-still-returning-defaults.md | 24 ++++++++++++++++++ services/rules-mod/1.20.1/build.gradle | 2 +- .../firefrostgaming/rules/DiscordFetcher.java | 6 +++-- .../firefrostgaming/rules/RulesCommand.java | 5 ++-- .../firefrostrules-1.0.4-1.20.1-forge.jar | Bin 0 -> 14805 bytes 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults.md create mode 100644 services/rules-mod/firefrostrules-1.0.4-1.20.1-forge.jar diff --git a/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults.md b/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults.md new file mode 100644 index 0000000..3c85bdc --- /dev/null +++ b/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults.md @@ -0,0 +1,24 @@ +# Architectural Response + +**Re:** REQ-2026-04-13-rules-still-returning-defaults +**Date:** 2026-04-13 + +## 1. Verdict +Diagnostic build v1.0.4 shipped (1.20.1 only). Added INFO-level logging to RulesCommand and DiscordFetcher to trace exactly where the flow breaks. + +## 2. What v1.0.4 Logs +On every /rules command: +``` +[DIAG] token length=X, channel=Y, messageId=Z, isValid=true/false +``` + +On every fetch attempt: +``` +[DIAG] fetchRulesAsync called. messageId='Z', isValid=true/false +[DIAG] Fetching from Discord: channel=Y, message=Z +``` + +If isValid=false, the raw messageId value is logged to reveal formatting issues. + +## 3. Deploy +firefrostrules-1.0.4-1.20.1-forge.jar → Otherworld. Have a player run /rules and report the [DIAG] log lines. diff --git a/services/rules-mod/1.20.1/build.gradle b/services/rules-mod/1.20.1/build.gradle index a8c6f94..86bb720 100755 --- a/services/rules-mod/1.20.1/build.gradle +++ b/services/rules-mod/1.20.1/build.gradle @@ -10,7 +10,7 @@ buildscript { apply plugin: 'net.minecraftforge.gradle' -version = '1.0.3' +version = '1.0.4' group = 'com.firefrostgaming.rules' archivesBaseName = 'firefrostrules' diff --git a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/DiscordFetcher.java b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/DiscordFetcher.java index 20c3269..bb5aad3 100755 --- a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/DiscordFetcher.java +++ b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/DiscordFetcher.java @@ -16,14 +16,16 @@ public class DiscordFetcher { private static final HttpClient CLIENT = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build(); public static CompletableFuture fetchRulesAsync() { + String messageId = ServerRulesConfig.MESSAGE_ID.get(); + LOGGER.info("[DIAG] fetchRulesAsync called. messageId='{}', isValid={}", messageId, ServerRulesConfig.isMessageIdValid()); if (!ServerRulesConfig.isMessageIdValid()) { - LOGGER.error("Invalid Discord Message ID in config."); + LOGGER.error("Invalid Discord Message ID in config. Raw value: '{}'", messageId); return CompletableFuture.completedFuture(null); } String token = ServerRulesConfig.BOT_TOKEN.get(); String channelId = ServerRulesConfig.CHANNEL_ID.get(); - String messageId = ServerRulesConfig.MESSAGE_ID.get(); URI uri = URI.create("https://discord.com/api/v10/channels/" + channelId + "/messages/" + messageId); + LOGGER.info("[DIAG] Fetching from Discord: channel={}, message={}", channelId, messageId); HttpRequest request = HttpRequest.newBuilder().uri(uri) .header("Authorization", "Bot " + token) .header("Accept", "application/json").GET().build(); diff --git a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java index 00da695..602c85c 100755 --- a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java +++ b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java @@ -20,10 +20,11 @@ public class RulesCommand { return 1; } ServerPlayer player = (ServerPlayer) source.getEntity(); - LOGGER.debug("Config state — token length: {}, channel: {}, message: {}", + LOGGER.info("[DIAG] token length={}, channel={}, messageId={}, isValid={}", ServerRulesConfig.BOT_TOKEN.get().length(), ServerRulesConfig.CHANNEL_ID.get(), - ServerRulesConfig.MESSAGE_ID.get()); + ServerRulesConfig.MESSAGE_ID.get(), + ServerRulesConfig.isMessageIdValid()); if (!CooldownManager.checkAndUpdateCooldown(player)) return 0; if (RulesCache.isCacheValid()) { player.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); diff --git a/services/rules-mod/firefrostrules-1.0.4-1.20.1-forge.jar b/services/rules-mod/firefrostrules-1.0.4-1.20.1-forge.jar new file mode 100644 index 0000000000000000000000000000000000000000..4dc0d750dc9b3786a0291da86caa41b052745cd7 GIT binary patch literal 14805 zcmbWe19)ZKvNjr{V>{{Cwr$(CZQHhO+qRQV(y=?XI!zVbgF~_J?qh?jTa+1Ix$N&%!5C8xG_`i<71QGxeKw4OdpITf-gjQJz6aete9u@!? zKu!|;_ssx6|8uL{KM@MzqP70g2LM3+b@5LGX?_`T5n)9o8flR`>8VL6NotyT7)ff1 znW@=E1-eDXorBvc>M`+Y>1j%FD!?zNAx0@biZsaEj8ThAP!7;i$v~11i%<>81X%=U zgHj_?q5f+it{y0DqQ8Dd_t){)K%BzeoS9bZ1!|57}9&(g53ys;DjXDKw2Rtd03#wS%yV>4pB?D?hHnz7nR0&M8 z%1_FZgv#Nu9|!R-oZUtubgRQ8U$bl7a7WC+;{+B)0)xkm22kOZfrmmD$G{V{9(nqc zn_7;-FP{?eQRMC@zQ)2_zlBK}$arMe50)fp2}0=vs)CWdV!fSz1+;`e=S!m3(j?nOz8q9&R0K{Rp4PcoQG29TiTkSSuB!Lv2Ncnpg|-g8KhikC^r z(wqt}QWh$pU>yTV(@JIDm>=cAKM>DI~1symUA3q=au^}Y$H3vpUrP)|9*-(XB zmOW#uLUz=sn2lzV-2aAKAe3d-#Dsycd`&}>IC+WN&Vi-w8|0~%F{ zRl7vWkf1-5CkPhXj9&7gXYJ2>xEZLXQKa>Ym^~sHVLPBwP}uWpe}6`%O?y=k*yUN9 z8+l~Yc@%!qnR&D;S7GTzZ(kirVqmniwFmUsqst;vQW5mikMqx2y$G>9&L}n-1uK5@ z6jAN-k`DZHh8iKguj;JKZjzWN$eM88#@0kEz&YUsaPJ8Bdxd0cc3-2s(c#&8Tag*< zvR9sDaIWH0B6h$+(2H7iaLYXuG;0j~FwCgPx(kpSjVXG_5jB!0YDh1B+`kYtpG{8l zS1sJ#$ zp+F^K+s9oHMu9TGO9VA%SIwX&nQJZt{?R1bbj4XNT3oJeyVR%cPe|NeWU=m;LgRq? z1B>{*YqhYmDQl5L?SiuW5hqKBy3(}|?*g~OIijiQBCGhFYRZ5sV3uxvEl9jq?~=qN z;ib&;q6_MB0Y`H(trBHfQzAq7q!bDGkgOM^bQMN@&>NVW+nZ`{_etivkPBMHO+^Y+ z%bH$Mi278s9$4;jn&%7HYi&GxeK%CMru@WJ5Zuk!6=p0b&&rxSwAXkSxvF|_;FZ`1 zcgmn@oDVydTwbY!)K?AiuW1?IQu5jo{`8krOPgM~1jHbqrG*Yc%us?9ug ze}rz$UxH{%Ka_OK6A}oLbdm%~$)7r>E-iNC1m0Xsg{x0g`xiWQsQd(BflGI>TYj?C zq1(+;wkxXfXrf7Sxx?0IWU?&K(2(0|!ju0QQDrINsp65+tFyh4yYNlR09->?lrg5T zi-}kT`9Z|NW{GjB?4Z}O^P;1pfLpyLSpd{@<%htOtiPep?0(zS5>Jz(>J!@6T*?h` z2V`ulPThiicYx=R*%Cd*0A-#+W`LL-!5DpPVq-hCr&O~v&)Cjo_{pAu=Nq)PrjSb8 zxy}&FRvo?TJxrS({-fx*`8nM-FD9oGly8<#PI>i(H$N6~efsMYWjQgI{N^|HyF_5! zg264H3UMo4ZHdhJcww%_lU zRPr6%x%--CORn+saK+YwWD!R+;G2YNX6)4i$Fm%U2c)sZ^k(`2{Cne>!D0;I1qA@; z{_^L>^Y;*h=HL2eA#+DVTL&W%V<$tif4JsmHApSwWsFZ=KJXM_yPGhP{gDD1GcEC^ z@PZOQze-9C{E{Uimlf~MsLL5E6BBvEi_MHJ(Y3>4{k3}@7;(rI%I*cG?yJ|Ht5=EG z&rEeYf8*f~pWxiVOxEqk?yHZF+0ak#OJIPOa8RK5pycQhXw4FN6eH%w)k_F7IjVkyXLqDeiLKAieXVmcF@VAM z*P{>ZJ6#?BUKgi=Y7G%o>gZwuZH|iJ9^OaHC~vMtQFrRa1mifyK~d;g#A!zSE|^u) zW{fj^#6*SER>f5wG6{0{a&J-JT3Tw^%SSe2CY&v0u^(@?AyHbqIZ~T_qo!)h>y45t z&MDlyLj%m-gt$Kgj&g;3@I4&zZn%(FgJT=$ZsajA;8o{eM@a2{{+dEaGe zl%{DyV7t!6zGiOhh;ecXjIo;Sde=hq`coarHahoFG1pSDxa9)5&c#IgwTPR@T9%nN zlDP^E;{4?F%<}4l1A86c&iT!^qNwF7OI|aWyp}j^Nik)e-bP%(7m`&Gt1ohwd9bkM(tKAw#Z9^LvFeD`#9eE_qco2?g=TARtf=5b?Us2a;40c$e}l3h?MB4T+}WUnadF6UKi;F za7Q;}6W0pkUrCUtoSB`p&n6%F)dr!=a+Xo4#Xj;9Getd`wDFjOigjwp;Z$wzyg=Yko+lcs?W*E zDcs)k7-bCFToxd)h@Lw;++7sf?r_9DF+UfWbVX>dRNk7zvj?hlKNJD{ga^A0LZ4Sx z!oigoqdI!gsu%{S3FR9>#vD!?qo1VxauQogS^Izru#Pl#(tIPZc(?h)hQ->~y8I@< zo|Iyw{bn|#JlZRhi=G-lQ#G9h3hvA7(Ukns5zZwnh~0)GRuJ6hPuJ2_-}_jqS5B`<0K)3A%JO9<;SNNC-jH)C zM2dK2uvz&f;|-bCi(7leJOY41d`n5588gekq3wu__3pSJ+xZEqA}v!r>ZxKm{!?2* zNL9pS$(SIFc6Soc3qd#kY69Nk2~!@)-=VY6<^7|-Qnsk+3G(R;#*5Lfc3(3JL2;y^uk?>6|`xYr>(G7n6ad@D`C?k^r{>RXHDcYNMFm^=J`P6aDAi8X)B-jnw8?ztpzHLw>vFPd#%6f3-kNlBQ z-lM)x$T}i!mgTXDRik%K!Ry^0>DC0+HALolB68@@%Yjl|^X09ttT6<2iHFE? z++5IEpP+B_v45(1es9hil#kmz)Dga{vLuIKa~VdLQTgg*aly_7j6Uc{fzZKx&t*#= zg7$?+hoY|70=<>G9CP@B&~1sm3ktpen%!rA`!TyXBe@`F)*?)FzCypz)C?T+$w~+S zD$Nh-q*9p4mR_SC#QI(x&Gk_q!=}$6;ChlS2!$=0&W7{=gX6~ogs04!m?(%H=@#6B zubVac5O_P{k6uVP2W5V8Z;(N}Jv9z#cf1i%IbzH%2<>@zxrIvjcoqe+&}DK`uP7e3 zuq#tifF9csGAUcu*kgc(dy+W$N;WncWw0w2s3a1O7P9b`5 zbg^D8A$-^Za&weN-#18chHc;EvL7*ZRXmSqZwY!3zjV?V3RE9nnN;04sSn+y$PaGs zx#p-?KXHHTw7MLm z$)!GP>5ktoriB51K;4EY@V170XJ!asR?0_+eC`RdSA3nssHKyn|KaWtV|JfZYv2Xq zboH#%6;06{65mx?=K)ao3Hm#-dt>W%^MM2ah(h@@vio~ZhweX$>}(yZ^_`sl5!+R( zs5>GnBY)U1Fm5g^;IAM$0T5F76A{Uvf~2GHZFW zvsJJ4^Op+HQ=0GH@)eLwQx->Az?VhYm`(4Htex{t4Os@lBhI9yrN~1dr$;Kvd0&PE zyb)V}WM%ng@;MtW*x*1OV-l1hggqg(7w}0Q_R>~Lex=8Sb`fjmb2T(!Nx|PPG*?v| zseecAUP&>Hc_oj5?btG!$e?>)+-b6nIk>=Wr90qg*KHvbin!TcIdo|{xqLs96$AW^~AqcV=1772}~rnrF%aW3{2)vS=?zrp6C#w542yESCjoU3k|{m!#1-Hs)vC z5IM2ww2zEX0&{7~3jV`*i`SzM_ z@Aopk3VWZ2ynR?FQaer-2ncCm+IIwIGloqG=OC*g793P6t)^w z(_51SKC2RCP3QXO$w*OC1as^a`?%-~xsQm)F#PcwXaW{s78lvpXUkRia+;W;hcw5} zduI5R`ixeq=3QF+qdj(&^wtH+!#*xWxwzcr1hNLt4*3K6(c0fu2ZkToVutmkCSAJ+ zzpQ+(p-4+~8B19u7S_VfT|c_GOJoWa#$W?LjGpPSQmSuT?8; z;>SsMVQ-GR`fz1K>d#cq6HDX3bXVoB{%YQD7r$Ojq_+$z(c53=0x#aPt*u2hfGxaz zKM^8g8jF*#_+4{6cMrc%AMoOaUF~SM_irU~(x}-LjZQO&HzS5pF9g$*2pq}_>}i(d@x#xDI*uWRo8ZBf4 zdRB$Ouf_249g~mHb>R}q>>UW86;s+J>@fsX>=*BOkOOR18?(h$?SqJ}6d9`q6mq`9 zpqi5r07!p&+Smc5ynphOo zDbdDRP5Quy9_AGxQ6t&kgW@Na$5o!GRh~I?w&=Y%2o#|`E&Z%#%2M^!gmj|kw zWg0}Xl`6eBxT~TkC}3nFw9jCWXH$9b;sTDNc)E+>J%9uw~W+EL$!bfwTP=aXkLbq+^8m>Io-Q*CE=Ci}$uD0^1ej5?{gtkJCpM?oN; z@9Jb`MIi1B0c*PB0XoAdtOlUHjm4XOZ~EZ z0{-5p-oI(7N`e6ZI79!rQT;tVO!03wDuv&9XF>g6`G^0>3@d8OVu>Pi4~8yNL4gQD z5Lt7Wn*o&8WAVKQ5P^cTl7tkYZ!{^RP@mPO8+BV=#PB}@z9T7bzb1r+h}kTKR>+nw z;weAOxIK$ysFV}WE^m3xraR8QJulbx0=D_rqL*~nrPof1Ef&(Lz_gMFitt#x63p11 z)bDtB4geXl-HmO!-t|asUtRDZ<}}Pr(m5a|F91T{`OCRe5O$4KS9+i`3+3=-=*Q8X zO5;PHHprVp+IAq9Rh+e!`$XtpM&D5tVSE!EhYrjMsl_0HPQQhmkBB(tk%SiP!Ky5f z+uCZeQkYO<6`Lo~{bFzc7EurqNqKO4DzSSxSe<>V5xg5}8$mSP+C@;{jbIomNC;n(;{#7V=7T=jO z4J4O^r$h*#@z!H778K4U_hGB?d9ZwRBC^&6q>LO7YxQnVlrl{;BXqejhM03=zN<^k z>DNGdEN^tvV@1z|#Wn?>M6iWToK@|Fk_M9r?+ZQn82}HvoZZvj)RTw>Y7-BmU227{ zI)%2zpLT^!?TyvNT2!CDx>W3KVXk1;ENt`^5W{ploT@%cVaPveXx8iKrs+IxlPAJL z!l<RT=_u{Aqp@A`5^beiCoLPE>#X3dDGIzQu#}NsL_L8VP?kQ58m{DAz_u7u-RX6Rf za^SaUGOI!^@Jqks+UnK3d_%g-(NJ5G2{*b^Hcq4hZ>={e^dkr)-fuRM*{2BAXQ&uSXpKv5Gf*5@9Qs7Il;V?-)J}@&A}6l1xAb6W}tkLnRIN}$d~LN<|a&!roJPqrX)t0BTA3(oJ<_!9zaKC zxP3$=2}ZGd9%eb*L&3ar+pqWVsT^)su2W8S51pF5J1_XCG%<$qF4yAVtT~tg%8U(7 zfS4u4A!11DkZU-AGVr6BZN>n+gAzbbU-dbYz5N|mVR^3f-aVm>bN7M#xkm>Y7a$VB z@C}{DRvA};y+p1x(psYA|}d;$wre%k)_ z9~yO<+Q+~E0C&H9$X~Uyzo#&%{saGEYi+G>WAxu1q*=|}4QUj^2YgbeajYML4iphy zkB=vqe#FoJJNi1?m}fX-{(5SWT&=uv0Q$aR%9 zaWe5usi2Ff{Nh3I=TB71bfu{@kP$f#EewT$5CO!^_fh7hc)7khvo0-aG<`EVW>P6p z^NQ-B>^5W4COYk;rYSotU$gqDww$mMrsj?8pA;e@iE=}7^k>zG5g4dZ>$7z}(D^p7 z>VX<a-CXRTXBsbgdhajtcO~$;Y6#1 z1R67sFJv|svp1nZ^CNV4fz+r5Ly4hzO!;IPg9sW4(_<)FnuBs&m@@MxHdC5n9HZV_ za^ws;OhUPLyFECH*-ioQ%Z`oPoLjze5+XsMZY1z=kYY45v{VS=2;*3-QOD3Ai$&Ha z=s!$(hBs%5g&J+QOgm>{y`pmn#M5UK#z=dxD*pgq%bkx#k4DIDQjId&gDl^@_m!`{+&J>-UCdfib{t|Zl3Z^~Azy)OAUk^ZP6<-J~j zE|L^Rno%i7U5LmmBu?$#lueHjkZ&H9;;6;Tl260OZpju1{wOQ(Xgm>cEkQ9ex+p4sL^F#DQQquQ@c_h}{Ix9j{5~$M|yEbKLCsmMa zhM$Fz`ujpRO(t;hBq1zC7`tU|ZNqXQ?F$olv0FFO?swNh)yLs(=+KqG5lEL)Y!bcv!z}3y zQUoD&*u(S~qIOuTTDH64N)ns6Z49n9Jy$OhwbVgLXjj_<9^BAt+Uzv?$Y_06%FIE>=3)@sjFs2Lj`F;0HK)|QqQbU3+?H0dERw@6QZ zZ$oWuZtZIpY)!w`y^Eo}B}e~5lzLYNs;E0~1d!) z;cm&^hz4C|PXY(#1MP)bo7Al9qCGTl{okF4lT-619)~x?pcM+>ZeMQ96?j&cS61fc zMjIERnC-pj-=KLW3*Q}e76`niVrTc^;pR!nwzK7|B-pX;+zdXP9)-QaOFL;}T_~d6 z0o~u64pFrtAm&tWm~}LJbs~n{2kems<1JmD(y@SHKQfV75w3I zN{72_&O+LjBMwk44vR?J`(&1`eH7GK+Ot{?c!YeRZhL4r4vUxotjgin!1iyLG^Hz{b1s@@Y zAR_E!OH6o@#`++@Lw&$n99scKClYj$=Sv?26fa7!nUAU{T!va;T8@?Qyc8Iz^{)$O zpv-gm4c~vx-XoX9&#S3D)1~ATk8`~ZBLTfVRX)*z$b}d)&6Lho9S{w(J{ItGQC324 zqz$h@m4S=Yy%S)H)VV*g3T*&l@rxeyQ($1HxJahaci+JR0WsH02$hBE3SdU(7e;y)k?g&J~xmOX~w1 zozqvm-?)1E>~M9-^VVG2DnpvKb_oS~<=Z!00eN>iKF-g}O6~y_96*f`op-f{n?Zod zN+p*Utbirp3DQuS6oMs`3_1Px=UfxnjXCy?o`U5JLII%Z9g}w&b-%5YBRuUQb z2I~%rp31e{FRt=4Z1hJ^Kpwm&X18f%Ki9va`2hUVp< z_%pgFLGnMLMRUnZ6tzqF`fT_G8@2jIT0-66&C=+|&fMw6_XGbJadgCv{*zO@hIebe+H}V7Po8fl@9OwHk2$-8_FkQ8~#4>eb&iD)){hlmpt7? z*X2tJ)oJ0k?D)$t4NG_+YsHbMd`&PoXjz%@s8W3t*UFfOG9;koQtOiwp#+TOF?aUS zX-RI?I;UF-wicdaBRI&abb2b?FHI_K;8vh6%tbAZCOYz@fyzfK=S_?72rKmhUtp+# zDpAt=ZaA16MAmXI-_?)9}~oC;F)XA+(jl3XFStpAr{gXQ!mk*s<4SmG4^k z*PtX?tdPtp2-DgTIb^t4N;*X>a_H%9USG?Q}REem)Pk+uw5V3TO zD8?ig^O6KD+sx$-mtCK@=sqsDl6-8DBrQ1xJ6wmwEq@*$L!K}g7&s^h#2wvOFT;ai zNc&S5e%Qx9o00J=L$V$0=B|;r7CW==q_lc2)p(An$V^w|DFw)%t z6-a7#ATlEJLH94r=vIT`{%0val-9_kOkhk>;u#ro_Gc{Eh7sl3+VHQXn&&2qF7hi3 z3v()q%!JTKMv}dt)oEnco9`{Z)m6zaD6TRE%#-N^)IV6-XQ-PSF*sznZ>EaXlC@79 z_n2yU%(OD*j1v_=MfmtHk%Xk~8DDfwU6tv&oq>mkq%NF_uw<&Nnn%tXk})Yv28Q)6VMrQ+WoH;PuqiG0kgSaghmBmSa07_ywNN+Z zY1~qZF}2#V=E)y8duz7FUP?kOnO{j|2m9Eh2R7xuw1tsK#;Jl%*cFEDS){-T1u8;4 z{en9gZ}S_(t!C<3a-TAB5& zWk-sNOWj{8{-y1 zU3FFP)QI4@8wpW<fB9uyv~Se>T(*`Ow`;&xnGqGWqz)s z7NsUy3X2ci7S^ywS1k*8YW}xtz(ZMmgYBGda2x$>Gg&3o+J#c^7=%Z`Cp%=kp+PFO zXzx@fY|68&MsS#Qh=!v=AbM5QEDVeW#Feg$daj7kg0S7Yr2XUTm7$gEapc#IOw}zT<;UZp zSAw1*%o2d|3wR~Q+anBxJvJ(rAw~7Zu2NoCxec7t zwS9KbN{mRVj3emfm|abMl=qgttw<}0GL^aWp-3LvT?6_f&F@yST<#-v*5)`-+pfNh zImlroud&cD#ov&CM-AL4nwB2bqRx~qJT8(e_Ic$H-{O+{4O#Un+4UjGO|y>{?3A0J zVxMdBY0ldy1yMNNi06Y$Qr4MlM)cGT>tE9Oj*7pOa8&FbH3h1N#L>SANYl^mq*^)W zZY$3M*|QlYlN3=mFB|E$Q@>fKIqlMrwp;9zQWutC77{nALidj16+Gd5jG2jXsKX|m zEg(CM(Mn0UPNg*&(KQ-FTW;7%Kj^G&aO^dbApdAnXKJ?}YQdqcBinc1EHgElfyG=X zZmb6kiNu1)|IkLjarR;*e3g2rz9`#wgO)Sou!4^~)?2U3fWfRqSQ55tPO*dyetT!! z#vP!j@$0!Ho$L1Fc4VUq4ZJ(n=5xRu?WEn2(L<=U5HKdxT}uVmqWxe>pWmT!ui zeLcE~2lYB72sFDs@!;XC?9-&!p$73S0_zfw#wT9j5dcgM>jwGU;OgP)ER5$x|<{LX`+yGL-|0xwtRteu}phqy%Hwg zVQB#MZjag82%s67pI#gHNA&n=mldRWe22GB>VMpgGVe+LA`85^`ZHySTfV`)GGXVW zZw2Z}xw`wYd_D^sPAR>pIbdC4Ll>zQqqkg0O?1cj>$j~YKVELwN3WeAQ%M!z>{d)) zxV&WnZKgAuZ3)oYf;$4}oM|Qe0Y7&@ov|aA9^FY(@b_=yo4z1>)sS9u0!+bWDC3{G z#3v)<4*>h-ZA}Sd@Bh`4Ei0;j#QUp9-|trg{$F{ezvrdt|I@fc(ALJp-1NVrlWY}D z$8{m(4;I$Wns02E(M?Qc@L%m|Z4ye%Gn<&~vqpwe;n~SgrpLamsaQ(Z5S1n=OyEpF zclAqcyX^;~9Y;;}^<7WZ?t;@nn-Y)0NaH4OnYqqhw)-4qX}>>Q)&A;V_NzsYF;`($ zVY1R`q8_C#S01DqKKBUbqz_)N+|WTj`^5-|Rse{?_mb3BHbhBYX$aQTas)OrWvlal zF4{3fXKcqJEY@mVD$r~?M~sahuP`1l0o`S!WUhgEnlx@!I0AH{hqhK{^7}e?>3j=4 zsM*S?%}T-13cNB6Z-xj>sHqyqv{|z3i5_5yEEw7l7lt%cPFm-t~&%}^*Ba$_z3aYiJ>t`GA^S=e2{4)68a)ga1s%Ae;A&_E=bOKGGx$> zpgDSi_+5Wc+;LQ1lB+yXTJVucH`xyU)g>RM7G8UgX0WF}fANl)2Y*+&3snH1_Olk) zD+&nR06lNcz(RUy!g8Jich)S?e4Lp=24EC|Z*W}gk_l(agpI3hMy;!A?MtuXQOO8t zkS(blL(qPhyz_Qf%{Cq`FOS1%KOg*{Qn~UHv1ZWFM}M?B(m){_jsUVDv^Bxnmw={jRHhb0W{cehc*nJJX(T^7|2 z&l!St2^5aV1#!dhPDZykiXaRYs|(?^p!9 zscKRnH>l2$Gm$?42cxCAHq>U;Z`|L93HbSC+M0>%=EA@>j{_ zTk>SHLJV0#dxnaN$i`-4@OoYve$0{k4m|V>MT4p+E3I6=u zCYgqg7gXFa-mgSz$~Ga~h@l-PR&%)!1d4h076+0xPu5R3dK(R`HM)wGQ?X6lc;f|@6jsB0W7h21b& zdWB}|a3)5pQ-+5^5usu&YFoA<6belZt)wF5WQ8?ENBe4ZTZIc}_4kaXq#}>TeUv5p zp=or5s*dU#^}+%BB(ICS-W-~H$Yt{-QVDeE+_?^z*KnR|Z0~FKjJ(Gmuhq_RI4XR+@_X3dklz`8)v54C@Mo0Q(o9HO52kxM_q5bcWm}K&-e-&joD) zzwTkvHclmH@6D^}%vDHrjWBUSLi9&L!#9lfA|^VdbnBgI%6YL0e<>sUhLyfsq%NFj zEtLC*G3i(zQcQ9P4cl+P^I#K1PLrwCVT_Dit6QC<8-DK~HcSl^Keu2WUGH6dt}eQd zCYi4Lk-VOu+Zm5b>O;NY6s0^*0JlQvB?JQsGzu2Aik-@m!Z?ce5s3G&BCa*D&4uxX zmY*Q-JYRZ>Zs76JzAg&hi{CphEDP$U^@!rC9{K)$xzx&j%s2Vf-;4qE+ld1LA^)ON z{YlgM2mR_dP3vFfpOmYAlD7WT|6N}AlQs35r1h5w{5t)o{vVXBKM{U+;`~Yb`OU8S zOD2Dv{uAM!T&q9z|H1G1#}oV}2mK{dzrOw#s?fhv{Y?$}OTzz0_3uQS|KmLTeH6cm zL4V2j{{`xAG@(Do_IrQ*vnl;IE$A;H|5fMt|40)06a4q8{n;1wyRZE(8UD4||L@>J z|A#L3Ke2zW=bxqQ-