From 1bf19b1d3f4e3c97b4e250089fe45f4c669e5450 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 25 Oct 2026 15:51:38 +0800 Subject: [PATCH] fix(research): read cited text tool outputs without transport escaping Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../goal-research-analysis.tsx | 75 ++++++++++++++---- docs/reference/trajectory-assessment.md | 8 ++ .../tool-output-after-desktop.png | Bin 0 -> 114188 bytes .../tool-output-after-phone.png | Bin 0 -> 43301 bytes .../tool-output-before-desktop.png | Bin 0 -> 152662 bytes .../tool-output-before-phone.png | Bin 0 -> 46535 bytes .../research-native-reading.mjs | 48 ++++++++--- 7 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 examples/personal-workspace-browser/evidence/research-finding-reader/tool-output-after-desktop.png create mode 100644 examples/personal-workspace-browser/evidence/research-finding-reader/tool-output-after-phone.png create mode 100644 examples/personal-workspace-browser/evidence/research-finding-reader/tool-output-before-desktop.png create mode 100644 examples/personal-workspace-browser/evidence/research-finding-reader/tool-output-before-phone.png diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-analysis.tsx b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-analysis.tsx index 5c6e34c7c8..b46265641c 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-analysis.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-analysis.tsx @@ -289,34 +289,75 @@ export function ResearchReportSummary({analysis: a}: {analysis: Controller}) { onExpand={origin => {a.trigger.current = origin; a.show();}} onCitation={a.readCitation}/> : null; } +function CitedToolText({text, zh}: {text: string; zh: boolean}) { + // Decode only the saved direct shell-result envelope, never recursively + // reinterpret arbitrary JSON or infer successful work from its text. + try { + const value: unknown = JSON.parse(text); + if (value && typeof value === "object" && !Array.isArray(value) + && "chunk_id" in value && typeof value.chunk_id === "string" + && "wall_time_seconds" in value && typeof value.wall_time_seconds === "number" + && Number.isFinite(value.wall_time_seconds) && value.wall_time_seconds >= 0 + && "exit_code" in value && (value.exit_code === null || (typeof value.exit_code === "number" && Number.isSafeInteger(value.exit_code))) + && "output" in value && typeof value.output === "string") { + return
{text}
+ : {zh ? "输出为空" : "Empty output"}
; +} + function CitationContent({citation, zh}: {citation: Citation; zh: boolean}) { - // A reading projection of the native completed-command envelope, not a - // source verifier. Unknown or mixed formats retain the complete literal. - const commands: {output: string; argv: string[]; exitCode: number; status: string}[] = []; + // Display projections of explicitly typed records only. Unknown, mixed or + // malformed records retain the complete citation, including neighboring lines. + const records: ({output: string; argv: string[]; exitCode: number; status: string} | {texts: string[]})[] = []; try { for (const line of citation.text.split("\n")) { - const event: {type?: unknown; payload?: {type?: unknown; item?: Record{citation.text};
+ } else {
return {citation.text};
}
- commands.push({output: item.aggregated_output, argv: item.command, exitCode: item.exit_code, status: item.status});
}
} catch {
return {citation.text};
}
return {command.output}
- : {zh ? "输出为空" : "Empty output"}
} -{JSON.stringify(command.argv, null, 2)}{JSON.stringify(record.argv, null, 2)}{citation.text}dfAqOUK!bK zAV{g|Jx|P_B?Xcdweg&EazQ=MtlZlw^F^_))!I#lN#*+@4fXXC)X9uIde7Ur5OH+8 zcTo&9q^R;66*L4n^{tdGi0J;@r07-23Lp}yq$xcyAd6}EiRxU?>j-t-LOLI#*IpF5 zHfml28cL-|f)c*GzdrSi<+kT~v*{KVAvsqs<24eu3e|Pht|mrOPy2o7RBPVw04VOfra!YRipb6unn#r(?~TzX~=$ z@3PuVog?#<(b<<9uy&DoJmW>nMG=D~1C0GMlFrl8Dedmx%x!Ija+SWW*6rY9$k zDeIi`q_VKfJwRkkk@nEAy9I8(=)A%uZI|d-i<^?dn dFWfm&qBRk9@#)hRCIe^Mr^z859Aw^5tsk)ud z?{&n|D3qy{Emh@~TSfd5nc=COcgI8@^Rn?|K*t-> zO_f {# zPDH@9Ecn=dN$j%lD7UA0?*J*;s+JtK(FTM%88 {&_5& RK=Z`YKw`L611X)=xJ$z8-z!+d%9R*x8e$`UiN9{F&PaSo<+pc*V zM4^2wwk %L3U8L>abKs9GYTieQ2Pp8gwYBLqSD86=UZjP3 zpxasPZAheZ#3E(g3mPL(v*_GFO-<4dGj<>N8l9)!Gg7&4y;O^4_&(p-x*0#U$F74= zak`m) nCtWR%#vy3L3RJpq=!tkpC60Fx|mllEa12LT~rH8r$})V0SB z<3&1zeTBw#4xk$tiU&*}w!VFOl{ZH&C6d@yRe}u2m5bRm*R(^He9-JNJbQUl4NH8I zc=C5azw&+qwapDtQPGrayaZH)&H)SJ6x+jP*zoMxnN6G6A<#im#ul&ADyHHjMjLM# zY+8iByzr3oL~jfCAdU!8KAG9u)ggphQ`mUYiQL#y &$MA*-WTYMR{ zLQlsoNfTNH+z?FJz{CC9EY$nfR)L Q;1*gxac^wQobUZy?X%?ot z%fzO(tNsp4b7&eD7x( ajR=<%q|g*g6FEK zLQyviEGa_qpPsK0hR!_WVqt+$l >LCyS)+5~U3Uo=jVvyX3 zNl5beE?(RLWj>~#|Lobb(Atw`fsmNJcQ4lb%BdL844MU^2c%?=lOrGZPw7{Oy1LXl zHJ#oF;M;BOzi$K!{4WlNa-^f7NdP~5V7onx0*1-x-)w@~pfxDH!AP~;y}i1sD%vNT zP)VU*DthlMfB_HN)EE9v!=(URfjI;$5gjkk1%LOait3!}Tn5?0b#2hu*|`NQb&$+V zfMf$Gfu1S%^uQfz83+#^zrKBz^Vu~gx)qPO0uT(GV*`Up5TDJdp^tUPynlM=iAE<@ zS7V_GMl(yqOD1s2M|=B#x&B)MovnmReb5^4)Xr`le44ipKSvW=tN^#k_D|!}h JcOQt5+Mq6$H78QXXrViz2(uRSxQ! zdHA30*$ziYEF>(swlp_ial$ 1~uLC6XYSxrS%Zl zFTjmoz|#8b+u$_ix<1U)Y-AV>uECowik_PvU+egOF2XBDs2k@+AxS~XLv Z^=sD_ssm5)z*SA-@#Bj%^y*5! zDSX^RWkzq$A#B!%b4ag4tU)cg4JRll=-ugGwGN7l)h8gHbB%6=0E%bdd#L_7KK#>B zxdx&iZBSLFCMrHY{$*cf>xprRp0F4J1^KB+y9CE2^PDIccM0 zKMnWyZ-7p}9zq*Gc^@no@NB$&eL1hYqB73A5Zya7ZU9UOuY9NcmIU+!08~Xq1%%#L za3S6^Fpc0|TwDxt7fKmDqTLw|Vl#%^2dyTI*eNvis;Y})XOb8}w~(N4M+4}9bPV_R zJ_H)qJ_;2Z(0nljUBDvfx+Qg_@uHERfl~59|ASr=P_V(GL)q+h1zx;*o$Xt!hpO;q z-*X|b82dpJ+1nULya&U9{zO02Oh)~q3=PZ0GsL$Tt^+ bx~k?25cj4p4ti?oPjT~~4-C! {P=~a4dgvWMztKGX%I`x4XX+ER5O({VG;Kc(y$6d;|(6bRHmAmnjpua z-BoH-wDtOE4Zx)pO<<0rba=pWp(Y1!Wc}IBD9Z -n5h_8F?ja7 sZGu{ar`03#^
3Y37qFx5aBf^ZYi|0Eu~dsb46PoHTm#e(U`8+lj6=QR9X zI4L_`D# zLKXe>(v>S$E?>T#D#9p(a)of%zn6Fet0W;IF)}oS%*v~mFG-{QczAe%f`UGLP d$Mqh+2v{I#g4l*&p8&e6glb9?(fX%?5N;_9~Qsjfg5WvTA}y&X%=70@PMUvV~8 zCL?0!aydIkn&c0~9uH{*WWZr*Yg4`zLPiaLh_v?K7bN7t|3xR4o|e|!!a^8{_{bjA zpvtccA;f<_@ebIzV5(=M&bScGQ77HPiu~_Z?%3HOD|w%5F2pVT@9t13UxAb3-wsiL z{@?$jg!P;Va}pA?twSJVxkq{Vnwi }!bs5^R^&hEMZQUK(%xEL5xKvDqA0*p E=j`1C&{Rg z5LIglBG$VZjRgfZAOl7-UHAt)cn^KxH|av!nLG6Tb+^;RXF)6}+aLS2G5iz^R#5dE zY=cL}^b1IRyuFW(|IClRx&5}jp6TDQvql3^1;fx6w_^d#I57iALELLA8yo$4CnHL7 zO3JTIUX|drshETO33nyQP+SImbYle~j8M0QgL6GIfdwcXsrKLvUc*LLn<-stH9b`+ zN>WlKI$3ZjmXv|hjhq4rhm8lFgw~ZiIuroIY=a9I9e3_Oky6*)Rt%eq;0pjpUXH*n zPmLCW)8_q(OTjR*s1G6O^sm)^`z6>S7-e9~x z0`8Nq@LM@)2MQV3-S*S9_TVP3qGJ wEVH$oxX1YT|FCSFTT*#pB4Xp= 6jiNPOO z!5+>!X5)7>MQCVf{ys@A%yH0GKVEEle$9gG>;?v8-L^sMDH4~K=?hs7J*@z-L2JS~ za?;Vc?r$2U%&*$cE$jq!8VI(_bK??!Y&I($pLe1142wi{4-7cM5MrqGs?3!Utq)90 zU{RO?g07 5GBKmpFO8ecZFM<5i!Mm70&>`e}RMwcpS5jw89 z^657YaM-*^D`ZhNHldZ%f*Ut94KgL q-mpD26P z*yv;JcJEZwtl2v#kuEDR81Onu=eD45Eg9_63i)8Evt9hO{bQjrFQ+wTHb0`lAii|z zQeDD%`eSg5CWP9*fbs}xpkVGdAT!!oa%7a`?S2VFk@a LLe#n(MH7zj8Wz60k@d0Jvn8L-$+JQbG^ esEzN-&xX*>xgtUln_w=DHe#m9(w z^iR_Ls#@ondr$Fj &^V~ay-4uDL-W*3;5nVs~H92R@X(-}?;z16@`jmm4~ zA{w;PNLb1XJ5}=!_5HJ5&Y6Z6O#P2|Uz7h_DALITnkqmM8Hmf8Zt=VN9$U#)E* JCEK~jvN~(vtDk0%#{#xmaAExQ4 z&cJ?f?%>uh(X%TW*aqmmY({gT0RGjgw)N!TW_`-Z(J$>z+A*55%Y0-1rv(h3i+mh- zHF*V$yBMWwP{0A5WRD0ean^J|{9xpTQgCWD>up&l5{RwGbIA60h|r^N5%2`la>~og zBciRj+^uNjcRAU(yf4wd!v>Gvip<&26G<7NP4W=0$t9W7`NTC&C*7LZhR#!BH~xTi zJrR*pv(iD~d6`1sJ&@Gvaleah7m QB46SmvEj7lb}7{Q*(*X{NF6hj)2Q zvau!iNR!TCXVsTEwXtV4Hw@C+8XjV*Ea-*qbPAP&uw5jPlUcU?N!9yf!ap)nAMOFZ z>Js9LA}~_fk1ZRdC)5 7%Rsn@%m zxL`ih9tIhH9!d+~Ll}Y$-7> =6eZ2$ &7Riv5)|Ly4Y z_lJ)MP8@r_o$JeAf;@{1R00EWZ9UdmBZyS?JwC``LKA6$BVFuqgb^pTDzY!_a^nC~ zrelaVK(LCCjO)_o=V)J@;|N-zotP+nk=#Uiq1*q2{v=2a@w|2905VIXd0Q~%G$P9& zg A|Hg{*<{?2OV2l>%;*@_ryE=n%pMaNxEC$c{M|D+ z%J>SX=Tv(Aqt|0V8-`qZYdb%K#V$~;6lMh^pX%dsRO6Ug8TGZUlPX@rBpW`;Q;%Db zp!sl!IgT=u^B=Xz5+XmEuoCp1zs }u) z*~)M~F+7b=hd;~fqEP&d_p+_PNr8r`tKIo=l<9&o-lUe5a-D^v6nt{G7@D4}#ycI& zU$z@QQ~VRkv4Qq= T93&EsvbWHtbB95*&DkAnnjrF zv-NjRmO(d*JvFPnRTaW=sDw~nEl$R{p-8j>dn<4WP}XAy-&@pS3uE7jrgTt_tSEVo z3qN3GO1_DcM)qa0SOCW3UF_ti%?*qG!x?w6le3mO>GQCh3YU>#hXzR$V#}cUh8 ?P`Hyv_2H3VQ0n$2ul&bG| zT7~8LMUTM#7_(XJdrm?n(ahV)C{1gl?Vn#ofFY3aDvaD5x3C#gLfRscMje&5z(C*J zc@@lcZ{@6>%SnToh!`c8LGvNb-CmIghd{li)go_4*X|)&c4pgZHElrix}?XA;+?Ir zp-5KMyF=QkQf)@7IFI1~BKHr_CDMX#37Il=SWL$whEQ>zi&tE0GP&%^$WHD+UN00A zE1!n*9MJEQkPQ$(>rbfnU_RCxw+6`1r2$l0nxrhvj~m7Xs#J6 zglQw;XO}v5zU+)xj$ymg>>GK7;x$fFQY-I;b>A$s;<2EV(KV3HXc*|h z{-STYixg1cSCu}qlOX4@p_eZ_cJ6+?ldzZX(vUA?!Pk|7)pWJ) L zoCdkF%FTE#p11vgU9dC$Xq|IZApNQ4>8|kfXU$AI(dE2n+AK9l1rizIn {kG`Qf4Lj;tX?+S z+`Chpa#QSMX@?Lf2S1^S;?RqitcpMW41P_!$K@f2b6RfDW+8nM$--S~iWz;w86N%f z@`RRrFqfIFyP|>9Og)v(XG|~YycebK@14c3*WGGthT<#Fe7J|nLDKw)6F5?`vXOxh z#5O2nd{_8XmIG~|0wXn-2I8qZAEGiqceC fKgOg=GT!V7Z%?>5$KcE@=f9pP<`gbsCh9ZCJ%{DWynGwf)LxM4c8cm- zu+q^&(aS%VA!1g;e!*GVNQXH|d*q&S`n{9D9M(L}zB;$H!QKs-jS+1?4;ssju WMtbPxohBFj+B5-bc76M?aS<=>wgi+ueL2))t6` z5Xp+%h zU1a&knyL<^HB2FhI}|PM4=Zf-^=0I%@ws=@wWz_;(i~a_4qQd
0(cW)vpX @1Z9Y$w5BeYXk6bpULnZGY6Bjz!-67$5k8>c1 zLw?s-409@^osYsFd7~wTL~Wz{_q#q*?CwQ})I0V@AXkDL;1LjLMJSuOF;Uv!^Xp-= z25D(g3SP{amFekYxXbO%qqtmrFd$yZ5oSi%s5nrS_(C!eh@I2f6iMvh(rhQ&5{ s_Au-S`pJ72I_XT_XE*c?sFE0aajH)RdV!K=Fv)d`R`Ibq` zH%W&)P!yO!{N~^c-AVFJLe%3(j$(|7Xv)p5-sPWFVt_A?0&@sYQKX@mzL=I*yL9IO z2u}=>9Cl)_mYBX_53Iv{j}jy| O1G-v~ZQ}lmw&oGW}~~NITn! zV%12MBkkT7FdcHtks9jJCnh{8F*K~l2JadAd6Ix}GM^jIzd>JyDK)6XpQv&SnSZib zn35(tK{!J3lcPQXO+APT{{&$-u;RmbdI<#%_P4;dS0^%Om38~}DJr!yzI$W5bil*| zXQo$K$Ja;j4YcVo1&nP_gVdd&Y;N9MZ|;GRX(jLPUj%-qFmsI4NRm;} i;-}wx zl**9mID_CW(=%%>&HoDgJjWpegGCySLu7SU17J8Lf5|cP1!HN)2{G%N40=G86+Jf% z8__wh5rV3DudnBZ9-M{^NA~A$b}v sfmQ{sc0QndEFD=3$#e*ZfjWkd)*C0XinZHg zmkV0P3eVanEKF{{YZt$&N8mv>03Ob&{a2Aq#F)Y{=%JxJ=0aQnQxHcj*@}we{wbDE zIO7IUQ HUEqjn`BV&~ z3&Z;c1_qlX7tq f#q~vNoNr*e6RfFq_Rn z66mm-e~edBa|DJykG96ppQeJl_8n857wL!Tx!{spL85-KH-3-B3V$@YXm9Z }NEOyqFCXpCyD{D|UrkRfdrIkHAb*sx z{@N@;@r X%P|!mR3urWI^coXMx;=oViiV@phA-BOH}mhAc#| zpXz&eDr$u;w}QeW-U8GIInkF1Ex*l}jPURLUz#gdb`@Ft^jE(Jdl$B+G(C88 ne7&8$7fAdbqWNL1(UhKh>hDC)pFY@?;Q$##xxtt2mG9)E#y_JI6HLUn zeD2A4HkYJDv^ilb3z-< pTG7`mp)6C3W&tFJs6F30{q9QKtdFz5*#>~tN-%R#a{Kdbmmhr9+ zuc#opm2t`}F>8eRmxQYX4GVx=?R_8BXeo|uYVvy!Iu7PxpGksdy7##6BmR&FaVTp0k7v--YXr@+_&?f&c6uhFF` zQ$Jzd?f#}YY9X^Rkh~Inq}wB6ktU+vQTo{39mQ2k3E|KLDZU9^zbz25wW4=i-hmCG zL!P0mdApb0JGTE-D5m2bs773-p}O0gj5>TnX-R8^*`Gty)*H1ND=UA(iMR14ZTp-x zIHz69Y^F@1Y&x(EXPE4AL1V3kLSe`A7#^|k-}3@$nv2~UHN=kbu{=`TkImVptC_iH z!&@~w2f?pZ`&05 1Ci`_hV=QuLR*;SaCOduR~q|3W+ zMc?Nq*{2*XqfH~R0}2;drR~N!O_09CJitsoTc4}7*G=KAZv8c|HiXkf@nAcn=y59x zvz`3|Hwj2rD-tk+pe?K3W~^pyy6Gc$1%f Jfw zeDh=It%h^(z-2P8yFCOF8|E4n1Ts~N|KD8@jqT_bezKGo18`VQ@Pku10NhNf%+H<( zEQ?cVfs)?&$PznmLQ riVL*~3L+eZ2 z4LIueTCPVM838_eAlG%GAC+!K3x-lxu5`C{>92<80vc!^C3P8(t}8KmD;U1NK0+uU zaT&K5$O{Y`^30b4evIhOnOuDV>Qm_X0=Hw9Bb(f#NJiZ5YRn)41X1g@?LG(%^cRAp z`s?@alv&c~aPm-`pQ EHhUheZOzq*g6)Y*@604l zp~br7x0uCSJ3GgvdH&tC@flTtXI13p-!#1~U6Uh48;uVaOY9SzR>?&^?X0h_-=MZU zGAq^a(1IHrQRwR3z2gM-#M|oXs2%Y$xHT2ic5&CuAT_qJZKtkGv(1EV-iz^r#R51A z)pOmXq@gwZ??Cqe+3m;A)>HLa8b7t_bwC5TiA8Qoy1+K6xn%V6)TxLx5k13f$}1fo zPT(v`_GfMhzJ%kSKrdCDX+tQ#Jcy#=%ee1GTX5bE*)zl#5$0NZjxNl%`(nUIBGt+T zU)s_gJ ^!bn_f9ch39`#4G+7Q&IHV OfNsjHmdNyC@i V>xf~kbz2m+Y=3>8)PzR?(Hnt~+htYfIRfsMg zUH)-CIfSDJWK5mY6FpqQ{;yxUr_Jc=oeFkFpXvJ*Wlx$qvfLtXtkkhoQExnYQcF9` zwM82kc)CN9ZQAHs0128!+k&tOW?myuO4Y_XKg>q9G!*Igi?&$sEp!QPCgqBpQ_*T% zy7aHrrFOHHASaY#IEgB{pDZ+AL+a7h-9(*#UBi`U#R--l|2-oK23vIJe+C^YMdg2P z-2dMsWBAX8L+Fq*J}-^+_4D)l_c$$iF6twkh?$-?_Dhrd*NcpfUMFscQ_KL`>FJ+C zS>E{iEE$=DJ3RFB@v%@;gJD{6euqB tq)qaLS2FcLa z7#_Ir%07{f#-9!Qs#A#GPZS?{(y4hi`&EutBIzT0Qfw*p2x+LYvNDDV9#;~K#I_01 zHw~kO81UxM4KvWKA%sLEK;X@{;~8l!!WOgxiZSHP7*SD-3R&=w6Hpu@k>CGwJb&%( z(xqhYF#T&4o`&plComLrQf6s$8sQDVzH`%8z?b|KN=6EPrSdMda`V=I2`t`JsK0Un zrzf9>h9vm;QRwE6Z@SO*JY+s?A?{<5==-06D(s>13wi*GL9djkOMcbcWOS^!JQ@4% zMDc1dKs4&YQa7wWcvGFb;f9v>_QH`%X9#%;?3zh$Ykl;3g}+rP@P2c N!3> zR#j2)Mr+i{dG9FUQz1Inkcjk`FAWV1JG*$w!YM;ZsL#K9a{T_}NxwnSaIP8!;xbrl zomRjI_|6|dGXVJa`^V(a*RSWbJKEdFl-1SMgONPk Eu+ zr>E!Br%wxMa+eLco1p|lIO(6Oj&A~MLn5eGhq78xQFOfI5DgIIrNLVVnJ_4j%^Jp? z>`j_Mbf|(_2A*I5{vmg?8HCd?l5H~{co#P5Y|f`dEqJcX+K(TO7>X=5G1_yuLw0sn z{gMZNLB@k93`m?Np?Mq%{+ON_*_u~iQ#)q$=Vsl})*X$UZ2bRd`}1(9+dq69zLV_B z3`4RTWJFogLX>4JNo6cWi?UQ`RTNr;!4N`Zxw9)vibSgxyQB~bC3{H}l0^8OZ{45o z^Uw2qpFf`C>FAG+FlMgzb-kAJb)M&iqkx>^;pK&Icpw{gCI{O3m%>kp%|(k$%MG<) z9n4 jZ?>lDs;8F2i2vEbalNsIz4<5w) zzFePAlnaDsUARsxef@gc)aV!tS+2}^M1mJIGYODpC!}ta?S9i=vQZ$7bUwb1N$1dd zK VSfaj6SCJ1O;#guIOcYZb%r!+Cm zyMbsD=0vI3V$ih_ydPu64fBQYPYsJIV{=6D3!jsqBM1@jf+D;D=n;_qq@<(rfWWQz z-o1}7@W902z;@&SjJO^=eAwRBmXIX=bZ+y)CyG5HW<2Xau08AijcR@^ c3GNIE+{$7ZR2RVaJa zf2na|6Evo46IR%+AgdM1stQ~;j6RVO?fdH0D@5d#)MuAu8Rg}lS8GUyNO^(Q-XmzS zPD6un#*`@Gu}QGiY(v1d`E%l4g5+v)o!TxCT3G?3&wLXaU%Ytn{{8O9o>;|<{#Wnb ztxNe4$!E{q#)>eJ#d=MSk2}d`(RouFvb?^B7zA=4 5u}=%iBrG^(P3as|hwc zVr;SxCO29seku#0brro}bG)+ka?qciKYxznRb*op${seH!%yY!{h=HaE2L;XI1wG< zI}{JThy6cH9PHkKo7?e=B{q^U#w@{j0^{wg+n-&SC1&9Lhkm!z)tT=glU325i(l|C z3+ &-Mqv6j*4hK*DKlnSn(Nk?w(7XGawq~|fQowOdnMq^ z!?7MGPsVgYyq7>f?+daiml9glS76*0zqCyy?4dZy(TvVde=QhX?>DDAF6|!J;oOdF z^3 Nw~z#i&SLV0zHO*^;!E@4#p$J= znZEsm*b;Qg+sUnnDdi0^as-WrkbPsL00L|LjJFHz7E<eP^e=ri?wm ze>{&R!55%rZ-A{BfRZ~qP~`kwol@|=6boX@LjQ*a@Ud%C21mU?i7ZiKOG!@N>vBa_ z&*=~50qa~F_22LNoNLa{98bzPMbYWY@nERHKLOD3vDQ41^1NHOM$me%JN6-gAh8kA z=LIhif^zjWYtRy>Z)+e%w*@1)eP|oJ^KlS%4Zep)8_q)*4qKW>q7>L!vvaW{mdkSB z%Kb1Oj0!=+#D9aY?*`pJU)TwIaN{MxG{K&NbmLQZ_eGHf2}JBL@kyvCqoNhH#=6Mq zBON7Q;k+|^3UvSu4I;yfY%n2PIm$uCPe@4EAB^2aVA1|$21&}Bu$Do>Vf=Fq6fWjV z!`C*)ojkz6KvaNEX@Tp{7 ` zKu)Ejz1^)qISG-czX5hOzP`Rg^`HA+T%j4F-YG!1!ysW6Dh}*%ltbZW%EUvbE!#}@ zS1;OqG9) ?e*Ao=p6}n)SbSSAu#J^{1o`a#eIR8I 7l4`$ELEWc60YQSlI^zh*tw>OpT?LGvq%83fb;kD_u7 &yga_}ZnEa(hr5R^ zv-aTF^grB9Cma4g23C37I{yYc(Apk*ei7<%MbtAglUREsA=iz4-+R0Vu&*Vh5(59^ zyxd34dW>oT9BY(0f^NdC#y)CcY)g2$?*QwV;*r&uo|=;V)QSNHIKcZ>F`om+yxH{% zf)APXC-$TCQ`wPkSL{j-pvD|RE??-qc!EFefZM_xvI(lf96gj$8cvlgoS4sOn-!M8 zED3rf+WTZ3(&t9QH5wWQ>)yyFmA9RPOU<7@zgLS_VwkX_W*D-q$+;s4q^{%Bzkd(Z zM)zUw1BEDC{tY!hbDfD%#jf3EbcvmRp8b3R hIkZzhBS60N%=!cw=DR}wL9gU4%D5xrx_DI