From 67394bf6233bd177de323fe8a9ac618f017bed99 Mon Sep 17 00:00:00 2001 From: yoimiya-kokomi <592981798@qq.com> Date: Tue, 28 Jun 2022 04:46:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`#=E6=B7=BB=E5=8A=A0=E5=88=BB?= =?UTF-8?q?=E6=99=B4=E5=9B=BE=E5=83=8F`=E5=91=BD=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E6=84=9F=E8=B0=A2=20**@=E5=8F=B6**=20*=20=E5=8F=AF=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=91=BD=E4=BB=A4=E4=B8=8A=E4=BC=A0=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E8=A7=92=E8=89=B2=E5=9B=BE=E7=89=87=EF=BC=8C?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=87=B3=20**resources/character-img/?= =?UTF-8?q?=E5=88=BB=E6=99=B4/upload**=20*=20=E8=AF=B7=E5=B0=86=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E4=B8=8E=E5=91=BD=E4=BB=A4=E4=B8=80=E5=90=8C=E5=8F=91?= =?UTF-8?q?=E9=80=81=EF=BC=8C=E5=90=8E=E7=BB=AD=E4=BC=9A=E6=94=AF=E6=8C=81?= =?UTF-8?q?at=E5=9B=BE=E5=83=8F=E5=8F=8A=E5=91=BD=E4=BB=A4=E5=90=8E?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=9B=BE=E5=83=8F=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=9A=84=E9=A1=B5=E9=9D=A2=E6=96=87=E6=A1=88?= =?UTF-8?q?=E5=8F=8A=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + CHANGELOG.md | 8 +- apps/character.js | 3 + .../character-img-upload.js} | 76 +++++++++++------- apps/character/profile-artis.js | 18 ++++- apps/character/profile-common.js | 38 ++++++++- apps/wiki.js | 2 +- components/Profile.js | 3 + components/models/Character.js | 1 + components/profile-data/enka.js | 15 ++-- components/profile-data/miao.js | 10 ++- index.js | 25 +++--- resources/character/artis-mark.html | 26 +++--- resources/character/detail.html | 9 ++- resources/common/bg/bg-dendro.jpg | Bin 0 -> 206752 bytes resources/common/bg/talent-dendro.png | Bin 0 -> 41393 bytes resources/common/common.css | 7 ++ resources/common/common.less | 2 +- .../meta/reliquaries/reliquaries-mark-new.js | 8 +- resources/stat/abyss-pct.html | 13 ++- resources/stat/character.html | 2 +- 21 files changed, 183 insertions(+), 84 deletions(-) rename apps/{uploadCharacterImage.js => character/character-img-upload.js} (57%) create mode 100644 resources/common/bg/bg-dendro.jpg create mode 100644 resources/common/bg/talent-dendro.png diff --git a/.gitignore b/.gitignore index 14a43878..de7c53ad 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /components/setting.json /config.js *.css.map +/resources/character-img/*/upload/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c87e60d..7de14427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 1.8.1 + +* 增加`#添加刻晴图像`命令,感谢 **@叶** + * 可通过命令上传添加指定角色图片,上传至 **resources/character-img/刻晴/upload** + * 请将图像与命令一同发送,后续会支持at图像及命令后发送图像 +* 部分功能的页面文案及功能优化 + # 1.8.0 * `#角色面板`、`#圣遗物列表` 使用新的圣遗物评分逻辑计算评分 @@ -22,7 +29,6 @@ * 角色图像增加小清新开关,默认关闭 * 对增量包内的角色图像进行分级,较为清凉的图像独立管理 * 勇士们可使用 `#喵喵设置小清新开启` 启用 - * 自行添加请到 **resources/character-img/** 的对应角色目录下添加 * 伤害计算增加扩散、感电的计算逻辑,感谢 **@49631073**的逻辑梳理 * `#角色面板` 伤害计算增加部分角色,目前支持 * 长柄武器:雷神、胡桃、魈、钟离、香菱 diff --git a/apps/character.js b/apps/character.js index 3aa83a83..e3e737ff 100644 --- a/apps/character.js +++ b/apps/character.js @@ -8,6 +8,9 @@ import { renderProfile } from "./character/profile-detail.js"; export { enemyLv, getOriginalPicture } from "./character/utils.js"; +// 角色图像上传 +export { uploadCharacterImg } from "./character/character-img-upload.js"; + // export { getProfileAll, getProfile, profileHelp }; diff --git a/apps/uploadCharacterImage.js b/apps/character/character-img-upload.js similarity index 57% rename from apps/uploadCharacterImage.js rename to apps/character/character-img-upload.js index ddef57ab..9ef2c5bb 100644 --- a/apps/uploadCharacterImage.js +++ b/apps/character/character-img-upload.js @@ -1,15 +1,16 @@ -import { segment } from "oicq"; -import fetch from "node-fetch"; import fs from "fs"; -import Data from "../components/Data.js"; -import { Character } from "../components/models.js"; -import lodash from "lodash"; import { promisify } from "util"; import { pipeline } from "stream"; +import { segment } from "oicq"; +import MD5 from "md5"; +import fetch from "node-fetch"; +import lodash from "lodash"; +import Data from "../../components/Data.js"; +import { Character } from "../../components/models.js"; -const rootPath = process.cwd() + "/plugins/miao-plugin/"; -let regex = /^#*喵喵(上传|添加)(.+)写真.*$/; +const _res_path = process.cwd() + "/plugins/miao-plugin/resources/"; +let regex = /^#?\s*(?:喵喵)?(?:上传|添加)(.+)(?:照片|写真|图片|图像)\s*$/; export const rule = { uploadCharacterImage: { @@ -19,47 +20,48 @@ export const rule = { }, }; -export async function uploadCharacterImage(e) { +export async function uploadCharacterImg(e) { let promise = await isAllowedToUploadCharacterImage(e); if (!promise) { - return true; + return; } let imageMessages = []; let msg = e.msg; - let regexResult = regex.exec(msg); + let regRet = regex.exec(msg); //通过解析正则获取消息中的角色名 - let characterName = regexResult[2]; - //将消息中的角色名转换为官方名称 - let officialName = Character.get(characterName).name; - if (officialName === undefined) { - e.reply("未查询到该角色。请输入有效的角色名或别名。"); - return true; + if (!regRet || !regRet[1]) { + return; } - console.log("本次要上传的角色是: ", officialName); + let char = Character.get(regRet[1]); + if (!char || !char.name) { + return; + } + let name = char.name; for (let val of e.message) { if ("image" === val.type) { imageMessages.push(val); } } if (imageMessages.length <= 0) { - e.reply("消息中未找到图片,无法添加。"); + // TODO 支持at图片添加,以及支持后发送 + e.reply("消息中未找到图片,请将要发送的图片与消息一同发送.."); return true; } - await saveImages(e, officialName, imageMessages); + await saveImages(e, name, imageMessages); return true; } -async function saveImages(e, officialName, imageMessages) { +async function saveImages(e, name, imageMessages) { let imgMaxSize = e.groupConfig.imgMaxSize || 1; - let pathSuffix = "resources/miao-res-plus/character-img/" + officialName; - let path = rootPath + pathSuffix; + let pathSuffix = `character-img/${name}/upload`; + let path = _res_path + pathSuffix; if (!fs.existsSync(path)) { - console.log("路径不存在,创建目录: ", path); - Data.createDir(rootPath, pathSuffix); + Data.createDir(_res_path, pathSuffix); } let senderName = lodash.truncate(e.sender.card, { length: 8 }); + let imgCount = 0; for (let val of imageMessages) { const response = await fetch(val.url); if (!response.ok) { @@ -75,12 +77,27 @@ async function saveImages(e, officialName, imageMessages) { if (response.headers.get("content-type") === "image/gif") { fileType = "gif"; } - + let imgPath = `${path}/${fileName}.${fileType}`; const streamPipeline = promisify(pipeline); - await streamPipeline(response.body, fs.createWriteStream(`${path}/${fileName}.${fileType}`)); + await streamPipeline(response.body, fs.createWriteStream(imgPath)); + + // 使用md5作为文件名 + let buffers = fs.readFileSync(imgPath); + let base64 = new Buffer.from(buffers, 'base64').toString(); + let md5 = MD5(base64); + let newImgPath = `${path}/${md5}.${fileType}` + if (fs.existsSync(newImgPath)) { + fs.unlink(newImgPath, (err) => { + console.log('unlink', err); + }); + } + fs.rename(imgPath, newImgPath, (err) => { + console.log('rename', err); + }) + imgCount++; Bot.logger.mark(`添加成功: ${path}/${fileName}`); } - e.reply([segment.at(e.user_id, senderName), `\n添加${officialName}信息成功。`]); + e.reply([segment.at(e.user_id, senderName), `\n成功添加${imgCount}张${name}图片。`]); return true; } @@ -91,6 +108,11 @@ async function isAllowedToUploadCharacterImage(e) { if (!e.msg) { return false; } + if (!e.isMaster) { + return false; + } + + // 由于添加角色图是全局,暂时屏蔽非管理员的添加 if (e.isPrivate) { if (!e.isMaster) { e.reply(`只有主人才能添加。`); diff --git a/apps/character/profile-artis.js b/apps/character/profile-artis.js index 77422849..ab0991d6 100644 --- a/apps/character/profile-artis.js +++ b/apps/character/profile-artis.js @@ -4,7 +4,7 @@ * */ import lodash from "lodash"; import { Profile, Common, Models, Format } from "../../components/index.js"; -import { getTargetUid, profileHelp } from "./profile-common.js"; +import { autoRefresh, getTargetUid, profileHelp, autoGetProfile } from "./profile-common.js"; import { Character, Artifact } from "../../components/models.js"; /* @@ -13,11 +13,22 @@ import { Character, Artifact } from "../../components/models.js"; export async function profileArtis(e, { render }) { let { uid, avatar } = e; - let profile = await Profile.get(uid, avatar); - let char = Character.get(profile.name); + let { profile, char, err } = await autoGetProfile(e, uid, avatar, async () => { + await profileArtis(e, { render }); + }); + + if (err) { + return; + } let charCfg = Artifact.getCharCfg(profile.name); let { artis, totalMark, totalMarkClass, usefulMark } = getArtis(profile.name, profile.artis); + + if (!profile.artis || profile.artis.length === 0) { + e.reply("未能获得圣遗物详情,请重新获取面板信息后查看") + return true; + } + let { attrMap } = Artifact.getMeta(); //渲染图像 @@ -52,7 +63,6 @@ export async function profileArtisList(e, { render }) { return true; } - lodash.forEach(profiles || [], (ds) => { let name = ds.name; if (!name || name === "空" || name === "荧") { diff --git a/apps/character/profile-common.js b/apps/character/profile-common.js index 192ea42d..94f6d090 100644 --- a/apps/character/profile-common.js +++ b/apps/character/profile-common.js @@ -95,7 +95,7 @@ export async function autoRefresh(e) { } if (!data.chars) { - e.reply("请确认角色已在【游戏内】橱窗展示并开放了查看详情。设置完毕后请5分钟后使用 #面板更新 重新获取"); + e.reply("请确认角色已在【游戏内】橱窗展示并开放了查看详情。请在设置完毕5分钟后使用 #面板更新 重新获取"); return false; } else { let ret = []; @@ -106,7 +106,7 @@ export async function autoRefresh(e) { } }) if (ret.length === 0) { - e.reply("请确认角色已在【游戏内】橱窗展示并开放了查看详情。设置完毕后请5分钟后使用 #面板更新 重新获取") + e.reply("请确认角色已在【游戏内】橱窗展示并开放了查看详情。请在设置完毕5分钟后使用 #面板更新 重新获取") return false; } else { // e.reply(`本次获取成功角色: ${ret.join(", ")} `) @@ -116,6 +116,40 @@ export async function autoRefresh(e) { return true; } +export async function autoGetProfile(e, uid, avatar, callback) { + + let refresh = async () => { + let refreshRet = await autoRefresh(e); + if (refreshRet) { + await callback(); + } + return refreshRet; + } + + let char = Character.get(avatar); + if (!char) { + return { err: true }; + } + + let profile = await Profile.get(uid, char.id); + if (!profile) { + if (await refresh()) { + return { err: true }; + } else { + e.reply(`请确认${char.name}已展示在【游戏内】的角色展柜中,并打开了“显示角色详情”。然后请使用 #更新面板\n命令来获取${char.name}的面板详情`); + } + return { err: true }; + } else if (!['enka', 'input2', 'miao', 'miao-pre'].includes(profile.dataSource)) { + if (!await refresh()) { + e.reply(`由于数据格式升级,请重新获取面板信息后查看`); + } + return { err: true }; + } + + return { profile, char, refresh } + +} + /* * 面板数据更新 * */ diff --git a/apps/wiki.js b/apps/wiki.js index b48940ca..b29b4dd8 100644 --- a/apps/wiki.js +++ b/apps/wiki.js @@ -19,7 +19,7 @@ export async function wiki(e, { render }) { return false; } - let reg = /#?(.+)(命座|命之座|天赋|技能|资料|照片|写真|图片|插画)$/, msg = e.msg; + let reg = /#?(.+)(命座|命之座|天赋|技能|资料|照片|写真|图片|图像)$/, msg = e.msg; let ret = reg.exec(msg); if (!ret || !ret[1] || !ret[2]) { diff --git a/components/Profile.js b/components/Profile.js index 0119a20a..cb98f01d 100644 --- a/components/Profile.js +++ b/components/Profile.js @@ -28,6 +28,9 @@ function sleep(ms) { } function getServ(uid) { + if (config.profileApi) { + return config.profileApi({ Enka, Miao }) + } if ((uid + '')[0] === '5') { return Miao; } diff --git a/components/models/Character.js b/components/models/Character.js index e55fd906..228868b0 100644 --- a/components/models/Character.js +++ b/components/models/Character.js @@ -54,6 +54,7 @@ class Character extends Base { }); } addImg(`character-img/${name}`); + addImg(`character-img/${name}/upload`); addImg(`character-img/${name}/se`, !se) const plusPath = `./plugins/miao-plugin/resources/miao-res-plus/`; diff --git a/components/profile-data/enka.js b/components/profile-data/enka.js index fd923fd3..ab3e31a6 100644 --- a/components/profile-data/enka.js +++ b/components/profile-data/enka.js @@ -4,26 +4,21 @@ import Data from "./enka-data.js"; let Enka = { key: "enka", cd: 5, - async request({ e, uid, config }) { - let profileApi = config.profileApi || function (uid) { + async request({ e, uid, avatar, config }) { + let profileApi = config.enkaApi || function ({ uid }) { return `https://enka.shinshin.moe/u/${uid}/__data.json` }; - let api = profileApi(uid); + let api = profileApi({ uid, avatar }); let req = await fetch(api); let data = await req.json(); if (!data.playerInfo) { - if ((uid + '')[0] === '5') { - e.reply(`请求失败:暂时不支持B服角色面板更新,请等待服务后续升级`); - } else { - e.reply(`请求失败:${data.msg || "请求错误,请稍后重试"}`); - } + e.reply(`请求失败:${data.msg || "可能是面板服务并发过高,请稍后重试"}`); return false; } - let details = data.avatarInfoList; if (!details || details.length === 0 || !details[0].propMap) { - e.reply(`请打开角色展柜的显示详情`); + e.reply(`请打开游戏内角色展柜的“显示详情”后,等待5分钟重新获取面板`); return false; } return Data.getData(uid, data); diff --git a/components/profile-data/miao.js b/components/profile-data/miao.js index 2219e75e..f3af90c4 100644 --- a/components/profile-data/miao.js +++ b/components/profile-data/miao.js @@ -10,10 +10,12 @@ const url = "http://49.232.91.210/profile"; let Miao = { key: "miao", cd: 1, - async request({ e, uid, avatar = '' }) { - let api = `${url}/list?uid=${uid}`; + async request({ e, uid, avatar = '', config }) { + let profileApi = config.miaoApi && lodash.isFunction(config.miaoApi) ? config.miaoApi : function ({ uid }) { + return `http://49.232.91.210/profile/list?uid=${uid}` + }; + let api = profileApi({ uid, avatar }); let data; - let req = await fetch(api); data = await req.json(); if (data.status !== 0) { @@ -21,7 +23,7 @@ let Miao = { return false; } if (!data.uidListData || data.uidListData.length === 0) { - e.reply(`请打开角色展柜的显示详情`); + e.reply(`请打开游戏内角色展柜的“显示详情”后,等待5分钟重新获取面板`); return false; } diff --git a/index.js b/index.js index 3574fbb8..145e338a 100644 --- a/index.js +++ b/index.js @@ -6,8 +6,10 @@ export { profileArtisList, getProfileAll, profileHelp, - getOriginalPicture + getOriginalPicture, + uploadCharacterImg } from "./apps/character.js"; + import { wifeReg } from "./apps/character.js"; import { consStat, abyssPct, abyssTeam } from "./apps/stat.js"; @@ -17,9 +19,7 @@ import lodash from "lodash"; import common from "../../lib/common.js"; import { rule as adminRule, updateRes, sysCfg, updateMiaoPlugin, profileCfg } from "./apps/admin.js"; import { currentVersion } from "./components/Changelog.js"; -import { - uploadCharacterImage -} from "./apps/uploadCharacterImage.js"; + export { consStat, @@ -32,8 +32,7 @@ export { help, versionInfo, calendar, - profileCfg, - uploadCharacterImage + profileCfg }; @@ -43,6 +42,10 @@ let rule = { //reg: "noCheck", describe: "【#角色】角色详情", }, + uploadCharacterImg: { + reg: "^#*(喵喵)?(上传|添加)(.+)(照片|写真|图片|图像)\\s*$", + describe: "喵喵上传角色写真", + }, profileArtisList: { reg: "^#圣遗物列表\\s*(\\d{9})?$", describe: "【#角色】圣遗物列表", @@ -63,10 +66,6 @@ let rule = { reg: "^#?(获取|给我|我要|求|发|发下|发个|发一下)?原图(吧|呗)?$", describe: "【#原图】 回复角色卡片,可获取原图", }, - uploadCharacterImage: { - reg: "^#*喵喵(上传|添加)(.+)写真.*$", - describe: "喵喵上传角色写真", - }, consStat: { reg: "^#(喵喵)?角色(持有|持有率|命座|命之座|.命)(分布|统计|持有|持有率)?$", describe: "【#统计】 #角色持有率 #角色5命统计", @@ -80,7 +79,7 @@ let rule = { describe: "【#角色】 #深渊组队", }, wiki: { - reg: "^(#|喵喵)?.*(天赋|技能|命座|命之座|资料|照片|写真|图片|插画)$", + reg: "^(#|喵喵)?.*(天赋|技能|命座|命之座|资料|照片|写真|图片|图像)$", describe: "【#资料】 #神里天赋 #夜兰命座", }, help: { @@ -96,11 +95,11 @@ let rule = { describe: "【#角色】 设置伤害计算中目标敌人的等级", }, versionInfo: { - reg: "^#喵喵版本$", + reg: "^#?喵喵版本$", describe: "【#帮助】 喵喵版本介绍", }, calendar: { - reg: "^#喵喵(日历|活动|日历列表)$", + reg: "^#?喵喵(日历|活动|日历列表)$", describe: "【#日历】 活动日历", }, ...adminRule diff --git a/resources/character/artis-mark.html b/resources/character/artis-mark.html index 4453e367..efbe1f64 100644 --- a/resources/character/artis-mark.html +++ b/resources/character/artis-mark.html @@ -107,7 +107,7 @@
g&B|BXPetVxfa|$xKDu^$G8kkj kJ?fs&H^2RYjBUs zP@>*60+h4n$d);o15j(IJTGtGFm}ttL}#d$@1$3G6{KEm@nAKk@x}|g?IvED8CA)) z+~)3awX>4bH@T|>Z-v-Vb?tbRN-)N1+}%n>Rxu(0eeZ{~sg5tB+M`iYq$#Tnr^P$^ z`wL`6do9F(|K4cc?^L=dZOB3)lf8zt2%@*t#$SmtiEdx2*U)*jgO!lO=NzNylQRpj ziNy^3#oFKB^h{6V=r9w8!K(HZuRL>PPn+?UcbP8hj&nZM41RG?WDp78eG7?Zb*t+4 zOP1qKT!p0Y$HYx5gQ8Ynn40Xtu1f*XOjoKV%b4 Jv&!`ozwSLzovk0Q>-552 z4IEonGByU a zHnT56lHbn4h6S)j5jb$DA~9MU=ihQ``;DJ+uAU4oZE9qt^??D=f@ScQCR#A^kag%j zZ7ug2(>s)S&vazR!N>nT`TgJUPXn_rQ02iR8z7d{rJ>oSPJ0Vg$cj@)do1QV$3K2^ zVbA|=T a)q$g!MY+$8t z(W#q{!) zI)sY#C`8cJSoAGM()&m!w$!F6M8P1!a{<8-F=^v!0{yc@FH%rtB0(4!Rx|jAY!Y$I zR7m05pRf4kW8wEVAe6e|`CRY$ZCU&z$mY^5l&spmSQ3_bI&GQ;7RMh;hq!n?U{|Jk zPPjW5X<&`2j6IMdNSy}}(B|VmJh{K}#B9t^@a)25Ih9#j4LO;?G^ RnW{;r7f3fBX=jZyV3K(zbZXk>= KgyZZg4e0SU z)Jw%_iVWC051-X1N|4BgYL^B`V6o4zqPM}^w!eyda&=ZAy5k_|3<}F3A+NB@MlIBr z&+LUB%4y6okV>;@fKcZ(Plft6cYa_Sk&a+{lsq2O*ct3EWJGd-N)AP%#$~4&Tu~18 z+Y) kKGQ?(@eUe4HTKCy=Zgbz*qK0m_zSS&lndS+!OBVfzK2 zJGYl@m ;+ zC~YKF-sg-r7n36`c3&AQC1!*7Xh6oatJ>1Pp M(T_$=NnzJBwDGoDH71@;pex_iyl!joHQ3wTlbr9U#L6>ril$|32*d ze>PuOdaoDts1gC&RYrs)x*Cb7e!y@*TP9X>)CkqQky-iQ8^@2WoSwh!fO>N5&G!)M z`tMI4_S`-u|JSGD)T+j`i6Ui$axnwftg&ZB&8=+t?^}7b<;!2|z(M62P`vuplje_K z`^+BR;XCV>0e8Cn)OOA?2?;_(s<_G?YpIUstHyRMU}YCx9oii9+utX?Ra1h3Ajmod z jKS{Q(z%lWL`0H#XFTQ$5jD80b zPa X$O=ho?) z`&6_~oij&%Oc%1nhZw|V-${s6v6-n@2;lTzK?-Gv0Dh>J=|tG2&hbbkS T3kZpgPnWO~6rdMRLEv^!hy> CrvWS7Y`j-xIcwi4n8letnXdfXbFNaY}) zwB%0ZHd?1gIR?5wxn^02Q7v6UJ|0)`Rl3+b1%{HvX{WoqtTol}EbgTxs zgj}WU^@oyH#8oziPOqg9R|Ki5 YOg4kKm#cM-+Fc>wA?|3cD=~qzjBM*5 z+ O{pe}ffcVg z0ooZZ!~H9rmZtZx3GC+P?sbo*UUkfnsL2coLPKeH^l!d70deF(^yk4QqlwoG7tPCW z^8hna=8Hu+gq&rR_{849B5i#+#x%0ZJETHW;}@B{5T4mqyueyl0=wuqgk`RWwZ}@! zG=a%p@pgs;|83-gdhZGxfy_>kVAaTYWwI4|oKEXmw9S=*y}E^rEnU~1Uf=0&OK@%@ z5ivdZe%Kgll |`C zUyr)$c&s@!L`$UOE|eTO)@?Me4-Lt~K{^|OVGoflB_nHHtvKBJg|}+t8xLOI|N7A8 z@1M_~BeAMumDLwT29E5s+y06bscITQ;<<2H>-un&R8#2m=XSNhT&7L1nNdJNsdVGd zfo&UZ>1XMv0hI3k1>K2`&UJLQ&duU!_RiWhVtOzT>(Sm`A1}(R-`7$N-$Sy{E}twQ z2zgkqeLhRQlbw;Gng6|c{`R>PAz1D7&;*J{odrB80^~%I*gg=k$QEHcq^N?f2(gFx zWQ#}9UONIFPp#u3HrqseA>9+94s*8eM6cWcDFmw+ctc=xM@%Fyjau~bpOsrRlP{K~ z)bj%oYMqlQIV8_@kf!fSJ#xD4 >+;9ASX7ca#&yH){^StOikYWY1eh65NZ7H5-$1rB7&0yaIZM{m@OAI#k;56A< zGLueYl!~eBlpfXtwgObkJ@H@-xE^YsN1!AGX3=>HyMk?rrZ)ZSGs2hEa%R4vlL)7c zZP!R7jMud;VPJ?S&o)bMpWJi(;qbG!a|MWY5p*YssK?H2R0h$a1%b}4p~;`kKmg$Y zz|BUB^$%?K7b6{c1V=D2c)T`a`IM9x0T+x{T!`upeigDJMJGg-jK)srOJ`9rVcQ}P z6xyh0mv<|t3yR64okXT6PO|6q%9|fo_8%*2lMMs}_u%Ym1A=>l+3gxpzX{ZP2|{qg zoT{=8q+ln-S>CTdZk)fdnL;;?P=td5&T) r>o{JNeNmXCJHUP_$Ase)_6mDh z@|suHUQAiYa~}(}M?*70fX{9K=A<6o&B9_uFaxl2X}7$OcQCL#lnIM%1Fi(y;nCn8 zgGQ(p0-02R;6ygf))i!~-Qd;uX&kWX3_NNAftPG7<7vPFZj57Db_@L##f+sP3QGny zYWB~j|8ns;IC_M(UZ654TkIzRWtgNyiaa9bsPLAJ$8!QhfZ@RB h*tL5w#;3WJR@24v^y^L|kGDV)U6f!-)vd3HIXklGiNfD@Vj=e;J zr;N#Pgy;Y>>AtYI8^Z}ehsfDU$LYNsZQ>F;e(Vy54H1F7v>pu>AKAc21P?lBppax| zB6Cq>CDP{3@*N$yn6SR}Zgiw<%$G`~qMJfJUK^W~QsFH}L8(oH&2DAQL#2kq&fP95 z@Bl-i2FpW)mT%PTGTv=rd7Yc~wrRYK?n-fDz%HX5O@DXeQluPXwx3LtV;!4MQzA<> zVh^@7MN%#+m7@wo$#~UM1xRU`eFD{R&4^bOn*hMfEa<9AVGF2q929-HVBqN<(Bm zJ$ze|E=hL!^IWvKlD)Ud+a>2ziPIPlZ$-xyHi4#Y6t{?s0Q%CWNTeXNo^VvzUce$? zuC`&D5CPKh+@&FaWq}{HTmoFN8H+XI@a|Il04I2a23Iut$m&(2E+sz*N!JRqMpG2u zj5!Sl#qhsOzUNbLT*SWQAF4lk@ZDw=7G^%sY07O|+*Uz*;7I1=MYkxFy^1af(hDKL zO`wKO%#loJ9te@EadBW3FSg9V4b*Z-K}^sjSC{ckn!Q|RmuoQF&%u^#tyHA+2e^{s zyT~%lzEVmgwCb=TX$#Ry+-9stw=QvFw151Wa-dikFM>pIuu}SJ;kBWO;K=>%HrPZ2 zY4gy~9T3D<-(?MXQ; K2^xO(_xb_aw=?XA?{8*&*mLpiO3l1# zS|gGxt A=zVsOSa II*kx6#UD?*27E4u<3VsQdj?I`bAR~xvQM6Ct^aX2^Ei6A7lzv<62sd9QLY3d zCjpmR&lZc4t!#gCzh~*(Z8EaEJmK#Xdgw8hX#pvKj4{TzTOXO3 zc=K}p-j@{w%gM7vSd0b&;0#WxqnGdhKEHN#5y6U%?tH!J=*_CRoQr1*O%6OoqRpQB zhyJ-ho}5jl&@B>qHKoGaMPj5$DZt;Jz+tV>Vk4X(5TE Yy6}fhn>L?$^Zm^&|2BSDd-l`i!B2nwwbEg5HnV(H#n}H2e7G?3 z{Y}45I|o^-Z-4*Oq=X<@2G?fU)OLWIJ!bv#M`uQU`2EP@n2O)#X8$q>N=j(D? uf{Ql%47g0+v^ffCEF5XNegR3Vz-bv@p9}7GS*Jc z!6bo*C$gSvQ)3VJ4_qsh=6ZSnSCd&0VcQZeY3pIz^(YHMWOn&f!T20Z;U{%EqSPWB zXxU`Mu#q;U35-JJDzejC9C6*RYe9+wLE1sWBxIFt(v+V|gJ0%SpiCo!f}$pZ@tU z|L;+kE0*nIlt~laCr#tKt9D~{#s^-peb|6*sFdW_%W-(oBN -MX34Y~jD$iJt~ zZ_UfIb)yKax9o+MkIsW^t>damk2|Xt1shY`^F9aG!d|Y*a5XFw_tvxpDf1 5cxC%R2A1oCRGB@+7U8A*W&+pM^W1}8w@zfbWgW&z;qxbaX{`ghmoqAV9G zwBtUS9)2bA7#?}3D;D7{CV|MKvQHts ?r5D{s z$T)fcj)Ar*4qWJVfc42#QyEVyN7?pr+h*Sup@5Ahb8u-CtQyW7E74`i$$*kUc>i+? zQrIzRMSuGhUEj7eq{Uicy^Liej)3ONg6=4J6N1=5 Q$Z!M@dCEJp55ws-fSp>jjc-hu=Rd;*)`J z@G8>>PvIOsuUbyx*5M-MNf@);rAQ`&kSR;Nw1Q1HJ2L2O0>qlyX@o%-L+)-6&||nM zl;u =F_A+H(%OZbkSr?N{SVTq@?Mue4QkUe2Q4=_(w68$N=Osxi z`=lPPBk%$_E13dis8J!Zaw^+v8*8C}wiS(BT}nh(GoHK1Oh73#*w|;o$4^8Y3!Gk3 z7#0}}d>l8|>CuYr7d_UGu`};}kL#J58gb8Rph4z(U>rNqIWW5O`A N>2xm{U&+l|cfS9OL1Nw|%YSWiZ;!P6%m;*W3c_|)?Ep7wjwM;@N)Fx`0{ zMdbHZ$G|=^LMKJY!FI=ND1Hed5qgjcMg}1}ovW~aZYk~|Vk@Dqd72;QU#3eYhRERj zR8k@jZTvB(UqKiv-fdl4Rr&qCGogg69)_CG{!?QQ8P*eIDu| !$EQ3FQx5;|6;W>|iHUb=w{{8<(`hMOZyTk8v zrn}QHOSjcDvS`=oxJAxOOhJOQim1!!uRnbF=i&U0p}*TL5k#;3=3dO6YLH_6_J0U% zPKt9oeC+b5nQ7-mM7_uX5W`y3@!l&Zhf&ttM;Cp``r}RG+bNCxTm`4lHJ~<_qtR6i z9oj$mpZ2y$!HqMIM*wMX)|tDRm5Dv10L}__iz`{cy}q4o51kF@E7^_`f(dX;>k3O( z*T55v-VwNz#QdC%fhv5ZryQ=BfflQpt|XNrJ@Znr->Gx%{lkpsxYJ~e|886&q0hJK zjOEFbwFGNvE@VZ8C>Bu=oJ~YF;TCrhA`G-q6EOZ!{P=WB8# _E}Lm;Rg?WnXNsr zBQ+Y DsOiaKyDhm#YraC>zjHiwA(BK%$9!OwtaJMdo6|}2* yMZU z=IVNUyN1=QKrXegOLWUZD#AEsz;B6Ui~IyJV-aFN3d<@e)(UA=9_fnxmbQ8}lZMn3 z-c0}R<_rJ%bh=U=o~Ci!hqY11{clJ5>zo@azwXQNE2O#P3*Q|%dg{i<`6uV55MPbG zK-wfTcEA4f#^z-`xoos@eCB@qr#W9t(Wdmy2P5}plUUL?R0DcjdT8~MvCUCqFSB|C z%G??`dxWfP3T9s>W5-DJIod)kS|RH13!(RIN!f7j$gcGU6%3Cv!L!6|H7Pl`g6%uq zA*;viC}J>v%y(PWZ+t6P=98gU!N3@}L3_#p2a`^-oZCHO5wb;s=~37#doWzPOSPnv zrT>qkbB||w{~!3s9A=%P8jVwGjpfpu87kK_S )a;fGWSat zx9BP-Hsmt5lS*~mIl8!1x_y5yzrW7ok#rvW?DKhlUf1U{{ *b9D#;J`U$ z!ys+k*}KWA>Qq_`Qi#|9?o0%N>@CYhbrr%j0$@vJaE+ggnHo}&rKI2+OjjZy3lYjO zXmvDkgWR$IK8$7;sO1&UAGJ2is@N1HO4Dw*9`G{lXqm|$XD|M-qad_0M!l)|Vrqx) z7P4Apct({x!VQsl{WW!#pm6cX=xm2FmYmV%kU~H;con7AvYAPEAw`d4xvc6JdGpQB z<1SZ>FYQ^FT>4?$laUtBhrZ;dN%HNvt7+V`p?%sbRC+Dm(rFT>g2fj>Oi~kvizTr& zg)FTy^nR~+5(Ua84u|Q?I%N$q+#?PtIEp|n$zNHCL@&FZF#>^{y@MQ7Wk@cFk<@m0 zcL^rlpJ>LErOE5ZfCy0XC07aQ<$_Yz!nRA0iYw(YTLGQ{Q#?7+7{#~_Gj@JIf}Vpw zWO52IPSOIq7zK{~K?MtmtvgF4ZTlsNPZ?zgeaLabY_lg4M!vNYQW8cMYE>I{d1$Hw zW*9Ce93^6ku}L+Le!J;`D7G$F$seyJoMo0siSMh0KIqN7nxnO1v%2!wq`;p$Xut%n zr-1FE%#_R9dbJADktHyP7)Y1^3U=iR&3Dcxjm~HZvECL+h&Qn6;@hOO#G$B;lp? z1?}ddB-c}i;cesYr&XB>ajiX>XYWksSlR?DZCgKK17Mn0CpJ+w=dOO?&g*6F3Cvwp zFO!t-l jHG&(2inkMhF&|OdpgL>|BX&o0yDyvNw`N!z#VD9nAN$&O zTu@0VWw6_v&0(_8Sxn9mv^kgL_;oEysS&J7!*N+PN|u9a3>9_~nnOqGEh%^jG-n6m zQ#mww$PKKlbPn=pvu#)Z|LB0cp6%B)>vffChaGak3b-c(qZ(;kZ-T6qGF_ofHeTil zIW v94WQJ_mCBCdU zyM4T_AmoO0L6*0wlZ?hzhZyV1F{ITPQec0gY7AMK!|2+i%m9 e=wCnwVNPF(v0EIQg;MthMX5)wjhW*dWW)dk|Q9P)l>QQ$@K>R#{|KxM7n z@+b#g!{z(q;)&!XdCix#-B;5}q+f%%j_R(gW0k(YOv&ns5^7$Pey?4MP)t_n&=&;K z^yCMy1Ut4?ksqCp>`&8$LVAq1%ocS78tF!3QW1#U^f?zi_6g4}2KD#*7?^yPK<{n1 ztI3i!Q>)4H{pVw!+{?}LTTk@Iz-x9_&aNDpthaK02Loah;*dqiV#Q~6J0+}w >^T_h;=69V0 zk)&s;U9$t3seA^c{pp*QWhRPT_?ql+as~vK)GN3~0Zv8caB4M9*@cIWm+4SJvHeax z6FfTY&r@w|SqNycTvm(lZWk_jcc9*_KM3BqtG?8Y3SD&hB6pU(yT0F08!ERAHGop+ zkd4F0?7X65BbkL{KGET!*j-Q?HA5)dm^mq?VuctbJ(Mtsh?P-)LQAYx7bPrBKT| z4lgw>Uvk;f3f?zpeEQ*02)ST@<{zZK=;0s~Uv+8M)&1PRe?ms{vX*2FvSFuF3Aw6i z(n%3%?Hh2kM-3_7KELpcRL!}2_8@|o|Id-+)o(NfL6UA}iFTvFubb_sWpzc0wNb0* zt~4JVP!<;JOm#38CHTGA17(0Lp6WAI{6@6i7A^YSw G z#o;s9)uqb?d8`knf7qHXPhNb4tGgbNfP=GvMxUTTI?^T!)gt;mf&)uKPK`F vRjM_%fH> zv3VAGAoBb1OP@m0J{kWAbwpyEXch_rLOsPTRW2A&SXfy1Vc_SHkggv$5q45F6+QZb zW(UMmEW=5dO^GE|ZNMEOX}Ar+6ecoA^)qlNU}oO}lQl$~ Yleb zT~FL0WefGz)Zls#E$QXPxS$>K^fNj3q=Z5q7Qt!ICNT>o)%ta~$+8Ma^=1YV>vjD} zz2vKFMKv*ag1q$RVG^DF^x6o8EpcZn!7fMYJ =7Cf;2i+ej-?oDVM-eY-#9 z!$75#XyLd`)Yyg`+*KZI!)5AFY5eUn{Y&z3;tae7A36_r(h-8c@%(}EXr9NEC~QKXn%1Hi)Abe8ffsM_DMiHaIEj(m~Jj_KyYfSI=h zYI5(e13Ra~@!;u-j*WgDvggA^+if_Zm+f}(+|{84X>ETxKHf~qx{!s{H9%-MX~&3} zF$2|DNzIpB7VL-oo!!4M*f-TDC1W*)=1T3-geeJ`rfOFmp5&_-M}#zTgRCFCVv!Oq zsMc7RE084in-$;He0wYrBz@6;9JlohON^H!wx&ro9 NQDeOPg%2?as5(<;# zxD0N*GZE*U-mFFqZOfdNO)$6j$jf}D$|4fzn|PSo>$PNz=8}B3b7%u3Hp({sY1}es zPjwyUNkx*{@#a{s$#%;QN5XmsgPF-cw`)uxP0(Ep^9!k?0pATrfzQ+>s#YgYX!Wqv zQB!SY=w5ebMPcjRrqfBm?pr_wH6(1qV6tMiG}66&!jT7qP~t#OczeQ-Bj)q|)1U6I zK2ZzDlu%Jo4 (a`3yMH#zZZ%{%UYQ_qs zhxO_;5W=mys>Y-W;XbMMypg4&zbnyIp@{j{=!G9kJC7mCo+*T?^^ *iN~rlxw+f?$-rNFx6bN;a(xjR4(T`o`2j~K8xihzV#o=ZYN@3z z`8J7Q7odp-tCYO-E6oH#d eisN&r9(=y+vRi?83^58nKq4*A+{S&DjI}G$oAtHgd34r8UX;Sbgk%Tr#=)PRG z;?|Ps4)oG(P+--AVzORbJ3TdCHul6dGZt*yy4YtpqvNFQkg!l#Cy^l)PG-4r3y~B5 zJt#QNTO7T?2nehVhNS=wN)g7ahKDo7FO6#SdXK`!`91&iVy={RO_2 oL&K|$9dWL;+V)Z~; z=hEXl wC}nq@79KoUckiAT+qy=R(6j}0 zPuTQU?&PAyT8PUTzE(WRNzm0!)xbb!HnaAH$Xzc-%}1{k$UY4`qzb9uQHx5yrOUmg z8>`1ZZKaQeM=do)XZ51#0ph}cM7gUxZFC&l@0oo3c9K}Wjou=|EP^(Sdd?G_ES}*j zgam_vlD1=+BQy~#q$}{Qlum672{GPtozdTVm%~2eDuWQxiT&$yG$S&Fc3S|@4Xd;F zM4Z5#I+?H CZPmM!)^BZ*S`nHz$Rddos|(;UG5!iBWQCn9GXdYlZ3wc6PFj zzUmhC!4|N&fRfi7!MGh<`t@i*1Ky;yrCSK*QiaTnw5rTI=~(}~8oeB^>Cn4yFUZEH z^67DHT=^moJi!BB=$zI=){Cdnf6aaT`fKYKBc^`5S*bF;mP|2@!$WtRu9t#PxPm93 z lHI^i9-(Xnd6$VZWM$YXY&F hQp1Ih^GwpSCZuvgbTdjsnF4|`S%IwsAnHhzf}pp-yv#u 6i>@U9Js)y=A zBira3G<2YXl+H{jzMFUoBZ5R$C>%8iedmAhV1)R!l(m|5t#pjq6B|HaOJ>sE=8}ISye_Y8o;)ROiBPa{--2mluzyda9b9 z*)HN5=X5Qrg*wo^1wwa2B>VxUT|u0Cn9r6sCpd_>x_`li@e(Lrd3ocT&6%&pku(-A z76!AIHuZNX5%Vrn3^zb|_by8rd>V@Vg F zyx?irNm<*MHro{@%GFvk7!urj12OVjTIFKNSRn#wUC3@DZ9weY 4izy)^wE9M=49c;FB7 z+zJbw;bW7L`ojYr2Irpjz(uIV0r(cA9~1h zZMC#PIKY)hsr>^5#!2;#xF#Dlgd2E8VycQW3j?|Z(Do$ulP8p5GT_}oq)vvEMl4fn z$DP&BznuCyJ4q~b4uLLsB6~TQ=axihh-ovs_oSHs TI0UTDK_+F3MCzK ztSJkKDzn&ynV;LC&)zOguS+7x#@-^J?s}8{n`*a;E%ViY=~#k0rdyx^IoyUof(Id0 z4~EH8i}c`v^A6HsnMs ~jAWB2{7|=2sXKa1 zsI)XMV%Kiy3j^KB;XvfCDx(69P z9aAWof?)fTw^)IjvIWh?@d%{De4IHB00of;s-rIne)+#!d;hz8fv+@;4!kQWbUDbx zhgS!CF67U(1?wY(8-uwS6*YBf6rSL7*@YH0A`I(IGkn&%MHjsNN6xe};v4@g3KleK z-Lwj{iZHqz=$sa+FqCbfcbQ> $V>tnks+DZsAL5;;0sqqx@7O6HRi4q1{0dAJdr|h(_ zZDyq?twW+rK8Z>P^ie7@bbH{7Z`)hWO>`~2Qx;a&iem2dOnr P&RYY3yEtM~QgP{RY{eJy+foPV!)H*<_*|FI 8-atO= zMJQXoRx9S*8J--!2av|lMmN3043u|ALmORQTXJ5G%aV(Tz1Vp3$jrXJCnCwWMOc3s zg|68!y|^}tSBX@qekH$}s_z!nwA$T?ARt&$JC(2P%#lD)m>hUl@M&A5$U&aTxmE@r zr4{?{sW&xn6c^f8B2de!U4yD!;w>8dHfL&SW*H^5hoc{0AIk0k(jmYb^>Q{ykmpDn z2xPrnI@vgey_w0^^EnukBNQu9+gpm)_D>R6Y=~`0vt0dtVL;A!Q$AZ^ncYj0Ld} zz#<4uaTQ=*VdOf;ei^RNI;T4-?1qnC3J%x;s-WGSSH3-RFDiU;?orVDDDlF<(gt-I zJDhvGo`iOKro#ZNCQY6LE<^#BRkFV>Y?$j}0G7g4;<1;VgXMqNKDhB}wWXoiF(}AR z9SEI#%7oIvE5V4ZZn4H}0xGpAmdi{+Cx?qIZwu*L(8h6Xk{Kh9YQNM4AKO4B*=ZGB z34Gz<`mZc`a;F2kt1Wc|o)>I~PApUDRKr%JWQO|I_LVQ~LNkcN^x~YtJL2j0$bsQ; za%nNx^(9qp>J^*dUOGyLr%v(HC`71lz*}lr4(@#4sco_%VZKv`XNl&M235&=89u=L zAVdcRt{nI6U)!-SW%|c2Cp)IIUSa?o1J%}krOkhw{2O+|suHa=)k}e16scm4?|EY| z+Y!QD_1!Cip;?g?+>jI5=a;`n{QJgMJAZ#`_{7}c&FI~=5XQM!dg~4DcMFfD8-w^x zF-lyi(vdbDk~a$ff}u`wPuPd4zWSR6FQ-2*hz2j5pL;fV>*nCCz2B(wXBqQETQDev zD?Dk4=^$6VwX-W0`{88lDq&P4ElC50I1C#v4i3z%jc+rqyKs%pLX)v9=UDF{GZK3w zhXCgqTaLR`jqN@X~`hqIl@jVTVhgUH^*R9UIqqW%j*dJZVXOBY}LE`NvMl2eG%A z0Hy76MEE0HQD?vHd;O+7?d`H4rVa5M52wt2q5~2vgp76letv2$An;{NaNg4l7~4+p z)m|r$%?4f&J qieoZlG>aOW<2q6?EFmf z__^6$t-P1}ALN6hA@8NZ(*1}}CZ=^N`H_a<({DUg^6?KlX6F~`&ikHR9QMyT Jk;vu@S@uBF05nn`=~mvJG1X}r<8PGJ*#5Z{ABgpy{OL }fy~->G%;kbnEVtJq-AeH)J4yyJ%R=AvKOGax zYY{Lkgg;3kRdOU15eYh6q((I3{qpIjWs;K!bUZBV0*OtW)omazFV&cywo^%k%*5oV zm*4?)6juW)echr$zy~3QDDgICIHa7t!*H|P3OO=rlvCULY6G^-9AU3Ol=mw0H2(v5 z`UURa*FyiB=_|)B_L+{Ko9m6z)yg}U|NY0ztrs(&7vX-|;rZbH-1Z>-68{R&Hx*YU zCm=5X*gtehyCJLArjn81{{ogOjCA@QU)>RQ_2%$I`@qD^)X1abuiq~loqabqnizd9 zLTvPEQ8CuVJ=^`8n1Ru&=I$TJ^wS(uaH)=ZKl0 -{W8i1bWVHE1eK0ZlAI(%HM)W8RFGt_ zHpNCz;I0&Jjz73ly%&k85yoa6?g6pJKw1#05FoeeBG-br$yN*!$n fo2HF z3U%mF*dHt^Dr4CEkvC%PYm(P;_T$8S=)~Oe)F3x}W{->R-;1NuCXYTCHDCPw;kj>T zCf-;ru$-<~?WwhPqWKBeviKEZz1*QDT2sd?qX=|7c`K}&C7s#z?S21!Tt2fj(RY0J zhc9c `~gt X@@_-S$1GB&ro|cq0vY;Y?MQNlPOU#Y=|XDS z6&%%Ef~Jq$BwAbzUFPV?(c`2^7^LJRXaGo(QgX4Etx~b!&?TY%p5!1@Hb0~!;whm) zC%8 n!<4g#2Sk~o0# z1fVO6xfNA~r5@6U)9?EEEBmCI`a0{(Mt(iNZGV*e*VPHWo?gL$ONXy6e1=NTsnx~y zM-Ltv(iYqfMLFe*6a9Dxd;Qf;WEm$(X8i+xPH~;A&pOfM^U~DZr-_BgACIn@Zp$6L zy!a*3 )lO@!krzcO^ae+T|?0eUjjB7vd$H( z;skGWKAvp%q}d9ly(BZFft!q#&4%r)LK5??Ii6s0Jfvjw^Ov>bY5&F(Z0j;lxGxQ= z0bnTJd;Kf$J!q{v9~?GqzQs~F+kPz}M;ay;!2!17D^uyGa7wDR4d{Bw=?!j4Gzd#z zjVr4vM&@p7ZU<0w5jrL2BKOHZ)WTql^pWn%zMG}(S4+FE+LG98>kGZV3RHgG+S2U# zJDijelWz{S>P?h2DiG~_{BY@O&(qU4S-sS9c+t>w8#d978_ahYt%a@_oLY(eI5mFH zMCI|Hw?cHwJxx~Ljat1{xBpK{do7~Q`cd?Uf_WFp0+v8g=<4?e{FLM!?w{c>X$|~$ zKd;z$nc03AW!RJ&r&G};1Jqs^zvO~b(O=yjorIJ5Rx8Jkjf)NxuZB-7hb7}|r0}?S z5dQSf!XPU;05v>wW`$UaMmhN_IOke4Xj3EvZl~CaF+!pQH@ATW1BvW` w}BF14M zBLNmX8spt2!)7LP^)jpj=Jt|dwRiT+n@iDa7ymNykuN!jpm+z&&3RvI;h?>);IOb> za5cR`Y|OoU@Wq>pS``f%{H-($s+uR^O8Tv&dK=0MQ;2L)(c$v-yrvIwb6=@Sb(j;# zz^P5b6Vk`@ggs|G=^3{|Y9?ngdOa %rQ=q=cS3P!of9RML~RlYO|y{iG{PR2TqRZvI*bs)f7iTHNQwM^KK8Ay&c z{^WmU_YT_!+s~g4Ul2Wd@bXne%j-+bsEeJuXC7Tz+VN`I_IfV8c)^)ar9+>-3swNI zgq|ErudU19VxrV0m2dDYERnVC ^(&1uQ)EcDv$Jr$k^h9tn z^er2qe*vRm?9#ogb*(^nzzV# r2 zPjG_45}jJTmIQBhXGqDd!#0sBw!7#s9lTYcI(T`xBQ{5ZyJ36&=dlN-7a>^@eirnm zr3u(YbD!&Y9R}x?1soKn!!}OPB^oBFmfq!yKphj$+X@UBf)1Cx`{L |g;J553+XuB)=G%?gA=DbbN26%MR6 zDjg{eZ)#xIJa_zuSLQqOemES{zv1`mevPs qORBh>+n-#n`$(@)tP>!&11#?H6J za?m6p1 Gjl950!+};krc3Z(Axt z=O&dHsM`xP=01 fR=1GBd{XS^I}so4Z+xo+JiKU$Fy-}$lJQq!fwp$>=%P?7iaM0k vr@#JHG`IXke3qe+_n;?uZMDuL*buBKuWe@;&`)&Hpu+U7x<#`#X{*$5 z5|-_+?=9lO4u~0YI2I H{nbStMa BtgyP4B1a^z$Q=wtXjnKE!&Npvwy6TN*bq-D zkv2J*A#yLLXAFWYok(_odn57+PEtZp{}=hc2O`^%^D_r@ZUY! Q)(R-u3N#=Zlknw5 zd;`^7 A{BPd6L;_&$Skq& zQqm+l2%jwI_qtQ#q?NE_dlj11p-6c84+8_mOUz-bZ$*1eMv@K&x?Q|~Q~Nwr?fMR7 z<_MB=NeIoiF;gp1)yG{|qZdO&7g7oczTsO?6{QMh2zBX=_Uf`^7IpwersAZH?yoeh zPDh^W(!X!Pqx6Fwy vdWH_>YV2^% zh#phD!ozkTz=JZcJi7M_2m NA4vWkb(i1Cfj z;UyseWh$Wt?3 )|jKi1v`Wctn0SXnK^AJX3p&R{qGTP z-*p(oCy6cX+Vtgx!geTYX3~J6mK-ZXqu*OH-167p*B>y1c!~ElW%kz>{Sls$jU(eE z({g|slJ{nRF&soFv}Ub9d@AZ;O?CsX=i7mjh3MlsYXy3#sCxZ9#CuLd5cHKj4p|Og zjXE-OztbL&43bEi^p%j2pM95VKYUpGFn!T?-=2LoU!tPc9(j_}jymE+&LO_$`c`4> z@VQ~Y&R-JJ0HE@!+fRlI0Acn#EVpO2C | z?M=z(ObEz|!UF9^roxlhxEOgM5LT aNwB&uNPez5cZ6lI{I3^iD(0z@rG-P)SAnU=lY1Dp;NBcI3 ^#rD)y+rjrjH>$fobIcf)tRAF4LHCxP$@eQ2Q$o=CcVh4y~guHp^jum(ivqsIpu# zX;!%8q=grX^>kI&t$$anxY57ey!m0r&9BE3e>JZhFwi$WhmwSV_78l|xX;@2G8JM;+y`h#IKJH4Psz0Tj5}(%kR&LKUF@jd0xDP zw=em OEvjy75xZAGd!bS2onR~`z=glF4>s0orM zi~Bm0utR6G`TD4?l3tEtqVtfwT(uFUxYkj(nB9}ef&leQH)94I+8i^7{}*CDjV03N zf-DXOjZ`HTV*K^DNTc*Pl00k&N @i^u)5?wA{Tv+XU_9JD_8jFQti<~c(G$e;DzY4INb5+X6Y3Qbd|Jwno z!+1+GwL-t};!6jAxpaQrH}}x}{y*`=JUxzgh-qVAZTtCu-yCten9EwW9e=zfx+FYd ztMnbX%t|OM`@!>NfDI@3S(hsKo_wDZiNO4|w^7R%luv+*Bf<`)uzy)q?NGdRsSksC zShBWttFv`&ZtpB!l&amt7}EES_|thfAkZ*3DL{)b-~%~y?@+V4WNGnjZ#G*RTxEn( zcezu{95xt6lb`?RO9n|gF11J>vRG6C!FhNkdV5Lt%>&x(C_PpGJq3@;o6mZD9sh&S z8xAoP+aDwb8 bR`Ru_{qtwWsSx&GY?gMK*Kps>=opM zD0ObWKlm~`%V2E+tN-F