From 62135e210dea859e8826656645d676c1b902b9d6 Mon Sep 17 00:00:00 2001 From: reflect <2946843254lw@gmail.com> Date: Fri, 21 Aug 2026 22:48:18 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=20DSH=201.0.14?= =?UTF-8?q?=20=E9=9B=B6=E5=A4=8D=E5=88=B6=E5=AF=BC=E5=85=A5=E4=B8=8E?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E6=B8=85=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/tray/session-host.mjs | 74 ++- .../dsh-background-bar/design-spec.md | 9 + .../dsh-background-bar/direction-approved.md | 6 + .../direction-c-media-ledger.html | 4 + .../direction-c-media-ledger.png | Bin 0 -> 115221 bytes integrations/deepseek-harness/README.zh-CN.md | 4 +- integrations/deepseek-harness/agent.mjs | 219 +++++++- .../deepseek-harness/bin/beauticode-dsh | 222 +------- integrations/deepseek-harness/cli.js | 293 ++++++++-- integrations/deepseek-harness/client.js | 106 +++- integrations/deepseek-harness/console.js | 383 ++++++++++--- .../deepseek-harness/control-client.mjs | 83 ++- .../deepseek-harness/cordis.patch.yml | 2 +- .../deepseek-harness/gallery-host.mjs | 253 +++++++++ integrations/deepseek-harness/gallery.js | 178 ++++++ integrations/deepseek-harness/index.mjs | 64 ++- integrations/deepseek-harness/package.json | 7 +- .../deepseek-harness/skin-center.json | 3 + .../deepseek-harness/test/agent.test.mjs | 71 ++- .../deepseek-harness/test/pack.test.mjs | 2 +- .../deepseek-harness/test/plugin.test.mjs | 77 +++ .../deepseek-harness/test/ui-host.test.mjs | 435 ++++++++++++++- integrations/deepseek-harness/ui-host.mjs | 507 +++++++++++++++++- packages/adapter-codex/src/session.ts | 26 +- packages/adapter-dsh/src/bridge.ts | 11 +- packages/adapter-dsh/src/session.ts | 87 ++- packages/adapter-dsh/test/adapter.test.js | 96 +++- packages/core/src/apply-transaction.ts | 161 ++++-- packages/core/src/background-store.ts | 308 +++++++---- packages/core/src/index.ts | 1 + packages/core/src/media-server.ts | 85 ++- packages/core/src/media-source.ts | 42 ++ packages/core/src/media-validation.ts | 51 +- packages/core/src/types.ts | 35 +- packages/core/test/background-store.test.js | 137 ++++- packages/core/test/media-server.test.js | 61 +++ scripts/beauticode.mjs | 7 +- scripts/pack-dsh-plugin.mjs | 3 + 38 files changed, 3503 insertions(+), 610 deletions(-) create mode 100644 design-demos/dsh-background-bar/design-spec.md create mode 100644 design-demos/dsh-background-bar/direction-approved.md create mode 100644 design-demos/dsh-background-bar/direction-c-media-ledger.html create mode 100644 design-demos/dsh-background-bar/direction-c-media-ledger.png create mode 100644 integrations/deepseek-harness/gallery-host.mjs create mode 100644 integrations/deepseek-harness/gallery.js create mode 100644 integrations/deepseek-harness/skin-center.json create mode 100644 packages/core/src/media-source.ts diff --git a/apps/tray/session-host.mjs b/apps/tray/session-host.mjs index e7bb49b..aac2f3c 100644 --- a/apps/tray/session-host.mjs +++ b/apps/tray/session-host.mjs @@ -9,10 +9,11 @@ * Protocol (JSON): * GET /health * GET /status - * POST /apply/image { "imagePath": "..." } - * POST /apply/video { "videoPath": "...", "imagePath"?: "...", "startAt"?: number } + * POST /apply/image { "imagePath": "...", "source"?: "managed"|"local" } + * POST /apply/video { "videoPath": "...", "imagePath"?: "...", "source"?: "managed"|"local", "startAt"?: number } * POST /apply/clear {} * POST /reapply {} // republish active background into live sessions + * POST /theme/apply { "name": "...", "input": ApplyInput } * POST /theme/save { "name": "..." } // keep current image/video * GET /theme/list * POST /theme/use { "id": "..." } @@ -51,6 +52,54 @@ function argValue(name) { return value && !value.startsWith("--") ? value : null; } +function parseImportMode(value) { + if (value == null) return undefined; + if (value === "managed" || value === "local") return value; + throw new Error("source 必须是 managed 或 local。"); +} + +function parseThemeApplyInput(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error("input 必须是图片或视频导入参数。"); + } + if (value.type === "image") { + if (typeof value.imagePath !== "string" || !value.imagePath) { + throw new Error("图片主题必须提供 imagePath。"); + } + const input = { + type: "image", + imagePath: path.resolve(value.imagePath), + source: parseImportMode(value.source), + }; + if (value.effects && typeof value.effects === "object") { + input.effects = value.effects; + } + return input; + } + if (value.type === "video") { + if (typeof value.videoPath !== "string" || !value.videoPath) { + throw new Error("视频主题必须提供 videoPath。"); + } + const input = { + type: "video", + videoPath: path.resolve(value.videoPath), + source: parseImportMode(value.source), + }; + if (typeof value.imagePath === "string" && value.imagePath) { + input.imagePath = path.resolve(value.imagePath); + } + if (value.startAt != null) { + const startAt = Number(value.startAt); + if (!Number.isFinite(startAt) || startAt < 0) { + throw new Error("startAt 必须是非负数字(秒)。"); + } + input.startAt = startAt; + } + return input; + } + throw new Error("input.type 必须是 image 或 video。"); +} + const hostKind = argValue("--host") ?? "codex"; if (hostKind !== "codex" && hostKind !== "dsh") { console.error("--host 必须是 codex 或 dsh。"); @@ -312,6 +361,7 @@ const server = http.createServer( type: "image", imagePath: path.resolve(body.imagePath), }; + imageInput.source = parseImportMode(body.source); if (body.effects && typeof body.effects === "object") { imageInput.effects = body.effects; } @@ -332,6 +382,7 @@ const server = http.createServer( type: "video", videoPath: path.resolve(body.videoPath), }; + videoInput.source = parseImportMode(body.source); if (typeof body.imagePath === "string" && body.imagePath) { videoInput.imagePath = path.resolve(body.imagePath); } @@ -357,6 +408,25 @@ const server = http.createServer( send(res, result.ok ? 200 : 422, result); return; } + if (req.method === "POST" && url === "/theme/apply") { + const body = await readBody(req); + if (typeof body.name !== "string" || !body.name.trim()) { + send(res, 400, { ok: false, error: "必须提供主题名称。" }); + return; + } + if (typeof session.applyAndSaveTheme !== "function") { + send(res, 501, { ok: false, error: "当前会话不支持应用并保存主题。" }); + return; + } + const input = parseThemeApplyInput(body.input); + const result = await session.applyAndSaveTheme(input, body.name.trim()); + send( + res, + result.ok ? 200 : 422, + result.ok ? { ...result, theme: publicTheme(result.theme) } : result, + ); + return; + } if (req.method === "POST" && url === "/theme/save") { const body = await readBody(req); if (typeof body.name !== "string" || !body.name.trim()) { diff --git a/design-demos/dsh-background-bar/design-spec.md b/design-demos/dsh-background-bar/design-spec.md new file mode 100644 index 0000000..a3a1526 --- /dev/null +++ b/design-demos/dsh-background-bar/design-spec.md @@ -0,0 +1,9 @@ +# DSH 背景栏视觉方向说明 + +本次不是重做 DSH,也不是把背景功能扩张成独立的素材管理器。目标是让侧边栏里的「背景」入口更像一个稳定、可信、长期使用的本地工具:用户能在几秒内完成图片导入、视频导入、声音控制、清除背景和已保存主题切换;正在处理时知道系统在做什么;发生错误或超时时按钮一定恢复;同时不把绝对路径、技术协议或多余统计暴露给普通用户。背景栏仍然依附 DSH 左侧栏,不能抢过会话、模型和输入区的主层级。 + +受众是主要在 Windows 本机使用 DSH 的用户。观看距离约为普通笔记本 60–90 厘米,面板宽度应控制在 224–272 像素,正文不低于 13 像素,辅助标签不低于 11 像素。视觉温度需要冷静、可靠、轻微有人味,避免常见 AI 产品的紫蓝渐变、发光描边、Bento 卡片堆叠、每个动作都配一个装饰图标,以及过度圆润的胶囊按钮。颜色从真实「画窗」背景里的雨蓝、雾灰和 DSH 现有深色侧栏采样,收敛为一组中性灰阶加一个低饱和蓝;错误只在发生时使用克制的红色。字体沿用 DSH 系统字体,不额外下载字体。 + +内容结构固定为四层:第一层是当前背景和来源状态;第二层是最常用的图片、视频导入;第三层是声音、清除、皮肤中心等次级操作;第四层是已保存主题。主题列表只使用现有名称、媒体类型、来源类型和选中状态,不新增缩略图接口,不把本地路径送到网页。忙碌状态必须局部化:当前操作显示进度文本,其余按钮暂时不可用,但面板仍可关闭;45 秒客户端上限后恢复交互并说明原背景保持不变。原生文件选择器是用户控制的系统窗口,不套用该操作超时。 + +三个方向共享以上功能,但构图互异。方向 A 用包豪斯式规则线和编号建立明确秩序,强调“工具盒”;方向 B 最大程度融入 DSH 本体,把状态和动作做成低噪声的原生侧栏;方向 C 借鉴纸质媒体清单,把导入动作和已保存主题放在一条连续的纵向轨道里,强调主题切换效率。三版都不依赖新增后端能力,选定后只改 `console.js` 的结构和样式,不动 local 导入、事务或媒体服务协议。 diff --git a/design-demos/dsh-background-bar/direction-approved.md b/design-demos/dsh-background-bar/direction-approved.md new file mode 100644 index 0000000..dc8f820 --- /dev/null +++ b/design-demos/dsh-background-bar/direction-approved.md @@ -0,0 +1,6 @@ +# DSH 背景栏方向确认 + +- 已评审:A「网格工具盒」、B「原生侧栏」、C「媒体清单」 +- 最终设计:`direction-c-media-ledger.html`、`direction-c-media-ledger.png` +- 用户选择原话:`C吧` +- 结论:正式背景栏采用 C「媒体清单」方向;保持现有 DSH 侧栏位置、local 零复制导入、主题切换和超时恢复语义。 diff --git a/design-demos/dsh-background-bar/direction-c-media-ledger.html b/design-demos/dsh-background-bar/direction-c-media-ledger.html new file mode 100644 index 0000000..6843793 --- /dev/null +++ b/design-demos/dsh-background-bar/direction-c-media-ledger.html @@ -0,0 +1,4 @@ + +
^0o`lj{LCfdwT~le>1Pt`5i1U_^JLH6sb_$hN=(h|E%MAR)G2rA5Oxq{8hbT zI>RJ07y84lUFNpNvv9g`*1ePXZI#rDIF`oeEWi;Sa*$TbO}}iu)@#2{!UZenrY6S<0xXHE{=j`tC*kwo%hPV1U$-U@`LN~p zYB`FYK?d1c`4@Ui8Oj^rr3<3voX|G;;g0_HNSq~LH=EG66CMR~YdeLy(Be;Btm1y_ zb0dsj%m*5scSO)JuXtBsFIIScLpZ@FIkSem6;5OaZOjXJCN5tUfL(0W9URW}OcF>= zV22+B)4xWB$U=&xsKsXagCtHUv$xD~mAUA?dDT+|-%WvfZV2lel0`1F;=J7_conJ` zRyr@^2<9}RFw_Xe61=qR7kz`Jg;sS+xlF2;o}#xhQiB(<-~LT?hF~c2AKK5>wO231 z7gYQvmSZcu*J3k9x3$*^ucy;pM4I7gG#t?0epfz?;A(c4nC9g`z=CloGRHPi>L)^l zI{yH=UjG2Z{{SG9eWirknB42n*HqWb{{ZCm38}N?dhLggdqx%v2oJqt98QCBUG>(A zPa%e#Po~YjJL&Zu*ySq5;)tNB8zHp5q3>}Agjhe^K8t&xIR1HVy>q!nf2^TR{C9uK z`|UqKHb2-bg~qPAGlkUX)* @9#$*}iUbqE=RaF^c^0QvCdi4L2AeF1i zW(j8g=JsT0{6}NIyXkz(m3fAIc sfQX1GYsN~R{mtL2|3R~L_a8xQ_XGkBBG|26k%zvR3286&-USEj;GHn2ia z5)D-!%I@o7SA-p#hm@9+Ejh+l3A@kUrta!8$Uil&2D;|I5rn%k_`qwM`Cv9gM~ki1 z_5w>h{{Y6Km8KG*bNysQtA8R}L=l6QMwNpTXrJ@HR;ZHp3Yc0-QWhd#NnPd#Pi#0% zzzmO0dQJfn3+jJI<=LDp_uTWTBN%&BUiIC$iXchyx+;IOw)M>n2zzC#B6RH1z^B-} zb;5huK4q|r9(O9g@#BbixEpVvV+oZE%Bw?&^1_f8i_6!5m4*mY$4cTmy}mP&55QNo zns2hu*e05lCMH! G}37S1`CSPmB iq#lArOP^U^%U0U4^~DgWBvNji;+*` Yz1W2x;=W5{GrD~~D}8uzFAaTiU@Ow?yf7#C_rc|Au`Ud-e>9V9*1xT=`C zs3SBsRhuDWA6Zp_XDB8@g0g5d98R^w^CK2FV7AJ4?6db%eVqzak;T--B}}7`@{cCU zC|I-v*nJqmb%kU+S7~zeOEY7!%*sT45ZsW6_B$&U5USng-H^XvtgBUAE&i!`AeOo2 zZspE}--n42T10b_7`VH^mGAbajOovb4(v-<$h?lDVYVy+ZVgb|)y9)e8kMUwED-Nv zv`TWD-vdtgJEhbnm}c5G{l;7aSB6aoz)cN^lcdD;d6sZsiUfGm{ZD%;#fTx5DdY|q zOb!!JCv?0RMLuEIZ9yytK9e93C`<0>Kp6+n-TPV)4b~hG^ukaB;AK?KVBv+OOWhQj zgtW3PMVlrO6W|jHWvb}YvTfVDD=WW!{Aq`j6bZG?Y&QsXjH9d&Vm#p&Lq^w>`iaJK zZhWFBC$&Tz oXP^Xe=2urems>lPclqM^7G<0SzNjgro?^9$`eEU^Fr3TyQjt zDXc+ONeyb>C#M93B1A|HSU-$;CSMe6JMci8$Ly^9C!-zmd*>G*Sm}9GM33PymRLRk zfRs=pNUS813jumZY$t)>1jQ;Q9T$re_okedwq}6gViAC_Rfkj~kzO96R}-9O>9O;e zdO~Ca>BaEJ=_hynyN>=_6J2B3-hR!iN VT6bn)f7h9WufpKn5W0aH(FsdV+@COkou##hPguEXYYFd0#6lx zMt3=iJ@%^Q*RZ;{G6=<;bWb|u9gTI_827>G_-615CJCiju?uq~ zAZLUv;+3d W(42oMtJ-wDCTbqsNt*^P?!Yr*%^es^8ee7;_D6a*gXpv3pj$hW4DU zFhlUlGJrhT&Jz^AcevUtIPj8V?Pe_9GUZ)QlQ?*BQznittPhylLUT4&R>->62*CrJ zCLq4hspeB<%lUo;ID82<6#pA#=d!_!(VLFTs&bEXC;VwSI?!pVAxDnG2f+p2?OwT; zdRqg0SQCG7K5oOPVg=nQWVj2~hGBeIiivB+5SQCG{aCghufxg-J@@37+-QJg52exl zf)E`Tul7g?ShVo;n33?`hr3uZ#h#c{HO}J|X-{|Jlr>Y0b?UZ{?m9%kwYT4$&`Jy) zm
* d^Z~ULR8i)vG zr625DqThP*AQeoX2>%#O!knc9{h+8?pIP$JlMBC4u;L<%{2~%971M|omcz{Qqad2* zD*k!7^v4|7P0UaP{E_o_h5e_v`Q9HBV%6pG-s~|^x|Od`yC01*+CNkJHTBPTw_mo^ z$(Jq4325P#^+wo9Zv(DzcWEw012ntje)NtI<)&H;u5%~ypP 7w1$adx8tEW=ZJ!7tnHj2<=(pRGKgCRT+eHr-amKQTV6Ep{GJb&4Myyu6Bg zNqogytn*l>zl!_6>?PGzv3icr+M>)6)&FH*S&r0GgZ_`G*8hLTk5&~G3FB>dDi53b z|A!e37_~#$+xI&g-meP1_&?TPg^uKm;4l7Xru5t5q44hsa`VOUY~h(}(9}P`o4K1N z8T)^LcE{`Q?X^Z) Hfey%>k!<47Oi*Hz7IxC$7z3#bmoR^aK&s6wkHm{-yur$zy_B z2ky(JE#o#nA9P^1t8=P-WeyX{EFUT#Mpsb4+N|bt3{Ph6+GcHNEZMqj+U5*%z--0^ zhpe?+p|rUdcN{GGE(0Y<^*pjvtS#_a+G78J(o(uczd!p{Wp>;7X|FpbZLN)nM&+zp zAzy9_PzUpT%XEuy#lfH9mSwe+O` 17X`hVG69YX$2ICz*8FOW_ z&G4 WpZPQg<&p9_741FpE z_IhA{?RBi^E#&TZGNG#{_9Y0PYiPnsM{umB&oWYShENW>nEv>S-RepWS5Y1*W!S8t zhV?s&OOzwnW}XYqS`k&CJxS^fDmIR+Y{;|kf0Hk$Uax03CHc!kQDsHnVFi?F*Cj?M z7C&p6ek8~bR%0SEnO>0eV%suP$@UBUe@HqDsHXn^jgN*2NJ|Ke#u3sDGNijUN)+i0 zhIFH}FdC%0b99G H1exCR9dfwUK^Iqqw=-s+q zv*0bCnZ7)~G6M^v%-d-MJ12$4PpBzDnhay3kg9#->hSWZ9Ag?xoZ{n^+(H |ZmK-#gN4{vY-xy{z{Hq~Sc#qZ53nuB!iLW ?H!;$yDQXmwYFF%D`Tt2%^HX3ikW4fM(J!ss#hVsG`bnQqmN>T~z|JxH8{LoK*A{ z-J0x&dXP7Wbq72?Pp+N98IPy}pz6Up1(XKH#wc)-;s5SGfGCyVk>RLB1awHflox}G z$f^)mA4OG88h)nW#MQQs-)~WqWzGngNh8i +jBDi3NVr &M#bbC z@3|l)5VY937ALXwlkk{ujzI}`!0$>QTekQGL19icB9x?Eb9e`iVzSPYi2w-N#pt8e zw$}-t;6|JMHa &&2KC)%0;+0$X@%k9py8ZG`Z7CHZ{n7+U_?-`?&?47zDTh!=5 kk@n3n4*XH=sr-s$Q(-V}~h1XWnhu_Du+If!_Qqh_i{VLoLEycWB zKGkr1!=m#?q3ny+B)reUgezQ7k>kc=WVp%3u<>J#W&5272cW9&*<40vTGPQ=qY_si z9sxbpACWZlX2G|%*r2L=wQ-;23d5wR(la@R7lP_aYt{>@HMf7=oj(PFv
!{;Mp+pUba&C)H5pZ7#!ar`mF|S|F>vkhiX@#jLbEH$7PpFPlFS jv9S6f%{tRs#qX>ty|wH50x}9QvZm^BZS+*(EJ6PO@s5GzZT4F^lnX|a ziu6>Rmo}k(VHs#^q>YCSK{v8r $WBr=;T tj3YyzaoxlcHm z%M5WQdENgPS~_bs^{LZd6Z>`Hz<2?&@uKZLjSvItt~Mu#*?#my0B}qSPNnfnEya>) zw1j$qH2SYN>YHY&J`Md1%UfgEzAw15(Bu{EnQ0LXF6slD2^983tJ1K>m (fD`dt#5>{SN$?6+}Gzrpx*)Y={i=Z0m*57faQ zrdB~;g$%j}528=APG8K+_d>@Gh)+@X3i&VoXD!18b7u*xa>b7E#LrrIW+^K?dS~Xo zUj*%LaGHn-&uhTwuXH#kr B*>M_m`fzxn6c!Smd&Om2& 0{Zt1-o^ifV*A+GoH42s8J125kykBl^XF_hKbIezh+IT+eML=HhM1TS(~R5g}lo zC!k+O3|L@EtiHgw!`)~LEnwbEZi=sqa91WSq`}~ZqDV0gAV$a50u3sE77V#GE=l1d z`-7RXgN eiC#} v!L}nCXUbK>y7Y?M zdxuiDRgQ$nYa!cy!sNp4V 5*a+xv7zYB4G%Dw4<1JDJ;b zQzLkQxxFyvquNm7kg zqM5eGg_g&%;+Z;$J4M~|=^lsnfWD(AXm)M-k}l pego~pMIuvyI2Wnlg8eav?M$MI8AzH zCXeF>*ksAx>3l*ynqXUY2~g6kGrBX}+%K^n6_g(!-n5yM#WBy~bxHNHX5) `xKwH?;g6Nwqllqgpe-6ALkZ5gmLsZ2Y@0GR0mNx8mpl71$=H>q$Q z X2#OhgR4>*VJwLXOZEDThDhsKJ~tM z55Jb>=gPL%OLyjzj!KhveEK5i`&axWv4-AiIF4p;6>f;a;b!$Sdsxgz_4ze&<;;C; zr2JdeCSR5?t;(yGmH_>%AdXQ+A{*Jqvq4W*#4H^#!~ZEKBgZIpWXLHxaNG zBDb^GDQZOxJ4Rn5x1hy}fPk20;m3W4Z+4%58Mx`u$*xL6Hl?`FcJ^iq=><} 7R2klWhA;GM9b@+VGWDw0PwXEOyMP-Na5-*$V70BpWi#Vhl zR1rKVT-mc|yVV@D;mD7JQ`fdH ;u*8p+Qn+w->Y%hGT^t_P-=^ z4@j9Jag&}o{LDIeN#^v)aAEje6OJx!$|$y?W!>TY5@QyCv$$5T>T%zvfvSlAm`K~= z{L{fL0&lH%pp72b1(A&>evBmuO4~dsd>Zg`GT$WlulQdX>-42r6V7hk12NXg0$fF! zA>F|b9;ZCk+cHyha;a|jUruS?+b#cbY<~X4qvIv{93iKke`D1nkA5&WyfAHtSUS`n zHKk9mN>nD32S5EesK#ZM>ENEpaCWAsowiF~Dug&|PC5P-oU=D+)0HZBHHKbIedv1Q z7?q_n7y>MpKSC%tU`?=^KN1SwW*hkE?$@*~vUB6q8SJipUc};~XKN}{`)A_A?Vphl zcfof2T`7P`#{7#W=eB&CsXTc*oAcVTreWt(F@I+94O~BeS)|M6S`8^3zr%qJ0d$VtWNc`@fHx{~Zr)b2wj z|Gpki(o0dJ9jAbP&%ck;Bm{C*K7YBJxByBFdag~}U^jXEKI%ly*Ee+YBfr32cc GR1~Cg~j5=v_KFzf})Zi8e$k_oQ6H! z6si^#aM36lV?D=7Fan4P1fmR%fEZe0LB KPp=2@c)3dxzs`nqa~IBHRVbnW>E zZZx&!YyUpQ8ucCi0a%<4vI{RSoi{p%AkAGXT9DTu#a}0xVm{42I9j{LH9+RR!j}a% zSt>ocg<^45^%5vpbpTUlO_jiY$z$;&xqfYQQV45L&!rWlK(j%M+X#E-VvA&pB(!!TAX{~|qm1bF3ms6qIG47R z^EBmVm$_x=Pdva|@fgzDB6D>OM?$}v_}JCvP;Wf>YTciEyUY4a#Zr9?cQsR4<*O|n zkKCp-ij6HB!^cJ#3g)Hg`o_?_vz5K@MY6I7?F?k`keYcs`%y&zJsuI-shP+%sEhIC zSnC&tq^#GGn!gTeKgFaAlEv1%hjXfab(c*za*}L4RDI!2NYuQDyeUM3-}4qcLQbd| zQ9g5}DI$8)SplwUuSPWt+VngzqAzac(xR}oV)?*8TB_ %vA 2`q uY zfI=bk4ed?DP5^4QGpMRbkinbNy9k=JTGT%{(rr+{rpT@5i=rX`d5A%+YeRz#RKXFC zG)b%!S-qe%9#ER_N)xCdmS!;w53Q}LMQDm~M=clzJCX@k>cTa}32?-5s&OLICSh>S z{z(yz)FvHL^%71>?F?E@8})XN&5YsXg9=)2jig&&LSBIPK-}OZfzlv-nFY)nhnVaN zwG=$<@fC8ARxrOpa+rnw&=)1FO@tv(p;6I$PD9;KsrAl;zBIXiI7rBi`Q0Fff5w`p zWEQwQEUd(+{4im-{Ew+J*~f#82}QiiU&n7!WkU=JIZEF!V4O(YKYjQ^WsA4;#WZcY zh5)4Zl0E0?rdIrCCVI%oODvHGy#tq2uvy@$ARHaP>AL{e3Ut5xm@Oe76!IUkX*5GW z^5Rz*6{UcWn>`9-PN7oeX`ydvPImV_HER(>r88`x!Ide(EZ4A%^;UbE%F<07OsIWO zdn}4`96_>*14 384S zRBoop1D^tH!k(*fd*qkbhhM4rM>FD!WERz!XsAvm=B(U{tn_;1KX sr&izt`SR2?$J)pdClSqL`9(!5C-F z`*&I;fqvC<;%jvC28g+)Xnmz~&cP R*|gFyQ_ zXUYh3a0y{V+um332wxXi{ !EE5brqmfb&6?-@0gDIz5sBQ^EpZaL9x z46f1hm}{8){JNj$^Xs;F|9OyV#EZ-!_RDp5Wi|Pe%`f&`Mbaa*kGwA->>>~GjqvD- z=BlFE-ul(5U=iXjzP0r`K>~}ETgBVEA#d?PBChaIkBb*y5c4a*+tBsaxtfyPZyH=7 zy9Gmh)KDDYu6*26$bm(Vr@5`=k#Upah(5`7zVr2|&Ns4QPHpR03qDVP;>#}8UGvJ! zucExZ%SmCIRSPYqqL@%3%^4R yL&eUHohf6-AbynkA=U<<2H*6Rj zeLIvpOhBx;@4b@rDOsf&;LMvhb$JNESlHWHb9SDM9paT>w67#O-Y({CE9qOT$= Pn=iWvGn_R~?<1n6J%1)0kobt4w0UgLX4%6cx5<2U zo7`QCB`l(*Gu6Ajgcb}@s-0=T{90HOEL~X93_A+JfB4SdJdsgjFHaAzzACENGZh>` zHbvw4<2Sgr!03R$$Q?J0qXgs7I#C0_@{$?(KlCj(opXmQ`-Jc-c&@~$F8sVHe>bPw zbP}z4ged&sWn5O=s?pxNDQ-Jbe%icY2Q($$8c(%-y^!ro7AF0S)xR*XH4`zvksBjC z1vj$zE&2~I9@v{3C^^G-($;HqMQfuKaD(-X3B#UzkS_l3xw6=QE9Pjeb9G(kHvi}i z8juNGV1BE3s!)_a&-rgH&GY~N7^NzB<{<9BwT~9wye;41E8?xf90bAcPTsOt9RIhZ zQh%XzOvYlX@&_s(+H;>DRa;qAY?OZU-;##X|CZ!hn&-^^_q2%dzvV|LHdwkG{C@-R zF8#MHi^W)IF+E}0|3*$YS^D3;cN+j(r2he6{~Mz6|HnI8n8~@Qeu>>_ >)H>lE8uo^k?sw1Pd1d04 zcG1x@Xi)cOiGDjt+SuF<(e<0MH_JyGd?L$c1|cDs1zH;qpnaY0$4o28OFqjGa0kz> z<}>9|oi;ldM hDP;6)awLMc}@gA5K&xZ6Nw+}17>do zkYlpzg8|eQ&p#yaAJ|LRbe=jJuXSy?J{X3RdM{!uzD2JqH(#C6R!*=3-p+8wV;F;E z-aucsKy9&Q^SYDMZVKDm+e#7h*X|cWl5cR_h*mrOVFJD+)H6d4PQ3AJuxD{jv*r)| ztbzd O+RzZL?b64kH7%~jNwnT^7`qBd51Jd+lgx8TQjeVE86epd4--$TcD-Frgc zLh0@Uz90!p$YSLTnvTK7S=(qmv_1N304xA#xQpAReCcnLFV83W*{EM| {XQ5 zf4uGPsO1lnW?3k3(w!B?|9$M-5nZ7jeS#ns=b#bNFy_bC_N1O b#tOft<3@wU?6JvOFiKsml(pw@H~mX7}rQi-o-Ud-$$Fg;a#&Mj&v &HRrqI=!_`Pc$76q!F)xsZv!}cFJYg%db`3Co3OFEOOYq~Znqt%4F0h?`HBh-k zO~g@gtlT9z*+EL t^ zhqIcDK6x;gxou$ijMVVuLBFh7^fqs@o7e#90a~!95)4S9ejNBDxTil@$RiKK9mU{0 zcCi_rvwJlOA`G5wNcIc%Lumyt&Y4AV2>FF+f@KbW02|@X9}CF@@ki9rs*Vg=ymEnV zsIePw2lkE62n%7i0yhgmsw%D9(HiH?B7dyYBj(n~ziPuMwu6FawPS|b;I$ddHl;g} zQ239NeGOgkd!EZ0^J==>th+@Q@k8r1O@EU$EDcq%WpE($y?e&}q2XH^x^r4PelAE{ z!C=^wQ-K)wPsZ%KW^-FdN23GDF*=(=ntaM0JMq@PMREK1Kr@Vnm0m?W=luC*T2Ldr z7Drau1z$}H{d%ays-%FUm*u;Lb|_A$=nw;_>b*`M!*0rjNvaHVpIZ^sAL?6RrP)%C z=VF@388Q}+aW|z<+WV%bSz?2S`*0U!l(CB(H3Y^JpIuz2=A};g`-quP39=}N)yo7d zh6z^CZA4MC`=OM$H$DN}JuC!69=n--7gXfrO$*`v;1wGA)mCC2uY7RPW3O5iQ7dBc z3S-83i=FPV%vG5sq*-a$WiYGqxn>X%9bVks}gIWgv)X@Of{ffPVe$cqh;@?5WM zuHaBzoD; -^(Y^i5XCg9fJ7KiFWO*mF@<;FA51R8aV8 zmm(B5Xzawv*~kU?4E|wduj*S+LYv&X;l>kjN;lVnWK~}lECL{)x>JaZ>pOIuc&9ny zelU4{9&^O2)gN*u?{6b!ULvXuTXv0gk<<#Gn3OqqBe+X4HpY2-%Y2%R{M|}SuFhqA zgIYljeyOEv_iHb3s9?cpI$Qp#a*=8!S;h|u?s3@qVlGeD|E&+Ymo@$+_46BR8r6a2 zUtMz-qK!k71wxUnim$aFW-tB&JopFrmjCqd#r@Wo{J%!~zfX4*!e;(3&pxEQ>fugm zzK_$i^mQ_ScR#?cZFPx%>08%$+RO8jp|Yo>Igsg9nU+ko`9q1xeFcBIw2z-YQ-)F5 zJOloGG_xU(el?ds+7Nggk)0mwQ90Rz#mIA9dARw`H%%gP--L=fHg_^@GM8JrS*)t5 z>4;diYY_Pq+?$X-Q(sc>;S03ce=EJ6{#1CzS8}G8a^CV$t6=5o%~A(`)F=s2o`Tm& zAkUF((BoNbJQw)S<3-=wHgkzhOYx%HYwvjSMS7>EZ ;~=aJwxR?%7u2j7VE!g^zqlbjz Dafrat?jJU+KKl_|g_=^C@em6QoM|DPQp9p`n<^4-+GmYmb5RA2*+$AI;vk zY-rY{*IqgKJ9YZSjqSUT&S-> vX0V_yyzbWK86h~~+lHd2)_@j`u%cUiY zS>LA-N6no`2(;H}FyeHoAQiACX&SG54`Er@9tvXp_P)sH{%QGD0`;Zkvq<0J>OmKQ zdAp3CG4*1Z_K#CuNzs0MR3`2BzaWX)=0{j3cXCynr6#KCBu l*mipM>EzMLfuKzi|r|bR!Dt<00@D SNv9=5wsT6DCI+F;yex;K zZBdR_AB$m>v|0VImmN#&2%wk^6B}vqTxs%SnK!o{KkZ~DjuKuzNNv9)37g|p+9Gt= z*YB*ff8Bl-lK1erQn4pF_Gf1istjy+VmiE>EMKit%&AA4HK#Eq2kUZc28hUD;yO+u z^WXT-787R`HT9^2=o517e=%u 8_|1SDvT)%CI@b)U;<0P^s^TcD$k@LdV)+tV({z%4Cg = zkTWHTJ!6(qu_P4mm_AE%6NTZw8p0zKfe%`zch_!9aftP6w@UJ^>p2z&OBJ+A3R lS_C%_~SRJ)lb}|~(0UF}j {haE6ksf|L3`GDX zVXl*^_*ADyz!<4}pU2tv;>x|By2-w`#Q;3%Nsg2IxJOZ&^9oDzReXH$K2)|rv*v8& z>^SsA{{WFBI#L9&RFG28#5@izHU@jAQKiLIxNOOuAteqAVO-m4dD28OK6r*7a{!)bT0tSz18yznok?7xST4R>y4>51L*s zF!{&4PD4sRXnz|m7g(+G8Fr34N@ FG+xFBFNYx7+ws$=INU^~d|d#I&e6STNOQQhntW zcxYpY9>gG)SR4m1(~ttuHpaI%-mUXD>SnAHr9q45sPe*AI@}cP3@|PHRLV0P8Dlit zQgvxVW=XN%univAKbY&7rWlHrnu_tMiO3&m^3V_#>k1o!Az_)6ihEU~IK@KB^XM *e*`YE>ublQa!dY%rp&XmiISTHDCx;t>j+a> z8*x-h)g*f8#~L&u^F9!X(t@P=OW6oQh{rjuJAch5to)d1c4f5kFpmwsDQ%*U9
4Xx3FlLx}90G5n9@wl2dHgheOIwKrw zC@Rr5IL|KSpLf6+!P~4=Gl |(R<29 f7v~4(qdS{B4^lV-oeDkJWwH)ms0O)OXwDo@d;BHSXfvi+ z3*jeD!EHb!{mzugW#|*y4#i `Yg&M9T()A!x&L9Q`*}=4B`NcT!i)w7JATq7?NTos zJ#rjlm6jANOO08Q_+mJGLI=a20u9-G@C;SeN|%(;GnB&rU9FlV5$V8L6(4H*3ud9s z1Bzvl$y$zc-)L=~Az}CZi^W JI(t|Y#`QT=BQMN z7K}>`?2Eq_qGley(VPqj)v%$0;~u6deLb>SpLdaV7$sJPdT+xFOSD|Jygl-Fb%eiE z`$WF`sh9q}hT7y6<+;x+s@{%MNQC& N9`_5PIfbg`JgDFX8FRcuK z4e}4Ry4)wL^}JRWD! muxY$0tUr&T}FmZQ3&XJ z%Ra~cT4FK9h3G9KRWetad76djO~NP>QbrJ>zjlM779?(6V}1tg+(C6VIMpLeSV~P> zW|rPz65>2gj4Kryu7#uTrHk7T$1qzqjF<~k^rXMn48r;3Tx*%l`DeA8OM>YMQE!W1 zexU#|@WH2?(w^}WZQJ|k>8+O|Cf5C(OP<_^3!_9%bt^n2H$Rrz;{G-q>|+y0l4|)B zafBG62Iexo*rziQD^9Olcgsgw;L8Gy=lYTigzr+N!lA*yNY0>zc{7LBYJkKp10iC- zYb@`{raFK@^cg$vS4vxdLhZ1W{%S=E=7!%@1G>I>PoiSK7SiUV0C+Pin@i&Q2Qx#4 zeL30-g4w8a1TZ-vD2(v~Yi6^k4A$bSQeIm)rNWMid6+#h?z3I(2l#686|{^#q(J{* zf!yt}9kimH3VeQA)>?&4vxxw0A=fQ>;kf7at*C`DY0OTMgtHIj)scU|N4>FJ CY^%8AbJYh|AX}OpuC&)O&SUt*0T}sI2suX_q zfOotUm2Qs{dzK<3-=yo=JU<#@GXHpn`UE#VTqAcw&D@5BLKzjyIgLm~80>DQjZ235 zma9B?ii>lsU5y(DI>XOXM}=zS-KfX1&WpII1Ouq#4@v~m4xj)yCqpt1)|O+CweQ;& zcib&KR9&+EQ91l&ZaFrf;@QZJPu=8VGxZIv+ue7)rqrzIPR*Myag3QeNp?ePPHw)h z#fJKizt_6F=hMjl7!S877*vKv7UVQwG>EW37fd*VRYo%rUI@t;BDSWdm?t8{#+!qP zEeAaE l z<^+{hgvLsx&=3P{9Bsnn_TsFh@C6;xop35&!q9YeJTZ{^ZIR(~t3= 8gU !ww-zurVZNNfKVi zWECMuTIWb0q#FDH2C1>TnmhVWdiW}0@q?Kcie`{)3Q=Z0eV7w?jWmR8aN#E;as@EG z${isX6YBsX#px@u?;p{I_06QV;t65XYBTZ&iZbjYes8JD{lP@GYgs7+02i>f2QsxQ z)6~>3yoDI)ej%QHl{eEpby_g=dCPv<#@`QDcZO|^l`sxMV#07y R6E3%WH<@U3i6M#S{_xx$q$@Ziv VFFF%g`Y_T=ARc8?fVsa$On c7XL*2J<`-y_vYgG_(wpE9FFpRO{?S4}3r z`S~8M-wwiJ-@wL1^wK(pFV6l`@1Y UtbJQHXAWFiP+bT ~3ycmK CXvIF>ce@)zgv+* zqj=fF$04{KOi@nZ>WgRn-=qK$qQfdE%m$;l%n@Z=_{^xf{c7^qDf6$;VC&q%TY7 ze!!X4()!obTArXa?81OK(M27ftjaXm1{KHSYTd{V(*8YUtjLO%ugLAef$cTBfVT0L z$y>OQSdOf#o~3|%mvg#}2L l+{Sc{ z>we)rw7)wEn2W)k5W*uC5>@e(R n=i_iE|X z87}6XbzAl;#`~;}f3T1C=xySkhnOF9@%v|LC||*%v+B@=4T*G9!I!PWt}q!&LXz62 zv%gkY+&d(3?-thr<+nj?Gq(`Tgnk NiEzy+`$kgYNr)`u+#fj3cb4A$B!Bn}aZ{{QF>}(*G3auP+_>!W zmt90zNOd5MNeCrc{f7usv})%NA0y!k@jvKNEVi>I#nTsFB5_|m+K7F* XRo6K^G=)kJ^2+Ec*FNQFdRBJnZ^Ch)%+WJ-ahSlX-m On{^PHA!;U<%x@|fd5 zu0Ykpgg?wkj&!;W@sgjhMVfWxJRB@HpWYO&4hQMaDrCRNvgBQS)lt^XfLt3K6HZje zCtdOwemBW8i ?d4HuYj{ z);IT5g0U~?Zt)j|TqRD_*h+L%9p6ti8QA612Tw~DA5uL!=W}}MtK{px(S|qQKpzSA zzZIJbaDDmgO&&Jxp>-Sz%_@dKjTdGxD$2YB6j)KnI!nKpu)tAFajw6Ju*3@c7=nFm zCGMd}_5u?j&K+5*4&_DYztX#BX5GuBd#C&lK>hN&Mqp_Jh~k~{rPE=ra>VpESYrQ^ z=7hne7T6O xHBAM3YhKx?W?VT}?o>_DY@MEn{=s08yW5ca# zfuh~5{AqrmSWmf-|0m_&rzCTxZD`4e$%|%Q5vzxY+7*;-=b2v(NZN3gRNrdutPLGP z^ac+eCO(0LScGwUa(bb&EUI4MWs2(B$Q+q@DFzSha75qzm_KK;Pl=S~=^aKRO`X_v z56D1j8_E;4i A9#dx`sIq&k!E76R}tQ;4gw~ED|WpY |g_qxIUw;^()osnu#*?AUS}N_7DL$GU zQI*!JnWQX7TGWiv& VXSeE2FHeGQb|POs~saV-E7mC4^*6Pd8u7)pn SLNa4Nlwqzpk%|ZM$K$gZzxiZx zrr=e|qX3qVH`%0)hQx$1OTtaF)Lo@Kp7z$+$Y_?7c lj8CRk-fd@+#wmk|{az(O~mK5$cW)peb55##-D}jwDqA>huv5_&_@68PUFj4=?@{ z4i1TsNih^!*=$A=uU%EyXyUx^(6CFR mDy8lQOmnxV6br z1)aRsQ5XCL5f%+o6jY+7Cj{4i+d3v0;!9m6mku-UFVj9ikVbQ-k=hWJorFY2!`Uik zmzYWd!41#JjG;Rft*#0R3(0IIV$@kFFiIV$2DT$!ZGFMmGsdo1vao}U7uzI=S6MY* zgF`=u%6e6KfK9Sooyb2}ACtwc2S&*I9`0(W5W7_LeJ6hATG_q}VmvmDQ^rXoAY2d? zA)}(O$D_?m(ceYe75#1`6!ACk6Pe# zZoq@aV`O(^EWuM8j+$Fu%q+A~@8HfD4j(bMa`4)91;HFlxyiq74_dcbj@G0DNJW`@ zPTjI_2g}o@2G%D8Ip;|0K6Qu}+`q5RDsRCy3{E3b9}_F%es5J6WF*zk-L^U}P%w@z zU8k%S78w-&LwoM=tt2RQc|!T{jYfe7@&XXpZ?C#tBROI!JPERU5XuEfm=m6JVrZq> zA#jLJp2YuMlr{A73*8`jaNBn=?*VMUd9vzEkYXU>GK!aTYzVyVsZft2kJUWF%q;*B z;%QgxW>G+yl(~#24^whb#zteLI7XmLHJV0g)Dh6l^v0B03SGCDtS<_f&HHWCK6#d| z=Qb9gO(L=OnPjb!)lcj|%TCdzO~_*Hi?M(}OhnR$;xv)o;`pABnl=}qbsQ#kNbK(? z(Fwzk@f|{2Kg1<|%-oe8mO1E%@v8Oj$5G`eK(CfqY9hV3@wYW #fL9URVeUeWOrJ z3MLt4ohnrCa*QAd21G|^9U|yfU)ZZ>^sN$4%UxO0;o^-ul=O?on0D2XOG*N~swzz- z#&)@L{g*xfB^XH0Nr|(X+@9k(%ymgL@8w;SYtT=U(YmIK6j1pA+%7Z)K~ZCme;G8p z+~CTR!ynPpT_>B{>*%miKXtQdOvxfzHOl}5X9A1y*5rB3Fx1laeKz?65f7da>aHiU zLlmyz1T$SZX K61Is zeF)QKhedVRQfK-NWy0oKec#9UrbmafaP2Ton(8&(#7ug;8PGuWfrp;VcI_(gywh^h z2^jQh6I(1;Yrb19QllUVq4~TiyR#Z|`)2D(CunVvbQRk-$R6u;3QtK$^&p@qr!EW_ z`mOo5vPJUub2AV9QDk O@6M8*6>g^*Jo zZv UVK zOh!T1i`N(ayQZyLT#bWODPwrS+OTYeCp&ar8kH@z3*4m?78cchVO1eGkj$t-7>+Vn z$Kh3tedA;`hOTi4P3=0_sGZ!=&m(oJvctlGzG8~;7!=RSHL8ekx-%PP4&iPDb{aw# zpcsk;=z@MK6o!aXAuz3?^`Zo_De{ICV&xvVm(?68VJxG%m?8$ND=_L~A4#)PAmUaS zHE~}1+VK0jnR0<`e=)49;eU-=$~w2Q*$M)HSG~$<$Cq&otybU^KtH?okU!ZufB}RB z$#VWS?C%FucLa?AsQk%$!EbXjYiMmcd {)v;zAz}};<_&MLIxB?gIZ)K~nRad~F)FiQ%=X(1QIR^BnEFS;+ zRtvnXieGh?N``;#tVnh|!w3*R+-5e<)`?$rh<`I|-!PBuxJlR;UT;VdiV{B4Q|hbG z2YsJ=>m?R_yW|KgclIfh@q=Sq<*+!3C08gq8XE|WOB3dW(@2T%>eI!oAe@m@CPW!U z1yghMygP~q@yj2!&re}d^y;Aa>+7} luQj zrT|5`#hm1s1vRmT8#eOXVS}{iN8-G(M`y@XGe7)z6}pBvv}j|ncXZfdMxN2JLgU6X zMaOHh);1)AY4@M@<8!Gx!KD@biVR^;ymjl3WJ~1pmUU@s^MENQvKf-FZ+CSL 3efxYfV;?83b8YansM 7_y+wij>FA2gZ2M+@sXD49~@N*#(~DAh6u$?OMb1O?CP?RjE@t~DXT_$*0^ zF2ah9-nZNcOtU}4T87+F0K^ $Wc%V%0CRCLQFnc4l_?Q=SZO<=T@WDF2KQ)M`WGv^5i2z^;QYo z#KLHH3Y{~FSmXHR+>Esz?|_Gj$%(HM)#$4nc|=rTOG4_3xmaFQBG}f$5JHJ6hKa3u zt$86EH%0}zG7l>1dMvpuMm+kSQSc7L(&UE}f}zt!YR(z)e2V qBax4k7w7{pN}Tof+*C_4^Q_D_XZ43 yM5Z;%w*j0xieD)-AXQle2XL;GPuA9-di0 zL6D^|R`T~_+sH1AA}RrJT-LO;S+twRdZP)meMmJXg<=hxPvn}R8PJgYLtUW)4H{$m zyE5=@Ngyu|eGwBwuS^1yx?yjTTYkcg7#&4kc~XQm8FN>))h97?p1PwsgEqfVV%gY( z)JkhZ!iSGx-<@Pm6u3VS*L-C1U2k5DA-f$tY$!jE=AoQq$Q5AN37%IRG5 ~^UM|L z6}mLQ^{Z&n &>pgl^ z_T=rymsBg2n6}embZE{`Wl$WiXopLIJ{Ft9M4ga)n;h2YQ@U)2g)Ym2WVqdS(Yo+w z&h-?`CQhjc-_j2d)ihQ%Gz;Eu>AEqgvOZzd;ovF%I7^C5A`=W{(IGMx (C56+`$GU?9bh8` w+>7dWGrxWhqzELiMV0<{J)9>Wy9ka?lF}t@L?x=bikDZZ1K_WQi z(&cGNPnwD`V85< A09fE z*9Ny+SKgX+`1#AU0meK}atM7zp%EN%B3!91Kv>G}oSjXddS1AG`3+d8;}t4ZSzy^2 z{(G%dfyP>uZl|jD3m{4#$mm;pVj_{Wg&<~$twoK@_7X)~fAsPv0i`22>}|J_-v?Kg zOJ>y+)ifmC2svJ@T<1hKl{WePxy@@wG1)tkSrVKRJ}pqMTztO2u-fD6QjzUZ{1mru zO_YAWn?WJi{Em3O0slf)6v`x^T^@7dg2@Wp4MMb5g0GHDL)FD@@# zB}^TZ8GhFzA1ZsBpbaw->Xr8u%f0cR4ZrXGMiNcUN%(v6&%e{QKP|pAZE`)`@B))k zwD3y;a9BT01RZYXkIv2D-OKD~1}-H(nS}=j4b?eqnRovDL5d-Ofe?@zsP~_p!8vz* z)p9s9{{q-lJ4f?M!bYib0q!2ZH7U^CY4}r)RJ$+ewde&g&V>wt;#;zFlv^t8VA}(s z3;$0D{;SUl)#oVfrR%kz?jWS$jk!fRr7Hg^uJH9)`O1sKztMj E2kKEtsPnIA_zNy0ZI1C?ME{jIg*)wqOzo@1ldJn6Y8oSr=gk@V-W!f$KeO2K zIdhk`@9t_SFk_6Bl?h1-(exI?06L=|qlaZ|Xso6djW*~c;uQ J>Bn6Jv_- zOJ|qnql7JI7yn0yK?^d4e2!s-V9Uj5LJM4BU$%w6F|S`=iX`Hvf$`9--<`FlA!M@P zFZT>+x6GKCLwo7gc(S)eo}kp=SS-n#n1+(0zx=y @f9t6O}`KzhZ}m{duP)jS^cy)hSw>ZP&w9 E;7f0%oPxoO z+v{Dsm?_cA*q~+TvMjQ%>wv=TZxKt5VWV6W369!JAn>#{6$$k5H2YaQX$0e-gHA5@ zD6@fcEVC_jigWC@6zMtNpW|RgC&*EjvqzIFjHs|?l~ny}xnT;&MZdmDo_T*TflN@w z^2xk6j4-HGz2?w|$ld)iae7M)_?&CQ)r`%;cs;YB`>}&9%%rU z!u{Jsk2XXTa>$-Tq;3MSPM*_%XL)N}-(|P9*ORec1^w{n8BWpPR=@iAk6}hC`dDUc ztB-^MD3Rv<58E5xOuy2`9UTQLXxB42d|iA2$bC%KMVa)vT(0j)f2=Q O!cRDFR 8h9S zpD(?{L$2_@a&BAmS$5y(qIYhQjTQ2+g6csmQzO(mg^(5M2NW)UeZyv&=r}U=isXJ9 zi%comhtnz2Q`>z47b$ud*gy?EX=vHEqWfjUTfHEXPeBo_V-JUoIYyg*2G`#0c 1hA`^~&z&%hxWt$^^`VE^%xZ2H;aWSz z#q~h@%9J-k&H$SOHGmC7U)`e1rLM$z^3bh)mct%0??$HW!AaQuO 39;5A8}XJOlc3ZVBgKdbS>2?w&q z1d->(8~l%)_8j^kZ|TL~gv?Qqv*G Su?Q^R^rIQmE3+9k{jRMl zJ=~ }_VvfvT(5QFD61v2An#7%U?Ty@?!&M<@`cSto-o|kxIrQyGdt4u--D&M z0~lBA3G00!>#ITcg{Nrz>?haj1cxa$b@-o&_-iL38C7~|;UjMnub|tK4p$yVbvRf> zPG^PQylq+Id3O$s+Bt%)jVVz_r>QK56&*G^($WU`4r#&xO%y$m o{|}$*!&fi;W@H4=~M!5 z5r5xDckAx*gN#Zk%6jS7n 1fozM#D zA%<@XEWII!$^vkvy#W}%3_|v0v>TR1Gd68Y#ef@TDAyH74yC+J^S3z&TGG?7mH0V# zqHP(;J4cST(*qt$2?L%WyechISIJS!iB!)GunadKG35D6#%ifJf+#aBuc?!|YLUcD zPFY!hS cb3Sb-y-gOlh2{8ZGYt>jG;QfOY`cb8?GjFqSAtnZLiZ&w2BUO* z=dVE~`?1IeMl#&E%;;UKRuVb>PU27REP`94m5(NI$x(* &*0wpY zyoZ<*2>rzr;YrFdMP8wOK&?CSO^2l-x>c4O*@lf8O0y=Wv+2_x&me7;r8@Yb)b}jA z25iW++b7?ky(6R9Ycs<8hWz*xNxZc@zxlp+^cyo(OZt)dgK<_Rr?yS?W6_(_nxm+* zQhzt6zdfPf)BRRHh`d^!E&rw h~7DAN}f`PGQd}kUBM
oKquHr32dzu+*s%yYZy7*{u3lm*v^v~*SKD#spy>>4q zcR##|jo~|dBXdNJGU4e>+W|)8T>b}87Uq?FrsCpJZF44kD8#M#?Q^G_o^EIA=uBM* z5&8XS=7-bFns(k}5}4S)9}_9(k{|aIH&>`q-tqz0V>$(}V=SF*@~4b;`Qj+X39V2t zx&-0% o>z^NuH8?s*M8dEQ7^UpRBHR!;6&L`Q+RY9mlIN=2Y9WQeM4aupQ-cW z_*&{H(ABK*dOEML-kdxV4@zvFD~`(mzMol7usjE`TM~ `&x6zvaO4K0%aVx_*w%? z4vqiI(+|F!!>U#cGEq!s<@uKz8(teDc6lFF6HCd6p|wF;`HkTiY>?e4j81{t=h}=* z{5fT}F*1p!58UD#R2|*Ntw>hy`S5W9%$WMG1*)}Xf4J7)HDP>KrEja62&~=roAC4l z&Mqr`_6Rf&CKP4iCm4DpB&D|*GU^R*n2Cl}_|x7BRfLRvt+u_ck8Ll3*tcx91GXaO z+sMhe!__+4AWY8`Fy*k7-_*TSV1~}L*{cA?%^$_;1nZ+q482Z2aBsLiXuOk5U0qhc zJ+r{&?Tw@{$X|SJ8D4rIsr$r>|874PB67l86qi_s@H7z?WdunkOmmf0tt-!$NN#tY z{a$33LukKpu6PPhH+lK~DvgFj+*o k??Mtm)^%W{(3}P(x&}3a zGa`Cy>!w;FmPuojD#5T`upr-A)F|5N(2474@M5g|1%*BVYsMSMKa_GilQ&fi>pP!; z2*r2G39{2t)sIty-m;c<4nGt=LGnX>mxB1MJybNdqi%UAU8PE?pL9f@zYO0g8jr*7 z)YdR+WD%d#g5w>st))B#affZ%F7d1;6nKJbsck0Q?EcWc>=>zoVXNjZGGF$9uPfOW z?hW7IQfl`u#aO0;J)l#Vs1(p6Yf1Y8nMxbwyPq642oneweTclxW=cd2x>z-52jh36 zbg*s=vV+{?a>e?3a{NrL-8; ZTM-_DIdXc lddj49Rcq>>uGp*{ScWZJ zv^jh&29<`KD^#Mzr6L0-3XKGYE%uc;sV=gt5xy1!$7R{&5HEnvN7+AyIAFD1TJa*r z#7PKVQ93J)BaoFy`q<)IkS%QLOH}%DF11bfKm`AgN67K>1rk~2=2Q>Sw&ywDqWNdM z&nt>a2JE0>d=3<=&-oS25!xg9O%RT(N2w|uiWG-c{orv@V0J%dIBRNJC}#L}O%Xx0 zIxd?Gw_!B8qxlKmF_c1Hd+Cp2DM>)Z^A7;`aVpB~N)hXku{VDqb4n zWy#G@mkV&AsSQ8ytn9S_l!REgltQ1or^hcx9dHSVnEhn{cs)(R%qKV-9Hg_^ `4tG?SFUxHc)h2G#Q+h_W|W^C_bLCfs+m@)11`_Cjn)Ra(!Pj1do!N zrG?wg>5PiMXIJV?QX6{M;Ly$?t=e?u5Pm!5T**5t*}`fgKkS%srS@AL&!na}JFg;A zf!M7dC(gotiIv5VyJ}~*;jyI&o@t4=ZC=A#wF|p&I{|oXKg?^Y2hz6qP+|S~>v8(} z&0?SwV-FcJ@!8isn6Bfx>8)g;^38dI0Rz3;P!fRPue$};qd`-c?Nf||7KRI irvVQAL$nW3Fz{sP0*H&htoxiEKWykL_yM}URh&^vJ9PKt$BT{EcjUyzaw;~mB zZLXr(4ot3f2JMae-~%{*dpKEBTn5@H3hR)kWF=V)gK>-A^?b1T$|7a?bmpX`VMZK& zXTN==0akG%=bjw338FT?*^jUkek*Qh3?Rr@3e{^GQfe#oXC!(%Afx#|fcpnP7Tw>F zDD_M;)M!`GqSqGyyL7*GSpK)>dYzcvbfv1S=1m9(7RDN*YaC8Esv9#|3y0yN{L~Qt zu;wTOki^CFklt0`X}yphb7w5!Sq1h<7M!=z!qIa?;Ma8k6R349bun0h8Y WPe(Jfzge%4d`~qGPU<*bNJLvdSDAelTut=e0(N7%73Dc5n>oUpIE2x zqh%b*Qr 3 )nFBH#Zl4`;BJBB UH2Kn~eVsJ~{L_O9*Jl3EXJSuoWjE&>oFDa%9l1oc*rN zU-!LzAZ@#f^ZQ}`=16Zm 4(cnB!Rizd!lE3@DbmIl})__1iv1mw!&u1 zVgEDK?|89@pAvKC1oLy3b<|+;zM_~Rh8-2ev55}COAAzw=0XOsEkXPT#=#RU!Ccem zU%Rf{%P>MHjZa$}J`Bf|;B)<`K!owPjmI5 zJHComYoqe%64umiI7lx(@Bmnb)xIFNBV1$_Q2R8WOTN$k3&&Ir05`62!9W|>2J*GM zsw`Fs j(I zAXOt;2Of@L7^H?!M%?jqJt 4QdSS zt!URea^V e`3%@Xst5(r&_RxLOV6*t+nO&IBu*m P~;$a-0@-|F&xB zr^_62HG?VdHeJ7vRo4F6X9H6t@Fz!>d3{PS3&Ok}lg~uA_8t$+eC=5a3ZJ_0K&nSn zuagmaUcYebWmAN#cXU#{PQI)#`;su)ryl*SbL8t2zwwm9NdtnHvUz $0*UQH`BJx(HxUMPIFxiy$wdb#O-9$o zkX(O;iz0lj+sh9ImS~<#k;AnX+gjZVQZGD-XtxE94a6nT>{5nSa@P5*xq$ z)H}2%#GaWkNB%>%GBF&-Lv7pd;=J-l#nM7$wP^b2uPPy!OR!^vEs7rnZ69u=NP9!B z!%yQ$K9uA*T=6bRi``yh{NWIfEvGHNP$e*BsW`zr6$OQ^0ZBA$ldj}I*Ec1k0|TNp zY;@X#X~r%Aj&Y)E#aKdov9H(%JAiJ^0*wUE$^=f(9pKE({1SVX+6u58tU7|f=m=xq z=6`^TQYJBe#d$1~j3G@@(zW+Q-a4&e6kAWog&?;zZmq>j)-?QUQl>M5ToTxv1Gt3! zY++}bWSc3VkyCHXj1dgsO3 %LpO9@PPbW|raFpJE2#zx98SSsL%CuLm?kEP=nsAffERfh~9 zU~c{6+yc*bbQnIRR!i+Za+dCpujgcOW8~hD>&`IhV`$8(taH5ZCgF(G3Y^b&NKkSC z%`oCol{F8gciXfk+?Ic^l#;wUkw>P+j9JaJsg{}BSF-LfYIvt$2~OgdlHi@KrFv~o zG4e=Q^9$$AyI}#aW0OjaY8q_8>_4Go4x}isle-poPg(eV^1`BEfhrq54(Z(#N7xdo zeVI0PlmQ>~t1jK^o6bU;yimvJA5t^7G`VewWv&6q{>g;NVu~t91`__;1*$rZ;5FC; zQ{vDnlokp~y;ZVdY+9o-$W^B$_BQtAg^_!dW-%#1Bi8j2_wb)t*N|r*vHHr}ScJq= zDhIf$i{F+=mn )f~-z%TbRw*))F~3 z2q`_!m};Iz(e%{*ot-n7-EL^=UuP?y4v&DaqRgzLgyB~SG_UBK;jW#}v;G5oDSL5b z>CQQ4vIZladL8w&t6cfhzKQ)0!OOd){{T(@0Tx$QHt*57s%=`j0Wau~_GP^<^5yl* zQ`VwBqg cx{H-|&E~H+MLo++WVDqY1N7^r> z`h-g~`~FM36E&6RX&a>g1o^zzXxFW9pNa1}*wNvrP3B#j-HHp=VmKv1iU*fPIgcAp zrM>2qr!MqzkscZoH(cNC76SrjuZb_aF1$45X6o`GEOBCn^#7iVZjBmXG-EYErKzGt zqIW%QHhyybD0$wFwDEV-FBzJNtu~vQU&ejvH&d{i-d5-H#83gK1X?WYz3On+eFl*J z%ymCkR|LN-dPcZHWn^A?5OF*Eddx}!v_)^$H9vGpB9J#fDqtTK0kei0;XAmT;_N7e z@^q3s!CRMjJJM35+*!QSY-U4X=uaXQ4O!u`U{NaCmm2Lw(nfg5kJ+PJBI~*w@NpqT zS0eZlV$6qYO^#2orA4Q7b#B}~<~uBtV7RE1v$4Y8i~4dJ4!@!Qpk$%eomP#GU~wBR z;Ww#TkQAZClYctPFr$0|T4yl>Qph9F0dh<*nye1xq(+M_RbXFsPBcCa%J~l*hwh8c zV2{GBsYH)OXvsys2JHsI={slgI*4>kcVc8p@JY9@D%X4F2q6`oxfi;1xl>L>q4GM{ z3$LY4%H3$fx1z3pg>8DSeafu38_mqj`39d(KSsXVSo-vAejs|@p^_zLgv 1rN=Kz+bjU$7D1=$i=j$w0=rrabH^ zi;b#HIkt#*G8U1k9_(4r0YY{wW6p9UpJ~>X#9M_|H%Hv*yYlpxIEAUTmJW#0TDQaW z{9OqYZ5+{++lEzE0M1ApKFY@5T8^%DO#~Lp2c`n0J^*Fn-lc8?#XA3@Y?kyD7GXc; zFJzmY2-1^` #_&E&JO(W)6Xn&1P+7${CCB9$M~^m!PhG z*Fd2YfPR3oh8p~!V{KG&N!3`Regb6tnlj{&kkmWB@dCEU+}0+N?eG4*z~${oE*7DZ zt8i#JAe)aR4qnJi?U!#kP=k*_qpS?1w?@aX=TthSsv^k;7^ra*Z1!}OoG9~cnAyV$ zD>;We;LKOCacPc2uj*F2cRvxI18LtWbB(XOXwmL@WhiDlvJKqF;~{} z%Bh`dLiI^n30k7AFz#{`Id?$bt(dKWTB}D?sid!GK8%zuO9`h?72)O=*B`rm;eJ?d z#N3C>^07gPyIblUv{*Z|55sOM_MM3`zigg1eHds@MGMDAHwT=hL2+bFgGm8((=I`# zS0cs=@NE-ThP 6uL1t^?zlQ`^4K98 Qtag!U<$V z(-nXtmIm*f=Lf>b#Hl?khdVKv 2+wFPT|!X;pzL(g9h}ZkA>|zLo^)HS$;1| zczVwUFSywP*57ivmMdSgcNVL@vnbPsH#uf~$%+ZLr2Q+DCI=WuHyG3sJ5eqKPcCe+ zYl@ll(}tx;=(&=5e$$NrKgd!gCpsyDrqA(qQ{y<~u~n)v|FEau8j|K(`k{=OO}Of& zDx7S`au{XilD)(VYXlnc(y_($El1d88T|`8{C41GUysgQb!5a1ep&|tH 5oC8ia;Szk9SXjmcJ7qSW5|KN7qU|
D2h04U>xh<%rM5YW^9x703rMf8RCo}}^`O{Dp4YMUjHM`AUe5veM< zgjmXgPw8|VlX8$WC5~*lL%fsCEY1%Zl(=l+DjjM%5OY071>5w6MoO3D0nJ^wY% z0oTHi9pCA?)nE?n%;$d;1AB=2ju*4p_=tcQY8VI17+be=C-PX9{Q!Kc_IzTo+qh~V z73x+O;6VO|GcI;F^;Xx)IL57_52Qf#a1`sC!l#NAJ#VSum;XL-*V6VD{Dj=oZkb@~ zQu{84-znVV%}J_}Uve| 0>Lrfc1Z%AiKr3fiyXnrJR3Rd&3X091^v4@P;wnl{ T#t8$ zAyO~<2_E-X6)VVp0JYhECZJc-X$wU=HYDGP;G>0YmqqD4+Nb~LI3T~U87c{o(65ip zLZC?}^~`)mOs@$r4(gro`OH)wtsS4Zw$G|^TO!aM`S#z7gO}_DR9PH#XMNLe^~ByF zETN!tj##ay2Y+n%$RQ1^W&6Ia`ReR@I@u2o!H2n#I;6O40_dn4r|cIYs7+eXLe5LT zUb_HF$Dd3KuOQhy%E4);%+Zp@N11?pl78`Hjexixn(1~*iQ~V{uS&=WfU*HJ#UGL3 zI+j} C*-s(P*Y=q8%mj<0K7i#31&|7|q!3)Kv>(WO%+&f_l` z*aSDi$wyBljvB%(qsD+wR`G|oo~=9i1$+#T9ZM{|%5Q!9bN$icGx+ 0R);UH8_wWea`(iums?zmaTImtO7iO=9(|x9E88 zxD=u$ZQJIX!%JSLP1JCE&GV+?6S{Zs@$M7&0NWBmc64WbrSROH%AMf6&MyucXiG z66L&Nm_6&K%P)OlPN%f{>}$N8`kp7c;ZyrjTJk_LgTX1@X3vydP4D`P>&Q+T6oCU@ zF2}GA;pZz6{8iRB8Z|HzqPW!1Z0q+0R*E72M}ZhN}H3ovCB3;vP6!clj*~*3Q#D zi(k$sGotAxp{p+E6`~39m6F~uxqfNNV`0#-2TM__O2}vHv!Bk{39{AXX<*&^qd?j# z@J-1|BKjM*I5#=nSXsPtKzz>!wlzRmiF)4oTwX<;<2+AKV7z8!v+&bsvpMUcPY`>q zOse{fo&4@Pxh}7>Wm@6Er#t-5vw{PT6y4u Cm5Bb~SK8uh8#MsYmVh zRJ{W9!Dsx>HE4Iio#9zLQZ=X1>AUfN0QK{#-M9ZvZTGcSce|(l&HQ1!`#%?<&on8r z_ZFbP*W~{Fykd7-s!etds6TOA)v{TTo{S1&4=cuwaPKqMzx4c*Y{y64Rkk$s`US(< zjXp+|TzB~y{L?F$wx1 z;^mBA8EvF*y`rDCD5X1QwDH_pG5D6az+F=L$aQq@e?OX>ds?IQQ3n9|CA@n6$8~S+ z^_;uDjgIn(R#61$0QtaeJ+=9&EUUpy9p{heT_ZdMbUIYHM>y8AE*tDu8IHT%EuuLg zhYJv7X9~kMSP}S2Q^O4LIkS*}R& `&2gNDX*}XmSL~ zmS$gDV$)uUk*cMp9A%?q%dk}NS?FTQt|&b@P)Mjr!)!`CFvn|adh0tcmv|05b=lT4 zha0Xx%Nb50%W6}2=T`|$QLv @k1EK&@1Nf4Po+i73u%$sbAV-K? zkD5D)HGDse-ZBLWd03d`q+-SEpAovQ4XQm~=`iQ7u;azlnt!VjH$8Sfk3qZL#}Xb& zk?!J0JLMLb@Id<=uX!?fApZ5xiUFl)!KX;}*DbLq hbTmEA6D2Xk;eYUH3XO9Q+ zkV@bG2XnzS?>DJmXBzyi1EWG8y$S(CBW$1hVA2AhIV;^xIdsOb(4X6zQjoPOE-W^E zGi{W7z72~s;ESz4O5P;H30RNKTsc4&YCsNTBuzEL{(a!~O;D7MIePEX!DG^=>}i_d zLSv _rUZ`v}h>+^AIjvm+mn@kqTJ*SU zdP4QvI(Ev$_qP0{Hl{}b(X>fdFWoT_NSNR3y;><=Qt4Z9qZJF))!G}+t~m$ns;AXY z_feMyJ5Ev(M()(a*HRg@NM3nF3ID3Gu4@^xVNX^U@{C{RqF!a*z^b@)BD@1T$Z}x> zm13H1PAHw%dTZ;ZPZ};)e-M3F!W{MKwN4=l5>j+=X3ik>IF (WW-|l6vylZ}zaZW@DX2dwBEXGYE8iv@}PBQGhQh-+W{a8c#Z7vNs#yb0h zX#b{wk5PP`VJWBjUx*03_C}FEx+b*J_-2WnN?_CNU!yG}r@!sLug2bg-a(%mb`G}H zu!q)~QhzY!6{z1OQ&zjw9*o 5LA>dpoUXG`j^gNd`+W)UXLP`VCQWGOcykxB{pTR_i>E8(=tMn zl2nt_jliJ*4wa0U2`I6KmNgZ?Q(!SUy0R4zH%79O3b>=GFb<{@!lj3j_oZdlkyxCE zu?Id%Fu4`yyU;tJA0t_SkVZc{u!5~m2`?faPRXshhB3(@dN;+B@SqEmbOROcv#UQu zQO9nLcA3UunXoF-v-ewDfo7m_I H;SD^r4JBz~6 zu{x2Fa6Z*%Ygp{Q;0H7~&a#Y3hW-jml`(xqXpkkz5ic2S+2%a^#`oQqBbTSJRu*u& zQ+38b)aJJN$y SaU2Hp+07Q^*h7OA{sU+Hi54(QatO_mSNTGV$RbUHCUM5#j` z{>_HeGjkcoYAqCOIlIn^i%l%AIR7pB2S%gVk^E1*RE(Z9Eom?WF9nhmq&JqGJHaP` zb3`U~XXNK87)!szAo20d&u8uo;?qBFPuD*J5*z)=H{T?mXb^N)TB{R&r(NO5*)i|@ zTI0G#LCzW~Lv;PE+lrDxXEeQotv$&5HfNuKPf+#<_918IZlm1DS %Q^p8F_)R`v<-xkg8tzo1Ft_2&28j#*Bci(TC)D(F0*E;>=^ + Rc6G5# zyl%g9c@j4_Mf&tQ3x+vof7O3Y)>V+)=Da9#pgAfq8D!t|?w1?rPz++sm9xml8IK=N zK;%y%c#bkKfhmz8F$4mp0G*nHepu~Zg<70+!{1~F7}L)v-VSc9T&aD|i(I+V`owT4 zU7#@kfR>YtvzO4qlHNaIDXmQH1LXfzn*MK3e0~ AkP8b14{