import { queenApi } from "/node_modules/.vite/deps/queenjs.js?v=aff0ab7e"; import { Controller } from "/src/comm/core/controller.ts"; import { RxValue } from "/src/comm/core/rxValue.ts"; import { useCtx } from "/src/comm/ctx/index.ts?t=1702975066869"; import { message } from "/node_modules/.vite/deps/ant-design-vue.js?v=f7d2fa05"; class App { name = ""; version = "0.0.0"; lastUpdateDate = ""; icon = ""; revAssets = []; size = "0MB"; tags = ""; desc = ""; entry = ""; type = ""; key = ""; instCount = 1; Version = ""; ExePath = ""; } export class InstallController extends Controller { state = RxValue.create({ apps: [], installing: false, downProgress: "", installProgress: "" }); async onReady() { return await this.parseInstalledApp(); } async parseInstalledApp() { const { deviceCtrl, prjCtrl } = useCtx(); const records = []; try { const appconfig = await deviceCtrl.ReadFileText( `${prjCtrl.RootDir}/app.json` ); if (!appconfig.error && appconfig.text) { const app = JSON.parse(appconfig.text); records.push(app); } } catch (error) { console.error(error); } this.state.setApps(records); } async install(item) { console.log("install=>", item); const { deviceCtrl, prjCtrl } = useCtx(); const localpath = prjCtrl.createPath(`${item._id}.zip`); this.state.installing = true; const ok = await deviceCtrl.DownloadFile( item.url, localpath, 60 * 10, (evt, msg) => { console.log("down", evt, msg.fva11); if (evt == "progress") { this.state.downProgress = ((msg.fva11 || 0) * 100).toFixed(1); } if (evt == "succ") { this.state.downProgress = ""; message.success("下载成功,开始安装..."); } if (evt == "error") { this.state.installing = false; deviceCtrl.TrayNotice({ context: `软件下载失败,请检查你的网络设置` }); } } ); if (ok) { const unzipOk = await deviceCtrl.Unzip( localpath, prjCtrl.RootDir, (evt, msg) => { console.log("install", evt, msg.fva11); if (evt == "progress") { this.state.installProgress = ((msg.fva11 || 0) * 10).toFixed(1); } if (evt == "succ") { this.state.installProgress = ""; this.state.installing = false; deviceCtrl.TrayNotice({ context: `软件安装成功` }); } if (evt == "error") { this.state.installing = false; this.state.installProgress = ""; deviceCtrl.TrayNotice({ context: `软件安装失败,请重新安装` }); } } ); if (unzipOk) { await deviceCtrl.UpdateConfig(item.version); await this.parseInstalledApp(); } } queenApi.hideLoading(); } async update(appRecord) { const { deviceCtrl, prjCtrl } = useCtx(); const runnings = await deviceCtrl.GetRunningApp(); let appRunning = runnings.find((item) => item.Key == appRecord.name); console.log("running", runnings); if (appRunning) { queenApi.messageWarn("请先关闭应用程序,再进行更新!"); return; } const fpath = prjCtrl.getAppInstallDir() + `/${appRecord.name}`; const ok = await deviceCtrl.RemoveDir(fpath); if (ok) { this.install(appRecord); } } async uninstall(appRecord) { const { deviceCtrl, prjCtrl } = useCtx(); const runnings = await deviceCtrl.GetRunningApp(); let appRunning = runnings.find((item) => item.Key == appRecord.key); if (appRunning) { queenApi.messageWarn("请先关闭应用程序,再进行卸载!"); return; } const fpath = prjCtrl.getAppInstallDir() + `/${appRecord.key}`; const ok = await deviceCtrl.RemoveDir(fpath); if (ok) { deviceCtrl.DeleteShortcut(appRecord.key); deviceCtrl.TrayNotice({ context: `${appRecord.name}卸载成功!` }); await this.parseInstalledApp(); } } async CreateShortcut(appRecord) { const { deviceCtrl, prjCtrl } = useCtx(); const iconPath = prjCtrl.getAppInstallDir() + `/${appRecord.key}/${appRecord.icon}`; const ok = await deviceCtrl.CreateShortcut( appRecord.key, deviceCtrl.profile.exePath, iconPath ); if (ok) { deviceCtrl.TrayNotice({ context: `${appRecord.name}快捷方式创建成功!` }); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGxDdHJsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHF1ZWVuQXBpIH0gZnJvbSBcInF1ZWVuanNcIjtcclxuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb3JlL2NvbnRyb2xsZXJcIjtcclxuaW1wb3J0IHsgUnhWYWx1ZSB9IGZyb20gXCIuLi9jb3JlL3J4VmFsdWVcIjtcclxuaW1wb3J0IHsgdXNlQ3R4IH0gZnJvbSBcIi4uL2N0eFwiO1xyXG5pbXBvcnQgeyBtZXNzYWdlIH0gZnJvbSBcImFudC1kZXNpZ24tdnVlXCI7XHJcblxyXG4vKipcclxuICogIGFwcOWuieijheeuoeeQhlxyXG4gKiAgMS4g6K+75Y+W5a6J6KOF55qEYXBwcy5tYW5pZmVzdOaWh+S7tuino+aekOW9k+WJjeW3suWuieijheeahOW6lOeUqFxyXG4gKiAgMi4g5omA5pyJYXBw5a6J6KOF5Zyo55uu5b2VJHtBcHBJbnN0YWxsRGlyfS/kuIvpnaIsIOWuieijheWQjuiiqyBhcHBzLm1hbmlmZXN06YWN572u5paH5Lu257Si5byVXHJcbiAqICAzLiDlronoo4XnmoRhcHDljYfnuqflkI7vvIzmm7TmlrBhcHBzLm1hbmlmZXN057Si5byV5paH5Lu277yM5Yig6Zmk5pen55qEJHtBcHBJbnN0YWxsRGlyfS/kuIvnmoTmlofku7ZcclxuICogIDQuIOS4gOS4qmFwcOWcqCBhcHBzLm1hbmlmZXN057Si5byV5paH5Lu25Lit5qC85byP5aSn6Ie05aaC5LiLXHJcbiAqICA1LiDlronoo4XlnKjnm67lvZUke0FwcEluc3RhbGxEaXJ9L+S4i+mdoumDveWvueW6lOacieS4quS4gOS4qmFwcC5wcm9maWxl5paH5Lu2XHJcbiAqXHJcbiAqICAgIHtcclxuICogICAgICAgbmFtZTogXCJzcHUzZFwiLFxyXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXHJcbiAqICAgICAgIGxhc3RVcGRhdGVEYXRlOiBcIjIwMjMtMTAtMTBcIixcclxuICogICAgICAgaWNvbjogXCIke0FwcEluc3RhbGxEaXJ9L3NwdTNkL2ljb24ucG5nXCIsXHJcbiAqICAgICAgIHJldkFzc2V0czogXCIucGFjaywubWF0LCBtYXRncm91cCwgc3B1M2QgaW1hZ2VcIixcclxuICogICAgICAgc2l6ZTogXCIxMjNNQlwiLFxyXG4gKiAgICAgICB0YWdzOiBcInh4XCIsXHJcbiAqICAgICAgIGRlc2M6IFwiXCIsXHJcbiAqICAgICAgIGVudHJ5OiBcIiR7QXBwSW5zdGFsbERpcn0vc3B1M2Qvc3B1M2QuZXhlXCJcclxuICogICAgICAgdHlwZTogXCJuYXRpdmVhcHBcIiAvL25hdGl2ZWFwcCAgd2ViYXBwXHJcbiAqICAgICAgIGtleTogXCJzcHUzZFwiIC8v5bqU55SoaWRcclxuICogICAgICAgaW5zdENvdW50OiAxLCAvLzAg5LiN6ZmQ5Yi25a6e5YiXLCAgMS3ljZXlrp7kvosgIG0tbeS4quWunuWIl1xyXG4gKiAgICB9XHJcbiAqL1xyXG5cclxuY2xhc3MgQXBwIHtcclxuICBuYW1lID0gXCJcIjtcclxuICB2ZXJzaW9uID0gXCIwLjAuMFwiO1xyXG4gIGxhc3RVcGRhdGVEYXRlID0gXCJcIjtcclxuICBpY29uID0gXCJcIjtcclxuICByZXZBc3NldHMgPSBbXTtcclxuICBzaXplID0gXCIwTUJcIjtcclxuICB0YWdzID0gXCJcIjtcclxuICBkZXNjID0gXCJcIjtcclxuICBlbnRyeSA9IFwiXCI7XHJcbiAgdHlwZSA9IFwiXCI7XHJcbiAga2V5ID0gXCJcIjtcclxuICBpbnN0Q291bnQgPSAxO1xyXG4gIFZlcnNpb24gPSBcIlwiO1xyXG4gIEV4ZVBhdGggPSBcIlwiO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdGFsbENvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuICBzdGF0ZSA9IFJ4VmFsdWUuY3JlYXRlKHtcclxuICAgIGFwcHM6IFtdIGFzIEFwcFtdLFxyXG4gICAgaW5zdGFsbGluZzogZmFsc2UsXHJcbiAgICBkb3duUHJvZ3Jlc3M6IFwiXCIsXHJcbiAgICBpbnN0YWxsUHJvZ3Jlc3M6IFwiXCIsXHJcbiAgfSk7XHJcblxyXG4gIGFzeW5jIG9uUmVhZHkoKSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wYXJzZUluc3RhbGxlZEFwcCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGFyc2VJbnN0YWxsZWRBcHAoKSB7XHJcbiAgICBjb25zdCB7IGRldmljZUN0cmwsIHByakN0cmwgfSA9IHVzZUN0eCgpO1xyXG5cclxuICAgIC8vIGNvbnN0IGluc3RhbGxkaXIgPSBwcmpDdHJsLmdldEFwcEluc3RhbGxEaXIoKTtcclxuXHJcbiAgICAvLyBjb25zdCByZXQgPSBhd2FpdCBkZXZpY2VDdHJsLkdldFN1YkRpck5hbWVzKGluc3RhbGxkaXIpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKFwibGlzdCBkaXJzPT5cIiwgcmV0KTtcclxuXHJcbiAgICAvL+ino+aekOW3suWuieijheeahOebruW9lVxyXG4gICAgY29uc3QgcmVjb3JkczogQXBwW10gPSBbXTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBhcHBjb25maWcgPSBhd2FpdCBkZXZpY2VDdHJsLlJlYWRGaWxlVGV4dChcclxuICAgICAgICBgJHtwcmpDdHJsLlJvb3REaXJ9L2FwcC5qc29uYFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFhcHBjb25maWcuZXJyb3IgJiYgYXBwY29uZmlnLnRleHQpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBKU09OLnBhcnNlKGFwcGNvbmZpZy50ZXh0KTtcclxuICAgICAgICByZWNvcmRzLnB1c2goYXBwKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXRlLnNldEFwcHMocmVjb3Jkcyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsKGl0ZW06IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJpbnN0YWxsPT5cIiwgaXRlbSk7XHJcbiAgICBjb25zdCB7IGRldmljZUN0cmwsIHByakN0cmwgfSA9IHVzZUN0eCgpO1xyXG4gICAgY29uc3QgbG9jYWxwYXRoID0gcHJqQ3RybC5jcmVhdGVQYXRoKGAke2l0ZW0uX2lkfS56aXBgKTtcclxuICAgIHRoaXMuc3RhdGUuaW5zdGFsbGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuRG93bmxvYWRGaWxlKFxyXG4gICAgICBpdGVtLnVybCxcclxuICAgICAgbG9jYWxwYXRoLFxyXG4gICAgICA2MCAqIDEwLFxyXG4gICAgICAoZXZ0LCBtc2cpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImRvd25cIiwgZXZ0LCBtc2cuZnZhMTEpO1xyXG5cclxuICAgICAgICBpZiAoZXZ0ID09IFwicHJvZ3Jlc3NcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5kb3duUHJvZ3Jlc3MgPSAoKG1zZy5mdmExMSB8fCAwKSAqIDEwMCkudG9GaXhlZCgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2dCA9PSBcInN1Y2NcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5kb3duUHJvZ3Jlc3MgPSBcIlwiO1xyXG4gICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKFwi5LiL6L295oiQ5Yqf77yM5byA5aeL5a6J6KOFLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZ0ID09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5pbnN0YWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBkZXZpY2VDdHJsLlRyYXlOb3RpY2UoeyAgICAgICAgICBcclxuICAgICAgICAgICAgY29udGV4dDogYOi9r+S7tuS4i+i9veWksei0pe+8jOivt+ajgOafpeS9oOeahOe9kee7nOiuvue9rmAsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpZiAob2spIHtcclxuICAgICAgY29uc3QgdW56aXBPayA9IGF3YWl0IGRldmljZUN0cmwuVW56aXAoXHJcbiAgICAgICAgbG9jYWxwYXRoLFxyXG4gICAgICAgIHByakN0cmwuUm9vdERpcixcclxuICAgICAgICAoZXZ0LCBtc2cpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zdGFsbFwiLCBldnQsIG1zZy5mdmExMSk7XHJcbiAgICAgICAgICBpZiAoZXZ0ID09IFwicHJvZ3Jlc3NcIikge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmluc3RhbGxQcm9ncmVzcyA9ICgobXNnLmZ2YTExIHx8IDApICogMTApLnRvRml4ZWQoMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXZ0ID09IFwic3VjY1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW5zdGFsbFByb2dyZXNzID0gXCJcIjtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnN0YWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGDova/ku7blronoo4XmiJDlip9gLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChldnQgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW5zdGFsbGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmluc3RhbGxQcm9ncmVzcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgY29udGV4dDogYOi9r+S7tuWuieijheWksei0pe+8jOivt+mHjeaWsOWuieijhWAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaWYgKHVuemlwT2spIHtcclxuICAgICAgICBhd2FpdCBkZXZpY2VDdHJsLlVwZGF0ZUNvbmZpZyhpdGVtLnZlcnNpb24pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGFyc2VJbnN0YWxsZWRBcHAoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcXVlZW5BcGkuaGlkZUxvYWRpbmcoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlKGFwcFJlY29yZDogYW55KSB7XHJcbiAgICBjb25zdCB7ICBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuICAgIC8v5o+Q56S65YGc5q2i5b2T5YmN5bqU55SoXHJcblxyXG4gICAgY29uc3QgcnVubmluZ3MgPSBhd2FpdCBkZXZpY2VDdHJsLkdldFJ1bm5pbmdBcHAoKTtcclxuICAgIGxldCBhcHBSdW5uaW5nID0gcnVubmluZ3MuZmluZCgoaXRlbSkgPT4gaXRlbS5LZXkgPT0gYXBwUmVjb3JkLm5hbWUpO1xyXG4gICAgY29uc29sZS5sb2coXCJydW5uaW5nXCIsIHJ1bm5pbmdzKTtcclxuICAgIGlmIChhcHBSdW5uaW5nKSB7XHJcbiAgICAgIHF1ZWVuQXBpLm1lc3NhZ2VXYXJuKFwi6K+35YWI5YWz6Zet5bqU55So56iL5bqP77yM5YaN6L+b6KGM5pu05paw77yBXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcGF0aCA9IHByakN0cmwuZ2V0QXBwSW5zdGFsbERpcigpICsgYC8ke2FwcFJlY29yZC5uYW1lfWA7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuUmVtb3ZlRGlyKGZwYXRoKTtcclxuICAgIGlmIChvaykge1xyXG4gICAgICB0aGlzLmluc3RhbGwoYXBwUmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgdW5pbnN0YWxsKGFwcFJlY29yZDogYW55KSB7XHJcbiAgICBjb25zdCB7ICBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuICAgIC8v5o+Q56S65YGc5q2i5b2T5YmN5bqU55SoXHJcbiAgICBjb25zdCBydW5uaW5ncyA9IGF3YWl0IGRldmljZUN0cmwuR2V0UnVubmluZ0FwcCgpO1xyXG4gICAgbGV0IGFwcFJ1bm5pbmcgPSBydW5uaW5ncy5maW5kKChpdGVtKSA9PiBpdGVtLktleSA9PSBhcHBSZWNvcmQua2V5KTtcclxuICAgIGlmIChhcHBSdW5uaW5nKSB7XHJcbiAgICAgIHF1ZWVuQXBpLm1lc3NhZ2VXYXJuKFwi6K+35YWI5YWz6Zet5bqU55So56iL5bqP77yM5YaN6L+b6KGM5Y246L2977yBXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL+WIoOmZpOWuieijheaWh+S7tlxyXG4gICAgY29uc3QgZnBhdGggPSBwcmpDdHJsLmdldEFwcEluc3RhbGxEaXIoKSArIGAvJHthcHBSZWNvcmQua2V5fWA7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuUmVtb3ZlRGlyKGZwYXRoKTtcclxuICAgIGlmIChvaykge1xyXG4gICAgICBkZXZpY2VDdHJsLkRlbGV0ZVNob3J0Y3V0KGFwcFJlY29yZC5rZXkpO1xyXG4gICAgICBkZXZpY2VDdHJsLlRyYXlOb3RpY2UoeyBjb250ZXh0OiBgJHthcHBSZWNvcmQubmFtZX3ljbjovb3miJDlip8hYCB9KTtcclxuICAgICAgLy/ph43mlrDop6PmnpDlt7Llronoo4Xmlofku7ZcclxuICAgICAgYXdhaXQgdGhpcy5wYXJzZUluc3RhbGxlZEFwcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyBDcmVhdGVTaG9ydGN1dChhcHBSZWNvcmQ6IGFueSkge1xyXG4gICAgY29uc3QgeyBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuXHJcbiAgICBjb25zdCBpY29uUGF0aCA9XHJcbiAgICAgIHByakN0cmwuZ2V0QXBwSW5zdGFsbERpcigpICsgYC8ke2FwcFJlY29yZC5rZXl9LyR7YXBwUmVjb3JkLmljb259YDtcclxuICAgIGNvbnN0IG9rID0gYXdhaXQgZGV2aWNlQ3RybC5DcmVhdGVTaG9ydGN1dChcclxuICAgICAgYXBwUmVjb3JkLmtleSxcclxuICAgICAgZGV2aWNlQ3RybC5wcm9maWxlLmV4ZVBhdGgsXHJcbiAgICAgIGljb25QYXRoXHJcbiAgICApO1xyXG4gICAgaWYgKG9rKSB7XHJcbiAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7IGNvbnRleHQ6IGAke2FwcFJlY29yZC5uYW1lfeW/q+aNt+aWueW8j+WIm+W7uuaIkOWKnyFgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsZUFBZTtBQUN4QixTQUFTLGNBQWM7QUFDdkIsU0FBUyxlQUFlO0FBMEJ4QixNQUFNLElBQUk7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLGlCQUFpQjtBQUFBLEVBQ2pCLE9BQU87QUFBQSxFQUNQLFlBQVksQ0FBQztBQUFBLEVBQ2IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUNaO0FBRU8sYUFBTSwwQkFBMEIsV0FBVztBQUFBLEVBQ2hELFFBQVEsUUFBUSxPQUFPO0FBQUEsSUFDckIsTUFBTSxDQUFDO0FBQUEsSUFDUCxZQUFZO0FBQUEsSUFDWixjQUFjO0FBQUEsSUFDZCxpQkFBaUI7QUFBQSxFQUNuQixDQUFDO0FBQUEsRUFFRCxNQUFNLFVBQVU7QUFDZCxXQUFPLE1BQU0sS0FBSyxrQkFBa0I7QUFBQSxFQUN0QztBQUFBLEVBRUEsTUFBTSxvQkFBb0I7QUFDeEIsVUFBTSxFQUFFLFlBQVksUUFBUSxJQUFJLE9BQU87QUFTdkMsVUFBTSxVQUFpQixDQUFDO0FBRXhCLFFBQUk7QUFDRixZQUFNLFlBQVksTUFBTSxX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