From e8fa373a2f7afe65f8eaa9edccb84003f62b23aa Mon Sep 17 00:00:00 2001 From: MeowOS Dev Date: Sun, 30 Aug 2026 13:02:17 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A8=A1=E5=9E=8B=E8=A1=A5?= =?UTF-8?q?=E5=85=A8(agent-107:=20SDK=20icon+update=5Fprogress=20/=20IPC?= =?UTF-8?q?=20urgency+MSG=5FNOTIFY=5FPROGRESS=20/=20=E5=AD=98=E5=82=A8=20u?= =?UTF-8?q?rgency+icon=E5=9B=9E=E9=80=80+progress=20/=20CSV=E5=8A=A03?= =?UTF-8?q?=E5=88=97)=20+=20=E5=85=A8=E5=B1=8F=E6=94=B6=E5=90=88=E8=A7=86?= =?UTF-8?q?=E8=A7=89+=E6=BB=91=E6=9D=A1(agent-108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NOTIFICATION_SYSTEM.md | 8 +- docs/MEOWOS_SPEC_REF.md | 6 ++ patch_v2/hello_app/hello.c | 3 +- patch_v2/meow_launcherd/meow_ipc.h | 19 +++- patch_v2/meow_launcherd/meow_launcherd | Bin 382556 -> 383804 bytes patch_v2/meow_launcherd/meow_launcherd.c | 32 ++++++- patch_v2/meow_launcherd/meow_notif.c | 67 ++++++++++++-- patch_v2/meow_launcherd/meow_notif.h | 20 ++++- patch_v2/meow_launcherd/test_notif_tf.c | 106 +++++++++++++++++++++-- patch_v2/sdk/meow_notify_ipc.c | 45 +++++++++- patch_v2/sdk/meow_notify_ipc.h | 9 +- patch_v2/sdk/meow_ui.h | 10 ++- patch_v2/sdk/meow_ui_gfx.c | 32 ++++--- patch_v2/sdk/meow_ui_input.c | 8 +- patch_v2/sdk/meow_ui_notify.c | 29 ++++++- patch_v2/sdk/test_notify_integration.c | 28 +++++- patch_v2/sdk/test_notify_ipc.c | 24 ++++- patch_v2/sdk/test_notify_post.c | 20 ++++- 18 files changed, 410 insertions(+), 56 deletions(-) diff --git a/NOTIFICATION_SYSTEM.md b/NOTIFICATION_SYSTEM.md index 311c8cf..c0a26b9 100644 --- a/NOTIFICATION_SYSTEM.md +++ b/NOTIFICATION_SYSTEM.md @@ -29,13 +29,13 @@ ``` id(uint32) / app_name / app_icon / summary / body / actions[] / hints{} expire_timeout / created_ms / dismissed / ongoing(bool) -target_activity(可选, 来自 hints) / progress(可选 int) +target_activity(可选, 来自 hints) / progress(可选 int) / urgency(0-3, 缺省 NORMAL) ``` -统一从 IPC/D-Bus 两路解析入该结构。 +统一从 IPC/D-Bus 两路解析入该结构。`app_icon`(SDK `icon`):空时按 `app_id` 回退该 app 默认图标(launcher 由 app.json `icon` 提供;通知中心 UI 兜底)。 ## 5. 存储分层(用户已定 2026-08-29) - **关键配置优先板载**:设置类(notify.* 配额等)存板载 `/usr/data/meow/settings.conf`(B2a),确保**无卡时系统正常工作**。 -- **实时通知 → 本地内存**(板载,动态分配/ring)。 +- **实时通知 → 本地内存**(板载,动态分配/ring)。**progress 实时进度 → 仅改内存活跃槽**(用户定案 2026-08-30);**落盘快照只在创建时/结束(100% 或 dismiss)**,避免每条 live 写卡。 - **超时/转储 → TF 卡** `MeowOS/notifications/`(**系统约定:系统文件统一放 MeowOS/ 下**,非 MeowData/——MeowData 是应用专属数据根)(转储区,**appended 日志行 CSV**,见 §8)。 - **无 TF 卡可运行**(本地内存态即可,不依赖卡;TF 卡在时才转储)。转储/日志类是可降级数据(无卡用 /tmp 回退),配置类永远板载。 - **本地数据清理策略**: @@ -61,6 +61,8 @@ target_activity(可选, 来自 hints) / progress(可选 int) - **异常关机**:开机时清理板载残留通知数据。 - TF 卡转储区 `MeowOS/notifications/`:保留**最新 10MB**(ring/截断),**不被电源事件清理**(持久留存)。 - **转储格式(定案 #6,M2.5x)**:`MeowOS/notifications/` 写为 **appended 日志行**(每条通知一行,CSV 风格:`id,app_id,分类,标题,时间,…`),**按总大小滚动截断**(保留最新 **10MB**)。与既有「10s 转储」衔接:创建 10s 后即按此格式追加一行 `[源:用户 2026-08-30]`。 +- **CSV 列(模型补全,2026-08-30)**:`timestamp,id,app_id,app_icon,category,urgency,progress,title,body,target_activity,ongoing,media,dismissed`(`urgency` 0-3、progress 当前值 -1=无;`app_icon`=SDK `icon`,空→app 图标回退)。 +- **progress 落盘规则(模型补全,用户定案)**:**里程碑落盘**——快照只在**创建时 + 结束(100% 或 dismiss)** 触发;实时进度(`meow_notify_update_progress` → `MSG_NOTIFY_PROGRESS`)**仅改内存活跃槽,不每帧落盘**。 - **启动时清板载 + 清内存通知表**:开机(含异常关机后)清理板载残留通知数据,并**清空内存通知表**(在既有「异常关机:开机时清理板载残留」基础上**补充内存表一并清**);正常关机/重启前先转储未上卡通知再清板载(沿用既有规则)`[源:用户 2026-08-30]`。 - **无 TF 卡**:系统可运行(内存态通知即可),不依赖卡。 diff --git a/docs/MEOWOS_SPEC_REF.md b/docs/MEOWOS_SPEC_REF.md index 6329186..215e292 100644 --- a/docs/MEOWOS_SPEC_REF.md +++ b/docs/MEOWOS_SPEC_REF.md @@ -172,6 +172,12 @@ - **每 App 最多 4 类型;每类型活动 ≤4;媒体单例(每 App 仅 1 条,可多 App)**;系统事件抽象为 App(`app_id=system`) 走同一配额 `[NOTIFICATION_SYSTEM §7][meow_ui.h][DEV_NOTES #11]` - 通知创建 **10s 后自动转储到 TF `MeowOS/notifications/`**(保留最新 10MB ring,不被电源事件清);正常关机先转储再清板载;无卡可运行 `[NOTIFICATION_SYSTEM §8]` - **通知 TF 转储(定案 #6,M2.5x)**:转储格式 = **appended 日志行**(每条通知一行,CSV 风格:`id,app_id,分类,标题,时间,…`)+ **按总大小滚动截断**(保留最新 **10MB**)。**启动时清板载通知 + 清内存通知表**(开机清残留/内存表);正常关机/重启前**先转储未上卡通知**再清板载(沿用既有规则)`[源:用户 2026-08-30]` +- **通知模型补全(2026-08-30 用户定案,全链路 SDK→IPC→存储→dump)**: + - 字段:SDK `meow_notify` / IPC `m_notify_t` / 存储 `meow_notif_t` 全链路补 **`urgency`(0-3,缺省 NORMAL)**、**`icon`(name/path,NULL/空 → 用该 app 默认图标,launcher 按 app_id 回退 app.json 的 icon;每条可独立指定)**;`progress` 已有(0-100,-1=无)。 + - 实时进度:`meow_notify_update_progress(local_id, progress)`(SDK)→ IPC `MSG_NOTIFY_PROGRESS(0x0024)` → launcher 只改**内存活跃槽**(不落盘)。 + - **里程碑落盘**:TF 快照只在**创建时 + 结束(100% 或 dismiss)** 触发(沿用 `meow_notif_dump_tf`,progress 写当时值);实时进度**不每帧落盘**。 + - **CSV 列**(`meow_notif_dump_tf`/`tf_line`):`timestamp,id,app_id,app_icon,category,urgency,progress,title,body,target_activity,ongoing,media,dismissed`。 + - 说明:旧调用(无 urgency/progress/icon)兼容——urgency 缺省 NORMAL、progress=-1、icon=NULL→app 图标。`[源:用户 2026-08-30]` ### 5.4 配置版本单点 / 刷新率 / 息屏 - /etc/meowos_version 版本单点(见 §1.1)`[DEV_NOTES #4]` diff --git a/patch_v2/hello_app/hello.c b/patch_v2/hello_app/hello.c index 396fd7e..a1ce2cf 100644 --- a/patch_v2/hello_app/hello.c +++ b/patch_v2/hello_app/hello.c @@ -94,13 +94,14 @@ static void notif_send(int which) n.body = "常驻不自动过期(timeout=-1),需手动取消"; n.timeout_ms = MEOW_NOTIFY_TIMEOUT_ONGOING; break; - case 5: /* 带 target_activity(SDK 结构暂无 icon 字段,故只填跳转目标) */ + case 5: /* 带 target_activity + icon(SDK 结构含 icon 字段;NULL/空=用 app 默认图标) */ label = "TGT"; n.cat = MEOW_NOTIFY_CAT_MESSAGE; n.title = "测试-跳转Activity"; n.body = "点击跳转 target_activity=main"; n.timeout_ms = 6000; n.target_activity = "main"; + n.icon = NULL; /* 空 → launcher 用 app 默认图标(app.json icon) */ break; default: return; diff --git a/patch_v2/meow_launcherd/meow_ipc.h b/patch_v2/meow_launcherd/meow_ipc.h index 8042f9b..c60a4eb 100644 --- a/patch_v2/meow_launcherd/meow_ipc.h +++ b/patch_v2/meow_launcherd/meow_ipc.h @@ -44,6 +44,7 @@ enum { MSG_NOTIFY_ACK = 0x0021, /* ↓ 落库结果 */ MSG_NOTIFY_DISMISS = 0x0022, /* ↑ 撤下通知 */ MSG_NOTIFY_LIST = 0x0023, /* ↓ 下发通知清单(重同步) */ + MSG_NOTIFY_PROGRESS = 0x0024,/* ↑ 实时更新通知进度(仅改内存活跃槽,不落盘) */ MSG_ACT_DECLARE = 0x0030, /* ↑ (重)声明路由表 */ MSG_ACT_QUERY = 0x0031, /* ↑ 解析 activity 链路 */ MSG_ACT_RESULT = 0x0032, /* ↓ 返回链路 */ @@ -134,9 +135,11 @@ typedef struct m_act_declare { } m_act_declare_t; /* MSG_NOTIFY ↑:推送/更新通知(freedesktop 对齐 + MeowOS 扩展;定长 LE)。 - * - summary/body/app_icon/expire_timeout 直通 freedesktop 字段; + * - summary/body/app_icon/expire_timeout 直通 freedesktop 字段;app_icon 即 SDK `icon` + * (icon name 或 path;映射为空串时 launcher 用该 app 默认图标回退); * - target_activity/progress 为 MeowOS 专有(存储层映射为 hints 的 * meow.target_activity / meow.progress); + * - urgency 为 MeowOS 扩展(0-3,缺省 NORMAL;旧调用置 0=旧 pad 位); * - actions[]/hints{} v1 走定长空串(M2b D-Bus 桥再填);media/ongoing 标记。 * 宿主:NOTIFICATION_SYSTEM.md §2/§4 + FRAMEWORK_DESIGN §4/附C。 */ typedef struct m_notify { @@ -144,14 +147,22 @@ typedef struct m_notify { char category[24]; /* 通知类型(媒体通知="media") */ char summary[64]; char body[96]; - char app_icon[48]; + char app_icon[48]; /* SDK icon;空=launcher 按 app_id 回退 app 图标 */ char target_activity[MEOW_ACT_MAX]; /* MeowOS:点击跳转目标 activity */ uint32_t replaces_id; /* 0=新建;>0=替换已存在通知 */ uint32_t expire_timeout; /* ms;0xFFFFFFFF=ONGOING 常驻 */ int32_t progress; /* MeowOS:0-100;<0=无 */ uint8_t media; /* 1=媒体通知 */ uint8_t ongoing; /* 1=常驻通知 */ - uint16_t pad; -} m_notify_t; /* 定长 LE */ + uint8_t urgency; /* 0-3(低/普通/高/紧急);越界由 SDK 钳位缺省 NORMAL;旧调用置 0=旧 pad 位 → LOW/静默 */ + uint8_t pad; +} m_notify_t; /* 定长 LE;尾部 4 字节(media/ongoing/urgency/pad)与旧版 pad 等宽 */ + +/* MSG_NOTIFY_PROGRESS ↑:实时更新一条已存在通知的进度(仅改 launcher 内存活跃槽, + * 不落盘——TF 快照只在创建/结束(100% 或 dismiss)写)。 */ +typedef struct m_notify_progress { + uint32_t nid; /* launcher 分配的通知 id(MSG_NOTIFY_ACK.status) */ + int32_t progress; /* 0-100;<0=清除进度条 */ +} m_notify_progress_t; /* 8 B */ #endif /* MEOW_IPC_H */ diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 558053b58f92e7690b7caa6bbae1e147ca0655e9..5ac9553a4dcbaaae6f56ea13f22763c92c68a4f9 100755 GIT binary patch delta 116201 zcmceqE^8~L*5wG zIZ>(32S55nXjhk41=mHXaPD@ke$D$d?=jD4^*HY> zye+)n=e>w`F7JwMTAj&T#XFUE9`B*8T79uztH1pM3FG(ah*P zQa;e~=`HE8Pv3*<3Efh+$RGVVc`s=xT9F=m1-ZV^;ZQHZUElH`)Q9fYYNH$XCa6Dc z`EW&gbm=Os8d~CRO^;5K@Rqz=(`TOshnGAVRwrqE=gFajLSD4Re(t#2X6HBUS`D=H z+?KBIX?gwDETi)7mN#xqYw0`Aqkq+MY;9Kbz2y9%9igM;n%XQQaIZv&5pBBX9y^N< ziScpEN44okE6Sd{S}TLV+M|_fJz1&Y7Ju=S+1C^D7;=+jkxwxkE#{RJ@>sTzVvi=v zUp6^HI0`Yf3j;BKk%+5X-n%W$SbdiiJ@-lCCDTAhW?M$giim8tA@o1CELoWzJrPEp zZ@C563i7?BW!=hjquCL~A4ssH<lpZnKW z9hLc3=|?1gl8pb>@?dDn(MM+74*y?#XUKjqpKM5&DPZP7;GiIzPhVvi2MmC z64OyO5sYzzqYf{_`P`O|ZcmSH#PwLqq&w21e?Yumj8MrToHtjjB;(2Rc z&}!GV^X|MQC+5cMuR0~;#%-^6y%jy<>>ri=V9^Dal%DgWGtT+`x##+>{Ye#JzUosl zsV(wlBcfe@#if@o zy`svOmz$fBk+W^*tH1VmGj7PqxG{%(@B00Qm~+GeiM0_cBo;?3kystEMq+uyB8l}8 zt0Wdktd>|Wv0`G)l8%m6Ym=kZL0%8;_T-iof4D3(m9De{xj#*npKR6YQQl{G4d@So zlMtJP<(?3&%1?||{k+AzH77-@isEQh`Tb~Bwg}o8j4FlDc-wim^EMO58;Dj(yk!fb zRl&*8YKVO5e-N!2cn23m&sW1ggeQpIXGN>MWW0|=h2ZeH(W>;EXmtRr2$C3jF}OIm zt?`fNr(RQC8?BO8k_KFSTeN!ML8tjUVOE||`+w)Z0F{vEAJ2a~47+LDjGO6|;b%2E za{+p>q|u?B-?HShDH+&OJLb7)M)>(luU6e+Tkm)5;r%U>hNpyn`nVHwb3~r!G^20m zAGX)d<)MhMlhM1WD0YKe-u-R~k2xc?UD!q%NuKWt6DuvDqU$_U<-f7#m?k%2OWx;G z;y!l8bb~M&Cni>&pNOwW%&PdMYaIDtLv6P2Z5R(5Bz`Qa)!yk;{vRzxUrdQJ+&r(9 zJTt_mN($*-M?Qaad8xE{dEWI^*uGm3g$yu`KzATeNnf|=+quY4E7bb8z8xk*@P7)E zq4__B$&eipcJ^VM%UB)}cvzSi&Hof8c3+07)S3O+Njkl7*w(5(t@^DTr}6MZn*PQIXT$>KSt+~=ZY5`j0}6n)thkf z5j{c`qa%`{#@3jDNKwRn==yB^iND3wpKT8^zD(cd`*K-)AlER|cfHLnea{3Zd}vR! z+V!VsmCM`C>*2L7jnPxA_qCoF3T&I8TIYFH-{cr|Ao=jOf6C$hBg4hto#?~~l0F5u z_`|P+3oSBTEwlvUF6Ql+5)&E=Y;y~*a8VKo0|i9fo*kps@OJR7;;r|_s6KFjw`_Kd z+A}9cmGZ9Q9mJoL6QgQ*ci`Uz7JzHPorEdeCAiyhFPlR~)i_4xJo|~E|EfbBClG5P zB}JgP!+r@1zilUtyTi0FepmcRTBJLi1`LfABoV&#QlQYfUFPas1|s8yGZR{I;o*!6 zO~QpPBrN`V{Es?CV1!zs8O z|FR7+svO$L5e)UWf19~h;urF^5mrt7oxF9Vt-`+;`hMKsT`8KRo=CkE7NGFuk^!$o z76yba?wKxQ;`ZR)>&6*!aezV+c$X2@8BR~31^8#;-$PhOcZ}N2Tg}_Ydw_S|vyaE= zd$iH7 zjl2IMtqy>LmCWuEm8!a&X&Sg}DN7b`?bXa;!Nu1xM1#w(XQ~J8S2uOICerv#@r8qCg@?T$Ynq@!N6K(ORu=^ve%D@3|8CdZ#QzCHB0j)YF zg_NrNr&j$C+Ww{0FxW6e29v?h;2bO;rsiPs|7ukW_JV6c^@Ud3!3JcWHeg}?gm$ZgC0X|2kWB^wL65PAjVKbU`~ReW+szxqM-^w4?7?gVD3?d zst0$2?O^L9L+u0$l1T@8W{{5M>@Khn?3ih&GSHW2s5(&P8)_|>d!nKG!M;L6?E`}+ z8OWdUwYkJlIbhij47C{ao@uCMU<0@ctoR`XgZ*G1==qVM4uDll43#vE8TvU4YGCrY zhAIU+!DZl@G8hp0d4_5Q5BwO$LC*z-+5;}WzzC@!91Re>DN3bWY^VZo=_OXi zH3$w}8#2^E938hADtkILSxG{$4*F7X=3Pht>;^l)oS)NXV6VjtWd`wD4dny-A2w6~ z?0tkL151BF!C>Dn4b=u#tvA#FxP7ysM!@#R4V5qxWe+_8$2eNS60rA4Lsf$1orn&s zdB#wkVBlFY0Gq-6U_mbo97{o93aFkZA21mVf@6hH3zpy=bUja3{DM z4AuP_j&SVnGnAQ%1YSmoz?7YasscM+F;p{H@ftb+miE(zU^TcG?EgKYp9O;hFaWlL zC7}5_IsjII^%DN3p}N8BT__<~0PdZI{*~Yuf=~~7eY6?q11tZ8GJ^GB71#&XfV;p3 za4*;f4uRW2^&T063E*BZ1snnc@1vxC3jUCafiwS#WW*0H^@r#NIBFrZgRS7szmXwW zu@8}hZQy?K|2GV#5e}MQ!QaUcYy}sC-j84qECttqePB0eeoQ`K;Gaku9060(=>?x4 zu@DX)jvyEW%fJe7DcA?rgWi9k{opdN7irguo(*ufk~NEBq2&=gQZ{qYy(Tdl!@d64uW+Oo){HUtvFU46{R}Cfutza2aZgN zQv1N}$x&)Va7vU)$s&W~D3t>?Op8+G;LI5?1a=-9rMkhzz9_X9%=Jgnz=#}728+RL zum%i(YrrzF+aHQj%W#yXMKOg%2f(%90k9VwNRLu`z(Es6Ku-oWJPwI~xu9Ca_A^*| z1~meAfNQ~uk|?!9=s$>3gJ36k5G?p%l=98S4uA!q3N1!7IBL#f{~GKCo52Eh);qxt zupb-(_kjn&5y5lGXbuu7i&BN)TCfbPJTFQu1#7`NuoY|tw}aha()m$pC)j%djDexu zI7V;`fk`=x*B4SVFzLUdn2?iUC5(a9SJLKSGq@cb2K&L}s}MQ33LF9lK+jxi#=d_F zSOVsPyTDSg;3r5NtiC!*HO!^|4_y*rWCX4OE5KxQrxx4;wt*#ev^h8k?gi^^r_I6O9Z|~6LvnW_ z0dQ?S5&%2yq1+HPPFh793E@7pAI!O*gkV4D%cl(+kpP(6gap8HuohefHiO%nIr9Mb zfqh`_gXjv_@lcdXm{0$=r~r5XTnz4PjZ)QM<-<`b)QqF#5jX)yz`fx9Ur_S`y4l(& zH51JJCE5y(fMwvCN67$e=isFotY|~Iz~XgC5bR%%PJxRz(3B^@Fld5RU?J$)7^Nz~ z?oIUndK}9(({|Lj?IliQ@b3h>!Tn%ASn#q(?FHL^!>J882qr8bhn|i5QgEJjw)jfW@Gv-=iwQT(B1G z1DiqhTMtVvGX5P$OknlzJ!%Bp52h3%+5wL$1h<1_p!qsSOke|84|afS!Gh2m9<>8U zCAbG%1rCFqV8TggHE4p#fAXkOunnvN_klIw;`gZ;xN5IQ?E(XTff2CcL(Z*ECjMVx z1l;#GDgrj|qaxt)zk5_07;3<=9Y^0k5D7SQKOz=CnD9Lkf+m>qkw*oY7_F+o@=4LERp^tWRVP>i_JLL49?&<1 zePyr?RHrgsXHPsCT+F_BHh2&WfJ>*c2Mrcai&j<3aP;G-0Sk^{2OAs$+rX6R(W)10 z2X}*g-~q6720P$EGB`F`<$y`(qda=WIZD^g(i0{gD}$d(;r0CpV>S~-!l7)v%+q#+N>(R~rvTHGAywQ>}vBjsf;kC9-JtSTCjN8FAb3 zbz)a@tq*7DX~y0f>#G@h_VflUVYVi$HZi-HWtuRMjDLHbwQ#1MZlv64T{u&x8Krkw zD`)Cdqw{X-QNe=ytrutN*+yrh^)Wbo8TMxnX(=&9@=3<&fy3gp*1Ti&)R-acQq=_O z%wu)t)Upn2jKt-UdR7pxs>8bbSn{oY+}b2q`-Jr>agBXXTAv73K4nc!)w5HRhq2g_ zur$%P_%Z#UfdLhs3m8Fm4O|_W!gVgr56+cU7 z#xKS__)U~LpsdC-^i->KmiEL{LmW6{T{ugp#&VRc29(DN&C>4=MK=whqQDhrDdMwbGA5G~-@6!+ON8Q)9N{E}m(< z=+|kB_TsKScC6U!h*IrFJ4kqPsz>bS265Pwvu(G5f z?jE}{S+ml0bj)&sijT8ars=6^&A5|hW6X&~wCs|{bhEU(WYlx$0<5)LN|=Le z{3&tRkqfcxs5rG)6=f|sR!_5r7SjI3gcV<8oo(vW*-LS^U&09EQkEF|mR(#dreL?6Y&>Nr!aZ?pyWsUCouE4-b&5XQy1jo z4%|RzbBgcNu9(HPEhcP)Ft1w;AGAtn>PGA8OjN!e_wt*pM)HYi!@cJw>xoRAIeP&2 z;LTLYVK=30&6v<_Q5_)McMIZ)vJTNo6Qw0m5*YDn89J@&j?>f93h{Q}T}2R5Ns4Uz zGQx6ivo6lknK5;^_up^bm!+r2wc)O5K*H8br(iDovQUOTXnhY@zmxDm+!ZZiEGS~i zL)iqYi8Ne`6`xI3Ik=Z?uomEsFULKyk%@q#7il&4`!6VcahYu<4> zb9yQ6;is7uxzd-is-W$A*1GmMTCpB?Rj<`}oSy1$!@Z}M8IQy*cSbLX-wS=@Ic7>? zS*OU7)ZQ#@eV(W&1SRjcg4udzjEC;pyVFXXO~xkf+E=W3v-Q+a5cjTE#w}TRSS*LW z{8eT`WI`^s){4qhLvM!O?J_O2dT7CZkKGF-y3ksol|iFP?8nFdY|E-jX!Vk|EHS10 zF>U>3ww^S77Xka2`R=r%IyP+|w2t3dpUlRlC6Qz20MjoCFB?}DAKo0oJg-{|=Af^o zxcgqWE}VmOYjJ14>2@jNiD;Uk)$Fn!Av}Hu?(#o~{SzHcJ7+)s{eNW68qpdDp{;$J z=^<$;H#fq#*p;0*i9Fvy)Dj-iwe9WUcdUguj9`_-@xI5L*7Bbyb`o#xdsbr(#;6VV zK7#5bXqr`biuPphgjU7eJ1AKqqp-Eu3%wos9$~LIvCy^xA)5>DWU~CThq0We+?gT4 zxbi_?`oVY;2(19xa%f_hfKpw$;(2}5q)kbI|&}8)x=2>V7Q!o*S zr@erQ0D5>t;sR)kBWO~Y5@_YnOh=Z!h{4%rTsGBfS(Y4dCI%f=rB5eY&GWS9%w~d? zvH}?<8)=@fp%$Jx39A@7ocBJ7A3>8j$!=(ML)HiL^wg7Odww6`cE2u8EDz@=bxq(u z4~rPv)|4ieiYiEY6Z+cEta-#XwUlVml;P}zy;{kR30t*< z@d&LM+Hz=BHpS^AauTp-SWH=F#xC3?UyhAkh2i{!jRS-=6IN}H=4sxep^dm%6_3w* zMPp3Dsz$7NxjHkp6nE{{_FVF4t2$SE&aZ}2c<^w!)k7jdLj>-E5{q1(bn(8Jtzrd zt&hnh#xo5`dacBKo#~gOj_L#!g_0X03^#ZQ^g-wqwxnaK@CGJY*XCost@!!#V*YUEd^S_EY`$ALl9QqY@M7MfLiEdB@Iy?5osy3A!tfl7o&dD ztHtk+cKRdXq9XOs%G0dI0;VM0xCb(<=W!?P#a(e6_t2cx+$v`s@Ryl7I>|d7C7HwG z-3em6V7+bqYazleAgE!UweSR;8Y;(KeSGv`#&a38T4>Tt^4NlgRu3(#G$N!m(0ZZS z9WG)J=!Cxe2)YP-C-foc?UJb@aO?dOblmho0@mcZtxK3h9)`9r*E)0p7At86V|E_b z=`8<3)`Gcs6Y|;6aOQNPApTNlzWLFIbx7fBDfD9KePi>xq*ahS1?+$L2rqU=B1a9k z6BI17UR;10?!n!BUbI?fFSKKZ@g6+SI<$b!m`u)V&$m)f)TwEOxSM}GrtxEwQpvoG zumeA~E+*bdHMo~w5UuK<%OiDcfHn+mu@E9O(1*8!u;7JgtaT{^{X~f_XKua!6|I8S zhx7E54B1K%u~v7Lr4{z-5OwtmN7Zy&QTy?#L2FK{^TBOV~~c;}HevgVuKW;rZCT3;K?6x;;@8 z`VjOzmq&-f8Z|b9^rj*x5|m2LJi^ROXr)!riai%*6cyBewY_U18OfpH$W`AixDqfoOp|<8K`;2p;qj$Ewm~obiS@)u^uYn#ZP$|4S&N5f zSt64Wg1VQplZRU#p(V`1(n71UDGtpCt>DJP;}t+FgSI>(o}6X&Lo1G;RX|I)X?#Qx zwyS4B3_>iCh!LAXtDvufZtw6+i|fFfbThm-D!vo%@|&$UPDaJ|;qI=nJ~>%uhLU_} z&(EV(rITBm;aWn3cUJ(-T1 z>BrXGA^j@vcs=DfIfYHQlRZtv!yGwsUMKY{Cw!3bYI_^%xEj2r_3XJi(L0QY`bzXx z!VeNYWSbj%5!(ytz+GJTbvEGkNQQT_x$5MQ9UdV?rH2Vyb`QBr9jC-4rJ?Do&~SU> z;iMeAeR%66C6A;CLJQtIR`IdPn~$&xiBDLrl{epAD){T54c#|Zy4?XJpH}F#_j3W- zmP*Wayt~;5Jq1nJjl1jt>w{CUiE?C|(kRlnG*wTDNlr(d8m-iYL@U7UYqA!Ky9{?< zlXdYzoi?c!cU?0IqA8|0u{GM>F-z-!yz44ke)}=o707c#@gzs;)QctDSLfoBCTMJKR#3;kP>|ySMJIkcfIjrkzpm`s$ zR-TGVx8vTk)>W}1=Hz{ZRsV9lM@g^U4XqWLsI5GL`=ND0v)BI>&YZ*!&!8nA{kB@C zKsUMYyqixq(u4Y#qyU5w2+ZY0G(qdFWA&8TcDq&)w7=b*uaqU0gy$wcV%8B>xiMM| zxOJ0l*mh_+o2flK@_-4#uQx2hf(P0levr-V%9~;Dc(6ga07CMhGR{(7}v}&icB zT|SBA=%zK{bR8F0MS$-QT+Fn$!$S3VTk)1iydxHFZG;UHRwrRR!q;|am4DN}uyVj${>{@ze!|S`&^Tq7M`47qM zh;Fmiy=8Y{1 zq&@dS9C-im_7qtTL*Ea*!Cv3TCC@>{IDDY?GN|O@ZNr;w={!B9XffV?ysom^>qp7F z3i<))KHOntq1{z2^n^bn=Xjewrkekt^| z|FTlg;54Wi_u!DYQ{!y~z;AwLUCXIe%x>JfKC|v4?35AQ+lRS|9~;H~(=Iz-l?Dhc{>OqOHEg|*O4=mi9aH)18LHPFkUyTUk3 z8@dVW8$r&(MrC4Kc+MqlFhH31s~F{VM3B4mG5x4vMOo#?>ZG}LS05op(!s+y5h2N4 zmICPYPUTAN5yweVNKo%Lt`%79SS?9X3f+4M^>GR-v6Cd)BCC9UnM+#^trnWJfjkm#6|{C} zOT*igLRoOtp`;v1Ks2q6X9 zDrk{HNP?aVy&ZaF`eJC6{=-=-ht>zJ%w%-o(6;*)mmGj@SD3__W=3yyY4A#{brx*&b-fW?ojK_whKrk)9nO!DXc!nZ`Qey z8e9Elt?OR&h~MmV-8(3t!*%DZ_nYmmdztm`v-PdU=g(L-{YcNAaqkYDfD~2c+seCF zt?$b4DZ+F@M)sg}>yLEC%*Y744~x(jW!3&jn^PlW3=rdh+So+)FP3s?BpfDOOA#tJ zt#kkXA>2dwzVYz++gFaXRItT4=ScKI%Dk$2^!M>Df(`>dEh6|QLdtqwVcm!jH zo2Wm67I0~OHqBbOM9)4oT)5=XN*-Ei(~E9+bBo%9ma!^m2yG{#4f}VD=V>!?m~@)S zWV=&9+BrHu^N%5&uuMgpl2~dXnRQ2G*6GAuagLsyC~@iu>o|he0ImH9+A3&k+;Yy< z*BU=~+gg3DK0oHh)w$-HYphSs)eGhYw&vSP{OOwcX5s1Evxd~uStI(HEKz3BDN*JF z@EcSYXK%U2I;V^)LVrSO%5c;yyRmNvuV3Xn8SmswAj=^syZq7520 z3HG%*&Ajs(EA2e}a@y%H>x5DjV`lh#Mn-nf821P9EBsc>`FhdpPuJwxY~Hv!A2zpT zC8=l7(Mp3AikXq?Gn_JlMzGJi>3n@<;u^zjkSd(~dWQMuTdj}JXN_yTuM*Z6x!e;7 zij`3k?j>B5Dj_$Mc#bl)s-C9ocbuk>I4gE#*ky0sczB#-wXG{jZMD1QmA$4Z)z8Qs zH2Ntgqp;8T$zEsRdh*XUhU@}Q{6HlHUocIdl4C8U#Gm2oi}I=|frPv(8l}LU$o1E+ zn`T1ZrHxl9pN#ErqXT7m1vaxuc_%OiO|qGKcOVz{WZrukmDPzNmKl6Lpw!G`zOhXw_|Ep2bM&S2JZ`we{gU#ux*>Bor>HSK z}q!}V(G2J4yIdKamuG3Tu zBu!ba#8xOdR%UF~Jz1|?`a=D^XsPgDtfC9`v`go{k&iZ9YRhHW=#`nbjb4?R;S0K2 z;X^C(GQS+1G&S3MgR2OW%qQVQauh9Fo0m&_#5Q_VOyk6-6vn+D;R0!t==wL)cjDrdzIJ zGd(9eBU46Q&}L68??}#)A2!4i;LFdq`TOwqCMUWZ=#C6swgi1)2^!&M5~iA6=GGWl z4gAu9`3mOa?c1zP|E152nf!2u`PB;Ri~nN&HVd{WG@ksMw30I35(|f4@~MH* zpo-2EciqcaPGen*UHR-w?eJd^zC=yV`~h_7iQzEuv#o7+AjxY*pH9#!+T@1^SWoD{ z_u!AXizv`%>>{#3ZD+kvY%BDfY(A!Q3w@h8i-heqHnhZNrzn+ko#><(9vwE73d6`>-hH?M`3k>pcJYLg5&4bl!fL)Nty>9mU_hi_=F znQ`lyrnp8ZJ61NyCflW)_C_8ek44R58dGS;naXHPM*Nb8SaV4)ViO}Id597E9D6`% zsGar6MS6NjcbcY-iZ*Mn(+TZ5hFMt9BWn0##3JpTK?jf;HN25&in2?-V(F6*Sq2?R zjNN{0k4URh(%|*4e|L0W3i{~zJcgGS?a?p$ zxqNd-t;-5e?LJ&R-<+kA(TTpOV?Gw0@bLpk&QNkdwKqAmpfSN60cCiyhXRC9L42v$ zVwjb}VIuRNqgKo%I_)@#bN!R1IVsjrbQ&kyOVd6^nw@C6?R*jB8>y59W9<2z7Srh@>UAgE>Xm;j=rYbizshaJXYy^kaKoo15=%UZY;@8eou5pbERyvo>AL z&1#TB3iC5XS^VxJ^rdNuLEYj^z;;tx$FM==YF%=b^iAO6&l@)}et`Wr_=qGr+GSkGUk z-!O9Xt@|$5m+6bFe_pOH(f!t0Rdn`#>lz0haNsEiUI!9IB=Ok=wsw&Et16vo)1)m$ zOwi_Cq0{uJwd4w&WfbOHE3VLY7;3I{=nAgc%*%6hw-P4BEuE?Yw-^LTUO=lzXU~R7 zDN5{~L$}VpQlBmPJbI;`s#jW1U#Wk3vP6-Rb6o9cP)~R5RZlmqbp3Y2xmihrSK_W< zGF$MCb>UTdx_;fd@hW|4nys*O`!ih;HMl4uD?GhD3vs=3m40GwxChGIx}7#qC@nK> zQ|8T5>?3xulWBjrx1L(6=NJcbtoN4clSAR8GRsNI@-QV{-(+(~4=X+781p|x=y)z_ zcrAJ_`d&2P%rEP6#^;VAcMDPsTn+40GXFe$YBW~Z-|QmOC=wZWBTglt20;o(HS z229ridlT4X;m8-3`86Wule0vyI4E47XPgV?g72&>rciNZ5HDm8dXmUaoEtRWeucz^l`H`rnxfJlys8rhPmK*k z7F3}(bd~G%yzN=#d=9#DvlOaqDWAAKlj~0HSxl(Re?KYtIdl~Kv`hUg2^Pzjf5xUIt$BD7I%`DsLA-c)@Q`w4^K~` zk8$TGlJFo~5KgltnThXP?_Hx8Ccbe$4CVUNQqRV$uQytm*YbT!`+&9RT76%tWEwQ0 zZBuzL$81QXzlffiYGc;^ZPq8(>ZzI2_A0OB>*Vim@GHMZnpV_c>&ARj@_pqNYxd9d zg43k$Y~9G;*w>2-O`pgARPX$5Z%wgUp^gMRS z%AgB>h53H7)Qx{Fn_k7P`(t*@3SIZ9jegSFc}@?^e$Y=xbqe@~-Hq^Q|GM?kb=(8; zpd4{1$FXDf!Dj>+b389wpIoP>UMS%c2+w!Jm!h@VcDPPB3i>Zyi;gxog?Eh#M~lq3 zSbxq#?p#dxzWL8|f8-h*Et|Br3nSlq1;{4ia~6JvRZ@bx5+7|EU&0Dj<9{(@@)M` z%FFBYs;TUy^=zxMw$6CFiN_=uX4teQpyc) zPzpVc{0g31Vm7uqCiDwTmx^BBB5R)bp)@7>jjY@>eNmzdl1AkD>6$CeR%2_{j^~zi zCgi=e1zun!Xq4Hk=sEW2x#k)f7=y;C+UdM97Hn~7oFqE5ggk5BE&BYEK3(HCI}x^5 zZ_jEq)@60L=5ZYYmWgt=*I5qN-0wHr@cUwW?0MC1tY6)tvqE35^2<7=tCy8>rJGdv zY;3*Utf%dyZZgM~de0(mh3js`9bR{Ra*y9Ecj=cy4_oC|pK?sS(*{w<%@a`1*JJYA zyB^(iIsJdb8C^>->CTuUO5ltEq7VhoIb(^qcRY83tsJ6cNqLvkS2uK(<&BRKsV`Yi ztYC62jU;UWS~3}kyC zOgqXkru^Q9tUl24jO;#Ro|jRd^cRf_CzgX_a8%6X01-U)RDuW zQF}xdbw~KSz3o}^l}-pSSE(TEhc4^kYWZTF@B>jBnF+QxogEIh9;-8?ZXf#3 z+$_)fYc11#Sct#P!Tj6!6dC`;w=w-s$SY#SDRy8Qaf>>UK+{|#B9c?l>sp?1*FynM zd)6jcQqdc;d=%O3jukh$((CrDYuV<;JrL!@?S_3>3qIw>z0Hk#r`xrH@!i&xl{#-K z7P-OiEmjQ1*%Q2cjg5|Z=2{o7)U(r)=caeg_MWarM-7voMl>fRT}rrS7dovoiMbhb z#KcpK>C>fim%Mp8o!k?E-sDl0oh5GuJA-dp@2%9A8Q{W@UO1I)^M(d{fRZ&%or=iA z>I~`P_&6+V$(!rVk~gidLi(ID`vzr}ki=%#rRJR6bXD@^x=z3MZsk!$SV_(Pc^Vd1 z2a*}!CaEG@r{>xpJt-v}C-`PY!<^hJ6bw96r_-i}^OH25x#@P=);#NtI-MU%W&{v= z+a)@oHP6>6al-@TZz^?yjA9c0HZ3v41UND;5zv21FQZ0lUb|h^aE`yh@S4?re(UFO zfnRQgZrA?F$#eTVW#ySX_oYsU5o_!1`s8E6JuT7IHZdvh{+t~%EBX#SM<25C?!b7j zdN#wn&pAFE+s2caqPv6brui;aIs~g>+VO1L2~F6SuGc}@3vp&Ogjw*u+n;>C{_C#L_>s(L9)?0VzSt0S>i|E4T40)V=P}yFQ#Y{$S zr6Eg7#nMms`oo$`b0})7%=__%2N9nkd#d5)*zpu`3^_%UlitdRc+SA}^pPVKi1qb&0tSuO)h9Y1L2R7MIc6fwf&5IrW$WRmK!E&em>BqL{Wu!F^qV?=yz zKF%_4Tb~Ito3bPi*@=`q6tlBkU;ipA$Mfs1Y|mEfsCs>Lp0v!`7c#h=;8;~De7wbc z-)gab>%4jqpvS5Bd9=G7lMjUA??vdt4olM&s= z=o}&ZD;be}MhfSI$-Lq7!kd3bM3%6=sLe!ncC{4(as+H|EQ>~rDa6SrL}WpyJ;V{> zn9!7QwROQ=Z1H{bh_jk?7hiYZrBf$6GvuK1x%L0%CF_~H^kt!xxz5U1crH|%v!rcg zW8IlSJ8e_`J15RJk2u>{B8QZ@C=YT7vp13Umwqkua2twzlC)0v)4is7g(}J!9mV*i z6p?5W=S%5ZN_6*?_ADZbN#%SZX1IF+of|Vudq;-eBqOC*P01{a-Xio8_7CQy@RM74 zd6^!SZm&e8poq{a#esJFU=5D@}jx3^pjUwr+vSN`H0sHMa zmuhRlJvwdSuiX0nd8MVY@(f=e5cY2Ry|8CJbPtPM*?SQq5V`jv zaYW7{r?pHxPEaO05aa!!kMe{kiFYig!(7HOMGs}{7XD;VS(|qqtA}9nV&&h`OqE6c z!dHpP-SQrOIaeV65Juf>5F=Zr%q?wETufF4noH zi$P8ot$FwBvnPv5my^dO>QPQ@Wh!Yk-p>{E>}Q>QE3DFFyXCR=&IO%5=_t0b$Y#DG zYxIoVwy{eHpIRT?uhY{cc^%5`Q#&(*>aI-jb8=_q;b*cLmHn(WuR&iZ_bu*gV6z^4 zuR*6}eDhbQqX*RXrm)+Y0#zE1{>=${)bc-|Ll;Y}CXr=HJpBZri~n}~JL3-bx8wJz zRCL^l<0DQjiw_xB!ZeY58#IMT=pSbk)I43S8 z(3ZKak!fAmsHf!J^@QJ)g-LtdI_9HJLv_61EK0)rP@PqA7g1KZ zq+fDxD!e|qv15Eq@)XI!+fU^W&bJNK7uLikJ?)q@l7yEr&yZEUo7K;)Q=0S{#^8Dm#x{&`W$_kbz8Ik-lUp+Y|+;F)CZu5 zah3JkW_>EUV8uU3juQJpy-@$k`pJX(MBQ$!dr)6BRhnBisE$&;^+|M$UM8P3dFpCC zl?`xf!D@Yz{=|A}wLURE>c7d~=TnpZ+xlcRlkM$0tm!TM)(!lxFfhTJYN|1lcmUdtr2mp)u8Q{I=Y zv)AZ(lg}i%Z2wF0GCR4|xJIXqrTd+oF8PRbnby!6?VY^XPMmBfE_D*e|6HeunCJbR zsyc;aTFZW}y~q5>jy%ndyf}i`=GF@`A>lL`xue1Bj{@k&jj8)!2uGsY|~>#gsqcbfmchxAG#`tMde zpQFW3|GU#J*?*UINwfG2GuL3_@KK9ar!8M3($QkBrOz}|pFQ6=)1-&2xK{l`eY165 ztDdhfvF>f0pDIr2s;?_oX5 zwj^RXmeBqs@uEgy%VK7>$JuIi{ln}f!_uaQS+rqE-gp@O0Y842&B-p#`s?WWGJ?db zB2PKXhURK#lv1j=p~ZDGza5+XwC*rj8?l-Hrn7;zJUP=gA1^#A>0-^W0hInL#=VT$ zQsO_HshS*+RetO#ko4tm`iodc_-tz_43y8!V3*2CwBQxfj3<#)IZRvpvQsb#8|I*w zqoZl2)jcmN`JrF%GgI#J&GP+1Zx5Bv^*6>TpGT6{7~PDJlg;wEW~1~GIku5a)~`p; zv5SsV$$_@&+lfClu(tZ;#%?3crq{6ll47jSicu#r)Tg5h8@l?`hAflmf~nfOW`en3 z0?0y^J#g-4fIf9z2tpcGYJJx}oo22D_u`l9inZVxFaUDI-erOfphx)&#KL*?rM7w6 z!y2&;e+^g*7J@ZkH%$0&i>(zQwpTlr?jcUj!z16sEg@&OUIdr&^tg%q^}S=e?}67i zUe6{IiSurYpEDoX-PeICjJKFkao6Ks?8Z5XI3=z-K%U{Dx9~U4&@1`;6?#D8T#0A( zubeF_3HTp(yNW+5#J-txm$BN-tdd0GQQ`sIOI`ZM*ml{=lK9)9%doMXos~{5`c<&c zMw3}j{*rquLzgmAyzqc~@o(2>S1 z@vTi6EQLgOZ6=sd_`T=Bu&*t^QlE=HLHo>6&Io%sJ?FY?mSalV3@-85$}AWE{ylo` zRKhd8s%SP+YzpsmJ12L_K)Ou@`<*_A0nPN|4ru?DjOI#1;%oK4nSJ~=OWmZ&Fj=Jf zK)*Lsq`1r5V_$Fh8~CPYGo{Ke~G=zngAbpvw9F zhMh>PkGtO<^(yE3JE_cO)+W*Bdoj{$y==E`vdWlRiDjuVHfF_fy`H_usR4ANNq;Qk z)#QM*wcnf14_A!0bDz8N4YzYSSDd7s%XM0gxQ}e-8lxvGmbQLPw{5U^PvrelwQcwd zFGKQ}zJypGnqFgF6ZWEO6`c9tHlurxExc!${0-XYaB_;;K$y(pg|?hFbta=hqZxV- zdX3ub&vbXlqq_$Rzj%_9QS(G zbxq|OTZ3oahNHm;z+|uy+=0jsaY7ZVo zu4Qm0+9_M@(k{{j(iGCYq&Lh{>+H>}8sljumThCA%Rxt^3360gj<^qRf;P9SbvLaw zdYYW>)@Ja_vaUjFdRb9tO^8ejZ3fz4K)G{mAA6Qbfy((@Y5cz^ROS5GMwF_lfINhG zQCLyba0R61?QWPI#Cw;nDW#L5i$YF?oc( zOOz@9A8XUc?$gcG=0x5|;5#ZA!5J+RTy8!|^mE3yAcnM_(-4Yoenz&#cjRF0vbup)}SL@HwnW;R=- z<*sB8jmDbxc;H%FXR6?9bEXfzwjgmulG0nkQmmzOh;D`LNQ6#S*mgY-ktnQ?eaz$| z#}Ca$j1>I0kC=Tow;4|O_^L+3fA*_h)NCxG!dz90aea2(VGaj>t=OShi(wlr^L$lPZ&UkurSep4NdZBGH zJL%UVO4*K0kwmVwl(B&x#ArC#o`=dI3X_{HGAEV!=yTQyn^>iCZ*t`(ot7voc`xIY zs025Wwrpa>@z!|Jbo;_*KDlpv##Fk+zVSRXuNMdzgf?Yk^3<){PAWk6384}CRa>d z?DgEioMPtYKIi^0jQsCtkw+TLxg(?O11MqSr&K`hU)5!`F9Q?rJde$-j zbcay~<)8^`#Teahz4EyJ>BR$Vd2g)L{IJ@_tYn7j45nqLyK~G6_X_i=E>j`{Ig5V0 z$K)8mu_dzEC-msGd1eX+^C@mUZ)z&wxYKHULgzc1W(*S<%t2|tH=fYb6Q%t|QM8P1 zx%y^(@q|uYC|kIR(B5|s>71P@Wt{y#PUj2zr95e~LbqK+Fsx_Kc~V~+`g)_Yby{L< zYbrI?HTf_bDT~Iptb*iULLZXtRf(HzZ0uTWJWJf}Ci%jr#CWFZ5j@o)v z!*I`{hM}GeKFQ)dajPHXHb~EDU{v5>&*iMmJ%JR~pYDeRmvxDNzIv(NOgMl&Ue#uA zm}DhHL^o$+t9IzPB&F%8vDbUf)#BHhE5dTH`V>jeDRS zdRtdGt<*h@&ar1_S| zglC#WZ}cN@X}z_TgWLMIjx*%~@^&rLojzkozsL-xkE?*O<}bY>B(J$7-Vv4<7|E&U zLW8scXxYzkPF4K0OKUUs^Zh}1PUoYN{YUsaj_|KK%s)j|sycAu7E%5_QT`}? zPiVXTpU^E_ZK{DMX=TxbKHL)ZV(v>-yYBsb>r(Ezcd@Uv+;zVLz07qV)5AuZ>;4lP zbxU3My|NGHx(hhxs&w6Qx6jn;LUv&{ujc}n8}I`*-e$V)Z+5bShg+Ddn(H^$xbzSE z*&%e@KikL`_pbXy?f@S^JEQ{L+|}Lhy8F3*w%2w47iTyFt~>YwTaEp$=cDKSrmVIl zaW+!vbKNK7W*@<(4|I-yz4IaN-O$-2=c0|j!0R$GodQPO`0v0_r|Ujh+`?X_ zo98Xo>(B5x*7xC8HuQF$&36C?`~}@^vR<<2aNXJ5W3F?PJ^u;^S-AJ@(1F|h{(=&h z{|3hn;nKm|hB@TT=&=1 zFWHT=n8Z6>_uVkG!*z$Oo@aGvYIwp`${taP@ibd*_7_@9IgPJdto6M* zpU;`z?$zmO&%3=`?lJB;N~R#iIkMo`P0lhmV^3Lk`!eBBN`i;pC&mv`uEr0=)Or&}lg zO5c&@$vv?_Olid=+5Eu@j=8yAWxK5pe#PObgo_Dv1sVUMK6$}zwcrmiHgw?>O8)!Hf{#mS5|ab-i_6A2&L4_+qe6ryVn#qZ{R;_;jDHja$A4PKXP7GV1E=>8D8G6`h&-@0+BhV$7U4$ILl#&4ygMaMm^} z?Nz-(KWP2(Rl4z>o^-6=rMdO4g&DW7CtFFc=|W?Fk9Fp29O;5rzNYghFP)ojFLSHr z&TnudKk=GgX|pW*5u2^Ney)ly<-(a#cXUd_?4j?mHnYVL&pdH&&+WFw4O=x~uZpVh zTOIZqNc>CZrZ@1bdbVHk*w>S8=QY@q*15Om=WUg9s~Vl^ICoo;=u20O7TIMKe67y4 zC!5GT$MmMF;n5T9>Ab^?>?9g6QPg~v%hcYUpuJk%*W=V}DeIDS{*ar@nycoX0b@pB zu*c#ZF)$S5+|8=NdQVsAuT&(}_ukUMa~ z=3W$5P)0K^8}77ITX-U0HMi)eox#LkAypIZ<2PcUo72v+{@ z^~$ruvwb0qDbjGA+Sal?RJ8X}8Kr{CV?5in8~>5%_*)r`1FSj2 z@w$%-3(Yw=m~9J@jXd%Yz8B+{WBVglIEVAU0si?axuo5lPWc-sziExD%=`hr7!kg+ z@*>ZubyoW8`WS=7@WR&_vLrwv96Y0qFFD31IL?qX-Xi}WhoXp)h+99!?QEirPuhIN zTbq2}?`cXY-Zrf%+!BkK5SF;RYxVKg7q9b6ex9$bhu+`74xl4f6%GZ z!)9{2I~x=!JKAG?@CSXSy^AbbG&Fji-QvUUb-eIEDC2h>b7H3)Uz=389{=I3)kAA_ z(^}6ojcc%cup49U8PjOT-+Q?K@+13zEn%l3{8clF48uuhY;7uMU&VXI_A$YFN|zgy4NMpC}D;BB3%@3+o-Ti=-}lPh6P7;+|J zl}78ByUnPv-PWPE^<{Z7#^pqeaW&*y%YnU&aq+$)b@&+9-SoNj;5&MTQSybg(B4%6Q#ee*r%skxqEb{e#!dt9-T!{^q=(U zaW8!-r6rrYtR;Wa=cX=aJX+w6M+xe~oH_1zDTNO8STFxcuP{>6t%dLD)Vy0ss^!N+ zRw;v9ab4msQ=7Z~qu+YqJw5B_>U5bdMq?F|&CyY@j@o?5dg(oVym9A6)@SeO`;24$ zAJ)DFtg0&QfA6&qct9jTL`21N4(A*Y1pyIJ2@gbS-cnODryMl1#>&s^-lR}jSrM3- z%dG5p&5Tsc+jKE3AycQcDW|JrO*Pe&Sy@?`{C~f-_J*U=%zV%D|9BprefHYxzTWk& z_r7xFy!Xt3d_Mc0nVtA|)k%ntoR;MG@0mj(?LPZ`JbspUzHeSA(7nU&o52q0sGn2; zvHC8V_<`B^BFfnb;mb~4pdh@HJ>9e^aVCJjImMCh?4pyFpj^jO{9GbuDR#-*J}|pt zMj!hCvy9#z`oJvry+>>b@d>f0X#{#lPt))05I6bk3_0+ynXRUtwfOmZu{;06=9KgPW-h|u6OVwxwr5}7dc<_M;}Rf-iyZus8K}||nxck24+n!f1h6xc z?P=0eqG96ye{lLl=5D0VKX$O}^Pw5@e>mC>ADO*e9Fq(kHdAHzh?#&nxa=b{BZvGVjP*{VmbC>vunH)kwc?=B9nR4r2hOdkm(Du%O_^9P7dJ&le#(@pDo7o z4SCTgW@ft6(cWk@kN}1N#2?+p^noIme*#YBE7|mkIfDFY(x=dNf?*r@DNJOYTHE+e zM2pvy%nkVdf3dFberkR}Jl*^ca~#`E`^+3T@y!Oal~D}abEO$Yb5W5^fjH+Qk@D+5 z>s`vZC2w6RG@ZO90)e0PgIxa^yq3>W2wwPC^PBAcxtZCT^k{2Rtdpy6iX8p9nG#Rd zju^xq{hZIu4OLDa60-l609N>7yNxd*X-17NUieP;oV1n38IgH3zI5^^wdp1(Ey9)1 zvv=z2?`KodXMFg#>4m?@H@+}^1r$>hwz5h*&$Mu=kDbP8yclL|y$sFKROZOwKO;z) zbbA|+JtB98^KQyN%^^k3JCQvRV_=72ehmZFK!@kt@5{j1Is!h9<54)74udb+bmYQ>8RgVl`jq%#JQC0;{5bR zP$@Rrb2l|kE50!YjY`<8Iczsn(Q%unD)k!sIqhWx`Smf7E#1=+g+7%BG7 zcB=g6D}F!qoLmT|*=o%%CWy3rsx@8M!OjQ?(Rcl7xOX>r>K$_fTIjKy(#gt$--08b`+b;>F$Ho7%BLOKt;26zg$-C@gzS|xp`4V5kAqXDVSsSw&8Dcr zy}7)`3l@U)Q3Cz`?qCfqW$0O<=tx_95XO`c*o_E7h>kYro(1~b51T;(!Bv2=WMge6 zr!g9N>5)K4iqL;n{iaL87AOhXiQ^5v8kf!Mq!~gSH$z6!0z=JrZ^WMqWErhikIc`( zMj2s6e$ILk>+cDx!5rD`f&4~mZK<(k-uIEV#gN~AZ~EMeFVh=OR$pLwDmw$`(t50u z(Fgdm?=(fN8$r!4jiGGQkDrFV~Xf#o; zJoc&RCabquvGP=d6)me{EmsvmDCfz1?X`@I<@T_d{`h_QsKkjG?GY6b-wr)|`nMqw z-=14{`nO>b-{zlQXO$Qm@o{YJ=>;!{_;&yL)4xrK`1ZvEr+>RJ;#-mm_tiFtNjAVF zz|^TjrQ#_(0u3qD!o`CBblt8~hMU1pbS63FM>Az2(-^5mr*V-zf~HTLYOC>xS;?U+QLX7hSi^Jz=JdWI0B6(RJx^9e$%6 z!@cNoIuC&Rw7MDlMdp2Hrpx$yMZ8>?DB{v9`}VDIbZUVG)oP5>`xYp$g5TJ)i6YH< z>y#n?nkah8)hEnJ=}yG9EA8nItP2^%u)Q>tgRM;a30xPQ{rtdD#fFYRQVxx<2k(Tp zZgB7DX8*oqq4p(VIzv_yukm+>I(frSkl?}lYl;2bWpisp5nkd_w~TU)~n$qhf7Gg5w7R_>2oP=@WET;f~#AY3**^pwl~ z#Vi^gwTc_dfbVykqwiBKm>m3B#?*U#D{otd%GbM$X^UKjSgF66&+2hRmX+&&F{jW` zFZQH4L%@N1&PlV}{D<6n5?Z`t^23wnl@=sT^88=TQC3gGuMHfscaWSlYsMdJ-q zHHrbju;C*#Pm6f7P zifmd9PBullvKpjc2$@_6JL4^plBCzy5ILrvmK;-VFhwcL95scuG*o49Y@$qx5TnKK zOgTe{fw8|l3y=hYgj?=&-%XR#)wIW!D{+@TRFX+cDnG?Y2jDbXk z@dfBad*N33k|m1HzHlpG7UF#LNiErKd%Se7B*JflYeRf&=W*PrUzhz{;_{Rjcr=W8 z-K;IJ&kO`Rqq6;mD3LA?xI{^GjL{AmWKxuvM#&jIlvX{OKOa6^^AQy#!|=j76cudf zjsq(TZY&FJV$}&N#`PQZc);HT^D%cjmmkcETGv20WboTDMC8!%076D4zI6j%ZXlRp ztTEQl?;p2*_lSVTRHX)D18%%laB)*qrmFcqxCoxJz%tHRnrp0j$}-9qAZ=+DD(hve zdTy@8ygIzxE9`2u3H4n{c?g^{6)lBGCM|O#}29wzyfOv-HE5f zh?FYh31>#DTdz&v=vFkerN^n6)T91leOtO?dC2_VM5F_Hd#f3;qcm`|u!=|Y1`VlS zwx#zHx^mzmR?_x?Q>DO^>8~ziqcS~Kq{sekU#6P=`3L0?y!X8I#UR`WSF3mxDq;YZ z$ifnNASwE)h4%tSu4I+7l7Ea?$w@GFBE{=Ok767EzN= zrpAfFq!Yj)(4uD^P!pBpKX|R25+~9II^0n))aXRzbfowzY&R*`tu}@fGL7$yNM%BX zitv86HM86tCk~09ZjkqO5NX`MYdeUQNe{U+USv5xRCEv+OpX`BC*MwTHS357q{3MX zlurlyD0slm-`U=~ZM1V)O?wnUe8pV_YlBCC;-pkQ}H4_ zmw9+Z@oD18anWj^1pm$$*Vt{%dQlEP3wZGhsI?gZ+ie36bv5KU5D3X1GPUl8c{mrq z<%`Y|1II` zdV)y*muR$(UkEMU;eny7`SA>F|nPBhxj)LbO`zfj{_Qr z8lVM{+eHF6;$*BlEa~NQ38H6}a^0z}Ho9R#cnC3aNM+w?HQ?@XqmHL_hfRZP0$E!g zPMxDT@reMAGJj>?sr8NUWo%5MKVuonL*L!E-0uaEqdJZWQvM)r9IEIr%R4?$=#acL zQFL08B#Ns>Vs<#|nWlXrVirjI&hMS?4`F3lIBaZwBF+pyfhT6CqKM2eE4vcq0v-dE zheQDN%))y=ryi8+kGSsJFoU?yUgaxB9zyrP);vZw0>SHTP>sU$TQ+eTOnSYjo=bQ) zI5XXu0C@iolSD?<#jp4EpFaxOF7y_LYzp#eP@Gxz?@n!TL`yb-`pmP_C&NUq#Qy!t z%WW>vt9EIRXcI9SvIc07tkUqx`6&7@n(E6Goy9SWVM7oJlZeoLiFDA>yFAfQHv}6M zzzpX`vkT?)Rd2O(%R(BvPQf<2%HK{J(0OZ`VO&;Q()QjC*{0LMr#uBD8c@aUDPm&o z^{Nx6vFX3brSAfi*G9|e&e)!u4>syXXoFu`;81}-Jx7K@@&rmJbUi!hMMUgcyVGqb zEh0bxP#0loY3ok%K%dTe#7zkQTCVGFcJOHw#^82#7BgZWooyl_Kr}qEWNs?xRCZ!F zqIDj!D|>XdoR})o#p>DehE$O|kn#^eliF2hVK9%*7PXvpJU1ZnKutSadPW^Ic_Q9# zMa~YmsHMa6ET;wTGRfqtd< zD0y?45(iJgJIT7_&7tt4R(Rv12u8@Yq&hNHe%@8|sJcBx&8|p*?+!7zBSPr_lXQX( z1vIQ;e*@S;{N`#+sPp^3w!4qpeH4g2Yriwk)oTO(I9MG}{F;yM9<^hRGwsSDW*h>c zWcu`M>)V3z5p<3f$3aG}E6~ITGY`EF*5>xo@Y^T|Q~Bh#OnlQqfdnO`ayq&L-?~AH z$hqWiil2D|v)lzQIwyiheBEx4UWCX|wid=Dw-zqeg{Qzuot>no;T~DmU0m3u3nqi} zd0n*bdn$r*6k>qy$%gLs{Q5mUW3GL2?}q;>jRCoR93!AS%n_isB(9_s-2NuGawY_K z;~o%p_s7NBAFg(3UsStUsSrAC*7%yez8+C`92~t4c$|`i={K1rxqt8$LW&^IPZxK!UZG(mDG7R^#{IfRKY&!Q{^zLU}3*NUb6i0J;dax zzYIs%Eo*HiXxUcwl*mC#zp3s@WG z-6LP^A*!mz_sxO<8ikLU>UpdoSVQ6PAC-_e%Kvv;L&-b@{{*`#zQ=9$Be*UiBw{|| zT1=cXT3X`1GZTD5lz+)EGmi5)nA z$gxO@b&~Fmk+ZzwF7saby;t-wN6St=(Km$}lp~1R?&xDe#=5#crphTkk)}Ny;bfi4 zZh%0c??eeg2W*uO_(WGx86!8eW`i$LWVS+;?L(i)$adOiAPcYiFCxpGAAF^yAh{3$ zE$)tK+aLQIWNwB?_kKTL%?`ASnT6?Sc@HMWse{AnBd^X7om;DA(%+T^!ScHNaUf>s zlI^C>rEh?EX5qpAH3`3srg9 zH`YWtk9ov)r?XkDosFz^H-hp%j(qRz$Wz~sVK9+(u@0yAXotQkXh`1g7k#nn@+H5> zE}Mc0;oOddstltux7us0As}BFV-afpiGCexSr}xU*=W}(^OnpBU}*ONnrEPjG<+VI zmQ_gY+pVk;p%(~X)UA=2gM(cSbbSS|A#L3_e?u2o?I-iW@#XmpSTmQr^I|4q1iJjy zsKe<}a;#oY=AD5q@OdMydO;caazG@W7dbbZYp4R$VdlmtA&;Rjg2&zo#~bo%xP6FS zGZy%4g&#DaKy3$Q_aK0Ht2{d>GSdje**KSCV}}(+ssk~D^MYXgx5|fuV#LI&a`I{d zAf}yj=LCxJI6Dqk$zCARAyHE!=ER=Fw{G@(vMtOvJlK~d z?n;~qUqf6o5gcn=7vyf-Bma~oG7@iKSrGhi$W~m*Dfv~F=$yllp*s*{n{KQj0I){2 zPRP(O_A;Oxj!y zEachap|V}8=QLrW>Z!}Ob=G@4o9Yi0@zRE;^hCR=o@a#+{wcuHB@0?+Qj zS?Z+yCT*IfCy5Jq7@8_4FT2RDaR^R#|3mpIbuhgaQNcUL)J6F=PhXD(G!1`muEuik z#IvD?Be9o&xp7vF-?G7CU==mqe(LTWqU6iy}S#)c*WT-@E(=qR&598>}>=)uS%yuu=YZ9z$z z8P^r{P(U{lvO&=gA8(*TBBqffEHl&bPdojE)jOU3^!pL90HhAKK~Znv8&2w+tf$NP zBzOV=sD~M=5w&K`Mkk$h?LySj5N73KeB*mL$XdRK@V=l2r57IY#SL<0Z?R#*l>6KG z%zwb`jr0u541ZYjoTQV&cX~uQoIocBX>N(ny7vP_lYUgQ|YjQ-d^fm}6gDz9} z|72=bjyMjMOGk4=O3?8{>Lm2s2Es?g4)=B#&|+#JbXnT{85+}O=ZYJ0tK)FXF3fBe zM6b>q1FFRtGN%Dk(E4tGV8nF223lRf7;AJN5gf&-<|cBiLtY1v9cZXr$-cOuw7%R{ z{Sy^AmN3(7*7`uh)I~J*0Clf0$|rJHAJLI=t>O8iK!zSMvt(YLNEWc<8j>g0wwi&E zJV9Z*k-m{;Ao2Mk9cCao`JfwgMH`9?+)vOe^$sHzc3BQEQ@Y^XkW~oSac;=U!|&-3 z%olW!xdl*6ppMA}Vj^$D+FT%JmOJ7?=pj{~0Sa{l0nP#0;43g+&YTb&DBPlRI6$OM zUydWE^c87UWafyBxU0Dd9V0O2V|}!icFI#B4`rLGmkI)|;SPjt=W}WI)tUdhbz^%j zM6#_Ul9WI86%S0KIS4!62D`db=bajx99U?G*E_VGvK&L-tcY1eR$i^yti|nMkkUq&yqaYm7`49CM!Pu*DM(uEKqT)KbSOnAe4}ugC#EM~L z*09kfD3{e%*YIM^zwjmoaw3 zd&czJF9)-(W)plZ%Uq5!H+9uSM4S3GWDr50aIMW;>SDB|2~h8PM2WFxBbohTW9_9I zEn`H6GjR42pr_`a^| zPBg{|YqTo$(_pd>pGQ zGDo62CtGwl#Ko3YhyRF+J1XsNQtdt6{!M0=hk(QEI>O99N?3{aAj|6;D2i-q2nM)d zYr*o)7zkC1(|fSBwRk66yI~;2ZdlTz1EC?{MGS+)xcFr_^Jd$GFGO-P2Z`ViMb6<6 zO|=mjmjPikuy;3QmKa(y(MHc1YKA_2lA*_StU>)v9vUP{V+#}#s}>7q%k&bF5=-Pp zBPU4OOG`i&`{hL?qHC4E#9OluqCYpDC3ET;G zdR_;zodq_KcVRT{oCMu*0?^3rEQns4nTsbm+qYX@$n+a8cHQU!5#f-)xwc%WjTD{- zD!AR#pn?~jEoKBy;UFW3@<8KLGeOFax0QB}+bq*dMN0QCz>6mXTF8rsAR{hLXv3S8 za%?FmLx&&fjc5^-5Fc^OkpT}Jx`*V-B#2BjiQ;J`S;jzQqSHbO|8pnkvs@b}(scg{ zSO(gz#t~hl!IUZgUMdp1N8i)d&pgB=ydt8XZ_32MqGJmC$%rwHF7G^&EY+^Ud9ZRE zI9QA>3U%jHfRV%I;BOL#kD!XcrfS@3_t%bmI^UGyN#&C}2a7Z>?Y&2$-gv}gi1o}9 zk8*thB2IdP{An*@=AwV*oMIkY{)d}PZ+bCAi-XJX@2wxu(!_DvI_aV_MW|Tdv zKgphDBD1s*uOL8;pX~9?7Hbe_dv%>k2S3tQi`MAV^YC@s^DsYA)|Np;G~p7txl9Zc zb1sob%S2HX>$0GYOEIP@zOFD)uQ3cP)cYX&J~NBfLHMu$I2SlPeJDhm4x-TC;gcQWtq|U?; zsm%T_Nac#(Kq{600jaD5v40Z~%50;-f>)aSVW`*}GpwW>jLFK4h4R&5VsOf^bS`!X zCWzyLKetR#+_$@513s1*E7WKoUKuqF_Cp&Waj=-6pk$plasD7jN+S#t10Sb)h18WTd#R6}voTW0zqNix7B$U1p5}-8wv3ZXPAF zQ;1$TzvMd#ffOTKPaQ3$i)G1j-e?hQMLf%r^#WG|@vxwSc${>Y!7J`zs8OkQhh5=E zsDp?n_Ixo}+>$J3oG+HJGpEkSA-Ya>8Kd_(M!hY`opW355SzJb>rWB6rVjGFvCs&D zYr0{qSU;M(*1Pn&SoQf(n5M%t77r|~ zhP7JA#(my}$)Invjf^PyuDTbH=siO%HEIu2fO zcAssSo~RmgX0H#h@RB!0vP_*I{MpkRybHA$Q){s1R7P-`I6!>b|e%|C9%4OMC~GmUp6g_P1waVAi_@tq@~VZ= zStHA~ba~fBqR7W|M~JG8-otHmL(zv5^YBF?J&GM)Cvh1{M*97@Zc3Ttpoxz5*y3S& z$TN7|Hd#Jd1d~WrKzu8_?nO9xgx}~aZ$UaPrDHdQUsg{R9&}3Xoh%A2e*Q^>@Q1cJ zs}jcV>9yz=7H zrWjU9n9^H2%Xg9PzSWsx4qPBL`w|Em4lIOU73eEY4O|bF3%czRF|(@XHQIMEj*!F88-ntC_EsD4Y3d`zF~(UCGRXB|iR_z}L%55q z%tZ?PH>qG-gAs%9hzgTt8MfhwN1UH(_EcsvzgaMXd@cp~yyTx&sys49B+q1|MVcU! zC;|hnnszwA8xQ0YdVp&^D%h<6q;&XC-LqBt2kayH&{Eh)0l^TtW2&b7USy{kn=@)& zJ_~lVXF=WyKfsqEmm%83Rc$MOFLG0kH(YuDv4)!ajX8+>=s9a{EW-MOx&8F_Vu<;a z%&8P3lE_%nO$BmwRTQ7^trR{lXvduu= zr$$DxX?op^FXaX$?!Ldp_(MN*BRCzr<@55I>7uXss$4T&^iOxpQV1n4Ls`h@5%hph zV4|O=i(t_4x=ZP*ziS#kSd(fDtDzvG8e|Ue(~bmV489LT&yvuKA+_DW zHZVVl6>3boVIG~U=C1&xLj(rF{Hl$-m7O9$Li+rtsnJ=TSpkJOL`ZcduzCxs>Z$&>+Pj>Y0#1q7V-+5;mZUdWk1q5#x)59@W+;N^hIWAf@hh(SCT*Z)BT zJ7_~JoWa1ETjd9T5M86!tj9IcmGaadL|XKfIN9(!eWnObsDW&u15UV902YC14KB*$ zdotb~z#D_!`0+m82D~u>c#K1<}TnPBo}bcJ#$VIgR* zGe3zLUFD&fqBN#t;51dDQg**m{7;HA6&U_sSR>Se zN%+a`2HQH>Kx>4wY`S6M@`2U}j>OZ9LCc`c%;$pWh)*o<=4(WO*^hFYIA9qj5``f! zgz6;6cJ7@8YA(*B(a6GlBUzalhajlwa;+E?AGf)o#=Eq_2&|iG0O3u$RupvCl9-TK z+`VmzHgD1NS6|t1t;ldYf*5%$2+8hsh?;vRv>lOa66dT*wO*6!4v@an>%ddn5$~~& zJduAV$6hBcr@76u*NL=F#Owi-Btfpkr8uxp$j`46UAv#aXo(}e?(rf6BhpzyieWn; zz1NG5ZYPTz^9rmx()WraIsJM>s>DHCdp#tm*eDyW7ez_OajYN1VQa*;!@1p#hwKm6 zi#cLox}14~xFx5s#0w!zA$A!wD@I<;u#z(MZW#HrJ1Z&nXF|87f%Ak+yb&f~CuGiz zz+&^|xi^Xn5tn@U{iGjGwRFJh#FM7ja3hXuEZyE4g)j@aT#m&HvB1T4i-yq`q4t2B zfpmGICIQXqHJ7Ju5~V)9MwJ5QHwuhdc6LNr;JGO`i(C^{OgD@3&9~(TH$#GqNHss- zEJgU4I{EO{2ScDSdc&2ldh-lgtZjCGOY%*$nWOsa6jL#s(uH-Ito#Q}szBHgy!tMcE5 zffgF)Dp+>xs?w2xkVwltW`^vtmbW;uGfqcHX1S2Qy5)%=(=SFo)j@QW`V)H9Uk9)H zf!G(E#J6wuLe{45fUm}L0W?-O8S;xiiufvOrY0ecoiB%Z=6L*u2_fq67G7nikA-Rd zb@uOZceh>o^*?aaq51vF2VkS|jJJ^b1J?899c`u!H7I+9oxbKNZ>tvU9>hY1)+|~T z_(IOTRSX?)9_ohkiAqXZca#`=~c4l>1X{QcSOUW{F9)^0`Inc2q9jX%j>Zx!dH zjPhx?i8HQGnQlxB>NS-U=VEs(DU>(h*@XsOsj&ZsXYj_yjB|sIQP+C;^jwi)ZjuM* zimvJmNy4gqVM8LY$f>y^8|Gd;=ZPNaBXLqv7j?`&B6b+zjTv4x&c$Wc&T{TN(K&@@ zQ3~pD89&r6z)`vY89P+U_47np2g-qWfQt)&TRSKZ&J$hJo$PH{*-j&_h9b8vW2@lc zSci5P<^b)Ct`fmSr;N+^xR$p@z9;Xj0xgXYMjNWIDQEYUd#i9N&hE>ew2K^3e6`39 zIK_7u)R7($MY(7a(X92{<=3!z)w@pJss-VRicqIe#Ps}^$~t3neN(F|`=A=u#ZDEs zVGWXvXb_}k(2Our9n4sd=#Pm!LktL*Pr zsAr-i9E#T~RMBIeDv!~%&3QYbDjZ+E=RXoMxYL5y#WM;Ukvj=o*^%*FDW z+eKz@@jbUKwa197?!vh2FT4>PK^=*;Em-d9>bKl^JIULP*p_kEjfb}MAs(Y=sN{#AuA~49Bx_P;B_#Lo-0i@k<2iUFd_I9fA%H?;6 z0%Z$XgKhP8ODV7tu#p|~9LL)icYqegGkZQH@c_Be^F`20ki!9l3(K}5AjtJvS%4jU zT~1Lwc5U4k@}c?SQl-u4D+r%-*Lh zf*uZKa97G}?u2pjmGh@A-2t3|k=Nb{m37<5<)J%8L4fbPic7)tF&G@8mk!Y1WZw~W zQ0Ckvx^{73^+=0f!7AaDaQlUvdY9-CS@XSj{l*+qUN=x-@I*fjtJjc++w+IJ^jxLg zEynSE*4-kdoO2e1ffCb2TCsA#&IqWYIt~?8GU{|V2l6`^3sw>1JjT@Q_Dgk47#A$evJ<9?_P7LMI>f@$ zF$e8&3kB-hG_g`yX(m(JT`ZH4)#QTj%t_BNj)b z&xbTm_YFG0i1ht%;C0gXMWlaNAE;{m@Mgq^->U(0kRI`2MEaGjgNHw8MEV+d@;VJ1 zj7V>rP>+agSWhVH$3<*S5e1%)XyB8G^i+8HIt_dqk=~`QE!`cFUcQ-huSeNqwgx!dJcr4Yg_oZgpDPl-O1~{*e%!JFVd&I zWl)Ojefn{`js##kVm&VPU3P<%L@qH{ z%2=!fzpZ^Fpk%517L9MoSv@j}9>HkarwSu0IirZPFurd_JrsgTJg34kW})a+m26)Y zwBOdj41YRbwZ&-nZ>%an%#Cs#RtNq07qGA=ljzojP|B%`Wm#XG4QdHE>)1!7GJ(Mv zR}KGlNXu3H)kTO5b$rtlKnosy;MzJ?b3X|+uE)qG9PT$SB)*--cNmdWP6)=@hkXE zdbkqT5qoU9_(l2ZBA8rJL_xusz#Im`AuL$+$^h0LhqXn?2G>7m&##@XwlUYf*J05(yH;jN`V4y}gEj{JF5nABR=p-ZqPKhJSftx<_ShA^-}?j7NU%y zLDERo=&7K-0C_;6(E?0j1>6ZMcp+BD8Meux$L2{ z3^slHIQQewIa>&T)k`j4EQ$u!E~PY*UTaZ`pHm%#kCS1%v7r!-OnES^__1X|iVG1W zE)Ux1(`v|^o-N}a5=Ak$IbEFVE=E1z%Yb82aCkmCBk>fGY_%=|CE! zjVm{vgD@Q|vt~&UWvEFqly0XI!>lx1O83LfMx1k9Z)iW0|bRY;Ef%b4&prc-V&bPD}tsTJxu~&zl^ZDB$&WQ_gPF}Yd=cHo6A^Gr9krA~*&B3mv zVo=#zY7Q>N98`wC#&62LS^7JaZjF-S(os^7wzQXP(_f%J;cvJs|)@ z8Dvdb2FD@@@bK=#qM*wt_^CP7_C*gI;Q3sBvrKd}KbHfRiC)>)ysAUUOcE}Cyn`KV z$tGKK!6(yz`t$uNS-VW62-LoI8EVgpsC`C6?fZ4@`&oOBtM}mEZMNIluDKEY3){om zAJH(=e3}=)rH)5ROGsc-}kJFi^wGk~JkPkcp0o4K7fJgjhd>IzC`nfQ!2|=F^ zKOzcp21WFl-`OHtI})+_=SS()KO)b56x{GJ+fVek@(sg@2!NrEEiClf8TYkKvV&=U z=U^J_Zl3yV;*vYP7|_ZG2{K%J!_ws^%C_>%SN5o0j!iBQ`Ab9cy+=h%l5-;QR5JkV zJzkPOJSu#h9@*|V^7iwG#Wr<1EtffuLH34_H^UzjX=%=h(7Lpc@KM4E#6J(;Z7duX zarV}0Z(I(<-zYrJHinD#;g%4v@C6FVJ6Jf3tEeBh7lZvC02tOva_(k;*1K}dAaCf-YD~zi_YmUAa4xvI#1Sn-aSMYt8t;boUvR4 zV_H##d}uj1yvxz-0yGN^*v{o5H})dD&(`lh@O_BgEqu>?9PjLAqy9bv@55KXj);4S zT_)a_=mH(sV0xmsVs_!r3p4@6<(&)pHVG)E(@20_V>#4+_;H*8PWLv+?qPBMaCS#` zPvcbj!-iILG^(HMr~q%_Jz8AO*iJF?iy$(834-P=!s{_r6U$l=s@xV9!A|$y0kO9+ zBiIO=JEy6&@*6Y-^V_l&a3GyMP2R8q>?_ns%kZpXt^f|PIXyMFyNvm@esywSV?vqX zN2Hf|itMUZ<}CcKLnP|0L59MCp(N1uend^-;O8Io`uE_13jPk>9qO(S8Q1{EDa z9Audd8{v~72dxwxME{<0_)0O&td&o%6c?m$vKbN1>mGyCv9R92o!VeCQ&xfP9nn)3 ztrE9H>vrX~RTvAzAMfIswB8;A+XM@mg0M#Mt3^seWcvJrKCRpzxmv{i!P${#MeIm$ zC7@MTJlNHSUXsx_*^!BAFyFMcU=KrB)=wi^oD1l6jtKbCqRgFmU$xFMhAfyXcdZs( zdoue?Id|<~2QT>#*)LJqtC-d4q08wZit;QYapF)1j3i4R9_q%XE1aT@dOyb9h(<5s z82$bk-h1|Ld;b#eo3LJ6%oo9j9kF(pFJw-F0sd;^#f@R(8Tt4ckyxZVP#tziO!oaW zByh?rb{-i75<*bc30Fy!8X~OI@QQx%@ZT1E6$@$0ac1tS7{9V#sHofIcfMzj^{E>moIl#ld05 z5yeeCfp?w{8HVXU$M{gCZFyd1uY;Q7NqNyaak;ru?pg=qPN1fv>mZ)x$aL6+alxgy zy_=6EeE-x=-;U)Aus}zXRn8|ki$PX zkTRf`oUvXM2^gnSng;)g5~~=WA5S&oc38(F@9*v!BM%)Umgm{Iu}JJ2`Z2c`wp9mm8i2l`%I* zHsd|kIc~c3mft=tX8H&%f$C}_Qp(d48gs6{wlt9QHbA(J*o(_Hz*%VfKCQPXhF-<7 zoT!z5-T<9hgZyNJ$QU>o{WKAlfZi^eBZ9>#5Exl;t{~I1Y}Tp+((khc9J71N@{M9# z_O+_~;ml}bMYhXEDSk*Pf3(LR0N2FOb-lOBof{!v#KHUNMl9=12tmII+VWL$z$S4a zr*_dMQJSN0V{xO!D!#F+h^!8NGq~`4bDc_)ziz_nV9tsf#K5sS(BTnriEWT}@MfZd zBjQRUq=FE)%h4-xrFtR=n*H6`ft3*`C_@vy4WhG}Lb9|mh%n+oL?%vkt^BG1q5d3@ z6et;37s70XSCZX?-A2J?IBewQ$XT1klq3x=)S(^_9KaU*NXxtu{qcuH3s- zl%tvs+eBw?+B3o zLoiQP&Tr=->+;!d?e({Pb?`UqVV*B{XI@ytM*D!E`K`v7>0`U1F%TmERvwm*i{J!x z9yx8h7&oa+KpAQ^UuAwRa11Gl1SJoS0fxu$LOE(~NHu)5VSB(FXk5OxhUxr0KHukm zC?ry)e+QzT(F%*=nJvK6iem%C4PIaUCiU$^3Zq+AF@m!@E?DdZJ<0RTO?H}r*lr}0 z8S_nxe>~{fF`WC6?*~qQm+$QmP0`v9Os@Tt7?RW$;9#7>1h_Q%)SrNx;02KKEOs&! zm!;2&0%}#_8!?J|pB1rb>4n&I#Z>kNf=R~5O4FHO41+dWZg>`&AZjdV-Zin027)~3 zO5TzmJS#3BqAz$32zUvq$b)u9X%OVtD$z+UdJZufoT5wZqMLAztWz;pnw}Fq3fAKu z-#8S@gM6W-B|lhitf>1-ix={SaY0Ay>sXO<_TiqM^1Qf(%`SQ#u~U@`Te#7xK(%z) zcwS6PyBId_oJ-Cff0J|Iyj`3qhrb{;w0dn^1^bZ%;0Ihw1}d@y6zNIl=TRrPawDI-Cj{vmc7n2Vrutxu_C~%lPkyvhEYD>=ZYQ2a{Jj|P5czvL zX74^b&wZ%tMVy0JmcxANW%0#3D?*sUDwH$q?Wf=L|ewtu)l{kLZ z%YgdgM*CE) zAljWH=j?_t-@GdL$RPWN5#r8QXPFj-1&n(qiM9 znqgDYuEgCWYn#R7fmao1Skrm?)+E|D-ST};P9d;XB8Y*!a+z~OtS5Od##*t;4$biGVlVL6Jkswph)EQsTInOCay{5z6zQVW1jJ< z7$Um#l^b3~IgH`8S3wJ}mgZhDIL_7NU6^QhQF-|PjcwO+>T6J6UeXQ0@S8-Fpo$clX;f&HJj z4={m#&wLGg7UTG6AC#VZW&VDE7P>WjKfASk?tW1Ri^C=v|Jv!29{p7;8%wxKiZuOA&78R!}2saydS;3p)>p8$hJ?J1F|b ztjnN!FVnV8C?L5G>6jQm=7?zMzmirRhfe%GzIY< zgzi@N#4yTWMnhCdO|gMxSn(IpwVX2$g_T;?PeVF8$D*-Dqq6>ME5?)4E^3$2dF83U zfc>eLId6&)oY-656zRca0BZ(XCVWH!bb16pW86F66a__&u^%@N4b5P}uIw>+*74wA z*aZj1^b&-`4Mj5e78sNT2j!f%Ksjd@$>nc>dc^Zt`+4Xs08eI-j6MYGi0mTZJSea5 zJ@=4UMkv~QNX()!?!do-;$AJM{#9IQJ}&?KSHNby{PWu)Q^vh5QnNV{XAaprZuPCG zjZcMUQ0rMZicr(&w;@b^Tt4|Wh)z{SuN0Pc+bi%HaAY!YB((nV?;u7C=BoA`;C?{a z=65g#K;7YY#4@kiSI}}-^w+I)0W>9`y_W_sT0^DySw8%(801z{fvqR2U$N5V&+j69 zZ)(%jntp~)L7s!HQ=6vMbD_GSC$X?L^EBaR($g{coPG;jE_h^<$c<>$95V z%J;;Sp{YQjrg2+Vdyn=<;CS=Ssgcy&~r1zNcl2CcD za2Sr%m;1O397Ey*F;g4>bMXPf>lnqRJIMob9vx!&Levkp=45Ypn(l0~uO_uwuKz$3 z4B;T)eZFzNeRN)D52~w8)w4YN6X_~91{2dh!af$~mhZ3#R;8kyZUBf_gu`SxPWlXc zLHMq}!v(Lp?R$lhXU{`oNnVq;w$%0-jnr2B>v%cw?V#~^vaS*GQRAW*!yB3^UpXu~ z#Ah|lzu#M2W@Kc2Y~(e`j}GI2!-}T-4cxj1$n|d`SP8Ue3rc_0y;uX@)XKfy@^1o zo*_|w$9eF7Ge}Nc1vtnM7Mlx^1tQUJtlH?oqV)yPz&lPc1Y?@=Yj9JRI*c8h^Kxg% zqB=A7vd?&Vli5qH3Zadh11k>UHv|FdcU)6xje+R@Ovj4uJOTs*MmqLG;Vb{n9u&Xv z)OBMk?anE$5paNKn$e^!qRG~Vn*88WPS-URHpy8Zg2DlW-i7)|IIaIs%n5p$pQ!OP zKZQ2qN-_|2!0Q=m^eT=vvziy&j{`N3)qK~}o@QD85f%?+ZvRM>NB?1f=|(+!KZ5YO zHy|038-MR+DgF-G?tXOu`HYWS+ICm(W{*Mv9`zI@SRHqj=`SAOknqu^u z>O9l9v$r?(GR##}Now<2e`@nHFtK>E9^X|x!;tSn2;NXey>mV<(7Shp;&Lf17i zM?2K0I-?RXVVSl1tkQQyO@u}E2Y)1%4;j02GHT&GrVbsQM;`sV2;x-C0N&yR`)V3< zr0-+68N4X3{unW)|G}a-%36%o1#Q3QxBhk^Y%^JSU7ZidVYzq%9=-y?e5RpEjQ84L zw);}?itYKU1t3~>YGNmkZ1RQKJgLwz5L1kYXEtsXsJj@l(z8AhJrz+vXjkZM&{YR= z{K^z%zj}fS#a}PC3v-FvmViDBfqvOGe;-gca>IrjLo05gz0DC=Q0n0lF8R(V?`)sH zlabH)U4h@c3nW>d{6wVotY{ho%%7(u85K=q>&YuHY*7z5H7(rLnGxS1`Dn%AlLngZ3ZN18(EhD@8~GdG zYXS*|{O(gx#`CY}A7V&a6$)~iD1D)KEE}_3dzbtJQH-eR3WK)9es5*gEAUR5Ao4;g zM-1b^1yuY-93y~h;!NF1ZSU_<)KLh_xeD!)_hE-aO$9Z6`xZFHc;AyVt)}JcGQV-m z+rPKt_;bV*etf|CS%96X$lzs$*6#;|=|{R+Ux4b&&tTHmn3GZ8=$U$}aQhVHjy)G0 z2N(duxArp(4qQY%48Vg%LYw0W;p4C9-0qw_RTrLs1o>K8C@&zLzJSQ%HS$){Guji)1WfA$;&0kKM@L`bp_oib>B@Wu; zrm6Ks5kZoPLcuGmvgWlsi=zCcEuLuJjbpE4y12>)9FCKF75k&L&yDh$FGS}VWvJ6M z@_G}tobIbV0shx{Kek!#k?FRUf^8AzD7SYZ$R_h0c!TJ&AMALF{3lyh*K!&(%<{K9 z`UM>S<_~d zJ>V^f4RbUdK)(ih46@I}L9FY|oO}g}+>nx4 zyPCq`kxkRX?xs+^fqB&(($8f39n|WfuV53o2l$;GA@0Ux;;iZHa{e8Gi2=TJSqxulXLY#9l?UJKa=e9{$f12 z?sO%jo{(o{(b;m_QA7wizl0kjK>_!L3(1`uN?uEgGm5^6SCVtfRC&53l4U3YEYZlz zWp8TstJoSRX@cFLBuStqg{ez(8*V^e(!0FD43B5y_seHz)>H&E%MW_|R~uhB`n zxLMx*wFsW;_%~L7;tPTD3*i)?V{I}z#JoIMFK#Zcnbb`FL;E?h;Z>?*49>lxE>(Uw z6Ok~?V`7l+zfJU!969Bf$gRq2_NoP;sOagGL3<%6LfnFpm29I6XvJIo_==n5PUI;nY@S+Q zjaBC46*oJE-=thL#lneYJ!h0n`xa~}>KO8^NO$3Tz3ldc=q(q2D-w!w5E6wzK-!N| z%E2~}kb}@(mJt7hdDV@MBNzsjg+}gOR2f5^(b;(S%7zxvMFzhUNn-lha^QDj_y8Ij zQ0USY9|N{Rsw~qDamdzey?i!L^CW+h{d`%z@SW%*7M(4Reh2B%qw?(IVnoU=e1)Bj zpO@}<-Ii%UQwi_j<;TV7B!V}U0swC%Aj463>bNKxR@s~wbQ!S2M5{a(-~fY&9;V+Y zg#kyiN&EmPgviu8$B!s~Ycl_astF6=ULJIg6N-3Y zcA0q@j#ij|sbSE~mG;Ax&Att++j_w7_uJTjbvSm%^=krla1KU1<84!x>SLyTsgxh} z_DU5ajLPPG%twZ*j5kL>IjvAjWMzeb01kkL%FfNWoG*l3+rZ9qj$qP#^aqiWG61|N znOQ_dM=yZI;bHilXRh z0Bto`p%V~}o^kQpkQ2BR>GX@=G_5)BU;)ncXK?XbXL!1&<9EYGl1aGuZ4v6J&=m+yew&ZH2nQtOv7f9iG1X!0*>D(9Gje~jZ^k1|=Bk4p zR5#b?$i^KJ zjw27U3xna&sO6?+`RvakH-Y3-4Z^7t?^gNdnSTD*r7J}vGO!_KJAgIdjH3XAagA^4M7|5V+usxvK>N7nshhZ-FH2{*XM}f-5NB+4fMbl@inlp;EkM zA0t3!b=y?8p;I&t!h>v6-NBn5nrUUnK96MD0d9Hzq2<=hs)dMS6@|_WT4l!7M+MYw zUEG}KUliu78qoHdC3$Lxdg0lu2Y>cT{cUoYMj^vup2*y9Jh3q^N~_!qSCs#?`*^U0 zM4y=OD(>3)=CXw#7S!e=Mfi3Z+G{S$P&=Ry4M0%pa(3z_>{PI;D)XRnx!$zWa*e+@ z2Yh}_vfVJ@=z=ZqU%<04*N=tpatsQ(Z2@kjWmh-Q z;`m+9j<8*PM@SUihe72!P1mdL-d6Qq2h|DlGQBw03w~!4c!vh?4!lT7y9u&SPw!W- zeSz92m6#2jM6DtrcJu(?R^7Cerx~D4cBk;HZ)sPS*EV?FAi;&RzPMTbAS_?{V&PY` z>gN5t?uVTTY7rD{a4#&AMV6HwMdog)yvVY;Ru$)Js^&O?K82j^RICqaX1fSH8U(=# zvdN>l?S*EuI{+XY6U*|9P+JjY8AfJDbJ-$~o!7xUjNCB>`+W?y6%S}&pP5R&#Y##L z{a})9BJV**etHT}Qf!C|8`~yU#WVvEvg4Kc{G38Yo+9A-kJKwKv$Mp^09*W3_g zDVwlmQPz~CKfx;KD+~uSDNEq>MSk3oJ$cVgTQ4X1Kk zw3Vy+^?t*bsc2-&nFZts8?G7fw(Z1noc?-V9 z#N%=Xj_n)ySUanSK=nJ3Y#x{Iw6nU-)IDyrqCmP8**nklNV^ z@S+buGscB%yFV$6_p+=^djzyw(_Vtr!e{q}Hfv2c%PDSaA`h}{ZY!9i?+f#Y7i|QH zJHd{+u}VujWa5<32D||fDFxeQdW@AKLXEO0#wv*Yxm=?#E2pO$iy&=|H)E{d~q#mIf~r8ujoz!3}hm0{Qg z%AAvFBm<#qs&&2-|7&(ZW_Pek^LAmkG0gM45<*K3!s*PcwBr5Pf3&4muc~qFZTL_q`pI-zU2_S z7dqVn)`b>@z7M**ej1{@!gQZPJx+Qcp;9dQ1c8e8$6GKKmUGXthT_q5menU+U0b@N z+E|9m)&lhY+5t|=GZC2m&LET}NeR}wqWT4SG{K@BW2Z!`N4(QKbS`!HRGw%p33|@e z%a2*Mk!SG(hH;i(r+33_q~fg}Pj#jkEzRgUwHk+Ty?wzbYqn*C-WQC|; z1E+#4x>FyW*f?#*5ZzzC7pXi3l(AuDy6Ds~utF~DWTmG#?|$eOercJbR=e8}`5L~_ zRpw|XD@D~${L8v^TZYh3;!(@-E0#l!Sz~z=4NL;(WjQtlCsOyhlqSM+5l^l$X;(f8 zKKy3jTZ$d@S{PGvDdnR;IMy?jcLS-(Cc}X;AaFGP7=J73LdeEIIAmxA2o3rkR2`qD z2HtUlekNwvCZZvs6O7gZb_R@0#&@48L0lteKI{2C-=yGnvCg&aKy1$P=zOijcTP?u}Y5ZlT%Wyl=v_AWz=vY*bY|y z_Ec+5yqjhO)zylTL7M1d&FcTC*n=&!i>L@pLv0T0{_jwT_ z+k;6Heuv4q&OSNW2HHK;#R?KXoWe7O`Fq+3m}TsK3{10@#f;qN0||dlO`1HIZgrC1 zrdcypekW8?ME*Hlt(C3$yXyP}-K@1Dewci>8=$CUnEbgLcENFb9JdaWle=4`B5Igi z*4>(zo;l2P_W*-)%qT;gKZ-O!$l{Nzc;+w}pKgtd9e_OWGc^VblQYw;0^uGim#154 z9Luxm){C%X^zjV9jUBSo3Bv@S;{oJ{s2j0J>oA5lJXUSewdWze)z3y_VaeXRS+H8cWq4t`s}yLsUbb(w?^|hI$+Ha zX~Va_6tLEtvHrjK{5**&{vvP41W;ijmu2dSd^XcMB(6PAF3PfUV-F0+q#Ua>(22cS z)|41!n*yNx8dqak9mSGia!60BHVt@Nk;EErclOhMz{dASds->6bK!A9jPm6^8J}%U ziFXcgsyxmfA#cgXnF0g)_4p?486jhPVZ0ZPkfpuAk+iG8e82>Tb4yhMZ+gM?N_7{G zFx}B0rSxxk3(Dj=X$If`n3APXQHtaDw4+l&608>UZ?&-S)P<7|k@v3mLE zw{jX3L26N=vu(6es%f^&`vq490ZGit!TbkC%Gw<3TRv~kwS4ZA=oAl18M@m_lkxY8 zv!WJ+4San!7gKiGNEzD)Q#N3voY}|9cK>0d1{v6+!Pa(5AFD#_=p%pb11Ns8k4(w4 z28t0Q<+wb{m)MA`-3(&`pQj)uY?OEAS%btKBjrnZs2MGMn`hnLGG z@`JwCePYpQIkV83=yi?JU5+z8s?8ave> z<$Xqp`fx)u!0`pszB6)yZaCTad#&M`npbPnn;*+A{jCdNH-B}1>wM9DjNI8D$gTKI z`DuTvmd_iCt;t=+PuA{S4!4a^mWpP-O@3Z%bwyvI23UhT&BRZ7QR2*y3kuUNwZnW_ENKv zE~_Fdy1LZ*UE=vjI;~y#PN_9Wjg*?h?`;jXGty^d&R{ju=MA?*s8W) z);ftx%B(!mX{;%?fK3U)NRuasMbkudoKgr?}_2RtDZiook)L zkBiQ=d;w>bI3d4V(>5VoEq)7Zsx(f?ch0pg5WU99+#%L9an3loXo!`aKOo3u=y8Gk`8;bw+E{dphv=TJpVtPK0xN;2;G#{sK)y8GYVJN^b=xo;z{^M|7Zr&0 zwOpqlB0RnnfWdModc*C0upGfLhy z(wb$SlHZTC`VL@Ij@d*7;I|b4_*oSg6J0`8xr3wzvKEE}bnJ-3f+w(=G%p{O{?JPtvo>^E|LLgj`6nB?p zH8em}GA@@E^pf!@QZh618vd=!Yig!t1}mAF5fG`zOuc|;h6LijHBH06nVDIc*ScP# zuGhR)X5BP1b${-s>b^f~C zo@>foixj0zn_<7{6HXiqL^6HBwKj&wtUqC$a;xQc5`Q<%EM#_AubAfDrMcaa7&R5g z8?AZT0;MP~4W$EjX}Pfx_ptoY>YzOz#K<%gc_$?e*3w|$I)1SBSft6>j!6PgFj@aS zSbJd@w_-mxN8#`?+}<YH5Urk>(5!qd zHjYn0*)d69<)!*w%AC>^WlnvbT+*UE$g@6Qo8aI$r<>vjpLJmMPP$v0#jAMj-PkkA zda!d(foZf05=~zvr?kKFr&82$^=>Vn^W_iK@^3nTy4VmT6PUP886C~PdAGuh;_7|+ zmW#JjjJ2!u;ZUvHjS`7Coy3WR+;K4y6@aq|Rb9q`91DjL%INw{)cGFm25u?s9&G}L zEAG*@CiWYKl`%zt7(zUg6koj$e|!S}=V2@!IaR#gRf^V2|2&L}hiPMCZ-MNV0I?}r z>4;lY*VjiYL+g1}4IM^ThiMZNpF(|1S{x?CG%Nh43uw>OwY5Y*`xW=Y}j30gdkd+`ha#9QQv z8i6fJzk4ZvgdU$a0;@zby*mOjM>BQ3AIrm&_tKdAwH!-x;Pv~p|FKv;r}HDVp7`qe zvvxCr`}E)?J$P3SETi~a;FeKZH%sRk!}YF)D@_r6)x_nTAlYp*O?^NctKM}l9eqGc zvINLlfL-89y0ZX_LNh(j!AaU%09cMv=h3KYF}*Y%t89R#j>dj4?0Ll+#fjcFs5DjgZJwlb7Bwm z@cra|1p6CtKP`R)`<@p^&}WZmvGzNDxIFa!6s+y1$ud=o=Tz@hZIoS+g~xgjFP*A6VDi0cD#YZFKL?VgY4sLs^`9+a zFVYu}X`Q0^q`I$VAgigAJxFHiq;*L+AWxaDg~df2>{HUgxNMU!U*Eh(ALRQ^IEUR# zBc?-f+DMO2*KU=SX3(3{F^zCye{{Mwswm=M?-FRG5@8J-aS5}H+vNs$Ytt99?iD!$ zUATy+W<(s!s`Eox)D#)1uq%3hR3vVbXG!Hz^g*Z`=4UB9<@D_x3}Cbn43iaZE}gib zYY9un6y+thuafFz2M7Y2mkp0=kx~3Hh>v|O9xqQC+~z&{IK*j$S0Bfw0ik1tHX=3R zptL2I`*W^n*$*i=Sc>%i13>ef?sARJFybIp&(Pcs1};Mz3;-?a#Vf*l@v_y6IzO8M z_4iG$>Fz1m5QB9`4D2fgE8=7J7(=nEXwnG7Jri)@fGl?=w!n{%0*_eYV^w?cOiXfw zmu70|md(`f39U~NC_gnj`TgQsDHIy^}69njrC1>nw z8SK$rp(`pA0_s-Ghc@{cWJUoWS}4$Uw}*|5JnoNP=B{L1ab+3w^Ap;DJkHCmoj4!o zXG`=9EmDdS@7~+QjgZALQ)~`JfMI zOP!@9c6{-r){_w6Kn~j;%9^EJpUNPZ&9hIJB@gJ$WT=r|M$M!GZpPQ*=NMJao28{E z-eu&oC}YuuIUuij<+mXXWfYv-bmy`L1)Z6td57JPZ+sBR=}eXnY=e4_ckbAobC-(X zLGIW_Mx_&HyFOSDM|n8C0shj>bW>Zv={?|8?$}0}@Ra5q_3J+PTKdozeu;D#bgJgQ z^-+~-KHy2T4Zw79>Z(Pw`P69HPd?%|hFF$WK%Hlv(h|d>m$}Llk^g5*L;2uFHoIx) zx=cR=VA~iT^tP_NyDC1x1ICI==Q!>eHs(0_;vTYY19M`=Y^Zgj57N@v&{6&Fb00V{ z$@2cDra@0^%YL*)ZBd6|})$H)5-2S>w+r&FFrvgprs@r1Yg zJyN$AeXuu1PB$r;xfmuTmhKoKpS&6;+k?bnQ5Jdu>*A*|pQ_=!SnH%lFQYS0YjNQ^ zLmY=H)Ot?=ISRF;SUK0A|G?8II&x!tiViA`D%4UXi{W|3SL{&Eb6WvjdI6V#nhLcr z)c<~=UjL~=Oz%kr6ken`Y!4MMQCjM0@bk!7cnproM;2)rj^|}Mz5qn1sQ|~o@}~>n zmRNH*^Z{*skBHF^F8o;$xbQMMUxcNzntJ>7)^hz=t=^_Nek~cPjYjGLzm|Uc@6H`L z=Rx2YT1F`oARfsA(fjcDsd;LO?@mR%XiT6V=*~IXZ8w=(HCU+`w8z-i*)nrpUPUuB zOFh%+e%d)lyV+r4w6jsfz-D-{=1!G^IiLO0>)uM*R>gLy*IO!Awn9;$-aMMd6k{!{ zrmA9W%P^3ei?v+G1Ecj>&qw7JWi${uzWmBKWyQshz;wP2ZOG^%K% zu5%$Zy+*gsg=ADsbLQ$pvvjT&m%s?_**~&{voN#dw|QE-=2VZ;KTv^Ae=u4yvBg$% z2FBdaYB_e3X0CvU6R}*8 zk@tsrT4LNJqY=0S_1wt&1ZRQ5_VrvgW*MbFCuiQ{&uI@jYmBUI*={M)0GDzV3hc#x zNF&bqTEu-O{R@L?6rA*%_E3BdYkoi7GOSF9P4+fo;rpR4Q z&(GKH>iS6wAgvVhJ_8ctRF2d6`OuzJQ|ITk?(OsyL{Yz|+n?74Aoa!PwVr7smre6# zsDA=NS<0}4JpfX9K=Dz#bH5aV*}&9$`&e4NKuc2*o>-uzCNc-**C~F6ewE!G zM;x3}iqjK=V^%7yf*hs4pt)oDJ8nL+xofmfd(1oAXnXcpn(+cQ0idH7w4RYV7F)U8 za{BoNN!Gnfv~K-$CQxA5hw`&jjQawKh*l=x0uyjn?;opEB9y-+TC%!qIc+Y{ym8Bx zXH~X`g=EY!cPWe>S~$ExSC>k(*jWD7#yl5$z`eyaG3`t=Wr&ofUX<|oDiy_7$#u-B!UJUJ`Xu>) zn*IpcaMY!{cLcmZLmOe?-v9m_mmvk5$8%h!6tEr*vJ~)p(gg!>ugpt%qY`6YRfadnJok^MGZk8Fnr}`=w2pAEsds8Fx3JXDJ`AIE&;8n?6Ao z`JplKmW1fCbOwxc27>TBNE;raiyEBP7iqA<_8zh70syDYMcQnnMOgK>A2@9f(vBmo zPUxoWoHh<=CoLh~LGtzbCN<+PSXMcad*2CGZG&LNbl74kJz`Ozy3tCbRcl4FCA74Y zYO8Rl?J7E|_KKc^?MlxsG|}B=-YJ;G4>g zrhSohRrdi;a2jSRiVw1`FVn?sT(*Qx$By-kpZlDfq=JEGDG=r*(YK$#i-!v9csxxT zvaSrHREE(i!>E;E^vW=bWf;vejB44rknMO9u(?QMj>)sdpEMYVY4f_ZF;kP9Jf25@ zVKzeI26(2Lz_9t2UN)uV_sZV!J7u{{F*?j7GdC&1Ds5`HfvAATW1B$Pi}g+VM1*m7 z%N{X^&T7VnX>X<|snxelp!&tyuvp3euHNllUeHE)@R*peL+Wix#_!TWZ$757`Z8O)#^?Z?h6r#yGU`71; zdeo1dZ2{cXECuKBCsF27&0S>9GA0Utk|=G%jy*P`yL$bS%YjY24R#?3pw0M4{OC(yF<`f1s;fW;PxZa4vWq-p@xkuQQueMIhz9j5R~X>BO8mAvJ(5ST!gDUtc-gL8 z?kYF0b?S=HRs#?IUb7tB0b|AYJ$xcWicF`g*wH5Lk41RY0x_SkO^q zoNjc=@Ee4zvE}K{e(*QYoL99Q!b^~ilMXcU3vN{VDt3MgjkNFew4+EXdL8{KPwHML z2|TGgPSe3dle{u4NlGZ;I+$j!TgUdNy4E7?LEMvFt}8|sK-Hx9RW6QMOxr`(?AeymU$?uPCESZ!_F11cPHe7lQ@SPW3Ub zQ2Ka>Kg@irfNy0=fEaW1vdK~)me>tjq$U=SlAK z?-yI)@heqHkDy;%>=0T0s$E}Hg4#?2)MdMISry`~#1#ZH1|Rh(9-K+=R)j%k0iY8g z`-4(YouQ1wSxN#lgO;#ck@ghQW+QF3k;Z$4@7T~>AmG^HCy~7c$Zm^4M!0UD&*l7p!SD|UO4X^p9|%qb!BsI;OM(jqvvIiL1Ced= zGEKbsI|RkjKj19-RfP;JSOx6p2Y_Y7*I_eXFOnPjk;cRMl#!+nX^kS_9r))+(Dns(AsV+<*$(T=}r z-lC3bRrLa3+<})Kk62dLZ@}-vmg@S5?pdB=ma6)maInEo*B-}jeMl>z?Xob|sug9` zuZGqEOm7vG3bF1$&Xd(Bdt$MrfcS@KQ`V{RMOeFFS!L?bOyqUjt|1}aj^dg z40(dzuL$^?XNJr7Df#BMd36yJ2NzphDdrWq<3>J{(A!&-YSdMRI?D#NS(1*S9S_=Z zLhkCK(1{^hxH}ALz|)P>c#{afOMbaIu36sOlThh{bnWDmi3!zOV%q7((e+KXD4Z!o z0V!EhaZ$7Uw`U3S0VkJBfM^3m@2l1(a~)|bVcu4fL}OM$`N44VWM;W)%fqx{rIr_Y zy2=H_@?FwMFk^mk_sUAGXUNxA26|CEsYaV%m09SO8to6cohIrm;z}^9;%CDaUeC%C zNKt<@WczKwtkRwlX^J-{O$h`CmiFwiNU=w(RNAj|EA7`5E6PNQTcwRKTJM9_qm0&{ zU!`@6{rbu{w9Zw6#~VDc{Z&q*U8}Td21K{4){^_R%?eyfzN}}}A;Q?nv~9uBfaqpG zbh8qm<*T&^tn2|up{cv^6bOv`*!LV|bkb}gJoLCw*v2W{Vi&JpAP=dJNSLn=*Xb(W zmq+O{nx?MN20R@82wH`Z#N^sZwNx`X&XJraL}xtckYCA4IxBG(C5vwZLa6FC5S9Gpt>SkhP0+ncOALo3^ECk0!!VgD@VX~&fksp* z<8U*09LTAC3X`R|rW^P`OFFO&n+q4%bk9U=!Fw^7?cjBLJX&M>xpAnIodq>py!9Q` zK3L-!iOwEsC#66x?2Ive&Y2iPGlV3knlya^5$h9n!Ukn0#^1w(*iTLe(3E+k&W{e69`e=ERp`nAF?Qz36Q_(IS8qycp-)3Wf$ zf-(z_`uAoHufa-Lm(zd5Z=vj@yWh}mVRV(gp~ZFO0Xb>uXJFdl>8Dgx+-zXF554<_ zj_I>+V3lUs&=0!oa=NTe-68s1ls zX`GMsbpGH%FG$e)7}9$y)fLl~?CMm6k0b1Za0WswzNJE0Sz4$Jpt5>x^pMuIWh3_8 z8?f(Qk9~I|_T9Rsfe~sR`Itn=mnzvew2olr%Wm|SfzZI0vl_JIqSK8JO1DSzA;*OQ zuirFgm$Y5`n(A9A9ZN@Pl%c=V$ENjEssFlE5N!9-xtNM^v>9ync+XF!k7cp!iF$FDCh8-oAg)>Fuj450+jI zj;^>898>X2aBM{|IIg1o)$!i=s}sCEVDjw2jWs7&5iU+N#3-wwgILw@^_9_BhuZ?z z6Py7`@K~c#AhV3^l7L*ig1({5r)-pqFH_MVdTE_@m*YNUWv#r+_6(+!yOQsO-uD-} zuntpj>|e;+sEvsIJ?+vJsa>L_japJPZ#NbEWBrAB!Ga1RVJBREUX4iN&3HTbx5Cy! z@ScXV@l}cIP%Oq~1*i2%NzbMXsax|GxUSZYMzE$Ke!iw0l06wxM~8=Kal)@;Y@+lH zP#Ropq%j+yBZNEec^kkzY?Ep025o|yX?qDsg6GY}##C_itkSC(AJ!pr+R62ly-~|8 z>axLIhwH{IR@?k-z+{W<*m`|$*=2*Xt_BJ^yC2#!gA|#bPOi`P_>`4pUDzKNzHzzc z^(mN}YR2*PgX=(w-emMG7#t5LGBvVaLaCHX>`2tlXga=rK&QHVL>TY4J<6{w)^sny zWtZzGlY5hv7T)v|JNMA9slx7O!X_vt!>g%w6O2dDfeV{p9TGX2GB<0J!#hr9b8(L+ z1c3Oq(bmnllCWH+^=XlJ688I4x%@$`ux|<_1z;~zQ$x7{EiUmSo-0EKp{Tahb7wAN zXS^%|7mxwy?hYz+V;T@A7;zN=%^QAf{b)=q3nb}?`u2~~z5rmsx9}}6jbdfF3wK`> zCBO7M9xV}=BwQ!HFW7>6aC?&J%PnB>Qy-<+Hvt2}v^PO#NT2W~1`}^HEv4tsBk^w5~T_Bivz~I3~&0WHD8w}=nJTbd57*;%;O<%r=Hqd75 zRxLkvGs@cG=#Alsf%l;fz&8)V$;mWtE6#NfuXm#!9KiT1WuAlU>A+SkJM-XrPbs_Y z;5%4CNocX5IJn*|@pO1SJ2V^TIlSH@56oEh{2Fa3N=h9p?sKpBOv!<$lggnag(t^AeWghN+>9U)? zV{xiCW3uqwMEew-!1$7>WLP$za!fi~gTtmNmQYE3_9-;$Eg&5;sP-+)B+Q_X-qPG- z?nU8?jeSaZsb*vyS??+Fmq#m+%D5;S9vEO?vBzq0K@|e?9R`^5UTjP#VPJHieNcH@ zGMEu?9a9XTir=PT+qJlCv>^xb$of8Y9pol75}gyCCJYRV$j=%1O-90Tb{(cD&9(5rRLb0;jj^o-GI)UXdwnU-3tJj1`#G6~mp6>h zU-|WHA96Y*%*6)HS9Q>7|KlliX$KVll~ZZj+gff^Qw{R<_iL44W;{mcr_iCdwOTvJ zxjDp(n{aTzai%xKw>CivLKwGGi%V_Ir;m{b%qJf7_c1Yo4ga< z&>c@Ih_tP}mu}_O_Nylt3)6eV!vZmsF z&3CkkJcP5}0c%Hm$2+)?!$T-bySU5t&SSLn0Pb(4V#US0|L6di(Fc#==n8}tIg|G` zHB!<%3FfLP{rsJkN_o0!=D9YUxm@otuZ(@w6x@@Fgq5xZ^Rv~J+}F$WJXk2OqtWl- zn)Ng;w{(&y`@?B%_L8z0B}FhwN?20Bdi?75wCtiIwgDwVDUi#jf;&M+Y*~mq>y8@@ zb4ASIbO8F`xVH2VoDV0$?Y{^C(k7^?BuM^5+ z_j|h{F&NzBeaHC^D(}sEyz^<6XGKRU1YJ+9*a_xS+kAr^4@h3W>}AhdX1t)aX_nj^i6^FpsV+p@a5hJKlG zuIF#~76pwR+qhNYSvr>CynJ+pP5b$ov;yVFa~?i;nGMH#LP?ba=+tVub2>Y(?SaGP z_{Vj)Dz#PJdl|o-_}$O=&244kH*n(N0ahVf@veOMs!-7>q!aR!Cs+#QaaQ<`sl-|#ro%iy{v z@W6$DRPPiuWmu@LSI?jk&J3O+n29#0p%m8wK1c%HzSe>w6;Wiftg^i#-kpPWBj z2ee1b6gntR;A0FBDnLJYY2w6(=(CB7=@=;K4zhV#R(0@sWXN+(fH2 zW$0MmN8p3#*w&A5IAd-j*k&SWCY}07OLY7KT;c+n%5R_XmWl!SWhQw)))L(}^Ec?_ zmtb)SQ8Fd1Ex{I&HP%eSH_r@A`xvIt2_seAwv-1cOqpA@+L$nlW|*8{Zdn2~exh}< z-=XXj9?R;6k7m%JBS8M58I=7ARD_66{zMzo?jxhf=k)%^S|>X9i8kDf4d-FL*(Sk_!SQ?iZyBTB zH_&y*a2wNHKAO*KICI;Oz_&RjAA`W+*+3s1!~JSr3t*lA3D7BbFHCNIH^7}bRxE`1 zpK9)?{u|<1hEtxJsUxy@Ce8a4q>8#$f2xhJGi9^SGc;!ZOq)1H=U%#e*p_rd&{O6j z`iLrW3Y(;>b1#s#(T0gZbG7Akz5}h7r=y?Y-YsV0h`(!#<4jJcMBqqIiVf=;mKiQ< zt7cO8aVzCn@d((46*UAp3+i(W1_L5{|qfVRw9zj(!fiue2x0(Tv)VA+H%WB&aq}`~|L= zwhTtoms*&5_Y-vJOD%I)Xd%yCMg9Cq-YMSQi`jL!G%yE(u!Rm&I!m(RJQ_5C?3rSi zQ3i`~1qLrgKcrEV59C`@iuz0;jrpgR>39+O&_ku5jUx^0S~mYv%S+PRb*kQ3+-`m^ zR!=o0XO%Fya+#*&fh7zF|GsM$rJmG^i}ZG#>U5Oh^q%nV%Y$-lI&c5Ez8oi?03)x`Z?6)G5q)JQ+6X6mAc^Ig4hT z!oY&6m!5*K{ISu=KhB{qIp3GFDEupo>##z~`AW+ar}3Q%rimD;{7Q?E56A6mWJiEH zPww{=?fMGEKvZYH!omKirzr6>E|erc#kfb8xiBiICTn%AkukkaCx7 zG7%`@B@CAV4^*^&I@tk(Fzu5<_)B7~D z1fS%O?POgAMqNJjL8C4+4;{8z-88BOdw@z@^GV7>S)dEbk_g-)faI)<>tT1sgYWs} z(3pL^3%iv$Pt%I;aeMFJ(-ixImgC+l>&9w7M`uZVxd&4dR}kA+nFqm~`+F4S?yG~h0z6F+Jzn7tLAhvB`>-Uio^|9kkNU3Xp!i(n}! z1Hv*dW4;Y;ID9###n^a};Z&wA2VHH{LdgHKCMfKJHrTxlEx-u#<+i;JMX#m79D2P1 ztz7_QaB8~wf|hOn6#1cRF2lrDf6}Jq{)BkK8cYi?ZX6tUH-)nYr7Qz03uRB~DCt+< zsov3M!cK-cTQB4vihN;EA){A2e!@C3wTMpr1pR$EzB48<$>n#Jk+(Oxz+l)+O?T=w z9QV9=qufKOY~U_m#0ze``9>PQzS_WLeul&BC(uqWtcWZ;vtv*&sc0UZjRp))K(_K> z!t$(QW;0%~-sZt&6G<}M0T%ZECO5z=z}A$SvX!~Qj49HG$s{jx*&b6whb}@dqJNLT zxI}x*GG^oE0|9O81$T`58A2m`3oZB=9OMPOJp41JD&kR>Fc|gl4t5DTNvviS2t!hm z@e0=*I&ldbY}RArdD#YC$nNqB7Te?!O8iChUUv%p<=Mf^aly(&g(p*24UWNOIfBGpds3qmME`@{P6ja~J2xAWRS0Zp= z0Hp)|@dytMcuM#i$Jz9uDf!p&9x_fVf`Ah|^Joy4BzO83)r)y7fTvkRT+%kK+UJ8= zjZbhjcVJ5of|tKd);4R7E{!zKp<;_jRZHj4W`0M#J8+CT)NOOQ15ru94_RrmCbBypz=Q5{jWiAQmKeX6QKS&}tG$Y8vJgr30mV8g4k)J8LS(A* zo~Bbmj8dl*Q;t=vS3fSMOI87W%mT^`L0GhaibF(N?B9%XpCV+3H3~T79yIZ3F?|#w zD#8<<(d$jp6(I z_5mKVOIXvajD3cFumPaD>pHR)$=}sSeL$t%MG>6K*wc9{tcx zj8Heur98XHQ?Dzb6?PFD`#IWTzQF42O7JIERfE#&T!7y$lGM+iA+^0oRNeb2sl9Nh z9rsgCdlBd8vmN9BshsBo6ov{`GUdcRn$=#!a^A)5#W3~hJ#?1K-1#hpgrQ6ZrWh*@ z6L{t0vQRRjzVtA_2YinT6WK}nO3(z|=jrqW7~?p>LI&Zaiu0P~d*W^C!*CP<7!QS^ zFaMrLao2&o&|czd)tofGOhzIuVY3A+B~1Ne;7LJ#DG#xAM#>!W%xHayp1K6=PJ`K};O>%5$KD zh$aj6sbyTZ8P~^AZ=1)L$Ckh6&12fKdlJ_9<=!!2ev?IMYq>kcsrGu7G9xg4O`B+9 zgosN&fHt@fOQ2fDRKN*f6`bV;$~c|tQt`r{3RG()Fp~i-@ORu~=Kk%95b5p??=l{J zQpy;Ko5e zb`+rd`dOMBC6=luo(JVnL#3KD!YZ1X;HkWQeY$7~~=EL!dj7oGZC2Nu9(r zReO%AJBcwlqs^|P%XLg5VARk~m+xgXtVy{B4F;Nw>7gi}RI_RWB$^w8sS8-9#emHq zTpt6(fLxL~qi>i7d7UwZ5TD!)Z{hhn3tN#%JMk%vm^)4IlK_Dq>oLy<@N@j$S>Xgd zViP2n-o8+-Gp(ED{@Ywi#9ZnRn$qW!#n!&uq7Fsp;v;%1iMBkYeZ)=*jTL`V4?IVC zv49ZanvKe!$&Dq*{_@VR(5K+my+@%jGOz zTh)$DfuzR;AjzHa08#fWprizm zTJ$i!@t~R&a_B%lGvu;CSPz?VGhf?uuGdVzHspM4C~Btv6s!iqvwDT;dJXzKL0qQ} z)&ge}#95VPq7yy9ws;tC1k*>Dej|qaNzB?C#jM!(USQ`9s%KX_tMax*^K`?DlMMZP zSPT-yWcgj-yD9e$htR->L-@WRQ6$>Aye7ZXjzlproK;o4JLetr$z)3Fi8dj(PUtBn z^R_Cym*_;__7vTWNO6)`fVb2m!NGCzEmgW1yLaj6!@Dm=4ZcAG+7Nr|rNVa>jP&}SN|V4wUY^4YqTGZzZ=P{GZji+wwCb65M9)1hP$ z2Uil}4s}HdT}^@@u)2gC$zp<<{vs77Bi^l?7AHga3VZQag;e*8bT(PI9d09Cg=KBJ z{2l5+#oiQ5wWB38Ed|0<{)==X1ylA3D`ocGZ zz+Po3dHaAA7M4>|Uy)7=`-uKyisi~t0GO)Eo-O0Py6fUfv8Bbdo`eedaw31@bp8$- zhPrFxoS!u{d_|atH5$Xno3#W8Q=h-Wjg5%a>n^U-`|VToeitaumQi(I&?|sE)EC0Z z;!=w1C*thfwjDl}CcQ{G{e;)e@q{&Q_&lmA;|I?cDAg+$qg}Q|;WU&h?I-fpmrLo( zepng(+i6&uNVmT&VUvTtG!5%sJ}R>0(-T$h+#I9dZ;cH z>N{t;h)&#&B5Z#!2of9rX3A#(d5*OOq_K=fr3-Hy+bwVo?BJ!hS^nLsjil;yk)689 zsE6xJLB9Y0I63|R3Pc;}MmP$gqw#m(L7v4%o~?fniI$UrfBivRZ&9JGyp$oT)lyLP zAF;mGl~ZP>$gww->wN;kN;Aa_`xi$1gO@4%R*`E@c&X+4m|G$7Kl~DHy;bB#EnSQW z=c`mdco_t>&d1y!&WA}`_!3R@i3#?*Ww|(>%%36M?yO)hQB@6yCuJeNvbEmgEDYSq z*7z>|{$p$0k&X4c@g*9SjeP4`(^q7Rd3J7Jz`YaKI{@GJqaDUM;*$q}0fko3ya6Cs z#MciHnX&zuQQ#CQ1*+)2!NDL<2hKSnJkAQT4+P;CRnVw`nDq}=Q1w8_3kcnR68ZN2 zt@RfE2@~woC3NUdSl_>^pzs{j|DOs<&%qdBSsRrjVxx41lU2v?u>}I!Ux0jV;oXrV z(!8G=^)gJ%sF=^{WgVV2Wn*uHOg-ae%D+v_N@8)8`zZOl-=|0^eLi+UEmFFIof7&9 z-j8v-ber(D=rEZs-JsvS`>FJP5u2_{@k+}sFNo77GtC@ZE@QT-_+fVooT1)%gG6e! zxxls7%dlnDnPRyv60_nZG~@Tu7`{QE!)Jjfi}I8Azu<4i?Z83R%T#~6$V@ZgVK33F z=Kk+EXrWPet{4&bPkmP-`#c;wNq>PB84p7t)D4L6=nvDJ~E6f6qcn%Y#;+`y#5y z!>X0Ci1y_{!r8QtHs6JQMlPbGcOgA>5!nZWj{7a5w87wG{TAu-h{J?(&=xcwpf?Nu z9*%9+V39e3>4fLB-v+(y8Xx-ig~~P{axB)hrAKpj-lQ^}a9)XnN+XXvvGwCRJmM&a zEmYJHF~(8#3amg=`k-B3%a-jXDE@|E^T6Mv!CVW?SE_eHh>}_dsd+#dLo<*9!&z+g zP7D!o;ZjTBM_Z`#ujq3=Xex0rW#?l~cUVjnh&#An&9{bTq`-f&*)}vEC-NbacUa7{ z1UUVE=n_}}X+od%Idk~8Ws>d|vH!Kq>EADtXtr~08^4pE;iBVr3r{*D;2bJ6fo8zm zl39d$un5W3IFUO5buRK?Z>$54&ZQ3(v2stH(7&mL8L(sp#7!J35@SuI$g+^Sq7}T1 z098xeZmJ(D+_9(L0rEi{rUIYa_6-QlIQ0&l!FS#Vhu zsTPPg2gL^bf&fY@_z*N2lBGxMC z%~&r7NaWw zcC&q#(9#j$CW%Yvvk{`YWfkdyw%e>CaSXfeYyz_m%9XaO$oorZ-~GbdvQo5`{eN32 zP*2iG;m9#Xd9KIg%KECLdfs1Rv3X)f^C)=gq;_1xImqwjqXi>DlpxM})Ct`o?HdVh zi15@%kr+1~_3&6ScV$90+vIu~jz5dMJe@oBhCw2@z!HoZPWI%O$w|OO?Q7Lft^-~$ zmN&6Zb$)@$v{sHb`eM9v_~^i&!F@4FF8mpG9TJ~C_%?X7tXFc>CBLEt)`jMc5{^VU z_RtQr(uvd1g`ypBIbGSM@I)>hC1O*UA@J&B9^?FWLZU8kP<=u|zt<~XOCj3>VyOM1 zffkVTga<^fBjyzyP5Xjly!!8sJVo|B0H%7wD|Gb%bZOx$lvsc%bhD8c-)9tv$@ZbG z@v{XGke2D?A*M7a89;?Miz~(v|jbPZVKM zKX`=-#|Vd9oC-9({4EzPNql9xZF%z>r%nCQk~HN<`ItP)TWl4fgFPHtE=PFZ)grvg zbrH(BTh$C#e>X2qXUBk4s$QY+v0|~^wzOrs*N+vWlDZpl6RrA*7uzSsd6JiL-mE%3 zPbA|ieVmxp@nfS5+{oZbu|5zSV2MxfjuU@y>y*dp5?$ugt81+aRd~lk-Y#qfWAS*b z=Os(&z<9{>b*<^S6U5?+`;WRD9EasdIMpaa71JITW5nf<8$C2-yy)VnG;+#CYJMf=P7}jnpD1R;aSs@- zXy`O!;PaSka47}R+^c`RN-HLcxbY^|bcDxYE8Uv+_saiY(#$;Erj9k&BjSELHxYks z41+iC5o~}UIDYg96o+5GN|zqN@ryZd%r1HCEw}{Drlr7k(jQxGrw3v5GdHXZ*kzAFg^5Ab>)$!N+& zK8v!-!}%5EpLMFVk8Q3~lxONt_S9dnxq2V4Ova|pWOH)81^a@Eqhhkii+l|`Z@!Ts z4D&J@ecz~E-(Oy6@cVJXJw!fy!lFT_d6F$Tj{;p2=nUqHr;Khf2i0x!2R|wV-_scO zD0+{u_EBsv|7SU=Q-H-kET_CFVuEAHa(%G*nEzz3NpO!6m(zhMz}y|n>FgA-!iMLi z!bZZQh<>I&Ze^QT%-@Yz+e>x0?=Pr%s;Ei4+?a)f)l{ju<3rTh0sTVgQM8KRb(b3l zON#-2fa<5=2WdH^5GT%SX%?TNH%**z!)VM5G3^#sP{QpG z@W( zITP%+DOnGDBvau`ksCEX;PP-6e9#3LUHELKa3?bTF&IS#T1?ArJ|o|g>?+}tT>ia3 znY>S6+M?@uPe3A=8=wh@r_aUk#QR-p{5iInVLt;+8h4Eqb$2UlQReUz{Z&WHfJ%$) zKG3(({=O$zx(m<+ghl*Rw`vQ82MAqCWSxo2ITWjNvpOICE%?0{bMBZd1MH%N>pQ5p zC5gIhAFGVcxqk5b4iF)xZQ3UKGo1=+=D zlLjU7idjHZBV4=95{c=TVVWHbYPhw#qhR(_Mu{H@Ura6y<;)AUNwvj+4hv#txT8GaK{*wjX#`a}ST)T*m{&j7TU=QQQXlrSf~`kOfr!79SDy ztF-5qQ}t|UqLmdC{dEoIBM+!J(2rEUF5G z_^}kLPgl{1IbvA)T>wPN-LS}d2_3o+)G0-8fUUh)jqIv7D>Bm;RneI_IQ=?YMYY9Z zOw>65#LtFAD@}EZ52hMb6!#3Y5cq!R8894#>RjPXJ&b%2(3WwCC9376CiV{0L6PT^ z640tDeL|;K(}=lZt9@xT=kMZqqMG8K1w#Q7%6%3`8w*#_)@RX9aWzexhuMN~={z9f zyK4Gj9$0**mE?F%q)Fmngdddk7?yt^B7aE&`ltI9%LS|FQ?i8pPI=vtQOoi}{>s3D z=Y+!&HE1ORp(v)y*`{iCIqRVP^F^3#{R)QoS=fyI$`niute~s&u@ib^C8a+POl)6C zlb^?q2x0y6FrL9s9V!9jh)-A`W`rLx8sVXBT1jUXh{@sqX_IyW`Ch;d>-rkKzOgkF zUV{1%=9NI-Xx4}L)e>N0N(~Kr5hGPyLyl6MGuGA6j#7{!?#CyV;T#ed!oDm6-|D)G z?B&21;z{MeFv1b#A}6B%2E5?~{*X|Kod8Cd4)@YL)&Z+5wwGx6JmI9D%SETe$FPK2 z6oCoPR*Tp-$i0hGJ&1HkUw)t5=fGw^{Uwpzvm}sHYKPl*MrTQ2FfNI)-{sZ?k;jVj zTnaW(@+YF>qQR=o&M4uTToRx|FY&4ppi4&Rt$=C^@re~;fqHBeU8n$2989LwFGFQ& z-hsPqHGTH7SRHHLb-Qh~KAx>{TDnjS%lu@E{`%wTEeW2+)jWfID*XCN7RrKKI-UYI z(>oaAiV54o03|IF-tJRScgj+?hq(lQW8?mmSK@ItW63y}>_PgoO;%+k-8D~iriF_{ zj5=>M)i1)n2Q{2p1Y!3L30<4gs7)_TNsA#jW1(5R7=$zJHQKir1oruAQVHSl)$m~k ziAa5oDoErc22oE!L4hSy$(HimH^BiN8SOHCNr6R%4{=E95|*4^qr4^HKX9xtVF~OG z5PrEt%uq+aMk8JUA)TnB*rg&aYV&LQbZK*aC3mSfr1}m}?5j{1BAoH6_)>Kopb^W& zX3McaUE<*ce5>2#eP7=qa9xh`0Z%04n| z{{(C%oDFnmmFN`S7W@viG_6WxTfU}ERpPdAc1hS;6WOap=A8^dF*v}r5Kn)vpT`_2 zKA~vaI~^NYy`H{yWN1;fNDk#H?J)_o?XRM9n(qK}&d^_#xBaTOd{iDPG2Dt-id`ut z#F?-;A*{|eObrjz>(ukdTDahWeuMLH`7X!<7X_ZyI(YF9mDsrvBdyla3C`bbEy}|N zjj?H;uPP=+ukHUcA5vV6@D@1?_|0}0+xjSGwNQaD+KH7^2d9G&VmMzY;_`PL+T=^M z&}{41yen01mtnwMZK0C6ANIp2YoJIKPleT#*`0f6ca2CGaq7R2LfcoHKmR}GJJynq zvR8?m5C&%Mhk?>n!l9|nYiacwu%7(2baV|=GwZkNUhT)PCHL!Cm5bI=#p_s0cC4Yz zujBCdm9;z%vOP!F(xum71oX~YT2L#Br7gl*FzB!Gof+k~YvH>^?a*L< zy;ej-9o)jaw5o))1MN1C^>nGDkJf@)Mg+)Shp9dHLp~yb#RPl}xM1&;VW-SGXr#N; zG2CuB$Zjk+{2OH_*9k|a`3=rcdfD3$s+rCMbUVrqw(I5j_ua*(qmI9jP` zPiO1Jj3nNXt--$ZDhQhE=C!X5J4_gW%Y~EU-vqqyWq{``160ufe5?!5fd*0Q9r=b1 z&+ZQGl!PXy<(nX`4h(WCU5s=tgS<=EL3G%NrzqB8#W^FteNi6_&hfmeRJH7Cmj%e( zh~WfB&uIj^ydJx|MwCOi8tIu^0OKg0bnLkn1e}0l8Lt0eoAgM-*AS;K!Ip@9Lb!TV zsm%cjSr0Mj?{84)dXZPe-{L_mR;3w|b(P$TH5+LPo;Kq0m5A%G?rbn8C8wMD+Lkrz zYf~2N*i{09IBD3j zCtES%tGfe(`I~U4+=w<3))c_r$$Itz*S&d7T)D{LwbSkbiPk6D(CAh*JDcc_TUE;u0GZ;t3#L5jDW})#jYd1g_{gM zNMV3RzRnJ&-9Ur|p0QK_m<=ID%dq>il*7s6q3EcLz$=*z(i@pmQSBC;v~f1lJx1v* zH*Q-3ZW$g7Q0x{FH>Qp))s0Kq+zH-zoem_FnC>yuh^$_wouiHvzG1!&rsAq>`$+P* zlAbW`L8q{))g?H6(juPQJe=&VOMu-ZHm{!{ zPgGHZKFvI+zbiJ3e_u!8Z;G6vBklF4M>y>vW4badhjCMq`^xEKjC7m}Rir~2_%t|L z4iwj!P!3rbe^-^!sYz0V)c0lFU*2e|P=4U)aXD~0p3SFDd^k(;#kG9+6qOxmpW@Mx zqmSSb`uHiIw`&(edrvr2r>5g-OId8aZ-N9<&@z+CfMIZ#k22kdFs zc9cCCpn2OxV&dO{Xub0x=#Ld0t*mPfG}VPEHuOz-BTQ+R0hr#X#A2`=EC*rK4v`e{ zHeg*6pqw2@L!SzF;3N|8F5MyAx$ol}FHAa;J)X)yO&v>edY`(ZZpo}YZsdcLA*had zFu)O<9y#FWg9VY50Z*NK9fiD&EyKxmG=@WaV_?VIVuwX-Y77+a6j2uS<3_63h0RD* zBZcqAnJ8|^jM|M&%77X6(VP7E9KOJz_-S!u2|& z><#q8pb`Z?OP)j{jem#B+cCm3X+633iqBMpSNDokd5H)6S$KoNQ@C`;J`vM;uLm3b zX!7q9y%?JMePW*5+-ROd%?Zsu<>Ceq76{CYBj2!h0OiFE@Z2G0*f^c>N51z&G==RK z(RRL&{ZNG9E6;pEJA&gYJ8+zz;$=U~H=(fA#@!hU-gu5A|`m8rd{W zd=I8@FGB;#hiBv)jgHs7Cv0lhjkNhaaYFTNq{RoJY(RMSAftUFIo`(}6=C7~=rGPS z;AO@kp4y13t%p-Ir@DG0op>L+)h9Pn>>-il^=wh$cun796>Xxt4tc5P?r%L0jW_~b5^jDRIwDp?$PsHVNQo=Mp-XHz^5xrpFEW8CoaS z8Xxy!>))W+y0n?{j)_?IUlXQg%Sd9#fPf|Jo8y7PW8xCtV0)8heTKpNEBM%FVpv`~ z>|YXmemKnE1KjOn^)x@Np|(lyj`Z$G*V?A{S6}NsU0H)gq!|#POiGj1ZYyQ}UF3#e ze3Qr1hdT4U=L59(@8BwEciM3=!@=Krz_Z05bUEQ%v+Amxqx!bc)#IYr%isFro2&9A z)wS+Jb^I3ak}XYI2I%4roE#1WZFJZ|tN#H$iTczNVnzB!R4_#BG1*f%My8DS#u*o>n@y+7+4I=xA&5$F02G(&`*9H7K6L~*9sC+=?$ zFNSh|r@jf8w|t@c(60>iiD61u*QB{3hA0!|x9?T%Z~dEe<_qCX8_Q#aQC@^^+=n2% zMowqVE%z5|GPl9=N7}PV9Qf6-TPf#DO#X*3&R+s9ggd?jTwlFOasL!)Q5R%g{u-=H z9!;6E=E9pa;h*9X!$0OE@PM%XB#yBzz8Sc15*J5gN4vmo>8Y)_;*X8&?ya=z6o5Oi zl_y?Dk7``9R1|T|UHC}P;B5?eR-J-;ic(zh&#e^qmB@~|UZ%^ZXgu~5uM)S7rhSFF z5vr##$e+APqfTS)xVO=Y)4~zU^|YVg4@SX?6c_OfotG6!;IW5J1K8WQk>lSOoQJp3 zh<^jNxya8;oZ2F84y-c|h|JrxCnXFj;L`9{Q~vxm+Kf74w_O9?d z@b-U861ftiR1v&B%Xw_p?FLf0zbCiR(K8}0^(#Dm$D$zTHTN9X<_#7>yhWSApt~>1 zdB27>7yZBRjYy-@UyGR7pJZq9y{h5Z0gpRCKjNsr=`9-dEhH0!v%VF%ebMUh5bm4oD@=@5r|A5o_)nNZT4cG@9 zPniV3+k_2^r$?5uUbfMCPQh|9=Y4lOt^YwJg_&4aa70RjRjY$m92FsC`;X|tY{>f` zu^={OhhBz7I5zBJm@fyd9(+IWA5j_}lx?u%O5BIvLKA+(9gWpHEn$8f>Y$w!KZ3nt zleFVUQOk8sJdY5tJ1!s{@w5w|(3BlC>jEf!%?`5vBytn4Gy3|)4tP8nm4%euhAW_6skGw4x)ZpN~*<*MxYsQ?}R9Fnv&Dob@NSDx*_wRfeIQy~Whk6bG*DS#C0i9LJk~0sdlrrRY7$fF5GfOPqVWB?1h}#*c z!e3x7Z4%a%x9QL?kTY<};?gfrXLy?^=`zet%1?hvr=+qUkt(cwUy^2Y-3H9)UE@)$TT2`Lly6!Y-*xQL6H;1LNr&28=3?9OAjEb(q~W6xh3yYE^4)i}@s)kkwrPNSal;1WeSdIjwt>lo!-4frXki z!Xo01n07G+~_}FKSz@BNDeFM?!=G8pj``H5OZRgUkX+_t?lwBU0CH zI$*Wth0AZ{>?CfQQo4)0A;8g^T{I%ZnyLN`PHs597x#!lfV98wqP$S6SC-+eA#Z_E zra07^?(VW1?Z(7Q-o@>jmU(URod`u;rMm)AHtSN0+H()px3lJ{n|9OHcGe{I+uf98 zw~pX&fgK}*@JqX%9@XBu*!wLSxL6dC;kB*CgTgNOy4U4oPRA1MIS0B!nM3WZ-hAI) zMm^*w2>qU*?#G4GY)A`(^_NX)Ec+wM#g}KJ9RLn5K?$}5^hVBM znDvYVIyKxnMm@NP7Ka14&U6<_>8g=0se?6< z^N;9YjpcAg2Vl}H7XiR>_fTyIYi&+j;2-*5fPZBV3yJv(muIB34H;n6zcj*nLM`4) zvm&ke>g#(0ha#=v7Inhjz=lj)Xwn@D8o-2x>(=KXe3zA(Sv6 zlrSJ<7&txk2J2Pz#{GfRF4nCU_3izEvt6x)7PZ~Gfyv#hqb%z1cLRr<);Np$>AQ5+ zWleK@`YvF?Az(jcUbHJ>4E8~zQ}8X_ZCx+(xIw_S1C$w$d5dsNydGa456q4`Kqum@ z6FJQFShG1S^m^O0>qSmBE*%PIt8LVS)EF{N1sk{mZ#&U1@Hjb)aKO zl3YNbg>U_*=eJMCEaLn_H_+8Y>zKrpWX_7Y>xAp#SK!oXOMCu#?LYtFJX+8b!|c3^ zYB{t`q5}xs&PO50Dxv<%!C=rV6oYoVBGL_iHSqn`3;FA2P$GxNpP*b0ONwaXP1d;3 zjeah#(FZBkSj#h1%ijh+O9y0`d31)uzAum+dDXg7O5||TtCY*(z-6)y_1rRA!11AL zUY?WVpn`|3?LyW_u&Au3wX-_qbvnb}agJ69l~H-(CB{#fl4mW87_G4Cka4k*u~aXLYK*iCYub6`Gvo9pbjshTfb0l zGMZ_=!fD;8td})5CCM72I~N@gifv33rL<%mVcK?Ui~-M8aimWp7}109F!4bSeD(#U-XD-8$tHI+?hX9B8N2( zP%gsICki-ID1CP~>K)ytz&E2`-kI+pXO^{{ItHEWY3-^G9ZP4paIXpSn?K!Z3my0% z7gFf1K>+qaN=(Q1gAdZgeh7z8q6Hkn(|s+%(AiV<#(3aDj~Njr#L#uq^rpY-hgu$! z$Wt#qCR=G9XKiPBoF=BBg6T6jn}xWuwqr7a!JX0{>J+7l&${%0Tv??t_oq_2@LQ{pYwZkCtn3<{`| zR+7Cx3SL}g)I1OXucln2skSvV5utW*ji5(B6l(eFREq?g0`;DxvBCYVF}9j@W^4#R z{c)3t%XSu=(lJouwr~cW3bkWf02EK?HwC>n1=DgXuJ0ncWe*+TaQ0q0gD~{)UM}?i zRdxMQRTo+Oz4&ad|Tu(GhthDHObg?lZp-2NZESnb0rrQ zg-pG!QR~@lca13M*!n23JZ4ISVk%}yMdx^ukPfU-{s?nFcV>9+E&qJ)ow;-Gojdp5 zxijDQ9v-S12Zi>Sb*SDm$lE6Z%~3ed!gnEeH1n_|Z2)onqX>;}ON-UA1O|2LS}~=2 zV48iFe1;sUG|a&@UtaEQiwqTI2WaK(P;KTx<1Sr?B7Lf+of*K7IjD~??4e$^;SoyB z!ZduJ8v)w4gBmf*t&Yd^IP;D{pBbP(#^me+x5&#>@C(cEelYwpB2<({VW;9tZO<#6 z-2k4r7Y6-OOBS0?7^Cezp$BTW>x%M7h=CIgT<`~YW=wM+2A*c%z}+x$7i(oRUGQ5* zmQek4_-tV>BW8Xgzt7060#gI(_zLwIn)KV?^2ZGlqK2E{NO7mQ%M+sN+cEhXjd`i~ zURYMce$rN~`QC6Sz7X99MJGcY0N z@Ze9}Xl5qH4@6mKTNn=JjcE==VW(yQ{yY<2a^9?mnsVNV_LoBf8lPBzwK*T*i5-Re zCy{?F;zoC>d`*T*B=avfTECpgwgs^w>aq85Jk_^2CCrzBo-9=pno=UM@| z7RkmPX5h9G7-yJanggvZ2>zmLctn6c8;yI8pGRmwv2JSR4{AIY;OIYlYB2jYSBa0;JA%Qt^2(7qVCaL%&BS`P} z9igg)-42HP)U7tapS7~Dz zLHf;tmBtyk3LA;I$#TiQi5nFa--E_XZRaahAdefZp{pNY1Tlo-!_}~jw3->QRKI1! zB!AVTkx86`E*GV<237N^{#k~XpVfJgVMC-EXPXY5j5?zc%d0d$rl%_g5g89f82hpw zVyX)P;$*6_9%0Nw^*2F`hV8D@@knHdvw5yDfzt$FbTurC=MyN4ymK{C=VGkuJZ7Xk zlyEC@^qKi~#0dOY-00h|1{sCAUzamZ=3}N+_2YEjI5eH2wU2WrPR$qy429>cwF~qL)?}F z;$;lOsaQ&}nn{NgoYd{QmFY#8rhx{KR45 ztuooCiu;#P&ZB6;7jARm90y*YZajS*Yq^g%-Hb!Bm?q%zN{jb>g9rZWEtCu56!xyL? z3EbE9s^%A>KIo|m{%OeCCSgYZqLwKz$iKPC94ZXFLeN=IPr{Zw3pLT((E;(>Xlf2bZsUGipf|=MrC~i%yO+prjEmi2u4&U%%GZ&y}KQcMHDPE$>iqtwyJ|bWEVtIE7f(N~sUaB*yhNm9Z}>T4e91mIo34iEXA= zWVLC@JD-v%BD;;I&X#vLGe1G+YE1tVs-2C@-@y z*U`bul-a{o`In5rF_83}{I86D-mjv3d!n!!)v1T#zbPVrZPbWaPN$>Oii!UkUQh)6 z@#JDqjQD1d*AVfIB^q(U03z$eU?)zDCyXW>z;2fjq;qu7w~SmcdAaMPRpAX#^;kF) z@OKvGb55_`6hyC)qDJ+ZKF;Ote;KyS>P|6&B+93b?-@=q$)vQO5jY#lKUc%{@IU?s zlWKq9ezYOayFW5)11Rrw6!9gVVZ`xJbrquite$G}EL8qy&1g=VPW(A*i_CMBdOuRZ zIX%c!*FPCTeHJd&2s9s$RNHtyYPj9!%?M2u_?Z!#0uE@zE>Xe-yE1sPk2@s*PR@fD z>RU8jG~-51$ANpnaB0Kt;^L+Zf7FJuM0j130Qm}y1KW>^)O8p}N%x$bplU3lx448j z)5DrMHF55XW5uP!$wKw(9_+O^lDU$pu*Xfn#Clws`g_D$TB@PerF>tSOBW&UI*nso zt-J5|7#@Q&PT%9Wo=Il}K0FR?d0Zn&CSf*ZQ0k)y!mP1Igf8tm#?s?xbP@wGB7!l9 z>I^WsBE9+FN!_6K6+Xyqwpdp4=4#CNWcj0vc&YbSu+V&?p%VnK>UQYdU*gh96xL!v zjJVJO*W|031zJOq`4mkpL>kF`3e6fBf6NkZw;Fi?@al#tIyv8&xJm%FR19-M(f zl~FNHPbKJ)x}B8OW}up~nrUr4SG}5smLp(vn+aT}e~li$VHxaHWmxIsIKDSu1k!3F z%FnL+g6Zaf9E7#A4VVsQ;l&SPEyJ#`Hb$xHSfs%sd@JDMV?g-RM?0lqdrneW>!UMN zyES4LWz+`4nX7hTVOGM|xq*k+5?=KXV>p@esSy{{gNv#%HZg(#$KhUVg6CkzQ)gZ_ z6zuHI(N_jr|IV$Z%yRl(i_XXwtkXRx_{YK3j@QF)ajWO}8jOpovbT&7os1hbVhRZ- zdut4vvaOa)!&saR%if`tCD?6KwsWf@{{mD&8irMJ(;=wn13UN0nEUQ1BWLr6SZ!P? ziM>cR4`4#mnwf`{Ij_aK7@nNQsB3{7K?66#p+9CaT%+ra9aNm;YFaID6o5{98T)KY z5rEOyYTbQWajLo*>0^8wBZw+KH(IzD`-^CE!|+9XHNAMb+!;dTTtFdH9^_xbRM(} za77{xLE}<6mxd$4$+uW0JHbPyTkj%=ST2flTwE&OVT15V)X6*?)xue45nZe_9H#EY z@;%k3$&uhn<-_#kOEQ^m49SsBemg8)CMT+a_88vTM+{Ot5feOOS#uV_^oO~hMk%ik zXyn4q*cTxwxSkn&5#sxdi50c&kYgygR2HcQ-QqW!%ja79U9`UpzOwmqrbSW6XQlo@ z5DMOdBX{ z0K0~W|AJCc!8&;-Vhq?BgWxj+v=S7e@>{AcmvcmOHw}GWE>^+sj0%_;_P}07mY7na zlMhxvidnf+Mj?IIeBe|#b-8>`IB)lBY1>xt>%rFk@YI!fg{eG08rt3=EySTTH}@||M@xwat}8F;|XG;@Hau7Phho`(wt|6C^GKu!jl*6f}hRs$6PkFKswrj*H>eSrKKoExmuhN$bV!Zc7@56XOuvX?6 zzaFTTl_EdVnod>E%0Sq^R{qH=LSE`#FYji;2~HPST(nN^z(;EpeY_5VUl7M?AbFtf z6%vAYkqTX^eM8JyCC$f##fFbtb z{4p|K1a(6=nQ(0=UbVeED1HbJ+OR?=NOWgHQ^eCVt_tOd1jx zj*kZp_j>B+9Y%Yu5T2eZyq=BpHPE5e(;ZLsbg!rD3mV#voL`ovJY{KgW4pY@4dEX= zh0w}_{=ATlf_$8LS zyWVu(*r;%SC|3DH3HDnVqtyNvV^o|Q9uH;^o)L<-Um;80-dp-!O-1{7t=h*M^2Vvg z@k%wW{_y9K>PHjQ%KKwf$%8SfW_^rW(ix+M!F{**)RKr#Rjl%_TX z-b~&s-fZ5PymNTx@y>6(_3BV-d4BAc?-*B|{>_4|T6OZ?$2;)2R^?A4FYy;iUM9ORwM`xNj0wrdq>4HllZ;0Hg}>hyZ8{&=TW z=|9mb{tm5Hk>eUtCs5)V+;4&Pg<9<_p#d+{s`zsJ-xn^o^q-KeTl-Hqyk&6Vp#{3K z^}1VfVoxHQn_FX7OpjmpQ(V8)txGEc6aGX&XEbSLNK^5owoX_vIesa{J=|r-h(8Z^ z^1s# z^%Tr0LjGn@tjUZ1*w3}CtACUezo}EJzV6YY^bM_l{!vci60(yguC>TGF;*CTq;>Af zocJ4|zZ4a_t@YNGIf)@y8jCH8cSGx|D|2FBBKGU8U#y%SH$=HdR<~x~k~QN}*t-i6 zJNj>@v;X7~rGVFy%8x~Y@tQ2|Xm+IXFWfC-g~z=}?2lKsetb)oUe!8bRnBaS2_4GC)Oz=->G4<7Kvy-5$zi2P=j82#cRlju91rFus9s+0 z36k2kel&G_0{&Rob{jBq)ANq@9b4&R^RXyTH1z+9*FsH2i~p~9FTn?z9{E2b-bumI z9saKjO++VM=KqSycZtVoxRNv#npdZTgH93d^G}9$TMM*jmQxD7I41OJ@3})*ZKf?~M8f>788| z1mqP51E<1Z8F35m(`r2G_c%p%LYshlF|?QawA#UY^3z()+49{V-<-SU!%YLRTRwPv zdfb-T+fE#}Wz}yV_8D1OTW0TmFzy1eYGT2}vWXQF>n4^=ESy*~v2tS3#L|gX6H6!- zQ7ofa$c~AzDwnsBw~aS{Vr$m_ToEx4eHUh-3Ttf9f_L(+=lvK7+yZ_9rxMmbFIFAM zk5y%-#;QGF!fCN;s3=wqFN#(B&w^GQt6B&f;?18QtBQI3#A!c0R(0_1KP6V}#9s%d zog1sB@>b`^o}%i%3QrKj=f$cj64wxE7X{QWja7qRk5wzdp)*KKhI_z$XKb0j=c3G0 z)rwfv`6JSR`*?3&?KH}jFe}f9{nz;uqDkbrzjenalfI3?wYBX^?7sJ`qVdkAfy4mI zGoD6~r*7$39L%ttF3Am(@O%2ST8pSK%eDnw)H?U?lZr6JcFfkO5*D_g2B-xF+YY-e zDl8iz8z^6`Tl%8bb$_3fxSD2>$Myxqc8g!s?AQmJVv`oNzWV8;#MfO(%oJV{kGMX+ z&6${3i7QHZ?1MqIIlHlOENnONhtMhvtX;qRTZ{fNDe+@B&!FTP6x%8(M6r*3o^fMN zwt0ET^-Z#U*wrzaMZ}&;`l^S%oQsUmLftp;*$ zRG8Sg{}hI?x8vFk5fn=&PaR5f>?0;mo>W_em^xeZe~gNGU#C_Z>BJblG0}fpOrAV< zM8&iT{CQxF6ZQ;Y;)=Fjo7{9>SgMx@eBBMZzxAX!RJj3qv}_ zOX3M`{gPS(pG``b&w#yR0_doU}nVLreTunV+wyq*+^ z93B~a4s0B!3T7s#ij+9jl6v%8b==YZW5dP2EXj$pe|((Umgx9}=Fx=~oz9;ciBr8q z9_C#VRY0*@xQb#z7}!g^GBZvU@Gjxa6-)!y<~(^%jDAN)mdqvA0!oTPaeICV^WNf9$J`#x!+#e) znilQ$(twfCf+WJ1UJ4Z2GM72iWgt49mzmHGoN_edLX&WzPtA{0eWyF`&^*sg+jvC5 zQX&dUghAZm_g*CaI@W6vk!NvHKAAoac?Z+@w+3{uO3W&cK zdYCtr_!Yc<^77#y;%#vA{c^=<5|apJ6t<5@X_5i2L=*;uF79nn8Fb=a>Bebsu?hyd zaVK}86JC1a?cv=<9<_v*bkkjUQ+dmI8+qqExim@tR2$2-SZ|Kg3r?vyLbHvKj&~n# zKmO&Qyu%X4d&s5l#?AZWxykwq9cf^#-HQb*2{SLlo%e06c7rA58e^c;?kluPO;Kvk zcbGnchrY{H66~sGT?r0c$E*X)uVIx2R^6o4K5*9$nGb@cE47+>9R3I^9I&BLs~WKU zZmk-RQxTQS(Ax=NZ#xr3@Bp|UJc!ly$K1sNM*U@+3p;1D7*K90CiH4K+25g4qu#1`|>YRRQik&QSGW#i;aldg=5KbLmdRyew&Okl&ZemP=(-ba5>m{g`rl0c~_DFI0SA54^|jz z7g%|C+6M0XQN&OOa8#`%;S`kT7K8mB zwD!kH0Nf8&g5|A-Y6FLUhUmbp_ZVsrJZu^2u+ZCSvJ;sR-%G*Z!Jiwd9Bl6}R3ms` zgQ5Dsy$>5|H(1sM!{F`+j)bXX@Q9)OVB;?l9oW6qP*q^{<75Et0=vMfCtv_<0QZ6g zePjeK0o6%l45oqmer2cvu;VF1Ede{X8LAdM47P!NzlI?&;(x|a`*BqFqeNiovxYJ= zY0KXjsuXN{4jlj+o~I4LE^sZVUO@C<4LAhu0~4m9#4n-);99U4ta-^$)nNI{C?Qw{ zt_ADB-f8szZ8&y8*b5GV?QfurexDSO7MF#o$`76zm0S z{(zE#<$t1L;Ics^6TlCKz*?{{5P@?XWe^VknGC_UcMv(a7wi)MyD%u>;C`@bKN*4p zU~-mH;SXRCYyg*mhrnuZ`2q3)YyOI;!Mq`w3@ikPz%o!pro#!2G_VZ}frr3iF#HkP z4|amJ;4ZKQ+zWPsWq*S)unyb@mi(P2Fp2*u`G94gp~T?+L+BD%d6?bN~Dn^xqEeSEI5$sHiQN3U&DMk%|wcr7;0Xz)u z1yi$Wl5sK01T&IjR2Xak%fSBeF%eaT!*^Vassr;*n0h2Q{q7#s!*ieuE&8Pw!#Y6KnxmxFER#Hf`*KQ~5o zfcwF1VAWS+)F3zn9s~;(Bbk{n7CDcdcO1iDDOj~6Mpc1>U;`Lpzr7R82m1ssAS198 zJOu6m(`M0Yz7eBB;8rjU4uECg5LgYCEQ?X~;PAyT1}2x09~cSY7{HPHO=<>~fC;%| zcqxp5T@|!BxC^WSbFYFia0$2;><4>6-_l{^PVzz`U^jy4Coz;dwhdTIpvZlFfsUa%i5 zsX;>EK~SAc6Wkc1{NUc3kPKMyLz)Uqt);0?rvLZhXoFC2bByW&`@o&xffXWeqmibV2V-~BeZX?C0IUI*fZLj4R0TK$t_1s=kp$S%#`z4m z{ActUF#jGHIE8${Jh0EAV6d`1MnzWQD7zOW0}q4Sz>fRqJ`&;QXe;PjO9uHA2<+6C5wgWw+UAej2BPo>VMn}WIES}+Xufy=-{ zU^Q6r8=q;gN% z!(cyH^*f*12krrf!C^3=fQr4qp%d5z7J~y|Id~AP1=Aug!V!+;uW=#;9smcx+}C|- zKiKvLH9MVzdwr@9tp6j7fSqq~!UZ098%Ds~K`H|71rLDR-r+=S0StkDFkwFu0V}}e z;(reYz(_8R798bZ7r5(vpV|qg9zeuk#$U+jD~J{}!T!H;YzC$d!HCd5=GaZ>U>7(5 z_Jaxk%TXK{28Y24&{v3M1T(;4Fu#!gfA~`}gplzML<5$BHDEp10Ct0G!L-k4Gq4cc z36_ETz`D&F|GGrk$wk@5 z$12}K0#Z1t1Y5vdup2A}E01H#8QcX{fm0{MsyeU@Yy*qg$?gJs!EIpUq*yforlzsw z46ZyrRviKh(qmQfnMfQo12~3ogu#T#6acn^HDKcj>{*{_{pCcRX$*eNN}8%?8oREs z=1pHYRCGnr4Q;*`9S2Xu=#8K=|$ZwnT$H_i?_kY=quNl#8n z!*`fByvq7`s!pF#iOs5TlP`HduQpmRnuO>l>3zzN%xWEBPVBrAN9_8Go<>ztEd zq5LP-)q)4^ux>v|&m1pisy~^;#VHLLW5o@TmH$5L?UQtR@DK*3n;1k16+gf-3FlOb z=)~acPO|A8i-XiUru}p|xAR0sn|A!`&KA_hat7BTA3lBBm+7WEG z6$t3b3px0vs@MgBh`vilMVE%(O88;IOPufwVPCS@4ZT=fNBnw99KBl&Xe%>-J2{qa zYgh}#or}9T#=111vnDLVUFD-Y$J^z!YinspPfdVYKhCGxEFI93j+eT3K+2$&Qc>Zb zx(D=$al0X#sn!wlT{MJyS1LW67{@kI0=io}0c+rdg_b>_Ta7g_t9>o8w&t*fsMJJj zL6*)wXBqB8lQH6MK3?joMfd;*V%DgX+W*51-KV3!#$9V9hUryQ~I^5 zXQCR_gssiNBsyUsk1r8VBVjcm>wfac>cc%$i0S<|@%9k5`wZ)SiKi0aZ4sv1QHeZH zrKPN?gf$jhb4;BcSAaYDY-_Qpvu9M`UXCv9bn?!NmZP+PJ>mWf8ELIszM>}wJMr$p zTkk|4?FmvuKVfATF;rQ9&eM|;_u&m)>{C_NtEcF+SbS|4TS-CWVK31chE=_cZI3TpfGiVS@UuL}f*6Jd#Z+24|q+=MxRaZin0DS9c`|Hy#Kq_s%)g*fII(t)_vJJJ8>)SgdZ^KN`IJ~xCd_q z-o4hXi|`)ATUbqIwjjf)w>f2ws*s2vm$3Tlm{+*G`=N!QHD1qv>8L@0HLy^p zn5n`Mr(TxI=&ls_f6K@Ike#++&gc! zl0tgQ>~21z9CFPas47(9=2*3>Biwf<^0$7C zL}qm0U2+#=J{EyqniplfY%3*0%KMV|e-XD2dE{-h(r4=Ilk#xaZ6R;B5v9ChXw{FS$JY3eo_t0H z-eJ5oPVs)vR7lZvgjGDjlunYDrHq>HcIfp_`c#LE0F$i#nc5d8&0zLfFHme`Kki~C z!8@Hi>x?L=N`Lkty#yx5r4qg*rB1trN|}Db$_eX~Fn7QfdI5BqNJ|x<+x**D&$6nI=qhY$vn= zCfz>i+ZC?*=Gdd}FhPaPtIG&c%Th*F(~mcq^4eaoGIMoiY98)Vrrnjo-?Ef~G4o(9 zC#Y{XVsKfP604ylyo^P5qLrTK4`iBV||>< z{Npfg{~lTnx+g8kUbd*i(92@1k5AEAiDCThZ_xVIM}_*tUSpVQl(G$a{vWKDXQK-TBukbNLlURVnSj9@LnvJay4M^+ zOM~XyH`Z)YMhIF4v_eTke-^ta^f2^g(4+N1$}WRm4PC|zWh}97n4?dM)I-dBk0k{( zPaIO#VO;<32RR5|p?iZLg;aqm6_OeRMQ~9TGo^ zCOvN}v{cqi71oXdJ?V@Ayft|JqDI9jWnPw2ry;`HST@siTa9;{J&Z37OX%NR4T>5JgvsTEwGmd0TOOfRL-T#&4j%ZW3GGvdPsFliS^d+s zFH4Re_8uG^8w)%(g`M4m`9HPZ&eQ3M2XME1DzytR%unzgk9y+GV1i5Sm;~!{m@z_4 z{--c3#w#LBltS7CDY|(ppzVQX>lbk(UM;j?Xnx%C2(1xXDvLocp77KGEf-paM2Zpu z?5S;pwGdV!Varl3wiQ|u?IB?Ae@HY;SmD1$_18`#g(swAETM~A9zX9?Xx0C+=FHQX z!7%P&R;VIXc?6e1%V3qd(`oZTXC57aI;djp#SSd@PmD6zQne1k3t7wB28X3q^eo>` zc)yh7W6dkMR;KjD9W&jPlJ^s5WgHirq&=!q4zWv>5Mh@w(BxX@Q8LoUqV1u3||TkI-tMl|%F9VM1$wR?Aw$ zYd68Q(Atu%ji)eW+=jc9HTrT}m*V!~?H+Ia(vtInq5gZ0Np<&RuxDa@Ca=`w6YV~QgCU0XosM!ooXeWsxwcTdIG9{ zQmpEOE{}*I4_aL&6C&FXg(RC&Ax(>Q1_u1noE6XxK$D$M8mrtMs*bmVS_oP`oqKUk zP-WC8CI?|d+1AUaGF6eYu$42c&&8cKg~D^K?D;w~Qh-~{X5RvkM>tplEg4#ZO>t=D z(9)oJZ7uz)23iR;yIrHki$>@b$Iy|3>V#eg-JNeFU|Xzz73;(Wa`0x(8EYAdya!qh zv=U(=s$)xG!-Q=kY*1O-7wPn*)Dw~N$!LkT7Sd{&dH8$t*o1M@ianKdCD8ZeS(luq zrzBP4Zkrpc3jNOT+=hQ(DLgou)_U+X>Erd+=aX0n_OU&M8#uMBT2uXFyAF8jXeM*${}Jc-eT)-#d^|| zsd)SGdJQkK%7eE15^K@vIxA8p?#qsDT*`T^+mxT8xH#c3q0s+?<-62>D+(g7{+ z@}u(+x|~ri8Kc{iOrZ}zue>~VmZw#tv(Ezr)RUl;Nb(3XhoKE#Zlx^H>GLx(5ye$s zE+`Lr=NR4256P$!=>1n&mn_gzW>n(ddG%;oJC5|bI_QJYm&lT(IHg5P?>aHA8**Ni zwS57TuD!U!*T*V9G2{_B$gycTv(eMVZIyb0Aj9|r1+yoA-kZR zgokfJB^|@kA7`(IvxXtpw#KS*QX!HK!|fCz(qum(z1hkvl>H>!sVl98g*rV@g8T5w zSUGDMwW5&h)85=$*b8;0#P!g2;yt#zNlSMSmbVHs=j=;t!`qLy&bpP!Roq^@;fVE@ zLb}Ic+-9AXat7TdBY@!QteIyp$`s(Pz7WKB>1Uy{z9D@D92sbFv^gvs#0Jr^yE9(XSU~xNo{y5@YZSTZ84Es z@$bJ=x~6PDPRW+@>aM%ShJUYK(u@ZQ%V?xo9P>IOZ93)@e+OXTh=@XMgOP51RZL+RCQ)ka^z+K*qrO^Zwr}V|TWl6kF!m8NqOOBC5DZ3J!k!KvjBW(9Qv1+ZohO)}T%p8_M ztF)|Z!t~oZ+y(bZC3%jS;;$uafH1GWNuTb8b_kmEJ$VFoLQDQRW0cfv`PhPKAM|Bx za~!Mh2cg$P-@|x+T#-H@F(XK4{{^QB)?6ev-cL4RNTKzyYPZdIijXQG9fY*kZaZh| zIIaQW?gy=>iqPLK+?Acyn?)=$2XL2eh*iDTc(RN;h*v#iWiQfM^QUH`mk*7OzaejZ zmk+(|;iKuI2TPzAbXltwQG^`kt4FN+(WSTs+-o1P-V}Nl?q$EUK3_!7+l{;MQ7iK- zomn`HyT98VCS1{o7!z{Pfu5s>ovF}Dp>>EDOH=Z!9kM8U;4B@RDt7^fH^Q2uJ7H^} zM5je6p|wu7zHLzdQk=7Hb@XJSeF!5G8YV$MfwlGq&sC`?Ou@@s>?25c@a7AWx7ai!qA0Vt{z&ihI+B9JXc5T4AR@@=nYhSgR&Zgaq zaqoZCF0-f{ck1uCYb<&3Nd7g@I-rGx5S2e!s}{lr3ESm}wu_F=NkO7qq3GHZr@CyT zoVX8f>1!g->!{>-VeBxZT^?z2*3_AZ?RD;7|e`l-us``+OG zt;FLIaaTgCf)*`qao0g_fZk}Yt0NtF)An+^S<*$dq7<=>urOg#rRXrpelKB_gt;1M zuc(AR480M$AGf5DZYSvzW}$`9OOkB*u&>fyp;?i0_3;Jy1Ri_`o+J^Ev}p;nx_9G7 zrv{SAa%elD*?V5aDb-Qa{|16`-?KhGmnr{N+?DTJQ%ZDJ=04n0KZGAKtnSKBcs>Zd z@UPY-#7UY;u-X&T$R50h@pekws5z`HJBj+qs7yz2~YUM4`8KIp}%l_$h)+Nqvsl?tVIYQ5M#9Sh=)2#Bv+86Q7A)|kh5z(XtypAX} z_7hgdL6kH&VWTxJfL;l`z@giAOyZY9?>L4oX)B@cg)XefBea#!4j<;$yGIm}wLtWL z;r0|GJZiNh^KQZ#2#YRMGTI5fEhgUSN%)1f7g{egJFZI`f_4C!-Apb`om_@W_~MTm zUDHmcve3NlDj9~Lbw|Y$h6|ANE;Kou@N1YjI~J#2>Y?X@q7%3;C=} zRM1LYqJ8tWLR^v@?<}6kL<-#nZ5OoNxaF~15?b4MGK`5z?8`&$sqse{-3(}ILcHSs zu>DBlTxbU;at7(ME~RtCEyJHN*?MXTYb?23RB&Sa=s1>2{1%B1%@di_x)WMx>e029 zxN;e(82UEc@(67JnmXxdzT~n}IkaUiUlQ+79#=HBX2y?heF!mmE(}kLcMfau3(XI0 zAG9jm@(3*-T8Tg2IdFApCD6=3yra}EZ8@|qXjM@KS3^siE=)&=#UnMWhd2PywX62j zM3hr57afA$C=r={NB0!DQB`k_N@a8hYXEu&^cFXbH$?dH4-u9ZbXzE)^%qh+Cud+rUGL!_6mEsqAw1Fn1Kg8_5D z>u!52U=F(O{Vf4=uNVL40dv50_mR&o*F6Hg-*r#CGhl90>&~|e_O-9<)St~-OYovypgI=xi?$oS*q))S?A=84xmt&~1&MVgs_ZgkBm>JVD6A#4b3C!+QI+s5*=897Qi zEo8FQDd384=y}=OR_Wv_6>CajsfA?L8Kx=c$ zS*EWw{<+8c{W5(~+~sTX%v-9gITz~ra{`;^*-HFY+bL$jSzB|4)#Evb^b@7mZv;bOW6U4MPs8r8&be5hGxM#sxi*`ZubBs% zTXIs>6X#I|SwAm^P4JpNar;s zsjwI(CE?|Si&AyZ$|jzpOzrBi=DqOg#rgd!LA&hxHyj-&O>Nnfsy5r*@}xe~lXocgu2kBJWR|SPnKxZ;dkpVgemS#1RAxnPW^=QJk+x8<$!3m>#dM3*ZXGbqLYOK{U;&I+sOTly=pQsL9ATfe0zU;dMq=AjLj+j6NIxjOrnk?&*&{b5%t z{Ak78?9WCfq=yo2a1~*KSq3MLBIv@x*?F`_e3MVbH5JYd+TBR9AK7i%8n?;%=eP9q zh>-s9qC;AuVw*~cF0?DCtw?DZv@(|#aB0tz#d7H7&?_jSQfWJl*Mu9%4@1~g?WU_y z@!6H9J0nxDE^K!KvApe}rROz%kAVK!^KAakBw?C*knYIPWlPZSNzm|`Ntim|GBTud zIAfb&K8N|(zS4Ssxn3N1q&;Z9d$TqF+f3i$F-xHYF-u{i>|JRkWjrMo4!`6xKzU&m z%hg3)nD#7|(^%Ikl}`#?ZioM!@TF>E_E(`xPxQjX&xW$yfh4ahp3&@`#hO|zWig=( zTj7tm=TM;E7$CAiZGZSuv8~XvLVT>|7W&<114!8@++#f0niQI@q=4VPSPV@Umc?vn z7XM=Fq)YWQewX2lOZB-k%ieGlNvjVit_T%5t7QqaV5(oGs)uC2X_R*8S!Hd!RA*f( zIa~-kQxn%UPjZb=C|*7dnP``C-%E25c|2+s*OWm!PE|%z8se8c#F|Tb5t|qx$wQ3L z-?0ajhT2(kF4I#YA3bWCIwsbNsX$VV|hsnTSQ&J4gqR8ts26+Z1J&e8tkI zBC;SINsQe9wnwB@B5CmZh+q9so_QR-`jeX+9*iirR;kqA4vW~bZ+PF)eJQBpsksa< z+wIZsPkr;uVYM#Do7%m!<`i?9N<%05V>&(*o$wp%h}c8Pkm_u9XklZVI|9n^WDf-h z;a%cO#qwcR3Wtg8k4CI>%5~NZiE}A}sEKnFoyOrunT*2hzo_Khvy0eibIM4xR+sBZ zUw!d$r+=OK^Pu^MYbColyFDiMn5JYU#mHc>dv>7lbXV0RE1}o9cu4nRI6f-ZrzM_r zr`R07QESbn7#vrwDZODf~sIyx~BrUnE4NYQH(3~fW(}gm%XB!n`irIoq0Yg-2uj8X9W4lwtzX+b+2d~n@>Nmb!@`E0{4I$=kGrYn6<7u=AM9AC1Gjb@x?t_FAjQftMWk$bs=!>uD(>lB7_+tsSIZ zaJA01Y0{P=CTQ1Qt+VtdYxUJS$JjgDdg^L@o6!-n7Jf&kFIb)D=x#Yoid#C>a@=AN zB>5g%MLK&3CZ#B`dk)=d`i?$d@_Czl^c?Hc@96I>kSJ2}zCSpP)~Fuev`;BH82m3oR^VLe`{&&;wFmTv#5E22qXIN6HG3eM`xL0swI)xVtW z^+1_hchUw5rDdjV%Dh>MU2GRSk@kms>!a`LS;pFsHRT$;AmSyJSx#z>k16r`X5nrp zJ*@PIW6bY}((ys8>LuMyAGr5LXMSmh#^#Qm!TFlou|55l3C+&gMNKVgOLK*gh+Vk!WJ&Z!ly!(b#yX6QXmc&|$^XWTXCb1QxfTl{R$;n5EXFZBW5b!sIdQDG zDn1mTW#&}r`H{TUj+EcMStrZzJvS zbl6yCuX4+ce~?xL>kRXL+X7y`W-e*{#(IYSk7T8RTZU`{-d-CCPa0iDOoI{W2Uk^F z|ESWL7aWJGoQYu$wuhCNOBt9Fl-#sXDv)rBvHXvs^!^U7u z`YVr^lJC{u=T66Hz8zk^oQhqG2_0 zmkf;M44??=x30S-tWJinV0*cZGQpQR2@3zji`avnB(f9dg^geDBymAGOF)OlkGq-A zKc|xi&x|jOE@-)aa8sFH&)b<(rh0R(en<*cwv?xC%{DV&j0u(b=U+;G4qb#AJv$hu zBF^+cq?4f@%XzP#$TZ1+nhJ>O9h~i`h^%>~Kv`f;gUM9Pjf8j4au$|sYprXl_54NBckbW7;7xN!GnwG>7^FERZ)pX4j)dMjsu(t0{@$t9*Tk_>z8fAd zxK7VASSjCroj!l@z-)hq@K9zLW{1nq!8v~Tnt+-2Zxnu#AI>%fA6t`yMeL;kQV zZ?vzs^bOpc8A72FQI3;F?StP4Gv*BSTXSyE>6b|OIKt<-;gx7@$PU-Z$3g#vYthl> zW^dQ1V5G=Qj1T1AT0z9NpJdAoR_=SIKpYWgE~EQBP+3|s7oMqM~qT2cGnr0J-tKvWgW(12?M2L z(#wr=Mx0r)V^PbowxX)pP4TMV7MsW^1~#DC-Ajtz>rPq^&IvY3xXe4bmSM9m{=Ktv z=GXxpp@6+M68)2L?}cBR=GWoh>zj#8K4sgX*1GW~eb(ZZZ#z@B-(2mWEJ>DrPbVk; z!2~8C8Ka%w>(c5U4A4YI;o&)p8Vwawc;)&l@%susv#$hwgd?A#traWuMfxr4)fIYj z;BJH~^WokEXVqJASHSGR?~i}Xo<41|5`Uy~^as}5AF(`K(SD^_&*DTlmzlGOY+OTt zb%5ip$L+1A-u!96EOY5!hwj-rOtcfe&svm^)_qH}_lr_z_cPX##0JX(qu=^-#0Z zEOqt}FSL%MXytZuuRV&^A0snAAI-x8-|o87TprEa2#`g;M?20jk>6A8vZg?xgQ0$7 zj!HM(CNVa+HncnU&rK6lAoL>JBVtl+`;%i@@|dIKvn-UMHCmx-$j|eOGS`m!t(05z z%mt#K!SJBbY3t^o!4S2nk~NN_qa8+R?7CK&|0LDzFl1RJdRk#u*1G-{opre*oIzvd zXudjG%BefX-Af_mJbnXa@slDH_M7o=lt8v_Z&iqSPR zj$cg?_38{+4@LCMtgTqnnF(j9kr4xH9b=A5y_|5(wsKZ?Dw8cHeQ(!s=~sGf<>Iqo z*H;L=*~hPdRW1&9moK)m>+}@{cxRnnn9e?UW1~Id$fBiAjpcD^l9I)Wse^5sCR5rFQH)rKdSCxy`bq5k|S3c#KMd4d`*~(xwK^57WG+X&6ibe^&d~vXG zR^C;LvfsH?XQg}jNmyrSx}COwos!%1yvSBey3l=>>Ewdh{%(mY`ADD5Dc8v|I!SoC zqH8gkjm}GC^Pkd7oeE}m+GVxDr;%V*2NJT5k@c0t89ZItf$1`5C)k*3uvAS&=j0Nq9|;3O@76pn1J>E;zbBC&@%pcXyg*J@q>R z-yZEmwylIFb&=lJLfVt*CG2mQNiBvfcWl}mXiT{68G}sbNuO1?X?@Ui4k5z|yI==; z8Mm(|W9y`PJ?%m%`$pvGl{4&fHaKP9L{=%mymCX>9SVWbGs^f&?&SYt4AshsoePS4KhU38Szn!nIb&68K!4=+@z|}O~l6RfrHcAdWTwckN!ndy&tm@sGOSs?;Pg!bm|QDtS*w$b^{xrbxE zQL!jvvbEuMJ#FEK_c<$0XMrTG;Wtk4bcmI00YwVUFIL&!um~%^8~$FuW&BiM5$SWc zScUZh^>B`~ifoEIvtOrGp7@=!^8N5WXA4SNr;lx@Umy-oU;f$V^kboWttVnyN*{Xe z4)z^XQSQhHb}plcL=!k0n!d3__nvQ04gQxcqZ%RxLr#J18-k|2n?i??@lXt;WHyQZ zAoLQ}{%VLRAsVTFsAvBkiXajJ1r-<3Y#n@Nk(MhN5+f7+1HsqM6d+@ zU!{s7Z`rjd;iKXcwX=^Z_ET)9*wAIl-1ui>v>%^nPx&6$Rbh&fkZEXKDnH?Ga}~oA)Wl;1l^3OW ziEfxw_Ps|PMUwn0R5n}LIp%XHo|NmACGkAr^@VcK57WNhAOb9$eRh*iWm^y4sV`)c z`JZ=kiCL6x-}Ba#yY%^qGG7lD@$&=Lb$4+O_OUgm$}NRE@6rqBZM!eutWH>$<1O%y zuy&V?0_KRUR-L(L)9;+!{RA~{CN~v6CtZqTtvU=@#B;WHPNU9Dmtvf=y*l@7FU;AV zwW3jc=`h>G<#MI9oPh~~mT#xA&RkzJRh&hFI@Hy#c4mjwPqM|&xtTc^Ka;|k)F-SJck4^!w!`apvsDgeH|eb4 zFW+&xYN6WN?76G#`Fy!?-n&lNdDi!vbmUU0)daFENkY>Rw)k(wzccY@eulP-JOSu1#(KJ7%6O&?K}?^(J13J!ooZMd0+0JMEE z3bY<*(Q_jQnKe&P@knr8tG7B2($A}D(<)}i5`HV;RPm_rO2TFK?1gt86JAdEayQ&h z`bPYoncQb=ZEi$=`qUQd>#KFph~Ht|v|3-FkF$QaT7P9ia6kL8b$)dhD6Mv?b^IEA zrrg@PXbt;n5_^qasIRdeU!zacORbOA=e^< zwd%>{2AdJaX8qCVVjz2By^-b~cmkY?ef2Q*d-P?El%9a)f1PQ_M=S z^kQM@5(^gBK5ebC*w5>r>Y9m=R7I*NT#D{VF-lFgb#R@v!(zV+sl0CKRmSG`tc%+9 z{KVgqR9fOS>-07~-Rf)Cc?R2re`%-LF&9bq>iNgZARv9T1y1*V;Y_K{vM#(=pQlZ0 z-M#u0oou~!FGqRsb>v<>NAzaSeO%K%?R_a>E5r4>@Avo_+@KmCAbzW1lvIqYy-PEjAb#H--0_qUv6*E>}9bimbDfXD_8*5 zfm>n3k9#F8JDemN&5xo=bjmV^p4T3`ND5;_U@VQ-?RqIj0g#mNRR*%OI&vdcZr)( zkVxKiAOI6$*QJ2n&j#2Da@_Yqm+3(_8*II5E9VSPZjxp?P6hJnm{IlfEqfsK3RRb+ zRgmdspzc-~1n-%y)`cQ|SDR!P4l >Bs%7>(0VGO|P@p*%W+_PX%%fdslaYnXD!> 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 YibMs_2XyXX;HO1Z}Gz|eNh4(5NxO`K&&%dQg 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[0]) { snprintf(out, outsz, "%s", a->icon); return 1; } + return 0; /* 无注册/无图标 → 保持空(通知中心 UI 再回退) */ +} + /* 启动加载(M2.11/M2.24):统一由 meow_settings 后端读 settings.conf; * 此处仅注册监听(一次性)+ 把 backend 当前值同步到缓存全局。重载(应用期 * watchdog 可能改音量)等价于 meow_settings_init() + 手动同步。 */ @@ -2469,6 +2484,7 @@ static void settings_load(void) meow_settings_init(); /* 幂等:注册默认 + 读 settings.conf */ meow_notif_init(); /* M2a:通知存储初始化(幂等,读 notify.* 配额) */ meow_notif_set_dump_cb(notif_dump_tf_placeholder); /* 通知#6:挂 dump 回调 = TF 转储(meow_notif_dump_tf:一行 CSV 追加 + 10MB 滚动截断) */ + meow_notif_set_icon_cb(notif_app_icon_fallback); /* icon 空 → 按 app_id 回退该 app 默认图标(app.json icon) */ if (!settings_cache_registered) { meow_settings_add_listener(settings_sync_cache_listener); settings_cache_registered = 1; @@ -6951,6 +6967,7 @@ static void ipc_dispatch(struct meow_ipc_msg *m) snprintf(n.target_activity, sizeof n.target_activity, "%s", mn.target_activity); n.expire_timeout = mn.expire_timeout; n.progress = mn.progress; + n.urgency = mn.urgency; /* 0-3(低/普通/高/紧急);旧调用=0 → LOW(静默),新调用缺省 NORMAL */ n.ongoing = mn.ongoing; n.media = mn.media; uint32_t nid = 0; @@ -6973,6 +6990,19 @@ static void ipc_dispatch(struct meow_ipc_msg *m) logmsg("ipc: NOTIFY_DISMISS id=%u rc=%d -> ACK", id, rc); break; } + case MSG_NOTIFY_PROGRESS: { + m_notify_progress_t p; + memset(&p, 0, sizeof p); + memcpy(&p, m->payload, m->plen < (uint16_t)sizeof p ? m->plen : (uint16_t)sizeof p); + /* 实时进度:仅改 launcher 内存活跃槽(不落盘);progress>=100 视为结束 → 里程碑落盘 */ + int rc = meow_notif_update_progress(p.nid, p.progress); + m_ack_t a; + a.code = (rc == NOTIF_OK) ? MEOW_OK : (uint32_t)rc; + a.status = 0; + ipc_send(m->fd, MSG_ACK, m->req_id, &a, sizeof a); + logmsg("ipc: NOTIFY_PROGRESS nid=%u p=%d rc=%d -> ACK", p.nid, p.progress, rc); + break; + } case MSG_NOTIFY_LIST: /* ↓ 守护→App 下发通知清单(重同步)。本帧不来自客户端(无请求类型),故不在此应答; * 需用时由守护主动经 meow_notif_serialize_list() + ipc_send 下发(M5 通知中心接入)。 */ diff --git a/patch_v2/meow_launcherd/meow_notif.c b/patch_v2/meow_launcherd/meow_notif.c index 907ee95..f4f7c42 100644 --- a/patch_v2/meow_launcherd/meow_notif.c +++ b/patch_v2/meow_launcherd/meow_notif.c @@ -58,6 +58,7 @@ static int g_cat_quota = MEOW_NOTIF_CAT_QUOTA_DEF; static int g_media_quota = MEOW_NOTIF_MEDIA_QUOTA_DEF; static meow_notif_dump_cb g_dump_cb = NULL; +static meow_notif_icon_cb g_icon_cb = NULL; static int g_inited = 0; /* ---- 日志(自包含,不依赖 launcher 的 logmsg;前缀 "notif:")---- */ @@ -94,14 +95,27 @@ static void n_strncpy(char *dst, const char *src, size_t len) dst[len - 1] = 0; } +/* app_icon 回退(用户定案):post 的 app_icon 为空时,经 g_icon_cb(app_id) 填该 app 默认图标; + * 无回调/回调未填 → 保持空(通知中心 UI 再回退)。每条可独立图标(非空即用)。 */ +static void notif_resolve_icon(meow_notif_t *s) +{ + if (!g_icon_cb) return; + if (s->app_icon[0]) return; + char tmp[MEOW_NOTIF_ICON_MAX]; + if (g_icon_cb(s->app_id, tmp, sizeof tmp) > 0 && tmp[0]) + n_strncpy(s->app_icon, tmp, sizeof s->app_icon); +} + /* ================= TF 卡转储(通知#6 / M2c,NOTIFICATION_SYSTEM.md §5/§8)================= * 每条通知一行 CSV 追加到 <卡根>/MeowOS/notifications/notifications.log,并按日志总大小 - * 滚动截断(保留最新 10MB)。系统文件统一放 <卡根>/MeowOS/ 下(TF_CARD_LAYOUT.md)。 */ + * 滚动截断(保留最新 10MB)。系统文件统一放 <卡根>/MeowOS/ 下(TF_CARD_LAYOUT.md)。 + * 字段见 tf_line():timestamp,id,app_id,app_icon,category,urgency,progress,title,body, + * target_activity,ongoing,media,dismissed(CSV 转义/去换行)。 */ #define MEOW_NOTIF_TF_DIR "/usr/data/mnt/sd_0/MeowOS/notifications" #define MEOW_NOTIF_TF_LOG MEOW_NOTIF_TF_DIR "/notifications.log" #define MEOW_NOTIF_LOG_MAX_BYTES ((size_t)10 * 1024 * 1024) /* §8:保留最新 10MB */ -/* 单行 CSV 上限:app_id(32)/category(24)/summary(64)/body(96)/target_activity(48) +/* 单行 CSV 上限:app_id(32)/category(24)/summary(64)/body(96)/app_icon(48)/target_activity(48) * 全引号转义后仍远小于此。 */ #define MEOW_NOTIF_CSV_LINE_MAX 1024 @@ -155,26 +169,31 @@ static void csv_field(char *dst, size_t dstsz, const char *src) } /* 生成一行 CSV: - * timestamp,id,app_id,category,urgency,title,body,target_activity,ongoing,media,dismissed - * title<-summary;urgency:meow_notif 结构无该字段(保持既有 API),列值留空 ""。 - * 返回写入长度(不含 NUL)。 */ + * timestamp,id,app_id,app_icon,category,urgency,progress,title,body,target_activity,ongoing,media,dismissed + * title<-summary;app_icon<-SDK icon(空→储存时已按 app_id 回退 app 图标);urgency 0-3(缺省 NORMAL); + * progress 写当前值(-1=无进度)。返回写入长度(不含 NUL)。 */ static size_t tf_line(const meow_notif_t *n, char *buf, size_t bufsz) { char a_app [2 + 2 * MEOW_NOTIF_APP_ID_MAX + 2]; char a_cat [2 + 2 * MEOW_NOTIF_CAT_MAX + 2]; char a_sum [2 + 2 * MEOW_NOTIF_SUMMARY_MAX + 2]; char a_body[2 + 2 * MEOW_NOTIF_BODY_MAX + 2]; + char a_icon[2 + 2 * MEOW_NOTIF_ICON_MAX + 2]; char a_tgt [2 + 2 * MEOW_NOTIF_ACTIVITY_MAX + 2]; csv_field(a_app, sizeof a_app, n->app_id); csv_field(a_cat, sizeof a_cat, n->category); csv_field(a_sum, sizeof a_sum, n->summary); csv_field(a_body, sizeof a_body, n->body); + csv_field(a_icon, sizeof a_icon, n->app_icon); csv_field(a_tgt, sizeof a_tgt, n->target_activity); int r = snprintf(buf, bufsz, - "%llu,%u,%s,%s,\"\",%s,%s,%s,%u,%u,%u\n", + "%llu,%u,%s,%s,%s,%u,%d,%s,%s,%s,%u,%u,%u\n", (unsigned long long)n->created_ms, (unsigned)n->id, - a_app, a_cat, a_sum, a_body, a_tgt, + a_app, a_icon, a_cat, + (unsigned)n->urgency, + (int)n->progress, + a_sum, a_body, a_tgt, n->ongoing ? 1u : 0u, n->media ? 1u : 0u, n->dismissed ? 1u : 0u); @@ -477,8 +496,10 @@ int meow_notif_post(const meow_notif_t *n, uint32_t *out_id) n_strncpy(s->target_activity, n->target_activity, sizeof s->target_activity); s->expire_timeout = n->expire_timeout; s->progress = n->progress; + s->urgency = n->urgency; s->ongoing = n->ongoing; s->media = n->media; + notif_resolve_icon(s); /* 空 app_icon → app 图标回退 */ if (out_id) *out_id = s->id; notif_log("post: UPDATE id=%u app=%s cat=%s", s->id, s->app_id, s->category); return NOTIF_OK; @@ -533,10 +554,12 @@ int meow_notif_post(const meow_notif_t *n, uint32_t *out_id) n_strncpy(s->target_activity, n->target_activity, sizeof s->target_activity); s->expire_timeout = n->expire_timeout; s->progress = n->progress; + s->urgency = n->urgency; s->ongoing = n->ongoing; s->media = media ? 1 : 0; s->created_ms = wall_ms(); s->dump_at_ms = mono_ms() + MEOW_NOTIF_TTL_MS; /* §8:创建 10s 转储 */ + notif_resolve_icon(s); /* 空 app_icon → app 图标回退 */ s->active = 1; if (out_id) *out_id = s->id; notif_log("post: NEW id=%u app=%s cat=%s media=%d ongoing=%d", s->id, s->app_id, @@ -558,6 +581,26 @@ int meow_notif_dismiss(uint32_t id) return NOTIF_OK; } +/* ---- 实时更新进度:仅改内存活跃槽;progress>=100 视为「结束」→ 立即归档(里程碑落盘)---- */ +int meow_notif_update_progress(uint32_t id, int progress) +{ + if (!g_inited) return NOTIF_ERR_NOTINIT; + int p = (progress < -1) ? -1 : (progress > 100 ? 100 : progress); /* 钳位 [-1,100] */ + int idx = slot_by_id(id); + if (idx < 0) return NOTIF_ERR_NOENT; + meow_notif_t *s = &g_slots[idx]; + s->progress = p; /* 实时:只改内存活跃槽,不落盘 */ + if (p >= 100) { /* 结束(100%):里程碑落盘 + 释放非 ONGOING */ + int was_ongoing = s->ongoing; + archive_one(s); /* 此刻快照(progress=100 写入 dump) */ + if (!was_ongoing) slot_release(idx); + else notif_log("progress: id=%u reached 100%%, archived (kept for UI)", id); + } else { + notif_log("progress: id=%u p=%d (memory only)", id, p); + } + return NOTIF_OK; +} + /* ---- count ---- */ int meow_notif_count(const char *app_id) { @@ -641,6 +684,12 @@ void meow_notif_set_dump_cb(meow_notif_dump_cb cb) g_dump_cb = cb; /* NULL=恢复默认(无回调,仅日志;M2c 接 TF) */ } +/* ---- 设置图标回退回调 ---- */ +void meow_notif_set_icon_cb(meow_notif_icon_cb cb) +{ + g_icon_cb = cb; /* NULL=禁用(空 app_icon 保持空,通知中心 UI 再回退) */ +} + /* ---- MSG_NOTIFY_LIST 序列化(守护→App 下发清单;M5 通知中心/重同步用)---- * 负载: [u16 count] + count 条 定长 meow_notif 记录(records 以 app_id/category/ * summary/body/app_icon/target_activity 为主,精简 payload,适配 MEOW_IPC_CARGO)。 */ @@ -690,8 +739,8 @@ void meow_notif_dump(const char *log_prefix) for (int i = 0; i < MEOW_NOTIF_MAX_SLOTS; i++) { meow_notif_t *s = &g_slots[i]; if (!s->active) continue; - notif_log("%s slot%02d id=%u app=%s cat=%s sum=%s ong=%d media=%d dumped=%d", + notif_log("%s slot%02d id=%u app=%s cat=%s sum=%s ong=%d media=%d urg=%u dumped=%d", lp, i, s->id, s->app_id, s->category, s->summary, - s->ongoing, s->media, s->dumped); + s->ongoing, s->media, s->urgency, s->dumped); } } diff --git a/patch_v2/meow_launcherd/meow_notif.h b/patch_v2/meow_launcherd/meow_notif.h index 7791816..12dfa57 100644 --- a/patch_v2/meow_launcherd/meow_notif.h +++ b/patch_v2/meow_launcherd/meow_notif.h @@ -66,14 +66,15 @@ typedef struct meow_notif { char category[MEOW_NOTIF_CAT_MAX]; /* 通知类型(媒体通知="media") */ char summary[MEOW_NOTIF_SUMMARY_MAX]; /* 标题(单行) */ char body[MEOW_NOTIF_BODY_MAX]; /* 正文(可多行) */ - char app_icon[MEOW_NOTIF_ICON_MAX]; /* 图标 icon name 或 path */ + char app_icon[MEOW_NOTIF_ICON_MAX]; /* 图标 icon name 或 path(SDK icon;空→app 图标回退) */ char actions[MEOW_NOTIF_ACTIONS_MAX]; /* actions[](NUL 分隔;v1 空,M2b 填) */ char hints[MEOW_NOTIF_HINTS_MAX]; /* hints{} 原始 "k=v;..." 串(v1 空,M2b 填) */ uint32_t expire_timeout; /* 超时 ms;0xFFFFFFFF=ONGOING 常驻 */ uint64_t created_ms; /* 创建时刻(墙钟 epoch ms,供归档/显示) */ uint64_t dump_at_ms; /* 转储时刻(monotonic ms,TTL=创建+10s;ONGOING 亦到此转储) */ - int32_t progress; /* MeowOS:0-100 进度;<0=无 */ + int32_t progress; /* MeowOS:0-100 进度;<0=无(实时仅改内存,落盘只在创建/结束) */ char target_activity[MEOW_NOTIF_ACTIVITY_MAX]; /* MeowOS:点击跳转目标 activity */ + uint8_t urgency; /* 紧急度 0-3(低/普通/高/紧急);缺省 NORMAL */ uint8_t ongoing; /* 1=常驻通知(服务死随清) */ uint8_t media; /* 1=媒体通知(走 notify.media_quota) */ uint8_t dismissed; /* 1=已撤下 */ @@ -84,6 +85,10 @@ typedef struct meow_notif { /* 转储回调(M2c 落盘 / 本批默认仅日志):通知归档时调用。 */ typedef void (*meow_notif_dump_cb)(const meow_notif_t *n); +/* 图标回退回调:post 的 n->app_icon 为空时调用,按 app_id 填该 app 默认图标(name/path)。 + * 返回 1=已填 out;0/空=无(通知中心 UI 再回退)。NULL=禁用回退(保持空 app_icon)。 */ +typedef int (*meow_notif_icon_cb)(const char *app_id, char *out, size_t outsz); + /* == 生命周期 == */ int meow_notif_init(void); /* 幂等;从 meow_settings 读 notify.* 配额(B2a) */ int meow_notif_shutdown(void); /* 保存/清理(进程退出前调;本批=归档未转储项) */ @@ -119,12 +124,19 @@ void meow_notif_before_poweroff(void); /* 覆盖转储回调(NULL=恢复默认日志;M2c 接 TF 落盘)。 */ void meow_notif_set_dump_cb(meow_notif_dump_cb cb); +/* 覆盖图标回退回调(NULL=禁用,空 app_icon 保持空;M5 通知中心 UI 再回退)。 */ +void meow_notif_set_icon_cb(meow_notif_icon_cb cb); + +/* 实时更新一条活跃通知的进度(0-100,<0=清除)。仅改内存活跃槽;progress>=100 视为「结束」, + * 立即归档(落盘快照)并(非 ONGOING)释放槽——对应「里程碑落盘」。返回 NOTIF_OK/NOTIF_ERR_NOENT。 */ +int meow_notif_update_progress(uint32_t id, int progress); + /* == TF 卡转储(通知#6 / M2c,NOTIFICATION_SYSTEM.md §5/§8 + MEOWOS_SPEC_REF §5.3)== * 把 dump_cb 接到 meow_notif_dump_tf 即把每条通知追加为一行 CSV 到 * <卡根>/MeowOS/notifications/notifications.log,并按日志总大小滚动截断 * (保留最新 10MB,不被电源事件清;启动时 meow_notif_init 先清板载+内存表)。 - * 字段按 meow_notif 结构(title<-summary;urgency 结构无字段故列留空;均做 CSV - * 转义/去换行)。无卡/不可写仅打点降级,绝不崩。 */ + * 字段按 meow_notif 结构(title<-summary;app_icon<-SDK icon 空→app 图标回退;urgency 0-3; + * progress 当前值,-1=无;均做 CSV 转义/去换行)。无卡/不可写仅打点降级,绝不崩。 */ int meow_notif_dump_tf(const meow_notif_t *n); /* 0=成功;负=失败(无卡/IO/参数) */ void meow_notif_clear_tf(void); /* 开机清板载通知(清空文件,保留目录) */ void meow_notif_set_tf_path(const char *path); /* 覆盖转储日志路径;NULL=恢复默认卡路径(宿主单测用) */ diff --git a/patch_v2/meow_launcherd/test_notif_tf.c b/patch_v2/meow_launcherd/test_notif_tf.c index 97a9cbb..bebd499 100644 --- a/patch_v2/meow_launcherd/test_notif_tf.c +++ b/patch_v2/meow_launcherd/test_notif_tf.c @@ -53,9 +53,37 @@ static void make_notif(meow_notif_t *n, uint32_t id, const char *sum, const char strcpy(n->summary, sum); strcpy(n->body, body); strcpy(n->target_activity, "act"); + n->urgency = 0; /* 0=LOW(缺省值) */ + n->progress = -1; /* 无进度 */ n->ongoing = 1; } +/* 回读指定 summary 的活跃通知(meow_notif_list 回调;按 g_find_key 匹配) */ +static meow_notif_t g_got; static int g_got_found = 0; static char g_find_key[64]; +static int find_cb(const meow_notif_t *n, void *ctx) +{ + (void)ctx; + if (n && strcmp(n->summary, g_find_key) == 0) { g_got = *n; g_got_found = 1; return 1; } + return 0; +} +static meow_notif_t find_notif(const char *summary) +{ + g_got_found = 0; memset(&g_got, 0, sizeof g_got); + snprintf(g_find_key, sizeof g_find_key, "%s", summary); + meow_notif_list(NULL, find_cb, NULL); + return g_got_found ? g_got : (meow_notif_t){0}; +} + +/* 图标回退 stub:com.app → "app_icon_name";其他 app → 无 */ +static int stub_icon_cb(const char *app_id, char *out, size_t outsz) +{ + if (app_id && !strcmp(app_id, "com.app")) { snprintf(out, outsz, "app_icon_name"); return 1; } + return 0; +} + +/* dump_cb 类型是 void,而 meow_notif_dump_tf 返回 int——包一层(同 launcher notif_dump_tf_placeholder) */ +static void dump_tf_wrapper(const meow_notif_t *n){ (void)meow_notif_dump_tf(n); } + /* --- 1) CSV 转义 + 去换行 --- */ static void test_csv_escape(const char *path) { @@ -71,9 +99,9 @@ static void test_csv_escape(const char *path) char *s = read_all(path, NULL); CHECK(s != NULL, "file exists after dump"); const char *expect = - "1234567890123,42,\"com.app\",\"general\",\"\",\"Hel\"\"lo, world line2\"," - "\"Body with\ttab\",\"act\",1,1,0\n"; /* ongoing=1 media=1 dismissed=0 */ - CHECK(s && strcmp(s, expect) == 0, "CSV line matches expected (escape+newline-strip)"); + "1234567890123,42,\"com.app\",\"\",\"general\",0,-1,\"Hel\"\"lo, world line2\"," + "\"Body with\ttab\",\"act\",1,1,0\n"; /* app_icon="" urgency=0 progress=-1 ongoing=1 media=1 dismissed=0 */ + CHECK(s && strcmp(s, expect) == 0, "CSV line matches expected (escape+newline-strip+new cols)"); if (s) { fprintf(stderr, " got: %s", s); fprintf(stderr, " exp: %s", expect); } free(s); } @@ -134,24 +162,92 @@ static void test_init_clear(const char *path) free(s); } +/* --- 4) icon 回退:app_icon 空 → 按 app_id 用该 app 默认图标;非空 → 保留 --- */ +static void test_icon_fallback(const char *path) +{ + meow_notif_set_icon_cb(stub_icon_cb); + meow_notif_before_poweroff(); /* 清内存表,回到干净态(dump_cb=NULL 不落盘) */ + meow_notif_set_tf_path(path); + meow_notif_set_tf_max(1024 * 1024); + + /* 空 app_icon → 回退 app 图标 */ + meow_notif_t n; + make_notif(&n, 0, "icon-test", ""); + uint32_t id = 0; + CHECK(meow_notif_post(&n, &id) == NOTIF_OK, "icon-fallback post ok"); + meow_notif_t got = find_notif("icon-test"); + CHECK(got.id != 0 && !strcmp(got.app_icon, "app_icon_name"), "empty app_icon → app icon fallback"); + + /* 非空 app_icon → 独立图标(不回退) */ + make_notif(&n, 0, "icon-custom", ""); + n.app_icon[0] = 0; strcpy(n.app_icon, "custom/icon.png"); + CHECK(meow_notif_post(&n, &id) == NOTIF_OK, "icon-custom post ok"); + got = find_notif("icon-custom"); + CHECK(got.id != 0 && !strcmp(got.app_icon, "custom/icon.png"), "non-empty app_icon kept (per-notif icon)"); +} + +/* --- 5) progress 实时(仅内存)vs 里程碑(100% 落盘 + 释放) --- */ +static void test_progress_live(const char *path) +{ + meow_notif_set_icon_cb(NULL); + meow_notif_set_dump_cb(NULL); + meow_notif_before_poweroff(); /* 清内存表,回到干净态 */ + meow_notif_set_tf_path(path); + meow_notif_set_tf_max(1024 * 1024); + meow_notif_set_dump_cb(dump_tf_wrapper); /* 归档即写 CSV;验证落盘快照 */ + + meow_notif_t n; + make_notif(&n, 0, "live", ""); + n.ongoing = 0; /* 非 ONGOING,便于验证 100% 释放 */ + n.progress = 0; + uint32_t id = 0; + CHECK(meow_notif_post(&n, &id) == NOTIF_OK, "progress post ok"); + CHECK(meow_notif_count(NULL) == 1, "one active after post"); + + /* 实时 <100%:仅内存,不落盘 */ + CHECK(meow_notif_update_progress(id, 70) == NOTIF_OK, "update_progress(70) ok"); + CHECK(meow_notif_count(NULL) == 1, "still active after live update (not dumped)"); + long len = 0; char *s = read_all(path, &len); + CHECK((s == NULL || len == 0), "no CSV written on live update (<100%)"); + free(s); + + /* 里程碑 100%:立即归档落盘 + 释放非 ONGOING 槽 */ + CHECK(meow_notif_update_progress(id, 100) == NOTIF_OK, "update_progress(100) ok"); + CHECK(meow_notif_count(NULL) == 0, "slot released after 100% milestone"); + s = read_all(path, &len); + CHECK(s != NULL && len > 0, "CSV written on 100% milestone"); + CHECK(s && strstr(s, ",100,\"live\"") != NULL, "milestone CSV has progress=100 title=live"); + if (s) fprintf(stderr, " milestone row: %s", s); + free(s); + + /* 已释放 id → NOENT */ + CHECK(meow_notif_update_progress(id, 50) == NOTIF_ERR_NOENT, "update on released id -> NOENT"); + + meow_notif_set_dump_cb(NULL); /* 复位 */ +} + int main(void) { char tmp[] = "/tmp/meow_notif_tf_test_XXXXXX"; char *dir = mkdtemp(tmp); if (!dir) { perror("mkdtemp"); return 2; } - char p1[512], p2[512], p3[512]; + char p1[512], p2[512], p3[512], p4[512], p5[512]; snprintf(p1, sizeof p1, "%s/csv.log", dir); snprintf(p2, sizeof p2, "%s/trim.log", dir); snprintf(p3, sizeof p3, "%s/init.log", dir); + snprintf(p4, sizeof p4, "%s/icon.log", dir); + snprintf(p5, sizeof p5, "%s/prog.log", dir); CHECK(p1[0] != 0, "tmpdir ready"); test_csv_escape(p1); test_trim(p2); test_init_clear(p3); + test_icon_fallback(p4); + test_progress_live(p5); /* 清理:删除日志文件 + 目录(保底) */ - unlink(p1); unlink(p2); unlink(p3); rmdir(dir); + unlink(p1); unlink(p2); unlink(p3); unlink(p4); unlink(p5); rmdir(dir); fprintf(stderr, "\n%s (failures=%d)\n", g_fail ? "== TEST FAILED ==" : "== TEST PASSED ==", g_fail); return g_fail ? 1 : 0; diff --git a/patch_v2/sdk/meow_notify_ipc.c b/patch_v2/sdk/meow_notify_ipc.c index a4c768b..6486fed 100644 --- a/patch_v2/sdk/meow_notify_ipc.c +++ b/patch_v2/sdk/meow_notify_ipc.c @@ -6,13 +6,15 @@ * meow_ipc.h(同源一份、杜绝两端漂移): * - 帧头 16B:magic=0x4D4F5701 / version=1 / type / req_id / len(全小端 LE,mipsel 原生); * - MSG_NOTIFY(0x0020) ↑ 负载 = m_notify_t;MSG_NOTIFY_ACK(0x0021) ↓ 负载 = m_ack_t(status=nid); - * - MSG_NOTIFY_DISMISS(0x0022) ↑ 负载 = uint32 nid。 + * - MSG_NOTIFY_DISMISS(0x0022) ↑ 负载 = uint32 nid; + * - MSG_NOTIFY_PROGRESS(0x0024) ↑ 负载 = m_notify_progress_t(nid+progress,实时进度仅内存)。 * * 设计要点: * - 只做「一次性 connect + send + read ACK」,不维护连接/订阅循环(与 meow_ipc.c 客户端同型); * - 映射层(SDK 枚举 ↔ IPC 字段)集中在本文件:分类枚举 CAT_* ↔ 字符串 * "general"/"message"/"email"/"event"/"progress"/"media";timeout_ms → expire_timeout: * >0 该毫秒、0=不自动过期、-1(ONGOING)=0xFFFFFFFF(并置 ongoing=1);媒体类型置 media=1; + * SDK `icon` → app_icon(空则 launcher 按 app_id 回退 app 图标);urgency 0-3 直通(越界钳位 NORMAL); * - 优雅降级:无 socket(connect 失败)/写失败/ACK 超时(SO_RCVTIMEO)/非 ACK 应答 → * 返回 0(调用方 meow_ui_notify.c 保留本地 id 兜底),绝不崩; * - 线程安全:app_id 经 pthread_once 缓存;socket 路径每次调用读 env MEOW_IPC_SOCK 覆盖 @@ -82,8 +84,8 @@ static uint32_t timeout_to_expire(int timeout_ms) return (uint32_t)timeout_ms; /* 0(NEVER)/ >0(毫秒) */ } -/* 构建 IPC 负载 m_notify_t(app_icon/actions/hints v1 留空,M2b D-Bus 桥再填)。 - * 仅在持有调用者互斥之外、发送前调用(纯 CPU 拷贝,不阻塞)。 */ +/* 构建 IPC 负载 m_notify_t(app_icon<->SDK icon;urgency 0-3;actions/hints v1 留空, + * M2b D-Bus 桥再填)。仅在持有调用者互斥之外、发送前调用(纯 CPU 拷贝,不阻塞)。 */ static void build_m_notify(const meow_notify *n, uint32_t replaces_id, m_notify_t *mn) { memset(mn, 0, sizeof *mn); @@ -91,6 +93,7 @@ static void build_m_notify(const meow_notify *n, uint32_t replaces_id, m_notify_ snprintf(mn->category, sizeof mn->category, "%s", cat_to_str(n->cat)); snprintf(mn->summary, sizeof mn->summary, "%s", n->title ? n->title : ""); snprintf(mn->body, sizeof mn->body, "%s", n->body ? n->body : ""); + snprintf(mn->app_icon, sizeof mn->app_icon, "%s", n->icon ? n->icon : ""); snprintf(mn->target_activity, sizeof mn->target_activity, "%s", n->target_activity ? n->target_activity : ""); mn->replaces_id = replaces_id; /* 0=新建;>0=更新(不存在则落为新建,见 launcher) */ @@ -98,6 +101,9 @@ static void build_m_notify(const meow_notify *n, uint32_t replaces_id, m_notify_ mn->progress = (n->progress < -1) ? -1 : (n->progress > 100 ? 100 : n->progress); mn->media = (n->cat == MEOW_NOTIFY_CAT_MEDIA) ? 1 : 0; mn->ongoing = (n->timeout_ms == MEOW_NOTIFY_TIMEOUT_ONGOING) ? 1 : 0; + /* urgency:越界钳位到 NORMAL(缺省);0-3 直通(launcher 侧再回退缺省) */ + mn->urgency = ((int)n->urgency >= 0 && (int)n->urgency < (int)MEOW_NOTIFY_URG_COUNT) + ? (uint8_t)n->urgency : (uint8_t)MEOW_NOTIFY_URG_NORMAL; } /* ============================================================ */ @@ -241,3 +247,36 @@ void meow_notify_ipc_dismiss(uint32_t nid) } close(fd); } + +void meow_notify_ipc_update_progress(uint32_t nid, int progress) +{ + int fd; + if (nid == 0) return; + m_notify_progress_t p; + memset(&p, 0, sizeof p); + p.nid = nid; + p.progress = (progress < -1) ? -1 : (progress > 100 ? 100 : progress); + fd = conn_path(ipc_sock_path()); + if (fd < 0) return; /* 无 socket:静默 */ + set_ack_timeout(fd); + if (!send_frame(fd, MSG_NOTIFY_PROGRESS, 0x4E4F5450u /* "NOTP" */, &p, (uint32_t)sizeof p)) { + close(fd); /* 写失败:静默 */ + return; + } + /* 读回应答(launcher 对 PROGRESS 回 MSG_ACK,best-effort;读回确保 launcher 已处理完) */ + uint8_t rhdr[MEOW_IPC_HDR_LEN]; + if (read_all(fd, rhdr, sizeof rhdr)) { + uint32_t rmagic, rlen; + uint16_t rver, rtype; + memcpy(&rmagic, rhdr + 0, 4); + memcpy(&rver, rhdr + 4, 2); + memcpy(&rtype, rhdr + 6, 2); + memcpy(&rlen, rhdr + 12, 4); + if (rmagic == MEOW_IPC_MAGIC && rver == MEOW_IPC_VERSION && + rtype == MSG_ACK && rlen >= sizeof(m_ack_t)) { + uint8_t pay[sizeof(m_ack_t)]; + (void)read_all(fd, pay, sizeof(m_ack_t)); /* 读到即确认;内容不关心 */ + } + } + close(fd); +} diff --git a/patch_v2/sdk/meow_notify_ipc.h b/patch_v2/sdk/meow_notify_ipc.h index c1da243..f02a5a0 100644 --- a/patch_v2/sdk/meow_notify_ipc.h +++ b/patch_v2/sdk/meow_notify_ipc.h @@ -4,9 +4,10 @@ * 定位(任务 #5 SDK↔IPC 桥关键断点):让框架 app 调 meow_notify_send() 的通知真正经 * AF_UNIX IPC 送到 launcher(meow_launcherd)中央存储(meow_notif.c 的 meow_notif_post), * 通知中心(阶段 B · M5)才能显示。消息通道(FRAMEWORK_DESIGN §1 / meow_ipc.h): - * - MSG_NOTIFY 0x0020 ↑:推送/更新通知(负载 m_notify_t); + * - MSG_NOTIFY 0x0020 ↑:推送/更新通知(负载 m_notify_t;含 SDK icon→app_icon、urgency); * - MSG_NOTIFY_ACK 0x0021 ↓:落库结果(m_ack_t,status=launcher 分配的通知 id nid); - * - MSG_NOTIFY_DISMISS 0x0022 ↑:撤下通知(负载 uint32 nid)。 + * - MSG_NOTIFY_DISMISS 0x0022 ↑:撤下通知(负载 uint32 nid); + * - MSG_NOTIFY_PROGRESS 0x0024 ↑:实时更新通知进度(负载 m_notify_progress_t,仅改内存活跃槽)。 * * 约定:只做「一次性发送 + 读 ACK」,不造 IPC 订阅循环;SDK 本地活动表(meow_ui_notify.c) * 保留(app 进程内即时查询/配额自检),真正的通知中心数据在 launcher 中央存储,二者以 @@ -38,6 +39,10 @@ uint32_t meow_notify_ipc_send(const meow_notify *n, uint32_t replaces_id); * 静默(不崩、不回读 ACK)。 */ void meow_notify_ipc_dismiss(uint32_t nid); +/* 一次性发送 MSG_NOTIFY_PROGRESS 更新 launcher 侧已存在通知的进度(仅改内存活跃槽, + * 不落盘)。best-effort:写失败/无 socket 静默。 */ +void meow_notify_ipc_update_progress(uint32_t nid, int progress); + #ifdef __cplusplus } #endif diff --git a/patch_v2/sdk/meow_ui.h b/patch_v2/sdk/meow_ui.h index 298e379..3614006 100644 --- a/patch_v2/sdk/meow_ui.h +++ b/patch_v2/sdk/meow_ui.h @@ -297,12 +297,13 @@ typedef enum { } meow_notify_urgency; /* 发送负载(对齐 freedesktop Notify() 字段;SDK 内部复制副本,不持 app 外部指针, - * app 只需保证 title/body/target_activity 指针在调用返回前有效)。 */ + * app 只需保证 icon/title/body/target_activity 指针在调用返回前有效)。 */ typedef struct meow_notify { meow_notify_category cat; /* 类型(未声明则按 4 种上限自动注册) */ - meow_notify_urgency urgency; /* 紧急度 */ + meow_notify_urgency urgency; /* 紧急度(缺省 MEOW_NOTIFY_URG_NORMAL;越界钳位) */ const char *title; /* summary:标题,单行(必填,NULL 则发送失败) */ const char *body; /* body:正文,可多行(可 NULL) */ + const char *icon; /* app_icon:图标 icon name 或 path;NULL/空 = 用该 app 默认图标(launcher 按 app_id 回退) */ int timeout_ms; /* 见上超时语义;推荐 MEOW_NOTIFY_TIMEOUT_* */ const char *target_activity; /* 通知中心点击跳转的 Activity 名(可 NULL;M3 导航预留) */ int progress; /* 进度 0-100;-1=不显示进度条(缺省 -1) */ @@ -318,6 +319,11 @@ uint32_t meow_notify_send(const meow_notify *n); /* 取消一条通知。1=成功;0=未找到(id 无效/已过期/已取消)。 */ int meow_notify_cancel(uint32_t id); +/* 实时更新一条活动通知的进度(0-100,-1=清除进度条)。local_id=meow_notify_send 的返回值。 + * 语义(用户定案):仅改 SDK 内部活动槽 + 经 IPC 通知 launcher 改**内存活跃槽**;不落盘—— + * TF 快照只在「创建时 / 结束(100% 或 dismiss)」触发。返回 1=找到并更新;0=未找到/非法。 */ +int meow_notify_update_progress(uint32_t local_id, int progress); + /* 查询当前活动(未过期、未取消)通知数/是否还有。 */ int meow_notify_active_count(void); int meow_notify_count_in_type(meow_notify_category cat); diff --git a/patch_v2/sdk/meow_ui_gfx.c b/patch_v2/sdk/meow_ui_gfx.c index d6a9798..e7841af 100644 --- a/patch_v2/sdk/meow_ui_gfx.c +++ b/patch_v2/sdk/meow_ui_gfx.c @@ -67,8 +67,9 @@ static char *g_dump_path = NULL; * g_sbar_collapsed = 目标态(1=上收);g_sbar_collapse_h = 当前实际上收偏移 * (0..MUI_SBAR_H:0=完全展开,MUI_SBAR_H=内容全部上移出屏、仅留提示线)。 * 基座让 meow_ui_statusbar_set_collapsed(on) 立即生效(true→只画提示线/内容上移); - * 过渡(每帧插值)留待后续代理或经 meow_ui_statusbar_animate(ms) 启用的简易线性逼近。 */ -#define MUI_SBAR_HINT_H 6 /* 上收状态下顶部提示线高(px) */ + * 过渡(每帧插值)留待后续代理或经 meow_ui_statusbar_animate(ms) 启用的简易线性逼近。 + * 「收合=只留提示线」占高 = MUI_SBAR_COLLAPSE_H(=MEOW_SBAR_HOTZONE_FS=4,meow_ui_sys.h), + * 与 inset(meow_ui_statusbar_height())/顶部下滑热区/收合渲染同口径——replaced MUI_SBAR_HINT_H。 */ static int g_sbar_collapsed = 0; /* 目标:1=上收 */ static int g_sbar_collapse_h = 0; /* 当前上收偏移(0..MUI_SBAR_H) */ static int g_sbar_collapse_anim_ms = 0; /* 过渡时长(0=瞬切);meow_ui_statusbar_animate 设置 */ @@ -357,7 +358,8 @@ void meow_ui_swipe_hint(int x) if (!g_init_ok) return; const meow_theme *th = meow_theme_get(); /* 进度条画在状态栏下沿(z 在状态栏之下,不被全局状态栏覆盖)。 - * 有状态栏(非全屏)→ y = 状态栏高度;无状态栏(全屏/隐藏)→ y=0。 */ + * 有状态栏(非全屏)→ y = 状态栏高度;收合(collapsed)→ y=提示线下缘 + * (MUI_SBAR_COLLAPSE_H,与提示线不重叠);无状态栏(全屏/隐藏)→ y=0。 */ int hy = meow_ui_statusbar_height(); if (x > 0) { if (x > g_xres) x = g_xres; @@ -544,15 +546,16 @@ static int statusbar_collapse_in_transition(void) /* 上收状态栏:内容整体上移出屏(不画时钟/电量),仅在顶部画一条「提示线」。 * 与 meow_ui_swipe_hint(左滑返回进度条,5px,动态)不同:此线是「状态栏可下拉还原」的 - * 常驻提示(主题强调色下边缘)。原状态栏整块清回主题背景,避免残影(app inset 之内)。 */ + * 常驻提示(主题强调色下边缘)。收合只占/清「提示线」高度区域(MUI_SBAR_COLLAPSE_H=4), + * 不再清整 MUI_SBAR_H(28) 行 —— app 内容按 inset=提示线高可上移到提示线下缘,无 28px 空条。 */ static void statusbar_collapsed_render(int h) { (void)h; const meow_theme *th = meow_theme_get(); int w = meow_ui_width(); - /* h 越大内容越贴顶;基座:折叠态整块清底 + 顶部提示线(提示线下缘=主题 accent) */ - meow_ui_fill_rect(0, 0, w, MUI_SBAR_H, th->bg); - meow_ui_fill_rect(0, MUI_SBAR_HINT_H - 1, w, 1, th->accent); + /* h 越大内容越贴顶;基座:折叠态清「提示线」区域底 + 顶部提示线(提示线下缘=主题 accent) */ + meow_ui_fill_rect(0, 0, w, MUI_SBAR_COLLAPSE_H, th->bg); + meow_ui_fill_rect(0, MUI_SBAR_COLLAPSE_H - 1, w, 1, th->accent); } /* ---- 公共 API(基座实现;动画插值骨架见 statusbar_collapse_step)---- */ @@ -576,9 +579,10 @@ void meow_ui_statusbar_animate(int ms) int meow_ui_statusbar_hotzone(void) { /* 非全屏=整条状态栏可视;全屏时缩小到 MEOW_SBAR_HOTZONE_FS(保留一处下拉入口)。 - * 上收(collapsed、非全屏)时热区=提示线下缘高度。全屏态由 meow_ui_sys 维护。 */ + * 上收(collapsed、非全屏)时热区=提示线下缘高度(MUI_SBAR_COLLAPSE_H,与渲染/inset 同口径)。 + * 全屏态由 meow_ui_sys 维护。 */ if (meow_ui_sys_statusbar_active()) - return g_sbar_collapsed ? MUI_SBAR_HINT_H : MUI_SBAR_H; + return g_sbar_collapsed ? MUI_SBAR_COLLAPSE_H : MUI_SBAR_H; return MEOW_SBAR_HOTZONE_FS; } @@ -602,10 +606,12 @@ static void present(void) if (!g_refresh_always_max) { if (g_last_present_ms && now - g_last_present_ms < (unsigned long long)period) return; } - /* 全局状态栏(A-0)+ 上收(collapsed)基座:上屏前把状态栏画进 back_buf 顶部 MUI_SBAR_H 行。 - * 全屏/隐藏时 active()==0 不画(沉浸),app 内容可占满整屏。触发条件: - * 数据已变(1s 轻刷/显隐切换) / 顶条被 app 内容触及 / 上收动画未到位(逐帧推进)。 - * 展开态仍走 meow_ui_sys_statusbar_render()(meow_ui_sys.c 不改,留给后续代理); + /* 全局状态栏(A-0)+ 上收(collapsed)基座:上屏前把状态栏画进 back_buf 顶部行。 + * 展开态=整条(MUI_SBAR_H 行);收合态只占/清「提示线」区域(MUI_SBAR_COLLAPSE_H 行), + * app 内容(inset=提示线高)可上移到提示线下缘,无 28px 空条。全屏/隐藏时 active()==0 + * 不画(沉浸),app 内容可占满整屏。触发条件:数据已变(1s 轻刷/显隐切换) / + * 顶条被 app 内容触及 / 上收动画未到位(逐帧推进)。展开态仍走 + * meow_ui_sys_statusbar_render()(meow_ui_sys.c 不改,留给后续代理); * 上收折叠态(collapse_h>=MUI_SBAR_H)由基座只画提示线(内容上移出屏)。 */ if (meow_ui_sys_statusbar_active() && (meow_ui_sys_statusbar_force() || statusbar_touched() || diff --git a/patch_v2/sdk/meow_ui_input.c b/patch_v2/sdk/meow_ui_input.c index 7a155d2..8c7d0b9 100644 --- a/patch_v2/sdk/meow_ui_input.c +++ b/patch_v2/sdk/meow_ui_input.c @@ -317,8 +317,12 @@ void meow_ui_run(const meow_ui_events *ev) if (in_startup) continue; /* 启动窗口进度条静音 */ int x0 = e.a, xc = e.b, dx = xc - x0; /* dx=当前X-按下X */ /* SDK 自动画顶部条:长度=手指当前 X(=距左缘距离,向内划长度随位移增长)。 - * 全屏/沉浸不画系统条(无返回手势);APP 若注册 on_swipe_progress 仍可自绘。 */ - if (meow_ui_sys_statusbar_active()) meow_ui_swipe_hint(xc); + * M2.5x/A-13:全屏/收合下「左缘返回手势保留」,顶部动态提示条(meow_ui_swipe_hint) + * 仍需绘制——不再以 meow_ui_sys_statusbar_active()(全屏/隐藏=0)开关,否则全屏 + * 时滑条完全不显示。条位 y=meow_ui_statusbar_height():非全屏=状态栏下沿、 + * 全屏=0、收合=提示线下缘(MUI_SBAR_COLLAPSE_H),与提示线不重叠加。 + * APP 若注册 on_swipe_progress 仍可自绘(系统条照常画)。 */ + meow_ui_swipe_hint(xc); if (g_events_set && g_events.on_swipe_progress) g_events.on_swipe_progress(x0, dx); meow_ui_flush_region(0, meow_ui_statusbar_height(), meow_ui_width(), 6); diff --git a/patch_v2/sdk/meow_ui_notify.c b/patch_v2/sdk/meow_ui_notify.c index dbad728..489ab52 100644 --- a/patch_v2/sdk/meow_ui_notify.c +++ b/patch_v2/sdk/meow_ui_notify.c @@ -35,7 +35,10 @@ /* ---- 内部活动表尺寸(配额见 meow_ui.h) ---- */ #define MEOW_NOTIFY_MAX_ACTIVE (MEOW_NOTIFY_MAX_TYPES * MEOW_NOTIFY_MAX_PER_TYPE) -/* 活动通知槽(内部;标题/正文等复制副本,不持 app 外部指针,避免栈字符串悬垂) */ +/* 活动槽内 icon 缓冲上限(与 IPC app_icon[48] 一致;SDK 复制副本,不持 app 外部指针) */ +#define MEOW_SLOT_ICON_MAX 48 + +/* 活动通知槽(内部;标题/正文/图标等复制副本,不持 app 外部指针,避免栈字符串悬垂) */ typedef struct { uint32_t id; /* 本地唯一 id(app 侧句柄);0=空闲槽 */ uint32_t ipc_id; /* launcher 中央存储分配的通知 id(nid);0=未同步/降级 */ @@ -47,6 +50,7 @@ typedef struct { char title[64]; char body[128]; char target_activity[32]; + char icon[MEOW_SLOT_ICON_MAX]; /* 图标 name/path;空=用 app 默认图标(launcher 回退) */ int progress; /* 0-100;-1=无进度条 */ } notify_slot_t; @@ -111,6 +115,7 @@ static void notify_fill(notify_slot_t *s, const meow_notify *n, uint32_t id, uin snprintf(s->body, sizeof s->body, "%s", n->body ? n->body : ""); snprintf(s->target_activity, sizeof s->target_activity, "%s", n->target_activity ? n->target_activity : ""); + snprintf(s->icon, sizeof s->icon, "%s", n->icon ? n->icon : ""); s->progress = (n->progress < -1) ? -1 : (n->progress > 100 ? 100 : n->progress); } @@ -253,6 +258,28 @@ int meow_notify_cancel(uint32_t id) return rc; } +int meow_notify_update_progress(uint32_t local_id, int progress) +{ + int p, i, found = 0; + uint32_t ipc_id = 0; + if (local_id == 0) return 0; + p = (progress < -1) ? -1 : (progress > 100 ? 100 : progress); /* 钳位 [-1,100] */ + pthread_mutex_lock(&g_mu); + notify_purge_expired(); + for (i = 0; i < MEOW_NOTIFY_MAX_ACTIVE; i++) { + if (g_slots[i].active && g_slots[i].id == local_id) { + g_slots[i].progress = p; /* 实时:仅改内存活动槽,不落盘 */ + ipc_id = g_slots[i].ipc_id; /* launcher 侧 nid;0=未同步/降级 */ + found = 1; + break; + } + } + pthread_mutex_unlock(&g_mu); + /* 落点(best-effort):经 IPC 通知 launcher 改其内存活跃槽;无 launcher/未同步则静默。 */ + if (found && ipc_id) meow_notify_ipc_update_progress(ipc_id, p); + return found; +} + int meow_notify_active_count(void) { int i, n = 0; diff --git a/patch_v2/sdk/test_notify_integration.c b/patch_v2/sdk/test_notify_integration.c index 6ea53d9..2f50f0a 100644 --- a/patch_v2/sdk/test_notify_integration.c +++ b/patch_v2/sdk/test_notify_integration.c @@ -41,7 +41,7 @@ uint64_t meow_ui_time_ms(void) /* ---- stub server 捕获(每次连接一帧) ---- */ #define MAXCAP 16 -typedef struct { int type; m_notify_t n; uint32_t dismiss_id; uint32_t nid; } srec_t; +typedef struct { int type; m_notify_t n; m_notify_progress_t prog; uint32_t dismiss_id; uint32_t nid; } srec_t; static srec_t g_rec[MAXCAP]; static int g_nrec = 0; static int g_stop = 0; @@ -77,6 +77,7 @@ static void *server(void *arg) memset(&g_rec[idx], 0, sizeof g_rec[idx]); g_rec[idx].type = (int)type; if (type == MSG_NOTIFY && len >= sizeof(m_notify_t)) memcpy(&g_rec[idx].n, pay, sizeof(m_notify_t)); + if (type == MSG_NOTIFY_PROGRESS && len >= sizeof(m_notify_progress_t)) memcpy(&g_rec[idx].prog, pay, sizeof(m_notify_progress_t)); if (type == MSG_NOTIFY_DISMISS && len >= 4) memcpy(&g_rec[idx].dismiss_id, pay, 4); /* 分配 nid = 100 + NOTIFY 序号 */ uint32_t seq = 0; @@ -85,7 +86,7 @@ static void *server(void *arg) uint32_t ack_nid = g_rec[idx].nid; pthread_mutex_unlock(&g_mu); - if (type == MSG_NOTIFY || type == MSG_NOTIFY_DISMISS) { + if (type == MSG_NOTIFY || type == MSG_NOTIFY_DISMISS || type == MSG_NOTIFY_PROGRESS) { m_ack_t a; memset(&a, 0, sizeof a); a.code = MEOW_OK; a.status = ack_nid; uint8_t rhdr[MEOW_IPC_HDR_LEN]; uint32_t mag = MEOW_IPC_MAGIC; uint16_t ver = MEOW_IPC_VERSION, t = (uint16_t) @@ -140,11 +141,13 @@ int main(void) /* S1 通用通知 */ meow_notify nt; memset(&nt, 0, sizeof nt); nt.cat = MEOW_NOTIFY_CAT_GENERAL; nt.urgency = MEOW_NOTIFY_URG_NORMAL; - nt.title = "t1"; nt.timeout_ms = 0; + nt.title = "t1"; nt.timeout_ms = 0; nt.icon = "os.meow.hello/icon.png"; uint32_t id1 = meow_notify_send(&nt); check("S1 send 返回本地 id=1", id1 == 1); check("S1 active_count=1", meow_notify_active_count() == 1); check("S1 stub 回 nid=101", rec_at(0).nid == 101); + check("S1 映射 urgency=NORMAL(1)", rec_at(0).n.urgency == MEOW_NOTIFY_URG_NORMAL); + check("S1 映射 icon→app_icon", !strcmp(rec_at(0).n.app_icon, "os.meow.hello/icon.png")); /* S2 媒体通知:单例 + media=1 */ memset(&nt, 0, sizeof nt); @@ -182,6 +185,25 @@ int main(void) 触发丢最旧的是 S5 循环第 4 次 send = 第 7 条 NOTIFY(rec[7]),其 replaces_id==103。 */ check("S5 丢最旧后 send replaces_id=被丢nid(103)", rec_at(7).n.replaces_id == 103); + /* S5b update_progress:新发一条 progress → 本地 id → update → stub 捕获 MSG_NOTIFY_PROGRESS */ + memset(&nt, 0, sizeof nt); + nt.cat = MEOW_NOTIFY_CAT_PROGRESS; nt.title = "prog"; nt.timeout_ms = 0; + nt.progress = 10; + uint32_t idp = meow_notify_send(&nt); + int ni = -1; + for (int i = 0; i < MAXCAP; i++) { + srec_t r = rec_at(i); + if (r.type == MSG_NOTIFY && !strcmp(r.n.summary, "prog")) { ni = i; break; } + } + check("S5b 找到 prog 通知帧", ni >= 0); + int rc_up = meow_notify_update_progress(idp, 70); + check("S5b update_progress 返回 1", rc_up == 1); + srec_t pr = rec_at(ni + 1); + check("S5b stub 捕获 MSG_NOTIFY_PROGRESS 帧", pr.type == MSG_NOTIFY_PROGRESS); + check("S5b progress nid=该通知 launcher nid", ni >= 0 && pr.prog.nid == rec_at(ni).nid); + check("S5b progress 载=70", pr.prog.progress == 70); + check("S5b update_progress(未知 id) 返回 0", meow_notify_update_progress(0xFFFFFF, 50) == 0); + stop_server(); pthread_join(th, NULL); diff --git a/patch_v2/sdk/test_notify_ipc.c b/patch_v2/sdk/test_notify_ipc.c index f1ba227..c7f5dc3 100644 --- a/patch_v2/sdk/test_notify_ipc.c +++ b/patch_v2/sdk/test_notify_ipc.c @@ -30,6 +30,7 @@ typedef struct { uint32_t type; /* 收到的帧类型 */ m_notify_t n; /* MSG_NOTIFY 负载 */ + m_notify_progress_t prog; /* MSG_NOTIFY_PROGRESS 负载 */ uint32_t dismiss_id; /* MSG_NOTIFY_DISMISS 负载 */ uint32_t req_id; uint32_t nid_to_return; /* ACK 中回填的 status */ @@ -47,6 +48,7 @@ static void cap_store(uint32_t type, uint32_t req_id, const uint8_t *pay, uint32 g_cap.req_id = req_id; g_cap.nid_to_return = nid_to_return; if (type == MSG_NOTIFY && len >= sizeof(m_notify_t)) memcpy(&g_cap.n, pay, sizeof(m_notify_t)); + if (type == MSG_NOTIFY_PROGRESS && len >= sizeof(m_notify_progress_t)) memcpy(&g_cap.prog, pay, sizeof(m_notify_progress_t)); if (type == MSG_NOTIFY_DISMISS && len >= 4) memcpy(&g_cap.dismiss_id, pay, 4); g_cap.got = 1; pthread_mutex_unlock(&g_cap_mu); @@ -87,7 +89,7 @@ static void *server_thread(void *arg) /* MSG_NOTIFY → 回 m_ack_t(code=OK, status=nid_to_return); * MSG_NOTIFY_DISMISS → 回 m_ack_t(code=OK, status=0,同 launcher 行为)。 */ - if (type == MSG_NOTIFY || type == MSG_NOTIFY_DISMISS) { + if (type == MSG_NOTIFY || type == MSG_NOTIFY_DISMISS || type == MSG_NOTIFY_PROGRESS) { m_ack_t a; memset(&a, 0, sizeof a); a.code = MEOW_OK; @@ -152,9 +154,10 @@ int main(void) meow_notify nt; memset(&nt, 0, sizeof nt); nt.cat = MEOW_NOTIFY_CAT_PROGRESS; - nt.urgency = MEOW_NOTIFY_URG_NORMAL; + nt.urgency = MEOW_NOTIFY_URG_HIGH; nt.title = "下载中"; nt.body = "70%"; + nt.icon = "os.meow.hello/icon.png"; nt.timeout_ms = 5000; /* >0 → expire=5000, ongoing=0 */ nt.progress = 150; /* 钳位 → 100 */ uint32_t nid = meow_notify_ipc_send(&nt, 0); @@ -175,6 +178,8 @@ int main(void) check("T2 replaces_id 透传=0", cn->replaces_id == 0); check("T1 app_id=testapp", !strcmp(cn->app_id, "testapp")); check("T1 summary=下载中", !strcmp(cn->summary, "下载中")); + check("T1 urgency(HIGH)→wire urgency=2", cn->urgency == MEOW_NOTIFY_URG_HIGH); + check("T1 icon→app_icon", !strcmp(cn->app_icon, "os.meow.hello/icon.png")); } /* ---------- T1/T2:媒体类型 + ONGOING(-1) ---------- */ @@ -275,6 +280,21 @@ int main(void) check("T5 dismiss 负载=nid=0xABCD", g_cap.dismiss_id == 0xABCDu); } + /* ---------- T6:update_progress 发 MSG_NOTIFY_PROGRESS(nid + progress 钳位)---------- */ + { + char sock[108]; + g_listen_fd = arb_listen(sock, sizeof sock); + setenv("MEOW_IPC_SOCK", sock, 1); + pthread_t th; + pthread_create(&th, NULL, server_thread, NULL); + meow_notify_ipc_update_progress(0x1234, 250); /* 钳位 250→100 */ + pthread_join(th, NULL); + close(g_listen_fd); + check("T6 stub 收到 MSG_NOTIFY_PROGRESS 帧", g_cap.got && g_cap.type == MSG_NOTIFY_PROGRESS); + check("T6 progress 负载 nid=0x1234", g_cap.prog.nid == 0x1234); + check("T6 progress 钳位 250→100", g_cap.prog.progress == 100); + } + printf("\n%s (%d failure%s)\n", failures ? "RESULT: FAIL" : "RESULT: PASS", failures, failures == 1 ? "" : "s"); return failures ? 1 : 0; diff --git a/patch_v2/sdk/test_notify_post.c b/patch_v2/sdk/test_notify_post.c index beac070..b3d0440 100644 --- a/patch_v2/sdk/test_notify_post.c +++ b/patch_v2/sdk/test_notify_post.c @@ -49,6 +49,7 @@ static void launcher_map(const m_notify_t *mn, meow_notif_t *n) snprintf(n->target_activity, sizeof n->target_activity, "%s", mn->target_activity); n->expire_timeout = mn->expire_timeout; n->progress = mn->progress; + n->urgency = mn->urgency; /* 0-3;旧调用=0 → LOW(静默) */ n->ongoing = mn->ongoing; n->media = mn->media; } @@ -59,6 +60,15 @@ static void launcher_map(const m_notify_t *mn, meow_notif_t *n) static int g_listen_fd = -1; static int g_stop = 0; static uint32_t g_posted_nid = 0; +static meow_notif_t g_stored; /* 回读 launcher 存储的最近一条通知(store_cb) */ +static int g_store_called = 0; + +static int store_cb(const meow_notif_t *n, void *ctx) +{ + (void)ctx; + if (n) { g_stored = *n; g_store_called = 1; } + return 1; /* 只取第一条 */ +} static void reply_ack(int c, uint16_t type, uint32_t req_id, uint32_t status) { @@ -130,13 +140,21 @@ int main(void) /* SDK send → launcher 真存储。media + ONGOING 走全部映射分支。 */ meow_notify nt; memset(&nt, 0, sizeof nt); - nt.cat = MEOW_NOTIFY_CAT_MEDIA; nt.urgency = MEOW_NOTIFY_URG_NORMAL; + nt.cat = MEOW_NOTIFY_CAT_MEDIA; nt.urgency = MEOW_NOTIFY_URG_HIGH; nt.title = "正在播放"; nt.timeout_ms = -1; nt.progress = 40; + nt.icon = "os.meow.hello/icon.png"; uint32_t nid = meow_notify_ipc_send(&nt, 0); check("send 经 launcher 真存储回 nid>0", nid != 0); check("send 拿到 launcher 分配的 nid(与 post 一致)", g_posted_nid == nid); check("launcher 存储 count(media app)=1", meow_notif_count("intgapp") == 1); + /* 回读 launcher 存储,验证 urgency/icon/progress 全链路落库 */ + g_store_called = 0; memset(&g_stored, 0, sizeof g_stored); + meow_notif_list(NULL, store_cb, NULL); + check("post 存储 urgency=HIGH(2)", g_store_called && g_stored.urgency == MEOW_NOTIFY_URG_HIGH); + check("post 存储 icon→app_icon", g_stored.app_icon[0] && !strcmp(g_stored.app_icon, "os.meow.hello/icon.png")); + check("post 存储 progress=40", g_stored.progress == 40); + /* SDK dismiss → launcher 撤下 */ meow_notify_ipc_dismiss(nid); check("dismiss 后 launcher 存储 count=0", meow_notif_count("intgapp") == 0);