From 15d4f5b3238125fd4a987f53fbad3983613af26b Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:15:27 +0000 Subject: [PATCH 01/12] Testing workflow --- .github/workflows/release.yml | 25 + .gitignore | 2 +- build.js | 82 +- changelog.md | 0 package-lock.json | 6314 +++++------------ package.json | 22 +- .../animation_controllers}/digging.json | 0 .../animation_controllers}/eating.json | 0 .../animation_controllers}/gliding.json | 0 .../animation_controllers}/ground.json | 0 .../animation_controllers}/jumping.json | 0 .../animation_controllers}/levitating.json | 0 .../animation_controllers}/moving.json | 0 .../animation_controllers}/riding.json | 0 .../animation_controllers}/sneaking.json | 0 .../animation_controllers}/swimming.json | 0 .../animation_controllers}/using_item.json | 0 .../entities}/chest_boat.json | 0 .../entities}/command_block_minecart.json | 0 {entities => project/entities}/database.json | 0 {entities => project/entities}/inventory.json | 0 {entities => project/entities}/npc.json | 0 {entities => project/entities}/player.json | 0 .../functions}/start.mcfunction | 0 {items => project/items}/gui.item.json | 0 manifest.json => project/manifest.json | 0 pack_icon.png => project/pack_icon.png | Bin {scripts => project/scripts}/index.js | 1 - {src => project/src}/config/app.ts | 0 {src => project/src}/config/chest.ts | 0 {src => project/src}/config/commands.ts | 0 {src => project/src}/config/database.ts | 0 {src => project/src}/config/form.ts | 0 {src => project/src}/config/objectives.ts | 0 {src => project/src}/database/Database.ts | 0 {src => project/src}/database/index.ts | 0 {src => project/src}/database/tables.ts | 0 {src => project/src}/index.ts | 0 {src => project/src}/lang/emoji.ts | 0 {src => project/src}/lang/profanity.ts | 0 {src => project/src}/lang/text.ts | 0 .../src}/lib/Chest GUI/Models/EntityChest.ts | 0 .../src}/lib/Chest GUI/Models/FillTypes.ts | 0 .../Chest GUI/Models/ItemGrabbedCallback.ts | 0 .../src}/lib/Chest GUI/Models/Page.ts | 0 .../src}/lib/Chest GUI/Models/PageItem.ts | 0 .../src}/lib/Chest GUI/database/Item.ts | 0 {src => project/src}/lib/Chest GUI/index.ts | 0 .../src}/lib/Chest GUI/pages/home.ts | 0 {src => project/src}/lib/Chest GUI/utils.ts | 0 .../src}/lib/Command/ArgumentTypes.ts | 0 {src => project/src}/lib/Command/Callback.ts | 0 {src => project/src}/lib/Command/Command.ts | 0 {src => project/src}/lib/Command/index.ts | 0 {src => project/src}/lib/Command/types.d.ts | 0 {src => project/src}/lib/Command/utils.ts | 0 .../src}/lib/Events/EntitiesLoad.ts | 0 .../src}/lib/Events/beforeBlockBreak.ts | 0 {src => project/src}/lib/Events/beforeChat.ts | 0 .../src}/lib/Events/onPlayerMove.ts | 0 .../src}/lib/Events/onSlotChange.ts | 0 .../src}/lib/Form/Models/ActionForm.ts | 0 .../src}/lib/Form/Models/FormCallback.ts | 0 .../src}/lib/Form/Models/MessageForm.ts | 0 .../src}/lib/Form/Models/ModelForm.ts | 0 {src => project/src}/lib/Form/types.ts | 0 .../plugins/Anti-Cheat/config/enchantments.ts | 0 .../plugins/Anti-Cheat/config/moderation.ts | 0 .../plugins/Anti-Cheat/config/movement.ts | 0 .../src}/plugins/Anti-Cheat/config/region.ts | 0 .../src}/plugins/Anti-Cheat/index.ts | 0 .../Anti-Cheat/modules/commands/ban.ts | 0 .../Anti-Cheat/modules/commands/database.ts | 0 .../Anti-Cheat/modules/commands/ecwipe.ts | 0 .../Anti-Cheat/modules/commands/freeze.ts | 0 .../Anti-Cheat/modules/commands/help.ts | 0 .../Anti-Cheat/modules/commands/import.ts | 0 .../Anti-Cheat/modules/commands/kick.ts | 0 .../Anti-Cheat/modules/commands/lockdown.ts | 0 .../Anti-Cheat/modules/commands/log.ts | 0 .../Anti-Cheat/modules/commands/mute.ts | 0 .../Anti-Cheat/modules/commands/npc.ts | 0 .../Anti-Cheat/modules/commands/ping.ts | 0 .../Anti-Cheat/modules/commands/region.ts | 0 .../Anti-Cheat/modules/commands/role.ts | 0 .../Anti-Cheat/modules/commands/settings.ts | 0 .../Anti-Cheat/modules/commands/teleport.ts | 0 .../Anti-Cheat/modules/commands/vanish.ts | 0 .../Anti-Cheat/modules/commands/version.ts | 0 .../beforeDataDrivenEntityTriggerEvent.ts | 0 .../Anti-Cheat/modules/events/import.ts | 0 .../Anti-Cheat/modules/events/playerJoin.ts | 0 .../modules/events/worldInitialize.ts | 0 .../Anti-Cheat/modules/forms/automod.ts | 0 .../plugins/Anti-Cheat/modules/forms/home.ts | 0 .../Anti-Cheat/modules/forms/settings.ts | 0 .../Anti-Cheat/modules/managers/ban.ts | 0 .../Anti-Cheat/modules/managers/containers.ts | 0 .../Anti-Cheat/modules/managers/freeze.ts | 0 .../Anti-Cheat/modules/managers/import.ts | 0 .../Anti-Cheat/modules/managers/mute.ts | 0 .../Anti-Cheat/modules/managers/region.ts | 0 .../plugins/Anti-Cheat/modules/models/Ban.ts | 0 .../modules/models/BlockInventory.ts | 0 .../Anti-Cheat/modules/models/Freeze.ts | 0 .../plugins/Anti-Cheat/modules/models/Log.ts | 0 .../plugins/Anti-Cheat/modules/models/Mute.ts | 0 .../plugins/Anti-Cheat/modules/models/Npc.ts | 0 .../Anti-Cheat/modules/models/PlayerLog.ts | 0 .../modules/models/PreviousLocation.ts | 0 .../Anti-Cheat/modules/models/Protection.ts | 0 .../Anti-Cheat/modules/models/Region.ts | 0 .../plugins/Anti-Cheat/modules/models/Task.ts | 0 .../Anti-Cheat/modules/pages/import.ts | 0 .../plugins/Anti-Cheat/modules/pages/see.ts | 0 .../Anti-Cheat/modules/protections/cbe.ts | 0 .../Anti-Cheat/modules/protections/crasher.ts | 0 .../modules/protections/gamemode.ts | 0 .../Anti-Cheat/modules/protections/import.ts | 0 .../modules/protections/movement.ts | 0 .../Anti-Cheat/modules/protections/nbt.ts | 0 .../Anti-Cheat/modules/protections/nuker.ts | 0 .../Anti-Cheat/modules/protections/spam.ts | 0 .../modules/protections/unobtainable.ts | 0 .../src}/plugins/Anti-Cheat/protections.ts | 0 .../src}/plugins/Anti-Cheat/utils.ts | 0 .../src}/plugins/ChatRanks/index.ts | 0 .../src}/plugins/GlobalBans/index.ts | 0 .../src}/plugins/GlobalBans/list.ts | 0 {src => project/src}/plugins/import.ts | 0 {src => project/src}/types.ts | 0 {src => project/src}/utils.ts | 0 {texts => project/texts}/bg_BG.lang | 0 {texts => project/texts}/cs_CZ.lang | 0 {texts => project/texts}/da_DK.lang | 0 {texts => project/texts}/de_DE.lang | 0 {texts => project/texts}/el_GR.lang | 0 {texts => project/texts}/en_GB.lang | 0 {texts => project/texts}/en_US.lang | 0 {texts => project/texts}/es_ES.lang | 0 {texts => project/texts}/es_MX.lang | 0 {texts => project/texts}/fi_FI.lang | 0 {texts => project/texts}/fr_CA.lang | 0 {texts => project/texts}/fr_FR.lang | 0 {texts => project/texts}/hu_HU.lang | 0 {texts => project/texts}/id_ID.lang | 0 {texts => project/texts}/it_IT.lang | 0 {texts => project/texts}/ja_JP.lang | 0 {texts => project/texts}/ko_KR.lang | 0 {texts => project/texts}/language_names.json | 0 {texts => project/texts}/languages.json | 0 {texts => project/texts}/nb_NO.lang | 0 {texts => project/texts}/nl_NL.lang | 0 {texts => project/texts}/pl_PL.lang | 0 {texts => project/texts}/pt_BR.lang | 0 {texts => project/texts}/pt_PT.lang | 0 {texts => project/texts}/ru_RU.lang | 0 {texts => project/texts}/sk_SK.lang | 0 {texts => project/texts}/sv_SE.lang | 0 {texts => project/texts}/tr_TR.lang | 0 {texts => project/texts}/uk_UA.lang | 0 {texts => project/texts}/zh_CN.lang | 0 {texts => project/texts}/zh_TW.lang | 0 scripts/index.js.map | 7 - tsconfig.json | 6 +- 165 files changed, 1672 insertions(+), 4787 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 changelog.md rename {animation_controllers => project/animation_controllers}/digging.json (100%) rename {animation_controllers => project/animation_controllers}/eating.json (100%) rename {animation_controllers => project/animation_controllers}/gliding.json (100%) rename {animation_controllers => project/animation_controllers}/ground.json (100%) rename {animation_controllers => project/animation_controllers}/jumping.json (100%) rename {animation_controllers => project/animation_controllers}/levitating.json (100%) rename {animation_controllers => project/animation_controllers}/moving.json (100%) rename {animation_controllers => project/animation_controllers}/riding.json (100%) rename {animation_controllers => project/animation_controllers}/sneaking.json (100%) rename {animation_controllers => project/animation_controllers}/swimming.json (100%) rename {animation_controllers => project/animation_controllers}/using_item.json (100%) rename {entities => project/entities}/chest_boat.json (100%) rename {entities => project/entities}/command_block_minecart.json (100%) rename {entities => project/entities}/database.json (100%) rename {entities => project/entities}/inventory.json (100%) rename {entities => project/entities}/npc.json (100%) rename {entities => project/entities}/player.json (100%) rename {functions => project/functions}/start.mcfunction (100%) rename {items => project/items}/gui.item.json (100%) rename manifest.json => project/manifest.json (100%) rename pack_icon.png => project/pack_icon.png (100%) rename {scripts => project/scripts}/index.js (99%) rename {src => project/src}/config/app.ts (100%) rename {src => project/src}/config/chest.ts (100%) rename {src => project/src}/config/commands.ts (100%) rename {src => project/src}/config/database.ts (100%) rename {src => project/src}/config/form.ts (100%) rename {src => project/src}/config/objectives.ts (100%) rename {src => project/src}/database/Database.ts (100%) rename {src => project/src}/database/index.ts (100%) rename {src => project/src}/database/tables.ts (100%) rename {src => project/src}/index.ts (100%) rename {src => project/src}/lang/emoji.ts (100%) rename {src => project/src}/lang/profanity.ts (100%) rename {src => project/src}/lang/text.ts (100%) rename {src => project/src}/lib/Chest GUI/Models/EntityChest.ts (100%) rename {src => project/src}/lib/Chest GUI/Models/FillTypes.ts (100%) rename {src => project/src}/lib/Chest GUI/Models/ItemGrabbedCallback.ts (100%) rename {src => project/src}/lib/Chest GUI/Models/Page.ts (100%) rename {src => project/src}/lib/Chest GUI/Models/PageItem.ts (100%) rename {src => project/src}/lib/Chest GUI/database/Item.ts (100%) rename {src => project/src}/lib/Chest GUI/index.ts (100%) rename {src => project/src}/lib/Chest GUI/pages/home.ts (100%) rename {src => project/src}/lib/Chest GUI/utils.ts (100%) rename {src => project/src}/lib/Command/ArgumentTypes.ts (100%) rename {src => project/src}/lib/Command/Callback.ts (100%) rename {src => project/src}/lib/Command/Command.ts (100%) rename {src => project/src}/lib/Command/index.ts (100%) rename {src => project/src}/lib/Command/types.d.ts (100%) rename {src => project/src}/lib/Command/utils.ts (100%) rename {src => project/src}/lib/Events/EntitiesLoad.ts (100%) rename {src => project/src}/lib/Events/beforeBlockBreak.ts (100%) rename {src => project/src}/lib/Events/beforeChat.ts (100%) rename {src => project/src}/lib/Events/onPlayerMove.ts (100%) rename {src => project/src}/lib/Events/onSlotChange.ts (100%) rename {src => project/src}/lib/Form/Models/ActionForm.ts (100%) rename {src => project/src}/lib/Form/Models/FormCallback.ts (100%) rename {src => project/src}/lib/Form/Models/MessageForm.ts (100%) rename {src => project/src}/lib/Form/Models/ModelForm.ts (100%) rename {src => project/src}/lib/Form/types.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/config/enchantments.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/config/moderation.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/config/movement.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/config/region.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/index.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/ban.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/database.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/ecwipe.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/freeze.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/help.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/import.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/kick.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/lockdown.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/log.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/mute.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/npc.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/ping.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/region.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/role.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/settings.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/teleport.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/vanish.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/commands/version.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/events/import.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/events/playerJoin.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/events/worldInitialize.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/forms/automod.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/forms/home.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/forms/settings.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/ban.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/containers.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/freeze.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/import.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/mute.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/managers/region.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Ban.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/BlockInventory.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Freeze.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Log.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Mute.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Npc.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/PlayerLog.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/PreviousLocation.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Protection.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Region.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/models/Task.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/pages/import.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/pages/see.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/cbe.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/crasher.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/gamemode.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/import.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/movement.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/nbt.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/nuker.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/spam.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/modules/protections/unobtainable.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/protections.ts (100%) rename {src => project/src}/plugins/Anti-Cheat/utils.ts (100%) rename {src => project/src}/plugins/ChatRanks/index.ts (100%) rename {src => project/src}/plugins/GlobalBans/index.ts (100%) rename {src => project/src}/plugins/GlobalBans/list.ts (100%) rename {src => project/src}/plugins/import.ts (100%) rename {src => project/src}/types.ts (100%) rename {src => project/src}/utils.ts (100%) rename {texts => project/texts}/bg_BG.lang (100%) rename {texts => project/texts}/cs_CZ.lang (100%) rename {texts => project/texts}/da_DK.lang (100%) rename {texts => project/texts}/de_DE.lang (100%) rename {texts => project/texts}/el_GR.lang (100%) rename {texts => project/texts}/en_GB.lang (100%) rename {texts => project/texts}/en_US.lang (100%) rename {texts => project/texts}/es_ES.lang (100%) rename {texts => project/texts}/es_MX.lang (100%) rename {texts => project/texts}/fi_FI.lang (100%) rename {texts => project/texts}/fr_CA.lang (100%) rename {texts => project/texts}/fr_FR.lang (100%) rename {texts => project/texts}/hu_HU.lang (100%) rename {texts => project/texts}/id_ID.lang (100%) rename {texts => project/texts}/it_IT.lang (100%) rename {texts => project/texts}/ja_JP.lang (100%) rename {texts => project/texts}/ko_KR.lang (100%) rename {texts => project/texts}/language_names.json (100%) rename {texts => project/texts}/languages.json (100%) rename {texts => project/texts}/nb_NO.lang (100%) rename {texts => project/texts}/nl_NL.lang (100%) rename {texts => project/texts}/pl_PL.lang (100%) rename {texts => project/texts}/pt_BR.lang (100%) rename {texts => project/texts}/pt_PT.lang (100%) rename {texts => project/texts}/ru_RU.lang (100%) rename {texts => project/texts}/sk_SK.lang (100%) rename {texts => project/texts}/sv_SE.lang (100%) rename {texts => project/texts}/tr_TR.lang (100%) rename {texts => project/texts}/uk_UA.lang (100%) rename {texts => project/texts}/zh_CN.lang (100%) rename {texts => project/texts}/zh_TW.lang (100%) delete mode 100644 scripts/index.js.map diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9dc797f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +on: + push + +name: Create Release + +jobs: + build: + name: Create Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@master + with: + node-version: 16.17.0 + + - name: Install Packages & Run Script + run: npm run build + + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: dist/*.mcpack \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5d0b5d0..a96af46 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ build.js scripts/* !scripts/index.js -!scripts/index.js.map \ No newline at end of file +dist \ No newline at end of file diff --git a/build.js b/build.js index efcb811..dd35896 100644 --- a/build.js +++ b/build.js @@ -1,33 +1,59 @@ +const archiver = require("archiver"); +const fs = require("fs-extra"); const esbuild = require("esbuild"); -const fsExtra = require("fs-extra"); +const path = require("path"); const isDev = process.argv[2] === "dev"; -const dir = "./scripts"; +const ver = JSON.parse( + fs.readFileSync(path.join(__dirname, "package.json")) +)?.version; +// const devDir = path?.join( +// process.env.USERPROFILE, +// "/AppData/Local/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang/development_behavior_packs/" +// ) || ""; -if (!fsExtra.existsSync(dir)) { - fsExtra.mkdirSync(dir); +esbuild + .build({ + entryPoints: ["project/src/index.ts"], + bundle: true, + outfile: "project/scripts/index.js", + minify: !isDev, + platform: "neutral", + watch: isDev, + external: [ + "@minecraft/server", + "@minecraft/server-ui", + "@minecraft/server-net", + "@minecraft/server-admin", + ], + legalComments: isDev ? "none" : "none", + }) + .then(() => { + console.log( + `\x1b[33m%s\x1b[0m`, + `[${new Date().toLocaleTimeString()}]`, + `Built for ${isDev ? "development" : "production"}...` + ); + + if (!isDev) { + const distDir = path.join(__dirname, "dist"); + buildPack(path.join(__dirname,"project"),distDir); + } + }); + +function buildPack(target,destination) { + if (!fs.existsSync(destination)) { + fs.mkdirSync(destination); + } + + const output = fs.createWriteStream(path.join(destination, ver + ".mcpack")); + const archive = archiver("zip", { + zlib: { level: 9 }, // Sets the compression level. + }); + + archive.pipe(output); + + archive.directory(target, false) + + archive.finalize(); } -fsExtra.emptyDirSync(dir); - -esbuild.build({ - entryPoints: ["src/index.ts"], - bundle: true, - outfile: "scripts/index.js", - minify: !isDev, - platform: "neutral", - sourcemap: true, - watch: isDev, - external: [ - "@minecraft/server", - "@minecraft/server-ui", - "@minecraft/server-net", - "@minecraft/server-admin", - ], - legalComments: isDev ? "none" : "none", -}).then((r) => { - console.log( - `\x1b[33m%s\x1b[0m`, - `[${new Date().toLocaleTimeString()}]`, - `Built for ${isDev ? "development" : "production"}...` - ); -}) diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index 6a37f17..45d8af2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,11 @@ "dependencies": { "@minecraft/server": "^1.1.0-beta.preview.1.19.50.24", "@minecraft/server-ui": "^1.0.0-beta.preview.1.19.50.24", + "archiver": "^5.3.1", "esbuild": "^0.15.9", "fs-extra": "^10.1.0", "i": "^0.3.7", - "javascript-obfuscator": "^4.0.0", - "npm": "^8.19.2" + "javascript-obfuscator": "^4.0.0" } }, "node_modules/@esbuild/android-arm": { @@ -116,6 +116,70 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", @@ -151,6 +215,11 @@ "util": "^0.12.0" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -167,6 +236,35 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -176,6 +274,37 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -262,11 +391,53 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -295,6 +466,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -766,6 +945,11 @@ "is-callable": "^1.1.3" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -779,6 +963,11 @@ "node": ">=12" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -837,6 +1026,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -913,6 +1121,34 @@ "node": ">=0.4" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1144,6 +1380,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/javascript-obfuscator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.0.0.tgz", @@ -1204,6 +1445,44 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -1221,6 +1500,31 @@ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz", "integrity": "sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -1271,5027 +1575,1468 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm": { - "version": "8.19.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.2.tgz", - "integrity": "sha512-MWkISVv5f7iZbfNkry5/5YBqSYJEDAKSJdL+uzSQuyLg+hgLQUyZynu3SH6bOZlvR9ZvJYk2EiJO6B1r+ynwHg==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.2", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/promise-spawn": "*", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "*", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.1.0", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.13", - "libnpmfund": "^3.0.4", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "*", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.2", - "inBundle": true, - "license": "ISC", + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "wrappy": "1" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" } }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "node_modules/prelude-ls": { "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.6.0" } }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "minimatch": "^5.1.0" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dependencies": { - "json-parse-even-better-errors": "^2.3.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dependencies": { - "infer-owner": "^1.0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, - "engines": { - "node": ">= 8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dependencies": { + "char-regex": "^1.0.2" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "color-convert": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "prelude-ls": "~1.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { - "balanced-match": "^1.0.0" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "engines": { + "node": ">= 0.10" } }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "dependencies": { - "ip-regex": "^4.1.0" + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">= 10" } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", + "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", + "optional": true }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" + "@esbuild/linux-loong64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", + "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", + "optional": true + }, + "@javascript-obfuscator/escodegen": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", + "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", + "requires": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" } }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==" + }, + "@minecraft/server": { + "version": "1.1.0-beta.preview.1.19.50.24", + "resolved": "https://registry.npmjs.org/@minecraft/server/-/server-1.1.0-beta.preview.1.19.50.24.tgz", + "integrity": "sha512-nJjFYzOjdR5RpPj7q02dTudcimh5+w3gxw0NMjOgDTp2SE8tmoFU/xNcbf2E9Puo4v6NLZHBeOkTEhdaRVgpDw==" + }, + "@minecraft/server-ui": { + "version": "1.0.0-beta.preview.1.19.50.24", + "resolved": "https://registry.npmjs.org/@minecraft/server-ui/-/server-ui-1.0.0-beta.preview.1.19.50.24.tgz", + "integrity": "sha512-wiPeEP+tDmU4oSg8jRjgd70Qw9kQYpWF1VAbgkbRk5BdOs5qTXIws4UXJ5T53y6XR4GsL0o2heKfrpQ2xC/Fcw==", + "requires": { + "@minecraft/server": "1.1.0-beta.preview.1.19.50.24" } }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" } }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" } }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, - "engines": { - "node": ">=7.0.0" + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, - "node_modules/npm/node_modules/depd": { + "buffer-from": { "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" + "chance": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.8.tgz", + "integrity": "sha512-v7fi5Hj2VbR6dJEGRWLmJBA83LJMS47pkAbmROFxHWd9qmE1esHRZW8Clf1Fhzr3rjxnNZVCjOEv/ivFxeIMtg==" + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "class-validator": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", + "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "requires": { + "libphonenumber-js": "^1.9.43", + "validator": "^13.7.0" } }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT" + "commander": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" } }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" } }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.0", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, - "node_modules/npm/node_modules/humanize-ms": { + "es-to-primitive": { "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "esbuild": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", + "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", + "requires": { + "@esbuild/android-arm": "0.15.12", + "@esbuild/linux-loong64": "0.15.12", + "esbuild-android-64": "0.15.12", + "esbuild-android-arm64": "0.15.12", + "esbuild-darwin-64": "0.15.12", + "esbuild-darwin-arm64": "0.15.12", + "esbuild-freebsd-64": "0.15.12", + "esbuild-freebsd-arm64": "0.15.12", + "esbuild-linux-32": "0.15.12", + "esbuild-linux-64": "0.15.12", + "esbuild-linux-arm": "0.15.12", + "esbuild-linux-arm64": "0.15.12", + "esbuild-linux-mips64le": "0.15.12", + "esbuild-linux-ppc64le": "0.15.12", + "esbuild-linux-riscv64": "0.15.12", + "esbuild-linux-s390x": "0.15.12", + "esbuild-netbsd-64": "0.15.12", + "esbuild-openbsd-64": "0.15.12", + "esbuild-sunos-64": "0.15.12", + "esbuild-windows-32": "0.15.12", + "esbuild-windows-64": "0.15.12", + "esbuild-windows-arm64": "0.15.12" } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } + "esbuild-android-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", + "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", + "optional": true }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "esbuild-android-arm64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", + "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", + "optional": true }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" + "esbuild-darwin-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", + "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", + "optional": true }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "esbuild-darwin-arm64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", + "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", + "optional": true }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" + "esbuild-freebsd-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", + "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", + "optional": true }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-freebsd-arm64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", + "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", + "optional": true }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-linux-32": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", + "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", + "optional": true }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" + "esbuild-linux-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", + "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", + "optional": true }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "esbuild-linux-arm": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", + "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", + "optional": true }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } + "esbuild-linux-arm64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", + "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", + "optional": true }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "esbuild-linux-mips64le": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", + "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", + "optional": true }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "esbuild-linux-ppc64le": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", + "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", + "optional": true }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" + "esbuild-linux-riscv64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", + "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", + "optional": true }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" + "esbuild-linux-s390x": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", + "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", + "optional": true }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" + "esbuild-netbsd-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", + "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", + "optional": true }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "esbuild-openbsd-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", + "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", + "optional": true }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-sunos-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", + "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", + "optional": true }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-windows-32": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", + "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", + "optional": true }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.13", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.6.2", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-windows-64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", + "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", + "optional": true }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.6.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esbuild-windows-arm64": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", + "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", + "optional": true }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==" }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" } }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==" }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "inversify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", + "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" } }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" } }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.4" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "bin": { - "opencollective-postinstall": "index.js" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringz": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", - "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", - "dependencies": { - "char-regex": "^1.0.2" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - } - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", - "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", - "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", - "optional": true - }, - "@javascript-obfuscator/escodegen": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", - "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", - "requires": { - "@javascript-obfuscator/estraverse": "^5.3.0", - "esprima": "^4.0.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "@javascript-obfuscator/estraverse": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", - "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==" - }, - "@minecraft/server": { - "version": "1.1.0-beta.preview.1.19.50.24", - "resolved": "https://registry.npmjs.org/@minecraft/server/-/server-1.1.0-beta.preview.1.19.50.24.tgz", - "integrity": "sha512-nJjFYzOjdR5RpPj7q02dTudcimh5+w3gxw0NMjOgDTp2SE8tmoFU/xNcbf2E9Puo4v6NLZHBeOkTEhdaRVgpDw==" - }, - "@minecraft/server-ui": { - "version": "1.0.0-beta.preview.1.19.50.24", - "resolved": "https://registry.npmjs.org/@minecraft/server-ui/-/server-ui-1.0.0-beta.preview.1.19.50.24.tgz", - "integrity": "sha512-wiPeEP+tDmU4oSg8jRjgd70Qw9kQYpWF1VAbgkbRk5BdOs5qTXIws4UXJ5T53y6XR4GsL0o2heKfrpQ2xC/Fcw==", - "requires": { - "@minecraft/server": "1.1.0-beta.preview.1.19.50.24" - } - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chance": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.8.tgz", - "integrity": "sha512-v7fi5Hj2VbR6dJEGRWLmJBA83LJMS47pkAbmROFxHWd9qmE1esHRZW8Clf1Fhzr3rjxnNZVCjOEv/ivFxeIMtg==" - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" - }, - "class-validator": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", - "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", - "requires": { - "libphonenumber-js": "^1.9.43", - "validator": "^13.7.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "commander": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", - "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" - }, - "esbuild": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", - "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", - "requires": { - "@esbuild/android-arm": "0.15.12", - "@esbuild/linux-loong64": "0.15.12", - "esbuild-android-64": "0.15.12", - "esbuild-android-arm64": "0.15.12", - "esbuild-darwin-64": "0.15.12", - "esbuild-darwin-arm64": "0.15.12", - "esbuild-freebsd-64": "0.15.12", - "esbuild-freebsd-arm64": "0.15.12", - "esbuild-linux-32": "0.15.12", - "esbuild-linux-64": "0.15.12", - "esbuild-linux-arm": "0.15.12", - "esbuild-linux-arm64": "0.15.12", - "esbuild-linux-mips64le": "0.15.12", - "esbuild-linux-ppc64le": "0.15.12", - "esbuild-linux-riscv64": "0.15.12", - "esbuild-linux-s390x": "0.15.12", - "esbuild-netbsd-64": "0.15.12", - "esbuild-openbsd-64": "0.15.12", - "esbuild-sunos-64": "0.15.12", - "esbuild-windows-32": "0.15.12", - "esbuild-windows-64": "0.15.12", - "esbuild-windows-arm64": "0.15.12" - } - }, - "esbuild-android-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", - "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", - "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", - "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", - "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", - "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", - "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", - "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", - "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", - "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", - "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", - "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", - "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", - "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", - "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", - "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", - "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", - "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", - "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", - "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", - "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", - "optional": true - }, - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "i": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", - "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "inversify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", - "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "javascript-obfuscator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.0.0.tgz", - "integrity": "sha512-vS/8w/9eKISzwXNLd+OLMCCwjD+dFMdOlCDOo919iR/MWdBs+7u1ybpwRoWOmODToPQKVYw5GasvZoIiPs5nPw==", - "requires": { - "@javascript-obfuscator/escodegen": "2.3.0", - "@javascript-obfuscator/estraverse": "5.4.0", - "acorn": "8.7.0", - "assert": "2.0.0", - "chalk": "4.1.2", - "chance": "1.1.8", - "class-validator": "0.13.2", - "commander": "9.0.0", - "eslint-scope": "7.1.0", - "eslint-visitor-keys": "3.2.0", - "fast-deep-equal": "3.1.3", - "inversify": "6.0.1", - "js-string-escape": "1.0.1", - "md5": "2.3.0", - "mkdirp": "1.0.4", - "multimatch": "5.0.0", - "opencollective-postinstall": "2.0.3", - "process": "0.11.10", - "reflect-metadata": "0.1.13", - "source-map-support": "0.5.21", - "string-template": "1.0.0", - "stringz": "2.1.0", - "tslib": "2.3.1" - } - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "libphonenumber-js": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz", - "integrity": "sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw==" - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - } - }, - "npm": { - "version": "8.19.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.2.tgz", - "integrity": "sha512-MWkISVv5f7iZbfNkry5/5YBqSYJEDAKSJdL+uzSQuyLg+hgLQUyZynu3SH6bOZlvR9ZvJYk2EiJO6B1r+ynwHg==", - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.2", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/promise-spawn": "*", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "*", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.1.0", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.13", - "libnpmfund": "^3.0.4", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "*", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true - }, - "@npmcli/arborist": { - "version": "5.6.2", - "bundled": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/ci-detect": { - "version": "2.0.0", - "bundled": true - }, - "@npmcli/config": { - "version": "4.2.2", - "bundled": true, - "requires": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "2.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "2.1.2", - "bundled": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "3.0.2", - "bundled": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "bundled": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "npm-bundled": { - "version": "1.1.2", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - } - } - }, - "@npmcli/map-workspaces": { - "version": "2.0.4", - "bundled": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - } - }, - "@npmcli/metavuln-calculator": { - "version": "3.1.1", - "bundled": true, - "requires": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "bundled": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "bundled": true - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "bundled": true - }, - "@npmcli/package-json": { - "version": "2.0.0", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "bundled": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/query": { - "version": "1.2.0", - "bundled": true, - "requires": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - } - }, - "@npmcli/run-script": { - "version": "4.2.1", - "bundled": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "bundled": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "bin-links": { - "version": "3.0.3", - "bundled": true, - "requires": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true - } - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "16.1.3", - "bundled": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.2", - "bundled": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true - }, - "cmd-shim": { - "version": "5.0.0", - "bundled": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "cssesc": { - "version": "3.0.0", - "bundled": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "depd": { - "version": "1.1.2", - "bundled": true - }, - "dezalgo": { - "version": "1.0.4", - "bundled": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.1.0", - "bundled": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "bundled": true - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "8.0.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "bundled": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "bundled": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore-walk": { - "version": "5.0.1", - "bundled": true, - "requires": { - "minimatch": "^5.0.1" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "3.0.1", - "bundled": true - }, - "init-package-json": { - "version": "3.0.2", - "bundled": true, - "requires": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.10.0", - "bundled": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "bundled": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "just-diff": { - "version": "5.1.1", - "bundled": true - }, - "just-diff-apply": { - "version": "5.4.1", - "bundled": true - }, - "libnpmaccess": { - "version": "6.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmdiff": { - "version": "4.0.5", - "bundled": true, - "requires": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - } - }, - "libnpmexec": { - "version": "4.0.13", - "bundled": true, - "requires": { - "@npmcli/arborist": "^5.6.2", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "3.0.4", - "bundled": true, - "requires": { - "@npmcli/arborist": "^5.6.2" - } - }, - "libnpmhook": { - "version": "8.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmorg": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmpack": { - "version": "4.1.3", - "bundled": true, - "requires": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - } - }, - "libnpmpublish": { - "version": "6.0.5", - "bundled": true, - "requires": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - } - }, - "libnpmsearch": { - "version": "5.0.4", - "bundled": true, - "requires": { - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmteam": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmversion": { - "version": "3.0.7", - "bundled": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.13.2", - "bundled": true - }, - "make-fetch-happen": { - "version": "10.2.1", - "bundled": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "bundled": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.3.4", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.1", - "bundled": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "ms": { - "version": "2.1.3", - "bundled": true - }, - "mute-stream": { - "version": "0.0.8", - "bundled": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true - }, - "node-gyp": { - "version": "9.1.0", - "bundled": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "nopt": { - "version": "5.0.0", - "bundled": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "normalize-package-data": { - "version": "4.0.1", - "bundled": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "3.0.0", - "bundled": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "2.0.1", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true - } - } - }, - "npm-install-checks": { - "version": "5.0.0", - "bundled": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true - }, - "npm-package-arg": { - "version": "9.1.0", - "bundled": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - }, - "npm-packlist": { - "version": "5.1.3", - "bundled": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true - } - } - }, - "npm-pick-manifest": { - "version": "7.0.2", - "bundled": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true - } - } - }, - "npm-profile": { - "version": "6.2.1", - "bundled": true, - "requires": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-registry-fetch": { - "version": "13.3.1", - "bundled": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.1", - "bundled": true - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "bundled": true - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "13.6.2", - "bundled": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "2.0.2", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "postcss-selector-parser": { - "version": "6.0.10", - "bundled": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "2.0.1", - "bundled": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "requires": { - "read": "1" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "3.0.0", - "bundled": true - }, - "read-package-json": { - "version": "5.0.2", - "bundled": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true - } - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "javascript-obfuscator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.0.0.tgz", + "integrity": "sha512-vS/8w/9eKISzwXNLd+OLMCCwjD+dFMdOlCDOo919iR/MWdBs+7u1ybpwRoWOmODToPQKVYw5GasvZoIiPs5nPw==", + "requires": { + "@javascript-obfuscator/escodegen": "2.3.0", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.7.0", + "assert": "2.0.0", + "chalk": "4.1.2", + "chance": "1.1.8", + "class-validator": "0.13.2", + "commander": "9.0.0", + "eslint-scope": "7.1.0", + "eslint-visitor-keys": "3.2.0", + "fast-deep-equal": "3.1.3", + "inversify": "6.0.1", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "1.0.4", + "multimatch": "5.0.0", + "opencollective-postinstall": "2.0.3", + "process": "0.11.10", + "reflect-metadata": "0.1.13", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.3.1" + } + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { "readable-stream": { - "version": "3.6.0", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "bundled": true, + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { - "version": "5.2.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "semver": { - "version": "7.3.7", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true - }, - "socks": { - "version": "2.7.0", - "bundled": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.4" - } - }, - "spdx-correct": { - "version": "3.1.1", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "bundled": true - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "requires": { - "minipass": "^3.1.1" - } + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.11", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true - }, - "treeverse": { - "version": "2.0.0", - "bundled": true - }, - "unique-filename": { - "version": "2.0.1", - "bundled": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "4.0.0", - "bundled": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "4.0.2", - "bundled": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "safe-buffer": "~5.1.0" } - }, - "yallist": { - "version": "4.0.0", - "bundled": true } } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libphonenumber-js": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz", + "integrity": "sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -6322,6 +3067,14 @@ "object-keys": "^1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, "opencollective-postinstall": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", @@ -6340,6 +3093,11 @@ "word-wrap": "~1.2.3" } }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6350,6 +3108,47 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -6365,6 +3164,11 @@ "functions-have-names": "^1.2.2" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -6399,6 +3203,14 @@ "source-map": "^0.6.0" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-template": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", @@ -6440,6 +3252,18 @@ "has-flag": "^4.0.0" } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -6481,6 +3305,11 @@ "which-typed-array": "^1.1.2" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -6515,6 +3344,21 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } } } } diff --git a/package.json b/package.json index 633030a..b64b5ea 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,4 @@ { - "dependencies": { - "@minecraft/server": "^1.1.0-beta.preview.1.19.50.24", - "@minecraft/server-ui": "^1.0.0-beta.preview.1.19.50.24", - "esbuild": "^0.15.9", - "fs-extra": "^10.1.0", - "i": "^0.3.7", - "javascript-obfuscator": "^4.0.0", - "npm": "^8.19.2" - }, "name": "rubedo", "description": "Welcome to Rubedo, Rubedo is a brand new Anti-cheat designed for Realms, Servers, Worlds and anyone who wants to protect there worlds from Hackers! Rubedo Uses Minecraft's Most advanced functionality so that includes Gametest.", "version": "2.6.4-beta", @@ -20,11 +11,18 @@ "build": "node build.js", "dev": "node build.js dev" }, - "keywords": [], - "author": "", "license": "ISC", "bugs": { "url": "https://github.com/smell-of-curry/rubedo/issues" }, - "homepage": "https://github.com/smell-of-curry/rubedo#readme" + "homepage": "https://github.com/smell-of-curry/rubedo#readme", + "dependencies": { + "@minecraft/server": "^1.1.0-beta.preview.1.19.50.24", + "@minecraft/server-ui": "^1.0.0-beta.preview.1.19.50.24", + "archiver": "^5.3.1", + "esbuild": "^0.15.9", + "fs-extra": "^10.1.0", + "i": "^0.3.7", + "javascript-obfuscator": "^4.0.0" + } } diff --git a/animation_controllers/digging.json b/project/animation_controllers/digging.json similarity index 100% rename from animation_controllers/digging.json rename to project/animation_controllers/digging.json diff --git a/animation_controllers/eating.json b/project/animation_controllers/eating.json similarity index 100% rename from animation_controllers/eating.json rename to project/animation_controllers/eating.json diff --git a/animation_controllers/gliding.json b/project/animation_controllers/gliding.json similarity index 100% rename from animation_controllers/gliding.json rename to project/animation_controllers/gliding.json diff --git a/animation_controllers/ground.json b/project/animation_controllers/ground.json similarity index 100% rename from animation_controllers/ground.json rename to project/animation_controllers/ground.json diff --git a/animation_controllers/jumping.json b/project/animation_controllers/jumping.json similarity index 100% rename from animation_controllers/jumping.json rename to project/animation_controllers/jumping.json diff --git a/animation_controllers/levitating.json b/project/animation_controllers/levitating.json similarity index 100% rename from animation_controllers/levitating.json rename to project/animation_controllers/levitating.json diff --git a/animation_controllers/moving.json b/project/animation_controllers/moving.json similarity index 100% rename from animation_controllers/moving.json rename to project/animation_controllers/moving.json diff --git a/animation_controllers/riding.json b/project/animation_controllers/riding.json similarity index 100% rename from animation_controllers/riding.json rename to project/animation_controllers/riding.json diff --git a/animation_controllers/sneaking.json b/project/animation_controllers/sneaking.json similarity index 100% rename from animation_controllers/sneaking.json rename to project/animation_controllers/sneaking.json diff --git a/animation_controllers/swimming.json b/project/animation_controllers/swimming.json similarity index 100% rename from animation_controllers/swimming.json rename to project/animation_controllers/swimming.json diff --git a/animation_controllers/using_item.json b/project/animation_controllers/using_item.json similarity index 100% rename from animation_controllers/using_item.json rename to project/animation_controllers/using_item.json diff --git a/entities/chest_boat.json b/project/entities/chest_boat.json similarity index 100% rename from entities/chest_boat.json rename to project/entities/chest_boat.json diff --git a/entities/command_block_minecart.json b/project/entities/command_block_minecart.json similarity index 100% rename from entities/command_block_minecart.json rename to project/entities/command_block_minecart.json diff --git a/entities/database.json b/project/entities/database.json similarity index 100% rename from entities/database.json rename to project/entities/database.json diff --git a/entities/inventory.json b/project/entities/inventory.json similarity index 100% rename from entities/inventory.json rename to project/entities/inventory.json diff --git a/entities/npc.json b/project/entities/npc.json similarity index 100% rename from entities/npc.json rename to project/entities/npc.json diff --git a/entities/player.json b/project/entities/player.json similarity index 100% rename from entities/player.json rename to project/entities/player.json diff --git a/functions/start.mcfunction b/project/functions/start.mcfunction similarity index 100% rename from functions/start.mcfunction rename to project/functions/start.mcfunction diff --git a/items/gui.item.json b/project/items/gui.item.json similarity index 100% rename from items/gui.item.json rename to project/items/gui.item.json diff --git a/manifest.json b/project/manifest.json similarity index 100% rename from manifest.json rename to project/manifest.json diff --git a/pack_icon.png b/project/pack_icon.png similarity index 100% rename from pack_icon.png rename to project/pack_icon.png diff --git a/scripts/index.js b/project/scripts/index.js similarity index 99% rename from scripts/index.js rename to project/scripts/index.js index 062b265..079378d 100644 --- a/scripts/index.js +++ b/project/scripts/index.js @@ -1,4 +1,3 @@ import{ItemStack as Tr,MinecraftItemTypes as Pr,system as Ar}from"@minecraft/server";import{world as co}from"@minecraft/server";var T="-";import{world as so}from"@minecraft/server";import{ItemStack as _t,MinecraftItemTypes as Ot}from"@minecraft/server";import{BlockLocation as oo}from"@minecraft/server";var Pt=32e3,ae="rubedo:database",B=new oo(0,-64,0),At=128;import{system as Dt,world as Lt}from"@minecraft/server";import{BlockLocation as Ue,MinecraftDimensionTypes as ee,system as xt,world as te}from"@minecraft/server";import{MessageFormData as ro}from"@minecraft/server-ui";var Z=class{constructor(e,n){this.title=e,this.body=n,this.form=new ro,e&&this.form.title(e),n&&this.form.body(n),this.triedToShow=0}setButton1(e,n){return this.button1={text:e,callback:n},this.form.button1(e),this}setButton2(e,n){return this.button2={text:e,callback:n},this.form.button2(e),this}show(e){this.form.show(e).then(n=>{if(n.canceled){if(n.cancelationReason=="userBusy"){if(this.triedToShow>200)return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)");this.triedToShow++,this.show(e)}return}n.selection==1&&this.button1?.callback?.(),n.selection==0&&this.button2?.callback?.()})}};var h={overworld:te.getDimension(ee.overworld),nether:te.getDimension(ee.nether),theEnd:te.getDimension(ee.theEnd),"minecraft:overworld":te.getDimension(ee.overworld),"minecraft:nether":te.getDimension(ee.nether),"minecraft:the_end":te.getDimension(ee.theEnd)};function le(t){let e=t.split(",");console.warn(e.length);let n=0;for(let o of e){let r=parseInt(o.match(/\D+|\d+/g)[0]),i=o.match(/\D+|\d+/g)[1];i=="y"&&(n=n+317098e-16*r),i=="w"&&(n=n+6048e5*r),i=="d"&&(n=n+864e5*r),i=="h"&&(n=n+36e5*r),i=="m"&&(n=n+6e4*r),i=="s"&&(n=n+1e3*r),i=="ms"&&(n=n+r)}return n}function ne(t){return new Date(t).toString()}function Rt(t){return new Ue(Math.floor(t.x),Math.floor(t.y),Math.floor(t.z))}function K(t,e,n,o=()=>{}){new Z("Confirm To Continue",e).setButton1("Confirm",n).setButton2("Never Mind",o).show(t)}function Bt(t){return new Promise(e=>{let n=xt.runSchedule(()=>{e(),xt.clearRunSchedule(n)},t)})}function Nt(t,e){let n=[t.x,t.y,t.z],o=[t.x,t.y,t.z];return(t instanceof Ue||e instanceof Ue)&&(n=n.map(r=>Math.trunc(r)),o=o.map(r=>Math.trunc(r))),!n.find((r,i)=>o[i]!=r)}function io(t,e){let{x:n,y:o,z:r}=t,{x:i,y:s,z:c}=e,l=n=o&&d<=s&&g>=r&&g<=c&&J>=i&&J<=l}function Mt(t,e){return t.match(new RegExp(".{1,"+e+"}","g"))}var H={},Pe=!1;Dt.run(async()=>{try{await h.overworld.runCommandAsync("testfor @a"),Pe=!0;for(let[t,e]of Object.entries(H))e(),delete H[t]}catch{let e=Lt.events.entityCreate.subscribe(n=>{Dt.run(()=>{Pe=!0;for(let[o,r]of Object.entries(H))r(),delete H[o];Lt.events.entityCreate.unsubscribe(e)})})}});var I=class{static async awaitLoad(){if(!Pe)return new Promise(e=>{I.subscribe(e)})}static subscribe(e){if(Pe){e();return}let n=Object.keys(H).length;return H[n]=e,n}static unsubscribe(e){delete H[e]}};var b=class{constructor(e){this.tableName=e;this.tableName=e,this.MEMORY=null,this.QUEUE=[],I.subscribe(async()=>{await this.initData(),this.QUEUE.forEach(n=>n())})}static createTableEntity(e,n){let o=h.overworld.spawnEntity(ae,B);return o.setDynamicProperty("tableName",e),o.nameTag=`\xA7aDatabase Table: ${e}\xA7r`,n&&o.setDynamicProperty("index",n),o}static getTableEntities(e){return h.overworld.getEntitiesAtBlockLocation(B).filter(n=>n.typeId==ae&&n.getDynamicProperty("tableName")==e)}async addQueueTask(){return new Promise(e=>{this.QUEUE.push(e)})}async saveData(){this.MEMORY||await this.addQueueTask();let e=b.getTableEntities(this.tableName),n=Mt(JSON.stringify(this.MEMORY),Pt),o=Math.ceil(n.length/At)-e.length;if(o>0)for(let r=0;rs.size-1)break;let d=new _t(Ot.acaciaBoat);d.nameTag=l,s.setItem(c,d),n[c]=null}for(let c=n.length+1;cc))break}e.filter(r=>r).forEach(r=>r.triggerEvent("despawn"))}async initData(){let e=b.getTableEntities(this.tableName).sort((r,i)=>r.getDynamicProperty("index")-i.getDynamicProperty("index")),n="";for(let r of e){let i=r.getComponent("inventory").container;for(let s=0;se.name===t)}var F=class{constructor(e="literal"){this.name=e;this.typeName="literal";this.name=e}matches(e){return{success:this.name==e}}fail(e){return`${e} should be ${this.name}!`}},me=class{constructor(e="string"){this.name=e;this.typeName="string";this.name=e}matches(e){return{success:e&&e!="",value:e}}fail(e){return"Value must be of type string!"}},ue=class{constructor(e="integer"){this.name=e;this.typeName="int";this.name=e}matches(e){return{success:!isNaN(e),value:parseInt(e)}}fail(e){return"Value must be valid number!"}},qe=class{constructor(e="float"){this.name=e;this.typeName="float";this.name=e}matches(e){return{success:Boolean(e?.match(/^\d+\.\d+$/)?.[0]),value:parseInt(e)}}fail(e){return"Value must be valid float!"}},U=class{constructor(e="location"){this.name=e;this.typeName="location";this.name=e}matches(e){return{success:/^([~^]{0,1}(-\d)?(\d*)?(\.(\d+))?)$/.test(e),value:e}}fail(e){return"Value needs to be a valid number, value can include: [~,^]"}},de=class{constructor(e="boolean"){this.name=e;this.typeName="boolean";this.name=e}matches(e){return{success:Boolean(e?.match(/^(true|false)$/)?.[0]),value:e=="true"}}fail(e){return`"${e}" can be either "true" or "false"`}},We=class{constructor(e="player"){this.name=e;this.typeName="Player";this.name=e}matches(e){return{success:!!$t(e),value:$t(e)}}fail(e){return`player: "${e}", is not in this world`}},Qe=class{constructor(e="target"){this.name=e;this.typeName="Target";this.name=e}matches(e){return{success:Boolean(e?.match(/^(@.|"[\s\S]+")$/)?.[0]),value:e}}fail(e){return`${e} is not a valid target`}},fe=class{constructor(e="array",n){this.name=e;this.types=n;this.typeName="string";this.name=e,this.types=n,this.typeName=n.join(" | ").replace(/(.{25})..+/,"$1...")}matches(e){return{success:this.types.includes(e),value:e}}fail(e){return`"${e}" must be one of these values: ${this.types.join(" | ")}`}},Xe=class{constructor(e){this.name=e;this.typeName="Duration"}matches(e){return{success:/^(\d+[hdysmw],?)+$/.test(e),value:e}}fail(e){return`"${e}" must be a value like "10d" or "3s" the first part is the length second is unit`}},Je=class{constructor(e="playerName"){this.name=e;this.typeName="playerName";this.name=e}matches(e){return{success:!!a.ids.get(e),value:e}}fail(e){return`player: "${e}" has never played this world before! Tip: if the name has spaces in it use quotes around name!`}},p={string:me,int:ue,float:qe,location:U,boolean:de,player:We,target:Qe,array:fe,duration:Xe,playerName:Je};var Ae=class{constructor(e){this.data=e,this.sender=e.sender}reply(e){this.sender.tell(e)}};function Ft(t,e){try{return t.slice(e.length).trim().match(/"[^"]+"|[^\s]+/g).map(n=>n.replace(/"(.+)"/,"$1").toString())}catch{return[]}}function zt(t,e){t.tell({rawtext:[{text:"\xA7c"},{translate:"commands.generic.unknown",with:[`${e}`]}]})}function Ze(t,e){t.tell({rawtext:[{text:e.data.invalidPermission?e.data.invalidPermission:`\xA7cYou do not have permission to use "${e.data.name}"`}]})}function Vt(t,e,n,o,r){if(t.tell({rawtext:[{text:"\xA7c"},{translate:"commands.generic.syntax",with:[`${T}${e.data.name} ${o.slice(0,r).join(" ")}`,o[r]??" ",o.slice(r+1).join(" ")]}]}),n.children.length>1||!o[r]){let i=n.children.map(s=>s.type instanceof F?s.type.name:s.type?.typeName);t.tell(`\xA7c"${o[r]??"undefined"}" is not valid! Argument "${[...new Set(n.children.map(s=>s.type.name))][0]}" can be typeof: "${i.join('", "')}"`)}else t.tell(`\xA7c${n.children[0]?.type?.fail(o[r])}`)}function ao([t,e,n],{location:o,viewVector:r}){if(!t||!e||!t)return null;let i=[o.x,o.y,o.z],s=[r.x,r.y,r.z],c=[t,e,n].map(d=>{let g=parseFloat(d);return isNaN(g)?0:g}),l=[t,e,n].map((d,g)=>d.includes("~")?c[g]+i[g]:d.includes("^")?c[g]+s[g]:c[g]);return{x:l[0],y:l[1],z:l[2]}}function jt(t,e,n,o){let r=e[e.length-1]??o,i=[];for(let[s,c]of e.entries())if(!c.type.name.endsWith("*")){if(c.type instanceof U){i.push(ao([t[s],t[s+1],t[s+2]],n.sender));continue}c.type instanceof F||i.push(c.type.matches(t[s]).value??t[s])}r.callback(new Ae(n),...i)}var q=[];co.events.beforeChat.subscribe(t=>{if(!t.message.startsWith(T))return;t.cancel=!0;let e=Ft(t.message,T),n=q.find(c=>c.depth==0&&(c.data.name==e[0]||c.data?.aliases?.includes(e[0]))),o={message:t.message,sendToTargets:t.sendToTargets,sender:t.sender,targets:t.targets};if(!n)return zt(t.sender,e[0]);if(!n.data?.requires(t.sender))return Ze(o.sender,n);e.shift();let r=[],i=(c,l)=>{if(c.children.length>0){let d=c.children.find(g=>g.type.matches(e[l]).success);return!d&&!e[l]&&c.callback?void 0:d?d.data?.requires(o.sender)?(r.push(d),i(d,l+1)):(Ze(o.sender,d),"fail"):(Vt(o.sender,n,c,e,l),"fail")}};i(n,0)!="fail"&&jt(e,r,o,n)});import{system as fn,world as Io}from"@minecraft/server";var Yt="rubedo:gui",pe="rubedo:inventory";import{world as D,Player as mo,BlockLocation as Zt,MinecraftBlockTypes as uo,GameMode as fo,system as nt}from"@minecraft/server";import{BlockLocation as Ut,MinecraftBlockTypes as lo}from"@minecraft/server";var Gt={doorsAndSwitches:!0,openContainers:!0,pvp:!1,allowedEntities:["minecraft:player","minecraft:npc","minecraft:item","rubedo:inventory","rubedo:database"]},Kt=["minecraft:acacia_door","minecraft:acacia_trapdoor","minecraft:acacia_button","minecraft:birch_door","minecraft:birch_trapdoor","minecraft:birch_button","minecraft:crimson_door","minecraft:crimson_trapdoor","minecraft:crimson_button","minecraft:dark_oak_door","minecraft:dark_oak_trapdoor","minecraft:dark_oak_button","minecraft:jungle_door","minecraft:jungle_trapdoor","minecraft:jungle_button","minecraft:mangrove_door","minecraft:mangrove_trapdoor","minecraft:mangrove_button","minecraft:spruce_door","minecraft:spruce_trapdoor","minecraft:spruce_button","minecraft:warped_door","minecraft:warped_trapdoor","minecraft:warped_button","minecraft:wooden_door","minecraft:wooden_button","minecraft:trapdoor","minecraft:iron_door","minecraft:iron_trapdoor","minecraft:polished_blackstone_button","minecraft:lever"],Ht=["minecraft:chest","minecraft:ender_chest","minecraft:barrel","minecraft:trapped_chest","minecraft:dispenser","minecraft:dropper","minecraft:furnace","minecraft:blast_furnace","minecraft:lit_furnace","minecraft:lit_blast_furnace","minecraft:hopper","minecraft:shulker_box","minecraft:undyed_shulker_box","minecraft:lit_smoker","minecraft:smoker"];var W=[],xe=!1,et=-64,tt=320,y=class{static async getAllRegionsSync(){if(xe)return W;let e=(await a.regions.valuesSync()).map(n=>new y(n.from,n.to,n.dimensionId,n.permissions,n.key));return e.forEach(n=>{W.push(n)}),xe=!0,e}static getAllRegions(){if(xe)return W;let e=a.regions.values().map(n=>new y(n.from,n.to,n.dimensionId,n.permissions,n.key));return e.forEach(n=>{W.push(n)}),xe=!0,e}static blockLocationInRegion(e,n){return this.getAllRegions().find(o=>o.dimensionId==n&&Te(e,{x:o.from.x,y:et,z:o.from.z},{x:o.to.x,y:tt,z:o.to.z}))}static async blockLocationInRegionSync(e,n){return(await this.getAllRegionsSync()).find(o=>o.dimensionId==n&&Te(e,{x:o.from.x,y:et,z:o.from.z},{x:o.to.x,y:tt,z:o.to.z}))}static async removeRegionAtBlockLocation(e,n){let o=this.blockLocationInRegion(e,n);return o?a.regions.delete(o.key):!1}constructor(e,n,o,r,i){this.from=e,this.to=n,this.dimensionId=o,this.permissions=r??Gt,this.key=i||Date.now().toString(),i||this.update().then(()=>{Re(),W.push(this)})}async update(){return a.regions.set(this.key,{key:this.key,from:this.from,dimensionId:this.dimensionId,permissions:this.permissions,to:this.to})}async delete(){let e=a.regions.get(this.key),n=new Ut(e.from.x,e.dimensionId=="minecraft:overworld"?-64:0,e.from.z),o=new Ut(e.to.x,e.dimensionId=="minecraft:overworld"?-64:0,e.to.z);for(let r of n.blocksBetween(o))h[e.dimensionId].getBlock(r)?.setType(lo.bedrock);return W=W.filter(r=>r.key!=this.key),a.regions.delete(this.key)}entityInRegion(e){return this.dimensionId==e.dimension.id&&Te(e.location,{x:this.from.x,y:et,z:this.from.z},{x:this.to.x,y:tt,z:this.to.z})}changePermission(e,n){this.permissions[e]=n,this.update()}};var M=class{static getTasks(){return a.tasks.get("changePlayerRole")??[]}static getPlayersRoleToSet(e){return M.getTasks().find(o=>o.playerName==e)?.role}constructor(e,n){let o=M.getTasks();o.push({playerName:e,role:n}),a.tasks.set("changePlayerRole",o)}};import{MinecraftBlockTypes as ge,MinecraftItemTypes as f}from"@minecraft/server";var qt=[f.beehive.id,f.beeNest.id,f.axolotlBucket.id,f.codBucket.id,f.tadpoleBucket.id,f.tropicalFishBucket.id,f.salmonBucket.id,f.pufferfishBucket.id],Wt=[f.allow.id,f.barrier.id,f.borderBlock.id,f.debugStick?.id??"minecraft:debug_stick",f.deny.id,f.jigsaw.id,f.lightBlock.id,f.commandBlock.id,f.repeatingCommandBlock.id,f.chainCommandBlock.id,f.commandBlockMinecart.id,f.structureBlock.id,f.structureVoid.id,f.bedrock.id,f.endPortalFrame.id,"minecraft:info_update","minecraft:info_update2","minecraft:reserved3","minecraft:reserved4","minecraft:reserved6","minecraft:movingBlock","minecraft:moving_block","minecraft:movingblock","minecraft:piston_arm_collision","minecraft:piston_arm_collision","minecraft:pistonarmcollision","minecraft:stickyPistonArmCollision","minecraft:sticky_piston_arm_collision","minecraft:unknown","minecraft:glowingobsidian","minecraft:invisible_bedrock","minecraft:invisiblebedrock","minecraft:netherreactor","minecraft:portal","minecraft:fire","minecraft:water","minecraft:lava","minecraft:flowing_lava","minecraft:flowing_water","minecraft:soul_fire"],Qt=[ge.dispenser.id],Xt=[ge.bedrock.id,ge.barrier.id,"minecraft:invisiblebedrock","minecraft:movingBlock","minecraft:movingblock","minecraft:moving_block"],Be=[ge.chest.id,ge.trappedChest.id],Ai=[f.chest.id,f.trappedChest.id,f.barrel.id,f.dispenser.id,f.dropper.id,f.furnace.id,"minecraft:lit_furnace",f.blastFurnace.id,"minecraft:lit_blast_furnace",f.smoker.id,"minecraft:lit_smoker",f.hopper.id,f.shulkerBox.id,f.undyedShulkerBox.id],Q={x:7,y:7,z:7};var Ne={aquaAffinity:1,baneOfArthropods:5,binding:1,blastProtection:4,channeling:1,depthStrider:3,efficiency:5,featherFalling:4,fireAspect:2,fireProtection:4,flame:1,fortune:3,frostWalker:2,impaling:5,infinity:1,knockback:2,looting:3,loyalty:4,luckOfTheSea:3,lure:3,mending:1,multishot:1,piercing:4,power:5,projectileProtection:4,protection:4,punch:2,quickCharge:3,respiration:3,riptide:3,sharpness:5,silkTouch:1,smite:5,soulSpeed:3,swiftSneak:4,thorns:3,unbreaking:3,vanishing:1};var Jt="2.6.4-beta";var Me="https://discord.gg/dMa3A5UYKX";function z(t,e=[],n){if(ye(t))return console.warn("[WARNING]: TRIED TO KICK OWNER"),t.tell("You have been tried to kick, but you cant!"),n?.();try{t.runCommandAsync(`kick @s \xA7r${e.join(` `)}`),t.triggerEvent("kick")}catch(o){if(t.triggerEvent("kick"),!/"statusCode":-2147352576/.test(o))return;n&&n()}}function m(t){return t instanceof mo?a.roles.get(t.name)??"member":a.roles.get(t)??"member"}function oe(t,e){if(typeof t=="string"){a.roles.set(t,e);let n=[...D.getPlayers()].find(o=>o.name==t);n?n.setDynamicProperty("role",e):new M(t,e)}else a.roles.set(t.name,e),t.setDynamicProperty("role",e)}function ye(t){return D.getDynamicProperty("worldsOwner")==t.id}function ot(){let t=D.getDynamicProperty("worldsOwner");return!t||t==""?null:t}function tn(){let t=ot();if(!t)return null;let e=a.ids.collection();return Object.keys(e).find(n=>e[n]===t)}function he(t){if(!t)return D.setDynamicProperty("worldsOwner","");D.setDynamicProperty("worldsOwner",t.id.toString())}function De(){return D.getDynamicProperty("isLockDown")??!1}function rt(t){D.setDynamicProperty("isLockDown",t)}function Re(){for(let t of y.getAllRegions()){let e=new Zt(t.from.x,t.dimensionId=="minecraft:overworld"?-64:0,t.from.z),n=new Zt(t.to.x,t.dimensionId=="minecraft:overworld"?-64:0,t.to.z);for(let o of e.blocksBetween(n))h[t.dimensionId].getBlock(o)?.setType(uo.deny)}}var it=[],en=0;function V(t,e=0){let n=en;return it[n]={callback:t,delay:e,lastCall:0},en=n+1,n}function nn(t){delete it[t]}I.subscribe(()=>{nt.runSchedule(()=>{let t=[...D.getPlayers()];for(let[e,n]of t.entries())if(m(n)!="admin")for(let o of Object.values(it))o.delay!=0&&nt.currentTick-o.lastCall[...D.getPlayers({name:t.name,gameMode:e})].length)}import{system as mn}from"@minecraft/server";import{system as po}from"@minecraft/server";var st={},sn={},j={};function go(t,e,n){if(e.length!=n.length)return[];let o=[];for(let r=0;rn[r]?.item?.amount&&e[r]?.item?.amount!=0){let i={slot:r,uid:n[r].uid,oldUid:e[r].uid,item:n[r].item,oldItem:e[r].item,changeType:"fluctuation"};o.push(i),j[t.id]=i;continue}if(n[r].uid!=e[r].uid)if(e[r]?.item&&n[r]?.item){let i={slot:r,uid:n[r].uid,oldUid:e[r].uid,item:n[r].item,oldItem:e[r].item,changeType:"swap"};o.push(i),j[t.id]=i}else if(n[r]?.item){if(n[r]?.item)if(j[t.id]?.changeType=="delete"&&j[t.id]?.uid==n[r].uid){let i={slot:r,uid:n[r].uid,item:n[r].item,changeType:"move"};o.push(i),j[t.id]=i;continue}else{let i={slot:r,uid:n[r].uid,item:n[r].item,changeType:"put"};o.push(i),j[t.id]=i}}else{let i={slot:r,uid:e[r].uid,item:e[r].item,changeType:"delete"};o.push(i),j[t.id]=i}}return o}function yo(t){if(!t)return"";let e=[];return e.push(t.typeId),e.push(t.nameTag),e.push(t.data),e.push(t.getLore().join("")),e.join("")}function ho(t){let e=[];for(let n=0;n{for(let t of Object.values(st))for(let e of h.overworld.getEntities(t.entities)){let n=ho(e.getComponent("inventory").container),o=go(e,sn[e.id]??n,n);if(sn[e.id]=n,o.length!=0){if(e.hasTag("skipCheck")){e.removeTag("skipCheck"),delete j[e.id];continue}for(let r of o)t.callback(e,r)}}},5);var be=class{static subscribe(e,n){let o=Date.now();return st[o]={callback:n,entities:e},o}static unsubscribe(e){delete st[e]}};import{Location as bo}from"@minecraft/server";var x={},re={};function an(t){return t.getComponent("minecraft:inventory").container.getItem(t.selectedSlot)}async function cn(t,e){try{let n=t.getComponent("minecraft:inventory").container,o=[];for(let r=0;ro.kill())}}function ln(t,e){return t.getComponent("minecraft:inventory").container.getItem(e)}var Le=class{constructor(e,n,o){this.gui=e,this.slot=n,this.change=o}message(e){this.gui.player.tell(e)}getItemAdded(){return this.slot.item?null:this.gui.entity.getComponent("minecraft:inventory").container.getItem(this.change.slot)}GiveAction(e=this.slot.item.itemStack){this.gui.player.getComponent("minecraft:inventory").container.addItem(e)}TakeAction(e=null){this.gui.player.getComponent("minecraft:inventory").container.addItem(this.slot.item.itemStack),this.gui.page.slots[this.change.slot]=null,e&&e.delete(this.slot.item.components.dbKey)}PageAction(e,n){this.gui.setPage(e,n)}CloseAction(){this.gui.despawn()}SetAction(){this.gui.entity.getComponent("minecraft:inventory").container.setItem(this.change.slot,this.slot.item.itemStack)}async FormAction(e){return this.CloseAction(),await Bt(5),await e.show(this.gui.player)}};var ie=class{static spawnEntity(e){try{return e.dimension.spawnEntity(pe,e.headLocation)}catch{return null}}constructor(e){this.player=e,this.entity=ie.spawnEntity(e),this.entity&&(this.hasChestOpen=!1,this.setPage("home")),this.runScheduleId=mn.runSchedule(()=>{if(!this.entity)return this.despawn();if(this.player.getComponent("mark_variant").value==1)this.hasChestOpen||(this.slotChangeEvent=be.subscribe({type:pe},(n,o)=>{n.id==this.entity.id&&this.onSlotChange(o)})),this.hasChestOpen=!0;else try{this.entity.teleport(this.player.headLocation,this.player.dimension,this.player.rotation.x,this.player.rotation.y,!0)}catch{this.despawn()}},5)}setPage(e,n){let o=this.entity.getComponent("inventory").container;for(let i=0;i{t.PageAction("moderation:see")}).setSlots([54],new w(dn.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});I.subscribe(()=>{fn.runSchedule(()=>{for(let t of Io.getPlayers()){if(an(t)?.typeId!=Yt){x[t.name]&&x[t.name].despawn();continue}Object.keys(x).includes(t?.name)||m(t)=="admin"&&(x[t.name]=new ie(t))}},10)});fn.runSchedule(()=>{let t=Object.values(x).map(e=>e.entity.id);for(let e of h.overworld.getEntities({type:pe}))t.includes(e.id)||e.triggerEvent("despawn")},100);import{system as Co}from"@minecraft/server";var ke={};I.subscribe(()=>{Co.run(()=>{for(let t of Object.values(ke))!t.getConfig().enabled||t.enable()})});var P={"api.name":()=>"Smelly API","api.error.unknown":()=>"An unknown error has occurred.","api.database.error.table_name":(t,e)=>`The display name ${t} is too long for an objective, it can be at most ${e} characters long`,"api.utilities.formatter.error.ms":t=>`${t} is not a string or a number`,"api.Providers.form.invalidType":(t,e)=>`Type ${t} is not a valid type to add a ${e}`,"modules.protections.cps.clickingToFast":()=>"You are clicking to fast! Please click slower!","modules.managers.mute.isMuted":()=>"\xA7cYou've been temporarily muted in chat.","modules.commands.ban.reply":(t,e,n="")=>`\xA7cBanned \xA7f"\xA7a${t}\xA7f" \xA7cfor ${e} Because: "${n??"No reason Provided"}" \xA7aSuccessfully`,"lockdown.kick.message":()=>["\xA7cYou have been kicked!","\xA7aReason: \xA7fServer is currently under LockDown","\xA7fServer will be up soon, Try to join later"],"commands.ban.list.player":(t,e,n)=>`- "${t}" Because: ${e}, Expiry ${n}`,"commands.freeze.list.player":(t,e)=>`- "${t}" Because: ${e}`,"commands.mutes.list.player":(t,e,n)=>`- "${t}" Because: ${e}, Expiry: ${n}`,"commands.lockdown.confirm":"Are you sure you want to lockdown the server, this will kick all active players and all players who try to join who are not admin"};var u=class{constructor(e,n,o=0,r){this.data=e;this.type=n;this.depth=o;this.parent=r;e.requires||(e.requires=i=>!0),this.data=e,this.type=n??new F(this.data.name),this.children=[],this.depth=o,this.parent=r,this.callback=null,q.push(this)}argument(e){let n=new u(this.data,e,this.depth+1,this);return this.children.push(n),n}string(e){return this.argument(new me(e))}int(e){return this.argument(new ue(e))}array(e,n){return this.argument(new fe(e,n))}boolean(e){return this.argument(new de(e))}location(e){let n=this.argument(new U(e));return e.endsWith("*")?n:n.location(e+"_y*").location(e+"_z*")}literal(e){let n=new u(e,new F(e.name),this.depth+1,this);return this.children.push(n),n}executes(e){return this.callback=e,this}};import{Player as gn}from"@minecraft/server";function pn(t,e,n,o="No Reason",r="Rubedo Auto Mod"){let i={key:e,playerName:t instanceof gn?t.name:t,date:Date.now(),duration:n?le(n):null,expire:n?le(n)+Date.now():null,reason:o,by:r};a.bans.set(e,i)}var A=class{constructor(e,n,o="No Reason",r="Rubedo Auto Mod"){e instanceof gn?pn(e,e.id,n,o,r):pn(e,a.ids.get(e),n,o,r)}};function at(t,e,n,o,r){if(a.bans.get(a.ids.get(e)))return t.reply(`\xA7c${e} is already banned`);t.reply("\xA7aClose chat to confirm"),K(t.sender,`Are you sure you want to ban ${e}, for ${n??"forever"}`,()=>{new A(e,n,o,t.sender.name),t.reply(P["modules.commands.ban.reply"](e,n,o))})}var ct=new u({name:"ban",description:"Manage bans",requires:t=>["admin","moderator"].includes(m(t))});ct.literal({name:"add",description:"Bans a player"}).argument(new p.playerName).executes((t,e)=>{at(t,e,null,null,t.sender.name)}).argument(new p.duration("duration")).executes((t,e,n)=>{at(t,e,n,null,t.sender.name)}).string("reason").executes((t,e,n,o)=>{at(t,e,n,o,t.sender.name)});ct.literal({name:"remove",description:"un-bans a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.bans.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not banned`);a.bans.delete(n.key)?t.reply(`\xA7a${e}\xA7r has been Unbanned!`):t.reply(`\xA7cFailed to un-ban ${e}`)});ct.literal({name:"list",description:"Lists all bans"}).executes(t=>{let e=a.bans.values();if(e.length==0)return t.sender.tell("\xA7cNo one is banned!");t.sender.tell(`\xA72--- Showing Bans (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.ban.list.player"](n.playerName,n.reason,n.expire?ne(n.duration):"Forever"))});var Ie=new u({name:"database",description:"Interacts with SA Database",aliases:["db"],requires:t=>m(t)=="admin"});Ie.literal({name:"get"}).string("table").string("key").executes((t,e,n)=>{try{let o=a[e].get(n);o?t.reply(JSON.stringify(o)):t.reply(`No data could be found for key ${n}`)}catch(o){t.reply(o+o.stack)}});Ie.literal({name:"set"}).string("table").string("key").string("value").executes((t,e,n,o)=>{try{a[e].set(n,o),t.reply(`Set Key: "${n}", to value: "${o}" on table: "${e}"`)}catch(r){t.reply(r+r.stack)}});Ie.literal({name:"clear"}).string("table").executes((t,e)=>{try{a[e].clear(),t.reply(`Cleared Table ${e}`)}catch(n){t.reply(n+n.stack)}});Ie.literal({name:"keys",description:"Returns all keys on a database"}).string("table").executes((t,e)=>{try{let n=a[e].keys();t.reply(`Keys on database: ${e}: ${n}`)}catch(n){t.reply(n+n.stack)}});Ie.literal({name:"values",description:"Returns all values on a database"}).string("table").executes((t,e)=>{try{let n=a[e].values();t.reply(`Values on database: ${e}: ${JSON.stringify(n,null,2)}`)}catch(n){n instanceof TypeError?t.reply(`No values on database ${e}`):t.reply(n+n.stack)}});new u({name:"ecwipe",description:"Clears a players ender chest",requires:t=>m(t)=="admin"}).argument(new p.player("player")).executes((t,e)=>{for(let n=0;n<27;n++)e.runCommandAsync(`replaceitem entity @s slot.enderchest ${n} air`);t.reply(`\xA7aCleared "${e.name}"'s Ender chest!`)});var _e=class{constructor(e,n="No Reason"){let o={playerName:e.name,key:e.id,reason:n,location:{x:e.location.x,y:e.location.y,z:e.location.z,dimension:e.dimension.id}};a.freezes.set(e.id,o)}};var lt=new u({name:"freeze",description:"Manage Freezes",requires:t=>["admin","moderator"].includes(m(t))});lt.literal({name:"add",description:"Freezes a player"}).argument(new p.player("player")).string("reason").executes((t,e,n)=>{new _e(e,n),t.reply(`\xA7cFroze \xA7f"\xA7a${e.name}\xA7f" Because: "${n}" \xA7aSuccessfully`),t.sender.tell(`\xA7cYou have been frozen by \xA7f"\xA7a${t.sender.name}\xA7f" Because: "${n}"`)});lt.literal({name:"remove",description:"unfreezes a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.freezes.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not frozen`);a.freezes.delete(n.key),t.reply(`\xA7a${e}\xA7r has been UnFrozen!`)});lt.literal({name:"list",description:"Lists all freezes"}).executes(t=>{let e=a.freezes.values();if(e.length==0)return t.sender.tell("\xA7cNo one is frozen!");t.sender.tell(`\xA72--- Showing Freezes (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.freeze.list.player"](n.playerName,n.reason))});var mt=class{constructor(e){this.name=e;this.typeName="CommandName"}matches(e){return{success:Boolean(q.find(n=>n.depth==0&&n.data.name==e)),value:e}}fail(e){return`"${e}" is not a valid command`}};function wo(t,e,n){n.tell(`${T}${t.data.name} ${e.map(o=>o.type.typeName=="literal"?o.data.name:`<${o.type.name}: ${o.type.typeName}>`).join(" ")}`)}function Oe(t,e,n,o){if(!!e.data?.requires(o)&&(e.callback&&wo(t,e.depth==0?n:n.concat(e),o),e.children.length>0))for(let r of e.children)Oe(t,r,e.depth==0?n:n.concat(e),o)}function yn(t,e,n){t.tell(`\xA72--- Showing help page ${e} of ${n} (${T}help ) ---`)}function ut(t){return q.filter(e=>e.depth==0&&e.data?.requires(t))}function hn(t){let e=ut(t);return e.length==0?0:Math.ceil(e.length/5)}var bn=new u({name:"help",description:"Provides help/list of commands.",aliases:["?","h"]}).executes(t=>{let e=hn(t.sender),n=ut(t.sender).slice(1*5-5,1*5);yn(t.sender,1,e);for(let o of n)Oe(o,o,[],t.sender)});bn.int("page").executes((t,e)=>{let n=hn(t.sender);e>n&&(e=n);let o=ut(t.sender).slice(e*5-5,e*5);yn(t.sender,e,n);for(let r of o)Oe(r,r,[],t.sender)});bn.argument(new mt("command")).executes((t,e)=>{let n=q.filter(o=>o.depth==0&&o.data.name==e)[0];t.sender.tell(`\xA7e${n.data.name}: ${n.data.aliases?`aliases (${n.data.aliases.join(", ")})`:""}`),t.sender.tell(`\xA7e${n.data.description}`),t.sender.tell("Usage:"),Oe(n,n,[],t.sender)});import{world as kn}from"@minecraft/server";new u({name:"lockdown",description:"Toggles the servers lockdown, meaning no one can join",requires:t=>m(t)=="admin"}).executes(t=>{De()?(rt(!1),t.sender.tell("\xA7aUnlocked the server!")):(t.reply("\xA7aClose chat to confirm lockdown"),K(t.sender,P["commands.lockdown.confirm"],()=>{rt(!0);for(let e of kn.getPlayers())m(e)!="admin"&&z(e,P["lockdown.kick.message"]());kn.say("\xA7l\xA7cServer is now LOCKED!")}))});var N=class{static getMuteData(e){return a.mutes.get(e.name)}constructor(e,n,o="No Reason",r="Rubedo Auto Mod"){let i=n?le(n):null,s={playerName:e.name,date:Date.now(),duration:i,expire:i?i+Date.now():null,reason:o,by:r};a.mutes.set(e.name,s)}};var dt=new u({name:"mute",description:"Manage Mutes",requires:t=>["admin","moderator"].includes(m(t))});dt.literal({name:"add",description:"Mutes a player"}).argument(new p.player("player")).argument(new p.duration("duration")).string("reason").executes((t,e,n,o)=>{new N(e,n,o,t.sender.name),t.reply(`\xA7cMuted \xA7f"\xA7a${e.name}\xA7f" \xA7cfor ${n} Because: "${o}" \xA7aSuccessfully`),e.tell(`\xA7cYou have been muted by \xA7f"${t.sender.name}" \xA7cfor ${n} Because: "${o}"`)});dt.literal({name:"remove",description:"un-mutes a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.mutes.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not muted!`);a.mutes.delete(n.playerName);try{t.sender.runCommandAsync(`ability "${e}" mute false`)}catch{}t.reply(`\xA7a${e}\xA7r has been UnMuted!`)});dt.literal({name:"list",description:"Lists all freezes"}).executes(t=>{let e=a.mutes.values();if(e.length==0)return t.sender.tell("\xA7cNo one is muted!");t.sender.tell(`\xA72--- Showing Mutes (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.mutes.list.player"](n.playerName,n.reason,n.expire?ne(n.expire):"Forever"))});import{Location as Eo}from"@minecraft/server";var se=class{static isValid(e){return e.typeId!="minecraft:npc"?!1:$e.find(n=>Nt(n,e.location))?!0:!!a.npcs.keys().find(n=>e.id==n)}constructor(e,n){$e.push(e);let o=n.spawnEntity("minecraft:npc",e),r={dimension:o.dimension.id,x:o.location.x,y:o.location.y,z:o.location.z};a.npcs.set(o.id,r),In()}};new u({name:"npc",description:"Spawns a npc at your coordinates",requires:t=>m(t)=="admin"}).executes(t=>{let{x:e,y:n,z:o}=t.sender.location;new se(new Eo(e,n,o),t.sender.dimension),t.reply("Spawned a verified npc at your current location")});import{system as Cn}from"@minecraft/server";async function vo(){let t=Date.now(),e=0;return new Promise(n=>{let o=Cn.runSchedule(()=>{Date.now()-t<1e3?e++:(Cn.clearRunSchedule(o),n(e))})})}new u({name:"ping",description:"Returns the current Ticks Per Second of the servers ping"}).executes(async t=>{let e=await vo();t.reply(`\xA7aCurrent Ticks Per Second: ${e>18?"\xA7f{ \xA7aGood":e>13?"\xA7f{ \xA7eOk":"\xA7f{ \xA7cSevere"} ${e} \xA7f}`)});import{BlockLocation as Ce}from"@minecraft/server";var we=new u({name:"region",description:"Create a Region",requires:t=>m(t)=="admin"});we.literal({name:"add",description:"Adds a new protection region"}).int("from_x").int("from_z").int("to_x").int("to_z").executes((t,e,n,o,r)=>{new y({x:e,z:n},{x:o,z:r},t.sender.dimension.id),t.reply(`Created Region From ${e} -64 ${n} ${o} 320 ${r}`)});we.literal({name:"remove",description:"Removes a region at the players current position"}).executes(t=>{let e=new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z);y.removeRegionAtBlockLocation(e,t.sender.dimension.id)?t.reply(`Removed Region at ${e.x} ${e.y} ${e.z}`):t.reply(`Failed to find/remove region at ${e.x} ${e.y} ${e.z}`)});we.literal({name:"removeAll",description:"Removes all regions"}).executes(t=>{y.getAllRegions().forEach(e=>e.delete()),t.reply("Removed All regions")});we.literal({name:"list",description:"Lists all regions and positions"}).executes(t=>{let e=y.getAllRegions();for(let n of e)t.reply(`Region from ${n.from.x}, ${n.from.z} to ${n.to.x}, ${n.to.z} in dimension ${n.dimensionId}`);if(e.length==0)return t.reply("No regions have been made yet")});var ft=we.literal({name:"permission",description:"Handles permissions for regions"});ft.literal({name:"set",description:"Sets a certain permission on the region the player is currently in to a value"}).array("key",["doorsAndSwitches","openContainers","pvp"]).boolean("value").executes((t,e,n)=>{let o=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!o)return t.reply("You are not in a region");o.changePermission(e,n),t.reply(`Changed permission ${e} to ${n}`)});ft.literal({name:"list",description:"Lists the permissions for the current region"}).executes(t=>{let e=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!e)return t.reply("You are not in a region");t.reply(`Current region permissions ${JSON.stringify(e.permissions)}`)});var wn=ft.literal({name:"entities",description:"Holds the subCommands for adding or removing allowedEntities"});wn.literal({name:"add",description:"Adds a entity to the allowed entities list"}).string("entity").executes((t,e)=>{let n=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!n)return t.reply("You are not in a region");let o=n.permissions.allowedEntities;o.push(e),n.changePermission("allowedEntities",o),t.reply(`Added entity ${e} to the allowed entities of the region your currently standing in`)});wn.literal({name:"remove",description:"Removes a entity from the allowed entities in the region"}).string("entity").executes((t,e)=>{let n=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!n)return t.reply("You are not in a region");let o=n.permissions.allowedEntities;if(!o.includes(e))return t.reply(`The entity ${e} is not allowed to enter the region`);o=o.filter(r=>r!=e),n.changePermission("allowedEntities",o),t.reply(`Removed entity ${e} to the allowed entities of the region your currently standing in`)});var pt=(r=>(r[r.member=0]="member",r[r.admin=1]="admin",r[r.moderator=2]="moderator",r[r.builder=3]="builder",r))(pt||{});var So=t=>isNaN(Number(t))===!1;function To(t){return Object.keys(t).filter(So).map(e=>t[e])}var gt=new u({name:"role",description:"Changes the role for a player",requires:t=>m(t)=="admin"||ye(t)});gt.literal({name:"set",description:"Sets the role for a player"}).argument(new p.playerName("playerName")).argument(new p.array("role",To(pt))).executes((t,e,n)=>{oe(e,n),t.reply(`Changed role of ${e} to ${n}`)});gt.literal({name:"get",description:"Gets the role of a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=m(e);t.reply(`${e} has role: ${n}`)});var yt=gt.literal({name:"owner",description:"Manages the owner"});yt.literal({name:"get",description:"Gets the owner of the world"}).executes(t=>{let e=ot(),n=a.ids.collection(),o=Object.keys(n).find(r=>n[r]===e);t.reply(`\xA7aServer Owner: ${o} (id: ${e})`)});yt.literal({name:"transfer",description:"Transfers the owner of the world",requires:t=>ye(t)}).argument(new p.player).executes((t,e)=>{K(t.sender,`Are you sure you want to transfer the server ownership to ${e.name}, this action is not reversible!`,()=>{he(e),t.reply(`\xA7aSet the server Owner to: ${e.name} (id: ${e.id})`)}),t.reply("\xA7aClose chat to confirm")});yt.literal({name:"clear",description:"clear's the owner of the world",requires:t=>ye(t)}).executes(t=>{K(t.sender,"Are you sure you want to clear the server owner, this action is not reversible!",()=>{he(null),t.reply('\xA7aCleared the server owner! run "/reload" or reload world to run "/function start" again!')}),t.reply("\xA7aClose chat to confirm")});import{ActionFormData as Po}from"@minecraft/server-ui";var L=class{constructor(e,n){this.title=e,this.body=n,this.form=new Po,e&&this.form.title(e),n&&this.form.body(n),this.buttons=[],this.triedToShow=0}addButton(e,n=null,o){return this.buttons.push({text:e,iconPath:n,callback:o}),this.form.button(e,n),this}show(e){this.form.show(e).then(n=>{if(n.canceled){if(n.cancelationReason=="userBusy"){if(this.triedToShow>200)return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)");this.triedToShow++,this.show(e)}return}this.buttons[n.selection].callback?.()})}};import{ModalFormData as Ao}from"@minecraft/server-ui";var Fe=class{constructor(e,n,o){this.form=e,this.player=n,this.callback=o}error(e){new Z("Error",e).setButton1("Return to form",()=>{this.form.show(this.player,this.callback)}).setButton2("Cancel",null).show(this.player)}};var R=class{constructor(e){this.title=e,this.form=new Ao,e&&this.form.title(e),this.args=[]}addDropdown(e,n,o){return this.args.push({type:"dropdown",options:n}),this.form.dropdown(e,n,o),this}addSlider(e,n,o,r,i){return this.args.push({type:"slider"}),this.form.slider(e,n,o,r,i),this}addToggle(e,n){return this.args.push({type:"toggle"}),this.form.toggle(e,n),this}addTextField(e,n,o){return this.args.push({type:"textField"}),this.form.textField(e,n,o),this}async show(e,n){for(let o=0;o<200;o++){let r=await this.form.show(e);if(r.cancelationReason!="userBusy"){n(new Fe(this,e,n),...r.formValues.map((i,s)=>this.args[s].type=="dropdown"?this.args[s].options[i]:i));return}}return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)")}};function En(t){new L("Manage Banned Items").addButton("Remove a Banned Item",null,()=>{xo(t)}).addButton("Ban an item",null,()=>{Ro(t)}).show(t)}function xo(t){new R("Remove Banned Items").addDropdown("Select item to remove",C("banned_items")).show(t,(e,n)=>{let o=C("banned_items");o=o.filter(r=>r!=n),X("banned_items",o),t.tell(`Removed Banned item "${n}"`)})}function Ro(t){new R("Add Banned Item").addTextField("Item Id","minecraft:string").show(t,(e,n)=>{let o=C("banned_items");if(o.includes(n))return e.error(`\xA7cItem "${n}" is already banned`);o.push(n),X("banned_items",o),t.tell(`Banned the item "${n}"`)})}function vn(t){new L("Manage Banned Blocks").addButton("Remove a Banned Block",null,()=>{Bo(t)}).addButton("Ban an block",null,()=>{No(t)}).show(t)}function Bo(t){new R("Remove Banned Block").addDropdown("Select block to remove",C("banned_blocks")).show(t,(e,n)=>{let o=C("banned_blocks");o=o.filter(r=>r!=n),X("banned_blocks",o),t.tell(`Removed Banned block "${n}"`)})}function No(t){new R("Add Banned Block").addTextField("Block Id","minecraft:barrier").show(t,(e,n)=>{let o=C("banned_blocks");if(o.includes(n))return e.error(`\xA7cBlock "${n}" is already banned`);o.push(n),X("banned_blocks",o),t.tell(`Banned the block "${n}"`)})}function Sn(t){new R("Manage Enchantment Levels").addDropdown("Enchantment to change",Object.keys(Ne),0).addTextField("Level (number)","5").show(t,(e,n,o)=>{if(isNaN(o))return e.error(`\xA7c"${o}" is not a number, please enter a value like, "3", "9", etc.`);let r=parseInt(o),i=C("enchantments");i[n]=r,X("enchantments",i),t.tell(`Set max level for ${n} to ${r}`)})}function Tn(t){new R("Manage Appeal Link").addTextField("Appeal Link",Me).show(t,(e,n)=>{X("appealLink",n),t.tell(`Changed the servers appeal link to ${n}`)})}function Pn(t){let e=new L("Manage Protections");for(let n of Object.values(ke))e.addButton(n.name,n.iconPath,()=>{Do(n,t)});e.addButton("Back","textures/ui/arrow_dark_left_stretch.png",()=>{ze(t)}).show(t)}function Do(t,e){let n=t.getConfig(),o=new R(`Manage ${t.name} Protection Config`).addToggle("Enabled",n.enabled),r=[];for(let[i,s]of Object.entries(t.configDefault))r.push(i),typeof s.defaultValue=="boolean"?o.addToggle(s.description,n[i]):typeof s.defaultValue=="number"?o.addSlider(s.description,0,100,1,n[i]):o.addTextField(s.description,null,n[i]);o.show(e,(i,s,...c)=>{s!=n.enabled&&(s&&t.enable(),s||t.disable());let l={enabled:s};for(let[d,g]of Object.keys(t.configDefault).entries())l[g]=c[d];t.setConfig(l),e.tell(`Updated config for ${t.name}!`)})}function ze(t){new L("Rubedo Settings").addButton("Auto Mod","textures/ui/permissions_op_crown.png",()=>{Pn(t)}).addButton("Banned items","textures/blocks/sculk_shrieker_top.png",()=>{En(t)}).addButton("Banned blocks","textures/blocks/barrier.png",()=>{vn(t)}).addButton("Enchantments","textures/items/book_enchanted.png",()=>{Sn(t)}).addButton("Appeal Link","textures/ui/Feedback.png",()=>{Tn(t)}).show(t)}new u({name:"settings",description:"Opens up the settings menu for the player",requires:t=>["admin","moderator"].includes(m(t))}).executes(t=>{ze(t.sender),t.sender.tell("\xA7aForm request sent, close chat to continue!")});import{world as An}from"@minecraft/server";function xn(t,e){if(t.hasTag("spectator")){if(t.runCommandAsync("gamemode c"),t.triggerEvent("removeSpectator"),t.removeTag("spectator"),!e)return;An.say({rawtext:[{translate:"multiplayer.player.joined",with:[`\xA7e${t.name}`]}]})}else{if(t.runCommandAsync("gamemode spectator"),t.triggerEvent("addSpectator"),t.addTag("spectator"),!e)return;An.say({rawtext:[{translate:"multiplayer.player.left",with:[`\xA7e${t.name}`]}]})}}new u({name:"vanish",description:"Toggles Vanish Mode on the sender",requires:t=>m(t)=="admin"}).executes(t=>{xn(t.sender,!1)}).boolean("say").executes((t,e)=>{xn(t.sender,e)});new u({name:"version",description:"Get Current Version",aliases:["v"]}).executes(t=>{t.reply(`Current Rubedo Version: ${Jt}`)});new u({name:"kick",description:"Kicks a player from the game",requires:t=>m(t)=="admin"}).argument(new p.player).string("reason").executes((t,e,n)=>{z(e,[n]),t.reply(`\xA7aKicked ${e.name} from world`)});var _=class{constructor(e){this.data=e,console.warn(`[LOG]: ${e.message}`),a.logs.set(Date.now().toString(),e)}};function ht(t){var e=6e4,n=e*60,o=n*24,r=o*30,i=o*365,s=Date.now()-t;return sm(t)=="admin"});Ee.literal({name:"add",description:"Adds a new log"}).string("message").executes((t,e)=>{new _({message:e}),t.reply(`\xA7aAdded new log: ${e}`)});Ee.literal({name:"getAll",description:"Gets all logs sorted in descending"}).int("page").array("order",["ascending","descending"]).executes((t,e,n)=>{let o=Object.entries(a.logs.collection()).sort((i,s)=>n=="ascending"?parseInt(s[0])-parseInt(i[0]):parseInt(i[0])-parseInt(s[0]));if(o.length==0)return t.reply("\xA7cNo Logs have been made!");let r=Math.ceil(o.length/8);e>r&&(e=r),t.reply(`\xA72--- Showing logs page ${e} of ${r} (${T}log getAll ) ---`);for(let[i,s]of o.slice(e*8-8,e*8))t.reply(`${ht(parseInt(i))}: ${s.message}`)});Ee.literal({name:"getPlayersLogs",description:"Gets all logs associated with a player"}).argument(new p.playerName).int("page").array("order",["ascending","descending"]).executes((t,e,n,o)=>{let r=Object.entries(a.logs.collection()).filter(s=>s[1].playerName==e).sort((s,c)=>o=="ascending"?parseInt(c[0])-parseInt(s[0]):parseInt(s[0])-parseInt(c[0]));if(r.length==0)return t.reply(`\xA7cNo Logs exists for "${e}"!`);let i=Math.ceil(r.length/8);n>i&&(n=i),t.reply(`\xA72--- Showing logs for "${e}" page ${n} of ${i} ---`);for(let[s,c]of r.slice(n*8-8,n*8))t.reply(`${ht(parseInt(s))}: ${c.message}`)});Ee.literal({name:"getProtectionLogs",description:"Gets all logs associated with a protection"}).string("protection").int("page").array("order",["ascending","descending"]).executes((t,e,n,o)=>{let r=Object.entries(a.logs.collection()).filter(s=>s[1].protection==e).sort((s,c)=>o=="ascending"?parseInt(c[0])-parseInt(s[0]):parseInt(s[0])-parseInt(c[0]));if(r.length==0)return t.reply(`\xA7cNo Logs exists for protection: "${e}"!`);let i=Math.ceil(r.length/8);n>i&&(n=i),t.reply(`\xA72--- Showing logs for Protection: "${e}" page ${n} of ${i} ---`);for(let[s,c]of r.slice(n*8-8,n*8))t.reply(`${ht(parseInt(s))}: ${c.message}`)});Ee.literal({name:"clearAll",description:"Clears all logs"}).executes(t=>{a.logs.clear(),t.reply("\xA7aCleared All logs!")});var _o=new u({name:"teleport",description:"Teleports entities (players, mobs, etc.).",aliases:["tp"],requires:t=>m(t)=="admin"});_o.argument(new p.player).location("destination").executes((t,e,n)=>{e.addTag("skip-movement-check"),e.teleport(n,e.dimension,0,0),t.reply(`Teleported ${e.name} to ${n.x} ${n.y} ${n.z}`)});V(t=>{try{let e=a.bans.get(t.id);if(!e)return;if(e.expire&&e.expire{console.warn(new Error("Failed to kick player")),a.bans.delete(t.id)})}catch(e){console.warn(e+e.stack)}},20);import{Location as Oo}from"@minecraft/server";V(t=>{try{let e=a.freezes.get(t.id);if(!e)return t.getComponent("movement").resetToDefaultValue();t.getComponent("movement").setCurrent(0),t.teleport(new Oo(e.location.x,e.location.y,e.location.z),h[e.location.dimension],0,0)}catch{}},200);import{world as $o}from"@minecraft/server";var bt={};$o.events.beforeChat.subscribe(t=>{if(!t.message.startsWith(T))for(let e of Object.values(bt))e.callback(t)});var Ve=class{static subscribe(e){let n=Date.now();return bt[n]={callback:e},n}static unsubscribe(e){delete bt[e]}};Ve.subscribe(t=>{let e=N.getMuteData(t.sender);if(!!e){if(e.expire&&e.expire{Re()},6e3);kt.events.beforeItemUseOn.subscribe(t=>{if(["moderator","admin"].includes(m(t.source)))return;let e=y.blockLocationInRegion(t.blockLocation,t.source.dimension.id);if(!e)return;let n=t.source.dimension.getBlock(t.blockLocation);Kt.includes(n.typeId)&&e.permissions.doorsAndSwitches||Ht.includes(n.typeId)&&e.permissions.openContainers||(t.cancel=!0)});kt.events.beforeExplosion.subscribe(t=>{for(let e=0;e{let e=await y.blockLocationInRegionSync(new Fo(t.location.x,t.location.y,t.location.z),t.dimension.id);!e||e.permissions.allowedEntities.includes(t.typeId)||(t.teleport({x:0,y:-64,z:0},t.dimension,0,0),t.kill())});I.subscribe(()=>{Rn.runSchedule(async()=>{for(let t of await y.getAllRegionsSync())for(let e of h[t.dimensionId].getEntities({excludeTypes:t.permissions.allowedEntities}))!t.entityInRegion(e)||(e.teleport({x:0,y:-64,z:0},e.dimension,0,0),e.kill())},100)});V(t=>{for(let e of y.getAllRegions())e.entityInRegion(t)?(t.addTag("inRegion"),e.permissions.pvp||t.addTag("region-protected")):(t.removeTag("inRegion"),t.removeTag("region-protected"))},5);import{world as zo}from"@minecraft/server";zo.events.playerJoin.subscribe(async({player:t})=>{if(await I.awaitLoad(),De()&&m(t)!="admin")return z(t,P["lockdown.kick.message"]());N.getMuteData(t)&&t.runCommandAsync("ability @s mute true"),a.ids.has(t.name)?t.addTag("old"):a.ids.set(t.name,t.id);let e=M.getPlayersRoleToSet(t.name);e&&oe(t,e)});import{Items as Vo,MinecraftItemTypes as O,world as It}from"@minecraft/server";var Bn=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],jo=[10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34,37,38,39,40,41,42,43];function Yo(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let r=0;r{l.PageAction("moderation:see_inventory",{name:i.name})}}}}function Go(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let l=0;l{l.PageAction("moderation:see_ender_chest",{name:n.name})}};let i=[...It.getPlayers()].find(l=>l.name==n.name);i||(Object.values(x).find(d=>d.entity.id==t.id).despawn(),i.tell(`"${n.name}" Could not be found, Gui Crashed`));let s=i.getComponent("inventory").container,c=0;for(let l=0;l{l<9?i.runCommandAsync(`replaceitem entity @s slot.hotbar ${l} air`):i.runCommandAsync(`replaceitem entity @s slot.inventory ${l-9} air`),J.GiveAction(),e.slots[g]={item:null,action:He=>{s.addItem(He.getItemAdded())}}}}}}async function Ko(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let c=0;cc.name==n?.name);r||(Object.values(x).find(l=>l.entity.id==t.id).despawn(),r.tell(`"${n.name}" Could not be found, Gui Crashed`));let i=0,s=Object.values(O);for(let c of s)try{await r.runCommandAsync(`testfor @s[hasitem={item=${c.id},location=slot.enderchest}]`);let l=new w(c,{nameTag:"Note: \xA7l\xA7cThis is not the exact item"}),d=jo[i];o.setItem(d,l.itemStack),e.slots[d]={item:l,action:g=>{g.GiveAction(),e.slots[d]=null}},i++}catch{}}new Y("moderation:see",Yo).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("home")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});new Y("moderation:see_inventory",Go).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("moderation:see")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});new Y("moderation:see_ender_chest",Ko).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("moderation:see")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});import{Player as Ho,MinecraftBlockTypes as Uo}from"@minecraft/server";import{system as Nn,world as Mn}from"@minecraft/server";var k=class{constructor(e,n,o,r){this.name=e;this.description=n;this.iconPath=o;this.isEnabledByDefault=r;this.name=e,this.description=n,this.iconPath=o,this.configDefault={},this.isEnabled=!1,this.isEnabledByDefault=r,this.events={},this.schedules=[],this.forEachValidPlayers=[],ke[this.name]=this}setConfigDefault(e){return this.configDefault=e,a.protections.hasSync(this.name).then(n=>{if(n)return;let o={enabled:!0};for(let r of Object.keys(e))o[r]=e[r].defaultValue;a.protections.set(this.name,o)}),this}getConfig(){let e=a.protections.get(this.name);return e||(e={enabled:this.isEnabled}),e}async setConfig(e){return a.protections.set(this.name,e)}triggerChange(e){if(e){this.isEnabled=!0,this.onEnableCallback?.();for(let[n,o]of Object.entries(this.events)){if(o.triggered)continue;let r=Mn.events[n].subscribe(o.callback);o.triggered=!0,o.callback=r}for(let n of this.forEachValidPlayers){if(n.key)continue;let o=V(n.callback,n.delay);n.key=o}for(let n of this.schedules){if(n.runScheduleId)continue;let o=Nn.runSchedule(n.callback);n.runScheduleId=o}}else{this.isEnabled=!1,this.onDisableCallback?.();for(let[n,o]of Object.entries(this.events))!o.triggered||(Mn.events[n].unsubscribe(o.callback),o.triggered=!1);for(let n of this.forEachValidPlayers)!n.key||(nn(n.key),n.key=null);for(let n of this.schedules)!n.runScheduleId||(Nn.clearRunSchedule(n.runScheduleId),n.runScheduleId=null)}}onEnable(e){return this.onEnableCallback=e,this}onDisable(e){return this.onDisableCallback=e,this}subscribe(e,n){return this.events[e]={callback:n,triggered:!1},this}runSchedule(e,n){return this.schedules.push({callback:e,tickInterval:n,runScheduleId:null}),this}forEachValidPlayer(e,n=0){return this.forEachValidPlayers.push({callback:e,delay:n,key:null}),this}enable(){this.triggerChange(!0)}disable(){this.triggerChange(!1)}};var qo=["minecraft:command_block_minecart"],je=new k("cbe","Stops CBE","textures/blocks/command_block.png",!0).setConfigDefault({entityCreate:{description:"Adds NPC protection",defaultValue:!0},banSpawnEggs:{description:"If spawn eggs should be banned",defaultValue:!0}});je.subscribe("entityCreate",({entity:t})=>{if(!je.getConfig().entityCreate)return;let n=()=>{try{t.triggerEvent("despawn"),t.kill()}catch{t.kill()}};if(qo.includes(t.typeId)||t.typeId=="minecraft:npc"&&!se.isValid(t))return n()});je.subscribe("beforeItemUseOn",t=>{if(!(t.source instanceof Ho)||["admin","moderator"].includes(m(t.source)))return;let e=je.getConfig();if(t.item.typeId.endsWith("spawn_egg")){if(!e.banSpawnEggs||t.source.dimension.getBlock(t.blockLocation).typeId==Uo.mobSpawner.id)return;t.cancel=!0,t.source.tell("\xA7c[Rubedo]: You cannot place spawnEggs on the floor!"),t.source.playSound("note.bass")}else{if(Qt.includes(t.item.typeId)){t.cancel=!0;return}if(!C("banned_blocks").includes(t.item.typeId))return;t.cancel=!0,new A(t.source,null,"Placing Banned Blocks")}});var Ct=32e4;new k("crasher","Protection against type 1 crasher","textures/ui/servers.png",!0).forEachValidPlayer(t=>{(Math.abs(t.location.x)>Ct||Math.abs(t.location.y)>Ct||Math.abs(t.location.z)>Ct)&&new A(t,null,"Crasher detected")});import{GameMode as Qo,world as Xo}from"@minecraft/server";import{world as Wo}from"@minecraft/server";var E=class{constructor(){this.data=new Map,this.events={playerLeave:Wo.events.playerLeave.subscribe(e=>this.data.delete(e.playerName))}}set(e,n){this.data.set(e.name,n)}get(e){return this.data.get(e.name)}delete(e){this.data.delete(e.name)}clear(){this.data.clear()}playerNames(){return[...this.data.keys()]}includes(e){return this.playerNames().includes(e.name)}};var Jo=Qo.creative,Dn=new E,Ln=new k("gamemode","Blocks illegal gamemode","textures/ui/creative_icon.png",!0).setConfigDefault({clearPlayer:{description:"Whether to clear players inventory.",defaultValue:!0},setToSurvival:{description:"If player should be set to survival after being flagged.",defaultValue:!0},banPlayer:{description:"If player should be banned after violation count is met.",defaultValue:!1},violationCount:{description:"The amount of violations before ban.",defaultValue:0}});Ln.runSchedule(()=>{let t=Ln.getConfig();for(let e of Xo.getPlayers({gameMode:Jo})){if(["moderator","admin","builder"].includes(m(e)))continue;try{t.setToSurvival&&e.runCommandAsync("gamemode s"),t.clearPlayer&&e.runCommandAsync("clear @s")}catch{}new _({playerName:e.name,protection:"Gamemode",message:`${e.name} has entered into a illegal gamemode!`});let n=(Dn.get(e)??0)+1;Dn.set(e,n),t.banPlayer&&n>=t.violationCount&&new A(e,null,"Illegal Gamemode")}},20);import{world as tr,Location as nr,system as or}from"@minecraft/server";import{system as Zo,world as er}from"@minecraft/server";var Ye=class{constructor(e){this.emptySlotsCount=e.emptySlotsCount,this.size=e.size,this.items=[];for(let n=0;n{Ge={};for(let t of er.getPlayers()){if(t.dimension.id!="minecraft:overworld")continue;let e=Rt(t.location),n=e.offset(Q.x,Q.y,Q.z),o=e.offset(-Q.x,-Q.y,-Q.z);for(let r of n.blocksBetween(o)){if(r.y<-64)continue;let i=t.dimension.getBlock(r);!i||!Be.includes(i.typeId)||(Ge[JSON.stringify(r)]=new Ye(i.getComponent("inventory").container))}}},100);var wt={};tr.events.blockBreak.subscribe(t=>{for(let e of Object.values(wt))e.callback(new Et(t.block,t.brokenBlockPermutation,t.dimension,t.player))});var ve=class{static subscribe(e){let n=Date.now();return wt[n]={callback:e},n}static unsubscribe(e){delete wt[e]}},Et=class{constructor(e,n,o,r){this.block=e;this.brokenBlockPermutation=n;this.dimension=o;this.player=r;this.block=e,this.brokenBlockPermutation=n,this.dimension=o,this.player=r}set cancel(e){if(this.dimension.getBlock(this.block.location).setPermutation(this.brokenBlockPermutation.clone()),Be.includes(this.brokenBlockPermutation.type.id)){let n=Ge[JSON.stringify(this.block.location)];n&&n.load(this.block.getComponent("inventory").container)}or.run(()=>{[...this.dimension.getEntities({maxDistance:2,type:"minecraft:item",location:new nr(this.block.location.x,this.block.location.y,this.block.location.z)})].forEach(n=>n.kill())})}};var _n=new E,rr=15,ir=["snow","lush_plants_replaceable","azalea_log_replaceable","minecraft:crop","fertilize_area"],sr=["minecraft:water","minecraft:flowing_water","minecraft:lava","minecraft:flowing_lava","minecraft:bedrock"],On=new E,$n=null,Fn=new k("nuker","Blocks block breaking too fast","textures/blocks/dirt.png",!0).setConfigDefault({banPlayer:{description:"If the player should be banned once violation count is met",defaultValue:!1},violationCount:{description:"Violations before ban",defaultValue:0}});Fn.onEnable(()=>{let t=Fn.getConfig();$n=ve.subscribe(e=>{if(["moderator","admin"].includes(m(e.player))||e.block.getTags().some(o=>ir.includes(o)))return;let n=_n.get(e.player);if(_n.set(e.player,Date.now()),!!n){if(!sr.includes(e.block.typeId)){if(n=t.violationCount&&new A(e.player,null,"Using Nuker")}e.cancel=!0}})}).onDisable(()=>{ve.unsubscribe($n)});var zn=new E,Vn=new E,jn=new k("spam","Blocks spam in chat","textures/ui/mute_on.png",!0).setConfigDefault({permMutePlayer:{description:"If player should be permanently muted once violation count is met.",defaultValue:!1},violationCount:{description:"Violation count before permanent mute",defaultValue:0},repeatedMessages:{description:"Blocks repeated messages",defaultValue:!0},zalgo:{description:"Blocks zalgo",defaultValue:!0}});jn.subscribe("beforeChat",t=>{try{if(t.message.startsWith(T)||["admin","moderator"].includes(m(t.sender)))return;let e=jn.getConfig(),n=()=>{let o=(Vn.get(t.sender)??0)+1;Vn.set(t.sender,o),e.permMutePlayer&&o>=e.violationCount&&new N(t.sender,null,"Spamming")};if(e.repeatedMessages&&zn.get(t.sender)==t.message)return t.cancel=!0,n(),t.sender.tell("\xA7cRepeated message detected!");if(e.zalgo&&/%CC%/g.test(encodeURIComponent(t.message)))return t.cancel=!0,n(),t.sender.tell("\xA7cYou message contains some type of zalgo and cannot be sent!");zn.set(t.sender,t.message)}catch(e){console.warn(e+e.stack)}});var Yn=new E;function Ke(t,e){let n=t.getComponent("inventory").container,o=n.getItem(e),r=C("cbe_config");if(r.clearItem&&n.setItem(e,v),new _({playerName:t.name,message:`${t.name} Has obtained a unobtainable item: ${o.typeId}`,protection:"unobtainable"}),!r.banPlayer)return;let i=(Yn.get(t)??0)+1;Yn.set(t,i),!(i{console.warn("unobtainable");let e=C("banned_items"),n=t.getComponent("inventory").container;for(let o=0;oc||s.level<1||i.includes(s.type.id))return Ke(t,o);i.push(s.type.id)}}});import{MinecraftBlockTypes as S,MinecraftEntityTypes as ar,MinecraftItemTypes as G,Player as cr}from"@minecraft/server";var lr=[S.chest.id,S.trappedChest.id,S.barrel.id,S.dispenser.id,S.dropper.id,S.furnace.id,S.litFurnace.id,S.blastFurnace.id,S.litBlastFurnace.id,S.smoker.id,S.litSmoker.id,S.hopper.id,S.beehive.id,S.beeNest.id,S.mobSpawner.id],mr=[G.chestBoat.id,G.oakChestBoat.id,G.birchChestBoat.id,G.acaciaChestBoat.id,G.jungleChestBoat.id,G.spruceChestBoat.id,G.darkOakChestBoat.id,G.mangroveChestBoat.id];new k("nbt","Blocks illegal nbt on items","textures/ui/icon_random.png",!0).subscribe("blockPlace",async({block:t})=>{if(!lr.includes(t.typeId))return;let e=t.permutation;await t.dimension.runCommandAsync(`setblock ${t.x} ${t.y} ${t.z} ${t.typeId}`),t.setPermutation(e)}).subscribe("beforeItemUseOn",t=>{t.source instanceof cr&&(!mr.includes(t.item.typeId)||(t.cancel=!0,t.source.dimension.spawnEntity(ar.chestBoat.id,t.blockLocation.above()),rn(t.source)!="creative"&&t.source.getComponent("inventory").container.setItem(t.source.selectedSlot,v)))});import{MinecraftEffectTypes as gr,MinecraftItemTypes as Xn,Player as Tt}from"@minecraft/server";import{system as ur,world as dr}from"@minecraft/server";var vt={};function fr(t,e){return!(t.x!=e.x||t.y!=e.y||t.z!=e.z)}var St=new E;ur.runSchedule(()=>{let t=(e,n)=>{for(let o of Object.values(vt))o.callback(e,n)};for(let e of dr.getPlayers()){let n=St.get(e);n&&fr(e.location,n.location)||(St.set(e,{location:e.location,dimension:e.dimension}),n&&t(e,n))}});var $=class{static subscribe(e){let n=Date.now();return vt[n]={callback:e},n}static unsubscribe(e){delete vt[e]}static delete(e){St.delete(e)}};var Gn={walk:{velocity:.17,distance:.23},run:{velocity:.19,distance:.35}},Kn=.056,Hn=10,Un=["gliding","riding"];var qn=new E;function yr(t,e){return Math.hypot(e.x-t.x,e.z-t.z)}function hr(t){return(t.getEffect(gr.speed)?.amplifier??0)*Kn}function br(t,e){let n=hr(e),o=Gn.run.distance+.8;return t>n+o}function Wn(t,e){let n=(qn.get(t)??0)+1;qn.set(t,n),$.delete(t),!(n<3)&&t.teleport(e.location,e.dimension,t.rotation.x,t.rotation.y)}var Qn=null,Se=new k("movement","Blocks illegal movements on players","textures/ui/move.png",!0).setConfigDefault({tpCheck:{description:"If teleports should be flagged",defaultValue:!0}});Se.onEnable(()=>{let t=Se.getConfig();Qn=$.subscribe((e,n)=>{if(m(e)=="admin"||e.dimension.id!=n.dimension.id||e.getTags().some(r=>Un.includes(r)))return;let o=yr(e.location,n.location);if(e.hasTag("skip-movement-check"))return e.removeTag("skip-movement-check");if(o>Hn){if(!t.tpCheck)return;Wn(e,n)}else{if(!br(o,e))return;Wn(e,n)}})}).onDisable(()=>{$.unsubscribe(Qn)});Se.subscribe("dataDrivenEntityTriggerEvent",t=>{t.entity instanceof Tt&&t.id=="on_death"&&$.delete(t.entity)});Se.subscribe("projectileHit",({projectile:t,source:e})=>{t.typeId==Xn.enderPearl.id&&e instanceof Tt&&$.delete(e)});Se.subscribe("itemCompleteCharge",({itemStack:t,source:e})=>{t.typeId==Xn.chorusFruit.id&&e instanceof Tt&&$.delete(e)});import{MinecraftEffectTypes as kr,Player as Ir,world as Jn}from"@minecraft/server";var Cr=Jn.events.beforeDataDrivenEntityTriggerEvent.subscribe(t=>{if(!(t.entity instanceof Ir)||t.id!="rubedo:becomeAdmin")return;t.entity.removeTag("CHECK_PACK");let e=tn();if(e)return t.entity.playSound("note.bass"),t.entity.tell(`\xA7cFailed to give server owner: "${e}" is already owner!`),Jn.events.beforeDataDrivenEntityTriggerEvent.unsubscribe(Cr);oe(t.entity,"admin"),he(t.entity),t.entity.addEffect(kr.blindness,3,255,!0),t.entity.tell('\xA7aYou have now been set as the "owner" of this server. The command "/function start" will not do anything anymore, type "-help" for more information!')});import{DynamicPropertiesDefinition as eo,MinecraftEntityTypes as wr,world as to}from"@minecraft/server";var Zn=[];to.events.worldInitialize.subscribe(({propertyRegistry:t})=>{let e=new eo;e.defineString("role",30),t.registerEntityTypeDynamicProperties(e,wr.player);let n=new eo;n.defineString("worldsOwner",100),n.defineBoolean("isLockDown"),t.registerWorldDynamicProperties(n);for(let o of Zn)to.scoreboard.addObjective(o.objective,o.displayName??"")});var $e=[];function In(){$e=[]}console.warn("----- Importing Plugins -----");import{DynamicPropertiesDefinition as Er,EntityTypes as vr,world as Sr}from"@minecraft/server";Sr.events.worldInitialize.subscribe(({propertyRegistry:t})=>{h.overworld.runCommandAsync(`tickingarea add ${B.x} ${B.y} ${B.z} ${B.x} ${B.y} ${B.z} db true`);let e=new Er;e.defineString("tableName",30),e.defineNumber("index"),t.registerEntityTypeDynamicProperties(e,vr.get(ae))});console.warn("---- STARTING RUBEDO ----");Ar.events.beforeWatchdogTerminate.subscribe(t=>{t.cancel=!0,console.warn(`WATCHDOG TRIED TO CRASH = ${t.terminateReason}`)});var v=new Tr(Pr.stick,0);export{v as AIR}; -//# sourceMappingURL=index.js.map diff --git a/src/config/app.ts b/project/src/config/app.ts similarity index 100% rename from src/config/app.ts rename to project/src/config/app.ts diff --git a/src/config/chest.ts b/project/src/config/chest.ts similarity index 100% rename from src/config/chest.ts rename to project/src/config/chest.ts diff --git a/src/config/commands.ts b/project/src/config/commands.ts similarity index 100% rename from src/config/commands.ts rename to project/src/config/commands.ts diff --git a/src/config/database.ts b/project/src/config/database.ts similarity index 100% rename from src/config/database.ts rename to project/src/config/database.ts diff --git a/src/config/form.ts b/project/src/config/form.ts similarity index 100% rename from src/config/form.ts rename to project/src/config/form.ts diff --git a/src/config/objectives.ts b/project/src/config/objectives.ts similarity index 100% rename from src/config/objectives.ts rename to project/src/config/objectives.ts diff --git a/src/database/Database.ts b/project/src/database/Database.ts similarity index 100% rename from src/database/Database.ts rename to project/src/database/Database.ts diff --git a/src/database/index.ts b/project/src/database/index.ts similarity index 100% rename from src/database/index.ts rename to project/src/database/index.ts diff --git a/src/database/tables.ts b/project/src/database/tables.ts similarity index 100% rename from src/database/tables.ts rename to project/src/database/tables.ts diff --git a/src/index.ts b/project/src/index.ts similarity index 100% rename from src/index.ts rename to project/src/index.ts diff --git a/src/lang/emoji.ts b/project/src/lang/emoji.ts similarity index 100% rename from src/lang/emoji.ts rename to project/src/lang/emoji.ts diff --git a/src/lang/profanity.ts b/project/src/lang/profanity.ts similarity index 100% rename from src/lang/profanity.ts rename to project/src/lang/profanity.ts diff --git a/src/lang/text.ts b/project/src/lang/text.ts similarity index 100% rename from src/lang/text.ts rename to project/src/lang/text.ts diff --git a/src/lib/Chest GUI/Models/EntityChest.ts b/project/src/lib/Chest GUI/Models/EntityChest.ts similarity index 100% rename from src/lib/Chest GUI/Models/EntityChest.ts rename to project/src/lib/Chest GUI/Models/EntityChest.ts diff --git a/src/lib/Chest GUI/Models/FillTypes.ts b/project/src/lib/Chest GUI/Models/FillTypes.ts similarity index 100% rename from src/lib/Chest GUI/Models/FillTypes.ts rename to project/src/lib/Chest GUI/Models/FillTypes.ts diff --git a/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts b/project/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts similarity index 100% rename from src/lib/Chest GUI/Models/ItemGrabbedCallback.ts rename to project/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts diff --git a/src/lib/Chest GUI/Models/Page.ts b/project/src/lib/Chest GUI/Models/Page.ts similarity index 100% rename from src/lib/Chest GUI/Models/Page.ts rename to project/src/lib/Chest GUI/Models/Page.ts diff --git a/src/lib/Chest GUI/Models/PageItem.ts b/project/src/lib/Chest GUI/Models/PageItem.ts similarity index 100% rename from src/lib/Chest GUI/Models/PageItem.ts rename to project/src/lib/Chest GUI/Models/PageItem.ts diff --git a/src/lib/Chest GUI/database/Item.ts b/project/src/lib/Chest GUI/database/Item.ts similarity index 100% rename from src/lib/Chest GUI/database/Item.ts rename to project/src/lib/Chest GUI/database/Item.ts diff --git a/src/lib/Chest GUI/index.ts b/project/src/lib/Chest GUI/index.ts similarity index 100% rename from src/lib/Chest GUI/index.ts rename to project/src/lib/Chest GUI/index.ts diff --git a/src/lib/Chest GUI/pages/home.ts b/project/src/lib/Chest GUI/pages/home.ts similarity index 100% rename from src/lib/Chest GUI/pages/home.ts rename to project/src/lib/Chest GUI/pages/home.ts diff --git a/src/lib/Chest GUI/utils.ts b/project/src/lib/Chest GUI/utils.ts similarity index 100% rename from src/lib/Chest GUI/utils.ts rename to project/src/lib/Chest GUI/utils.ts diff --git a/src/lib/Command/ArgumentTypes.ts b/project/src/lib/Command/ArgumentTypes.ts similarity index 100% rename from src/lib/Command/ArgumentTypes.ts rename to project/src/lib/Command/ArgumentTypes.ts diff --git a/src/lib/Command/Callback.ts b/project/src/lib/Command/Callback.ts similarity index 100% rename from src/lib/Command/Callback.ts rename to project/src/lib/Command/Callback.ts diff --git a/src/lib/Command/Command.ts b/project/src/lib/Command/Command.ts similarity index 100% rename from src/lib/Command/Command.ts rename to project/src/lib/Command/Command.ts diff --git a/src/lib/Command/index.ts b/project/src/lib/Command/index.ts similarity index 100% rename from src/lib/Command/index.ts rename to project/src/lib/Command/index.ts diff --git a/src/lib/Command/types.d.ts b/project/src/lib/Command/types.d.ts similarity index 100% rename from src/lib/Command/types.d.ts rename to project/src/lib/Command/types.d.ts diff --git a/src/lib/Command/utils.ts b/project/src/lib/Command/utils.ts similarity index 100% rename from src/lib/Command/utils.ts rename to project/src/lib/Command/utils.ts diff --git a/src/lib/Events/EntitiesLoad.ts b/project/src/lib/Events/EntitiesLoad.ts similarity index 100% rename from src/lib/Events/EntitiesLoad.ts rename to project/src/lib/Events/EntitiesLoad.ts diff --git a/src/lib/Events/beforeBlockBreak.ts b/project/src/lib/Events/beforeBlockBreak.ts similarity index 100% rename from src/lib/Events/beforeBlockBreak.ts rename to project/src/lib/Events/beforeBlockBreak.ts diff --git a/src/lib/Events/beforeChat.ts b/project/src/lib/Events/beforeChat.ts similarity index 100% rename from src/lib/Events/beforeChat.ts rename to project/src/lib/Events/beforeChat.ts diff --git a/src/lib/Events/onPlayerMove.ts b/project/src/lib/Events/onPlayerMove.ts similarity index 100% rename from src/lib/Events/onPlayerMove.ts rename to project/src/lib/Events/onPlayerMove.ts diff --git a/src/lib/Events/onSlotChange.ts b/project/src/lib/Events/onSlotChange.ts similarity index 100% rename from src/lib/Events/onSlotChange.ts rename to project/src/lib/Events/onSlotChange.ts diff --git a/src/lib/Form/Models/ActionForm.ts b/project/src/lib/Form/Models/ActionForm.ts similarity index 100% rename from src/lib/Form/Models/ActionForm.ts rename to project/src/lib/Form/Models/ActionForm.ts diff --git a/src/lib/Form/Models/FormCallback.ts b/project/src/lib/Form/Models/FormCallback.ts similarity index 100% rename from src/lib/Form/Models/FormCallback.ts rename to project/src/lib/Form/Models/FormCallback.ts diff --git a/src/lib/Form/Models/MessageForm.ts b/project/src/lib/Form/Models/MessageForm.ts similarity index 100% rename from src/lib/Form/Models/MessageForm.ts rename to project/src/lib/Form/Models/MessageForm.ts diff --git a/src/lib/Form/Models/ModelForm.ts b/project/src/lib/Form/Models/ModelForm.ts similarity index 100% rename from src/lib/Form/Models/ModelForm.ts rename to project/src/lib/Form/Models/ModelForm.ts diff --git a/src/lib/Form/types.ts b/project/src/lib/Form/types.ts similarity index 100% rename from src/lib/Form/types.ts rename to project/src/lib/Form/types.ts diff --git a/src/plugins/Anti-Cheat/config/enchantments.ts b/project/src/plugins/Anti-Cheat/config/enchantments.ts similarity index 100% rename from src/plugins/Anti-Cheat/config/enchantments.ts rename to project/src/plugins/Anti-Cheat/config/enchantments.ts diff --git a/src/plugins/Anti-Cheat/config/moderation.ts b/project/src/plugins/Anti-Cheat/config/moderation.ts similarity index 100% rename from src/plugins/Anti-Cheat/config/moderation.ts rename to project/src/plugins/Anti-Cheat/config/moderation.ts diff --git a/src/plugins/Anti-Cheat/config/movement.ts b/project/src/plugins/Anti-Cheat/config/movement.ts similarity index 100% rename from src/plugins/Anti-Cheat/config/movement.ts rename to project/src/plugins/Anti-Cheat/config/movement.ts diff --git a/src/plugins/Anti-Cheat/config/region.ts b/project/src/plugins/Anti-Cheat/config/region.ts similarity index 100% rename from src/plugins/Anti-Cheat/config/region.ts rename to project/src/plugins/Anti-Cheat/config/region.ts diff --git a/src/plugins/Anti-Cheat/index.ts b/project/src/plugins/Anti-Cheat/index.ts similarity index 100% rename from src/plugins/Anti-Cheat/index.ts rename to project/src/plugins/Anti-Cheat/index.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/ban.ts b/project/src/plugins/Anti-Cheat/modules/commands/ban.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/ban.ts rename to project/src/plugins/Anti-Cheat/modules/commands/ban.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/database.ts b/project/src/plugins/Anti-Cheat/modules/commands/database.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/database.ts rename to project/src/plugins/Anti-Cheat/modules/commands/database.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts b/project/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/ecwipe.ts rename to project/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/freeze.ts b/project/src/plugins/Anti-Cheat/modules/commands/freeze.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/freeze.ts rename to project/src/plugins/Anti-Cheat/modules/commands/freeze.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/help.ts b/project/src/plugins/Anti-Cheat/modules/commands/help.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/help.ts rename to project/src/plugins/Anti-Cheat/modules/commands/help.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/import.ts b/project/src/plugins/Anti-Cheat/modules/commands/import.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/import.ts rename to project/src/plugins/Anti-Cheat/modules/commands/import.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/kick.ts b/project/src/plugins/Anti-Cheat/modules/commands/kick.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/kick.ts rename to project/src/plugins/Anti-Cheat/modules/commands/kick.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/lockdown.ts b/project/src/plugins/Anti-Cheat/modules/commands/lockdown.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/lockdown.ts rename to project/src/plugins/Anti-Cheat/modules/commands/lockdown.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/log.ts b/project/src/plugins/Anti-Cheat/modules/commands/log.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/log.ts rename to project/src/plugins/Anti-Cheat/modules/commands/log.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/mute.ts b/project/src/plugins/Anti-Cheat/modules/commands/mute.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/mute.ts rename to project/src/plugins/Anti-Cheat/modules/commands/mute.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/npc.ts b/project/src/plugins/Anti-Cheat/modules/commands/npc.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/npc.ts rename to project/src/plugins/Anti-Cheat/modules/commands/npc.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/ping.ts b/project/src/plugins/Anti-Cheat/modules/commands/ping.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/ping.ts rename to project/src/plugins/Anti-Cheat/modules/commands/ping.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/region.ts b/project/src/plugins/Anti-Cheat/modules/commands/region.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/region.ts rename to project/src/plugins/Anti-Cheat/modules/commands/region.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/role.ts b/project/src/plugins/Anti-Cheat/modules/commands/role.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/role.ts rename to project/src/plugins/Anti-Cheat/modules/commands/role.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/settings.ts b/project/src/plugins/Anti-Cheat/modules/commands/settings.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/settings.ts rename to project/src/plugins/Anti-Cheat/modules/commands/settings.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/teleport.ts b/project/src/plugins/Anti-Cheat/modules/commands/teleport.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/teleport.ts rename to project/src/plugins/Anti-Cheat/modules/commands/teleport.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/vanish.ts b/project/src/plugins/Anti-Cheat/modules/commands/vanish.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/vanish.ts rename to project/src/plugins/Anti-Cheat/modules/commands/vanish.ts diff --git a/src/plugins/Anti-Cheat/modules/commands/version.ts b/project/src/plugins/Anti-Cheat/modules/commands/version.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/commands/version.ts rename to project/src/plugins/Anti-Cheat/modules/commands/version.ts diff --git a/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts b/project/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts rename to project/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts diff --git a/src/plugins/Anti-Cheat/modules/events/import.ts b/project/src/plugins/Anti-Cheat/modules/events/import.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/events/import.ts rename to project/src/plugins/Anti-Cheat/modules/events/import.ts diff --git a/src/plugins/Anti-Cheat/modules/events/playerJoin.ts b/project/src/plugins/Anti-Cheat/modules/events/playerJoin.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/events/playerJoin.ts rename to project/src/plugins/Anti-Cheat/modules/events/playerJoin.ts diff --git a/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts b/project/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/events/worldInitialize.ts rename to project/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts diff --git a/src/plugins/Anti-Cheat/modules/forms/automod.ts b/project/src/plugins/Anti-Cheat/modules/forms/automod.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/forms/automod.ts rename to project/src/plugins/Anti-Cheat/modules/forms/automod.ts diff --git a/src/plugins/Anti-Cheat/modules/forms/home.ts b/project/src/plugins/Anti-Cheat/modules/forms/home.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/forms/home.ts rename to project/src/plugins/Anti-Cheat/modules/forms/home.ts diff --git a/src/plugins/Anti-Cheat/modules/forms/settings.ts b/project/src/plugins/Anti-Cheat/modules/forms/settings.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/forms/settings.ts rename to project/src/plugins/Anti-Cheat/modules/forms/settings.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/ban.ts b/project/src/plugins/Anti-Cheat/modules/managers/ban.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/ban.ts rename to project/src/plugins/Anti-Cheat/modules/managers/ban.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/containers.ts b/project/src/plugins/Anti-Cheat/modules/managers/containers.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/containers.ts rename to project/src/plugins/Anti-Cheat/modules/managers/containers.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/freeze.ts b/project/src/plugins/Anti-Cheat/modules/managers/freeze.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/freeze.ts rename to project/src/plugins/Anti-Cheat/modules/managers/freeze.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/import.ts b/project/src/plugins/Anti-Cheat/modules/managers/import.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/import.ts rename to project/src/plugins/Anti-Cheat/modules/managers/import.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/mute.ts b/project/src/plugins/Anti-Cheat/modules/managers/mute.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/mute.ts rename to project/src/plugins/Anti-Cheat/modules/managers/mute.ts diff --git a/src/plugins/Anti-Cheat/modules/managers/region.ts b/project/src/plugins/Anti-Cheat/modules/managers/region.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/managers/region.ts rename to project/src/plugins/Anti-Cheat/modules/managers/region.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Ban.ts b/project/src/plugins/Anti-Cheat/modules/models/Ban.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Ban.ts rename to project/src/plugins/Anti-Cheat/modules/models/Ban.ts diff --git a/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts b/project/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/BlockInventory.ts rename to project/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Freeze.ts b/project/src/plugins/Anti-Cheat/modules/models/Freeze.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Freeze.ts rename to project/src/plugins/Anti-Cheat/modules/models/Freeze.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Log.ts b/project/src/plugins/Anti-Cheat/modules/models/Log.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Log.ts rename to project/src/plugins/Anti-Cheat/modules/models/Log.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Mute.ts b/project/src/plugins/Anti-Cheat/modules/models/Mute.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Mute.ts rename to project/src/plugins/Anti-Cheat/modules/models/Mute.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Npc.ts b/project/src/plugins/Anti-Cheat/modules/models/Npc.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Npc.ts rename to project/src/plugins/Anti-Cheat/modules/models/Npc.ts diff --git a/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts b/project/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/PlayerLog.ts rename to project/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts diff --git a/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts b/project/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts rename to project/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Protection.ts b/project/src/plugins/Anti-Cheat/modules/models/Protection.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Protection.ts rename to project/src/plugins/Anti-Cheat/modules/models/Protection.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Region.ts b/project/src/plugins/Anti-Cheat/modules/models/Region.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Region.ts rename to project/src/plugins/Anti-Cheat/modules/models/Region.ts diff --git a/src/plugins/Anti-Cheat/modules/models/Task.ts b/project/src/plugins/Anti-Cheat/modules/models/Task.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/models/Task.ts rename to project/src/plugins/Anti-Cheat/modules/models/Task.ts diff --git a/src/plugins/Anti-Cheat/modules/pages/import.ts b/project/src/plugins/Anti-Cheat/modules/pages/import.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/pages/import.ts rename to project/src/plugins/Anti-Cheat/modules/pages/import.ts diff --git a/src/plugins/Anti-Cheat/modules/pages/see.ts b/project/src/plugins/Anti-Cheat/modules/pages/see.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/pages/see.ts rename to project/src/plugins/Anti-Cheat/modules/pages/see.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/cbe.ts b/project/src/plugins/Anti-Cheat/modules/protections/cbe.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/cbe.ts rename to project/src/plugins/Anti-Cheat/modules/protections/cbe.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/crasher.ts b/project/src/plugins/Anti-Cheat/modules/protections/crasher.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/crasher.ts rename to project/src/plugins/Anti-Cheat/modules/protections/crasher.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/gamemode.ts b/project/src/plugins/Anti-Cheat/modules/protections/gamemode.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/gamemode.ts rename to project/src/plugins/Anti-Cheat/modules/protections/gamemode.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/import.ts b/project/src/plugins/Anti-Cheat/modules/protections/import.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/import.ts rename to project/src/plugins/Anti-Cheat/modules/protections/import.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/movement.ts b/project/src/plugins/Anti-Cheat/modules/protections/movement.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/movement.ts rename to project/src/plugins/Anti-Cheat/modules/protections/movement.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/nbt.ts b/project/src/plugins/Anti-Cheat/modules/protections/nbt.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/nbt.ts rename to project/src/plugins/Anti-Cheat/modules/protections/nbt.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/nuker.ts b/project/src/plugins/Anti-Cheat/modules/protections/nuker.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/nuker.ts rename to project/src/plugins/Anti-Cheat/modules/protections/nuker.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/spam.ts b/project/src/plugins/Anti-Cheat/modules/protections/spam.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/spam.ts rename to project/src/plugins/Anti-Cheat/modules/protections/spam.ts diff --git a/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts b/project/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts similarity index 100% rename from src/plugins/Anti-Cheat/modules/protections/unobtainable.ts rename to project/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts diff --git a/src/plugins/Anti-Cheat/protections.ts b/project/src/plugins/Anti-Cheat/protections.ts similarity index 100% rename from src/plugins/Anti-Cheat/protections.ts rename to project/src/plugins/Anti-Cheat/protections.ts diff --git a/src/plugins/Anti-Cheat/utils.ts b/project/src/plugins/Anti-Cheat/utils.ts similarity index 100% rename from src/plugins/Anti-Cheat/utils.ts rename to project/src/plugins/Anti-Cheat/utils.ts diff --git a/src/plugins/ChatRanks/index.ts b/project/src/plugins/ChatRanks/index.ts similarity index 100% rename from src/plugins/ChatRanks/index.ts rename to project/src/plugins/ChatRanks/index.ts diff --git a/src/plugins/GlobalBans/index.ts b/project/src/plugins/GlobalBans/index.ts similarity index 100% rename from src/plugins/GlobalBans/index.ts rename to project/src/plugins/GlobalBans/index.ts diff --git a/src/plugins/GlobalBans/list.ts b/project/src/plugins/GlobalBans/list.ts similarity index 100% rename from src/plugins/GlobalBans/list.ts rename to project/src/plugins/GlobalBans/list.ts diff --git a/src/plugins/import.ts b/project/src/plugins/import.ts similarity index 100% rename from src/plugins/import.ts rename to project/src/plugins/import.ts diff --git a/src/types.ts b/project/src/types.ts similarity index 100% rename from src/types.ts rename to project/src/types.ts diff --git a/src/utils.ts b/project/src/utils.ts similarity index 100% rename from src/utils.ts rename to project/src/utils.ts diff --git a/texts/bg_BG.lang b/project/texts/bg_BG.lang similarity index 100% rename from texts/bg_BG.lang rename to project/texts/bg_BG.lang diff --git a/texts/cs_CZ.lang b/project/texts/cs_CZ.lang similarity index 100% rename from texts/cs_CZ.lang rename to project/texts/cs_CZ.lang diff --git a/texts/da_DK.lang b/project/texts/da_DK.lang similarity index 100% rename from texts/da_DK.lang rename to project/texts/da_DK.lang diff --git a/texts/de_DE.lang b/project/texts/de_DE.lang similarity index 100% rename from texts/de_DE.lang rename to project/texts/de_DE.lang diff --git a/texts/el_GR.lang b/project/texts/el_GR.lang similarity index 100% rename from texts/el_GR.lang rename to project/texts/el_GR.lang diff --git a/texts/en_GB.lang b/project/texts/en_GB.lang similarity index 100% rename from texts/en_GB.lang rename to project/texts/en_GB.lang diff --git a/texts/en_US.lang b/project/texts/en_US.lang similarity index 100% rename from texts/en_US.lang rename to project/texts/en_US.lang diff --git a/texts/es_ES.lang b/project/texts/es_ES.lang similarity index 100% rename from texts/es_ES.lang rename to project/texts/es_ES.lang diff --git a/texts/es_MX.lang b/project/texts/es_MX.lang similarity index 100% rename from texts/es_MX.lang rename to project/texts/es_MX.lang diff --git a/texts/fi_FI.lang b/project/texts/fi_FI.lang similarity index 100% rename from texts/fi_FI.lang rename to project/texts/fi_FI.lang diff --git a/texts/fr_CA.lang b/project/texts/fr_CA.lang similarity index 100% rename from texts/fr_CA.lang rename to project/texts/fr_CA.lang diff --git a/texts/fr_FR.lang b/project/texts/fr_FR.lang similarity index 100% rename from texts/fr_FR.lang rename to project/texts/fr_FR.lang diff --git a/texts/hu_HU.lang b/project/texts/hu_HU.lang similarity index 100% rename from texts/hu_HU.lang rename to project/texts/hu_HU.lang diff --git a/texts/id_ID.lang b/project/texts/id_ID.lang similarity index 100% rename from texts/id_ID.lang rename to project/texts/id_ID.lang diff --git a/texts/it_IT.lang b/project/texts/it_IT.lang similarity index 100% rename from texts/it_IT.lang rename to project/texts/it_IT.lang diff --git a/texts/ja_JP.lang b/project/texts/ja_JP.lang similarity index 100% rename from texts/ja_JP.lang rename to project/texts/ja_JP.lang diff --git a/texts/ko_KR.lang b/project/texts/ko_KR.lang similarity index 100% rename from texts/ko_KR.lang rename to project/texts/ko_KR.lang diff --git a/texts/language_names.json b/project/texts/language_names.json similarity index 100% rename from texts/language_names.json rename to project/texts/language_names.json diff --git a/texts/languages.json b/project/texts/languages.json similarity index 100% rename from texts/languages.json rename to project/texts/languages.json diff --git a/texts/nb_NO.lang b/project/texts/nb_NO.lang similarity index 100% rename from texts/nb_NO.lang rename to project/texts/nb_NO.lang diff --git a/texts/nl_NL.lang b/project/texts/nl_NL.lang similarity index 100% rename from texts/nl_NL.lang rename to project/texts/nl_NL.lang diff --git a/texts/pl_PL.lang b/project/texts/pl_PL.lang similarity index 100% rename from texts/pl_PL.lang rename to project/texts/pl_PL.lang diff --git a/texts/pt_BR.lang b/project/texts/pt_BR.lang similarity index 100% rename from texts/pt_BR.lang rename to project/texts/pt_BR.lang diff --git a/texts/pt_PT.lang b/project/texts/pt_PT.lang similarity index 100% rename from texts/pt_PT.lang rename to project/texts/pt_PT.lang diff --git a/texts/ru_RU.lang b/project/texts/ru_RU.lang similarity index 100% rename from texts/ru_RU.lang rename to project/texts/ru_RU.lang diff --git a/texts/sk_SK.lang b/project/texts/sk_SK.lang similarity index 100% rename from texts/sk_SK.lang rename to project/texts/sk_SK.lang diff --git a/texts/sv_SE.lang b/project/texts/sv_SE.lang similarity index 100% rename from texts/sv_SE.lang rename to project/texts/sv_SE.lang diff --git a/texts/tr_TR.lang b/project/texts/tr_TR.lang similarity index 100% rename from texts/tr_TR.lang rename to project/texts/tr_TR.lang diff --git a/texts/uk_UA.lang b/project/texts/uk_UA.lang similarity index 100% rename from texts/uk_UA.lang rename to project/texts/uk_UA.lang diff --git a/texts/zh_CN.lang b/project/texts/zh_CN.lang similarity index 100% rename from texts/zh_CN.lang rename to project/texts/zh_CN.lang diff --git a/texts/zh_TW.lang b/project/texts/zh_TW.lang similarity index 100% rename from texts/zh_TW.lang rename to project/texts/zh_TW.lang diff --git a/scripts/index.js.map b/scripts/index.js.map deleted file mode 100644 index 2af6015..0000000 --- a/scripts/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/index.ts", "../src/lib/Command/index.ts", "../src/config/commands.ts", "../src/lib/Command/ArgumentTypes.ts", "../src/database/Database.ts", "../src/config/database.ts", "../src/lib/Events/EntitiesLoad.ts", "../src/utils.ts", "../src/lib/Form/Models/MessageForm.ts", "../src/database/tables.ts", "../src/lib/Command/Callback.ts", "../src/lib/Command/utils.ts", "../src/lib/Chest GUI/index.ts", "../src/config/chest.ts", "../src/plugins/Anti-Cheat/utils.ts", "../src/plugins/Anti-Cheat/modules/models/Region.ts", "../src/plugins/Anti-Cheat/config/region.ts", "../src/plugins/Anti-Cheat/modules/models/Task.ts", "../src/plugins/Anti-Cheat/config/moderation.ts", "../src/plugins/Anti-Cheat/config/enchantments.ts", "../src/config/app.ts", "../src/lib/Chest GUI/Models/EntityChest.ts", "../src/lib/Events/onSlotChange.ts", "../src/lib/Chest GUI/utils.ts", "../src/lib/Chest GUI/Models/ItemGrabbedCallback.ts", "../src/lib/Chest GUI/Models/PageItem.ts", "../src/lib/Chest GUI/Models/FillTypes.ts", "../src/lib/Chest GUI/Models/Page.ts", "../src/lib/Chest GUI/pages/home.ts", "../src/plugins/Anti-Cheat/protections.ts", "../src/lang/text.ts", "../src/lib/Command/Command.ts", "../src/plugins/Anti-Cheat/modules/models/Ban.ts", "../src/plugins/Anti-Cheat/modules/commands/ban.ts", "../src/plugins/Anti-Cheat/modules/commands/database.ts", "../src/plugins/Anti-Cheat/modules/commands/ecwipe.ts", "../src/plugins/Anti-Cheat/modules/models/Freeze.ts", "../src/plugins/Anti-Cheat/modules/commands/freeze.ts", "../src/plugins/Anti-Cheat/modules/commands/help.ts", "../src/plugins/Anti-Cheat/modules/commands/lockdown.ts", "../src/plugins/Anti-Cheat/modules/models/Mute.ts", "../src/plugins/Anti-Cheat/modules/commands/mute.ts", "../src/plugins/Anti-Cheat/modules/commands/npc.ts", "../src/plugins/Anti-Cheat/modules/models/Npc.ts", "../src/plugins/Anti-Cheat/modules/commands/ping.ts", "../src/plugins/Anti-Cheat/modules/commands/region.ts", "../src/types.ts", "../src/plugins/Anti-Cheat/modules/commands/role.ts", "../src/lib/Form/Models/ActionForm.ts", "../src/lib/Form/Models/ModelForm.ts", "../src/lib/Form/Models/FormCallback.ts", "../src/plugins/Anti-Cheat/modules/forms/settings.ts", "../src/plugins/Anti-Cheat/modules/forms/automod.ts", "../src/plugins/Anti-Cheat/modules/forms/home.ts", "../src/plugins/Anti-Cheat/modules/commands/settings.ts", "../src/plugins/Anti-Cheat/modules/commands/vanish.ts", "../src/plugins/Anti-Cheat/modules/commands/version.ts", "../src/plugins/Anti-Cheat/modules/commands/kick.ts", "../src/plugins/Anti-Cheat/modules/models/Log.ts", "../src/plugins/Anti-Cheat/modules/commands/log.ts", "../src/plugins/Anti-Cheat/modules/commands/teleport.ts", "../src/plugins/Anti-Cheat/modules/managers/ban.ts", "../src/plugins/Anti-Cheat/modules/managers/freeze.ts", "../src/lib/Events/beforeChat.ts", "../src/plugins/Anti-Cheat/modules/managers/mute.ts", "../src/plugins/Anti-Cheat/modules/managers/region.ts", "../src/plugins/Anti-Cheat/modules/events/playerJoin.ts", "../src/plugins/Anti-Cheat/modules/pages/see.ts", "../src/plugins/Anti-Cheat/modules/protections/cbe.ts", "../src/plugins/Anti-Cheat/modules/models/Protection.ts", "../src/plugins/Anti-Cheat/modules/protections/crasher.ts", "../src/plugins/Anti-Cheat/modules/protections/gamemode.ts", "../src/plugins/Anti-Cheat/modules/models/PlayerLog.ts", "../src/lib/Events/beforeBlockBreak.ts", "../src/plugins/Anti-Cheat/modules/managers/containers.ts", "../src/plugins/Anti-Cheat/modules/models/BlockInventory.ts", "../src/plugins/Anti-Cheat/modules/protections/nuker.ts", "../src/plugins/Anti-Cheat/modules/protections/spam.ts", "../src/plugins/Anti-Cheat/modules/protections/unobtainable.ts", "../src/plugins/Anti-Cheat/modules/protections/nbt.ts", "../src/plugins/Anti-Cheat/modules/protections/movement.ts", "../src/lib/Events/onPlayerMove.ts", "../src/plugins/Anti-Cheat/config/movement.ts", "../src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts", "../src/plugins/Anti-Cheat/modules/events/worldInitialize.ts", "../src/config/objectives.ts", "../src/plugins/Anti-Cheat/index.ts", "../src/plugins/import.ts", "../src/database/index.ts"], - "sourcesContent": ["console.warn(`---- STARTING RUBEDO ----`);\nimport {\n ItemStack,\n MinecraftItemTypes,\n system,\n} from \"@minecraft/server\";\nimport \"./lib/Command/index\";\nimport \"./lib/Chest GUI/index\";\nimport \"./plugins/import\";\nimport \"./database/index\";\n\nsystem.events.beforeWatchdogTerminate.subscribe((data) => {\n data.cancel = true;\n console.warn(`WATCHDOG TRIED TO CRASH = ${data.terminateReason}`);\n});\n\n/**\n * This is air as a item,\n */\nexport const AIR = new ItemStack(MinecraftItemTypes.stick, 0);", "import { BeforeChatEvent, world } from \"@minecraft/server\";\r\nimport { PREFIX } from \"../../config/commands\";\r\nimport type { Command } from \"./Command\";\r\nimport {\r\n commandNotFound,\r\n commandSyntaxFail,\r\n getChatAugments,\r\n noPerm,\r\n sendCallback,\r\n} from \"./utils\";\r\n\r\n/**\r\n * An array of all active commands\r\n */\r\nexport const COMMANDS: Command[] = [];\r\n\r\nworld.events.beforeChat.subscribe((data) => {\r\n if (!data.message.startsWith(PREFIX)) return; // This is not a command\r\n data.cancel = true;\r\n const args = getChatAugments(data.message, PREFIX);\r\n const command = COMMANDS.find(\r\n (c) =>\r\n c.depth == 0 &&\r\n (c.data.name == args[0] || c.data?.aliases?.includes(args[0]))\r\n );\r\n const event = {\r\n message: data.message,\r\n sendToTargets: data.sendToTargets,\r\n sender: data.sender,\r\n targets: data.targets,\r\n } as BeforeChatEvent;\r\n if (!command) return commandNotFound(data.sender, args[0]);\r\n if (!command.data?.requires(data.sender))\r\n return noPerm(event.sender, command);\r\n args.shift(); // Remove first command so we can look at args\r\n // Check Args/SubCommands for errors\r\n const verifiedCommands: Command[] = [];\r\n const getArg = (start: Command, i: number): string => {\r\n if (start.children.length > 0) {\r\n const arg = start.children.find((v) => v.type.matches(args[i]).success);\r\n if (!arg && !args[i] && start.callback) return;\r\n if (!arg)\r\n return commandSyntaxFail(event.sender, command, start, args, i), \"fail\";\r\n if (!arg.data?.requires(event.sender))\r\n return noPerm(event.sender, arg), \"fail\";\r\n verifiedCommands.push(arg);\r\n return getArg(arg, i + 1);\r\n }\r\n };\r\n let v = getArg(command, 0);\r\n if (v == \"fail\") return;\r\n sendCallback(args, verifiedCommands, event, command);\r\n});\r\n", "/*\n|--------------------------------------------------------------------------\n| Command Prefix\n|--------------------------------------------------------------------------\n|\n| This is the prefix of the commands that are send in chat\n| changing this changes what people have to type in before using\n| a command for instance: -help. (-) is the command prefix.\n|\n*/\nexport const PREFIX = \"-\";\n", "import { Player, world } from \"@minecraft/server\";\r\nimport { TABLES } from \"../../database/tables\";\r\n\r\n/**\r\n * Fetch an online players data\r\n */\r\nexport function fetch(playerName: string): Player | null {\r\n return [...world.getPlayers()].find((player) => player.name === playerName);\r\n}\r\n\r\nexport interface IArgumentReturnData {\r\n /**\r\n * If this argument matches the value\r\n */\r\n success: boolean;\r\n /**\r\n * The parsed value that should be passed in command callback\r\n * if there is no return type this will be null\r\n */\r\n value?: T;\r\n}\r\n\r\nexport abstract class IArgumentType {\r\n /**\r\n * The return type\r\n */\r\n type: any;\r\n /**\r\n * The name that the help for this command will see\r\n * @example \"string\"\r\n * @example \"Location\"\r\n * @example \"int\"\r\n * @example \"number\"\r\n * @example \"UnitType\"\r\n */\r\n typeName: string;\r\n /**\r\n * The name this argument is\r\n */\r\n name: string = \"name\";\r\n /**\r\n * Checks if a value matches this argument type, also\r\n * returns the corresponding type\r\n */\r\n matches(value: string): IArgumentReturnData {\r\n return { success: true };\r\n }\r\n /**\r\n * the fail message that should be sent if player fails to meet the matches criteria\r\n * @param value value that was sent\r\n * @returns what would happen if you didn't enter the right value\r\n */\r\n fail(value: string): string {\r\n return `Value must be of type string!`;\r\n }\r\n constructor(name: string = \"any\") {}\r\n}\r\n\r\nexport class LiteralArgumentType implements IArgumentType {\r\n type: null;\r\n typeName = \"literal\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: this.name == value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `${value} should be ${this.name}!`;\r\n }\r\n constructor(public name: string = \"literal\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class StringArgumentType implements IArgumentType {\r\n type: string;\r\n typeName = \"string\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: value && value != \"\",\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `Value must be of type string!`;\r\n }\r\n constructor(public name: string = \"string\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class IntegerArgumentType implements IArgumentType {\r\n type: number;\r\n typeName = \"int\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: !isNaN(value as any),\r\n value: parseInt(value),\r\n };\r\n }\r\n fail(value: string): string {\r\n return `Value must be valid number!`;\r\n }\r\n constructor(public name: string = \"integer\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class FloatArgumentType implements IArgumentType {\r\n type: number;\r\n typeName = \"float\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: Boolean(value?.match(/^\\d+\\.\\d+$/)?.[0]),\r\n value: parseInt(value),\r\n };\r\n }\r\n fail(value: string): string {\r\n return `Value must be valid float!`;\r\n }\r\n constructor(public name: string = \"float\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class LocationArgumentType implements IArgumentType {\r\n type: string;\r\n typeName = \"location\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: /^([~^]{0,1}(-\\d)?(\\d*)?(\\.(\\d+))?)$/.test(value),\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `Value needs to be a valid number, value can include: [~,^]`;\r\n }\r\n constructor(public name: string = \"location\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class BooleanArgumentType implements IArgumentType {\r\n type: boolean;\r\n typeName = \"boolean\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: Boolean(value?.match(/^(true|false)$/)?.[0]),\r\n value: value == \"true\" ? true : false,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `\"${value}\" can be either \"true\" or \"false\"`;\r\n }\r\n constructor(public name: string = \"boolean\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class PlayerArgumentType implements IArgumentType {\r\n type: Player;\r\n typeName = \"Player\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: fetch(value) ? true : false,\r\n value: fetch(value),\r\n };\r\n }\r\n fail(value: string): string {\r\n return `player: \"${value}\", is not in this world`;\r\n }\r\n constructor(public name: string = \"player\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class TargetArgumentType implements IArgumentType {\r\n type: string;\r\n typeName = \"Target\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: Boolean(value?.match(/^(@.|\"[\\s\\S]+\")$/)?.[0]),\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `${value} is not a valid target`;\r\n }\r\n constructor(public name: string = \"target\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport class ArrayArgumentType>\r\n implements IArgumentType\r\n{\r\n type: T[number];\r\n typeName = \"string\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: this.types.includes(value),\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `\"${value}\" must be one of these values: ${this.types.join(\" | \")}`;\r\n }\r\n constructor(public name: string = \"array\", public types: T) {\r\n this.name = name;\r\n this.types = types;\r\n\r\n this.typeName = types.join(\" | \").replace(/(.{25})..+/, \"$1...\");\r\n }\r\n}\r\n\r\nexport class DurationArgumentType implements IArgumentType {\r\n type: string;\r\n typeName = \"Duration\";\r\n matches(value: string): IArgumentReturnData {\r\n return {\r\n success: /^(\\d+[hdysmw],?)+$/.test(value),\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `\"${value}\" must be a value like \"10d\" or \"3s\" the first part is the length second is unit`;\r\n }\r\n constructor(public name: string) {}\r\n}\r\n\r\nexport class PlayerNameArgumentType implements IArgumentType {\r\n type: string;\r\n typeName = \"playerName\";\r\n matches(value: string): IArgumentReturnData {\r\n const player = TABLES.ids.get(value);\r\n return {\r\n success: player ? true : false,\r\n value: value,\r\n };\r\n }\r\n fail(value: string): string {\r\n return `player: \"${value}\" has never played this world before! Tip: if the name has spaces in it use quotes around name!`;\r\n }\r\n constructor(public name: string = \"playerName\") {\r\n this.name = name;\r\n }\r\n}\r\n\r\nexport const ArgumentTypes = {\r\n string: StringArgumentType,\r\n int: IntegerArgumentType,\r\n float: FloatArgumentType,\r\n location: LocationArgumentType,\r\n boolean: BooleanArgumentType,\r\n player: PlayerArgumentType,\r\n target: TargetArgumentType,\r\n array: ArrayArgumentType,\r\n duration: DurationArgumentType,\r\n playerName: PlayerNameArgumentType,\r\n};\r\n", "import { Entity, ItemStack, MinecraftItemTypes } from \"@minecraft/server\";\nimport {\n ENTITY_IDENTIFIER,\n ENTITY_LOCATION,\n INVENTORY_SIZE,\n MAX_DATABASE_STRING_SIZE,\n} from \"../config/database\";\nimport { EntitiesLoad } from \"../lib/Events/EntitiesLoad\";\nimport { DIMENSIONS } from \"../utils\";\nimport { chunkString } from \"../utils\";\n\nexport class Database {\n /**\n * Creates a table entity that is used for data storage\n * @param tableName\n * @param index if not specified no index will be set\n * @returns\n */\n static createTableEntity(tableName: string, index?: number): Entity {\n const entity = DIMENSIONS.overworld.spawnEntity(\n ENTITY_IDENTIFIER,\n ENTITY_LOCATION\n );\n entity.setDynamicProperty(\"tableName\", tableName);\n entity.nameTag = `\u00A7aDatabase Table: ${tableName}\u00A7r`;\n if (index) entity.setDynamicProperty(\"index\", index);\n return entity;\n }\n\n /**\n * Gets all table Entities associated with this tableName\n * @param tableName\n * @returns\n */\n static getTableEntities(tableName: string): Entity[] {\n return DIMENSIONS.overworld\n .getEntitiesAtBlockLocation(ENTITY_LOCATION)\n .filter(\n (e) =>\n e.typeId == ENTITY_IDENTIFIER &&\n e.getDynamicProperty(\"tableName\") == tableName\n );\n }\n\n /**\n * Data saved in memory\n */\n private MEMORY: { [key in Key]: Value } | null;\n\n /**\n * List of queued tasks on this table\n */\n private QUEUE: Array<() => void>;\n\n constructor(public tableName: string) {\n this.tableName = tableName;\n this.MEMORY = null;\n this.QUEUE = [];\n EntitiesLoad.subscribe(async () => {\n await this.initData();\n this.QUEUE.forEach((v) => v());\n });\n }\n\n /**\n * Adds a queue task to be awaited\n * @returns once its this items time to run in queue\n */\n private async addQueueTask(): Promise {\n return new Promise((resolve) => {\n this.QUEUE.push(resolve);\n });\n }\n\n /**\n * Saves data into this database\n * @param data\n * @returns once data is saved\n */\n private async saveData(): Promise {\n if (!this.MEMORY) await this.addQueueTask();\n\n let entities = Database.getTableEntities(this.tableName);\n /**\n * The split chunks of the stringified data, This is done because we can\n * only store {@link MAX_DATABASE_STRING_SIZE} chars in a single nameTag\n */\n let chunks = chunkString(\n JSON.stringify(this.MEMORY),\n MAX_DATABASE_STRING_SIZE\n );\n /**\n * The amount of entities that is needed to store {@link chunks} data\n */\n const entitiesNeeded =\n Math.ceil(chunks.length / INVENTORY_SIZE) - entities.length;\n if (entitiesNeeded > 0) {\n for (let i = 0; i < entitiesNeeded; i++) {\n entities.push(Database.createTableEntity(this.tableName));\n }\n }\n for (const [i, entity] of entities.entries()) {\n const inventory = entity.getComponent(\"inventory\").container;\n for (const [i, chunk] of chunks.entries()) {\n if (!chunk) continue;\n if (i > inventory.size - 1) break; // Exit because it has maxed items\n let item = new ItemStack(MinecraftItemTypes.acaciaBoat);\n item.nameTag = chunk;\n inventory.setItem(i, item);\n chunks[i] = null; // Delete chunk because its been set.\n }\n // Set all unUsed slots to air\n for (let i = chunks.length + 1; i < inventory.size; i++) {\n inventory.setItem(i, new ItemStack(MinecraftItemTypes.stick, 0));\n }\n entity.setDynamicProperty(\"index\", i);\n entities[i] = null; // Set this entity to null because its maxed out!\n // If all chunks have been saved no need to go to next entity\n if (!chunks.find((v) => v)) break;\n }\n // Check for unUsed entities and despawn them\n entities.filter((e) => e).forEach((e) => e.triggerEvent(\"despawn\"));\n return;\n }\n\n /**\n * Grabs Data and should only be used on worldLoad\n * @returns\n */\n private async initData(): Promise<{ [key in Key]: Value }> {\n let entities = Database.getTableEntities(this.tableName).sort(\n (a, b) =>\n (a.getDynamicProperty(\"index\") as number) -\n (b.getDynamicProperty(\"index\") as number)\n );\n let stringifiedData: string = \"\";\n for (const entity of entities) {\n const inventory = entity.getComponent(\"inventory\").container;\n for (let i = 0; i < inventory.size; i++) {\n const item = inventory.getItem(i);\n if (!item) continue;\n stringifiedData = stringifiedData + item.nameTag;\n }\n }\n const data = stringifiedData == \"\" ? {} : JSON.parse(stringifiedData);\n this.MEMORY = data;\n return data;\n }\n\n /**\n * Sets a key to a value in this table\n * @param key\n * @param value\n */\n async set(key: Key, value: Value): Promise {\n this.MEMORY[key] = value;\n return this.saveData();\n }\n\n /**\n * Gets a value from this table\n * @param key\n * @returns the keys corresponding key\n */\n get(key: Key): Value {\n if (!this.MEMORY)\n throw new Error(\n \"Entities not loaded! Consider using `getAsync` instead!\"\n );\n return this.MEMORY[key];\n }\n\n /**\n * Gets a value async from this table, this should be used on calls from like\n * entityCreate, system.runSchedule or things that could be before database entities spawn\n * @param key\n * @returns\n */\n async getSync(key: Key): Promise {\n if (this.MEMORY) return this.get(key);\n await this.addQueueTask();\n return this.MEMORY[key];\n }\n\n /**\n * Get all the keys in the table\n * @returns\n */\n keys(): Key[] {\n if (!this.MEMORY)\n throw new Error(\n \"Entities not loaded! Consider using `keysSync` instead!\"\n );\n return Object.keys(this.MEMORY) as Key[];\n }\n\n /**\n * Get all the keys in the table async, this should be used on world load\n * @returns\n */\n async keysSync(): Promise {\n if (this.MEMORY) return this.keys();\n await this.addQueueTask();\n return Object.keys(this.MEMORY) as Key[];\n }\n\n /**\n * Get all the values in the table\n * @returns\n */\n values(): Value[] {\n if (!this.MEMORY)\n throw new Error(\n \"Entities not loaded! Consider using `valuesSync` instead!\"\n );\n return Object.values(this.MEMORY) as Value[];\n }\n\n /**\n * Get all the values in the table async, this should be used on world load\n * @returns\n */\n async valuesSync(): Promise {\n if (this.MEMORY) return this.values();\n await this.addQueueTask();\n return Object.values(this.MEMORY) as Value[];\n }\n\n /**\n * Check if the key exists in the table\n * @param key the key to test\n * @returns\n */\n has(key: Key): boolean {\n if (!this.MEMORY)\n throw new Error(\"Entities not loaded! Consider using `hasSync` instead!\");\n return (Object.keys(this.MEMORY) as Key[]).includes(key);\n }\n\n /**\n * Check if the key exists in the table async, this should be used on worldLoad\n * @param key the key to test\n * @returns\n */\n async hasSync(key: Key): Promise {\n if (this.MEMORY) return this.has(key);\n await this.addQueueTask();\n return (Object.keys(this.MEMORY) as Key[]).includes(key);\n }\n\n /**\n * Gets all the keys and values\n * @returns\n */\n collection(): { [key in Key]: Value } {\n if (!this.MEMORY)\n throw new Error(\n \"Entities not loaded! Consider using `collectionSync` instead!\"\n );\n return this.MEMORY;\n }\n\n /**\n * Gets all the keys and values async, this should be used for grabbingCollection on world load\n * @returns\n */\n async collectionSync(): Promise<{ [key in Key]: Value }> {\n if (this.MEMORY) return this.collection();\n await this.addQueueTask();\n return this.MEMORY;\n }\n\n /**\n * Delete the key from the table\n * @param key the key to delete\n * @returns\n */\n async delete(key: Key): Promise {\n const status = delete this.MEMORY[key];\n await this.saveData();\n return status;\n }\n\n /**\n * Clear everything in the table\n */\n async clear(): Promise {\n this.MEMORY = {} as { [key in Key]: Value };\n return await this.saveData();\n }\n}\n", "import { BlockLocation } from \"@minecraft/server\";\n\n/*\n|--------------------------------------------------------------------------\n| Max Database string size\n|--------------------------------------------------------------------------\n|\n| Here is the max database save size meaning when a save gets made\n| it tests the size of that save and splits up the save depending on this\n| Size. It's related to Minecraft's 32k bit limit.\n|\n*/\nexport const MAX_DATABASE_STRING_SIZE = 32000;\n\n/*\n|--------------------------------------------------------------------------\n| Entity Id\n|--------------------------------------------------------------------------\n|\n| This is the entity id of the database this is what stores the information\n| of the database on its nameTag\n|\n*/\nexport const ENTITY_IDENTIFIER = \"rubedo:database\";\n\n/*\n|--------------------------------------------------------------------------\n| Entity Spawn Location\n|--------------------------------------------------------------------------\n|\n| This is the spawn location of the database entities there will be\n| Multiple entities at this location for each chunk\n|\n*/\nexport const ENTITY_LOCATION = new BlockLocation(0, -64, 0);\n\n/*\n|--------------------------------------------------------------------------\n| Entity's INVENTORY_SIZE\n|--------------------------------------------------------------------------\n|\n| The max amount of items this entity can store in its inventory\n|\n*/\nexport const INVENTORY_SIZE = 128;\n", "import { system, world } from \"@minecraft/server\";\r\nimport { DIMENSIONS } from \"../../utils\";\r\n\r\nconst CALLBACKS: {\r\n [key: number]: () => void;\r\n} = {};\r\n\r\n/**\r\n * If the world is loaded or not\r\n */\r\nexport let ENTITIES_LOADED = false;\r\n\r\nsystem.run(async () => {\r\n try {\r\n await DIMENSIONS.overworld.runCommandAsync(`testfor @a`);\r\n ENTITIES_LOADED = true;\r\n for (const [i, callback] of Object.entries(CALLBACKS)) {\r\n callback();\r\n delete CALLBACKS[i as unknown as number];\r\n }\r\n } catch (error) {\r\n let e = world.events.entityCreate.subscribe((data) => {\r\n system.run(() => {\r\n ENTITIES_LOADED = true;\r\n for (const [i, callback] of Object.entries(CALLBACKS)) {\r\n callback();\r\n delete CALLBACKS[i as unknown as number];\r\n }\r\n world.events.entityCreate.unsubscribe(e);\r\n });\r\n });\r\n }\r\n});\r\n\r\nexport class EntitiesLoad {\r\n static async awaitLoad(): Promise {\r\n if (ENTITIES_LOADED) return;\r\n return new Promise((resolve) => {\r\n EntitiesLoad.subscribe(resolve);\r\n });\r\n }\r\n static subscribe(callback: () => void): number {\r\n if (ENTITIES_LOADED) {\r\n callback();\r\n return;\r\n }\r\n const key = Object.keys(CALLBACKS).length;\r\n CALLBACKS[key] = callback;\r\n return key;\r\n }\r\n\r\n static unsubscribe(key: number): void {\r\n delete CALLBACKS[key];\r\n }\r\n}\r\n", "import {\r\n BlockLocation,\r\n Entity,\r\n Location,\r\n MinecraftDimensionTypes,\r\n Player,\r\n system,\r\n Vector3,\r\n world,\r\n} from \"@minecraft/server\";\r\nimport { TABLES } from \"./database/tables\";\r\nimport { MessageForm } from \"./lib/Form/Models/MessageForm\";\r\nimport { durationSegment, durationSegmentType } from \"./types\";\r\n\r\n/**\r\n * This is to reduce lag when grabbing dimensions keep them set and pre-defined\r\n */\r\nexport const DIMENSIONS = {\r\n overworld: world.getDimension(MinecraftDimensionTypes.overworld),\r\n nether: world.getDimension(MinecraftDimensionTypes.nether),\r\n theEnd: world.getDimension(MinecraftDimensionTypes.theEnd),\r\n \"minecraft:overworld\": world.getDimension(MinecraftDimensionTypes.overworld),\r\n \"minecraft:nether\": world.getDimension(MinecraftDimensionTypes.nether),\r\n \"minecraft:the_end\": world.getDimension(MinecraftDimensionTypes.theEnd),\r\n};\r\n\r\n/**\r\n * Get score of an entity\r\n * @example getScore(Entity, 'Money');\r\n */\r\nexport function getScore(entity: Entity, objective: string): number {\r\n try {\r\n return world.scoreboard.getObjective(objective).getScore(entity.scoreboard);\r\n } catch (error) {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * sets the score of a name\r\n * @example setScore(\"Smell of curry\", 'Money');\r\n */\r\nexport function setScore(\r\n entityName: string,\r\n objective: string,\r\n value: Number\r\n): void {\r\n try {\r\n DIMENSIONS.overworld.runCommandAsync(\r\n `scoreboard players set \"${entityName}\" ${objective} ${value}`\r\n );\r\n } catch (error) {\r\n console.warn(error + error.stack);\r\n }\r\n}\r\n\r\n/**\r\n * Gets a players id based on a saved database values\r\n * @param playerName playerName to get\r\n */\r\nexport function getId(playerName: string): string | null {\r\n return TABLES.ids.get(playerName);\r\n}\r\n\r\n/**\r\n * Duration converter\r\n * @param duration time to convert\r\n * @example ```\r\n * durationToMs(\"10s\")\r\n * durationToMs(\"10d,2y\")\r\n * durationToMs(\"5m\")\r\n * durationToMs(\"23ms,10s\")\r\n * ```\r\n */\r\nexport function durationToMs(duration: string): number {\r\n /**\r\n * This holds the different duration values this duration can have\r\n * @example `[\"10d\", \"20s\", \"2h\"]`\r\n * @example `[\"2h\"]`\r\n */\r\n const values: durationSegment[] = duration.split(\",\") as durationSegment[];\r\n console.warn(values.length);\r\n let ms = 0;\r\n for (const value of values) {\r\n const length = parseInt(value.match(/\\D+|\\d+/g)[0]);\r\n const unit = value.match(/\\D+|\\d+/g)[1] as durationSegmentType;\r\n if (unit == \"y\") ms = ms + 3.17098e-11 * length;\r\n if (unit == \"w\") ms = ms + 6.048e8 * length;\r\n if (unit == \"d\") ms = ms + 8.64e7 * length;\r\n if (unit == \"h\") ms = ms + 3.6e6 * length;\r\n if (unit == \"m\") ms = ms + 60000 * length;\r\n if (unit == \"s\") ms = ms + 1000 * length;\r\n if (unit == \"ms\") ms = ms + length;\r\n }\r\n return ms;\r\n}\r\n\r\n/**\r\n * Converts a date stored in ms to a Date string\r\n * @param duration milliseconds to convert\r\n * @returns Date as a string\r\n */\r\nexport function msToTime(duration: number) {\r\n return new Date(duration).toString();\r\n}\r\n\r\n/**\r\n * Converts a location to a block location\r\n */\r\nexport function vector3ToBlockLocation(loc: Vector3): BlockLocation {\r\n return new BlockLocation(\r\n Math.floor(loc.x),\r\n Math.floor(loc.y),\r\n Math.floor(loc.z)\r\n );\r\n}\r\n\r\n/**\r\n * Sends a confirmation message to a player to confirm a action\r\n * @param action action message to confirm\r\n * @param onConfirm callback to run when a player confirms the action\r\n * @param onCancel callback to run when a player cancels the action, this can be null\r\n * @example ```\r\n * confirmAction(\"Ban Smell of curry\", () => {\r\n * new Ban(\"Smell of curry\")\r\n * })\r\n * ```\r\n */\r\nexport function confirmAction(\r\n player: Player,\r\n action: string,\r\n onConfirm: () => void,\r\n onCancel: () => void = () => {}\r\n) {\r\n new MessageForm(\"Confirm To Continue\", action)\r\n .setButton1(\"Confirm\", onConfirm)\r\n .setButton2(\"Never Mind\", onCancel)\r\n .show(player);\r\n}\r\n\r\n/**\r\n * Sleeps your code\r\n * @param {number} tick time in ticks you want the return to occur\r\n * @returns {Promise}\r\n */\r\nexport function sleep(tick: number): Promise {\r\n return new Promise((resolve) => {\r\n let runScheduleId = system.runSchedule(() => {\r\n resolve();\r\n system.clearRunSchedule(runScheduleId);\r\n }, tick);\r\n });\r\n}\r\n\r\n/**\r\n * Checks if a location equals another location\r\n * @param a first location\r\n * @param b location to test against first\r\n * @returns {boolean} if they locations are the same\r\n */\r\nexport function LocationEquals(\r\n a: Vector3 | Location | BlockLocation,\r\n b: Vector3 | Location | BlockLocation\r\n): boolean {\r\n let aLocations = [a.x, a.y, a.z];\r\n let bLocations = [a.x, a.y, a.z];\r\n if (a instanceof BlockLocation || b instanceof BlockLocation) {\r\n aLocations = aLocations.map((v) => Math.trunc(v));\r\n bLocations = bLocations.map((v) => Math.trunc(v));\r\n }\r\n return aLocations.find((v, i) => bLocations[i] != v) ? false : true;\r\n}\r\n\r\n/**\r\n * Sorts 3D vectors to a min and max vector\r\n * @param vector1\r\n * @param vector2\r\n * @returns {[Vector3, Vector3]}\r\n * @author \"mrpatches123\"\r\n */\r\nexport function sort3DVectors(\r\n vector1: Vector3,\r\n vector2: Vector3\r\n): [Vector3, Vector3] {\r\n const { x: x1, y: y1, z: z1 } = vector1;\r\n const { x: x2, y: y2, z: z2 } = vector2;\r\n const ox1 = x1 < x2 ? x1 : x2;\r\n const oy1 = y1 < y2 ? y1 : y2;\r\n const oz1 = z1 < z2 ? z1 : z2;\r\n const ox2 = x1 < x2 ? x2 : x1;\r\n const oy2 = y1 < y2 ? y2 : y1;\r\n const oz2 = z1 < z2 ? z2 : z1;\r\n return [\r\n { x: ox1, y: oy1, z: oz1 },\r\n { x: ox2, y: oy2, z: oz2 },\r\n ];\r\n}\r\n\r\n/**\r\n * Checks if a target vector is between two vectors\r\n * @param target\r\n * @param vector1\r\n * @param vector2\r\n * @returns\r\n * @author \"mrpatches123\"\r\n */\r\nexport function betweenVector3(\r\n target: Vector3,\r\n vector1: Vector3,\r\n vector2: Vector3\r\n): boolean {\r\n const [{ x: x1, y: y1, z: z1 }, { x: x2, y: y2, z: z2 }] = sort3DVectors(\r\n vector1,\r\n vector2\r\n );\r\n let { x, y, z } = target;\r\n return x >= x1 && x <= x2 && y >= y1 && y <= y2 && z >= z1 && z <= z2;\r\n}\r\n\r\n/**\r\n * Splits a string into chunk sizes\r\n */\r\nexport function chunkString(str: string, length: number): string[] {\r\n return str.match(new RegExp(\".{1,\" + length + \"}\", \"g\"));\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { MessageFormData } from \"@minecraft/server-ui\";\r\nimport { TIMEOUT_THRESHOLD } from \"../../../config/form\";\r\nimport type { ButtonCallback, IMessageFormButton } from \"../types\";\r\n\r\nexport class MessageForm {\r\n /**\r\n * the title that this form should have\r\n */\r\n title?: string;\r\n /**\r\n * extra text that should be displayed in the form\r\n */\r\n body?: string;\r\n /**\r\n * The default minecraft form this form is based on\r\n */\r\n private form: MessageFormData;\r\n /**\r\n * the first button of the dialog.\r\n */\r\n private button1: IMessageFormButton;\r\n /**\r\n * the second button of the dialog.\r\n */\r\n private button2: IMessageFormButton;\r\n /**\r\n * The amount of times it takes to show this form in ms\r\n * if this value goes above 200 it will time out\r\n */\r\n private triedToShow: number;\r\n\r\n /**\r\n * Creates a new form to be shown to a player\r\n * @param title the title that this form should have\r\n * @param body extra text that should be displayed in the form\r\n */\r\n constructor(title?: string, body?: string) {\r\n this.title = title;\r\n this.body = body;\r\n this.form = new MessageFormData();\r\n\r\n if (title) this.form.title(title);\r\n if (body) this.form.body(body);\r\n\r\n this.triedToShow = 0;\r\n }\r\n\r\n /**\r\n * Method that sets the text for the first button of the dialog.\r\n * @param text text to show on this button\r\n * @param callback what happens when this button is clicked\r\n * @example ```\r\n * setButton1(\"settings\", () => {})\r\n * ```\r\n */\r\n setButton1(text: string, callback?: ButtonCallback): MessageForm {\r\n this.button1 = { text: text, callback: callback };\r\n this.form.button1(text);\r\n return this;\r\n }\r\n\r\n /**\r\n * Method that sets the text for the second button of the dialog.\r\n * @param text text to show on this button\r\n * @param callback what happens when this button is clicked\r\n * @example ```\r\n * setButton2(\"settings\", () => {})\r\n * ```\r\n */\r\n setButton2(text: string, callback?: ButtonCallback): MessageForm {\r\n this.button2 = { text: text, callback: callback };\r\n this.form.button2(text);\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows this form to the player\r\n * @param player player to show to\r\n */\r\n show(player: Player): void {\r\n this.form.show(player).then((response) => {\r\n if (response.canceled) {\r\n if (response.cancelationReason == \"userBusy\") {\r\n // check time and reshow form\r\n if (this.triedToShow > TIMEOUT_THRESHOLD)\r\n return player.tell(\r\n `\u00A7cForm Timeout: tried to show form, but you were busy (close chat after running command)`\r\n );\r\n this.triedToShow++;\r\n this.show(player);\r\n }\r\n return;\r\n }\r\n if (response.selection == 1) this.button1?.callback?.();\r\n if (response.selection == 0) this.button2?.callback?.();\r\n });\r\n }\r\n}\r\n", "import type {\r\n IRegionDB,\r\n IMuteData,\r\n IBanData,\r\n IFreezeData,\r\n INpcLocation,\r\n LogData,\r\n IProtectionsConfig,\r\n} from \"../types\";\r\nimport type { ROLES } from \"../types\";\r\nimport { Database } from \"./Database\";\r\n\r\n/**\r\n * All the Database tables that are created\r\n */\r\nexport const TABLES = {\r\n config: new Database(\"config\"),\r\n freezes: new Database(\"freezes\"),\r\n mutes: new Database(\"mutes\"),\r\n bans: new Database(\"bans\"),\r\n regions: new Database(\"regions\"),\r\n roles: new Database(\"roles\"),\r\n tasks: new Database(\"tasks\"),\r\n npcs: new Database(\"npcs\"),\r\n ids: new Database(\"ids\"),\r\n logs: new Database(\"logs\"),\r\n protections: new Database(\"protections\"),\r\n};\r\n", "import { BeforeChatEvent, Player } from \"@minecraft/server\";\r\n\r\nexport class CommandCallback {\r\n data: BeforeChatEvent;\r\n sender: Player;\r\n\r\n /**\r\n * Returns a commands callback\r\n * @param data chat data that was used\r\n */\r\n constructor(data: BeforeChatEvent) {\r\n this.data = data;\r\n this.sender = data.sender;\r\n }\r\n /**\r\n * Replies to the sender of a command callback\r\n * @param text Message or a lang code\r\n * @example ctx.reply('Hello World!');\r\n */\r\n reply(text: string) {\r\n this.sender.tell(text);\r\n }\r\n}\r\n", "import { BeforeChatEvent, Player, Vector, Vector3 } from \"@minecraft/server\";\nimport { PREFIX } from \"../../config/commands\";\nimport { LiteralArgumentType, LocationArgumentType } from \"./ArgumentTypes\";\nimport { CommandCallback } from \"./Callback\";\nimport type { Command } from \"./Command\";\n\n/**\n * Returns a Before chat events augments\n * @example this.getChatAugments(BeforeChatEvent)\n */\nexport function getChatAugments(\n message: string,\n prefix: string\n): Array {\n try {\n return message\n .slice(prefix.length)\n .trim()\n .match(/\"[^\"]+\"|[^\\s]+/g)\n .map((e) => e.replace(/\"(.+)\"/, \"$1\").toString());\n } catch (error) {\n return [];\n }\n}\n\n/**\n * Sends a command not found message to a player\n * @param player player to send message to\n */\nexport function commandNotFound(player: Player, command: string) {\n player.tell({\n rawtext: [\n {\n text: `\u00A7c`,\n },\n {\n translate: `commands.generic.unknown`,\n with: [`${command}`],\n },\n ],\n });\n}\n\n/**\n * Sends a command not found message to a player\n * @param player player to send message to\n */\nexport function noPerm(player: Player, command: Command) {\n player.tell({\n rawtext: [\n {\n text: command.data.invalidPermission\n ? command.data.invalidPermission\n : `\u00A7cYou do not have permission to use \"${command.data.name}\"`,\n },\n ],\n });\n}\n\n/**\n * Sends a syntax failure message to player\n * @param player\n * @param command\n * @param args\n * @param i\n */\nexport function commandSyntaxFail(\n player: Player,\n baseCommand: Command,\n command: Command,\n args: string[],\n i: number\n) {\n player.tell({\n rawtext: [\n {\n text: `\u00A7c`,\n },\n {\n translate: `commands.generic.syntax`,\n with: [\n `${PREFIX}${baseCommand.data.name} ${args.slice(0, i).join(\" \")}`,\n args[i] ?? \" \",\n args.slice(i + 1).join(\" \"),\n ],\n },\n ],\n });\n if (command.children.length > 1 || !args[i]) {\n // this type could be many things\n const types = command.children.map((c) =>\n c.type instanceof LiteralArgumentType ? c.type.name : c.type?.typeName\n );\n player.tell(\n `\u00A7c\"${args[i] ?? \"undefined\"}\" is not valid! Argument \"${\n [...new Set(command.children.map((c) => c.type.name))][0]\n }\" can be typeof: \"${types.join('\", \"')}\"`\n );\n } else {\n // this type is only 1 thing\n player.tell(`\u00A7c${command.children[0]?.type?.fail(args[i])}`);\n }\n}\n\n/**\n * Returns a location of the inputted argument\n * @example parseLocationArgs([\"~1\", \"3\", \"^7\"], { location: [1,2,3] , viewVector: [1,2,3] })\n */\nexport function parseLocationArgs(\n [x, y, z]: [x: string, y: string, z: string],\n { location, viewVector }: { location: Vector3; viewVector: Vector }\n): Vector3 {\n if (!x || !y || !x) return null;\n const locations = [location.x, location.y, location.z];\n const viewVectors = [viewVector.x, viewVector.y, viewVector.z];\n const a = [x, y, z].map((arg) => {\n const r = parseFloat(arg);\n return isNaN(r) ? 0 : r;\n });\n const b = [x, y, z].map((arg, index) => {\n return arg.includes(\"~\")\n ? a[index] + locations[index]\n : arg.includes(\"^\")\n ? a[index] + viewVectors[index]\n : a[index];\n });\n return { x: b[0], y: b[1], z: b[2] };\n}\n\n/**\n * Sends a callback back to the command\n * @param cmdArgs the args that the command used\n * @param args args to use\n */\nexport function sendCallback(\n cmdArgs: string[],\n args: Command[],\n event: BeforeChatEvent,\n baseCommand: Command\n) {\n const lastArg = args[args.length - 1] ?? baseCommand;\n const argsToReturn: any[] = [];\n for (const [i, arg] of args.entries()) {\n if (arg.type.name.endsWith(\"*\")) continue;\n if (arg.type instanceof LocationArgumentType) {\n argsToReturn.push(\n parseLocationArgs(\n [cmdArgs[i], cmdArgs[i + 1], cmdArgs[i + 2]],\n event.sender\n )\n );\n continue;\n }\n if (arg.type instanceof LiteralArgumentType) continue;\n argsToReturn.push(arg.type.matches(cmdArgs[i]).value ?? cmdArgs[i]);\n }\n lastArg.callback(new CommandCallback(event), ...argsToReturn);\n}\n", "import { system, world } from \"@minecraft/server\";\r\nimport { ENTITY_INVENTORY, GUI_ITEM } from \"../../config/chest\";\r\nimport { getRole } from \"../../plugins/Anti-Cheat/utils.js\";\r\nimport { ChestGUI } from \"./Models/EntityChest\";\r\nimport { CHESTGUIS, getHeldItem } from \"./utils.js\";\r\nimport \"./pages/home\";\r\nimport { DIMENSIONS } from \"../../utils.js\";\r\nimport { EntitiesLoad } from \"../Events/EntitiesLoad\";\r\n\r\nEntitiesLoad.subscribe(() => {\r\n system.runSchedule(() => {\r\n for (const player of world.getPlayers()) {\r\n /**\r\n * Loop through all players, check if player has a chest gui\r\n * if not create them one\r\n * Once all players are checked verify there are no false entities\r\n */\r\n if (getHeldItem(player)?.typeId != GUI_ITEM) {\r\n if (CHESTGUIS[player.name]) CHESTGUIS[player.name].despawn();\r\n continue;\r\n }\r\n // Player has a item Held we need to verify that they have a gui\r\n if (Object.keys(CHESTGUIS).includes(player?.name)) continue;\r\n // Player does not have a chest gui spawn them in one\r\n if (getRole(player) != \"admin\") continue;\r\n CHESTGUIS[player.name] = new ChestGUI(player);\r\n }\r\n }, 10);\r\n});\r\n\r\n/**\r\n * This system will detect false entities and kill them to\r\n * reduce lag and eliminate broken/left players/entities\r\n */\r\nsystem.runSchedule(() => {\r\n const validIds = Object.values(CHESTGUIS).map((c) => c.entity.id);\r\n for (const entity of DIMENSIONS.overworld.getEntities({\r\n type: ENTITY_INVENTORY,\r\n })) {\r\n if (validIds.includes(entity.id)) continue;\r\n // This entity is not valid so we despawn it\r\n entity.triggerEvent(\"despawn\");\r\n }\r\n}, 100);\r\n", "/*\n|--------------------------------------------------------------------------\n| Gui item\n|--------------------------------------------------------------------------\n|\n| This is the GUI item that is used to open up the gui\n| this is set to the identifier of item.json and is used to find the item\n| in the gui template\n|\n*/\nexport const GUI_ITEM = \"rubedo:gui\";\n\n/*\n|--------------------------------------------------------------------------\n| Entity Inventory\n|--------------------------------------------------------------------------\n|\n| The id of the entity inventory\n| this is found in the entities file\n| this will be updated if inventory entity is changed\n|\n*/\nexport const ENTITY_INVENTORY = \"rubedo:inventory\";\n\n/*\n|--------------------------------------------------------------------------\n| Default Static Page id\n|--------------------------------------------------------------------------\n|\n| This is the default static page id of what is open by default\n| when you click on the gui, this can be changed but it probably shouldn't\n| because static pages will need to be changed\n|\n*/\nexport const DEFAULT_STATIC_PAGE_ID = \"home\";\n", "import {\n world,\n Player,\n BlockLocation,\n MinecraftBlockTypes,\n Enchantment,\n GameMode,\n system,\n} from \"@minecraft/server\";\nimport type { ConfigType, ROLES } from \"../../types\";\nimport { TABLES } from \"../../database/tables\";\nimport { Region } from \"./modules/models/Region.js\";\nimport { ChangePlayerRoleTask } from \"./modules/models/Task\";\nimport type { IplayerTickRegister } from \"../../types\";\nimport { BANNED_BLOCKS, BANNED_ITEMS } from \"./config/moderation\";\nimport { ENCHANTMENTS } from \"./config/enchantments\";\nimport { APPEAL_LINK } from \"../../config/app\";\nimport { DIMENSIONS } from \"../../utils.js\";\nimport { EntitiesLoad } from \"../../lib/Events/EntitiesLoad\";\n\n/**\n * Kicks a player\n * @param player player who should be kicked\n * @param message the message that should be show to player\n * @param onFail this needs to be used for loops to unregister\n */\nexport function kick(\n player: Player,\n message: Array = [],\n onFail?: () => void\n): void {\n if (isServerOwner(player)) {\n console.warn(`[WARNING]: TRIED TO KICK OWNER`);\n player.tell(`You have been tried to kick, but you cant!`);\n return onFail?.();\n }\n try {\n player.runCommandAsync(`kick @s \u00A7r${message.join(\"\\n\")}`);\n player.triggerEvent(\"kick\");\n } catch (error) {\n player.triggerEvent(\"kick\");\n if (!/\"statusCode\":-2147352576/.test(error)) return;\n // This function just tried to kick the owner\n if (onFail) onFail();\n }\n}\n\n/**\n * Gets the role of this player\n * @param player player to get role from\n * @example getRole(\"Smell of curry\")\n */\nexport function getRole(player: Player | string): keyof typeof ROLES {\n if (player instanceof Player) {\n return TABLES.roles.get(player.name) ?? \"member\";\n } else {\n return TABLES.roles.get(player) ?? \"member\";\n }\n}\n\n/**\n * Sets the role of this player\n * @example setRole(\"Smell of curry\", \"admin\")\n */\nexport function setRole(\n player: Player | string,\n value: keyof typeof ROLES\n): void {\n if (typeof player == \"string\") {\n // we need to create a task that will update the role for\n // that player when they join\n // also we need to set there db_role back\n TABLES.roles.set(player, value);\n /**\n * If the player is in the game just set it now\n * if they are not in the game we will need to create a task\n * to set there role when they join\n */\n const inGamePlayer = [...world.getPlayers()].find((p) => p.name == player);\n if (inGamePlayer) {\n inGamePlayer.setDynamicProperty(\"role\", value);\n } else {\n new ChangePlayerRoleTask(player, value);\n }\n } else {\n // just change both of them no need for task\n TABLES.roles.set(player.name, value);\n player.setDynamicProperty(\"role\", value);\n }\n}\n\n/**\n * Checks if a player is the owner of this world that was set using `/function`\n * @param player player to test\n * @returns if player is owner\n */\nexport function isServerOwner(player: Player): boolean {\n return world.getDynamicProperty(\"worldsOwner\") == player.id;\n}\n\n/**\n * Gets the server owner\n * @returns server owners id\n */\nexport function getServerOwner(): string | null {\n const id = world.getDynamicProperty(\"worldsOwner\") as string;\n if (!id || id == \"\") return null;\n return id;\n}\n\n/**\n * Gets the server owners name\n * @returns server owners name\n */\nexport function getServerOwnerName(): string | null {\n const ownerId = getServerOwner();\n if (!ownerId) return null;\n const ids = TABLES.ids.collection();\n return Object.keys(ids).find((key) => ids[key] === ownerId);\n}\n\n/**\n * Sets the server owner\n * @param player player to set the server owner too\n */\nexport function setServerOwner(player: Player) {\n if (!player) return world.setDynamicProperty(\"worldsOwner\", \"\");\n world.setDynamicProperty(\"worldsOwner\", player.id.toString());\n}\n\n/**\n * Checks if the server is locked down\n */\nexport function isLockedDown(): boolean {\n return (world.getDynamicProperty(\"isLockDown\") ?? false) as boolean;\n}\n\n/**\n * Sets the server's lock down status\n * @param val if the server is locked down or not\n */\nexport function setLockDown(val: boolean) {\n world.setDynamicProperty(\"isLockDown\", val);\n}\n\n/**\n * Sets Deny blocks at bottom of region every 5 mins\n */\nexport function loadRegionDenys() {\n for (const region of Region.getAllRegions()) {\n const loc1 = new BlockLocation(\n region.from.x,\n region.dimensionId == \"minecraft:overworld\" ? -64 : 0,\n region.from.z\n );\n const loc2 = new BlockLocation(\n region.to.x,\n region.dimensionId == \"minecraft:overworld\" ? -64 : 0,\n region.to.z\n );\n for (const blockLocation of loc1.blocksBetween(loc2)) {\n DIMENSIONS[region.dimensionId as keyof typeof DIMENSIONS]\n .getBlock(blockLocation)\n ?.setType(MinecraftBlockTypes.deny);\n }\n }\n}\n\n/**\n * Stores all the callbacks in an array\n */\nconst CALLBACKS: { [key: number]: IplayerTickRegister } = [];\n\n/**\n * Records the amount of times the forEachValidPlayer function is called\n * used to generate keys for callback\n */\nlet forEachValidPlayerCalls = 0;\n\n/**\n * Sends a callback for each player\n * @returns the key to disable this callback\n */\nexport function forEachValidPlayer(\n callback: (player: Player) => void,\n delay = 0\n): number {\n const key = forEachValidPlayerCalls;\n CALLBACKS[key] = {\n callback: callback,\n delay: delay,\n lastCall: 0,\n };\n forEachValidPlayerCalls = key + 1;\n return key;\n}\n\n/**\n * Sends a callback for each player\n * @returns the key to disable this callback\n */\nexport function clearForEachValidPlayer(key: number) {\n delete CALLBACKS[key];\n}\n\nEntitiesLoad.subscribe(() => {\n system.runSchedule(() => {\n const players = [...world.getPlayers()];\n for (const [i, player] of players.entries()) {\n if (getRole(player) == \"admin\") continue;\n for (const CALLBACK of Object.values(CALLBACKS)) {\n if (\n CALLBACK.delay != 0 &&\n system.currentTick - CALLBACK.lastCall < CALLBACK.delay\n )\n continue;\n CALLBACK.callback(player);\n if (i == players.length - 1) CALLBACK.lastCall = system.currentTick;\n }\n }\n });\n});\n\n/**\n * Grabs config data from the database\n * @param id id to grab\n */\nexport function getConfigId(id: T): ConfigType[T] {\n switch (id) {\n case \"spam_config\":\n return (\n TABLES.config.get(\"spam_config\") ?? {\n repeatedMessages: true,\n zalgo: true,\n violationCount: 0,\n permMutePlayer: false,\n }\n );\n\n case \"cbe_config\":\n return (\n TABLES.config.get(\"cbe_config\") ?? {\n clearItem: true,\n violationCount: 0,\n banPlayer: false,\n canAddEnchantment: false,\n }\n );\n\n case \"gamemode_config\":\n return (\n TABLES.config.get(\"gamemode_config\") ?? {\n setToSurvival: true,\n clearPlayer: true,\n violationCount: 0,\n banPlayer: false,\n }\n );\n\n case \"nuker_data\":\n return (\n TABLES.config.get(\"nuker_data\") ?? {\n violationCount: 0,\n banPlayer: false,\n }\n );\n case \"banned_items\":\n return TABLES.config.get(\"banned_items\") ?? BANNED_ITEMS;\n case \"banned_blocks\":\n return TABLES.config.get(\"banned_blocks\") ?? BANNED_BLOCKS;\n case \"enchantments\":\n return TABLES.config.get(\"enchantments\") ?? ENCHANTMENTS;\n case \"appealLink\":\n return TABLES.config.get(\"appealLink\") ?? APPEAL_LINK;\n }\n}\n\n/**\n * Sets a config id\n * @param key key to set\n * @param value value to set key to\n */\nexport function setConfigId(\n key: T,\n value: ConfigType[T]\n) {\n TABLES.config.set(key, value);\n}\n\n/**\n * Gets the max level of a enchantment\n * @param enchantment enchantment to get\n * @returns max level\n * @example ```\n * getMaxLevel(MinecraftEnchantmentTypes.sharpness): 5\n * ```\n */\nexport function getMaxEnchantmentLevel(enchantment: Enchantment): number {\n const MAX_ENCHANTMENTS = getConfigId(\"enchantments\");\n return (\n MAX_ENCHANTMENTS[enchantment.type.id as keyof typeof ENCHANTMENTS] ??\n enchantment.type.maxLevel\n );\n}\n\n/**\n * Gets the Gamemode of a player\n * @param {Player} player player to get\n * @returns {keyof typeof GameMode}\n * @example if (getGamemode(player) == \"creative\") return;\n */\nexport function getGamemode(player: Player): keyof typeof GameMode {\n return Object.values(GameMode).find(\n (g) => [...world.getPlayers({ name: player.name, gameMode: g })].length\n );\n}\n", "import { BlockLocation, Entity, MinecraftBlockTypes } from \"@minecraft/server\";\nimport { DEFAULT_REGION_PERMISSIONS } from \"../../config/region\";\nimport { TABLES } from \"../../../../database/tables\";\nimport type { IRegionCords, IRegionPermissions } from \"../../../../types\";\nimport { loadRegionDenys } from \"../../utils.js\";\nimport { betweenVector3, DIMENSIONS } from \"../../../../utils\";\n\n/**\n * Holds all regions in memory so its not grabbing them so much\n */\nexport let REGIONS: Array = [];\n\n/**\n * If the regions have been grabbed if not it will grab them and set this to true\n */\nlet REGIONS_HAVE_BEEN_GRABBED: boolean = false;\n\n/**\n * The Lowest Y value in minecraft\n */\nconst LOWEST_Y_VALUE: number = -64;\n\n/**\n * The HIGHEST Y value in minecraft\n */\nconst HIGHEST_Y_VALUE: number = 320;\n\nexport class Region {\n dimensionId: string;\n from: IRegionCords;\n to: IRegionCords;\n key: string;\n permissions: IRegionPermissions;\n\n /**\n * Gets all regions\n */\n static async getAllRegionsSync(): Promise> {\n if (REGIONS_HAVE_BEEN_GRABBED) return REGIONS;\n const regions = (await TABLES.regions.valuesSync()).map(\n (region) =>\n new Region(\n region.from,\n region.to,\n region.dimensionId,\n region.permissions,\n region.key\n )\n );\n regions.forEach((r) => {\n REGIONS.push(r);\n });\n REGIONS_HAVE_BEEN_GRABBED = true;\n return regions;\n }\n\n static getAllRegions(): Array {\n if (REGIONS_HAVE_BEEN_GRABBED) return REGIONS;\n const regions = TABLES.regions\n .values()\n .map(\n (region) =>\n new Region(\n region.from,\n region.to,\n region.dimensionId,\n region.permissions,\n region.key\n )\n );\n regions.forEach((r) => {\n REGIONS.push(r);\n });\n REGIONS_HAVE_BEEN_GRABBED = true;\n return regions;\n }\n\n /**\n * Checks if a block location is in region\n */\n static blockLocationInRegion(\n blockLocation: BlockLocation,\n dimensionId: string\n ): Region | undefined {\n return this.getAllRegions().find(\n (region) =>\n region.dimensionId == dimensionId &&\n betweenVector3(\n blockLocation,\n { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z },\n { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z }\n )\n );\n }\n\n /**\n * Checks if a block location is in region\n */\n static async blockLocationInRegionSync(\n blockLocation: BlockLocation,\n dimensionId: string\n ): Promise {\n return (await this.getAllRegionsSync()).find(\n (region) =>\n region.dimensionId == dimensionId &&\n betweenVector3(\n blockLocation,\n { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z },\n { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z }\n )\n );\n }\n\n /**\n * Removes a region at a block Location\n * @param dimensionId the id of this dimension\n * @returns if the region was removed or not\n */\n static async removeRegionAtBlockLocation(\n blockLocation: BlockLocation,\n dimensionId: string\n ): Promise {\n const region = this.blockLocationInRegion(blockLocation, dimensionId);\n if (!region) return false;\n return TABLES.regions.delete(region.key);\n }\n /**\n * Creates a new Region to store in db\n */\n constructor(\n from: IRegionCords,\n to: IRegionCords,\n dimensionId: string,\n permissions?: IRegionPermissions,\n key?: string\n ) {\n this.from = from;\n this.to = to;\n this.dimensionId = dimensionId;\n this.permissions = permissions ?? DEFAULT_REGION_PERMISSIONS;\n this.key = key ? key : Date.now().toString();\n\n if (!key) {\n this.update().then(() => {\n loadRegionDenys();\n REGIONS.push(this);\n });\n }\n }\n\n /**\n * Updates this region in the database\n */\n async update(): Promise {\n return TABLES.regions.set(this.key, {\n key: this.key,\n from: this.from,\n dimensionId: this.dimensionId,\n permissions: this.permissions,\n to: this.to,\n });\n }\n\n /**\n * removes this region\n * @returns if the region was removed successfully\n */\n async delete(): Promise {\n const region = TABLES.regions.get(this.key);\n const loc1 = new BlockLocation(\n region.from.x,\n region.dimensionId == \"minecraft:overworld\" ? -64 : 0,\n region.from.z\n );\n const loc2 = new BlockLocation(\n region.to.x,\n region.dimensionId == \"minecraft:overworld\" ? -64 : 0,\n region.to.z\n );\n for (const blockLocation of loc1.blocksBetween(loc2)) {\n DIMENSIONS[region.dimensionId as keyof typeof DIMENSIONS]\n .getBlock(blockLocation)\n ?.setType(MinecraftBlockTypes.bedrock);\n }\n REGIONS = REGIONS.filter((r) => r.key != this.key);\n return TABLES.regions.delete(this.key);\n }\n\n /**\n * Checks if a player is in this region\n * @returns if a entity is in this region or not\n */\n entityInRegion(entity: Entity): Boolean {\n return (\n this.dimensionId == entity.dimension.id &&\n betweenVector3(\n entity.location,\n { x: this.from.x, y: LOWEST_Y_VALUE, z: this.from.z },\n { x: this.to.x, y: HIGHEST_Y_VALUE, z: this.to.z }\n )\n );\n }\n\n /**\n * Changes a permission to on or off\n */\n changePermission(\n key: T,\n value: IRegionPermissions[T]\n ): void {\n this.permissions[key] = value;\n this.update();\n }\n}\n", "/**\n * The default permissions for all regions made\n */\nexport const DEFAULT_REGION_PERMISSIONS = {\n /**\n * If players in this region can use doors, trapdoors, and switches like buttons and levers\n */\n doorsAndSwitches: true,\n /**\n * If players in this region can open containers, this is like chests, furnaces, hoppers, etc\n */\n openContainers: true,\n /**\n * If the players in this region can fight each other\n */\n pvp: false,\n /**\n * the entities allowed in this region\n */\n allowedEntities: [\n \"minecraft:player\",\n \"minecraft:npc\",\n \"minecraft:item\",\n \"rubedo:inventory\",\n \"rubedo:database\",\n ],\n};\n\n/**\n * All doors and switches in minecraft\n */\nexport const DOORS_SWITCHES = [\n \"minecraft:acacia_door\",\n \"minecraft:acacia_trapdoor\",\n \"minecraft:acacia_button\",\n \"minecraft:birch_door\",\n \"minecraft:birch_trapdoor\",\n \"minecraft:birch_button\",\n \"minecraft:crimson_door\",\n \"minecraft:crimson_trapdoor\",\n \"minecraft:crimson_button\",\n \"minecraft:dark_oak_door\",\n \"minecraft:dark_oak_trapdoor\",\n \"minecraft:dark_oak_button\",\n \"minecraft:jungle_door\",\n \"minecraft:jungle_trapdoor\",\n \"minecraft:jungle_button\",\n \"minecraft:mangrove_door\",\n \"minecraft:mangrove_trapdoor\",\n \"minecraft:mangrove_button\",\n \"minecraft:spruce_door\",\n \"minecraft:spruce_trapdoor\",\n \"minecraft:spruce_button\",\n \"minecraft:warped_door\",\n \"minecraft:warped_trapdoor\",\n \"minecraft:warped_button\",\n \"minecraft:wooden_door\",\n \"minecraft:wooden_button\",\n \"minecraft:trapdoor\",\n \"minecraft:iron_door\",\n \"minecraft:iron_trapdoor\",\n \"minecraft:polished_blackstone_button\",\n \"minecraft:lever\",\n];\n\n/**\n * A List of all containers a item could be in\n */\nexport const BLOCK_CONTAINERS = [\n \"minecraft:chest\",\n \"minecraft:ender_chest\",\n \"minecraft:barrel\",\n \"minecraft:trapped_chest\",\n \"minecraft:dispenser\",\n \"minecraft:dropper\",\n \"minecraft:furnace\",\n \"minecraft:blast_furnace\",\n \"minecraft:lit_furnace\",\n \"minecraft:lit_blast_furnace\",\n \"minecraft:hopper\",\n \"minecraft:shulker_box\",\n \"minecraft:undyed_shulker_box\",\n \"minecraft:lit_smoker\",\n \"minecraft:smoker\",\n];\n", "import type { ROLES } from \"../../../../types\";\r\nimport { TABLES } from \"../../../../database/tables\";\r\nimport type { IChangePlayerRoleData } from \"../../../../types\";\r\n\r\nexport class ChangePlayerRoleTask {\r\n /**\r\n * The name of the player\r\n */\r\n playerName: string;\r\n /**\r\n * The role that the player should be set to\r\n */\r\n role: keyof typeof ROLES;\r\n\r\n /**\r\n * gets all tasks that are present\r\n * @returns all tasks\r\n */\r\n static getTasks(): Array {\r\n return TABLES.tasks.get(\"changePlayerRole\") ?? [];\r\n }\r\n\r\n /**\r\n * Gets the role this player needs to be set to\r\n * @param playerName name\r\n */\r\n static getPlayersRoleToSet(playerName: string): keyof typeof ROLES | null {\r\n const tasks = ChangePlayerRoleTask.getTasks();\r\n return tasks.find((t) => t.playerName == playerName)?.role;\r\n }\r\n\r\n constructor(playerName: string, role: keyof typeof ROLES) {\r\n let tasks = ChangePlayerRoleTask.getTasks();\r\n tasks.push({ playerName: playerName, role: role });\r\n TABLES.tasks.set(\"changePlayerRole\", tasks);\r\n }\r\n}\r\n", "import { MinecraftBlockTypes, MinecraftItemTypes } from \"@minecraft/server\";\n\n/**\n * Items that simply get removed from inventory but will not ban\n */\nexport const FORBIDDEN_ITEMS = [\n // Common CBE Items\n MinecraftItemTypes.beehive.id,\n MinecraftItemTypes.beeNest.id,\n MinecraftItemTypes.axolotlBucket.id,\n MinecraftItemTypes.codBucket.id,\n MinecraftItemTypes.tadpoleBucket.id,\n MinecraftItemTypes.tropicalFishBucket.id,\n MinecraftItemTypes.salmonBucket.id,\n MinecraftItemTypes.pufferfishBucket.id,\n];\n\n/**\n * List of items that if you hold you will be automatically banned\n */\nexport const BANNED_ITEMS = [\n // Op Only Items\n MinecraftItemTypes.allow.id,\n MinecraftItemTypes.barrier.id,\n MinecraftItemTypes.borderBlock.id,\n MinecraftItemTypes.debugStick?.id ?? \"minecraft:debug_stick\",\n MinecraftItemTypes.deny.id,\n MinecraftItemTypes.jigsaw.id,\n MinecraftItemTypes.lightBlock.id,\n MinecraftItemTypes.commandBlock.id,\n MinecraftItemTypes.repeatingCommandBlock.id,\n MinecraftItemTypes.chainCommandBlock.id,\n MinecraftItemTypes.commandBlockMinecart.id,\n MinecraftItemTypes.structureBlock.id,\n MinecraftItemTypes.structureVoid.id,\n\n // Not Normal Items\n MinecraftItemTypes.bedrock.id,\n MinecraftItemTypes.endPortalFrame.id,\n\n // Server Movement Blocks\n \"minecraft:info_update\",\n \"minecraft:info_update2\",\n \"minecraft:reserved3\",\n \"minecraft:reserved4\",\n \"minecraft:reserved6\",\n \"minecraft:movingBlock\",\n \"minecraft:moving_block\",\n \"minecraft:movingblock\",\n \"minecraft:piston_arm_collision\",\n \"minecraft:piston_arm_collision\",\n \"minecraft:pistonarmcollision\",\n \"minecraft:stickyPistonArmCollision\",\n \"minecraft:sticky_piston_arm_collision\",\n \"minecraft:unknown\",\n\n // Common Hacked Items\n \"minecraft:glowingobsidian\",\n \"minecraft:invisible_bedrock\",\n \"minecraft:invisiblebedrock\",\n \"minecraft:netherreactor\",\n \"minecraft:portal\",\n \"minecraft:fire\",\n \"minecraft:water\",\n \"minecraft:lava\",\n \"minecraft:flowing_lava\",\n \"minecraft:flowing_water\",\n \"minecraft:soul_fire\",\n];\n\n/**\n * Blocks in this list are forbidden from being placed but will not ban the placer\n */\nexport const FORBIDDEN_BLOCKS = [\n // Common CBE Blocks\n MinecraftBlockTypes.dispenser.id,\n];\n\n/**\n * List of blocks that cannot be placed down\n */\nexport const BANNED_BLOCKS = [\n // Should Not be Placed\n MinecraftBlockTypes.bedrock.id,\n MinecraftBlockTypes.barrier.id,\n \"minecraft:invisiblebedrock\",\n \"minecraft:movingBlock\",\n \"minecraft:movingblock\",\n \"minecraft:moving_block\",\n];\n\n/**\n * The currently supported block containers by script api\n */\nexport const API_CONTAINERS = [\n MinecraftBlockTypes.chest.id,\n MinecraftBlockTypes.trappedChest.id,\n];\n\n/**\n * A List of containers\n */\nexport const CONTAINERS = [\n MinecraftItemTypes.chest.id,\n MinecraftItemTypes.trappedChest.id,\n MinecraftItemTypes.barrel.id,\n MinecraftItemTypes.dispenser.id,\n MinecraftItemTypes.dropper.id,\n MinecraftItemTypes.furnace.id,\n \"minecraft:lit_furnace\",\n MinecraftItemTypes.blastFurnace.id,\n \"minecraft:lit_blast_furnace\",\n MinecraftItemTypes.smoker.id,\n \"minecraft:lit_smoker\",\n MinecraftItemTypes.hopper.id,\n MinecraftItemTypes.shulkerBox.id,\n MinecraftItemTypes.undyedShulkerBox.id,\n];\n\n/**\n * The block size to check for blockContainers\n */\nexport const CHECK_SIZE = { x: 7, y: 7, z: 7 };\n", "/*\n|--------------------------------------------------------------------------\n| Enchantments\n|--------------------------------------------------------------------------\n|\n| This is the default enchantments that can be added to items\n| each enchantment is set to its desired max level this can be changed here\n| or in game using -config enchantments set \"enchantment\" value\n|\n*/\nexport const ENCHANTMENTS = {\n aquaAffinity: 1,\n baneOfArthropods: 5,\n binding: 1,\n blastProtection: 4,\n channeling: 1,\n depthStrider: 3,\n efficiency: 5,\n featherFalling: 4,\n fireAspect: 2,\n fireProtection: 4,\n flame: 1,\n fortune: 3,\n frostWalker: 2,\n impaling: 5,\n infinity: 1,\n knockback: 2,\n looting: 3,\n loyalty: 4,\n luckOfTheSea: 3,\n lure: 3,\n mending: 1,\n multishot: 1,\n piercing: 4,\n power: 5,\n projectileProtection: 4,\n protection: 4,\n punch: 2,\n quickCharge: 3,\n respiration: 3,\n riptide: 3,\n sharpness: 5,\n silkTouch: 1,\n smite: 5,\n soulSpeed: 3,\n swiftSneak: 4,\n thorns: 3,\n unbreaking: 3,\n vanishing: 1,\n};\n", "/*\r\n|--------------------------------------------------------------------------\r\n| Version\r\n|--------------------------------------------------------------------------\r\n|\r\n| This is the version of rubedo recommended to NOT CHANGE could cause bugs.\r\n|\r\n*/\r\nexport const VERSION = \"2.6.4-beta\";\r\n\r\n/*\r\n|--------------------------------------------------------------------------\r\n| Game Version\r\n|--------------------------------------------------------------------------\r\n|\r\n| This is the version of minecraft that this version of rubedo\r\n| was made for its a simple constant to tell creators what version\r\n| this gametest api is supposed to work perfectly for.\r\n|\r\n*/\r\nexport const GAME_VERSION = \"1.19.50\";\r\n\r\n/*\r\n|--------------------------------------------------------------------------\r\n| Appeal Link\r\n|--------------------------------------------------------------------------\r\n|\r\n| This is the appeal link that gets showed when someone gets banned\r\n| this link pops up at the bottom of the ban message to show\r\n| where they can appeal there ban.\r\n|\r\n*/\r\nexport const APPEAL_LINK = \"https://discord.gg/dMa3A5UYKX\";\r\n", "import { Entity, Player, system } from \"@minecraft/server\";\r\nimport { AIR } from \"../../../index.js\";\r\nimport { ENTITY_INVENTORY } from \"../../../config/chest\";\r\nimport {\r\n ISlotChangeReturn,\r\n onEntityInventorySlotChange,\r\n} from \"../../Events/onSlotChange\";\r\nimport {\r\n CHESTGUIS,\r\n clearPlayersPointer,\r\n getItemAtSlot,\r\n PAGES,\r\n} from \"../utils.js\";\r\nimport { ItemGrabbedCallback } from \"./ItemGrabbedCallback\";\r\nimport { ISlot, Page } from \"./Page.js\";\r\n\r\nexport class ChestGUI {\r\n /**\r\n * The connected player to this gui\r\n */\r\n player: Player;\r\n /**\r\n * The entity that this chest gui is associated to\r\n */\r\n entity: Entity;\r\n /**\r\n * The event that is registered on this gui\r\n */\r\n runScheduleId: number;\r\n\r\n /**\r\n * The page that this gui is currently viewing\r\n */\r\n page: Page;\r\n\r\n /**\r\n * The event that is used to test for changes in inventory\r\n */\r\n slotChangeEvent: number;\r\n\r\n /**\r\n * if the player has a chest open\r\n */\r\n hasChestOpen: boolean;\r\n\r\n /**\r\n * Spawns a entity to be attached to the player\r\n * @param player player this entity will be attached to\r\n */\r\n static spawnEntity(player: Player): Entity {\r\n try {\r\n return player.dimension.spawnEntity(\r\n ENTITY_INVENTORY,\r\n player.headLocation\r\n );\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Links a new chest gui to a player\r\n * @param player player to link\r\n */\r\n constructor(player: Player) {\r\n this.player = player;\r\n this.entity = ChestGUI.spawnEntity(player);\r\n if (this.entity) {\r\n this.hasChestOpen = false;\r\n this.setPage(\"home\");\r\n }\r\n this.runScheduleId = system.runSchedule(() => {\r\n if (!this.entity) return this.despawn();\r\n if (this.player.getComponent(\"mark_variant\").value == 1) {\r\n if (!this.hasChestOpen) {\r\n // Player has this inventory open run checks for changes\r\n this.slotChangeEvent = onEntityInventorySlotChange.subscribe(\r\n { type: ENTITY_INVENTORY },\r\n (entity, change) => {\r\n if (entity.id != this.entity.id) return;\r\n this.onSlotChange(change);\r\n }\r\n );\r\n }\r\n this.hasChestOpen = true;\r\n } else {\r\n // Player does not have inventory open but item is held\r\n try {\r\n this.entity.teleport(\r\n this.player.headLocation,\r\n this.player.dimension,\r\n this.player.rotation.x,\r\n this.player.rotation.y,\r\n true\r\n );\r\n } catch (error) {\r\n this.despawn();\r\n }\r\n }\r\n }, 5);\r\n }\r\n\r\n /**\r\n * Sets this gui to a page of items\r\n * @param pageId page to set this gui too\r\n */\r\n setPage(pageId: string, extras?: any) {\r\n const c = this.entity.getComponent(\"inventory\").container;\r\n for (let i = 0; i < c.size; i++) {\r\n c.setItem(i, AIR);\r\n }\r\n if (!Object.keys(PAGES).includes(pageId))\r\n throw new Error(`pageId ${pageId} does not exist!`);\r\n const page = PAGES[pageId];\r\n this.page = page;\r\n\r\n page.fillType(this.entity, page, extras);\r\n this.entity.nameTag = `size:54`;\r\n }\r\n\r\n /**\r\n * This runs when a slot gets changed in the chest inventory\r\n */\r\n onSlotChange(change: ISlotChangeReturn) {\r\n /**\r\n * The guiItem that was changed\r\n */\r\n const slot: ISlot = this.page.slots[change.slot];\r\n\r\n if (!slot) {\r\n // item was added to page that is not a valid slot so set that slot back to air\r\n this.entity.getComponent(\"inventory\").container.setItem(change.slot, AIR);\r\n } else if (change.changeType == \"delete\") {\r\n // item was taken from this page\r\n if (slot.item) clearPlayersPointer(this.player, change.item);\r\n /**\r\n * if the slot has a item that returns when something is grabbed, this checks\r\n * if there is a item put into the slot to return, if not it will not send a\r\n * callback by returning before\r\n */\r\n if (!slot.item && !getItemAtSlot(this.entity, change.slot)) return;\r\n slot.action(new ItemGrabbedCallback(this, slot, change));\r\n }\r\n }\r\n\r\n /**\r\n * Deletes this gui and despawn its entity\r\n */\r\n despawn() {\r\n try {\r\n this.entity?.triggerEvent(\"despawn\");\r\n } catch (error) {}\r\n try {\r\n delete CHESTGUIS[this.player.name];\r\n } catch (error) {}\r\n if (this.runScheduleId) system.clearRunSchedule(this.runScheduleId);\r\n if (this.slotChangeEvent)\r\n onEntityInventorySlotChange.unsubscribe(this.slotChangeEvent);\r\n }\r\n}\r\n", "import {\r\n Entity,\r\n EntityQueryOptions,\r\n ItemStack,\r\n PlayerInventoryComponentContainer,\r\n system,\r\n} from \"@minecraft/server\";\r\nimport { DIMENSIONS } from \"../../utils.js\";\r\n\r\ntype onSlotChangeCallback = (entity: Entity, change: ISlotChangeReturn) => void;\r\n\r\nconst CALLBACKS: {\r\n [key: number]: {\r\n callback: onSlotChangeCallback;\r\n entities: EntityQueryOptions;\r\n };\r\n} = {};\r\n\r\nconst MAPPED_INVENTORIES: { [key: string]: Array } = {};\r\nexport const PREVIOUS_CHANGE: { [key: string]: ISlotChangeReturn } = {};\r\n\r\nexport interface ISlotChangeReturn {\r\n /**\r\n * Slot that changed\r\n */\r\n slot: number;\r\n /**\r\n * The uid of this item\r\n */\r\n uid: string;\r\n /**\r\n * The old uid of this item\r\n */\r\n oldUid?: string;\r\n /**\r\n * the item that was grabbed / put\r\n */\r\n item: ItemStack;\r\n /**\r\n * The old itemStack that was in this slot\r\n */\r\n oldItem?: ItemStack;\r\n /**\r\n * How the inventory has changed\r\n */\r\n changeType: \"delete\" | \"put\" | \"swap\" | \"fluctuation\" | \"move\";\r\n}\r\n\r\ninterface IMappedInventoryItem {\r\n /**\r\n * a unique id for a itemStack\r\n */\r\n uid: string;\r\n /**\r\n * the item\r\n */\r\n item: ItemStack;\r\n}\r\n\r\n/**\r\n * Finds and returns a slot change in a inventory\r\n */\r\nfunction getSlotChanges(\r\n entity: Entity,\r\n oldInv: Array,\r\n newInv: Array\r\n): Array {\r\n if (oldInv.length != newInv.length) return [];\r\n const changes: Array = [];\r\n for (let i = 0; i < newInv.length; i++) {\r\n if (\r\n oldInv[i]?.item?.amount < newInv[i]?.item?.amount ||\r\n (oldInv[i]?.item?.amount > newInv[i]?.item?.amount &&\r\n oldInv[i]?.item?.amount != 0)\r\n ) {\r\n // Checks if the item is the same but checks if the amount has changed\r\n const change_data: ISlotChangeReturn = {\r\n slot: i,\r\n uid: newInv[i].uid,\r\n oldUid: oldInv[i].uid,\r\n item: newInv[i].item,\r\n oldItem: oldInv[i].item,\r\n changeType: \"fluctuation\",\r\n };\r\n changes.push(change_data);\r\n PREVIOUS_CHANGE[entity.id] = change_data;\r\n continue;\r\n }\r\n if (newInv[i].uid == oldInv[i].uid) continue; // no change\r\n if (oldInv[i]?.item && newInv[i]?.item) {\r\n // Checks if there was a new item but a new slot was not taken up\r\n // Meaning that the item got used like using a bucket on a cow\r\n const change_data: ISlotChangeReturn = {\r\n slot: i,\r\n uid: newInv[i].uid,\r\n oldUid: oldInv[i].uid,\r\n item: newInv[i].item,\r\n oldItem: oldInv[i].item,\r\n changeType: \"swap\",\r\n };\r\n changes.push(change_data);\r\n PREVIOUS_CHANGE[entity.id] = change_data;\r\n } else if (!newInv[i]?.item) {\r\n // There is no more item in this slot\r\n // Meaning the item has been moved across slots or been thrown out\r\n const change_data: ISlotChangeReturn = {\r\n slot: i,\r\n uid: oldInv[i].uid,\r\n item: oldInv[i].item,\r\n changeType: \"delete\",\r\n };\r\n changes.push(change_data);\r\n PREVIOUS_CHANGE[entity.id] = change_data;\r\n } else if (newInv[i]?.item) {\r\n // New item has been added in this slot\r\n if (\r\n PREVIOUS_CHANGE[entity.id]?.changeType == \"delete\" &&\r\n PREVIOUS_CHANGE[entity.id]?.uid == newInv[i].uid\r\n ) {\r\n // item has been moved across slots\r\n const change_data: ISlotChangeReturn = {\r\n slot: i,\r\n uid: newInv[i].uid,\r\n item: newInv[i].item,\r\n changeType: \"move\",\r\n };\r\n changes.push(change_data);\r\n PREVIOUS_CHANGE[entity.id] = change_data;\r\n continue;\r\n } else {\r\n const change_data: ISlotChangeReturn = {\r\n slot: i,\r\n uid: newInv[i].uid,\r\n item: newInv[i].item,\r\n changeType: \"put\",\r\n };\r\n changes.push(change_data);\r\n PREVIOUS_CHANGE[entity.id] = change_data;\r\n }\r\n }\r\n }\r\n return changes;\r\n}\r\n\r\n/**\r\n * Converts a itemStack to a unique id\r\n * @param {ItemStack} item\r\n * @returns {string}\r\n */\r\nexport function getItemUid(item: ItemStack): string {\r\n if (!item) return \"\";\r\n const data = [];\r\n data.push(item.typeId);\r\n data.push(item.nameTag);\r\n data.push(item.data);\r\n data.push(item.getLore().join(\"\"));\r\n return data.join(\"\");\r\n}\r\n\r\n/**\r\n * Gets an entity's inventory but with mapped data\r\n */\r\nfunction mapInventory(\r\n container: PlayerInventoryComponentContainer\r\n): Array {\r\n const inventory = [];\r\n\r\n for (let i = 0; i < container.size; i++) {\r\n let item = container.getItem(i);\r\n inventory[i] = {\r\n uid: getItemUid(item),\r\n item: item,\r\n };\r\n }\r\n return inventory;\r\n}\r\n\r\nsystem.runSchedule(() => {\r\n for (const callback of Object.values(CALLBACKS)) {\r\n for (const entity of DIMENSIONS.overworld.getEntities(callback.entities)) {\r\n const inventory = mapInventory(\r\n entity.getComponent(\"inventory\").container\r\n );\r\n const changes = getSlotChanges(\r\n entity,\r\n MAPPED_INVENTORIES[entity.id] ?? inventory,\r\n inventory\r\n );\r\n MAPPED_INVENTORIES[entity.id] = inventory;\r\n if (changes.length == 0) continue;\r\n if (entity.hasTag(\"skipCheck\")) {\r\n entity.removeTag(\"skipCheck\");\r\n delete PREVIOUS_CHANGE[entity.id];\r\n continue;\r\n }\r\n for (const change of changes) {\r\n callback.callback(entity, change);\r\n }\r\n }\r\n }\r\n}, 5);\r\n\r\nexport class onEntityInventorySlotChange {\r\n /**\r\n * Subscribes to a callback to get notified when a entities inventory changes\r\n * @param callback what to be called when one of these entities inventory's changes\r\n * @param entities the entity's to grab from\r\n * @returns the id that is used to unsubscribe\r\n */\r\n static subscribe(\r\n entities: EntityQueryOptions,\r\n callback: onSlotChangeCallback\r\n ): number {\r\n const key = Date.now();\r\n CALLBACKS[key] = { callback: callback, entities: entities };\r\n return key;\r\n }\r\n static unsubscribe(key: number): void {\r\n delete CALLBACKS[key];\r\n }\r\n}\r\n", "import { Entity, ItemStack, Location, Player } from \"@minecraft/server\";\r\nimport type { ChestGUI } from \"./Models/EntityChest\";\r\nimport type { Page } from \"./Models/Page\";\r\n\r\n/**\r\n * This will link a players name to a chest gui instance\r\n */\r\nexport const CHESTGUIS: { [key: string]: ChestGUI } = {};\r\n\r\n/**\r\n * This will link a players name to a chest gui instance\r\n */\r\nexport const PAGES: { [key: string]: Page } = {};\r\n\r\n/**\r\n * Gets a players held item\r\n */\r\nexport function getHeldItem(player: Player): ItemStack {\r\n const inventory = player.getComponent(\"minecraft:inventory\").container;\r\n return inventory.getItem(player.selectedSlot);\r\n}\r\n\r\n/**\r\n * Clears the player of a item in there pointer slot\r\n */\r\nexport async function clearPlayersPointer(\r\n player: Player,\r\n ItemToClear: ItemStack\r\n) {\r\n try {\r\n const inventory = player.getComponent(\"minecraft:inventory\").container;\r\n let itemsToLoad = [];\r\n for (let i = 0; i < inventory.size; i++) {\r\n const item = inventory.getItem(i);\r\n if (!item) continue;\r\n if (item?.typeId == ItemToClear?.typeId) {\r\n itemsToLoad.push({ slot: i, item: item });\r\n inventory.setItem;\r\n if (i < 9) {\r\n player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`);\r\n } else {\r\n player.runCommandAsync(\r\n `replaceitem entity @s slot.inventory ${i - 9} air`\r\n );\r\n }\r\n }\r\n }\r\n await player.runCommandAsync(\r\n `clear @s ${ItemToClear?.typeId} ${ItemToClear.data} ${ItemToClear.amount}`\r\n );\r\n for (const item of itemsToLoad) {\r\n inventory.setItem(item.slot, item.item);\r\n }\r\n } catch (error) {\r\n // the item couldn't be cleared that means\r\n // they now have a item witch is really BAD\r\n [\r\n ...player.dimension.getEntities({\r\n type: \"minecraft:item\",\r\n location: new Location(\r\n player.location.x,\r\n player.location.y,\r\n player.location.z\r\n ),\r\n maxDistance: 2,\r\n closest: 1,\r\n }),\r\n ].forEach((e) => e.kill());\r\n }\r\n}\r\n\r\n/**\r\n * Gets an item at slot\r\n */\r\nexport function getItemAtSlot(entity: Entity, slot: number): ItemStack | null {\r\n const inventory = entity.getComponent(\"minecraft:inventory\").container;\r\n return inventory.getItem(slot);\r\n}\r\n", "import {\n ActionFormData,\n MessageFormData,\n ModalFormData,\n ActionFormResponse,\n ModalFormResponse,\n MessageFormResponse,\n} from \"@minecraft/server-ui\";\nimport { ChestGUI } from \"./EntityChest\";\nimport { ItemStack } from \"@minecraft/server\";\nimport { ItemDatabase } from \"../database/Item\";\nimport type { ISlot } from \"./Page\";\nimport type { ISlotChangeReturn } from \"../../Events/onSlotChange\";\nimport { sleep } from \"../../../utils\";\n\ntype FormActionReturn = T extends ActionFormData\n ? Promise\n : T extends ModalFormData\n ? Promise\n : Promise;\n\nexport class ItemGrabbedCallback {\n gui: ChestGUI;\n slot: ISlot;\n change: ISlotChangeReturn;\n /**\n * New Callback\n */\n constructor(gui: ChestGUI, slot: ISlot, change: ISlotChangeReturn) {\n this.gui = gui;\n this.slot = slot;\n this.change = change;\n }\n\n /**\n * Messages to the owner of this gui\n * @example ctx.reply('Hello World!');\n */\n message(text: string) {\n this.gui.player.tell(text);\n }\n\n /**\n * Gets the item added\n */\n getItemAdded(): ItemStack | null {\n if (this.slot.item) return null;\n return this.gui.entity\n .getComponent(\"minecraft:inventory\")\n .container.getItem(this.change.slot);\n }\n\n /**\n * Gives the player the item the grabbed\n */\n GiveAction(item: ItemStack = this.slot.item.itemStack) {\n this.gui.player.getComponent(\"minecraft:inventory\").container.addItem(item);\n }\n\n /**\n * Gives the player the item that was grabbed also removes this item from the gui + db\n * @param db the item database to remove this item from\n */\n TakeAction(db: ItemDatabase = null) {\n this.gui.player\n .getComponent(\"minecraft:inventory\")\n .container.addItem(this.slot.item.itemStack);\n this.gui.page.slots[this.change.slot] = null;\n if (!db) return;\n db.delete(this.slot.item.components.dbKey);\n }\n\n /**\n * Changes the page of the chestGui when this item is grabbed\n * @param page page to send to\n * @param extras stuff to be passed onto the page\n */\n PageAction(page: string, extras?: any) {\n this.gui.setPage(page, extras);\n }\n\n /**\n * Closes the chest GUI when this item is grabbed\n */\n CloseAction() {\n this.gui.despawn();\n }\n\n /**\n * Sets the item back\n */\n SetAction() {\n const container = this.gui.entity.getComponent(\n \"minecraft:inventory\"\n ).container;\n container.setItem(this.change.slot, this.slot.item.itemStack);\n }\n\n /**\n * Opens a form to the player\n * @param {ActionFormData | ModalFormData | MessageFormData} form form to load\n * @returns {Promise}\n */\n async FormAction(\n form: T\n ): Promise> {\n this.CloseAction();\n await sleep(5);\n // @ts-ignore\n return await form.show(this.gui.player);\n }\n}\n", "import {\r\n Enchantment,\r\n EnchantmentList,\r\n ItemStack,\r\n ItemType,\r\n} from \"@minecraft/server\";\r\n\r\ninterface IPageItemComponents {\r\n /**\r\n * Number of the items in the stack. Valid values range between 0 and 64.\r\n */\r\n amount?: number;\r\n /**\r\n * A data value used to configure alternate states of the item.\r\n */\r\n data?: number;\r\n /**\r\n * Given name of this stack of items.\r\n */\r\n nameTag?: string;\r\n /**\r\n * a secondary display string - for an ItemStack.\r\n */\r\n loreList?: string[];\r\n /**\r\n * a collection of the enchantments on this item\r\n */\r\n enchantments?: Enchantment[];\r\n /**\r\n * A key that could be on this item, meaning its connect to database\r\n */\r\n dbKey?: string;\r\n}\r\n\r\nexport class PageItem {\r\n /**\r\n * The item type this item has\r\n */\r\n itemType: ItemType;\r\n /**\r\n * The components that this item\r\n * this stores information such as data, enchantments etc\r\n */\r\n components: IPageItemComponents;\r\n\r\n /**\r\n * The itemStack that was set at item creation\r\n */\r\n setItemStack: ItemStack | null;\r\n\r\n constructor(\r\n itemType: ItemType,\r\n components: IPageItemComponents = {},\r\n itemStack?: ItemStack\r\n ) {\r\n this.itemType = itemType;\r\n this.components = components;\r\n this.setItemStack = itemStack;\r\n }\r\n /**\r\n * gets itemStack that this PageItem is associated with\r\n */\r\n get itemStack(): ItemStack {\r\n if (this.setItemStack) return this.setItemStack;\r\n const itemStack = new ItemStack(this.itemType);\r\n if (this.components) {\r\n itemStack.amount = this.components?.amount ?? 1;\r\n itemStack.data = this.components?.data ?? 0;\r\n itemStack.nameTag = this.components?.nameTag;\r\n itemStack.setLore(this.components?.loreList ?? []);\r\n const enchantments: EnchantmentList =\r\n itemStack.getComponent(\"enchantments\").enchantments;\r\n for (const enchantment of this.components?.enchantments ?? []) {\r\n enchantments.addEnchantment(enchantment);\r\n }\r\n itemStack.getComponent(\"enchantments\").enchantments = enchantments;\r\n }\r\n return itemStack;\r\n }\r\n}\r\n", "import { Entity } from \"@minecraft/server\";\nimport { AIR } from \"../../../index.js\";\nimport { Page } from \"./Page.js\";\n\nexport type FillTypeCallback = (\n entity: Entity,\n page: Page,\n extras: any\n) => void;\n\n/**\n * Fills a entity with desired items\n */\nexport function DefaultFill(entity: Entity, page: Page, extras: any) {\n const container = entity.getComponent(\"minecraft:inventory\").container;\n for (let i = 0; i < container.size; i++) {\n const slot = page.slots[i];\n if (!slot || !slot.item) {\n container.setItem(i, AIR);\n continue;\n }\n container.setItem(i, slot.item.itemStack);\n }\n}\n", "import { PAGES } from \"../utils.js\";\r\nimport { DefaultFill, FillTypeCallback } from \"./FillTypes\";\r\nimport { ItemGrabbedCallback } from \"./ItemGrabbedCallback.js\";\r\nimport type { PageItem } from \"./PageItem\";\r\n\r\nexport interface ISlot {\r\n /**\r\n * The item that should be in this slot\r\n */\r\n item: PageItem;\r\n /**\r\n * What happens when there is a change in this slot\r\n */\r\n action: (ctx: ItemGrabbedCallback) => void;\r\n}\r\n\r\nexport class Page {\r\n /**\r\n * The id this page has\r\n */\r\n id: string;\r\n /**\r\n * How this page fills, these can be custom or kept default\r\n */\r\n fillType: FillTypeCallback;\r\n\r\n /**\r\n * The slots in this gui\r\n */\r\n slots: ISlot[];\r\n\r\n constructor(id: string, fillType: FillTypeCallback = DefaultFill) {\r\n if (Object.keys(PAGES).includes(id))\r\n throw new Error(`Page: ${id}, Already exists!`);\r\n this.id = id;\r\n this.fillType = fillType;\r\n this.slots = [];\r\n PAGES[id] = this;\r\n }\r\n\r\n /**\r\n * Sets slots in this page\r\n */\r\n setSlots(\r\n slot: Array,\r\n item: PageItem,\r\n action: (ctx: ItemGrabbedCallback) => void\r\n ): Page {\r\n const data = item ? { item: item, action: action } : null;\r\n for (const i of slot) {\r\n this.slots[i] = data;\r\n }\r\n return this;\r\n }\r\n}\r\n", "import { PageItem } from \"../Models/PageItem.js\";\r\nimport { Page } from \"../Models/Page.js\";\r\nimport { MinecraftItemTypes } from \"@minecraft/server\";\r\n\r\n/**\r\n * The Home page of this GUI this is the most important because\r\n * when the GUI is opened it will open up here, any plugin can\r\n * change this but this is the default screen\r\n */\r\nexport let HOME_PAGE = new Page(\"home\")\r\n .setSlots(\r\n [22],\r\n new PageItem(MinecraftItemTypes.enderChest, {\r\n nameTag: \"\u00A7l\u00A7bInventory Viewer\",\r\n }),\r\n (ctx) => {\r\n ctx.PageAction(\"moderation:see\");\r\n }\r\n )\r\n .setSlots(\r\n [54],\r\n new PageItem(MinecraftItemTypes.barrier, { nameTag: \"\u00A7cClose GUI\" }),\r\n (ctx) => {\r\n ctx.CloseAction();\r\n }\r\n );\r\n", "import { system } from \"@minecraft/server\";\r\nimport { EntitiesLoad } from \"../../lib/Events/EntitiesLoad\";\r\nimport type { Protection } from \"./modules/models/Protection\";\r\n\r\n/**\r\n * All protections in this anti-cheat\r\n */\r\nexport const PROTECTIONS: { [key: string]: Protection } = {};\r\n\r\nEntitiesLoad.subscribe(() => {\r\n system.run(() => {\r\n for (const protection of Object.values(PROTECTIONS)) {\r\n if (!protection.getConfig().enabled ?? protection.isEnabledByDefault)\r\n continue;\r\n protection.enable();\r\n }\r\n });\r\n});\r\n", "export const text = {\n \"api.name\": () => \"Smelly API\",\n \"api.error.unknown\": () => \"An unknown error has occurred.\",\n \"api.database.error.table_name\": (a: string, b: number) =>\n `The display name ${a} is too long for an objective, it can be at most ${b} characters long`,\n \"api.utilities.formatter.error.ms\": (a: string) =>\n `${a} is not a string or a number`,\n \"api.Providers.form.invalidType\": (a: string, b: string) =>\n `Type ${a} is not a valid type to add a ${b}`,\n \"modules.protections.cps.clickingToFast\": () =>\n `You are clicking to fast! Please click slower!`,\n \"modules.managers.mute.isMuted\": () =>\n `\u00A7cYou've been temporarily muted in chat.`,\n \"modules.commands.ban.reply\": (\n playerName: string,\n duration: string,\n reason: string = \"\"\n ) =>\n `\u00A7cBanned \u00A7f\"\u00A7a${playerName}\u00A7f\" \u00A7cfor ${duration} Because: \"${\n reason ?? \"No reason Provided\"\n }\" \u00A7aSuccessfully`,\n \"lockdown.kick.message\": () => [\n `\u00A7cYou have been kicked!`,\n `\u00A7aReason: \u00A7fServer is currently under LockDown`,\n `\u00A7fServer will be up soon, Try to join later`,\n ],\n \"commands.ban.list.player\": (name: string, reason: string, expire: string) =>\n `- \"${name}\" Because: ${reason}, Expiry ${expire}`,\n \"commands.freeze.list.player\": (name: string, reason: string) =>\n `- \"${name}\" Because: ${reason}`,\n \"commands.mutes.list.player\": (\n name: string,\n reason: string,\n expire: string\n ) => `- \"${name}\" Because: ${reason}, Expiry: ${expire}`,\n \"commands.lockdown.confirm\":\n \"Are you sure you want to lockdown the server, this will kick all active players and all players who try to join who are not admin\",\n};\n", "import { Location, Player } from \"@minecraft/server\";\r\nimport {\r\n LiteralArgumentType,\r\n IArgumentType,\r\n LocationArgumentType,\r\n StringArgumentType,\r\n IntegerArgumentType,\r\n ArrayArgumentType,\r\n BooleanArgumentType,\r\n} from \"./ArgumentTypes.js\";\r\nimport { CommandCallback } from \"./Callback.js\";\r\nimport { COMMANDS } from \"./index.js\";\r\nimport type { AppendArgument, ICommandData, ArgReturn } from \"./types\";\r\nexport { ArgumentTypes } from \"./ArgumentTypes\";\r\n\r\nexport class Command<\r\n Callback extends Function = (ctx: CommandCallback) => void\r\n> {\r\n /**\r\n * The Arguments on this command\r\n */\r\n children: Command[];\r\n\r\n /**\r\n * Function to run when this command is called\r\n */\r\n callback: Callback;\r\n\r\n constructor(\r\n public data: ICommandData,\r\n public type?: IArgumentType,\r\n public depth: number = 0,\r\n public parent?: Command\r\n ) {\r\n if (!data.requires) data.requires = (player: Player) => true;\r\n this.data = data;\r\n this.type = type ?? new LiteralArgumentType(this.data.name);\r\n this.children = [];\r\n this.depth = depth;\r\n this.parent = parent;\r\n this.callback = null;\r\n\r\n COMMANDS.push(this);\r\n }\r\n\r\n /**\r\n * Adds a ranch to this command of your own type\r\n * @param type a special type to be added\r\n * @returns new branch to this command\r\n */\r\n argument(type: T): ArgReturn {\r\n const cmd = new Command>(\r\n this.data,\r\n type,\r\n this.depth + 1,\r\n this\r\n );\r\n this.children.push(cmd);\r\n return cmd;\r\n }\r\n\r\n /**\r\n * Adds a branch to this command of type string\r\n * @param name name this argument should have\r\n * @returns new branch to this command\r\n */\r\n string(name: string): ArgReturn {\r\n return this.argument(new StringArgumentType(name));\r\n }\r\n\r\n /**\r\n * Adds a branch to this command of type string\r\n * @param name name this argument should have\r\n * @returns new branch to this command\r\n */\r\n int(name: string): ArgReturn {\r\n return this.argument(new IntegerArgumentType(name));\r\n }\r\n\r\n /**\r\n * Adds a branch to this command of type string\r\n * @param name name this argument should have\r\n * @returns new branch to this command\r\n */\r\n array>(\r\n name: string,\r\n types: T\r\n ): ArgReturn {\r\n return this.argument(new ArrayArgumentType(name, types));\r\n }\r\n\r\n /**\r\n * Adds a branch to this command of type string\r\n * @param name name this argument should have\r\n * @returns new branch to this command\r\n */\r\n boolean(name: string): ArgReturn {\r\n return this.argument(new BooleanArgumentType(name));\r\n }\r\n\r\n /**\r\n * Adds a argument to this command to add 3 parameters with location types and to return a Location\r\n * @param name name this argument should have\r\n * @returns new branch to this command\r\n */\r\n location(name: string): ArgReturn {\r\n const cmd = this.argument(new LocationArgumentType(name));\r\n if (!name.endsWith(\"*\")) {\r\n const newArg = cmd.location(name + \"_y*\").location(name + \"_z*\");\r\n //@ts-ignore\r\n return newArg;\r\n }\r\n //@ts-ignore\r\n return cmd;\r\n }\r\n\r\n /**\r\n * Adds a subCommand to this argument\r\n * @param name name this literal should have\r\n * @returns new branch to this command\r\n */\r\n literal(data: ICommandData): Command {\r\n const cmd = new Command(\r\n data,\r\n new LiteralArgumentType(data.name),\r\n this.depth + 1,\r\n this\r\n );\r\n this.children.push(cmd);\r\n return cmd;\r\n }\r\n\r\n /**\r\n * Registers this command and its appending arguments\r\n * @param callback what to run when this command gets called\r\n */\r\n executes(callback: Callback): Command {\r\n this.callback = callback;\r\n return this;\r\n }\r\n}\r\n", "import { Player } from \"@minecraft/server\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport type { IBanData } from \"../../../../types.js\";\nimport { durationToMs } from \"../../../../utils.js\";\n\nfunction setBan(\n player: string | Player,\n id: string,\n duration?: string,\n reason: string = \"No Reason\",\n by: string = \"Rubedo Auto Mod\"\n) {\n const data: IBanData = {\n key: id,\n playerName: player instanceof Player ? player.name : player,\n date: Date.now(),\n duration: duration ? durationToMs(duration) : null,\n expire: duration ? durationToMs(duration) + Date.now() : null,\n reason: reason,\n by: by,\n };\n TABLES.bans.set(id, data);\n}\n\nexport class Ban {\n /**\n * Ban a player for a set length\n */\n constructor(\n player: string | Player,\n duration?: string,\n reason: string = \"No Reason\",\n by: string = \"Rubedo Auto Mod\"\n ) {\n if (player instanceof Player) {\n setBan(player, player.id, duration, reason, by);\n } else {\n setBan(player, TABLES.ids.get(player), duration, reason, by);\n }\n }\n}\n", "import { text } from \"../../../../lang/text.js\";\nimport type { CommandCallback } from \"../../../../lib/Command/Callback.js\";\nimport { Command, ArgumentTypes } from \"../../../../lib/Command/Command.js\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport { confirmAction, msToTime } from \"../../../../utils.js\";\nimport { getRole } from \"../../utils.js\";\nimport { Ban } from \"../models/Ban.js\";\n\nfunction ban(\n ctx: CommandCallback,\n player: string,\n duration: string,\n reason: string,\n by: string\n) {\n if (TABLES.bans.get(TABLES.ids.get(player)))\n return ctx.reply(`\u00A7c${player} is already banned`);\n ctx.reply(`\u00A7aClose chat to confirm`);\n confirmAction(\n ctx.sender,\n `Are you sure you want to ban ${player}, for ${duration ?? \"forever\"}`,\n () => {\n new Ban(player, duration, reason, ctx.sender.name);\n ctx.reply(text[\"modules.commands.ban.reply\"](player, duration, reason));\n }\n );\n}\n\nconst root = new Command({\n name: \"ban\",\n description: \"Manage bans\",\n requires: (player) => [\"admin\", \"moderator\"].includes(getRole(player)),\n});\n\nroot\n .literal({\n name: \"add\",\n description: \"Bans a player\",\n })\n .argument(new ArgumentTypes.playerName())\n .executes((ctx, player) => {\n ban(ctx, player, null, null, ctx.sender.name);\n })\n .argument(new ArgumentTypes.duration(\"duration\"))\n .executes((ctx, player, duration) => {\n ban(ctx, player, duration, null, ctx.sender.name);\n })\n .string(\"reason\")\n .executes((ctx, player, duration, reason) => {\n ban(ctx, player, duration, reason, ctx.sender.name);\n });\n\nroot\n .literal({\n name: \"remove\",\n description: \"un-bans a player\",\n })\n .argument(new ArgumentTypes.playerName(\"playerName\"))\n .executes((ctx, playerName) => {\n const banData = TABLES.bans\n .values()\n .find((ban) => ban.playerName == playerName);\n if (!banData) return ctx.reply(`${playerName} is not banned`);\n if (TABLES.bans.delete(banData.key)) {\n ctx.reply(`\u00A7a${playerName}\u00A7r has been Unbanned!`);\n } else {\n ctx.reply(`\u00A7cFailed to un-ban ${playerName}`);\n }\n });\n\nroot\n .literal({\n name: \"list\",\n description: \"Lists all bans\",\n })\n .executes((ctx) => {\n const bans = TABLES.bans.values();\n if (bans.length == 0) return ctx.sender.tell(`\u00A7cNo one is banned!`);\n ctx.sender.tell(`\u00A72--- Showing Bans (${bans.length}) ---`);\n for (const ban of bans) {\n ctx.sender.tell(\n text[\"commands.ban.list.player\"](\n ban.playerName,\n ban.reason,\n ban.expire ? msToTime(ban.duration) : \"Forever\"\n )\n );\n }\n });\n", "import { Command } from \"../../../../lib/Command/Command\";\nimport { TABLES } from \"../../../../database/tables\";\nimport { getRole } from \"../../utils\";\n\nconst root = new Command({\n name: \"database\",\n description: \"Interacts with SA Database\",\n aliases: [\"db\"],\n requires: (player) => getRole(player) == \"admin\",\n});\n\nroot\n .literal({\n name: \"get\",\n })\n .string(\"table\")\n .string(\"key\")\n .executes((ctx, table, key) => {\n try {\n const data = TABLES[table as keyof typeof TABLES].get(key);\n if (data) {\n ctx.reply(JSON.stringify(data));\n } else {\n ctx.reply(`No data could be found for key ${key}`);\n }\n } catch (error) {\n ctx.reply(error + error.stack);\n }\n });\n\nroot\n .literal({\n name: \"set\",\n })\n .string(\"table\")\n .string(\"key\")\n .string(\"value\")\n .executes((ctx, table, key, value) => {\n try {\n TABLES[table as keyof typeof TABLES].set(key, value);\n ctx.reply(`Set Key: \"${key}\", to value: \"${value}\" on table: \"${table}\"`);\n } catch (error) {\n ctx.reply(error + error.stack);\n }\n });\n\nroot\n .literal({\n name: \"clear\",\n })\n .string(\"table\")\n .executes((ctx, table) => {\n try {\n TABLES[table as keyof typeof TABLES].clear();\n ctx.reply(`Cleared Table ${table}`);\n } catch (error) {\n ctx.reply(error + error.stack);\n }\n });\n\nroot\n .literal({\n name: \"keys\",\n description: \"Returns all keys on a database\",\n })\n .string(\"table\")\n .executes((ctx, table) => {\n try {\n const keys = TABLES[table as keyof typeof TABLES].keys();\n ctx.reply(`Keys on database: ${table}: ${keys}`);\n } catch (error) {\n ctx.reply(error + error.stack);\n }\n });\n\nroot\n .literal({\n name: \"values\",\n description: \"Returns all values on a database\",\n })\n .string(\"table\")\n .executes((ctx, table) => {\n try {\n const values = TABLES[table as keyof typeof TABLES].values();\n ctx.reply(\n `Values on database: ${table}: ${JSON.stringify(values, null, 2)}`\n );\n } catch (error) {\n // likely occurs when table is empty\n if (error instanceof TypeError) {\n ctx.reply(`No values on database ${table}`);\n } else {\n ctx.reply(error + error.stack);\n }\n }\n });\n", "import { ArgumentTypes, Command } from \"../../../../lib/Command/Command.js\";\nimport { getRole } from \"../../utils.js\";\n\nnew Command({\n name: \"ecwipe\",\n description: \"Clears a players ender chest\",\n requires: (player) => getRole(player) == \"admin\",\n})\n .argument(new ArgumentTypes.player(\"player\"))\n .executes((ctx, player) => {\n for (let i = 0; i < 27; i++) {\n player.runCommandAsync(`replaceitem entity @s slot.enderchest ${i} air`);\n }\n ctx.reply(`\u00A7aCleared \"${player.name}\"'s Ender chest!`);\n });\n", "import { Player } from \"@minecraft/server\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport type { IFreezeData } from \"../../../../types.js\";\n\nexport class Freeze {\n /**\n * Freeze a player\n */\n constructor(player: Player, reason: string = \"No Reason\") {\n const data: IFreezeData = {\n playerName: player.name,\n key: player.id,\n reason: reason,\n location: {\n x: player.location.x,\n y: player.location.y,\n z: player.location.z,\n dimension: player.dimension.id,\n },\n };\n TABLES.freezes.set(player.id, data);\n }\n}\n", "import { ArgumentTypes, Command } from \"../../../../lib/Command/Command.js\";\nimport { Freeze } from \"../models/Freeze.js\";\nimport { getRole } from \"../../utils.js\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport { text } from \"../../../../lang/text.js\";\n\nconst root = new Command({\n name: \"freeze\",\n description: \"Manage Freezes\",\n requires: (player) => [\"admin\", \"moderator\"].includes(getRole(player)),\n});\n\nroot\n .literal({\n name: \"add\",\n description: \"Freezes a player\",\n })\n .argument(new ArgumentTypes.player(\"player\"))\n .string(\"reason\")\n .executes((ctx, player, reason) => {\n new Freeze(player, reason);\n ctx.reply(\n `\u00A7cFroze \u00A7f\"\u00A7a${player.name}\u00A7f\" Because: \"${reason}\" \u00A7aSuccessfully`\n );\n ctx.sender.tell(\n `\u00A7cYou have been frozen by \u00A7f\"\u00A7a${ctx.sender.name}\u00A7f\" Because: \"${reason}\"`\n );\n });\n\nroot\n .literal({\n name: \"remove\",\n description: \"unfreezes a player\",\n })\n .argument(new ArgumentTypes.playerName(\"playerName\"))\n .executes((ctx, playerName) => {\n const freeze = TABLES.freezes\n .values()\n .find((freeze) => freeze.playerName == playerName);\n if (!freeze) return ctx.reply(`${playerName} is not frozen`);\n\n TABLES.freezes.delete(freeze.key);\n\n ctx.reply(`\u00A7a${playerName}\u00A7r has been UnFrozen!`);\n });\n\nroot\n .literal({\n name: \"list\",\n description: \"Lists all freezes\",\n })\n .executes((ctx) => {\n const freezes = TABLES.freezes.values();\n if (freezes.length == 0) return ctx.sender.tell(`\u00A7cNo one is frozen!`);\n ctx.sender.tell(`\u00A72--- Showing Freezes (${freezes.length}) ---`);\n for (const freeze of freezes) {\n ctx.sender.tell(\n text[\"commands.freeze.list.player\"](freeze.playerName, freeze.reason)\n );\n }\n });\n", "import { Player } from \"@minecraft/server\";\nimport { PREFIX } from \"../../../../config/commands.js\";\nimport {\n IArgumentReturnData,\n IArgumentType,\n} from \"../../../../lib/Command/ArgumentTypes.js\";\nimport { Command } from \"../../../../lib/Command/Command.js\";\nimport { COMMANDS } from \"../../../../lib/Command/index.js\";\n\nclass CommandNameArgumentType implements IArgumentType {\n type: string;\n typeName = \"CommandName\";\n matches(value: string): IArgumentReturnData {\n return {\n success: Boolean(\n COMMANDS.find((c) => c.depth == 0 && c.data.name == value)\n ),\n value: value,\n };\n }\n fail(value: string): string {\n return `\"${value}\" is not a valid command`;\n }\n constructor(public name: string) {}\n}\n\n/**\n * Sends text in chat relation to the args in the command to player\n */\nfunction sendCommandType(\n baseCommand: Command,\n args: Command[],\n player: Player\n) {\n player.tell(\n `${PREFIX}${baseCommand.data.name} ${args\n .map((a) =>\n a.type.typeName == \"literal\"\n ? a.data.name\n : `<${a.type.name}: ${a.type.typeName}>`\n )\n .join(\" \")}`\n );\n}\n\nfunction sendArguments(bc: Command, c: Command, args: Command[], p: Player) {\n if (!c.data?.requires(p)) return;\n if (c.callback) {\n // command has a callback\n sendCommandType(bc, c.depth == 0 ? args : args.concat(c), p);\n }\n if (c.children.length > 0) {\n // cmd has arguments\n for (const child of c.children) {\n sendArguments(bc, child, c.depth == 0 ? args : args.concat(c), p);\n }\n }\n}\n\nfunction sendPageHeader(player: Player, p: number, maxPages: number) {\n player.tell(\n `\u00A72--- Showing help page ${p} of ${maxPages} (${PREFIX}help ) ---`\n );\n}\n\nfunction getCommands(player: Player): Command[] {\n return COMMANDS.filter((c) => {\n return c.depth == 0 && c.data?.requires(player);\n });\n}\n\nfunction getMaxPages(player: Player): number {\n const commands = getCommands(player);\n if (commands.length == 0) return 0;\n return Math.ceil(commands.length / 5);\n}\n\nconst root = new Command({\n name: \"help\",\n description: \"Provides help/list of commands.\",\n aliases: [\"?\", \"h\"],\n}).executes((ctx) => {\n // show page 1\n const maxPages = getMaxPages(ctx.sender);\n const commands = getCommands(ctx.sender).slice(1 * 5 - 5, 1 * 5);\n sendPageHeader(ctx.sender, 1, maxPages);\n for (const cmd of commands) {\n sendArguments(cmd, cmd, [], ctx.sender);\n }\n});\n\nroot.int(\"page\").executes((ctx, p) => {\n // shows page\n const maxPages = getMaxPages(ctx.sender);\n if (p > maxPages) p = maxPages;\n const commands = getCommands(ctx.sender).slice(p * 5 - 5, p * 5);\n sendPageHeader(ctx.sender, p, maxPages);\n for (const cmd of commands) {\n sendArguments(cmd, cmd, [], ctx.sender);\n }\n});\n\nroot\n .argument(new CommandNameArgumentType(\"command\"))\n .executes((ctx, command) => {\n // shows command\n const cmd = COMMANDS.filter(\n (c) => c.depth == 0 && c.data.name == command\n )[0];\n ctx.sender.tell(\n `\u00A7e${cmd.data.name}: ${\n cmd.data.aliases ? `aliases (${cmd.data.aliases.join(\", \")})` : \"\"\n }`\n );\n ctx.sender.tell(`\u00A7e${cmd.data.description}`);\n ctx.sender.tell(`Usage:`);\n sendArguments(cmd, cmd, [], ctx.sender);\n });\n", "import { world } from \"@minecraft/server\";\r\nimport { text } from \"../../../../lang/text.js\";\r\nimport { Command } from \"../../../../lib/Command/Command.js\";\r\nimport { confirmAction } from \"../../../../utils.js\";\r\nimport { getRole, isLockedDown, kick, setLockDown } from \"../../utils.js\";\r\n\r\nnew Command({\r\n name: \"lockdown\",\r\n description: \"Toggles the servers lockdown, meaning no one can join\",\r\n requires: (player) => getRole(player) == \"admin\",\r\n}).executes((ctx) => {\r\n if (isLockedDown()) {\r\n setLockDown(false);\r\n ctx.sender.tell(`\u00A7aUnlocked the server!`);\r\n } else {\r\n ctx.reply(`\u00A7aClose chat to confirm lockdown`);\r\n confirmAction(ctx.sender, text[\"commands.lockdown.confirm\"], () => {\r\n setLockDown(true);\r\n for (const player of world.getPlayers()) {\r\n if (getRole(player) == \"admin\") continue;\r\n kick(player, text[\"lockdown.kick.message\"]());\r\n }\r\n world.say(`\u00A7l\u00A7cServer is now LOCKED!`);\r\n });\r\n }\r\n});\r\n", "import { Player } from \"@minecraft/server\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport type { IMuteData } from \"../../../../types.js\";\nimport { durationToMs } from \"../../../../utils.js\";\n\nexport class Mute {\n length: number;\n /**\n * Gets the mute data for this player\n */\n static getMuteData(player: Player): IMuteData {\n return TABLES.mutes.get(player.name);\n }\n /**\n * Mutes a player for a length\n */\n constructor(\n player: Player,\n duration?: string,\n reason: string = \"No Reason\",\n by: string = \"Rubedo Auto Mod\"\n ) {\n const msLength = duration ? durationToMs(duration) : null;\n const data: IMuteData = {\n playerName: player.name,\n date: Date.now(),\n duration: msLength,\n expire: msLength ? msLength + Date.now() : null,\n reason: reason,\n by: by,\n };\n TABLES.mutes.set(player.name, data);\n }\n}\n", "import { ArgumentTypes, Command } from \"../../../../lib/Command/Command.js\";\nimport { Mute } from \"../models/Mute.js\";\nimport { getRole } from \"../../utils.js\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport { text } from \"../../../../lang/text.js\";\nimport { msToTime } from \"../../../../utils.js\";\n\nconst root = new Command({\n name: \"mute\",\n description: \"Manage Mutes\",\n requires: (player) => [\"admin\", \"moderator\"].includes(getRole(player)),\n});\n\nroot\n .literal({\n name: \"add\",\n description: \"Mutes a player\",\n })\n .argument(new ArgumentTypes.player(\"player\"))\n .argument(new ArgumentTypes.duration(\"duration\"))\n .string(\"reason\")\n .executes((ctx, player, duration, reason) => {\n new Mute(player, duration, reason, ctx.sender.name);\n ctx.reply(\n `\u00A7cMuted \u00A7f\"\u00A7a${player.name}\u00A7f\" \u00A7cfor ${duration} Because: \"${reason}\" \u00A7aSuccessfully`\n );\n player.tell(\n `\u00A7cYou have been muted by \u00A7f\"${ctx.sender.name}\" \u00A7cfor ${duration} Because: \"${reason}\"`\n );\n });\n\nroot\n .literal({\n name: \"remove\",\n description: \"un-mutes a player\",\n })\n .argument(new ArgumentTypes.playerName(\"playerName\"))\n .executes((ctx, playerName) => {\n const mute = TABLES.mutes\n .values()\n .find((mute) => mute.playerName == playerName);\n if (!mute) return ctx.reply(`${playerName} is not muted!`);\n\n TABLES.mutes.delete(mute.playerName);\n try {\n ctx.sender.runCommandAsync(`ability \"${playerName}\" mute false`);\n } catch (error) {}\n ctx.reply(`\u00A7a${playerName}\u00A7r has been UnMuted!`);\n });\n\nroot\n .literal({\n name: \"list\",\n description: \"Lists all freezes\",\n })\n .executes((ctx) => {\n const mutes = TABLES.mutes.values();\n if (mutes.length == 0) return ctx.sender.tell(`\u00A7cNo one is muted!`);\n ctx.sender.tell(`\u00A72--- Showing Mutes (${mutes.length}) ---`);\n for (const mute of mutes) {\n ctx.sender.tell(\n text[\"commands.mutes.list.player\"](\n mute.playerName,\n mute.reason,\n mute.expire ? msToTime(mute.expire) : \"Forever\"\n )\n );\n }\n });\n", "import { Location } from \"@minecraft/server\";\nimport { Command } from \"../../../../lib/Command/Command.js\";\nimport { getRole } from \"../../utils.js\";\nimport { Npc } from \"../models/Npc.js\";\n\nnew Command({\n name: \"npc\",\n description: \"Spawns a npc at your coordinates\",\n requires: (player) => getRole(player) == \"admin\",\n}).executes((ctx) => {\n const { x, y, z } = ctx.sender.location;\n new Npc(new Location(x, y, z), ctx.sender.dimension);\n ctx.reply(`Spawned a verified npc at your current location`);\n});\n", "import { Dimension, Entity, Location } from \"@minecraft/server\";\r\nimport { clearNpcLocations, NPC_LOCATIONS } from \"../../index.js\";\r\nimport { TABLES } from \"../../../../database/tables.js\";\r\nimport type { INpcLocation } from \"../../../../types.js\";\r\nimport { LocationEquals } from \"../../../../utils.js\";\r\n\r\nexport class Npc {\r\n /**\r\n * Checks if a entity is a valid npc\r\n * @param entity npc\r\n */\r\n static isValid(entity: Entity): boolean {\r\n if (entity.typeId != \"minecraft:npc\") return false;\r\n if (NPC_LOCATIONS.find((l) => LocationEquals(l, entity.location)))\r\n return true;\r\n return TABLES.npcs.keys().find((key) => entity.id == key) ? true : false;\r\n }\r\n /**\r\n * Adds a new verified npc to the world\r\n */\r\n constructor(location: Location, dimension: Dimension) {\r\n NPC_LOCATIONS.push(location);\r\n const entity = dimension.spawnEntity(\"minecraft:npc\", location);\r\n\r\n const data: INpcLocation = {\r\n dimension: entity.dimension.id,\r\n x: entity.location.x,\r\n y: entity.location.y,\r\n z: entity.location.z,\r\n };\r\n TABLES.npcs.set(entity.id, data);\r\n clearNpcLocations();\r\n }\r\n}\r\n", "import { Command } from \"../../../../lib/Command/Command.js\";\nimport { system } from \"@minecraft/server\";\n\nasync function getServerTPS(): Promise {\n let startTime = Date.now();\n let ticks = 0;\n return new Promise((resolve) => {\n let s = system.runSchedule(() => {\n if (Date.now() - startTime < 1000) {\n ticks++;\n } else {\n system.clearRunSchedule(s);\n resolve(ticks);\n }\n });\n });\n}\n\nnew Command({\n name: \"ping\",\n description: \"Returns the current Ticks Per Second of the servers ping\",\n}).executes(async (ctx) => {\n let ticks = await getServerTPS();\n ctx.reply(\n `\u00A7aCurrent Ticks Per Second: ${\n ticks > 18 ? \"\u00A7f{ \u00A7aGood\" : ticks > 13 ? \"\u00A7f{ \u00A7eOk\" : \"\u00A7f{ \u00A7cSevere\"\n } ${ticks} \u00A7f}`\n );\n});\n", "import { BlockLocation } from \"@minecraft/server\";\nimport { Command } from \"../../../../lib/Command/Command.js\";\nimport { Region } from \"../models/Region.js\";\nimport { getRole } from \"../../utils.js\";\n\nconst command = new Command({\n name: \"region\",\n description: \"Create a Region\",\n requires: (player) => getRole(player) == \"admin\",\n});\n\ncommand\n .literal({\n name: \"add\",\n description: \"Adds a new protection region\",\n })\n .int(\"from_x\")\n .int(\"from_z\")\n .int(\"to_x\")\n .int(\"to_z\")\n .executes((ctx, from_x, from_z, to_x, to_z) => {\n new Region(\n { x: from_x, z: from_z },\n { x: to_x, z: to_z },\n ctx.sender.dimension.id\n );\n ctx.reply(\n `Created Region From ${from_x} -64 ${from_z} ${to_x} 320 ${to_z}`\n );\n });\n\ncommand\n .literal({\n name: \"remove\",\n description: \"Removes a region at the players current position\",\n })\n .executes((ctx) => {\n const loc = new BlockLocation(\n ctx.sender.location.x,\n ctx.sender.location.y,\n ctx.sender.location.z\n );\n const r = Region.removeRegionAtBlockLocation(loc, ctx.sender.dimension.id);\n if (r) {\n ctx.reply(`Removed Region at ${loc.x} ${loc.y} ${loc.z}`);\n } else {\n ctx.reply(`Failed to find/remove region at ${loc.x} ${loc.y} ${loc.z}`);\n }\n });\n\ncommand\n .literal({\n name: \"removeAll\",\n description: \"Removes all regions\",\n })\n .executes((ctx) => {\n Region.getAllRegions().forEach((r) => r.delete());\n ctx.reply(`Removed All regions`);\n });\n\ncommand\n .literal({\n name: \"list\",\n description: \"Lists all regions and positions\",\n })\n .executes((ctx) => {\n const regions = Region.getAllRegions();\n for (const region of regions) {\n ctx.reply(\n `Region from ${region.from.x}, ${region.from.z} to ${region.to.x}, ${region.to.z} in dimension ${region.dimensionId}`\n );\n }\n if (regions.length == 0) return ctx.reply(`No regions have been made yet`);\n });\n\nconst permission = command.literal({\n name: \"permission\",\n description: \"Handles permissions for regions\",\n});\n\npermission\n .literal({\n name: \"set\",\n description:\n \"Sets a certain permission on the region the player is currently in to a value\",\n })\n .array(\"key\", [\"doorsAndSwitches\", \"openContainers\", \"pvp\"] as const)\n .boolean(\"value\")\n .executes((ctx, key, value) => {\n const region = Region.blockLocationInRegion(\n new BlockLocation(\n ctx.sender.location.x,\n ctx.sender.location.y,\n ctx.sender.location.z\n ),\n ctx.sender.dimension.id\n );\n if (!region) return ctx.reply(`You are not in a region`);\n region.changePermission(key, value);\n ctx.reply(`Changed permission ${key} to ${value}`);\n });\n\npermission\n .literal({\n name: \"list\",\n description: \"Lists the permissions for the current region\",\n })\n .executes((ctx) => {\n const region = Region.blockLocationInRegion(\n new BlockLocation(\n ctx.sender.location.x,\n ctx.sender.location.y,\n ctx.sender.location.z\n ),\n ctx.sender.dimension.id\n );\n if (!region) return ctx.reply(`You are not in a region`);\n ctx.reply(\n `Current region permissions ${JSON.stringify(region.permissions)}`\n );\n });\n\nconst entityCommands = permission.literal({\n name: \"entities\",\n description: \"Holds the subCommands for adding or removing allowedEntities\",\n});\n\nentityCommands\n .literal({\n name: \"add\",\n description: \"Adds a entity to the allowed entities list\",\n })\n .string(\"entity\")\n .executes((ctx, entity) => {\n const region = Region.blockLocationInRegion(\n new BlockLocation(\n ctx.sender.location.x,\n ctx.sender.location.y,\n ctx.sender.location.z\n ),\n ctx.sender.dimension.id\n );\n if (!region) return ctx.reply(`You are not in a region`);\n const currentAllowedEntities = region.permissions.allowedEntities;\n currentAllowedEntities.push(entity);\n region.changePermission(\"allowedEntities\", currentAllowedEntities);\n ctx.reply(\n `Added entity ${entity} to the allowed entities of the region your currently standing in`\n );\n });\n\nentityCommands\n .literal({\n name: \"remove\",\n description: \"Removes a entity from the allowed entities in the region\",\n })\n .string(\"entity\")\n .executes((ctx, entity) => {\n const region = Region.blockLocationInRegion(\n new BlockLocation(\n ctx.sender.location.x,\n ctx.sender.location.y,\n ctx.sender.location.z\n ),\n ctx.sender.dimension.id\n );\n if (!region) return ctx.reply(`You are not in a region`);\n let currentAllowedEntities = region.permissions.allowedEntities;\n if (!currentAllowedEntities.includes(entity))\n return ctx.reply(\n `The entity ${entity} is not allowed to enter the region`\n );\n currentAllowedEntities = currentAllowedEntities.filter((v) => v != entity);\n region.changePermission(\"allowedEntities\", currentAllowedEntities);\n ctx.reply(\n `Removed entity ${entity} to the allowed entities of the region your currently standing in`\n );\n });\n", "import { Events, ItemStack, Player } from \"@minecraft/server\";\r\nimport type { APPEAL_LINK } from \"./config/app\";\r\nimport type { ENCHANTMENTS } from \"./plugins/Anti-Cheat/config/enchantments\";\r\nimport type {\r\n BANNED_BLOCKS,\r\n BANNED_ITEMS,\r\n} from \"./plugins/Anti-Cheat/config/moderation\";\r\nimport type { BlockInventory } from \"./plugins/Anti-Cheat/modules/models/BlockInventory\";\r\n\r\n/**\r\n * The roles that are in this server\r\n */\r\nexport enum ROLES {\r\n member,\r\n admin,\r\n moderator,\r\n builder,\r\n}\r\n\r\nexport interface IMsOptions {\r\n compactDuration?: string;\r\n fullDuration?: string;\r\n avoidDuration?: Array;\r\n}\r\n\r\nexport interface IplayerTickRegister {\r\n /**\r\n * callback to send\r\n */\r\n callback: (player: Player) => void;\r\n /**\r\n * delay in ticks\r\n */\r\n delay: number;\r\n /**\r\n * the last tick it sent a callback\r\n */\r\n lastCall: number;\r\n}\r\n\r\nexport interface ISlotChangeReturn {\r\n /**\r\n * Slot that changed\r\n */\r\n slot: number;\r\n /**\r\n * the item that was grabbed / put\r\n */\r\n item: ItemStack;\r\n}\r\n\r\nexport interface IEvents {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface IContainerLocation {\r\n [key: string]: BlockInventory;\r\n}\r\n\r\nexport interface IBanData {\r\n /**\r\n * The unique id of this ban\r\n */\r\n key: string;\r\n /**\r\n * The playersName of who was banned\r\n * @example \"Smell of curry\"\r\n */\r\n playerName: string;\r\n /**\r\n * The date in MS when this player was banned\r\n */\r\n date: number;\r\n /**\r\n * The duration in ms that this ban will be for\r\n * if null player is banned forever\r\n */\r\n duration?: number;\r\n /**\r\n * When this ban will expire, if null it will never expire meaning player is banned forever\r\n */\r\n expire?: number;\r\n /**\r\n * The reason for why this player was banned\r\n * @example \"Hacking\"\r\n */\r\n reason?: string;\r\n /**\r\n * Who banned this player\r\n * @example \"Smell of curry\"\r\n * @example \"Rubedo Anti Cheat\"\r\n */\r\n by?: string;\r\n}\r\n\r\nexport interface IFreezeData {\r\n /**\r\n * Players name of who was banned\r\n */\r\n playerName: string;\r\n /**\r\n * Unique id of this freeze instance\r\n */\r\n key: string;\r\n /**\r\n * The reason for this freeze\r\n */\r\n reason?: string;\r\n /**\r\n * The location of this freeze\r\n */\r\n location: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n dimension: string;\r\n };\r\n}\r\n\r\nexport interface IMuteData {\r\n /**\r\n * Players name of who is muted\r\n * @example \"Smell of curry\"\r\n */\r\n playerName: string;\r\n /**\r\n * The date this player got muted\r\n */\r\n date: number;\r\n /**\r\n * The duration of this mute in ms\r\n * if null player is muted forever\r\n */\r\n duration?: number;\r\n /**\r\n * When this players mute will expire in ms\r\n * if null this mute will never expire\r\n */\r\n expire?: number;\r\n /**\r\n * Why this player is muted\r\n * @example \"Spamming\"\r\n */\r\n reason?: string;\r\n /**\r\n * Who muted this player\r\n * @example \"Smell of curry\"\r\n * @example \"Rubedo Anti Cheat\"\r\n */\r\n by?: string;\r\n}\r\n\r\nexport interface INpcLocation {\r\n dimension: string;\r\n x: number;\r\n y: number;\r\n z: number;\r\n}\r\n\r\nexport interface IRegionDB {\r\n dimensionId: string;\r\n from: IRegionCords;\r\n to: IRegionCords;\r\n key: string;\r\n permissions: IRegionPermissions;\r\n}\r\n\r\nexport interface IRegionCords {\r\n x: number;\r\n z: number;\r\n}\r\n\r\nexport interface IRegionPermissions {\r\n /**\r\n * if the player can use chests, default: true\r\n */\r\n doorsAndSwitches: Boolean;\r\n /**\r\n * if the player can use doors, default: true\r\n */\r\n openContainers: Boolean;\r\n /**\r\n * if players can fight, default: false\r\n */\r\n pvp: Boolean;\r\n /**\r\n * the entities allowed in this region\r\n */\r\n allowedEntities: Array;\r\n}\r\n\r\nexport interface IChangePlayerRoleData {\r\n /**\r\n * The name of the player\r\n */\r\n playerName: string;\r\n /**\r\n * The role that the player should be set to\r\n */\r\n role: keyof typeof ROLES;\r\n}\r\n\r\nexport type durationSegmentType = \"y\" | \"w\" | \"d\" | \"h\" | \"m\" | \"s\" | \"ms\";\r\nexport type durationSegment = `${number}${durationSegmentType}`;\r\n\r\nexport type ConfigIds =\r\n | \"spam_config\"\r\n | \"cbe_config\"\r\n | \"gamemode_config\"\r\n | \"nuker_data\"\r\n | \"banned_items\"\r\n | \"banned_blocks\";\r\n\r\nexport type ConfigType = {\r\n spam_config: {\r\n /**\r\n * @default true\r\n */\r\n repeatedMessages: boolean;\r\n /**\r\n * @default true\r\n */\r\n zalgo: boolean;\r\n /**\r\n * @default 0\r\n */\r\n violationCount: number;\r\n /**\r\n * @default false\r\n */\r\n permMutePlayer: boolean;\r\n };\r\n cbe_config: {\r\n /**\r\n * @default true\r\n */\r\n clearItem: boolean;\r\n /**\r\n * @default 0\r\n */\r\n violationCount: number;\r\n /**\r\n * @default false\r\n */\r\n banPlayer: boolean;\r\n /**\r\n * @default false\r\n */\r\n canAddEnchantment: boolean;\r\n };\r\n gamemode_config: {\r\n /**\r\n * @default true\r\n */\r\n setToSurvival: boolean;\r\n /**\r\n * @default true\r\n */\r\n clearPlayer: boolean;\r\n /**\r\n * @default 0\r\n */\r\n violationCount: number;\r\n /**\r\n * @default false\r\n */\r\n banPlayer: boolean;\r\n };\r\n nuker_data: {\r\n /**\r\n * @default 0\r\n */\r\n violationCount: number;\r\n /**\r\n * @default false\r\n */\r\n banPlayer: boolean;\r\n };\r\n /**\r\n * {@link BANNED_ITEMS}\r\n */\r\n banned_items: string[];\r\n /**\r\n * {@link BANNED_BLOCKS}\r\n */\r\n banned_blocks: string[];\r\n /**\r\n * {@link ENCHANTMENTS}\r\n */\r\n enchantments: {\r\n [Property in keyof typeof ENCHANTMENTS]: number;\r\n };\r\n /**\r\n * {@link APPEAL_LINK}\r\n */\r\n appealLink: string;\r\n};\r\n\r\nexport interface LogData {\r\n /**\r\n * An optional playerName who is associated with this log\r\n * @example \"Smell of curry\"\r\n */\r\n playerName?: string;\r\n /**\r\n * The message for this log\r\n * @example \"Smell of curry is bad\"\r\n */\r\n message: string;\r\n /**\r\n * An optional property to list what protection this was from\r\n */\r\n protection?: string;\r\n}\r\n\r\nexport type EventsReturnType = (\r\n arg: Parameters[0]>[0]\r\n) => void;\r\n\r\nexport type IProtectionsConfig = {\r\n [key: string]: boolean | string | number;\r\n /**\r\n * If this protection is enabled\r\n */\r\n enabled: boolean\r\n};\r\n", "import { ROLES } from \"../../../../types\";\nimport { ArgumentTypes, Command } from \"../../../../lib/Command/Command\";\nimport {\n getRole,\n getServerOwner,\n isServerOwner,\n setRole,\n setServerOwner,\n} from \"../../utils.js\";\nimport { TABLES } from \"../../../../database/tables\";\nimport { confirmAction } from \"../../../../utils\";\n\n// Helper\nconst StringIsNumber = (value: any) => isNaN(Number(value)) === false;\n\n// Turn enum into array\nfunction ToArray(enumme: any) {\n return (\n Object.keys(enumme)\n // @ts-ignore\n .filter(StringIsNumber)\n .map((key) => enumme[key])\n );\n}\n\nconst root = new Command({\n name: \"role\",\n description: \"Changes the role for a player\",\n requires: (player) => getRole(player) == \"admin\" || isServerOwner(player),\n});\n\nroot\n .literal({\n name: \"set\",\n description: \"Sets the role for a player\",\n })\n .argument(new ArgumentTypes.playerName(\"playerName\"))\n .argument(new ArgumentTypes.array(\"role\", ToArray(ROLES) as string[]))\n .executes((ctx, playerName, role) => {\n setRole(playerName, role as keyof typeof ROLES);\n ctx.reply(`Changed role of ${playerName} to ${role}`);\n });\n\nroot\n .literal({\n name: \"get\",\n description: \"Gets the role of a player\",\n })\n .argument(new ArgumentTypes.playerName(\"playerName\"))\n .executes((ctx, playerName) => {\n const role = getRole(playerName);\n ctx.reply(`${playerName} has role: ${role}`);\n });\n\nconst ownerRoot = root.literal({\n name: \"owner\",\n description: \"Manages the owner\",\n});\n\nownerRoot\n .literal({\n name: \"get\",\n description: \"Gets the owner of the world\",\n })\n .executes((ctx) => {\n const ownerId = getServerOwner();\n const ids = TABLES.ids.collection();\n const ownerName = Object.keys(ids).find((key) => ids[key] === ownerId);\n ctx.reply(`\u00A7aServer Owner: ${ownerName} (id: ${ownerId})`);\n });\n\nownerRoot\n .literal({\n name: \"transfer\",\n description: \"Transfers the owner of the world\",\n requires: (player) => isServerOwner(player),\n })\n .argument(new ArgumentTypes.player())\n .executes((ctx, player) => {\n confirmAction(\n ctx.sender,\n `Are you sure you want to transfer the server ownership to ${player.name}, this action is not reversible!`,\n () => {\n setServerOwner(player);\n ctx.reply(\n `\u00A7aSet the server Owner to: ${player.name} (id: ${player.id})`\n );\n }\n );\n ctx.reply(`\u00A7aClose chat to confirm`);\n });\n\nownerRoot\n .literal({\n name: \"clear\",\n description: \"clear's the owner of the world\",\n requires: (player) => isServerOwner(player),\n })\n .executes((ctx) => {\n confirmAction(\n ctx.sender,\n \"Are you sure you want to clear the server owner, this action is not reversible!\",\n () => {\n setServerOwner(null);\n ctx.reply(\n `\u00A7aCleared the server owner! run \"/reload\" or reload world to run \"/function start\" again!`\n );\n }\n );\n ctx.reply(`\u00A7aClose chat to confirm`);\n });\n", "import { Player } from \"@minecraft/server\";\r\nimport { ActionFormData } from \"@minecraft/server-ui\";\r\nimport { TIMEOUT_THRESHOLD } from \"../../../config/form\";\r\nimport type { ButtonCallback, IActionFormButton } from \"../types\";\r\n\r\nexport class ActionForm {\r\n /**\r\n * the title that this form should have\r\n */\r\n title?: string;\r\n /**\r\n * extra text that should be displayed in the form\r\n */\r\n body?: string;\r\n /**\r\n * The buttons this form has\r\n */\r\n private buttons: IActionFormButton[];\r\n\r\n /**\r\n * The default minecraft form this form is based on\r\n */\r\n private form: ActionFormData;\r\n\r\n /**\r\n * The amount of times it takes to show this form in ms\r\n * if this value goes above 200 it will time out\r\n */\r\n private triedToShow: number;\r\n\r\n /**\r\n * Creates a new form to be shown to a player\r\n * @param title the title that this form should have\r\n * @param body extra text that should be displayed in the form\r\n */\r\n constructor(title?: string, body?: string) {\r\n this.title = title;\r\n this.body = body;\r\n this.form = new ActionFormData();\r\n\r\n if (title) this.form.title(title);\r\n if (body) this.form.body(body);\r\n\r\n this.buttons = [];\r\n\r\n this.triedToShow = 0;\r\n }\r\n\r\n /**\r\n * Adds a button to this form\r\n * @param text text to show on this button\r\n * @param iconPath the path this button shows\r\n * @param callback what happens when this button is clicked\r\n * @example ```\r\n * addButton(\"settings\", \"textures/items/sum\")\r\n * ```\r\n */\r\n addButton(\r\n text: string,\r\n iconPath: string = null,\r\n callback: ButtonCallback\r\n ): ActionForm {\r\n this.buttons.push({\r\n text: text,\r\n iconPath: iconPath,\r\n callback: callback,\r\n });\r\n this.form.button(text, iconPath);\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows this form to the player\r\n * @param player player to show to\r\n */\r\n show(player: Player): void {\r\n this.form.show(player).then((response) => {\r\n if (response.canceled) {\r\n if (response.cancelationReason == \"userBusy\") {\r\n // check time and reshow form\r\n if (this.triedToShow > TIMEOUT_THRESHOLD)\r\n return player.tell(\r\n `\u00A7cForm Timeout: tried to show form, but you were busy (close chat after running command)`\r\n );\r\n this.triedToShow++;\r\n this.show(player);\r\n }\r\n return;\r\n }\r\n this.buttons[response.selection].callback?.();\r\n });\r\n }\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { ModalFormData } from \"@minecraft/server-ui\";\r\nimport { TIMEOUT_THRESHOLD } from \"../../../config/form\";\r\nimport type { AppendFormField, IModalFormArg, Range } from \"../types\";\r\nimport { FormCallback } from \"./FormCallback\";\r\n\r\nexport class ModalForm<\r\n Callback extends Function = (ctx: FormCallback) => void\r\n> {\r\n /**\r\n * the title that this form should have\r\n */\r\n title?: string;\r\n\r\n /**\r\n * The default minecraft form this form is based on\r\n */\r\n private form: ModalFormData;\r\n\r\n /**\r\n * The arguments this form has\r\n */\r\n private args: IModalFormArg[];\r\n\r\n /**\r\n * Creates a new form to be shown to a player\r\n * @param title the title that this form should have\r\n */\r\n constructor(title?: string) {\r\n this.title = title;\r\n this.form = new ModalFormData();\r\n\r\n if (title) this.form.title(title);\r\n\r\n this.args = [];\r\n }\r\n\r\n /**\r\n * Adds a dropdown to this form\r\n * @param label label to show on dropdown\r\n * @param options the available options for this dropdown\r\n * @param defaultValueIndex the default value index\r\n * @returns this\r\n */\r\n addDropdown>(\r\n label: string,\r\n options: T,\r\n defaultValueIndex?: number\r\n ): ModalForm> {\r\n // @ts-ignore\r\n this.args.push({ type: \"dropdown\", options: options });\r\n // @ts-ignore\r\n this.form.dropdown(label, options, defaultValueIndex);\r\n // @ts-ignore\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a slider to this form\r\n * @param label label to be shown on this slider\r\n * @param minimumValue the smallest value this can be\r\n * @param maximumValue the maximum value this can be\r\n * @param valueStep how this slider increments\r\n * @param defaultValue the default value in slider\r\n * @returns this\r\n */\r\n addSlider(\r\n label: string,\r\n minimumValue: T,\r\n maximumValue: U,\r\n valueStep: number,\r\n defaultValue?: number\r\n ): ModalForm>> {\r\n this.args.push({ type: \"slider\" });\r\n this.form.slider(\r\n label,\r\n minimumValue,\r\n maximumValue,\r\n valueStep,\r\n defaultValue\r\n );\r\n // @ts-ignore\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a toggle to this form\r\n * @param label the name of this toggle\r\n * @param defaultValue the default toggle value could be true or false\r\n * @returns\r\n */\r\n addToggle(\r\n label: string,\r\n defaultValue?: boolean\r\n ): ModalForm> {\r\n this.args.push({ type: \"toggle\" });\r\n this.form.toggle(label, defaultValue);\r\n // @ts-ignore\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a text field to this form\r\n * @param label label for this textField\r\n * @param placeholderText the text that shows on this field\r\n * @param defaultValue the default value that this field has\r\n */\r\n addTextField(\r\n label: string,\r\n placeholderText: string,\r\n defaultValue?: string\r\n ): ModalForm> {\r\n this.args.push({ type: \"textField\" });\r\n this.form.textField(label, placeholderText, defaultValue);\r\n // @ts-ignore\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows this form to a player\r\n * @param player player to show to\r\n * @param callback sends a callback when this form is submitted\r\n */\r\n async show(player: Player, callback: Callback) {\r\n for (let i = 0; i < TIMEOUT_THRESHOLD; i++) {\r\n let response = await this.form.show(player);\r\n if (response.cancelationReason == \"userBusy\") continue;\r\n callback(\r\n new FormCallback(this, player, callback),\r\n ...response.formValues.map((v, i) =>\r\n this.args[i].type == \"dropdown\" ? this.args[i].options[v] : v\r\n )\r\n );\r\n return;\r\n }\r\n return player.tell(\r\n `\u00A7cForm Timeout: tried to show form, but you were busy (close chat after running command)`\r\n );\r\n }\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { ActionForm } from \"./ActionForm\";\r\nimport { MessageForm } from \"./MessageForm\";\r\nimport { ModalForm } from \"./ModelForm\";\r\n\r\nexport class FormCallback {\r\n /**\r\n * form that was used in this call\r\n */\r\n private form: ActionForm | MessageForm | ModalForm;\r\n /**\r\n * player that this form used\r\n */\r\n private player: Player;\r\n\r\n /**\r\n * the function that was called\r\n */\r\n private callback: () => void;\r\n\r\n /**\r\n * Creates a new form callback instance that can be used by\r\n * buttons, and args to run various functions\r\n * @param form form that is used in this call\r\n */\r\n constructor(\r\n form: ActionForm | MessageForm | ModalForm,\r\n player: Player,\r\n callback: any\r\n ) {\r\n this.form = form;\r\n this.player = player;\r\n this.callback = callback;\r\n }\r\n\r\n /**\r\n * Reshow the form and shows the user a error message\r\n * @param message error message to show\r\n */\r\n error(message: string) {\r\n new MessageForm(\"Error\", message)\r\n .setButton1(\"Return to form\", () => {\r\n this.form.show(this.player, this.callback);\r\n })\r\n .setButton2(\"Cancel\", null)\r\n .show(this.player);\r\n }\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { APPEAL_LINK } from \"../../../../config/app\";\r\nimport { ENCHANTMENTS } from \"../../config/enchantments\";\r\nimport { ActionForm } from \"../../../../lib/Form/Models/ActionForm\";\r\nimport { ModalForm } from \"../../../../lib/Form/Models/ModelForm\";\r\nimport { getConfigId, setConfigId } from \"../../utils\";\r\n\r\nexport function manageBannedItemsForm(player: Player) {\r\n new ActionForm(\"Manage Banned Items\")\r\n .addButton(\"Remove a Banned Item\", null, () => {\r\n removeBannedItemForm(player);\r\n })\r\n .addButton(\"Ban an item\", null, () => {\r\n addBannedItemForm(player);\r\n })\r\n .show(player);\r\n}\r\nexport function removeBannedItemForm(player: Player) {\r\n new ModalForm(\"Remove Banned Items\")\r\n .addDropdown(\"Select item to remove\", getConfigId(\"banned_items\"))\r\n .show(player, (ctx, item) => {\r\n let items = getConfigId(\"banned_items\");\r\n items = items.filter((p) => p != item);\r\n setConfigId(\"banned_items\", items);\r\n player.tell(`Removed Banned item \"${item}\"`);\r\n });\r\n}\r\n\r\nexport function addBannedItemForm(player: Player) {\r\n new ModalForm(\"Add Banned Item\")\r\n .addTextField(\"Item Id\", \"minecraft:string\")\r\n .show(player, (ctx, item) => {\r\n let items = getConfigId(\"banned_items\");\r\n if (items.includes(item))\r\n return ctx.error(`\u00A7cItem \"${item}\" is already banned`);\r\n items.push(item);\r\n setConfigId(\"banned_items\", items);\r\n player.tell(`Banned the item \"${item}\"`);\r\n });\r\n}\r\n\r\nexport function manageBannedBlocksForm(player: Player) {\r\n new ActionForm(\"Manage Banned Blocks\")\r\n .addButton(\"Remove a Banned Block\", null, () => {\r\n removeBannedBlockForm(player);\r\n })\r\n .addButton(\"Ban an block\", null, () => {\r\n addBannedBlockForm(player);\r\n })\r\n .show(player);\r\n}\r\n\r\nexport function removeBannedBlockForm(player: Player) {\r\n new ModalForm(\"Remove Banned Block\")\r\n .addDropdown(\"Select block to remove\", getConfigId(\"banned_blocks\"))\r\n .show(player, (ctx, block) => {\r\n let blocks = getConfigId(\"banned_blocks\");\r\n blocks = blocks.filter((p) => p != block);\r\n setConfigId(\"banned_blocks\", blocks);\r\n player.tell(`Removed Banned block \"${block}\"`);\r\n });\r\n}\r\n\r\nexport function addBannedBlockForm(player: Player) {\r\n new ModalForm(\"Add Banned Block\")\r\n .addTextField(\"Block Id\", \"minecraft:barrier\")\r\n .show(player, (ctx, block) => {\r\n let blocks = getConfigId(\"banned_blocks\");\r\n if (blocks.includes(block))\r\n return ctx.error(`\u00A7cBlock \"${block}\" is already banned`);\r\n blocks.push(block);\r\n setConfigId(\"banned_blocks\", blocks);\r\n player.tell(`Banned the block \"${block}\"`);\r\n });\r\n}\r\n\r\nexport function manageEnchantmentLevelsForm(player: Player) {\r\n new ModalForm(\"Manage Enchantment Levels\")\r\n .addDropdown(\"Enchantment to change\", Object.keys(ENCHANTMENTS), 0)\r\n .addTextField(\"Level (number)\", \"5\")\r\n .show(player, (ctx, enchantment, levelString) => {\r\n if (isNaN(levelString as any))\r\n return ctx.error(\r\n `\u00A7c\"${levelString}\" is not a number, please enter a value like, \"3\", \"9\", etc.`\r\n );\r\n const level = parseInt(levelString);\r\n let enchants = getConfigId(\"enchantments\");\r\n enchants[enchantment as keyof typeof ENCHANTMENTS] = level;\r\n setConfigId(\"enchantments\", enchants);\r\n player.tell(`Set max level for ${enchantment} to ${level}`);\r\n });\r\n}\r\n\r\nexport function manageAppealLinkForm(player: Player) {\r\n new ModalForm(\"Manage Appeal Link\")\r\n .addTextField(\"Appeal Link\", APPEAL_LINK)\r\n .show(player, (ctx, link) => {\r\n setConfigId(\"appealLink\", link);\r\n player.tell(`Changed the servers appeal link to ${link}`);\r\n });\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { ActionForm } from \"../../../../lib/Form/Models/ActionForm\";\r\nimport { ModalForm } from \"../../../../lib/Form/Models/ModelForm\";\r\nimport { IProtectionsConfig } from \"../../../../types\";\r\nimport { PROTECTIONS } from \"../../protections\";\r\nimport { Protection } from \"../models/Protection\";\r\nimport { showHomeForm } from \"./home\";\r\n\r\nexport function showAutoModHomeForm(player: Player) {\r\n const form = new ActionForm(\"Manage Protections\");\r\n\r\n for (const protection of Object.values(PROTECTIONS)) {\r\n form.addButton(protection.name, protection.iconPath, () => {\r\n showProtectionConfig(protection, player);\r\n });\r\n }\r\n form\r\n .addButton(\"Back\", \"textures/ui/arrow_dark_left_stretch.png\", () => {\r\n showHomeForm(player);\r\n })\r\n .show(player);\r\n}\r\n\r\nexport function showProtectionConfig(protection: Protection, player: Player) {\r\n const data = protection.getConfig();\r\n const form = new ModalForm(\r\n `Manage ${protection.name} Protection Config`\r\n ).addToggle(\"Enabled\", data[\"enabled\"]);\r\n let keys: string[] = [];\r\n for (const [key, value] of Object.entries(protection.configDefault)) {\r\n keys.push(key);\r\n if (typeof value.defaultValue == \"boolean\") {\r\n form.addToggle(value.description, data[key] as boolean);\r\n } else if (typeof value.defaultValue == \"number\") {\r\n form.addSlider(value.description, 0, 100, 1, data[key] as number);\r\n } else {\r\n form.addTextField(value.description, null, data[key] as string);\r\n }\r\n }\r\n form.show(player, (ctx, enabled, ...keys) => {\r\n if (enabled != data[\"enabled\"]) {\r\n if (enabled) protection.enable();\r\n if (!enabled) protection.disable();\r\n }\r\n let config: IProtectionsConfig = {\r\n enabled: enabled,\r\n };\r\n for (const [i, key] of Object.keys(protection.configDefault).entries()) {\r\n config[key] = keys[i];\r\n }\r\n protection.setConfig(config);\r\n player.tell(`Updated config for ${protection.name}!`);\r\n });\r\n}\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { ActionForm } from \"../../../../lib/Form/Models/ActionForm\";\r\nimport * as settings from \"./settings\";\r\nimport * as automod from \"./automod\";\r\n\r\nexport function showHomeForm(player: Player) {\r\n new ActionForm(\"Rubedo Settings\")\r\n .addButton(\"Auto Mod\", \"textures/ui/permissions_op_crown.png\", () => {\r\n automod.showAutoModHomeForm(player);\r\n })\r\n .addButton(\"Banned items\", \"textures/blocks/sculk_shrieker_top.png\", () => {\r\n settings.manageBannedItemsForm(player);\r\n })\r\n .addButton(\"Banned blocks\", \"textures/blocks/barrier.png\", () => {\r\n settings.manageBannedBlocksForm(player);\r\n })\r\n .addButton(\"Enchantments\", \"textures/items/book_enchanted.png\", () => {\r\n settings.manageEnchantmentLevelsForm(player);\r\n })\r\n .addButton(\"Appeal Link\", \"textures/ui/Feedback.png\", () => {\r\n settings.manageAppealLinkForm(player);\r\n })\r\n .show(player);\r\n}\r\n", "import { Command } from \"../../../../lib/Command/Command.js\";\r\nimport { getRole } from \"../../utils.js\";\r\nimport { showHomeForm } from \"../forms/home.js\";\r\n\r\nnew Command({\r\n name: \"settings\",\r\n description: \"Opens up the settings menu for the player\",\r\n requires: (player) => [\"admin\", \"moderator\"].includes(getRole(player)),\r\n}).executes((ctx) => {\r\n showHomeForm(ctx.sender);\r\n ctx.sender.tell(`\u00A7aForm request sent, close chat to continue!`);\r\n});\r\n", "import { Player, world } from \"@minecraft/server\";\nimport { Command } from \"../../../../lib/Command/Command.js\";\nimport { getRole } from \"../../utils.js\";\n\nfunction vanish(player: Player, say: boolean) {\n if (player.hasTag(`spectator`)) {\n player.runCommandAsync(`gamemode c`);\n player.triggerEvent(`removeSpectator`);\n player.removeTag(`spectator`);\n if (!say) return;\n world.say({\n rawtext: [\n {\n translate: \"multiplayer.player.joined\",\n with: [`\u00A7e${player.name}`],\n },\n ],\n });\n } else {\n player.runCommandAsync(`gamemode spectator`);\n player.triggerEvent(`addSpectator`);\n player.addTag(`spectator`);\n if (!say) return;\n world.say({\n rawtext: [\n {\n translate: \"multiplayer.player.left\",\n with: [`\u00A7e${player.name}`],\n },\n ],\n });\n }\n}\n\nnew Command({\n name: \"vanish\",\n description: \"Toggles Vanish Mode on the sender\",\n requires: (player) => getRole(player) == \"admin\",\n})\n .executes((ctx) => {\n vanish(ctx.sender, false);\n })\n .boolean(\"say\")\n .executes((ctx, say) => {\n vanish(ctx.sender, say);\n });\n", "import { Command } from \"../../../../lib/Command/Command.js\";\nimport { VERSION } from \"../../../../config/app\";\n\nnew Command({\n name: \"version\",\n description: \"Get Current Version\",\n aliases: [\"v\"],\n}).executes((ctx) => {\n ctx.reply(`Current Rubedo Version: ${VERSION}`);\n});\n", "import { ArgumentTypes, Command } from \"../../../../lib/Command/Command\";\r\nimport { getRole, kick } from \"../../utils\";\r\n\r\nnew Command({\r\n name: \"kick\",\r\n description: \"Kicks a player from the game\",\r\n requires: (player) => getRole(player) == \"admin\",\r\n})\r\n .argument(new ArgumentTypes.player())\r\n .string(\"reason\")\r\n .executes((ctx, player, reason) => {\r\n kick(player, [reason]);\r\n ctx.reply(`\u00A7aKicked ${player.name} from world`);\r\n });\r\n", "import { TABLES } from \"../../../../database/tables\";\r\nimport type { LogData } from \"../../../../types\";\r\n\r\nexport class Log {\r\n /**\r\n * The data on this Log\r\n */\r\n data: LogData;\r\n constructor(data: LogData) {\r\n this.data = data;\r\n console.warn(`[LOG]: ${data.message}`);\r\n TABLES.logs.set(Date.now().toString(), data);\r\n }\r\n}\r\n", "import { PREFIX } from \"../../../../config/commands\";\r\nimport { ArgumentTypes, Command } from \"../../../../lib/Command/Command\";\r\nimport { TABLES } from \"../../../../database/tables\";\r\nimport { getRole } from \"../../utils\";\r\nimport { Log } from \"../models/Log\";\r\n\r\nfunction timeDifference(previous: number) {\r\n var msPerMinute = 60 * 1000;\r\n var msPerHour = msPerMinute * 60;\r\n var msPerDay = msPerHour * 24;\r\n var msPerMonth = msPerDay * 30;\r\n var msPerYear = msPerDay * 365;\r\n\r\n var elapsed = Date.now() - previous;\r\n\r\n if (elapsed < msPerMinute) {\r\n return Math.round(elapsed / 1000) + \" seconds ago\";\r\n } else if (elapsed < msPerHour) {\r\n return Math.round(elapsed / msPerMinute) + \" minutes ago\";\r\n } else if (elapsed < msPerDay) {\r\n return Math.round(elapsed / msPerHour) + \" hours ago\";\r\n } else if (elapsed < msPerMonth) {\r\n return \"approximately \" + Math.round(elapsed / msPerDay) + \" days ago\";\r\n } else if (elapsed < msPerYear) {\r\n return \"approximately \" + Math.round(elapsed / msPerMonth) + \" months ago\";\r\n } else {\r\n return \"approximately \" + Math.round(elapsed / msPerYear) + \" years ago\";\r\n }\r\n}\r\n\r\nconst root = new Command({\r\n name: \"log\",\r\n description: \"Manages the log command\",\r\n requires: (player) => getRole(player) == \"admin\",\r\n});\r\n\r\nroot\r\n .literal({\r\n name: \"add\",\r\n description: \"Adds a new log\",\r\n })\r\n .string(\"message\")\r\n .executes((ctx, message) => {\r\n new Log({ message: message });\r\n ctx.reply(`\u00A7aAdded new log: ${message}`);\r\n });\r\n\r\nroot\r\n .literal({\r\n name: \"getAll\",\r\n description: \"Gets all logs sorted in descending\",\r\n })\r\n .int(\"page\")\r\n .array(\"order\", [\"ascending\", \"descending\"] as const)\r\n .executes((ctx, page, order) => {\r\n const allLogs = Object.entries(TABLES.logs.collection()).sort((a, b) =>\r\n order == \"ascending\"\r\n ? parseInt(b[0]) - parseInt(a[0])\r\n : parseInt(a[0]) - parseInt(b[0])\r\n );\r\n if (allLogs.length == 0) return ctx.reply(`\u00A7cNo Logs have been made!`);\r\n const maxPages = Math.ceil(allLogs.length / 8);\r\n if (page > maxPages) page = maxPages;\r\n ctx.reply(\r\n `\u00A72--- Showing logs page ${page} of ${maxPages} (${PREFIX}log getAll ) ---`\r\n );\r\n\r\n for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) {\r\n ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`);\r\n }\r\n });\r\n\r\nroot\r\n .literal({\r\n name: \"getPlayersLogs\",\r\n description: \"Gets all logs associated with a player\",\r\n })\r\n .argument(new ArgumentTypes.playerName())\r\n .int(\"page\")\r\n .array(\"order\", [\"ascending\", \"descending\"] as const)\r\n .executes((ctx, playerName, page, order) => {\r\n const allLogs = Object.entries(TABLES.logs.collection())\r\n .filter((v) => v[1].playerName == playerName)\r\n .sort((a, b) =>\r\n order == \"ascending\"\r\n ? parseInt(b[0]) - parseInt(a[0])\r\n : parseInt(a[0]) - parseInt(b[0])\r\n );\r\n if (allLogs.length == 0)\r\n return ctx.reply(`\u00A7cNo Logs exists for \"${playerName}\"!`);\r\n const maxPages = Math.ceil(allLogs.length / 8);\r\n if (page > maxPages) page = maxPages;\r\n ctx.reply(\r\n `\u00A72--- Showing logs for \"${playerName}\" page ${page} of ${maxPages} ---`\r\n );\r\n\r\n for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) {\r\n ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`);\r\n }\r\n });\r\n\r\nroot\r\n .literal({\r\n name: \"getProtectionLogs\",\r\n description: \"Gets all logs associated with a protection\",\r\n })\r\n .string(\"protection\")\r\n .int(\"page\")\r\n .array(\"order\", [\"ascending\", \"descending\"] as const)\r\n .executes((ctx, protection, page, order) => {\r\n const allLogs = Object.entries(TABLES.logs.collection())\r\n .filter((v) => v[1].protection == protection)\r\n .sort((a, b) =>\r\n order == \"ascending\"\r\n ? parseInt(b[0]) - parseInt(a[0])\r\n : parseInt(a[0]) - parseInt(b[0])\r\n );\r\n if (allLogs.length == 0)\r\n return ctx.reply(`\u00A7cNo Logs exists for protection: \"${protection}\"!`);\r\n const maxPages = Math.ceil(allLogs.length / 8);\r\n if (page > maxPages) page = maxPages;\r\n ctx.reply(\r\n `\u00A72--- Showing logs for Protection: \"${protection}\" page ${page} of ${maxPages} ---`\r\n );\r\n\r\n for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) {\r\n ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`);\r\n }\r\n });\r\n\r\nroot\r\n .literal({\r\n name: \"clearAll\",\r\n description: \"Clears all logs\",\r\n })\r\n .executes((ctx) => {\r\n TABLES.logs.clear();\r\n ctx.reply(`\u00A7aCleared All logs!`);\r\n });\r\n", "import { ArgumentTypes, Command } from \"../../../../lib/Command/Command\";\r\nimport { getRole } from \"../../utils\";\r\n\r\nconst root = new Command({\r\n name: \"teleport\",\r\n description: \"Teleports entities (players, mobs, etc.).\",\r\n aliases: [\"tp\"],\r\n requires: (player) => getRole(player) == \"admin\",\r\n});\r\n\r\nroot\r\n .argument(new ArgumentTypes.player())\r\n .location(\"destination\")\r\n .executes((ctx, player, destination) => {\r\n player.addTag(\"skip-movement-check\");\r\n player.teleport(destination, player.dimension, 0, 0);\r\n ctx.reply(\r\n `Teleported ${player.name} to ${destination.x} ${destination.y} ${destination.z}`\r\n );\r\n });\r\n", "import { TABLES } from \"../../../../database/tables.js\";\nimport { msToTime } from \"../../../../utils.js\";\nimport { kick, forEachValidPlayer, getConfigId } from \"../../utils.js\";\n\nforEachValidPlayer((player) => {\n try {\n const banData = TABLES.bans.get(player.id);\n if (!banData) return;\n if (banData.expire && banData.expire < Date.now())\n return TABLES.bans.delete(player.id);\n kick(\n player,\n [\n `\u00A7cYou have been banned!`,\n `\u00A7aReason: \u00A7f${banData.reason}`,\n `\u00A7fExpiry: \u00A7b${\n banData.expire ? msToTime(banData.expire - Date.now()) : \"Forever\"\n }`,\n `\u00A7fAppeal at: \u00A7b${getConfigId(\"appealLink\")}`,\n ],\n () => {\n console.warn(new Error(\"Failed to kick player\"));\n TABLES.bans.delete(player.id);\n }\n );\n } catch (error) {\n console.warn(error + error.stack);\n }\n}, 20);\n", "import { Location } from \"@minecraft/server\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport { DIMENSIONS } from \"../../../../utils.js\";\nimport { forEachValidPlayer } from \"../../utils.js\";\n\nforEachValidPlayer((player) => {\n try {\n const freezeData = TABLES.freezes.get(player.id);\n\n if (!freezeData)\n return player.getComponent(\"movement\").resetToDefaultValue();\n player.getComponent(\"movement\").setCurrent(0);\n\n player.teleport(\n new Location(\n freezeData.location.x,\n freezeData.location.y,\n freezeData.location.z\n ),\n DIMENSIONS[freezeData.location.dimension as keyof typeof DIMENSIONS],\n 0,\n 0\n );\n } catch (error) {}\n}, 200);\n", "import { world, BeforeChatEvent } from \"@minecraft/server\";\r\nimport { PREFIX } from \"../../config/commands\";\r\n\r\ntype beforeChatCallback = (arg: BeforeChatEvent) => void;\r\n\r\nconst CALLBACKS: {\r\n [key: number]: {\r\n callback: beforeChatCallback;\r\n };\r\n} = {};\r\n\r\nworld.events.beforeChat.subscribe((data) => {\r\n if (data.message.startsWith(PREFIX)) return; // This is a command\r\n for (const callback of Object.values(CALLBACKS)) {\r\n callback.callback(data);\r\n }\r\n});\r\n\r\nexport class beforeChat {\r\n /**\r\n * Subscribes to a callback to get notified when a chat is sent that is not a command\r\n * @param callback what to be called when one of these entity's inventory changes\r\n * @returns the id that is used to unsubscribe\r\n */\r\n static subscribe(callback: beforeChatCallback): number {\r\n const key = Date.now();\r\n CALLBACKS[key] = { callback: callback };\r\n return key;\r\n }\r\n static unsubscribe(key: number): void {\r\n delete CALLBACKS[key];\r\n }\r\n}\r\n", "import { Mute } from \"../models/Mute.js\";\nimport { text } from \"../../../../lang/text.js\";\nimport { TABLES } from \"../../../../database/tables.js\";\nimport { beforeChat } from \"../../../../lib/Events/beforeChat.js\";\n\nbeforeChat.subscribe((data) => {\n const muteData = Mute.getMuteData(data.sender);\n if (!muteData) return;\n if (muteData.expire && muteData.expire < Date.now())\n return TABLES.mutes.delete(data.sender.name);\n data.cancel = true;\n data.sender.tell(text[\"modules.managers.mute.isMuted\"]());\n});\n", "import { BlockLocation, Player, system, world } from \"@minecraft/server\";\nimport { Region } from \"../models/Region.js\";\nimport { forEachValidPlayer, getRole, loadRegionDenys } from \"../../utils.js\";\nimport { BLOCK_CONTAINERS, DOORS_SWITCHES } from \"../../config/region.js\";\nimport { DIMENSIONS } from \"../../../../utils.js\";\nimport { EntitiesLoad } from \"../../../../lib/Events/EntitiesLoad.js\";\n\n/**\n * Sets Deny blocks at bottom of region every 5 mins\n */\nsystem.runSchedule(() => {\n loadRegionDenys();\n}, 6000);\n\n/**\n * Permissions for region\n */\nworld.events.beforeItemUseOn.subscribe((data) => {\n if ([\"moderator\", \"admin\"].includes(getRole(data.source as Player))) return;\n const region = Region.blockLocationInRegion(\n data.blockLocation,\n data.source.dimension.id\n );\n if (!region) return;\n const block = data.source.dimension.getBlock(data.blockLocation);\n if (\n DOORS_SWITCHES.includes(block.typeId) &&\n region.permissions.doorsAndSwitches\n )\n return;\n if (\n BLOCK_CONTAINERS.includes(block.typeId) &&\n region.permissions.openContainers\n )\n return;\n data.cancel = true;\n});\n\nworld.events.beforeExplosion.subscribe((data) => {\n for (let i = 0; i < data.impactedBlocks.length; i++) {\n const bL = data.impactedBlocks[i];\n let region = Region.blockLocationInRegion(bL, data.dimension.id);\n if (region) return (data.cancel = true);\n }\n});\n\nworld.events.entityCreate.subscribe(async ({ entity }) => {\n const region = await Region.blockLocationInRegionSync(\n new BlockLocation(entity.location.x, entity.location.y, entity.location.z),\n entity.dimension.id\n );\n if (!region) return;\n if (region.permissions.allowedEntities.includes(entity.typeId)) return;\n entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0);\n entity.kill();\n});\n\nEntitiesLoad.subscribe(() => {\n system.runSchedule(async () => {\n for (const region of await Region.getAllRegionsSync()) {\n for (const entity of DIMENSIONS[\n region.dimensionId as keyof typeof DIMENSIONS\n ].getEntities({ excludeTypes: region.permissions.allowedEntities })) {\n if (!region.entityInRegion(entity)) continue;\n entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0);\n entity.kill();\n }\n }\n }, 100);\n});\n\n/**\n * Gives player a tag if they are in a region\n */\nforEachValidPlayer((player) => {\n for (const region of Region.getAllRegions()) {\n if (region.entityInRegion(player)) {\n player.addTag(`inRegion`);\n if (!region.permissions.pvp) player.addTag(`region-protected`);\n } else {\n player.removeTag(`inRegion`);\n player.removeTag(`region-protected`);\n }\n }\n}, 5);\n", "import { world } from \"@minecraft/server\";\r\nimport { text } from \"../../../../lang/text\";\r\nimport { TABLES } from \"../../../../database/tables\";\r\nimport { getRole, isLockedDown, kick, setRole } from \"../../utils\";\r\nimport { Mute } from \"../models/Mute\";\r\nimport { ChangePlayerRoleTask } from \"../models/Task\";\r\nimport { EntitiesLoad } from \"../../../../lib/Events/EntitiesLoad\";\r\n\r\nworld.events.playerJoin.subscribe(async ({ player }) => {\r\n await EntitiesLoad.awaitLoad();\r\n if (isLockedDown() && getRole(player) != \"admin\")\r\n return kick(player, text[\"lockdown.kick.message\"]());\r\n // --\r\n if (Mute.getMuteData(player)) player.runCommandAsync(`ability @s mute true`);\r\n if (!TABLES.ids.has(player.name)) {\r\n // Player is new!\r\n TABLES.ids.set(player.name, player.id);\r\n } else {\r\n player.addTag(\"old\");\r\n }\r\n /**\r\n * This is a role that was tried to push when the player was offline\r\n * so were setting it now because the player just joined\r\n */\r\n const roleToSet = ChangePlayerRoleTask.getPlayersRoleToSet(player.name);\r\n if (roleToSet) setRole(player, roleToSet);\r\n});\r\n", "import {\n Entity,\n InventoryComponentContainer,\n Items,\n MinecraftItemTypes,\n world,\n} from \"@minecraft/server\";\nimport { AIR } from \"../../../../index.js\";\nimport { PageItem } from \"../../../../lib/Chest GUI/Models/PageItem\";\nimport { Page } from \"../../../../lib/Chest GUI/Models/Page\";\nimport { CHESTGUIS } from \"../../../../lib/Chest GUI/utils.js\";\nimport { ItemType } from \"@minecraft/server\";\n\n/**\n * The possible fillable slots where items can be put\n * this is for inventory fill\n */\nconst FILLABLE_SLOTS = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n 41, 42, 43, 44,\n];\n\n/**\n * The possible fillable slots where items can be put\n * this is for inventory fill\n */\nconst FILLABLE_SLOTS_ENDERCHEST = [\n 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32,\n 33, 34, 37, 38, 39, 40, 41, 42, 43,\n];\n\n/**\n * Fills the chest Screen with the desired kit\n */\nexport function ViewPlayersFill(entity: Entity, page: Page, extras: any) {\n const container: InventoryComponentContainer = entity.getComponent(\n \"minecraft:inventory\"\n ).container;\n\n for (let i = 0; i < container.size; i++) {\n const slot = page.slots[i];\n if (!slot || !slot.item) {\n container.setItem(i, AIR);\n continue;\n }\n container.setItem(i, slot.item.itemStack);\n }\n for (const [i, player] of [...world.getPlayers()].entries()) {\n const slot = FILLABLE_SLOTS[i];\n const item = new PageItem(MinecraftItemTypes.skull, {\n nameTag: player.name,\n data: 3,\n });\n container.setItem(slot, item.itemStack);\n page.slots[slot] = {\n item: item,\n action: (ctx) => {\n ctx.PageAction(\"moderation:see_inventory\", { name: player.name });\n },\n };\n }\n}\n\n/**\n * Fills the chest Screen with the desired kit\n */\nexport function ViewPlayerInventoryFill(\n entity: Entity,\n page: Page,\n extras: any\n) {\n const container = entity.getComponent(\"minecraft:inventory\").container;\n\n for (let i = 0; i < container.size; i++) {\n const slot = page.slots[i];\n if (!slot || !slot.item) {\n container.setItem(i, AIR);\n continue;\n }\n container.setItem(i, slot.item.itemStack);\n }\n const EnderChestItem = new PageItem(MinecraftItemTypes.enderChest, {\n nameTag: `\u00A7eView \u00A7f${extras?.name}\u00A7e Ender Chest\\n\u00A7fNote: \u00A7cThis will not grab \u00A7lANY NBT!\u00A7r`,\n });\n container.setItem(49, EnderChestItem.itemStack);\n page.slots[49] = {\n item: EnderChestItem,\n action: (ctx) => {\n ctx.PageAction(\"moderation:see_ender_chest\", { name: extras.name });\n },\n };\n const player = [...world.getPlayers()].find((p) => p.name == extras.name);\n if (!player) {\n const gui = Object.values(CHESTGUIS).find((e) => e.entity.id == entity.id);\n gui.despawn();\n player.tell(`\"${extras.name}\" Could not be found, Gui Crashed`);\n }\n const inventory = player.getComponent(\"inventory\").container;\n /**\n * the value of how many slots have been taken\n */\n let used_slots = 0;\n for (let i = 0; i < inventory.size; i++) {\n const item = inventory.getItem(i);\n const slot = FILLABLE_SLOTS[used_slots];\n used_slots++;\n if (!item) {\n container.setItem(slot, AIR);\n continue;\n }\n container.setItem(slot, item);\n page.slots[slot] = {\n item: new PageItem(\n Items.get(item.typeId),\n { amount: item.amount, data: item.data },\n item\n ),\n action: (ctx) => {\n if (i < 9) {\n player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`);\n } else {\n player.runCommandAsync(\n `replaceitem entity @s slot.inventory ${i - 9} air`\n );\n }\n ctx.GiveAction();\n page.slots[slot] = {\n item: null,\n action: (ctx) => {\n inventory.addItem(ctx.getItemAdded());\n },\n };\n },\n };\n }\n}\n\n/**\n * Fills the chest Screen with the desired kit\n */\nexport async function ViewPlayerEnderChestFill(\n entity: Entity,\n page: Page,\n extras: any\n) {\n const container = entity.getComponent(\"minecraft:inventory\").container;\n for (let i = 0; i < container.size; i++) {\n const slot = page.slots[i];\n if (!slot || !slot.item) {\n container.setItem(i, AIR);\n continue;\n }\n container.setItem(i, slot.item.itemStack);\n }\n const player = [...world.getPlayers()].find((p) => p.name == extras?.name);\n if (!player) {\n const gui = Object.values(CHESTGUIS).find((e) => e.entity.id == entity.id);\n gui.despawn();\n player.tell(`\"${extras.name}\" Could not be found, Gui Crashed`);\n }\n /**\n * the value of how many slots have been taken\n */\n let used_slots = 0;\n const ItemTypes: ItemType[] = Object.values(MinecraftItemTypes);\n for (const item of ItemTypes) {\n try {\n await player.runCommandAsync(\n `testfor @s[hasitem={item=${item.id},location=slot.enderchest}]`\n );\n const ChestGuiItem = new PageItem(item, {\n nameTag: \"Note: \u00A7l\u00A7cThis is not the exact item\",\n });\n const slot = FILLABLE_SLOTS_ENDERCHEST[used_slots];\n container.setItem(slot, ChestGuiItem.itemStack);\n page.slots[slot] = {\n item: ChestGuiItem,\n action: (ctx) => {\n ctx.GiveAction();\n page.slots[slot] = null;\n },\n };\n used_slots++;\n } catch (error) {}\n }\n}\n\nnew Page(\"moderation:see\", ViewPlayersFill)\n .setSlots(\n [50],\n new PageItem(MinecraftItemTypes.arrow, {\n nameTag: \"\u00A7fBack\",\n }),\n (ctx) => {\n ctx.PageAction(\"home\");\n }\n )\n .setSlots(\n [48],\n new PageItem(MinecraftItemTypes.barrier, { nameTag: \"\u00A7cClose GUI\" }),\n (ctx) => {\n ctx.CloseAction();\n }\n );\n\nnew Page(\"moderation:see_inventory\", ViewPlayerInventoryFill)\n .setSlots(\n [50],\n new PageItem(MinecraftItemTypes.arrow, {\n nameTag: \"\u00A7fBack\",\n }),\n (ctx) => {\n ctx.PageAction(\"moderation:see\");\n }\n )\n .setSlots(\n [48],\n new PageItem(MinecraftItemTypes.barrier, { nameTag: \"\u00A7cClose GUI\" }),\n (ctx) => {\n ctx.CloseAction();\n }\n );\n\nnew Page(\"moderation:see_ender_chest\", ViewPlayerEnderChestFill)\n .setSlots(\n [50],\n new PageItem(MinecraftItemTypes.arrow, {\n nameTag: \"\u00A7fBack\",\n }),\n (ctx) => {\n ctx.PageAction(\"moderation:see\");\n }\n )\n .setSlots(\n [48],\n new PageItem(MinecraftItemTypes.barrier, { nameTag: \"\u00A7cClose GUI\" }),\n (ctx) => {\n ctx.CloseAction();\n }\n );\n", "import { Player, MinecraftBlockTypes } from \"@minecraft/server\";\nimport { FORBIDDEN_BLOCKS } from \"../../config/moderation\";\nimport { Npc } from \"../models/Npc\";\nimport { getConfigId, getRole } from \"../../utils\";\nimport { Ban } from \"../models/Ban\";\nimport { Protection } from \"../models/Protection\";\n\n/**\n * Entities that are not allowed to spawn because they can be used by CBE\n */\nconst CBE_ENTITIES = [\"minecraft:command_block_minecart\"];\n\nconst protection = new Protection<{\n entityCreate: boolean;\n banSpawnEggs: boolean;\n}>(\n \"cbe\",\n \"Stops CBE\",\n \"textures/blocks/command_block.png\",\n true\n).setConfigDefault({\n entityCreate: {\n description: \"Adds NPC protection\",\n defaultValue: true,\n },\n banSpawnEggs: {\n description: \"If spawn eggs should be banned\",\n defaultValue: true,\n },\n});\n\nprotection.subscribe(\"entityCreate\", ({ entity }) => {\n const config = protection.getConfig();\n if (!config.entityCreate) return;\n const kill = () => {\n try {\n entity.triggerEvent(\"despawn\");\n entity.kill();\n } catch (error) {\n entity.kill();\n }\n };\n if (CBE_ENTITIES.includes(entity.typeId)) return kill();\n if (entity.typeId == \"minecraft:npc\" && !Npc.isValid(entity)) return kill();\n});\n\nprotection.subscribe(\"beforeItemUseOn\", (data) => {\n if (!(data.source instanceof Player)) return;\n if ([\"admin\", \"moderator\"].includes(getRole(data.source))) return;\n const config = protection.getConfig();\n\n if (data.item.typeId.endsWith(\"spawn_egg\")) {\n if (!config.banSpawnEggs) return;\n const block = data.source.dimension.getBlock(data.blockLocation);\n if (block.typeId == MinecraftBlockTypes.mobSpawner.id) return;\n // Cancel use so players cant use spawnEggs on floor\n data.cancel = true;\n data.source.tell(`\u00A7c[Rubedo]: You cannot place spawnEggs on the floor!`);\n data.source.playSound(`note.bass`);\n } else {\n if (FORBIDDEN_BLOCKS.includes(data.item.typeId)) {\n data.cancel = true;\n return;\n }\n const BANNED_BLOCKS = getConfigId(\"banned_blocks\");\n if (!BANNED_BLOCKS.includes(data.item.typeId)) return;\n data.cancel = true;\n new Ban(data.source, null, \"Placing Banned Blocks\");\n }\n});\n", "import { Events, Player, system, world } from \"@minecraft/server\";\r\nimport { TABLES } from \"../../../../database/tables.js\";\r\nimport { EventsReturnType, IProtectionsConfig } from \"../../../../types.js\";\r\nimport { PROTECTIONS } from \"../../protections.js\";\r\nimport { clearForEachValidPlayer, forEachValidPlayer } from \"../../utils.js\";\r\n\r\n/**\r\n * A protection instance\r\n */\r\nexport class Protection {\r\n /**\r\n * Events that this is subscribed to\r\n */\r\n private events: {\r\n -readonly [Key in keyof Events]+?: {\r\n /**\r\n * Callback this event is to run.\r\n */\r\n callback: ReturnType;\r\n /**\r\n * If this has been triggered on world.events\r\n */\r\n triggered: boolean;\r\n };\r\n };\r\n\r\n /**\r\n * List of events that this protection is scheduled\r\n */\r\n private schedules: {\r\n /**\r\n * Callback to run\r\n */\r\n callback: () => void;\r\n /**\r\n * Delay in ticks\r\n */\r\n tickInterval: number;\r\n /**\r\n * If null, this event hasn't been registered by {@link system.runSchedule}\r\n * if {@link number}, the event has been registered and this key can be used to {@link system.clearRunSchedule}\r\n */\r\n runScheduleId: number | null;\r\n }[];\r\n\r\n /**\r\n * A list of forEachValidPlayers keys used to unsubscribe\r\n */\r\n private forEachValidPlayers: {\r\n /**\r\n * Callback to run\r\n * @param player\r\n * @returns\r\n */\r\n callback: (player: Player) => void;\r\n /**\r\n * Delay in ticks\r\n */\r\n delay: number;\r\n /**\r\n * If null, this event hasn't been registered by {@link forEachValidPlayers}\r\n * if {@link number}, the event has been registered and this key can be used to unsubscribe\r\n */\r\n key: number | null;\r\n }[];\r\n\r\n /**\r\n * Callback to run on enable\r\n */\r\n private onEnableCallback: () => void | undefined;\r\n\r\n /**\r\n * Callback to run on disable\r\n */\r\n private onDisableCallback: () => void | undefined;\r\n\r\n /**\r\n * If this protection is enabled\r\n */\r\n private isEnabled: boolean;\r\n\r\n /**\r\n * The default config object\r\n */\r\n configDefault: {\r\n [key: string]: {\r\n description: string;\r\n defaultValue: string | boolean | number;\r\n };\r\n };\r\n\r\n /**\r\n * Creates a new protection module\r\n */\r\n constructor(\r\n public name: string,\r\n public description: string,\r\n public iconPath: string,\r\n public isEnabledByDefault: boolean\r\n ) {\r\n this.name = name;\r\n this.description = description;\r\n this.iconPath = iconPath;\r\n this.configDefault = {};\r\n this.isEnabled = false;\r\n this.isEnabledByDefault = isEnabledByDefault;\r\n // ---- events\r\n this.events = {};\r\n this.schedules = [];\r\n this.forEachValidPlayers = [];\r\n // Save protection\r\n PROTECTIONS[this.name] = this;\r\n }\r\n\r\n /**\r\n * Sets the config to a typed object\r\n * @param data typed object\r\n * @returns\r\n */\r\n setConfigDefault(data: {\r\n [key: string]: {\r\n description: string;\r\n defaultValue: string | boolean | number;\r\n };\r\n }): Protection {\r\n this.configDefault = data;\r\n TABLES.protections.hasSync(this.name).then((v) => {\r\n if (v) return;\r\n let saveData: IProtectionsConfig = {\r\n enabled: true,\r\n };\r\n for (const key of Object.keys(data)) {\r\n saveData[key] = data[key as keyof typeof data].defaultValue;\r\n }\r\n TABLES.protections.set(this.name, saveData);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the config data\r\n * @returns Config\r\n */\r\n getConfig(): Config {\r\n let config = TABLES.protections.get(this.name);\r\n if (!config) config = { enabled: this.isEnabled };\r\n return config as Config;\r\n }\r\n\r\n async setConfig(data: Config) {\r\n return TABLES.protections.set(this.name, data as IProtectionsConfig);\r\n }\r\n\r\n /**\r\n * Triggers a change to a activate this module or not.\r\n * @param enabled if this protection is enabled or not\r\n */\r\n private triggerChange(enabled: boolean) {\r\n if (enabled) {\r\n this.isEnabled = true;\r\n // Enable this protection\r\n this.onEnableCallback?.();\r\n for (const [key, value] of Object.entries(this.events)) {\r\n if (value.triggered) continue;\r\n let callback = world.events[key as keyof Events].subscribe(\r\n // @ts-ignore\r\n value.callback\r\n );\r\n value.triggered = true;\r\n value.callback = callback;\r\n }\r\n for (const v of this.forEachValidPlayers) {\r\n if (v.key) continue;\r\n let key = forEachValidPlayer(v.callback, v.delay);\r\n v.key = key;\r\n }\r\n for (const v of this.schedules) {\r\n if (v.runScheduleId) continue;\r\n let runScheduleId = system.runSchedule(v.callback);\r\n v.runScheduleId = runScheduleId;\r\n }\r\n } else {\r\n this.isEnabled = false;\r\n // Disable this protection\r\n this.onDisableCallback?.();\r\n for (const [key, value] of Object.entries(this.events)) {\r\n if (!value.triggered) continue;\r\n // @ts-ignore\r\n world.events[key as keyof Events].unsubscribe(value.callback);\r\n value.triggered = false;\r\n }\r\n for (const v of this.forEachValidPlayers) {\r\n if (!v.key) continue;\r\n clearForEachValidPlayer(v.key);\r\n v.key = null;\r\n }\r\n for (const v of this.schedules) {\r\n if (!v.runScheduleId) continue;\r\n system.clearRunSchedule(v.runScheduleId);\r\n v.runScheduleId = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Runs a callback once this protection is activated\r\n * @param callback function to run\r\n */\r\n onEnable(callback: () => void): Protection {\r\n this.onEnableCallback = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Runs a callback once this protection is disabled\r\n * @param callback function to run\r\n */\r\n onDisable(callback: () => void): Protection {\r\n this.onDisableCallback = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Subscribes to a worldEvent\r\n * @param id event id to subscribe\r\n * @param callback what to run on event callback\r\n * @returns this\r\n */\r\n subscribe(\r\n id: T,\r\n callback: EventsReturnType\r\n ): Protection {\r\n this.events[id] = {\r\n callback: callback,\r\n triggered: false,\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Schedules a callback to be run every x number of ticks\r\n * @param callback callback\r\n * @param tickInterval ticks\r\n */\r\n runSchedule(callback: () => void, tickInterval?: number): Protection {\r\n this.schedules.push({\r\n callback: callback,\r\n tickInterval: tickInterval,\r\n runScheduleId: null,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Callback for each valid players\r\n * @param callback\r\n * @param delay\r\n */\r\n forEachValidPlayer(\r\n callback: (player: Player) => void,\r\n delay: number = 0\r\n ): Protection {\r\n this.forEachValidPlayers.push({\r\n callback: callback,\r\n delay: delay,\r\n key: null,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Enables this protection\r\n */\r\n enable() {\r\n this.triggerChange(true);\r\n }\r\n\r\n /**\r\n * Disables this protection\r\n */\r\n disable() {\r\n this.triggerChange(false);\r\n }\r\n}\r\n", "import { Ban } from \"../models/Ban.js\";\nimport { Protection } from \"../models/Protection.js\";\n\n/**\n * Minecraft Bedrock Anti Crasher\n * @license MIT\n * @author Smell of curry\n * @version 1.0.0\n * --------------------------------------------------------------------------\n * This anti crasher works by testing if a player has reached a location\n * Horion's crasher teleports the player to 30 Million so we just test for\n * That location and if they are there we kick the player (USES: player.json)\n * --------------------------------------------------------------------------\n */\n\n/**\n * This is the distance where if you go past it will ban you\n */\nconst DISTANCE = 320000;\n\nnew Protection(\n \"crasher\",\n \"Protection against type 1 crasher\",\n \"textures/ui/servers.png\",\n true\n).forEachValidPlayer((player) => {\n if (\n Math.abs(player.location.x) > DISTANCE ||\n Math.abs(player.location.y) > DISTANCE ||\n Math.abs(player.location.z) > DISTANCE\n ) {\n new Ban(player, null, \"Crasher detected\");\n }\n});\n", "import { GameMode, world } from \"@minecraft/server\";\nimport { getRole } from \"../../utils.js\";\nimport { Ban } from \"../models/Ban.js\";\nimport { Protection } from \"../models/Protection.js\";\nimport { PlayerLog } from \"../models/PlayerLog.js\";\nimport { Log } from \"../models/Log.js\";\n\n/**\n * The gamemode that you cannot be in unless you have staff tag\n */\nconst ILLEGAL_GAMEMODE = GameMode.creative;\n\n/**\n * Stores per world load violation data for players\n */\nconst ViolationCount = new PlayerLog();\n\nconst protection = new Protection<{\n clearPlayer: boolean;\n setToSurvival: boolean;\n banPlayer: boolean;\n violationCount: number;\n}>(\n \"gamemode\",\n \"Blocks illegal gamemode\",\n \"textures/ui/creative_icon.png\",\n true\n).setConfigDefault({\n clearPlayer: {\n description: \"Whether to clear players inventory.\",\n defaultValue: true,\n },\n setToSurvival: {\n description: \"If player should be set to survival after being flagged.\",\n defaultValue: true,\n },\n banPlayer: {\n description: \"If player should be banned after violation count is met.\",\n defaultValue: false,\n },\n violationCount: {\n description: \"The amount of violations before ban.\",\n defaultValue: 0,\n },\n});\n\nprotection.runSchedule(() => {\n const config = protection.getConfig();\n for (const player of world.getPlayers({ gameMode: ILLEGAL_GAMEMODE })) {\n if ([\"moderator\", \"admin\", \"builder\"].includes(getRole(player))) continue;\n try {\n if (config.setToSurvival) player.runCommandAsync(`gamemode s`);\n if (config.clearPlayer) player.runCommandAsync(`clear @s`);\n } catch (error) {}\n new Log({\n playerName: player.name,\n protection: \"Gamemode\",\n message: `${player.name} has entered into a illegal gamemode!`,\n });\n const count = (ViolationCount.get(player) ?? 0) + 1;\n ViolationCount.set(player, count);\n if (config.banPlayer && count >= config.violationCount)\n new Ban(player, null, \"Illegal Gamemode\");\n }\n}, 20);\n", "import { Player, world } from \"@minecraft/server\";\n\nexport class PlayerLog {\n data: Map;\n events: Object;\n\n constructor() {\n this.data = new Map();\n this.events = {\n playerLeave: world.events.playerLeave.subscribe((data) =>\n this.data.delete(data.playerName)\n ),\n };\n }\n\n /**\n * Logs a player to a value\n */\n set(player: Player, value: T): void {\n this.data.set(player.name, value);\n }\n\n /**\n * Gets a players value\n */\n get(player: Player): T | undefined {\n return this.data.get(player.name);\n }\n\n /**\n * Deletes a player from log\n */\n delete(player: Player) {\n this.data.delete(player.name);\n }\n\n /**\n * Clears this Player log\n */\n clear() {\n this.data.clear();\n }\n\n /**\n * Gets all the players in the log\n */\n playerNames(): Array {\n return [...this.data.keys()];\n }\n\n /**\n * Checks to see if a player is in this list\n * @param player player to check\n * @returns\n */\n includes(player: Player): boolean {\n return this.playerNames().includes(player.name);\n }\n}\n", "import {\r\n world,\r\n Location,\r\n Block,\r\n BlockPermutation,\r\n Dimension,\r\n Player,\r\n system,\r\n} from \"@minecraft/server\";\r\nimport { API_CONTAINERS } from \"../../plugins/Anti-Cheat/config/moderation\";\r\nimport { CONTAINER_LOCATIONS } from \"../../plugins/Anti-Cheat/modules/managers/containers.js\";\r\n\r\ntype beforeBlockBreakCallback = (arg0: BeforeBlockBreakEvent) => void;\r\n\r\nconst CALLBACKS: {\r\n [key: number]: {\r\n callback: beforeBlockBreakCallback;\r\n };\r\n} = {};\r\n\r\nworld.events.blockBreak.subscribe((data) => {\r\n for (const callback of Object.values(CALLBACKS)) {\r\n callback.callback(\r\n new BeforeBlockBreakEvent(\r\n data.block,\r\n data.brokenBlockPermutation,\r\n data.dimension,\r\n data.player\r\n )\r\n );\r\n }\r\n});\r\n\r\nexport class beforeBlockBreak {\r\n /**\r\n * Subscribes to a callback to get notified when a chat is sent that is not a command\r\n * @param callback what to be called when one of these entities inventory's changes\r\n * @returns the id that is used to unsubscribe\r\n */\r\n static subscribe(callback: beforeBlockBreakCallback): number {\r\n const key = Date.now();\r\n CALLBACKS[key] = { callback: callback };\r\n return key;\r\n }\r\n static unsubscribe(key: number): void {\r\n delete CALLBACKS[key];\r\n }\r\n}\r\n\r\nclass BeforeBlockBreakEvent {\r\n /**\r\n * Contains information regarding an event before a player breaks a block.\r\n * @param block Block broken in this event. Note that because this event fires right after a block is broken, the block you will receive will likely be of type 'minecraft:air'. See the .brokenBlockPermutation property for information on this block before it was broken.\r\n * @param brokenBlockPermutation Returns permutation information about this block before it was broken.\r\n * @param dimension Dimension that contains the block that has been broken in this event.\r\n * @param player Player that broke the block for this event.\r\n */\r\n constructor(\r\n public block: Block,\r\n public brokenBlockPermutation: BlockPermutation,\r\n public dimension: Dimension,\r\n public player: Player\r\n ) {\r\n this.block = block;\r\n this.brokenBlockPermutation = brokenBlockPermutation;\r\n this.dimension = dimension;\r\n this.player = player;\r\n }\r\n\r\n set cancel(value: boolean) {\r\n // setting block back\r\n this.dimension\r\n .getBlock(this.block.location)\r\n .setPermutation(this.brokenBlockPermutation.clone());\r\n // setting chest inventory back\r\n if (API_CONTAINERS.includes(this.brokenBlockPermutation.type.id)) {\r\n const OLD_INVENTORY =\r\n CONTAINER_LOCATIONS[JSON.stringify(this.block.location)];\r\n if (OLD_INVENTORY) {\r\n OLD_INVENTORY.load(this.block.getComponent(\"inventory\").container);\r\n }\r\n }\r\n // killing dropped items\r\n system.run(() => {\r\n [\r\n ...this.dimension.getEntities({\r\n maxDistance: 2,\r\n type: \"minecraft:item\",\r\n location: new Location(\r\n this.block.location.x,\r\n this.block.location.y,\r\n this.block.location.z\r\n ),\r\n }),\r\n ].forEach((e) => e.kill());\r\n })\r\n }\r\n}\r\n", "import { system, world } from \"@minecraft/server\";\r\nimport { API_CONTAINERS, CHECK_SIZE } from \"../../config/moderation\";\r\nimport { IContainerLocation } from \"../../../../types\";\r\nimport { vector3ToBlockLocation } from \"../../../../utils.js\";\r\nimport { BlockInventory } from \"../models/BlockInventory\";\r\n\r\n/**\r\n * storage of all container locations in the world\r\n */\r\nexport let CONTAINER_LOCATIONS: IContainerLocation = {};\r\n\r\nsystem.runSchedule(() => {\r\n CONTAINER_LOCATIONS = {};\r\n for (const player of world.getPlayers()) {\r\n if (player.dimension.id != \"minecraft:overworld\") continue;\r\n const blockLoc = vector3ToBlockLocation(player.location);\r\n const pos1 = blockLoc.offset(CHECK_SIZE.x, CHECK_SIZE.y, CHECK_SIZE.z);\r\n const pos2 = blockLoc.offset(-CHECK_SIZE.x, -CHECK_SIZE.y, -CHECK_SIZE.z);\r\n\r\n for (const location of pos1.blocksBetween(pos2)) {\r\n if (location.y < -64) continue;\r\n const block = player.dimension.getBlock(location);\r\n if (!block) continue;\r\n if (!API_CONTAINERS.includes(block.typeId)) continue;\r\n CONTAINER_LOCATIONS[JSON.stringify(location)] = new BlockInventory(\r\n block.getComponent(\"inventory\").container\r\n );\r\n }\r\n }\r\n}, 100);\r\n", "import { BlockInventoryComponentContainer, ItemStack } from \"@minecraft/server\";\n\nexport class BlockInventory {\n emptySlotsCount: number;\n size: number;\n items: Array;\n /**\n * Coverts a blockInventoryComponentContainer and saves it\n * @param {BlockInventoryComponentContainer} inventory\n */\n constructor(inventory: BlockInventoryComponentContainer) {\n this.emptySlotsCount = inventory.emptySlotsCount;\n this.size = inventory.size;\n this.items = [];\n for (let i = 0; i < this.size; i++) {\n this.items[i] = inventory.getItem(i);\n }\n }\n\n /**\n * Loads this inventory onto a BlockInventoryComponentContainer\n * @param {BlockInventoryComponentContainer} block block to load on\n */\n load(block: BlockInventoryComponentContainer) {\n for (let i = 0; i < block.size; i++) {\n if (!this.items[i]) continue;\n block.setItem(i, this.items[i]);\n }\n }\n}\n", "import { PlayerLog } from \"../models/PlayerLog.js\";\nimport { getRole } from \"../../utils.js\";\nimport { Ban } from \"../models/Ban.js\";\nimport { beforeBlockBreak } from \"../../../../lib/Events/beforeBlockBreak.js\";\nimport { Protection } from \"../models/Protection.js\";\n\n/**\n * The log of the players break times\n */\nconst log = new PlayerLog();\n\n/**\n * if a block is broken faster than this time it is considered hacking\n */\nconst IMPOSSIBLE_BREAK_TIME = 15;\n\n/**\n * When breaking vegetation blocks it could cause a false trigger\n * so when a block gets broken and it has one of the block tags\n * it gets skipped and doesn't count in the nuker event\n *\n * @link https://wiki.bedrock.dev/blocks/block-tags.html\n */\nconst VALID_BLOCK_TAGS = [\n \"snow\",\n \"lush_plants_replaceable\",\n \"azalea_log_replaceable\",\n \"minecraft:crop\",\n \"fertilize_area\",\n];\n\n/**\n * A list of all the blocks that are impossible to break unless you have hacks\n */\nconst IMPOSSIBLE_BREAKS = [\n \"minecraft:water\",\n \"minecraft:flowing_water\",\n \"minecraft:lava\",\n \"minecraft:flowing_lava\",\n \"minecraft:bedrock\",\n];\n\n/**\n * Stores per world load violation data for players\n */\nconst ViolationCount = new PlayerLog();\n\nlet beforeBlockBreakKey: number = null;\n\nconst protection = new Protection<{\n banPlayer: boolean;\n violationCount: number;\n}>(\n \"nuker\",\n \"Blocks block breaking too fast\",\n \"textures/blocks/dirt.png\",\n true\n).setConfigDefault({\n banPlayer: {\n description: \"If the player should be banned once violation count is met\",\n defaultValue: false,\n },\n violationCount: {\n description: \"Violations before ban\",\n defaultValue: 0,\n },\n});\n\nprotection\n .onEnable(() => {\n const config = protection.getConfig();\n beforeBlockBreakKey = beforeBlockBreak.subscribe((data) => {\n if ([\"moderator\", \"admin\"].includes(getRole(data.player))) return;\n if (data.block.getTags().some((tag) => VALID_BLOCK_TAGS.includes(tag)))\n return;\n const old = log.get(data.player);\n log.set(data.player, Date.now());\n if (!old) return;\n\n // If block is impossible to break skip check, reduces lag.\n if (!IMPOSSIBLE_BREAKS.includes(data.block.typeId)) {\n if (old < Date.now() - IMPOSSIBLE_BREAK_TIME) return;\n const count = (ViolationCount.get(data.player) ?? 0) + 1;\n ViolationCount.set(data.player, count);\n if (config.banPlayer && count >= config.violationCount)\n new Ban(data.player, null, \"Using Nuker\");\n }\n\n data.cancel = true;\n });\n })\n .onDisable(() => {\n beforeBlockBreak.unsubscribe(beforeBlockBreakKey);\n });\n", "import { PREFIX } from \"../../../../config/commands\";\r\nimport { getRole } from \"../../utils\";\r\nimport { Mute } from \"../models/Mute\";\r\nimport { PlayerLog } from \"../models/PlayerLog\";\r\nimport { Protection } from \"../models/Protection\";\r\n\r\nconst previousMessage = new PlayerLog();\r\n\r\n/**\r\n * Stores per world load violation data for players\r\n */\r\nconst ViolationCount = new PlayerLog();\r\n\r\nconst protection = new Protection<{\r\n permMutePlayer: boolean;\r\n violationCount: number;\r\n repeatedMessages: boolean;\r\n zalgo: boolean;\r\n}>(\r\n \"spam\",\r\n \"Blocks spam in chat\",\r\n \"textures/ui/mute_on.png\",\r\n true\r\n).setConfigDefault({\r\n permMutePlayer: {\r\n description:\r\n \"If player should be permanently muted once violation count is met.\",\r\n defaultValue: false,\r\n },\r\n violationCount: {\r\n description: \"Violation count before permanent mute\",\r\n defaultValue: 0,\r\n },\r\n repeatedMessages: {\r\n description: \"Blocks repeated messages\",\r\n defaultValue: true,\r\n },\r\n zalgo: {\r\n description: \"Blocks zalgo\",\r\n defaultValue: true,\r\n },\r\n});\r\n\r\nprotection.subscribe(\"beforeChat\", (data) => {\r\n try {\r\n if (data.message.startsWith(PREFIX)) return;\r\n if ([\"admin\", \"moderator\"].includes(getRole(data.sender))) return;\r\n const config = protection.getConfig();\r\n const isSpam = () => {\r\n const count = (ViolationCount.get(data.sender) ?? 0) + 1;\r\n ViolationCount.set(data.sender, count);\r\n if (config.permMutePlayer && count >= config.violationCount)\r\n new Mute(data.sender, null, \"Spamming\");\r\n };\r\n if (\r\n config.repeatedMessages &&\r\n previousMessage.get(data.sender) == data.message\r\n ) {\r\n data.cancel = true;\r\n isSpam();\r\n return data.sender.tell(`\u00A7cRepeated message detected!`);\r\n }\r\n if (config.zalgo && /%CC%/g.test(encodeURIComponent(data.message))) {\r\n data.cancel = true;\r\n isSpam();\r\n return data.sender.tell(\r\n `\u00A7cYou message contains some type of zalgo and cannot be sent!`\r\n );\r\n }\r\n previousMessage.set(data.sender, data.message);\r\n } catch (error) {\r\n console.warn(error + error.stack);\r\n }\r\n});\r\n", "import { Player } from \"@minecraft/server\";\r\nimport { FORBIDDEN_ITEMS } from \"../../config/moderation.js\";\r\nimport { AIR } from \"../../../../index.js\";\r\nimport { getConfigId, getMaxEnchantmentLevel } from \"../../utils\";\r\nimport { Ban } from \"../models/Ban.js\";\r\nimport { Log } from \"../models/Log.js\";\r\nimport { PlayerLog } from \"../models/PlayerLog.js\";\r\nimport { Protection } from \"../models/Protection.js\";\r\n\r\n/**\r\n * Stores violation count for player\r\n */\r\nconst ViolationCount = new PlayerLog();\r\n\r\n/**\r\n * Flags a player for a item they should not have\r\n * @param player player to flag\r\n * @param index the index of this item in the players inventory\r\n */\r\nfunction flag(player: Player, index: number) {\r\n const inventory = player.getComponent(\"inventory\").container;\r\n const item = inventory.getItem(index);\r\n const data = getConfigId(\"cbe_config\");\r\n // Clear Item\r\n if (data.clearItem) inventory.setItem(index, AIR);\r\n // Log action\r\n new Log({\r\n playerName: player.name,\r\n message: `${player.name} Has obtained a unobtainable item: ${item.typeId}`,\r\n protection: \"unobtainable\",\r\n });\r\n // Violation\r\n if (!data.banPlayer) return;\r\n const violations = (ViolationCount.get(player) ?? 0) + 1;\r\n ViolationCount.set(player, violations);\r\n if (violations < data.violationCount) return;\r\n new Ban(player, null, \"Possession of Unobtainable item\");\r\n}\r\n\r\nnew Protection(\r\n \"unobtainable\",\r\n \"Blocks unobtainable items\",\r\n \"textures/blocks/end_portal.png\",\r\n true\r\n).forEachValidPlayer((player) => {\r\n console.warn(`unobtainable`);\r\n const BANNED_ITEMS = getConfigId(\"banned_items\");\r\n\r\n const inventory = player.getComponent(\"inventory\").container;\r\n for (let i = 0; i < inventory.size; i++) {\r\n const item = inventory.getItem(i);\r\n if (!item) continue;\r\n if (BANNED_ITEMS.includes(item.typeId)) return flag(player, i);\r\n if (FORBIDDEN_ITEMS.includes(item.typeId)) {\r\n // Log action\r\n new Log({\r\n playerName: player.name,\r\n message: `${player.name} Has obtained a Forbidden item: ${item.typeId}`,\r\n protection: \"unobtainable\",\r\n });\r\n return inventory.setItem(i, AIR);\r\n }\r\n // Player is allowed to have this itemType\r\n /**\r\n * List of all enchantments that are valid on this item\r\n */\r\n let enchantments: string[] = [];\r\n for (const enchantment of item.getComponent(\"enchantments\").enchantments) {\r\n const MAX_LEVEL = getMaxEnchantmentLevel(enchantment);\r\n if (enchantment.level > MAX_LEVEL) return flag(player, i);\r\n if (enchantment.level < 1) return flag(player, i);\r\n if (enchantments.includes(enchantment.type.id)) return flag(player, i);\r\n // Enchantment Is valid\r\n enchantments.push(enchantment.type.id);\r\n }\r\n }\r\n});\r\n", "import {\r\n MinecraftBlockTypes,\r\n MinecraftEntityTypes,\r\n MinecraftItemTypes,\r\n Player,\r\n} from \"@minecraft/server\";\r\nimport { AIR } from \"../../../../index.js\";\r\nimport { getGamemode } from \"../../utils.js\";\r\nimport { Protection } from \"../models/Protection.js\";\r\n\r\n/**\r\n * List of blocks to test\r\n */\r\nconst BLOCKS = [\r\n MinecraftBlockTypes.chest.id,\r\n MinecraftBlockTypes.trappedChest.id,\r\n MinecraftBlockTypes.barrel.id,\r\n MinecraftBlockTypes.dispenser.id,\r\n MinecraftBlockTypes.dropper.id,\r\n MinecraftBlockTypes.furnace.id,\r\n MinecraftBlockTypes.litFurnace.id,\r\n MinecraftBlockTypes.blastFurnace.id,\r\n MinecraftBlockTypes.litBlastFurnace.id,\r\n MinecraftBlockTypes.smoker.id,\r\n MinecraftBlockTypes.litSmoker.id,\r\n MinecraftBlockTypes.hopper.id,\r\n MinecraftBlockTypes.beehive.id,\r\n MinecraftBlockTypes.beeNest.id,\r\n MinecraftBlockTypes.mobSpawner.id,\r\n];\r\n\r\n/**\r\n * List of items to test\r\n */\r\nconst CHEST_BOATS = [\r\n MinecraftItemTypes.chestBoat.id,\r\n MinecraftItemTypes.oakChestBoat.id,\r\n MinecraftItemTypes.birchChestBoat.id,\r\n MinecraftItemTypes.acaciaChestBoat.id,\r\n MinecraftItemTypes.jungleChestBoat.id,\r\n MinecraftItemTypes.spruceChestBoat.id,\r\n MinecraftItemTypes.darkOakChestBoat.id,\r\n MinecraftItemTypes.mangroveChestBoat.id,\r\n];\r\n\r\nnew Protection(\r\n \"nbt\",\r\n \"Blocks illegal nbt on items\",\r\n \"textures/ui/icon_random.png\",\r\n true\r\n)\r\n .subscribe(\"blockPlace\", async ({ block }) => {\r\n if (!BLOCKS.includes(block.typeId)) return;\r\n const permutation = block.permutation;\r\n await block.dimension.runCommandAsync(\r\n `setblock ${block.x} ${block.y} ${block.z} ${block.typeId}`\r\n );\r\n block.setPermutation(permutation);\r\n })\r\n .subscribe(\"beforeItemUseOn\", (data) => {\r\n if (!(data.source instanceof Player)) return;\r\n if (!CHEST_BOATS.includes(data.item.typeId)) return;\r\n data.cancel = true;\r\n data.source.dimension.spawnEntity(\r\n MinecraftEntityTypes.chestBoat.id,\r\n data.blockLocation.above()\r\n );\r\n if (getGamemode(data.source) == \"creative\") return;\r\n data.source\r\n .getComponent(\"inventory\")\r\n .container.setItem(data.source.selectedSlot, AIR);\r\n });\r\n", "import {\r\n MinecraftEffectTypes,\r\n MinecraftItemTypes,\r\n Player,\r\n Vector3,\r\n} from \"@minecraft/server\";\r\nimport {\r\n ILocationLog,\r\n onPlayerMove,\r\n} from \"../../../../lib/Events/onPlayerMove\";\r\nimport {\r\n ANTI_TP_DISTANCE_THRESHOLD,\r\n MOVEMENT_CONSTANTS,\r\n MOVEMENT_DISTANCE_THRESHOLD,\r\n SPEED_EFFECT_INCREASE,\r\n TAGS,\r\n} from \"../../config/movement\";\r\nimport { getRole } from \"../../utils\";\r\nimport { PlayerLog } from \"../models/PlayerLog\";\r\nimport { Protection } from \"../models/Protection\";\r\n\r\nconst violations = new PlayerLog();\r\n\r\n/**\r\n * Calculates the distance from loc1 to loc2\r\n * @param {Location} loc1 location 1\r\n * @param {Location} loc2 location 2\r\n * @returns {number}\r\n */\r\nfunction distanceBetween(loc1: Vector3, loc2: Vector3): number {\r\n return Math.hypot(loc2.x - loc1.x, loc2.z - loc1.z);\r\n}\r\n\r\n/**\r\n * Gets the speed offset based on a players SpeedEffect\r\n * @param player player to get\r\n */\r\nfunction getSpeedOffset(player: Player): number {\r\n const speed = player.getEffect(MinecraftEffectTypes.speed)?.amplifier ?? 0;\r\n return speed * SPEED_EFFECT_INCREASE;\r\n}\r\n\r\n/**\r\n * Checks if a distance traveled is big enough to be flagged\r\n * @param distance distance the player has traveled\r\n * @returns if this distance is bad\r\n */\r\nfunction isDistanceFlag(distance: number, player: Player): boolean {\r\n const speedIntensity = getSpeedOffset(player);\r\n const offset = MOVEMENT_CONSTANTS.run.distance + MOVEMENT_DISTANCE_THRESHOLD;\r\n return distance > speedIntensity + offset;\r\n}\r\n\r\nfunction flag(player: Player, old: ILocationLog) {\r\n const violationCount = (violations.get(player) ?? 0) + 1;\r\n violations.set(player, violationCount);\r\n onPlayerMove.delete(player); // Reset Players old location\r\n if (violationCount < 3) return;\r\n player.teleport(\r\n old.location,\r\n old.dimension,\r\n player.rotation.x,\r\n player.rotation.y\r\n );\r\n}\r\n\r\n/**\r\n * The key used to unsubscribe from this event\r\n */\r\nlet onPlayerMoveSubKey: number = null;\r\n\r\nconst protection = new Protection<{\r\n tpCheck: boolean;\r\n}>(\r\n \"movement\",\r\n \"Blocks illegal movements on players\",\r\n \"textures/ui/move.png\",\r\n true\r\n).setConfigDefault({\r\n tpCheck: {\r\n description: \"If teleports should be flagged\",\r\n defaultValue: true,\r\n },\r\n});\r\n\r\nprotection\r\n .onEnable(() => {\r\n const config = protection.getConfig();\r\n onPlayerMoveSubKey = onPlayerMove.subscribe((player, old) => {\r\n if (getRole(player) == \"admin\") return;\r\n if (player.dimension.id != old.dimension.id) return;\r\n if (player.getTags().some((tag) => TAGS.includes(tag))) return;\r\n const distance = distanceBetween(player.location, old.location);\r\n if (player.hasTag(`skip-movement-check`))\r\n return player.removeTag(`skip-movement-check`);\r\n if (distance > ANTI_TP_DISTANCE_THRESHOLD) {\r\n if (!config.tpCheck) return;\r\n // Anti Tp.\r\n flag(player, old);\r\n } else {\r\n // Anti speed/jet pack\r\n if (!isDistanceFlag(distance, player)) return;\r\n // Flagged\r\n flag(player, old);\r\n }\r\n });\r\n })\r\n .onDisable(() => {\r\n onPlayerMove.unsubscribe(onPlayerMoveSubKey);\r\n });\r\n\r\nprotection.subscribe(\"dataDrivenEntityTriggerEvent\", (data) => {\r\n if (!(data.entity instanceof Player)) return;\r\n if (data.id != \"on_death\") return;\r\n onPlayerMove.delete(data.entity); // Reset Players old location\r\n});\r\n\r\nprotection.subscribe(\"projectileHit\", ({ projectile, source }) => {\r\n if (projectile.typeId != MinecraftItemTypes.enderPearl.id) return;\r\n if (!(source instanceof Player)) return;\r\n onPlayerMove.delete(source); // Reset Players old location\r\n});\r\n\r\nprotection.subscribe(\"itemCompleteCharge\", ({ itemStack, source }) => {\r\n if (itemStack.typeId != MinecraftItemTypes.chorusFruit.id) return;\r\n if (!(source instanceof Player)) return;\r\n onPlayerMove.delete(source); // Reset Players old location\r\n});\r\n", "import { Dimension, Player, system, Vector3, world } from \"@minecraft/server\";\r\nimport { PlayerLog } from \"../../plugins/Anti-Cheat/modules/models/PlayerLog\";\r\n\r\ntype onPlayerMoveCallback = (player: Player, data: ILocationLog) => void;\r\n\r\nconst CALLBACKS: {\r\n [key: number]: {\r\n callback: onPlayerMoveCallback;\r\n };\r\n} = {};\r\n\r\nexport interface ILocationLog {\r\n /**\r\n * The Location this is\r\n */\r\n location: Vector3;\r\n /**\r\n * The dimension this location was in\r\n */\r\n dimension: Dimension;\r\n}\r\n\r\n/**\r\n * Checks if two vectors are the same\r\n * @param from first vector\r\n * @param to second vector\r\n */\r\nfunction vector3Equals(from: Vector3, to: Vector3): boolean {\r\n if (from.x != to.x) return false;\r\n if (from.y != to.y) return false;\r\n if (from.z != to.z) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Stores Last Previous grounded location\r\n */\r\nexport const playerLocation = new PlayerLog();\r\n\r\nsystem.runSchedule(() => {\r\n const sendCallback = (player: Player, data: ILocationLog) => {\r\n for (const callback of Object.values(CALLBACKS)) {\r\n callback.callback(player, data);\r\n }\r\n };\r\n for (const player of world.getPlayers()) {\r\n const oldLocation = playerLocation.get(player);\r\n if (oldLocation) {\r\n if (vector3Equals(player.location, oldLocation.location)) {\r\n continue;\r\n }\r\n }\r\n playerLocation.set(player, {\r\n location: player.location,\r\n dimension: player.dimension,\r\n });\r\n if (!oldLocation) continue;\r\n sendCallback(player, oldLocation);\r\n }\r\n});\r\n\r\nexport class onPlayerMove {\r\n /**\r\n * Subscribes to a callback to get notified when a player moves\r\n * @param callback what to be called when one of these entity's inventory changes\r\n * @returns the id that is used to unsubscribe\r\n */\r\n static subscribe(callback: onPlayerMoveCallback): number {\r\n const key = Date.now();\r\n CALLBACKS[key] = { callback: callback };\r\n return key;\r\n }\r\n static unsubscribe(key: number): void {\r\n delete CALLBACKS[key];\r\n }\r\n /**\r\n * Clears a players location\r\n * @param player player to clear\r\n */\r\n static delete(player: Player): void {\r\n playerLocation.delete(player);\r\n }\r\n}\r\n", "/**\r\n * The leeway that the distances can be off before it flags\r\n */\r\nexport const MOVEMENT_DISTANCE_THRESHOLD = 0.80;\r\n\r\n/**\r\n * Constant of speeds when players are moving\r\n */\r\nexport const MOVEMENT_CONSTANTS = {\r\n walk: {\r\n velocity: 0.17 as const,\r\n distance: 0.23 as const,\r\n },\r\n run: {\r\n velocity: 0.19 as const,\r\n distance: 0.35 as const,\r\n },\r\n};\r\n\r\n/**\r\n * The distance increase per speed effect increase\r\n */\r\nexport const SPEED_EFFECT_INCREASE = 0.056;\r\n\r\n/**\r\n * if the distance is over this amount the system will automatically flag tp\r\n */\r\nexport const ANTI_TP_DISTANCE_THRESHOLD = 10;\r\n\r\n/**\r\n * If your \r\n */\r\nexport const TAGS = [\"gliding\", \"riding\"];\r\n", "import { MinecraftEffectTypes, Player, world } from \"@minecraft/server\";\r\nimport { getServerOwnerName, setRole, setServerOwner } from \"../../utils\";\r\n\r\nlet e = world.events.beforeDataDrivenEntityTriggerEvent.subscribe((data) => {\r\n if (!(data.entity instanceof Player)) return;\r\n if (data.id != \"rubedo:becomeAdmin\") return;\r\n // Rubedo is now verified to be at the top\r\n data.entity.removeTag(\"CHECK_PACK\");\r\n const serverOwnerName = getServerOwnerName();\r\n if (serverOwnerName) {\r\n data.entity.playSound(\"note.bass\");\r\n data.entity.tell(\r\n `\u00A7cFailed to give server owner: \"${serverOwnerName}\" is already owner!`\r\n );\r\n return world.events.beforeDataDrivenEntityTriggerEvent.unsubscribe(e);\r\n }\r\n setRole(data.entity, \"admin\");\r\n setServerOwner(data.entity);\r\n data.entity.addEffect(MinecraftEffectTypes.blindness, 3, 255, true);\r\n data.entity.tell(\r\n `\u00A7aYou have now been set as the \"owner\" of this server. The command \"/function start\" will not do anything anymore, type \"-help\" for more information!`\r\n );\r\n});\r\n", "import {\r\n DynamicPropertiesDefinition,\r\n MinecraftEntityTypes,\r\n world,\r\n} from \"@minecraft/server\";\r\nimport { OBJECTIVES } from \"../../../../config/objectives\";\r\n\r\nworld.events.worldInitialize.subscribe(({ propertyRegistry }) => {\r\n let def2 = new DynamicPropertiesDefinition();\r\n def2.defineString(\"role\", 30);\r\n propertyRegistry.registerEntityTypeDynamicProperties(\r\n def2,\r\n MinecraftEntityTypes.player\r\n );\r\n\r\n let def3 = new DynamicPropertiesDefinition();\r\n def3.defineString(\"worldsOwner\", 100);\r\n def3.defineBoolean(\"isLockDown\");\r\n propertyRegistry.registerWorldDynamicProperties(def3);\r\n\r\n for (const obj of OBJECTIVES) {\r\n world.scoreboard.addObjective(obj.objective, obj.displayName ?? \"\");\r\n }\r\n});\r\n", "/*\n|--------------------------------------------------------------------------\n| Objectives\n|--------------------------------------------------------------------------\n|\n| This is a list of all objectives this pack uses\n| please add any objective to this list so it can be added at world creation\n| make sure to add them before sending pack to others and new worlds.\n|\n*/\ninterface IObjective {\n objective: string;\n displayName?: string;\n}\n\nexport const OBJECTIVES: Array = [];\n", "import { Location } from \"@minecraft/server\";\r\nimport \"./protections\";\r\nimport \"./modules/commands/import\";\r\nimport \"./modules/managers/import\";\r\nimport \"./modules/pages/import\";\r\nimport \"./modules/protections/import\";\r\nimport \"./modules/events/import\";\r\n\r\n/**\r\n * Stores npc locations that are verified to allow NPC's to spawn in\r\n */\r\nexport let NPC_LOCATIONS: Array = [];\r\n\r\nexport function clearNpcLocations() {\r\n NPC_LOCATIONS = [];\r\n}\r\n", "console.warn(`----- Importing Plugins -----`);\r\n\r\nimport \"./Anti-Cheat/index\";\r\n//import \"./ChatRanks/index\";\r\n//import \"./GlobalBans/index\";\r\n", "import {\r\n DynamicPropertiesDefinition,\r\n EntityTypes,\r\n world,\r\n} from \"@minecraft/server\";\r\nimport { ENTITY_IDENTIFIER, ENTITY_LOCATION } from \"../config/database\";\r\nimport { DIMENSIONS } from \"../utils.js\";\r\n\r\nworld.events.worldInitialize.subscribe(({ propertyRegistry }) => {\r\n /**\r\n * Loads Ticking Area\r\n */\r\n DIMENSIONS.overworld.runCommandAsync(\r\n `tickingarea add ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} db true`\r\n );\r\n\r\n let def = new DynamicPropertiesDefinition();\r\n def.defineString(\"tableName\", 30);\r\n def.defineNumber(\"index\");\r\n propertyRegistry.registerEntityTypeDynamicProperties(\r\n def,\r\n EntityTypes.get(ENTITY_IDENTIFIER)\r\n );\r\n});\r\n"], - "mappings": "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", - "names": ["ItemStack", "MinecraftItemTypes", "system", "world", "PREFIX", "world", "ItemStack", "MinecraftItemTypes", "BlockLocation", "MAX_DATABASE_STRING_SIZE", "ENTITY_IDENTIFIER", "ENTITY_LOCATION", "INVENTORY_SIZE", "system", "world", "BlockLocation", "MinecraftDimensionTypes", "system", "world", "MessageFormData", "MessageForm", "title", "body", "MessageFormData", "text", "callback", "player", "response", "DIMENSIONS", "world", "MinecraftDimensionTypes", "durationToMs", "duration", "values", "ms", "value", "length", "unit", "msToTime", "vector3ToBlockLocation", "loc", "BlockLocation", "confirmAction", "player", "action", "onConfirm", "onCancel", "MessageForm", "sleep", "tick", "resolve", "runScheduleId", "system", "LocationEquals", "a", "b", "aLocations", "bLocations", "v", "sort3DVectors", "vector1", "vector2", "x1", "y1", "z1", "x2", "y2", "z2", "ox1", "oy1", "oz1", "ox2", "oy2", "oz2", "betweenVector3", "target", "x", "y", "z", "chunkString", "str", "CALLBACKS", "ENTITIES_LOADED", "system", "DIMENSIONS", "i", "callback", "world", "data", "EntitiesLoad", "resolve", "key", "Database", "tableName", "EntitiesLoad", "v", "index", "entity", "DIMENSIONS", "ENTITY_IDENTIFIER", "ENTITY_LOCATION", "e", "resolve", "entities", "chunks", "chunkString", "MAX_DATABASE_STRING_SIZE", "entitiesNeeded", "INVENTORY_SIZE", "i", "inventory", "chunk", "item", "ItemStack", "MinecraftItemTypes", "a", "b", "stringifiedData", "data", "key", "value", "status", "TABLES", "Database", "fetch", "playerName", "world", "player", "LiteralArgumentType", "name", "value", "StringArgumentType", "IntegerArgumentType", "FloatArgumentType", "LocationArgumentType", "BooleanArgumentType", "PlayerArgumentType", "fetch", "TargetArgumentType", "ArrayArgumentType", "types", "DurationArgumentType", "PlayerNameArgumentType", "TABLES", "ArgumentTypes", "CommandCallback", "data", "text", "getChatAugments", "message", "prefix", "e", "commandNotFound", "player", "command", "noPerm", "commandSyntaxFail", "baseCommand", "args", "i", "PREFIX", "types", "c", "LiteralArgumentType", "parseLocationArgs", "x", "y", "z", "location", "viewVector", "locations", "viewVectors", "a", "arg", "r", "b", "index", "sendCallback", "cmdArgs", "event", "lastArg", "argsToReturn", "LocationArgumentType", "CommandCallback", "COMMANDS", "world", "data", "PREFIX", "args", "getChatAugments", "command", "event", "commandNotFound", "noPerm", "verifiedCommands", "getArg", "start", "i", "arg", "v", "commandSyntaxFail", "sendCallback", "system", "world", "GUI_ITEM", "ENTITY_INVENTORY", "world", "Player", "BlockLocation", "MinecraftBlockTypes", "GameMode", "system", "BlockLocation", "MinecraftBlockTypes", "DEFAULT_REGION_PERMISSIONS", "DOORS_SWITCHES", "BLOCK_CONTAINERS", "REGIONS", "REGIONS_HAVE_BEEN_GRABBED", "LOWEST_Y_VALUE", "HIGHEST_Y_VALUE", "Region", "regions", "TABLES", "region", "r", "blockLocation", "dimensionId", "betweenVector3", "from", "to", "permissions", "key", "DEFAULT_REGION_PERMISSIONS", "loadRegionDenys", "loc1", "BlockLocation", "loc2", "DIMENSIONS", "MinecraftBlockTypes", "entity", "value", "ChangePlayerRoleTask", "TABLES", "playerName", "t", "role", "tasks", "MinecraftBlockTypes", "MinecraftItemTypes", "FORBIDDEN_ITEMS", "BANNED_ITEMS", "FORBIDDEN_BLOCKS", "BANNED_BLOCKS", "API_CONTAINERS", "CONTAINERS", "CHECK_SIZE", "ENCHANTMENTS", "VERSION", "APPEAL_LINK", "kick", "player", "message", "onFail", "isServerOwner", "error", "getRole", "Player", "TABLES", "setRole", "value", "inGamePlayer", "world", "p", "ChangePlayerRoleTask", "getServerOwner", "id", "getServerOwnerName", "ownerId", "ids", "key", "setServerOwner", "isLockedDown", "setLockDown", "val", "loadRegionDenys", "region", "Region", "loc1", "BlockLocation", "loc2", "blockLocation", "DIMENSIONS", "MinecraftBlockTypes", "CALLBACKS", "forEachValidPlayerCalls", "forEachValidPlayer", "callback", "delay", "clearForEachValidPlayer", "EntitiesLoad", "system", "players", "i", "CALLBACK", "getConfigId", "BANNED_ITEMS", "BANNED_BLOCKS", "ENCHANTMENTS", "APPEAL_LINK", "setConfigId", "getMaxEnchantmentLevel", "enchantment", "getGamemode", "GameMode", "g", "system", "system", "CALLBACKS", "MAPPED_INVENTORIES", "PREVIOUS_CHANGE", "getSlotChanges", "entity", "oldInv", "newInv", "changes", "i", "change_data", "getItemUid", "item", "data", "mapInventory", "container", "inventory", "system", "callback", "DIMENSIONS", "change", "onEntityInventorySlotChange", "entities", "key", "Location", "CHESTGUIS", "PAGES", "getHeldItem", "player", "clearPlayersPointer", "ItemToClear", "inventory", "itemsToLoad", "i", "item", "e", "getItemAtSlot", "entity", "slot", "ItemGrabbedCallback", "gui", "slot", "change", "text", "item", "db", "page", "extras", "form", "sleep", "ChestGUI", "player", "ENTITY_INVENTORY", "system", "onEntityInventorySlotChange", "entity", "change", "pageId", "extras", "c", "AIR", "PAGES", "page", "slot", "clearPlayersPointer", "getItemAtSlot", "ItemGrabbedCallback", "CHESTGUIS", "ItemStack", "PageItem", "itemType", "components", "itemStack", "enchantments", "enchantment", "DefaultFill", "entity", "page", "extras", "container", "i", "slot", "AIR", "Page", "id", "fillType", "DefaultFill", "PAGES", "slot", "item", "action", "data", "MinecraftItemTypes", "HOME_PAGE", "Page", "PageItem", "ctx", "EntitiesLoad", "system", "player", "world", "getHeldItem", "GUI_ITEM", "CHESTGUIS", "getRole", "ChestGUI", "validIds", "c", "entity", "DIMENSIONS", "ENTITY_INVENTORY", "system", "PROTECTIONS", "EntitiesLoad", "system", "protection", "text", "a", "b", "playerName", "duration", "reason", "name", "expire", "Command", "data", "type", "depth", "parent", "player", "LiteralArgumentType", "COMMANDS", "cmd", "name", "StringArgumentType", "IntegerArgumentType", "types", "ArrayArgumentType", "BooleanArgumentType", "LocationArgumentType", "callback", "Player", "setBan", "player", "id", "duration", "reason", "by", "data", "Player", "durationToMs", "TABLES", "Ban", "ban", "ctx", "player", "duration", "reason", "by", "TABLES", "confirmAction", "Ban", "text", "root", "Command", "getRole", "ArgumentTypes", "playerName", "banData", "bans", "msToTime", "root", "Command", "player", "getRole", "ctx", "table", "key", "data", "TABLES", "error", "value", "keys", "values", "Command", "player", "getRole", "ArgumentTypes", "ctx", "i", "Freeze", "player", "reason", "data", "TABLES", "root", "Command", "player", "getRole", "ArgumentTypes", "ctx", "reason", "Freeze", "playerName", "freeze", "TABLES", "freezes", "text", "CommandNameArgumentType", "name", "value", "COMMANDS", "c", "sendCommandType", "baseCommand", "args", "player", "PREFIX", "a", "sendArguments", "bc", "p", "child", "sendPageHeader", "maxPages", "getCommands", "getMaxPages", "commands", "root", "Command", "ctx", "cmd", "command", "world", "Command", "player", "getRole", "ctx", "isLockedDown", "setLockDown", "confirmAction", "text", "world", "kick", "Mute", "player", "TABLES", "duration", "reason", "by", "msLength", "durationToMs", "data", "root", "Command", "player", "getRole", "ArgumentTypes", "ctx", "duration", "reason", "Mute", "playerName", "mute", "TABLES", "mutes", "text", "msToTime", "Location", "Npc", "entity", "NPC_LOCATIONS", "l", "LocationEquals", "TABLES", "key", "location", "dimension", "data", "clearNpcLocations", "Command", "player", "getRole", "ctx", "x", "y", "z", "Npc", "Location", "system", "getServerTPS", "startTime", "ticks", "resolve", "s", "Command", "ctx", "BlockLocation", "command", "Command", "player", "getRole", "ctx", "from_x", "from_z", "to_x", "to_z", "Region", "loc", "BlockLocation", "r", "regions", "region", "permission", "key", "value", "entityCommands", "entity", "currentAllowedEntities", "v", "ROLES", "StringIsNumber", "value", "ToArray", "enumme", "key", "root", "Command", "player", "getRole", "isServerOwner", "ArgumentTypes", "ROLES", "ctx", "playerName", "role", "setRole", "ownerRoot", "ownerId", "getServerOwner", "ids", "TABLES", "ownerName", "confirmAction", "setServerOwner", "ActionFormData", "ActionForm", "title", "body", "ActionFormData", "text", "iconPath", "callback", "player", "response", "ModalFormData", "FormCallback", "form", "player", "callback", "message", "MessageForm", "ModalForm", "title", "ModalFormData", "label", "options", "defaultValueIndex", "minimumValue", "maximumValue", "valueStep", "defaultValue", "placeholderText", "player", "callback", "i", "response", "FormCallback", "v", "manageBannedItemsForm", "player", "ActionForm", "removeBannedItemForm", "addBannedItemForm", "ModalForm", "getConfigId", "ctx", "item", "items", "p", "setConfigId", "manageBannedBlocksForm", "removeBannedBlockForm", "addBannedBlockForm", "block", "blocks", "manageEnchantmentLevelsForm", "ENCHANTMENTS", "enchantment", "levelString", "level", "enchants", "manageAppealLinkForm", "APPEAL_LINK", "link", "showAutoModHomeForm", "player", "form", "ActionForm", "protection", "PROTECTIONS", "showProtectionConfig", "showHomeForm", "data", "ModalForm", "keys", "key", "value", "ctx", "enabled", "config", "i", "showHomeForm", "player", "ActionForm", "showAutoModHomeForm", "manageBannedItemsForm", "manageBannedBlocksForm", "manageEnchantmentLevelsForm", "manageAppealLinkForm", "Command", "player", "getRole", "ctx", "showHomeForm", "world", "vanish", "player", "say", "world", "Command", "getRole", "ctx", "Command", "ctx", "VERSION", "Command", "player", "getRole", "ArgumentTypes", "ctx", "reason", "kick", "Log", "data", "TABLES", "timeDifference", "previous", "msPerMinute", "msPerHour", "msPerDay", "msPerMonth", "msPerYear", "elapsed", "root", "Command", "player", "getRole", "ctx", "message", "Log", "page", "order", "allLogs", "TABLES", "a", "b", "maxPages", "PREFIX", "key", "value", "ArgumentTypes", "playerName", "v", "protection", "root", "Command", "player", "getRole", "ArgumentTypes", "ctx", "destination", "forEachValidPlayer", "player", "banData", "TABLES", "kick", "msToTime", "getConfigId", "error", "Location", "forEachValidPlayer", "player", "freezeData", "TABLES", "Location", "DIMENSIONS", "world", "CALLBACKS", "world", "data", "PREFIX", "callback", "beforeChat", "key", "beforeChat", "data", "muteData", "Mute", "TABLES", "text", "BlockLocation", "system", "world", "system", "loadRegionDenys", "world", "data", "getRole", "region", "Region", "block", "DOORS_SWITCHES", "BLOCK_CONTAINERS", "i", "bL", "entity", "BlockLocation", "EntitiesLoad", "DIMENSIONS", "forEachValidPlayer", "player", "world", "world", "player", "EntitiesLoad", "isLockedDown", "getRole", "kick", "text", "Mute", "TABLES", "roleToSet", "ChangePlayerRoleTask", "setRole", "Items", "MinecraftItemTypes", "world", "FILLABLE_SLOTS", "FILLABLE_SLOTS_ENDERCHEST", "ViewPlayersFill", "entity", "page", "extras", "container", "i", "slot", "AIR", "player", "world", "item", "PageItem", "MinecraftItemTypes", "ctx", "ViewPlayerInventoryFill", "EnderChestItem", "p", "CHESTGUIS", "e", "inventory", "used_slots", "Items", "ViewPlayerEnderChestFill", "ItemTypes", "ChestGuiItem", "Page", "Player", "MinecraftBlockTypes", "system", "world", "Protection", "name", "description", "iconPath", "isEnabledByDefault", "PROTECTIONS", "data", "TABLES", "v", "saveData", "key", "config", "enabled", "value", "callback", "world", "forEachValidPlayer", "runScheduleId", "system", "clearForEachValidPlayer", "id", "tickInterval", "delay", "CBE_ENTITIES", "protection", "Protection", "entity", "kill", "Npc", "data", "Player", "getRole", "config", "MinecraftBlockTypes", "FORBIDDEN_BLOCKS", "getConfigId", "Ban", "DISTANCE", "Protection", "player", "Ban", "GameMode", "world", "world", "PlayerLog", "data", "player", "value", "ILLEGAL_GAMEMODE", "GameMode", "ViolationCount", "PlayerLog", "protection", "Protection", "config", "player", "world", "getRole", "Log", "count", "Ban", "world", "Location", "system", "system", "world", "BlockInventory", "inventory", "i", "block", "CONTAINER_LOCATIONS", "system", "player", "world", "blockLoc", "vector3ToBlockLocation", "pos1", "CHECK_SIZE", "pos2", "location", "block", "API_CONTAINERS", "BlockInventory", "CALLBACKS", "world", "data", "callback", "BeforeBlockBreakEvent", "beforeBlockBreak", "key", "block", "brokenBlockPermutation", "dimension", "player", "value", "API_CONTAINERS", "OLD_INVENTORY", "CONTAINER_LOCATIONS", "system", "Location", "e", "log", "PlayerLog", "IMPOSSIBLE_BREAK_TIME", "VALID_BLOCK_TAGS", "IMPOSSIBLE_BREAKS", "ViolationCount", "beforeBlockBreakKey", "protection", "Protection", "config", "beforeBlockBreak", "data", "getRole", "tag", "old", "count", "Ban", "previousMessage", "PlayerLog", "ViolationCount", "protection", "Protection", "data", "PREFIX", "getRole", "config", "isSpam", "count", "Mute", "error", "ViolationCount", "PlayerLog", "flag", "player", "index", "inventory", "item", "data", "getConfigId", "AIR", "Log", "violations", "Ban", "Protection", "BANNED_ITEMS", "i", "FORBIDDEN_ITEMS", "enchantments", "enchantment", "MAX_LEVEL", "getMaxEnchantmentLevel", "MinecraftBlockTypes", "MinecraftEntityTypes", "MinecraftItemTypes", "Player", "BLOCKS", "MinecraftBlockTypes", "CHEST_BOATS", "MinecraftItemTypes", "Protection", "block", "permutation", "data", "Player", "MinecraftEntityTypes", "getGamemode", "AIR", "MinecraftEffectTypes", "MinecraftItemTypes", "Player", "system", "world", "CALLBACKS", "vector3Equals", "from", "to", "playerLocation", "PlayerLog", "system", "sendCallback", "player", "data", "callback", "world", "oldLocation", "onPlayerMove", "key", "MOVEMENT_CONSTANTS", "SPEED_EFFECT_INCREASE", "ANTI_TP_DISTANCE_THRESHOLD", "TAGS", "violations", "PlayerLog", "distanceBetween", "loc1", "loc2", "getSpeedOffset", "player", "MinecraftEffectTypes", "SPEED_EFFECT_INCREASE", "isDistanceFlag", "distance", "speedIntensity", "offset", "MOVEMENT_CONSTANTS", "flag", "old", "violationCount", "onPlayerMove", "onPlayerMoveSubKey", "protection", "Protection", "config", "getRole", "tag", "TAGS", "ANTI_TP_DISTANCE_THRESHOLD", "data", "Player", "projectile", "source", "MinecraftItemTypes", "itemStack", "MinecraftEffectTypes", "Player", "world", "e", "world", "data", "Player", "serverOwnerName", "getServerOwnerName", "setRole", "setServerOwner", "MinecraftEffectTypes", "DynamicPropertiesDefinition", "MinecraftEntityTypes", "world", "OBJECTIVES", "world", "propertyRegistry", "def2", "DynamicPropertiesDefinition", "MinecraftEntityTypes", "def3", "obj", "OBJECTIVES", "NPC_LOCATIONS", "clearNpcLocations", "DynamicPropertiesDefinition", "EntityTypes", "world", "world", "propertyRegistry", "DIMENSIONS", "ENTITY_LOCATION", "def", "DynamicPropertiesDefinition", "EntityTypes", "ENTITY_IDENTIFIER", "system", "data", "AIR", "ItemStack", "MinecraftItemTypes"] -} diff --git a/tsconfig.json b/tsconfig.json index 83ba5cc..c366bff 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { "module": "ES2020", - "moduleResolution": "node", - "target": "ES2021", - "lib": ["ES2021", "DOM"], + "moduleResolution": "NodeNext", + "target": "ES2020", + "lib": ["ES2020"], "allowSyntheticDefaultImports": true, "noImplicitAny": true, "preserveConstEnums": true, From 0fcdaa647c650054efebce2842f046ed3bbb7cfe Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:16:45 +0000 Subject: [PATCH 02/12] Testing workflow 2 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9dc797f..6b20f42 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: node-version: 16.17.0 - name: Install Packages & Run Script - run: npm run build + run: npm i && npm run build - name: Release uses: softprops/action-gh-release@v1 From fda075c6a601a81f3ce70e2eae1dd0f588e85589 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:19:55 +0000 Subject: [PATCH 03/12] Testing workflow 3 --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6b20f42..00c4970 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,5 +21,7 @@ jobs: - name: Release uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') with: + body_path: ${{ github.workspace }}/changelog.md files: dist/*.mcpack \ No newline at end of file From 7d4acb25f6e9a20392dd3b8f5589ae5fc1620cc8 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:26:07 +0000 Subject: [PATCH 04/12] Testing workflow 4 --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index e69de29..8318c86 100644 --- a/changelog.md +++ b/changelog.md @@ -0,0 +1 @@ +Test \ No newline at end of file From 53264736ea1ab4f5d414fbade861136acdd3f7d9 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Thu, 22 Dec 2022 23:52:12 +0100 Subject: [PATCH 05/12] Update launch.json --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index cc26a02..456e492 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,7 @@ "request": "attach", "name": "Wait for Minecraft Debug Connections", "mode": "listen", - "localRoot": "${workspaceFolder}/", + "localRoot": "${workspaceFolder}/project", "port": 19144 } ] From df836181de1d8b4a0ed4c989d42ed7b59674077f Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Fri, 23 Dec 2022 14:12:40 +0100 Subject: [PATCH 06/12] Update changelog.md --- changelog.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 8318c86..fe1021c 100644 --- a/changelog.md +++ b/changelog.md @@ -1 +1,25 @@ -Test \ No newline at end of file +**Rubedo 2.6.4** + +FIXED HUGE MEMORY LEAK... Caused by the new Database system, and a lot of async await. + +Changelog: + +- Converted `betweenXYZ` to `betweenVector3` ( thanks to <@249508447471665152> for showing this looks like `betweenXYZ` is ~80% slower lmao ) + +- Converted almost 200+ functions back to normal `get` + +- Added alternate options for database `get` `getSync` etc. + +- Added logging for gamemode protection + +- Added actual event orders and made protections not load until database loads + +- Updated Forms to show faster and to reduce lag when loading + +- Improved Script performance across the whole pack. + +- `has_container_open` now uses `component_groups` to improve script performace + +- Improved performance for Chest GUI + +- Updated `-ping` command to show actuate information for Ticks Per Second. From 6928e07fc8932f37e368a434578d573da29503c7 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 20:43:25 +0000 Subject: [PATCH 07/12] Test --- changelog.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/changelog.md b/changelog.md index fe1021c..96e0c87 100644 --- a/changelog.md +++ b/changelog.md @@ -7,19 +7,11 @@ Changelog: - Converted `betweenXYZ` to `betweenVector3` ( thanks to <@249508447471665152> for showing this looks like `betweenXYZ` is ~80% slower lmao ) - Converted almost 200+ functions back to normal `get` - - Added alternate options for database `get` `getSync` etc. - - Added logging for gamemode protection - - Added actual event orders and made protections not load until database loads - - Updated Forms to show faster and to reduce lag when loading - - Improved Script performance across the whole pack. - - `has_container_open` now uses `component_groups` to improve script performace - - Improved performance for Chest GUI - -- Updated `-ping` command to show actuate information for Ticks Per Second. +- Updated `-ping` command to show actuate information for Ticks Per Second. \ No newline at end of file From 4a181b51af7ced6e820e9cab18228702bd9c692b Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 20:55:53 +0000 Subject: [PATCH 08/12] Test --- .gitignore | 3 +-- build.js | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a96af46..db3d923 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,5 @@ node_modules build.js -scripts/* -!scripts/index.js +project/scripts dist \ No newline at end of file diff --git a/build.js b/build.js index dd35896..2ee4114 100644 --- a/build.js +++ b/build.js @@ -7,6 +7,9 @@ const isDev = process.argv[2] === "dev"; const ver = JSON.parse( fs.readFileSync(path.join(__dirname, "package.json")) )?.version; +const name = JSON.parse( + fs.readFileSync(path.join(__dirname, "package.json")) +)?.name; // const devDir = path?.join( // process.env.USERPROFILE, // "/AppData/Local/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang/development_behavior_packs/" @@ -46,7 +49,7 @@ function buildPack(target,destination) { fs.mkdirSync(destination); } - const output = fs.createWriteStream(path.join(destination, ver + ".mcpack")); + const output = fs.createWriteStream(path.join(destination,name + "." + ver + ".mcpack")); const archive = archiver("zip", { zlib: { level: 9 }, // Sets the compression level. }); From 6cc310fde67271c2f9b889514deeccdc81a52e22 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:12:49 +0000 Subject: [PATCH 09/12] Test --- .github/workflows/release.yml | 2 +- build.js | 12 +++++++----- .../animation_controllers/digging.json | 0 .../animation_controllers/eating.json | 0 .../animation_controllers/gliding.json | 0 .../animation_controllers/ground.json | 0 .../animation_controllers/jumping.json | 0 .../animation_controllers/levitating.json | 0 .../animation_controllers/moving.json | 0 .../animation_controllers/riding.json | 0 .../animation_controllers/sneaking.json | 0 .../animation_controllers/swimming.json | 0 .../animation_controllers/using_item.json | 0 project/{ => behavior}/entities/chest_boat.json | 0 .../entities/command_block_minecart.json | 0 project/{ => behavior}/entities/database.json | 0 project/{ => behavior}/entities/inventory.json | 0 project/{ => behavior}/entities/npc.json | 0 project/{ => behavior}/entities/player.json | 0 project/{ => behavior}/functions/start.mcfunction | 0 project/{ => behavior}/items/gui.item.json | 0 project/{ => behavior}/manifest.json | 0 project/{ => behavior}/pack_icon.png | Bin project/{ => behavior}/scripts/index.js | 0 project/{ => behavior}/src/config/app.ts | 0 project/{ => behavior}/src/config/chest.ts | 0 project/{ => behavior}/src/config/commands.ts | 0 project/{ => behavior}/src/config/database.ts | 0 project/{ => behavior}/src/config/form.ts | 0 project/{ => behavior}/src/config/objectives.ts | 0 project/{ => behavior}/src/database/Database.ts | 0 project/{ => behavior}/src/database/index.ts | 0 project/{ => behavior}/src/database/tables.ts | 0 project/{ => behavior}/src/index.ts | 0 project/{ => behavior}/src/lang/emoji.ts | 0 project/{ => behavior}/src/lang/profanity.ts | 0 project/{ => behavior}/src/lang/text.ts | 0 .../src/lib/Chest GUI/Models/EntityChest.ts | 0 .../src/lib/Chest GUI/Models/FillTypes.ts | 0 .../src/lib/Chest GUI/Models/ItemGrabbedCallback.ts | 0 .../{ => behavior}/src/lib/Chest GUI/Models/Page.ts | 0 .../src/lib/Chest GUI/Models/PageItem.ts | 0 .../src/lib/Chest GUI/database/Item.ts | 0 project/{ => behavior}/src/lib/Chest GUI/index.ts | 0 .../{ => behavior}/src/lib/Chest GUI/pages/home.ts | 0 project/{ => behavior}/src/lib/Chest GUI/utils.ts | 0 .../{ => behavior}/src/lib/Command/ArgumentTypes.ts | 0 project/{ => behavior}/src/lib/Command/Callback.ts | 0 project/{ => behavior}/src/lib/Command/Command.ts | 0 project/{ => behavior}/src/lib/Command/index.ts | 0 project/{ => behavior}/src/lib/Command/types.d.ts | 0 project/{ => behavior}/src/lib/Command/utils.ts | 0 .../{ => behavior}/src/lib/Events/EntitiesLoad.ts | 0 .../src/lib/Events/beforeBlockBreak.ts | 0 project/{ => behavior}/src/lib/Events/beforeChat.ts | 0 .../{ => behavior}/src/lib/Events/onPlayerMove.ts | 0 .../{ => behavior}/src/lib/Events/onSlotChange.ts | 0 .../src/lib/Form/Models/ActionForm.ts | 0 .../src/lib/Form/Models/FormCallback.ts | 0 .../src/lib/Form/Models/MessageForm.ts | 0 .../{ => behavior}/src/lib/Form/Models/ModelForm.ts | 0 project/{ => behavior}/src/lib/Form/types.ts | 0 .../src/plugins/Anti-Cheat/config/enchantments.ts | 0 .../src/plugins/Anti-Cheat/config/moderation.ts | 0 .../src/plugins/Anti-Cheat/config/movement.ts | 0 .../src/plugins/Anti-Cheat/config/region.ts | 0 .../{ => behavior}/src/plugins/Anti-Cheat/index.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/ban.ts | 0 .../plugins/Anti-Cheat/modules/commands/database.ts | 0 .../plugins/Anti-Cheat/modules/commands/ecwipe.ts | 0 .../plugins/Anti-Cheat/modules/commands/freeze.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/help.ts | 0 .../plugins/Anti-Cheat/modules/commands/import.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/kick.ts | 0 .../plugins/Anti-Cheat/modules/commands/lockdown.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/log.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/mute.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/npc.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/ping.ts | 0 .../plugins/Anti-Cheat/modules/commands/region.ts | 0 .../src/plugins/Anti-Cheat/modules/commands/role.ts | 0 .../plugins/Anti-Cheat/modules/commands/settings.ts | 0 .../plugins/Anti-Cheat/modules/commands/teleport.ts | 0 .../plugins/Anti-Cheat/modules/commands/vanish.ts | 0 .../plugins/Anti-Cheat/modules/commands/version.ts | 0 .../events/beforeDataDrivenEntityTriggerEvent.ts | 0 .../src/plugins/Anti-Cheat/modules/events/import.ts | 0 .../plugins/Anti-Cheat/modules/events/playerJoin.ts | 0 .../Anti-Cheat/modules/events/worldInitialize.ts | 0 .../src/plugins/Anti-Cheat/modules/forms/automod.ts | 0 .../src/plugins/Anti-Cheat/modules/forms/home.ts | 0 .../plugins/Anti-Cheat/modules/forms/settings.ts | 0 .../src/plugins/Anti-Cheat/modules/managers/ban.ts | 0 .../Anti-Cheat/modules/managers/containers.ts | 0 .../plugins/Anti-Cheat/modules/managers/freeze.ts | 0 .../plugins/Anti-Cheat/modules/managers/import.ts | 0 .../src/plugins/Anti-Cheat/modules/managers/mute.ts | 0 .../plugins/Anti-Cheat/modules/managers/region.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Ban.ts | 0 .../Anti-Cheat/modules/models/BlockInventory.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Freeze.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Log.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Mute.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Npc.ts | 0 .../plugins/Anti-Cheat/modules/models/PlayerLog.ts | 0 .../Anti-Cheat/modules/models/PreviousLocation.ts | 0 .../plugins/Anti-Cheat/modules/models/Protection.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Region.ts | 0 .../src/plugins/Anti-Cheat/modules/models/Task.ts | 0 .../src/plugins/Anti-Cheat/modules/pages/import.ts | 0 .../src/plugins/Anti-Cheat/modules/pages/see.ts | 0 .../plugins/Anti-Cheat/modules/protections/cbe.ts | 0 .../Anti-Cheat/modules/protections/crasher.ts | 0 .../Anti-Cheat/modules/protections/gamemode.ts | 0 .../Anti-Cheat/modules/protections/import.ts | 0 .../Anti-Cheat/modules/protections/movement.ts | 0 .../plugins/Anti-Cheat/modules/protections/nbt.ts | 0 .../plugins/Anti-Cheat/modules/protections/nuker.ts | 0 .../plugins/Anti-Cheat/modules/protections/spam.ts | 0 .../Anti-Cheat/modules/protections/unobtainable.ts | 0 .../src/plugins/Anti-Cheat/protections.ts | 0 .../{ => behavior}/src/plugins/Anti-Cheat/utils.ts | 0 .../{ => behavior}/src/plugins/ChatRanks/index.ts | 0 .../{ => behavior}/src/plugins/GlobalBans/index.ts | 0 .../{ => behavior}/src/plugins/GlobalBans/list.ts | 0 project/{ => behavior}/src/plugins/import.ts | 0 project/{ => behavior}/src/types.ts | 0 project/{ => behavior}/src/utils.ts | 0 project/{ => behavior}/texts/bg_BG.lang | 0 project/{ => behavior}/texts/cs_CZ.lang | 0 project/{ => behavior}/texts/da_DK.lang | 0 project/{ => behavior}/texts/de_DE.lang | 0 project/{ => behavior}/texts/el_GR.lang | 0 project/{ => behavior}/texts/en_GB.lang | 0 project/{ => behavior}/texts/en_US.lang | 0 project/{ => behavior}/texts/es_ES.lang | 0 project/{ => behavior}/texts/es_MX.lang | 0 project/{ => behavior}/texts/fi_FI.lang | 0 project/{ => behavior}/texts/fr_CA.lang | 0 project/{ => behavior}/texts/fr_FR.lang | 0 project/{ => behavior}/texts/hu_HU.lang | 0 project/{ => behavior}/texts/id_ID.lang | 0 project/{ => behavior}/texts/it_IT.lang | 0 project/{ => behavior}/texts/ja_JP.lang | 0 project/{ => behavior}/texts/ko_KR.lang | 0 project/{ => behavior}/texts/language_names.json | 0 project/{ => behavior}/texts/languages.json | 0 project/{ => behavior}/texts/nb_NO.lang | 0 project/{ => behavior}/texts/nl_NL.lang | 0 project/{ => behavior}/texts/pl_PL.lang | 0 project/{ => behavior}/texts/pt_BR.lang | 0 project/{ => behavior}/texts/pt_PT.lang | 0 project/{ => behavior}/texts/ru_RU.lang | 0 project/{ => behavior}/texts/sk_SK.lang | 0 project/{ => behavior}/texts/sv_SE.lang | 0 project/{ => behavior}/texts/tr_TR.lang | 0 project/{ => behavior}/texts/uk_UA.lang | 0 project/{ => behavior}/texts/zh_CN.lang | 0 project/{ => behavior}/texts/zh_TW.lang | 0 159 files changed, 8 insertions(+), 6 deletions(-) rename project/{ => behavior}/animation_controllers/digging.json (100%) rename project/{ => behavior}/animation_controllers/eating.json (100%) rename project/{ => behavior}/animation_controllers/gliding.json (100%) rename project/{ => behavior}/animation_controllers/ground.json (100%) rename project/{ => behavior}/animation_controllers/jumping.json (100%) rename project/{ => behavior}/animation_controllers/levitating.json (100%) rename project/{ => behavior}/animation_controllers/moving.json (100%) rename project/{ => behavior}/animation_controllers/riding.json (100%) rename project/{ => behavior}/animation_controllers/sneaking.json (100%) rename project/{ => behavior}/animation_controllers/swimming.json (100%) rename project/{ => behavior}/animation_controllers/using_item.json (100%) rename project/{ => behavior}/entities/chest_boat.json (100%) rename project/{ => behavior}/entities/command_block_minecart.json (100%) rename project/{ => behavior}/entities/database.json (100%) rename project/{ => behavior}/entities/inventory.json (100%) rename project/{ => behavior}/entities/npc.json (100%) rename project/{ => behavior}/entities/player.json (100%) rename project/{ => behavior}/functions/start.mcfunction (100%) rename project/{ => behavior}/items/gui.item.json (100%) rename project/{ => behavior}/manifest.json (100%) rename project/{ => behavior}/pack_icon.png (100%) rename project/{ => behavior}/scripts/index.js (100%) rename project/{ => behavior}/src/config/app.ts (100%) rename project/{ => behavior}/src/config/chest.ts (100%) rename project/{ => behavior}/src/config/commands.ts (100%) rename project/{ => behavior}/src/config/database.ts (100%) rename project/{ => behavior}/src/config/form.ts (100%) rename project/{ => behavior}/src/config/objectives.ts (100%) rename project/{ => behavior}/src/database/Database.ts (100%) rename project/{ => behavior}/src/database/index.ts (100%) rename project/{ => behavior}/src/database/tables.ts (100%) rename project/{ => behavior}/src/index.ts (100%) rename project/{ => behavior}/src/lang/emoji.ts (100%) rename project/{ => behavior}/src/lang/profanity.ts (100%) rename project/{ => behavior}/src/lang/text.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/Models/EntityChest.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/Models/FillTypes.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/Models/Page.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/Models/PageItem.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/database/Item.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/index.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/pages/home.ts (100%) rename project/{ => behavior}/src/lib/Chest GUI/utils.ts (100%) rename project/{ => behavior}/src/lib/Command/ArgumentTypes.ts (100%) rename project/{ => behavior}/src/lib/Command/Callback.ts (100%) rename project/{ => behavior}/src/lib/Command/Command.ts (100%) rename project/{ => behavior}/src/lib/Command/index.ts (100%) rename project/{ => behavior}/src/lib/Command/types.d.ts (100%) rename project/{ => behavior}/src/lib/Command/utils.ts (100%) rename project/{ => behavior}/src/lib/Events/EntitiesLoad.ts (100%) rename project/{ => behavior}/src/lib/Events/beforeBlockBreak.ts (100%) rename project/{ => behavior}/src/lib/Events/beforeChat.ts (100%) rename project/{ => behavior}/src/lib/Events/onPlayerMove.ts (100%) rename project/{ => behavior}/src/lib/Events/onSlotChange.ts (100%) rename project/{ => behavior}/src/lib/Form/Models/ActionForm.ts (100%) rename project/{ => behavior}/src/lib/Form/Models/FormCallback.ts (100%) rename project/{ => behavior}/src/lib/Form/Models/MessageForm.ts (100%) rename project/{ => behavior}/src/lib/Form/Models/ModelForm.ts (100%) rename project/{ => behavior}/src/lib/Form/types.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/config/enchantments.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/config/moderation.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/config/movement.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/config/region.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/index.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/ban.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/database.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/freeze.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/help.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/import.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/kick.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/lockdown.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/log.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/mute.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/npc.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/ping.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/region.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/role.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/settings.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/teleport.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/vanish.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/commands/version.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/events/import.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/events/playerJoin.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/forms/automod.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/forms/home.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/forms/settings.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/ban.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/containers.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/freeze.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/import.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/mute.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/managers/region.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Ban.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Freeze.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Log.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Mute.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Npc.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Protection.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Region.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/models/Task.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/pages/import.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/pages/see.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/cbe.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/crasher.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/gamemode.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/import.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/movement.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/nbt.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/nuker.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/spam.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/protections.ts (100%) rename project/{ => behavior}/src/plugins/Anti-Cheat/utils.ts (100%) rename project/{ => behavior}/src/plugins/ChatRanks/index.ts (100%) rename project/{ => behavior}/src/plugins/GlobalBans/index.ts (100%) rename project/{ => behavior}/src/plugins/GlobalBans/list.ts (100%) rename project/{ => behavior}/src/plugins/import.ts (100%) rename project/{ => behavior}/src/types.ts (100%) rename project/{ => behavior}/src/utils.ts (100%) rename project/{ => behavior}/texts/bg_BG.lang (100%) rename project/{ => behavior}/texts/cs_CZ.lang (100%) rename project/{ => behavior}/texts/da_DK.lang (100%) rename project/{ => behavior}/texts/de_DE.lang (100%) rename project/{ => behavior}/texts/el_GR.lang (100%) rename project/{ => behavior}/texts/en_GB.lang (100%) rename project/{ => behavior}/texts/en_US.lang (100%) rename project/{ => behavior}/texts/es_ES.lang (100%) rename project/{ => behavior}/texts/es_MX.lang (100%) rename project/{ => behavior}/texts/fi_FI.lang (100%) rename project/{ => behavior}/texts/fr_CA.lang (100%) rename project/{ => behavior}/texts/fr_FR.lang (100%) rename project/{ => behavior}/texts/hu_HU.lang (100%) rename project/{ => behavior}/texts/id_ID.lang (100%) rename project/{ => behavior}/texts/it_IT.lang (100%) rename project/{ => behavior}/texts/ja_JP.lang (100%) rename project/{ => behavior}/texts/ko_KR.lang (100%) rename project/{ => behavior}/texts/language_names.json (100%) rename project/{ => behavior}/texts/languages.json (100%) rename project/{ => behavior}/texts/nb_NO.lang (100%) rename project/{ => behavior}/texts/nl_NL.lang (100%) rename project/{ => behavior}/texts/pl_PL.lang (100%) rename project/{ => behavior}/texts/pt_BR.lang (100%) rename project/{ => behavior}/texts/pt_PT.lang (100%) rename project/{ => behavior}/texts/ru_RU.lang (100%) rename project/{ => behavior}/texts/sk_SK.lang (100%) rename project/{ => behavior}/texts/sv_SE.lang (100%) rename project/{ => behavior}/texts/tr_TR.lang (100%) rename project/{ => behavior}/texts/uk_UA.lang (100%) rename project/{ => behavior}/texts/zh_CN.lang (100%) rename project/{ => behavior}/texts/zh_TW.lang (100%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 00c4970..1882557 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,4 +24,4 @@ jobs: if: startsWith(github.ref, 'refs/tags/') with: body_path: ${{ github.workspace }}/changelog.md - files: dist/*.mcpack \ No newline at end of file + files: dist/*.mc* \ No newline at end of file diff --git a/build.js b/build.js index 2ee4114..b228e6d 100644 --- a/build.js +++ b/build.js @@ -17,9 +17,9 @@ const name = JSON.parse( esbuild .build({ - entryPoints: ["project/src/index.ts"], + entryPoints: ["project/behavior/src/index.ts"], bundle: true, - outfile: "project/scripts/index.js", + outfile: "project/behavior/scripts/index.js", minify: !isDev, platform: "neutral", watch: isDev, @@ -40,16 +40,18 @@ esbuild if (!isDev) { const distDir = path.join(__dirname, "dist"); - buildPack(path.join(__dirname,"project"),distDir); + buildPack("behavior",path.join(__dirname,"project","behavior"),distDir); + buildPack("resource",path.join(__dirname,"project","resource"),distDir); + buildPack("fullpack",distDir,distDir,".mcaddon"); } }); -function buildPack(target,destination) { +function buildPack(fileName,target,destination,ext=".mcpack") { if (!fs.existsSync(destination)) { fs.mkdirSync(destination); } - const output = fs.createWriteStream(path.join(destination,name + "." + ver + ".mcpack")); + const output = fs.createWriteStream(path.join(destination,fileName + "-" + name + "." + ver + ext)); const archive = archiver("zip", { zlib: { level: 9 }, // Sets the compression level. }); diff --git a/project/animation_controllers/digging.json b/project/behavior/animation_controllers/digging.json similarity index 100% rename from project/animation_controllers/digging.json rename to project/behavior/animation_controllers/digging.json diff --git a/project/animation_controllers/eating.json b/project/behavior/animation_controllers/eating.json similarity index 100% rename from project/animation_controllers/eating.json rename to project/behavior/animation_controllers/eating.json diff --git a/project/animation_controllers/gliding.json b/project/behavior/animation_controllers/gliding.json similarity index 100% rename from project/animation_controllers/gliding.json rename to project/behavior/animation_controllers/gliding.json diff --git a/project/animation_controllers/ground.json b/project/behavior/animation_controllers/ground.json similarity index 100% rename from project/animation_controllers/ground.json rename to project/behavior/animation_controllers/ground.json diff --git a/project/animation_controllers/jumping.json b/project/behavior/animation_controllers/jumping.json similarity index 100% rename from project/animation_controllers/jumping.json rename to project/behavior/animation_controllers/jumping.json diff --git a/project/animation_controllers/levitating.json b/project/behavior/animation_controllers/levitating.json similarity index 100% rename from project/animation_controllers/levitating.json rename to project/behavior/animation_controllers/levitating.json diff --git a/project/animation_controllers/moving.json b/project/behavior/animation_controllers/moving.json similarity index 100% rename from project/animation_controllers/moving.json rename to project/behavior/animation_controllers/moving.json diff --git a/project/animation_controllers/riding.json b/project/behavior/animation_controllers/riding.json similarity index 100% rename from project/animation_controllers/riding.json rename to project/behavior/animation_controllers/riding.json diff --git a/project/animation_controllers/sneaking.json b/project/behavior/animation_controllers/sneaking.json similarity index 100% rename from project/animation_controllers/sneaking.json rename to project/behavior/animation_controllers/sneaking.json diff --git a/project/animation_controllers/swimming.json b/project/behavior/animation_controllers/swimming.json similarity index 100% rename from project/animation_controllers/swimming.json rename to project/behavior/animation_controllers/swimming.json diff --git a/project/animation_controllers/using_item.json b/project/behavior/animation_controllers/using_item.json similarity index 100% rename from project/animation_controllers/using_item.json rename to project/behavior/animation_controllers/using_item.json diff --git a/project/entities/chest_boat.json b/project/behavior/entities/chest_boat.json similarity index 100% rename from project/entities/chest_boat.json rename to project/behavior/entities/chest_boat.json diff --git a/project/entities/command_block_minecart.json b/project/behavior/entities/command_block_minecart.json similarity index 100% rename from project/entities/command_block_minecart.json rename to project/behavior/entities/command_block_minecart.json diff --git a/project/entities/database.json b/project/behavior/entities/database.json similarity index 100% rename from project/entities/database.json rename to project/behavior/entities/database.json diff --git a/project/entities/inventory.json b/project/behavior/entities/inventory.json similarity index 100% rename from project/entities/inventory.json rename to project/behavior/entities/inventory.json diff --git a/project/entities/npc.json b/project/behavior/entities/npc.json similarity index 100% rename from project/entities/npc.json rename to project/behavior/entities/npc.json diff --git a/project/entities/player.json b/project/behavior/entities/player.json similarity index 100% rename from project/entities/player.json rename to project/behavior/entities/player.json diff --git a/project/functions/start.mcfunction b/project/behavior/functions/start.mcfunction similarity index 100% rename from project/functions/start.mcfunction rename to project/behavior/functions/start.mcfunction diff --git a/project/items/gui.item.json b/project/behavior/items/gui.item.json similarity index 100% rename from project/items/gui.item.json rename to project/behavior/items/gui.item.json diff --git a/project/manifest.json b/project/behavior/manifest.json similarity index 100% rename from project/manifest.json rename to project/behavior/manifest.json diff --git a/project/pack_icon.png b/project/behavior/pack_icon.png similarity index 100% rename from project/pack_icon.png rename to project/behavior/pack_icon.png diff --git a/project/scripts/index.js b/project/behavior/scripts/index.js similarity index 100% rename from project/scripts/index.js rename to project/behavior/scripts/index.js diff --git a/project/src/config/app.ts b/project/behavior/src/config/app.ts similarity index 100% rename from project/src/config/app.ts rename to project/behavior/src/config/app.ts diff --git a/project/src/config/chest.ts b/project/behavior/src/config/chest.ts similarity index 100% rename from project/src/config/chest.ts rename to project/behavior/src/config/chest.ts diff --git a/project/src/config/commands.ts b/project/behavior/src/config/commands.ts similarity index 100% rename from project/src/config/commands.ts rename to project/behavior/src/config/commands.ts diff --git a/project/src/config/database.ts b/project/behavior/src/config/database.ts similarity index 100% rename from project/src/config/database.ts rename to project/behavior/src/config/database.ts diff --git a/project/src/config/form.ts b/project/behavior/src/config/form.ts similarity index 100% rename from project/src/config/form.ts rename to project/behavior/src/config/form.ts diff --git a/project/src/config/objectives.ts b/project/behavior/src/config/objectives.ts similarity index 100% rename from project/src/config/objectives.ts rename to project/behavior/src/config/objectives.ts diff --git a/project/src/database/Database.ts b/project/behavior/src/database/Database.ts similarity index 100% rename from project/src/database/Database.ts rename to project/behavior/src/database/Database.ts diff --git a/project/src/database/index.ts b/project/behavior/src/database/index.ts similarity index 100% rename from project/src/database/index.ts rename to project/behavior/src/database/index.ts diff --git a/project/src/database/tables.ts b/project/behavior/src/database/tables.ts similarity index 100% rename from project/src/database/tables.ts rename to project/behavior/src/database/tables.ts diff --git a/project/src/index.ts b/project/behavior/src/index.ts similarity index 100% rename from project/src/index.ts rename to project/behavior/src/index.ts diff --git a/project/src/lang/emoji.ts b/project/behavior/src/lang/emoji.ts similarity index 100% rename from project/src/lang/emoji.ts rename to project/behavior/src/lang/emoji.ts diff --git a/project/src/lang/profanity.ts b/project/behavior/src/lang/profanity.ts similarity index 100% rename from project/src/lang/profanity.ts rename to project/behavior/src/lang/profanity.ts diff --git a/project/src/lang/text.ts b/project/behavior/src/lang/text.ts similarity index 100% rename from project/src/lang/text.ts rename to project/behavior/src/lang/text.ts diff --git a/project/src/lib/Chest GUI/Models/EntityChest.ts b/project/behavior/src/lib/Chest GUI/Models/EntityChest.ts similarity index 100% rename from project/src/lib/Chest GUI/Models/EntityChest.ts rename to project/behavior/src/lib/Chest GUI/Models/EntityChest.ts diff --git a/project/src/lib/Chest GUI/Models/FillTypes.ts b/project/behavior/src/lib/Chest GUI/Models/FillTypes.ts similarity index 100% rename from project/src/lib/Chest GUI/Models/FillTypes.ts rename to project/behavior/src/lib/Chest GUI/Models/FillTypes.ts diff --git a/project/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts b/project/behavior/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts similarity index 100% rename from project/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts rename to project/behavior/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts diff --git a/project/src/lib/Chest GUI/Models/Page.ts b/project/behavior/src/lib/Chest GUI/Models/Page.ts similarity index 100% rename from project/src/lib/Chest GUI/Models/Page.ts rename to project/behavior/src/lib/Chest GUI/Models/Page.ts diff --git a/project/src/lib/Chest GUI/Models/PageItem.ts b/project/behavior/src/lib/Chest GUI/Models/PageItem.ts similarity index 100% rename from project/src/lib/Chest GUI/Models/PageItem.ts rename to project/behavior/src/lib/Chest GUI/Models/PageItem.ts diff --git a/project/src/lib/Chest GUI/database/Item.ts b/project/behavior/src/lib/Chest GUI/database/Item.ts similarity index 100% rename from project/src/lib/Chest GUI/database/Item.ts rename to project/behavior/src/lib/Chest GUI/database/Item.ts diff --git a/project/src/lib/Chest GUI/index.ts b/project/behavior/src/lib/Chest GUI/index.ts similarity index 100% rename from project/src/lib/Chest GUI/index.ts rename to project/behavior/src/lib/Chest GUI/index.ts diff --git a/project/src/lib/Chest GUI/pages/home.ts b/project/behavior/src/lib/Chest GUI/pages/home.ts similarity index 100% rename from project/src/lib/Chest GUI/pages/home.ts rename to project/behavior/src/lib/Chest GUI/pages/home.ts diff --git a/project/src/lib/Chest GUI/utils.ts b/project/behavior/src/lib/Chest GUI/utils.ts similarity index 100% rename from project/src/lib/Chest GUI/utils.ts rename to project/behavior/src/lib/Chest GUI/utils.ts diff --git a/project/src/lib/Command/ArgumentTypes.ts b/project/behavior/src/lib/Command/ArgumentTypes.ts similarity index 100% rename from project/src/lib/Command/ArgumentTypes.ts rename to project/behavior/src/lib/Command/ArgumentTypes.ts diff --git a/project/src/lib/Command/Callback.ts b/project/behavior/src/lib/Command/Callback.ts similarity index 100% rename from project/src/lib/Command/Callback.ts rename to project/behavior/src/lib/Command/Callback.ts diff --git a/project/src/lib/Command/Command.ts b/project/behavior/src/lib/Command/Command.ts similarity index 100% rename from project/src/lib/Command/Command.ts rename to project/behavior/src/lib/Command/Command.ts diff --git a/project/src/lib/Command/index.ts b/project/behavior/src/lib/Command/index.ts similarity index 100% rename from project/src/lib/Command/index.ts rename to project/behavior/src/lib/Command/index.ts diff --git a/project/src/lib/Command/types.d.ts b/project/behavior/src/lib/Command/types.d.ts similarity index 100% rename from project/src/lib/Command/types.d.ts rename to project/behavior/src/lib/Command/types.d.ts diff --git a/project/src/lib/Command/utils.ts b/project/behavior/src/lib/Command/utils.ts similarity index 100% rename from project/src/lib/Command/utils.ts rename to project/behavior/src/lib/Command/utils.ts diff --git a/project/src/lib/Events/EntitiesLoad.ts b/project/behavior/src/lib/Events/EntitiesLoad.ts similarity index 100% rename from project/src/lib/Events/EntitiesLoad.ts rename to project/behavior/src/lib/Events/EntitiesLoad.ts diff --git a/project/src/lib/Events/beforeBlockBreak.ts b/project/behavior/src/lib/Events/beforeBlockBreak.ts similarity index 100% rename from project/src/lib/Events/beforeBlockBreak.ts rename to project/behavior/src/lib/Events/beforeBlockBreak.ts diff --git a/project/src/lib/Events/beforeChat.ts b/project/behavior/src/lib/Events/beforeChat.ts similarity index 100% rename from project/src/lib/Events/beforeChat.ts rename to project/behavior/src/lib/Events/beforeChat.ts diff --git a/project/src/lib/Events/onPlayerMove.ts b/project/behavior/src/lib/Events/onPlayerMove.ts similarity index 100% rename from project/src/lib/Events/onPlayerMove.ts rename to project/behavior/src/lib/Events/onPlayerMove.ts diff --git a/project/src/lib/Events/onSlotChange.ts b/project/behavior/src/lib/Events/onSlotChange.ts similarity index 100% rename from project/src/lib/Events/onSlotChange.ts rename to project/behavior/src/lib/Events/onSlotChange.ts diff --git a/project/src/lib/Form/Models/ActionForm.ts b/project/behavior/src/lib/Form/Models/ActionForm.ts similarity index 100% rename from project/src/lib/Form/Models/ActionForm.ts rename to project/behavior/src/lib/Form/Models/ActionForm.ts diff --git a/project/src/lib/Form/Models/FormCallback.ts b/project/behavior/src/lib/Form/Models/FormCallback.ts similarity index 100% rename from project/src/lib/Form/Models/FormCallback.ts rename to project/behavior/src/lib/Form/Models/FormCallback.ts diff --git a/project/src/lib/Form/Models/MessageForm.ts b/project/behavior/src/lib/Form/Models/MessageForm.ts similarity index 100% rename from project/src/lib/Form/Models/MessageForm.ts rename to project/behavior/src/lib/Form/Models/MessageForm.ts diff --git a/project/src/lib/Form/Models/ModelForm.ts b/project/behavior/src/lib/Form/Models/ModelForm.ts similarity index 100% rename from project/src/lib/Form/Models/ModelForm.ts rename to project/behavior/src/lib/Form/Models/ModelForm.ts diff --git a/project/src/lib/Form/types.ts b/project/behavior/src/lib/Form/types.ts similarity index 100% rename from project/src/lib/Form/types.ts rename to project/behavior/src/lib/Form/types.ts diff --git a/project/src/plugins/Anti-Cheat/config/enchantments.ts b/project/behavior/src/plugins/Anti-Cheat/config/enchantments.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/config/enchantments.ts rename to project/behavior/src/plugins/Anti-Cheat/config/enchantments.ts diff --git a/project/src/plugins/Anti-Cheat/config/moderation.ts b/project/behavior/src/plugins/Anti-Cheat/config/moderation.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/config/moderation.ts rename to project/behavior/src/plugins/Anti-Cheat/config/moderation.ts diff --git a/project/src/plugins/Anti-Cheat/config/movement.ts b/project/behavior/src/plugins/Anti-Cheat/config/movement.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/config/movement.ts rename to project/behavior/src/plugins/Anti-Cheat/config/movement.ts diff --git a/project/src/plugins/Anti-Cheat/config/region.ts b/project/behavior/src/plugins/Anti-Cheat/config/region.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/config/region.ts rename to project/behavior/src/plugins/Anti-Cheat/config/region.ts diff --git a/project/src/plugins/Anti-Cheat/index.ts b/project/behavior/src/plugins/Anti-Cheat/index.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/index.ts rename to project/behavior/src/plugins/Anti-Cheat/index.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/ban.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/ban.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/ban.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/ban.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/database.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/database.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/database.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/database.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/freeze.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/freeze.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/freeze.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/freeze.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/help.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/help.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/help.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/help.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/import.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/import.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/import.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/import.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/kick.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/kick.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/kick.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/kick.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/lockdown.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/lockdown.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/lockdown.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/lockdown.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/log.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/log.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/log.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/log.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/mute.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/mute.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/mute.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/mute.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/npc.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/npc.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/ping.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/ping.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/ping.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/ping.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/region.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/region.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/region.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/region.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/role.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/role.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/role.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/role.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/settings.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/settings.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/settings.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/settings.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/teleport.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/teleport.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/teleport.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/teleport.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/vanish.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/vanish.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/vanish.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/vanish.ts diff --git a/project/src/plugins/Anti-Cheat/modules/commands/version.ts b/project/behavior/src/plugins/Anti-Cheat/modules/commands/version.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/commands/version.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/commands/version.ts diff --git a/project/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts b/project/behavior/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts diff --git a/project/src/plugins/Anti-Cheat/modules/events/import.ts b/project/behavior/src/plugins/Anti-Cheat/modules/events/import.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/events/import.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/events/import.ts diff --git a/project/src/plugins/Anti-Cheat/modules/events/playerJoin.ts b/project/behavior/src/plugins/Anti-Cheat/modules/events/playerJoin.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/events/playerJoin.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/events/playerJoin.ts diff --git a/project/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts b/project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts diff --git a/project/src/plugins/Anti-Cheat/modules/forms/automod.ts b/project/behavior/src/plugins/Anti-Cheat/modules/forms/automod.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/forms/automod.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/forms/automod.ts diff --git a/project/src/plugins/Anti-Cheat/modules/forms/home.ts b/project/behavior/src/plugins/Anti-Cheat/modules/forms/home.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/forms/home.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/forms/home.ts diff --git a/project/src/plugins/Anti-Cheat/modules/forms/settings.ts b/project/behavior/src/plugins/Anti-Cheat/modules/forms/settings.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/forms/settings.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/forms/settings.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/ban.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/ban.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/ban.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/ban.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/containers.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/containers.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/freeze.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/freeze.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/freeze.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/freeze.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/import.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/import.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/import.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/import.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/mute.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/mute.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/mute.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/mute.ts diff --git a/project/src/plugins/Anti-Cheat/modules/managers/region.ts b/project/behavior/src/plugins/Anti-Cheat/modules/managers/region.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/managers/region.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/managers/region.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Ban.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Ban.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Ban.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Ban.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Freeze.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Freeze.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Freeze.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Freeze.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Log.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Log.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Log.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Log.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Mute.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Mute.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Mute.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Mute.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Npc.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Npc.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Npc.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Npc.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/PreviousLocation.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Protection.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Protection.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Protection.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Protection.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Region.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Region.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts diff --git a/project/src/plugins/Anti-Cheat/modules/models/Task.ts b/project/behavior/src/plugins/Anti-Cheat/modules/models/Task.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/models/Task.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/models/Task.ts diff --git a/project/src/plugins/Anti-Cheat/modules/pages/import.ts b/project/behavior/src/plugins/Anti-Cheat/modules/pages/import.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/pages/import.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/pages/import.ts diff --git a/project/src/plugins/Anti-Cheat/modules/pages/see.ts b/project/behavior/src/plugins/Anti-Cheat/modules/pages/see.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/pages/see.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/pages/see.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/cbe.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/cbe.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/crasher.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/crasher.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/crasher.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/crasher.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/gamemode.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/gamemode.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/import.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/import.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/import.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/import.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/movement.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/movement.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/nbt.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/nbt.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/nbt.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/nbt.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/nuker.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/nuker.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/nuker.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/nuker.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/spam.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/spam.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/spam.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/spam.ts diff --git a/project/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts b/project/behavior/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts rename to project/behavior/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts diff --git a/project/src/plugins/Anti-Cheat/protections.ts b/project/behavior/src/plugins/Anti-Cheat/protections.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/protections.ts rename to project/behavior/src/plugins/Anti-Cheat/protections.ts diff --git a/project/src/plugins/Anti-Cheat/utils.ts b/project/behavior/src/plugins/Anti-Cheat/utils.ts similarity index 100% rename from project/src/plugins/Anti-Cheat/utils.ts rename to project/behavior/src/plugins/Anti-Cheat/utils.ts diff --git a/project/src/plugins/ChatRanks/index.ts b/project/behavior/src/plugins/ChatRanks/index.ts similarity index 100% rename from project/src/plugins/ChatRanks/index.ts rename to project/behavior/src/plugins/ChatRanks/index.ts diff --git a/project/src/plugins/GlobalBans/index.ts b/project/behavior/src/plugins/GlobalBans/index.ts similarity index 100% rename from project/src/plugins/GlobalBans/index.ts rename to project/behavior/src/plugins/GlobalBans/index.ts diff --git a/project/src/plugins/GlobalBans/list.ts b/project/behavior/src/plugins/GlobalBans/list.ts similarity index 100% rename from project/src/plugins/GlobalBans/list.ts rename to project/behavior/src/plugins/GlobalBans/list.ts diff --git a/project/src/plugins/import.ts b/project/behavior/src/plugins/import.ts similarity index 100% rename from project/src/plugins/import.ts rename to project/behavior/src/plugins/import.ts diff --git a/project/src/types.ts b/project/behavior/src/types.ts similarity index 100% rename from project/src/types.ts rename to project/behavior/src/types.ts diff --git a/project/src/utils.ts b/project/behavior/src/utils.ts similarity index 100% rename from project/src/utils.ts rename to project/behavior/src/utils.ts diff --git a/project/texts/bg_BG.lang b/project/behavior/texts/bg_BG.lang similarity index 100% rename from project/texts/bg_BG.lang rename to project/behavior/texts/bg_BG.lang diff --git a/project/texts/cs_CZ.lang b/project/behavior/texts/cs_CZ.lang similarity index 100% rename from project/texts/cs_CZ.lang rename to project/behavior/texts/cs_CZ.lang diff --git a/project/texts/da_DK.lang b/project/behavior/texts/da_DK.lang similarity index 100% rename from project/texts/da_DK.lang rename to project/behavior/texts/da_DK.lang diff --git a/project/texts/de_DE.lang b/project/behavior/texts/de_DE.lang similarity index 100% rename from project/texts/de_DE.lang rename to project/behavior/texts/de_DE.lang diff --git a/project/texts/el_GR.lang b/project/behavior/texts/el_GR.lang similarity index 100% rename from project/texts/el_GR.lang rename to project/behavior/texts/el_GR.lang diff --git a/project/texts/en_GB.lang b/project/behavior/texts/en_GB.lang similarity index 100% rename from project/texts/en_GB.lang rename to project/behavior/texts/en_GB.lang diff --git a/project/texts/en_US.lang b/project/behavior/texts/en_US.lang similarity index 100% rename from project/texts/en_US.lang rename to project/behavior/texts/en_US.lang diff --git a/project/texts/es_ES.lang b/project/behavior/texts/es_ES.lang similarity index 100% rename from project/texts/es_ES.lang rename to project/behavior/texts/es_ES.lang diff --git a/project/texts/es_MX.lang b/project/behavior/texts/es_MX.lang similarity index 100% rename from project/texts/es_MX.lang rename to project/behavior/texts/es_MX.lang diff --git a/project/texts/fi_FI.lang b/project/behavior/texts/fi_FI.lang similarity index 100% rename from project/texts/fi_FI.lang rename to project/behavior/texts/fi_FI.lang diff --git a/project/texts/fr_CA.lang b/project/behavior/texts/fr_CA.lang similarity index 100% rename from project/texts/fr_CA.lang rename to project/behavior/texts/fr_CA.lang diff --git a/project/texts/fr_FR.lang b/project/behavior/texts/fr_FR.lang similarity index 100% rename from project/texts/fr_FR.lang rename to project/behavior/texts/fr_FR.lang diff --git a/project/texts/hu_HU.lang b/project/behavior/texts/hu_HU.lang similarity index 100% rename from project/texts/hu_HU.lang rename to project/behavior/texts/hu_HU.lang diff --git a/project/texts/id_ID.lang b/project/behavior/texts/id_ID.lang similarity index 100% rename from project/texts/id_ID.lang rename to project/behavior/texts/id_ID.lang diff --git a/project/texts/it_IT.lang b/project/behavior/texts/it_IT.lang similarity index 100% rename from project/texts/it_IT.lang rename to project/behavior/texts/it_IT.lang diff --git a/project/texts/ja_JP.lang b/project/behavior/texts/ja_JP.lang similarity index 100% rename from project/texts/ja_JP.lang rename to project/behavior/texts/ja_JP.lang diff --git a/project/texts/ko_KR.lang b/project/behavior/texts/ko_KR.lang similarity index 100% rename from project/texts/ko_KR.lang rename to project/behavior/texts/ko_KR.lang diff --git a/project/texts/language_names.json b/project/behavior/texts/language_names.json similarity index 100% rename from project/texts/language_names.json rename to project/behavior/texts/language_names.json diff --git a/project/texts/languages.json b/project/behavior/texts/languages.json similarity index 100% rename from project/texts/languages.json rename to project/behavior/texts/languages.json diff --git a/project/texts/nb_NO.lang b/project/behavior/texts/nb_NO.lang similarity index 100% rename from project/texts/nb_NO.lang rename to project/behavior/texts/nb_NO.lang diff --git a/project/texts/nl_NL.lang b/project/behavior/texts/nl_NL.lang similarity index 100% rename from project/texts/nl_NL.lang rename to project/behavior/texts/nl_NL.lang diff --git a/project/texts/pl_PL.lang b/project/behavior/texts/pl_PL.lang similarity index 100% rename from project/texts/pl_PL.lang rename to project/behavior/texts/pl_PL.lang diff --git a/project/texts/pt_BR.lang b/project/behavior/texts/pt_BR.lang similarity index 100% rename from project/texts/pt_BR.lang rename to project/behavior/texts/pt_BR.lang diff --git a/project/texts/pt_PT.lang b/project/behavior/texts/pt_PT.lang similarity index 100% rename from project/texts/pt_PT.lang rename to project/behavior/texts/pt_PT.lang diff --git a/project/texts/ru_RU.lang b/project/behavior/texts/ru_RU.lang similarity index 100% rename from project/texts/ru_RU.lang rename to project/behavior/texts/ru_RU.lang diff --git a/project/texts/sk_SK.lang b/project/behavior/texts/sk_SK.lang similarity index 100% rename from project/texts/sk_SK.lang rename to project/behavior/texts/sk_SK.lang diff --git a/project/texts/sv_SE.lang b/project/behavior/texts/sv_SE.lang similarity index 100% rename from project/texts/sv_SE.lang rename to project/behavior/texts/sv_SE.lang diff --git a/project/texts/tr_TR.lang b/project/behavior/texts/tr_TR.lang similarity index 100% rename from project/texts/tr_TR.lang rename to project/behavior/texts/tr_TR.lang diff --git a/project/texts/uk_UA.lang b/project/behavior/texts/uk_UA.lang similarity index 100% rename from project/texts/uk_UA.lang rename to project/behavior/texts/uk_UA.lang diff --git a/project/texts/zh_CN.lang b/project/behavior/texts/zh_CN.lang similarity index 100% rename from project/texts/zh_CN.lang rename to project/behavior/texts/zh_CN.lang diff --git a/project/texts/zh_TW.lang b/project/behavior/texts/zh_TW.lang similarity index 100% rename from project/texts/zh_TW.lang rename to project/behavior/texts/zh_TW.lang From c298b1a4c886de0dd0b81e333e299dc4cd11d245 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:25:17 +0000 Subject: [PATCH 10/12] Updated build.js "npm run dev coming soon" --- build.js | 9 +- project/behavior/scripts/index.js | 4235 +++++++++++++++++++- project/resource/LICENSE.md | 21 + project/resource/README.md | 10 + project/resource/manifest.json | 23 + project/resource/pack_icon.png | Bin 0 -> 473002 bytes project/resource/texts/bg_BG.lang | 3 + project/resource/texts/cs_CZ.lang | 3 + project/resource/texts/da_DK.lang | 3 + project/resource/texts/de_DE.lang | 3 + project/resource/texts/el_GR.lang | 3 + project/resource/texts/en_GB.lang | 3 + project/resource/texts/en_US.lang | 3 + project/resource/texts/es_ES.lang | 3 + project/resource/texts/es_MX.lang | 3 + project/resource/texts/fi_FI.lang | 3 + project/resource/texts/fr_CA.lang | 3 + project/resource/texts/fr_FR.lang | 3 + project/resource/texts/hu_HU.lang | 3 + project/resource/texts/id_ID.lang | 3 + project/resource/texts/it_IT.lang | 3 + project/resource/texts/ja_JP.lang | 3 + project/resource/texts/ko_KR.lang | 3 + project/resource/texts/language_names.json | 118 + project/resource/texts/languages.json | 31 + project/resource/texts/nb_NO.lang | 3 + project/resource/texts/nl_NL.lang | 3 + project/resource/texts/pl_PL.lang | 3 + project/resource/texts/pt_BR.lang | 3 + project/resource/texts/pt_PT.lang | 3 + project/resource/texts/ru_RU.lang | 3 + project/resource/texts/sk_SK.lang | 3 + project/resource/texts/sv_SE.lang | 3 + project/resource/texts/tr_TR.lang | 3 + project/resource/texts/uk_UA.lang | 3 + project/resource/texts/zh_CN.lang | 3 + project/resource/texts/zh_TW.lang | 3 + project/resource/ui/chest_screen.json | 283 ++ project/resource/ui/pocket_containers.json | 179 + 39 files changed, 4989 insertions(+), 7 deletions(-) create mode 100644 project/resource/LICENSE.md create mode 100644 project/resource/README.md create mode 100644 project/resource/manifest.json create mode 100644 project/resource/pack_icon.png create mode 100644 project/resource/texts/bg_BG.lang create mode 100644 project/resource/texts/cs_CZ.lang create mode 100644 project/resource/texts/da_DK.lang create mode 100644 project/resource/texts/de_DE.lang create mode 100644 project/resource/texts/el_GR.lang create mode 100644 project/resource/texts/en_GB.lang create mode 100644 project/resource/texts/en_US.lang create mode 100644 project/resource/texts/es_ES.lang create mode 100644 project/resource/texts/es_MX.lang create mode 100644 project/resource/texts/fi_FI.lang create mode 100644 project/resource/texts/fr_CA.lang create mode 100644 project/resource/texts/fr_FR.lang create mode 100644 project/resource/texts/hu_HU.lang create mode 100644 project/resource/texts/id_ID.lang create mode 100644 project/resource/texts/it_IT.lang create mode 100644 project/resource/texts/ja_JP.lang create mode 100644 project/resource/texts/ko_KR.lang create mode 100644 project/resource/texts/language_names.json create mode 100644 project/resource/texts/languages.json create mode 100644 project/resource/texts/nb_NO.lang create mode 100644 project/resource/texts/nl_NL.lang create mode 100644 project/resource/texts/pl_PL.lang create mode 100644 project/resource/texts/pt_BR.lang create mode 100644 project/resource/texts/pt_PT.lang create mode 100644 project/resource/texts/ru_RU.lang create mode 100644 project/resource/texts/sk_SK.lang create mode 100644 project/resource/texts/sv_SE.lang create mode 100644 project/resource/texts/tr_TR.lang create mode 100644 project/resource/texts/uk_UA.lang create mode 100644 project/resource/texts/zh_CN.lang create mode 100644 project/resource/texts/zh_TW.lang create mode 100644 project/resource/ui/chest_screen.json create mode 100644 project/resource/ui/pocket_containers.json diff --git a/build.js b/build.js index b228e6d..1cee06a 100644 --- a/build.js +++ b/build.js @@ -10,10 +10,6 @@ const ver = JSON.parse( const name = JSON.parse( fs.readFileSync(path.join(__dirname, "package.json")) )?.name; -// const devDir = path?.join( -// process.env.USERPROFILE, -// "/AppData/Local/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang/development_behavior_packs/" -// ) || ""; esbuild .build({ @@ -43,6 +39,11 @@ esbuild buildPack("behavior",path.join(__dirname,"project","behavior"),distDir); buildPack("resource",path.join(__dirname,"project","resource"),distDir); buildPack("fullpack",distDir,distDir,".mcaddon"); + } else { + console.log( + `\x1b[31m%s\x1b[0m`, + `[${new Date().toLocaleTimeString()}]`,"This feature is currently being worked on :P"); + process.exit(0); } }); diff --git a/project/behavior/scripts/index.js b/project/behavior/scripts/index.js index 079378d..aa1df5e 100644 --- a/project/behavior/scripts/index.js +++ b/project/behavior/scripts/index.js @@ -1,3 +1,4232 @@ -import{ItemStack as Tr,MinecraftItemTypes as Pr,system as Ar}from"@minecraft/server";import{world as co}from"@minecraft/server";var T="-";import{world as so}from"@minecraft/server";import{ItemStack as _t,MinecraftItemTypes as Ot}from"@minecraft/server";import{BlockLocation as oo}from"@minecraft/server";var Pt=32e3,ae="rubedo:database",B=new oo(0,-64,0),At=128;import{system as Dt,world as Lt}from"@minecraft/server";import{BlockLocation as Ue,MinecraftDimensionTypes as ee,system as xt,world as te}from"@minecraft/server";import{MessageFormData as ro}from"@minecraft/server-ui";var Z=class{constructor(e,n){this.title=e,this.body=n,this.form=new ro,e&&this.form.title(e),n&&this.form.body(n),this.triedToShow=0}setButton1(e,n){return this.button1={text:e,callback:n},this.form.button1(e),this}setButton2(e,n){return this.button2={text:e,callback:n},this.form.button2(e),this}show(e){this.form.show(e).then(n=>{if(n.canceled){if(n.cancelationReason=="userBusy"){if(this.triedToShow>200)return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)");this.triedToShow++,this.show(e)}return}n.selection==1&&this.button1?.callback?.(),n.selection==0&&this.button2?.callback?.()})}};var h={overworld:te.getDimension(ee.overworld),nether:te.getDimension(ee.nether),theEnd:te.getDimension(ee.theEnd),"minecraft:overworld":te.getDimension(ee.overworld),"minecraft:nether":te.getDimension(ee.nether),"minecraft:the_end":te.getDimension(ee.theEnd)};function le(t){let e=t.split(",");console.warn(e.length);let n=0;for(let o of e){let r=parseInt(o.match(/\D+|\d+/g)[0]),i=o.match(/\D+|\d+/g)[1];i=="y"&&(n=n+317098e-16*r),i=="w"&&(n=n+6048e5*r),i=="d"&&(n=n+864e5*r),i=="h"&&(n=n+36e5*r),i=="m"&&(n=n+6e4*r),i=="s"&&(n=n+1e3*r),i=="ms"&&(n=n+r)}return n}function ne(t){return new Date(t).toString()}function Rt(t){return new Ue(Math.floor(t.x),Math.floor(t.y),Math.floor(t.z))}function K(t,e,n,o=()=>{}){new Z("Confirm To Continue",e).setButton1("Confirm",n).setButton2("Never Mind",o).show(t)}function Bt(t){return new Promise(e=>{let n=xt.runSchedule(()=>{e(),xt.clearRunSchedule(n)},t)})}function Nt(t,e){let n=[t.x,t.y,t.z],o=[t.x,t.y,t.z];return(t instanceof Ue||e instanceof Ue)&&(n=n.map(r=>Math.trunc(r)),o=o.map(r=>Math.trunc(r))),!n.find((r,i)=>o[i]!=r)}function io(t,e){let{x:n,y:o,z:r}=t,{x:i,y:s,z:c}=e,l=n=o&&d<=s&&g>=r&&g<=c&&J>=i&&J<=l}function Mt(t,e){return t.match(new RegExp(".{1,"+e+"}","g"))}var H={},Pe=!1;Dt.run(async()=>{try{await h.overworld.runCommandAsync("testfor @a"),Pe=!0;for(let[t,e]of Object.entries(H))e(),delete H[t]}catch{let e=Lt.events.entityCreate.subscribe(n=>{Dt.run(()=>{Pe=!0;for(let[o,r]of Object.entries(H))r(),delete H[o];Lt.events.entityCreate.unsubscribe(e)})})}});var I=class{static async awaitLoad(){if(!Pe)return new Promise(e=>{I.subscribe(e)})}static subscribe(e){if(Pe){e();return}let n=Object.keys(H).length;return H[n]=e,n}static unsubscribe(e){delete H[e]}};var b=class{constructor(e){this.tableName=e;this.tableName=e,this.MEMORY=null,this.QUEUE=[],I.subscribe(async()=>{await this.initData(),this.QUEUE.forEach(n=>n())})}static createTableEntity(e,n){let o=h.overworld.spawnEntity(ae,B);return o.setDynamicProperty("tableName",e),o.nameTag=`\xA7aDatabase Table: ${e}\xA7r`,n&&o.setDynamicProperty("index",n),o}static getTableEntities(e){return h.overworld.getEntitiesAtBlockLocation(B).filter(n=>n.typeId==ae&&n.getDynamicProperty("tableName")==e)}async addQueueTask(){return new Promise(e=>{this.QUEUE.push(e)})}async saveData(){this.MEMORY||await this.addQueueTask();let e=b.getTableEntities(this.tableName),n=Mt(JSON.stringify(this.MEMORY),Pt),o=Math.ceil(n.length/At)-e.length;if(o>0)for(let r=0;rs.size-1)break;let d=new _t(Ot.acaciaBoat);d.nameTag=l,s.setItem(c,d),n[c]=null}for(let c=n.length+1;cc))break}e.filter(r=>r).forEach(r=>r.triggerEvent("despawn"))}async initData(){let e=b.getTableEntities(this.tableName).sort((r,i)=>r.getDynamicProperty("index")-i.getDynamicProperty("index")),n="";for(let r of e){let i=r.getComponent("inventory").container;for(let s=0;se.name===t)}var F=class{constructor(e="literal"){this.name=e;this.typeName="literal";this.name=e}matches(e){return{success:this.name==e}}fail(e){return`${e} should be ${this.name}!`}},me=class{constructor(e="string"){this.name=e;this.typeName="string";this.name=e}matches(e){return{success:e&&e!="",value:e}}fail(e){return"Value must be of type string!"}},ue=class{constructor(e="integer"){this.name=e;this.typeName="int";this.name=e}matches(e){return{success:!isNaN(e),value:parseInt(e)}}fail(e){return"Value must be valid number!"}},qe=class{constructor(e="float"){this.name=e;this.typeName="float";this.name=e}matches(e){return{success:Boolean(e?.match(/^\d+\.\d+$/)?.[0]),value:parseInt(e)}}fail(e){return"Value must be valid float!"}},U=class{constructor(e="location"){this.name=e;this.typeName="location";this.name=e}matches(e){return{success:/^([~^]{0,1}(-\d)?(\d*)?(\.(\d+))?)$/.test(e),value:e}}fail(e){return"Value needs to be a valid number, value can include: [~,^]"}},de=class{constructor(e="boolean"){this.name=e;this.typeName="boolean";this.name=e}matches(e){return{success:Boolean(e?.match(/^(true|false)$/)?.[0]),value:e=="true"}}fail(e){return`"${e}" can be either "true" or "false"`}},We=class{constructor(e="player"){this.name=e;this.typeName="Player";this.name=e}matches(e){return{success:!!$t(e),value:$t(e)}}fail(e){return`player: "${e}", is not in this world`}},Qe=class{constructor(e="target"){this.name=e;this.typeName="Target";this.name=e}matches(e){return{success:Boolean(e?.match(/^(@.|"[\s\S]+")$/)?.[0]),value:e}}fail(e){return`${e} is not a valid target`}},fe=class{constructor(e="array",n){this.name=e;this.types=n;this.typeName="string";this.name=e,this.types=n,this.typeName=n.join(" | ").replace(/(.{25})..+/,"$1...")}matches(e){return{success:this.types.includes(e),value:e}}fail(e){return`"${e}" must be one of these values: ${this.types.join(" | ")}`}},Xe=class{constructor(e){this.name=e;this.typeName="Duration"}matches(e){return{success:/^(\d+[hdysmw],?)+$/.test(e),value:e}}fail(e){return`"${e}" must be a value like "10d" or "3s" the first part is the length second is unit`}},Je=class{constructor(e="playerName"){this.name=e;this.typeName="playerName";this.name=e}matches(e){return{success:!!a.ids.get(e),value:e}}fail(e){return`player: "${e}" has never played this world before! Tip: if the name has spaces in it use quotes around name!`}},p={string:me,int:ue,float:qe,location:U,boolean:de,player:We,target:Qe,array:fe,duration:Xe,playerName:Je};var Ae=class{constructor(e){this.data=e,this.sender=e.sender}reply(e){this.sender.tell(e)}};function Ft(t,e){try{return t.slice(e.length).trim().match(/"[^"]+"|[^\s]+/g).map(n=>n.replace(/"(.+)"/,"$1").toString())}catch{return[]}}function zt(t,e){t.tell({rawtext:[{text:"\xA7c"},{translate:"commands.generic.unknown",with:[`${e}`]}]})}function Ze(t,e){t.tell({rawtext:[{text:e.data.invalidPermission?e.data.invalidPermission:`\xA7cYou do not have permission to use "${e.data.name}"`}]})}function Vt(t,e,n,o,r){if(t.tell({rawtext:[{text:"\xA7c"},{translate:"commands.generic.syntax",with:[`${T}${e.data.name} ${o.slice(0,r).join(" ")}`,o[r]??" ",o.slice(r+1).join(" ")]}]}),n.children.length>1||!o[r]){let i=n.children.map(s=>s.type instanceof F?s.type.name:s.type?.typeName);t.tell(`\xA7c"${o[r]??"undefined"}" is not valid! Argument "${[...new Set(n.children.map(s=>s.type.name))][0]}" can be typeof: "${i.join('", "')}"`)}else t.tell(`\xA7c${n.children[0]?.type?.fail(o[r])}`)}function ao([t,e,n],{location:o,viewVector:r}){if(!t||!e||!t)return null;let i=[o.x,o.y,o.z],s=[r.x,r.y,r.z],c=[t,e,n].map(d=>{let g=parseFloat(d);return isNaN(g)?0:g}),l=[t,e,n].map((d,g)=>d.includes("~")?c[g]+i[g]:d.includes("^")?c[g]+s[g]:c[g]);return{x:l[0],y:l[1],z:l[2]}}function jt(t,e,n,o){let r=e[e.length-1]??o,i=[];for(let[s,c]of e.entries())if(!c.type.name.endsWith("*")){if(c.type instanceof U){i.push(ao([t[s],t[s+1],t[s+2]],n.sender));continue}c.type instanceof F||i.push(c.type.matches(t[s]).value??t[s])}r.callback(new Ae(n),...i)}var q=[];co.events.beforeChat.subscribe(t=>{if(!t.message.startsWith(T))return;t.cancel=!0;let e=Ft(t.message,T),n=q.find(c=>c.depth==0&&(c.data.name==e[0]||c.data?.aliases?.includes(e[0]))),o={message:t.message,sendToTargets:t.sendToTargets,sender:t.sender,targets:t.targets};if(!n)return zt(t.sender,e[0]);if(!n.data?.requires(t.sender))return Ze(o.sender,n);e.shift();let r=[],i=(c,l)=>{if(c.children.length>0){let d=c.children.find(g=>g.type.matches(e[l]).success);return!d&&!e[l]&&c.callback?void 0:d?d.data?.requires(o.sender)?(r.push(d),i(d,l+1)):(Ze(o.sender,d),"fail"):(Vt(o.sender,n,c,e,l),"fail")}};i(n,0)!="fail"&&jt(e,r,o,n)});import{system as fn,world as Io}from"@minecraft/server";var Yt="rubedo:gui",pe="rubedo:inventory";import{world as D,Player as mo,BlockLocation as Zt,MinecraftBlockTypes as uo,GameMode as fo,system as nt}from"@minecraft/server";import{BlockLocation as Ut,MinecraftBlockTypes as lo}from"@minecraft/server";var Gt={doorsAndSwitches:!0,openContainers:!0,pvp:!1,allowedEntities:["minecraft:player","minecraft:npc","minecraft:item","rubedo:inventory","rubedo:database"]},Kt=["minecraft:acacia_door","minecraft:acacia_trapdoor","minecraft:acacia_button","minecraft:birch_door","minecraft:birch_trapdoor","minecraft:birch_button","minecraft:crimson_door","minecraft:crimson_trapdoor","minecraft:crimson_button","minecraft:dark_oak_door","minecraft:dark_oak_trapdoor","minecraft:dark_oak_button","minecraft:jungle_door","minecraft:jungle_trapdoor","minecraft:jungle_button","minecraft:mangrove_door","minecraft:mangrove_trapdoor","minecraft:mangrove_button","minecraft:spruce_door","minecraft:spruce_trapdoor","minecraft:spruce_button","minecraft:warped_door","minecraft:warped_trapdoor","minecraft:warped_button","minecraft:wooden_door","minecraft:wooden_button","minecraft:trapdoor","minecraft:iron_door","minecraft:iron_trapdoor","minecraft:polished_blackstone_button","minecraft:lever"],Ht=["minecraft:chest","minecraft:ender_chest","minecraft:barrel","minecraft:trapped_chest","minecraft:dispenser","minecraft:dropper","minecraft:furnace","minecraft:blast_furnace","minecraft:lit_furnace","minecraft:lit_blast_furnace","minecraft:hopper","minecraft:shulker_box","minecraft:undyed_shulker_box","minecraft:lit_smoker","minecraft:smoker"];var W=[],xe=!1,et=-64,tt=320,y=class{static async getAllRegionsSync(){if(xe)return W;let e=(await a.regions.valuesSync()).map(n=>new y(n.from,n.to,n.dimensionId,n.permissions,n.key));return e.forEach(n=>{W.push(n)}),xe=!0,e}static getAllRegions(){if(xe)return W;let e=a.regions.values().map(n=>new y(n.from,n.to,n.dimensionId,n.permissions,n.key));return e.forEach(n=>{W.push(n)}),xe=!0,e}static blockLocationInRegion(e,n){return this.getAllRegions().find(o=>o.dimensionId==n&&Te(e,{x:o.from.x,y:et,z:o.from.z},{x:o.to.x,y:tt,z:o.to.z}))}static async blockLocationInRegionSync(e,n){return(await this.getAllRegionsSync()).find(o=>o.dimensionId==n&&Te(e,{x:o.from.x,y:et,z:o.from.z},{x:o.to.x,y:tt,z:o.to.z}))}static async removeRegionAtBlockLocation(e,n){let o=this.blockLocationInRegion(e,n);return o?a.regions.delete(o.key):!1}constructor(e,n,o,r,i){this.from=e,this.to=n,this.dimensionId=o,this.permissions=r??Gt,this.key=i||Date.now().toString(),i||this.update().then(()=>{Re(),W.push(this)})}async update(){return a.regions.set(this.key,{key:this.key,from:this.from,dimensionId:this.dimensionId,permissions:this.permissions,to:this.to})}async delete(){let e=a.regions.get(this.key),n=new Ut(e.from.x,e.dimensionId=="minecraft:overworld"?-64:0,e.from.z),o=new Ut(e.to.x,e.dimensionId=="minecraft:overworld"?-64:0,e.to.z);for(let r of n.blocksBetween(o))h[e.dimensionId].getBlock(r)?.setType(lo.bedrock);return W=W.filter(r=>r.key!=this.key),a.regions.delete(this.key)}entityInRegion(e){return this.dimensionId==e.dimension.id&&Te(e.location,{x:this.from.x,y:et,z:this.from.z},{x:this.to.x,y:tt,z:this.to.z})}changePermission(e,n){this.permissions[e]=n,this.update()}};var M=class{static getTasks(){return a.tasks.get("changePlayerRole")??[]}static getPlayersRoleToSet(e){return M.getTasks().find(o=>o.playerName==e)?.role}constructor(e,n){let o=M.getTasks();o.push({playerName:e,role:n}),a.tasks.set("changePlayerRole",o)}};import{MinecraftBlockTypes as ge,MinecraftItemTypes as f}from"@minecraft/server";var qt=[f.beehive.id,f.beeNest.id,f.axolotlBucket.id,f.codBucket.id,f.tadpoleBucket.id,f.tropicalFishBucket.id,f.salmonBucket.id,f.pufferfishBucket.id],Wt=[f.allow.id,f.barrier.id,f.borderBlock.id,f.debugStick?.id??"minecraft:debug_stick",f.deny.id,f.jigsaw.id,f.lightBlock.id,f.commandBlock.id,f.repeatingCommandBlock.id,f.chainCommandBlock.id,f.commandBlockMinecart.id,f.structureBlock.id,f.structureVoid.id,f.bedrock.id,f.endPortalFrame.id,"minecraft:info_update","minecraft:info_update2","minecraft:reserved3","minecraft:reserved4","minecraft:reserved6","minecraft:movingBlock","minecraft:moving_block","minecraft:movingblock","minecraft:piston_arm_collision","minecraft:piston_arm_collision","minecraft:pistonarmcollision","minecraft:stickyPistonArmCollision","minecraft:sticky_piston_arm_collision","minecraft:unknown","minecraft:glowingobsidian","minecraft:invisible_bedrock","minecraft:invisiblebedrock","minecraft:netherreactor","minecraft:portal","minecraft:fire","minecraft:water","minecraft:lava","minecraft:flowing_lava","minecraft:flowing_water","minecraft:soul_fire"],Qt=[ge.dispenser.id],Xt=[ge.bedrock.id,ge.barrier.id,"minecraft:invisiblebedrock","minecraft:movingBlock","minecraft:movingblock","minecraft:moving_block"],Be=[ge.chest.id,ge.trappedChest.id],Ai=[f.chest.id,f.trappedChest.id,f.barrel.id,f.dispenser.id,f.dropper.id,f.furnace.id,"minecraft:lit_furnace",f.blastFurnace.id,"minecraft:lit_blast_furnace",f.smoker.id,"minecraft:lit_smoker",f.hopper.id,f.shulkerBox.id,f.undyedShulkerBox.id],Q={x:7,y:7,z:7};var Ne={aquaAffinity:1,baneOfArthropods:5,binding:1,blastProtection:4,channeling:1,depthStrider:3,efficiency:5,featherFalling:4,fireAspect:2,fireProtection:4,flame:1,fortune:3,frostWalker:2,impaling:5,infinity:1,knockback:2,looting:3,loyalty:4,luckOfTheSea:3,lure:3,mending:1,multishot:1,piercing:4,power:5,projectileProtection:4,protection:4,punch:2,quickCharge:3,respiration:3,riptide:3,sharpness:5,silkTouch:1,smite:5,soulSpeed:3,swiftSneak:4,thorns:3,unbreaking:3,vanishing:1};var Jt="2.6.4-beta";var Me="https://discord.gg/dMa3A5UYKX";function z(t,e=[],n){if(ye(t))return console.warn("[WARNING]: TRIED TO KICK OWNER"),t.tell("You have been tried to kick, but you cant!"),n?.();try{t.runCommandAsync(`kick @s \xA7r${e.join(` -`)}`),t.triggerEvent("kick")}catch(o){if(t.triggerEvent("kick"),!/"statusCode":-2147352576/.test(o))return;n&&n()}}function m(t){return t instanceof mo?a.roles.get(t.name)??"member":a.roles.get(t)??"member"}function oe(t,e){if(typeof t=="string"){a.roles.set(t,e);let n=[...D.getPlayers()].find(o=>o.name==t);n?n.setDynamicProperty("role",e):new M(t,e)}else a.roles.set(t.name,e),t.setDynamicProperty("role",e)}function ye(t){return D.getDynamicProperty("worldsOwner")==t.id}function ot(){let t=D.getDynamicProperty("worldsOwner");return!t||t==""?null:t}function tn(){let t=ot();if(!t)return null;let e=a.ids.collection();return Object.keys(e).find(n=>e[n]===t)}function he(t){if(!t)return D.setDynamicProperty("worldsOwner","");D.setDynamicProperty("worldsOwner",t.id.toString())}function De(){return D.getDynamicProperty("isLockDown")??!1}function rt(t){D.setDynamicProperty("isLockDown",t)}function Re(){for(let t of y.getAllRegions()){let e=new Zt(t.from.x,t.dimensionId=="minecraft:overworld"?-64:0,t.from.z),n=new Zt(t.to.x,t.dimensionId=="minecraft:overworld"?-64:0,t.to.z);for(let o of e.blocksBetween(n))h[t.dimensionId].getBlock(o)?.setType(uo.deny)}}var it=[],en=0;function V(t,e=0){let n=en;return it[n]={callback:t,delay:e,lastCall:0},en=n+1,n}function nn(t){delete it[t]}I.subscribe(()=>{nt.runSchedule(()=>{let t=[...D.getPlayers()];for(let[e,n]of t.entries())if(m(n)!="admin")for(let o of Object.values(it))o.delay!=0&&nt.currentTick-o.lastCall[...D.getPlayers({name:t.name,gameMode:e})].length)}import{system as mn}from"@minecraft/server";import{system as po}from"@minecraft/server";var st={},sn={},j={};function go(t,e,n){if(e.length!=n.length)return[];let o=[];for(let r=0;rn[r]?.item?.amount&&e[r]?.item?.amount!=0){let i={slot:r,uid:n[r].uid,oldUid:e[r].uid,item:n[r].item,oldItem:e[r].item,changeType:"fluctuation"};o.push(i),j[t.id]=i;continue}if(n[r].uid!=e[r].uid)if(e[r]?.item&&n[r]?.item){let i={slot:r,uid:n[r].uid,oldUid:e[r].uid,item:n[r].item,oldItem:e[r].item,changeType:"swap"};o.push(i),j[t.id]=i}else if(n[r]?.item){if(n[r]?.item)if(j[t.id]?.changeType=="delete"&&j[t.id]?.uid==n[r].uid){let i={slot:r,uid:n[r].uid,item:n[r].item,changeType:"move"};o.push(i),j[t.id]=i;continue}else{let i={slot:r,uid:n[r].uid,item:n[r].item,changeType:"put"};o.push(i),j[t.id]=i}}else{let i={slot:r,uid:e[r].uid,item:e[r].item,changeType:"delete"};o.push(i),j[t.id]=i}}return o}function yo(t){if(!t)return"";let e=[];return e.push(t.typeId),e.push(t.nameTag),e.push(t.data),e.push(t.getLore().join("")),e.join("")}function ho(t){let e=[];for(let n=0;n{for(let t of Object.values(st))for(let e of h.overworld.getEntities(t.entities)){let n=ho(e.getComponent("inventory").container),o=go(e,sn[e.id]??n,n);if(sn[e.id]=n,o.length!=0){if(e.hasTag("skipCheck")){e.removeTag("skipCheck"),delete j[e.id];continue}for(let r of o)t.callback(e,r)}}},5);var be=class{static subscribe(e,n){let o=Date.now();return st[o]={callback:n,entities:e},o}static unsubscribe(e){delete st[e]}};import{Location as bo}from"@minecraft/server";var x={},re={};function an(t){return t.getComponent("minecraft:inventory").container.getItem(t.selectedSlot)}async function cn(t,e){try{let n=t.getComponent("minecraft:inventory").container,o=[];for(let r=0;ro.kill())}}function ln(t,e){return t.getComponent("minecraft:inventory").container.getItem(e)}var Le=class{constructor(e,n,o){this.gui=e,this.slot=n,this.change=o}message(e){this.gui.player.tell(e)}getItemAdded(){return this.slot.item?null:this.gui.entity.getComponent("minecraft:inventory").container.getItem(this.change.slot)}GiveAction(e=this.slot.item.itemStack){this.gui.player.getComponent("minecraft:inventory").container.addItem(e)}TakeAction(e=null){this.gui.player.getComponent("minecraft:inventory").container.addItem(this.slot.item.itemStack),this.gui.page.slots[this.change.slot]=null,e&&e.delete(this.slot.item.components.dbKey)}PageAction(e,n){this.gui.setPage(e,n)}CloseAction(){this.gui.despawn()}SetAction(){this.gui.entity.getComponent("minecraft:inventory").container.setItem(this.change.slot,this.slot.item.itemStack)}async FormAction(e){return this.CloseAction(),await Bt(5),await e.show(this.gui.player)}};var ie=class{static spawnEntity(e){try{return e.dimension.spawnEntity(pe,e.headLocation)}catch{return null}}constructor(e){this.player=e,this.entity=ie.spawnEntity(e),this.entity&&(this.hasChestOpen=!1,this.setPage("home")),this.runScheduleId=mn.runSchedule(()=>{if(!this.entity)return this.despawn();if(this.player.getComponent("mark_variant").value==1)this.hasChestOpen||(this.slotChangeEvent=be.subscribe({type:pe},(n,o)=>{n.id==this.entity.id&&this.onSlotChange(o)})),this.hasChestOpen=!0;else try{this.entity.teleport(this.player.headLocation,this.player.dimension,this.player.rotation.x,this.player.rotation.y,!0)}catch{this.despawn()}},5)}setPage(e,n){let o=this.entity.getComponent("inventory").container;for(let i=0;i{t.PageAction("moderation:see")}).setSlots([54],new w(dn.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});I.subscribe(()=>{fn.runSchedule(()=>{for(let t of Io.getPlayers()){if(an(t)?.typeId!=Yt){x[t.name]&&x[t.name].despawn();continue}Object.keys(x).includes(t?.name)||m(t)=="admin"&&(x[t.name]=new ie(t))}},10)});fn.runSchedule(()=>{let t=Object.values(x).map(e=>e.entity.id);for(let e of h.overworld.getEntities({type:pe}))t.includes(e.id)||e.triggerEvent("despawn")},100);import{system as Co}from"@minecraft/server";var ke={};I.subscribe(()=>{Co.run(()=>{for(let t of Object.values(ke))!t.getConfig().enabled||t.enable()})});var P={"api.name":()=>"Smelly API","api.error.unknown":()=>"An unknown error has occurred.","api.database.error.table_name":(t,e)=>`The display name ${t} is too long for an objective, it can be at most ${e} characters long`,"api.utilities.formatter.error.ms":t=>`${t} is not a string or a number`,"api.Providers.form.invalidType":(t,e)=>`Type ${t} is not a valid type to add a ${e}`,"modules.protections.cps.clickingToFast":()=>"You are clicking to fast! Please click slower!","modules.managers.mute.isMuted":()=>"\xA7cYou've been temporarily muted in chat.","modules.commands.ban.reply":(t,e,n="")=>`\xA7cBanned \xA7f"\xA7a${t}\xA7f" \xA7cfor ${e} Because: "${n??"No reason Provided"}" \xA7aSuccessfully`,"lockdown.kick.message":()=>["\xA7cYou have been kicked!","\xA7aReason: \xA7fServer is currently under LockDown","\xA7fServer will be up soon, Try to join later"],"commands.ban.list.player":(t,e,n)=>`- "${t}" Because: ${e}, Expiry ${n}`,"commands.freeze.list.player":(t,e)=>`- "${t}" Because: ${e}`,"commands.mutes.list.player":(t,e,n)=>`- "${t}" Because: ${e}, Expiry: ${n}`,"commands.lockdown.confirm":"Are you sure you want to lockdown the server, this will kick all active players and all players who try to join who are not admin"};var u=class{constructor(e,n,o=0,r){this.data=e;this.type=n;this.depth=o;this.parent=r;e.requires||(e.requires=i=>!0),this.data=e,this.type=n??new F(this.data.name),this.children=[],this.depth=o,this.parent=r,this.callback=null,q.push(this)}argument(e){let n=new u(this.data,e,this.depth+1,this);return this.children.push(n),n}string(e){return this.argument(new me(e))}int(e){return this.argument(new ue(e))}array(e,n){return this.argument(new fe(e,n))}boolean(e){return this.argument(new de(e))}location(e){let n=this.argument(new U(e));return e.endsWith("*")?n:n.location(e+"_y*").location(e+"_z*")}literal(e){let n=new u(e,new F(e.name),this.depth+1,this);return this.children.push(n),n}executes(e){return this.callback=e,this}};import{Player as gn}from"@minecraft/server";function pn(t,e,n,o="No Reason",r="Rubedo Auto Mod"){let i={key:e,playerName:t instanceof gn?t.name:t,date:Date.now(),duration:n?le(n):null,expire:n?le(n)+Date.now():null,reason:o,by:r};a.bans.set(e,i)}var A=class{constructor(e,n,o="No Reason",r="Rubedo Auto Mod"){e instanceof gn?pn(e,e.id,n,o,r):pn(e,a.ids.get(e),n,o,r)}};function at(t,e,n,o,r){if(a.bans.get(a.ids.get(e)))return t.reply(`\xA7c${e} is already banned`);t.reply("\xA7aClose chat to confirm"),K(t.sender,`Are you sure you want to ban ${e}, for ${n??"forever"}`,()=>{new A(e,n,o,t.sender.name),t.reply(P["modules.commands.ban.reply"](e,n,o))})}var ct=new u({name:"ban",description:"Manage bans",requires:t=>["admin","moderator"].includes(m(t))});ct.literal({name:"add",description:"Bans a player"}).argument(new p.playerName).executes((t,e)=>{at(t,e,null,null,t.sender.name)}).argument(new p.duration("duration")).executes((t,e,n)=>{at(t,e,n,null,t.sender.name)}).string("reason").executes((t,e,n,o)=>{at(t,e,n,o,t.sender.name)});ct.literal({name:"remove",description:"un-bans a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.bans.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not banned`);a.bans.delete(n.key)?t.reply(`\xA7a${e}\xA7r has been Unbanned!`):t.reply(`\xA7cFailed to un-ban ${e}`)});ct.literal({name:"list",description:"Lists all bans"}).executes(t=>{let e=a.bans.values();if(e.length==0)return t.sender.tell("\xA7cNo one is banned!");t.sender.tell(`\xA72--- Showing Bans (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.ban.list.player"](n.playerName,n.reason,n.expire?ne(n.duration):"Forever"))});var Ie=new u({name:"database",description:"Interacts with SA Database",aliases:["db"],requires:t=>m(t)=="admin"});Ie.literal({name:"get"}).string("table").string("key").executes((t,e,n)=>{try{let o=a[e].get(n);o?t.reply(JSON.stringify(o)):t.reply(`No data could be found for key ${n}`)}catch(o){t.reply(o+o.stack)}});Ie.literal({name:"set"}).string("table").string("key").string("value").executes((t,e,n,o)=>{try{a[e].set(n,o),t.reply(`Set Key: "${n}", to value: "${o}" on table: "${e}"`)}catch(r){t.reply(r+r.stack)}});Ie.literal({name:"clear"}).string("table").executes((t,e)=>{try{a[e].clear(),t.reply(`Cleared Table ${e}`)}catch(n){t.reply(n+n.stack)}});Ie.literal({name:"keys",description:"Returns all keys on a database"}).string("table").executes((t,e)=>{try{let n=a[e].keys();t.reply(`Keys on database: ${e}: ${n}`)}catch(n){t.reply(n+n.stack)}});Ie.literal({name:"values",description:"Returns all values on a database"}).string("table").executes((t,e)=>{try{let n=a[e].values();t.reply(`Values on database: ${e}: ${JSON.stringify(n,null,2)}`)}catch(n){n instanceof TypeError?t.reply(`No values on database ${e}`):t.reply(n+n.stack)}});new u({name:"ecwipe",description:"Clears a players ender chest",requires:t=>m(t)=="admin"}).argument(new p.player("player")).executes((t,e)=>{for(let n=0;n<27;n++)e.runCommandAsync(`replaceitem entity @s slot.enderchest ${n} air`);t.reply(`\xA7aCleared "${e.name}"'s Ender chest!`)});var _e=class{constructor(e,n="No Reason"){let o={playerName:e.name,key:e.id,reason:n,location:{x:e.location.x,y:e.location.y,z:e.location.z,dimension:e.dimension.id}};a.freezes.set(e.id,o)}};var lt=new u({name:"freeze",description:"Manage Freezes",requires:t=>["admin","moderator"].includes(m(t))});lt.literal({name:"add",description:"Freezes a player"}).argument(new p.player("player")).string("reason").executes((t,e,n)=>{new _e(e,n),t.reply(`\xA7cFroze \xA7f"\xA7a${e.name}\xA7f" Because: "${n}" \xA7aSuccessfully`),t.sender.tell(`\xA7cYou have been frozen by \xA7f"\xA7a${t.sender.name}\xA7f" Because: "${n}"`)});lt.literal({name:"remove",description:"unfreezes a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.freezes.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not frozen`);a.freezes.delete(n.key),t.reply(`\xA7a${e}\xA7r has been UnFrozen!`)});lt.literal({name:"list",description:"Lists all freezes"}).executes(t=>{let e=a.freezes.values();if(e.length==0)return t.sender.tell("\xA7cNo one is frozen!");t.sender.tell(`\xA72--- Showing Freezes (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.freeze.list.player"](n.playerName,n.reason))});var mt=class{constructor(e){this.name=e;this.typeName="CommandName"}matches(e){return{success:Boolean(q.find(n=>n.depth==0&&n.data.name==e)),value:e}}fail(e){return`"${e}" is not a valid command`}};function wo(t,e,n){n.tell(`${T}${t.data.name} ${e.map(o=>o.type.typeName=="literal"?o.data.name:`<${o.type.name}: ${o.type.typeName}>`).join(" ")}`)}function Oe(t,e,n,o){if(!!e.data?.requires(o)&&(e.callback&&wo(t,e.depth==0?n:n.concat(e),o),e.children.length>0))for(let r of e.children)Oe(t,r,e.depth==0?n:n.concat(e),o)}function yn(t,e,n){t.tell(`\xA72--- Showing help page ${e} of ${n} (${T}help ) ---`)}function ut(t){return q.filter(e=>e.depth==0&&e.data?.requires(t))}function hn(t){let e=ut(t);return e.length==0?0:Math.ceil(e.length/5)}var bn=new u({name:"help",description:"Provides help/list of commands.",aliases:["?","h"]}).executes(t=>{let e=hn(t.sender),n=ut(t.sender).slice(1*5-5,1*5);yn(t.sender,1,e);for(let o of n)Oe(o,o,[],t.sender)});bn.int("page").executes((t,e)=>{let n=hn(t.sender);e>n&&(e=n);let o=ut(t.sender).slice(e*5-5,e*5);yn(t.sender,e,n);for(let r of o)Oe(r,r,[],t.sender)});bn.argument(new mt("command")).executes((t,e)=>{let n=q.filter(o=>o.depth==0&&o.data.name==e)[0];t.sender.tell(`\xA7e${n.data.name}: ${n.data.aliases?`aliases (${n.data.aliases.join(", ")})`:""}`),t.sender.tell(`\xA7e${n.data.description}`),t.sender.tell("Usage:"),Oe(n,n,[],t.sender)});import{world as kn}from"@minecraft/server";new u({name:"lockdown",description:"Toggles the servers lockdown, meaning no one can join",requires:t=>m(t)=="admin"}).executes(t=>{De()?(rt(!1),t.sender.tell("\xA7aUnlocked the server!")):(t.reply("\xA7aClose chat to confirm lockdown"),K(t.sender,P["commands.lockdown.confirm"],()=>{rt(!0);for(let e of kn.getPlayers())m(e)!="admin"&&z(e,P["lockdown.kick.message"]());kn.say("\xA7l\xA7cServer is now LOCKED!")}))});var N=class{static getMuteData(e){return a.mutes.get(e.name)}constructor(e,n,o="No Reason",r="Rubedo Auto Mod"){let i=n?le(n):null,s={playerName:e.name,date:Date.now(),duration:i,expire:i?i+Date.now():null,reason:o,by:r};a.mutes.set(e.name,s)}};var dt=new u({name:"mute",description:"Manage Mutes",requires:t=>["admin","moderator"].includes(m(t))});dt.literal({name:"add",description:"Mutes a player"}).argument(new p.player("player")).argument(new p.duration("duration")).string("reason").executes((t,e,n,o)=>{new N(e,n,o,t.sender.name),t.reply(`\xA7cMuted \xA7f"\xA7a${e.name}\xA7f" \xA7cfor ${n} Because: "${o}" \xA7aSuccessfully`),e.tell(`\xA7cYou have been muted by \xA7f"${t.sender.name}" \xA7cfor ${n} Because: "${o}"`)});dt.literal({name:"remove",description:"un-mutes a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=a.mutes.values().find(o=>o.playerName==e);if(!n)return t.reply(`${e} is not muted!`);a.mutes.delete(n.playerName);try{t.sender.runCommandAsync(`ability "${e}" mute false`)}catch{}t.reply(`\xA7a${e}\xA7r has been UnMuted!`)});dt.literal({name:"list",description:"Lists all freezes"}).executes(t=>{let e=a.mutes.values();if(e.length==0)return t.sender.tell("\xA7cNo one is muted!");t.sender.tell(`\xA72--- Showing Mutes (${e.length}) ---`);for(let n of e)t.sender.tell(P["commands.mutes.list.player"](n.playerName,n.reason,n.expire?ne(n.expire):"Forever"))});import{Location as Eo}from"@minecraft/server";var se=class{static isValid(e){return e.typeId!="minecraft:npc"?!1:$e.find(n=>Nt(n,e.location))?!0:!!a.npcs.keys().find(n=>e.id==n)}constructor(e,n){$e.push(e);let o=n.spawnEntity("minecraft:npc",e),r={dimension:o.dimension.id,x:o.location.x,y:o.location.y,z:o.location.z};a.npcs.set(o.id,r),In()}};new u({name:"npc",description:"Spawns a npc at your coordinates",requires:t=>m(t)=="admin"}).executes(t=>{let{x:e,y:n,z:o}=t.sender.location;new se(new Eo(e,n,o),t.sender.dimension),t.reply("Spawned a verified npc at your current location")});import{system as Cn}from"@minecraft/server";async function vo(){let t=Date.now(),e=0;return new Promise(n=>{let o=Cn.runSchedule(()=>{Date.now()-t<1e3?e++:(Cn.clearRunSchedule(o),n(e))})})}new u({name:"ping",description:"Returns the current Ticks Per Second of the servers ping"}).executes(async t=>{let e=await vo();t.reply(`\xA7aCurrent Ticks Per Second: ${e>18?"\xA7f{ \xA7aGood":e>13?"\xA7f{ \xA7eOk":"\xA7f{ \xA7cSevere"} ${e} \xA7f}`)});import{BlockLocation as Ce}from"@minecraft/server";var we=new u({name:"region",description:"Create a Region",requires:t=>m(t)=="admin"});we.literal({name:"add",description:"Adds a new protection region"}).int("from_x").int("from_z").int("to_x").int("to_z").executes((t,e,n,o,r)=>{new y({x:e,z:n},{x:o,z:r},t.sender.dimension.id),t.reply(`Created Region From ${e} -64 ${n} ${o} 320 ${r}`)});we.literal({name:"remove",description:"Removes a region at the players current position"}).executes(t=>{let e=new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z);y.removeRegionAtBlockLocation(e,t.sender.dimension.id)?t.reply(`Removed Region at ${e.x} ${e.y} ${e.z}`):t.reply(`Failed to find/remove region at ${e.x} ${e.y} ${e.z}`)});we.literal({name:"removeAll",description:"Removes all regions"}).executes(t=>{y.getAllRegions().forEach(e=>e.delete()),t.reply("Removed All regions")});we.literal({name:"list",description:"Lists all regions and positions"}).executes(t=>{let e=y.getAllRegions();for(let n of e)t.reply(`Region from ${n.from.x}, ${n.from.z} to ${n.to.x}, ${n.to.z} in dimension ${n.dimensionId}`);if(e.length==0)return t.reply("No regions have been made yet")});var ft=we.literal({name:"permission",description:"Handles permissions for regions"});ft.literal({name:"set",description:"Sets a certain permission on the region the player is currently in to a value"}).array("key",["doorsAndSwitches","openContainers","pvp"]).boolean("value").executes((t,e,n)=>{let o=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!o)return t.reply("You are not in a region");o.changePermission(e,n),t.reply(`Changed permission ${e} to ${n}`)});ft.literal({name:"list",description:"Lists the permissions for the current region"}).executes(t=>{let e=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!e)return t.reply("You are not in a region");t.reply(`Current region permissions ${JSON.stringify(e.permissions)}`)});var wn=ft.literal({name:"entities",description:"Holds the subCommands for adding or removing allowedEntities"});wn.literal({name:"add",description:"Adds a entity to the allowed entities list"}).string("entity").executes((t,e)=>{let n=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!n)return t.reply("You are not in a region");let o=n.permissions.allowedEntities;o.push(e),n.changePermission("allowedEntities",o),t.reply(`Added entity ${e} to the allowed entities of the region your currently standing in`)});wn.literal({name:"remove",description:"Removes a entity from the allowed entities in the region"}).string("entity").executes((t,e)=>{let n=y.blockLocationInRegion(new Ce(t.sender.location.x,t.sender.location.y,t.sender.location.z),t.sender.dimension.id);if(!n)return t.reply("You are not in a region");let o=n.permissions.allowedEntities;if(!o.includes(e))return t.reply(`The entity ${e} is not allowed to enter the region`);o=o.filter(r=>r!=e),n.changePermission("allowedEntities",o),t.reply(`Removed entity ${e} to the allowed entities of the region your currently standing in`)});var pt=(r=>(r[r.member=0]="member",r[r.admin=1]="admin",r[r.moderator=2]="moderator",r[r.builder=3]="builder",r))(pt||{});var So=t=>isNaN(Number(t))===!1;function To(t){return Object.keys(t).filter(So).map(e=>t[e])}var gt=new u({name:"role",description:"Changes the role for a player",requires:t=>m(t)=="admin"||ye(t)});gt.literal({name:"set",description:"Sets the role for a player"}).argument(new p.playerName("playerName")).argument(new p.array("role",To(pt))).executes((t,e,n)=>{oe(e,n),t.reply(`Changed role of ${e} to ${n}`)});gt.literal({name:"get",description:"Gets the role of a player"}).argument(new p.playerName("playerName")).executes((t,e)=>{let n=m(e);t.reply(`${e} has role: ${n}`)});var yt=gt.literal({name:"owner",description:"Manages the owner"});yt.literal({name:"get",description:"Gets the owner of the world"}).executes(t=>{let e=ot(),n=a.ids.collection(),o=Object.keys(n).find(r=>n[r]===e);t.reply(`\xA7aServer Owner: ${o} (id: ${e})`)});yt.literal({name:"transfer",description:"Transfers the owner of the world",requires:t=>ye(t)}).argument(new p.player).executes((t,e)=>{K(t.sender,`Are you sure you want to transfer the server ownership to ${e.name}, this action is not reversible!`,()=>{he(e),t.reply(`\xA7aSet the server Owner to: ${e.name} (id: ${e.id})`)}),t.reply("\xA7aClose chat to confirm")});yt.literal({name:"clear",description:"clear's the owner of the world",requires:t=>ye(t)}).executes(t=>{K(t.sender,"Are you sure you want to clear the server owner, this action is not reversible!",()=>{he(null),t.reply('\xA7aCleared the server owner! run "/reload" or reload world to run "/function start" again!')}),t.reply("\xA7aClose chat to confirm")});import{ActionFormData as Po}from"@minecraft/server-ui";var L=class{constructor(e,n){this.title=e,this.body=n,this.form=new Po,e&&this.form.title(e),n&&this.form.body(n),this.buttons=[],this.triedToShow=0}addButton(e,n=null,o){return this.buttons.push({text:e,iconPath:n,callback:o}),this.form.button(e,n),this}show(e){this.form.show(e).then(n=>{if(n.canceled){if(n.cancelationReason=="userBusy"){if(this.triedToShow>200)return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)");this.triedToShow++,this.show(e)}return}this.buttons[n.selection].callback?.()})}};import{ModalFormData as Ao}from"@minecraft/server-ui";var Fe=class{constructor(e,n,o){this.form=e,this.player=n,this.callback=o}error(e){new Z("Error",e).setButton1("Return to form",()=>{this.form.show(this.player,this.callback)}).setButton2("Cancel",null).show(this.player)}};var R=class{constructor(e){this.title=e,this.form=new Ao,e&&this.form.title(e),this.args=[]}addDropdown(e,n,o){return this.args.push({type:"dropdown",options:n}),this.form.dropdown(e,n,o),this}addSlider(e,n,o,r,i){return this.args.push({type:"slider"}),this.form.slider(e,n,o,r,i),this}addToggle(e,n){return this.args.push({type:"toggle"}),this.form.toggle(e,n),this}addTextField(e,n,o){return this.args.push({type:"textField"}),this.form.textField(e,n,o),this}async show(e,n){for(let o=0;o<200;o++){let r=await this.form.show(e);if(r.cancelationReason!="userBusy"){n(new Fe(this,e,n),...r.formValues.map((i,s)=>this.args[s].type=="dropdown"?this.args[s].options[i]:i));return}}return e.tell("\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)")}};function En(t){new L("Manage Banned Items").addButton("Remove a Banned Item",null,()=>{xo(t)}).addButton("Ban an item",null,()=>{Ro(t)}).show(t)}function xo(t){new R("Remove Banned Items").addDropdown("Select item to remove",C("banned_items")).show(t,(e,n)=>{let o=C("banned_items");o=o.filter(r=>r!=n),X("banned_items",o),t.tell(`Removed Banned item "${n}"`)})}function Ro(t){new R("Add Banned Item").addTextField("Item Id","minecraft:string").show(t,(e,n)=>{let o=C("banned_items");if(o.includes(n))return e.error(`\xA7cItem "${n}" is already banned`);o.push(n),X("banned_items",o),t.tell(`Banned the item "${n}"`)})}function vn(t){new L("Manage Banned Blocks").addButton("Remove a Banned Block",null,()=>{Bo(t)}).addButton("Ban an block",null,()=>{No(t)}).show(t)}function Bo(t){new R("Remove Banned Block").addDropdown("Select block to remove",C("banned_blocks")).show(t,(e,n)=>{let o=C("banned_blocks");o=o.filter(r=>r!=n),X("banned_blocks",o),t.tell(`Removed Banned block "${n}"`)})}function No(t){new R("Add Banned Block").addTextField("Block Id","minecraft:barrier").show(t,(e,n)=>{let o=C("banned_blocks");if(o.includes(n))return e.error(`\xA7cBlock "${n}" is already banned`);o.push(n),X("banned_blocks",o),t.tell(`Banned the block "${n}"`)})}function Sn(t){new R("Manage Enchantment Levels").addDropdown("Enchantment to change",Object.keys(Ne),0).addTextField("Level (number)","5").show(t,(e,n,o)=>{if(isNaN(o))return e.error(`\xA7c"${o}" is not a number, please enter a value like, "3", "9", etc.`);let r=parseInt(o),i=C("enchantments");i[n]=r,X("enchantments",i),t.tell(`Set max level for ${n} to ${r}`)})}function Tn(t){new R("Manage Appeal Link").addTextField("Appeal Link",Me).show(t,(e,n)=>{X("appealLink",n),t.tell(`Changed the servers appeal link to ${n}`)})}function Pn(t){let e=new L("Manage Protections");for(let n of Object.values(ke))e.addButton(n.name,n.iconPath,()=>{Do(n,t)});e.addButton("Back","textures/ui/arrow_dark_left_stretch.png",()=>{ze(t)}).show(t)}function Do(t,e){let n=t.getConfig(),o=new R(`Manage ${t.name} Protection Config`).addToggle("Enabled",n.enabled),r=[];for(let[i,s]of Object.entries(t.configDefault))r.push(i),typeof s.defaultValue=="boolean"?o.addToggle(s.description,n[i]):typeof s.defaultValue=="number"?o.addSlider(s.description,0,100,1,n[i]):o.addTextField(s.description,null,n[i]);o.show(e,(i,s,...c)=>{s!=n.enabled&&(s&&t.enable(),s||t.disable());let l={enabled:s};for(let[d,g]of Object.keys(t.configDefault).entries())l[g]=c[d];t.setConfig(l),e.tell(`Updated config for ${t.name}!`)})}function ze(t){new L("Rubedo Settings").addButton("Auto Mod","textures/ui/permissions_op_crown.png",()=>{Pn(t)}).addButton("Banned items","textures/blocks/sculk_shrieker_top.png",()=>{En(t)}).addButton("Banned blocks","textures/blocks/barrier.png",()=>{vn(t)}).addButton("Enchantments","textures/items/book_enchanted.png",()=>{Sn(t)}).addButton("Appeal Link","textures/ui/Feedback.png",()=>{Tn(t)}).show(t)}new u({name:"settings",description:"Opens up the settings menu for the player",requires:t=>["admin","moderator"].includes(m(t))}).executes(t=>{ze(t.sender),t.sender.tell("\xA7aForm request sent, close chat to continue!")});import{world as An}from"@minecraft/server";function xn(t,e){if(t.hasTag("spectator")){if(t.runCommandAsync("gamemode c"),t.triggerEvent("removeSpectator"),t.removeTag("spectator"),!e)return;An.say({rawtext:[{translate:"multiplayer.player.joined",with:[`\xA7e${t.name}`]}]})}else{if(t.runCommandAsync("gamemode spectator"),t.triggerEvent("addSpectator"),t.addTag("spectator"),!e)return;An.say({rawtext:[{translate:"multiplayer.player.left",with:[`\xA7e${t.name}`]}]})}}new u({name:"vanish",description:"Toggles Vanish Mode on the sender",requires:t=>m(t)=="admin"}).executes(t=>{xn(t.sender,!1)}).boolean("say").executes((t,e)=>{xn(t.sender,e)});new u({name:"version",description:"Get Current Version",aliases:["v"]}).executes(t=>{t.reply(`Current Rubedo Version: ${Jt}`)});new u({name:"kick",description:"Kicks a player from the game",requires:t=>m(t)=="admin"}).argument(new p.player).string("reason").executes((t,e,n)=>{z(e,[n]),t.reply(`\xA7aKicked ${e.name} from world`)});var _=class{constructor(e){this.data=e,console.warn(`[LOG]: ${e.message}`),a.logs.set(Date.now().toString(),e)}};function ht(t){var e=6e4,n=e*60,o=n*24,r=o*30,i=o*365,s=Date.now()-t;return sm(t)=="admin"});Ee.literal({name:"add",description:"Adds a new log"}).string("message").executes((t,e)=>{new _({message:e}),t.reply(`\xA7aAdded new log: ${e}`)});Ee.literal({name:"getAll",description:"Gets all logs sorted in descending"}).int("page").array("order",["ascending","descending"]).executes((t,e,n)=>{let o=Object.entries(a.logs.collection()).sort((i,s)=>n=="ascending"?parseInt(s[0])-parseInt(i[0]):parseInt(i[0])-parseInt(s[0]));if(o.length==0)return t.reply("\xA7cNo Logs have been made!");let r=Math.ceil(o.length/8);e>r&&(e=r),t.reply(`\xA72--- Showing logs page ${e} of ${r} (${T}log getAll ) ---`);for(let[i,s]of o.slice(e*8-8,e*8))t.reply(`${ht(parseInt(i))}: ${s.message}`)});Ee.literal({name:"getPlayersLogs",description:"Gets all logs associated with a player"}).argument(new p.playerName).int("page").array("order",["ascending","descending"]).executes((t,e,n,o)=>{let r=Object.entries(a.logs.collection()).filter(s=>s[1].playerName==e).sort((s,c)=>o=="ascending"?parseInt(c[0])-parseInt(s[0]):parseInt(s[0])-parseInt(c[0]));if(r.length==0)return t.reply(`\xA7cNo Logs exists for "${e}"!`);let i=Math.ceil(r.length/8);n>i&&(n=i),t.reply(`\xA72--- Showing logs for "${e}" page ${n} of ${i} ---`);for(let[s,c]of r.slice(n*8-8,n*8))t.reply(`${ht(parseInt(s))}: ${c.message}`)});Ee.literal({name:"getProtectionLogs",description:"Gets all logs associated with a protection"}).string("protection").int("page").array("order",["ascending","descending"]).executes((t,e,n,o)=>{let r=Object.entries(a.logs.collection()).filter(s=>s[1].protection==e).sort((s,c)=>o=="ascending"?parseInt(c[0])-parseInt(s[0]):parseInt(s[0])-parseInt(c[0]));if(r.length==0)return t.reply(`\xA7cNo Logs exists for protection: "${e}"!`);let i=Math.ceil(r.length/8);n>i&&(n=i),t.reply(`\xA72--- Showing logs for Protection: "${e}" page ${n} of ${i} ---`);for(let[s,c]of r.slice(n*8-8,n*8))t.reply(`${ht(parseInt(s))}: ${c.message}`)});Ee.literal({name:"clearAll",description:"Clears all logs"}).executes(t=>{a.logs.clear(),t.reply("\xA7aCleared All logs!")});var _o=new u({name:"teleport",description:"Teleports entities (players, mobs, etc.).",aliases:["tp"],requires:t=>m(t)=="admin"});_o.argument(new p.player).location("destination").executes((t,e,n)=>{e.addTag("skip-movement-check"),e.teleport(n,e.dimension,0,0),t.reply(`Teleported ${e.name} to ${n.x} ${n.y} ${n.z}`)});V(t=>{try{let e=a.bans.get(t.id);if(!e)return;if(e.expire&&e.expire{console.warn(new Error("Failed to kick player")),a.bans.delete(t.id)})}catch(e){console.warn(e+e.stack)}},20);import{Location as Oo}from"@minecraft/server";V(t=>{try{let e=a.freezes.get(t.id);if(!e)return t.getComponent("movement").resetToDefaultValue();t.getComponent("movement").setCurrent(0),t.teleport(new Oo(e.location.x,e.location.y,e.location.z),h[e.location.dimension],0,0)}catch{}},200);import{world as $o}from"@minecraft/server";var bt={};$o.events.beforeChat.subscribe(t=>{if(!t.message.startsWith(T))for(let e of Object.values(bt))e.callback(t)});var Ve=class{static subscribe(e){let n=Date.now();return bt[n]={callback:e},n}static unsubscribe(e){delete bt[e]}};Ve.subscribe(t=>{let e=N.getMuteData(t.sender);if(!!e){if(e.expire&&e.expire{Re()},6e3);kt.events.beforeItemUseOn.subscribe(t=>{if(["moderator","admin"].includes(m(t.source)))return;let e=y.blockLocationInRegion(t.blockLocation,t.source.dimension.id);if(!e)return;let n=t.source.dimension.getBlock(t.blockLocation);Kt.includes(n.typeId)&&e.permissions.doorsAndSwitches||Ht.includes(n.typeId)&&e.permissions.openContainers||(t.cancel=!0)});kt.events.beforeExplosion.subscribe(t=>{for(let e=0;e{let e=await y.blockLocationInRegionSync(new Fo(t.location.x,t.location.y,t.location.z),t.dimension.id);!e||e.permissions.allowedEntities.includes(t.typeId)||(t.teleport({x:0,y:-64,z:0},t.dimension,0,0),t.kill())});I.subscribe(()=>{Rn.runSchedule(async()=>{for(let t of await y.getAllRegionsSync())for(let e of h[t.dimensionId].getEntities({excludeTypes:t.permissions.allowedEntities}))!t.entityInRegion(e)||(e.teleport({x:0,y:-64,z:0},e.dimension,0,0),e.kill())},100)});V(t=>{for(let e of y.getAllRegions())e.entityInRegion(t)?(t.addTag("inRegion"),e.permissions.pvp||t.addTag("region-protected")):(t.removeTag("inRegion"),t.removeTag("region-protected"))},5);import{world as zo}from"@minecraft/server";zo.events.playerJoin.subscribe(async({player:t})=>{if(await I.awaitLoad(),De()&&m(t)!="admin")return z(t,P["lockdown.kick.message"]());N.getMuteData(t)&&t.runCommandAsync("ability @s mute true"),a.ids.has(t.name)?t.addTag("old"):a.ids.set(t.name,t.id);let e=M.getPlayersRoleToSet(t.name);e&&oe(t,e)});import{Items as Vo,MinecraftItemTypes as O,world as It}from"@minecraft/server";var Bn=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],jo=[10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34,37,38,39,40,41,42,43];function Yo(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let r=0;r{l.PageAction("moderation:see_inventory",{name:i.name})}}}}function Go(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let l=0;l{l.PageAction("moderation:see_ender_chest",{name:n.name})}};let i=[...It.getPlayers()].find(l=>l.name==n.name);i||(Object.values(x).find(d=>d.entity.id==t.id).despawn(),i.tell(`"${n.name}" Could not be found, Gui Crashed`));let s=i.getComponent("inventory").container,c=0;for(let l=0;l{l<9?i.runCommandAsync(`replaceitem entity @s slot.hotbar ${l} air`):i.runCommandAsync(`replaceitem entity @s slot.inventory ${l-9} air`),J.GiveAction(),e.slots[g]={item:null,action:He=>{s.addItem(He.getItemAdded())}}}}}}async function Ko(t,e,n){let o=t.getComponent("minecraft:inventory").container;for(let c=0;cc.name==n?.name);r||(Object.values(x).find(l=>l.entity.id==t.id).despawn(),r.tell(`"${n.name}" Could not be found, Gui Crashed`));let i=0,s=Object.values(O);for(let c of s)try{await r.runCommandAsync(`testfor @s[hasitem={item=${c.id},location=slot.enderchest}]`);let l=new w(c,{nameTag:"Note: \xA7l\xA7cThis is not the exact item"}),d=jo[i];o.setItem(d,l.itemStack),e.slots[d]={item:l,action:g=>{g.GiveAction(),e.slots[d]=null}},i++}catch{}}new Y("moderation:see",Yo).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("home")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});new Y("moderation:see_inventory",Go).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("moderation:see")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});new Y("moderation:see_ender_chest",Ko).setSlots([50],new w(O.arrow,{nameTag:"\xA7fBack"}),t=>{t.PageAction("moderation:see")}).setSlots([48],new w(O.barrier,{nameTag:"\xA7cClose GUI"}),t=>{t.CloseAction()});import{Player as Ho,MinecraftBlockTypes as Uo}from"@minecraft/server";import{system as Nn,world as Mn}from"@minecraft/server";var k=class{constructor(e,n,o,r){this.name=e;this.description=n;this.iconPath=o;this.isEnabledByDefault=r;this.name=e,this.description=n,this.iconPath=o,this.configDefault={},this.isEnabled=!1,this.isEnabledByDefault=r,this.events={},this.schedules=[],this.forEachValidPlayers=[],ke[this.name]=this}setConfigDefault(e){return this.configDefault=e,a.protections.hasSync(this.name).then(n=>{if(n)return;let o={enabled:!0};for(let r of Object.keys(e))o[r]=e[r].defaultValue;a.protections.set(this.name,o)}),this}getConfig(){let e=a.protections.get(this.name);return e||(e={enabled:this.isEnabled}),e}async setConfig(e){return a.protections.set(this.name,e)}triggerChange(e){if(e){this.isEnabled=!0,this.onEnableCallback?.();for(let[n,o]of Object.entries(this.events)){if(o.triggered)continue;let r=Mn.events[n].subscribe(o.callback);o.triggered=!0,o.callback=r}for(let n of this.forEachValidPlayers){if(n.key)continue;let o=V(n.callback,n.delay);n.key=o}for(let n of this.schedules){if(n.runScheduleId)continue;let o=Nn.runSchedule(n.callback);n.runScheduleId=o}}else{this.isEnabled=!1,this.onDisableCallback?.();for(let[n,o]of Object.entries(this.events))!o.triggered||(Mn.events[n].unsubscribe(o.callback),o.triggered=!1);for(let n of this.forEachValidPlayers)!n.key||(nn(n.key),n.key=null);for(let n of this.schedules)!n.runScheduleId||(Nn.clearRunSchedule(n.runScheduleId),n.runScheduleId=null)}}onEnable(e){return this.onEnableCallback=e,this}onDisable(e){return this.onDisableCallback=e,this}subscribe(e,n){return this.events[e]={callback:n,triggered:!1},this}runSchedule(e,n){return this.schedules.push({callback:e,tickInterval:n,runScheduleId:null}),this}forEachValidPlayer(e,n=0){return this.forEachValidPlayers.push({callback:e,delay:n,key:null}),this}enable(){this.triggerChange(!0)}disable(){this.triggerChange(!1)}};var qo=["minecraft:command_block_minecart"],je=new k("cbe","Stops CBE","textures/blocks/command_block.png",!0).setConfigDefault({entityCreate:{description:"Adds NPC protection",defaultValue:!0},banSpawnEggs:{description:"If spawn eggs should be banned",defaultValue:!0}});je.subscribe("entityCreate",({entity:t})=>{if(!je.getConfig().entityCreate)return;let n=()=>{try{t.triggerEvent("despawn"),t.kill()}catch{t.kill()}};if(qo.includes(t.typeId)||t.typeId=="minecraft:npc"&&!se.isValid(t))return n()});je.subscribe("beforeItemUseOn",t=>{if(!(t.source instanceof Ho)||["admin","moderator"].includes(m(t.source)))return;let e=je.getConfig();if(t.item.typeId.endsWith("spawn_egg")){if(!e.banSpawnEggs||t.source.dimension.getBlock(t.blockLocation).typeId==Uo.mobSpawner.id)return;t.cancel=!0,t.source.tell("\xA7c[Rubedo]: You cannot place spawnEggs on the floor!"),t.source.playSound("note.bass")}else{if(Qt.includes(t.item.typeId)){t.cancel=!0;return}if(!C("banned_blocks").includes(t.item.typeId))return;t.cancel=!0,new A(t.source,null,"Placing Banned Blocks")}});var Ct=32e4;new k("crasher","Protection against type 1 crasher","textures/ui/servers.png",!0).forEachValidPlayer(t=>{(Math.abs(t.location.x)>Ct||Math.abs(t.location.y)>Ct||Math.abs(t.location.z)>Ct)&&new A(t,null,"Crasher detected")});import{GameMode as Qo,world as Xo}from"@minecraft/server";import{world as Wo}from"@minecraft/server";var E=class{constructor(){this.data=new Map,this.events={playerLeave:Wo.events.playerLeave.subscribe(e=>this.data.delete(e.playerName))}}set(e,n){this.data.set(e.name,n)}get(e){return this.data.get(e.name)}delete(e){this.data.delete(e.name)}clear(){this.data.clear()}playerNames(){return[...this.data.keys()]}includes(e){return this.playerNames().includes(e.name)}};var Jo=Qo.creative,Dn=new E,Ln=new k("gamemode","Blocks illegal gamemode","textures/ui/creative_icon.png",!0).setConfigDefault({clearPlayer:{description:"Whether to clear players inventory.",defaultValue:!0},setToSurvival:{description:"If player should be set to survival after being flagged.",defaultValue:!0},banPlayer:{description:"If player should be banned after violation count is met.",defaultValue:!1},violationCount:{description:"The amount of violations before ban.",defaultValue:0}});Ln.runSchedule(()=>{let t=Ln.getConfig();for(let e of Xo.getPlayers({gameMode:Jo})){if(["moderator","admin","builder"].includes(m(e)))continue;try{t.setToSurvival&&e.runCommandAsync("gamemode s"),t.clearPlayer&&e.runCommandAsync("clear @s")}catch{}new _({playerName:e.name,protection:"Gamemode",message:`${e.name} has entered into a illegal gamemode!`});let n=(Dn.get(e)??0)+1;Dn.set(e,n),t.banPlayer&&n>=t.violationCount&&new A(e,null,"Illegal Gamemode")}},20);import{world as tr,Location as nr,system as or}from"@minecraft/server";import{system as Zo,world as er}from"@minecraft/server";var Ye=class{constructor(e){this.emptySlotsCount=e.emptySlotsCount,this.size=e.size,this.items=[];for(let n=0;n{Ge={};for(let t of er.getPlayers()){if(t.dimension.id!="minecraft:overworld")continue;let e=Rt(t.location),n=e.offset(Q.x,Q.y,Q.z),o=e.offset(-Q.x,-Q.y,-Q.z);for(let r of n.blocksBetween(o)){if(r.y<-64)continue;let i=t.dimension.getBlock(r);!i||!Be.includes(i.typeId)||(Ge[JSON.stringify(r)]=new Ye(i.getComponent("inventory").container))}}},100);var wt={};tr.events.blockBreak.subscribe(t=>{for(let e of Object.values(wt))e.callback(new Et(t.block,t.brokenBlockPermutation,t.dimension,t.player))});var ve=class{static subscribe(e){let n=Date.now();return wt[n]={callback:e},n}static unsubscribe(e){delete wt[e]}},Et=class{constructor(e,n,o,r){this.block=e;this.brokenBlockPermutation=n;this.dimension=o;this.player=r;this.block=e,this.brokenBlockPermutation=n,this.dimension=o,this.player=r}set cancel(e){if(this.dimension.getBlock(this.block.location).setPermutation(this.brokenBlockPermutation.clone()),Be.includes(this.brokenBlockPermutation.type.id)){let n=Ge[JSON.stringify(this.block.location)];n&&n.load(this.block.getComponent("inventory").container)}or.run(()=>{[...this.dimension.getEntities({maxDistance:2,type:"minecraft:item",location:new nr(this.block.location.x,this.block.location.y,this.block.location.z)})].forEach(n=>n.kill())})}};var _n=new E,rr=15,ir=["snow","lush_plants_replaceable","azalea_log_replaceable","minecraft:crop","fertilize_area"],sr=["minecraft:water","minecraft:flowing_water","minecraft:lava","minecraft:flowing_lava","minecraft:bedrock"],On=new E,$n=null,Fn=new k("nuker","Blocks block breaking too fast","textures/blocks/dirt.png",!0).setConfigDefault({banPlayer:{description:"If the player should be banned once violation count is met",defaultValue:!1},violationCount:{description:"Violations before ban",defaultValue:0}});Fn.onEnable(()=>{let t=Fn.getConfig();$n=ve.subscribe(e=>{if(["moderator","admin"].includes(m(e.player))||e.block.getTags().some(o=>ir.includes(o)))return;let n=_n.get(e.player);if(_n.set(e.player,Date.now()),!!n){if(!sr.includes(e.block.typeId)){if(n=t.violationCount&&new A(e.player,null,"Using Nuker")}e.cancel=!0}})}).onDisable(()=>{ve.unsubscribe($n)});var zn=new E,Vn=new E,jn=new k("spam","Blocks spam in chat","textures/ui/mute_on.png",!0).setConfigDefault({permMutePlayer:{description:"If player should be permanently muted once violation count is met.",defaultValue:!1},violationCount:{description:"Violation count before permanent mute",defaultValue:0},repeatedMessages:{description:"Blocks repeated messages",defaultValue:!0},zalgo:{description:"Blocks zalgo",defaultValue:!0}});jn.subscribe("beforeChat",t=>{try{if(t.message.startsWith(T)||["admin","moderator"].includes(m(t.sender)))return;let e=jn.getConfig(),n=()=>{let o=(Vn.get(t.sender)??0)+1;Vn.set(t.sender,o),e.permMutePlayer&&o>=e.violationCount&&new N(t.sender,null,"Spamming")};if(e.repeatedMessages&&zn.get(t.sender)==t.message)return t.cancel=!0,n(),t.sender.tell("\xA7cRepeated message detected!");if(e.zalgo&&/%CC%/g.test(encodeURIComponent(t.message)))return t.cancel=!0,n(),t.sender.tell("\xA7cYou message contains some type of zalgo and cannot be sent!");zn.set(t.sender,t.message)}catch(e){console.warn(e+e.stack)}});var Yn=new E;function Ke(t,e){let n=t.getComponent("inventory").container,o=n.getItem(e),r=C("cbe_config");if(r.clearItem&&n.setItem(e,v),new _({playerName:t.name,message:`${t.name} Has obtained a unobtainable item: ${o.typeId}`,protection:"unobtainable"}),!r.banPlayer)return;let i=(Yn.get(t)??0)+1;Yn.set(t,i),!(i{console.warn("unobtainable");let e=C("banned_items"),n=t.getComponent("inventory").container;for(let o=0;oc||s.level<1||i.includes(s.type.id))return Ke(t,o);i.push(s.type.id)}}});import{MinecraftBlockTypes as S,MinecraftEntityTypes as ar,MinecraftItemTypes as G,Player as cr}from"@minecraft/server";var lr=[S.chest.id,S.trappedChest.id,S.barrel.id,S.dispenser.id,S.dropper.id,S.furnace.id,S.litFurnace.id,S.blastFurnace.id,S.litBlastFurnace.id,S.smoker.id,S.litSmoker.id,S.hopper.id,S.beehive.id,S.beeNest.id,S.mobSpawner.id],mr=[G.chestBoat.id,G.oakChestBoat.id,G.birchChestBoat.id,G.acaciaChestBoat.id,G.jungleChestBoat.id,G.spruceChestBoat.id,G.darkOakChestBoat.id,G.mangroveChestBoat.id];new k("nbt","Blocks illegal nbt on items","textures/ui/icon_random.png",!0).subscribe("blockPlace",async({block:t})=>{if(!lr.includes(t.typeId))return;let e=t.permutation;await t.dimension.runCommandAsync(`setblock ${t.x} ${t.y} ${t.z} ${t.typeId}`),t.setPermutation(e)}).subscribe("beforeItemUseOn",t=>{t.source instanceof cr&&(!mr.includes(t.item.typeId)||(t.cancel=!0,t.source.dimension.spawnEntity(ar.chestBoat.id,t.blockLocation.above()),rn(t.source)!="creative"&&t.source.getComponent("inventory").container.setItem(t.source.selectedSlot,v)))});import{MinecraftEffectTypes as gr,MinecraftItemTypes as Xn,Player as Tt}from"@minecraft/server";import{system as ur,world as dr}from"@minecraft/server";var vt={};function fr(t,e){return!(t.x!=e.x||t.y!=e.y||t.z!=e.z)}var St=new E;ur.runSchedule(()=>{let t=(e,n)=>{for(let o of Object.values(vt))o.callback(e,n)};for(let e of dr.getPlayers()){let n=St.get(e);n&&fr(e.location,n.location)||(St.set(e,{location:e.location,dimension:e.dimension}),n&&t(e,n))}});var $=class{static subscribe(e){let n=Date.now();return vt[n]={callback:e},n}static unsubscribe(e){delete vt[e]}static delete(e){St.delete(e)}};var Gn={walk:{velocity:.17,distance:.23},run:{velocity:.19,distance:.35}},Kn=.056,Hn=10,Un=["gliding","riding"];var qn=new E;function yr(t,e){return Math.hypot(e.x-t.x,e.z-t.z)}function hr(t){return(t.getEffect(gr.speed)?.amplifier??0)*Kn}function br(t,e){let n=hr(e),o=Gn.run.distance+.8;return t>n+o}function Wn(t,e){let n=(qn.get(t)??0)+1;qn.set(t,n),$.delete(t),!(n<3)&&t.teleport(e.location,e.dimension,t.rotation.x,t.rotation.y)}var Qn=null,Se=new k("movement","Blocks illegal movements on players","textures/ui/move.png",!0).setConfigDefault({tpCheck:{description:"If teleports should be flagged",defaultValue:!0}});Se.onEnable(()=>{let t=Se.getConfig();Qn=$.subscribe((e,n)=>{if(m(e)=="admin"||e.dimension.id!=n.dimension.id||e.getTags().some(r=>Un.includes(r)))return;let o=yr(e.location,n.location);if(e.hasTag("skip-movement-check"))return e.removeTag("skip-movement-check");if(o>Hn){if(!t.tpCheck)return;Wn(e,n)}else{if(!br(o,e))return;Wn(e,n)}})}).onDisable(()=>{$.unsubscribe(Qn)});Se.subscribe("dataDrivenEntityTriggerEvent",t=>{t.entity instanceof Tt&&t.id=="on_death"&&$.delete(t.entity)});Se.subscribe("projectileHit",({projectile:t,source:e})=>{t.typeId==Xn.enderPearl.id&&e instanceof Tt&&$.delete(e)});Se.subscribe("itemCompleteCharge",({itemStack:t,source:e})=>{t.typeId==Xn.chorusFruit.id&&e instanceof Tt&&$.delete(e)});import{MinecraftEffectTypes as kr,Player as Ir,world as Jn}from"@minecraft/server";var Cr=Jn.events.beforeDataDrivenEntityTriggerEvent.subscribe(t=>{if(!(t.entity instanceof Ir)||t.id!="rubedo:becomeAdmin")return;t.entity.removeTag("CHECK_PACK");let e=tn();if(e)return t.entity.playSound("note.bass"),t.entity.tell(`\xA7cFailed to give server owner: "${e}" is already owner!`),Jn.events.beforeDataDrivenEntityTriggerEvent.unsubscribe(Cr);oe(t.entity,"admin"),he(t.entity),t.entity.addEffect(kr.blindness,3,255,!0),t.entity.tell('\xA7aYou have now been set as the "owner" of this server. The command "/function start" will not do anything anymore, type "-help" for more information!')});import{DynamicPropertiesDefinition as eo,MinecraftEntityTypes as wr,world as to}from"@minecraft/server";var Zn=[];to.events.worldInitialize.subscribe(({propertyRegistry:t})=>{let e=new eo;e.defineString("role",30),t.registerEntityTypeDynamicProperties(e,wr.player);let n=new eo;n.defineString("worldsOwner",100),n.defineBoolean("isLockDown"),t.registerWorldDynamicProperties(n);for(let o of Zn)to.scoreboard.addObjective(o.objective,o.displayName??"")});var $e=[];function In(){$e=[]}console.warn("----- Importing Plugins -----");import{DynamicPropertiesDefinition as Er,EntityTypes as vr,world as Sr}from"@minecraft/server";Sr.events.worldInitialize.subscribe(({propertyRegistry:t})=>{h.overworld.runCommandAsync(`tickingarea add ${B.x} ${B.y} ${B.z} ${B.x} ${B.y} ${B.z} db true`);let e=new Er;e.defineString("tableName",30),e.defineNumber("index"),t.registerEntityTypeDynamicProperties(e,vr.get(ae))});console.warn("---- STARTING RUBEDO ----");Ar.events.beforeWatchdogTerminate.subscribe(t=>{t.cancel=!0,console.warn(`WATCHDOG TRIED TO CRASH = ${t.terminateReason}`)});var v=new Tr(Pr.stick,0);export{v as AIR}; +// project/behavior/src/index.ts +import { + ItemStack as ItemStack5, + MinecraftItemTypes as MinecraftItemTypes7, + system as system14 +} from "@minecraft/server"; + +// project/behavior/src/lib/Command/index.ts +import { world as world4 } from "@minecraft/server"; + +// project/behavior/src/config/commands.ts +var PREFIX = "-"; + +// project/behavior/src/lib/Command/ArgumentTypes.ts +import { world as world3 } from "@minecraft/server"; + +// project/behavior/src/database/Database.ts +import { ItemStack, MinecraftItemTypes } from "@minecraft/server"; + +// project/behavior/src/config/database.ts +import { BlockLocation } from "@minecraft/server"; +var MAX_DATABASE_STRING_SIZE = 32e3; +var ENTITY_IDENTIFIER = "rubedo:database"; +var ENTITY_LOCATION = new BlockLocation(0, -64, 0); +var INVENTORY_SIZE = 128; + +// project/behavior/src/lib/Events/EntitiesLoad.ts +import { system as system2, world as world2 } from "@minecraft/server"; + +// project/behavior/src/utils.ts +import { + BlockLocation as BlockLocation2, + MinecraftDimensionTypes, + system, + world +} from "@minecraft/server"; + +// project/behavior/src/lib/Form/Models/MessageForm.ts +import { MessageFormData } from "@minecraft/server-ui"; + +// project/behavior/src/config/form.ts +var TIMEOUT_THRESHOLD = 200; + +// project/behavior/src/lib/Form/Models/MessageForm.ts +var MessageForm = class { + constructor(title, body) { + this.title = title; + this.body = body; + this.form = new MessageFormData(); + if (title) + this.form.title(title); + if (body) + this.form.body(body); + this.triedToShow = 0; + } + setButton1(text2, callback) { + this.button1 = { text: text2, callback }; + this.form.button1(text2); + return this; + } + setButton2(text2, callback) { + this.button2 = { text: text2, callback }; + this.form.button2(text2); + return this; + } + show(player) { + this.form.show(player).then((response) => { + if (response.canceled) { + if (response.cancelationReason == "userBusy") { + if (this.triedToShow > TIMEOUT_THRESHOLD) + return player.tell( + `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` + ); + this.triedToShow++; + this.show(player); + } + return; + } + if (response.selection == 1) + this.button1?.callback?.(); + if (response.selection == 0) + this.button2?.callback?.(); + }); + } +}; + +// project/behavior/src/utils.ts +var DIMENSIONS = { + overworld: world.getDimension(MinecraftDimensionTypes.overworld), + nether: world.getDimension(MinecraftDimensionTypes.nether), + theEnd: world.getDimension(MinecraftDimensionTypes.theEnd), + "minecraft:overworld": world.getDimension(MinecraftDimensionTypes.overworld), + "minecraft:nether": world.getDimension(MinecraftDimensionTypes.nether), + "minecraft:the_end": world.getDimension(MinecraftDimensionTypes.theEnd) +}; +function durationToMs(duration) { + const values = duration.split(","); + console.warn(values.length); + let ms = 0; + for (const value of values) { + const length = parseInt(value.match(/\D+|\d+/g)[0]); + const unit = value.match(/\D+|\d+/g)[1]; + if (unit == "y") + ms = ms + 317098e-16 * length; + if (unit == "w") + ms = ms + 6048e5 * length; + if (unit == "d") + ms = ms + 864e5 * length; + if (unit == "h") + ms = ms + 36e5 * length; + if (unit == "m") + ms = ms + 6e4 * length; + if (unit == "s") + ms = ms + 1e3 * length; + if (unit == "ms") + ms = ms + length; + } + return ms; +} +function msToTime(duration) { + return new Date(duration).toString(); +} +function vector3ToBlockLocation(loc) { + return new BlockLocation2( + Math.floor(loc.x), + Math.floor(loc.y), + Math.floor(loc.z) + ); +} +function confirmAction(player, action, onConfirm, onCancel = () => { +}) { + new MessageForm("Confirm To Continue", action).setButton1("Confirm", onConfirm).setButton2("Never Mind", onCancel).show(player); +} +function sleep(tick) { + return new Promise((resolve) => { + let runScheduleId = system.runSchedule(() => { + resolve(); + system.clearRunSchedule(runScheduleId); + }, tick); + }); +} +function LocationEquals(a, b) { + let aLocations = [a.x, a.y, a.z]; + let bLocations = [a.x, a.y, a.z]; + if (a instanceof BlockLocation2 || b instanceof BlockLocation2) { + aLocations = aLocations.map((v) => Math.trunc(v)); + bLocations = bLocations.map((v) => Math.trunc(v)); + } + return aLocations.find((v, i) => bLocations[i] != v) ? false : true; +} +function sort3DVectors(vector1, vector2) { + const { x: x1, y: y1, z: z1 } = vector1; + const { x: x2, y: y2, z: z2 } = vector2; + const ox1 = x1 < x2 ? x1 : x2; + const oy1 = y1 < y2 ? y1 : y2; + const oz1 = z1 < z2 ? z1 : z2; + const ox2 = x1 < x2 ? x2 : x1; + const oy2 = y1 < y2 ? y2 : y1; + const oz2 = z1 < z2 ? z2 : z1; + return [ + { x: ox1, y: oy1, z: oz1 }, + { x: ox2, y: oy2, z: oz2 } + ]; +} +function betweenVector3(target, vector1, vector2) { + const [{ x: x1, y: y1, z: z1 }, { x: x2, y: y2, z: z2 }] = sort3DVectors( + vector1, + vector2 + ); + let { x, y, z } = target; + return x >= x1 && x <= x2 && y >= y1 && y <= y2 && z >= z1 && z <= z2; +} +function chunkString(str, length) { + return str.match(new RegExp(".{1," + length + "}", "g")); +} + +// project/behavior/src/lib/Events/EntitiesLoad.ts +var CALLBACKS = {}; +var ENTITIES_LOADED = false; +system2.run(async () => { + try { + await DIMENSIONS.overworld.runCommandAsync(`testfor @a`); + ENTITIES_LOADED = true; + for (const [i, callback] of Object.entries(CALLBACKS)) { + callback(); + delete CALLBACKS[i]; + } + } catch (error) { + let e2 = world2.events.entityCreate.subscribe((data) => { + system2.run(() => { + ENTITIES_LOADED = true; + for (const [i, callback] of Object.entries(CALLBACKS)) { + callback(); + delete CALLBACKS[i]; + } + world2.events.entityCreate.unsubscribe(e2); + }); + }); + } +}); +var EntitiesLoad = class { + static async awaitLoad() { + if (ENTITIES_LOADED) + return; + return new Promise((resolve) => { + EntitiesLoad.subscribe(resolve); + }); + } + static subscribe(callback) { + if (ENTITIES_LOADED) { + callback(); + return; + } + const key = Object.keys(CALLBACKS).length; + CALLBACKS[key] = callback; + return key; + } + static unsubscribe(key) { + delete CALLBACKS[key]; + } +}; + +// project/behavior/src/database/Database.ts +var Database = class { + constructor(tableName) { + this.tableName = tableName; + this.tableName = tableName; + this.MEMORY = null; + this.QUEUE = []; + EntitiesLoad.subscribe(async () => { + await this.initData(); + this.QUEUE.forEach((v) => v()); + }); + } + static createTableEntity(tableName, index) { + const entity = DIMENSIONS.overworld.spawnEntity( + ENTITY_IDENTIFIER, + ENTITY_LOCATION + ); + entity.setDynamicProperty("tableName", tableName); + entity.nameTag = `\xA7aDatabase Table: ${tableName}\xA7r`; + if (index) + entity.setDynamicProperty("index", index); + return entity; + } + static getTableEntities(tableName) { + return DIMENSIONS.overworld.getEntitiesAtBlockLocation(ENTITY_LOCATION).filter( + (e2) => e2.typeId == ENTITY_IDENTIFIER && e2.getDynamicProperty("tableName") == tableName + ); + } + async addQueueTask() { + return new Promise((resolve) => { + this.QUEUE.push(resolve); + }); + } + async saveData() { + if (!this.MEMORY) + await this.addQueueTask(); + let entities = Database.getTableEntities(this.tableName); + let chunks = chunkString( + JSON.stringify(this.MEMORY), + MAX_DATABASE_STRING_SIZE + ); + const entitiesNeeded = Math.ceil(chunks.length / INVENTORY_SIZE) - entities.length; + if (entitiesNeeded > 0) { + for (let i = 0; i < entitiesNeeded; i++) { + entities.push(Database.createTableEntity(this.tableName)); + } + } + for (const [i, entity] of entities.entries()) { + const inventory = entity.getComponent("inventory").container; + for (const [i2, chunk] of chunks.entries()) { + if (!chunk) + continue; + if (i2 > inventory.size - 1) + break; + let item = new ItemStack(MinecraftItemTypes.acaciaBoat); + item.nameTag = chunk; + inventory.setItem(i2, item); + chunks[i2] = null; + } + for (let i2 = chunks.length + 1; i2 < inventory.size; i2++) { + inventory.setItem(i2, new ItemStack(MinecraftItemTypes.stick, 0)); + } + entity.setDynamicProperty("index", i); + entities[i] = null; + if (!chunks.find((v) => v)) + break; + } + entities.filter((e2) => e2).forEach((e2) => e2.triggerEvent("despawn")); + return; + } + async initData() { + let entities = Database.getTableEntities(this.tableName).sort( + (a, b) => a.getDynamicProperty("index") - b.getDynamicProperty("index") + ); + let stringifiedData = ""; + for (const entity of entities) { + const inventory = entity.getComponent("inventory").container; + for (let i = 0; i < inventory.size; i++) { + const item = inventory.getItem(i); + if (!item) + continue; + stringifiedData = stringifiedData + item.nameTag; + } + } + const data = stringifiedData == "" ? {} : JSON.parse(stringifiedData); + this.MEMORY = data; + return data; + } + async set(key, value) { + this.MEMORY[key] = value; + return this.saveData(); + } + get(key) { + if (!this.MEMORY) + throw new Error( + "Entities not loaded! Consider using `getAsync` instead!" + ); + return this.MEMORY[key]; + } + async getSync(key) { + if (this.MEMORY) + return this.get(key); + await this.addQueueTask(); + return this.MEMORY[key]; + } + keys() { + if (!this.MEMORY) + throw new Error( + "Entities not loaded! Consider using `keysSync` instead!" + ); + return Object.keys(this.MEMORY); + } + async keysSync() { + if (this.MEMORY) + return this.keys(); + await this.addQueueTask(); + return Object.keys(this.MEMORY); + } + values() { + if (!this.MEMORY) + throw new Error( + "Entities not loaded! Consider using `valuesSync` instead!" + ); + return Object.values(this.MEMORY); + } + async valuesSync() { + if (this.MEMORY) + return this.values(); + await this.addQueueTask(); + return Object.values(this.MEMORY); + } + has(key) { + if (!this.MEMORY) + throw new Error("Entities not loaded! Consider using `hasSync` instead!"); + return Object.keys(this.MEMORY).includes(key); + } + async hasSync(key) { + if (this.MEMORY) + return this.has(key); + await this.addQueueTask(); + return Object.keys(this.MEMORY).includes(key); + } + collection() { + if (!this.MEMORY) + throw new Error( + "Entities not loaded! Consider using `collectionSync` instead!" + ); + return this.MEMORY; + } + async collectionSync() { + if (this.MEMORY) + return this.collection(); + await this.addQueueTask(); + return this.MEMORY; + } + async delete(key) { + const status = delete this.MEMORY[key]; + await this.saveData(); + return status; + } + async clear() { + this.MEMORY = {}; + return await this.saveData(); + } +}; + +// project/behavior/src/database/tables.ts +var TABLES = { + config: new Database("config"), + freezes: new Database("freezes"), + mutes: new Database("mutes"), + bans: new Database("bans"), + regions: new Database("regions"), + roles: new Database("roles"), + tasks: new Database("tasks"), + npcs: new Database("npcs"), + ids: new Database("ids"), + logs: new Database("logs"), + protections: new Database("protections") +}; + +// project/behavior/src/lib/Command/ArgumentTypes.ts +function fetch(playerName) { + return [...world3.getPlayers()].find((player) => player.name === playerName); +} +var LiteralArgumentType = class { + constructor(name = "literal") { + this.name = name; + this.typeName = "literal"; + this.name = name; + } + matches(value) { + return { + success: this.name == value + }; + } + fail(value) { + return `${value} should be ${this.name}!`; + } +}; +var StringArgumentType = class { + constructor(name = "string") { + this.name = name; + this.typeName = "string"; + this.name = name; + } + matches(value) { + return { + success: value && value != "", + value + }; + } + fail(value) { + return `Value must be of type string!`; + } +}; +var IntegerArgumentType = class { + constructor(name = "integer") { + this.name = name; + this.typeName = "int"; + this.name = name; + } + matches(value) { + return { + success: !isNaN(value), + value: parseInt(value) + }; + } + fail(value) { + return `Value must be valid number!`; + } +}; +var FloatArgumentType = class { + constructor(name = "float") { + this.name = name; + this.typeName = "float"; + this.name = name; + } + matches(value) { + return { + success: Boolean(value?.match(/^\d+\.\d+$/)?.[0]), + value: parseInt(value) + }; + } + fail(value) { + return `Value must be valid float!`; + } +}; +var LocationArgumentType = class { + constructor(name = "location") { + this.name = name; + this.typeName = "location"; + this.name = name; + } + matches(value) { + return { + success: /^([~^]{0,1}(-\d)?(\d*)?(\.(\d+))?)$/.test(value), + value + }; + } + fail(value) { + return `Value needs to be a valid number, value can include: [~,^]`; + } +}; +var BooleanArgumentType = class { + constructor(name = "boolean") { + this.name = name; + this.typeName = "boolean"; + this.name = name; + } + matches(value) { + return { + success: Boolean(value?.match(/^(true|false)$/)?.[0]), + value: value == "true" ? true : false + }; + } + fail(value) { + return `"${value}" can be either "true" or "false"`; + } +}; +var PlayerArgumentType = class { + constructor(name = "player") { + this.name = name; + this.typeName = "Player"; + this.name = name; + } + matches(value) { + return { + success: fetch(value) ? true : false, + value: fetch(value) + }; + } + fail(value) { + return `player: "${value}", is not in this world`; + } +}; +var TargetArgumentType = class { + constructor(name = "target") { + this.name = name; + this.typeName = "Target"; + this.name = name; + } + matches(value) { + return { + success: Boolean(value?.match(/^(@.|"[\s\S]+")$/)?.[0]), + value + }; + } + fail(value) { + return `${value} is not a valid target`; + } +}; +var ArrayArgumentType = class { + constructor(name = "array", types) { + this.name = name; + this.types = types; + this.typeName = "string"; + this.name = name; + this.types = types; + this.typeName = types.join(" | ").replace(/(.{25})..+/, "$1..."); + } + matches(value) { + return { + success: this.types.includes(value), + value + }; + } + fail(value) { + return `"${value}" must be one of these values: ${this.types.join(" | ")}`; + } +}; +var DurationArgumentType = class { + constructor(name) { + this.name = name; + this.typeName = "Duration"; + } + matches(value) { + return { + success: /^(\d+[hdysmw],?)+$/.test(value), + value + }; + } + fail(value) { + return `"${value}" must be a value like "10d" or "3s" the first part is the length second is unit`; + } +}; +var PlayerNameArgumentType = class { + constructor(name = "playerName") { + this.name = name; + this.typeName = "playerName"; + this.name = name; + } + matches(value) { + const player = TABLES.ids.get(value); + return { + success: player ? true : false, + value + }; + } + fail(value) { + return `player: "${value}" has never played this world before! Tip: if the name has spaces in it use quotes around name!`; + } +}; +var ArgumentTypes = { + string: StringArgumentType, + int: IntegerArgumentType, + float: FloatArgumentType, + location: LocationArgumentType, + boolean: BooleanArgumentType, + player: PlayerArgumentType, + target: TargetArgumentType, + array: ArrayArgumentType, + duration: DurationArgumentType, + playerName: PlayerNameArgumentType +}; + +// project/behavior/src/lib/Command/Callback.ts +var CommandCallback = class { + constructor(data) { + this.data = data; + this.sender = data.sender; + } + reply(text2) { + this.sender.tell(text2); + } +}; + +// project/behavior/src/lib/Command/utils.ts +function getChatAugments(message, prefix) { + try { + return message.slice(prefix.length).trim().match(/"[^"]+"|[^\s]+/g).map((e2) => e2.replace(/"(.+)"/, "$1").toString()); + } catch (error) { + return []; + } +} +function commandNotFound(player, command2) { + player.tell({ + rawtext: [ + { + text: `\xA7c` + }, + { + translate: `commands.generic.unknown`, + with: [`${command2}`] + } + ] + }); +} +function noPerm(player, command2) { + player.tell({ + rawtext: [ + { + text: command2.data.invalidPermission ? command2.data.invalidPermission : `\xA7cYou do not have permission to use "${command2.data.name}"` + } + ] + }); +} +function commandSyntaxFail(player, baseCommand, command2, args, i) { + player.tell({ + rawtext: [ + { + text: `\xA7c` + }, + { + translate: `commands.generic.syntax`, + with: [ + `${PREFIX}${baseCommand.data.name} ${args.slice(0, i).join(" ")}`, + args[i] ?? " ", + args.slice(i + 1).join(" ") + ] + } + ] + }); + if (command2.children.length > 1 || !args[i]) { + const types = command2.children.map( + (c) => c.type instanceof LiteralArgumentType ? c.type.name : c.type?.typeName + ); + player.tell( + `\xA7c"${args[i] ?? "undefined"}" is not valid! Argument "${[...new Set(command2.children.map((c) => c.type.name))][0]}" can be typeof: "${types.join('", "')}"` + ); + } else { + player.tell(`\xA7c${command2.children[0]?.type?.fail(args[i])}`); + } +} +function parseLocationArgs([x, y, z], { location, viewVector }) { + if (!x || !y || !x) + return null; + const locations = [location.x, location.y, location.z]; + const viewVectors = [viewVector.x, viewVector.y, viewVector.z]; + const a = [x, y, z].map((arg) => { + const r = parseFloat(arg); + return isNaN(r) ? 0 : r; + }); + const b = [x, y, z].map((arg, index) => { + return arg.includes("~") ? a[index] + locations[index] : arg.includes("^") ? a[index] + viewVectors[index] : a[index]; + }); + return { x: b[0], y: b[1], z: b[2] }; +} +function sendCallback(cmdArgs, args, event, baseCommand) { + const lastArg = args[args.length - 1] ?? baseCommand; + const argsToReturn = []; + for (const [i, arg] of args.entries()) { + if (arg.type.name.endsWith("*")) + continue; + if (arg.type instanceof LocationArgumentType) { + argsToReturn.push( + parseLocationArgs( + [cmdArgs[i], cmdArgs[i + 1], cmdArgs[i + 2]], + event.sender + ) + ); + continue; + } + if (arg.type instanceof LiteralArgumentType) + continue; + argsToReturn.push(arg.type.matches(cmdArgs[i]).value ?? cmdArgs[i]); + } + lastArg.callback(new CommandCallback(event), ...argsToReturn); +} + +// project/behavior/src/lib/Command/index.ts +var COMMANDS = []; +world4.events.beforeChat.subscribe((data) => { + if (!data.message.startsWith(PREFIX)) + return; + data.cancel = true; + const args = getChatAugments(data.message, PREFIX); + const command2 = COMMANDS.find( + (c) => c.depth == 0 && (c.data.name == args[0] || c.data?.aliases?.includes(args[0])) + ); + const event = { + message: data.message, + sendToTargets: data.sendToTargets, + sender: data.sender, + targets: data.targets + }; + if (!command2) + return commandNotFound(data.sender, args[0]); + if (!command2.data?.requires(data.sender)) + return noPerm(event.sender, command2); + args.shift(); + const verifiedCommands = []; + const getArg = (start, i) => { + if (start.children.length > 0) { + const arg = start.children.find((v2) => v2.type.matches(args[i]).success); + if (!arg && !args[i] && start.callback) + return; + if (!arg) + return commandSyntaxFail(event.sender, command2, start, args, i), "fail"; + if (!arg.data?.requires(event.sender)) + return noPerm(event.sender, arg), "fail"; + verifiedCommands.push(arg); + return getArg(arg, i + 1); + } + }; + let v = getArg(command2, 0); + if (v == "fail") + return; + sendCallback(args, verifiedCommands, event, command2); +}); + +// project/behavior/src/lib/Chest GUI/index.ts +import { system as system6, world as world6 } from "@minecraft/server"; + +// project/behavior/src/config/chest.ts +var GUI_ITEM = "rubedo:gui"; +var ENTITY_INVENTORY = "rubedo:inventory"; + +// project/behavior/src/plugins/Anti-Cheat/utils.ts +import { + world as world5, + Player as Player3, + BlockLocation as BlockLocation4, + MinecraftBlockTypes as MinecraftBlockTypes3, + GameMode, + system as system3 +} from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts +import { BlockLocation as BlockLocation3, MinecraftBlockTypes } from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/config/region.ts +var DEFAULT_REGION_PERMISSIONS = { + doorsAndSwitches: true, + openContainers: true, + pvp: false, + allowedEntities: [ + "minecraft:player", + "minecraft:npc", + "minecraft:item", + "rubedo:inventory", + "rubedo:database" + ] +}; +var DOORS_SWITCHES = [ + "minecraft:acacia_door", + "minecraft:acacia_trapdoor", + "minecraft:acacia_button", + "minecraft:birch_door", + "minecraft:birch_trapdoor", + "minecraft:birch_button", + "minecraft:crimson_door", + "minecraft:crimson_trapdoor", + "minecraft:crimson_button", + "minecraft:dark_oak_door", + "minecraft:dark_oak_trapdoor", + "minecraft:dark_oak_button", + "minecraft:jungle_door", + "minecraft:jungle_trapdoor", + "minecraft:jungle_button", + "minecraft:mangrove_door", + "minecraft:mangrove_trapdoor", + "minecraft:mangrove_button", + "minecraft:spruce_door", + "minecraft:spruce_trapdoor", + "minecraft:spruce_button", + "minecraft:warped_door", + "minecraft:warped_trapdoor", + "minecraft:warped_button", + "minecraft:wooden_door", + "minecraft:wooden_button", + "minecraft:trapdoor", + "minecraft:iron_door", + "minecraft:iron_trapdoor", + "minecraft:polished_blackstone_button", + "minecraft:lever" +]; +var BLOCK_CONTAINERS = [ + "minecraft:chest", + "minecraft:ender_chest", + "minecraft:barrel", + "minecraft:trapped_chest", + "minecraft:dispenser", + "minecraft:dropper", + "minecraft:furnace", + "minecraft:blast_furnace", + "minecraft:lit_furnace", + "minecraft:lit_blast_furnace", + "minecraft:hopper", + "minecraft:shulker_box", + "minecraft:undyed_shulker_box", + "minecraft:lit_smoker", + "minecraft:smoker" +]; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts +var REGIONS = []; +var REGIONS_HAVE_BEEN_GRABBED = false; +var LOWEST_Y_VALUE = -64; +var HIGHEST_Y_VALUE = 320; +var Region = class { + static async getAllRegionsSync() { + if (REGIONS_HAVE_BEEN_GRABBED) + return REGIONS; + const regions = (await TABLES.regions.valuesSync()).map( + (region) => new Region( + region.from, + region.to, + region.dimensionId, + region.permissions, + region.key + ) + ); + regions.forEach((r) => { + REGIONS.push(r); + }); + REGIONS_HAVE_BEEN_GRABBED = true; + return regions; + } + static getAllRegions() { + if (REGIONS_HAVE_BEEN_GRABBED) + return REGIONS; + const regions = TABLES.regions.values().map( + (region) => new Region( + region.from, + region.to, + region.dimensionId, + region.permissions, + region.key + ) + ); + regions.forEach((r) => { + REGIONS.push(r); + }); + REGIONS_HAVE_BEEN_GRABBED = true; + return regions; + } + static blockLocationInRegion(blockLocation, dimensionId) { + return this.getAllRegions().find( + (region) => region.dimensionId == dimensionId && betweenVector3( + blockLocation, + { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z }, + { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z } + ) + ); + } + static async blockLocationInRegionSync(blockLocation, dimensionId) { + return (await this.getAllRegionsSync()).find( + (region) => region.dimensionId == dimensionId && betweenVector3( + blockLocation, + { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z }, + { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z } + ) + ); + } + static async removeRegionAtBlockLocation(blockLocation, dimensionId) { + const region = this.blockLocationInRegion(blockLocation, dimensionId); + if (!region) + return false; + return TABLES.regions.delete(region.key); + } + constructor(from, to, dimensionId, permissions, key) { + this.from = from; + this.to = to; + this.dimensionId = dimensionId; + this.permissions = permissions ?? DEFAULT_REGION_PERMISSIONS; + this.key = key ? key : Date.now().toString(); + if (!key) { + this.update().then(() => { + loadRegionDenys(); + REGIONS.push(this); + }); + } + } + async update() { + return TABLES.regions.set(this.key, { + key: this.key, + from: this.from, + dimensionId: this.dimensionId, + permissions: this.permissions, + to: this.to + }); + } + async delete() { + const region = TABLES.regions.get(this.key); + const loc1 = new BlockLocation3( + region.from.x, + region.dimensionId == "minecraft:overworld" ? -64 : 0, + region.from.z + ); + const loc2 = new BlockLocation3( + region.to.x, + region.dimensionId == "minecraft:overworld" ? -64 : 0, + region.to.z + ); + for (const blockLocation of loc1.blocksBetween(loc2)) { + DIMENSIONS[region.dimensionId].getBlock(blockLocation)?.setType(MinecraftBlockTypes.bedrock); + } + REGIONS = REGIONS.filter((r) => r.key != this.key); + return TABLES.regions.delete(this.key); + } + entityInRegion(entity) { + return this.dimensionId == entity.dimension.id && betweenVector3( + entity.location, + { x: this.from.x, y: LOWEST_Y_VALUE, z: this.from.z }, + { x: this.to.x, y: HIGHEST_Y_VALUE, z: this.to.z } + ); + } + changePermission(key, value) { + this.permissions[key] = value; + this.update(); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Task.ts +var ChangePlayerRoleTask = class { + static getTasks() { + return TABLES.tasks.get("changePlayerRole") ?? []; + } + static getPlayersRoleToSet(playerName) { + const tasks = ChangePlayerRoleTask.getTasks(); + return tasks.find((t) => t.playerName == playerName)?.role; + } + constructor(playerName, role) { + let tasks = ChangePlayerRoleTask.getTasks(); + tasks.push({ playerName, role }); + TABLES.tasks.set("changePlayerRole", tasks); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/config/moderation.ts +import { MinecraftBlockTypes as MinecraftBlockTypes2, MinecraftItemTypes as MinecraftItemTypes2 } from "@minecraft/server"; +var FORBIDDEN_ITEMS = [ + MinecraftItemTypes2.beehive.id, + MinecraftItemTypes2.beeNest.id, + MinecraftItemTypes2.axolotlBucket.id, + MinecraftItemTypes2.codBucket.id, + MinecraftItemTypes2.tadpoleBucket.id, + MinecraftItemTypes2.tropicalFishBucket.id, + MinecraftItemTypes2.salmonBucket.id, + MinecraftItemTypes2.pufferfishBucket.id +]; +var BANNED_ITEMS = [ + MinecraftItemTypes2.allow.id, + MinecraftItemTypes2.barrier.id, + MinecraftItemTypes2.borderBlock.id, + MinecraftItemTypes2.debugStick?.id ?? "minecraft:debug_stick", + MinecraftItemTypes2.deny.id, + MinecraftItemTypes2.jigsaw.id, + MinecraftItemTypes2.lightBlock.id, + MinecraftItemTypes2.commandBlock.id, + MinecraftItemTypes2.repeatingCommandBlock.id, + MinecraftItemTypes2.chainCommandBlock.id, + MinecraftItemTypes2.commandBlockMinecart.id, + MinecraftItemTypes2.structureBlock.id, + MinecraftItemTypes2.structureVoid.id, + MinecraftItemTypes2.bedrock.id, + MinecraftItemTypes2.endPortalFrame.id, + "minecraft:info_update", + "minecraft:info_update2", + "minecraft:reserved3", + "minecraft:reserved4", + "minecraft:reserved6", + "minecraft:movingBlock", + "minecraft:moving_block", + "minecraft:movingblock", + "minecraft:piston_arm_collision", + "minecraft:piston_arm_collision", + "minecraft:pistonarmcollision", + "minecraft:stickyPistonArmCollision", + "minecraft:sticky_piston_arm_collision", + "minecraft:unknown", + "minecraft:glowingobsidian", + "minecraft:invisible_bedrock", + "minecraft:invisiblebedrock", + "minecraft:netherreactor", + "minecraft:portal", + "minecraft:fire", + "minecraft:water", + "minecraft:lava", + "minecraft:flowing_lava", + "minecraft:flowing_water", + "minecraft:soul_fire" +]; +var FORBIDDEN_BLOCKS = [ + MinecraftBlockTypes2.dispenser.id +]; +var BANNED_BLOCKS = [ + MinecraftBlockTypes2.bedrock.id, + MinecraftBlockTypes2.barrier.id, + "minecraft:invisiblebedrock", + "minecraft:movingBlock", + "minecraft:movingblock", + "minecraft:moving_block" +]; +var API_CONTAINERS = [ + MinecraftBlockTypes2.chest.id, + MinecraftBlockTypes2.trappedChest.id +]; +var CONTAINERS = [ + MinecraftItemTypes2.chest.id, + MinecraftItemTypes2.trappedChest.id, + MinecraftItemTypes2.barrel.id, + MinecraftItemTypes2.dispenser.id, + MinecraftItemTypes2.dropper.id, + MinecraftItemTypes2.furnace.id, + "minecraft:lit_furnace", + MinecraftItemTypes2.blastFurnace.id, + "minecraft:lit_blast_furnace", + MinecraftItemTypes2.smoker.id, + "minecraft:lit_smoker", + MinecraftItemTypes2.hopper.id, + MinecraftItemTypes2.shulkerBox.id, + MinecraftItemTypes2.undyedShulkerBox.id +]; +var CHECK_SIZE = { x: 7, y: 7, z: 7 }; + +// project/behavior/src/plugins/Anti-Cheat/config/enchantments.ts +var ENCHANTMENTS = { + aquaAffinity: 1, + baneOfArthropods: 5, + binding: 1, + blastProtection: 4, + channeling: 1, + depthStrider: 3, + efficiency: 5, + featherFalling: 4, + fireAspect: 2, + fireProtection: 4, + flame: 1, + fortune: 3, + frostWalker: 2, + impaling: 5, + infinity: 1, + knockback: 2, + looting: 3, + loyalty: 4, + luckOfTheSea: 3, + lure: 3, + mending: 1, + multishot: 1, + piercing: 4, + power: 5, + projectileProtection: 4, + protection: 4, + punch: 2, + quickCharge: 3, + respiration: 3, + riptide: 3, + sharpness: 5, + silkTouch: 1, + smite: 5, + soulSpeed: 3, + swiftSneak: 4, + thorns: 3, + unbreaking: 3, + vanishing: 1 +}; + +// project/behavior/src/config/app.ts +var VERSION = "2.6.4-beta"; +var APPEAL_LINK = "https://discord.gg/dMa3A5UYKX"; + +// project/behavior/src/plugins/Anti-Cheat/utils.ts +function kick(player, message = [], onFail) { + if (isServerOwner(player)) { + console.warn(`[WARNING]: TRIED TO KICK OWNER`); + player.tell(`You have been tried to kick, but you cant!`); + return onFail?.(); + } + try { + player.runCommandAsync(`kick @s \xA7r${message.join("\n")}`); + player.triggerEvent("kick"); + } catch (error) { + player.triggerEvent("kick"); + if (!/"statusCode":-2147352576/.test(error)) + return; + if (onFail) + onFail(); + } +} +function getRole(player) { + if (player instanceof Player3) { + return TABLES.roles.get(player.name) ?? "member"; + } else { + return TABLES.roles.get(player) ?? "member"; + } +} +function setRole(player, value) { + if (typeof player == "string") { + TABLES.roles.set(player, value); + const inGamePlayer = [...world5.getPlayers()].find((p) => p.name == player); + if (inGamePlayer) { + inGamePlayer.setDynamicProperty("role", value); + } else { + new ChangePlayerRoleTask(player, value); + } + } else { + TABLES.roles.set(player.name, value); + player.setDynamicProperty("role", value); + } +} +function isServerOwner(player) { + return world5.getDynamicProperty("worldsOwner") == player.id; +} +function getServerOwner() { + const id = world5.getDynamicProperty("worldsOwner"); + if (!id || id == "") + return null; + return id; +} +function getServerOwnerName() { + const ownerId = getServerOwner(); + if (!ownerId) + return null; + const ids = TABLES.ids.collection(); + return Object.keys(ids).find((key) => ids[key] === ownerId); +} +function setServerOwner(player) { + if (!player) + return world5.setDynamicProperty("worldsOwner", ""); + world5.setDynamicProperty("worldsOwner", player.id.toString()); +} +function isLockedDown() { + return world5.getDynamicProperty("isLockDown") ?? false; +} +function setLockDown(val) { + world5.setDynamicProperty("isLockDown", val); +} +function loadRegionDenys() { + for (const region of Region.getAllRegions()) { + const loc1 = new BlockLocation4( + region.from.x, + region.dimensionId == "minecraft:overworld" ? -64 : 0, + region.from.z + ); + const loc2 = new BlockLocation4( + region.to.x, + region.dimensionId == "minecraft:overworld" ? -64 : 0, + region.to.z + ); + for (const blockLocation of loc1.blocksBetween(loc2)) { + DIMENSIONS[region.dimensionId].getBlock(blockLocation)?.setType(MinecraftBlockTypes3.deny); + } + } +} +var CALLBACKS2 = []; +var forEachValidPlayerCalls = 0; +function forEachValidPlayer(callback, delay = 0) { + const key = forEachValidPlayerCalls; + CALLBACKS2[key] = { + callback, + delay, + lastCall: 0 + }; + forEachValidPlayerCalls = key + 1; + return key; +} +function clearForEachValidPlayer(key) { + delete CALLBACKS2[key]; +} +EntitiesLoad.subscribe(() => { + system3.runSchedule(() => { + const players = [...world5.getPlayers()]; + for (const [i, player] of players.entries()) { + if (getRole(player) == "admin") + continue; + for (const CALLBACK of Object.values(CALLBACKS2)) { + if (CALLBACK.delay != 0 && system3.currentTick - CALLBACK.lastCall < CALLBACK.delay) + continue; + CALLBACK.callback(player); + if (i == players.length - 1) + CALLBACK.lastCall = system3.currentTick; + } + } + }); +}); +function getConfigId(id) { + switch (id) { + case "spam_config": + return TABLES.config.get("spam_config") ?? { + repeatedMessages: true, + zalgo: true, + violationCount: 0, + permMutePlayer: false + }; + case "cbe_config": + return TABLES.config.get("cbe_config") ?? { + clearItem: true, + violationCount: 0, + banPlayer: false, + canAddEnchantment: false + }; + case "gamemode_config": + return TABLES.config.get("gamemode_config") ?? { + setToSurvival: true, + clearPlayer: true, + violationCount: 0, + banPlayer: false + }; + case "nuker_data": + return TABLES.config.get("nuker_data") ?? { + violationCount: 0, + banPlayer: false + }; + case "banned_items": + return TABLES.config.get("banned_items") ?? BANNED_ITEMS; + case "banned_blocks": + return TABLES.config.get("banned_blocks") ?? BANNED_BLOCKS; + case "enchantments": + return TABLES.config.get("enchantments") ?? ENCHANTMENTS; + case "appealLink": + return TABLES.config.get("appealLink") ?? APPEAL_LINK; + } +} +function setConfigId(key, value) { + TABLES.config.set(key, value); +} +function getMaxEnchantmentLevel(enchantment) { + const MAX_ENCHANTMENTS = getConfigId("enchantments"); + return MAX_ENCHANTMENTS[enchantment.type.id] ?? enchantment.type.maxLevel; +} +function getGamemode(player) { + return Object.values(GameMode).find( + (g) => [...world5.getPlayers({ name: player.name, gameMode: g })].length + ); +} + +// project/behavior/src/lib/Chest GUI/Models/EntityChest.ts +import { system as system5 } from "@minecraft/server"; + +// project/behavior/src/lib/Events/onSlotChange.ts +import { + system as system4 +} from "@minecraft/server"; +var CALLBACKS3 = {}; +var MAPPED_INVENTORIES = {}; +var PREVIOUS_CHANGE = {}; +function getSlotChanges(entity, oldInv, newInv) { + if (oldInv.length != newInv.length) + return []; + const changes = []; + for (let i = 0; i < newInv.length; i++) { + if (oldInv[i]?.item?.amount < newInv[i]?.item?.amount || oldInv[i]?.item?.amount > newInv[i]?.item?.amount && oldInv[i]?.item?.amount != 0) { + const change_data = { + slot: i, + uid: newInv[i].uid, + oldUid: oldInv[i].uid, + item: newInv[i].item, + oldItem: oldInv[i].item, + changeType: "fluctuation" + }; + changes.push(change_data); + PREVIOUS_CHANGE[entity.id] = change_data; + continue; + } + if (newInv[i].uid == oldInv[i].uid) + continue; + if (oldInv[i]?.item && newInv[i]?.item) { + const change_data = { + slot: i, + uid: newInv[i].uid, + oldUid: oldInv[i].uid, + item: newInv[i].item, + oldItem: oldInv[i].item, + changeType: "swap" + }; + changes.push(change_data); + PREVIOUS_CHANGE[entity.id] = change_data; + } else if (!newInv[i]?.item) { + const change_data = { + slot: i, + uid: oldInv[i].uid, + item: oldInv[i].item, + changeType: "delete" + }; + changes.push(change_data); + PREVIOUS_CHANGE[entity.id] = change_data; + } else if (newInv[i]?.item) { + if (PREVIOUS_CHANGE[entity.id]?.changeType == "delete" && PREVIOUS_CHANGE[entity.id]?.uid == newInv[i].uid) { + const change_data = { + slot: i, + uid: newInv[i].uid, + item: newInv[i].item, + changeType: "move" + }; + changes.push(change_data); + PREVIOUS_CHANGE[entity.id] = change_data; + continue; + } else { + const change_data = { + slot: i, + uid: newInv[i].uid, + item: newInv[i].item, + changeType: "put" + }; + changes.push(change_data); + PREVIOUS_CHANGE[entity.id] = change_data; + } + } + } + return changes; +} +function getItemUid(item) { + if (!item) + return ""; + const data = []; + data.push(item.typeId); + data.push(item.nameTag); + data.push(item.data); + data.push(item.getLore().join("")); + return data.join(""); +} +function mapInventory(container) { + const inventory = []; + for (let i = 0; i < container.size; i++) { + let item = container.getItem(i); + inventory[i] = { + uid: getItemUid(item), + item + }; + } + return inventory; +} +system4.runSchedule(() => { + for (const callback of Object.values(CALLBACKS3)) { + for (const entity of DIMENSIONS.overworld.getEntities(callback.entities)) { + const inventory = mapInventory( + entity.getComponent("inventory").container + ); + const changes = getSlotChanges( + entity, + MAPPED_INVENTORIES[entity.id] ?? inventory, + inventory + ); + MAPPED_INVENTORIES[entity.id] = inventory; + if (changes.length == 0) + continue; + if (entity.hasTag("skipCheck")) { + entity.removeTag("skipCheck"); + delete PREVIOUS_CHANGE[entity.id]; + continue; + } + for (const change of changes) { + callback.callback(entity, change); + } + } + } +}, 5); +var onEntityInventorySlotChange = class { + static subscribe(entities, callback) { + const key = Date.now(); + CALLBACKS3[key] = { callback, entities }; + return key; + } + static unsubscribe(key) { + delete CALLBACKS3[key]; + } +}; + +// project/behavior/src/lib/Chest GUI/utils.ts +import { Location as Location2 } from "@minecraft/server"; +var CHESTGUIS = {}; +var PAGES = {}; +function getHeldItem(player) { + const inventory = player.getComponent("minecraft:inventory").container; + return inventory.getItem(player.selectedSlot); +} +async function clearPlayersPointer(player, ItemToClear) { + try { + const inventory = player.getComponent("minecraft:inventory").container; + let itemsToLoad = []; + for (let i = 0; i < inventory.size; i++) { + const item = inventory.getItem(i); + if (!item) + continue; + if (item?.typeId == ItemToClear?.typeId) { + itemsToLoad.push({ slot: i, item }); + inventory.setItem; + if (i < 9) { + player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`); + } else { + player.runCommandAsync( + `replaceitem entity @s slot.inventory ${i - 9} air` + ); + } + } + } + await player.runCommandAsync( + `clear @s ${ItemToClear?.typeId} ${ItemToClear.data} ${ItemToClear.amount}` + ); + for (const item of itemsToLoad) { + inventory.setItem(item.slot, item.item); + } + } catch (error) { + [ + ...player.dimension.getEntities({ + type: "minecraft:item", + location: new Location2( + player.location.x, + player.location.y, + player.location.z + ), + maxDistance: 2, + closest: 1 + }) + ].forEach((e2) => e2.kill()); + } +} +function getItemAtSlot(entity, slot) { + const inventory = entity.getComponent("minecraft:inventory").container; + return inventory.getItem(slot); +} + +// project/behavior/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts +var ItemGrabbedCallback = class { + constructor(gui, slot, change) { + this.gui = gui; + this.slot = slot; + this.change = change; + } + message(text2) { + this.gui.player.tell(text2); + } + getItemAdded() { + if (this.slot.item) + return null; + return this.gui.entity.getComponent("minecraft:inventory").container.getItem(this.change.slot); + } + GiveAction(item = this.slot.item.itemStack) { + this.gui.player.getComponent("minecraft:inventory").container.addItem(item); + } + TakeAction(db = null) { + this.gui.player.getComponent("minecraft:inventory").container.addItem(this.slot.item.itemStack); + this.gui.page.slots[this.change.slot] = null; + if (!db) + return; + db.delete(this.slot.item.components.dbKey); + } + PageAction(page, extras) { + this.gui.setPage(page, extras); + } + CloseAction() { + this.gui.despawn(); + } + SetAction() { + const container = this.gui.entity.getComponent( + "minecraft:inventory" + ).container; + container.setItem(this.change.slot, this.slot.item.itemStack); + } + async FormAction(form) { + this.CloseAction(); + await sleep(5); + return await form.show(this.gui.player); + } +}; + +// project/behavior/src/lib/Chest GUI/Models/EntityChest.ts +var ChestGUI = class { + static spawnEntity(player) { + try { + return player.dimension.spawnEntity( + ENTITY_INVENTORY, + player.headLocation + ); + } catch (error) { + return null; + } + } + constructor(player) { + this.player = player; + this.entity = ChestGUI.spawnEntity(player); + if (this.entity) { + this.hasChestOpen = false; + this.setPage("home"); + } + this.runScheduleId = system5.runSchedule(() => { + if (!this.entity) + return this.despawn(); + if (this.player.getComponent("mark_variant").value == 1) { + if (!this.hasChestOpen) { + this.slotChangeEvent = onEntityInventorySlotChange.subscribe( + { type: ENTITY_INVENTORY }, + (entity, change) => { + if (entity.id != this.entity.id) + return; + this.onSlotChange(change); + } + ); + } + this.hasChestOpen = true; + } else { + try { + this.entity.teleport( + this.player.headLocation, + this.player.dimension, + this.player.rotation.x, + this.player.rotation.y, + true + ); + } catch (error) { + this.despawn(); + } + } + }, 5); + } + setPage(pageId, extras) { + const c = this.entity.getComponent("inventory").container; + for (let i = 0; i < c.size; i++) { + c.setItem(i, AIR); + } + if (!Object.keys(PAGES).includes(pageId)) + throw new Error(`pageId ${pageId} does not exist!`); + const page = PAGES[pageId]; + this.page = page; + page.fillType(this.entity, page, extras); + this.entity.nameTag = `size:54`; + } + onSlotChange(change) { + const slot = this.page.slots[change.slot]; + if (!slot) { + this.entity.getComponent("inventory").container.setItem(change.slot, AIR); + } else if (change.changeType == "delete") { + if (slot.item) + clearPlayersPointer(this.player, change.item); + if (!slot.item && !getItemAtSlot(this.entity, change.slot)) + return; + slot.action(new ItemGrabbedCallback(this, slot, change)); + } + } + despawn() { + try { + this.entity?.triggerEvent("despawn"); + } catch (error) { + } + try { + delete CHESTGUIS[this.player.name]; + } catch (error) { + } + if (this.runScheduleId) + system5.clearRunSchedule(this.runScheduleId); + if (this.slotChangeEvent) + onEntityInventorySlotChange.unsubscribe(this.slotChangeEvent); + } +}; + +// project/behavior/src/lib/Chest GUI/Models/PageItem.ts +import { + ItemStack as ItemStack4 +} from "@minecraft/server"; +var PageItem = class { + constructor(itemType, components = {}, itemStack) { + this.itemType = itemType; + this.components = components; + this.setItemStack = itemStack; + } + get itemStack() { + if (this.setItemStack) + return this.setItemStack; + const itemStack = new ItemStack4(this.itemType); + if (this.components) { + itemStack.amount = this.components?.amount ?? 1; + itemStack.data = this.components?.data ?? 0; + itemStack.nameTag = this.components?.nameTag; + itemStack.setLore(this.components?.loreList ?? []); + const enchantments = itemStack.getComponent("enchantments").enchantments; + for (const enchantment of this.components?.enchantments ?? []) { + enchantments.addEnchantment(enchantment); + } + itemStack.getComponent("enchantments").enchantments = enchantments; + } + return itemStack; + } +}; + +// project/behavior/src/lib/Chest GUI/Models/FillTypes.ts +function DefaultFill(entity, page, extras) { + const container = entity.getComponent("minecraft:inventory").container; + for (let i = 0; i < container.size; i++) { + const slot = page.slots[i]; + if (!slot || !slot.item) { + container.setItem(i, AIR); + continue; + } + container.setItem(i, slot.item.itemStack); + } +} + +// project/behavior/src/lib/Chest GUI/Models/Page.ts +var Page = class { + constructor(id, fillType = DefaultFill) { + if (Object.keys(PAGES).includes(id)) + throw new Error(`Page: ${id}, Already exists!`); + this.id = id; + this.fillType = fillType; + this.slots = []; + PAGES[id] = this; + } + setSlots(slot, item, action) { + const data = item ? { item, action } : null; + for (const i of slot) { + this.slots[i] = data; + } + return this; + } +}; + +// project/behavior/src/lib/Chest GUI/pages/home.ts +import { MinecraftItemTypes as MinecraftItemTypes3 } from "@minecraft/server"; +var HOME_PAGE = new Page("home").setSlots( + [22], + new PageItem(MinecraftItemTypes3.enderChest, { + nameTag: "\xA7l\xA7bInventory Viewer" + }), + (ctx) => { + ctx.PageAction("moderation:see"); + } +).setSlots( + [54], + new PageItem(MinecraftItemTypes3.barrier, { nameTag: "\xA7cClose GUI" }), + (ctx) => { + ctx.CloseAction(); + } +); + +// project/behavior/src/lib/Chest GUI/index.ts +EntitiesLoad.subscribe(() => { + system6.runSchedule(() => { + for (const player of world6.getPlayers()) { + if (getHeldItem(player)?.typeId != GUI_ITEM) { + if (CHESTGUIS[player.name]) + CHESTGUIS[player.name].despawn(); + continue; + } + if (Object.keys(CHESTGUIS).includes(player?.name)) + continue; + if (getRole(player) != "admin") + continue; + CHESTGUIS[player.name] = new ChestGUI(player); + } + }, 10); +}); +system6.runSchedule(() => { + const validIds = Object.values(CHESTGUIS).map((c) => c.entity.id); + for (const entity of DIMENSIONS.overworld.getEntities({ + type: ENTITY_INVENTORY + })) { + if (validIds.includes(entity.id)) + continue; + entity.triggerEvent("despawn"); + } +}, 100); + +// project/behavior/src/plugins/Anti-Cheat/protections.ts +import { system as system7 } from "@minecraft/server"; +var PROTECTIONS = {}; +EntitiesLoad.subscribe(() => { + system7.run(() => { + for (const protection6 of Object.values(PROTECTIONS)) { + if (!protection6.getConfig().enabled) + continue; + protection6.enable(); + } + }); +}); + +// project/behavior/src/lang/text.ts +var text = { + "api.name": () => "Smelly API", + "api.error.unknown": () => "An unknown error has occurred.", + "api.database.error.table_name": (a, b) => `The display name ${a} is too long for an objective, it can be at most ${b} characters long`, + "api.utilities.formatter.error.ms": (a) => `${a} is not a string or a number`, + "api.Providers.form.invalidType": (a, b) => `Type ${a} is not a valid type to add a ${b}`, + "modules.protections.cps.clickingToFast": () => `You are clicking to fast! Please click slower!`, + "modules.managers.mute.isMuted": () => `\xA7cYou've been temporarily muted in chat.`, + "modules.commands.ban.reply": (playerName, duration, reason = "") => `\xA7cBanned \xA7f"\xA7a${playerName}\xA7f" \xA7cfor ${duration} Because: "${reason ?? "No reason Provided"}" \xA7aSuccessfully`, + "lockdown.kick.message": () => [ + `\xA7cYou have been kicked!`, + `\xA7aReason: \xA7fServer is currently under LockDown`, + `\xA7fServer will be up soon, Try to join later` + ], + "commands.ban.list.player": (name, reason, expire) => `- "${name}" Because: ${reason}, Expiry ${expire}`, + "commands.freeze.list.player": (name, reason) => `- "${name}" Because: ${reason}`, + "commands.mutes.list.player": (name, reason, expire) => `- "${name}" Because: ${reason}, Expiry: ${expire}`, + "commands.lockdown.confirm": "Are you sure you want to lockdown the server, this will kick all active players and all players who try to join who are not admin" +}; + +// project/behavior/src/lib/Command/Command.ts +var Command = class { + constructor(data, type, depth = 0, parent) { + this.data = data; + this.type = type; + this.depth = depth; + this.parent = parent; + if (!data.requires) + data.requires = (player) => true; + this.data = data; + this.type = type ?? new LiteralArgumentType(this.data.name); + this.children = []; + this.depth = depth; + this.parent = parent; + this.callback = null; + COMMANDS.push(this); + } + argument(type) { + const cmd = new Command( + this.data, + type, + this.depth + 1, + this + ); + this.children.push(cmd); + return cmd; + } + string(name) { + return this.argument(new StringArgumentType(name)); + } + int(name) { + return this.argument(new IntegerArgumentType(name)); + } + array(name, types) { + return this.argument(new ArrayArgumentType(name, types)); + } + boolean(name) { + return this.argument(new BooleanArgumentType(name)); + } + location(name) { + const cmd = this.argument(new LocationArgumentType(name)); + if (!name.endsWith("*")) { + const newArg = cmd.location(name + "_y*").location(name + "_z*"); + return newArg; + } + return cmd; + } + literal(data) { + const cmd = new Command( + data, + new LiteralArgumentType(data.name), + this.depth + 1, + this + ); + this.children.push(cmd); + return cmd; + } + executes(callback) { + this.callback = callback; + return this; + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Ban.ts +import { Player as Player6 } from "@minecraft/server"; +function setBan(player, id, duration, reason = "No Reason", by = "Rubedo Auto Mod") { + const data = { + key: id, + playerName: player instanceof Player6 ? player.name : player, + date: Date.now(), + duration: duration ? durationToMs(duration) : null, + expire: duration ? durationToMs(duration) + Date.now() : null, + reason, + by + }; + TABLES.bans.set(id, data); +} +var Ban = class { + constructor(player, duration, reason = "No Reason", by = "Rubedo Auto Mod") { + if (player instanceof Player6) { + setBan(player, player.id, duration, reason, by); + } else { + setBan(player, TABLES.ids.get(player), duration, reason, by); + } + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/ban.ts +function ban(ctx, player, duration, reason, by) { + if (TABLES.bans.get(TABLES.ids.get(player))) + return ctx.reply(`\xA7c${player} is already banned`); + ctx.reply(`\xA7aClose chat to confirm`); + confirmAction( + ctx.sender, + `Are you sure you want to ban ${player}, for ${duration ?? "forever"}`, + () => { + new Ban(player, duration, reason, ctx.sender.name); + ctx.reply(text["modules.commands.ban.reply"](player, duration, reason)); + } + ); +} +var root = new Command({ + name: "ban", + description: "Manage bans", + requires: (player) => ["admin", "moderator"].includes(getRole(player)) +}); +root.literal({ + name: "add", + description: "Bans a player" +}).argument(new ArgumentTypes.playerName()).executes((ctx, player) => { + ban(ctx, player, null, null, ctx.sender.name); +}).argument(new ArgumentTypes.duration("duration")).executes((ctx, player, duration) => { + ban(ctx, player, duration, null, ctx.sender.name); +}).string("reason").executes((ctx, player, duration, reason) => { + ban(ctx, player, duration, reason, ctx.sender.name); +}); +root.literal({ + name: "remove", + description: "un-bans a player" +}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { + const banData = TABLES.bans.values().find((ban2) => ban2.playerName == playerName); + if (!banData) + return ctx.reply(`${playerName} is not banned`); + if (TABLES.bans.delete(banData.key)) { + ctx.reply(`\xA7a${playerName}\xA7r has been Unbanned!`); + } else { + ctx.reply(`\xA7cFailed to un-ban ${playerName}`); + } +}); +root.literal({ + name: "list", + description: "Lists all bans" +}).executes((ctx) => { + const bans = TABLES.bans.values(); + if (bans.length == 0) + return ctx.sender.tell(`\xA7cNo one is banned!`); + ctx.sender.tell(`\xA72--- Showing Bans (${bans.length}) ---`); + for (const ban2 of bans) { + ctx.sender.tell( + text["commands.ban.list.player"]( + ban2.playerName, + ban2.reason, + ban2.expire ? msToTime(ban2.duration) : "Forever" + ) + ); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/database.ts +var root2 = new Command({ + name: "database", + description: "Interacts with SA Database", + aliases: ["db"], + requires: (player) => getRole(player) == "admin" +}); +root2.literal({ + name: "get" +}).string("table").string("key").executes((ctx, table, key) => { + try { + const data = TABLES[table].get(key); + if (data) { + ctx.reply(JSON.stringify(data)); + } else { + ctx.reply(`No data could be found for key ${key}`); + } + } catch (error) { + ctx.reply(error + error.stack); + } +}); +root2.literal({ + name: "set" +}).string("table").string("key").string("value").executes((ctx, table, key, value) => { + try { + TABLES[table].set(key, value); + ctx.reply(`Set Key: "${key}", to value: "${value}" on table: "${table}"`); + } catch (error) { + ctx.reply(error + error.stack); + } +}); +root2.literal({ + name: "clear" +}).string("table").executes((ctx, table) => { + try { + TABLES[table].clear(); + ctx.reply(`Cleared Table ${table}`); + } catch (error) { + ctx.reply(error + error.stack); + } +}); +root2.literal({ + name: "keys", + description: "Returns all keys on a database" +}).string("table").executes((ctx, table) => { + try { + const keys = TABLES[table].keys(); + ctx.reply(`Keys on database: ${table}: ${keys}`); + } catch (error) { + ctx.reply(error + error.stack); + } +}); +root2.literal({ + name: "values", + description: "Returns all values on a database" +}).string("table").executes((ctx, table) => { + try { + const values = TABLES[table].values(); + ctx.reply( + `Values on database: ${table}: ${JSON.stringify(values, null, 2)}` + ); + } catch (error) { + if (error instanceof TypeError) { + ctx.reply(`No values on database ${table}`); + } else { + ctx.reply(error + error.stack); + } + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts +new Command({ + name: "ecwipe", + description: "Clears a players ender chest", + requires: (player) => getRole(player) == "admin" +}).argument(new ArgumentTypes.player("player")).executes((ctx, player) => { + for (let i = 0; i < 27; i++) { + player.runCommandAsync(`replaceitem entity @s slot.enderchest ${i} air`); + } + ctx.reply(`\xA7aCleared "${player.name}"'s Ender chest!`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Freeze.ts +var Freeze = class { + constructor(player, reason = "No Reason") { + const data = { + playerName: player.name, + key: player.id, + reason, + location: { + x: player.location.x, + y: player.location.y, + z: player.location.z, + dimension: player.dimension.id + } + }; + TABLES.freezes.set(player.id, data); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/freeze.ts +var root3 = new Command({ + name: "freeze", + description: "Manage Freezes", + requires: (player) => ["admin", "moderator"].includes(getRole(player)) +}); +root3.literal({ + name: "add", + description: "Freezes a player" +}).argument(new ArgumentTypes.player("player")).string("reason").executes((ctx, player, reason) => { + new Freeze(player, reason); + ctx.reply( + `\xA7cFroze \xA7f"\xA7a${player.name}\xA7f" Because: "${reason}" \xA7aSuccessfully` + ); + ctx.sender.tell( + `\xA7cYou have been frozen by \xA7f"\xA7a${ctx.sender.name}\xA7f" Because: "${reason}"` + ); +}); +root3.literal({ + name: "remove", + description: "unfreezes a player" +}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { + const freeze = TABLES.freezes.values().find((freeze2) => freeze2.playerName == playerName); + if (!freeze) + return ctx.reply(`${playerName} is not frozen`); + TABLES.freezes.delete(freeze.key); + ctx.reply(`\xA7a${playerName}\xA7r has been UnFrozen!`); +}); +root3.literal({ + name: "list", + description: "Lists all freezes" +}).executes((ctx) => { + const freezes = TABLES.freezes.values(); + if (freezes.length == 0) + return ctx.sender.tell(`\xA7cNo one is frozen!`); + ctx.sender.tell(`\xA72--- Showing Freezes (${freezes.length}) ---`); + for (const freeze of freezes) { + ctx.sender.tell( + text["commands.freeze.list.player"](freeze.playerName, freeze.reason) + ); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/help.ts +var CommandNameArgumentType = class { + constructor(name) { + this.name = name; + this.typeName = "CommandName"; + } + matches(value) { + return { + success: Boolean( + COMMANDS.find((c) => c.depth == 0 && c.data.name == value) + ), + value + }; + } + fail(value) { + return `"${value}" is not a valid command`; + } +}; +function sendCommandType(baseCommand, args, player) { + player.tell( + `${PREFIX}${baseCommand.data.name} ${args.map( + (a) => a.type.typeName == "literal" ? a.data.name : `<${a.type.name}: ${a.type.typeName}>` + ).join(" ")}` + ); +} +function sendArguments(bc, c, args, p) { + if (!c.data?.requires(p)) + return; + if (c.callback) { + sendCommandType(bc, c.depth == 0 ? args : args.concat(c), p); + } + if (c.children.length > 0) { + for (const child of c.children) { + sendArguments(bc, child, c.depth == 0 ? args : args.concat(c), p); + } + } +} +function sendPageHeader(player, p, maxPages) { + player.tell( + `\xA72--- Showing help page ${p} of ${maxPages} (${PREFIX}help ) ---` + ); +} +function getCommands(player) { + return COMMANDS.filter((c) => { + return c.depth == 0 && c.data?.requires(player); + }); +} +function getMaxPages(player) { + const commands = getCommands(player); + if (commands.length == 0) + return 0; + return Math.ceil(commands.length / 5); +} +var root4 = new Command({ + name: "help", + description: "Provides help/list of commands.", + aliases: ["?", "h"] +}).executes((ctx) => { + const maxPages = getMaxPages(ctx.sender); + const commands = getCommands(ctx.sender).slice(1 * 5 - 5, 1 * 5); + sendPageHeader(ctx.sender, 1, maxPages); + for (const cmd of commands) { + sendArguments(cmd, cmd, [], ctx.sender); + } +}); +root4.int("page").executes((ctx, p) => { + const maxPages = getMaxPages(ctx.sender); + if (p > maxPages) + p = maxPages; + const commands = getCommands(ctx.sender).slice(p * 5 - 5, p * 5); + sendPageHeader(ctx.sender, p, maxPages); + for (const cmd of commands) { + sendArguments(cmd, cmd, [], ctx.sender); + } +}); +root4.argument(new CommandNameArgumentType("command")).executes((ctx, command2) => { + const cmd = COMMANDS.filter( + (c) => c.depth == 0 && c.data.name == command2 + )[0]; + ctx.sender.tell( + `\xA7e${cmd.data.name}: ${cmd.data.aliases ? `aliases (${cmd.data.aliases.join(", ")})` : ""}` + ); + ctx.sender.tell(`\xA7e${cmd.data.description}`); + ctx.sender.tell(`Usage:`); + sendArguments(cmd, cmd, [], ctx.sender); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/lockdown.ts +import { world as world7 } from "@minecraft/server"; +new Command({ + name: "lockdown", + description: "Toggles the servers lockdown, meaning no one can join", + requires: (player) => getRole(player) == "admin" +}).executes((ctx) => { + if (isLockedDown()) { + setLockDown(false); + ctx.sender.tell(`\xA7aUnlocked the server!`); + } else { + ctx.reply(`\xA7aClose chat to confirm lockdown`); + confirmAction(ctx.sender, text["commands.lockdown.confirm"], () => { + setLockDown(true); + for (const player of world7.getPlayers()) { + if (getRole(player) == "admin") + continue; + kick(player, text["lockdown.kick.message"]()); + } + world7.say(`\xA7l\xA7cServer is now LOCKED!`); + }); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Mute.ts +var Mute = class { + static getMuteData(player) { + return TABLES.mutes.get(player.name); + } + constructor(player, duration, reason = "No Reason", by = "Rubedo Auto Mod") { + const msLength = duration ? durationToMs(duration) : null; + const data = { + playerName: player.name, + date: Date.now(), + duration: msLength, + expire: msLength ? msLength + Date.now() : null, + reason, + by + }; + TABLES.mutes.set(player.name, data); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/mute.ts +var root5 = new Command({ + name: "mute", + description: "Manage Mutes", + requires: (player) => ["admin", "moderator"].includes(getRole(player)) +}); +root5.literal({ + name: "add", + description: "Mutes a player" +}).argument(new ArgumentTypes.player("player")).argument(new ArgumentTypes.duration("duration")).string("reason").executes((ctx, player, duration, reason) => { + new Mute(player, duration, reason, ctx.sender.name); + ctx.reply( + `\xA7cMuted \xA7f"\xA7a${player.name}\xA7f" \xA7cfor ${duration} Because: "${reason}" \xA7aSuccessfully` + ); + player.tell( + `\xA7cYou have been muted by \xA7f"${ctx.sender.name}" \xA7cfor ${duration} Because: "${reason}"` + ); +}); +root5.literal({ + name: "remove", + description: "un-mutes a player" +}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { + const mute = TABLES.mutes.values().find((mute2) => mute2.playerName == playerName); + if (!mute) + return ctx.reply(`${playerName} is not muted!`); + TABLES.mutes.delete(mute.playerName); + try { + ctx.sender.runCommandAsync(`ability "${playerName}" mute false`); + } catch (error) { + } + ctx.reply(`\xA7a${playerName}\xA7r has been UnMuted!`); +}); +root5.literal({ + name: "list", + description: "Lists all freezes" +}).executes((ctx) => { + const mutes = TABLES.mutes.values(); + if (mutes.length == 0) + return ctx.sender.tell(`\xA7cNo one is muted!`); + ctx.sender.tell(`\xA72--- Showing Mutes (${mutes.length}) ---`); + for (const mute of mutes) { + ctx.sender.tell( + text["commands.mutes.list.player"]( + mute.playerName, + mute.reason, + mute.expire ? msToTime(mute.expire) : "Forever" + ) + ); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts +import { Location as Location3 } from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Npc.ts +var Npc = class { + static isValid(entity) { + if (entity.typeId != "minecraft:npc") + return false; + if (NPC_LOCATIONS.find((l) => LocationEquals(l, entity.location))) + return true; + return TABLES.npcs.keys().find((key) => entity.id == key) ? true : false; + } + constructor(location, dimension) { + NPC_LOCATIONS.push(location); + const entity = dimension.spawnEntity("minecraft:npc", location); + const data = { + dimension: entity.dimension.id, + x: entity.location.x, + y: entity.location.y, + z: entity.location.z + }; + TABLES.npcs.set(entity.id, data); + clearNpcLocations(); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts +new Command({ + name: "npc", + description: "Spawns a npc at your coordinates", + requires: (player) => getRole(player) == "admin" +}).executes((ctx) => { + const { x, y, z } = ctx.sender.location; + new Npc(new Location3(x, y, z), ctx.sender.dimension); + ctx.reply(`Spawned a verified npc at your current location`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/ping.ts +import { system as system8 } from "@minecraft/server"; +async function getServerTPS() { + let startTime = Date.now(); + let ticks = 0; + return new Promise((resolve) => { + let s = system8.runSchedule(() => { + if (Date.now() - startTime < 1e3) { + ticks++; + } else { + system8.clearRunSchedule(s); + resolve(ticks); + } + }); + }); +} +new Command({ + name: "ping", + description: "Returns the current Ticks Per Second of the servers ping" +}).executes(async (ctx) => { + let ticks = await getServerTPS(); + ctx.reply( + `\xA7aCurrent Ticks Per Second: ${ticks > 18 ? "\xA7f{ \xA7aGood" : ticks > 13 ? "\xA7f{ \xA7eOk" : "\xA7f{ \xA7cSevere"} ${ticks} \xA7f}` + ); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/region.ts +import { BlockLocation as BlockLocation5 } from "@minecraft/server"; +var command = new Command({ + name: "region", + description: "Create a Region", + requires: (player) => getRole(player) == "admin" +}); +command.literal({ + name: "add", + description: "Adds a new protection region" +}).int("from_x").int("from_z").int("to_x").int("to_z").executes((ctx, from_x, from_z, to_x, to_z) => { + new Region( + { x: from_x, z: from_z }, + { x: to_x, z: to_z }, + ctx.sender.dimension.id + ); + ctx.reply( + `Created Region From ${from_x} -64 ${from_z} ${to_x} 320 ${to_z}` + ); +}); +command.literal({ + name: "remove", + description: "Removes a region at the players current position" +}).executes((ctx) => { + const loc = new BlockLocation5( + ctx.sender.location.x, + ctx.sender.location.y, + ctx.sender.location.z + ); + const r = Region.removeRegionAtBlockLocation(loc, ctx.sender.dimension.id); + if (r) { + ctx.reply(`Removed Region at ${loc.x} ${loc.y} ${loc.z}`); + } else { + ctx.reply(`Failed to find/remove region at ${loc.x} ${loc.y} ${loc.z}`); + } +}); +command.literal({ + name: "removeAll", + description: "Removes all regions" +}).executes((ctx) => { + Region.getAllRegions().forEach((r) => r.delete()); + ctx.reply(`Removed All regions`); +}); +command.literal({ + name: "list", + description: "Lists all regions and positions" +}).executes((ctx) => { + const regions = Region.getAllRegions(); + for (const region of regions) { + ctx.reply( + `Region from ${region.from.x}, ${region.from.z} to ${region.to.x}, ${region.to.z} in dimension ${region.dimensionId}` + ); + } + if (regions.length == 0) + return ctx.reply(`No regions have been made yet`); +}); +var permission = command.literal({ + name: "permission", + description: "Handles permissions for regions" +}); +permission.literal({ + name: "set", + description: "Sets a certain permission on the region the player is currently in to a value" +}).array("key", ["doorsAndSwitches", "openContainers", "pvp"]).boolean("value").executes((ctx, key, value) => { + const region = Region.blockLocationInRegion( + new BlockLocation5( + ctx.sender.location.x, + ctx.sender.location.y, + ctx.sender.location.z + ), + ctx.sender.dimension.id + ); + if (!region) + return ctx.reply(`You are not in a region`); + region.changePermission(key, value); + ctx.reply(`Changed permission ${key} to ${value}`); +}); +permission.literal({ + name: "list", + description: "Lists the permissions for the current region" +}).executes((ctx) => { + const region = Region.blockLocationInRegion( + new BlockLocation5( + ctx.sender.location.x, + ctx.sender.location.y, + ctx.sender.location.z + ), + ctx.sender.dimension.id + ); + if (!region) + return ctx.reply(`You are not in a region`); + ctx.reply( + `Current region permissions ${JSON.stringify(region.permissions)}` + ); +}); +var entityCommands = permission.literal({ + name: "entities", + description: "Holds the subCommands for adding or removing allowedEntities" +}); +entityCommands.literal({ + name: "add", + description: "Adds a entity to the allowed entities list" +}).string("entity").executes((ctx, entity) => { + const region = Region.blockLocationInRegion( + new BlockLocation5( + ctx.sender.location.x, + ctx.sender.location.y, + ctx.sender.location.z + ), + ctx.sender.dimension.id + ); + if (!region) + return ctx.reply(`You are not in a region`); + const currentAllowedEntities = region.permissions.allowedEntities; + currentAllowedEntities.push(entity); + region.changePermission("allowedEntities", currentAllowedEntities); + ctx.reply( + `Added entity ${entity} to the allowed entities of the region your currently standing in` + ); +}); +entityCommands.literal({ + name: "remove", + description: "Removes a entity from the allowed entities in the region" +}).string("entity").executes((ctx, entity) => { + const region = Region.blockLocationInRegion( + new BlockLocation5( + ctx.sender.location.x, + ctx.sender.location.y, + ctx.sender.location.z + ), + ctx.sender.dimension.id + ); + if (!region) + return ctx.reply(`You are not in a region`); + let currentAllowedEntities = region.permissions.allowedEntities; + if (!currentAllowedEntities.includes(entity)) + return ctx.reply( + `The entity ${entity} is not allowed to enter the region` + ); + currentAllowedEntities = currentAllowedEntities.filter((v) => v != entity); + region.changePermission("allowedEntities", currentAllowedEntities); + ctx.reply( + `Removed entity ${entity} to the allowed entities of the region your currently standing in` + ); +}); + +// project/behavior/src/types.ts +var ROLES = /* @__PURE__ */ ((ROLES2) => { + ROLES2[ROLES2["member"] = 0] = "member"; + ROLES2[ROLES2["admin"] = 1] = "admin"; + ROLES2[ROLES2["moderator"] = 2] = "moderator"; + ROLES2[ROLES2["builder"] = 3] = "builder"; + return ROLES2; +})(ROLES || {}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/role.ts +var StringIsNumber = (value) => isNaN(Number(value)) === false; +function ToArray(enumme) { + return Object.keys(enumme).filter(StringIsNumber).map((key) => enumme[key]); +} +var root6 = new Command({ + name: "role", + description: "Changes the role for a player", + requires: (player) => getRole(player) == "admin" || isServerOwner(player) +}); +root6.literal({ + name: "set", + description: "Sets the role for a player" +}).argument(new ArgumentTypes.playerName("playerName")).argument(new ArgumentTypes.array("role", ToArray(ROLES))).executes((ctx, playerName, role) => { + setRole(playerName, role); + ctx.reply(`Changed role of ${playerName} to ${role}`); +}); +root6.literal({ + name: "get", + description: "Gets the role of a player" +}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { + const role = getRole(playerName); + ctx.reply(`${playerName} has role: ${role}`); +}); +var ownerRoot = root6.literal({ + name: "owner", + description: "Manages the owner" +}); +ownerRoot.literal({ + name: "get", + description: "Gets the owner of the world" +}).executes((ctx) => { + const ownerId = getServerOwner(); + const ids = TABLES.ids.collection(); + const ownerName = Object.keys(ids).find((key) => ids[key] === ownerId); + ctx.reply(`\xA7aServer Owner: ${ownerName} (id: ${ownerId})`); +}); +ownerRoot.literal({ + name: "transfer", + description: "Transfers the owner of the world", + requires: (player) => isServerOwner(player) +}).argument(new ArgumentTypes.player()).executes((ctx, player) => { + confirmAction( + ctx.sender, + `Are you sure you want to transfer the server ownership to ${player.name}, this action is not reversible!`, + () => { + setServerOwner(player); + ctx.reply( + `\xA7aSet the server Owner to: ${player.name} (id: ${player.id})` + ); + } + ); + ctx.reply(`\xA7aClose chat to confirm`); +}); +ownerRoot.literal({ + name: "clear", + description: "clear's the owner of the world", + requires: (player) => isServerOwner(player) +}).executes((ctx) => { + confirmAction( + ctx.sender, + "Are you sure you want to clear the server owner, this action is not reversible!", + () => { + setServerOwner(null); + ctx.reply( + `\xA7aCleared the server owner! run "/reload" or reload world to run "/function start" again!` + ); + } + ); + ctx.reply(`\xA7aClose chat to confirm`); +}); + +// project/behavior/src/lib/Form/Models/ActionForm.ts +import { ActionFormData } from "@minecraft/server-ui"; +var ActionForm = class { + constructor(title, body) { + this.title = title; + this.body = body; + this.form = new ActionFormData(); + if (title) + this.form.title(title); + if (body) + this.form.body(body); + this.buttons = []; + this.triedToShow = 0; + } + addButton(text2, iconPath = null, callback) { + this.buttons.push({ + text: text2, + iconPath, + callback + }); + this.form.button(text2, iconPath); + return this; + } + show(player) { + this.form.show(player).then((response) => { + if (response.canceled) { + if (response.cancelationReason == "userBusy") { + if (this.triedToShow > TIMEOUT_THRESHOLD) + return player.tell( + `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` + ); + this.triedToShow++; + this.show(player); + } + return; + } + this.buttons[response.selection].callback?.(); + }); + } +}; + +// project/behavior/src/lib/Form/Models/ModelForm.ts +import { ModalFormData } from "@minecraft/server-ui"; + +// project/behavior/src/lib/Form/Models/FormCallback.ts +var FormCallback = class { + constructor(form, player, callback) { + this.form = form; + this.player = player; + this.callback = callback; + } + error(message) { + new MessageForm("Error", message).setButton1("Return to form", () => { + this.form.show(this.player, this.callback); + }).setButton2("Cancel", null).show(this.player); + } +}; + +// project/behavior/src/lib/Form/Models/ModelForm.ts +var ModalForm = class { + constructor(title) { + this.title = title; + this.form = new ModalFormData(); + if (title) + this.form.title(title); + this.args = []; + } + addDropdown(label, options, defaultValueIndex) { + this.args.push({ type: "dropdown", options }); + this.form.dropdown(label, options, defaultValueIndex); + return this; + } + addSlider(label, minimumValue, maximumValue, valueStep, defaultValue) { + this.args.push({ type: "slider" }); + this.form.slider( + label, + minimumValue, + maximumValue, + valueStep, + defaultValue + ); + return this; + } + addToggle(label, defaultValue) { + this.args.push({ type: "toggle" }); + this.form.toggle(label, defaultValue); + return this; + } + addTextField(label, placeholderText, defaultValue) { + this.args.push({ type: "textField" }); + this.form.textField(label, placeholderText, defaultValue); + return this; + } + async show(player, callback) { + for (let i = 0; i < TIMEOUT_THRESHOLD; i++) { + let response = await this.form.show(player); + if (response.cancelationReason == "userBusy") + continue; + callback( + new FormCallback(this, player, callback), + ...response.formValues.map( + (v, i2) => this.args[i2].type == "dropdown" ? this.args[i2].options[v] : v + ) + ); + return; + } + return player.tell( + `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` + ); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/forms/settings.ts +function manageBannedItemsForm(player) { + new ActionForm("Manage Banned Items").addButton("Remove a Banned Item", null, () => { + removeBannedItemForm(player); + }).addButton("Ban an item", null, () => { + addBannedItemForm(player); + }).show(player); +} +function removeBannedItemForm(player) { + new ModalForm("Remove Banned Items").addDropdown("Select item to remove", getConfigId("banned_items")).show(player, (ctx, item) => { + let items = getConfigId("banned_items"); + items = items.filter((p) => p != item); + setConfigId("banned_items", items); + player.tell(`Removed Banned item "${item}"`); + }); +} +function addBannedItemForm(player) { + new ModalForm("Add Banned Item").addTextField("Item Id", "minecraft:string").show(player, (ctx, item) => { + let items = getConfigId("banned_items"); + if (items.includes(item)) + return ctx.error(`\xA7cItem "${item}" is already banned`); + items.push(item); + setConfigId("banned_items", items); + player.tell(`Banned the item "${item}"`); + }); +} +function manageBannedBlocksForm(player) { + new ActionForm("Manage Banned Blocks").addButton("Remove a Banned Block", null, () => { + removeBannedBlockForm(player); + }).addButton("Ban an block", null, () => { + addBannedBlockForm(player); + }).show(player); +} +function removeBannedBlockForm(player) { + new ModalForm("Remove Banned Block").addDropdown("Select block to remove", getConfigId("banned_blocks")).show(player, (ctx, block) => { + let blocks = getConfigId("banned_blocks"); + blocks = blocks.filter((p) => p != block); + setConfigId("banned_blocks", blocks); + player.tell(`Removed Banned block "${block}"`); + }); +} +function addBannedBlockForm(player) { + new ModalForm("Add Banned Block").addTextField("Block Id", "minecraft:barrier").show(player, (ctx, block) => { + let blocks = getConfigId("banned_blocks"); + if (blocks.includes(block)) + return ctx.error(`\xA7cBlock "${block}" is already banned`); + blocks.push(block); + setConfigId("banned_blocks", blocks); + player.tell(`Banned the block "${block}"`); + }); +} +function manageEnchantmentLevelsForm(player) { + new ModalForm("Manage Enchantment Levels").addDropdown("Enchantment to change", Object.keys(ENCHANTMENTS), 0).addTextField("Level (number)", "5").show(player, (ctx, enchantment, levelString) => { + if (isNaN(levelString)) + return ctx.error( + `\xA7c"${levelString}" is not a number, please enter a value like, "3", "9", etc.` + ); + const level = parseInt(levelString); + let enchants = getConfigId("enchantments"); + enchants[enchantment] = level; + setConfigId("enchantments", enchants); + player.tell(`Set max level for ${enchantment} to ${level}`); + }); +} +function manageAppealLinkForm(player) { + new ModalForm("Manage Appeal Link").addTextField("Appeal Link", APPEAL_LINK).show(player, (ctx, link) => { + setConfigId("appealLink", link); + player.tell(`Changed the servers appeal link to ${link}`); + }); +} + +// project/behavior/src/plugins/Anti-Cheat/modules/forms/automod.ts +function showAutoModHomeForm(player) { + const form = new ActionForm("Manage Protections"); + for (const protection6 of Object.values(PROTECTIONS)) { + form.addButton(protection6.name, protection6.iconPath, () => { + showProtectionConfig(protection6, player); + }); + } + form.addButton("Back", "textures/ui/arrow_dark_left_stretch.png", () => { + showHomeForm(player); + }).show(player); +} +function showProtectionConfig(protection6, player) { + const data = protection6.getConfig(); + const form = new ModalForm( + `Manage ${protection6.name} Protection Config` + ).addToggle("Enabled", data["enabled"]); + let keys = []; + for (const [key, value] of Object.entries(protection6.configDefault)) { + keys.push(key); + if (typeof value.defaultValue == "boolean") { + form.addToggle(value.description, data[key]); + } else if (typeof value.defaultValue == "number") { + form.addSlider(value.description, 0, 100, 1, data[key]); + } else { + form.addTextField(value.description, null, data[key]); + } + } + form.show(player, (ctx, enabled, ...keys2) => { + if (enabled != data["enabled"]) { + if (enabled) + protection6.enable(); + if (!enabled) + protection6.disable(); + } + let config = { + enabled + }; + for (const [i, key] of Object.keys(protection6.configDefault).entries()) { + config[key] = keys2[i]; + } + protection6.setConfig(config); + player.tell(`Updated config for ${protection6.name}!`); + }); +} + +// project/behavior/src/plugins/Anti-Cheat/modules/forms/home.ts +function showHomeForm(player) { + new ActionForm("Rubedo Settings").addButton("Auto Mod", "textures/ui/permissions_op_crown.png", () => { + showAutoModHomeForm(player); + }).addButton("Banned items", "textures/blocks/sculk_shrieker_top.png", () => { + manageBannedItemsForm(player); + }).addButton("Banned blocks", "textures/blocks/barrier.png", () => { + manageBannedBlocksForm(player); + }).addButton("Enchantments", "textures/items/book_enchanted.png", () => { + manageEnchantmentLevelsForm(player); + }).addButton("Appeal Link", "textures/ui/Feedback.png", () => { + manageAppealLinkForm(player); + }).show(player); +} + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/settings.ts +new Command({ + name: "settings", + description: "Opens up the settings menu for the player", + requires: (player) => ["admin", "moderator"].includes(getRole(player)) +}).executes((ctx) => { + showHomeForm(ctx.sender); + ctx.sender.tell(`\xA7aForm request sent, close chat to continue!`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/vanish.ts +import { world as world8 } from "@minecraft/server"; +function vanish(player, say) { + if (player.hasTag(`spectator`)) { + player.runCommandAsync(`gamemode c`); + player.triggerEvent(`removeSpectator`); + player.removeTag(`spectator`); + if (!say) + return; + world8.say({ + rawtext: [ + { + translate: "multiplayer.player.joined", + with: [`\xA7e${player.name}`] + } + ] + }); + } else { + player.runCommandAsync(`gamemode spectator`); + player.triggerEvent(`addSpectator`); + player.addTag(`spectator`); + if (!say) + return; + world8.say({ + rawtext: [ + { + translate: "multiplayer.player.left", + with: [`\xA7e${player.name}`] + } + ] + }); + } +} +new Command({ + name: "vanish", + description: "Toggles Vanish Mode on the sender", + requires: (player) => getRole(player) == "admin" +}).executes((ctx) => { + vanish(ctx.sender, false); +}).boolean("say").executes((ctx, say) => { + vanish(ctx.sender, say); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/version.ts +new Command({ + name: "version", + description: "Get Current Version", + aliases: ["v"] +}).executes((ctx) => { + ctx.reply(`Current Rubedo Version: ${VERSION}`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/kick.ts +new Command({ + name: "kick", + description: "Kicks a player from the game", + requires: (player) => getRole(player) == "admin" +}).argument(new ArgumentTypes.player()).string("reason").executes((ctx, player, reason) => { + kick(player, [reason]); + ctx.reply(`\xA7aKicked ${player.name} from world`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Log.ts +var Log = class { + constructor(data) { + this.data = data; + console.warn(`[LOG]: ${data.message}`); + TABLES.logs.set(Date.now().toString(), data); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/log.ts +function timeDifference(previous) { + var msPerMinute = 60 * 1e3; + var msPerHour = msPerMinute * 60; + var msPerDay = msPerHour * 24; + var msPerMonth = msPerDay * 30; + var msPerYear = msPerDay * 365; + var elapsed = Date.now() - previous; + if (elapsed < msPerMinute) { + return Math.round(elapsed / 1e3) + " seconds ago"; + } else if (elapsed < msPerHour) { + return Math.round(elapsed / msPerMinute) + " minutes ago"; + } else if (elapsed < msPerDay) { + return Math.round(elapsed / msPerHour) + " hours ago"; + } else if (elapsed < msPerMonth) { + return "approximately " + Math.round(elapsed / msPerDay) + " days ago"; + } else if (elapsed < msPerYear) { + return "approximately " + Math.round(elapsed / msPerMonth) + " months ago"; + } else { + return "approximately " + Math.round(elapsed / msPerYear) + " years ago"; + } +} +var root7 = new Command({ + name: "log", + description: "Manages the log command", + requires: (player) => getRole(player) == "admin" +}); +root7.literal({ + name: "add", + description: "Adds a new log" +}).string("message").executes((ctx, message) => { + new Log({ message }); + ctx.reply(`\xA7aAdded new log: ${message}`); +}); +root7.literal({ + name: "getAll", + description: "Gets all logs sorted in descending" +}).int("page").array("order", ["ascending", "descending"]).executes((ctx, page, order) => { + const allLogs = Object.entries(TABLES.logs.collection()).sort( + (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) + ); + if (allLogs.length == 0) + return ctx.reply(`\xA7cNo Logs have been made!`); + const maxPages = Math.ceil(allLogs.length / 8); + if (page > maxPages) + page = maxPages; + ctx.reply( + `\xA72--- Showing logs page ${page} of ${maxPages} (${PREFIX}log getAll ) ---` + ); + for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { + ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); + } +}); +root7.literal({ + name: "getPlayersLogs", + description: "Gets all logs associated with a player" +}).argument(new ArgumentTypes.playerName()).int("page").array("order", ["ascending", "descending"]).executes((ctx, playerName, page, order) => { + const allLogs = Object.entries(TABLES.logs.collection()).filter((v) => v[1].playerName == playerName).sort( + (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) + ); + if (allLogs.length == 0) + return ctx.reply(`\xA7cNo Logs exists for "${playerName}"!`); + const maxPages = Math.ceil(allLogs.length / 8); + if (page > maxPages) + page = maxPages; + ctx.reply( + `\xA72--- Showing logs for "${playerName}" page ${page} of ${maxPages} ---` + ); + for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { + ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); + } +}); +root7.literal({ + name: "getProtectionLogs", + description: "Gets all logs associated with a protection" +}).string("protection").int("page").array("order", ["ascending", "descending"]).executes((ctx, protection6, page, order) => { + const allLogs = Object.entries(TABLES.logs.collection()).filter((v) => v[1].protection == protection6).sort( + (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) + ); + if (allLogs.length == 0) + return ctx.reply(`\xA7cNo Logs exists for protection: "${protection6}"!`); + const maxPages = Math.ceil(allLogs.length / 8); + if (page > maxPages) + page = maxPages; + ctx.reply( + `\xA72--- Showing logs for Protection: "${protection6}" page ${page} of ${maxPages} ---` + ); + for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { + ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); + } +}); +root7.literal({ + name: "clearAll", + description: "Clears all logs" +}).executes((ctx) => { + TABLES.logs.clear(); + ctx.reply(`\xA7aCleared All logs!`); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/commands/teleport.ts +var root8 = new Command({ + name: "teleport", + description: "Teleports entities (players, mobs, etc.).", + aliases: ["tp"], + requires: (player) => getRole(player) == "admin" +}); +root8.argument(new ArgumentTypes.player()).location("destination").executes((ctx, player, destination) => { + player.addTag("skip-movement-check"); + player.teleport(destination, player.dimension, 0, 0); + ctx.reply( + `Teleported ${player.name} to ${destination.x} ${destination.y} ${destination.z}` + ); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/ban.ts +forEachValidPlayer((player) => { + try { + const banData = TABLES.bans.get(player.id); + if (!banData) + return; + if (banData.expire && banData.expire < Date.now()) + return TABLES.bans.delete(player.id); + kick( + player, + [ + `\xA7cYou have been banned!`, + `\xA7aReason: \xA7f${banData.reason}`, + `\xA7fExpiry: \xA7b${banData.expire ? msToTime(banData.expire - Date.now()) : "Forever"}`, + `\xA7fAppeal at: \xA7b${getConfigId("appealLink")}` + ], + () => { + console.warn(new Error("Failed to kick player")); + TABLES.bans.delete(player.id); + } + ); + } catch (error) { + console.warn(error + error.stack); + } +}, 20); + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/freeze.ts +import { Location as Location4 } from "@minecraft/server"; +forEachValidPlayer((player) => { + try { + const freezeData = TABLES.freezes.get(player.id); + if (!freezeData) + return player.getComponent("movement").resetToDefaultValue(); + player.getComponent("movement").setCurrent(0); + player.teleport( + new Location4( + freezeData.location.x, + freezeData.location.y, + freezeData.location.z + ), + DIMENSIONS[freezeData.location.dimension], + 0, + 0 + ); + } catch (error) { + } +}, 200); + +// project/behavior/src/lib/Events/beforeChat.ts +import { world as world9 } from "@minecraft/server"; +var CALLBACKS4 = {}; +world9.events.beforeChat.subscribe((data) => { + if (data.message.startsWith(PREFIX)) + return; + for (const callback of Object.values(CALLBACKS4)) { + callback.callback(data); + } +}); +var beforeChat = class { + static subscribe(callback) { + const key = Date.now(); + CALLBACKS4[key] = { callback }; + return key; + } + static unsubscribe(key) { + delete CALLBACKS4[key]; + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/mute.ts +beforeChat.subscribe((data) => { + const muteData = Mute.getMuteData(data.sender); + if (!muteData) + return; + if (muteData.expire && muteData.expire < Date.now()) + return TABLES.mutes.delete(data.sender.name); + data.cancel = true; + data.sender.tell(text["modules.managers.mute.isMuted"]()); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/region.ts +import { BlockLocation as BlockLocation6, system as system9, world as world10 } from "@minecraft/server"; +system9.runSchedule(() => { + loadRegionDenys(); +}, 6e3); +world10.events.beforeItemUseOn.subscribe((data) => { + if (["moderator", "admin"].includes(getRole(data.source))) + return; + const region = Region.blockLocationInRegion( + data.blockLocation, + data.source.dimension.id + ); + if (!region) + return; + const block = data.source.dimension.getBlock(data.blockLocation); + if (DOORS_SWITCHES.includes(block.typeId) && region.permissions.doorsAndSwitches) + return; + if (BLOCK_CONTAINERS.includes(block.typeId) && region.permissions.openContainers) + return; + data.cancel = true; +}); +world10.events.beforeExplosion.subscribe((data) => { + for (let i = 0; i < data.impactedBlocks.length; i++) { + const bL = data.impactedBlocks[i]; + let region = Region.blockLocationInRegion(bL, data.dimension.id); + if (region) + return data.cancel = true; + } +}); +world10.events.entityCreate.subscribe(async ({ entity }) => { + const region = await Region.blockLocationInRegionSync( + new BlockLocation6(entity.location.x, entity.location.y, entity.location.z), + entity.dimension.id + ); + if (!region) + return; + if (region.permissions.allowedEntities.includes(entity.typeId)) + return; + entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0); + entity.kill(); +}); +EntitiesLoad.subscribe(() => { + system9.runSchedule(async () => { + for (const region of await Region.getAllRegionsSync()) { + for (const entity of DIMENSIONS[region.dimensionId].getEntities({ excludeTypes: region.permissions.allowedEntities })) { + if (!region.entityInRegion(entity)) + continue; + entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0); + entity.kill(); + } + } + }, 100); +}); +forEachValidPlayer((player) => { + for (const region of Region.getAllRegions()) { + if (region.entityInRegion(player)) { + player.addTag(`inRegion`); + if (!region.permissions.pvp) + player.addTag(`region-protected`); + } else { + player.removeTag(`inRegion`); + player.removeTag(`region-protected`); + } + } +}, 5); + +// project/behavior/src/plugins/Anti-Cheat/modules/events/playerJoin.ts +import { world as world11 } from "@minecraft/server"; +world11.events.playerJoin.subscribe(async ({ player }) => { + await EntitiesLoad.awaitLoad(); + if (isLockedDown() && getRole(player) != "admin") + return kick(player, text["lockdown.kick.message"]()); + if (Mute.getMuteData(player)) + player.runCommandAsync(`ability @s mute true`); + if (!TABLES.ids.has(player.name)) { + TABLES.ids.set(player.name, player.id); + } else { + player.addTag("old"); + } + const roleToSet = ChangePlayerRoleTask.getPlayersRoleToSet(player.name); + if (roleToSet) + setRole(player, roleToSet); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/pages/see.ts +import { + Items, + MinecraftItemTypes as MinecraftItemTypes4, + world as world12 +} from "@minecraft/server"; +var FILLABLE_SLOTS = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44 +]; +var FILLABLE_SLOTS_ENDERCHEST = [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 37, + 38, + 39, + 40, + 41, + 42, + 43 +]; +function ViewPlayersFill(entity, page, extras) { + const container = entity.getComponent( + "minecraft:inventory" + ).container; + for (let i = 0; i < container.size; i++) { + const slot = page.slots[i]; + if (!slot || !slot.item) { + container.setItem(i, AIR); + continue; + } + container.setItem(i, slot.item.itemStack); + } + for (const [i, player] of [...world12.getPlayers()].entries()) { + const slot = FILLABLE_SLOTS[i]; + const item = new PageItem(MinecraftItemTypes4.skull, { + nameTag: player.name, + data: 3 + }); + container.setItem(slot, item.itemStack); + page.slots[slot] = { + item, + action: (ctx) => { + ctx.PageAction("moderation:see_inventory", { name: player.name }); + } + }; + } +} +function ViewPlayerInventoryFill(entity, page, extras) { + const container = entity.getComponent("minecraft:inventory").container; + for (let i = 0; i < container.size; i++) { + const slot = page.slots[i]; + if (!slot || !slot.item) { + container.setItem(i, AIR); + continue; + } + container.setItem(i, slot.item.itemStack); + } + const EnderChestItem = new PageItem(MinecraftItemTypes4.enderChest, { + nameTag: `\xA7eView \xA7f${extras?.name}\xA7e Ender Chest +\xA7fNote: \xA7cThis will not grab \xA7lANY NBT!\xA7r` + }); + container.setItem(49, EnderChestItem.itemStack); + page.slots[49] = { + item: EnderChestItem, + action: (ctx) => { + ctx.PageAction("moderation:see_ender_chest", { name: extras.name }); + } + }; + const player = [...world12.getPlayers()].find((p) => p.name == extras.name); + if (!player) { + const gui = Object.values(CHESTGUIS).find((e2) => e2.entity.id == entity.id); + gui.despawn(); + player.tell(`"${extras.name}" Could not be found, Gui Crashed`); + } + const inventory = player.getComponent("inventory").container; + let used_slots = 0; + for (let i = 0; i < inventory.size; i++) { + const item = inventory.getItem(i); + const slot = FILLABLE_SLOTS[used_slots]; + used_slots++; + if (!item) { + container.setItem(slot, AIR); + continue; + } + container.setItem(slot, item); + page.slots[slot] = { + item: new PageItem( + Items.get(item.typeId), + { amount: item.amount, data: item.data }, + item + ), + action: (ctx) => { + if (i < 9) { + player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`); + } else { + player.runCommandAsync( + `replaceitem entity @s slot.inventory ${i - 9} air` + ); + } + ctx.GiveAction(); + page.slots[slot] = { + item: null, + action: (ctx2) => { + inventory.addItem(ctx2.getItemAdded()); + } + }; + } + }; + } +} +async function ViewPlayerEnderChestFill(entity, page, extras) { + const container = entity.getComponent("minecraft:inventory").container; + for (let i = 0; i < container.size; i++) { + const slot = page.slots[i]; + if (!slot || !slot.item) { + container.setItem(i, AIR); + continue; + } + container.setItem(i, slot.item.itemStack); + } + const player = [...world12.getPlayers()].find((p) => p.name == extras?.name); + if (!player) { + const gui = Object.values(CHESTGUIS).find((e2) => e2.entity.id == entity.id); + gui.despawn(); + player.tell(`"${extras.name}" Could not be found, Gui Crashed`); + } + let used_slots = 0; + const ItemTypes = Object.values(MinecraftItemTypes4); + for (const item of ItemTypes) { + try { + await player.runCommandAsync( + `testfor @s[hasitem={item=${item.id},location=slot.enderchest}]` + ); + const ChestGuiItem = new PageItem(item, { + nameTag: "Note: \xA7l\xA7cThis is not the exact item" + }); + const slot = FILLABLE_SLOTS_ENDERCHEST[used_slots]; + container.setItem(slot, ChestGuiItem.itemStack); + page.slots[slot] = { + item: ChestGuiItem, + action: (ctx) => { + ctx.GiveAction(); + page.slots[slot] = null; + } + }; + used_slots++; + } catch (error) { + } + } +} +new Page("moderation:see", ViewPlayersFill).setSlots( + [50], + new PageItem(MinecraftItemTypes4.arrow, { + nameTag: "\xA7fBack" + }), + (ctx) => { + ctx.PageAction("home"); + } +).setSlots( + [48], + new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), + (ctx) => { + ctx.CloseAction(); + } +); +new Page("moderation:see_inventory", ViewPlayerInventoryFill).setSlots( + [50], + new PageItem(MinecraftItemTypes4.arrow, { + nameTag: "\xA7fBack" + }), + (ctx) => { + ctx.PageAction("moderation:see"); + } +).setSlots( + [48], + new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), + (ctx) => { + ctx.CloseAction(); + } +); +new Page("moderation:see_ender_chest", ViewPlayerEnderChestFill).setSlots( + [50], + new PageItem(MinecraftItemTypes4.arrow, { + nameTag: "\xA7fBack" + }), + (ctx) => { + ctx.PageAction("moderation:see"); + } +).setSlots( + [48], + new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), + (ctx) => { + ctx.CloseAction(); + } +); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts +import { Player as Player10, MinecraftBlockTypes as MinecraftBlockTypes4 } from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/Protection.ts +import { system as system10, world as world13 } from "@minecraft/server"; +var Protection = class { + constructor(name, description, iconPath, isEnabledByDefault) { + this.name = name; + this.description = description; + this.iconPath = iconPath; + this.isEnabledByDefault = isEnabledByDefault; + this.name = name; + this.description = description; + this.iconPath = iconPath; + this.configDefault = {}; + this.isEnabled = false; + this.isEnabledByDefault = isEnabledByDefault; + this.events = {}; + this.schedules = []; + this.forEachValidPlayers = []; + PROTECTIONS[this.name] = this; + } + setConfigDefault(data) { + this.configDefault = data; + TABLES.protections.hasSync(this.name).then((v) => { + if (v) + return; + let saveData = { + enabled: true + }; + for (const key of Object.keys(data)) { + saveData[key] = data[key].defaultValue; + } + TABLES.protections.set(this.name, saveData); + }); + return this; + } + getConfig() { + let config = TABLES.protections.get(this.name); + if (!config) + config = { enabled: this.isEnabled }; + return config; + } + async setConfig(data) { + return TABLES.protections.set(this.name, data); + } + triggerChange(enabled) { + if (enabled) { + this.isEnabled = true; + this.onEnableCallback?.(); + for (const [key, value] of Object.entries(this.events)) { + if (value.triggered) + continue; + let callback = world13.events[key].subscribe( + value.callback + ); + value.triggered = true; + value.callback = callback; + } + for (const v of this.forEachValidPlayers) { + if (v.key) + continue; + let key = forEachValidPlayer(v.callback, v.delay); + v.key = key; + } + for (const v of this.schedules) { + if (v.runScheduleId) + continue; + let runScheduleId = system10.runSchedule(v.callback); + v.runScheduleId = runScheduleId; + } + } else { + this.isEnabled = false; + this.onDisableCallback?.(); + for (const [key, value] of Object.entries(this.events)) { + if (!value.triggered) + continue; + world13.events[key].unsubscribe(value.callback); + value.triggered = false; + } + for (const v of this.forEachValidPlayers) { + if (!v.key) + continue; + clearForEachValidPlayer(v.key); + v.key = null; + } + for (const v of this.schedules) { + if (!v.runScheduleId) + continue; + system10.clearRunSchedule(v.runScheduleId); + v.runScheduleId = null; + } + } + } + onEnable(callback) { + this.onEnableCallback = callback; + return this; + } + onDisable(callback) { + this.onDisableCallback = callback; + return this; + } + subscribe(id, callback) { + this.events[id] = { + callback, + triggered: false + }; + return this; + } + runSchedule(callback, tickInterval) { + this.schedules.push({ + callback, + tickInterval, + runScheduleId: null + }); + return this; + } + forEachValidPlayer(callback, delay = 0) { + this.forEachValidPlayers.push({ + callback, + delay, + key: null + }); + return this; + } + enable() { + this.triggerChange(true); + } + disable() { + this.triggerChange(false); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts +var CBE_ENTITIES = ["minecraft:command_block_minecart"]; +var protection = new Protection( + "cbe", + "Stops CBE", + "textures/blocks/command_block.png", + true +).setConfigDefault({ + entityCreate: { + description: "Adds NPC protection", + defaultValue: true + }, + banSpawnEggs: { + description: "If spawn eggs should be banned", + defaultValue: true + } +}); +protection.subscribe("entityCreate", ({ entity }) => { + const config = protection.getConfig(); + if (!config.entityCreate) + return; + const kill = () => { + try { + entity.triggerEvent("despawn"); + entity.kill(); + } catch (error) { + entity.kill(); + } + }; + if (CBE_ENTITIES.includes(entity.typeId)) + return kill(); + if (entity.typeId == "minecraft:npc" && !Npc.isValid(entity)) + return kill(); +}); +protection.subscribe("beforeItemUseOn", (data) => { + if (!(data.source instanceof Player10)) + return; + if (["admin", "moderator"].includes(getRole(data.source))) + return; + const config = protection.getConfig(); + if (data.item.typeId.endsWith("spawn_egg")) { + if (!config.banSpawnEggs) + return; + const block = data.source.dimension.getBlock(data.blockLocation); + if (block.typeId == MinecraftBlockTypes4.mobSpawner.id) + return; + data.cancel = true; + data.source.tell(`\xA7c[Rubedo]: You cannot place spawnEggs on the floor!`); + data.source.playSound(`note.bass`); + } else { + if (FORBIDDEN_BLOCKS.includes(data.item.typeId)) { + data.cancel = true; + return; + } + const BANNED_BLOCKS2 = getConfigId("banned_blocks"); + if (!BANNED_BLOCKS2.includes(data.item.typeId)) + return; + data.cancel = true; + new Ban(data.source, null, "Placing Banned Blocks"); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/crasher.ts +var DISTANCE = 32e4; +new Protection( + "crasher", + "Protection against type 1 crasher", + "textures/ui/servers.png", + true +).forEachValidPlayer((player) => { + if (Math.abs(player.location.x) > DISTANCE || Math.abs(player.location.y) > DISTANCE || Math.abs(player.location.z) > DISTANCE) { + new Ban(player, null, "Crasher detected"); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts +import { GameMode as GameMode2, world as world15 } from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts +import { world as world14 } from "@minecraft/server"; +var PlayerLog = class { + constructor() { + this.data = /* @__PURE__ */ new Map(); + this.events = { + playerLeave: world14.events.playerLeave.subscribe( + (data) => this.data.delete(data.playerName) + ) + }; + } + set(player, value) { + this.data.set(player.name, value); + } + get(player) { + return this.data.get(player.name); + } + delete(player) { + this.data.delete(player.name); + } + clear() { + this.data.clear(); + } + playerNames() { + return [...this.data.keys()]; + } + includes(player) { + return this.playerNames().includes(player.name); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts +var ILLEGAL_GAMEMODE = GameMode2.creative; +var ViolationCount = new PlayerLog(); +var protection2 = new Protection( + "gamemode", + "Blocks illegal gamemode", + "textures/ui/creative_icon.png", + true +).setConfigDefault({ + clearPlayer: { + description: "Whether to clear players inventory.", + defaultValue: true + }, + setToSurvival: { + description: "If player should be set to survival after being flagged.", + defaultValue: true + }, + banPlayer: { + description: "If player should be banned after violation count is met.", + defaultValue: false + }, + violationCount: { + description: "The amount of violations before ban.", + defaultValue: 0 + } +}); +protection2.runSchedule(() => { + const config = protection2.getConfig(); + for (const player of world15.getPlayers({ gameMode: ILLEGAL_GAMEMODE })) { + if (["moderator", "admin", "builder"].includes(getRole(player))) + continue; + try { + if (config.setToSurvival) + player.runCommandAsync(`gamemode s`); + if (config.clearPlayer) + player.runCommandAsync(`clear @s`); + } catch (error) { + } + new Log({ + playerName: player.name, + protection: "Gamemode", + message: `${player.name} has entered into a illegal gamemode!` + }); + const count = (ViolationCount.get(player) ?? 0) + 1; + ViolationCount.set(player, count); + if (config.banPlayer && count >= config.violationCount) + new Ban(player, null, "Illegal Gamemode"); + } +}, 20); + +// project/behavior/src/lib/Events/beforeBlockBreak.ts +import { + world as world17, + Location as Location5, + system as system12 +} from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts +import { system as system11, world as world16 } from "@minecraft/server"; + +// project/behavior/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts +var BlockInventory = class { + constructor(inventory) { + this.emptySlotsCount = inventory.emptySlotsCount; + this.size = inventory.size; + this.items = []; + for (let i = 0; i < this.size; i++) { + this.items[i] = inventory.getItem(i); + } + } + load(block) { + for (let i = 0; i < block.size; i++) { + if (!this.items[i]) + continue; + block.setItem(i, this.items[i]); + } + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts +var CONTAINER_LOCATIONS = {}; +system11.runSchedule(() => { + CONTAINER_LOCATIONS = {}; + for (const player of world16.getPlayers()) { + if (player.dimension.id != "minecraft:overworld") + continue; + const blockLoc = vector3ToBlockLocation(player.location); + const pos1 = blockLoc.offset(CHECK_SIZE.x, CHECK_SIZE.y, CHECK_SIZE.z); + const pos2 = blockLoc.offset(-CHECK_SIZE.x, -CHECK_SIZE.y, -CHECK_SIZE.z); + for (const location of pos1.blocksBetween(pos2)) { + if (location.y < -64) + continue; + const block = player.dimension.getBlock(location); + if (!block) + continue; + if (!API_CONTAINERS.includes(block.typeId)) + continue; + CONTAINER_LOCATIONS[JSON.stringify(location)] = new BlockInventory( + block.getComponent("inventory").container + ); + } + } +}, 100); + +// project/behavior/src/lib/Events/beforeBlockBreak.ts +var CALLBACKS5 = {}; +world17.events.blockBreak.subscribe((data) => { + for (const callback of Object.values(CALLBACKS5)) { + callback.callback( + new BeforeBlockBreakEvent( + data.block, + data.brokenBlockPermutation, + data.dimension, + data.player + ) + ); + } +}); +var beforeBlockBreak = class { + static subscribe(callback) { + const key = Date.now(); + CALLBACKS5[key] = { callback }; + return key; + } + static unsubscribe(key) { + delete CALLBACKS5[key]; + } +}; +var BeforeBlockBreakEvent = class { + constructor(block, brokenBlockPermutation, dimension, player) { + this.block = block; + this.brokenBlockPermutation = brokenBlockPermutation; + this.dimension = dimension; + this.player = player; + this.block = block; + this.brokenBlockPermutation = brokenBlockPermutation; + this.dimension = dimension; + this.player = player; + } + set cancel(value) { + this.dimension.getBlock(this.block.location).setPermutation(this.brokenBlockPermutation.clone()); + if (API_CONTAINERS.includes(this.brokenBlockPermutation.type.id)) { + const OLD_INVENTORY = CONTAINER_LOCATIONS[JSON.stringify(this.block.location)]; + if (OLD_INVENTORY) { + OLD_INVENTORY.load(this.block.getComponent("inventory").container); + } + } + system12.run(() => { + [ + ...this.dimension.getEntities({ + maxDistance: 2, + type: "minecraft:item", + location: new Location5( + this.block.location.x, + this.block.location.y, + this.block.location.z + ) + }) + ].forEach((e2) => e2.kill()); + }); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/nuker.ts +var log = new PlayerLog(); +var IMPOSSIBLE_BREAK_TIME = 15; +var VALID_BLOCK_TAGS = [ + "snow", + "lush_plants_replaceable", + "azalea_log_replaceable", + "minecraft:crop", + "fertilize_area" +]; +var IMPOSSIBLE_BREAKS = [ + "minecraft:water", + "minecraft:flowing_water", + "minecraft:lava", + "minecraft:flowing_lava", + "minecraft:bedrock" +]; +var ViolationCount2 = new PlayerLog(); +var beforeBlockBreakKey = null; +var protection3 = new Protection( + "nuker", + "Blocks block breaking too fast", + "textures/blocks/dirt.png", + true +).setConfigDefault({ + banPlayer: { + description: "If the player should be banned once violation count is met", + defaultValue: false + }, + violationCount: { + description: "Violations before ban", + defaultValue: 0 + } +}); +protection3.onEnable(() => { + const config = protection3.getConfig(); + beforeBlockBreakKey = beforeBlockBreak.subscribe((data) => { + if (["moderator", "admin"].includes(getRole(data.player))) + return; + if (data.block.getTags().some((tag) => VALID_BLOCK_TAGS.includes(tag))) + return; + const old = log.get(data.player); + log.set(data.player, Date.now()); + if (!old) + return; + if (!IMPOSSIBLE_BREAKS.includes(data.block.typeId)) { + if (old < Date.now() - IMPOSSIBLE_BREAK_TIME) + return; + const count = (ViolationCount2.get(data.player) ?? 0) + 1; + ViolationCount2.set(data.player, count); + if (config.banPlayer && count >= config.violationCount) + new Ban(data.player, null, "Using Nuker"); + } + data.cancel = true; + }); +}).onDisable(() => { + beforeBlockBreak.unsubscribe(beforeBlockBreakKey); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/spam.ts +var previousMessage = new PlayerLog(); +var ViolationCount3 = new PlayerLog(); +var protection4 = new Protection( + "spam", + "Blocks spam in chat", + "textures/ui/mute_on.png", + true +).setConfigDefault({ + permMutePlayer: { + description: "If player should be permanently muted once violation count is met.", + defaultValue: false + }, + violationCount: { + description: "Violation count before permanent mute", + defaultValue: 0 + }, + repeatedMessages: { + description: "Blocks repeated messages", + defaultValue: true + }, + zalgo: { + description: "Blocks zalgo", + defaultValue: true + } +}); +protection4.subscribe("beforeChat", (data) => { + try { + if (data.message.startsWith(PREFIX)) + return; + if (["admin", "moderator"].includes(getRole(data.sender))) + return; + const config = protection4.getConfig(); + const isSpam = () => { + const count = (ViolationCount3.get(data.sender) ?? 0) + 1; + ViolationCount3.set(data.sender, count); + if (config.permMutePlayer && count >= config.violationCount) + new Mute(data.sender, null, "Spamming"); + }; + if (config.repeatedMessages && previousMessage.get(data.sender) == data.message) { + data.cancel = true; + isSpam(); + return data.sender.tell(`\xA7cRepeated message detected!`); + } + if (config.zalgo && /%CC%/g.test(encodeURIComponent(data.message))) { + data.cancel = true; + isSpam(); + return data.sender.tell( + `\xA7cYou message contains some type of zalgo and cannot be sent!` + ); + } + previousMessage.set(data.sender, data.message); + } catch (error) { + console.warn(error + error.stack); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts +var ViolationCount4 = new PlayerLog(); +function flag(player, index) { + const inventory = player.getComponent("inventory").container; + const item = inventory.getItem(index); + const data = getConfigId("cbe_config"); + if (data.clearItem) + inventory.setItem(index, AIR); + new Log({ + playerName: player.name, + message: `${player.name} Has obtained a unobtainable item: ${item.typeId}`, + protection: "unobtainable" + }); + if (!data.banPlayer) + return; + const violations2 = (ViolationCount4.get(player) ?? 0) + 1; + ViolationCount4.set(player, violations2); + if (violations2 < data.violationCount) + return; + new Ban(player, null, "Possession of Unobtainable item"); +} +new Protection( + "unobtainable", + "Blocks unobtainable items", + "textures/blocks/end_portal.png", + true +).forEachValidPlayer((player) => { + console.warn(`unobtainable`); + const BANNED_ITEMS2 = getConfigId("banned_items"); + const inventory = player.getComponent("inventory").container; + for (let i = 0; i < inventory.size; i++) { + const item = inventory.getItem(i); + if (!item) + continue; + if (BANNED_ITEMS2.includes(item.typeId)) + return flag(player, i); + if (FORBIDDEN_ITEMS.includes(item.typeId)) { + new Log({ + playerName: player.name, + message: `${player.name} Has obtained a Forbidden item: ${item.typeId}`, + protection: "unobtainable" + }); + return inventory.setItem(i, AIR); + } + let enchantments = []; + for (const enchantment of item.getComponent("enchantments").enchantments) { + const MAX_LEVEL = getMaxEnchantmentLevel(enchantment); + if (enchantment.level > MAX_LEVEL) + return flag(player, i); + if (enchantment.level < 1) + return flag(player, i); + if (enchantments.includes(enchantment.type.id)) + return flag(player, i); + enchantments.push(enchantment.type.id); + } + } +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/nbt.ts +import { + MinecraftBlockTypes as MinecraftBlockTypes5, + MinecraftEntityTypes, + MinecraftItemTypes as MinecraftItemTypes5, + Player as Player13 +} from "@minecraft/server"; +var BLOCKS = [ + MinecraftBlockTypes5.chest.id, + MinecraftBlockTypes5.trappedChest.id, + MinecraftBlockTypes5.barrel.id, + MinecraftBlockTypes5.dispenser.id, + MinecraftBlockTypes5.dropper.id, + MinecraftBlockTypes5.furnace.id, + MinecraftBlockTypes5.litFurnace.id, + MinecraftBlockTypes5.blastFurnace.id, + MinecraftBlockTypes5.litBlastFurnace.id, + MinecraftBlockTypes5.smoker.id, + MinecraftBlockTypes5.litSmoker.id, + MinecraftBlockTypes5.hopper.id, + MinecraftBlockTypes5.beehive.id, + MinecraftBlockTypes5.beeNest.id, + MinecraftBlockTypes5.mobSpawner.id +]; +var CHEST_BOATS = [ + MinecraftItemTypes5.chestBoat.id, + MinecraftItemTypes5.oakChestBoat.id, + MinecraftItemTypes5.birchChestBoat.id, + MinecraftItemTypes5.acaciaChestBoat.id, + MinecraftItemTypes5.jungleChestBoat.id, + MinecraftItemTypes5.spruceChestBoat.id, + MinecraftItemTypes5.darkOakChestBoat.id, + MinecraftItemTypes5.mangroveChestBoat.id +]; +new Protection( + "nbt", + "Blocks illegal nbt on items", + "textures/ui/icon_random.png", + true +).subscribe("blockPlace", async ({ block }) => { + if (!BLOCKS.includes(block.typeId)) + return; + const permutation = block.permutation; + await block.dimension.runCommandAsync( + `setblock ${block.x} ${block.y} ${block.z} ${block.typeId}` + ); + block.setPermutation(permutation); +}).subscribe("beforeItemUseOn", (data) => { + if (!(data.source instanceof Player13)) + return; + if (!CHEST_BOATS.includes(data.item.typeId)) + return; + data.cancel = true; + data.source.dimension.spawnEntity( + MinecraftEntityTypes.chestBoat.id, + data.blockLocation.above() + ); + if (getGamemode(data.source) == "creative") + return; + data.source.getComponent("inventory").container.setItem(data.source.selectedSlot, AIR); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts +import { + MinecraftEffectTypes, + MinecraftItemTypes as MinecraftItemTypes6, + Player as Player15 +} from "@minecraft/server"; + +// project/behavior/src/lib/Events/onPlayerMove.ts +import { system as system13, world as world18 } from "@minecraft/server"; +var CALLBACKS6 = {}; +function vector3Equals(from, to) { + if (from.x != to.x) + return false; + if (from.y != to.y) + return false; + if (from.z != to.z) + return false; + return true; +} +var playerLocation = new PlayerLog(); +system13.runSchedule(() => { + const sendCallback2 = (player, data) => { + for (const callback of Object.values(CALLBACKS6)) { + callback.callback(player, data); + } + }; + for (const player of world18.getPlayers()) { + const oldLocation = playerLocation.get(player); + if (oldLocation) { + if (vector3Equals(player.location, oldLocation.location)) { + continue; + } + } + playerLocation.set(player, { + location: player.location, + dimension: player.dimension + }); + if (!oldLocation) + continue; + sendCallback2(player, oldLocation); + } +}); +var onPlayerMove = class { + static subscribe(callback) { + const key = Date.now(); + CALLBACKS6[key] = { callback }; + return key; + } + static unsubscribe(key) { + delete CALLBACKS6[key]; + } + static delete(player) { + playerLocation.delete(player); + } +}; + +// project/behavior/src/plugins/Anti-Cheat/config/movement.ts +var MOVEMENT_DISTANCE_THRESHOLD = 0.8; +var MOVEMENT_CONSTANTS = { + walk: { + velocity: 0.17, + distance: 0.23 + }, + run: { + velocity: 0.19, + distance: 0.35 + } +}; +var SPEED_EFFECT_INCREASE = 0.056; +var ANTI_TP_DISTANCE_THRESHOLD = 10; +var TAGS = ["gliding", "riding"]; + +// project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts +var violations = new PlayerLog(); +function distanceBetween(loc1, loc2) { + return Math.hypot(loc2.x - loc1.x, loc2.z - loc1.z); +} +function getSpeedOffset(player) { + const speed = player.getEffect(MinecraftEffectTypes.speed)?.amplifier ?? 0; + return speed * SPEED_EFFECT_INCREASE; +} +function isDistanceFlag(distance, player) { + const speedIntensity = getSpeedOffset(player); + const offset = MOVEMENT_CONSTANTS.run.distance + MOVEMENT_DISTANCE_THRESHOLD; + return distance > speedIntensity + offset; +} +function flag2(player, old) { + const violationCount = (violations.get(player) ?? 0) + 1; + violations.set(player, violationCount); + onPlayerMove.delete(player); + if (violationCount < 3) + return; + player.teleport( + old.location, + old.dimension, + player.rotation.x, + player.rotation.y + ); +} +var onPlayerMoveSubKey = null; +var protection5 = new Protection( + "movement", + "Blocks illegal movements on players", + "textures/ui/move.png", + true +).setConfigDefault({ + tpCheck: { + description: "If teleports should be flagged", + defaultValue: true + } +}); +protection5.onEnable(() => { + const config = protection5.getConfig(); + onPlayerMoveSubKey = onPlayerMove.subscribe((player, old) => { + if (getRole(player) == "admin") + return; + if (player.dimension.id != old.dimension.id) + return; + if (player.getTags().some((tag) => TAGS.includes(tag))) + return; + const distance = distanceBetween(player.location, old.location); + if (player.hasTag(`skip-movement-check`)) + return player.removeTag(`skip-movement-check`); + if (distance > ANTI_TP_DISTANCE_THRESHOLD) { + if (!config.tpCheck) + return; + flag2(player, old); + } else { + if (!isDistanceFlag(distance, player)) + return; + flag2(player, old); + } + }); +}).onDisable(() => { + onPlayerMove.unsubscribe(onPlayerMoveSubKey); +}); +protection5.subscribe("dataDrivenEntityTriggerEvent", (data) => { + if (!(data.entity instanceof Player15)) + return; + if (data.id != "on_death") + return; + onPlayerMove.delete(data.entity); +}); +protection5.subscribe("projectileHit", ({ projectile, source }) => { + if (projectile.typeId != MinecraftItemTypes6.enderPearl.id) + return; + if (!(source instanceof Player15)) + return; + onPlayerMove.delete(source); +}); +protection5.subscribe("itemCompleteCharge", ({ itemStack, source }) => { + if (itemStack.typeId != MinecraftItemTypes6.chorusFruit.id) + return; + if (!(source instanceof Player15)) + return; + onPlayerMove.delete(source); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts +import { MinecraftEffectTypes as MinecraftEffectTypes2, Player as Player16, world as world19 } from "@minecraft/server"; +var e = world19.events.beforeDataDrivenEntityTriggerEvent.subscribe((data) => { + if (!(data.entity instanceof Player16)) + return; + if (data.id != "rubedo:becomeAdmin") + return; + data.entity.removeTag("CHECK_PACK"); + const serverOwnerName = getServerOwnerName(); + if (serverOwnerName) { + data.entity.playSound("note.bass"); + data.entity.tell( + `\xA7cFailed to give server owner: "${serverOwnerName}" is already owner!` + ); + return world19.events.beforeDataDrivenEntityTriggerEvent.unsubscribe(e); + } + setRole(data.entity, "admin"); + setServerOwner(data.entity); + data.entity.addEffect(MinecraftEffectTypes2.blindness, 3, 255, true); + data.entity.tell( + `\xA7aYou have now been set as the "owner" of this server. The command "/function start" will not do anything anymore, type "-help" for more information!` + ); +}); + +// project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts +import { + DynamicPropertiesDefinition, + MinecraftEntityTypes as MinecraftEntityTypes2, + world as world20 +} from "@minecraft/server"; + +// project/behavior/src/config/objectives.ts +var OBJECTIVES = []; + +// project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts +world20.events.worldInitialize.subscribe(({ propertyRegistry }) => { + let def2 = new DynamicPropertiesDefinition(); + def2.defineString("role", 30); + propertyRegistry.registerEntityTypeDynamicProperties( + def2, + MinecraftEntityTypes2.player + ); + let def3 = new DynamicPropertiesDefinition(); + def3.defineString("worldsOwner", 100); + def3.defineBoolean("isLockDown"); + propertyRegistry.registerWorldDynamicProperties(def3); + for (const obj of OBJECTIVES) { + world20.scoreboard.addObjective(obj.objective, obj.displayName ?? ""); + } +}); + +// project/behavior/src/plugins/Anti-Cheat/index.ts +var NPC_LOCATIONS = []; +function clearNpcLocations() { + NPC_LOCATIONS = []; +} + +// project/behavior/src/plugins/import.ts +console.warn(`----- Importing Plugins -----`); + +// project/behavior/src/database/index.ts +import { + DynamicPropertiesDefinition as DynamicPropertiesDefinition2, + EntityTypes, + world as world21 +} from "@minecraft/server"; +world21.events.worldInitialize.subscribe(({ propertyRegistry }) => { + DIMENSIONS.overworld.runCommandAsync( + `tickingarea add ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} db true` + ); + let def = new DynamicPropertiesDefinition2(); + def.defineString("tableName", 30); + def.defineNumber("index"); + propertyRegistry.registerEntityTypeDynamicProperties( + def, + EntityTypes.get(ENTITY_IDENTIFIER) + ); +}); + +// project/behavior/src/index.ts +console.warn(`---- STARTING RUBEDO ----`); +system14.events.beforeWatchdogTerminate.subscribe((data) => { + data.cancel = true; + console.warn(`WATCHDOG TRIED TO CRASH = ${data.terminateReason}`); +}); +var AIR = new ItemStack5(MinecraftItemTypes7.stick, 0); +export { + AIR +}; diff --git a/project/resource/LICENSE.md b/project/resource/LICENSE.md new file mode 100644 index 0000000..cc6b2ab --- /dev/null +++ b/project/resource/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Smell of curry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/project/resource/README.md b/project/resource/README.md new file mode 100644 index 0000000..f74fce3 --- /dev/null +++ b/project/resource/README.md @@ -0,0 +1,10 @@ +# Rubedo Res v2.0.0 + +This pack is just for the ui elements related to the chest gui +and any other small elements of rubedo. This really has no +funcnality but it is REQUIRED if you want the game to look +correctly. + +## Support + +For support, join the discord: https://discord.gg/a9MjfydsFz diff --git a/project/resource/manifest.json b/project/resource/manifest.json new file mode 100644 index 0000000..be4b7e1 --- /dev/null +++ b/project/resource/manifest.json @@ -0,0 +1,23 @@ +{ + "format_version": 2, + "header": { + "name": "pack.name", + "description": "pack.description", + "min_engine_version": [1, 19, 0], + "uuid": "b04eff01-8b6a-444e-ae1c-646e812fc564", + "version": [2, 0, 0] + }, + "modules": [ + { + "description": "Resource Module", + "type": "resources", + "uuid": "e2dd8d6f-0273-4a8c-8fe8-7f9fb401cb25", + "version": [2, 0, 0] + } + ], + "metadata": { + "authors": ["Smell of curry"], + "license": "MIT", + "url": "https://github.com/smell-of-curry/rubedo" + } +} diff --git a/project/resource/pack_icon.png b/project/resource/pack_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c3aa89e1b3f276292bd596309c77a1d3336cfcf4 GIT binary patch literal 473002 zcmW(+c|26#-#_=x7-Jv%8e=E>mNj!xA!N;#nC!GrDzeQLMd3?}sFZ25Buk}eGq;d7 zOGTl@&?YJSZstDod*+`z^Uu7_x#xV&=e?a1UfY~S1Qi4U03xm~n|uHu^S+V+nZSD- zJE9Kr9>f?24+j8l7YVKH;^X~>l6;&UL4CKPK& z1^9(locFQYhZ}}cHIzg|MQ~VGQbtljN4Szc3DRY+J!QCUujsvxT< ztD>f)tg48U5gb_Kz*Iwr+62k|=2yn~?7N8yr-8%;Ah94oZ2>asTFSVzk&d1kF06s; zgfM{wZcN7yoW_AVZW_AYKwVx@CdS`hQ%B{{&P|cN8xQPoiVsAL%(OBiTsPY3+gY#o zaWtm8S?zGQybh!s5hGk@>q8)eyVCWI)D4U^>w#1&ETg@iS`0*SVH;e<3McCS1WML6 zdN|n%Hx5PY4c-wIa0PQbGPUu<9$aEQZW!W8Gh8ESTm}@}*eArr;#Jjuy+nmAPA2%} z`}l=B7FO#$oy~o>Zop&HX?FVQ;VyV|>Mn2FRJ!x=I1m3#rY7dv0j?Hi8+2?eb^JXn z>vQAN>29H()+cv+J6P%*3EdjB#XKk4)6`Hk!o$YgRCDikB-qP(f1uO0O(y$-9dhG* z4E3olwt5fGXQ%Akas!Rr?Mpiv<+jm6%M~$<^0Z3`a5%KX+0sJW&B^#wVn9mR7I!=S z^}5QNt#r|dZC5kGpE2`%x0qF=(T$BYw%8k#X2f@1&o9{P?_{f|t)+B6KB_)UZT+2Oh|4izW(sT_~xo4M-8VU+;;S<7r(mM$9$|A!1g57ba zMBE}O1EzQjh@DT1uF2hp3mM?7o(Mj%Pkbtz)3TX6NvaqklvV@Z9S+rF8K<`FQ%3L0ivn&LOx)z>1(M zeuFjTAK#^H{y@bNf8KxHDUchK*u6XVB}KE)-FNiudzOgWRRM*u>}%f*-En(A+$j9X zj)SMow%|ufyYkQfxz+O9L8Vd2l`R>cOL1Z|>3M-`Tl7X`l9U=H;7m`^f;7Y6s zeXQU4D0P1R&+F2v%1Xm>>m+XaTF<^=QGB-U{d9XnWVB7D_tFn(R&-Ky%xuD*bFABO zoagLMqX~koRZ|9aw{jA)S;wZQ-@bkOYvfJOaLfLP@bK`A431WL+H`u}uiV7YW3xZI zE+$WYZOvGH?@8k>ElnG-K0isD9^Gd3=uz5%g~f#t^KWq$J4&it6At7jaN8MG>$<-x zti69UGJ!ovnf~`BEc3|PH&5D=jK!b*Vk-7I4d&?`BW_~DSfS!CCwL_dz$Uo-m?6vI3U^w0`UB>xVpA80AYJ5euVz z9%xBlj%o>L=#1gsO{}`iJwNH0(cPIgfA;ew0&De3=X(3VyLZ#Ouuegh>Lsg=T!GL) zv5~Y4ah2;+T^F5eKCR3BcsB9={i%oVVn2svDD-5fJntNlwy{~s+m?P~;lMt>im9p| zm1D9mQXcQ=kabS?$SHM7*Uc%#e!Q0L&Z*+ooj-qSXoBsPu5WL9Wahi&aQbY2X;|iR zhiq6nXTD;3O}Cu&>;&!F@Y?Lh>GbK2(&_a1e#_w;R@%(n#AMNqn6)|gmOu3`w#!tE zG&IcIJAC?IhfA z6{vJmIa})`g6rZrhs?ch?Jx-PNz5F3zppnJ$9mQ(FbUK1q{S z1-sB6d5{`0h4|4jAD9B;2d4w@kBW2DOQ&Wk?CprHD-CNTh)Tk$RF8V6zlg5BLyvpv z_I>wr;J34><;|g%lKhk!1%r7Q8Xf-5u;qN3yC@3l8v;_x7CAr#RP^rD=c-5Bsp#js zM*)c|M@FU;=s*Y}L**OQi{3f$#gAN^u)Ao*cYBtN@pYC~L;K^Z^jXxkcsQnkqZZ*t%nc>z&JIjc}AFSk7;h{Po z0=bK~SG6g^lSVHe`OJH6WeC+WmU4$s025;;gNSGYqzVC8PMJ*#WlKQ=wWNN$M0$1! znJy|4zlZzb8OzP{c;8b9RYM(SeabFxp&*Ereds&QC->L=e0CKb^X>dWcceelkk6QO7G@K@$6B-QwM zpCYvd-nu$_W&@JW=Uz)Ygs)a|s>X*2aP0Dm7~Y*pf(`>{ZO$-cX$0$0#|0_->vwXfVtrvqHz9=T?=woU{cF*3TllW{{a+o0241= zNw~?<#eX%l2+^%>&*{ky(SV$3h1Jz;G|sI)#H7Ji1ELTLf|Pj`y#%)`k0=wsu2#xw z{3~&sEintY4<3=SBPky2_Q-fZh8?7A+7I8+uO40y>8E zPbLPMS9j3bj=o|TeiJk8cCZ4YP!2Ige)7xRUnlT)BeG%FU_OLQXBTAyO5=zQ^(r_9 z9AS#rC$BrC)_Ee#esWfpp(rU7w$fwZ2m=;{xW`zC}Y>61Bg>i#Z++O3FDZ6)$XAzj5?_NhewuzR*PJ>;d zlt7durE-}sgerlGV=q)hfCd?%VkbOpa?5rR**_@*nYxf(8^{I|<*xjo58p95d=58z z!>#JWU4E>w%z)gxeG;^!#OoW>lIx~kCDxg0VB1%sM}@XUL&oGpGF!O>x2#-QovA3s zJq+(txp59R|0g zowEH>cb(f{AGq=8%CI5~gpFIb-bG))?FulNEqsL?_Z=!D;JI6m3XWgePM*I?Y>l{HK;9e1JEgx zK~#8)k{CuoURaXM-I5#$8cN_XnEG9GNA@PSa@CoLb%Y(qSNmS=e!@CS2Gh-VS0-Qc zy2f5dFul$R^%LMN|0tv;LM3Adzz%(4&P~nvFcl`o;f;M|_)d)eW4p-TJ->j%6O(E= zEdNboOX8tH?EY`QByeWu?ggLQ>||-7$Y13nK;i>)Nlac7%?5d(`vO}O> z?x?;0;yhz>W?w)ox!3^+5&Vx4*)m(4Is9w zP$ED6=Vv8fAku>ub&0PU{RoSHeZGKGR3va0U+Qnqz42ikc;o*O4_f>D^uiTrDl>{m z|CO*L(H;aG0TrS^`s#pL#oEUG@j&GhLl@uc%?(;#p~{<5w#6l^Uj$rVYL*aW8p!cT zW!fuvOpbaJB9O2kgbATUL={_F|GGRy5+Q@2t`_}{idT%>6~=hpIG#Au+clndWatE> zPQ*x(6}cQ$^uYte^>bfU0mtokqN-}kM%YUMJu8C(HKLW9)t`mEM>g|Ts$_MkC?D{O z=*`&B^B}(XQjzU#`skowBA~xc#zXMV&Z3*#00>o_%I$%O#^Q}9H-3L7G5tc;#pC$N znK%@d;^~cn$M%)@zIcpDEk-+G{8Qw&m8Ye{X zmMLIe?wQ*2jL8|=i)_@P2QIhz**YvCW})Yl=Z>mFa&Wn7WCIx!hGJn%2(9FP8gD4P zaUb`d8+M!bY@ORSuL96-{u80h(;&L7Ag)l;4F)h;iivFkFTRHPa2KnW1HOd$o?CIR z%N>5ycd(xoPN425#I|)cg0#IM-vL*SLsA0J@{bc)@61B(@!lGa~6KU9>D57SpwCROu`yHf;w^zk#dml_77rE7lM z5U6TQ`+$#wG!K3XvCoal#Grz2O4uWqOe*stHwsI{I-`}c*gDqg$D`9Mb*s9WVfCzi ze;5l%!6%`Gb;RNl?9r{9Xkm(U*8J@kqmM6N@Dc31x%WRzft|=$Cyr73afhhyF`AsI0 zqVC-C(3B_aq-+aP1$qz+ldZ}iB%P}`SZmVC?4VWSs|HT&=93*H}21m zgU3qYDb+Ocjbkr_23425SpV3Z7C7_$FCV z0E|8ESlyZO2WbR(vhk1mW1Uivxjw`mr&;0w^?3_;Q*z0b^&1D4yUPuZfFCe6C>&w( z-t=_QIp6TMQve0ecB7%7o;z7HS@LDoZ4*bHK*?uN2xKt|!?B;GIfEbIIO~GXu@V$< zto|-ZLwKqzOn^pFKj#2?t+Rd3jk6eeeph~vgg&!et%#>${W0~JRUvBD4{|JoG_ruzZj_UJWV4OAH#S{WzO z@K9CMi@>iNyttp+(?8sYx8uLOlu*C5_+)I^IZ|u@kw8^ZlhOwwAHa7pIaNdhZgo%s zv@0D93y!b#_M7(SwCPhG*(#y&1+Mj+aRt8M4snX$ zfjr<&N;RNeZzd;vZqH6$;RcKmckGiXrh*MyGK9OtUO-o^y)Hcm&(n_EdPPH-{D5hU z^nx!bqEm4I6^B3g9j7mhznJEGD5&*#-0@m9A% zw={a!bzXLl#p%$SavyX=(Bb|8Id$Gi>IG8-(5W@g3J$Nw&a`T}FwG}en=BJZk@Bc0 z|8dA$fV>s87$P;wp|Pkjx!43VbwX33B5Fx~U@OP+4eM5=r|dXB4Nxg4@LSNN-;rbS zLN#xE+8#JA$8=>r)tUNaooZY8juw|W?gEqudm8`3-SB|QRLo9t`MooxG-ZB@vcX~g z^80caeDC$d7t9#d$Pxt4h}3h8cleF@FjZ`}4MLCX_-U&^G$U4<5d*J#48DFStHVX7 zxl6)yaH;3nsLEOVsX_y1r)#iCH2&Aj;w&!xtWcT00; zLm7JC@QcxXMij)H@kNg%O}u}KFp#tgh)}EnC6p9Nc~g(X3(JZ0oXZ2fE0d|X{5KCv zom#xDGg%)_)JNsE>k=sv*ckBFvRzt~4Zw>UCdGuZ&-^^6it_ovfW!{M=Bv#gN%o;5 z;!A@bx*dm)jCtil72C_(P&5y;Q&Uoh5-69%)3C;e%Trg{c)b570{8YVv-&c1wy_kz z)Z>GqD6qLfd?AOr@^k^WmiOr;3-DW&VpZhd0H|bShp!}UZZIzGpQ*6G->i0~MMQ}@ zAkHLgJ^Y+ZF%~HP4GuU{E%u#=N8j#$>F~CMcY2P>FjbMiLyQ9g?$;T6zD1+8&4|Vlwm6{ z9Uk5o%8B{SQiL?RSlgfr9s1~=mEi-Ks326$;ZMR`;60`yY$||vZ51%3(93U`QUE6X z_u2V3=l9#>M_C;j_`=Gvw*quXpV%l;d7|RC4PV(A2z&SRFfJCz?K%I-(+~B9i!G;| zdj)~=Ny3Q~dT_f_&w%2XrlOSq8FSuqqVkIi_&(3$>eYDB zmfAmf)*!mRnZ9<(`6@BCkxp_nBf@z!dYySqmWzZuH_dJP-DLeWsXmUTAs(SO3VAi8 zDWE0bp_0|F?`VW32}=Zl+%77cp+mfZ09gqXV=4Ars0Yy1-Ea}c4Y_vVm~#{t{!&Me@wE4XSjVGx80+id{6HW^rwln%b3 z8rtYF{m1QBO;HnH{5-(YR^3fgZl7SZbN@7FOw9}{0*uKtCrsZjyrjC1a9F7=KerNC zs)Ll*0QF@o#LZW@Ax9F96H%NfY)^FcUf~X@Tuj&(|cQ ztwq5$}T40y-nkxp^H18gd+f?Q(07OrKvwV%ux_FwI)ov;b8H-YR zNSNmq3*LV4NvE_XT!HQ;IqBrcu$E;1GX1E&DonF3r zKhM|9GhX|G2piGrq9YNWro{1RfigLQnn>dXL%y%YoBVbjO|2F2x_so-1mpF`rE|ye zVp+PU8X8I>zR{Vel80==3udf{d_G%{md_{7wngrjBPM>AV>$!&P1fOOov(qgRs?Fg z&Uh3)RA7QW417sJ`E>3;?0;j|*Qze!+5Fe>Rem5ZR2sTZ5$&C-_uT3mCVQ1S_CYJC0s~T|`VYn}V zJl;%OILkE?0P|Fc%#0YI) zI=KB6evm{j6nMoDe(5epKz~|Y2sO)yh-KtZQxp z702IKuFB+A;9|nZc2uNdSE)+s=xhDwuL4sQscN6bPu_X_pzfpRWA} z*j``3W(!8R`uE;U%T`j8G(d=aesdqG zWy*v=D5*NtpZRrg-&ucn&sNHjE5lBT)UzNDM#Axdm1NfUl{5c14`{!ygRwT1SXR_y z=n{2G_7#~N8k_jCHp0F4o`zOz>Pit^IQAfzF1M;|=)8$f*vi>qMdD_}#M=)C40dR{ zx$@4`bnA7XtV5`TTbTFT$P?e~{1z{TkY77t+d!H3M|N4Jr~q-SD~%`mgaMEH+`Ecs z{l8Lm#)CzcpEp-e8r}O2+9FT)eZ{ac<{uzRF_l0S@rh;<-JApyDdHv&`X}b`daV<0 zp80?Nh+i4G@-GKR^}Kh*DL5d@{)J%M@3x=f;2%uoM*;OMv~{pY9t~CGIBE|cBUqK{ z0Jm&`T&P}Nf$9#wpiZT;p`%Jv8=@L1Q8bJHDCmTMyBDQr&z`Nlb;kTyIWwjHu1BH< z6iG&;c)hlTllu=3K)@vkQ~i>~>-tKeyHr35cn&5+uYV0%D39s5J0a^jpS+)T!zJ=M zP$MBx+m)a_g@em1gQbZ71av-u8ZqPq!DSA8AOoKC?h-*DG@0uJ_x;A-tslM_Ok}VB zs>;ty&c&iHNPc%k1tcY#o|!nrOvo|aC|xG~Yo`2Ow%Y*xQO2jWYf^~WN%r3MSB)N* znvPnZhvkHj)FXKrT4#9hID3R)AfGX}t>k(?%>s^oKXmytCBwZ~9g-nD@lGh{R0UlC zg$C};(9&0S|7?&2scs+_1i#^G-^Xjn)Xn^RuL4ZAx{$vK7z+dvHZzZbB3&J?&sifK z6a!N^(2Go*yW43z#PY3rHOE-HB0H2}dUI)ycqv0c9J#m5jy!OE+B1+S1cg5KQed0f5Ko(6mu#CZ#8sBueV{a3 z2GHd*-Np`H7bS^z@GoWu4tzlPQ+h**L{KCS19M10B|sSbV0|YP_u=Y+;!WpU>^0CY zS-M7YPoRTc@)=4g*p;B*n7mozAB+PXw>U zdFRXVEJq*p<2)iNfjv`100J?|=sM6g_Jt20+Kjmm51UpaH(91&yC37H@aJQGV7IY2Xe_wXtvx?Ye7m4bQ`(Z=;B4XlTd&=V5L=R=!tsv|)b@p=e^w z;OAakF4U|OopBasZUeDJh!T<#kSqj6=t5roxE{ZkWx_u7#l5;e5q|DaqMQ%)>AnDcr zdMWhmT;LjH&#uS6pB^4|TRFl{N~Hs>+N5KW6kvyvVRgac{k*rFAn{on9+L!Rv_DaP z#(Ria{-Qem;bh{oYlmgZc$?~s4D>l{vna0_vYtt?hcEL?8n*Z0|Ac`Kxwink6232* zRd(IsOhzhoI=O!QftDifvv8!{sM7=Fcpei+d_F4b3NU@MZW=QkXTuilkZ`eBb>5T$ zwbac?z>nL{Es#R@a7+6b(zvV!l-mmpy}(YMWo|s@7~xKlzxugMMS3?{QxopqtGx-_ zixfd9*ffMTE!GcyLCnr*TaUVUbY=a$6>=f+Do=PQ+wt;ERL&0N^I9{EoE!ML*=o8= z>Ni{r27Lj&c}hC<`5SHD%EsQhy^`&^WF(zb>at`kA@WQg{An&B2$jd zaBJGKgejpRw*$4^`nJ~w?Tm631rsU@YBF;7$!NsUTW82NCv_7)<=KEOV22A_ENy%g z_`~+=RnZ6%k2n6DUdI?xH-8trJqgIhyQqHB6DRANnzA!!VRJX0pQ)~ha+%4=O~vLHX7OpJ=VWukl#Jq1r0Wo_h1*FuT4H+vVo z7t_38Q{2cQt3~?7SLCgd%OZ4&k4~OCxglcC0wc3O)R}Xt2pl5?P_nf9W055cVW9jV zLq8!0BDo0ln&gDG{R*FXW8iX0+~$1bj~g4YY#okPZI6#E36nbHq;rrgs51>dXcZ?D zcKS0F2=j*Ii3e+p4?Q*EP+6nu$-P5yd+FJ2RGzX;=eHA;qq;+xT@W&F-F}jOh3n}j z#}}MSz1H+gCK&diob^JWa zb$$-2{fsX3sT}EQIHdnFSlUxgcj0XS`(XaWNe2>izwc#R)FzsfI_cpw&Y0Xd7>S!{5& z-USz%BLFJ>hkU~I@#qJ};7cXviyv21K>wY=G4Sgo7da{2?Qv3ou1PMNyGG!L%LG#d zDC};tETDA4!47TazokF1u^F#eCkM$<64&p1V6vmUhX_4(p#p6fb7VK@@Yx*(iPsds zcb0Y0@gZ-snBeG@ip$r$*qLpqbAb!?{$q8C;YqA0UDPCoWUQrzF3vv_#$+>9WT<&r zws-+teQ~8H7|Djrk7fOj7ll4aUGzNU))whFSx3kM=V`fjhG`+^cLEMdvCzq zH6-MnnJ=JQf_49@z1Ft36I65w#j9{&Ha#2M5~bvzkHYy|s(3_^_}z~o%4c2}&O8mr z9x{a`=SrodybSMoMy7$VuLWWiI4pl6!zURBN(^q&|iEV%f3M@hOBh6 zp&m(Qcw!50Ki8E(!0Hc#g=axyvd~<5_x5hk9d+lavN}OX25M2DP>}+`)XEQ<8#I{( zfFvpi>{lne$XKl90M+IBUL6r)_G7b;RVlKF5A+-*w&3Ok@MV}EjYjzS!A1x4grX!b zZQHNRxMTQr>8+>YOwO-mTGZ_|8+^J@u_wqd&?>N;m!2YGa!46tf*bILh>W+Y5DI=! z5M%W3)F4@>Q@q9m2^TW{kBn{yHUw-lmhpuc`)~K$;Eg?GOyr>eWHaQ!v(^WEOT?$t zwfUaSCq$VH2L39!r@jTOTm3Ad5^8Ibp?|bJSgXm1JGl*}2sPK>zxwlbs%OO#=@uZA zudF+u{EtIj^H-K6EN4fAr%W7VcvfDXDLVaYj1(z(JC84R^4@vA#12lcBU!wS(CHCqPTa;E zEKM-04s4t{`}#1FpS}esQcqVj>0^=y`BLMfc=TyYkuvy9?YYR<=2w2m;9uf70lq1f zi0IIQHv*RXKedl_z1^R5a1+%+={zv?UT2mKwyl_%p~si4&Y6IS6YIR%%(;CFj~GuQ zax^q!%QJY%B`ZPZ1mA%BV>F4JSW{9BQcZ|sxy0DP8)$|QPxCA;V;*`Xc)0%FmZr=| zz5&ZY`$cC0^nN@|E$oGTFzd?G^;5f8Z!Y}8Z{Ym4MIWQofe74~tSbQ3384|n52vJe zTBFwzon5{_yS}KVS5S#cxvEIc)2a1zGGd49P=hXZ{Gc^(5*`@fty>wk5n#w~Elvvf z@PMZ#vD#wlei?xqDQw#O%<;WN1({gX=aNjs4$}q}okmosWJ)D?If}b};g+B2|5IduK5P=$>c@E!jhTK}vTFM)@0sj8}BZpaoO16_r4Fh0|)SfZ_Dn0-;}D zJ(B-*45{2Ykhuia-FKgn*(W{)L-K+aQZQ2nL_t=LH@Gw-+;AwSHuM0jG%J#MZJz}` zbFp6$u65l4RtRP=FPZIv%De+!gze$LWu1#L<_a6F(-rA`SBFNMsDnD_tB+9AdIO4# z{`k=l|0!=(RO4TL^y+l5fg8a}H8@9{b&X*zjMVu>xLIfMNm9>T+HIC456KB4xq8jz zqL_`Su;^iNNcp1-azhWBD=5752$1O~A_0wUBitTttw8UoCj{yZpX9LWg^}8ivGmtO z9RZ3j{PDwp9K`{~DEe@{1&?n!q5)4zFqH}SKl2#w2LbUOEg=4$x^I$mJQE~cV_ z|5&~pnp+wQfXo3Bv-DQzo$OcWfmZwQUz%%o)i*w{p@stu=*6~3!gcV`iYoVwH=hDGHFhiwARiYW+5l(4 z3SIP2YW`kYhH*b0nrV;xWz4U?_427e^bYU%?x%`xWEyW9I}7!F(Ljtzh2ymBqwUg69ToFn_#cn6~QFE{|R2*GZ+HO;XDc@0)k*5f~I0S zm542csQ(E;oj&dd=sp-aOkn<18Ws$y?<0W2n$0JI+|p#%tiqaXn+lo}jF zW6!}Q1hyZWv6uyZ{)HJ9lE^!5AbtWYi9I$EW?t*Zvu$a}C$SFv@23j(eX{*hWEw?^Hzzd%c3M`e$14g%kFCPI|YUagod(!%wbE_A$E2Wq)w#Tlio2>%SrZ!Chv-~63S1e&0pK$Jma!7G8S!bkZ@q6U9# zLoU&lyDVoUlgUJ3v5wwT^7Bc@JEtt(f=JOd;z#J&2BaE4E82H^tti!&uF2Me&>Gy2 zbNese^RSNl=lEFFO}tG{XRU9kb5y0CKarY35NDS_1Z;|EFEyl>&wu3 zi@#pu8Cw$vVXT_7_pMQ()PY?3E|}-0+jJ^E6nrtK?Erp4=CakleIR`yreRjywPZrI z2Bfh*aafzrRK(`#+t_mHY7>Vlp|{od?DO{;XoC0~msk$k03lJQd+OGeI$g<>9_74t zKrNi`-GY?OJHj+2nVK`x@h&0foWVFh^*{6$A<+jtYWA*b6BMf)GTRFJZiKM6qjY|( zH4ufAXLm!cKt*igaaQ4C#WbF9s24QZxPhS>O*9-FCVf^9U|NyLa)=9$1br7+icK$x z1sN;3CcxgyP-LJPe>koEn1!G@1UVPStnc5vZjhNFcn3-D+Ryy}*@kAA0JnV*D`JtQ zLqLx;tp&saJAJEwH`*b0jvKvLJSQ6Tnj(NGX7LhoV#ZDs`huSYymWm&Oo$sW2vI1? zi@tWG76XBh#@EwFC5|EjfI`a&fXAgqkN=!Kcb~*H47VL5rUd-^H@@x{Xo~}lr z7NK|N<|!1+jccQtHP^gtY#=?@Zq7M=-L{wmkG$NTh$5?uprP#?TJebeP_P~7oS^Df zMs;~pDF_IM%%xpS`tzoh^@F${>@^9+m72Tn@^V6gzhH<+7cQ<2cl=#wj2%V)+k)}` zUU~nLaY2Z#3&;Wmo3O9Sjle;0XXU%jIh#gOl)+|>Pt-9f^}ks|o< zW02goSGd=Gxa=94m33w*LZ=1~GM-`%<1s5?N*6_-Myo+1K6d^Qd4L54h9nZu8(T$C z?p#PSx8nYjFGtiYj{zM%<{@B8vUzO>XkOw^FXW+ufD$|vQHKY8!Dn8xUM`cc5M5M3Ns^b($fp7SlH05((1d&151WCG(c$7ahil`#QaqXSC@3Zt3sm3Z zi!~+3E=Q1oq~L@j^q(A|DSZppDkk`>7?|=U%F+40WEr~HojeBq9T=$iv9JH~&gcAO zLgMDmbm;@=R|+!ixm(`XyX^)e40o2;yvFyAd$-NvKHkk=>;2IMCBoM$(QQIrPoO1R zH4qfEg-Fqd0-P(}2Mf;vVQ4@W3{58PuCzlxttK4WH&;8Bd65qpViZB;Qs6W%)V8Nm z2?1Dw&bq{m(F$Whv;?g!6HD)KCJ5i*tQGUNERZ|wi|+c&m&dsEit*6;_b{?cgl9Y` z!JFn-E9U!G#de`yxYM7!ZK(92<{Xe(j?Wsf^N-c<0LKG$4v1H-F;uz({a3#@keR$B zZ@19*7G6kZ--r@$hmOyg*l2;?d)%ZiRkO!z!?p-`5`vuyc5sML8JN z>s_keA#lrnb~_ns12?&rZ|<{ha7#-I-{6-|t&FtbohrANoI0uwq)c0G_(Bw(Qjdd; zkDnXELV=TeDUM(~8xYw3h_K7kVsJ)+nu=!L{~Le)!M6J%flKWz zd`yRj8!GAFjRDiY_OP1yJ=TWouXrr3KFhefS|pA%a#g0UU3aZN;Il;lZZQF(aQs#{ zG6Ef9Pa?qOY-0hWwzf-?9j*a6Mrsj8Rq`a=0wVHAjp9&^ej|g#{QC}klHngyroVy$ zmFWp*c0%T=-#jL^JuA_j)0#C=OA&euSsKnty*Uyt|N8u{owM2dhE2hk096tFJSpb= z$dh&GfYs-%yV1&pi1xKx(XU@>y&5!&2`rG<0Ca?lpP@H(082KpzH>z-7T?VA&RePb ztTC}+u_usGzj9z%T6pS-Hnd?wYxZO81>y69hzTgB5czP7=+`&-N^RJQ)AM}w)k^0> z6-BPmR{j(;0TDzf$oosGs#Gh2zOevE0zqVB3cZQI&)%92fxNng60kIGi-}e7jWkt&gx`~^u30K@Z%w%}*;VpPI-t_hNCy0^!1@4e@F-#{qI2;9O5m3ko4k({CL=Y?Ta|l!oROpz1L^yTw8O#9a8tA;;>GV`Zh$c)`!^P3TmF$USsV;c{68hgMd_Fy}Ylitc!>xPywO;CCVP8fYi> zdMxwvDE#>aZal$-jD27Tl+=jJJnG2VuOqFqMPSGz4A*{HWZ8fZ8+Keg0o#03hXdPH zmYxo+9i9^pyrBPvBTYso@h5TI$=p{eU;jCEnDJA=Noc=%@mdzEt(wtgi=xkc}|(GmQxF@6C#q zXE_yKgR}rfIX8b`SPFl11wLMhf7{$Nh$V}YHhtSmfHPNIspv`QJYVBc%<9wdddkY6 zFq50K z3Lz#L+sQY%%SGWdn4q|mo^B=1xxjv7Yw_8drp$9Q_$lbc7lF+VVTJI?$ommsE1$Fh zzNKlcD0Z23=)!k~?2A=gVLRgj$1Nu^WpCm5|HmsNc(Bz$9PR_l2oDUu63#LE;L|T)`YDH z>7Rl3R{uaDjWl-x>ZvW@;Pjo-IeC0y123qMq{YV2C46a_HHRNjXw>80wP@@39R8P~ zj~j)>FI#dL{qMdsKafU>eyF74OP5u*Tvc@W!&r|Snd2CTk??>qv7qRAdK^D14o(9N zQhL@k6oo1=)unDT2cA~zQU+{EV^`MRYtO&OcXWk~araK+vlV#xE|is_tB+B30rTY6 ztEvvd5T?kxsFJNrMO-JsU@*HDU4=_#&M@BZUD>_dIf{SkFrLN9KN42eH1;7&(Ncq( zE_u-Tq=+t}BDzqbsIkpHEokG1JC^j>;EH z06)~O(0G0ypOr8A?GhxHoFyU9sNEfFs2yv6*g;R}%*j!U9obcBMFLwLkYrcPq7Eor}n({kNl3F*YiqSV%ws0#ZYVZaU;H5_b;ubyoX|ym&ArOy2eS{ClNR~dv zCn=7YqtkqHoJE!`75(*PoMr|Fmifhy4bXjCd~|vCsRD=o(y2q`5LdSO_RoaLnL&pV zk*b6|HLU4;tR(q4B1)JGsHM_T8wRqsld zMPJW#zx*Ndbv%4Xb;?I~UE`rfC8n|#bmwH_@BtGC*KL#~!cSGGp5(bGArqoFaciM= z9Pc8dT)Zh(=JSbEK476jw2L*(iu>VN$u0ky@hJ!2@-1wE^L|`x->IIU{pu9zB_dTI z@o6f2-R-{*QmSU#%xhCC{KaF%(ajES8vJE}qGYzndPqYZ+l6ut4`*|w#57o!{4(93 zL_F*rp?xnnK%@pBZ}oIR>ohsy=sLJ{Zy^-T|GtFgPIUKx-_LmZU|Az)+T3{;tO2th zKU;LF?U?&{$v+eLh|^cRO$5C$y7nZVpSifgqR4{xni$X34iug1Vo7sZMZW~x@yXIZ zv~W~=viXe?Fb3^>_Cy&rJVf|<=iiOHr=`l&(QCnTuMe*!E*Le@WY=g92nC=K=PbZ0l0UED}?>>76m^~5te>E9^)lK@P_MaZm->bsAw{> z#__y z7r}#nK)g`#|50@2aWVXV9RJMhY`fdJZTCT&PDF)n+DW&g5?>vnB`TD1N3_$WqLic} zwCF-9A|ZC8h^Wvdr7cJ4(0%Xj{O0$6fAo0F&SyUF*YSLhfh^%^L4K!U}Wx$Yic?yyo_uhNHBzCHU5H=-ywz4skp{AT9A|`mJWZaKLJq3Niem55%b^EjK{D)n>&Dm%#guov^ zY!IaF1rZ2yx#$|8Z^Yj-$9KFXFEf?4Zl9J~ZFB zNN0+FN?lOH!|)d&>zaf!-TFhk&*GOHMp(FYGiSBL?9H>$qxI`u1t+)eKKQfYM$iC_ zX=)c6D*;VvLzXTg=TE$5{K%9FGWsM0Ib;6=ZCz|~5!#h=EWzpr&4rFS)0k8Eeiw|W zGM>_r5=M`^*LE9;d6%ZOKJjkdDk68#Q&z1bAdA+3{Z&TUn)_`Im837oaZoVxOn zu(^LccM0Yb@6GHkmJ&i=eFUuthWJqso@O`(G( zsp?iXQ-Q&}5dCr~)RDiP7b-65+Vlr3hG%JLITcKs$F88GSg59V)ZW>JS?4i{=ce;S z*N2#*&BF(;-xU6`)S;rPSdCt|Wy*ql2flX+X!@RZ1W#J@b^jglg*Tjbq0Tr?CiiW? zOD~E=m0;T;Q1e`_h4&HnG6CC93x>s>zd4I8@EXMRKww)+O1{f78GvAf%@CZ(3E19;YHm$}lZ?hFyHcegZl1U(^PskSchy(aZ7Xe(SPg%AR?CZxKU3xl=BdB`Y2 zG_df;RA$D$ptV3u(J>4r8(Vjk zjIH}X8H!=cavA3Ls)^Iym;9~!GsQ&>Gja4!4_@clG`9Rq&5c)vz-E6TUZ2I;A#AL# zxMKeDi!fj?44p)R_Oaacq1MF_l3V+dpRclClP}ow0AHKSY7MwdR)m688M{G;6vALW zhpSo^M{9$6=&)?lp%c#VQc_a|@9WBkxVZ#Zhk`2d)oGB)VnY;5RpI>13pw#llOy>G zWlKLkd{y*N3C@7kJSDgu_(M_SB>skEw8Zjv5$AdLGok(TNXAF8zssDz->*O4Z5FQE z=u)s)&Q>u_ByH0ywd?WJ|GtS1k8~FeiI+360SG{6RL~Be>m=RVn=gQiHNV^1aO2_V z_jotnFxBl9weBL>BM57hU>h(u(_jw!H7HX`{KLPEs1DZw#Un8h2)hFRG}|pFzB@;$ z*NWJWON>To^q>7YXW!G^>CiYlT5S(*R`@W`%dunUtqvH)EDZK&BrrgR_@%*|H~$yh z37#RJL5MV)@VFyiMA|ZC$g`4Ah`EQlT+_Ot5s$leE0!ZvIzNznp2Z~RUouT=6|6oW zzjo&$CGYwYu<8nD%y`z_7Q$HtihJ?1vv8oSG&m6T>4$-M_m!_d{Ey(bXG3X^!weyiR?~d41eT5hD!igLynjp`c|^Tt+-hWwu}&++{n2xz}p8UQm`9X z*zL_oJL!?KiEaC%U#>sU<96VVGDM|#Kwz|Ptn4YgO!82c-KMe0 z_GgXEENpqVf0;edhH5su%N#$g1etvON8;qSrT2yf;4%MXo{U`i&H09c0?0`THoB{7 zBJWjT8a;WX!J0n$7hvuxYqZzUh`ubL@tJ=3GNnp_I#d;atmwBH??eN5Jn zSiJV+nj`1UU(x5U%L<5tH^8s+WLu4 zu;LkXF;*2_QNflT9kgU)oho%O=4^+1bt)LH0te>s*gp%el)AM-aL$Xw<(w~~ghMLx zoU(72mNYbtkeH3<*6cvOg>^qdfz8A&F(O9;lHp(+?AeVQBf1q;$sh6~APjkDcDH z#5VaYC{gXMjsc)4Z&9po=3e8^fr^5+Q7lai_pHO+2U){H`TBMHJn=+v!n{@z(+D5B znq(l|lqrK$?heKzE~(WNsH!u4%t}*c_d5=MC1Gp*y;sA}mUSr~L=IDLTG*6fNTlsOKHhWPPs&NNXj$c?l0NQBUJMZ zShX~im#;G`GgvzM}{?hk+RibYAvx3^2jThD!)H4buuXV46`F)NqI5sMPh?5>r71 zwVMa%t+{8A~C-HOq_=tEm$3LIq8(!j;Wx&u*%mG~`#ckbd#VK&udxJ%xVhS7od zLoZuhpv~{trJ)8MNf_FJ1qBLpgaQhM2Q#I?_y1NAXO-VpDz@hLyG5o{r>)q&x8O6= zvbc8FOKI8ar(st!xITLDvY38u|7uzG9By&}tl1!F<{tOY_@m{?X-FT#_Z8t@H^y?` z|NeCEFhzp>h(&GM|C{F_GWZW?WoFKvkZu0RQt# zDhH>ys?fG_@X|o|ZNB^AJpR5dYMnAkRh^#(o?KE>QJ7q1O)9e+Z6zFbcn4D#zRhIH zk&7!NpI1ZZBhk}MA{<}nN$_%P?C#z(N9iiw&IuMp&n4V*hjV5toKz#dw6SH-;ydd` zZAeh2sV;L&;zRlw>$ZPCxUap971!UXfh@nPM1z?}iQuw)+5H{Sn@z}uew>6+PuJ`gTX!*9fZYfARm z=4`KjM;z$ykRMl4(2F!lulzBJj5+1JT$TgU|KKXX)-Skg$y4*R(fIjNBdOP0!h{PZ zckxAE&Ndz=NDCXg&yvb4A&+X#DUddWkAx1&)#E;MBYrq>-b+WM8e!=`?!Ee`^#tfy zGIrFVB@uj){}hx^iu)_qHt1#sxkqF z)sgZJ@CW9#z7EF&{y6XBPdrlVdgCHRPO+GGYoyUx3IE*BTJqN{`Fn4yBKQhk!`a8d zM=CMOq|hE|L#<0HKWk8$D9#>Mq=+ReIP)WFvS^C`XBDjUWLWd!_CTbvjD3RIAcW5D z4qJ4!pQoY>wqWJdb54n?;1C!7m-Bj1l|7y)|LxQ{)`<9E7by+~9uqF3L93NZl!++Z z&fHd@KW?lRn%nc=$wQ*gb72=x;5$Wqt=(GDV69Y{E_etWNZG@Zn{72+-(&@C{_6ir zTz>kj17O!RXlhE(sq_)!B@kaLd+TZwUEoScp$9D`+Y2lC0@d4>2hbz|_t}!m?2pNbOD{Cn^;b&nMhvZ2}>~ z&dYcE3ccnz9ar%71^bD{VVH0~3b&ELn# z`T|j85)BSuvLVAIKpV?LYEAh|Uld*9Vy^~ydquMy{zc+bqBd9TiNx#+9jHkq_)pL; z$U|P0xYlozsRr$`6gA;Onak~-@ zo7P_f=63{>$(xtGGr*>VFq$Y+K9KOG`&pTo22U+eXx>&DpxN&;1@pPJraez z79Ra=d=-=`MZI)V#EcNh|6J*UJKw$k%%%hAZLS2+Eb!2HEF0djba#*fVp4pX)haR& z;iD!#w96x@75EVA?9J79@Zu-c!yId||LfztBWC(%!cDY*DZZos;p}%A{xeIM(DV%2 zXWraZ@xvFa)=E+7XbfDfKrnpxpsi8h#^0~=4Lo@Z(a~FY;e2i;{$qesK)_}&s^I=* z1X3k+_U2q9cn%A>F z>#a+rt&)dy8baQcNHnL@(2_w_LEPWkaN{j5Sp7g@P!RMo7;=jE$6B@Lr`T^{L;)|F zzr09y!d9t^7Yj>6jHT$J-cOD)*oO^M*Jo7Ox`(aY0N*3(q9XW(?|Dst7);{n=(O%n zBevQ!9N>Z~D~x8;i#Pc1b14P%HGsqxUiUylK(}fcO5xD*v3s zSjjznx>B+)dOM_`@L5#^!qu`GPAJCfm>yrFZuH^F7laA}S|50S#8qq%zEU5*{`02T z&mi~a5~!^CvfAkS(h^P}_$b07mx@!G=2+3+wFg)V5R>}rIC08TNe)3^6U{m$0E|nx zox)a9nGfexCbUX$PQ!gp+k6-uyNWn4z!U7V$!Ql;@ap3O_uWq58|)~}-CezVb=pvL zp7^IU(~jKl``~xCB_1H+6n+gc5;uuB$c>@t3RBUyL&fpj2dliXyUP=?hPBv9 zs}FfHbD6axFgUltG}`ZhH_hbtOGcBnstd@KFVko{XK0dr1n&40(#5-RP89f%=R;+e z>yXOyrLjt=zwU^FdmQ*Kka3}77MZqeC;qI6uB7RT)vtS1XTpRE|d@kYrbZQa4 zXHG>y@_^W)eb!>jZ_}P#Tk7-0x%WLlX3QD6W1e|-QdosJcF@1dZULV(nez9+W`zOT{cP1fZhaaQlyuRwB6q&gUuPi((eRm|WS9n;!>de}X_!S!lU5x@*_L$nE>> zH%2dp4Qc#Em-C^u6pzyTmRuA*whs*WoIy!WcrRjv-MKUf){DFdQx;31qSE_5MPFB? z2ZJ~8vBmIXLRL5)LdB-Al{x~IBQBAS+Rz$_rfg;pBux{{EOaeKA<{N(jDmjI?68d< zlv$(dQZD&z{tm&nNa7t>SRT#teaoLXdGS2Q-kx*F1Lu?{ls~uwrYIkKW6o}93N;Aj znoiV>$bfT4A_aD`cYmgVH4>iEWgo=Y2yw%2C1FcUnukRpP2CN*(CwpLKm1+)wk1KM zy8OjyAZP4L1wn$OLTmI0X@moTE_j9D?LMu)+#hIR97&+ZIuCAZoW$Q;oVV!Z?MR>9 zD4XFevPd2?rU8}1jqZ|%ZsDc9;B@;hmWycS@0(XR=Syin?<5u61l{H9%Gd;-iLWUz zcOu^p{(25M-UIG!!b9;~OOZhVD|ZF}1~M97fVgh*P(@HD{>CqGx{b*wAcE%1@W*Gq zi2aK>y3@`-L+d6fah&g})0BG7ZE?b1ykP0Xa2z?~s z+7Yt(sz>`uy0(Pf;qH+3Vr(+d2z(*t8R-b}NlOIgp8?|HA&KPX(F2)f`CYMgTn2(VcuwH1LO~D|Quxy^%R{XwzgJu0dyeW2Y{wgbYFc8XMx@suO;x zB{I4Iuv=GeVE^&)pXn=6AKFV~i(B~R_>@_$T z0%KwS7*A;TH+JSZ6e!$0kqlWHhF{Gq`W$)a&D#K%1S^+)tpn@37h?i+Sz_ns!+vonC3tSuONb0}&6sC_?E~Ha}~5Y;*O+JKy& zA1Qd}{I+297x+|QA(6gvtuA@bc9RvzwIXzDv2n53T?`5Cq5tz`?X5! zM|a&+zP^&Q_sOf@7Eo#qNf6IBGDzGwy6PR`BaJG2Mxed=XsdRaeT>OV)}?j@ahxV{ z4Ngw^R*Y&XS$@iyjMtdLFU}WMvi6k`V$x<|iUson$B__TDh*mR znlM7@>QogF7&rU5F9o@NQgWl}LMV1MUq_u(6%fhxNh51~<|5wZVt#yfZo?bA;T!Au zT%QeI@yyBU{{x-59k`B|Ak?LHE_M(N`^P`rl)TjLX*)C9ig>NgBkF&C`JYErnO}K! zH-tO7bC(az1?|OE7j)j>@wN9XUmf~6_dXBzU#3AN06c%gx{^6}g$g2L4X{>tvIRFB z;5{Jmi9rtwOJSzT#8fYyZN+Is^c48~SfgBR1sk^DAv3t({~xgJIzU5t)BfrqI&t$k zMsaefJB_UanL2At%EY*fav9^t2mg0pB4o{mC725c=~*agXz3osmn}c$z$(L0}pD8BpbCrq;*c0PLVp(I`?rHLX!sF7T?-cUb@_jgcuLa7@JWQ7 z5Vf>gGwVR+*tn74#~N(X$6yoNbe|%7n?_~%XO*(xSl>ei-@#~nrPkd+E$PzDa~8w+ zJz25dxJ5ob^0~xDzUmSmNd4q~9as(dQH^KKM%bU(!RkZs%K(X>K^F>1|RnnX)) z-juy!SKdp$A;mBD2LJ50{`wA4;OB+L6g(&Y1nZk{qYXZNO?%n*y#G2fl;gL#JJAz$ zf&O09rRmrDh;f##6-Wcw{mG2-Tf39zE-Z-UWok}_Yq)LVgbK7a_dR@lVJO-sQc1#11Hi1q2YhR!&Ak8<{=z8UaP}Y*)g+;Af*Z@Nz3W={AK2n21t`@qgya@HkPo9w-a4AxKlhW-|kOW>ciWW_Y?-U2yw2)tn9<+_R+B zWq<)jKa;=Eq|*AgLaEz&L1JCC$aXv4wt^a7j*Y+9##E8goIKP%>h^MAO#bJylxW@z z*|OUruz*|8bc;qfi;!^t5B54mo2GK(;AI8C^$hdu+MX;%Vywx^;caWp?x5>oCj#2C zie00MM|}0yn0+%$xM2D7Idw+&#Nnqe6WBzXFs??GN_*J`Py^N@-c%1WvgP=Ew>-$h z?LtlZ%39QkMD@=JhQg%Vo|u1xSV%x2z#*bMXsDy6Si7l(*G zrt^KupY1MzWI)=0@mto7LA>wfP2LG7u+k{o1v8N#QUD<`hR^86yTZN8RFR8!SWHQH zlPI@PuVCMz?XhFIOYu7V@?U(~+yeie<0bT$OH;7%j%a19n(OOs!hsEPUSIngte z@&*j*5kNI8PsB+*i0$Yq0FV0H$|5;V;zIj#Zgf;0EmrzKs?6qU$spnXFe2pmZ@~_| zCg1+39xM5I1=igXT_M%S(Cj?*O{Xi9?Y43Axz;D=%`o4?%Iu%mj)kOkyA_uR{%hZZ zd2VW={&-~nlcVb6Z+aPTdp_Sd%nChqt=-6<@U@af_{+tXzyTU;)ugT}gIZUm?Fr)# zaJhTt#}8XWCkml$el%6=UuSsRhD}Yg!J|m!`)60vuinx{E5qruv=+h?Py`;1qEf}0`te%X-)Kt~yK3$-e){r-&EnNz$%Vn;!wp!BN5 zs9m(Sex2=BD$Ez82f&Mk^UM1X#X(+&_{g8qIC0M`%Z*Ud3cK(>fvcc)zx!*GRKrvE zgT=_u!_|Dp?XZhm)AB`RVs^Q6QyZMbYj=XasqP{RMwGuR_M_omB}qXBTMO*4L=a`t zTv$)*coKjW%urh6d9ek^qFuDI?hUu$lP3E8rn|@^E9|iV&zQ!qCK)M^b0Wp%4!FM) zTLD{MvQ*TeMAP}TNVL`G!FqlD#1&DNI@m*^e%?I6T2)fD;GD$q6&ob)FHpm~Nl18U zp&AkP%uKNpAZkdjCfBy$6?%?hd9>g$drJzCV3`5cN3RGZBRB{qC46Jz(PY}ZAbqtA zt?X%L#EixAccL2!;)DN5V~d1g*K$Lbk;+^P2tlK_HjJ{yBNY~nE@EIO)e$DZ?f#a+1()Zduj((rT zFu-^JV+C&Iz_7`8j{BIi@zg8hOI#T$zd3r%GF5NloDj$c$HHT~H&hWaK)9&!9*=le zS#@&Ty@*pRpM`IpuVzx*ZSwYg^=GM8a`Nl}XH|Mpq6Qrsz zPF%B=x%krf$U)Z6z|&(x|Gfq;7-i1_hoO^~NG1;ek-f=KS0X)l@aG7)Iur}1=*8UFWcDCHh2y!;A6 z{$Y0bu4d+2y>>_PLGSPZxz6{pb@{X#OwILx9p?O|qb`U1*V~kG&00qnOOn!G$#y!4 ze+zb8i|dUB?Z3E!1=GvS8BhlUwwg`K92g!atmP&iH0ekXNmseQ!FH2W!{=yso^N6!tWUmUgf>+Dl z*KYQ~LaS`g)|e71*pEA}bZzItm$G$w-5tOItJTD%e~{;f7rvxjX&1j-Gt4Q}we|UD z!Qj0Qu(?f2TjB7AGCHaCM|@`PEP=14?Z7)51M!&`+L-N5NCt_>{e!?r_PlXEa!J?2 z1+$Yms!v6i0WTaE&y-H7)_31|fLkH6>e|Fl?Yu6i3@h?SsD~E6LSy-+@xWaxZAo}W zJrN|~Ty56MnNRq^Imsc3IT|}TPd86lOywT5jfWmsP4J#<3fWlt>gDt`1?1j3HWON7 zKothvupgCimE22jDhh`a0mu~oJd)Q2tszG0o2FphM{)gkkSPJECe`a2f4THP)B10Zdn7T!Lf`r4Cjhc!@Yt|ke-S5FJ@datg;Pnj8 z-`ubvAZCpY%7EP(sY)gRp`0+ApXwWg)m5w;;tTh-GFD3tvr?evSMcNW+BwmWRH%E< zi;@xt(OiWZiRh=BX2)F)Yn3%Vk6NP+=30h|yY>eJfd(o!5j!>d5!t4>C`Kz_6MZ?< zYH5&Yhn~J1&ug&9)8|-MPV?>i&iT`~2wt<4SFL{Cj&GdN3dMhf zJ)A22Dmp6Sb(1JfPmRl@Xp#X~m=6^+V5UsL?`953K3sV<+^j_px$bUCMHv``HRDa^ zvp(S3gPfosrZN&Ga}=zinw#1^rITvfuKq!4&jL3Zihvq_pM#@ zou4x#8vWd-RT3tt&57|)dAaR`^K%aI$mYghcrNgoE}y|w?f5Zk@XLDsKoyT2*Q&=` zGgsj5|H>!AD8qQq0B5n%$3NILdf7ue*XXS(4-RfGi?cfHNgo3eKyei=K9=3XaTMWI zvFfNR)_8kG)6%pb=~4zSKbr4xqkki#*a?p`jpcejxI(n;px3TrytgF<=;b_}ST12?vxuQoR?ex#f z^P3cI?!mUn5GeiUXYJTvuj=Q?4RIGvat==$DNJ07#g^9WdqSzGcz#58^4(SO%4d8n zzrRgSSOem6G4G@Vchzd|bl8gwJN#ix#FTbqfX6xI(Na%*hdrvq5QM&KM-Nxzm=pYD z!0?igrfc&lbLpB` zt3t@x^>Ec_n`|qHj^dsLk0sVB#p}wGYD%!>8H!ZpYE_2Gxz-Ev5CS}k@sI`kI~=O` z*}~Y<;eH`5uY}#2>vp0tf9G1Rx`&6>Lqq$`1veFt8ZT~3?|4wKY@e)exPPaqsh#hh z41}A9K2`SaB|ft418>2$^{|cb={)}*%72GIJxi9_ooHFl9C{;aE`eTV63*L;jIQTa1Fu9{rBdzo zM+Y4z@s^s&lgG`J@GTQ^#@DA}gzmaT0GN4Lz?+qc+It~dVYXO*2a^v1R!N8JVlxQc z3;Pz^I3(8qAdvO8}Qf^Z}#BJCCgzG)9Ctr@;0nnvTF7}!Hk_WA@<_*Cu&xaqg9J$5?GlMn)omfCGUywm|(xn3=R zDFt8K{D~&K!GL}5Nwix?RNF+JqKQ$x?8g!Pjhr8QFnRMnGf(~pGWz^R-4N{t%d~Mx zuV+j+T~o2{;%S8Rpz~GCO`I`r?@0T=J1o>{4B=D?jk`Zmh**|kE9W!iLy)-Mmr`uQ zVEe5v9Y}O5}M zhARSL?Ty8Q9Eu{-Ci=QOwwB+-Oh7t!GX%9U?^qzv-JBjcD5#Xuy{gCikx)a2Il{&AI!ONj8~+ zef}{m@Bd_WN#(_~>{jA$g50wA*F+s;iEy8bL_PYWUD>*a55MkK#9r|>;KsgfT8Bk1 zw0k)Z#ABb7PTByvGSd-^sU5t)+AOKK!e}*2r!vzrCxNXVdb>}k%bpfI7ym56$1ZEa zOe#M^3dKA<2ufJLG&=)a>EJzCLSonRGK6M6u;0-xj`i!jdJVa?c4YDfz99L;C2f9y zj{TfUG898MPX`%{W7BI_Lr*hk{MZ-x?H=>rxvM$n%klhOs@MTTLG42Rj&Cx|&dMoX zrVi$sly48xGVz56&r5w}*}}iEqa=v`kcm~wsh*;lQ{FBRP+UQe(BG3}OFBY769bW% zNFoulA~2ESi&HEM(dG+hpNS2q+|q3Hplr?ZXbgIFD;c9gMl=DF__IrJwncn@><7Gg zN~@lA8b9N(!1;%7l|*-`C&BEm@8QE%n0e?i33g|t;LT!LsMnfbkRsU`$U)`L9Q0s5 z@Q^}0^w3P&^$A>L0#cmrksnLMwY2bh= zuRY@#!+Bl2%PXeP&%0y))<+TtqcqAgTcYHldDl1#!ylLO<8nW$vfZSQuiUY9-Cj~d z`7q15RokGesn>r%Y$xJfub7$X)Wn+jpK5dym*bm7v}Y7wS*#B<{5!8g+SvgWsUJa1 zmU~V_Mb5{z;)krOze&Tvt)7)_v1a^!VH_1gXd^=dhG+?NZFt!O-Ipx|WeFp;R2({!OzwH%W&T~E%TlNmKHi>V| zt`_CWi4APxXOHg#)~(`Y2`r2G!bf=8p>z2_ig+6C#|E{ec#nm8Bmsq(kTUx28j%p! z7!;795SdYbZz@6C4r&bEuDTiic|dU21VO>59>9_pPKr35{rGs68ch|t_=j5i}ml?8X)SVv}6xnC4 z?ELk0i0mgVOu7Oz8B9;ZYVb+931l5(jK2R5TqGGfA|5I$^(q_G)?H)hI@U9>B_zQ< zEY{#lQSbIZw>pVh%lHV}2btEbTPVBv@e%gj{=e?r75V>X(5GQ>{jV`GHsQGkz=lYI zshjo*96Lh1t@_JnpY6fc7`3}D|6+%FAtuc>Fk!zp#cl;UgzR=*v2G(Iplikh>G;}3 zq@%D5MerVH%#37;o4lh5 z80fQ>Ku)vGHm?L`B-awWxOZuhHv|tpx-} zu@g$o8_${LCBuAP*PtRl4%yuPnC%W1IfnPjvIAl?DWk3riR_cB10j-uE&CaV0@e(D z^h<5eLn-iq?G%ACaJ!hTrnqqZ^_GD9eI>`IvOls`iF6+5+q$_Fo8zHvlHj!R@5w|Gyb24J)f zitv36NubOAdKBE4=L}8<^(7~fT_a0g`aGu{e|ELl%pfQyj=(kAG7b);$K0WF<#$G} zKTFfLlYCo3E&TjEQ<1u_B9^B2*U)azSPN{qhCoJk%w!hu7&YL=FxyjsggCYMyd~h4y)E) zIu-;RK~v<^hz2;;Nx@QpiNtKW3Mm?)`cyYkVbpKb%tWH&z*MEuCCAsy^5@SA;ngPrcDi z(f3rK3`CIE$_&*JIA5O)s!!~-{v&Z8GDb!(BZOm+}l7$BD@v5yIe4W!jGHF zne|lchR~=m?7S=J1yxqzuK>Z_*lSobuP~y5M{Y3W|Fbe}i~s(+ZJ9G^o_Hgw`ivio zkG=3w9qE42_knd~GV&(mp@fx+GL606nIHiv8CNB4gZf&0JM15oJ9CD22L{Om(YQ<$ zV@*nSM9R*{ZH|sILa}v!|Jr;PC%#C$Ao|)Hc7V4EkNAG9>y@mj#bp{%(lk+Ho`-%` zX82%Qp)O6a3-VDbH?LgD_GFSj_ZxxxoDlr|+bNqpc)rko;{txW(LYrh^=%*;+s^%WH;QQz`%=qJ`!65+y6_sL&2lskxz80A{dk&tqCeGL31G^g83cS@G`iyn zRX+h8rAThf#$RG*&`z0It0kZSh?O0&qzM*`@d#FBe+&p#9Ied?k^iU-jaEqp)^WVLO|uzC@pqjpBVyIdC2_a1BvXwXq8tZuP83x*zsK~C*PB9bHHkty zJ0V=ogkR83`j<$@eExr1VoR6(I~sF(A9T78476&MtrT(Gb%=!pu%ng)3_VIxdqv6E z-J37B1v@8E?};8|HBtv2%Qso?Vz9fX1#fT7ERlqwxJ7Gd&*Gtqg30z!jKH(fxhHNP zSo%3$F&p1?6i!<2e}pM8+bgd8$eX3B)$?e>^HZH47x0{`l1)WIzn}iMX-8zS(CEFN z_B9^{n_#~Rc{_DRusnK7wJGwkyE|Y97kMEb8a;r}qnL0++yW*Gml^X{x#^gVxTBK(?wgl5Pnx$G{&*!05$Nf$H z$5r^hkPVyCY*ky6dQ9WViS~3I?5q-L{yM+7^QrB7O=c3~^K|ax$>0Fvl(Dw- zd9YpUQ-J4aP8=E413TqATr0CPPsl4;N$|hop_;<50~ZJzS51BEj~5%S*OI^ZpI2N8|YG3{LT->IZZtk-D6nI&;Amtri>K1L|%PF03TID6{TPFKssQ zIb9g<;c9t}yutBbuk;9ZLdYd&lN{tl%iH^MrZ$$@$hr$u_K6~OX!1W?E)KEYM;7~( z!({0Cd5P*@E8{OTVBpW&n`=d82S9d2)RfbwV76E*1y7lk%OWClVMk|pFRp5xu6;bG z5_*tPtPb{pS*5>cpczXIbSMs!WmB2DL@4wjO{EX{q(N=ckPMzQBL%PNq;qS)UitX9 z@?dogK#~V`5nW93%hL&4HVwTq%HnU6YB!QV#vZ&%k`^mAU=QGhB6iYWjTx)6USF=G zH<7%DU>Rxc=g(IS-_w5Ou|Hg7(g}L*(D7=v*LqH{5I^%{zqq8!*at5TQp64{*w)Bt zjjv>7iNCtrb_xY=!AzZ2@Yz$}3Xp~zQ%r)aP7T+S**P9~lm@G+t6NVV@#jrxoq+sM z><_XGR!uRDCXNQv7Y`3>fpw0z&6;+7pFJ;VEdJA&eNlbl(&ocrrJt+DM7uwwM;?tT z{Hw{{@&Da@X{1@1LQq<#Y~z#}cc6l-%4WELZ_-sq4YuPR;!F6`soWQM{Pl%KHKHoG z&XC9g`+N8Q8t@trhl+5wzvD|Wum<5@Ddz(R036$b$LjTMfkDdzdOT|hy8#o8=+(UU=eJ|7UA{sHDn)Yfo9Bm1@^hl=u!$2KGpH- z%gj{a&(zWX3g(H(Ki+NZ1YCM~n}@|$iCNxp3HZRewZD8zIVJ4ip2`xn>yPBvnMkoJ z=t2_7K#za%p@g)mz@V2{SZP8Vt(zqcZbyF>tpR}=d^t*`IEc!>2+_$VYNOY?2>2k? zj!!H%jmv(o4V=kp>H@}9lD8MuYOn{A)Qfoc2VqF4`iBO)bWK#qp7-@FS1Vg_}p7w~OB1PA$PtSJ!5B%*dVljSG}X_f5cI zf{S-OVRZbHB2>g0y`BKJnrjJ;DZi+bjV^bV0rMsJs0FbNIGc!!rz@TbShO1Mo{cAr zIP+@lcIOoJgZ|o}{4# zWZ7?}Al~f!h`$tUX$UMO5n`_h89GB!gJQE+$!qg(l*>a7lEm+XkhOu}VKcr+;>ktO zo${#Wo0ENJ)AZ;l zCSt%5#Y@jx$iv9V45f>-=Hq;|rQZ8ivwxCCd5b0!SG+=I`ZqDF;ROXg7t7yys@aCSk88Jy-1Ypu1KfK7J zH!Klh9_80(9bQys+Tc~_RXVgMnMeTUXv&whUYx+zIl;qE%!~~V7-;7W%?E53eZN_l zM+@9OUoVX%Lnp@4pS}5krGA!?qVre%MpEByAwYncHR?=jlE8I<ijH^yPR}1{A>;;iL=X+t%zWA7f-?p<~kY z^zbG0{dvFrcg8g78d`O~eb2v;(EYONA{8wp;(&3mbQmft-Ji|T)me9m}+^9;);ci)K_-u%j__x3RWX}MD90Wq{Wv6L@k53z~3iiw0r z%VSsZ@(E+(7Go;Taq!_toe;3TId_M(itmd3u~4g7i3iSiPsIR~N~a8mP;^&VT?X+) zpKjRcwy`Uj`!#jw-20}+TUie7@1@P-X%uO1ThB}N$SXR&UPL6(>5>6XlP@sVsB~=iA5ToKV5! z(TG*cVXn4>o9TnQycm6COMmaNCDgUPvEBDpcgh3lt8x5G>)pa9_js?k3~Ua_Ntc5^ zu#0M0>#mJoqlS!74OtELzhB_=-w%DbBem@Adj8Hr(rmoUMhG&Y5rnbJC8L!qR{G_K zf?{qbDg`R1d#^q1wX=R61NB?H4SO`mz=B08;~mDP&krXaUUc&J{=~!Dc0iZB7oiU> zlbSqzVOA#B!&znb>68Af$bqYif!whZD3kj)VCu(xPcmJlw)t~I zlO?N`o7(9w9WBsy(^_|WjrD=AF>=+Qy^{Z71qdDAs8*fg6!7G+9udx)_+@*NBtr`O zQ57WIve^xbL##|O1*pP0OrqlA9v|+1O{C1&n5Fvht70CgBV0OD5AsuI>yfw)HBt8! zw;C-h$}j>Dsx*kOr3p{NtsE;-s^ zP4acQ;!9ctAk9j#mmPrqN70%1L-n>{{5i8S_I=4RiR?>BRG5*3RHTI>rUg;iiwfsZ z{U{|VODU$LO^Zq>YK9hx5JE*WQXyjOW6YfMp7%eP&zy7a=YH<{y1o~99xugLM6$tC zdG0<$H%986QU9hK+I+|C@V>QHf6uo6xw>hYw_5W&VA);*kyEm)OGm&(=T|0XAjYEM z$*&R<%7XwJ_%rxKTw*!-UkG?qdePBKi`d2>w|xcWIZ)e2&Xc-!%yd`IpvwOTo7P%T zq7+hu6i|e>!T|EL?&WKzi^XphF7`AON2+1sMhVS|`4LOJi*eRp6?O;1x`Qg+6~Eu6 z9~xOG^;`?^#OY<=7XdNi@}gzwg+LcVu5scOWE_;``Q|NBXHO#KiqQ)#S7dlj=gh!W zsCOZ|8uXJ830(Pa8vY&|bbSx^+tSYwn*)|)BIoMANA9f(Jr6aH`|MDBOnP+Bj=xd> z)>xVPTn4OrX1%5_h;}>7mAE^2s>~eOUkTvWoAKB~o%F5HK*{9BQ(%w(xs`^aS7EO+o(qis2O?2}4cUkU-Sh;9N|0=#V){Ov^qk6y8Ii%J$2 zT0~8O;CP34>K6{Kv zJ|bB-l9G=ed$nzT`!U58RD}<@@2<}$ejppx{`sjrcmWWYPx=n0p^zCTljY)_>y7u3kYWZOnE(M5ARW zS)}U*guie_--s*+ugt9~#??|X1#u<~!Cp6=lmo-$QeNz5V)fhyxX=}KLXYy6- z1Ba!#0W!pgD}XZeK~AclYq}_LVQj=bM~0uYp_iHV&<Gb^nRxml|8u3OuWfJ~|~nH?#CdH1j_P&GCy)X#!qW&f0H+5-yY z9akUOrpep}waIXwFbmhbB;36Sf*LZnr0{$w(Y@vI{$B8f617V&Q&8aOBPd+2HKw(Fo0w0EUok3`1O2YGY?;z8JmG}D39Gtv$+ARpK0 zql&_Zr}o=Y6}1p`D3h$jok)FWJc?$9Ffw<{s$>^?(&gu% zRa4#-kA>i`ol24zD-cC0hx_)VY-=US3o7L>m_A3IF-1d<^Fv*Sf1 zq};SrgRB1&lGOqafR9>eA*{VK`#*E3T@?ob2{qOdHI(RiO&-7L$Kbo1(}iwW6i}Sx zsF!cD&q3RCQ`=N~A>s!|ASqqT4cGfqwh|e|GMBE%xOKZVy(gP;3Xz0M{Bu)k{d0c) z19OcsKAWi#&q>w#Tnzng4$Pbr)l#;*^ek^z5&bY+1ePKH^q%aOQ_O+NRsrnG@`Af` zW}+MtrF;gGmG1~sMw=k8Z?_BxMKiNrkN$~z@KUZo>V928ra~8!9su>~=v+?NZ%xQh zV#Yy6p_Ln;AJ$M$XC6=$@bGXgKgDad;3z>H!#o218XMUnOA@cY!>kfS&3m;D5>^9($^IzlQ>D){z5;rJgj`+Oa>ahUJOpnW=PEgNq73wfQ z6}5V|Rois&k54Vv->lo$04@{w#r!xLXcS=0HW6q0>0cxxQ&MaC$Mo6KAUlnGRD7wS>ANy zqN=ysH=e)X-Tym$wQAAN@p_`&HrJ@gl1K3quBT7&V?CL>SF*Wci3jn=ap`DY7R1ST zQu}C8#*Y=+*~ioJz-8&7_EB?Hx++vL0WPb8V$J@1aNy(WtZ^k_eR@Fz7;1rR`U7DH zd=++=BYFH)YFkh|mA;fY3wqC0Jv>0UM%(W7{rTb#b1mBBp-*v8_eF3h!WB>`s+fI^ z1Jg=M@5Zk6A42pJ0uX8W#@pvc8Mlo0ecgt*iP&v{=gjb6;+AngPs`x=S#0wi7*pEv zpV5D?0B|MdKcF9qVn#|D2_%paJtj;RT(2QGMBJ+#xdjZT8N#DA*vRpzIes0n!ZOyY z<@we@W#OIrK#LWQ=?2^<6_mDZ%ziut2q7^AdIiuze{TMa;O{!%HLkJG`Rat}TLpKq zV}L)W8xzWgDZ2Y{w@d49{EoS#Vvp@63rk*GZwhSpDtZgqG)b>RCag`>4%Ac#Ue_hu0t>^B`vS`@T_#yl|5b&LLhbmNo06qM6TS|$cP zm=h#=3pSy_66jyg*^0-vpY+l8xLxPI{I6iSC{+DoWDTASv5waE7YEQp3tqX#mJeg4 zjz!xaMhQRSi>%M~4^o*I35Slf+HDGUdTu9*z|Oq3#7@cq?8|EIaw~z;`+6Yf4<7T28k1tkqqp_)0nKg973~tq+7uFa1Q= zE9Sfra*}KMp!;~bpL_x+_OyOLILA>DCn(Jh=3yG+>x3}ZUS`eF9s#V(4PJe|_4=FH zRW^jSRS1Q+lwy;T_ZKqJDG(#J5t9j%Nfv^UJA#zFxqQuk`D-ia=&tEL+nl+_jJ~hb ziX>2lc~fI}*z;^$ht{wE>%#Dhi$U#|9Js$8KEClK{12^&XlTzT{sP9I6>*#QLumCL zfX(t;08JJ#0`bsjy)XAN^}q?Rf{;y$=3nq@dTc0tU`q>h3bF{pWWPy4oAN2#b+yB^ z>N4SYZ0+uR<6v^E6@5F&a5?ikIAob(xf%IxMelLrvK)Mp-2sac0S-GbeL$cY6TWWL zrbUs%!JEZDSFEl-k&?yQDpworbza8f_kOld?rj6^-1V)RH|Kr{NQ(Rpk9E=nK~hLR7Rta% z0R8{8?okUD3jGPfOnG;2+PaaloL0VJ5M0&`njl(GxN~ES?mfFkBy(X{rbz1oezfG( z%OP)p6dK&F!tBMUVq=?9Iy2(X8pGVxyNIJJkOW`ggED$P3C6#tu!Q z9D_P(ZBZ$%X_(7t*ldA5WIQ@Zz4}L4ra)1NC2ay4!4SnEAz?hvkbtN#&x0qrLd%ZS zmnF~<65R&mg4sJ;nU6@Cdh2L5!zb+zOA9u1fFaJP`AU4-3o`77hzi{+`< zuE`f>^W0h)x;sd&u)k%RPwK5W$sJxTM^FCobrthGk^Ng7d<7*hTo6pzI;EFC(`)+M zrY_fyPjYQSAJ)Zcskwo3RM{usaH-_1mH-WKgHkSrKx8t#8kCo4C`0adlFn^9T2BdO zB4@H?J3D6QCe~1(2Rj}C5*9}QiN{rBfxRxom*qA_l7JpIBW3eU^xQ}CEGl^Nvuo}m zq!3_NWBal#nGO_Y*w>@2P|_x!JF+ZY3sCrXf-#DPqdaG2X|Mt4?8-7TO33>Wsw|*B zBIJcAFmZ$j7V4Pur6f7Av7B=gtXQLs=AS1ONTRg%0VApGiDKumK)u_BECk#AS}D3A zB?)gXl91r5l(tWAgRf%>N1vmdL}L=#d&1_XJ={%_R4o_9^=`Xg3H(U3om_o3;j$7bFR@DESYEsCah#xwZuqEr8{t(UP& zq6=>rpCpWS*S6xx7y%?N7$E(FiU>G7Ql|vEv{(RLBi}wtk0m5+D+QRnBEos9()I!z zJ*QK@i)&6N7}A)TK%}uW0Avtj&A4a7K+{geuD!-z!CL7RiB0*@DkOj-K1lSnE5nhoO0;IXv0#D6ef!@n&L8! z|DEyFR}42g8_IO*Gi?2@mAb-~KR#D#S-u{sjZ_S5 zDr#}H@Ks&An^^l~+OOaqA~TmOh0U>P2O3g>Db?3)I>Nzw=;h1FI{}>01%;zkVsEJg z_bGJQV~;MhjkWO^)|YMT7S&!e*m6;g9t|v|LurU*lGj?2)bsp`y9w_@ri+XF`-4*I z=dTzQjkFHNpyH7X?d(3Sn=It~8x7V7brODx6XS&!;us~EYtkl#v-pAD^KL>+dq<+hotwN^o*AO0< zRA)iAq8=}TG+EQFf8Z+g&OBoYcnj*+ycz_WfqzW62DKJ@eQY!dpN%VensZQd{WJA? z>`(0s6R=0*ecRL@queA`ATddJ@gP-Ey*x#hy@bGi$SmGZ;&06Zvxl6HS-yk% z-h{H)z-#dF@+OKgvMwr9iXO_8kk%qKQbXIo-Jfs^^!Daf7FbUbC^K_Xi#;5CE=3W3 z>G8`RSD1PnPqUE18H9If=VV!TIoByZzF_Urw)mo%I~^P@mPkgA{nEckwrZ@Z);O<< z+)Q1%Z=GPo15%`nr|(B*w=*N8hiK@t<;*66I>cw%{CuO@5~q|;ykHjjV*R3kUE}9< z*lvs1T}pn+QisHxm^X!MFEnkGz|qolE2bquXXG+ePN2VG=+ER@fY)Oe${G41B6?wq zeDquFdB4lX%ndZIwk3ok%N2hcc3nK6kzHdx8PES@r_CH+Z3Y?_IIV3ARp_G--pFV4 zGZgVYtxfHa$mgNc&d%IMNomBXCr;oqvYky}DaX2h*eNW=*cCljs6J%xEg;WTtX~Vn zRB^+n7{(_wOj%?rc2z3x4F^OI9llLp+j$a&WyZV{fbKRTvpZ(6{KXS~R+x|2SlCeG zdsXuL`hjAnp^+ZqQRV<>u+jeTo4ADNu>@2WvlXIx~H*#5a-C6nV zq+3^+{zO^UCYvpYxAVkm?&=6Iv!8tqE8Z>*Ebx*r`u@lJ-GWxx{XkFHXzu$9Gdk`^I@D(r;EpvVLQk%jT$+*j1sc2K;jNPQrC4xw>EaE}oZn zlvsU;eva(m)v8u3$NlJhGljEavV0|96)cx6cxx?>p%Gy|_*3#83_qT1)(x|;OB2O> z%ve>TB*LUWV6Mk+Jf6_QQA0`X6VqvLiF-ZU^bSa$VsRB1;tUh!FED-u2sg0az}CQL znW8bFxVDnX{jg8D_=W2)8cfX^NrJ- zo{Du$Kb28=LSdva_cQSBRHFAYl@$Z6q%~D&EK8R+eLF~}RwC=+B@0=Os6CgXE18%r zz5_o$Y%3ffYm8Iv=wwr1wcbu&5Mm$l&|%x)6V7;+; z6vuxq7L5om2#bA}WdNqYKYe#NaUc6?N>BaOVHX-RMpR2yq(#5&BW^po@b0XB!E9ga z!qaCY#Buh5D|S@hRZJB!j>(^f8KSva!sNjB0cErKoquNthVPSq z$zSii#iDx@UJ)+Sg4P8soIHXMb7abOovtQ@Hm(t&YL2Lidaq3 zX>ecJRk?Lgod?vJ{O4fW(k~!1q%JBzd0VA;lix&eKX%Uf^~c?E->0wLR8X{8JbZe^ z*OJAW$jgz5b=uMafkaKJjXASvBYz=E1^?H;mRU{|`E(45`Mvuu{ph)Yh8KOWIXt(o ziAvn|(W=osw6?7S;+o+3;6><(iC{B>ELWOhKb)2yZqqel%H|OTsXlj%aZB*hrMnJ; zZ=0}aVMCk#1h%xFQGg{%IJfmcipHYuPdTyRcK#^IVfc9dY=yj3N&mWta(E}|J_C>JPFPPEDz;(N)}<0hZPVR5y+gd!=ZjQwp>hL< zFGOMU`OC5!SA+ZDajyY)E3#_|^V#&VXMbf9f0_|WO?;jqrOQ0ha0xKr?Mi+cVFcYU zkKS2B$h33$Nzok5f!))HunCQ6rID^eAVr$15mrIYp=vF zQfQ=zlJBWVn1tD{?O+kl7kv#u81fL zzhnLT4!v@=`^=axse9un@xCc@F#znQ z*sx*ILxV|$n%ACK&>s^(+91}kvbenC-;55s8T_~c_UFU$lDYPUnLY2}DzUq8P;9;! zhq|?OsTXQ5-AT=mt~=mwpbJ{^;&l~6m8sY!#+gn9tm(8Iat3n{>$iOko?bfnB1q4f zvx4RhGoA?)e2y2S!{G3)3Qw!O1ar_{xMArx@Rgpkx%oP#W-$+ zXcO#J@O5-Rt?2!7vFez>;e4Xo`JvMCCdhV-l|9f8(#M9iF zp6DdtEkml&xo4cu-=;SwZ+s7@qn=p0|L7L0H!MoF19)zihJ`erCSH-s-T_ffRGJ;Y zDCK)auBsYR-5&puvj#o!u7ksi*&+(wg$2KkPLb-wiXZbzIB3Tmqk@S?K`+jl)#rHx z5?L0}Y_QYDhuos@hu8WNc2`C&NS@yh?ld2o#@(kj=(EWSPhlRi2R`oGrgIS-O}a17 zR0XqOiNdrVemS%wI;e49mAilx!76E>Y?$a=Ml4vxL#m6fyx-V^1v3YDY=q%~4GW|4 zCW1e~%SFUl-g-WqTFej8JK%C$U0@|J#-~+;Hf=m|sCA2Hb_^b$Cd@x#PrN$UTEc0- zI4MH{{d%xR8esG)n*qmjIUSMC(nt!@R7=S|PS4`W>#&w7P_z0G-CpvFWJm5L8k#9p zK2(^R?9NK^F(|)^xcRA)QjmyE*>)tKwN+b?nNA>*`Su_L6^rAJO7!y6Zp;6qHs8(L zu)0mrjnt&g{X%*ruY-q=))s3JRkx>M5q6m0bNE92X>-T(AwO57+&d8Q!3DWa^e=cQ z|L_FP(ij?-=!g$bDAK+T!v$|Jo12VioaY(2SK~k}^?;f*myWfcMV`~{))McsIZ4Y_ zsZSL5^FCo8Kv&Y4m@lCQ&X;Vreh$rfP72wSIwQ*-xBQN%VYUOjuJW(n#`su99cE?m z&WF&Joi{qY<=UdcRrP^u2-yT6o#^HceS|*9S3m6uRQ1LQc5AkPUY|F6!AXo3g(RDAguIxm-RKwQQZ;wJ>vHn&;V>Fbr>pUR#_p9e+#x1Znc6&ctrl70NzT5>owk4L4t7*oW9O3jzs^#51yQi87b*!9Fi!SIwhY`Wj)LybVdM_z*_4BHWThzK?b6- zf!4!l)r9Miw>0;wI9U3bPV6$3b@l@{&IFMn9LvWDl@s?7&?? z59U9O!osHpe>fr9*uw*Vm7aZC_Ll6A-LZY*Dutzc<;o_l9rTTFmMWKM#^H1vxRk*`hGW)xAYMW9leyOENn4kkIjyIpG8aO^`*cv zkaM8t{)_FVTsIRb&4|F?qVxKz63wF#zdBmEX7INv;)?6SKY4`LR|~BPJ_P@B|B!Y{ z+k*)3$j0H-gV^nDX9Fo8wfQSAO(!a*=-hm%sQ9t*)nQcxUHgolV&06c6fekF%5a(- z$4_ip)LWv%S3SJx3K5V!lSb%VhHv7C&ErxORysE{@|}d zEJJ|3Z)#turvb$(e=uNX`A_#hYY0Pmk4>3--c(w&n2J%^tRFStEMwj1s!(1i9eZ=5pI&R8~`@XJ3#Or0qf;N0_ViOzTH;1ckQ!Y{*r!ZjIHBp$h* zFlxrcx8bUS-eGL7*o!x(!$j3?do;y zuJ(ZBUEJD)L$b%AWKTA!wL=@v36Iy!JF|bb_0Ef)o!hhhL7yJZ>k@ad z3MBh9a4Y{uQN*BNd<@ghr2d|a+jwDEOF~Vb+M`|Uvdb=^6nZNQiU~GbOo+y&zCYj`wVY&0Xa3HK4F5QGL#u8P)XXX&u5r)jt+8b)UI+YIuefNNF zN|ozeO8rKF_o(o95&p#yQ(h3_zrl)tzw>z|{T2vRsTegyo|7AjxGwrKm%os#p8En( zT#I4}tc6KJD%C3c!@IgPlQX4-%4tzc7f*P9M&lP|`>rYUSZ_+*p>j%SwTLV@Wsw5Yk#Zmx*qFC-4gnohX7>9u<3l$VBaYJC{acrr zQ7CH+&33=|?nf@liDoOxS6j)lyI)|I)81{tmtYg2h98cP90>cM0+!&57!ODKKl9VX z=yd|~W~rdcB<4}#gNj?=$=_>tbOsj!T!e#seRb>~x8Nie_TTzdCh8M#+18zgu{Sy| zZqz?NT%1T~l5{HAEca!DSzlGiL7{qxP#ZVcB#R~N8hG3)4ioy#!^}IF+@fzbzzFhy zY8NR^rRr-^t4maw&4`aG@E<>i+@E4H zM85%>*VrzNtb};VWMSQJ;-ofsnU=r4bTR!m(RB-74|i!wb0@ehio*PvHyC5;xo&P-#r|W77uK{NH~@AU^8wqiudf>G)}a@ zJ>!Q&kE4;>N68j@1L)%rlk~xiu-2>1P`lmQ&xGkjG_fF?T__XJX#GT}aj)Ppx7-jSFTs;Lx26?)5v*Hxk}!VJ|EQI6 zef|K4uU8irO{nHP>3hBOu5lh3dYb4Q<0D|)LS@~Jk{{kDu-f(Vh{{BVF*_tjmY$rV z4)*&Yr&rVKU`@$HmjdVRH&hva1IANY&p&Sl1?D?kZ^T3-^>P-LEmX{LBHWp7q(qs~ z1lPm=VGGZv-E&~WIqOYW&HkD32~K-+xGMK2WVy)aD750?txcdDQ*#LDDq~v7AG#>y z=n$~!(I~eDjQ9)fp4w|7(Jet7q|W^Q$jbzzg%~k!pBG#pE(v?unl*TB`_FH7-$><4 z1Vug2)P!X7F%)ZegK|gEv29h@*r-As*4tIH5;aF{Ti{(&4(i;mpq2_KtYM@Xve3=A z2Esbj>5YITU0a`m7>&u@)YwYBPvd^c7MC^P{P2-c@6Vi8hZ!7iIN1J`aRvJ+#J)#a zr^FqiuOj+T=~^sk9den*4@h%vsN@?GZPZPs$ z1i|cy91_oj9BqJPFP*D;-;`67He>xuPQf%f&qj<4*6kftxso#Z@N)h#wsVBpwHNiME zWD))K6taWH-H<%2|BanA^w=7O!ws>uYZ%q#>UBD`_bO_&NMQvB&yRDWM=Jf$S zMeO-9jq^U9KV{qM&bU*Ra-Zg$Zs{^a68e}CP@RKm=wyp9YRLK-ryqU<1d9fVmmtw` zPjZjfJhy_v)sr6ps;e=R2T;%zDLyUj=?N}A)P49zRf%o_W=nUIR_s<~HOloQ86>-u zMNleCmz_Iv!KR?)A@sn+rg_KpN@9j=<`Baum($+;4owyb0scqnx?6PRNoHl(|DVtt2bx}gnkWscfsc;S)VN`7Pw+KVYr*J_BFuZU6b+*SZTE-cDH7KhUH)<7&XYMieV!$(ZGc{0 zUr7F4T#Zd!&u#HvHAAiAy+hXwGWK%nVbo%kH($VRHrZE1yla$wpU^1hk^2Y1ZsGrc zL`B}`p7>pFu(TvSVWqU>qypwi)~o->IrXqnl5p-f?9wKvdJ(?0bY-InS5IA3y%?FC zb|cei(N8v$9Zb?-PpEoe6XrQ@EY9!XC`n7!xSwaFq1BZ(;xLo1{wYuQY*i-AnO0qV z&8n7h%$p-6JEQX^v0x=h5p77{$^5M;xUT}N*pjHW0h~eDF;x7+i!K_x5rnmtpp2*w z`oRS0#Qt@Fr*Kl;0sutC~Sg57U$caj|~5C z=Y|0{<$<(gnp0|tYp06I&saqW&G?KwF{-wOSnu=+j<}n>0bD)JVy4gUQp34GWk*## zjG!hRIbrTaq(^yOBXaURq}{iQkbhHnHfYpzC#Hg~38-O2UaH|+$_r1pf$Y{w|APC; zK59z96#Odn*-qE-VAS7aegPGW=`r9l6g$l6)8nUX8gIF;FG;3$FziI`6FipB3a|s( zufUX>bIl^^#PlvQXx!_bF z^O)AN<-xOrZ~2xAfbaM6chFR`{xR!7*MD%&KeK32aSQQ|c2ZouEXW^>)pQ7YC}nfP z&4gCrhWrJ)6_E}7k9D!@s{=oX{bm>eX!je=Lz1@KW~rsN{0D!C0p4wgpA#(fvy+%v z)LnsA2f_A#jMbR@sW$vHCZp+(SLWeg?N2ugvDZb84JsqzegG8BYs5Qu& zI|-wL6L^Tx6=k0?P_2p_nr`R}E<(p&v@v#|c5@1Rj;pwJM~kd&uj;zcr31LU7ojl? zkW#|ALV3`H7#%;>a+a&sD-Fomzpz77t=BmuET6M#&m^N*Qa6NcY=&iIv8utQ8cf5; zm7a)8=n6Iv^d?sUJCdP1D8rFavI73}^M@xqN!f>(h7gR#`2`^>h29-lm?NG$(1A}N zymYvW?BW%;LEL>zsKU^sg5(rC2)3!$jz$qO?IB$e*a+^fAlut%2|V*4!L64>mNRoX zP^Io$q3DBj_bMr-ckY(y7ku zSCMjvDyugljal*eCbxSP8Nre9;E{ZJ$1s)vi^px@(Wvd06VId88!;7p%Wwv279l~m z!DTkrEmc+iGAcTrGIzw)YO1(L=d0ZBw{gBZWFkeuP2GbXW405JK#$D@OT$9q7+Uf~ zL&Y}6kzvjxHLC+gV4CDk6V{JNf^Zf1>CPQtPWyv@=dfe^7`Zc~e^o!oo_FL5kw`}@ zW;WqEe09F*8RtLL_ivOxs_^{Sy3B(vtB5p zBWqw~5jOEr8><%<2lC}Akv)GIA!zWk37*6*^1d-hCK6v+dE_5JR~?qFcjDs2$wVWt z7#;s6U45|IB`HP*(H1s*WN_g|vD`DxMr;&~%EXGK3%*^;A-X!UYGuT{y_C0`@ST2n z2siHdvCT@5-#Un&&DslWoo5xE!)Ne;0hVViDd~s%Ki3zMbFoGg`XhWwIBl85R#l`mTnwpz7OJ;^{`p!65qCsc$2qux2;;}(Vsd==dUgw_9n zq`&zqBFNmc$U!D_bcyLgjsv&(%booBmS*273vI#n-Dcd_Ocpoyz8w4B9pqDijNu&O ztuvb`UA~#vR-EpZTBa;t-K@htZmI5-cFUx^9%%o*%(f8?{DgbAqq?7O2IS8Vmh_0V zDo>PJ4_~S#e9#|She+1rwq6!&)<<4iAF2zzUJTk6PQWTd=a9L8I&5y4NP#JQ&a1<` zlt0I4V#YPt^|`3M8~cOF;JxPHY8Ab53el%;8k+*Ad`d7bkX>XEBED8BK4mJG^YVLEmg+L%?afR^rp%d#Ffw z-;pl7>s8{g-=#C@%->xam5TcR{sm$@zq{h^HP6pt&Xc@KZ1qA_2ypdETm+(ClwG57 z4{DoB`*bL$+)8ufmiblCxbgG|+s0NXZ{HV%Ow9bLh{4|n!&12%xkqBx>GWU4k~@1| zCFECP4$LZMiZ^s>{c!M&EdcL2`fB_d@avu8C`L6G!jj{6#ZNv4_e#buzGHlmn2J@< zs8QjBEHFW&bxydE`9-(@t+!u&i6P`d<~AxJQyT(~leAacVrSIp4DPz&=rx==u=w^L1w`b$>|o65uqWknc@6;gI{SLJot+_Bh8^MuVf63pba!Zw&Nhnk0z9XjW89}}sL>A6scDeB1 zx=T(;*_d&s`gpO|Tf)*hn!}$iU~iePWZV;DPV4QvR4NzOlU?eVUa)xn%l@p$f?qrv z6(l7Y*KVZ9WdDN-sLd^AM3y!CJZ61x5^EF!&YHw``Q;LQ9i5^_Y|a?gp~QTRcB?VH zXf|U%j9dLxavzk+7oXj;t!wVbcOx{a(F+zHu)82O{-?jIzgcX*;u|DZ7(T`-i8&%l zBN3m-+uT!S2H-KGLsrO5TqUyq-JjfyDYYW>*wpx1?8riEE}eilk0bQO6BDs*NE%nSotHwUr*^t=xoT*>DHd&HY_y+Ev_xQ!MVJ!gmWYoJ8~L( z3(^J;v6#v7z8dEY0M2XvSiE>x-A6s+D@aslt0Esy=C4rj(MDQEeip}J`$hKi#jcp% zGI7liwxY?801U*~pCBVc%_st|_TpJ2j80@Pj-FJ1bSjjtXY&wh=Z$#w5KB3mIv{k{ zSEBg$KLOT?SFNLJcZWaWt6$HZmmAndL#w|*z7E+nD-yaZcc~6p6V|Se{%62?cZZN6 zS03Jk7t{>;`wC5D{}G&{z^%1 zr#Pzpg}kJa7JU>%NZnme*lz*q7aBHp`j{zZ!#8a(UV9xc7T$=?oq==aOWwMrw04}Y z1{sa2n^goMm)n)tN47mNwF&kbp8nSO33KKYe=A$Ll7TL?>957)U%}61S)#w>7HS^C zs-zLzaSb;Y?pA0Vh5udNHb^`9arM;C zfweQjm0m}{CaM3*m=3hd2B_VDk_^!!_g|q9`&h7?jQzqEAf9qG69IP zXz*{qR(Dum?%YQ9@GE4Qs*e%!(+w8u@?xxku>c^G7UzTiyeAh-VC!&|TNvmkl z*g~|b3FI<&kdG}y{JyXV(~^WwdnfkROTyM5UgsovG*!Zh^mj@J>|C5~9P}{9dIP*m zN&mrK65EHt|E0`_@;Bzehp!ZD#5BbMfVmgYM_yY910G2;?U6&4eifZb?*75s{=W{zd~{J|R>&Qaf! zYNOVz{YmEHZn~sd4(!u9LPFx4o!V6m7uS)lxsUgnk_m|reFe(@S-c2)D`~jGQ5G$_ zguOHdi~4r6JD}N^)r!lIjt^jLLO=A*7(t#!jLzbgn#W7qTsjO`Vs8PqEfl^l>2G1w zV`2US&)7rW!d4j&Avv*S6+!$-C5`tqo>fCZsQEG*q0lF?IlIyd2yJVnR)KXyaqgQ` zu@kUGR*S8>(N{z?>;(8o>3y?jTi~Wwh01C96-$un=Zxp6B{+bYKe<=7^T81)LX~-G z4$7frKPRm$T&9h`3x8L#J}vIAdlygsYLJWg=6LLvzt zTQJ8t>mBIb$<{i~AFQJ>$wEJ4JIzL(efNWOwUv&^8Q}ChmoXW7>0@zWWRYHxyeu8w zF4Uluzh95^KcEY$i@#Sj>am*D$onOXeRd0Qx>#LY0`o_kqh1n(^YU!Qa>RsGeG{J@ zRG792?`Ah_#nl z8;j*XtObS8j#I>;_rW;!G;jCNIP^^7HH2&C#C0Dz6{DNnZ0HiNKb&J&TtU=njBv5g zk;%85xsbTzA+vZ4>6#jXCK_md*I}!HcIDZ_r0=JRkfL`dVhc8u9=* zFVuy-8sa~{DEK4FTCNtAR4E(pLoJvRyB7HdZe@#rSq>K$uEIs)n z#mJuRgFy0R8(kKbwXaPrX~il?bZ-gQJql&xW3=o~QG~MHsV#@Mwt+ymD!ceXC!aR> z^Epr_t!c`%%|@2iKy?ZQ*_rVm-~aIya3%dgyOQE5-0Z$+ZpTRWLfKrGu~#ZqN>kqf zRxYC6bu4s^Ea)Pg=UXATjDlp+NxC8hVqVWZYrq*aqOjBO<9$P|3@71<1sHkb_4SVD zDoUF_UH+|_7Iz&|;w0ugPchEMOsB%yFQCHWr`La6N45SwZXDDL?<-CABz{9Fje#hoHcA~2HDTyzB9ww;E#;bWCLgOG$I}~cHmqOWNUhkI_2N6 zW0KZN_?jfDuf0p(Pei@PQP_hPy9x*UvC3vV7bW2Je5(g2rL=O`!KwC;Op*$arN4p? zxPfSd+JF#mC2~8}oBNrgB;i&|vdI8`%SxH-ek8y;e!8(4RL!A(eO0SoHdh6>bHBJe zkbbEek>*dfG3Rc0Cs(es`Ot=ZaD(l|3|500rTi;WmbGNTEnp4?~jO3pXD4=!G)apH4|cJ5r9sPaUH`LsFl}Fg7fiE+RiHL%@`y=i# zSiAA!cfS>rQ}51^S7@)A4)8`oh*{rmn;oQ0|IRdiVdyb1(p1mkEF|Q@_|h8I7IioY z)6br~1_81|)b3Pmr9(#0&b0#lEoA>7c~|VIJ{BDQr`S5b$WG`z$=HUDa)%k0HbpFZ z?SIFQ4z0d)Q7U@OaQ(E3G;rlUp^+6A^P|$xV}GpG(Z4_NzEQOlT`nHKRL^@B}1hHOvWq0BtyUMuSX)5oM&Ynp=FL?d~+i1QwmD-n4Mf-NOp4H*95abex&3e28> ziSK=cXaiVO1o2iJ^Di~~Ceu--)&;6-l*(2$I7fYbQiuQJ$v-;IA*o@iL#R$Y6sPTD zB5qm>56@yH7n~!L=Yze#(<&NP(I-2zM#`I@s~Qhr;&a ze`75lZ|)H9fp47ddx1A3VCKR6^|J6s>hh-y!2ADkbms9;z3&@;&g{m%?-{bENGT;| zDq6@=whEb6N<~SOWe(X&MH?cSBumNCDrAnO_(V|%CB~Aa#MlQjbAIRhd--?%G3U(v z+|PYq*ZZ=(8ob>I!$VZ($8!57(+Xg_$>QNh=)LCuIj97(XoLO>T8{%^iDS%fQ@#@+ zV-}Bw`T5Np!))%CxBZqD`1%ZS6h(;FX_>5uKlx1we@>%)jcXta`BF@wJjk#dFDbIr zr_P}JAMr-&KWA3wb`@RYf5_mtr{Cn#|Mm9`a+ZsnN?t@D+1p*&-wC%UGU}&aEPQqG zn^fNSXxcPZS@7h>w8^&e>*wB z#jGsh$;ITJxCYj8Rf)iKdL0NBSW$VIeV|Ha740uD!RN|fQCN>yM>mwI z{#m^Da+=!VWs%5}c{qL@)IRQuz&Xf8E7Qlu8-yEwx4di1_GBrY_1H$g?S zHW)rICU)dQ-ZxoZW$v;png5H;(O6PmiN2doK7-QVM~rb<+cbdQ)-A!fJr!1)=J1F< zb}CFgEGcS<);sXz)Dg|Q@6jN`<+5jB$eK|8|VRcI;6!ka({Aal!O^y9VnXw6}8i%UwG#O80p6kGU2a3JF`XFnY$*~!1 z=Q4f6Aeeq{CF{s=37%z(I!$qoht!e0oTd&-`vlakpdH6YCLBT(q_^BT2Do6H(tIlB z5a-|*BjkLq9HOe>PHMg27hPt!KOpAy3M6v%E4)Rf5?&!QW^QxPy)QT=Pj@_9qB3wM z52;$Ue-r%knbVDMeyG--x`uE2#-4UunSIj%{zTbVRsE=NPsZ&b_%m(HOzpHAqTOIa zoF$c4SsUf^Z{qL1A#^ZeKD5jCt!$_tycoLYV+Q+hv6$MQTMznwmNlRJF11l?`O(kN zu+7rw+dJsf*G^9V9!SD+(ec*gMiuxmP@$T6A?Vr(xndo;gh4f~yR5+X=qICOOdON!{kw%IfWPo2KcXp%UU<}wRQgDs#O^J6?$vV6 z0Ve!u8xUAIk}6jAGc@LSyK@UbSFJuqOy5h$=w3I)VeUNnrVn%;QgXKhZ>Hr&{u%>cu;_ueM3L=i8 z80-#w@VR@yNiiI@0f4hQH)*A00R@@=aj{v(TuuTj1$>u8>5`N8*QUfMK_^w$3 zu6(<%r$IwF@Kx$D)qd8qu+Ci^O;~-(I#cx5AY5@V{HMSqyYg&9=iMsv+cwjA$?pcg z$(G&-g_12b3U142+=q{eezo-XMRR_M&JAa0qN*a_Qx?6p)qE_y0Nu@3dq_NVJ~aC1 zood4rLxywVmrK{zY^b;0_+UZsWA%GFT2cnOq?nFIa3i>K_6V8(MFmNxQ*B4{yI5z1 zSy>WsoG8AQ$vE20^*yxY+_@X75pNCL!%$&x9s^e=LXZZt-h0)2l$W^BDTaEFrL>H` z91?waj7~H}IfETZe$hfnG4cRbp}vrEW0`rNFC%aa0~DA?-L$3?gtHc%e7}42yNlAJ z*-mKr)MUnb5plN9Z5w)1i=~_>0Zf9w$p(3vMDKh442o86N=_13=iQ*gq6}e`>IYW0 zNM2Mzo=9u?w!zH{w~O5M#}KooP4*NTBO|tuncC>4L6jJRJ@-L$bqouSz7jakuqs-; zQU*EiHpTzB6bc!J!ZT+sz)D2u2&vINhO1>=k9T!vPUCy}BN*p#fXGnA`t2J;!GG$g z#!|p|AQH7KE}Ct7ThD4?JU2>7!d?-+%*74k`!tcwxCaz)soO>;?09!Lv|1zV9fmP! zuD);<4wF#f`8wmgF9n_1A|sFgLzS|Nu67ZTJ>_k0O^@NP9k)PoOLc{i6(U=@DX*lE!dn-Q^LLif-vkcN1i%;C(eMbFd7q)cf?tZfPHuMk zVn71R`)dA9P)#U3f-`xBKPaE;1h06lE*dgsnM`>)1b1RqC1nucgx}vZIew(;X5N&x zs6>@aX#yjpp5c8li*X*RNAK*rR4~HYij58>H1D=`AM`b3d=}7sEU9k%z}c4E7QY8l z@cRlWpL>-`6CUm5a>X7`lU4Ud4weK6`+sr@Z{ktS=H&Qatjr3UDNbUW()HhXXG3z( zLK8IUd$>cZS@?kO%*%Ec!PC;C*w489YuuD?$;i@oar9Th(Gy@>*boS=UdL&;$-)F+B|^!`=udlI@*nyR z^d-tVTRi|V#hBHuyyPh8KN*# zf6C`}_pOLy`7Zj^adgrB{l3dp*@eP9X=dn&lETHBqyBr;o&j$utqSnx~IL_e*ceB5yBIQjDS4K(4C znFGklsvMS?&KUe8VI^zlX~Em~oMsUT)vB-0PVQVVdJ6E%Mbrb=Vhpup=7H6FWpEL@ zsRLAxzYvg$URq!cHu&iZ>9PIjSKJR2LPv(f_^dmRFauv;K4@J72jZU4xT+fo-a4AF z0IX|ONWZ?)s=%mpE_p@y>1%MMEeIYzqaV;pdn$BW;|TW^*gK(8J4p1lPh+%V2xOiCX_BC*mn&lZA)?) z29U^+@64UlL48L19G=xZu@$6M8}DSJou#}^e2v2ahD;&2DA!fzsrF#mN@&At*D2Ig{Vt{F#;Jd^)%^XLz3ZV?kj) z{3y!`$u7P@N*OhF!>L`0IlhNzdHI!#EVu62w^a2*W5f{`wH?PNbMJF5jcE0X@X)9k zuhV&H^$@yO_%1G%J0`B2j&rdoRUif1VteiCr8+ulZ^|NEN_vC3Ee79P#ac69r#vM3 z$N4x+--~VxNkp?RGJs7;(t$7D)Jsk2c_mYf3v@qS?jaGkAH8TKu;AxcYe}OAez!DC zMgupUnEUwgmwB``VlZ9$lKPYmpnxzyLEEOalF{iezOm@emV!lt5Ygc|EEV9d(04cR z$D=c*FKWSvYIApU`L*wl&#_|w0xges2(9@>rg8fh7Zd-qNH(wBI3 z+a`Q>`Gjp0DC;pa3_TPI6d^ZxLTGfFbF))LILLngFFYoK5mZGrJPl=R75S<0>eX<~ za+GCM|2NUkr{=7@iw9J?ru@G`#vZ8l?(#or`j(5TFLUey)_+d9>AdrbKx+f)^)~*Z z#rfHPe5YvTwKhZN_r{WF~AROkdqK8PNMaM_kTuBsYw0) zIT@}eZqYZmxup%K|8E8NL~_fi=^HGfKv}I7_Vg6IRgxaNFx%=&B4i9Ezv37ee+C$%Ao-6vCS$37~+1+AAM6XeB^XRt%DaclCbyK_4m(b|xM)>8jF zwVPg|V{N-`?iWrT7nojJmgxDHnI!|W?*^=Ai$Uo*!Tapz-Z+@ML|mMV56ikG>nIH7 zX`NtYi5!I}|NWLj1yU2if~?Z1@!}!;dGl5$DTP{97yq%2@0?kZ72D@O|wYKbkG zns5cq%5bm_)a9A`z36d#7(s%o{g7bq${i|dC;W@CK-PXH^^muL6flp6 zzoSHLLP3jP4~O8MF$@1r4sweq2LBk^X4>(AiqL$tG&+YQ(WXmA7HwLA=;sLfeV0x-ROhvVE(D%^7 zDq;2CrSZWFTsb0FV?O(&a*81`Yt~6P4%L(dTOj*bMPUs(EG@4A&T*0bSV?<-xl50j z7LoY}ExD(O=-tDOhU^=kp**s_E=pZ)+6$4;I9n|vT*jJfqiqK|oEAN4BsdRzCI>;# zJvQ^|Qkt`@=+ZxW;{tV$#rM2*Qylts)JY2B(X$Wp-}-5(K zEGr03fS)io=-~8gsRpCm5cjWX1m5-TCK9KI^`JEpG%E^s0?Au|{C6-8K>S0$pdrGn z=GJj?*uQ|76(h?h{EM6k%&R$L(^GxUj+cH;R;*-Q+~BVP-+a-2&-#cSgsG25KqE%b z%Kg{y_o<4Dk)W-f-Xyp;NWUof+1*zk8#(i&H2RycucTO`i~Q&2hdc%wSl?Zws~WSa z7W-aBs4RD?y%YILewY5qDuJ*)bS|i?2k}B3$`n`qia`e7C!7Uu8DQ0=K<@=r6eA62Gy-&VI!mnL@UskdX z9t3;?3A@M44`PVtK;1DigATtY@OBzsC*QqA-{qCQ==>jjw}{iKlG99&MFTpW{#?}^ z7AfFZKevX9w96g6l1Q&FX)@N}=VBfv;fA6eay11HE`Db@3g&82axrgV@H?M#&N>7> zJ)pr2V^^Bs##16N5eSP;kwb!Iz?v`tM{gNb=k(BKSrjhX_>rXqh7&D-^zh@5q3#14PtQ`!FF4hV{sAn=J1wk-rF{> zrn#T^bX6Jo!aI|(KSoORDOte4jK+Tw7bs6=D8g0n-HLx=$Th`tuX)h16EGWEpPAIX znxPNwMgkjM{|+~>N-U>nv7|_s5gs$D!?j)F|ALRQ3%4x!9SgTy_T=}C52L-+3ysi* zaB6ADvq8`i%Y1!yp9A7~;aA{6Bp^w+Nd|uh&;Qx)>$ViRT8cFxh8)wzG51ifbeJ(6 zw?@deu6#^4CBE9ws`b?|pp?~(H}hek$`fF{tpDmzg`#ucTA8}gT7y=iFq{AJrzrm9 zKf2}`CG~)Q0yyNSmOAWOF<+7o)=9>Q;#GiJ0onErH>HKBqGd`XBwJbqTrRP(>tcO+ zSeI~g-1qg2DM$DcJ!8#JzIYL`RO^Vj4l&lG%-8SR03Hzc#BX~!`{+-?&p?SKZK^_< zuYAqgS>;u%o6{YAhffM_^<*Cz4m9ASC#MWPNDuU{fGcK6?G_`&Bf46p0`K5LdU!6+ z5BV!nR}lW?Mf!*_;yugm#IN-KQb@rt&!H27EM3q8TxK~n7-;_&_{sVt+zK&xtee>z zb3pSYO|G3_-#$n~Gd+2b6FC_%OX5oJ-vr#Gk8TCeapn4>^|T}q%D+3b{)c%q9yw0S z!wX(d-)#~JypA3f6~8p8HOU{)dE z&16~*QkT!u+tN-uR>(u ze=XN-G#B6nrp^6Qur&zo*GmC!rFj^J$!=wO=pLHL4Ao_V;35d|6Yo+K?3sp~y*~zn z(z_F}Vfy_b{63CN;Dc?cNPL zkiDBP04;g95+s|{xMa$psf!TX<1fRVrN#tWx#uU6UIlzWDh~TOef*3ftV}g++IzyBwx;#NQ{RREB7Cl6f(C@MW1rb`g`D#TY4__G zxOnojmW-+asK)G)$Sfx;tir^FPhe+gb2zeUsJ$8n7FBP_!W_|5p+43lKL7gTI`}SM zPS@cu=^sVMv*-#-bc;iug=bcRSMsQr2{oR&0EFY@UG7`&%0>*t&J*@-=B{KzupoK1 z%GM;WVBY8BN8e(BRo)}I&0NWTewz_w81cYkSM$LOPZf~JJ=NkG+@VcTPUq^9!zWG+ zl+>bm=?i^oqCRoR&<7 zR-EA7;x`g)Uo>yJ_C*Z8={DWPkYEX6ShQ`J_lJIq!WaQY&eKJT#BCivJ)_`|dgk^}50 z%-`9y&})lQ)hytgaUbW>j2}7$yFU{<9be2n&RIy!puHfR*^V=_Coqn-TUdRF%l98D z`HcQ80&c3hOMSQC2OxcuYe`V*Qg_c57ZP7xg>#}Q)=q;DheXIZ5?eByK`GS3mG`%r+w#RHVyY;VJ zB5+67tJ`3zsG%PD zbe3!P+dvMVE>A6mGeNm{tTzUcFjO}?2fHb}YP%NmCQ+GrwCU~EoqWzs3Cy>BZVT-i zNN^z_F7UHDr=v3phyh-1{;@X50+>yMxfdTM7YQ6YP)}vMk1dhlKCac|B)Cgvl*~RG z)uFAbOsm3bit`%yus&G3Jjv@XvbS!)5Le6J)4*)UMPfw+^4vyCrUf!o-t}^yo{{^S zTzPRs`TbQ<&A`Hg(a96&_YiuV6~h4iD~rVP!JdsspwE$Rwt<4k!=9y9JmXi<|5zwY zR>%p-S#0@-O+Da`vljw%180gl*ep9hQHLwkSvQu9d>~7Cu$9TNT9fz)Y!?}}u7h_$ z-zqIRr~8V#qzgG0mjkCcnWCK`^OHc>@vHNMs3aQw)8c(_n-VZ*U=+Z-X8jYpHNahf zM;(rtei*`R+~t>Teu?fZqcX=uGaVeOMIJ_ZtHt4RQ zXF@Oiin$cGJ*@suSFRig>Jb{PC1$a=l!21o5VQ(0;AD$P4q%9_`e)r z*1xMxZ+U8kCqLcNMxrD~*R^s0J8K`w?d1+`K7ByLj z+8Z+>{nYGcr5)+T3nfoM>?oayDJV=Sa*PRLq69WTJP*r??mp)H7A>`-CJXeV;PCNm zBIHx32cA0!!EGQ4w|_>^Ecd`!bk7H+}BY9z*# zmI}y4b5*UzQ0YFNh_&Vnnlwn?3%@fb^1dSTe>MWrPy=CkxmM-*$srVF)YQ1x*! zZ$(Ki65uOm`)|h7w^oW7mazrwjGABKln9%6*{z(CEJ7=_)k+&gT4>h{_v{j@`7Yb) ztjpCG+j#W6w%)%nAk?1dTrDurw|5opcaWt8{Fiwg3spWqnhsz%Log`EmX0gtIva;0 zh{8|TeSYB98-L^MoF98YF86Id`RD#tUs|d;KQcJd=e9HFG6*~8>pDMD^Zt|ki5J;N zH^PbnWh(nCCd}BPrV6Zo_FFu%!J&y!p(_NH&svw-3PI};V(WoDL04&J|8sr0ZiCD; z&7P;PIr&3DQbZB0bC8)U6SqRSOQs)0TYvWrpPunG;r}~9Y*i9Ec+NZ|NHATPg?Zhf z8(n*Sv-^adz5=1NENB4jc6`Y`WpZRfy-A7Wm93wjw zV#+)ZX7DteA>QOR6=2}x;zg+uEcf=C6tkkA!hq1XVFCmH2?ov|KdLDMSARRq7AKp_ z!qd?SW}6iEW5W^y0(<*XnXafjm<6%$vp09+ z_{xsegm0FFyG=U`A8}5O_TT^0koKru`M%AKY0nt?`(2JpkA)@ljX>p<^qiF>d+&Q( zV}GBWM7Wfh+YxZ7QqN|kU@1s)I?%42z!0PhO^Lv|GMWS@To91k&~2C^+EjtLrVna< ztxHr~g(N9|)f_bhbCP%TcsJaL^g$Q!iL9^9{d1{+D!6S6EGa<^YF|pfWWBWg64|H^v)#+EO&(c*&^EQSxWok#P+cT6`hXlm_GC{q5 z_g(nDFrp3uY+-?ZE6OB3AIo^S_vF)G_>Qlx7o~hXa6L<$y?eoffk{=yZlmW=jlEru()?h*B= zhs_<$1J($Z;B9q?5fLlH|TV0NudmH^2($ zf?RN&FAn5E?YveE$Jq$+DxSj%pG79ThtL|qeXP*&B{KRZzIDd+;@`Jx;J$76MrG1d zs1>bBkVFHbrWcM!Nh}21kSNPnf364bC$}cPk7%3Phg_de^mUaLv>fZRH}w;QQq|s_ zfyF`k*hV4;H!l2w<6^<1_q-5$Y&4=Y&!Zos!W#&iaBK%yhiv&uomH?6Q2*ly&qH0= z*;DVl=^VVusmFgfl6ZzBcgrcDAYF9W(R?|3()Xa6&TK-zmOZO2o2N2?z8!G!NI>;) zE=e-y$IlUJ+>y>S%$X~Z2*$WW&{JSU;}v^skeuDL znD-D;*w0wl?6xx#{H5wsVGPCm&2sv8+L$5x7DmKZ6g296Iq6dxLM$oIfu(eT7S$ix zDz)V4WeC2@wMGn7MLWJEkDuNLgs!w^P z=o4HWTjzt`g~V6JeCt-5z@2z!n?-;Av#76jWn-lXZAaVmUP7a7@~>Hb110goVvAFM z(aq~|?ds&`Zk-#qT{-2Hy-T8VXZ5Aw>sSo$v#YJYOh;EQEI$!)Jh2=@@lbeC4ml2; zcf~IG+cU&mbOBbtGyD6ndJc72+>?c)77n@!lm{aIa#;m4i>xXqJZ&XHn^t$**0(YLAg0b-0_xo^sv43LLPux% z6P~LuXrKxoMBqltVVAKf3S%|ag*Wp}sSGbcO9VKJXJ3kbt{1Z{mc4*mYAMnIG0~+4 zqw(_uSt54zz6MgH%eQB$&)c8J?#=~Oa05|U zqhcR9J5F?l!t|_n)18~~ES7kBCgJ?7mgc^q_8o~HEwakD$oztn79T{}f2eE>>J&-< zzL|vwAWX{M0zMUk`kc|G=mAZz&H5*(hZudKhQ5%?vhxR=nOhC|_0e8m!A1qvWiMaf zaK6?^njvnsg}KGdbCWKQbG`VRcu-0QXNXI`ie5usfv%TNG@-86hoJrBYxTaVM~e|h z*Xm4g_SQ{GO#PIBC2xZ9{}f@<8vv0)wg3(yiN&exbrFL*$C4Judfsv=QSL^a>MKg*!($kdQ~8 z_sL&Sete=BdaCg<0%=!l)`2%SaprbHe+XtP8CGJndVJ+sm@P8h;5p;YxK5sSfJYVT zyN}ifJ~I zDl6*SKwr>C^*`0_K6Dv z38l|;Ac@xx(Xn^t2Q!Jt6_)Zc8iO;tOtgSi*W+^S5aOP5BpwFAEEz;q(?ydiqV2+# z!snrzmN~@#e;9XdY&a{Y!yi14?nRsQMH{Su9I)RDPT;DzC4fl=4zO<*0T7snx2iHC zjC}BFNXuu>oS64iv$S=va!4$jAE~XDxE#|V*C<;vGPZ(g@BwdwOcVzDQ+slZk-XZd z{9pR)qsBjOLqn4HG^nKsy8*_hzmh@wOZ7OqNYB#b-g`rQNkKLbWCSrD#l4b8s+Gnfha^X@fmg@D6uo!k zN_6>3?%nU@2YlFF5PSCQew~SPKK5I{!`*Nc&$(sVqHi;obH?QD~9JW_eELX6u6-2XiD1czs(+gRFvOe-Pe z5PYqiyB%KA)OEI#W{;v2!NgLZCT@o$Z5OEF_DLUrf7kat%2DKkTg(4|uK5L{G;^ox4*3dBod+QmMUZx{>r%<2+ zn?%cdD@7>k#As`pjbUWfU3)<;2?^ZqNDrB;E zCs>i5iHSszIQ&}T{sU(<#k(+h-4$WrIV`}8mun9_EdRow67)w9<8ElR#OP~R&`e15 z17YMuE6@VYE5l|W=p0EfxeC6tGfnsx!2)egKRL4T+4+$sP%Sl{zxHxQQea??E<*u+ z0`D$=d^uFmAmXs0Jp@f=Z5D3cvMc+`Ip1d1mzT;h@K1zei*r;)@gMfQPnAz^H{12G zLDn6JDcxB7pp9&1aRSt*|;@&^Ysu@lCh;GI#!#9FbD1hdQIjGUJ7$@yura}J@ZgCd^9Mx1^NA6F z(m3PR@Ys$`7UlFSEKM|0K{t_6W^SM~!k(E<@nLROL_)e0haycy zR%h7s+@%-CX>fJ0_(uiqeHq+oO4D2M1FCRc)Hsx=!OT@7hJ93Fd=N*@*=&C1+@ZfX z633b2O{yYcF5qbza9Fnv)0gbAj;5fA=m08@qfr?Z5VnBX0`O~b>f!>#~K{9&PV2<fW1(fmdR((AIV{!_dPRmakrE#VWQ2^~YywZk_b9-)7!qlz z=*oH56;|CuXf$PwTW|K!ZR|Z$n63iQrxDzCnnB(q$o?l0>AofFZ6X!?+KRP$jZE#Zlb<%N7QiG31& zucCSI5Nmg4S-~|P| zimV?oqI1%&M0<&YSx%upSgio-QFl0%vmRowca{@Khay6y_241MjMVz`ZQ*tjuXoDV z0CnaSGNVLUe?NgA>`My-#kRX6E!Fx`n*Pvn8-prJrN9` zRAXR?nsVNV1LOKjxdcoh)eL5pKqQu5Fu#M;nwBI$@dV^s^bNv(cbQ>4FY#&o*?#DV zIM)$5=O?a#Ux!qdqgns4YW;Bc&O+e>HJMg3Gbe;6sf1}Cr0tg>=qRG&n~Z+l7TQ*_M>Zextf=jibxD zxZ%zDAn<}}N(Sx*o5+o~ zeGc!r_X^|XrQkKvbS-x6Tlf|A>pt2JWTY=$MHFkUsdZ8f!v{kDc zI-$6Gu0^-A_u~C8Xa0mn4~_Z!d~qqs{Uzn|fW{8fS1HQOPlj;Q@1}pE4;Y%`&pOvl z5|jdJ-ZSl6K4Rydj3V>YsZYW1X_WrqRoxt^!wa0^q2r_c z12O2!!NGsqqs7o@z&yH57enA_+_QpbCzraUPJs4&hgh2pP_-Y*2k0&8mhIRmL;%D>dA&}_bBsp}emf6rI2+xoI4wNWBjd6{z2jef| zkC`AZp+l4l{N_r@t!Kr@Y34LP5SW4sa^==$GO#ZwB6x9{hcy!Iay+J0E`Ikm8u7D~ z#87_pYb2YqF6zf>yx~E-Kp%DkvQVRV7$Fn4Gc8rkvqpCGRE)PP&4W-S)dYV?Eo0ay zGA-5+Gm@^OK_;z)6x4z&;|CZ{rTw+?k#3>`*hH8N1GQ}c3LXZ_ofPaai%tjw+^KKHaoQ;rQmm}l*^|n zBSnJ8pUCA^Tj5vGsI(L$jq0AlQu+qzkLiDu^ItSr!twU4%hy-qc9G0tLo=7o#iJPL zJK#II`Xc%iYAm^nbrxG$FcFdXt*_g9IhNN=!^Ygv zpcyeTFvG5?uar_Ip|2E%0%+x&R{&fNO@fvWW`eU$f*CvU8gH^K_r^m)I_Bi6q5n$M zgZjMn9he6RJ>7*+w2b7?F2+OY_9N3J$&wQ=v8%*eeTO4dvri#iYGX7`R}sVX6j1zg z@8C4#>5=;LIb@=ovSJD~T6#<>RXGvqO!7Fs%(?b9mVzdki2e#p zCs-!+Pc}2V0Dxdk#xW2}?xoOX*qfmoNp6-HgPef3qn0`w<070Hi4?VS0X{a83`Is2 z@Tast!vJdOXI4Rb+#Z(pX=NIQ1A!d7p=s#GjwrC-1?1)Xd<=X%V+q?2We=eDdGk(z zXJD3%oGE8FY3Sg^$wOz42<$5`0whpbVg9a&#!vV&imm5Go_xBvJ(kzpZyX!1fG(%CZd^M!rDXw* zfm^tU-QnpxZw1~Q2J}>8T0%$!id0Y}X zp4}pncj=#Ey&T|N$4cl*(K-mY-&a94_LbXVy;=qNm@2%V;Z90#Q;&Xod3crg;i$7t zj|mYEnTsl|d%+*EpK1F_Cl!UIM&+aRljew97u-!iFANTaY zP(s?c{aDV0mhrj3s`WUA1UykwFSB957UTeJ#RAE$z&{vzS4Pui$%4N@n*xPzv#0qM zj~!7qaQ`RuU^o_7V=fd%1?9o`Sy77ucnOv7qHQA3q*~=S{1!z7u9il9 z(#``H=(c8xB~n{ApvFES#+!ddTOsjfWbd{QOkj@Bp}Ijjtw`4;tYz`#`W zw=+p`YXp(D{e|>bpCk-+1|=?5``pC5Fbz=m5G!a{XNfGq=el0*W=bBsicj2qkv06< z@~CXhg|M}5F6i=KfBW_5#wCYUu_BQrnrz-~w3K~#wv&mE+f`+qHkdo7{Ihdui_VRIWR6k4@3feBC%wCQ2q;iz6bVI$Yh^23Tp z(p3g=xI~GRXW*ACyzl2k!)hM7Jps+`p78yOn!Zkc3~oXZ)2c%I)hbBBUk5N$xr*0v z@w_G4XEKjL3($qi^&;OrB6>Yb2kY)=js1m>LACm*@;LcpJOw+`?C?lH4S`rk-~Nlk8w}D;EudRbk*2I z;JFX=tY(zXyJv!}0`fh)Wx$EInwIrwJ?btESeft9w0a3kZ9)$D!g;T| z4MkD7OV-r&;tbDo$T^V#?b`>=hM^ZWH>c?r>%VR~`*40ZG!ua?Z(O!!=rI~z6Ly6j zdiOcs3G#0bhGo#d`_NURXz*+9wKA4-SVU@UheP`5p?|QSEdjZcFtvBq+DR5q(HC8F zFO5T4?YFL};0ie36$z|3l;q=Bs|fywMto1obwuv%WyuvtU@&ZM$>19CaI9?Cg5FdR z;e7}k8+BfYB%vXEG;qvl6!ePoc3;%y%hm=fsh6)%K&ng3g)HnEUYcC{yIX`#Hkb*? zc`OZ745iaEb+K|ivi8$h;XCNpCd70%iT}IXv|K!FcD(zs8i~6J&I!M0QYurvRap|B zy1MJUI$Jrq5v(|}p1W@Be+U!FMBvFb@E`dwX{dp*VM5&ONUb%-Pu=uhm%VgkWMY=g$$cC6yC0#ie}PF!nCq%oi-;4{cwV%T%N4Ydo4lsL8@#7o^jR@5bE z61i94ui8HeLF?gR+^Zv?W^%H6(VPVB*`r_;GnR1K)^NcKghDFT@FSCga1!_L)HbV! z!!~7tz9fE&^|RMxC)&CBxwA^LT%L%Mx-)Vq=ETUHwEF@-&M$B8dXe%&?Gcfdmb6`b zkAKPyG+yL2uu_4s`|*Z7H^#pl!)BZxFU`=u@HqibkI0U~Q27{I)Ta1xhFP;WOX$Zv zPMXv@F3R4(_f&;dFn~sZ3YTIAZW5|UCm1cz=+Qt&6R(j~@X~R(pVhehUmhwqJLB2} z#?4#T0i4KWLs*st=v;1i!y=%u>gXdPlJAUKWn#_<1A#IQTZkDU?oWU(7GGqF0i&L2 z(>$Rrg3OB;rQu#0`>m zn~^e2Z~34!^O$8_dBZDXQXb&GH7`pAAy?~wwrK4Y=@;P1VpkjP;$d0nsU}pWpLjmn zL+Pi@vwG5cW&YJ`z?PWNL1e^YQcIuVL3$0U#hsOY#p3x@9}{E~aKH-gKWv_Ql^QhM zyq6{8zjTs9%K3cwIXTERjlh0eH;trnb_^4Fs?q$tS>K?Wr*_e9^r^}ClcD2UjN{YE zRK|W%>;`5B2)oj{GNfYrCOpLxv`LN#{+=hg)UZP5{6?L5qaRVpgRc)RrITyVE{Sb} zT2DW!VNAe>8>ueAvy)#$Ve{nF*kSq}2w7w;of4^#gFYkv1Y{3GqpDu6 z%(EyPkMB6fmRbq_kO!C3zWwIx89yyLDllykp&o~!CywxOVq6$p#ALpwFqD?k;!){c z{Dz6X)l^Kum(;+r+ASgrJpb2TC_$e0p@^eS*e^5(Bl?H&P0Zm0LE#^XqPTEkA2&LoK`1ykYM z(RNwrRr8`EW0C1#zpo*B^e^WM3*;Zr1shEtlVHbnwvdU6%im}$-p&o!4)s>|hF0SW z%wZ4uv(@;-tu?9AZvRnq@Bc6a$MLr$*<5^MM3ka5oCY31h%dBDRpzRUYxOQ?m#?8v zj=0%h{DUa*Wz4CkS;*#;qblgsb_>?sre#l?J#<(BlQaC!p*JqQ5d4bFhMCIOAK!TY z&jb7mgT;kfq0c!xBc=jP-rf!PzB+U8=pJVB-!!>Z$i+12B4hA|phlG8x2VDalwxf# z*e&7=2e0po_&k)|rjHH!WbKI>n@CA;Tf$b7<)yQ$ zcH$q&(>lTC&)~EpAlUsL^_>wun4>44tX1?poS;NtT#B8k?TU~;%0OLAgkOKqZN;~- zjL_v!>@zd`Yzi>LWQGr$GN*C*IE;SM2+;o=YdFV@!8@Fmhcm9q(B-qVTvVwGm)w1X zX+t76zdIlOLk|ngRaT;@QZB%L;}n7{oCR96wfM|$(8U}X9&8AR1Rd!c677*8N7YHC zQ&Q6vQKs(&m7Cd zHq?F9vPa1>0^hQQ?BA?6qW|IYRzeIC!x*??SE(cMKcY77G$L|SxgnPLB6B!Y7i@#l z30*rw(vD18f_VJlOQq}ZPEK!>z*A$y!I>-&a_D%r2K@N{C^{2=DE>c=e`fZyu65rm zxsT{@bg)Y)r9y6!tyIdH6qU@NLnpfEz;@DwPAcpumA(~QDO9pjA!6N&HS?R_U$Fbw z&(3__$LsZc{mD1F6$LM)2`)cCQshCx89lQc{eQc^Cmr6_u9-({n@VXdes;U_)9ZI& zYCKO3i;Ot8Ju{n9AHnPENV1``Z>O>krG)n8^vzTMYyIx?Wu$zmew3f8t=?V+k)Egpk^kg z4(r`CdnbB&-G?vV7Uk+e3v1y!7Qo4q%-~xa)6-OZOF9S$qO+t*uCxn;E){qyt|ub~ zq??SUxV#ra0rv$VoF3zfg|;9726XHqNL`Z2O8lw!hPF`&tR$5bfez=Wi|36lr~58c zl04)nO^w(5POMA1#v?-j8!P2@Tywy`JMUb_K2wyeF3J5r-wtJheQ1CN)6?CS+OUB` zr4D?1y)xjYWyOHO4p(iSIkP|~5p$%9mmiKnXT4EuScAI%WfoW_Q>$6sz~-2`a_f}2 z$OiblV@0n+bMUq)Ihq+TjC=X{;P5z?P>MUl%0;~btyxGe{8eMzrF~2 znxJyR?kQzocoZezXJ6VdzSO#}(`<>I#*Y7#PUHUvj)&b)u=-A;J#b2~*$9N?bUi1fe` zDo45kuAIp#a?;-@lvc2nR(_nNrnJh1W2^#iqvc(;eDs(W@WVu%dPaw?eg0lRy7l!F zN247KYb>NbH7)p$>8It>lhJRF54N+I*_v-3d|AKm-=j1SiTlhoV-+&q=t6B?W~TVA z2{fMr{AA^eX7aBhckuK7G}zVo3)>co~p3BgCi>gudWEql!Nd`?uo9#uIvS+7K~L z9FTN~Bb@*TTD5+e1{Q@bI7VNp#DVH^njWw!8k*8@+cS4F%p7^bl32x%Xnk$*@r=DD zr6=H@)F?#~0o)`;^PXo&^~ITgD1*;813xlIC-&^-fUQ1%mbFz}#^>!=Js&0UwvVVQ z{KO7x(PT|#3>rnRKgRnj=dpx;oRMZ@!;($v1;Mr30#r?hurjlPOQ1uthciYOPZ5>m z05gDW+3yNxhAO$W$`ayk7_k`70*UH6ng}@s?l_7l#?O-r67==p`zGedPMa%R6^k>QY?%C~-Zkz79;j6W(o^ z%9ty4X4)m=Pg@b(p=Q@+@4)#Ux>z4bJ#N3z|NOd~9t$_az>`Q#@FW%(J>$?E!7E)diQpc52l@#kv$8ouh^(sb}8{Nj7!yprz==!*`c)P}v@4)3lc+(sF31d6-JkVBt@KZ!YqiD$cSQc-m* z4!&Wjn|l}NFubh6a!RxlubwckaaWlc3=)<*1@>_Fgz#G#Udf_}9gqVf^;JAbqTXUA zjx<|U6hRCx56mWc@#+cR@vo+X%| z<|zSd67rB3gqB1xWq-E4;0v;GU4;V*V!honADX1AyO9DMF_98_S;9iRPg-s@rl#cy zc=TLLp3skEPlN;={{>f{KL#==cZ?~~UF$3A{Pw=%!kWx<~=bH`^!_OnkT_?JtKL3E4PvKKx~}K zZ{(iGjT)qpSp<(PQLBnRT28-FE?9qJ|7>5cfcJKv7YClGI)I&s!GKfQDM*a4Z#t>- zx%v}eAW3mEU@=xk+jN83T0K{^Mqm8xSR`8`yxK@$;KvSQ5XNX$**kheahCPgr0&O$ z)S#Y^J02POydsudnB4dLD(R&9iKvkfKXe&d*0?4JdMx^WM*|A=&ht^$n&sS_y#MYp- zPUJvOTK)<7GVsX|Z`lLgk04_@qC?5&Y&zkGZO}cp7l;QjK_=7UIz-N%Nnr!{Whr7% zROCp4rwm;|4N=$NbOACIAUNhIZ@feufha=T$q z{wZj!TVkgEU-_b6$)rVGaG(Dgx@5fhprg9YCUBkw9NlMysV0uCj%U^LIbtv`%L^jY ziKe2j`;^ZU>GKDXOhS%X z6D+f!qsPE6GE7Wlh$+3kZRY;sMPu;qexTQaLb2-{Df~4*H6i0!savboT`l6ov-+E? zu%((5ThbW~#!580D0s2`LFR7en56TGqdGtQ?IN_=AYpIX!T{Xh*SpBL1MLlU2#Y9> zk|b=74Wwi0=vC;hiTI!M9>v^X>Z+JfGRe5vlxSRQ&%Zuuj|pERy|T`aM%|&G=e~WF zcltjPljn);NLhM|gv^r)m;O6|P;PZHRtE|NVbOA(8pXV0w zR$nl#D*pV+$7)pg;L}`$>-3F#8M%*lc>N(VWrL37G$BfvGeLS@tCbu!ya5I5?A^S* zDUW&Oz&2neBjvUye156uW2hK0p$ViI5pa%rPVqn|FLI|X`#*p|uhvFNzN?o|+?P5; z!QX4`+&}BJ$Njyf&1>1N%@aZ5z|7|v(aMS4Bh!cD4Ynvb99Ac%5=t~dvY6{&D76qW zqLbC6H{)P8#|YFOuf6<|aQ4|u267Xj@<{09;ZE*FT;)>gEe#oWvjT`hm%>Y_x$6YI zUeNc5Kwl`VPcC(~g5X2bW*@$#eDZji>mCn@(`v?U#|*XW!yRAxGREDTVhjsQL z%cnE~3J@Dfg!#Xbmk2ieBu<6c%AVc|X8d5Ze9B14%@lU9j6vJlmZvH@3_SloS|Cwy zMqct^_ukIWXUZM+-PICqkN;UQxE^k8xq@*Ghn9Hy5H zDjSj|)^cf6(TXNet%16r1MnSd$s9k_(^dZXZQu|6v9lIPo1>V`G-l;`$I@fyRvE1g zI?YOq^IJsHcYrr%IYnWAnF;o<=A2(!C0#*q`+A8Ah2&h!`b$M!d3#q2(!}i{YScGC zEnQJk(*=a&Fl`Nb=nY!D-3O)8K8nj55hr41H0aUL;UuJ5TKx51al}MYKnrI$maFUhhHSMxM1#Y7y%ZfZtJE3`yEH(qB0AfOS9t+i=OfVg zTNqF@Z{Vl$x6~vlH}sb5TkmzEx(@CpYHO`!hkZ;V^q-i@6)Sr!L#MYI&|K2A&HtwO z+^37g>J@1e-=oUSVxz@V7P8{ofKcdk16;DjUQ`Rwv=2B>J>Cv-B!-F2VQ`yL?mO`P zy@w+y9d=O>c=jt7{7r0mOuQ5cwZbew9)+qa)<$oVvZ(qlOw*6sF*Ds9DTm8<5nHK5 ziuO#?Tv^{3DIZbl|9WCBZ?j%vTPTzbn=0|o@j|I-FXJ&YZ+gg`0=Nxw=-{a&N|DN+ zYL+kM9*-{0TF>jJ54Teqz$tp}#*B|hWiQa`v=$(ThM`ARY%R$4hYBs^x27P*P8%(v zg{=V9*80XuyxU+Ey>*8QCDY%W6qFu33TkPkdBE-c$BaEP#5%!;A`_0i4WB)nAB$w- z*7)>4Zl^E~oP4^KTp|3YjvWK9ADK1ClT-AsC#5m3>7v=UeO0j4yFQ;Hx2SZfKIQ_B z0W}S}=p>xDeyI2qc(JT)Z}NV3p5(vcMJ>yI5~+Y#``gGKcdlyYI?p(pfs5-O?*y`| zXY;8wcA1lP?Cab(Gf2@KkMooTH-A5oLUd;BJS)^pu#gOrXXnA+?2`u_aJc#Jr_rOF zziii)@S0k^`RGw5d#EEA?1d}d_2i@=SMX2mkt+BO83RIVIU1b(g(6}DDQ^7eLn^73 z!Q$fXh_z~7%b|yKV8b~E&W!%SxPDlYsA2)!HlLmpVU8>K67UQyJCxbn)D$B2tH z<35!LAihk_lH`cXC4=JxG^YGZfj`%r^8VheTq{gT6)HkmymTz4TESOG5U-YN1J~Jb zxO0tiDBs@5#d^v0xE9hHk7=M$XnC{-`Oo>PA$#%)_FKXBM?cR+1KH?8I=TiZ(P1UY zf+E`5<-F@=UdiY$nh52)GGtFWHL)Sm#8%un(_QR0L%ex~{Ft66y*S>K=xE$CsDZL* zRq1sHDdXd_PoMt27j}%CIiUCO&@4(Rqu;TL8gk^0ug2~`Mk|SUPE!)=!7O!ga?xPR zEjaOO68Ju6V|;$`Zmp4c#frPvCp*?57IvD#wUb&NNc)Aya(N`zG0^`Osn465GqYxO@@ss56~ z1N&4ZW#8#vmclt-!hoxHZf$Yse^cFWg}RchD&$;*o+nqK!m$EbGxK^+;I*e%^L2ut zt^V`mNhzFwBOZ_YuzJ}wlTwTAz^(xg?JVC(926B_cqqI<72IN|>!9gRHD|$*c0Y-? ziYY{!ggfk+N#wkl_UR%FtY`cs6B6Y_gs;_vUjeCRm_Jy-EE?9w?tm(0>MC{qjyE^K z69s|0`(9%~6dDNshDXd!W9@4T5^t}85#)>lY{& zMw!?IYPa0~?q?-|NJVtF8x$xOEQC)fRdg$vQ%qIR7Eo)}5KQH}u&=|5e zp(yC}SqDL__wNO$ibrA|nv=w{#uY1k-D%N-owGoVL4WF}M?E|C*4qB}Z(Y2=FE;%} zJ)tn8V$_j-v64s~%RvsTm%qoo==5j_aN6c2iTTC&E*{R<|0^>Q)UZTlV(8wuJO%5| zjH8g~KQdbC@=#L_@!F=48~%5KXb#TXf%YGt|IoXL{WP2Ca&u-SW;=r2aI@jK6;z<0 z&iTnbh$jtnILS|6e;BET)227SD@o{db_d#*pjlwQ&pVnvxE%WHO#2>x$&s8hlwW!w z`#;2;086DvyB%@y+RS6`|NG)2ZYv0Wson|2pFNKxW5#EuJFPe4=}En(@^QJDJyYC7 z!B66}@OOEeoY)x(Q$x3s^KU-+Ud zs_KWmL}3`ZY>dWaN={{5gzZEzJzy#Rs_&mUQsG%f!0rX z7OH#lzTXBlHFwFH4@x|UxV>EvfCtVcj@AmdsPk$-xvxKeY6J>G@2*v?pUcyHnz&Xi z^O#Sys(RKjCq3DS4F;y-Ti)Pw68xH58bk@x%0se^CZBL5f;yM$y!Lwm@apq%pJqsn zf}}{!5<;8o25(OxWE^uTICBT=RhKrv@IkmLiwppXW>mz2RdVazEd|9o?~s^g6t_O3 z&~bOSoccOQenVU2n0)k7_F8Zs=G$UFTkgQCR`t7#)tz;}E2leGDe>$nNMP=}7k>6M zs1$zKNWCx*Tn6ho^%v14hf{Lwn>;*85SafGvKXqD=NPzipPdvJ@2HD(#vkCsJTu(f z*_ejMbSgXIA>YcE6Gy0oS{?b0C2ksMusGHjzmzF*Y5Tsj(34s&NiKi1^`J1Qp!d$q zYHwI6ELbA#L3_Y8cz!f9x*d*QkZG`i=axM(XD7N1Q4^hFvc<^4w=W-feee3VM>g1d z=OE!Ehnd^RpSq332dhSDjqYf_YzCR>iu8VL>@8NFag^qqMQGCU4uT|W4DH;~%2*NV z!^s1$!S3aBhaXcgutAuztr0yr^3(HV!3@r{42;&OgYV)EQ|Fa4?1rt%& zKic*KXum_nQfdGrx?e5r6(b{=v|2#Nl;`V!n9LqdqVrBNpDhup3-x@t^8qC`+KLmh zJ=2Tf6;IOmSH_?}7TjUgW-CGh3MoSIC&NfltD*p~3C!)+svz_trat{5)K20ONpGC>1B{HG99T1;%+w`;unlklT#@FPzDKy`UNn-@WQCmJPk z)7J*6l&(idSFJhZNa9Q@jKo)ST(tQ%`P5J@-;UDo2l>#hh_^g)m?=L<_qCQoeTIUx zd3*4V@1AdwbNHuj5-TfBIh#bBnjBn4CsfATzas+4<33XR_1y`LfgjG+w!%&yIbyM$ zL1rxA*F`OPT49aYo6<u^0Ma;S8Uk{;Q4k5e9Id8>_`-Pda9$Iqy=Z-GlzgW=x zGhhhe3r$X7l29_TXJZ9lFGw;Sv)f zT$#FGDd}$lowyGKLMsQ*h&Su0=9~XpnMvYrTTWhqSM|*mc*-KrH5kdy6kcSFaId;S zi_)|1B0J|TRVmeC4}+;myS+f4f`))r3Y#KP=PQpXb>u*?#Oro{^~4cI_k1C?q)MMsp-+ki<=t+4C{`tnPMu$YfkwxM+SmsLJU>nVZRg^OhyQ01=d{#1(Lpy5YBMSld2^>9IOk%; zjX1!OpI6C9Kf7_CYND+Up%arckr*=Z>5`7*X*rW==Uzk!xKZITc40~X=Q$Y~YQRSR zN7b%lZ|S8)d(>8~-fHK5POmc>y!h#FZF(4 zPkO&xeR(M76ajDz!r8H&_@f|5Qtz>b_lD3UJLh$T2MrjOlqk}c|9el_a(&qTitq_B zS6coOQ2`QzKg1RV{w4`rB)WkWSQeVN_Zm7}1-mqXqP$>+xYIP9vxC$r%C6VERS}pI zr_B;`wJ{EZwiG7SrK``rjivJG4(gV`VB?Av>`3aAMyx5&kiGU%nNGX4icoy9Kj=C{ zRpKv3bwCvq_8JMEI{k{UuWhy7ip&`!UR|HrfR{f{m!52wo~tdp4o*wg*kT`{#k7h8 z;!zHT459nH_69s(6SlVV7;%(){%EyF%2m%q_rC|U{&rD{+pPJ9jj&O)C$>74Rh@Xy z1^X>hA$`f(zMotCe}kqz6aEsL|I=+Mn7JFF3KKF|D~}SeJ+oFzMVw!4CDp^Htk!}@ zGp9$4`tZbm%8$8PQ+=-xecWQza7qfI)hFT30t4MAwuL5M0ZC*-Rk#zawoP@Z52a)4cf$1@w=`YQ?Zlu|1N<;H4CbilU}4=gdWp?W zKWAIMUWnWnlltf(KbqSRo2%TXgj4dt$qs1h>8`lB=*Go@0?66dN&Lz#G>~Hy-q3!v zPtGgE%NnyRqb_6Ih?|<&^U8RHWJ8G7XbcHw&y<`d9zVDSTCLGrl-?!xULNv3wa|lp zxT)#TF)U@%lHBK9{m#CNLSmMzBj`VwmaKayGMR)CR4@wCH8|$ZF!^j6Fu8T_lK6Ez$x_KE0&ge>>CCq`(pt%3q5@Gg<6G_`(igWKzFW9N%SV zyo2eKttj(phBV2EiV8X(6{(sAW{@qc0-ANpIn3wa4zzohYHPHj=zKnPh3enNSzlD= zKmGp9?lU#REb(XBEjd;U34Sl7ES_1A2!bf4gWbLM^YN=Bte!|YCPT#4#I2b@W>vyZ z{DZ-m5=fuW1-HR^YN7^Imi^Ka`*8_AW0D>Ob-v#%H*3i15GCQ=+sxk$Z;i?f7M=;D z`CIbDK<)h_qLt%igL>%ZmBIH9h(B;nbbn5rJ?6X&H*ESKJlt6IT^31^+4%t?YtMZ4 zKZtDk{=JS;3j2yA}Fb>T-UeRg#TQk*yb>RV`iMI#slc8`0uEm#wEmp94kWe{@0;c~e#=>d>Bw^etRD#eE^1 z`TWTXYPbZ}S#>6ZMai;DE8&NhmMh5U_e;OHYrH`R-uH*_Xe)kAxIcr)_t=KTSp?@3 z>b?aeo0saLJP@nM)5Wf7QonoXph1uT4l%qK@Nhh;4Sg@^=*FErCO&r|flH&`f%!%~ zV;D5t&+U~>!|xEIjXm~0M2bK%@e22D8|%o(gcCXb!1@5@k5UGnU9$4M1I{SSR||vV zujsL@NCi%eDOI{3Jg?msd3*yT{}MwdCo9wnDm63q3@WHYoZD*gWLHfnj8j)Gmh8F3 z`hJgMm$CCft4eM)x_q5C`^SwN+;bUFva6OXL07q7i?m5sv4*gH1M4;_vA1WYk9LE1 z(7Iqr)4~bDwvk(b6YwXZ15ezAbUbZ9Vx|kTKM^Ml&eE`x%bdX#sK3>Z4`$9ORvll+ z6K%O}DmbIms!9pbgB{l9%3@AstP8DJ#Bi|H)F8t%c7A7b^ac0m>>EgnQQB0Y(#?yC z@fizBo?DqT;UJP`fN+l!AEmE*?CXS$GcEc=pAHYd`uP^$uxQ~+W%0hu@sN_D zJTPTha-uo(2)({nF^9Wej?+}ZGy)G%C| zr$MxLd(me4KJ4Gs8fgxS801n5(G}uTeJ`^y_Kbyu`~0#ncPdL_e-5hCz{M#;u z98@^2&y+0(7P0tn<{MDvP!J5wF_O$VOZBxyZ7Jufl?0DL+R-E)Q-KMiLgj*#!I$Zs zLD}FS<@silYw(jp;3v>l1P0L7hi2K9=pX-4+Sb3@hlGC)UmT@`IOS%80CnjfJ?Ywf z7tA!qxI5?TIU zkrxPyBfWHZ!p#(GM!}bC@&1!ARR>)&c%g1GjE&y^*u4BowIg|7nhODg{Z$s}0y zkONg;J$SsgSG3)u33~oAtw@PU$bGsT`uOXSw|T;^Qj4CBHVs{*?*w8u7yX+P1ZQsE zuWORI$9-Ah-nFW1w^h+|O;`fgXP-U&FH7uguEky396gCv(7ob$qp;W!;&i|SO`HAWhu&K2ZyP|wY9{t)+$OW%lz-KRwHTVr9ZhO< zbboN!yr-B*wsTK-auui%3q~0D)REVOaOW>0d7?~mc&I~hVBoev8AJwAR;8*PCN7@R z^lb)r%(C}p(vP~juct>}fn{1u>{Z^4&2@ROC8PBXXsIp${iWXj6V0*OYkVGSi}lJ~g_#o0_Z24u?m7tW`F8Bwy#s z!s}$hPmX@ue>WxWn278n22UzsnsPioSZnKeCnY0ctxc&s(`{dnC76S@o6*qDj`xJB zq+|y%@7(0o<*4ekk24r8^W|E8L(iYDJ#Hr&<@2CB`)*1Wkivpa?qG$>r2PrP$XrHr{@waewpF@yu()q#o6byl zTBed3hHsZ{v^C6$-_&xts&`KJZRN@WNFTs3u5C)rR zXQx21atf34F1dBVneSCvwME5xQ1mq@@z?Yh@!);E{fgxaj$8&oD!I$$f zk&VojJv#X8$>P{8zQt)%l!V3gks404_=uDbKv$%U5PkwE6y-0iPDg!ZlwE{nMQE z`O})zIrvmV4PC|!+b);;fJ~vevv_M$ok;Ch(Tkv|oenWFjWC@~VUom8NR%HSCLaC= zp04oI9a0foV9O4@WxUFfZ-MH;nxk~zgGd2kfGdZ6&pCuQzH=EY{*132E|vrRla$ri zUSLBSG;@F#;B`9tL7(ev$B@ifsNBkRz|aai+a%DVCdk<_;u(R*c>W zki^$2l;+UF_$*SfCICmM@2(p0o@a=dy#JrdM6h?}-i^V5$L3>~_d5C}dg`JYw7Imz zg_vHLs>7ldedbcQGwa89<#B5#0A zEo$;rv!9WY=I18-uO^x8g^w4pw9B~65PvoP9)`pHdx~_i{pg)pXxHSc6BLC%lc)); zd5}yN?GbaH*L?9lL*jGOT*Q~Xpc_m2b3(hUhK<%fcrsL8D@kcTDu+G&!sKztOag2R zR%3qQuzKN(ld!(h3&PzfuGCMhO(MKUCP+^c9uq!3eF}noSGz%YrP6dNR!C-;FRz4D zRo>%t%{|O)H;NB+&kGIbZjUy*Tk@9GgRM`VN?hO@Pyl~<6OJp}(s>4^`MHcdn zEA21tK>t|^a0upiOA)`)WNfH?}jjRw8Av~gcB~S`T zf;{H(ij)dmfEhLYa{)zLr63{QvP!G~O^#ui{j~q4!8e-Bf?P~^a{8g37IR~uO!1MY z2+j#oa@yC%u=1&KV~UW?MsR&)#@TtGMZN0fLccPP6_}Z=oS=-qf^jYoBVKrBm{R!P z2g8rfbX=U^s^isaABZboq^Wd=W$JDmf56jK9sM|1#k<(AKiV{{ZvU6UW9l z;_gsofb?1XOR9i&jDL`t=)t!*23~ajN{XECI-K=@)bjmncz9~wy@OqbQ^O@^JB5lc zdl!0QEkoB5&==}&(B!m%%HvS<8NnBFSks(jj)qW^vf>9?5KkcV-7R^9f{Twl`2oy6jsV4bIr5}}<5 zn`H?`#J+13e%F6;q-bc_y1)v<-0FL3#k1CFP@#-i+I-l-A*_f{A&ge$Hwkoz!ZD%4 zjPk3_;s#7Wru1}&Jx3l<1bY0+e#pf@a`F>Yb;Wo*=*qM&Bh!Ous!wJ`^f`6s_-=wd!L9XJgCARyS zz@H8hU}9o_TR@0Kn?>Fh*WH!U(SWa(dxM5C`_Ao|hejx>*B~A=;JcXZfL2hoE#DKQ zZQZAMZIx4Y>}tZBWKCA+AQLEw50Eoa!>$KWLqKjO z|J?R};Fz5y(2*})MsIZf3fC{<#j-gzoYxflidmAcCgIR&rbu}o_{(sSl--u2n%s&( z740rSdT)r;Cuzs1f??N<%xhP{L$^*{F_{Eu#&Y|;+^jWjXv$lJ$c z3&LI!SMO6Sucr1YiOrP=Rcc5RXw@K>C@!VIVuspn#aqSv{?vmdYA=%$1j@P}ortPo z(h|e>xJFoT(WR8AN%R!k#qXjV#=_3s4X;r^|Igozw!JrV@hoJC4>o^CPU5|f|1193 z-(iTChnwN~I$#;anwBVhQV(Kf6B6RF{yC-BBBQB}Z!Nmgi2xa4V+uY}{wxLZOifJ* z9pTr5`D(t4(X*4tmO~GT^Z4QHN#(nvTW7C>sr_4}M(@l}op8MA5sLRda;&j?k-vo* z#RB@^K}M7g>K3aG_2}n*Ssg%&RS<-Z4-zM#rSr(`h;WS|Z!YkX81>^DrnXK*V#GWm zPL>h_jFfv~GA)gzlr4}oWwDzN^!jLPNW24SnJH{ad_ zLQOWj0={O#9I5bdCIaxoj#JBjkvh6DmmhQ}`h@{IJtzv4*@m36-5bA$+534vA{CCj ze=Z$7ODx+>Tu>F0a-9Oaty^D+XE#5FmXEJkS}~iHgX98{_l$5a!F@48E)9$}o-J?2 zhldD-%9+VFE{h=T@E3`#C0k;KisRwVh#c75fWcGE{g^TC%@YT!-uR#NmMH!*#;Jj%n2vBLAoa5evr>!+on*4^i=X9b@ReqJsvy zDf7u3U%L!Pb-{I3-P+UQv_dW4X?UimJc=Y?nlS6Br*t@bApf~+3%Fl&h_g*jwzvgc z84NV%c;w|CPT2`c~{ z7`UO!n+J=kyt4bj6K3uhwLMq^ot5eB3X$HRcFJ=WU%pFt8XDgcoP7&kO6Sd9@McE2 zPUwO^FuABle9jQ)ig{{JSk@3hZvE(tQJx6NKxW1k{+!MKVyss<r2#x7WZrI2*M+s)#fR2xjQCYr1xza}b zHXrC&OPjc)C}aexT(X>$AQZYTr9qUp{@uB-*FugjD*X1#K7t!L{oN>t=$pV*@Od450fSUPFBxRq^IS`;PdDhuvTeF0pI8Gldlw7xw-@WbBi?mPMOb1+X z5hj-!QVF)hB1LoyzBu_CaX#IKIDh*mv2FvVVn z{AcT0&OwQ33)fVM&wZlBZ75%jNE+pac|)(}Dr2o5Uio+qc6>Mki&hH)XmMAwd3^Y) zv56P0Jyox2b4<7{&xXAARiNm#=C-Tdb!ehLmCo-U{efY-Syg1jV+Is$;QLzhC2kj9 zGnN>msUY2bhiO82zTW~!e|5x%zIJ*}jQtBHocyHWH`PTkXp5y@6=Tz`2YZ3YB?QW@ zL^LLau3eD_h$1>w@a?K=F36c~j~Lb1&mbuK|5DkyC3Q;rG;0O)G1x7Snxpd%e4~qv zr-_V}H!RWgu!+OXLTd(TBBskWKn^X7&Q>7X^@hp9(El?HOEPEjg4rGP3%ZHoh*eBg zmV<3ch>4q@5k?5Ld1rwsgvJvZg#Q3SneI4Rtb0N*Uh?vkv5lMv6^FK4hx&k0&|O@? zmS{}S8LI3`Xk-nebe#TMpTFV9Eoz~qpb#24Tgy2Ot&6QltJJ4G7xuS|ETG2jdLi{p_po> z?A-SBO<#ov@ztaYjkuaUtVK2h%U_cxb@Qs7A9{7QHh8N1k;pTMrHOL+EV*mX!9wNc zr-JCeH%-FUdK?@W@E-L1)eG}w;kVbn#JjE)pO#|q=W%UBG1(ZY*ZaOpb4sR zimZE#z*kB-cD^92DVAfDChr}my67T4k}$AL!uG~%d?N6w^%VMMhN@jAI1G5$Rg z5iI~!+5&@E&FEvGIR-?zuhQq8f>hjAL1|Hqp@yOMW3Q2lXVNn{9x zWMuO7Ij>+Tia9?rM=!*haT3GLOkEa2UgYWUZ8{9*>Q%(>H1Z7EE97(vhe>$_#D7i1 zwq7Urzly*$bu4BNlPDbD?rFHPnj4a)>pPZmnD&kcggR%WneFJkw2O-&@xgyq? zu0=#Rhf|+E`)A1cwc^7z!CZ8auQGO?=LKa$qvJ^@y)S%;mUiDoxQFqh)8(1OPl9n) zK*f!LgB5u2ElQc6gp8dJQ`+KwK&6xYaAkofiAD?ATBs#o6+mwJ2zAF-$KC| zwT2DQ7gI~AFvLjJVQ`un)0g?ZWnht&5;}sOt1xbz16I<%$CUt?T+e1SQKMDiZOZ}Z z3^Jb_FzDk&H_5@FF9mbNS|%Hdi$+LC{_mOffS$Pj&MOAH44iybgayfAemT-MiZ!?> ze>T2qiW3F7Getl4j+f`5cGlR1Z6L0U{q(jsdO~j`T2S+?a0T}OHD+bSIojAoCOeSy z?;D(2z*(6Ur~mleQ)oO@4KrR7er32rtr|+~M#>K~c06vDb!QQ)fYZSM-amRGDGUa! zlO5Y79ZF!~hd(VSB~=kq2cL-Ei|r(im(Hm_&5hHiU>*){s83&R;VqzfHN-AQFA&~J zn7bXrI)=y^(ByqURytGs)uH)sS*QTHFtM+5aPLse)Txfe(xy8&h z7A!==sbF*;><|ePhtvg)`XLMCtDf-%MneBIRGXQ79`i1cTjdQ};WVrceMo8|Bzflo zj#uaje$r!)5^?iT4Bn1dI)MM&YyMMoXPk%LjYg7%30q0l<#>9=vCrsG!~CglzlFbs zBiT}hhInCGa2{P>aXBdY8VKepim%jYs8Ui=lK^qKrA{AwL;Zr_)bw@>i`Y){#J5B? zP=5@rz_D`qQ^uU^8ld~px$F>N$$eSJDS$wYi3osMLi4h#z6{|w!Nu`IJAwgOmSlzSTbHM>GB)$$Srw{k>V z6?s(t{$&88ILIzH5jCUaMs4c_6*Pijoz8p1eEfmcl=zO(%W24JG~L^$B}mExC%kQ#5= z7Z+d*%x~xq8>2dqX!g`uOW->EBLHG+@SI@{I+|eFzw1>hzeB^+1f9Q9n}!Am!ei<6 zn|P$o4yx!XN47X5%)Ea<{Ao7Ujw8Bn+)~8iXFBAwxXQ$RI#b8p+62u@^UX#2pWl4A zWwE2vIMgp4)z`bEEXv8KlSM{Bqditr@DhG`hFuUbI=67Fedt{ic%P1 z^P%Q<#CB#j&-I*5~!wsMlWmok3OcXRph+;GDJfcim%?lbN)q>`+h3hk1!yd6_SQkN)OH1V9Gm@ zVR0Vz%G!UBGM^7(Rsts{a}p}}xGJyY%Xh#6aC0mqXMs%3)yf0S!!r?d#J zo5Dr$l&7R^^Dx-k+qEQfY&Ji&_16^vtpCv!1DD`cJ9c*{XiRZ#HHji2qOiMI0n9t4 z*pQ1T?MI$MC=LCGm&kq~NApOF=mItTw3YFZ*H%ICwwLL6oA5|kM?E}hxX69A$F1(S%kF~^+q zUS6-~3%sRw7~t76Y{BVA=y$h?4Zr=69zo4*$`N?K=%`>ROLAD^ptky*HoD(D?GHHF z-%k-UR`+P`oy)^G&+#R=yh@lehsghU1*JOFXmD2TaCP0v-WxdrP1gC`tgmc>V=4&R zht_!NQQN;ik=p5?h4$h&vX0m+;?FTQ7z+HQ%$vJNwY zkj9(+czCfFuZ=d#POyN{A?SAQf*nVtO&a{f%( z-r4C+z^#=C!#z;8uHf%_WFVPdvjov`=8b?DSZyGg#sM2OySuyJ??hvC3s!asmeG?> zf)nU?P0^}?=)^gy)oK^3)n`-1&tFO{ zm()hX8(Z&pU2*+wre6MyyUe31ensuqvKb|c2fOAX z0cx`H)VP@H`yfF*VwaB~uOIud$74D7)Ku^T*(B5n!0r4mqK*sDv;{PS`?N<}i04xsilk%nkl^(}Lt2NKleM;@a!QG%`D>#BQ+E8N)IE+ApMTmI~5d7FZaDMC!{ z;X$`8Wc{86bf1L+4Q69J_J047tOdg<+tpLc+?ATMt+Jp0&iR>y&YKb7cGn704qX(~XOP(T!%SSbM#2@#nvj zc`xo?(U&YnW?#E5nUv^ssN9xEe(wotD}H|NC6K%J{%t9v%lzv3-2XtxaE2jnx(c)fAa35#&_rcDj?(5IJXgkTJopC{y>o=~&Abu?>MzTaRN89f zhJSY5e7?v0?pJ;#m0A5ZxIfKGqbgU z)`C1O!my3AXCdy(c@x9CfQU5ZN1x-ul^XHBTeNg2*rcPN$=KXj&8g@YsIz`WIIk_E z$@EXQ0*!wD;YM3+BGU%7?w!sduHftF@-r{;%HfAyEs$BKH`nR|=%9O9^Y+ur^(X{T z@2L+R*!Ve}B@r*Ck5&cM?KDEXt+}#cLm3s<)cDM8*^B?>hF<=sG0^PhsW~;PC}#g% z%;h#{u}8aqm=-6zoGe*yDP51&r1JwNwH~F1MZSL8_Maz5VkMByV9e&!oG}I0wRq!@ z+%GlF{FTV|qO*&^a-M8^W43Z6(8WIKn;j1Z&kOYonv)u`;>=GE-Zk~&<18RU89H8|Cb)oF7`jRV z!S^(kr&&=#MX2Ex+Y)6cv0mDUCbn7VXa?_QNt{>u-ALGHj5O$@t zb++=+@}cgpgB@D~DRVk60zV$cpfUxXw$&x>MkIwyJ5!s}NLZ751CG=_z}rv5JwtYi zYJVyop?!VD*+|D--hHb#SNWV=0Os8VZkTkUYB6hejwW#v@|0r~X02j=g7;$^V$_mn z1k4g9PoxEK(h~c373EcTD;F@p@POjQv}vE|j%EB$XtEZuZC|u8n!rf&9`_4q%w3nrJVur&W&OeyBw#m)gQYy58(vJ@ftcryWU^)Z@q~#H{rjxI{c%O!eNq9)9e>e8 zFq%_gPLc}t=iy=DHs!i}S6cCA{K18nP%8?odoP3D$FRH8@wGY9O?jVS|BEQ|GiFrD zVK4Yj!}ST%(((_{RT`ojyAnRc9J^F9=McyF-%pEey(j+e7i$`b)?Edv?D4#16yrRs zVFv;x)06wIoq&IiqPr)aM$%4y9sz&!cr8Fvhdj_C^~R1PwG4qSj6GRf+Q2dy^1L@4 z8FXRQgl~3*KR35ODuG!av(}CXzrukAhWID^yrH8jJI$*e1_;AyMw1lS*l*ODJxh>!+P2n4!LL?l!k4Wi_2$8FH={HfHg-0iFU-bkS8 z+v)rC5w6=l$GHRA$Hxa81?iO0xn>r=g|;OTl);7baq*b3r&y$^F3+GamNwnOS5jGq zA1TdG*MRKq|K{vADdIBQUuX*VJvGQ;r`+TW1raQCUyQFdDXy z3K&>^+GG1-JO5Gbo`64k5|Qrq-(>!y;30UaLg*Q5`&0S@3WB1S!BCdKf0H3`BH_BD z;^``SwxwL_AhKx|G4;HBPyUrn$dL|q?kiI3Y>+4sTQ^164%fUq(5MW))9d&HDjHLl zVA^VMi=v_rPDp`A$-2+#Q%fBlIR~F#)A-?L(AJpsOTTvS&pf>o-~Ye9*o?y8h^7)S z9jR^R@233R0D=><7m+mZyqxmN$2{hFfgZy$@wy9AmG|TcxZpubq?(yXShSf$z8X zaw7h_g19c88^LBB%%T%J;n#7Ew{DCtpR8xXCN|t*o(~A{iu(@s`qjVZP26|mmH@oD zU&loXY$NUtdg2xowRHF$Of^+nD_Z(j9qb6ktj*GV2#7FZLN`{_Q_k+srth13D+VlE5PrRa~Oen|Jv>Ndv<}<8q%vYA*p)Czn{4kVr;|ilZFI%lz)Wr%~N|VRyK4f?7 zDD~TK2BuMLFnVEsB%$lFns}|u^@EX-+QIZx7$`QO)*X^L`8c@3MijxZ}eTzI+ za$Eb$Jf4m94@zI?AkXLC=BX;F|3jTul)m0zabe}uIJ z^-*{62aLzWfuWMLPgx;H$D8VOBE>UIY6 z+Y@$MI02WQ?_2#5D^hz}C^6~Kw(N&zv*jHV1dG5PswmFXJv9vc=c-XIu**8@8rkoI z*NNN=HV4bD8LHLJJLxufYdHUlv9P>{{~bmZC@@Bg{j9TQYLpa@vhMlTdLe`c@nFRg zikIgyMBf#$fY`YdJp9S`KWl!K7h}%Aha*hc|BE_^(VaUZW5EI6`Rw!$H`^B>pG_U zCSVPnP?7hhdEmypkoLa`t}Umi>H65X8$S{^e8>du<5nL*W+#kb;bG;Uv}lKZY5Io9;}*=kSD4;`{0daxCoK?uSo~5*d1OJ6|vNY zBeIayQ&=z^M~XM$I<}_5V5r)lnSao5Gba0t++0l;845PzuMit6#h!7RvW*ER3?!YJ zr_u#;OxQJiet33yojm`BZ6?WWQC9!s=R&=On&MBNeQh;>J<)DY+vaj30H5!tGX?)J zX#b>#zy7`aG5`8H^>l%k5jw*Rw7}Ib^kumL@qxSA z!FRH05rux$pl(C9vd_Z`*iet40kTxsu;;2X`k}70I)fgj+3Z|R;Q;f+ovH+wsLF57 z5vwZ`nm+uU$q93-TiRlUk0r2dc}1J5(%+9}#Ph{Qi6h)ST%Gy$_%VlyRiXkkjK|@X z;bpq3tLOtsUpJD`_p$92Gh1FoY#`ewQbWx~v?IzVIG!{4Q|WhrXYIB_yz;To8>&?D zX_Xu90wU?1e1psd)NkJz_gR0lrH2tS#forpP}^+8vqWBu>=MoBiB8l6&w7O%u!u&C z@n6Os6ffA#>*t%n(Je#9a^qfp3e~b{xBWg{dQi4`t>2D$gJp)>b_6=}EkKH5JR_q;U z;va3badn(M9-mBmU`O;I6mB%(KKj^JVy0VPY2+r%)nUuTmuRt>I$Oz*V04RGv+yaU zOhl=aw5lZ(MtFmPU^3bmQ+@+|h0B)DmG$d@=a!Xz(8MZw9qr{GLt?52!L052Q9Rvh z^TI{IaG&6SNj_tT0lv|d`1GDtpQz2d0u4zig9;`T%HWvv#TEq|$hh@qiV?7o9kN4h zIB6^JPund=huDnd(%u=rz=u?DkPi2>M(^X>cO504*UmJ;%kM1*2{Ug3yW5i}V1|qN zHt(d%aCmEMdARzhog!3O*oPT3F1$p`tWDptf#PIRt+PiYZe)s+m1{phH`SGZ1gS@n zW46W(H~5I1Vt~)K&eSFX@fiEh@}uR4u>(x}%0Nl+N+h`xD=a~}AFJcLAAq69*OBB= z$^sW-6!UA|LokIQyCz!0T(^)(EkkWus>8;noi)E61g1{sjSgEWljPVD$RUIuG1Ov@%T>TM=X7>mn_vLaE9~yM8jF z$UC&^ICOyRiqth!Rl6`4&nm^R4Q3z!U&mZ+O55f~ZSWKx$4sUwxEmEs!aa_6#^V#I zeX)hQJZ~ZWe-{v#$jQ~_+}X+~^7Y^v%bubqH;%OA@ReZ)yB#O&AFU|CIQg$O?yv#J z5eZvlfQO^DhN7`uZ6Mf;PUj~X;^o*6m39@7IAz0K6IaUDlFq5 z>#hy);qlIDDm_3DN%p>rq%Z^rE;7>e2m{H~pNm&YnDpq%zp(LM>1b*frlxvE1*t;0 z8ru8iI+|(o)8^KaYp4!O;wSLc5IM>D*U3$T;l|F3MwQJrQ$?xp%PB~E0~(C*v7EQo zcPvEpw-!vl3=eTkfg_C8BTxQn($@lW$~7e(hg|PzUS1CJ)XzT@gqysct&e~nTUy))J|IUey(UxyQE6U|aF>svMj~%2m zS)6ScbJo4;wl$o9l9?4xUOtX$UObz1u_3a}8O|goOH_~ZHXUpp-5$=4N zym&T69FyD-z_wuOHakyi7@K+r>=IzU&B&IE`3EAjn?FfMTW5oX^vn9Pmlp!`UCORd zWiopgvTGTTnif#q{cSZ;y7t#IIE8=*GF*{wSj>*u-g5C93Lo_u1pJRnO{Yy{#H6kS z#u_!D3-Jrv!M%3)XP`Gs&`M7*QX%sr1$6G zR3Clt7+dj^_98odDLq_p*!8~w&%ubH2n}E@=j?~j| zVEW`_mg2NAV&^%DP`eHe?fLzBH$~lCY#{lH6g+(`wK^TvVBg}L3O!)cym|Mtu8M)G&}eu{J7fC#xFkDR{i{Q zJWUPkBfbR}ZZ-w^j0{#S$0bxlG&zg4dYU}*Hu-2Z@UfIu#VKzMZ;?Xd5%G1*;Z#Ng zcOB`xzNHTf`6MpYGj}}$+`dtY{u8GG%f%=;;kyS*Fh`)lj>}#!i4abzrmklp`7fh@ zjCL(pNx{PLtN&ja$D~fAAWKiJ(Z^9B;%+PV?p|ci7zJK8kS%v`E?QxW3^WNw1ZlcU zp6S_QSI7)3wu15Hl6j?`diJ5zP*2|oww?}O`~O+C`ccYz-! ztCQ1c^{1`y+hFXqn$Ev?U!<%$3DA|=kASj*HwL1Q+Me5qd>^I?pXx4}d4uuy{(lW%MU++ScR z9lwTKUexaPMX#|%8N$3R)C(wafzewYNoA_4=4E;Xvo<&QzCFE?zIv(vt4QxuI2S|r zmvLQi&P2V0BR=()(u5(V#K#E1gJY|Z4knLT)1WSBda$sL(&g{#$PdQ0#H)2fJ7w>& zmp+@oWZh&{b_kRGNpNExo;vpD{4qfQ&>_DRmTcDNRdQcKO~oEtyr$_gD!BqSAh8FH zlXv2Iz02I>SC3>&9?xPsGc%4OX&e0g;^&r3QcueR(@5)~odEBF+sAsJAKMHm%f=V} z2EIRx7}9Rz<1jRNwElB~hKT%j zIl8ZRuAn6gIaQp)`^ftC)DL!K0qE(~Souo*W zdIqD)>T+q}=E3R~7%hz*-hOb*>BUJ4dF^rFg`Cx(9HtVqVff_V=eFBc{=nZ*fgpJuekE;hl7ZkWnA&E>y113&Qr~>?m?pFw^(~W8Qa|Oe14G0V1)ZN9cxe`8 zioGIyv_KF$pBGo*@CDn{<=hO7GA>q*EL;V0$FP_16)2cK+Xc_19s#$k*9%s_Va~@A z8=_|ToSVn|XfI58V0|O({f{EY=#bG*PQdZ@MZtz1A+&X|S0++q_UOrHbRw#>XwJf| zYH8ZTp-v^(y94N6nj{xiO^07HK8}SCLDLgThEjTaC!9ViPH*7uhuQ6^GX5vLB>GSA z=kGhF0;572%_kew)SY-BP^(_eiqT#{F%}(-bNd`*`M+<)qOxXqV{}A#7~iX&Mrkk* zFQ&^Jd^7E@_U@9c7Lr9?X`vuA<-!fHc0~KYfOat-fwpa+l4kQlU~Dvt!JAZRxLciK z(x`E@eO!?#<9sZT-&=^oBfWQ;Bwc7CMv(n$XGaF+V2T0l8qBl?yVQp*pOhAT$QjS1 z&vzg`x*lFrpw9kiN?g{#li@1hxJMR*sBRmd>VuAE_$xFskU~Zhnvz?{kAnU&3sPv_ zJ>0xLiXIW~jKru%%nJl5qboqDZtgE>J{d{!PbdfF)j?3&q0pwwN(PieKYQhay^6p7 z$LVYuk3*%%1n3nUp`51^Yh241S_PD^V*;3^RHxNj7(-{{o7*aokT2KF{~VHUAd~J| zOLC@@Cwrvryd3E{$RH_=;gWHY8u+>XtHE)r&ml9whcl%lU`#DpP85D4Qkts<-YxVDYuYMi5K?gft&|Xe$UxNA7+ST(wdSKOT>4 z-V$%2!IuGVk$yV0 zX+c#JX|ACZzhZ5}zaTQc%>cdV4)xW1{`MJ2J)$9ZYoa-}EsFOGL%w+$V|A-XGww;R z!FpC3`K1}2Nr5+!?uGwD#UDa!4GC9<6$8jSqMSTlqN_Zp1X_`&4ms0-Y$}blaHR$T zU*ytr6kL+K8*J&VFc6F@)C}NhU!jcK4*mIz0aizna~%8|Eus}OCHug2&_p2vy=ViA7lE}uHm-?ybdxZQ zMC`Z9@}9dv1C{X5?@7}Ov~sCiX7WS$+IGPjW@!@_(2 z2|j|0{~I|y`_jH}jxKPrT9bZm^Vk+m!G0sbBg{W*fIEPNDs%GXw`^O(z0r>MClhAw z<=MBz3*21Jf;6m0hv9a&RCE(;|NG2wQQU4*ml;7FsSiU;6YHGK@z; zJH#Ou{tR$!;#{B;(TxrFJStIFgT3!2HtC%z`+2K*DBhICSkTuH;VZ5IIt)W(^&7D=Yb{qW;pvc63Zl+xFP}9CCL8H9ARYey5Ozi@mATB*(GTzk8TzK8V1+ za0W3xvg+BnS=XpwvH(-rh40#%7HHv)ilB_~=CcP~;}6ta*%5wSl~{qnJ_eI&X|~|= z#-iSY@rD^OMT^40g+O%v2@4`4=7; z3GHtkE1ARrcR;jw#69}No}?|4?;;bZQlX5M{p7bv10!ysB{I*Pid*^>f138Z-ion$ zJXtp^e37M3d46mtkf%KS7Om9^ZvpIgmB{yHzzpz(Bgalj!v3z2tkK#%b&F}P(7poyYiF=?-Amb_x>+!a)~ zo4K-gs=h!@$<<629|BAM2a0^lG@Eel@h#wPy3JN0l#QNg<4PBw#7xN4`j^!$e0z{Z zKjoiNu@ZMcqAcBxX@GwvW98#12fs_ajz+*~=H2DsH9R?I{_)sKvg{o2@l{RmbjnZSU1@f=7Cf$OmLvdf>_1s8xN$dLRc;1M0yPZrD!GY*B?ku zawo-Bz5HRAtt)b9J&uQ6eD4|LsIXI+1}TIIk6^y0ia{D%jrLy&1rc8~D;g%3{-r$* zw`KuD3c0*rPr(SJobgw#Tk)3TGk9RiaABm9g;FQ?!HdeW98ium#b!}n9375qH4#vr zMm!xyiRJa;RE=ULc6jXiw|#%k`I0eH@;UQ4)PE9&FSaMn+0$37z)^Mk1&nRkAc-@f zTew)deDrYkbL?Jv!dvcEI7yqP6h7^1G634Jn*pZDrYvIAJMX3<30!o6-LcF2Wl^Sr znIn1MyxrV$;Xu-yc>cXnI$8Y>B{mW^di(Y4@e)quQd*@RVMdg9ppy9lBc#<#@>%cj z<5fsnW3lB1Md5ex&ZlI?d%h{zTqCA#fXA?`e~tw5OLGdFsC28^K*~B@pf1b9&uiQ7 zq`*QS_sUjPg3dm1Uela?%HgN*yY*}-T&3)aI#y<_2CWN zrMSqcnd6Xnz#q{V|K}9y{-b1Yf=dx{MQU8$68e2*cb z)n5?}OZ{1nvCAWNUk|1km{5>rX@9>X&juC@Ilsl|%3r9CqV9RJ0~xA;haX8p(q_H9 zx=@D&qUGa^bsgVH9)fR77nWQ5UF^KlcO^Dpd>5pL+KvciLZOqpU>IsyLS$_Fzgsmz zIXO>OB`vuT+Pvlh;^=e?4cZotu?_IN1P{7GzDd4egMUq4{*FMAt!2b61ALvzd8?>2 zB<7WxU>5fca@Z{`izdTW$2Um=p_PkxNi;o1jP+e4*VaA=`TiNa6z_E%8y+0orBUZ@qCBvfE2ZlxHyK}SmfBN7 zJ{yk9nka^zI**B)5uW#TrZZiP!hmr{-slQR1Jd!4wEHE`uYgpi{0$l(S7wih2g&L1 z93ZswfOHmzO4exoUkbx<@W(>7xzV70$C`*Mif}Rg7ip)&ZX}bM=LSA#u+Y{w3A<_{*I(A<=g~7koCRfDbmP@(xnA7#(N)5;2-)CD|Uo*G5(< z7Ed3hog_v#{7})9`&zUUq!VD}@1`xTN_AzB8!`DC&7Pw0OIGOB{%n7V1ibd%2 zDY0`XlZMfm_v$t6*MNg|Gv@C>t6U2ocJMRMns0yjyErngDGtr2(AN6Yhul|7Fjn7( z)*mJuMSIWB0`~?BZ})2dCH0iPEUc&WZ%17ZV zxwF{?+a%-fvx|lkkAru}^YH~w<_QpZgA7~_W4oGu)Q>&TzJOg;?HTo^sNOxzW(?8! zr{EXeWt@vdgE$PXcdD@{neGZOPWfj}CzV@Z%am<`cL#ef&m<3y2p?m<%0*Qa#x2fH zF|0>K^H3g5(NmbFWgiEM)F~})D8&^DTZnvjXWxDEYPIilWva$4IOE%_NS90g<Z6XnM59jkJK$CcTW1VJr$>T* z==|d?o=*KSV3G$?V@(QgXFKTpZES-|8c++r0i7`L1{iJEmMfl5+E?~Spo1tZcrQ3P z8oU`E&Vl}-lNyrKa`A;0=_V?vS1_HbU;_MV#wIZ8tpq(omluJaTSxQLXq#`vogl}; z4Qk;b1rv@RrtpJ>hrVr)NI9nrhzz=tGWbmdm(i=X5!-K{*AKgj_2O#f%HC=Va!%S_9XwP^^T z&yVijLsI!i;~aN3WT>jCZ$AU91hpJ?2IywwZl-TGBY0P-)9mmjq`W$uVAhzfPK5su zL9S}bK(xG9F1!iDX_L!< ze^@A|V8Qu4d+EDB8X>!;;JGpNZB1s_bgeyhO-k2n`+BU3P1Oi&4OjQX4&OmB=bAY_9rXc`ujJ;B1#v)+J8Ve(!# zHK0Qc1c?rw35m1O;JsCz9dlg}z7dtUQtAr(fuy6D0G@0Zt~y3N1ObX8o8S?~M{>_J z>X`2 z85P(I*83oeE3a^?r7v0|%eb%~-=u8BQTl+ZE+Ak%=|;9t5LBr7K-JVY30tGI8wk}T z_Tm5TzjOoMbl*V9W5zT!$u7=LZlKB_&ZAjaYJ%RsG^`C8@@bO*m zS<3RECLN&(vH3qO!a&eXH5?5sS;XQ+0b*O)s}ww8T+PbY*aB?W`+##3>HEFib^&~J ziagUWhaqweM?Ne0$IXChJ)2z_3$({38kv|14wj^x<5wZZ@AL#&41;c{MdmN-(rzcA zs@J_AhEizIzk$Wd_V(f4SE`I=$agc7%?U&v9u^FtDT6x$WpC>b2ELEq#f9Z+$)t4X z0iPjm7)`$xaU5MOh$wXCbl223DQ!}k#ZRzOWz$oN_$RjzHS7oUxARJEM5{adlWAct zx)MJ_QS7CzFxfXOr&zeOKWLB&)x^7Y3Je@11;31Iry`VjU%-8*J=t@1p-ZU% zcIzHC9wV!E544onxlp^CZHdtN{93HD0n0BOr8DJs?f@A*z*+K@ZmO26i*&MaR&3!2 zzin?^WSh6LLOMhxc>5+Q{CoQ5#7jeg;dt4b(?p=cCEzMmoUzp;$<*3<`a@dcQ@miP z{RSMVNM)$>6;;2RSlo`c7{Ja$JExJl7Nw1+^udu#n$J|CrUj-ET-1+kV`ZTn>z-m|}q-+4T`quM`w9yy0e zB#hu3Wby)Giv1F+q;DoFu+Ff4CM{V3?_3}!j{fKqFCgE27p7aZ*ea_{@R{5`al9m= zfuDQne~}foi411V2X|s}r`mY~+5O$B#5UlfpZo{wAyb!I?{LDmD5JM$U)HLe4X$cl zO{+WI`C6wmK=$9NUx0%0w(;-7E0?cMO_Ka?zHy5DsyI@C*}!x8;#F|bm~$BgQZbnc zYI`~HK*m^o);!$c0H45RRhjCK;W__C3{LxuloBa;(7FYLy7S{;qjhSka2J)7JQ%FO z%LN8nwc9oDl{ojVQ-KZIu~a(YzoyLz*-KR16Ef^bX_+1#Jc1>x)+SPW@qt{mhI6i? zTeq@`mie%(?1;=>HjxKrX{_KBtZ=4n){f`@AyW~R$1t`rUdo1MBc8JA4D6$_aOcBo z!;dUvrUDttaxv#6gPUl<_<*$u&&?w|=dsu&*j0$Y$RX*y(0Sn;GPpU&0)7#9MCWk? zOHt1FcwA3U=WhFp6jYHSisrhl(r0f|^wv>83}~8wH682=-T0Tx8>x)O5)6UU`O%^~If@_Ro*qLAOqHh`EFdzk(?PO`)XusMy{48FsSHrQdnI z>eGLG>G+z^e{jAgB6k;L1K;_`xP9&s8^OM8E17-`66a%pFQAweuU1Hye~1rDFuy*j zR@bzr!YcH-eVR6Uh9>f-CRwHoqUA-lgnqsbrl3V7eB*%}?Ng+yvQhXSJR}^gPy@qD z#_?`TBveQY{vQ9V%d5hL*|t0jy5qdvOM#n*juV_aVmBZ?@TE*TsB#$PCsaZQ<(vVr zh8ZzApVitYFwjn32>e)I&q`j*M;wqc!wG4J;OyAqLbC%YT|Vuu4$N9HJo zIYiHUTEK9@ln79g@Sg2*QE=5!P|oFSJXCnwvp2my}Q&%8mnfTWLY56a9_D=+WVcpU>ZKZa@omjXa#c=&Yxk_ zQZnZ+^teC$^F7Swp)Nesa%s~g^ymq&h?Qc9%%XMV?WYGa3uv+0kRk8YHOFJQ+Hn1` zK%z}SNf2Yr2cs@hpQ72`>U6{bb)gZf@!#IHgWf4v^f)(H@PyCVz zCquEVsC*268)NL_7auy0LBz=NmLL!B$QEiyI#tF!TF!CY*z+=>FBWqyBNg`EEa)x2 zgc4@BJvhA`=e$l+d-cC7C(ePrdAw{s7N{vongADf!#N0?HPDnn+6=<>!qx%td@AG` zemDu6ju{ftJ5~hW-gfo>KEh<<|FJf0wD8$r9An#DNg}GT)0=qL$0x8h)lPkQ@~4{@ z@`_#X!rJ0>NguYKx8#*pTeYp}^(ormBjwE8`Q>Lj_`DXqh^%lx7jwgG`)l5sufMu? z$opAR=5CV;%ym#dJ$03w9|V$V16vJv`iQ+Uz&dT&AD!&-zewwY%d&Bgfdb{l?t2TT zH%52;!TbYQnJnHv{HB6y?Pbl-fiAYRWrsVinrMNYz+H_#hxnKCd&@Uu$?K2YVwLx> z*g|zR>H^=_V9d4G3Nz;QiKC&qVYl-s*gsqKg+p9!+{02DzLUNL%ct{fXdC@%Oz*0b zt+5Dat*Ub);$D^8d*^8??BDTza)tysV_Q=!tLk>3j^zq++m7v?eb`^;Cu8Yctq^dz zH)GxQw9+YxmVf+9?AUs~NNPd)wx(_-<=x?L`R6#$lyUL>3lPs-qDKqR#ht0UWyRWr z)`;B2zhj&Im7DS|NXzf{CoRUP%Bux72Pf@P1|fnO_)QMJ4Ybl+CW&@1JfDhXaQq7T zlWRyskC>vTj6{EkB&UqRGtuN>3ahgr6DC=J6{`SzHxcMDbdbk3f(3Z*`as@y#ARGW zgBM=7UL(`!<*Dh#Bii3#;+?LhCRP4iuAOn!BqxtU!%;rXsV9}qp z2%MFb)cgNYtLTRbo=!iOT0IRvLx5r@)r6VS|7C7%}F2d)d$R@(_JSEgg=` zxbbEC@$=k|strG0FYuagb(L|ET`+0ne-g`;f{kFEVp0%hHU?{g$l`b0N@c|>XfmSx z2)jnvp#Q1h{J#o*?<_q0;EmEk+jVg5T$h>jh?TrbigJwW11~)299v$TNOS!Uaj=8f zZ4uVb5UhXheI!QE#TIcSv1Qyf%K~23nP14FTyO8Re@QRG&2rZH(m?&;=-#RebBF)s zfuA%*7H<;gpA`jBTfGo_gDu3G2K(a^q%W~#rP?Fum5z$43>c{)`fNul(3jmcq<1)o z=1c`^Xfaxp9E5tX$5Q2RnE+ak(cz1J{%QEfKjIp&%QFzoEuB#dCgd<9QrsZLUP~L$ z)=F0s*y`Eq;(^Wo{LjI|?G#Lbn?Uln|KsLE>7$AXm_I_=%3%I`j=+fm{Jk`z)MOFh z4jWJBX|VQMA{D76C-4~E0B_KF3wuqj{M}-(A6x^oCx(CfzM%uFKSqw!HrbQnIY9y7 zqpp)rc>B}eZO?Yhk7(4BEudBt1+Zw}Z?Wq1i!>ENXY$_;B%_e zm=oSGyW9QJGCW3~7g@QMdv&|VI+jUO@vkOdx*$jbzWw8#%PCP`MjTs?bIA4$*Y@kl z9A3rK4iB7RQ#_qnlo7XFu4iWPrvRSdJ@D=G(<3j@+R; zp6`KRzz^7`fw_ohe_;+a47rFN9y&q+N_e8H9l&{dGk9GpzFdNNDA`>z%0jjTNz~al z=MhrqWJB4<9#4=l?G#&lgaT|FdE<9=Glq;tzTjpJub;Wh+>u9R4KN=+6!@`<51a@@ z?2YXQ7~dE2+~2yf6%=0Z0=14A9)DG3t`wH8JGRHJGqt@Rv(^+WqB_ISq#^A7`m*6| zh5{##gL>QSkjSTv0IulqyUGuujfVb{zE>rkMDZr{t`{w!O4|h}zNGrER4a=6*+kEL zN6phllUgao+(?KzhJBSa-SU@?w7DLI{+49dmCtzb4E!g9Y$-A02rPIr7#pV&k&`)d zZH(hf4bvwQK9JW!KN3xk$D-baL^oK4u&G48Lp=!_}xdmRf7eX9>xH>u4)l3#sQ z-`0{h3yr7OtPvO>QK?_n@4p7BGHgvm?-s!bi^H!QpnE@e=79F~UgJKljBlyp>-X~a z;tkAX2^M6HuY|7ZvcrvV!Vi%J`h+JtF@rJRjiQmID$EFD`q3QRxKrK~hG~8hy3DJ9 zvzaw+ywy9Ym>ET3Kb=EM%fiiFcSIroC33kVd7V&Gmz=k^qKjlh;mbo^1~PqB?|xe( zi>AZS(UsK&8fbbM@Osd3L4DjLEE78QG!adDSj$^#muBZ%f~g@U;WyDGmyP8b%kWy= z%@!1mD8OgjcrD_aVBYWD+E4zT+T23ht(f-IpYQxJvIh5K)0Xg}q=_#=3*#N&6QDl6=9rP8J zk@($-0kgn2WcgH_!ui@a&fG(bX$gu4wSF+awi!~$@5whk@_CSS284> z!#mq14Fw)+Lp1_-4X91#T*C!oT@B~MIn!_527+>FMBEPL??Gyty?vnlt?(LFRA+Zn zwJHS|Zv+Jzr1}O$^=WYOWF~Sb>pn6d@5-KyKCqTKXT63p4ikd!(0G@vdGDZ!@rkNE4 zH>!*T_JaIn_`Ye5v}Cs2MaZlB=>f?nA$U?i^sGg0;bi0)Ks_hX8O z*>v2iIhw7ewG^C1yjZdnyz9HJj_U8P-9eg?XG2_T>|Y*?ip5TcqajAr+AlGs+%C4W zH#Zs@ejWQgLNy-yn(bDnge*j^2Slgt{9nfIyT{E>MO>YA_h!X>Gs6O^3u>q(n>g$` z6>lOf?SHnZ7qio z;5pPx*UCi@AF65iG_)Wkw&Y0Aug(k8z(y||a+{av@0FPw@h)9xdsvMho? zLL5SAiW2x{kMsjua79D*+eEAWwS{0arO$Fd#BT>7H1=@(anxl_K@Al)YN%>?jHNDx z)wov? z9#;{4 z-5*8&!i-w>j=+3x6m>Nk@yU0RgxcIY<$fC$>FrlUJLoImFMT(_gdwO6Ue zNwQQ<{8we%A>Szh5~hnwfC!|i=Q`lM0?u`p2=HIh3SduVA*u=kU&Gy7!PWnqz-6$2 zof`xkqOSdGnVN88<*Sv9pN-@vwas8S8PQNgIJId7rQgq=d$QS#*MnSFeJCq4wC5a+5xAf>Ou&lQd3!eQ%3b>iRdKhA z{MhnVp}IU(TsfnlF&SA=NmOOgOw`hfMPl8|NP4cZh~Fapp!A#~7w*N}+IvH`M+y~L z!{+XqD{%kP0b9g##ypSbOv!yhc+XL;RwmU&6jOJRWs2$&C|skmt8U7iKzn4vQ9pm+0lG6zwCbS;<^0KHT>MZ zw69!Ea?)vN51t2Glf9D{fm}@&vdc`g{7AeXLq|X2EV^~;)=WK-g+LAe05>YzKZ{uw zW9kaXYEY`ezVrRyVN%!#Prl9{GLZ?7Z2>2M5l6=XEwE+ZN$C6E8le4W&pxE=4M0ib zPg0N8rkjQhswX!Q9-~9v!Iyo2FJ=UjpVg>$yA#p4f>Vp<8;&)D^zD;%X3)1Sz+r4e zHs4}&(ntmyevj--lu$FB)wd3LH=q0yqBVD$57?`Wt^*zn(Q(hK)Vz4xGMPN$ z4V8uz@IqCU3bv_)YgiYRslxDW1;{o{cmdhJLm*#RWqf1)_L$QT*6GHs_n?+HPScOn zi1((bq;FfO(+<(E_P~NsvA8;3*oQ63r@|R8CW!1_Y2r>E zsgob+Qq{J$=c1ZCXKBwwK|I|{DU_C~A-NxrJDb3Q8N8EBJ%7nM<{f<*OQJ+Qbn4&P4#NxsazHLqr$2s{DafJxRsK3LNSt4sU_WgMn><8%P^N{1K3EUvY)Jcyg9dNTOY=t2ec_FUs=bRI!|#*nJ&h5_;9%xx zGs|&9RRvOIN1ZVypQU^oH+^PE=})8Ra7pTjm%CHU3H!VoKGGRN>col6)74OG8ujwl zQQ5p6JXi2Swh-!UZ_4W|e*yoP`Tda9YC>KSMqELMF#7OO+cfkb%~>sV44Www>>yl+ z#AdmBcb-FAg45ySkFS-ELw(P<c3#*{ zTvqSz#XDagt{!Y&1TJktIuD#KVRSyRL4F#~azL81?G+tX*$ioQ>MbIs+=};zYPRpm z;;9;qagVmSO`0|51`+js9TW25q57qZ={=QhBH^0v#0x?^*UbYL{|nTTuG>as3=I!H zWN=otNakro7Z2k5VDsDuAp9Sp7YKjv2_2AmHt)C9LAP#eL*2`CCv#c zYXVYrzU)Rv}%C^llt}|(l z26&dgHSMFQiSqj$whJzpf306+yH&JfIO3h8ZRp)@_#@U5PVt<+`iCY_3lze1QzYMX z!=6jsigRdSu+W^wl`9-)uz32saN=p8vAv1F0r5WqD?ePfx%a?D+t(R;`HK_#u8HA~ z<@$mtJ8R_&{e}lRWI3M=<8Oj0Z-g$?g)d2XX0O;9W+Z-w=1wqAlbne!PFIY-uaUTK zm+k75>{tWm-Hn>ilk@#8@M+=b9tW7|kxO@IrEj)m#X+Z$%FPe7iU{#I-9P)f3Z~y3 zE;IhfkAf@Z=gv{dYJ4IC&tf%cV>yNK@x{-XYm9^-vv9~>$3)TFiUB*Fxp=v8{w6YuGRc8^$gnDqqUtm!lizbZhkL>~ ziY=h#8fl~L^5$>$1q(ufU%stAIwSru|LrU38Ei~y6&^ve z*}29H*k5}S|K8Ks342y43|jB9_%D}5P9{Ix8}0kw!HbM?p+KOqZemy;zKzArXv?bL zUmmzVOkJX#ocndMLb$p_1iK>E`NX2uCTf6 z53`k=!VDrrBwADoxl*KAS_w?TO@D1x=i%(0#ckU=l% z&zCCLE!#$j{m|9qGX*2%z&X#wozE2F&NGlHLH5wQHOdp$^90L7RROlXK<0F`hwk{O>64fW9WiO z(%ago5fMVQcQoK_mFrObI7NqO# z>KQcqT0Ndg%Bk=7CaC!1N`Dv054Xd-UIUd=<`R2?R&b9+Z>*xzD7mf38RFD}D~^G) z11}hVm|&Cq?qH2urQPIPjM0|##JuzbN1V8_edxCuBP>zXoY4>=B4O_xL;9=n1VGlNZ5%%Ou(L?G(cWgD&Ybh z5UsgTD|!ys40PK5Qm<=Coj2frEIy|u4AC!Jo=-E3!~RnDcd z7p6l~wsMKL@Zl0-;wV&ccd9aKf+|2)aND|=27g-DUtJffr5@V6fi{iPae*tvKXDt) z88yy$Kr?+(MK_M)ttpOcWZRTsDb$%7Stw0-6Kn=Y4G1qZV$Fh-h6D$5-hT9we9wic-qtb;JALyB>*Mf{g~(7x)s3kTira zOAA8Mn950HEPC>-Z3{=q>4nQ3cO=92C2(~UNSul)mSKlc!9vW;^z2QhuDuDEM{bNu z-wqzI0c~N%w7?%~Q-`Psif}syD2KdZ{O{Q}2l}C-uEMW~eJO_#x2%_S(1K=4bZnlU z8%PMX@`>wUisR^M5v$MLoRid(Fno`lRxcWVLu=^rm#`Ot&FGi{>7L|Q_aHYTu$>hS$08KS;+hD~hpih=P< z8AI=^1vX5n4&Azb@@6HN$M)9RLmC`q$IS==d(oyzO-a{Z;`5rLHc|i9w~J1LOjP&B zDv$$&{lVHa_DVbv6eF`%WwyEnVT5j|fjv7nMkf@E=TUG$B7_#+cq_$^fxhazPxxPC ztPZF%4IIfnI|-C9)-F-BpGCQxWD|iKakU(*{%IMgoAdD1x1}U4eU`6N;CGp%8?mHk z6>QfAsk9bYxF4TNhlm6gh>#Oq4CKbM^pKSg?CCE?**EbNSkN8u{lSfHuL+u$n`IWv z3U^i1JjA?ZUM84slRlZa%gtpH)4*N^eRHCsB#w;lOzIp1tae4H=C9XjyMlIf%FeO` zM2MK5V1m(L#ghR?Ps)x8nDvjI^yHXMCSxbE%pZS)U0Z0lpIuHP~052$K^Sb?!xEq0@b%^p6*}AopB*mmX^#Xc{{xY?liwMT2toZLu48aha7_L z+A!k$B}TdSj1P=Ycf=34SmuGVWr&;3q=*iUwk9iU%crQ0{(oK}cZz6w~F3@!dJVHS<7f8TraeV?NY$P6cRNkAcXjB0D`IdI zcf?|FmRDh~xR^Bt(WH{_EaJOD+yrRgs0By?fiUZWW+?(R@Jz*UKz>fD;{znTm3YOA zy&;)L>|$Tn1-Hm4y41dZ-w%rzuMXEtZ^Q@J)Cu9q)m~b(Q330zl{JIcXALU4h>wQE zR64}%kL*`{sLY49H#MKTo{Kg%8-xP1$SjCBJ5u*fx%^)Y;$cG%yOL){E`PRsU@#_f)%z8!U$P>D z>cvR8InmDj@p?G?l0k(o#sw>tvlZXlWP9kU$=C(p@5J?BG*kMmAY2vp7KAc$Ti4A3 z>{H-S)J7u^-G_S@iN?c#=qC8|Z?LV#ol|}ppM~%`<)Ld~2wRxB2|T82yxQW^4d|}< z+XJM@V1lV2{@BO&i9s0h>4MpSKmPcimNb(lPcK5nXl_`g=StSkiyUb4XaHwW5sM8& z*Xk((jrGJ?x4HDr^tq2)_aK0&B_Z_Rp33YVyQUOd_7L8unjt&_^#s%Y*cg zZuI8qXqofkn31HRN^ASd6Ue^bS!uA>{ty12<$T-K@g0?q2vj{Vu(S#C(c!}J?kwekglX1#;Sqo6`1hDxT-B z*IoQ_5Gwp^hXkG}B;=f`16Vt^K@9$Ql^eWV&s0>&Ru#cPD!^g}jaT0Q15kJh`SM9S zD4f29jEhfMn~)5cW{UX&&`k46d!UuIMpSwm|2lwsA?8-=9)}eS1)LOJrly>af~{<9 zCbD4(ntZXVgx>hf(!Ds-P*BQfm?Ktz@28l_CSWEhfiXPd>svoTAM0B>z2tJmewem_ z9b%8hiIF7{LMHE>gT!=Se*^TfXZ0)yQqG>ahbW9I%D2 zvLdvxhh|Q1hUbiN0cXH|aCcy?QS?X->e-lDdnme*FR$M45XWQ9RU)_a3U$v^vcW}q z2U*Q1H>Kysdvv8)B-_Iyd(14>8y%ms;4Dy&@PhED(x6||rg_>34{8bC#BFEAj#0Fa zG5rVLI+5czbj_gl272+dlmzjyJ&8hQ@^o?%Lwb6OEeIN_)rCEeebr$A$u8RSxG8Kh zBezpg_p3mX>Bck2wIkE+b1{)%0-{o`>o zi(Jf{Fz*=)srQ-UT9{;RdXp)AEJhS+`J{o)j0i^VhSfhVaEEX5t0pq5?})?cXf@B2 zFc@!);8n@Be~h4gg704N+Q{D>q@ETv)SAl-1FCV%qH8nvYfT2{~>1|3-xy z5v@A^b;W0YbmNpW5Bq8pOlFGw&pu5{e1L33TaxGpeb(h?0;jqG18+-=o$%*>>6z_T zxr=Ut@aweV{C}H;*XMz{-)bM+J1qJDqcTtbg0<(WqZYwE+c>XI-(z}Q1aTWrBrHOu z$B5dcOtChhtN1$3YREJ_+~@+&tg1PPu=Jhk^4P0556m=md*u? zqbRlwTgIOBz=bGftTks>D71DiPTKj-c zTu-3%jp%xoixxRm1s8A5FW9${OO_{d272Qqt?-;Dwp498$PYDBw9@MKe+Mrjhh|Ln z1E&z-jxHcB+mHy|2I;NDm7+Iz@GUTZ>+(zEfJ8go@9_;gUkmcv{mDqne5-h8wZsl= z-sVk?LEBZ1V$&P%@W&Qd`-Idrz!waCvqb<)un+8ULndX?0x6itCc0Wci4EBmgkmnB z>Vs^R>Rr9;zrm;wc!CnOR)sYX*|SCrt;1;Q(-}I7Zu!E{d@_+n{9A02TY8VBu4jsO zkI++9{3r+4m^@RO(A@9y;EFX5Nnv8z*e!Tn9Uw9`jXccG*jOV9t#OyS5Vu|O!|x-d zR^|LJhUdBE6M4+k_;vj9v!LhQVwCu-hIgNxFejqOW8IOj zDT_zto=unsd|aI9`R7H*wg;Onq#C>N%K0JR8@C{foq_6H{L~GoAuIOH2e1BEv})B{b%>7m z{Z-Kb;y4mnXOPP#MjI1lWjL2z&c)hT22NYqa;UXk`gci6*JoFjOX4rC)?LaC*ptJOOzQlaSgR)X_216ZX3s|O7 zUl4v-|G^Uvme7Yj44XrKVXFH{G|jroh9uGGVv z!SU^i!{a8;Y@x4m4nfWDO(dNd+{Q5Z$iH+d!$Mr1AktVF=<63fZcr!+l~F0WiV}7j zutT_`03Gt>xB@Efziq%{4X9&@zY@E&t2}s$cc?{vsvYqWbZAOUXGrRGffo5K17rhb z^9CkK4jY%^i-DV|^dg$Jf;HFkCfRueB===?P2*RMu||R27)G=uCS3GNya#!Ec*HQg z2c);*gQM4`4n*h!D)Hj^26)+sNZ9nhSCl22G$I^<4F;;4!(bXY&c346d%>AFiSE!AwjCmlAn?ddrbUav< z6KlfWY!Vr3;gmsL1A*IVrAckV<8{=R*-S$fKLyuuomUp2^hMbFUL0idwh-Id*hugM z7^xG{=*q3&ic0_zZYUgFKOU+0u6NcS4CJgd;kp9*SZ>G*h zp!#;^4fN~=yG9|&qcPgO#tTeFQ&xebfvwN)jVE}hu5{WAZCWO={i{SpZRZe^$@DGi z6Iq#});9cJZeNrx_}VWj11VO4qY-a5{r=q=JA>_@*nbOb-TKNjv;o0yprj|EK--wc ziUIiUtxkJdfI;KAr|X_z9dT8uBK<%*@+86wS3kE0=D%f+N6#TPA&Lnk zzV#BDypNsb&VNsy2Z2Vsd@%kqPtXLe=|rb&Aq<|@bY5b?%|8Z0jtyse6hOaD`I9xk zv|E%)YfwTF`W>CFCG<*K@~8qFG$!aLZQdf@VFqCp*pRS8Kevr3D1>3I*oS_k#h!ddnBX=vbm15LQVjh>(Tc@ldO z1KW)4V)eTAF5ZSNZyP`gdn0_dRU6o{-0M$W6^Y?=x)m}I5f)og{PK>6mg35lLcej+ z!PcnRNc3-dJjEg3$x=9eJ@MB@h1gpDp8DtduUC8Bf(R0LW^%{V9}7U}^(_|6LvnQ$ zi_aMcmcSc!lWJL!tF<%cfsbhPZ_o8;kc+qq07Vk$|;37_@E_y+D#TY0ROv+9 zj0S78gxX+u;NQ2OPGPn>x@0?g<)I}ZN`rjk`#C%Ct~Np3c$W{o9fXR6qj z?ZcOHzgmQ{`WD1+;@DCPR>%|DAZZqKhyhx7F5;mehSd)q)|LVvd*CDez2(}dHcWBAj~M-7h5t0JH?LMcsHS9 zG+B8Ms1xUc%louPlg|dHfsqf*4#9E8#8+penlKTEuk&P?cNM^JhS**U`6Tkc1oAie zmZGE9B6KG@3C;x9w20}4zuaEQQ4cT`=R(4Vqsr+&py|LqwSO`H$UD5!ME&Nz74jc~ zb>BrEfssi`q2PcZkfu35qu0!q`6hI<@R3Z;X6|~#AZM|@hC4^!R!TmbZCdG?eVa&Kr@^*r_a4@iXA7fwRwpMSw&Ar#V!z7ndz#`Ido4!y&tO zjT2VthJQ<&uRDSPy9W%1_=)#Zcst_S(z}6Xrzxk-eO&pJ6TIj{4ZKT<2MYA7S~@HL zBepn;pM4UgxPzUL#x^suHoh>}i4!oHsvmCd{+*U(IFes7chZG*Z~8fN8*5K7nH$B7 zN5R_D&E04ox1lzMPaIldC$I!?b>d<0-7+%WH_o!DRum(9l{|ZV0?K3yjgNqjEMdZN zVvV6xH8k8R2VNZ)Y zi8X#UhhP;t))qV*3RwyoWQF98@qpW!{dkA#V2X1hi3&s+9qvD5Qe?x|BuV z8`$(9r@Xajf%RsvprFQv3U&w_?)&!^Uh@e{x1luoLrUG!Bypw ziE&+KweoqNQ&7hsqUU7{-`cXp+usOmLFed^9cbN9O&}4RWv^HLlX~|XTwzt1Y5nZ2 zYKH}7bnuR}R2bxR{HmTPm<+~i1#W5&V&~ptlCS^Wc|F`eTVJ}4Sny^)ZmT7>=c~rp zR+lWrPa^S`EyzSVtw3>38VuTlOau#`p0V2k5wL~Pamnj$vL88Pml)tNbZ#2yKF*D} z!xi^ar*uIJKfi)^44N>6Bk0`HQ?>zlRt8(^IFASm**k3k3y#aDFvtVWeB4$aq z9yKAJZVslECaDt$XDZBwxx~V_W}Vl+;VSM8OL7-Irr|P+iK7pV7`gXld*$-*z6Sny zD!}WxrgGtwe__WcEk>F%{ow0!mf8?b7-_cwSR1YU{D6p{=)0ao%Y|7-kvSZJMpCrf zz2d!t9=VmVd<<#pN{O!V|4^=Z`}fxl3^RJ0Q(gMm%Nek9+2Gt>-0VY{>hp@jJKNH4 z($(VFDa0(Mi57Wkv=4D?H9<9^rx>W+N^`W^-}zR#%}ba`bc z*O&W8l``xVi9$X%k(grD81hH=9bkOiR2_Oqw@O}{ftuT;MXDc-67NC=zi%4%-@Jo( z_MF3ycmKO$7SpbM;rZ1o3#~<#*~+XSohmmYFkEo=*_Ij|YjL6%y7)ItS$uDJzh&;* zzwi|!asXu>XH8H2r;#}RUZKMT#SyD?rQu+XAvqaw@gT-WQ)~FMFGStl<_BK5+y!mF zMRUZDHBd@pkgqW`Uh_%YUd;Hqm1U zi$5pvzy`WDu0BRr?sqW`@}sxRoJuu18~W0u#<0=tzeMje7q1vl!Gj_rVj~ASv+}3L zcv)WsrLn(!X8{H15(};e5)NWOKb^UGcpLgB~Zg1g}DOz|HO z+k~53LuYdZDty*4VmEiOQG$Dt+s_y!9DmF0R`aTzJG2$Mfy^+C$@KO6bZV0+w*1gE z^>rU|3}X@yH^K_1FsjnBOVs_x%bb$kneK~>XRxX0D1+RD0{ z28U5!#~=qzw8XC#ce*b-1cahCZ-n|%k(6TwJmp)vU3 zExrHc(wL{u7lB-+Vs;q_Wu;-nHMSscF9VJzY4d7u+6{NZe+A!>IehO z@#o)<1F72d9>hWuvxA-11viHVZZr_v>cIG6c_sCnA(V=WWM#NDNMHKx@nL5ym(D3h zBZrB3_DDu|#1E?U(@*|v&FMaozvl8iA$9q(s0L>3)K+{$8g&JcAOZb3E$+f(QftTR zDTW|1;mMftd#tIp?5cY@v3h-wOMl`4osfQ(#h_mNBf|}x{8-zXi2S;#UZh1CbS+m{ zj2N!5h<2KwbAF_=t&|QlxsTM$`|&+s&yAIFMYX?**e~>0Vprl6Z4!#Uaqe@tQJNEY zu(oQ8)^ZK*mxAvaO#Lg9Q4CeU%rtgT^CaIyIWSWGnG(sWHoFh3ZnF0tY5iH`1cb!i ztFoBY*QKP)33?%vjBqS$=28aaUOoF?3Wj-#4>52GneW8n-X=(7F+=ziQx)aoF6+Tz z+Wo-F|8$HA`ekD_3`Kp#Z!=D!ST-%bCpQa`+tt_pTq3 zq8+%0nG(JckL(E0A&m8_ZY}|A1590A`;74?FMd3&LN=8uD2-UisqlQe@5&>i|cVWzs-uFJ9e{Y+)p zU!1E!DAxbj?E`KIX&?Lv^wZm?Q|^tyKYBg3v3xIgR;Rll^BQ3IEfA|OY_Gx}{WsXW z75{wrqbLgbu+JE)U;;KUQRJ3`lZe=#960Fji)`{>$J*&iC({qV`_OCCkDX}>(VvO0 zHHwl%rIEKm09KXp6kU6W@_cD1&H$+&GA6G}B=jBf_UHAKZAAVvKRvDR*ltj-+xi-g zyQ>-1|1xLq@B5i8@nk^Jgt^FkPvR2N?1-!viHn1YsrK3OZ|Y=CSPJaw;Jd=LnpC-K z)U`;@c^@twofk`5t-HF)J&0E5Tr;L){T10Cf?{*8gV(3~-8)B<;^W%b?+JM@x+k^T zU^8CXqofll3DE`zi**%$Iuc93YE8obs+!sCxTAl-1}kt%GBV5WJTcQE+K5$M!S%&c z^5C!nJW-~$&>cAioRtq{+FQx8`z)|-OERdkBh~|awG$)M2+h4jg?}|DoY(z#(HOMk z1j%t`32VW{e#sEHH;}rHP@ed_VK8S*4|Qh2l`hGl9nAmAff67*E%FIs%$gMG1okY5 zn2n8uD<&ZQi|2ubhzwHGl2W*AJT>kXoIFD4xDk|cxl74%5XuQ;SIH#Kr0sYuL4aU1^TBRiMUBHV zq=^ac(`t(pYLVtVlU$PzIc%OYuzuvVaJvAzg}#b;yN$W@1gh`sPDB&#Puvy#9L*!F zUpTw?Pk(0{)p@61e)OH$r0rMhl(F%rTK>yGGfqVkXHiw1^p+iV-9*29tW-X2Uwa>( zKIM2ovF@LHt0@cW-1y>5$X*}$aY$EV7nq=Bf>i68J7e^T!q!$8xBElYo~#gLADt<0 z$b0mR;i<#i#D=+DsYP)74BF&VIYHgY4d{$6|Mv9XpD{(CPFaydDbq0XFih+Nqd%7SR{HVdjAR0~MnaiBnP9sK=h)U(zb1I`;-5v>G&^9D1sI?zJKp?C@J?&W0w67icvr0EQn4s?Lkh{g<7+OdoTxN-V(*R-Z!HW&kI0l)7khJwx`3G;kpA1 zc#HyYZeCmMB%?hbtX>N&2Zz8|Jx1tj`Vlz`N?^AX1&r!8!lc`9V1Z5Aa`<&nhyP z2$Yg2xNpFqgL4AT$SAB~O9wjPxsD5x>*{SNa^{#FEBhkJId80vL6 zCJNOtX zs@gGl>PD=PD!mis*d&rTk!)|P8SFqCVgne_$=~whY*&I|rY6RsPvQ!v%~A7}AMi`3 zt&$=$c(zm)6Z_w0@i*AR6NWpHy7Gprta2mb;-Cf|-CQ*YN1aOeDk_1A`!rr>*|Pqy zs+hhd&S|&dPGpqpF&Nrc9r?cqB zRl<6ZA>}yjE$?Nn@*0O6zX{&Uo*(Fm0tI2ZYOCI)M=KNI_Mu88e|6>wd%}ZQ)WN1H zs~)s;WTZtn{>6jOyGNv=8D$sddKxM#Y$I%{O2KBzKOEn!xvnw@K5w76%r7kg&E=9u zlGkmb6NKba)@1!$nFSK*u}u4Hnj#(_4v8Pz4JS{aEL0LbgI;RQp3zGpk^bU;7z5*` z^IR2E=#npIlJyA2Lzm<-pjV9inTYoGT+jQDCpE(A!}grZfqy#S&z%iwGj*0@pR&zP zSFuT#sZDExhM&a|)M z)T46wotLs6&BZUGg5gRBQ&7Vs>Bc7Gnwj7dBG!#wIs(0IM`$M+T-+t?e|DIrw30k~ zSehld^-~@eU;jlEI{df=FPSrOc6pv-B)EKSOB{XdT&Cqa8%T7yp{rWCRWYjRhB_5v z>ldA#a6^e#cvJ67`O6`u#*gH{O}Wozf*@jBKlqlW`4l#<7dWDzzC8@J}^ zirX*EVnv=prhag!ue|x#<#al^R;&w5z`=wxRxY3HXF6Pfr%ITU)?TBYa)nx&_Nyh(l{#-aDja|)BloS04lS#qL{0_N zXEXd5T#aOZH`lx|O!kVWlkQcOQ6F75jdKE~NA6mgd&-9@D00`X=J^C4}Z))XMG}lC>Q!YIU3};}5OIB}w3UobvT0Sj4f*!w<*D z`>oonlWwQ8&%2RcV7=+YeK-h2y01yME;&Me^FvE`=|v(>*Na`Ea=36fDeCC5@Hb}y zuiCJoL7CzQKLM`Eeji8Q{JaNVv3xKZnW~d~p4{n#mK+l6b5j;Ebv9|YY<*^;_y}Dx zf9=zx1`z!no%NzaFL#L_m~RH#%@pVA{+FX5CRxd4PTL4`{q$qti4pK1x3R(#XzKny z@aNoRR4^nzQj2E{bDBi!uR*~8KMso3j9$5UJ+4p{#?pSwXKmdbLZ)CnSjvh#fsCC- z%ir0(LM9tr1*aH1Ev~L$65=^M_aSgVNDi8e1fC!s^rXJVFAc|hE`sl78GGq0c2Qfg zc_DMpqUB@BcBYUcJWsZ{hzyXb!r6yW>@#d!)}DI$QnR_H=4<|I4SzOE{+YILvWiiQ9i{8K`7YdyLdEyLvBvl5pV)Lp7qQlr;UrqoQ&SoV2<*uGvEN zhdC$f!0;hP?)S-4YZ87PZAAV|`D{59^0cq)KiM};QvsZO9aK1I0|O9bB+N3QOU2yG zFD0jUfMaZ-1F~1BczoO^Uh`q0KmLsh`doz{#0!S!wz*BviwH=Da+^?2$v$GyI`*Ws z-UsJ@-8K^`z-Pt8y=dPrhE!GO?a;IuZqduQ&OGY#VO%wRkTsuDhY!tP`a&@YJhdgX zffjP@|2ZM#dFGZemyr>HBQjbcy**co;sflJl~ia|iC7(w2a|`sH)!SXr@vw^q=P>C z>AGSM=Z{#_H3uc*7@K?{zPXFxt;emRVv&SI=l;3>qzxqhr7sV#O@R4JSG=@CYNAn)Nn>CpFJKmrjJ9 zfi(j%hxyCr0Q$5Y6?F9dhF`0jn`4WCk*Sp4cEqkLa-%hIiCW$098(3u5EWR8i%Z9v zI?XsBV@8@1s-ClN)i!BQ@dzroQ6d$MO+K#_9jQ9(4aD@w;nn=@pZt(*%cm&18sDxJ z@3>?LGOc@iO~wH_57>eKl;S%yG5?vx&rgO99BCHaNfTeA)_2KXf4lOSSiVt5x^<+w zl7Snl>$@wzzq_QE_Gtom*^qS9B*3=5i#{~o3#@b_wDi( zO1rbqEHbB3^6=3=*I*bi?@7QM)q)SJhQF;k6iW?0xc2%AXNFoftPrle+&Oj9nu>2H z>=2+Qb?5e60Z&jB#J`@3+Lj2f_H>$^hKGTo4;QV1+ZX!uTuiUqJybZFO{tFGUa(l# z}4j=%4;s zSp2C=ew&B(_b&^19*(bX2fn+eI9s3cWXLLg4sH!0GD`T>C`-`}>(?w#wVC)vG}U5% z@s@JJ+S7lF`QOI~RkjQPO59ghVY?CC!Y(>fA{(`IA23CVZ0?jt7S-}g?7+3) znyvD^WCXl6*ja2KiyiqugdZ3jH3J{MQI`}VxB>1UQ}Z}8>%wN}3m>;`F=x@I!}H5g zoWYiQ0}mD_eW`ZZS#+8R>YnAPKSAl>TCw9g>n5V6BTiGO|6RCPHB0p?WHNO^h zCk1(zoTMw|>zI4ydKC*4PwA8BxVM0FLObmYaf?YF0cX3ywm}ZZpr9cLwtF-1!2JG4 z1q5tgL#t+K`g^Ic{bOlTZq`c?hlVH&CamKxY7y0GXzg!aTpYRx z^7SWk<~(fqX^yO{)@qy5xxaX7*Qu7Hsj4ZcMIA=ZnpbN3b~|PNkTpK1bTT9G zz5VjaBNtSEZ)Z_9vMEsWMFurErGevAUAQ6v9#JO3`}H{r+J2aSTBHppO5%*D>*FmV zkH?PSjXP+mo|U6`c;Xw?)L59x6=f^e9DpqYHz&h!R7am2hpM5@t}cJoPYrc^a=p8% z&9(RAi?ZOGNw3tGMV&DIk6cy~@agf;(HA4RpF8>gi@SqZ!KQooF}3`wDm1 zdAk%Jqp4N!m%zQn=AZR=EGtJR)xZ1kf&2@9nq^(K&0$buW<50TgRGdb zdfXqwFl|Tm`Z%Sm;iHia^}S1$w~OivqyE9!2I@XpOU%#XgO1d13eo5dO&%^846u9c zDe+e=(A;iNgk6>7%Dc|=hfz*=l2`oqRBKVD(qh`KjWDi7F3)Ynm#edOg)Yad^%9xs zFWiIiggLxp!7$8~a*D z+0sHJl+4wJtgTdPMoC&}SIND!sR(UanO3DlDWhXm@8L7!Q|xvGt&`Kj=^JeXCYdIwKC$@A#YV1nLpq3y@crCcAh7 z!T7;*IW2Du$=ieS#{JZs)=qUTs-SK9j8BT7QB@{o&=H#c*U(C+#wr_g1KKQ9TyHMKk=m8vny7y;M7%8Xe%d zQ~J&};G0DB(?W?`?753)J`_)-EDX9DuZK(Mo4na$?}VK`)O9*EdH-+I#lTqAY(>-} z&!n@o98IPrxN1NseHXE2c1$wI^wueG`{mwBuw7R+9vbs4Hn#@tqowh^>84q?vZjU+ zk6!CZR)NCi5!X`Q4Vcs-UG{3<38!BDteTi|xjtJoB@*IQnp|iD$zA>qg z2WR=^jj`WuQPVH3IvQ8&IvE%@_WA+04o_m;No$}X-qqLK!1 z?N!wIh~9%~`P8?FN~kd~i3HBds?}S;L}p=};5@VH%_X&=v1NEs&#SK@On7tn!i6t` zZ8;0+!Rj3FR{q|8S5Js4_c^m6t80en#a>bFu^qqhIaI_#<*-b|!x!yTTBvvqLEXyi z)`G6`3OX$QY4ok{S-s7oPd!(tM_1`EdZ^|2hSKqcIi@}xP`!~IUKf6ZE>s9LmkCQy z#xUK21b^6pk`E5%nn&^ne>##Mh2J=#-d_#w?9taSH7#t+{&CfIWP- zI(gk_&~Woya5`>?giKx%-c`-jMbI_Y!I#tus19JFiROz?5vfzq}Gz?=63SBRGgG zjb+O|;zy_^hh;yVG@Av$hup6|ijfBK6YmkdsS-<6`vc{zkiM8gulg-asl?w_G@JA` zK8e`$xE#O1Tyk)5?jbGm1@JT`$FZLs+5-hi-xE9-Eln0a$fI3nzY7~xYr6WL{uqir zV6tb=#tE?Ac<%<X^|6n@E|ly z+6Ci6x48qY|8LWi)uNQ@1!Tk}1&-M$5L%;TjsqK1>_Wn=?AWe`JlpIemD7Kct?> zp^raqz)0$GfI8R)Z~o!(>gAks%d+^yPGjs0<5s*sJI$XSKjaOizb8#+YRPwe2Ud)k zI>hKi@2!?{uXh@uANy}^lU9xh?w+=DY!LnW#Q7deL^-uVW#LXvDMw-r^FOz(pf7(jq+9Ou_KN!M zrT3NfiZYg0s5rvg1|#5I{F#>;xm9xANWv381BH#Rb)J|_&XmOpa@AUMjgeSQi9jc9 zh_+k?kBiaDN*G{m^wYi?zsC4FkTP&)TJ&G;z6WHF0If=v&k^ir93BA{0$;A@Hos#? z(4bg0w%`I&yoi}RAo_^cD#~XU6%HS~DCK+{SgpT)*IlEE93vB=2~0Lu{K-BtE#XKc zu&5|r?MmrA5o z%j+xr67j*qcFp**jkL{xH`2%iwzs9p=s10PDvSQyzk{fu^Z3J@6g*bddGaRCqj>Z! zW{f?lKNIy2c%cOwQg`*CrEvu!=KAoZE1DahQMdTS$$K75nKT`kpQ)xAWt+#9;Uo8q zI5n$I@qp5j2|LI#g~BIJZxM3MPRN|vLov?8;lhfjRFS5&5(1! zpqIKlM6+xu*58BK(p2*8_|36#-EGa;@{W#O)4>;*;4|>ZuC25RUI%tR(TLq-v7H%( z#VkOUr)ogej+JTtea*Bf43?@hix&blgS!nW;lgtsx2R}tH@vGA6=X)|$3gq@t{`xB zB5}n6b0?dlK!Dt0$-PlXq3y_nxN@%#xjK!1Yns>6eqUeW6H939dkc@FYt`>bsm?$> zIR2{ErfReA(F<5Dp{ak#mtdx;=+srxC~LqEnZ$N`vxUfsA~KJ4;*(P7BZ@pZUDCU( zM1DR#beGDgb?m2*o(JMS{5)c8gpFU!&DX_t`_j>B^u4bz)T#aaVC6;Wc|}l)@Ucg~ z#e|V_Om*0fFQ1SJ%qoe#|NZks9^Shp9Wc{!|UxpXoKe|Icl>V@^!V4S$ zmI8%p&u*bui@z%|39X1DEmC+fLFdpQ11CgvAq#TvSf+!k?QxBv(MrxB9Xn2SI-KcEF9>Z$|C|ft#0SjlEh266>;L@8b6fy zve`=40@~7SFk@2l8s`&&t0e9n_vd;9XuD-mGmGKl7Cef5zAXfXP# zPwY&U3D0KIrf=y7T$;1~WN|Fzq46-gIvyHacd~X~xC->O>&(_AzM1Y#v_QN{$x)pr z!Zj0W#{06|7W%OG@3YR&PolFw3_Hjj_P8(YAEm5(V^KsEN6x@ErC01b$ZYE1fwvVUa1MaI+nCzf?BU+A)Z%@Li0CTDB# zIVx6f=bNnpU68DF7{<>kF3$jGfV}Nee&eyeylDyebLGlEhdmSI zkKcS((r7uoF99z=L${-GJ+EE649aO&ePz|q;@K7^DKmj;RH`b<%k0epTXhG7G|O87}8&ZdvsaC2cxP#Sg92- zA#d#dY$bR+Fj~=A&WWbh{A$cTaU!(^pX&@E`2*OJ#p@h%mhTzINlU>lBHJelw7E-+ z`^QpxLwbtZG{9%&TVZ2B+sJ&){0twG-Jlkm2I;v2Q^o4I)=-7$2<0?2yvyRmo}Cfd zT9wY3JJ}SU9S2w@&kV?5Gwj#0(hZZecJ;pe$F@$4AuUo_cRyw|+YPqW`Q6 ze=wN$_?M`Do3wv&8y)SiZRm|~IH*bb?W@^5kdCR0 z`~0699?oixT99So#S~1Hj4D~9=voFt{%+ZUvAW{ z={%H$z85~BryZoT?zCHUQijyZ->K_WJynnL@?4Y-|E86Tc(ISnbqa$~fkOJM8L!V7 zYr?2`zx ziD>K3#tt;cQj+^=s9iJ#j~#T7(UD7r8ZU3aBm1fk(}#aC+bh6L|2NMe+O<0B+oLq6pw z5@pSwjodYiEsj%kXn*s{7#!BlRW=pV8Wq&{R$&;up*3}=WXThJ-ClXf_T($vI}_Q^5_H;%c({`V?ofZeiZ0?%dOvR^qaJ#}E!i2NZN<~UqBq^TglaY_=n=;6_v>_M z7A_Q3z5UfVuAClc47EuuO!798#uBtM?%I>CQ5?Rr*oQSVITU$z(F!cL6Uc9pz!PJW zcd!LU=3}t(hf2r4Gd|G^_p0<&3>W}{-})1MVdJ#yO~M|}VUsnwnVrK!$p)Ye{;2V; z#M#%ah*|LQFVKsygQ%&Is-O#_nrOq1D&=`QnHSK`XuO=?SL*^=w5tcJr}kvol=Pa^ zz+!DY!)H%@CgO3Se3zf1a|Jz$TH4D&B^om7@$e#c?2AxAkxk3O7o2Z?O;{E1@2Kvw zJVN<4MsE%{b!2nwR(Y?m93L1nqap9Oblz5QPeM66{z3&soyZCr89*(@AzBf=2KF0X!D8%O~VDGsI+}NR(VC?EMT(UF6 z-!*?OxIY*@XD#08rp#irTikTGmVIt4Sh)z13CLq6e2Yd8yimg~f_y$Ug{=1VkZlO$&Q@@g**ECwjYe9XrSk@zp_Q%Jy=3_gTAyB8(p!6O z+>A%cPuE#3mE`%q&~av$9FdDOaA(GF486{?fpLyt_r zKP!LAvda1_uBnncE>YSSnKen#Z>J_N+RxT^Bh|j0I$&GnE&*QL(=2P)RQNFlNY5^t z3m1Ts90@?4ftFt0}Y#Aet1vzA_x#L4GNs* zmCl^071LvNlDWPxX(f2h8l?rMLx<6Gu<^n>F(yVmh6?rwAF+Oq#X|>wPn@hpTmO_q zf4hNuyIen09ehmY85DrM0f+Ysb(Q6cXwS-YAYeWBAq)^0W4@KR{7zRth42CXZK=zt z9p@q&th%x;ZdOe>+>w5O_ldP`40OM{mdx0;6-{?%My_9M~nA^=;2p9e8!+b znJ|@pp|PU%$QeD;zQ$GbZ#MWtz5OHXqyJ^*32gMK-dQ2J>>}@sb(}|- z*sDS3PsQZdlbGlQD7=K#oRDyG&ncZwwZozm1Rq{e!{)|6rut} zv^%j9Oi{;pM8dJ#qh*or3}QLRur;27HyqZwnF;-BLzkh-E2I}iX)14$3P;RUrnFJe3W`g?2R-@o?* z9!-E=czxy%D=?C=;4~sFnr$Wf;(A&QqVhC2L;X#K8`RwFFLb8E;ZSVZ3FhZ9L?upA zd5od=-4-^PFH7gIdH4CD51V)a)-QPWdu)g<2uQeX6ZL)RWrni#=iYX}__@QeO7aIsr^EWUoj1x?ikP5SqHaEd?{=u<8I7MF-8xFxV-TscaXz)v{< z1AEw*F6^I~v}eg0du&8nAD?`|Mb^}gsyy(a_;n!h6I?-zZQ;w}8zNW>X2dsES5f1K zI^Q`lUN|*0ozDv#a8QU}eiQDxe**y~SaCD>tc6W|F!ZogWqXmecg@h3u)U!f8cFEO&)GlF}@M=hy0FL3YwTRCzFi$=73eceBiFdG5EPs!RT+oHC z2;#Q_v&rAmk4Y}>L!Q^sM;w-4d6tz#xv6OLE@{xz_+z$3PxZhYc1wqBKRDZdX@uY} z^L)vY>uSeJWwjT_)NE&BlY`@mR_W4{hJQI@?k|WDtwtRuYWqsR#9FpwE!*H6 zo0dej9wVHPnCC$^q%p&yrOsyJ-da->b0RY`k-D>z>R3ZT6BfuwVge>e#5YuSO>jRx zAkDmjk3V#_ld5*5p_6rjBTzf>Eqy!Fqq7*@IhuG(bZvXo9nChCho50biOKqa-}|Kl zu9ftgNy?BTIA58fP5wpoHHh3{+Js)&+KJp&TK3>1z7Kz)+;)#PDH*P|Vq?=hXwE*1 z=_g!2VMVIpgO(;fh}}po1BC{Ut7$SQ80K6j>HjYGsUYs|7Ta}TCW!43O`vrtj@kIb z^n06z&F|E}WVNWUesBUUTq2t{*)bK7d7QWkOxQDdg5_8%x6pr(+%Y-x`8za~4CwCIYcE5DL=X(mlIW_@IlPcG2=h)NeoK_$FxsrH;=z4hoE0 z4x@MMV{ZNgUkn@kx`-1x5$EZUt6kL<)VY^Xu336G@4&AC+L$(bkGu2)1rXPCB-eq= zO>*)tZi?`!yo?XR!r?8=7K^B+zl}b0d3lb~j6-TvC{1b6URNMXVT&Kbx*uxbH@|z} zm>aGF^XFfi(r&(=DYYCY?r=H^Php=}vVr&SD&z|$v`1(He_#dD61OE9E@?LETy}<* z&e(f1@7kZIB&5LvGL5s{2rK>T@3``m3k->wz!WXhmVt?*W2cu8qQ`3n1d2P5D$5OFDAMiLi_id*t^rRTp{?cYW|ao=b1| zo^|%?+(yqKFGbk;nFAsccgnZDvu$2<30H-Cvc=8FyGxRN3}|Ur#`x;gnsvX@;SQps}<=Cu7VTly@_qy zSZe1VwM2KYjb%?+ctq_=PPyWha3JrG)AL<{%9{>+I%Qa7aS5De3(`1uyR-TYi*Zea z_#hmodh)0-FQ8j{KV?`;q2GI$U^*4hk;NKhH+Gw8nsW0;6EUK1P7B0^aQKj`CeZw7 z$l7;vfdrtcEsC`pXZ`QuIbqp6HpV3N;rLcm7^{+2_0tPLz9D!-6;Bewd|rcEWU~oo z0K&Mj&&Ls~h=XZ59$sg_JRN>p;z|$MY-7fCwuA|IxQS|FmvYO_j<(6__=bU3 zgY8$h(`Uy$h*#GGtp)}7R5kfq;4%5G0U}_g+1AV_mQUMwZmv?p^G)o%w6j`5^yZYo zzQ$kl_1}5#4>p6q8*k%HH zHQcXC!%rgR8gnZB&7RNNw#c0vR)pW~3%BTsvbNn!H_wGzHox)GYiI)(g2Mkp#8~&Ur$d=X% zix9Di%;69(_%>H^32XIM!Ygr-U+k(KXNT#t8MJSIXItC#e#%u3Y*m*mWJ~lx4tl&) zTnR`G{zy)$x^i9mrsb<59(oNK?xoK#f)9Z9znpw|)-F&;Wq&HOgt33Xgbrwt-c+`^ z$fHwm43#uM+@vpvREe^cny2aG2Z1kEzI>?tPmnu#ebV*g>1TV8BER+tZxEpTtud4b z8&s=5zo8-J&^fDQATtW?(U*W=>Np8?bIYs_+PCOx7LpvWOOw<@p8fSCAHc83iZ^8> zjRud2=0Yt=7rDt0Mo&fnTd3$<3CX7={rKO|nRInPW6)QbbYR5z3+$R3R>WRJD=NhC zIs_X80uJC|8iH8F+U#`D0#;eCaE%g~X7+J?gX(>oG)sAJP42Lo4l#-mx^%tTOF13X zI^A*L~lc5dSVIB7hqS4QQ}O`qJ;wnh=|1O?fVX4`W*U=4gw( z)w8<)>zrtt$C%4zjZyy;CGh+-TzMOxM?L6TqK+5ebXDa9-lB2~if>u0KrgtsQUf-` zJR@u@6aIy4nAl?3mr)~(rF*I@oT#@$7MFy|8kMIBZI+SMs+z5D_XHO{ewe_R|Iij* z8}0}8X-0r8C0fLE2toO;!U*G$XM&OtCXc@w9$gw#+jHK%Tfca6;SFtXWE8d9T;Ra@ z5lVLHDu#Q~@ET9-i;nzS1>=~Gc)?6~9ed-=5nQD#rskVWpx4LQD5D1y(ho2_kSFV( zHx@%NU8ZzYLHy{m}xjVu&HjTXQ{bA08KqLKmOk1IBe7Nu6%5_9|eH5=@dQ=z6YB ztKAx#L`znK@67yZUSawXGr>{rJ{|B=`x@2%YTEfcWk02@i&gBo2D|*)XH@a*T_1-Iel(Vi0RkZ^{C!>foT*C_ zSj0^l$SHoS{hUF#Z$fS*!zI7j9yD4^XUC|SUUZ_w>t>2XE?{zZl3s{nm-b(k z#Z*$Bw+El46fMytTfx__A4Ip?;D|uU`@o#Vi<#KL;xQEClK`E}KX6ehoIMC76?DJJ zWNKC|J^R!h_x=!P`n7!5g%jo;i_zc+;9`hm-mn5Vieew5pDkQee#p5Q&mIltFh8iJ zT?Z>T`PbC0fGV(SlJkq(0aKKnq2!JG;Nkj`mbTE<9K;9x?uZ2>1TyP3EG9ZsTbNhc zlyB{tJ#jjE@TR*NolQ&EzAz+isFqzp`Q|_Xg8w=UQr3M1(vW*q$Dc~iqFLbjCucfT+~-1LmWVc^CT zpyEsPubSL$t(l9LatM3S{oNIr=PJ=;Ird>TBcA6$?WWyW#0P3wQv4G1t~0_gKfzN* zhjTqBzi6IhMMwY>k=5O)-cY+H?rg`nW?HWXOnOl=dW~9Q_NMbc*+NVL=IQnBFlCf5 zBgrg4tr@T|qbG=e&^|Ni z@d3}O;3;`i4foT}n5RR*+Bce~8&rcC8;*>Iy*EHX1o#`3nd$61Jkqtrfw*C>o+ zqM9s0@)E6xZ5!q)q&{fy3lPN)9s>Xpb^KgJ><7!}Qxc0_TmsIZU@Y>Nk*|piBwNd^ zC!+ok^aEMCSi;jo=cd072)6A%m9Hn9Xeu$3;5JG>Q^b7>fmjEEP&G#Mk6^WSGw%4`^G;oN31 zN;r==aASTD%FVtXdeRt7STw^btr`6H`kg~#RO2f_e`lo$d;k@5KdU-f0OkuSqq`b| z!AB4S(hi_u_pFi68nPvydEf~+rkN!CIo@k7(`~ouWEA3Wbzv<~y(6l1@s0wIHiI4M zUoxRyQHRtom1yzx5{p;NmCc=m2HW$uvb>eH!l^Imu)+6ZPYP{{<13H0Ka^dKo_GO2 zVhv1hi9;UyGVJ&uWLUk+$*GT{CAR1*Zs3M zu{?5mmoOY0;tOuPduT0~CjUr^v^dG#(V8ho%IG(72KO;3prKc~w%p+&Q&W9Nm4o!IZo(!Vg<1-yP!l!M z6bbn^lAespUoCCKgY;#OqZnx>q?(d93&D=vY&?^D77`9+V=ym9{u$tpc<9*Gq6^YN z6G&k0dqAkY*Jaj&;Yr46#-x!bdQTu1oTN;Y4%0?In6`;6&?mMLMn$7x9`pJim#|!3 zysALnt-XBpIG@8fkQF*!HSWzhNEJUpTQ(pFK2^kT5iQ zMuK*5_OECam@)ge!#s2|Jup9I7k*iI72J04DMQ3hO#?v2Zzrw)s>W^|Vn-^%a9e2t z_<-X5?B;!$JC`N+%H-<-TU3vO@f_F4g=5s_+)GGiOCn+2A=xLeMAEeFG-P|VuiLxb zVzSweup4J9RE~NB_JOTe6e1HZs^XtDZ-d&dGcOa%mq5<%4lDhZXbiQh?Y}3zr-ZlE z#O;rVuie=3yFN3AR{t`5GZOsD=rjDMSvd+kzMcU0)BofJ#sDD4bboQ=T zk8j?C1lU0P;f!sgTI_T)BL-*}ddD3N$)`J^yqd4Ctq~|1_gRz6OEw41h{@2zu8{U* zF5ULmEvie==*uR0H&<&A^zg4S_ zC~6%nqyfMzWAyf;2*L9U2p?5ZyzJL3V!;_a;}mG)3hqg z1%FxJY7PSl_`yy#1wL@MjPchejN{H;`}DvcoJvAMc><$Hx$uab{5eNfqpSGS=(#_5 z_iHMl3)gNIehV9HeY9uK!=i^iN+Y&7{^J*6NF)g0f@Wb{V%xTFE(eQojzG8@yyTG? ze07;GkpmX{@mDc8I)YQSsRT3MPxHhflvE=|9Q$0%<&e#74sBL*O^;kXjqZaV`E$K> zZ>7y%#vdc5s-T!(xnD%lem84M(*i1zOZTW{t+k59U0eOpCj9B6Fip@+p-tghwk&j92vWK zSP>RoJyTQQ1FAdK))7yb&%5xiUl(0j4i#7H*;wt=hCZ9QJDhK`N=f7iyyc+#PGKH+ z<)=JIH>Z5M&osgHKDX_X}^FoJRbt{s=qtTYENX5PsJFbNQ25 zFLrtv(XP>x1D|<59(LF@APh$)uxk!bZhb;3?1D1ybE+=m#+sTIq(X?AADUyJnN zoN+ym>`QI5hBpd$_sT>{EQ@nGt5)&I_2D{#0>;s|=Afog4O!1Mwg|GrCTdAyJp0VS z=)@Pi*o5QAA+*80YqCF*$jq4 zhuA?WUq!G;n`O}m>%|fm7XFm9dFZ3 zU-4GaxcCC{A<(U}p8oPck!M0JtrIQvf-716bnrC2(i}WI79Gppt_lXmv&WM9c}$I^ zyqfE86m73Hfhq?^LFfVLMn?lX1>!wswShlq8vOV*UtZbp)qwS1YniJdTeb>p;*z@o ze-R?e^3DxXZtQE@<` zNrD;{--=*-0d)lPUSW8nVJnAcdtdN$&ak@BSlJmMZ@f&; z(;S9wQ#mxE3``mN zrOB9-b?fNRN-_R8)TA!_<<$pvNuh-KIYseam*kn1i^owr9@giGvU`rBHNWQJe=aO} zLVte&mpcrr!F-jm^#@)EE2vb|$W5~r4`Z0G8pM+fk%Kci#%r(Kq>7m0U#c9+%s_Aw z9B@A$wf3bw*zvn#7fZZK9X>8w*pVW}U=grXhG67-R!EJ$Eb0T+; znai_1ZZ=&Z9kd_x_bgDX^CcSTbv^Y79aGmfDH>0JUYL(n2MYhf;LxbDY#R^*3;vkP zE7bBEOCnHW2k5ocz%C;iN+W$R0)bhu|FyheCyAjrZ3496DvBv%E*e^O@&hk)15199 z*l0nHW7UO9)_u@9v4IixK2%W7DD_*P5UJ((Bp|^DDKmy|l$b$U68+%4llXB3`10jc z3eq9~QxYey^X5AdDV?3=r(`4&pVX526rVUOY@lDz17+$PJ8`eJU4E(b91xQ#+F;nD zOYB4Lx3y=93NpB4#yhUq4eUngvM%xfqFiqWBJ2iHvwCFuDNqqNZR$9sGgZ*gU8_&k-($iyjPAbZ-`^Xb%IGB;s1?e82&hK}T=HRr zCVwyZsNv?}VLuvt=H^q-N2W%(j09xIx7nM|b%sRNG_K=NndlWgkjpu}c_jFPo_;@` zC^FFgPgf}a`{m7>w%WN+jRG`~s!?D+5^OB^jnr9^>q|9c=ZS^R1Wyy(5sqai$?%l1 ziCaR*Y!9uplh||4~cSx{3hQCYXoq*hbu>Fe#t^o=4=Jz+d$RhAHs9~$C`RyHmgmi9Gdt}K&KfX2&WBAF?{?pb z;JyC+(UtKb=+`@271eFDi5k(VCQ@a@v_6&LR$#+);3-_hMO#y?Bq1B?Wo+|PH9{v; zSI4oIwk!r%cJ0PN>s;K1ZVVf4KQ~#w?kN&bG@fv+;$qcb{~I5qfQrsBtKiZLwvZU2 zZ#^Zx%*;%1(74Vj4ocK)B4EfBRVYk3Q(V6o9Bvp3Ir@uJ+)^;}F;X)yz|u40ik zh|WL0(%KD6-0N>QJ6vTzmAtwtrE3t|1xZ zO8O&gAzQT2&d!}lw`nS2{!ncwVy6$H_OColDW*NJQ|1Z4^MC2NV<6M$;HEFBT41@h zxy@q9MKvsm+Fvg{G7v4FE#Ab!4iQpXd$oe@S6c)cG%zdTzsGU}c-%8Ay*Z_LG)v5u zticv68+`WF)$W1)7WBkx;^}5Afa$XmsTzrWQjhW_T^1oP&1KPzQ4@l%tC`L)0S)k% zcQDyCNg9H2jE$;ww^&-siRv}3_V5Hd%PsLR#dfuI$=bn#Y(Bb?sF=_(7xg2|lxI*xK{8TfLA$F(AMy-vhSBJ$>F;`j>}V!AK( zMenpTyiC}$A3or5-uV+bCYUn%Ue?f6DP?2~?z19S?>QD8`i$PMOT1ZP`$_e%z}6bF z=Qgy*D^eArrIRQ{ebiA{d9<@4T)Y|&S&;kCnEA4leF!;$?Aa|bachN>PDpUDCthQUo~~@wrF+? z56hwPKi`6F#TZPtx9S5DNK=)MaRyN=u0G}lv_iEaE&_wK_lpB;SDw&%#AmHNNV zF+#P1-P$~qMqPNi8dyVVI}8>)I5I38fh_P=-Jc0sPcxaiTQ&YMSst z)6IVi2;>-_LI^le`qM4KQTnzjyNQ82jZ7n@i_o*4usL)IjoGmu+&V8j3_Ob29ZN7| zGndv)>=SK|u%1lN&QD|~G1G2>#yzGx2`dI$%hB*0S{{fc zaU$7{GaqB3xW}uw@2F&ub4}&jRB4H6K3HBe_|$x;X3Zq5Cj7^%OIL(aj3l>>K}lBM)q_UR{hmGP}oRN8#fSMBLq{_Q*Y-7llLub%Sa7oWG7|4LbY%SQ(b^^|9zJb`? z80Zih^c_9e;SLA3lQ)ujKj0X)gT6X7XB*P5`nQ2(SLjSoYlgG+RiwlCJ-_FZGh-kF%hO`j)!fsPPm1{ zJX^6~u@5IL7Ykfc1qpn4AV!&bjw*2IcV0ZG7I+vPvLDdRFr@1jzz_-Ip+0Ri9X+hb z;)Cmq)==*mL@Je|FK7Xi)Q!zOrfgfu7bcukQvUFPn<~j)t^R_uZ{Q=!92aq zN^)9#(&9SKiKC>ikmF+o6&25VHeoh2o;^u6^)*+yAQE!jelY5EosjBGEz659kup0$ z4nSPzv-1U7ayLcv*@SkLh1|jeyk)!9=vff~qepY$Tx|6|m@D?tiD-9cC}wa8mj!N0 z2N>wI2u+#{F+M-y7dx*@_}BaS^He$=fkGJ-Hi;+O0Af(;!Wi;f%l(G?FXj>%8}e^A zgCbNC4s6~O?nw_je0@bR9k9B@aTyY1Nc$o&L(<{+CVI_-$`xSUVWwaXTn?G__c%V7 z3_Q^y?8)@eD%E7On7S@v?o05z2OoCkrCFg@6NGP+jcF0E3CL76b*C2K$L4z>;=duh z|LtO{tU>iC4xIMgL@;OAma0HvcKnQ)j)aX%I}U6DX22SGFNJs8y49hb%(H z#>8jp_+#OT|B$I!j1ZT_K$j)!_)jI^4HhvNu~WjqbR>~i6Ep=bOe-{IT<~n9TP%6e zpn2UC+sJs{kDOp8XT*UsYO<+gnQ?2ok;*zXW5bqkoN9kRU&2Tm&9_f{&gJjjayuIVc*bVizjdLN5zV2dqC19O&uMT7zkCJ_w3a2Yb&E_w`mLeFf$L9}rE z?%%+tj4%vBrZitZZjJvCS_@pK1i2qyvO7!nT0|N`BX71Hl6+ZD9&iN=Pi}DE)ZboknO_62zV62@Kax(gmI6I>WE zL0``QfzFZ$dMX}Y@SVo0lkGqhlB5eJ5^k)*KPIGB+0{~EB639${nkQ-&q5(&s~Q={ zh_N5a;eDlFozO8hAPt$z4{0ZJK4C2_tHnHe6!d&mQwk zT?b4_XZkp9-hJ{^WB0hGO^;eIT{n|S~JJxc%MrZO05!@|;rg{J>?W$)?`*(U&( zL2e*1_{#C!v8@cr=rm~Vsfi~(ueTIW4q#7M2TE<88#0d;&-e<8%pCpDG)^hk0h=lg zV;64nvcp=~+`u8dXwFm;DiPnR@t;A@g9iUkrXV8?Da>Biy)n07fS%Shgpd3{hiHwQ zspOzBhE|{#5KN$f%_1VqY94*?V8mW}Cp|Ks-za?&uZIxN=>=}H*o3)20J~PB8VIxe zd%^79jOqOR08Y1x2uT9Lv(ip6VI)nmJItJhs5u>2g@}${8gZdeA&}Yg^5OGQh%&}t ztNX84`yr>gDT^@p|EdThAD%#DsSjt}Mk5r}OmG0CarA8?4=_9i%+Da(51a5K!10&0 z0-oas$8kg+{g~J5HHAxuNqy-TPWY>vbSsrnm!%ii_xqLbD?Og|Un|jKIw+gJ@fs3W z^^>ST9zGcdTWJrNE9}!O5r5?HPH>3rXfvN!F&_KHx)rK+|1maBrKdcu%g6ni5nGa% z1aCi_3Gk86&XHzPfks3Z3d((i_j2zyWU(i^$dpUe?Tkw4CkqwQFb5H{Eo0Ug~i zpSVV&(99jH;$Djtj8N+Jcjk4|yL}t2!PR%tPW5pz+6AMdRI7Pn4N#DxDc|0XT(1s; zsaEINHJXPo3>n7><_QcC64AP5hTLEW-$iX^k`BzfMzR&7(6Bctz}H#wBz^%Jr45;n^MzAH-HM&1cyDYltLR8%L=W>0x%AtW8U{DS^ zN+D`WZVrdkW%Ed$ct)E)zoZ*Dvra$o1>r|$o!EGRYWpTSO6{Y2TC5IXCY%-n9u~u4 zisSq&mA1Yd$5{!@?u;Z|;sQ$WFUEw}Do*~{@o+GIKH{}7n& zYU^wti%1WnWx#ZUjNW4t+W*Ky($T=EOVJ}bK0m>2z}MapGxY_ViPZ^ciS@dK6|A}u zhG;OyF%z4;=K;Op&39aHwdi7>?XuyX&$#Ze_c}aLNlLRrDLfl<&>!iT=iZDk) zh(@A_nu=s?Xd5*%=Xd*je}D9N^k0u=&bjZ`a$V1><@LOYh*5}18du#qA6#V8I7x9$ zHmLH7H|e!dW3tiy^d&Q)F#0s;ANWW-AhpyfS5RqB9hE7$YIua5a{0I9)$3=Pg8hp2 z1Uvjb;(v;`2sRlKsU^!`j1^&=cZc^*$A2SHP{iZ@CLTP_a3YuV6whv=Ua-}A%C0D} z>tJ)2BvG|31XAoNxccaeJuxtXkmGF7iSRj`F&4^i`!_fU#jrBs(iJl7584?3OI1IH z7$($k>k`ubJ{^TRpXI_1uYVzz-UtZ$P9!`${Hep~InW{mtvAPVP$;fkwZ9Z(%N-a`8l1xT~F8o!{Y=Lut z84L%AG~(48AUNX7482V^9u?E)>=XoI`QX~7IMKoDuI`@00=U~ zpnrlB?c2omsv93J@P-_xPKzGy zyShr%q5mePAJS8q;2f=P)@n4g*vkf%sYzU(FSx>D=z@f_;wT-Mv)C0tPP>erdqp-s z--5%y_8*c{^JuoIs_FI>4yN+h+u78lP!1oE?TeDzD$iE%CmoSAxzKQ9+)79T|AZo&b2rOIrXMN+m)%+ zT(JpdSfPwg7j>zNo3*egID}uf9;MNRllQAkO9!bV#^l8{Sj!$VI@LXgv_tO(EX7~z zo{LG?{n%wD_H<8}ad>VWSepPe|E}djq^!7kg+vAe)++BPV9OTeJ*&#KnS_A6|BXLk{N6@@y7U`xlF1Z*%ffoa<0)_rDt0b!mv&kJeX zB`7+{wsWEu-k13I?wmhz_2TT||F)CwCr_(L6V;kRQG0kG!2b z1GWxd8d~FtM%Rc7T;ewb5C(jRydwT8>hZArTkK95skBE2$l5o81+3(+*2^I%&q|9Q zKn@SkHDyz0A-i`zT{=M(9q~=I`M9Vrzw0=}LGv|9C)(g(|0aX|qWu2iO*G!L;y&!iP%3{`>^?h7OIxXn%Y3n9zqB%rSpHR%hwSkanuWd|Rn8 z&B_s+><}%2SxU}e z%~Tt=7QavpG>eLcCA#I*Ey?h6h55=f`Sn{iVBqLR2#+9amuX2cGmt@e*cr>R*RmT+ z@KA*0$n=oL2>v{9|M?DL+az39Bi@cMM9vw-KZ`~FOcn3Jo*K!%`=j^A>%$OVI69q@ z)}%}G#*65ABn< zWFsvs;J4Wdan+2HOf^7$6#z&cJ-(PKj^FYZHjmr9V15@dmw4N7$Kee%?&(R%R~XO$ z&TiciEO-X&&>h2?*~pwLW*ru>pFoM7;N9KA**Ky$T{|1B0pj-9Z@i5bBt<$*Bo;iO zmafI*9HLZuY>G1a(76&7kDG{S9prYBB}a9rt0oX$y)&!N;vh@n%MNccoJpx zxA$15q)nwKX}?;CHgWKsV;m60=tJ0Sm3u3K(>yC?!{qTm>4E}o%-OU+eOdMQdF3Dg zspH0XBR1w`0f@XO#1C{LPgcy8d3^>)($F2dt*5y$s&r0(XGkcsr809SSX+5Dhy82w zjA#FS^m!!8R}ak|q`Ws#y`LXZ$pb!{zZspOZl3?zv78U(5}HnLz(I7)hq~C!!DTL1 zw6s`vjaepS3tWZ&O=sMVsk{mdIl=PrNzDrow$ zj0dvl-FxsI#~z&rTvn?2Jwjj8-%Qptv7TX}L&jpFBXH8;Kpu)`A#FzJ`BRP&LF zUP~j@lb-0O>XfW>(UDnS+Amo?&+hm65fXqTaY-&1PCKO$@YrGB)puR?v(Kt4Ge=VOp*7+z&tK4Z2&a;lA-MS-ow|3OePH3*bWdgk{j5x{GcUQR|UoC7`jC3Er-tV$iq@`-UDXFOZSR;{) z^bMF>6Rnf}-NTvFKp~RxWx-{v-z}8JbAc6JNAcA8w2ax24(O+^OC}Sxyr+D!Yx*rsB%E~0| zQ;SVdsYb(Ax+#(3Zllb7E18lq^}TJ6_A4sdLfQM}yQoUFNYTIo>%ke&!kb)G{5>rX zyE4O?up{iRTN}tO8S4-XzgG|b-0l>G{jDUsL|F<;?g=|NmdpTG-4c^ zPNc%FRyaw#hJM{pP=Z-9J(HJz2`xmb{@HfyVHPJYioOH0-Dv7+Sio_@phO(ax z)s$U-rXv;fCHJ=4_Mjy7N5~)0MSWZd%fp9bVR>^`3%4Lmq0A>x6IrN}6i^SjgI1c; z)^4VCZv=^q{wWUz)gjA3xZbY=+mR9*<*t%H)ubzgVUbRnYJY925p@-SLU@I zjh~(*(YV)p=?^mM?e(w2E(z4-*~4EteHN={DYeUe)(=KAQdfe9zQ{R#yrdA@!L|a& z(|_K1KWt@X^oG#tOtnZwTKY}CM=w>Rm=B5GF_WCgT7_b{Cy-?{jxHW^?f2_+#v@~`4zoowr^j>+gL-@~%O0>rvF#gBXh#Yt~hy zx+mT`ot8Qr5-3Vn7Y^qR`c$cHD@CPDc?OYs#ef)|Y=z2<;bYOFQFsckqi=7HpcN6a z$Xd2+5h~ernAl`2t8RqE2tTCg##FL#4Bn`1Hw_LTeR*UIe3qgw>B)rpTQbp-rMni8 zso4yL*-R*TY9lv(%x4I%QO1huM#&T|W!U+VikGVoOzU^arN;JZmr`2tS$_XTfL}~t z3Fgz*wWsz6wnav-{O^aCQQdf=J~iRc<8OdG#^9urq4QN5do zDDtU^`>37=_0-q)WS7gpnl9{CNG{UVUv>~@kU9-k$HLw+E!>R%4Dhrw-oY8Uuf1^V zM0(yki4$jPUr_m<5LamNqQEQ2Rqu{O}}&Eh3%|zD?Ll6RKCdFou$vGdUoK z@#z@fpP_i`g=p>L2v;D_Ug6{JARnd^rK~IaXt4<2nBFoQ9HEb~)e+{y{%}g20Wyun zVn6Ul%537zL&2fVhtNVd!uM})v_DdATHjwBPSt#(>=vuNh7)CvHP`4YnO~*O&9=jg zUKI=ILQ7yk8_O_rU*bR+mgh#kW#eb_e)I(ZM z)8LZ=BFq^|1FgmwJxsf4&9Wos1h5Vt!1Zd*amAl1))d}Eq*^`*VFVRp2I=-sg<)zAgFfx|v{^Q~+=BjTp|JN~xvBg(Ve0te6EIwFj)2u_z0bkku zuJ}T28HNNngJ!*=H(0VEehm~w05eRA4;DL z8o>DLOQxBSyN*((dcqL8dTWCjWw?1Sbr5m7H3xhKkF|MbX+enlgVQ_2A6K*M%8Qp4 zT#r8TS7i4@^nT>Rz59zEt3`o}z};b&FY89r7Z=~Q1by8%mqX;)_HCA-tJ9aJ9Izu+ zfYMs&P`piPHq!y^9bl z)Ylg5!G6uYws|E(xQ0?`Ea@`$qon=j)2Y+_E=$#3e+>^)A@hQ%%f@6`HgY(83g`hP z4#}4dkV1?_zu3kIDw}aAnxq~b``e(PTHn=D90qW}$FeTo9f-d3^}DNZ&^`jOGvz%2 z5}_;q2yHA=oFR1L^iP~NdwQ7$t>@`B5TTfuJmlhnNWY76`>_6R%IMU(RwOP9Y_g?^ zFB~~e!4=2@rKF}?a`D~_Qv`+umlIptUfqYog5LY4p5QvLq!s=IgKDaK!akMmaDuBS zG4NflqbFqfeZTTh?TZMyeP*EU&HpAg{$Sw*g6_?z>R%tGSEx@9n9aKgm<6ZETFvBp zO*(ZgqI(NzRYi}GJ1fB?reH3(HI_A-{C#Po8w2P7Tf~BP;`}DD2eel}HUYcE@IBh_ zy23jH(=VQX^G_VM%jdEB)E6mbc&Zw|1P|i5%G_ouJcBat{zm1&)CR&Af)y;7EGzyN zdarB~|0ApEFdVuVJO{>``b#QBMk`iSfjyz0quN=uTq~U+v`NF0d7pA zArnHM2H2i2*$-@&&lN_o3Uk0!&W8d4aq1hyyOA1ms1&EUb+fs&Il2^u9OwqP@@=$N>&&4MFan0~`f@E_O~9J)|nxn!(vUI{YQ zB)QQWarV{`)gH%Fq*?3q`lp6~evc&yD zHyrW_@i|$mt{I@vJ?iJ5MEF_i*^me-Sp!U9OL~~40RvFVEm(rhE)zE^Bar9V=q_FHUL zkACyAou&5R4^a`5t5l*FI)txcE0=$__!?%maE=pUM+UmsV|i!z#*Ct!H+LIwiSgu6 zwaeg9YK-d3i#GcR8lur-;?hDr8E5EkhtK}g9=4a>&0L8sT~9~C^cB}f(N_oOeFKHs zE%}K2h50SV&u^}Qh&C$4K5LpA_=MCM#6}`@C$Cw68@s6e%N90isa=j4t2esSX3;!0 z8OfW%_n@_3t^H_FVPM7ALEJZn^4qELzZ-6;0{XQlo~irjQ=&E*D*mpzH?M~B#V-D< zUjk^d@wTY{WWfuxZToX*Tc0Zo8|7sEZ?~YCwtF72!7VSER`tUV)B@)c$gjkDj^agV z=yWlI_HZeGh*r)LusVp=+*92P$XmIC@qS678tCF4F;-vdbx9Yo)G0dNFp=WP;4f>1 zZNCo<&I!*^ZkCYgRJ0ZrKv4$SUBtAPjJyotHx|EgyTYZ=;0cG3*F|-z4hr3t$m65P+s zAnTB&GdM}zR#~9>xdk4k=sR_W(t%*B(<0;U3KYU-W{!x0!M8q^F7ZTZ1}>v1CI&Op zjP_fbfkCu^!4XCf=ErYgQI6z*FIMEX0A^ekUHryyJr1@Q$<7f~S_12d(~5Q3LJn^x zaq_(`fjoGn%X0mfN%Up>=NAce+MIgG`Ax;}zO7sK3LBQu73nP)(hdQU2TaaN?|N zjEdq(5==jkSAu!1ANKmj5?0(9SMg*qZc8^(#{G!S(4M3$p4T3|h$gF){4@!{h=Qi} zXJ19(J?0bV5ObTgq5R|sov9;xU3wJ#!Tn7(>A(Q2j>~I|Kr^ix^{d@cr&voSySEZ!=;&+bi_v!8DphR;FLl6CRF^zaHSSs6X!xQ9T&b}j~C~R`NeK28@o8_tz@je z>`{>(*NU(~7Wm4LajNjwK4*PWFOPXuFLG0TZ4~7XbgdAr`}=>NBae;Sa>;)~a#u!P z3H}CgGwYdk8I5^LytzdD^&_5Qb>2uGvbcU8ap@A`#n{XW^$(1tI)nxY}eo^Mp+Y9(CR zE9Mq!nXMx2S93DPlUmKXWzP=N;^ztK;oq{N5twM%ufz^2YeZ9Z+zXMnin=cGL+=5> zsUc+T@8^WO9(?v{%wz$1$h8&t@j zpy2<|y(oE9L{n$xBz1*sSNSCTNu8*)y$K>-QoV2gUA-Y-p(~8f<1yp?J$d`VLLE7T z|IejW(H+xb$4c`FC*An4c|<-#77N()x(LF4C_f0qxF#)jOZP`?rmi#qMtJ>>Tz%n! zc+Q>myJC@pXzeNS&L-Wm2lihkt0EQcj7TbZ$W{Tb+#`x%$p?E18F~0TbKY@LupKaq z9t9f+qgk}loBD)5p~>9-{u1ymyS3YAl(OrrK$W=XQ{Tg*o9U1%Zkm`*y|_TRYvTuC z*S+^0xn4i%^S&_X)DA)jtoFWarSsTi(|D(l5f_*J;0BeeOVmh`fhY8|Q`nzfvAhD2 z6()W)<14XqiuO8n$SBf{CM;1DUqiO!P+k~+7Wj(@EaY86dU7U;o_64e0W;c(r}lUb z#0g|>pr+Qo5k*jIKjk(fJHGW^Z9Rk$$3RouOEx~@K%%Yskm;~Cm`A52xPd2_IzCr} zd4K6m&AceYxph3T8L|2Z453BgwejSYHmKe!PLkOk#M4Fb+$#*ZpSM?bvKDEp9`9K- z>UEmf)-DJ6uw!dS&F-bDcEeM#ogd9fpNu@>Z({ZgD)EEtrVo!QU9xEVi)hNxhzt#9 z2+mlMvuNhsq2L?Kzb5T%bp%|o>L;%mN!`(tI5I>T>k`|7^@-oh5j>sR-BUd71p_(j z03Zm`iyYkvN2;N?ytx+1oA5ZEcpzZN=i^82+FjMn_^Zig2K}Uta-@!>{p2+82n=un zi*~9c@&(JlgeR17vig+2_D;7*G$=s+1TO5b2Ox%(d~o`ULd1x}r{SieH67Y?>aK1n zOu7lVrmB2#yjHdKGEFtW5>M5J-_jJOIG?|PwqY(m9IzO!qmlJ4(k*nu6$nRPc>NhW zej(zFD!-^mJvLV4T1t1pb$Od6YheVsLuI&*y|Bc+F`&D}! zbmNt2^&+mS-SIVLYGn1SfI8o?VCAa2RAmf+58Z8Sq8YykPPfGR#Qt;wC0J#-GeIP; z_TH>Pb@5rztRd>?T;ebXUx-BAp%PbZ8EVhhMD$hf*aGkED+~7^Td!F`&wz&hpR`N1 zdv()yL46^~xm=#%;&OFyU8DJJuvlIElvZB}EPw3+WHr#7pjQ_JDvnUk%No{_!M)VI zpB;&oj8`HPmUl(OyN|ihaIZyUt*K^8b41+3W{45r)SH;YhQ# z6%H%jp3Gh=(NR9J`^yZc+Paz~g5k_+A6Md;CNan&@_-g=GCdaFJ$_I`M?!+HIVQJ$ zqYE-AjZxK^cB4Dow9ogB4Q71FCp9iKE=o36 zcl0h5#8ni6U;mCk?JRJk0j!w|E0Tl|-WD2-Bh*cAIQ7C5z29dh?xDdTr#D!jh1dZ+ ziX!*#PA9VdOy&QiIp~pVz!i?KG5;khwidoS_;2yeI{}t)%XFqA^G{qzAMHI&)sB4= z?S)TcangYHE~-4~Z)Pi`gqHhFuAv%N1{Q>$1Rq8rLS5W~xJAR=_#X7X88U+#ygJsS zd4qdEgs*xl{Pu4%LMNgyn$H07p7IzIh9ggITjsq*BWQ$>->R1}aoRF2F&{U(@nb>9 z!z017LU%1qi9iJ3(-yGv{-ctpCzVsSkMvd?AckgxfSzJ??n_j?^)WaVzvYzv(Z-du zEeQhhiD@A!Gm{lGSR4Brk+Ij^zOK`|qn_FXK{M+18ckwR7Rc*GBHC1QsnUOCUl1zw zVn)^eL)td!h*Q#B8C3_&he^2_H41t#C#-{nvV6pt_e>vO2<6G#*107Kt{5pXwL8sd2$(;Oy*idABexV{jO46pD}Bv?TP>cS8h6g=TbY7X4LwA#KRcATN|Z z8tFHp%|&u;B%{JSkhXE+{mO(_Ns4^qE~PuF4U4XxPm5{%t)r!!t}JX zAd!Bzk&m%#)xjD`4^=(0oLcv*7|KbHY@vEOOI`7Qb)TGtf8h$(S6*W0=YVHSSUlM4 zLSHoF9g%3e6g*`($Dx0h;9t=CRs$_pVEtEeV~KPz z8m~c3>HurSqRE{sf?6N`W+t>FBWH|x?x;`s2$&9%E`62iEEzsqQ(SRT^h4!wid;%#2fFQ`nvU+Rf9d@=jJ+YLj}q{N_I#Fz;xG z*+j#cU#S#brR9Cm3?vk}_!flqL*DH$u@UtTm+~9XEkER=k;VE|OA~S}k-ZJQqo@f# zL{|z%s4KI<60M;=Z-Ud3=sn74bY-RJI47G!Tw-gLgGej0(7v?NGjP=jVnFL5^v7>~ zV2sarBx+XAU_a;{bkP8hHCPg<3HV(3!2{`8mkIb-Q6TJU$EYuGh2=`~jx$6LYe(0( zQ3xc6n(HM_3?%I*QA?L~na@(U?w3SSx?R*&hu6i+MN`m=4QFxSEd&~FV_Oc>d?8SV z%^5e%NGtifa1}SN9~<6Gd_V6bzGBM%&b%8%P+Zl8&zl!|fhwe78ZK*&7Fqr!mf7>W zu{~?}ilIt(1ch5^>Txm1%P)ByX6-ABcDLl4P$s=FBQ#$XJrt=kXP0`+sH`vKv zUgj7BCe3B+Xd)r~{^a0~6HO~u`G6Ts)2+Zgf6&-ceCxMp3yWOwCV`j@@`|whMX4QY zo{lEYcKzM|lrG(Yv*|nz9*BI&K+Jae!V_i7m;C$puZ_h!MXLtedmJBuN#4@e;irJx zuXZf&v}Dhcf!7Dm^^BTIEOxQT56!hsQXWx)y-sdH+1+heKd zv7#dOZ|~tiP$-oIAhK&?(Hi96JZV-MxKXTK|CK1L(uqS<&SQ&gR>hqEya3E47G14G zY<9YrZA62*p;(%JwOl(f70crenAd-EnC(?g_{=C%3%BDFQa7+w~L zQTu*3uc4TjlX68z=`FSN_WW{M)M*6ztOJt6PoWWWp>JbOcp$Ht7DnvUL-W-8i!fy+ zC76k{goS}@rua;MVqm$lArxq+H&C-U{4J#8)+l;a{$4njNtFeORY6FMR^DEqu~IMe zuIPXhE9%w=*=ZWzR2of{N&2i)wQ>b?b@Z9C^DhW;6?GiQ`Ah zQcP$&(9^LtFF*07to{Ao{DS(UbMNrY@guXEBq@_peq4lFo-qh2J%;d@tYq<1yu=DT z1`+zn_=g)Mmhe}fHivWQlF|>%6K->e*>UtxP1%OaE5S#G+!-$cucsp)w(y?lj`2>+$cJSBphT&J6b8GhvHAjX$gmVemI{7paS41=Jp2s(FC!elveAK0NcdF z+c~_4Xk@Oi{DJe^U+WJA|G~=M%t~h zL_REUcyE!jED%e&RPJL5Umr1a{vdk+4scXH%cn+RNVc9O@r%7Dx@jZTC!&xs>P%|> zk?r=Ii#|8X+_#Zua{e(lgY!gblV>g%RaP`Ja6Ky1)w>9e#ahs0CKFGzKV}mrha=ml z{qW5DQ=0p4zj}5WcpnRJG(Vs4lk{?KO`OKlax=Ss)YTTBOD}RWO`C(1nUIh28G^az zk)p{&R=RfRRbnWVA=?WV*9-Oa&!jD%O@=zLqqaDd5kt!(d3zB%W?pZxGqqzNuII^T zktx{pq7@vA2Z!XnuiD20A#x6Nn#X|)$=z5VU)aDgLkrpDijzFzZ^bN7FL{0)#S4We z-V@KWz)Az5TRD;gm4-IPEmvsEgZYMZ^`HHPw3A&par!(Ty&L082x7~>k`elML&MWd z!n6poR1bu8>P3pzvBaoAqYvVSPxt6TUxyde+FdrntEc0wXGBNA4N~+31o?)R>LH!s zhofU`P;y)BCm`sQyijgDD0%w6{pz!OKD$&M=b@%)TLcS_J5pnMu~T3J+_!(+J$@Jws!tn- zJkOzx{|e)j!xyv{KXmyOaKq zOUxveCnjw*)fcNyi#lcmAEM}|KuZ=pFkxP$rp=NSISmUBf(*9_ITQAG_{1%MaG^ES zc{pqdr+&5F`Zoah-^rc{Ha$jCZQJ7(>O!Y>>8fB}D`GV^3Qd1~nEc+pvw0sX))6*V zA%Q0NHfT5oPkH!BkgaxNlYA&@zJD-+Sc0QV-+5&?@$-p`^x6sXv^Le%U!t}4pVTgA zpG>qwxRqU)-9sv%hB|Fy0t)HQ6ZP>wX|ri%`nVD92ONy>R)wgTMk=d+ybrTR$~2{$ z(6y^ZvjwX^fE?`HBxIebAcFR>V>8jdh>aUT^is}D9pTjlOtF-%r&X^H98r_&T)PTt zY6&<{6DwW`V0!}r|DU9#!AHjb9A5Bpe=-!h-1e@jwnlo$evb*t=+Ij${FOlS24xcL)TCJG|yvM8J z%vWJ5Rk=R?J$>YzhA=(I{hcw<4NiO>Pp&l`Sy3)I@J3WUl1PI-Ja{(w0`CZu*aOzI%#WAV0z$rd)z87X*EyzbB2KA$yo(e3VBZf?v9a75#T9x?WWy4NWZz4;I@ z+zj(f(#vYMmAG2i(N~opJ)jvdIo%j{iN*X3gcu#0os)GC>_vPzNyop5*2T#a z6R9^RB}XBA7x!H8Z!Kpz6U5eoJ6?L=$?8j$hZEqKx9k%5ypNpyk>3Br4_oaa{anwE zia{0_$!|E*UFot&rJWIKi_;ay7NTV?0w^j(wxDb><$mJ8!{U~!l%hQ0;f{ePxin5_ zJZ;T%kcUMaMsIatM$*IN&nDgtPQs7kiO$5M5>C}xhCuYo0J=j5tiRIR!eIEzP80EJ z^*STrowQnp@HJRICNB;=57UGqq|#+pwz#O+30o~F+YCn8f+?F+iEvp|pPDmC%$t@% z?NIqhmeVILt*tEQY*cM`#|9155zo=({-~S_t`d#ti9~8% zjgO{!EvM}Eupaw=%cA8p@kSS-iMHg9m8pCC<;p#)ZZ^^Aj3mJ=+UOuJJfAIC<(PgK z6?~0E3%0}4e4B~1Hewl%?@f?Cr!J+)-Sdf!;d3!Xghjfgh9WI+R~D=#1NkM)3D3px)dq|B6sP{OCDj=z?Y*)QLtYh(_FKPY@(_cb&d5dm_ z^|bT5fhot%nVddD_>GbD2tUdY%qwS$w-BoukUaelT~WY@wqtY`GLxg|m@t}Awab5s z+vHl}8W$Joo)%@aooiN~V+n4nJ)pJ#$u498TdcR)ix7Ycw#*Lt#N0c9ITs;C2bbvo z4JWBJsPK1c;A>~T%c)POkNIn}}C)~85z22jJ$FiMZypfSHan7Z{kW?Tm4T;CV ziRv4W3-5+wcpX#e@i zGL9}e0qhZNr^ckBw@^zaks%9Nz!7SJ=l_}&PmNN?5P^nl>|J+tQK#g*<-_5NR$#_` zcGZANlE*641+AJSS9m!NsH7~RBl3PF(B2D3pE~DN>T#r`05lG_!;Qj$;XXsrFI=BA z&_WgO3b9GhaXAyc`tiX7@(Swd18=Gm%vug!tN{W>(vneW37RJpZ5U!2*Q`;!{^_$+ zUHr1QrUnM;jBtt}BgY?&D}5=J-;J zR(_z3>Xf+lC|B1H2626V}-gD;ENpzK2PO>|uRE@U!}@-_m8_r&9Stk5cT;wls- zo4BN@PS6&oO(cxy85nqmS|NZ90->uIYy%1Q|G2&Di5qrCao=hYljVrusOT#L-^969 z3L-j0Gvv`S^FcLCY*bv(vnTIYwk>xgHh>_e!y4>^w%TXe)D04OZ!?yKZQ7r*pdiR2 z@hv~RAN{aX^{{y+nwLUdebywYPW{t+L-auX?;4xI2Pa*L!T-`*R_;o0*Icbpau1Iy zqZ{BaKwNZKRMedh)IKG@vNfXatNMo0jm7rN%X(9v$ycL+_?Q*v>lm9HyoK~>FH3?!8U5Wjd zwE0)*0e&Fd8{;V?nZ;EOOQvB&FX5ul{};^r#^i7{d=1tBv&6AkJ|Pvg}aF>kuGOX!%5{Y4QNovqJFli zc5Y&?Cu}dh^fiJbMh=~fb36mKV$3Sl@Xt}L>iLM>dID-lLmmI;w~!iR@s-X+l5(rH zme<}zWnR^5UNc)d%~VsdBpAy$M)_|&8Kx<6RNThxXI zJ)S{`Tlu=;oMaDz8@i6^Jb{2Mu7DF2H&TLC)liiy@BXI)%+FrqkgOVMqpR%ccIhJa->)aG{qy}C1Dk5W!UbqW5ctXVT^oEkeQh{D z8?`boItkjn4EV*gA~#|moLX@Kp%b}0!w}X z;v?Tevd3etnnV`4Hw?VTxON97Auo1<45|)rB<_1?rM1zvG;#~N9WARB0C)6S<8gcI z`~5JLxr~cPk-HqwKMVDBiQmea;#}m|RqD0@(#ni*RbLvRIJ3ZIWoZ{ws$@`K2wh#o z(;f76`WiQId%|((&i_eVZ{g&81qDuTo8_02!giKIAY%~{B|IKsp?T>~l z-=`YM7EEFq%wjq-R<48q=TL^U%mhD96EYMM_(N6K>Il!)&!%}|IS%756ZT`iiK9;|covyRS439)GFPV~Qp@3c9f;Lb6h{ zMweT-5{=a*A3Z;^|0h(xluTw9*>xl1hrg`D#bBt#E;-i^2|tLknBu+Q5B+|?MmSiV zq{+nXh5p&ZLo@DV*AI&^a?#FY?h_Ad2Jg4%d^g}Bb@FHfuo>0Gl5^(2$@UHoOmjfb z!9fc%2#ncC!Q_MERK0feok@Pxp2uto85R zc-ZaYV{0Asl0_Z`a~VCW3Ts5eEsD(CHb01p=0e25&Np&%*~wS%+6;NTar^hDS8XxP zy%VxM*|@O`(gEB4bl{DnJ``+6;zrc%&W?&D9ZtM2x_(DrFQMC$)kQHm$E7m^{wN@ysTT!wQ{$|evQe*@P5SCrgAMOt^FmM}mp;*4nD1>&WdYxR=)_Rs z$l~EMg@W5T;@$41Es5Y5fRF2tJ_|oPMVVPI(M+ef6rsM%Q&}pDOZ2k9MTj8=TD*YG zLt+-rey~$B+VDdTOYU3H$CtMk9WgxWTHw*vXtmLmHg(0Bv|p)4D+z6b4=>)fFOevE zkBk2E#Q%w6y)1xeNU_srV&xOSr4#2ggIhmslF4`8T;PbtaFYTf(UsQZcH{~t>8KYz zR-4R3mpFY!g7vo|_4;B6wJpS3xWpr3Ba|l4ll*xv5v^x)__j37pZ)syB+OG={M8xE zhK6H5hd*etJyj<&TJXD9@T$IbL+|(x@Gm4z$&9$@z4b z7*6Otnz)iW143_V2t6pbKg}d{KX++NySYD=p`P^>FrgN*uOV9CN-nC>!@0s`(O!CD zVksYSVX?F~wo`P5%%FwCD)q2XG72ywj`oNms77s37rpejBRVA76Q?gYsGBhM9X{DY# zP!8FvKkhQjQ2(+-jFv&#zEIjPIL#`1b(nTr$iIwKDMX@?Tz&CwH1wJ3`w?mT1v)jh zf0mT0*{!cWh@N0@k~;e0S?6w&xt&I`$>RylS5Kl$u!spn=5FeKeMT5Ejwx_}FARY} zf)b1T*jl;>j{d2VK}jR`pX?v5R7vGKUF3SN{qN?ys=;!%#95_ zh|kxE_`$q22cM5bAyx4wfQ>=f6%h1!43UA7t)3dPbFz3=_EtPzbC@xNE)L+A13g{O z`pEuer;u!`*~Cf&{Mni5$H{sS8%`XDYi|A{Xa?~|^Y+^-nr1RvY#x9T3%k=G*o}Di zkWyrB{%AZ}QZQc;K~qkA0g{5JZPUiXlpX;EqGPJ(gXVSAj*$z-yoJ+d1JC5?0cXoI z(iRyB2R2k+Tk1gf{{Tux^T%V!Ln23Qn3!~X&4h&%or@dUuW*8UQ7WA z|JD>3saJvxWV3@A%XP^0AY2FkO~#Ek?BO%99YZT@;3OldQ8Q{Z=foD8 ztuB6gblxJwVHWUsXnFsC-kEuW*q%lbBA3QSodneaOKB(=-@h?b9`=$Ee+kJJqoFz6 zK}nbeh*3&vWj>C8j|ecHvCy#Dc7!^oW8e@PXG=1UuWYbVAo0VfFYdTmxE9b*X2Kg~{cN4|=&>XHu4A&bYMLr_6 z@^(0K*N}G=$k)=_BTKe*OzZH!@$`yG&-KfUV|B~ZDk5ZG z?c-=`{LoH~r(l^2c#SOg&MQJETJnaF&b6V3h(oq(!ht(uk}|Ob!52!Ub^aP9GF^~! zlqF2LLIV%KLUM^6GkMPSw9Y>7bJ%l1^IQm|hWA1=kW;m1u1!iqXqupHb)>eYva&FO z7MnO-DdJ|YoF{+s&gX&8F<9UnCw;=f0JfC;mrLDn?Z`2{UcB`6*?Spo=$eUOayV10M$=qgdIFL+OfVof@ERwM6^t1m7Y z#VtK6UooF^;yu-y{pTl?riip3`!Hd(=cSy45?r!*eB0h#;P`#WlPf+8G(1>XeE%vy zzzdi-vi13pNHQRKut&Y2TM|SS2WE>_?4F@dC<()I;a;dUjcuP)o3KMVf8NF$NlujjWqfz!fXZW04_& zgV9}JfdZ=?epW)mOj@z@Kk@lvY|jr1F{3e$M-zWs3JL!8QEva(6?RCiJ**CDka&CH zAsxhRbkV8$wYdDpc;ZQ8t0;M$mg=fMkY%^)C^8MP&u4?J@2e^n<;wz*JIyX zNwnxti#aOVt4o>#|Cww511`>M?nLm&` zxgXs`9T;e+ku<1wefPOU84ver#yL&h#3gqT1y#Cbt0zK>=n6M}w|`i$uy`e?NTQ0T z4TrEP)r3)jhxhNr#9X2wqSt}WG6S;-E>@=(Wzrw{QVq#JTg8L_rv~VQ<`zZoMK^r_ zf#*78(?U+wvZvh-wKKC&vrjR^4pY7%vM-HTV8bgy#u^HrJqHG9V4f9_MmG^DHE5Ze zT@t}=VJnV#pkEjITM3W6V20`NFVn9{fnvh>UoxEl-J0^6Ms3SBGp~}-B>l%$6UZPa z)5gsp9qIrJJS7(EHYF4w`__>oA4f2y$Wsn(^S*GH-mPmENP);LW)o-WUH}ft=k&KIb{n`vPEcY2~qYa z<`gMH*&{R&p>5hU)y%nmm-pxQ{o}sxzwhas>s+tr>-l^<)8k&Xh{u5VQRK?_fNCxC^-iWzK8tl)o=N)vc*G175rapB`%6vjTBd zl<8uZabQ`No%7Pu%n7sPdEgs6wz)Ir-^d%GFGW%naYvJg4&0hVL=S)Obe zZNTe))FP1+w=(~3&{|$qA7!MSa3`Vul3B2A}?XC@Jt*)BXsVI|d z7)YaxlQ`=8G5o3EU*JB^DWe5wJ-8?}RNm@A4!FbB`#|K_7z?x(DjkPV zJ!8ikBO~gxFMcVOq?OvM0qp+0MA_Exzx|UKtrB(M8z1sA@LkZXIQ;y>s$UyVvIHxq zE7K+0CJL0kOvdpIQV}oyBYK}#0y9VcO!6?JaS?fG6=0{VfQu=SL z(gu_7nTRB3jEPAr$DE5`$TwQFX00);OS^~W6GsFxB8?@pAxAVviw(%~<)5-6WKip2D+5#Sa>DY_Z;7k7SU zjpP&Ns-@$>7OZWHiTtC*|5gntOeHoPd}r0%Q0|K3`Hl}v&P~`}mYiZyvl)xvXG~$N za+Q@L3>Wb#78n^B?Q|xmGFRLeR;DMOFfgtFrCcxo<`^kQKOSXQ`}6O(VX6$YQwsmb zW={c+H>6ycL$CXjRSfGrt`IYjut7CwcRw|ZtpMAk4}`ur;%2_mtLgik(*b$5s1#h% z6FF-FQH@P(7t=a>(Kh4&!c>xysVdQookLThqT*%DZh96^ySfdEy4%u!>El$X5yuFp zqRAyEb&!RuPDolzLFW8X)rcn-Yt9af?rC;zKv!rhfu=xSt4Md%6x2=r0GFy1cVk&H zcZBO`b`mcF!@2o-{P7$im!7DnwuA)v%BqpAhj+F9>2P zy}CrEjGDL~<@+`}D_`$QzhM7sz6-xGSNc^)Fqo=y#gl&4VGdU!$v;cwdy*_b%0st@LFJ~o5A^2S_OI02~ynRpt_@b!g<1Jw<1 zzts#>i;4>oc(wukeKTUIWzOm^8<|B@$d?wRLbI>GS}jt--#vLiGuc`>YY3jUVq?LP zo-3)~1iVvZESpJx{{dgxT+$5ci?Jkl=s)dN84$`}N=ne_+3x#a*jkY_OCJA3<+YA$ zf#|bqn#y(F&Gj}-Ede70VQd-dJqyzQz4x3bBa-3PIqH3{BxVz6_fq&tReSO>kb=>O zc(RVqd6Fr9ivYK^;5abWaXJY0=}e%MFom-n-g$ce(sm0C=~rSHI|d^`@9I#jA(j)uc!bH&%e`rEXIZ< zHUKxUQ4bZ)oy`@?1u1m&>aO|=Pq%D&Cs%xi_L|wjVD;L^iu@sOg(x@m z8(e(4@t!*pGzWoMcqGn^IU9X|5v)>#TEh4q_cFxkgb5Y-?K;YlVfidqG@Mfi<;>HO@m?gB=y|t(9$wEK3jN zJA#&>H@ho?OMOq51hd1$*k#6f8-!{QHs95&-66Yc;50&d!zgw(Sj9{*L`1Zu_oT-S z)mJbI9aM=}o`5Ur?AbC#CGreOIRG30&07g=RHB>Muj9!E1NUZN77jqz~YBYot8x zdQ0-*h9^`!+*C?zYD??v=o4*Ua(x88JfG~m_OiS*`DPa4nRYLrkBb`P@f90lGD|O!(HI{@NWPH~C zZM$2gKa9insCi589wn3g@3{=YWnuL&f1RGkNVaSY&PS2FtP|q(IAtz=iLH5{-580@ z3kv(gu`r>+4w;q|j%~@$X6~8ul5z=A}S@FZLEJ4D|^9x(~ z-9yNOE|2O}uP=nO_CRhutv~2ad{1K!k^RJi6?_!ep&@JaH$`gN%@o+#c;Qs; zu_-8}GHHf<5;twEtS>Q{&19=qOEs8Oi{TL40F(Jb|GEFh>My21;)*3CJ=sQDcz_@8 z{8w%FruKy!89%(3G+ma(1T1w+kS!D0rJ7ATsM*7%6B$W?|A@U#q&?=#DB8mZCF3Iz z^AFX6y-QO%Z#-bYP^T?SUTiF%pFC!Xv5W`avu79AhcDBNNm)r;?EI`a8m~BS!SH^L zvb=`KCn+_>Mo(bZ3~`RTX7A*#vnE=-tVUs#3)gDvi&o4qV|Cn?flW_>=1(VMbPpev zPfyeab)bTA)vISB3i(e9=KU;4g$cj)vth>(+p)@IMXk{uu1Cthq`xQg@D}`nQ-(7@ z`I$_&aS^5pG%PMe{1&m?Jo#{>EKpI~f{`Nx1Wkyom>twyK(deNrZrHH75zyZx8Fd(^ zP49n6zaTKUU!o^a{$~%4SSyp!Qs9Xo6%~5BcqGN_^g(xl^)|>Fh2R%w^^_6G4vs(G zC1OEiE6FtYD^BcZpUl8Si;RUdX2xPX(gZbyFM$ORz8{z`-J z1ujL^2C9@{yg6ua7>c`$fI9y;Ks%eEKUX`~Bo3OKk|fUk413%Bq^_VrULud9-+`nr8OmdOh>O>93 zE)9xziDOqjo8(cVsKsE;EHg)t``~XDDGR|qRX{F^Sf)QB?jcl8y$hc- z!rF|T$SUrrY0@r(i2ilU4!=V>A}Y47daZ7H1v$IvhHnJ^gf9Nov*Z4l$pTsBJBF(c z5qB}qE;SLqOYl0VC?T+>-ZKpt@dnZ;V@jR#R_h;fT(Mqzu|{z{%GT_onpPpA^imAV}FI|btPTyG{`>{?N^a}gx6v$jO zQNRc%YqOA{(ti$8XoupP0Kttp;n zCBMX$s`Wc1epTPT5QAP`Jr`@!Avymx>7z+z!q7l6CW7zLwhwpxo1R|$O_Z-0TB&5PmAjAMUD+D{>u2}pD%eA&mP=C*4@o{5)7PqWvwA?9~ZDQg27(c zP*rhVB7lYcW?s;)+wr*Om{PGvUrE-nYK}gj7;=yQCUNs{=TOi;1L3DRuBbpFx z85v2+HLGJ=BgoSFqb(U9|MP}u*emE?)P>i%q!R&-cW z-$xek&o=cQ_<-A6Wh^FXTKAzHg-lr^tw9sWIm3($vzDHmwwRt3h!skAl2rh!p zCBJXr|Jfm;Trjp?PqqIj)6SsuC<;c%@r8khP=8qcYE5jPo|GaMX+W)1Hp^XY&)dWE-#O@ldg_j{^Z$822h2gkncsP&=T z6`DUjR6#V?BU;iv@TNmC4?b#vAM#bbMg61K{uY_h`Hk%_pFL(Md6dw7liP;!7oUyC z?lM;5C){Q&3rsH3sd>ZsrLS9>25sp}ZN2AKTLmIi?`KL$29L=iq}m;(wce{26BmB~Ova zBxB1G>-CcU_iWo>SzaQ$ttuR_RO%SCxmrEEW^2f>_m-&rb0k(I6JrHdR z{wBF!G40i!qW|)4|BVR*`RoiA;AVo}m{-?6tt+|a_Qf-Q>ZXhKn47iusrJIl9NURR zbX2-3^aHeUw`s$>33}N`u4)~5%U;UHelYeiYWusc?4s9wDVPE;bri%8a8OCFcD^Qk z5wOQ)Uu?4U@&x1-d=I0D>u@sHy=7A|I1A%4DxryWpJG@V?PaMx)-0)~vD!_y9O-?* z9=Rh)Ph*~O3@U^0zxUhDgcUI)?EW%#tvc- zX`J;WK{vI-<6X)ArTMZ(#zA44P3?cOf#lYC1rKZ-V&ls$|EN9Sx$LFpSpV3xt{nQw zSNeMlG^UrppI&IM8%MW=630%~XKlLj^7{|Q@-85R~t_~+O40RKyA2VpBmm=!sz0BGO>rHXYNEe6$M)0ar0Brfr6+`f;?dfT zCAqrTC&L{kSdlPxPRhIyvRo`OjO69;xDC`jefbXB>(CT2Mg$U$+|P?8h{NXK6ge|| z$eQ?0U3w*-8(v9DeyZGe zDl+@x2E*tJrxZpreks;2c?psX!^&{)ChP+~ghA~kZ@Vv;rF!Kadea6>F-t5=4e$g# z@DN?_5XPQK-A+8yOx+ES96=!hkXVs<(;<^o-RBKpuB?RVPUIBa|7enI5o_Mb4fqQ; zR;B0D&FS#B=+jtYzq^X`f(F|JP3T39ftpZ4H=XFeDA`>hxlo{SE9rBW&{{Y<$Hx!$ zqgwEKWuFN3aXlLEOZ2}f`SWVdYa?cZGK)wj*p)!cV-9FSV|2m`Y35S-&Pu9MxQTY9A6V>Eg zg99ASeH9&QNp(G)rmTKARJC_8n9g1>NLAvi-Jmg~2v~co+<6YoNaM1Jkr_H6;6p z{@s#IzI))h1f^Bq@0{O$TSG)sqWk72bh%5ky>L#>y|J(r($%nm(AJHC{SvxKLeGXh zpNOXyh%>EU&|DX$Cm$9tmYs1;S$&cl|G=0-Ev1tF zF^L@=IyWkpZ#(n@bJmgZJyr`q+vnmv>&PoLM#3Q}g9fSJgq9lxW66`8(8^8>K77ma zjviR>J>3lsZqy04QdQ5U_FEyb0gZWqi!xlYj3}Y?^;`$Bq)y~DrXfdNu8Ut&P0cX@Z3Fk#HSr~Of8Cok-wj@vji9}* zL5H9P^?Tsd4x)0^mM81cYnO#&q($yy@Q)ks4Som0HM^UMO3jZOF;e1zHm?5RgEw{1 z{2Bd{oglslM(B9k+(8i~RbSJUgILXEv{`E}=`!ArZLu@03?oOIkoEK$Q!X|B#!~Hf zg@#r@_nzZbT`{nZpcV9^`mcQu#}cC0j}5Ve{QHjF!FT;<^2Ngfij2WvG6CBlRDIl_ z%V``${iuq@ob+&qlSW~NSU5}Uh2SJhH5CHCyhNjQCD7HyC3zyuzpzc<0UF5JJ_TK9^YE z%jvFYhE(Q{`F!})pDLKh2{Vnqm@sit{|9BgQX7P;ZcNoSHA?7^k3E;~(x+lqXz$j< zh=C7X=OZ<5vo5+JT=jk=vLT;tO=g+1GtOVopEfI+WCOO1{BTqZb8mg;p~CVc#)T{cP;$UT$I1o^991TgJ#i zkPRbYj=3~u1mtKq>WT|6N`0t;u5=|NyMwj8QvrEMoaMBnsG zMiGVDT-h7_ngd3vhaK>G1;RBOkte|O>&UmkF*Fdf8GX4_^>HL>k!h$O;`7-|dG)I4 zs>Thw;UNcor(RIIPF5WhG>FBHAdwV1qMoR_4H&-^b3t-sQjbFT;(U?yrckw4`zpQ9P$zJ4;G< z(p6#-jful9Uf1ho8Zx4Om{Vmtwc3OMcO@Z&0ezC=J=*nbWbzVd#xEh~;!%rKIcXq! zbYC!8{lb+D1TtWi6qF%+61chte2p^R6wLY$w+yn zlRAy`;F71MSRF@0!eU)5Dx*m_pQ$2g_;LHE*RIBY7U!XS(spbDpZeQ|CrbwA%I#!Oc4KUOYTg3jUlhd z*DvsO*9R9oiEXT$F~O#iDVB+GL~)b#MS5c#Uq6rGDod*2(L=|uAS~BT%w}%a%V2*9 z*|>TK@k>*8XZkoIUX}hUR7I>hJ`2Hg)k#mVvfz3L#=QUX+WGK&=PXss8fZ#yMlch& zscbG>NDgAw(hW5}9?J63J=cBUWo5Lf2WLmlACx+P#Ns6lOj;Jr5s zROfm#y`8H-`(Ao(Cs~Oum2POBW z@)1)%nD_oDS@8Pp=3vf5Gmd@Z+=oVAdSv7?-OIX$ZLY z?qh+&k)ApItpd%-f$o${0k>E~Q zTH`0*JA)Od8YKFrF4lDEN7O_N4Vcfdr7XD82yGo!;HnH`$Oxn9!{b)Q)USZj^BpD*+y@*~u>7L2mX}dcPTXkH>u*rTqFX z5$VxNi&OrKd_6os+TJl6QZFpXc@?1xj~oXh?Z7Ra_*zfam@xn~vJI`wx3z2uy!5{7 zZA4^Lv26j`@u!a?{tgtQ)Z>zdnbth2s@g0{8o&gKlkd+Ykk-4D|{ zYvA_LaGCuBRkqQ#z5*OJv|o2d=G<0fh9Ez!W1LNstAnvI{4jNV)EkwFICp-(-}mF&sjbpSK{lU{|f;pY6hz>_LEq zoioJ>o%owdj?h3n1b=NL)?06+r`f&$bSw;J%6trfZI}MbOSp$}A*Qc5{0~rhzIF~L zd`sRX+ab+`UAun}pZjnA5;YLNgGb{+mbgx!IkGne$*-A&M(OVBoNzh<7My5SM8vG> z*7qH;$@2?6Yd}!}PYta*2qsR<{Ijf$Gmh^;PNTfhmZ6PxBuaf{;FhV=&et)5aAi$S zYasHw_8bcY=@*do35)%dJP8MUY7u#;{ilF*l8Uj0LMw6x$l+yVk{?&lm;T>LVnD8q zP~wv~ZT4OWqxO(p2aE-&(IA>f9S{dI<0Hr_H=#UCH^U9jnuJvG<;QqYDy;Dxx!UO; zbx$CVmL4A;fp49{;@+dgx@Zqr$oi|_A0_|j01n`VHp-B_+@ozLY7Kz2XVf|WJ8wC^ zc0W8(bp607B*0npGe&GY15`J-m}KrCsW-WYqX}H9z0nfKC(O0CJFC|$$a(>{|JSb= znoJb+=UnhIg%OzCm{XGp1QG4yYruiPY7RO8|Bbf`K=+0vnhK0!iNRNOdjVWIMi+jW zyA}411RdBy2UV^doW$6wYf;!tg@XY2P-B{hure-yc!tBUQhgl${~zPAuKLn-Z1Iv( zzesdzq24hEv*h#0N)Ux-c#xxvy@zp526uwi!O97Tf~kBf$N4Jkpb4`)D_q3Tkc z&J&?;AvVE`dzMy*_Ejnrfj*Twaaf-a98z1FO>Af+TavVXNRIUsBPx(cKqlwtO zUvv=;@F0&qR))!}|Ag1xIR}CmlMPDq`Y$R&55mI(6nXCc-mOX@UJW=3gVH+2T{wdak;K?_RpDlxgdM54$4|&_Gd?GudUW^M<%>Zx_}Qx zGs=c|V_ply%G^W70tDGFUd&8*v5TPybfLzCN_wuNWtRgwP;aLHdtv?^vbJaOu%AH3 z&_wRI7rh|H54lp;fpgKo;lF844sRJGL?KY3$lGk9pJvAJx;qQ2q zr$~Q!Ct+cN^74!;=er!EVVs>Rw8(o0Q~5)kqQ8%p6u$$9(AvY@RGR~57jI)}FLZ{E zgj1X1o@*spD`CgCYJYN?G3mlaJ*O+DfGEs-$6o1Bti`8VAoJ4!qJu!prdpr25?9Ci z7Qyt}_hErWl|31ZvSAqksQ;H52U-|UhEoH<*m)S;(!C5~4r;mhoLD>G zPAz&um-ZbyL#&08?2YhbYycQlfA0?+ijzX}$2fp9xCj!fliFoc3b*cn0azhUe*OJn z<5~5rp@1{l3YB>m>I%!i=m24III31pYW0l7GSKGB8wl_;Bk>z-ss6uLXXw9kbre@R z(`a!v5M=Gdgjr)CP0^^ue7RbG zuyhnI4J41U&T&Zr=mI}x22Yb-!CKsXz|yg3Rt*c*o09^ob}w&~Ig!hGXH&@ib$3>e ztW@yzBi}xLDcVEtQHRbYw)BV=96oO#O$J#xrXy3X{%BvauH#}QjC+{5VBZc}`M&-d z;zJMI7*PsW@stxLG4o1Lja9lW&}8S1lB>!$EC3X!ojOU6I*c%zIi*^n;3+I9fd#V< zwPM$j7s^tZrYz;+d0ehQEWrJn_EWv}Uc&;C86^hKfrxnS888LQvx_%)@jo^V8jFfm zfZK8mkt##P-dJ@-usEN$YZnqTc6(TRPX>}Q2dbxil~_I*ED=$U1B-FgH}~^6RlWj& z={&ZRzq5}_pkl#c-C)0fruFtxPx91ZHrklmTO0QRV{&OZ8STO}i8_VlFNXJhLfQ^v!<>op3dp?Tz01$^R z%TD6b@ikUAbc-gMgQbj{%&=d~jMdZ)eOcKE;0PTBvQL{amyK8&KkPXx-Vi*fm?@3N zr<^g9O?E;7YCYzh`zaVa@w8Fm_RT58T#gl#1lIii#lIs7?Gzg_)8zs>x78e z!NY3LF=Z?R^4%0L&6n+A)UMc0oAyG_CwN{joElWllJfx*HSkGCP&yPga|lOj0-VVf z#(B@=tNA24H$z)7wO1f`wu@xl8RXOt9toA_f)TtR!^C3;zBSea3<0%cNjn1s?6YPC z@5V;yWKC8oPU<*am%ikC&p(5LnAFq&G0wD&KN*P@{gN;-h#<50tA2u;w#>rw$C*@) z#rl>UGPG(ge5M9bNN8>s9C}TKy#FRGI=$qLC?TZaTrb+o6kUB%&#ATHJOrp z|K1>K4ddT}<~FWs&jzkC9$L08U@Pr`1K`{<6dyrtG3Wh3Jy(_s!gU*SfrD}3Su6F@ zPr4apF!U=ob`+>Y#e&ks;8q@C-%MumgO`Hfz4JTC8)N{UN81Gn1ZT}aAo(cQF5^D- ztCE5tC4U*+<9}3d`_OlD%0(1KIEYbx_lH_Q#YqqHtaI2zIO%Kp>i&_-6~BFI7t#gx zlnI}zc{wZ7Nj@15yAMSpzeDs3bm$~*Y2GPh-Rchv1vQMK*7A3Qu~j_+`OTL4X>Abn zcMc!MkOy4@v7?22%!S1aq6W^R9zfOi5_E^e|NTFEqNku8%bUjy=22so;6kgEMW$51 zG+h1C3B2y*^eZsMI?Pn(d`+mov;+HmZW1->19NSNI6rT?gYYOL zP@?qA1zs7rVErmAwoLD+K;XK(RDS|ek11U&PaJlDf_iQPep5CfiM_cI0!@K_tMx~p z^@*{+dQRnG>pfq=bqLSV#_s$i;?VIQ(pS*M&xXU!SM!H4$)$6_P7CRKL1YQsJ&qdx zp1!-OLaz*Na000uGMs$OEVQ&Iub#!CMCc<5+F|if^v`i#?O)LgOgSL20`biF{_~ln z6aVpg<;Z2Oy5bmFB=(gsxQc-N=)!g$tP#ZrAa7KJ5lKk+(j}hg{aIm5J^h96FhE_$ zHpyF*+gIV|7nxxWH>1INY~Ifa$`SM-)3DooY9n=tFQV2T(XEMr#M%a`S2gd{uKg%k z5XDT`aI6vx8RVun159PP^kXN!!88lX@F~N4ENMu|rhz+K)EtfDN0A$?y13{^`h9q` ztejYu1>_q2e}D69N7XT(b(8v*+@{Z+EE}K=`gA(BHGY&JjUAco>A{TJ z*_}Wz0OUn~{+rSZKePqTW^DvMi%K1^@>PKuz<+Nds08S;=s_O84el1fi$35v=fGM$ zkFPK^sK|^ZU5JeyWafR7=Wp_hDt2ZiY~P5#(ob-X2MbXdmztiBPRRcoPbP4sfz~yL zp4!TUs6r^hNUp#V3q7OSva`f-|as)QRqN6OPgIFge%f@$P(+quM| zg)3gziBrliMeI)Ukrnf$>P8Nu*K<&+t1RQwt`kP&)n;q@TvHrbKxb*zO*usDiWYtJ zd7M7zFu0%3QvN_0(vJm9hY!RPLgUi*Dey!8s-VynTEp&Y7P=bEJZetf`=&^7l_$aa z+4ms>70G8e6BD5O5KT;~8o_EV9tTQWunJ#j6+a5kFp1Bf%BOnamyJf$G`Q&^+MBI> z&R1Hl1;W2?>fU5C)dmCK^_`fHt6wELdhuAP*~#XJm*>V}>#2sDup1!OkTk(Yh!8q*T9l*o88bICQtHK!8&Hv_IW;BLD#uey zJB#GrZ;LFqV>__m5b=K?99t-%hUcdhPj3Y8dWo~(NFSlOasm}iUVaF`68iee&aMA7vhyhuzHnl-HRr!qe`eOk|Bh>GL``y>RN;!tSM82VdS-yN$_$!#=RMF+EMZcE*GTgH`; zJqYQHPM1whSX9Pi)PbNpK6NyQTSf+enqlZZa6*mH(DF0XHBr)YQ}e_$Isid=6jF`M0W4smyYb;Fb^boj6a8#Gpf(nR5I<~r*JY& z%mEb*Dfh~z-At}nSh4`@9Pl@Vv6iy6 zJ=GCpqawy!+Bth2M6}LZ8-=vOSSbmHh|634?49}b7L{lfXnMsFnj<&)IYE4BIu^w@ zU%3&AZjJ^`+WPquw?2RcXI!NB>F<_ga$-q)&aTi$?mo{HJpZSMfE)y%&5p|SBj(R` zN9m}gqWCAjV*Y8WNF_@i3c8k3V4f9Q)4;rc=!*|k{^WV< zqSrbeN35{bb{RR?=k;Gmuk2h59!9mWi_4NpTxAY?$Uh*ieS~M}MW^9znWX(x3rcRp z^XDpUqA1RV_muvGuW=7`sN>`oSbxwJOJ&Lr5Tq1IivC9J;*pQ4%UpP0zC+I`r7>{r=l+sbrz4b#l3EK~0ZplWJ8{_;MO7HZlpF7dn zjHoz9BnpoId;#Emk&F>Ry3*NhaycSlpiAH`>?SjQeuLt;J~#z_aZ9`pj%H4q^5X^A zVa2mQf59fT|)yp-+DE zq;50xMskFO{tdQ6r#9t0^!*@pX2>c>lFtSd6Jf-C#tta$t~XDGsq~du5yj(Bu>c>A z!`>g_q6B0oo*!YL{8jsE9@~8AXV@@bj3wS|g%j`^U&?dQ-rqmz94@#xsrzoNV$A8` zhI*q7Skf`b4DoOl9|aGy^jn&fcVI{>Mp(E14LwSxEP8jpWb2|3GuijdQ}E`1NGbY5 zp5b#NKt4`ogAb05U2CZ%GwBd)#8B#RJNx8P9^o$bRxlrcU?o z4`tX0zEt&}(@|EJxA@*e{XaXmW!NL(qK2QmxpvchN9hVXZ|erAq8|-xwGt{7cEI73 zgrNtAuw5|uJL2)nx^B98Ri)x=w|!uq_PV=~UvQ}K2(ST@Qb7l2i~pymY& z+qq4C2dz9*|I-tYQc3Zs5Q({AwGlTtNAA5OUE7!LKA5GMVuD?FR7F2$h1-zMz>O&zAEB4zTi6$CzT2zrdcjH)B0%qo;bMURey-uT_Aqi_vN@D@GGF2cJ1C3w2KLyzsznR zB%$!`*^am&%OQ^LnpR44K8nf3vXyIhu!%J5+%px3A3 zD%%wKhLO6mre}-eP#oRk@MpM5FX-7Lb?82#{lC13GCvyAYXy^O`L2qx5u9`(Te?TQLpSt%T% zM?Ydy!$yHvW7Vb)+R@4lhq#TXWIOukQt<`sJzK^iSMbAx;B|^Jd)QHYHjX-xSF=(C z9yY<$+m7#UqKwg>l5v6VAz@)l)Z5H`4d6FdzDGwI3@+ls{$m0)o(c!_3;e8~|8b^^ zU8qVBhNs%15*gyUR)2qE>hEaZNN_C$>RXc@sI60KjcjQ{)Kw$!)q{QcHH(>H)BEZW zx=$lnrOL@C68eI=Bwyj9W1XzM+CkmBRWXqe(+&)LuNv0~K2E0g4Y#O?05kFTsgAM& zT4@D0zUi-Da~H_=61N2LW9IZ7u=TtG?hB+3fJ!eZ`WobPFE*Buv{?KcGzsU8T)IPaho@2vNyq2%nqgmR*PyWpQ)pt~M6teSA;#Fs2ofH8E{HzQW<>1mADRdn0+%ZD0)Oe}l>mm5-7 z$SkgP{RoNoigvW}9d4{#-w4L?QIkrd3Fg0RF*WgS7G^k9YV}uvuoC|i)1ODdt))OQ zUen&%c5iWws6o^MvoAoir4Xaz7@GQi0~Uw`BoOkl)^7$U`QARqALH|HO_MHTt1P7v zC{E)E)M4UgJWq_f;?&c1SfNYs`%eOvckqKzMPFyiz{}qs^8NGdkY48@Q%PLuN3Ah6 zlHZtvx_+WHQaqfoFpbE0ICzei`H?OxrLAH~ZH34MS+bjrAC3zcVxac2mPV2d2N%qp z5TyiT_6g*=Eb<)o4WOvipsU)sR&g+~;?5g&jwIt z7=xA2hFgC_;V$nva$wuP$!sE6MAL+^GiZR*FEPgMJs^qKX1|c!*BEKyzRnBB;^RqU z=>+m_6tgz|clc*s;{ovtR_tz^)aqBq{qJ-`+i(Lc>%&4i{XH`E?hiSy2||Hc$ozwL z&h<~~2mvV5rP@#8%41mHU*gMtY@Rs73!hh#HHv9!L5+%IMX6B*2l~dk`C@^%)Q}ns z4v|g7*=y1;Jhx!lm#Rapdl=>t${@#JRqM7HOe%=A!;aKhI} zpl!7jrz}WEFn;_DfpT=gtMakZ0@RUNw9K1yLDcZ&xY!h!0MK{t-mBr{qK!kt4vra| zXr!(_wCx#_Y^d);M5nl4zeHB#YVeg+0OTdO^xve#WZ)z}>6-xw8j6Pe z-(BsV9q5|VK*YoH+X$>>)W1%fa{vzSYces0`n&#>U+A)m+Jce(eP|N3WGiC5lrZI5 zils{iOJ8Ddc~1Rs{YPEZAuG&7{k>Sdr^(Zje3Kl^l%JK)I`hhQU47u1s>oYU+Rka`qaEX*aVz31@U0jMcXA~^!~c@zQ>Ig*;^%V~hQ6Vmli$I5it7{$;S3Rnr8* z43z7~tz~3zYlN6mOI$*QO43Q-{YfzP!Nbvvgunr~wN)Q=tf+f$Dy-niyEU9V+J#?b_Z9T+DD9 z415e^?$LO+TWI1x$8DbnxC*R=I-~(KRSF4WRiR&DMGyhBkHz52WRVxZd~ zc>%BTVL*8D>zFm#%{DEBOZTi$^evYnrj`d!c@qS4K6jkn%lTVO`kiJ+@iTVzvYUu! za2>b)NA!81ekBS?&ZKf;dvm@KkFl~D;xU+=Wrhzm>i}L7ERe6UrM7H`7my7J5p2g! z!wVle4Tx64VA@eF;ogLT4e<8usZ7o8Dv3f<(FzUs!+C5wS7|=^+mrO=3tFWy6OF}p zu=4^jGWG3w15DSs$|*r?8Q9K5OPx4=+fDn7j29R2+FWrZn`?;-;G>(?11mhEne}J3 zO0l$*cugpF6DsY{)|eYG+DJp_r!}_^V&nyaFq?FH^7n(zwVZX$o$KJ-UL(_tE_6u) zR)8V`6HUWMQg?(Awb_wuli_5)I{hZfD=9UPKF8?Mo);7Xi1iz2eoVI`m!QUR|Ip*0 zZS(dWq+g=jgO}Oh29^4ql^@jLF6b9e9FKyGrcOf9#2_V@I)V zECHG$nnyA6&G@RfH`~(BEkhFKzaJ}qiAC51#K|s`6hX}w$$46RQ*u)4*B|k>;22y^ z$E@vA?1png?yeaY$S3o`>y=t-BNW_^CeM&Ewdfe~j_@4j>KEFlz$4Hs2Yz z<0F!{U8x{0(HFXN7VUs*2K3)ZR@2wJ9gjjkT4DWNV*MztvIcnbg?zG9y1QQAPU#uN z%=04?dY3&l4?``&on4ZxJ`1zAO?2VHzh4VR?t@P!$v-iqV^y>FuttnPkE0?Y4Xy{E z>;D~8rb^UvwycGSBu`aig_z%o~GM>b0czK4ekDy;lKw5z!yiiLKOcryn0-p#{RBk1l@)p7zv7 z{H#9vni=)K<0u->aHcmW-+?icez})Q&PXVQ4t#`Ml<>Ejm{bkD1iT{K0Wif&wpLee zL2Zgz>ItIpd3VaeroBTnO3f8TEA1+ok(5e|eK2#M|I_b%-}67GqtiK^Q^vi| z^ZkBS-R2%;$@}%DED5f5L8hXFQv~gIK-b+wlw%^GrZNXVWm><}mY-IJckiheA193mde(NSrjKWosNB$k zC;0$W7c;0Pv~YRWhAW;;aHL;M9x9t+Br#&=IjA={@Se}4s%~gAKG)dM&w%5%Wwr{Z zZBxSX0y7rX^Aw5HDJ};b>)G015(ht@Zw<7E)uvi9V$E-y73X;rDdbH}shRii`aV3u z!z^ZF^hB`R3aou3M8bx>vv9AyF!q`;2@CfUwTTBTUsd8To`pDO3M)jxO~ zBNnuhN*-rje&`m=?sYJdt8~D%p@0paU7ZT+R@=9dE zT(7pwQZ(E3?q=y&jOPs|xE4;IA|!;=K6d{WY)j|7_sE;K0{GmrMuyUp3+*HmK&)ZQ zk3?YME-za2flH`|_a$1=8(GBb?lKTId_FXwqU;7d2JO5}? z4T)o*g{_G7+y!^x1gmp+hCWsq

6$X<#fHbnV^Dy)4Qb`V}0<79ZcEQO5tH%RJRr zm-IrpImJuY8P`R=kA|K^e9MRj?MaE`9P`cyuJ%o!4d}~WJ518SiKU#;8&Akyyb@S02m^wEHPZTsT?Vul%E)mMhkH}G!=k<|Q(F(M9;QSFqA&fk9hWHNV zZy9<0ix;)fNHQ5^SpHdEmwKELpa~g+0o!h^^I{PeXk;v1hWZV|3%Z+v2SdLWxOHgHo^I9X+{b*P z>E<#pOCX-(O6rny8^ebE+f=nug_K6+yi=hokJ!SFb4~**L_ENm>vR97b6^!oID*qUHz*b;M_ZX&?4kzGmE95#NE*fj~cT9=C0d&SX7l2t&AV zQQHrsj+J(o+e^TkQLLj^&jWq|B05kMNm>ZlG!(N@4_>6k{tV*q4T*8AaRU_dzj@|B z#>WvR-f4>#bK%0Dxl{G~YT$V{ZRD7LaLrflIjpZWXaG|j%qNTJA=DcOBT+b-80B0S z#Eq77rT1a!NAdCmLV1FzLr!Zm9&)i>3?0fjI>82&P{9#(@fO35#i_IAKN*Lm`~Bze zDLuq4YlTe}AIUUko(2s zFGOWNcsm|+AazhopetVUd5XR9iN1K?Fp$vpd6>CdE*9qsgjoIrfyN2+uAVUt+s>L? zJWrB=8Tb;x!Ig|j{@QQBWx6F=G9-{u<}XSb%G?5+7?TX}>na$_Dx3Ak*+Q+iGobt~ z@kCrx3+lxgaC5URw#gS350i%vp*Y3B#mP66v)A&+hhD3#x?0%3VlHbsOCBMjgpx9}#y}(!NG+<{;|*Cw##1&H_`#P9v|)*2$M^ zu8f;uF4+%G4>-CB&wn*wHi51Co;pSMqf*>(DP+IWzsFsuE>fP|VfAt-pU9mFHf60% zLK%Jq(FZ7DQA7*XZmZ}E3~Klau?w{UC!s#(GPeD=WE%Ex3BmYQe3c%B=USsHhccV$ zR2;bN@aQV?M0ak5awKDIhMt0w9SPGdzrCPrOx)IwB2b*b-mnEmG9zouMO)fK&Ng`d z^$EGIJK7cAUd)Iu{{|Y3cr2AYi=E7msl3UG6UM}z6>%(BaZB{>zh~GJ2oYeTMI;sZ z9hNkZz1!fTW2}GDM7Qr39z0=-<+in#d?ALaZ^Wa2J(th%EV{jnztWHTQZS`}O z^`wevet0^#h_VsQT%+4^QB7o9`n*}F}tW)z6ppt;kXv_6D(?1MH0Bzy>JE!F;g z)4t2=x}wo$=uW|0BCrix+;BhJ5BTDpcisHwva~C2RvIdBlE)qW zH8(|l1QDtEa)tT%AN+;GK0@aaAV z+^BrNmYj&&V26ml%}E)gE=_>w{%XB)rK+nok{o%q61`TOG+^x*NSt4h zh$zU)GjeN_Wy7~=tcb(-k+A=qOt<=gyWN4Q&=788_|S{F*G2C5Mn*Fc55vyEz!}tc zJ1=|wp=!KjIdR9AS|-pesWM0##!6a5#WAUOv4I@E2jym_C@TH?=B_;nGR;46L^byn{^R8a9Ih~ILCr^$i%kn?+tum z;2SBb4jLd6v+ah^{U%}SeCcp2#%JyKi2UJawyULom@)0-q^aGWQ^Ca-fHp|0;w~I* zx`cJIl;=mtFbWGzz_l}o!+Po{47^SJ=@D1uN5{NtRqBT(juV2Dc$pt@1k-72OU-x% zze6eOL@pRiZ;A_;(f>cA(5DQL8S)A#xnh;(y8M&m^zPX0YhnE?CycNH*EuoKK1ZgD z36a3iP!i33n}zm{iC{R}a5?dw7vuMmg%ZM0e(~N9;I!CxCb|d%cY(0C*3IM9K5@Nl zLXg~T@+8x%7&ta{flIF$?4v)W{dF7X!@2 z@g;I<5Pd>TPQ~g+nMeizbMuOkC%nLCtHLj4RLF1#A_VxEOPa;@@Szs|<29|pP?q7E8?WN+VwcRc?LT8D_wIzRo~xdR;V% z>8=k6V9j_0mX-(*Q<3)_6z~h~J*j4KrRtEslOmdb-p|A;Zb@J2V|~^!uRe+=LI<76 z9r&S2r!2g_C8#1I6*}qU_Pgp^(sWUUFg<|5dVAKi{Ze)vMLpi^4qIGC)SDkMYa z2Gl?gcP6P9!8?V$4ac?{(d(`Zq=)YU4}#}O9|h2b1~LyCWwm=uM>8tDj`QoTd{`>}}^9vTrh@q&npyyxR4P`CI53JNtDNp&Q29KuT+ zil@=5Z&)e_Ygbn#Z4c3>If{4dIsPtQwvK{!NITV0hOQ}aC zT!}gT$4wL-4X)3p+;ug=9FS&Gb_ub2=lX}+(DMffDmNIV;`u``S&?)*%x-KtNijt| zP3^T-x7th?<&jT9Iy@W1^sZQU3RL;4HMh^Q>liJ+dgVy3?;WXXL{!?-!qjz){?r1AH#jMnOHCC z2x!(t@R%FT(nJAPb_C;Te9}RUjl_i|zUiPYm6>T;zF7NAm{8%q$x^fGFQkEn^ugkRpwkALemax>#koylF z_4W-SjJ1885S^@9A_1!NsFWIbWC^Kd;FdMGV1r(zN|`#2XBtkd;)U`O7FdG*U1gV@klvcnl70~sIe0}D zQ~SY|lfA($#~|(spBV`Wc*S5~jRo%FI*bXcTY5N;zNWP4YHAioF+cOu;#-dk;Lq-+ zQ5tC}*z#&ai}O|+1-|XJdN8{F*Wh_VNjyP{!V|Vh&O)EOj%fGe$j-K#y?x|BwDr~+ zxDgREL|`eh_B!}a2*kvD_-Y%f6;;}p_WJvl{e_}eYIPl1VKMFHCrOdM_%w={O1h#9 zoN3CKTq$TK`xKD}k#!tcVNpjD=|Zl&5zEc`KrQ#A8o9Th&=)M-oUy6_7rAry9-}6* z3jW!hFjVJRof3wHMe#Ub2114Mf<(j(%CDD6@_agVWNkL#D>P&imW*2Kx#5AfdP$~SXiVtAFFeYHLk>-WZtxed2$!^qrRvxFw=o4_#maoFv z+EVM4aZ6r#z+90VaKm-qJLbGJl{+Nlarwtk*izfn5nQzk5Qmm(bJg(HTvhO1l=kIk z2}IN?Thj*cwwD~hxel7UtmXEyj%R*Lu%j8Mgl$9Lc&FU zLlD*|*g@)-*QHu984EbMH%LcAxQLs#Jmev0OC7*dFF}HtdmA{O3K!N_C;8(EsB_uw z6#V?_CG^vZ-=eT)I7322l;IVIlrQCr?=w^9+`EVuNK;NJpY8d3N&Q_LR{p}``W$0E z>VvP5j!bG?LqxL%IpAg6Q4a@FIG9Q><(w&&9uf`P^me2VYv-=ta>JdwI>B1SCEZlq^^(1Fx`QzXQLDd?zl*92T-d7ugowaT-oJqyJF_O?JSHLl*Lb zo6=bIPbF%EK^@`~14n)3UQS5{GLqp{MF&p-iS6P)*yW?Ws7!bmP?JCnh@8Mz%Rz|w zx>)BmU;=Nzf6pKU(oKP4XI)}Y zudLJ=Ix9&Eo9{0P#IAp#hlw;(H*jKHe}J-fdvM>dXo|d-1 zTi28TQ2zU8<{8+36chUy9(Hzb8_?>03m~c8q&ZmB&rRy{vqkDnvrW!9CtM{DR=Ge%(GuXkUicM&IaPU3Ik@uqyw>hdODp<-vGe%V#A`3dH?Ou5vkK5^x2v zVV#S*N%G_jKu8P21zv$z-wDUYlcV6JeumROS!l$;%z`$b{cu(rlF>ft%vs9|PllTU zh-W~_O}3%VAlCgvc8Z%W_y>1x z*V#2C1(~nS|E`?^diGV&nEgpSmuYQ=6{dB}la|a1@*^LtVdtF)0WRjgMx3X%Sd39j zz#!aeI@M$zB41~D^dYR%+GwUC5KFH-B9!3t!fY(AGXJ?cbsSHNJZDB_2of1R0jcqb z{!}{f$LPz$59B=R$#o_-d>jH53_75zk5?Jk5>v6tyT=6RO3TN6UHXAp9QBps=IF}e z(Dqx(F+{5>}G7q~lHA+u&EPLxr%oJ(nq(hEh z#m9Ulmkw(*ZMhSu0;K#)w`hx)J@^hi z$&BX~j-P8MRB{xV$})IdCyu z4Q`=U8e%NQH(Fq1`U`1P)B-9vNAP>aL(&Ki?5E3Tt0Oh8&Xm+Wy0L5%xZPq4CZVi^ z$(`?Kg2oTOz==1b=+0Zbv`^GRobW((7R7pfdph<Lrim`7+HjlRY_oT{Io*p3^ zzH4Az{c;hs5Nar`IF5JzeapR*RH`+)+szVJ)laTX@2H3H2UWMF*x+Wvr`X zFHt*j^>8|qRcN^djAF;I)y}>tBd*_xR7khK`_(L6*;Ct&S{RMsl(t^qo?5yA)^Si~ zE|I{tUjbl{ZSrqw5uUfv{WxegR`kl(#lOnj1|JakC%-;2hXk&ET2Ip52vz5^-cQ{w zfb{G{=;@OJJx5N|nXn}bQ7+RtaXmg3O9N>i(E+227EzmAXcOJIRx;wQ?#CEWFmS$wRt0#@}}JAURT*}gR!bztc0ecLBvTx zSrV%Bn){@IRmlfDEY6Zh0oU=_T*91?fWc5{(XOwnWsbkYsLQZ9#6tg2CzNlV3_6Z` zP(Q233y4Zxh)_M(i?y4l?s38^UXCQ=>YDI-U-ra-;oP>qM8LQ151iev6>Y}rnT5Zi zw?X?or|f){yB*Y1)(fbf(gi^hE6(TvYL8-2hUOo{8UE^!?r8UgwdRVQY=R9!w~xFx zxqgr14SiG2%wkk`JP^x1j^|m*Zn5JH_fQeKIm?9THu{VA$@hhU%<pV5e zF~RV~uaLEIe0|33Ham%$jN(Yx^4a}B%L2Po;v*Pc)PGw zYQ(Cb#24Ty1JjdmM}PJ1aY%H1$g+a;wVy_zo$6W{h@JFb&B`U5cmfwQAG9Qz7gEY} zVmD$ckbMBp?gY>W4ukFdDw&I7gO6kp>1*39iNnH9^PArL^3mO*df@?CXwzllsNseKKy2;P7i8eUq zjV(9t>dv33gFziTtq;YTn>6<_&@_|_iOr|Lx|Q0dMxS_sBCD8Kd)*IwiD0@prl_tX zJz$oisY^_^kmvIdM!D&LYa&Y7^Jga29^irA-?U~XDruMPh$p zOUbj?TtRdLrb(g-F+!)z_NOF(=Bn2pgCo3|&s)ixjI~NSMrngx;i+#e#MKMISk#@U z7`hPrp1B%S6yOTSJaF6ocSK7?YDatNPYkL1Lqwf)O(sf%0vmiL0=qkHq(}?5{o+*? zEO4%osxZ-Iun@0!KkIjc^06)#lfHuO9O8WL>AD#6BkPS6bAzqNZ5S##c z1P*?@Yf4UsW|}N3Vlei#QB2xw1S`zJ?C#*sY$FPN|H9c|9gsWVlZEu1*+S|x7%HL~ zx0|9af}A;K;33p!2lj3Pt3>ek7*wkS7ceSGUm_6(0XIRA2%+)vZP4xn9QgIecQ|sb zF1i+GFU4g0@8xY2EIJ}wPmfpb&Sy%)uNh6VABIgCXv+a%Ac{w^ zb_y(zqa@ zo^0O9BTIqDL;I}-=i?}{)0_5WJuow)pMmryGXo@(?KRKv&@;~5y%`COi;c0xy%Y^# zXr}u*e*FPprRU01LYf!rAb%l9Z4m$uP<`;>CkLJNFEA5ZHr<2X$p;gWPYvlUo#^0P zFvfyTbO-uob@YjZ?h%N+cwiJT@hJ>kE=0D9Ay`zL3tJxI%qIMVYqik=+ASY@vEq09 zk6)*XxO|WacYGJ;!15An)Y*-sFH5I?Gf_Uy!KVJD<^SDKYRfQ+D}M=Qf4sYO$13o| ziaM=yGvU`r?{Ny2T*acRw#B{x<^qW+ru${6mQs4x%q?G42a{$2uY@5Ac3Lk@b?jnx zVPq?HX0{^Zm91hXSTmA}A0*vo%qlJ1DU7^71{fo3_3!I0 z-**s5IRc7Lq=DPz#X|YL_h4Nw0@MBQqpwUJELlVKsbxQZMcFTCOIkU~MsKT^b}#;U zHg#lkZm@b@fVg_0F@o93d2&~fjfUEFgJefoRjSzd*lsVCS~?tH$j*H4 zr|JrvlYjEl1EM$O0vb#)iO(;ecg~nLL$(=AXvT#VQUAB9pP)CFwu z)_K90#&zp1o!gBga`uUUp9d&cKZI?D+G6Ts`FqJZsWP!_z`%rSW z*B5$dI(RY=4T6i8gB6JIGw%BG`A1{z-(M|7dX4jU+*;Z!qI1B98V`+QB+{8FMq}-^ z^otT?a-$c1GK!h=1okykBn(8~)trT(?V#6r7}rcr-b8)T1sfByLBngUYJ0I#PKLa) zBL2WdCIpL3Yyq=bWoA@QdlY7T(LoXl9y~r67#Zj72U=Q6xBS_Urx9=feV=@z@f0E@ z(1=8~W@Iin$Cp2|3Sm{6GSSOyI_yiJ+ca6Nauqx~TsM8)v=!-yZ4#!xYH$~FxI-u;YaH@W<&^aYu4u|F^}rGAb< z@cn*V(H75wYkRZN7#R<6wTLpIz^ZpbLb?Gr?wo@uq_e*s-(HlF z$r!-?Wbe(aHA+*$8>o0GLL*K^2!UoRg_wtFK-VlchP43G#98 zosY5MZh^zYx-tI)MK1wen=Y&jjJ7fzL|xg-xDIxt4%cm4M1P%4Rhd(W_;#5?X}#1( zV)Y5F)dA{% z>pNOTZY2x zW`pXoL0}D5VWmD_)mL8pOF&I-^%NHRRKldQaC|+GY0K}C31lidhZv0Jz z2{-1uVLN9_sR(#en|%z7@q?3ydB%$mQI#kVm@tI5hnM}8OVz<-W2V0${G9I@Cuyry zet?!ttAH>C$Ipa4wnf+UabJ5y;s!7pJh(Ci7@uDb24Q7v*!|;5PfOT(+lpqtvp`!t zCKzmT5y%$BS8*!D&)_w7#bGxPa+-@Ix1+&|A=EnyYRbN6%xPUYjUxRKGV+idO`1U7 zEMQZ*`tIn%bjPkolt^Q521=N)Cy(Ka#jhf4alv|i?uX^0g}pE>auWTkAhbgt zPSyRMcVVBnidvw*f$yR}AGS!drPoB6$lOh}?+?V+c1cfz>86XT>5is+WZmX7i^ip< zp_y`-fu_AZI>v-}Lfu(P<#7s@@5UAh6mBN!j)mi~3U};be7f#lP(tp%rW4?6gvbhT(m8?fXkmHys$-Q;5HnvesGUhnYZAuNdBh3_Xi zklw%k)1wkNaZSg9Y>rzfXlVySy^&=Cp#l5mtQQC9YwM-MhW$LX^56%}>2fCWAb~p= z#0^bGIe1zbm7`iPiVnyyJmi9ZWPx`^ae)&P8s91~E^|jh871!3cm8NRD4hD6w1Fp^ z#avNZqGnNWWYo}^fUo`e?$AknhVGl{@?LO=mAB_CRclG##x2x0?{ktx)Sb95 zsVb$VI)XWV0vjttDsA41uP7y5zX7WH3?bF{yacuak4X?9b^j+`GAcU74kps?%qiYu z2=tCRj5!V5<}yv&wGod=l2yMJnYyW|^l>LTTR`mKP!ngud{+E;mT7}4YeB^M^1V=N zSd_6jTMFm?7d8FV4+IBfE<&;cils%wy#;prb0UqqtEUeXNa*-9p!>YLqY!HiLZ2^C)tj0~?7EaV7TxFFsX0@B*6}VnU=dbss?s8=h zrNy_ekO*=VgFV0+f5`GCknv=7{sl zI)d{-f}?477#l8dezj98{gx@{TvHzOUwzlgpIA8D@(@KbYpR+8$(^vzPLkJn@Plbv#5I6h~fuPw`ETm5_U(R{iA9(*znb=eL4jd$_T93J*lK7_Cxal3H zRYWaNW~#OcVumdSD>xt)C8cdxVI&V+m@5)$)NHkx8b)o|)}zXRG2O0B$TCHvbx$tv znl9K()fakr_k8nGF*oIy?2^?@_+l(Fp`1QR#%nu&u#TjtTf|I>?eY3%&rU<58UJ#9 zNc=U4BiFkRVi9J9FZ!rHpJc~4{b2Fi38RyE)l=l=<07F(KbEe0u|QSQ9ry|Tlc_y{ zZ`b}R>$iYKV+6ZmB?9TbhJq@V+>L(mY`KTLubFo0Xv|!z>{T33$6wcf@r$Z}*#&TR zYFDK+EJFHwDLFU1XF~hQ&LP@p5pc%78BxQHfhG0*h}9KPIao28L#1F@x7c}8-@{K` zSq~0Ka^~Lcvzkf(2u0Me5U=nf!@-P&?kr|1qWV<;5l=mE^ZA{kimcws$6c9hxVRJ^+vY(G(f3qP8r2e6F-*&3 z0=k3gdzBB=VyIs0$8Y;cM~Z!I zEnjg-g1|%euw7h z|1)162g|s~9qjo10P@Ai>ynFMh?(xk5inElIg#_W6r7g$?qw$J)lZ`Ij!gQ-t|lKn zfRxVlyZ*CIp!ebxY%n?j8aUg-C6|ST2rkUH-P!2eY>F$3EyB@^<#5{kOcC-+FSA;U7+4+D=asVED{&ppq5iHW6*;24HOsuM?3` z{aE}7lnH^91D)&L>+{X2L7+betfI<58t~=D4A+9;XD;-~!QYPLZPDCTQE-_qQXAR! z<6A@wbk@D8$t-17SHRMMZXQQIHU}(-Ysx8c0M`m~bC>o+9EH-JjPc&@wgyu7G61rO2(_E z-=Xpg`nt{Kd<_n0>G5&U`8D(IlU|H-_Xu@TBwno}0~h11LHN{WJN1m0Y~YC^t81Oq z*)m{nJb6AfqS;Szg*SJ=aQ@!6U^P?zW%1|CL(J9|vzyGS#P^vShB1ql>+PG^T}o$H z_}fNt!l1$q_r)a+xPLP4<@bk~p5u)Nv#{hy*t4#!9BDi1pi~xug@->9Dn@i*ZO*Kt zbwY3+#0lh2gTRQ7oS08-__%Z{kx@9bQDXx@U-uwQW(gUkH_)VhAO|xe8Zt)-5jHYX zf>D<8lFwKo5&%(+T1$@2^L_fzuE-xSdjk@=61_RZJEBzI^-4MAC9~5MZuZv%Up5S0 zHP3c~iz4U$Crtu~SV++AfiHd7pL&A@SIQL21bGO_1>K(3b-4Mj;*1jl?G^YsFj?=V zUHi?XSgMwev-GWx^*jSkM0lkRr~A!jwS9Gz$UwcIFncJq_Nc+d-`MLYYD9kuwx_vF?~+yhwH^XxIJk$R zq=_#*=RRSR6LC3*^814oh_jI6*F;iHtibc`V<>-FT6F&|-vz~2k+Bpsa{|^uc;y&# zI{pQiF08-}B^Lp5*RXCf7b700!v(tZ*Wye1qAt~5=&NgOlX8X;54f64$}n_IaCNU` z1K^4UvS|j?HbA$%jaYy>kp#Nf{@TuZ)sVM|Z=f!(m^pR0@$ji#UH_B+&cXATOA4%D zD4_t)vF_0mBsSRXdx_M|UPLjR{>kW2KmLRB{t1ISLzd?yk)e8N#Liog$7XD`o#d*x zCa?JKfo@Ur8y+1MAv+3b*IvK2T7viIVHD1LgTz&pOl8(Lzp4DSTAkX9T=|*tP$(U0+{K9Q4y!G?TaY~%ZuYM-!l;_ z$U*mAo8gPlA(fuWsb{4Tx}*~E@b1JfN_#j@o80qyH8rerKC;~XOEL`<&~JW!ILOub zdm%jl?WF!TDwnmFE2LIZ7N6Tksn=AQ$leIk+VQH1Q(3xJzaaRmuwCjcP@CLCi82-x zjA}GVle$D~bMzW?O|lZ0VI%n>wS_lpF8nl&YQi~b&()$;kc>ntKDiQT%$|bIB8GG5Zde2CJMEcuc zR7Z3lBr?H}Yd<|4w2cC55_+ZyB?5%3rI~}V8%HqrnmX6d;mHfwC;k|_qdYX5AHAp( zc%#W`G>zz*v|Th-B2X0mwVh(ks&mXgq9$@}XqWpd(gi-NkEp9t9)md(c{bPH#5u7< zF<@4AM)Y2t_yxRHlbXFvojD50_jbbGgfEn6{@t0h zJV0<`BsrkrA0xIRpiz%RD6_GOXiSIFi)VoOovEha6-bWZ7@HaZTD&D; zrgN`H!uRy~=Gv^M5gz)}-&CeOBc@)LHtK&ChjyG7B~;KMZmi^A!F|D1m@~c;T5fL2 zng?y#$83hXU-nqMQQ{;;{^;raOyxXuD;mQ*D)5P>>i=t!W?&S(iS8iY1Q zd&ADGH>7kNSZ~=M)Z?LS${Rf3$dt{?xH6xF<^73yI?si`GYaUCM@a<~&c z(oG4ENiMlhH=6gjHLCEE+BD6DnK&-NJDgSKB>QQQ*}YC5(Z@)CBcGAzYrjPd+DM)h z4aqJd-3zN)Nc=Fl#m`9bKNjpL;IlL$q~I&X!g;>7U$ONQ(h}eOd1|QerOdD+tA@wS zGuHU+hEDp{*YM)-?nrI<0;LRW;Fz)`uC&W7_AH?qHCnHZB4%P9Dwb4z=h-Kti;FNT zBZD#(t2;VCySW+m?aNe`l#Q^3o43}PJZC88MqCf?GkGuV_7U&1a8c0QgOOlUM|8F` zCO4NIYyft>QAX6FD_7oJxyA#NDcckIPhc~LPKaU44ubkK;yFAAiR!Cz2AC|8%){pL z*+duUaJQw?Jf~oLx$;D8W)TSL{!pnLR|sDe=uB=)-*gw>B5OBgXTJ8Q{ISKR;0z_b zIz6-^F3PzgE0x3Ue%IN-D9!8iHhQrSGrT$Q1T1O|KB(l8k=nJ%(r*uz6?ZA^--BXA z5&ZQ4gs;TawiL2%|8w`5gZfSI`oYBc;7HV57n4DSAZhZ=Uh?I4#=B8tw)%9E#`W+H zE%nqdZ*gtQ%sL5W1BG6LTxJrxIZncg-!DM!&QnCD0Qoa2g|ttCBlLVWO1?#y7w7ti zBcB6w<7}8O)$l?olkvlY*DfA{wDd!|M`*>Pw4LY4k)1!hvr)dgPyW%?k>kK|PG`oi z1~A*uNIgL9gqHXN$h@DQQe#A)dyY8N=R2|^6rQLW?E+XmIPD+aJQ678~)Hy{cFZ)Am{m7TVc0d zVg_C1-L3RWy5QeE-}~}+ z4PjHZgm&&E7Jofx7l71mUl{yam+MA3gHbT6c|OWAcfn$&RzxfW4`efv$Aa5JtiJK3 zJ9yk<-2ipJBL{NoZ##m2@X(P+PvT~*5ZPE7oU_M=W#^!9C-D7S(~^en&#z1B%l9kS zw25i)S*UFw+0O8-9hl}gB%$;cn=S~xHY%oiNXRln(Qw(62QzPwj~d|;o;nQnZz}(H zCOIPQR7Q5b5;OPqi{CR-`HI+5{HY~kx&K3E-HF_Vf>@BpJ*>YY(uoEl0e4Mh^li5BV$bmtl4LZD@W5!(v zsq%}in!V-RLZO3X6~1Mdrmi;IwXzaeHI?k5W1qK?N!#JGAB{WSDu+09HRUq*|B#sx zy0!K2RDd^g&}526IuFP@Ox~3sR5uK)cO#yy5P`!zDxq}9FfbJ#`!?VCfo=C2Ct?;B zV>>;OEqS0rhl$B=_;LH+R4Q|SG%J{L^TdUKIefo}A4Ly57EaChimYdE^%7m|#iz=E zr5#Fn1DrvV?pWx?lG10y4yJLA*!~+$ZsE2hF8#VvFHH0&`70AN>m8uQGq|+?i5t(7 zkr#Vx%@Ovay76`7Do%auN-F9o{48fWGyezJJ!Y%@-lJe`Q%mp#Y_aC|!m7+gyYc<_ zs@(m2)0fzp8HBIlI`U(0WfBt3d5T|a$fui_oAu=v?>Lx}4@WDX{Dn%DzB z!@cR?$iU}ZU6b)FI^-+1jxCWm#Gas;wxL$2~N9|Ip_ZX_HPy|?6h!UB{PKS zDH6ZR90RxMPzrnsMD1YH$c29vaj3!A<59w+%`r{N%ux;EEYBeB(Q7_E+y5jp?`Yh& zC;xyMJV-0EOL!|ZAC5^K^(X7fr@;75<@)MHP&e~AlNcKfK!D;NQjY$cT67%v^Bf2_ zI^;Pf<4U-c6SbRL0{ay^so%aTaFn0ta%7=2$tg2A4twKJu0L3q$?r+}G0|N@R`snWKGxziiNw^$e|Lj9b|K*La~w(*VD>x#wq%wgbs5jaRwnr`d)C4$bHXIr$Vab$Cu`k7n42;GUoQ<}@42|C8}$Pe z86iDeE~@Bhdo|Q^3CnMYdfItRZ7x6GF$%;d-jD(*1;6z^*@?`c70M}(<68}HHG5ET zv}`P9RVJkRgSnjfi@1^*MHg9H^g|o*v25Si*6Y=*Z~X{4KC{1Dk#wLRb(U?6DJ;g(#$p^FgsEqdu?1jN6wRRzgB@&j_)bu1 z0ghlAp<27z9ort8Vd9?^21@;GKAKSx)~3LoMKmfKqwHB1bEu_V0rl|9WKj5FGzaU) z%{%D03f0!A--E12dut9ROr9qB2{xF}-jY42mgL5$$FOe#G(Olh=`(4>SQm6e`X7Ud zIDLz#eYcvcKW58(u2M;d4>!)8Cc%b`=LEHE9><~&#;0HdCieuQJdGd!N7Z||N8~tn%r%z^=o>8u65zAcVueIu&;)~ck{^7so|V;F}e;@+C@8i zE|&QpQEh@SKUu%-wop+(81qf7v8h}zC;A}}_3>nuxn)G;-N5cQx0&w)C+GyoY``Eq zcD%-M0Xr-NDj~u$p+?0^jJnn{*mk|YZd*SAhfY#E7^7Qsi%RCq*y~4pk1f)_(aIVl98ZwuQsQ&&mnkLC)Q=HcdpMxN$xW19CqW5)C>V;t|2)}~C=1M!TfAtiF zE5?Hw`u%)QT-tT(DjKQ|POn(WR`bqv-%3+Atzg=R|3oN>y`h8k+^#8m4qUCbz}0by z2uF0}(EY&PaM|PPo zsIwq^pu)xr8JfrkiL$Vb!i=|U0js=a;sreCFj(7PFd{WS&9*Q-th#KY4JS0RfJ=u- z|IfbjyVDro1buW&t(ld4Rc1;>We_>SoA&p?UX~7?H=)b>Z$W+;xi9BOx@@ZV^3O^R z(|J+5p^viTkLOv?R*(j}AitcXS^oi0kZ;GC?BuQ?9fsZwSf;UPJCs{H`BRGo0lTfS zD*;plHj?!1$}2kXqziEcQke;@Pmh!3yqwEmX(5-ap{F9Qf}_Um0$-c)Yy&cu_ss?8 z@}>QyEg%%E%Ih}xij`Zp%HFmonr~*N>FZ_h*S+vy#uYUqQ-?YFrm|rJ91J^IaR-)R z!&yWQJocg%!i&{Qs6Hq?W5z}V;rf_DjqJ%*`gYyRqeGJeN8rDM=_3=tG_VL)^{}G+ zA?AHwEXOKtwGdIEz8dkpss0PIDES254qx02mp99P>jxI*R%XAdxTld}h|D{TdgJbsx`{L^HimAx&JvRoqmE7#<>BR0^5}FcX_KgvG zGFC06Gss7swsb|Fl{M?J5F4@1QgJWEW4@&{Z*L0DQS}KHnX>2Hb#c&~j)U33R3D%&r&R>dpMGCP- z4TCJH26K$~UELt_K{AhVdEMWfCV?C)@w1>zFjrgyLP9wa_B4}&cEiG+#&MhY#7`lO ziW+J!k+g$28H@LKptt-^5uba22D~mB*?hz6TJdV`baTU`TaWUDpsulA46;5x!UlLh6gTe=i@FRx2wPWB%LoJv&h2relalYBie*K zN)r_M2T(wCn}NMhVANHC%8Cl1#vc~W+~DpUx1m3_>(FGyz8^na?P(*%$MEAFli$Lt zFT6wA8-{jf6&1YUV@oePNHhJheZtx7awc*Vs|TXrZ!S|(F59lj8wlYL$g(Su(8F$iNv>a#gZY`^Lyb2Bl=z|wVBit7wEy?RO83mspeZCasZdK73w#Ry^sJ7(inWUNuYY}v$K z)X%PP#4-rMB@4h1X%A_JyST(y{-q;I#EEbs9Px(L#2!|@1D??r>zb#|Mw=muudt?? z%j!hH{-zJI<`0DI7fBzD1{R-fwvtct6ntMtZxZh+4cl*4 z%1k-iu~#d;%xtYFoyU0o>c;-$q6Yf?T-=XSqk%=5gd)^=ZR`Bl_iSd0p#|60+j~hL0^8Unhl0#Y7=u+%6sDXg6_(t<6u{2{G2{ znRQw3FejEaBZP|ex8?id=_`Zj<(tUt_LZNRp5o5<4?PTbD`h*GWnIcOzu#_M>!kPk zO)gq=Nn*okQ0m|cy4E&s^8&uA30soJU6cyYa` z5xbzMq#qLV?y5FpnZ4D(1w@1>AvbltvWDa)FEsp$y>F@>J|55CD?l<>lyS6X(YG0j zB@0Hf%d^PIA1d~LdE2pAE!(QAI#1R#E@#3|E?U2%E6)}AVMSly2?>=fXysp5??(4> z5=`Cxl6`(rD@p|)x&S$3#yc`=A9ruuDO;+ars^um6RgI{FJAf|F=bCI;fN3^d_J1R zyu@-`)RX2|dCnyqE*>>j+tE26I3mleRpm`zr|So6#QVA*y(Te}nC*esAjxCY>M!8V z&Pw+rVgwT_2?_3RqW*O|P89bh6?fv*D3dIICM%tb;+u>*%9PBpiR6*Cigae4s5A5) z6SPR@rj7r~ylJn`>xHRsVp0Jg_QNK3>gOmnwf{?_wI#JI6l^A2WEA+O84(pIeg-vh zwySqI(U#hMG%CFi@RHq4`S#L>wh%P_{YxNk1z>YP;J8lg|2E$D2y^ zLxKze6PVZ|L385TkwyZ;%6D=htHTmSpHttE0BF&Z3vlx$3XhbFs5fZ1g3j^OsVH<$ zb2E?By2Mc{*Y;2onU+YxyZj>5AH6gdCQIeVS#g7IvLkvCN-XyxLsrHJs`9^x&q@yQmrS|A zmX3gb`088qUXQbG#J80D-s;?F*gKz_0i2kB=SViy%bz%p8av;Rx9f1H_@rS}=RAWsuD;{%I6Xy$KQ*4} zf}PV9o_LGA)|T4*@h0vu*kI{X-+4GflRjBK-ILl#o`P||k^S4ht!2p`mLdUWVE2d7 zldgNl?Oi0e5|Uyd4R3E(nRTV%PAyjQJzu}12Ws`Tgq=!$p}~{6i`pFr=jrTDNeAdMgkN@isRNq4qiN>lUij? zFkStPsRrt4TlCH3U|q#=HJLt0zqK`1$YZ={@~RGTx>RkU-Awb$WZ5vr@_o1O%WtU# z(Z0>LTYDgP#_~>?y~_ZmCxEx(~Fu6`Q2;PQ8R|1f98|fvC?$|^LgVHMzWWB$!1>hvu;9>w{#45YAxLw z(8JCL599i~yHX>5J5IM489;Z8#I?cN)FLufpR7d}^k$jms@Bw+rccTLT)S|ZX{{a_ z@XHbsams?2izx;Y!#Il3L5OC3aiXs5+(@|0%E#3$yLPii_NSXyZWXI$W8bZ*;b^|$ z38Rf8vY2Kz-NbV0Djk#yR{bcw$Vf6AbVjSZ>9un#MmE5HT&jChledyg(4}8DTy4m< z$T+iJX#&dLL#(5%%Bq+li945nzxvfs zMl-uiPr`t~h2YQXaCm#^eE&EqN0Zf(*=>EMHL*bxmq40aP1)vD+cE& z;VGYDAFfZ_(2_j4Je(qTcbPZ5i~m)9)`;H3itlv*mX2WkDk4HzbsC`(i>S9hv+E%1hq0nBm&}9bi_GZF0c-Z%WX?1!Q9nIFUg^?IeQ};O%G~@kTD#|Of1eZ0wt<)@>La2O(7J5x@+eAgy^JG{SRaQJv=>F zb{zE%R~R+}R~@y5g)95fbAI9SsT>T`Dd*U+zrVV(rH9CELxrSoNi}GjcKF8NC z89KXTM58RAL)<);%<9yCC37~Uk7Pn|c*xo{_FF}QrvBY#(xFR#kNiCm>x%Xw_MODM zr|aBWl{@t#o>c@^>$QW+^(<|-2_#)@WkwEQ4*V&qksWV>74=yceuMhPK@Hj*Hd{zL zA$)L!h185CBS`IeyFW7Aj{h~%OgF2_42g8i~ zDR*aEvaMhUa9Bwu3+_7W@{YM^&s>vjV0K%!1~p~ljPLA^tV^=S?s>ms6AYzZkc$Q8 z;G&nXCWK9gU=w>}Oa)zPt#uz(g0{nBg93`Xenn^Zv?36=#Y!b>b+P>vNAx<3_k5P%Fjm`js#n<}bulhQmj&&}HK z)f>KBQl+1@BMvfO*+f5Rt7cvmu=P{*GP_8spxJ?X3Et~nJDyaMX}WCLW$V%OHapnO zOQ@1@3`lBy1-j-@TmQ&!{?m|%WXti#{fL8tCgky+d=l$P#t|Y&6PR5dxRmw-qTdqonc$r41(})ox7P=jlf@g_n2^6{0 zUvHyfQjQn(g@xcN4wdQx93!~Gl&(qTP;F2=cQ3Go`75JS`1w&Nx`U-Uiz?1TLz>Cd z`G)$W7Yr})w=!<@YlHr2MR<4R*?hJ-i^^nD8q(Xyv-(r-mG*tx|A{g1Zbb#Oh{uhl zR+^mO%IF-jvbGpd{_>`{Qc9J?2I*BfgvIqR%~$ZDG8KMBnad z=FOqry|KxoHVC0b<^T%}*#|4f)BZ-#_R_GHA-$aS`nvkN8=p8+FFDbpLftsX{cY2) zNg8nx!_szmy1-s?fX*zmgKYfq6$xMelp*TnA}U%}_aS;kZ}p7*;BKq_&{pa#q-|67 zvvz!pQ@HG{uQ;8q( z;uAazYOo0sdC@tq^cy>)j;%I?-cIaz+KY~a0KV2)9D@Bsmg?D)*y`uM1cWkxIed*n zc-!)yQqhhR0e_61;-eo0kB<|LYt6PF$-4APc`ie1rV+n3u=Piq&EApD9SeS+$$LJK z&Marv8VJ4bge`HBeWs7*Dqr3Wo~N~? z@@gi&$}}-{5N4FYs-bc#zLfB~|JwTV>9HHU997dX3g2`{VTSY6sp^Uf-HXM)ORkGI zFdgrnDqmeg9)4jNiSa8}9yiN)Tg??v1z4k$ttb&uqm#0a92>wz{uJu6b*2;wyg>|P zo#yr~uG|N>7!TLHIzI!C7>n0Tmj!iaiz@8puL+THZy2XJ0CGzgNOy%1JB5w@La+vBHEOG0>d*&_%Cu)cj|$4(=FuO zIGd4FK1wqq{Pj@>=@+tM^Ljs)+*LJVApH>}f%I1F7|VDlM_%+_lHxoK&^{%&?mKgJ zCVON^N?u$DJuT%=j0oy=ry8w7G`Ma(f^h>`a=mO12-m}d!LP$;m%_vGe~22BEeE(* z-)&racO_+c)0GZk?J-tuPo~gcpgiEELEb_B;vX_BXh%QaPvNiA7P^x2 z)Q85t{h_NPcCi=O{8%iajy8uVp0fS(hR~O!hVG4|U03sCv4uhBaZo=G)s|lQ%i#n_ ze<3hr!s8vX(ptv#d)ZNDAkTm73hF&8gF`q(6mx1)n1M@=Rs>wOc8&smlz&w1)ad#; z1O*y*JIZu5bH8Z6{?sI&xb*^4mLzu^zo=BM|5;y3cIG&Tg5gX_r!JlOmd$9z%(p20 zdF8s{vEiAZ>jYCShl7q#`Ud=iMEk;U3j&{Ze%P zacN~qm)BIByI2ah4e7Iiwba`Z0hS+6%qE&9WgXa~u=IA$T1EA1VF$RV{dk6Kk{im* z)koF*v)HVL>1D#)?TWt>d{-6@GiRnO9!nCK5e zbps{lT2rHmICe{<`o) z5nc0v@130`+2MvHO|&jC`sJ@&;;hjnWVUj?V(R%hjhunFU*qAzFX3O?^X!vf6gSFt zJhgXA3c0@VI@6MKjM0=bZN5*dF9$ItQF^^)qM<$3@Jld^(J+Q6rZ%4Jh-bP+7c)O% zd$6>%N_}lbVCx%YN}1ozJD)4sk0k1^ChNluZBN5@2|lm?(RY}x`oWW^2?i%+@+Mi} z1VhrAUW%YW+a+Doy8h-$G8Lm-BXTfzA(dsu`<|F+%WGkUk)#d%xq@iwCDn>{`dcgWTUGG%*D!uU4C(*ggH6+bC* z-Na~EaBTIlei0j0(|sf0Ba6>bpNBaXaW9R~4ozy82#MD)E*Y4Rvfi;Us>S(_3gxIt znx?4iuG_xw@Mw0idpzD>Tl38}W|Jd(T8>wO4(?$&(3)`5#1R#z21}$|= z!O7hi5lHf0{F1!~Q|DD$*%Chrp;eX%8{>5W9or1s^sj@I zZLzvDA=;SisAP-_D~NqT9aADf+MoKHbC(h|6Q8!0;cxb^QDT7 zsNlt&B5i3QH42Yoo?doCvhuYXm^X66Ep??hf~*Kq`iyZ_L4v{THOyw_If{e`rW<$T zl4KLv%%pF}rF$o1v%ihK^Pqzq6s8;KoXU`0)dr3k8C>x*JG)sQ-RYgwQJ}+H&;RJ0 zlvKhzP#S!v8JaxWbY-OWmdq!+q+9pNqh0rb(R4GvJDBfZojdBX4TcV;o@B^lZ(Fk& zeUzcrZEf=5?!R8hdM9^3OZN-zv*{Exa^@RFMB>E5uh{!C2(Z+eIlvdzw}Ghoy_rmL z{HKlNDz@PpEuao^jh!72FFEy0d3?||-7PB{2Dk|hYvu+Isl8`54lH!(Rv-?XH4BeH zBW)QTMD_4@=sv&S!R;iq22%jSA{t;YWmbbfJSK2|kWw9kgkWrLE z&*XZ7U*|0*qI0EJKmEIf5FH+%i!N1Vmvy|n>!VkYPqM2*lV8aW&LwLr$|}f=dG zdieLwCPOvzyGfi^Cq>x49X;dA!kN2wEvFLq!w$QMJX`9xa@ZT8^zHs$?CWP2DO@t) zr=Wg#gpZtB`XI@u0Gh6^GD75juDj!sj zwxnbUuFN#1a-Ij&8DkmAm(LZk_OUbKsJqkg+}(omgF|>uSI(roH6IY{O3g#50CtDW zI%%V?CMXVNHTTv`x2T0l_rg)Z&3ZE9^o2>xt(A$=B-&EF}#fLXcXDfJYKmlXJVT&Ul zf4!3I2hWgLZ z`>`dE-zpo)uo~Z#-?XP4WQ6N42K*!)h`a(@l7gY8w+BdZXMT-pAn`T5ieN(J72 zv$G`V{*~!EnPZ-Gh^8r6*)Lc@v+@rM=te8XnpJ+ZKXuypPe2%|m~iQ^Aq^E1G5NYL zG-0-aQs80!l07iRQW6quYUqKoN8uxtm;!{Oe5fV$=sDRfpO&9jQ9vz=1bvBzr0W~ZSa zE9R*b-f=VwM`1`d^Nj+n$I59ip`Zz~Kr43+-JtcGf3xS@NM!;Sx(g}iu8)W6t_kXHKRn!N1ZnE%%GCl9eEONYQ~tla4F zD#>|l)q54{r}F)*u^2b0vV?>Sd^KW2@xX=ZzhU(pjoA(+ zlQoh}3*f#xCjTCr@FV??lZ;su!J>`IA38!hGY46xvv5%{RT->PN_Vv?n;wl!^y(j$ z14qA_h$e%OO&||3XyH)g&H|H+xt8v(ABu*nA{|JkF~6%%yB71$@^t*M2g4d5g`d|52f#c34O|c!A9M`_Id- zBKzR^#u1hCB|CUe7sJub4q(fk$rXL!nR>ZN8d&Z<(vs~QcKoxpuCTBmUnfp|!{{ky zepfi3*n(dj@Cb}CKB_oiZcDh!|9s#v`yl0|%22cKTC`BswROty4!(2X0}$$~?GB8B7!CPLrhhCn#bvYI~c2Hht; zjxmuS(q&f{OgsT2#&GPMjJLxtmX$z0I|iOJ$4%pUz0@Dx`jeawCm*&jqZ9sz3d~VV z2IpJ2rfRg%Y1*)PQ!Y51$ybjHj62yEmhqqWV#T>juHn*_aMb}LT>*+&94 zrT6z!wHqkfFIvRN60Z$*!md`mskp?U*6RmOq}WWya(g6s-zn#dydfV`Mbe4ycR+nL z$a|rw{P%5aPw?HFG}`7Er?ILJ&G)0cC3jL2XK)c>@ChV-w(*RgJti5-WKZcLdt*li zzL6FGdk6o!X+tkTQd_@t@fZ$&A${&4*@LSp%QBH9l{xciBFV{LWn)K`U-hW@am+bg zKiPfL`=w0kRd?oYt@0sbvz_tc#Qd`Z8_8BYOn@~dY|4{3$yPiGLoSZSF}Ot2Bx}Wy zoI8tsp{_|h$cosIlH*RVgucSAj8;sKB2GR+8V)rT%MQQ{G4-Z9QeRQhmtOV*CJVs= zZNnU6bxLK01*KnvsrhsUN+_B=+!GqH9k%l9mu$P;eW;1>C>W^z3hxkX@sEo2@ppeC zHVG5Gy@R>ggW8CboekLs{!kGAl_R82#k5cNarJhdbWQGY*owZjtj0#+>6Ab0CdV!# zP5wx)8MjG1`gn#>++EqpFX9)@2H(i4rbHAfri* zJMSQ6!Wx6yOQF)-ef4YR%cdTaZtvgXHhA~Ya(YOv7`kv zba_WpF^Q_|t9!3AsUu95U|5>w&R=-G&-p*C(NQ;K9k57574?zyg1iNM${kaC6k~78 zE1n7oCXT#y3eK8lyk{r;4%KzwMBVjv)KNj@)8FXChB@q@Psj-c=p$YM6?WPU+&)0mTM z8Rb-%aBSRfrhsR5njG5;%;+Mlq~I?jF=> ztgb5(j}bQ(T1kp9sUz4y1EzU_WT2$)5@Zm~7Er6Hk$Bd=^f}+KnxD3_vFB?xmyCum z_n&0{X>c zru|Ke%2+0mqcuoaA=<|^QCCox`*<>rD4_fc)2EL~B(;CaY~03zI=u-74E({Tmm$xC zftZ{_T?96>hc~h}oe1olheG*$sJHz%Y65KIKPtJ46t7DVA(n3}FFHCHiusBQvRnMD zhOgDj*izGs>mcI#`z)X(mOP)QP zt1bnJpyt|hd-?fxSh9GjNh*9}84KzBSKw+b$2=hbOX@G$3mcF#Pd)}XIMBq!1|M^eEyn2xEM_+p4XY(#6&>({YvJkF7&XT=K=#Au}PMa z;ep?oL@jBDQ^pF!P+Cs}8RxEE*WZNY&XM@wzl}GYBh1lY5=H~9blf`3kciQi=wGhm zez&)=hIU;$TVeF|uO?;q?VDeeectdSY_KB^u|!pjTTf`+1+!bVOmH6Qg8b@X5`}W@ zEajUTvC){?gs?V)g;#JG1X^RT*ZaO(ic3!_PhcniC3gJ#U=EZZYaad6VJWP9zTyZ9 zck&P5?U+II_}w90HiWn&ktFq_#}99CDtBPRTzET>DRYA!ZO7&eGK%06o-n3TiJ=ID zjWIl6tH&cKl7L;8aY>c32+}xLe-4AoTsnY=F*-e8a=^SkySBC;lYO}X=t6&(GJ0Vi%Tgi0pnuBb$*1Yq8x14g< z@f5P?Ivv0!O1OL23OS2n8;RC2`eACiF4^YtWHcY~^Ye$0& zh-o*Ar{)x4gsQ1&kg;M`7f1zi??G6gH$$4>5h-?(P`ExmK-JXHQ>dPdOlGc5;0lp4 zN0J7rO%IcazhH_n6cJt&r=59)(og0glvS***vRaN#v1?s4@#@=vT}t#swp!0(nW_h zoSz|-=THF_)Js;)5+5}jZFhVuTEfGTT4Bm#rs4@(ak9!qKws(-QXME%Tzcep2wOf@ z$ZWwLcYGXB6ta((!d9<=T~K_?1NQa?`poFTPY;cyr#{CX2j0Id&X@vSC3PjKoTVP9 z`XlNf!3=z0K$n-V+_o21ZVhYjE^A`2Exvx}DLZN@E9rrzv>$OtAXq_U4yT>a$*BJZr=fvnx!b1+mHIiU6S5F9bMYHtID<^D7fhM zQNyxrF)p}z5VV6j1%3M?E9wZ7-Op(@j1Ms;?v#bHW?8Y~j^OdADa#-KH#NzG8j7_b zRwPCURaWxg6`1kF`(ykd;VLZ}p{1hRRKFwM7>mJAp-;P)VK<=&_6o zAQD$t*ECRDI8t5gGtPJY#rq3&Ir-{ZWk7F|{!9u#d8tr9c9&9#;-0wczxU&*7&zHIdIx||v8Ye%E z*6)w1_7t9P!&Y}zM`@hYA(JtjmF9`MxFnPEavMpRg?j^iqAk9^nc@_2CUkwK{?n&O zeVLFdgxNwz>Rlznih-S;FwmYbW!kFlvx?dIRl|Z<`9iS5$8*i)j_>dl9@I#zx+m;v zS(@%e<6Bruza9&^$JxZP<4S^1n9y{lx(q7$l-CBe4B1Ri1!qevH%%boQ$$Rk%=oqI^U#nr3(pkRU9vwN zeLebh!QS5s2OVwr(4bsbP~Exu<;s`UNq1x!d0$r@ZS8E~crE+#Y3jAoy5j7P*5u(H z@?*}bp6-$WsG=tFx|aVEAH7;NZAIAipvV`?RPr{~$O2Fptnx=Pr?!pEE zYF5ADJ5V}Kk7U=3FUCpgGn=iTHEDvS&fb@DXW!|*)JJ#MT$o@uHkOw&np!#itL5WNAGyfnf^oCEx@?g#G7OF}qAP{dp%v7PUwmJzJg^!FRJuNAv(+NxP|tfP40D6e zoP-Qpc9FX)@l`Ji+@m`wWZ2tbG!_OKR#XlGh~W8$f6UPnumO^T@(1GUwi1zeew0~a z0L;-eY_53EB)2_!C$7lVb=>kII8cPw#H@X%>}>+dPnMoA@kt>YZW;z_j`yM(F)0)` zVKlZ+@Yy91BY$}+yr)5gRIvr0A5IkY*W8RYU3G^Dfh)GEAyCdHqWa8a(XRW+Q?O|z z#Tfo?bn2$KHUVhSJs9wp_Msn?w`|z2WM< zwPV~U$*inV@UA_3B1Y&pU1TD(i)*DA#a4s5)u^wLKc97dDGb9iWSoqC>`i>d0dABs z=yX+T!xD)pFQ|;I8ur~aB|Nt;vi!`KfjCAWf!=cqg!F)`;B19aOCw>z%>~pXe~xA= zM)}ru?%79~<(o_9P?u+|8A>&d-{E(x$uEsf`{SzA#rBzMfCcH&Ye7Imx-5dSz(W^kN^W(adv`_5!KqJNQo zd*Ti$q=vdi@PH966Ey zgzwHRT5VLwR(kA)JwpDpq)#m9LoK0}*+C+B*o24K5{a-xMC{&^_k(&p2~1a7mHHNx8^|{eH!1+mg9Pl1*Vb!j%X+M#B`?gq6-1)fJQ!T zjfo$db89pMD5E0B+{5lv$g%b)cMN)A`*8U%)SMc_n_^?CC$;3EnI1~Uu&58l(0d3% zn>^8|R4CaBetye>GakdVQzr7IuyC;SBb+&7bOATzP^UHv))t?Txva(4;%FJsdUDWb z?!!@>kuiQ%VM)DCDdAwn*4RryhBdY&b?jG*$+^FxCGxZr)KC{e#s;VY)y+8$D9k)x zwpeSlVZ+7N@MX*j^z`o)&^X+LlYPK}KVSiB5V6sC?&}X^$ZE)~7{#x-J}CvDFeXyt z_1Roodm#Ju3EE6PNn`=8bjcmQlpQ*bieb;5z3LzpBN)jc)*%)ox(g<^#3N(U_cBKw zyuoW)F!hzm%(D~Nkpq2E-8q1TYROyo z^JTJ*lJlr(8E{hnIt+%%aYb(esQ3|}IROEWx$^y8FM#XG0k+|Dw^D35u9L!{?62|C z{mirMmK)FcQo&(7ws!p8`J7GTBzwAQ4dma;mlHSP0vH!bT^FK%$Z6lnZqtWmy1jm-z**ill>t`LqeuGfLmFU3Nx48eN3Y>whm6 zd&q6&%RP3n2!E*y#m9oM+z7bkme2N(zgl|teVwfjGhzake;!&uK5GCaiSi7^%BRJt zOHnS0VQszd1txHVpf8~8zswFC^%*O-f+D2)NzmuxtTFw?P=5VUl8l(I)g#m|;;fi0$A*+4J~EsCI*F z_YLM&m)MuNG4B7io)<*0<>v77&7xT|ojX4egTz_pl2mNVN;56C-Ji9kYCN38jAz31 zk6cJ|B@&nlSBR@k9lWip@)K#fpBXmM5P$D4gnA(x+u0i>RQf!S%)+jjt1^A!SW~_B ziX}w6U>Ios!l;hRnEW?+fvI>L%qDPfqwM)fQGa6s{N_XB1XH7+$z9k)keJ0RPrGB= z0llp`R7)e{j0#A*i4gadN8NhOK}$uo9`Lk{+hUJ;&NY}F#=XcV>M*}I)D@G24Z*}a z=Ek?^yHzPU|9ud=dFW>UIK)n*tG&Q_9(tYqfrD9?)x2O?y@hRd>=%XKED&2#1a|mi zfOoa;%Z_p$_qAKG9iAHL7OQw3%#7{>EoMknqquSQ_=3WIScZ|P0~>|W%UD{c7R<=I(OGp^TwyJb4i`9xo4 zfe*~eW%eUs6J46GW1f4#aJX(JT}z1QtH>=U?wu*i(;948nuU^gY*7!Q({Q_+^a_2( z7X0t+$fABN%7(a5mGgXRiwzk{aIwjV(dIymw6uF)maO|4u}UcSzhWYtb$V7*I7`Y_ zS@NLpV>G$7t-^;f8ULy)+yQ_#Ox??-9aCBXRnp9&Ex(j!U^Z<^#E-s=00ar*oYDh8 zVL1GnDR(l%GJxjGg(qHcue0NJnN!j5n2jzM9=6UIa+!yi;`3{<1wEQgeR6>$T1b~> znt@p#KG#=bPW2EPx3kZ;5uW(tZ+GM_nhkS|0$q-iE9Z7rGfTulmHMcG?Eih=a;5Ng zlQA(VWhy6PJydh@KM>18BR)6~xooxXmcNCxf=hiEgAq%ViV7$%bylwD)F}t*-@RW^ zpY6j;*LJ*i!E=|E7k(;&wZ;-#_&gWoYRFkCA$$Otua_-<7L;Q}$?_JfK`>5FE-`b3 z-{|8+SipQ4y>c@|82$;BBL7tZzxN(IzosX)ABT{|Oz6*pM_;&s71}X2skhd1)K{wU z;`;Y^KA$p{daXgT$=6)fda&m`?~CWmQtr|peA7YZ8rJ{*XM(4z74-VQ?+b*<(-PTg z7y3{y%AA~$uk4vS-$Zg{Fg+8#8IacweY@TsV$K`G)es;aF&#f}q%m0ZCMrjl*j6Dz z)2R7)K4|8mC&2+Wb&TgaLk(nJ0t(``2cT7x>!ao-7e6;9T!(9OiGSJ{2B;$w6y>7{2sYETG07=)2XPwxBGq zRc_Sz_^)&6t+{Px&q#4FA->(8Et!By{r}WnUjY(~6$|m0u@Mw}6y;81|6?M_?b_IQ zzPG#9fzCL9hgERQsO8urP`sPM7y~_cT_Fo}_R8LPSWEig7T+@;@|fveFPa8hBD?Sy zV}%qR|E)HChQ+XdTfrNa=UIaz%G{)C;m8V{ZfV&zT}Zt{4C) z6SU`azT`P;y7xpwb#dw}?3_UQS0Q#rqG11N1%$*yj1WmA(8x;TOOt#0uoA{@Xc<5S zdw1XGSg?}B#7KAB4OAEZk3DLPV$=#e!3Vd(!^D#QCbH?P%(yk4- zCl}`4h(+^yQ3$o7H*leS-tG!pr#Xh6T2zk=`W-zjt~+lzB6v`GV-N>`-F8pJcOwdr z`^n=@GLsc|$=z1b3ZGpOp&jD%I9zt`mz>PFyE1c7@h4 z>{@1!yFZ40bhI})3JXw=1ygL%0Gtk_j`81q+VF0_q_C%S)>qy$jH;m|>sa-6a(hq> zUG|X$V2*p*!njn~BxW<5Xj9JcVVb+l*aX7yuYfE7AqK_SzDDpCMQht!Pm^K^U-_`g1vzhm zyj861^iTn++2Ywjlf2PNE4Uf)9oa@ln73UXW^kA2W%jr)A8o$>e9YevaexH}SJAx= z7|pjQ9^oV0Xhj9z?)gOqDsE~fr{|9+oy zW@%bxT2xx6Y?aj5OR0loCu<=!_E3sM6!Xr$J!CCwW6xUFLd?N~9!o+gYl9?7rA6z^ z`MrICS78Ptf`4unU}9og8}Fu64?m~ZW&*9dx1 z`48}Kwt^gn7G%i=%b|UV$}Mmg?4;HaaA?g5$Ng4z?q1ej0S@@%9c#Ek>dM6Bkl8Y% z6LzPr%tm0eJ{6HC{?6T!_~x%iR4W@Zu0dvO3XMPCM_jl8j)jR|2O6k5O638l2Y5-f zwUWJjLI8}}2*;(^sK(Wa*gL~Cek~WQ4FA4J=8L@s@?aU&J?nv@OA2e|FYI)Zd_>iwMI|9D$B*i^?#Srmwck3WGXNszX!V& z`rVtr@}>ITH+v2p27|8Yr60o|iE#5PipiH0rZM={C&=F`z^~jPdn>2Z;ci>hRg5|&E$pS1oLpQ2sGhV-bZ_HR_0KL(2x!$jO+&A}8wDr-qd<@ax zqMmlaKie!>230mnD0ak%^)O{d5wC8kHa_dGn>16ZwgXaeSJsj^&55`wb~qA)wrib& zim}CHb(KI)75Cxlj3}dz+sLPu1s$ehDtjYRTZv)_@5L}v2p)(0$8`G82`b2qqO=gpfGFeB%qtqWtqb3lk`;{@tgOjERH=5&j^**{5 z|6f~!fTXAWO>v0}79c8OPfIkYPhGVDw!J#YP<^7)AP8x@M`DiJs{eYY z?+=Pte4;D#oNpD7%(q z&Re#J+t&u*`xbcS!);O14Ol-gYK53E$?eT(k_1Y4dn!hXt(d9pxT$7#hnSiQ)p1&_ zc`=za4CN<_2$lBVZlAR6WmIKky``W}`rsr7R356$W81RkDz5psoJBEp0v-OuXPruOYoG$rEZW9Y0*T9kl z;Jh(;ujmR{wc=D>fHqH=ydU&kz!?Rk{t>$P;Q#U$6w}SZl{nWJmRqk{5PCn;FFu2{~P6BlT6z)Icqo22o=jl~V(d+@yvKzk)WZ z?Z_QXNb|GiX&zGOmtzX^C@+EfrZt_v?KZMy@K{a)d;0^+$RWrLKNbL$x;uh>fh?$G zLsra1(UZ(rqL*p(BP{aQeET*!l@0*4yE05{Erzc>dlEq=1VIOG_f#1P1X^fINU2rV zgB5Cbn1oWbZ~UFi$Z7n4n1HhtVYzMQSQ%?AA5DtPgcFSt%}_WrI9Rl=)!!OIMRFn3 z4Hm06yy5Q>q8)ctjYP#iRqE##6`Jk;XGu(4-cVi7%bwA~P0& z`Yit?NZ;j~e-K1;lgYUGTj7!!eotO`W!`1It8il#ef+zB&YyQZ-WFsh=>uWc2H`n& zh7*{W&olA`ndet!G(CI^-iB*C+9<{Ptpdb#L~ell8GpH+Eo3{hvyz-ap29o$GwR@R zFtedV?CeqJKZ$=IJmppI$I#PXS zun>z7JULJsx)vmPC|=At{HDC4u5N)}2`22-AD&Oz=2nM?=)d3HMUZ1H;_~!kp}g=>)Ugo*XVw?A3xjyi=k9V-_y>+flF4Eq0=VIbjc~?5S=|;}vE{m7hCX2|{=|>?U&Ys+ zN2G)%W2LoF{euun=IyDCX+t}*k#U(69_ix{YUKtnf;0Mi76BvX zyv_*M&&=X)`~WzCmJl8=mhQ9!Hk0Ha7kHO&)KvM}8{Gz`Y3IwNVPe8uE*1Do4KOHM z`V5C0L*;>1K8T+?q|K7pFt~K!rsYwO{^mdQul@>d#2Ubva@}s)nc}p$|Eh|?xy)IJTdt{MCz`dejNH(lBc#o}-x+HFxRhi+s+fXj8Qd*pcy7`;Rl!XI`A= zCqumF1!z06+yZ%-vcH&;vHO5z7MtKhKtiKPoPb;azt9fS+2N>ce!MvsjY1~^Hw^ST ze_MLwm+(mPDi0(PW?Rh=nf5>ZQwS`7>R2SKeBF(Wecr0sOwAz{SMtXH29w(J6dnUU zKZ4}Oj0DX}1i@_LrgqcDRCRa2UQqwS^%Y}nWvu*A*EAP#8-Sb~FI1%!+f(=lfzef( z7+pr!J9P3PN+wWtJ_<$_Y4lc#i#reJ#K1VSri@aU9HTzH>@%Z?iUg@UYMO?B11c^;<{S4;~D!n#b@L(&N>n`sDlg=A@10`=ySuR6Ek zuu!6O{@-`49tc5MWKY7rV@TUedoY$Ndj#ICRBb!*pl=|wvj>zTH-I z$DPV~W<$z~983QZ#DrQ>d!<0uq~MUY`wS=HuHGLkf^3tT#L+s9Z3;gYiF@PjPSDo? zcZRbNT0r;+!T!gty5SJB2A5Uu{=@1zfl`<|GszBQ#!Bf^DuSx{1T74-ICsOv^Eo@p z`nVmpz*>;l!vq2#xzWlms(-p}(Aa0MB^C^Io%ET6%)_&EEm^8%jh=T}!x`8{QZ+nA zk*#8=UjVXp8NlSyc>H|Zm`NymuBrCJF1elcVA9sE`YFf|vkcb}8uf zz~$Mlu;rc!c+74Gg%I;XqvBJD8(NS|b}+$>0E!iG1(9CYndF4dkz(2Hod$~kxvDx|@6L8K4MF%eKcb{0 zsLvLiqba}wvvz|x*joa0~E*yzK@w?6w@Ur<>1cKmQd7O_LNQCvyd&;F24 zTNn3$&`A(e-E~^qb;FuHBGPZ9-%T>0ZnHg!7&3OKFsJ$ADB&DqWy_$qbn!KN)>I%j zfyw6D_XBnOR!aF7ek4#M?NOh-sB(Qt%qZDey}7vwQ{XJ`f%L=vyve_4_Ud`vTGX^# zOeoDrb8X;As(i~^i0y@QoPeZCqE!E?YI2b78F71e%knb~b?)?&tjSbFw<}f(fT?_J zD1W@|vAp83=dC#I0@()}qNfdrpqIOs zwWJj7@iGRB6<=1P^Fn1O;$qABWr9upydg$@1`f_8jWE~oJ^!4FnfIV4^+-%U-uFz1}PKRHX@^L`?CBc7T{@9{KMe(OallOn3LdfPR2#e zrFXYz?0tUk8w4c<>XKkM$^_N?^7sB`K%|j#!=*&ayVpyUOD6c|%$RAxS+gmt2Esdi zmNp6n{r|F+4c+U$=8Y2@=Yk4$4}=27TG|l`soY=~UI0Ro&XV*2F;b|~w|z9!dzfWr z3zbOeNZw_BT64+Go;Rw-RICcpk<35}Pm;oi22igFYme|p^`ove0t52!*gL_yx`&Wx zPG&7`IT$v&btC+QbmPKcpTv!Zj`a zm;Gk0#IG17!jJjC?1XBo3#~K5@vRn5f`%BumfG%3jGY{!Esn(1|vhDd=mwU_ina5^D)Jj;L&r)rH9(%DXQ1cJZ85(j%oK@{FzhuDdHM$SBrWW4F{rA{QXJ8~~gDUb~8 z20-xxdv0AjJas0(j*e=jSf0sG+h4z#IIQU1!&rp9DQw#kn)9&(*%5I~J7#3IkEVh5 zLE6Coy*})T#SrQU1JsyGHWw+UK_FGr1;tsjfdcC*-@*AJX}B?H?=V920O16<)S5A* z57bU{q>{+CW)u2X{jA>5mzEW%D%-M#{L)Pv(xSf(LBVbWjD+crfgjOE1>s=* zEeBjn%`w#;d2d#~$w1_n@AMaL+(=IIe8}w9pjz5-7p(;D@39NOt9lrGH6(_OCesi6 z#kOZPGYD2ph8k+d#jps8+$_jQE(kB;1yL~ae|S(m12T{04TC&UkbMhC=EEe47+9jH zbPqOsRwv~tjg5i`HvI(hp;R7_{XOwE?Dn}#j17C|yULOn`eg-t`47#)??ethN(BKi zeg_d`xax1Rk!_JcyWNP2WzrC z$C-Dd&+DJv`0hU&%|&=5cAS+!d^l}Y{K#^?$P&jnFi!wpsRGExypb?moVvwtaf6jW zJMqsAnGIZbb{>=bl}dJC8IW|MOnL~6mYP@=koYdn1ZPR)42;*EHs;=F7V94G%Syu2 zb^d3hruYXGw>*2m|GM>hrE2gMK0+#&K-yPe^K||SWOA@;2rnxAy1o~*70|e{4^Fs7 z*X$|a6Ko}D@2w-;hWW!}=M73H;O%26?))|}F_}F3RQLQfMN;03h~W_I*1KYNNRPtr zjC13D*Whs7+*juf39aV`HM){RK?eCxvB041V}<|pF2Vtw;`jXfz7Pa{bafwmH;^qN z_c$IwrVQ8uk-RW`1v=z?09kDyc}H8^>B^@v$V1t0{o5sG3g3)Wwtd$RS05IGLRtAi zO5yXoPwWc5_=V>Yy(ktKcq)O>A&`BT(3QH9FR-!AKWL<$e4DW%2%iINJ5>(9#zZaC zelVYeCUnvMoSD_Je9M?0X9%4aDpe*z0pT^hHi68waxGmycCjw)kg)}}gY56i!AsDz z@LbzW-F70<^F=d3_M7UIA@~ThB{7AnJA?J77ijwZD}IWhps=feT}SPCPDgxoz&1=y z`2p~CWGB!;GFcG_$pv-nU+w^U~#k*FF~%k5&u$h9AC{iQb4%DB-q>n3|j=d<`ZxPzVd z>IVNQMTeY&NKH5t_j@ywyadV0`JM`tY6`Drcd5BS;|pSdze2}0s9p|a(+SEB96Sm!F~-8}2B;eQ>w81nXyH`XJ{irHCup z!!JM8@;O5O7rC-BP1m-@pCJ@!9%+1_RduK(!vI!A_k{dgoj}{F8YW~Xkvm6JS?ys4 zlpniDaVX#SxS?`Cq|;0kED*F+8XhnH9;ubN(_2Ct*{lIJX?5fRu1-+ zHs#NzXS#94=TA3!gc6xyqR!|rInXQdiB~E^u%aPkFf?fs341#idU1;7!wliel7A zTB^mQm}Z+O0MqLb_kn+AY_W^%YflEQ+!{DSG{2>_KQ+XGtr}!ZrMCJfYF~%E&NKp0 zTME{QL0t1smq1GEz+HVS-8NL`A3LYCmxGkfI}^q(Z_tRLxI3;}wuaFLL2hRVYCa`X z$Eh6E#ErrqxZ!xv%9%;utq!)j`YyxG-?QEA)IZnQUBERS_pwWUBi-(%U)LWH#4|yh zC@6@wwsSWHR-a-_HnE-GDNdy{u1Z~zL&dUY2Jum z(gSeR1h*dzMkcL%5qWBdQO8|b08M?ggbJPRgGWo&@~Z1Yvviwe0*{lH1g-o>rWq$; zSH3r?D=2IwUQ2_JAq*?d4}0$r1-aJjASWpAXe{p{hJ!{E7-Q#Gh zKPal4uQ?>N=%DNxCA7f|_Cal+0j$*Z+)L z>F+E+&fc;SUa_T42sjBFm(ZJK6F%4}lRC=32%bEq^KDp#M0s!ZAdqkQkn;#u-`G~v z*8E}8eDM{55xX3p??Dp!U#ZRwh%uc#eZQD{g8CHLNVOgou-UV%s}(53>W{?Ke$k{Kz)C3`_yb(*t30?9nl$UcF#sgC^rp%Bjh# zFUIABg3M590js0fuXQOfxQai>KWmR)5F?6G2p6`d*G5aT$Zh0|%LS2Pf7g;-+*;=f z{bJpiKY;A01cLBfx>v^_-HQikfKJp-ZQl#;FB%I4OSQgT*+d_;6uKOf5ZC|yB3lAb zBkB&~IbGT4?e7g03m@_$b$8yx26{geqpHgcKz=%rs=xc2vvCc55PMz1Y7qf=H~0}G zIgwHuumtg1a+}{8sbA3u4)%bWtqAn4`%B)p?#}LL9VnXr?x5c5VWheGY7ww69i$MJ@ymzWh&Ui;FztcRwIN9DO3eNrKIiel z9w?}pXZaxp+tBc+2}e*+0x0;e<2vhA>mQR~r3fN1L1^n!KA5{1h({HmAVG1?k(aBxyT&Iu;Q{hL zRMRC1UVbL3W6ZRru8Lmd`+h`YYl@Ysu`t;a6cFm0I0)fWz#0X4&eoGk^(DObZ)BD8 z^c$b6NJX-8yhIrP&oXGD zxHCrlB1-N8$7(jafu|Ub6HA0bQi z`3<8F`)>PMI;_tbM}mQV74R-_upX4>mViqI5(|EhX(Hu)H)!+{<@V%9Fr2V~5AG8o zQ_j499U^U&`#O=sbu5EL4+nr(MfGB6k87>nsofjUhcSa>WE|&)H5_EHPm=Rg++_gD z9SP-YzNl7?WQY*3#*f@!Y!@z&GcjnuLDPDYM|d9xTZRAoGP;PghvwH6%(G(q&xL|{ z2CP^fj3PD?$&?Fq)U=eX-hm@*us>6dxT{1rp9A4 zyEw@JCK0Qlzt?h0)l{ch^BPxq-CX8FsrMNTh7Mn5L-8~c3MmgJJMj|zdY~9rz;QM} zYPk%tpd`?2z|Y23aI?pzO7j`3`+By2RL z%9Rq7Xsi5NqDb`-<`27xJGafo-30{Jex2upry02)!5wwB66@e^swJ_WcamDb}Yy!vRiu15vGZM6p%3fU8TKvRQ%2NbVEUl95A1w26v7g}r=w`OTNN}(rL zyFLSaPxd0O^R^E;iY1@=kO8ZKx{~Ng-R^Z4Yt69~b#ftVy~+6*!lI2Q;h{OaV;}=o zn-XzqiA<~f`fjZdR_at1JJ3ed$DU5MO&$!1eYf2W{@1(rMgY!u5!@cXp&$Ex#5Gjo zfp5(3Yfzjw4<-xLrl9U5gxJ_Kzn-~@xi2uF+40G9-fFp6&frB$le?oQH#_55dQ8dB z^4bHRLs}E+we9N)~F{LMX3WPU@5DZYwqKrs`~98XH$C`W%IitV~J_}Z0Ty?UiKu56W| zSq`kVvQ$5Bw1I=`34IC!lUn$+fwZzspFt7KRJ;wgj@m>T2=!|C2g&dArne?bihCJl zdYhzSnn8Vr3FGg$aa~7?hZC0LKR)*KtrU<|TVsi)&iNFM7Gy5!yVOxeM)HSPK!{N5 z3Rdl)rlDjr$`cf)^fU-LL%}d^JviHNz7cRMol2h!Q=sxOzvS_fhO|d~RICg=dGfLQ zxrrx5`2{%(=C)dbatI<$Zx8UYlCc9w*3@Whe2m5zORJCAwr952hj56edL( zvRV8+F&DzC0!46ckXYSpZT}QuHO=1VcRYkrlXs=-;S{seR`wP3i4F>_Is50amsC-l zD=4VS+;dd=Wn(;lGaYCuKMAE2cW@%HdyqQ6;=X?dnQr5j3?N!xT-a;ER{zvoow%M% z#6+A|z0p1U;`p66d#{gvi72mCwKbLd)(n|0%e35yW$-A2Zzm!jL=jZXhwr7dRXm_b z-9yh#v^awwqmab!tLDS3$*DDr@+I@B5y*=Uy6X5y)y*Lgj(goa^0R#9wurJYu5##M zd)&geb&!BV0MfQK%juwf&}FW(0rXr-D+a@2F%+sCVPObZ7Zo}hXm>0WY@KSNWQt3Z zmA&Y9MAM``n8SZnTDLDq-JY8-L%GJ{s~U$Aoi|KL8ZnRU{W=aKG7Az@!7nMN%eSOL zodq5}0m>va_N$A~A3KkG2#Q~oO(Yn9X;aA+e!JsxT*%wluK}q;YEoQx1aKwA5PX(e zIOCmD!9L>%1PHLNK)X!}jkAn#Du24o$58udy*-lA+6R|@fqPd_jK{$UOvXz} zut2y;`pPv|am?{K8I4CQwC{NV)XoTaF~{@1Vh0=$fWeP457LUNm`6unZV>$YrJ z3oorFi~5uLF%)JO@m^@wYMf{1v!o+oi92-#Lh32yu@p1`$Tw1LoBN`pbpB-M6C|mr z;>-D&G%4A8s};a`kk>6@F>L>B_ysZp<3J8j;qh7OYkeBGFDO;-mxy;m0>Awl$Y9|E zq#gGP$y)f2QR@Zpf}hQ>zStWS7asW&vm&Dq_?jiiTPSbmnDKoCkuyBWoBm(7*XDij zv1QD6{Nc3W8@Mx2Z6iXnfwOakm($(Y#O}(&LiqqJKFjEB{lNWxNY2w7v9k{A65!wdz?a~x1 z-|sA}?aWQ>F3^t4q?L<19{{hl2f!3N^0Nge+q`gL(PCp0`D=*oR1_%kX zlOC3Kv4p+TENgzEPuoRy#|$NCZab8c;yyF=zMYy%$6jj9X*N3rjCjbG;xH~>-~k<&GE1Ca;JSvEVB!FIsAKvhcAbbGMPCy;*hBHEi7I^^8R2hsBa-$cO+z25y1_C%V1=k z+ejAtV0(PYuzb@rh!_vU1e{pugGf-%Xq4>A*26WYanp4rR~J~Bva#l-@Pw%-a|?#HT3%ls%>dzEYd8(x-0N^xgYmM^kCAaEZ{yO=@%&D~cGg?xjE zJ+1z0pOzH8@n`r!b&lWt!}$$OY+8GwM=1!j4(ieNDYi2(5S$V5&ROUOqGFpupOg-WUN( z$r@=W{}Kh~cQa4ksvf*u-BSHZ&(?15&7ZA}CVovQxJ5?5K8zhor&>@hBkW4=3q9j=p5syb zCC5LFF(OUvf3>X>Ct+zm(a!W;zMd#T>A$8C8z?~r?N%*DqlffJYTdj5wvYoNs$rMANV0^g2Lb0Z5zYJgh-(|!~ggS&2f)6t=7k&*Hj5iAL05T}OWKuQhNLkMn z`UlIm8CB_%`L|_P`O^b({!Zb)yb%i05X}M5lh>NKBJDs_^6dq4nlIRr(9gua% z9M;VKd%}{w#jM6B+ah8^M{*1lJ7Jr~`OD_PkHJWJcM?CZ3)3`=UG9e?jIb0wf9?)i zy?+%GY5%ZFb>J62Uf1Qb<5&H(n|r(Q9TC}S_ud%_G=32JtPs?{?u~H$T|nh#R8RGzjSS zFFUb%81@O;Le$oEc z>ap+nV?*Lv!`t)Gmw#nc_&c*%z%8QiNyk| z`xbBzw4T`pH67nk?oPN8)sKUQ-_NX!iO;9F(Fr!os>~Sf2%9I`joAaTg9ES&`Wv`i z;NePhBl|GiO|sQfxln&LhgL>P8sXe{5v+&B7I0cucU^)9!CO)M-_5w#SmDgQ$@+6A z+tosP6+hwx9~?YF#M+UR=5i@zIUj{U>P&N7O_y&KQG-Lto0XnUvF56}pvH$k=Z#Og z6v}%y@Mw;HM8m1tl9KZ#zX(JbeXronQc@`|fwJDxj0@RtSSS{uj~9veBotX&6D8gw z0Ek5TCi6?0Gkhu2{3NH2d#p}+fnPynBQ1A+F2E3zv;jbX6)~fRJ8wZIX#ailjR~ul zCQPNcC(p-kq@VbIwH;s)V+pGf$vX+ERkcOjX@?|DFaqIi+rHZmj>3d63?-&(mgpL_d}03* zT6v0$=54H0`I568uX{oD&2MnT+G~7Ruh1UFP7W zAH*T&Pm)Q>%$_F1!!AQ3HyXy|ZJ{n@WSYvdp&y|T9s(OpB|k}9)E%~Mf9vK{7IU-y z*$KVz@-O^q?@wg53BSeH1hAAGs7r{3Z3mlO;49I$svoq2Tf*F_;_T@pj#gjvUf*Bm zc-Utdano-Bu*AQ9-Ad?9XJ2IdTIW7qo$zBPzUGeN$pratIjq|`DDQ+vx02m|E!M4k zr5WkiA2IkUM`f1vU*x3p`vX)Zu8`Nnk0Z-{YW#9^bu#&8DC{jp!>L>W6bX`rI7M{s z5U!|lT!dz|`<+TbD2b@!prq9g&*~rPwiA6)f765OAXX!FV>bfUw1}}%e)MJS=qIQ7 z>k=-R_&6!f{yo*Sc`o!R)oYwA34|##!b5dkL59h5iyYi7Cc z3voBvf{U)VXIsa4vjueea}pL1{CGTcZu7(MjY~&S5AMPhAsar(gk=aI1&f$({-2Y6 zc|O;Sc%jcaqI%UdB!xd)Hh>b3!f!=T;U7Y{tKwlekxJh=Tl2hCRlmEKs_6jPZMHug zH}JEB%KIfmU)7p)1?gZEzskuFv`Ddf=S*mFmgCOtOd}0AXD(i0MV@z08hZAs&&c2h zG^ahcgX#<+2vuVNZrRM1#&}(I)5CcE{mN|7oMUDYyEtIpRTJu`bkQ06TQmp z4-lh9uUSA~V)4aeq0po_2^Jp=0A$_yFCX~sl59pmW~vt!cVcbb`OC)2_H$r{F)^UO zn`~l1UZYV)#LnCsrA80y$>!iNFZm#RnNC%G`h15Iwat`*b}w)w3i+WB7uzVq_zk0A z4iH?ljEU);C6K)bYq4%Ykbbft^Wiq(jOc%>_`qTK9LlLzsLM{=(icr6K)_W$i^`A1 z?IF9|70ll-+7~#gA!`R-Y3hi9l%CzR!t=4}ZT;GilXV$u_~^#hEz+61?)|h<-Sp@vroY=)flV5}wl~hHtdMUrD{a$$z#~cWEk=tbZwTP zgni_wv@0->a9wXs!eqI}0%cG2F|2EC{1yn?62rcYeY8ClS}bYM-mT7ntxp&Jb$tvxjjL6 zA&-H(yS5L??xpp6<)dfF|ltMgA00MNan*m3sun-j%WSD^zUo(s-mx>O^5^bZLkmCT z;YL)xW-pvuASJqB*$)eL8))rtx6tOFy}a77E>3?0hj9|l=QUY|&7_|_@@&b^tZ6V= z6dLv2AJ`}{$xh0jioQCJ!nft7L|UE%*-=ROOF)58*Bxbl;P*KAH*BcV_i55dfAD=8 zwr}AlPHpjjAew^&FnVE6C`d6OJ7Jde??`zIdy^=L@&1PJ?zh}& zJEp({E+I9AN8sRmI@|0b>^=rw?ZAMGLt7tDuoS%BsGXAKI@Ad|5pxtaP|nD!Ck~o? zJMGqq(7DTNz1385cH_9$WYH0RfY`#40^ao!$ z=i(Q4=9ZnS5C0M7!rzSJ^2FLtxIg5&fQM0xbEr7qY9=0SA~GW5v2RffDBBTEO``ka zuhZp+-)J4tyrH7xpB8@~-b2~Q&reyV6G_=&5M)6~3VAb<9xKoSmzcC25fQFb0+|xo z@4%c(h8VO5Mp`JE`5z`^)@FCD#%Teh^z?yL)Mkf|f?CWy6CNe;5}jE~Ve3*h;O?T1 zP>EtJGo_^V4Xu%m<3uZt$+4qAdlWb?;;wI4 z^PSH=+?v%;;-R~*>AgqAw@9s2aYlwq;^M4?*#0fR8>aXm3A`x~SZ|q)LLAatTE4rW zQaR@x#3~Gu33OfYu+-HNGAnNi30Ylle*lR)W8-0H^LZ4qs;&N_3n|bZs^zO*l!Ao- z(xBjsI`Fj__a0C2bj&?~?5mv&wB&>}f@HzSRv25Cc16#(_h*7CG+X(xQf0vfSZc=g z>@Bbs;3sDFhrRo8WIwW=!pvJJOXT`2})dNJ63-LJM;G!)gv^=kbu2n!bxzp^_Q}ES1refQn|bg~bPFAEvaO*!EWPZQyr% z<}R{Zk*GvA=TW6`9hw%Hxq*01;%_&264*7aX-i0{?-@RR>;e)>M0Mh-CpoM6@ab>3ujp7X$c z4WODZ)N|0vcI+d*;rm3gYjL^@Rk|NG45h5yjzWwTu2l^c%9|ZKz@(blQLwK)=hM%i zI2zfJsFdCb-tE)hKcFh#pWZeY{t>_W$X+p>(h=W#z{C(Y{v~~vSlzNlzI(iF91XL8 zba3%vZD6)U-iP;WRQ1*uRl33r`~1{DD0iP+Z9l*$IfX92OUPBW7hc-D>&;uyK|_e$ zcZjR1^-md$?a0J~N(7#%@MP38-_KzUjWwOXvf4q zG(y&dfJe%72GT#yQvb4}@EtsDx6EZU958*dCaI>HLEO9EdzgU!5D0SxM%Q30lV8!2 zng<7G(Ab0bWk`#D0^&dOcN$br>-Y^4Hug_SQoAr==@0todHmXrB@CiovyoCFWdIrO z4n#rsh-zBB-wD*#TWz@5wx-SVy(<2~xLU&OhjlZDNBL0k zSctp7f}{6H2*y)sPIz2tu4xzQptVc0jj9?8Y!5#NVrp#LL-1Jy84rNM;n?_x7l2$K~l%adA%^ zu7MlP-LU-~U3XF+zOSeo{Ln2E=O1l{Pm)O8W6J-JT^@yUmN?^{RO%=ks^2HbW!T}w zLY+iSUpsvKoZ3zWdZTkq+HX$M33fV@tU2c4}COodK>8CYiWLzpj#J#v!zpGWX z#umCV$hNDk1=SR=7iM<>rBr6h4I(o9Z+j!j_*M6}g83BWPhGPKmJH2&(@q%xFB$9r z6sH!E>N|4udcA5Qe}~2ftQkp7Uf-xX(?))Lza5U3scYff{Zo7h!f#5_r~iBDk38vd zc0tp|2cNPa(L+}Z4f6ZJYa!vAuI-INUIy|7)bU>Uo6<&oIbTM&10c9WaWq)3Z1z9B znD6)FP51=NQo*-c5St9(G6P5K!DR9N9y?}&S&6$Q=q^T|Z!onkiSQui5 z4!WE}Mi!G`Qf@=m9iozYpqP8ZAzPx{_Z4UX4uus~$v?>vVYj`SxX{^AYG}HQ{yJ#V zu^A_uthL~5@D3=jlLMZG@`7~RyTG|Ed~~}?er66zt>W{LT7bnQiB>skjQ*SG0)N%C zxg>GnS}Wa(?agj~kVX#&ydoDk3!G9(XLe00?7^Pa@1}z8wZhq}xG}BwJX(+CK1jIzB4^Gx2?o}KY!C#z|Mecrchzn7O)98 z3A}IFA&wuVZ4J_wtjww?b{dGKBLZ>kI^wWewWL)=+#1=9(jwJl(q`i?q{g+^nj}U5 zXGx+&oc$3dv}931zKmO&}W&#=;hzRM~Cee^+UUTEZ{k!|i%ysc!2VAM1Fx_xf(+ zB)SF{zWj$4Q~U8E!W>`hegcAeBwx^1-);;m>>g`!=!!G`&baTNuX3K-K3N25Yb7Ml z&-eP=YO?KHJOd7E#hma0RUEQy1z}P(cJXj{sz4p*PqP!KnlT9qXOe~X?u^{e5^ZH- z91XZxXg#rgsRS+j_Z%jErNsuQJkrYd>`Hv+O2u0$^;sTdH}jT zAM@FKdxZ!6sUtVPuL&75^|e(Rk3so9k<8|6Ke}zNNeunqvWd1wlfX zwTV5!jOZmBPc{uiM3@?A&t*fj-%G=!E`jVD@WHuFsb3-|S03zdwlJv)efB`gPSs&K6bd#!a5&pUi*an+~D zlxt3r8CvK51W^Q>f-px&q!g#dj>iLtY!Vpe1wpOwTtGhAq`8rdBH*_NLhEvx{4{#M zTZw<9L;S9u8_&A=3^>^1e%e`$tA4w~>_>^m&ittD=KEv8kFvsIlj_>Cw5!$Ox{T;= zZ9jgmb85bpr)k=vX?f|WZEk+1(pmX)b#?x_m*M)_6iw@-FjY%mf7OVuMLbyiX(WSG1;7XV;AjYx=lqQ--}~N%z#6ZKqdwey>?B`cToyHGTbT80mRp9UI&y zJn}Yb7FweFR=fSaqsb3lcNKX+ zjcy8Y9$&rlw5qZtw)x?+*~9GnRcuwt7&>zMSi1pdGq;|1u3HL#Jccjx=QYvah;QWU9siOiGxcq)`h@0t$&NZf zPM>J^jZ*FbTHgn34Y)<97!*bBK)S9cxA9v|bM5-uZI_$3XYdM8xO{OGtKas68xv|( zR+IU3^Za!VoG%o&3PHOcVMB(91Pi^tIj(ZL&rkEv&si|N@p{skW1=x>fu`EzMUY1#fEVJJX|htL1F>CN_kWZM zdmYNXxruwBM`wtpYi@i%Vm*I$Wk%RatJ~$5y-V)Zy>C>_aPTVAjk&$9D68ZE`Qp|s zFW=SgSArnT|6A*8|JG&E-`n1o=$bNC8D;cso8zay=h)VuX+nq7+8(Ov*I4+i`q`?P zmzSn1JFtp>TGFOVmbI^Z+vq~1@AD4e|DrzdN94hdxdN;1i*G=L8|#+A|b2W z!8rYLiL4V`;h*bN9d^zrBbWG%}~X_2xN zMW{KYMWrZ;icC)nEtVoni#gh~)2dCTl~R_cg;LGYDhU-)$h3%%eH}A%ez%_Iec$Kz znZJFUIdksoT-W#dE(_MJqDhP`sp3zq#SwfWH*c!q3?YyJ? zeDCeno5)u9;KiG*WzR(K23Gz|Iu^Rar#pvkmdIPtNe&S7x0lSiy0x(Dd|#uXfNu9t zb_CFENBgbNv2EZ)$11mrdIYpX+ZorCFGYF%@<2)V8%duJ`qT1S`OgHUVns}BmqeaJ zo6^}`{`qqh{oVdO9`>|zUrp;o(eWjFMe(f;p_R+XC(VCR3%f6)&Xx=FJ?ZIqZd?X^ zr(v@1^1r%kY^2&=utp{CF?74_=ENAk=z1O9DrS-Er( zSZdMKmq{E)Z>G&&1&u-d6=q z17$T5kAAum3tKc)wRoN)UUG0Jy}nrYc%1+cDKAKdhK+)uwm;iPD4x~O)lk-*DN$w>-l7;xLWg_=@h45C_a`#cE04sDM9V4{+;zg|S9w%=`o_y#X&`eLE;Qy_Gfl2e z0ArS;ot>TTdBnmMoTcUZWGD~56ix?m=XUy8>*M^)*zXRpVrY{nC`@W~fmWi63>Xdt z{mBmf<%o^={EaA9;edQeF?gi7BNya%^UCQeJ{_(^an1X#DSMqUVjNiNv{}Aj1W3^e zgF_AsgD_s3g+0s;?tfJ*=vMq{(JH5(X(f1{RX79(&v~Z;T)w(+1s1tTJ9hlvY(&Rc z>hhh}q#OcWd+f=zs@TD+@M$Euc0KkS6CXok02|8NWdWue09mlO?C*$k!>RH7I{fZj zVr74cJ#11F9!8;Qqagajn89|}VN2|QB=(Ie)tXk-pYWyHM=}I#>wh!$n=PWJ(}9@O zb~v@F(@hbd^7rOlJ?L?+MZ)E|;D3=>x;C741In-qOrUx)g!Q~d3JG-}nYP<%T)zC~ zrArzK%5wUAAU-*1F8YbUe)12;6Vq6F6=gb*+A0=_&d`957aKwD&jJ9>Edg9|3h+aNDK zKhPMAQ@t51>IzIL=ZS>d{yNtrP#>7vpV}zejQu4NcZP;2Bl=sLPj*YLD^Uv>fTkL3 zrFgy|_V0^?r6N~VdW1ooV33)HDsWLUpKE(_C;hXhB#ExdS1Kg|Ll9RQGVYo$O$?F+kS=RJNtl)t}4b{zMkQ=$c zke>dXHvU#HIUOQ)GsU05QJx^_>$BX8VHl-HFyY)Gj54ql^O4CMl!Py$1+Oj%Ea>~P zlqun|uKb&9KFok1CZAE@$DfRk$NW~~zE{nty=t@c(G196ml z3~E;`$`PCYJPVa&7jOXH{&nc^%Qjl6DAE-_W}8Van@#x=Xz3WXIANYcXGZy6Wmrz9yK4MRgCl)5Q^?Vt zrD7^Mbsl!+E(l`PMOrCQ49&_9eu_)&G?`8>wpGmOKt)?d%dTe+v?hr*0-q(^KNV_R zRQXO6YaFLC8)P94nT$xZ>_>zc5W6#}+iw;Ds7O~Yk!Q>A$U+P0cGrmB_;0lzK7L$Y zUdHDNhf=PPse$m-E^vXqmtLs7k_Ebcgb$Wt4QG~7@t}}#7KEMT2#-f%iMTdKMkm`K z@7xDVQ3Ycos)3p<4k370vJqs`M!5Y8b7%_n!raVACfr~l^fA~6|B`{XJ^ju8VN0&h z8yUU4M$z8UdWycI4)YC1$pb%kD$$i)Ts0Xq5f`2}UowpCtxg^z?U6$Q>5oW`nk7da zA?=0>R8Pa^5(I3qF8xufeOly&H1yAEYW3**A3uJnS+Y*WYy=rcD)ORooY>+B{s`C$ z7c`JtVSdE0+0L5sGN4k2Ls}cpp0S0UI9BGd2BT)LVTbjPZK6F!u_>T#ye>y#juY%b z-}FSE`pzbS@?L{h&Ix1@mlJGq9Da^RVz|T+@CmcMt_vT3%LUbF6B%$0{{tzk875${t$OngZN73gm$_kXaWFXM$x0;3q7!>RrwT*j|~WxL&~{!K_O#Xkr!GJ zm|iLA#KdXu1N`4#l0!Me=GBq^9Zh&CE7l?n5zIy*WP?BCzjWT;Oj6~s zv2XDnALZ6Ao&kO5=WyUFYMnsZBS_N`F8V!vgfUirtedPvvRO)ulZsF#6eC^M zv#07@;vTP4IiWi~gT62CZTXUu`J!6BG5uT|xHG4v0|j}r*kL2cDjjN&HK`6KQYq9t zkXuC=1IIxOTAvy#e!Q3o$e0*&?3OR-iQ^A7Y<&(6Cu6tEwh3M1LT?m9gUmnII z`1qE*0k>a)NXU|6Ria~%JMfRrZPN)3Y6mjNP{lU0tjYkv&2=FXbYZO`>_!tcFw}6Gsxa~-^02yd6IGTt9Ep_BoE}R zcK4oKx_{%wg9kUya={pT3VGY3sz}1mpt+SR#QD0E5rfQyr1kG?N|avh0kKc(M6NGk z^>EUI_kqb*E*=X}7=)}edT78R&yAQN8rqEnL48w$&!$LbjD|?;y%Sj;#^LwVucA3n zE004wXThZMWEb=s4S}m;$*Zs_l_Q+tPp6LgY3BAjW&dgV*fE`%q+vB`&dA9~rmH!- zQSt_Rx|O7$W&$QY)B|olggcpr5|g2F40xKdNUKq}EqG>suBeLaDw-3Yuv<-AV_O6} zS5~{PRM4eNiTfhjXj84&xN$*u=$AXGg;#5J8D$?;8DiC}^EkeCS=I{u0%n%m_V_Qn zCe&t5K%r>kGxxWr>=muV4lLp3p}W3? zw!F)`DLt_St)`moR%5rfd6Z_aj!!tCPB3lJw$qMn+kYS&`&%n)Z-)G&@{WAwX}Yvr zH0m(;eRKvho2HQj4^EFq>~4LynS;ZTO?Wi6jLg*#7WTkWe_T5RmTy%B8|;v6*seDx_+%*vYYxfeHa zcIT4JtRODc1tCXF`+k%qt-*yVuoK=?%4;bbqBmffPOoStCRP_-0D^-UIB2@R#1e1I zL&9jpuvW*BzDxBfsRAeIgh=rG#WSw!5X@81-GP6iVE$40R8G?(^>#+5oX_f1#(v3s zA`ggLJqiu-AFOGgt+3Ao@4BOswPGWTK*?JX8_oG1tVau=FLA1D-5t!5)^cy6N4`*g z?M`VD+0FXZVsEewM-0mXtOzXdyPu~{kDQP2_esa$;vHt&uRt?wzm9O$Hkc=i|C~7+ zQXUQ^+#q^h1^vq75KetTp1yiu`|_|;t03EO8*o9JrN@AK*qP!+i(>5DPuj>&QIU%1 zLtD`K`IlRCe+ef3CaBkvBb(!$UW(R$=^7*^%s-0!#9Hr~B9mIgCb9=(rk*|Si{Um+^P33jymbh00^Di~zN4SMS(4dhD_ z1C$Ik0Mt(&L8dPzqM@~xJR#&IJNZdO;`Fnx`M%YGAEennQDvy(@0ev zY7Sx#?N$-7JZdcDs*$@$OB~9Vf#c!5XNz?{_eA+F7TxaGI!F5{v%{87A0sR=_GUAs9>B{8cWhHqpj1Y|#_P zZyxeql@hvRMoZ1f5Cd_Q3ev_!sZySG7#uov7T<$NdcY~UFg0>NyZb27U7t?R$!g=w z5HY$_EK~cp^I;8_)F!#&iWP>3xnV|m8YnN?n6HI%v0H7Gf+O^6Wo?%7kdoG;Pef^B zW?tG-2TP80osS-cU<_{K5Lx*ApAqg~+r7!#AghCu zLmxVJUtlP5@DqXdVaA7sOCzZvn0O|$4HNGLXqt#F zkPZy1NwJ~_D7l2A=)5miLuLeF>YhzDsxyX?*YN}3iQ6tCR*zOMb%Ow*E;SrdajVer znLlc2e>G|LEeySeIphrs&`YP0G08e(YRE`z76@x(bVUrHH>owF?{*Fx=b)Kw(11by z%nJ;}%BHiDLmN;q^1x7NId6vYW@QF|ay%!%M|tQZC}QmKm9|9pw??L;bEEl$4L{7| zBB1BEZ!n1KrN2JiaZHWsxN1SC#(eh}SFe269ndI960i|9q1l&AfT;#ZTJ7Fkns@@9 zbJDn!wQ|{|I>|BQu}D7~PNv#peSMlX40-bhF4zx1o2(nrToxcKTh$YzWH+}!7?V14 zUKz-azOQUv_HUCl7=}|h8GL=)zA3%?d9ST#0`)tAs}PG9UV^hZP6_W~VtcYhnbDFV z)Z?Ql4YQoP=9|0Gp?>1X1`qW$DT3$O-+1Xrs(f_7=b-ym` z*Fj;a`?0cvFq{l`L}*@AmCk8>`?lO9=`*otwR;O8~m(Qp~{oCgRIm8%aP7^ z4f0NSk4phIDBmbjLXP38oXC3rkBhwU}-#a7FCdUx1#m+GJ z$TFlo)$o+)5dN;C_V*TYr7m<-;aitO<%cy0#lwUKueu6)q7ogHVcn@!f;_tUcP)eT z-@Zi#_b#a4P0@xASjm|h*FExLvCOVcJ%* zu*zU-3SQSRm`$33EBmm&7%&sL9k^dt7rYp4+TTb$l->7Z@w&Tn&rY0FMc{ zG+TWTU^##Q77om-!F-c2(uoBc!%${`^z>r*I7%gPHJPo?|4zGLw%y}n{wd^0EQFpE zmay~NEQws=SwXx1@)-ts5UeenNhcIR#0hq(elY_n$x!KuP{a=>R$~Cv#wn(@%CApq z6}fE*H|dN1k$olOVmG7omM~q+MAPjTNr03=Aa8lX6-<|D5Dzf(D`*`mhejCJ3?)ANDhQ(k+n>tqjj(~@EaJx3=Jfdj!+X;6hB_UCVdsJW)Y~{*u8Pe zkzaROQ&N>}EjD$c)FS1;3mYwn+#5@z;&;EDBls|s)uuuX!%lxvX{($I39g+f{>pL2 zkfjuqt0FpH_Kov3NF?A5o}Hfu&){36?VGJbgy{0wSbj~4DKz#7{x~V&Bx+k!sr#1T z@YG-Q^*619s10)lX5qO!3)ne9OL&VRJ%XvKMD)ITN?Mm%qjz>g8I;~-L7I&p{SM>e z#O`+Ze0SPK*|Sn!yP_Rk?nCQ}Q-~U6&@kxrd)LI5AznrBNd_u&7UTH8z^|u#VD&Go zvRH5xrtWkfN+qFTV-igL6smL7=d=#B4wlkMab?lW?tySJE zmW(^JQene}>29`xjBFi}3%ALUxcl6ZC?kxEw`eo7G^tay*5K_AeKFhU)%VeQsNo<` z_a~tjxOWl`$kj1i6}~9_5y2duEcvIz*$;vgBB3gE%CM&+bB5@uJg2fVEl#4%63SIa zVSB;WXbq-|om{M(%h*33d4fBl@lWv)#KoEP_HuubR+I<{W2@49y5E*Zi$ zpJoF}A0McU3L7>eF35(Ok~7ScD>Z&l^x^l#_sZZG90TcR`eZVlP^UHycC_!q#K_YX-gD8wC!e%%(T2txE}_voHGujE2fhP(6e> z2=_@@ej{!8Mi_EkA((wHT}kJJYdy7>-bj*_clrhQ8K6oThN{6ZeNeXqU(-8zNX(=q zwc3nXDtL$JvZ|&3X)G8>%6q#-G%H@|vbdLKThJSS-tgb34QIwc^d&&F&(G|JOvWy| zTU=oQ2m1&Qr|Js1Ft8Gt1$Wr=(xZRTE1j-B$LFj%2ZY5-FVF>lQ zMY+nVbkQFY)xXh!%dj)`GSRFt$mk@rY<=!P)ra@O@o@=e>mfH6B?GL~CX-Zbo6U)+ zSTk(~^=(p~X5T%GNXQLWmYAI>)TLAW=u3znr1gV-yrDke`up-w6{P5~_q6mh-mA@X zj^uLiNyuPjM^BsaEG!K#_$WzD;N>+*Y{{44ir$}B5HsU+lV~$gUA)&YF<=obDq9CL z*ljYqt^Ympd3t1YcdAVCQJA3!>&~q6*my64BfLW<&CsQU!vTg19Wx-zgvb%FE7xMk z@7fz($fhMvSAT1bYI)it()D{f;cP`Njrf4lgxmC_QG+Hk&4*21K*(HeK55J$Y^1L) zsI0jFNt?~kTgJ?%lJ_QpbVP_J;Q=I`H3=%WDGVW~1cN4Ak3*fwVR@>ch>(zTIp_a7 z^jWi{$9&{lyF-2NYz;X2i)G}2-YqLxpf+kW)^B9{Lt9uGjx{Wz)Slo7;4-blh~$Gg zc0RJ6WIy_ovUc`B|E4yi%UGr;u|jT?iI$S^K;(oTLoWBmgd?($TTD210E%p>xRhOn zrF@hRkuntT`*|q=_Fx{LpiR%28KFGmLe_3lft6R3Y8zhwnS>qw$_5kcM=;gQDC(n6 z{L}ybIr70v!0bT>-EeFieckBB!`iz)9YK$rGg>oO8}wQ*Uk#x}6Gwdoh&h{h$bvE9 zp2$Xj)g$se9lk*A;!QL=7(-=fEA8BCkU>wef{YI5D1(t8O98HQ7q;GnQfI#3A|AV+ zHBukekRB4?M)#fFz!d+GjQ>gWu!9uz*VFoBMH)Q}Hkbp^t6XA;sUITe1T&=_Nq*hsBd@Et)c>g!qJ6?&wtRv4Pr zhtWMVz6TTv{OJ`IhhAM6;3Rx*6NS^Y-z(_q#W^e}WoFG;%DSVEmc>Dg9nr@7u#j`U z)Cv+(6S3!7=dz(S{wtkd;G6 zb}2qJYSoDZ<6%!9{ULQMUHhCqixI=0%~w?R7ph4&F0td9F@sgdW*KAgUZp z{7KX+tLDEKlt?Q+&da~nVKYE~&SI37d2dl9STQVBAo3*}_hjbU1jAw0j@BvOMMoK2 ztWvE{ua_Ce6~9G%#kLaHYhYqw3OC0wA<|eI&6FjP8l?{>K?Z%(0{%E}4q{!(OJgCj z!DAjhth&Gbv)0yHy}4=1pLTQ|n+4`NU{rJ$CaOXm-rd`@o>-laHvP2$k_uuA!8j!NuQgWZ*NsDVu>Yc#bkselyiQqde zSaSk{2-soDw_+6{zVhG0$g}--3`LU}T~Xb=@r$Uv82@yCW(K`9DD|=6c)n;|PxGhM z@mf4*WVZGpD?A8IN!1K`*7i4Pv?@d*a=Y{Dd?MG3lG~i0y74o7ST}|Grah5*brk`k zeB}FsyNooIo>ynev(MpuML6YMhl$a}o#w*f%WA|3Sfhq`z<+bln7Ur||HdxosW3w6 zFzNQEZ<3GW^|Atk6BJ83&vk(+J}7D}ddn~|K$AWUT#|10f||{P1)7vS>hS2LXB$4w z<9X4m+O)ROcX-KDcl0GriBCYZq*-8VhZ;uDEs7|RS`HLXMC?9Bwl1X&d-18c!E4|n zrp`G0W%*QMCCWWJ)1f(oaxK@2ZqUM_RY?ZchL-rT)HDsqvsH1#;n=qTpWx1h>f%~O-mk{c>&h${ z&n}5}9phmph21k-BfB7O<;yKWN~0S0>!`Fjt!iWx`<28 z*85E_&9b2AVsqZY+UpOf`jcAGjV_~@E0}%iI@00iaNg&I2q-cq)#%9#ClEm^#v zmUojLeoM)F9~1WDDh_T~+NTlF{CNm6F4EQ!MrA(LUqf;}*c(QF7_VYnuSTbN5eq|ibKq}!lq2&5uKSniD(*%Nq_$J?_TQq;Qnx`DzRPH zN#28Qv(CyRZBICRpilD*-g7G(1#glTV5!0dVX+rX>=rcPZ8oEbvRr- zred2OxO4~D$QAUb?NyadC0)e{SN-^xM!Y{6rWy0i)+V^{9n$cfmt;R z>(dne;K}KPPgvy{Hx-!FAnEsaL5|)yh0YA2hVw%P=B=iPBX)kEuE_lf6W5@>o8(EVZ!2bjrJH0+M+|L&k&?9 z6q%zGf+}%}^Anefw5aNy@70f6*hLn0b zsV}rReb)q)utSI9iW|1Z*|D+v_ouDn@)^SUzeE!u;<|?N+GF}d=*)>w^!076J)E^7 z^4?jIvy~{e8GS}F_?pCH6JSAKk0djc-h_$!?l6dNS{*5NL&-6htc8KochKVJQ8T*#6Rr{ru9bw-B^4ZAtzct%xCH5);W?_mQlr!}hbL7c&SI z5WoEH)Fc|pA@2tGD=*O=2PF4l2k^VcFdGa(d+;-8-tce@P*`bB?6&?Ko-Flbvo7Pu zEe6VO8{!2%yPUBr>S9yWhLb}P%RtDx_`AF|L+)j`zWVNbk6-f?iw364%l9Y*qN_(o zkXm1cq5uR0g|wy0EXTlQ$jc-q5b>)}S>A~29ok-+HfKI=Eppuavt{33B&&!KgdCZL zhv6gw1)D_3Ey^Fn74)_GyRcsab_|+0qI-+BF?>xl(sb{@OM6A%p*gV27Mx(fMTHy= zTZdbH1@+!B*WsH1Q6#T;E74Xwlh;bYnmdmJbNqVIY1%8&8M5e{;+3)eN_vsU$76gA4ae@PEL``B*MSxvAJbQGS1me4Z#}s#X#DDy7GmpwnNnrn{Iob#a1mk9bAW^yVY%2YMKnTA?le4q2o38}BNYKo_omiFf8O>AY^da8-U6zT?(L z5(PVI>cTmH$gRhy_th7A^t{q%+YH|rX7$S=4p zm+UCPU@F`5BWCdx+haqQ_6lsJ-Sjs=bb@HRK%fqOxy2$Ui`a<)bZ2z0!`~|90#_%6 zX!ARv zpTA}gCi8S?$>_&t^P-w?c-4rGP#6HbY|_Wc^B+6P8eL`6xC=zXjc%Jae9)gZRc79%|A^wCg+S1!rF`&9c2Rvdac3* zj;g<3K_2{AD>`I`i}_)z3hkK-H?tElv8OSZq$5&47h2>a6(#M)kLdvwlz=Su9Piiv z+VD71Ich_qI(jg+ZU(m=G#FdcL)(}ITu%k?>1AgadxBx$C0O(_6MtZP7{~@B6cH25 zn=w@BHZTF%n>b~QYXfBSwTffrD7&8ojH1t5(2lc^UjL}f4)ew#`x@ieR%+`AM990a zB;Tqt3=-m^ zdpr0{Y({QfX;&CoDHHxqd3Ohl6t1-3!-f&)DL4IPLW((wXTanukY5;F6eo5bL-h9K zY>larby}K=oX9hu9)x>d4i7HBN)xv2GLNSM_8bP~f>TxX3r{o1`-LF3#2XGzV>N8y zcel=pna#C#xlVjHUp~b1c?c-f$$P-XuF_E@07Z`-A!|(};^ElCXHDTF+EDGE`}j|- zngWvtO1eeM3K^w!Jm+01*eymP4jD`rlF1PwHJ|xM+$cYpKqll9kaBv-urB)4;>fM5 znnU+zD6={PPd)6ajhVBtPCSNo2WuUw2nHbbV&_KdiXj3IeXcE)^b00Gq;$+du zoilId>QGOp{(I{k%oD z-X*L=h770fUYK@-i56KWp>*jKFv*-jUttOjSv{H>zf7^p4es-C?cg$J$|OW3S6w#_ zZAB(e)`LeeD1mfK6aHu-roS?8T^L3uT+>5u?ADD-nKgI_b>sw?Itzj*a^6)CoOu(ZdEz+ z;E+rd7!T6?uNX0n3k~Q7Qd6Q-#K{mg8_k?+RsZkEJF$qda9B|vJqA9){crP#b2yUI-Q*NNqLUJ3){}5f(2oI{?MqK1J?@I!8r;u+a8M$cPtge@A zg(Zy{eNrDns6Fp#hf8d+?eSr7v|LQj1@R%M9-zbX7!5IH^caQVe@bd2G;h=e8$`t4 z-vf(Tgk~Ttzr+Dkg!Ce=leZ?ZW?b0cETR@s@wefgg}3zP>yW7l+v+?LK8hX<@p3u3 zLG-qn=Z`#I=BObasR{_Kl{$(99l~oni|L6$?lK5*{IN}VZY%i;`2?3qI#ye9pC2Ih zf^#8w<>yABF; z|F@Vjs~ggi0UbYEtCF?3)1>Lx#N0hn;e z)JO}?9xE&-Qjhtl|L4(%v@266-5_Cu>XQ3*aJNhgK3i@EcaAWKLry@Q>)>aNDry0@ zIl&_i|BVJA#7j$>o2Ek+h&8gdaQOL*{SsWgQY)CT#}v}=J^P-1zp9Anbx8PTFL!W$ zbHFj=_4YMB%9&lF&{pI5c{fbJsyBF)iZ}#HKb>_4U#$ykdHlc}X4=+QS!05>`YF=A z#zG~$@L#Ea)q*g+MsI)dRLlm`o9-HLja8d+(t-u<@P$c*MB}B6lEJR(-@fV->Z^J} z1H8ZqKZAGegEk$a1iM}cd!~}(=01a?3^JC~LcGhiGVK+hiXCm5dEw~u_GUo?{b^BP zLqMziUAaI^v$0Ctf&sy=QSFq+;}#LmB&r*?jovzq z4ao>HaibLh2kv_VsYzXUNGC1FgUtS?FC98qMbBgVjo>P6&lFE2eVJ!o45fDZa&mc_ zaPnO8GWkD>v05qqSoF6}(GOsh8E;hj?8ydhrc-_0`~H}kuw3-@Hh z=M5MsJt`^et{qNB_VS(`K={%Hk*5TzLVmp?@>f1Mb=QFHt)PSq8($t(sQ7e@tIEDI-|DCD=IAkQfc5Z(+5F20aLzd4$ThEiov?d*+>@n6$ z_~s8j^Ohs>34a|Ua|n!|1LARWemczgx`calvNAYi*g&lxeOqQ|D;LQk_P}CCxCcaZ zo`=4SHyj2$Mli|Rb0NlYCZ=1Hn7|M>S}t266D?uDCZDG_4(^!d$k8^%-EPp40`&W5 zX~FzhmN*n_LH)m{gtA6rG+Q=kGQ>R}6ucQ=#Mq=U6|1zQl-^^>^_kj1pOcwJL*I4M z4d8cew2%b}IXY0B;`Hedv-I<|a!F29L9_hqk_plCXdC0Y&Q@jg2xeAw^qR z*_FfCaD{H4LXC@?DE{R(ytHdcuMXve-?T;*3CKm)eCB1H{A(=U@T-BUq7MvTN-xuP zd8ByOonrI&VV72&Yt!qNjPUM&<-2U!>?Q%R0`06fmeI(ZW__Vn%__Ig`jyic?9b)C zmLGSyf0l5}>LhOC$T9;X9%E||2AF*ggi{-!`QcEg!o*f^Maf4~$KW;Z9~`ce?LcNX ze<#S)_P~~bhZ>G=c9Tr_YAIDJ`%DN?CDvv|_H83_73n&NB;3Fyk$XqWMYBdper3v1 zk-xmDNr2)lzX%#)kF_dDI0!wFrV!nh|NV|Wt}E z4p3Znf0jCNNkrPy(503Sv>SX)G4$7w$*<`8ymw>B0tK%tUyGRc3c(lSp1Nn35;GR=7ejnj8snc-&P_t-eU~J`r zCA(NaXO!c_jR1Y$@{`;_x0<>kRQ)Uoqf`sjNk*IbKV#pYCcgqP7NPBJ?OA+gr{L8% ztQ0FawHfy9)+Em95f`wGH?&G4{JI>vSGW(_5UKy5-_4 zOFum5h6hd}Lvc)uRw&zS-)+JUT45HIntWRr#vSaQ{-6@lQCp!S(mZP{qo92;O79@e zF&9?b$Ol|*x1fxzodq~kx(2)c?#6Y1Vd!&`W&7MqRPU?&+L#%o{B;cx@4Y$#ERO1X z7@DiV;uQaFco?!oyoat5$Y<|Fp)2^OMwsK$>->;8(nxXe%0qpmXzr^UD~@rc(JzM( zZ{l!hW_4%hd~YoQTZW@1>7`MiNmwUU*?dPF`0-@fSg2L!4~SyV+`SoUVn-s1 zV{!Y{6}$ra?<>lO15wAjCB96&@=le=9us#oo1S5m##REc8L7_h^70SQyXX{Xc^poc zwpL^6JHjO( zS3{dNMLk;c=V$wa(m#oPFJrrIV3~v9|!D=FK(GMOQS)?0de{Zu1d$}35&BKt> zwYtv*Jlg(k0-jKo63wJ_9x2BuB$`UWF9A?7r$seUnWDt${vl-g# z%3rEAfcFAu@#SaCn^wFU6XF-1mNAdI2jNBu+u+rWjYi6)Pc%IH6%v%PtDpFqe$`4V zyHmJ-dg_1Sm8mRZHZ?7sp0)%})S`Y7kE0?5kJQ8`S)P_GiZ9Gz`se2fif%4baQYp3 z=>_R@k4)5kGo7AiIXYOu`$8Ye+de@Hu9x0p*hZd#Fu8OkHbOt&#Sp5mqmvEkns_3| zcK&ZwdyRtW@YuLOnxGyjgnd1C@TD$DBQLB*Gr!d+@GjH#v|>b0BWD0Bq)k0+Mj$p;m0}WiV2nq@ z)Hi5f9&BQ3ubVhp#|S4UF-dF-^3l=$4Tq;d=ih37?%ef3&?JFTddpfFqmDP%Phk~^ z3Vv0H?u_QY84e6^(1DBrWFU-rrNZ^!9xmU`3y`GvW^nJXK0zZr;tL)8*lJ0&V9RZh zW1BKTpJ2J8Nhi+?Ja9|AZ+10evQpXhP6=W-6r&XEr_&2(JT(J&mL`}k$Tk=#QFtIB}-HO4fU}Dxr(0iM6c`C~v z6J7^>*fD$%)dl{a{<#i(f0sCaCx?DfN&65tv@vOO3Ot2U-a(A%1rz#Hco)YQu8QgJ z`5j!NT%AhSvmaw)THHWH7x zyYjao`xvrNS1|($aU7>YUFtDcrso9saTz@KPl0V55;;n05{aU|$&Oj0{{!W|!3qK& zq1-1dQ5N`Mgi&7H5<}1Q&EUw?-i`}#t`QtCBV)Re&R|%La!FsN&0=ME<4HD(%#10m z&5WwP?Bc#qQ@GX-Y1_YOLz7@-e~mR+6MB+CuD-{hHn*C5bRk_)K;5o6knShWDq5H66pQNdVKC}=czMH~74cvZ4+xsbiHi1KhwQ9_Dze)bxH~F)P3ydxd zjn}1kL;W1m`vm;#C~5TgNPn+duAFe`Xq}{zEKgTgClJ6 z99R5d2(>v0UQU|P-Fg2-uo>6y`OY^7F((rHJJ;Oe;Yi!yv2EG+kAr7dJzcGeGBBc0 ze9?b;-|k3gQ1ifz49R`ar8O~EgRcs`BQ&Wn6%Jp<6r1cA*5?x#+~2c$M_=ue*vG9G zLzK&&j~mNftTh5c?>*3z32x;m8>7o=<8a)syve$|TH=lp+-SY0@HYY{Hov;gG-^-@O|xCT@SHaY_9 z3dpx7BpZ?Z^I3WAN98hyhgWtxRPBm<`(BM=ut}X{Wy*L*S;BCl5DacJ;Hl&XMigL1 z$a5^hj0ty*m<2&a-;%`RjMJWR0EDWNOt*DhM;&tTuU;j3+ z=*@*Nm9{Pq9csr_ln7k>8vDyi+v;@8aTk_29p(*30jk40MQ4A|7sGo6_qeU4j~}Ng z{qODu6@o#UVcxP?b%MRS?11FW+5#{AI8+(NHYM}RAnXTvdlG?xXTWJA8Zvr-!chvW zpQ(>zUm@xU)({iOb1$ztidT^@UTo!)*3oRh8`R72awfzw#YT_m?K(h^I{&@Ubs$zp zueg{%8}bJ8rzXfeZNPt&DY@2JMY|CX(~_^%`quh;@`pa^%>^_Bk;U7Z1Q_U&H<|08p=zlOJUqnpR zU12mqCpx_ShjysyM{emaU1F@lqnD|jjly>#G|(V}_7bSCM@=t+f>N-84|P0AW7U&Y z=+@Y3Nhl*9CcU^7VAtV zhsT}oQZJoXPJX#aeFiaAC+Jg#c1x(Ckg6i2oM7X>!2h3ZR0#e&iQE}DtkeZx)2!3i@QN_ISP}@sQrlNOXnhZ$NG3 zK(h%s7_gT0K2tel6n#snmHDhwz$#v-arRxf*UV6#s$CIV(^Mui!H!ul3iihB>ScS5 zZ!?B{kgY1cJC<3k76Yj#T*$ypdZ~_x40GBR@kl4 zq2y2QMsrKi1&bSu6}^_^U&x#b%y%DQ{NG!7Vh@ylmu!VJPU-;&$PPHmlb2gGTKLuNdDBjV1@SWkeN>_OLBDU>_-HA)<#0%r$^Lw0f zW&J;{zC5m`{Qv)T&beEAsc7#aWiLWexyM+_k|Illu3=;^iV}6-*~(b5j=e6StYs~< z9K&EpWi3LNP)bVL>)!KwT{H8U`TidBc=&HRb-mJ~VkS57U35;Lwotf66#ZN}y{Md@4hzE*|N96mHD zV3O<2ZFAC(XAXO@rLg#`ptLSKi19ICnR#y=RG)u(JcU}b0d9Fi7Z~2#2)xe-$e?8k zaSE@G=F0GFUUoF)-=-LEtNnGk@htCR%mo}0g$0KUJY}DC(u}g{LxI`wK}*Q$qqY!d zC!YZ9UmX&#KkDi|4A-hi72!mBd$hSK_cMKW0QX`?Ct!zigM-z+mG*z|O}FDqPiUg+ zlPey5t5)?fwbavu(-S&|+UVBd|dP4GamQ z-FS6Z(rk6s|ib5 z-w9le<8J?2;Vb#2@bmL|2G z;D{du-cKlYjaq!G_FVa*UKG^W!K@y@wkpDZ`Q;B660PgMIA0L9Hb^~f(nu!Lb%iYK zZg(=d8tH|Md2p9XSVl#7kgHmrY{`?q&eR_@c(y?pdhMX4OEX_@v~ormG>xapYFO8u zIBMS27Z&hOpQrkTTyGKADBcb$|8msTJY3mzoWr-)VY;xvjOKDJygODIlb>O9Z-Gx= z=GFFLa2ixTR^XGu{|bgP`AM5`X3f83Gz8ALp0cCu(&eA@ahm!NdaAJ_9v$v|dP~NO zr&Z@AE_p#?VW$qoPPzxksh*$%{QzkF2Nufz5doPxMdui0H`s%|{YYQH$|(YQGSnFW zsOH?ExJm2-`kZC0;^isL(VMbfx*s2=EiHI#`r4^*=%oeE=bH+^6q7rp>jqqg(e>~v zdNe}9DL66|-|)w+rzt55zW2r-y%E`QBD+0v5DuO^Q#c@~)kK-mfix!I+*uvIM{PA| zsVY)GuHR|%EVR83Y&4+Fe$Ca~ELJoQb${aX*M)#r0@*)+$tc89kN)7ruqW>>GYWIu zda?s+DA*nAqL<-0p)b4&UCul3>zeb{gg<_u*zd$o3mfsvLGZb`4lFLtgEXrGM?7cm z)|s=@DZv9WL04%7?vt&tis}Y}WH?2k^8(c59UFdtp0@hEBRAyS;#r&SIC>8`7gC-> zXN_U?A?Yr~t%Ce7$&dJhKnieO{tsDI+h7E{du=9!i>1@3>i+Nx6$N#JJ|H`F?(y^^ z9c$0MQS4Qm?CLg2U0mE4aWF@-+Zf|8%DBQRx59st<}X-ez3=Oek#MK;`W zfD3~y;8k@WehYvhiKd8{Snm&=mAj5HG{KQWktk}s@#-OOp88R`uhXO@J;=gdMHeR{ zsSbZE1f@IPtXKYF`+l4QSmxY>g=S$gnsVSbLY9F)#rmP`GsMV98NZ-2BeQ}^;a zHS*((L3=zV@hRQ(>`)UD){l%05Zu2FN9Y81D6oM}L=S4Q`??nGMLA$0jmBcs>QNvU zH}dr#w`|e*8L_T5OQfIneVnyHP_e4RYlNRafnf&P3G1saTvx51{$vOZw}84HNN|AH-K!0sng2-=7+hC#*+3 zAdoqb*`yf0r+Fr6v6Ux}p>Mp7;rvF1lXE=PDprTI-iwh<>Aj)8Fp;08X|;K0#*Wv^ zr>aJ;z9I4PK)gXUoEtDlf6$nqxL!A_jH94C znIUmm)J}#n{ubqtWWHD#s0TLRDd{%o@sRg8>rD4|RzLcMQjIY~uuh789;As;1&~V= zCp_>A?NWYtgdprNVBn1tu(!G)DzIA}YD*UV(|aQkVH-)!Z?IvL${@qAXcVnO`Kw)( z{9J^U$zaXcwu|2jamwp+l-ITCr}hMV$kpUsFf=6;ytwc=R&gx+>0KF9bYPlABVh5j1Y>R>WWgw?j<(xrDZS>H zg(E9rVtAu@BOuWgBj^L0L;pjT*xJG%Oqz@CZaj&LeS2O&Gpq+Zj^PX;qpfsn-ZXTX zEgSTG-q4&$cLn$9dOuur$~VZK-lL=v)h5EsbI~Cqsac{E-qb83=`gYX9!8E$344Ub zo9E-m^}QOBG4fUbLNN?+EC>|1jDRZP2lEjPW-4Ru_<4c+kSp(h9%Tn4eQ=x!+~bo^ znZwhzk=i2p@0Iw8#&{yx4&wYl#8!u#L>xx7T!8oaGDFgpIJQLUb;4aQsZ``p${sqf z+!AXLKHqW-iop^f~bTE~PrQkFVa*CL7&YoX&eqTzu}2QipH{?I@5L#$Q=9 zQ(P2Wk#!zQY{=MOsh=QhLL$><2+nlcOR7jvB=~dltOQ)GtPfvW-Ha+c@&~}uBSSC8 zRcx!ERD<9;*wKNe#MSmb%y2T0H@k17F~o z9laR24OTug#pEn%eU9AZz5LXTU+k~{VVPNX}GhyZwAtJ(%b=wkRvgeY0=5LKQI#bcTi#l-u zzL9<{y`z5kL_jh%W9QKm z7Bl3+!FdgaTrcSO#BhNzpiD{GfKKS!p=geqIuR>MOu0q3Ab$ZjklWm>tCDj4oh3yA z)n1R&n-{k9D|k0=^4qKM%#<5Wb2-(S$0T4PpD$f0dhTbi0|omnuQh-AY0gdZrntOC zMU$W|T=C?<_wc;dcwSSM9bMtff88e__PwFyjp%4I|G_!7sY0PSI%b{bc`&cOX)q9S z8$T-ALN$r90OxH6E%QNQw;l{cuXU~%&E_(UGsM@>^P9DU5v)Uf=oS0DlsA9rg#M$M z0f|vpW$Ez~hhp2L@DR)GDM!5*l*Pzad)E!H_K&9~G`H&3o<{6iHd=R4c7}!NPZ3t zk}5d1)`|UfiIMt!T71)nT+b8EyT0$)#h0Xg59L4Sbu5~PgC#YQu}y~+Z(=X`3eC%q|BzB}K}H_u*Wtw^WJ za+^NNI_ec_*^tUXF~>AztxrGseXmNf%o|)G^X=dY^HW>%Q_pluDBRPSe7Dfl&se3b zyWF>@uZw{!?pEFv086qc9~D{qeSRXpJ6OXDy2zI$RO+hEIOjC6n1Mrw4@WEC@3ep* z!#+}sJ~JB{_rR1G!iPP;8d2`)U_G&W(XZunPb1dyTh%(sKDeVnZ*4CBN3;6->DKk} zn%*5o)1q=!ir0Rzm)i5xwfsYwdh2a|iapTwC9CBYpsbaQ=p}G?h6uH z+ly{F8oa!yb-Hh`iXU+^`J%m3l5?&fpKd?2%)5s&vE^3Y>9&@JfS<_jDtjP%`UA(H z@ztwgtlD-WHSzrr(hY9`NzX%*rFKl(BP!!$|yjym_c;OV>1&xm9)4L~8Q#qJ)XN-zB%tTV?g_VQ=}O+innjydOtE(Rp=b6ig8SK{z>+I zQ>wTn$L~#US#ci`dFOy0dU-1?RVS|DsJ9|<8yTQ6VIZ2`bcliz*A`Wd3U#X;S~+eH zv(Q-wR#k$J9=Hfqc0ppKlMcc1H)Xb(KNBCE93Q(exlzWqm1%!v^%3V*=J#G=GloJ_D z*);*HmAU<(ZroAXA}MtE-UihhTrg=mcY<5qV29yGfmL`c->eTd8cbOv+Sis_v+R{{ z=LaaV0BgwZ#FnX-NsCSkHzuD(p~m9F6O#mVqJ-zFyYR{OmLBx_hIZo`|5VF#ei?%|%FkuIp z_K*swbdb7W3G5Clkxp!Gon=F&>%op(O>{pXU0E0CG!UYVcm76SVo2H5&a8XV(zNvQtS>bu743UhF?44 z+#wy&wsxEkUATj0e=;JwV^)Ks7utvL11b;OmcQZLO#?qnROW<0AcjaE2YeD)CIL%Y>z26F$ zGgU0r5%qLTKvkd}O$ejvLRXndePSs~Ii}dAK3dL3fNp9ZL+b8VKJ8E6&}3PnK#7C0 z+)>GW^jFB41Y7{P`PV-}6YOX{Z^gZtpcUP$obyDV%lw1dsn0StWFVjbuOFfqVtMIH zA$m;W?2i6U8|;tqhc7UeZ%c*}Dr!Ec92ho)hEW&znfDIA713M>F{b@HbDqqUm3+Lx zS~0S%jEl)?=qb$TrX^@9q>cP@eQKPD9SA+N`c!gjSEU&V1(hCWVaZ=Hkqm^j*US_8 zf|pPQWF`jJFrQOjxiDxjkIrto@s` zfK~b#Mn!Rbfy~@F5r%Xknba{vnez_nNX7DP{V*G4f{4tEdzqKemU)&0KfSu7 zcqh2)`#4iyeaKO9nm*8mY{=-gV7%z<;U>iCbK9-!1^DxAv|=OtG9xKvsP#=UfFZrO zxLZD!#><)CZwHXq0++j!$i?F`3`Wfc;Yw6wO9A>*QOyc(&Gj#tpLZh|Mis2+44Y|7 zYFNh>ZbC07sR+#PLP}e*rznj=%hJ9YN(>G5xo@;`ft}qg;m26ZEpT~c$U2A<4B5FH zCeCf(fUv=R!Fh@p%n-(r5kTeAsJk zkZ>PY&+D1*y21JO6=Id)MC$eRu727jrxpL;I*2!dny!c)$PwN5SALew5zaq@;;eP+-W242;?K}!z13Z*jP;{gH>)bG7Vw{* zJKGBC4&g_}C}s5d8059R7kBGcLdQH4z+aeo&m=1Ch2#V8T@RoHdkt=T)#A z2NTqZ@t`ZL2i=JhCHGsNFKqj~j3eT?V&&z_FO5m&%*2MWeTtopr-nOX?|WE;%~OrD z&VyI$Rpoy!S$~EiTrVRq{l%784;12p_SSA52L^ANz->5WC1on3V4kDMUuwiAdsX1^ zFhWFz+r#Ue8#8&Y*5dbN&!4|~717kU8z zgZ^DxsHV)Wh&hRW(RY3ljXFXT+mkK9W2$AdH6E2xIFdsoF2iF#KRL5T;$G-TE_YQv zU#sf_WZiHt>dG?-=orCUE#LD*&=bFbb~Hide-DCwhp?&LSx=$L3a4&H7ibdKpcGe+ zwPXe49{T5oFShpgs9JpatVRN!?eT5t8?$dS2<8+C17|;<7k3C=FJ^xxM9dyH+Wp4P znOe=Col<1*dWJ46A7x95^vMJYU)N(yL6@x^lkYC+gW8ZWV8nZ!$rdI zSDumeql_3ZC7IU~8}lAMRTwv%nzU*VGb_xA&RzkrI+b6q1+9;=lkPdyIip7$%0}3b zZZKiO1cxb5_Sg~~lYi6KZqvUHI4@8w+y^dxuu}zDA}FNH8eO?Xn67cRAKMV)f`l=2 zh3V^j8xvFb^JCP5VcXqVIP=6^Wu5%0`i;mDQ7a3MbKGXK0l9zEla3H(F15zBfP!7T z3$!m2rEfj`AllHM;k@REZNf2_(wIAuX~@loRbn}19j9BO&mzyuEiCInlN}fO&VZW7 zM->v7$p_i0YZu*!`gUA|>$p&;?5S!EH)JZ;t6oeCF#gg-uvwx!xft$ygWO?-E{6ho zN?Hm+?bVG(_K1L>O_L{^0**xqw*;WSG2RB=~Bng(n!?$^S^=>sI2!dIR~1 zJbgu3=nTbiB6=%(mGsOvdapkii zijNF{(fye*pPg~f4_Jz%f1)$StGN%${S}I~qg;LGif3gJ{Hu0F=FqOd4N_%wCGNEQ z$hh-u5kt*Kbm;nj)lpv2+=QZs5cbP_jv@Xg#!j#tANucc0=PQOfo&%%Y+bTx!OtMf z)Zvy2q&2eHs-IQsUnruflHne?!`5O@7fE{2-xn;;YOXXnSG?tKGJv0NlU~f@m8!&s zGx7`KJ8OvDYy*<|JYQ54rtBp+_g+XSEqb`73v?KB2E|lXxdTj}w%UP_`jVCS?+?b_ z2zE>pK_aHWe4GuphOn0~d(!2uH8rVy(NO5P@17qs&mOEEIz$1>BtfFJZ4e*UKvcN|ylUCKX`$4e@ons}oR)zSkl!xg(g zYnc8LqP(BO8rb=8%vVj@uD3V&<|T`zkI@UeL}60nA;PpsI)(2|g?;<7 zY3erU3G((gZd%|h2n^v)Ulp#u6srvdmS%spmeSn? zMU#iql{7at0yd|hbzI)I9`G869PseMul&D7ZVfw5QDlZGePn@{^d-CG5~T|_6~)(c zjNM&CvQdqxz~((sSWsCRXFzp?A}7rFhGgYMz?|dX z-v4nqX8(m-Q@U+u!g>xkeAPo2sJgC7w5CW!vF=?y@jQK{8QtAZ==kGbt*!W#7csbk zOuxeHbQiPx`LSc-#$KXZzJ`9tvv1^Wv%`Wngf#Ebhq1rgKjnMEw%;g-X0kG(yS62TSrTuRo~g6HYXB6T!1p)&|4^8t(W-cEd*s(IsQAFhh4P ztFJ!Rake^dH@~LRJ!-zl6un7jZ0n)lSQRS|9qT`oMn{3n)izKU$|q6(T))^4xWjf# zZ9wckaYEwWLrlgKBZZC4MK?uv{s3P(MqPY;?W`j4&!u}N^8H|&;}K)z@1#yBhKpIJ zRuBX4j^NOwCev`2cY9yj=vUJ##u^VKrFs~1h!JcEp47-b+7jEpVSyjDg(2XMp~=0@ zkR?G7L^S(l@e?E8xC_;x&w?M~PO0Okhs?ldIV_2dOn^gyHBSK|>Bsi_I&QY5^ACUa z>UsdqF7yTFNS*F_e2d{`@M;5~x-JLg>m`z$0Aj@mOPu?w0QhU= zsyHkFY~a;vV<`%fR$xLh8L>{H9Hm?hEiV-gj+&Y3vNht0nm^~4dEPU^S(@l444bJ3 zCWeygyzp~43k0oYZ)U$LE$!1;R3eDl)^Bv(xB(9hZsmAwgNd&Gd(q}&XCc-#)^6P> z^g^ziHSj-MRxCm~Ya^u^LX*q-rc(Ghx9Y{^WF};dS=HYjq`iV-frSsDF}ue z<0~}dh9P~l_ql>5MpE=X3?U#h273(dA+>YV@Tuj>P8T|&cGPnD(0+_zaQi;M5k*d;Ob7gI_Q)BAQ zyn4;WWk${~iWhuS+uOnB%|86ihokxOHhU4-+ZL)%-oJhF`gM%^uhi;yUAevH;WOX8 z`f_R>J>S-p+=#=Y+fjnusp;d^JnKGv2K+T!{ZA*S!Z(k>?7FabZO((K1dTa#cYa7x zB$R!*!cSeMwr(t&*1Tvkzv5i^y?d(~_yHk)XY3xMD?`|ELu@D=Q4E+m)umQ*KJ#sK z^^1PnVbAJ$13ppD#zQvK@cx4Qg6LTdXNXza%04~d&PN_|JkL1UA0t*U%U~ z98C=<51qb%UK6LPHAX^8=ObMkr+ zJ~iN|?a$=Rn*rt`i-_@C8(+Mi<7Kk&*SJ~QRFi0Cw_=)OCJ;=Dibt`WP(h7+F_alli!#;fj$H3J_A^|e%$P4-8U5pW$d@&AuG;}K zP45Vlk<4BJnQX{y-{(=6QSo58z%op|IRYfUWW(?`>%ZG8@6k%OaT z{mB^eWkp{UBP2|rZVyqqz`563te{WiG+Nud{o4tveybz!mcz$2zl(bQtcv{}m-{&MBy(U_SJ$M%rhC#;E#% zeG1=`w`ljSws+<$HOZA;)XJ~(`R*Iwq8VEo2gHhgJxK(W{I)iKvy5X>t__#k9|NMq zMN8H%IL+;}P;O`zbfdBok$bQdkjCBU76L~ks(#wT{hyk1p%gp~-C>;iYDY>-q0Hjb zL)jQUP;+s@etXUKw(>8*p_!-=_~jL>trkO<7>Lp{AU9pteSJH+J6N*5qPOvjAzH-6 zu^n#j`;G9LrOy_^t~c0FS9Mw8N<-v(LvCD_sPejYj$2!2YMUAZ5fU4)hdyBUxXq|u z<{A3TK1q{l+bkQQE?;Tio7slaVstsTN4u#mopVEa%IB5m-w~9c291?T55Nt(Kv%ed zD0Da2=_dduL6p;12yC4G|9!|`$$G&~0pQ5#tb?n)$k}OpMST4Ew$Rc7`@OtxAKqy| zOPTcxK56$aTn?(WgHJ++vcPQJ3~6^cvy^!B@z^Q4vw~>WTo5^k+`WajrWou!hTY9Q zT;um|nQ{xRV^od+`rt71MkiQAn`vEgv}bkQlfjfoqH3HBVWnS~1wf|BgIf3hq>100 zU!n;0i~Ols;n$6BXhPUR1YybWHv9WAT)}O!!6%2O=DIa{{UTgvv<$}yt8CeW(4tQy z@)v?#2CSfH6B7q;qf3^nK7rjT)p1-@U)9>{L+UgnhwzX`l8o#rR0>kME4J$ay5x{^uji)VB8X*53Q ze2(+(%HdxyL9p1AMZzRnI*^e|q+Md^1WQO_l;g>dO7EYl8dv0KC>1OPl9b-X1nfM3 zH4AIhEycC_{hEDrYsD?u6RgA>H15NvKmOc*gtlj0Dnz&j8;Gi#AFP44`IjV+`d|TMdx4|4rQ=1vH9t0wwk5tpxf_F25Vo3fL^F8N zvogiUU!8e%U7O!XK4#+QMAw%1`ZABb#_i+#@F*xxfP$vcpz4RThy;Rq@<9z^l$85I zNvAvd%D41=p(=#f{X$2)Y(yu92T(cLV;=>(_fw<0Q1$(}3N63#&!$b|hpDPS_1Jva zf(Av&G|jNMS$ zX+51UNWCvuc(PyI%kr>+mV;nebbM#GklJOk9etUVUS!|CeX8EN6A3m`mPt@qgK*~NDvzFMvN!~tm zkv<85Ln3Y*v0W_QoJ#0^y3d5S>huxL7-~S(^$_Q62H3TXTy*5*CaQjt|8pk|qA^U7 z-A?Hjo*m1@#w={Az4)A;;o4ZyS(Bn^o`RmzG#lIvW=+7TC*E)P+ct}?FdL$Us%c8| zD^%3@BJTc`U+Dv0aj$is>H1Ma??B^8^MOS7_$)|Bqy)CG4~Q{$;m0lTH*IknHBI4{ z&*~xpo`!^S*>&}j_Fy-S)wjrxdA|jiLc>%6;JE6}HiiBW&Pg9CDHiKx_9b|D5Ex(A z$z|o$;7!y32{=NnWbtTS#OGc;c0DnTI){7J9Bnm*fk7<2vlpWA+I57W_Q!{S;MEW@ zOpJ@dSe%?~0vDrK>CbR1X~&$3>bw+F!ARLQBIY}d_^qY4scf_>=c5KOO>(i3J)%ZZ6xy|C}j zB#J=WLO<2}UO7E8;x)c&rwUY`zAP?lT1kV06=YT#{AgY7|5IL=!Vbr(yl7k?%H`>Y zmr|Z{<^Zqo?njagizPY^)+2c3y0u(v=Sh7ZM02xn*tCpqWVo1rx~3o6TUYFw#PIS+blx;-h!A2* zS$H7GI-gtrCV4r3LG9IvrJm@)L)p3@)igGzXB5*#==a)X{Cbro z>i(RJuBW}FU-%iGcKPuB{rhuPC$e%x;NKGmz&f)L=4fR7RG&NY-?cjumr;(MBnfQ5 zU&6gAtdd>Ws_^GW9^`kloSw+1Nc^qf!Tr2EJr0B7MHwHFP3~J60PL1>izy2V~EI;1NedcWj?fxoQmoszvU@N+YeubTu*5MGx2Os zR%YIP$DF*74JH*s+%Qo`_05Gs2ZIHAD#KcOhm<5yz_8KqA4J*^yhpb2$j9BEe{&Ev zyW24Pptv-4y6?Bdi~Pea3LChAx~+H^OmlxYz=3)j(l0>wToN@4TpGEzJET{;#XZ>d z#vSKZbtf$p%cloHWSBiX;E&$70(80E(@jdjP%Z5zwImFXl)37PE?CASWb~mJ8onid zX%ATBR?!%IHt$eu@w_^BT}27__s3CuaxZbuKo};-`nVZd4cO0lO)w&TwbsSE$Oa zU}Vf)H5J~Lq#li_mJ<)b4tWXJ(LnTmqwRaQzx(q(AgyXrV? zw)kKthAg2*6&enO!h?|H<}T=|#o&H?Nki`JZp!_4S7@PCz@6*E4|==0>O_rtz@K?9 zqG>jA5mcVamdN+wa>1Vx?1QKj)_JbDhk0 zLZu>F5I_tmtPopehbjN}iKE#cXs-4?!BbZ(hB17p4Wo>=L5arUqOcHqjc;}0_4eDE z(qR-Exd#8zPB7+}h+~MyF@1J|x~4BFpj57KPBN+syeE~YC}DFjd%|I=GU2RQd-?=F zSI82;Zu{#RnVTiPj31rj-vnP+7|3auLbI+|UcE4fzRM5I`;eDee6;=PbW9b*2QGuK zV>XbD<15SQ2oLbr_!<+Lrx9y{`Q|s~{*LNg|GDhzq_kYLQVWAwXyz%OB)|7343F>1 zT@M=n-@k2@h@>1dVPEh^qAAo}2{NJ#Kk_HmwkF<}CBMQKI|wT6i>;w2V|2^PtlXkxzuSs{B9lg?v9q&zbfUk0a(sW<^>l)(%_x&To2y4Vtvt7ne~k zmKb5IJWR6nNf$<`CZ@v-C6|`9$2~$7q9 zZq#(>d3JbH(p@ko3R>p(NdhT@DCxD%UuGianm{?)&`Ke-5F2D=p=2%G71UX1?l0PV8d>)eR44z%5 z{58wE7EO4@)S;ixm&7aq=g9Rp;aHQ($`f*fh37e2DsBTsF5i&2NI*|ct$S|;$pwD3M21;B~La1fNs{GC6)a&Dm<;&>3 zEEzgQ;hCv2{R5$=LhHY^Fxn#r`_F;DfM;vy?UavYkNEROaUI{)vNQbGn~MHFWB}e% zeaS~knQupmOu3I+T*p1=a_YDt*~j;)VO+Gb{jdBh<^XXZrIHM@?%<}MU_`CM8b)#S zWDv_FP~oVI!pq_>Jq)t?b@wzQ+DE7#tBch#Pu}|-KUzqQ+@Z0q&3hQ2ai{jC(GrGT zH#N+d`UzYP;nDg#{=a>dj7kWnB}I4mYwKF$oeLK%Sa5thd@|>{gR6nd_I-#rV;b*x zLs3x*_kC#F>fry>R>}nswnX98m|Cs4dxw9qszve5>>eL|PGbrm#?kDOljufl2sa)A zd)=2~VFYNqkaTg_;)fS#mtWX9rYNs)8NnGi5bJB^MfuFDF|ZYuGOD?Pz@MGSTcOq; zNy~cwSbTa2yrQb(XkUJgI(aor9QIVvmp7@98N#B5yja*7YZ+E=%FQmvUZAua*UOr! zn+Zh}GIp-zaOB-MX)(j<5d(Om8#OuvFOPGk%I)NOkL`FJ{YwfBW}rInV4L?h?^^p0 zvaRX7-{uUSw>htw)SqkH`G_xlk^BU9j^m9meft5!7ExKQx4N=f-xNzHL$Z4cT%65r zgu*X9l>;cp5?W<`Yk^zQplaCw@`$k#g{>n)WAzUl?xPETsWG$|W10cHKB-tXtl7KD zC{q!wPHmLAxrM&X9$U&sY0_`!@)f;>WVa#P$z%#r%ZBkE2QRjp6P zLxVtN%Eg2@ z@t`u~dn9e9*+WkFAny0yl9&$nCxTI3i7-?opZm^oJLS2-FN=4jj|@n}>$ADlKt8iN zuMm<tHp*@%-n@u*r;6a5jBWUUiebH*Y zpeNcPjry4=`NDiNl4r)zkV8p9->A>GyqKVv8AJ4oLO;>nF2@O|AIkv?q90lV0i=7c z)~xsvJX@XIaJ<>C-sn9av1*mMguTULY*`~JHBNKADb>e z)r1@rh`DLBHzi-zdTr>#C3b=+Nyb^zxSK+)cJ`lg)(TWti)UyOS5!C~s&BvH|GY5? zha`Jw%FF$B!8);Y`W$`=RkE1+r*K+bZ z0&V}|n1eCV-TTWI)XKy`kyAz4mubAmL9 ze}WW0q$*~T{$TUF!l6jbuCQbKlqLgoa+c#Se5L|7d*EYjy2`nvniD+y9tV- z(U$7kFo;@8sdB~ecq)6BI`HcZ3{ELB0ufbEVj&m6wM?D#{Kv+sZe%(7rXn!$FSPCm zE?;FY`5eD)^`Yr0rKLubPE13lLtozCmbzjmg@$MP@XZbk!1W7^S`4SY3{%~=kZ;i^ z22`MSiYU{5OhcJ=l<#(b+E}>F)9k;$H3btIjZW~Y#^lYKFK_Ix+P_Wdda|>aT-b}h zcOVo6ZN(IGf+T^vux0EQwY@DleV#Lu7Q>k5WnTpmKwL>_8ei`B`P`urVOO$+uAE9O zj^7Dn5cL47%pV7r4%C0bTeL0oqy2M5`@4~@#|oe>qRH_W7^eNIEzj&B+7fpA4TPn^ z>#`?+e+Ja$^vcnbCQ<&1^-IWXQPhIpsO9;d<1H9DSXijK0D8wC;?bK9wQ$AHe;kD#zPJ%a5Z?s^<&Ml2#{m@tN`~Px=M~ z7)YK+&4kKfo=_w!3qk=%Z-i&)7o*9fn&g#{)Wp%hl924)s_ju-lwx?O3o1=vRp>;Z z%mi{9)q}cK|96i|H(W*V^(MY7h2;)M0FoMvBdZsUAqm_WmrodZ3=?85ncs)Lce;@b z0ox4T*w9cJCJ}ILZuZa5_bW0t+>&yK=2*F}^ZRiF|J|5cfwXkfBgLGy#E+Yu`Lv-A zM?u}R^Yh11od0Z4)}t((M;XJq)N~(ypHM!MAT19x1B|;}a z8hJKZRwI|kl^Sj9THE+B8_i{w!G}iu^eLC+}^F1$xf7p}HzOcgv@UvMNf)`#T z(|2j`u)E*@l>%-`K9%7NB?7YunD!G|!oaMnqwEh~o@kOX8r1Crvzr2byr92pvgZt^ z(U_*T78WaVl(7da{GglRDP6$-X3gTudqZuj2O6+@`b}sT6r!6Nx5UE%OG!@%qAAet}53kC9XC zS|L)sAsKCU|d{x$UXWjZ~!?-W4!SsXzQ`S$7fZMbGdELBO`ZEE)_yroZ+=6m7Utx+ij6;-`8U)$sP z8g*nD{~{!>)J3eiT$tPOX}>`${=)~PH1M)PFEE3~KIGMe>bxE#Hi=0ygC|jdYVvrb zBaI!%K)pC;M~aQGH4f2+lbH9Td;$d-lkC8!{b)I&xH>Z>EuXu{v~mTNvEjIPp@XVY zRt)JVTlY5W``gUi#`B_eYx$heoaUFs)(ziYrYl-MCMwPiS9E+lrqHxJ4Calt58ECA zxh263ziEbgER1PQe?a++)V9xE+IoA2WX^*y$0JlAjur)I?7)j=x02+cf}Kw&|4;n; zQ*Bw6qsffT@DoYZuG;u;o^Kt~dv5na=OLd;ontjy>m1cDi-)&=I;IGyXnuaLSix5t zwBV#(dycFvo^LSXp-fX5mZvF{Y4&Y4;nD{eQ7u37r+g21wAo|ZF_JjsavNz4mt5o}MQTUzfPncf*< z%fAP&n_8GYM0L2W?NM;srn0tvAGe%!&RZ2#7OTgv8JA$aD)!?&MZ-gbVR_$|$TW>( zjs~~aqL-=P@-`1etESciIs`@NN{gcsII22|N=Ydg!U8d}g_b*d)CA#TxF`;Dtf!4n zBVdw9aU)Sm*{%TEOz0UC{r&kWuo8fbKSOh6>k58vc<`qprNBCGhep5SogewfM>w>lZg5Yf@;0lc*?V<+Y91c3feBhU9ujd}Em<^IJCUp_(OZ_0Z+b1OvT3CKAtStEC4L-1m@#(3g1V&(?oOc6 zFrt=5-2|XfaR!7HQlws@w2)(S4XT}#s*92O`}E+kKlC1|B6J>^peZ+p9=1e8vmF(c z?YeMbc2Lfh8{?d*4@^%db~OC}xIa39%g0Qr+KQa_5t0DfB3QUr7uJWwta!t3iTRIe z$bs?i4zHUU%M_HVE9p{1Rbu~~c%dsjE9j4TLRM`a_E~)#ciI9nP}C z058n|cZlv%^fYy>A@o}^Spm9%p`Ka{7QzCd?(E+n-YuFPrD1xoSKZ{3dS4>AU~F zZ{*u}2ZnQDuNqN?)$T&&wq< z`3sher`)^E5y9{K6?#w+N4*s}sjMbLJSxAO9ZZM_dec6!bcya#y1^8>GTaMoV$q`m zsOT*$J6XF0UoZZrCFgMh1h~ddIwZ=77=f1<({w&RAiEpvHL<=G1xH7UN?xx!Jck*? zRG#K?<)h{3p!h4AGw8x|LAL4~{p(<=JF{0r4x5O{SG9;bQakwnT#QkRK;91%0GxpR zI+}uM3Y@J-op|)AvC;&@jPv;&!NB)?X(Cq*KI*yVS4-8A@13~~aZ_|pR8V(Ot{!3UVgVTTq_eXt33A9|b=)+??5BZXo+dTiNJicTOGKvk@_>FHEJUa=Ccp z8uT;DR$-v5h(N}!14yVsq*2CO0qYEfUxyiTW6&q)9h}?x<3-k8%7yzwSc;@?WQrz* zU>pPcOCj&RoA9d+O+4a0KwykPAqk9XJUJ{V65cBRNXdJfQQNLTFC%%^OFCRFWu}E8 z0a0A%CR6+<>2^4l!Hza$-%!dFtw?!9!s^8c8+5^$*6_J5yq zX2xJJD0`U@S};YD$Z4fryF#W7trSX1bK3XlZP6m8U1`y(eNKCC8)a){T8WBcvd*0U zJ@kG5Z(MJ$uB$ocInTMDd;Q(N+nJf0{RX)duON7(-_XSn>1T-LtZ>Sz6Qke2gI7bb zmB~fI=;AS8{1B%gf#CJX>hznZ>I+p>Qo*ZeM4!In+z)dP_xombQRJ3L**?R;&)nyy z-E+znu2_)_a%<$|Txx%c_&NdZL0)%a#GaunqP=RnefXQtWLFB6Iw4wb0(1MpsiO-~ zTTZd1;AceXwD%aBf5Ho+1HqK}^Bgb|YGGh^dc_E4u($d@fM=Nu~n4o)TQNYz-l;F4NKjwP5#rVBEl z?1#*66WAnsS)#4%Je9N5^CNWErCfxqjc{m+hV;eWWyt8dYnXs}*NFtJOSmRrTT@x- z5pH8m?;%L)gvqZYeVMUU`9k)hG5rV5x!8)>t_S7%s)^GDs$=EgWQ~i{{fy-~ z;dam+j=@V`%(?$0;GLfogr})t4RK8YReoF)t*t#Uvd-+qE=OL4l*bBH{ZUM?Mkkcs zGI~@-&CF)r>p|0UiwHpl$EL0!a}GBn`vJrE-~){(g2 zY|Qdvy$!&8$w31ir93@E=;-O0{!1Op@Hh0>SWWID9qZP4) z@87-l=nOY>jg9OFlAYp9X1yXF9kVj%z8>j1zEsx?lP{VaCvADyRQ7V`m_SqTgqFBh zynG@11o?GDgalY`2{1RWh8n=T1m>qZy_@UukVuT&3|)j);ewDiL`bslGEV~-YRv9X zyR^OD^#sJ=DaC@-7dTa<0;{4W^BczV^2hvaI2cen8je1Et1OlyMd3N(5hdX%w$snB zu}8KVFef+NQVQ%D+?4su0%3kPa`9!tZ@3K^6bq4Ol2Ko_1L4*Hm61A8y{lShI<6tUXiDTWG_+Hsyh$3`+xuX6}br zhF~)1%TZ99u~CuYSm$CY#GR5Fc7`!}G}6rob$7xaUB(#m$UHDvZ4Ao?fn+Ns>lLuy z0=n~$+-$L}#(Y71X&SdXk_RaehBJ_*o`f@=Ak`XZ2i*}9;dd~X7&+LRxEF;@&^cAi z&5^Y20wa2go@A+gjd`o@0jV8Z75N+X#+lDFJgTu95`P+JF`HOFk=) z?j^vQT|@lJJQoZ%{lTPXb^RCFmg-DW>??Bf%L9H~S7be}@`d?L|&kMiC`NPF^brD>F>Stcp%<4gEJx$ES z%CheOrZfBV*CDWWr-&DqB{_bkkkb$~=6@f~ z$4gIkdJC2R*qB`*DE~1Rm_!dKX_@=2_gdukqG?L&v7-G-M39KQGc{5yKDfNXsaz7IMfScA-kSbQ-^7wFqW@~ zkZ#{V^*LgzF)fC9A5sDu0-G}Pmb_UaKa7tQzb*{UcE~?vaBLJ#_<4TE7J3mU+9?EZ z?a$$s(F;vf#j8dVeuteU&7zzh=1U2wDE8AfLnuIY==^R>oAuMxNf1lF3PG^;xy1So zSjjv&i3z)jM6KQW%@FRAziE!yn63Ort_Qy1kmF51U!Y&P&75_;MX2ml+emn$cSUwX zZVU^Sn!so9+rRJ)lP+S{TrkKQi*t<`E9(0b9XbNoPG+pFHmxEhyXoIGyF2Ohlkp`z z2_CdQ$UhBOVs2Jw6PAG4XROdX(=G%MkvKKs2CYaSl9mo;`-}uJwWc=?XIW&Olfk>_ z#=Ka|)}2$l1#fTEZGY8u;yF7!#m&8RLdguAPmYL(;&c(sgLU6=V&|Nf<|uR5#@db6 z9#C4FXy$5CW^+9Z;Xn_F&h=)_=zU)}k>Aan<`b9rQao!phS4h>!0?wftv;UlZ59|l zAEqcYX4O^sJUayHa+d$L8A%uTro%1Gii2Uj$RQwG82#u6@o3gR51`)`1xu559>8lFet~^}Jy^-^zU`cVWSYv!`2X>+E@D zFIFI(g^zSE9CBudI>1Gc2!dv@X?gEDvHdH1$TJb1hg>|N`wuymTIIq6MW+9^=9RT)|Z(k`?RdTd~8%b4+m(P zvCc4&%J9|efrp^b4%R`u0qoGe)8<}M6~Z)NL%2MPr(+d4RIoMNNHs=as?HN>H7CO< zn44?fkr-gi&cPH8YzS)_M}bCq3K<-i9DQ5BMMiLM8%&Vh#EJRjt*_8wh+Pfo`|!*b zCW8QE67*3`UhRfg4oo{^y3=W0gP<`NV^3{g&VHJo#`bVGH0e#+x8J^4yzLO4yvQKA*FgZr52VCT#rs~Tu{wMI# zh)t;2@kdwBLLKplpns(Fg_0Rq_mW4G?^0Y45K5o=`p}uXs4Z_Sw*R4tQ*%K}buHE7 zjk1Pe(^QRjDD1$Q#+-#2Yn?_M`iT`vztw%vpGkDSL?N4Mn^Gq*sfLU9F=lIGU3rQA zDx5GW^Zthns)6p{R3RUv4gJT4d!|t?f=3S*W5iBOW-=CBhRc2U3JcPeY)BPL5Z*Y$ zp11K|@{FXnjThl|B1US9ee!XcNXu559KHN^LE?3Pk;&^Qcty<039 z1*M|cyND3h0UZ8geSPq4TU~~ANJt4ks6XXg9CmxJXkHSft!?;Yk6dDP0qamzu|M@y z(-p-T9d}Xh(u=M8t z&a>2(nN+z0h@ab(PZ!p&`dKAceD8gTyF_3lGr$n+2|W27iN$HVf0ijP)fVsXrlO*; z{ej)CwVp!MY;l0RRc>%ltg@K}k*guqs`aV<8|3JHf$_z#0)Rygd`>?6k1P8LZr(KX*d3wNic}%Of#W<`=$$Imh1plaGfK# zfJ!(bUc-QjTpkhl`>3V=rdzE$#Zv%(ZwyY`|?|LtXP=0ncBP zS3a^lvu}<4$)-MIyFmQq<9&p1TKABw5JdDe#J(&qi&C3(qW__CZ28PH1_xq$v^C#H zys%_?pKM6c`D3xKjOi1z*tyf7LM5U{^@ZlWGE@4>PfYcm*0_zTJKN_(Rdvu8NZp1Y zRuwOSkP^{6MH)1Vaehwy(?PdB^?}}Y5b`ErAXBq>pBI(m+BS&d-?pq*@LMSPD8L3w z?79x~zHBC)G~iDM&61zma|gMsCi^Z6A0xNJ6hleLn-_i8BrwUAy$I3Afow-5j~&Pw zEf?m`W}FN*3w&%>?}4>g8!`uH-ob-BGs2Y@><$vf#=wbpWuOVB20@S4Uy@G-yXdu|Gf{o< z|0?D*Ybfq`X010d@iWZ)G{ruqv0#Ec>}HgJ8_Mkub(j?}f5D5g?R5})WIDuZohT?G zP6jgbCHS7V_qWw?7e4NAnfTuSl8N9yu0ThIH}J#OiWFU->Jx^psk0t^m22Mn&!pt! zp7Gn>mS&DBQp?dlT2qjwwuhF{!JU}N+es-;;>4VXGMOQ3 zMoU=gDUjr?##3iFzs~exF5pzQvV_M%&DXtN0+p`_0|Llzua;l?@Wo%MC-eQ4H`Rg-0d*SKRh5)7Ajp82c+%;_VoK?f6(#b14q#XU2(3wtG*Y2r)p z@1$fPGu42em>kN@EzRP_<}}so?bkl}`q>D~`@^0f#9$IIfbcsjr0b{!SEsQt$yMF% zp^zu~rpj>YrYlb@u6f3T#M+Pd8$|RHEVbaL6YEzGqwWF=?F10>x*t1Fz|Mrj8JfeD z%5jZ9o|ffT$!!Ul!>b1LCA;z@(;1V~)@1%r#^oqamByTPHC4PJzxQRV%o;}aTVaA8 z%>@g{7!Ns@4O*qTZjL1zKgVv*g1S%?3Zzw`%>{HXBABQ68bf}Z#O-M+tIp^Y&Rty* z_pe8;0eo5H2P0+@%$KFZ&@UJBWSv=OM@*poYA5N$*i(tqq&KM$L)8F=VCoULp1|@T z%?_A0k#M7=2Q-ysb#Dngzlzns4ut7ONYd5M+5}F1ZwBetLT-CjQ}t8LcJ=;l%1Io; z6U-g;l~Eu&Id<=XK6eaMjjrUCu}C4{T{9;KtJBO^-THP748igfsFJz@ZK=COtaK8=;{ScG8>-yQ$)Ncl zf*L#eytc=eveVq+S7$9X9)TIh2$>UdsCdO-+9H*gDx^h{k+2bZbbK_Jxe%q^sfvlX zQZqk-hd{4zXg!ncL5ex@2rmYTyEvSf@G09#2q$UwHQAix?rN=rvalnc4cZ1Z2v54m z&u>?AWPvDNz^k;rEg)|t-!9~^FVBCLMo+g!@TZ|biq{RF4~0&WliG5Bfm9&zGVrm0 zApmef~~`w6Pz2jp;ETy^feB9iaO;nctN+;r$x_w`VhUAgNF*mxyPjU+mnY}2G z*@o+uPcMmtW1(6{-NlVbNI?(dB|Q2q?_&c4NLi=Y`ua-c$%2!yX}0O(75M_N8V#uF z-cZp(u~2f2TuUjO7#s1aj?{CWn5mR^hd~bP-(}CRX1_&ptpXAUHJ7_`O-=UGAY)5! zSfGipI_LR^a^xmx?5&C~`3=_OVQukS?QWBD5+-#ZuguYx4PJ4oq8E|QZ?P~DycEmc zkfomML6sb1tI&guzvK>Wn~#LXj}pvlyn5pHyq^K3NzHD?WU#@njidK=_FLNwkUFHls;$E#CLa$nl1%RGKOBWZ!b z1_InMfuHX|7?9(wYKFcxePqLQQC(R1i;mCI?tl#fMj&8}zqVd{u$Vs6Rnn9x(3zkL zb7m9q+m>z29cvAZJoY*>PqXClt$;rPi(W@~ldi{I7%3(Zam<;3!SN~MT~t#s)g|40?g9n zLe3SRxe;(joq1OC{CnB4O1U#wjUt)t*h=?AUSUm3VI12zYKSyOzu{@r9`csjZ8TZa z=P-}iPhjgg-*1npQm3xWeAIcmOVfHF^9?jWsV6F4 zid9Pw@P*aX*nmU2;j@SIWfKR%^cLl$=Flw8Iuq9IKn$WF2&{$!&V-T*bI#uxM?BBY zMTIs9=7dVO@>2tK#1T)f>9Zu;XQu83Oldl*{JR%g_5F_3Oc0Si$&q;9pN;W9As6!y zRwQhYH-EODpt(@OodU(EY>@V{rr?D-!V~p_CtKY3>{)H48}@QkyrzGLU7g+$GW@v3 z5;Aqf-$&?#KA^g1zybFjpnK7$kjz=cHYy-T99wEjNr3(XSz39ncK=G{-gVk9F9rDy z(A^a)zev=6jwibV-E2r66}FqaFNPF;YVFFI5M0bvSi&!!cr(0h+ouvC^Ub2lzx6!K zg6DzOfEtqx#BNX8P0<5qPMXW3H~ZnToBiI(^- z8o*Avb<_-yl#rm0YQv^$+I)(n=^do47w%`Ur!V$>)J%K?IE?7HKHV8tuJ=c?X4B#V zwbCzjww0`zki3K|VG4=rpA{mp{CJD8;y9UA+x`q^O41XxudGymysx!xJk>+c<{EVq zu}iUEzh5E0VfS2cC1ZyMLRXw`pep1J$~5%`@mI0p<$ebTir6=9UhIp!mO_2mKbS&@ z4wCGWkK>YwSpS3ivgW@o_iWg+VBFF5I*AcLV)KpjT#QShyf=13Fy}e1`r}8}aizdy z*PT0dk9#xWp{OAVz0WxY;xSB~l+0)7#%J~wO{4YcliUR0SV9uyoaMA^=Auz9Ca`A@Zm{Doy$v&0K+nncRm0bMK6iTOoM+FeBoP7`DJ@PL<+zw3K;Q>9#EJUsUi8;f4SrjTn zXFc_(e}cKp4E7A?iV_Wk17I?f+nEfTSU?nQ|J43@X4!dyUFXSMPUf|FGD&kpbP}!m zJsxo}{m$wUU8&g8Y%ZRwp9&2GUBZ1hc;km$Kw1gKbi|{kase1+b5o>duAP~dCpTL@ ze{uP7P+4?(7fsQQ)yRg3pLhyJl(z)Lw>q>}+>wnVI*QnTSl)m$(vw6AGo%w7R~E3V zV)+yKwLoSi5Or%KG_?eC$*ZVr0NY^zGrU`iu_Tl%`)Ay$k%y+=ujjVfYja=lTd$o$ z?s?v#U$9ZW051>0kL;M*@&ohP@}eaR8jm-{@aTkpfL_bhA~*Z{x{``GI}oNdY_kU6 zB^P;D?g?xD?C#vH*>adVpt311LEH54&tG#Cz5{ybfj~u%B**(h)B1AF$CxL(GRQ1G zlUr5d@#L`f-;I<_|5XID@zg_L6Gbr7RXc=wcQq-{j2Q&I?1D7&UzU|msN$|xdi;J} zY7wzpA6CV1k94bs4t(a@wi&I)?!suO6DoR>x7v@n4++=Gc^&V6G_Q6ZT6gieIDTCtJ`TWJ)~^-2+Z3SbB`9=xt+)>ae-p-DyrRCPRowZL+6y1csw|tn%x{yv^+L&8^22N^uwontri|OFjS|IHYp=D81NtnH zH3lTdw1Ed&?qJ%FS?dJ(AG895O-jh0u{Obe{5>D#-?qi$C@8CDkBiENo=*ak+eD-e z=jhA?86=s2`^NoBV`7fAVk~#LX_;F7qCJFhpYAIS;qU) z)Z}3XUi??>VRj`KeRWnZ@mrJpg;eaNgTyPLns@3~#HSA0ZHvMCDG6|(7YvPor;uHl zvcdlT@{DoXv=c4aF9Z7YInhPtVcqI!VpEn-c5Slpp65M#TE*cjJfO$ao}p?GZrGGP z?NUi2woxU6Ywi?o|6&mE-XQp`hX8@or-+dEsb4bBG~FI;Cf{zGeOaA(hMVB79as6t zeur?+`!i$zdLnfpmY~zZHzR@kH=z9Y*`L{)BaNg>;PY5+1|g{nrC#vFd~kFl>0UgT z6b?btz*bnU~OY)B21o3vhEhQa{Q$B%f`r2H7hm3;q_Sy^%#X5Nnp5sFcqI z=|^DSwY(gAgxD|<7FdGZC74cD-tKLYw(Db$F8ZuCDQ$P&DCg$5)|b+O4{_?;t=!y|zhlA^M#d0@ zjxYoVO|IKP$d2@apt(@|u334P`dvM)8?$r_mv)t4s+8lj?Wx3-tba!%Ne?DiabAzo zt-al8Bw%aUu}8$(q0@GpVBa;b{vz)ctlgE}aUqW(nHL$rY~KQkKSX&XOiUZ3iK1j? zOkLWXD&?LtA;0zMxy*^1|K1$hw_9-GUjvzz0mruM%(yRH8Q5Dsp=Gl6`iwdA8|$l- zrtsy(?kYJ(-A5*X(2B`k_!fGn>xxd^=&vs^hhy5b@7uX9hK2@&h$l3aUOjFqBibUL zT%?=osNY`~v!T8}lQkhuKCy)SlUZK4x2f8YnMyF*ow4FNN=-yc;c`o$6%&W;4Ia=- z8=6q1`~{ag%a)HW{B?IKeh95t>LAY)sF0j0_%{s1t-{l zAGgz87%CdNGT)Z3V%p+l3YM#t7v?M}T>2&RVd0|j;f7473xX>J5RBa@Llyy~5H_~V zC2U)!U`Y0eiY9vp#x%;Co^mUiZ{V z@$G@Kw~;Qv`K?x|iQxK|X(z27$Hh06_qp`$r1v4iT^IDO_(SlhruU~n+Vh_j0!znH zP<%%qn^DvYp7aA=rLq_dj|v5^cI<6cN5Hrr;B7(VEq&ICDT-B3`Ypda{Va~{&4c{v z!SIF$Us^ym(Xr%!H#(hE!mC9RHv_VDUsz~>&!vN?uth%JW=6?e;# zrl#d}rslPL5}PLHT!1;#4t^Y5O&YN=n&N{zW|_%pB1HXGdnZ?(&CSweR$yWCliU;i z+*JWRUv{L#H%((lCi|9XCtR=!$|K*@>;vbe=MT*}z4KCL%5lQaK)RB)Vn$_F%bUtt zK4o%^nW&p1w7;sgP1o1rB%YSr)9fC0%kJAj9sYS}(@l%#4+9b+rj?IV*4Yj|V8S)l z26U}>w=8!>X4d`Rb1#&6Eo_Kbnj1vr%%51e_s!@pWlLKoZJsk^$f=VZ&&M%=aXw#k zoYw~6=(yAd4p3pCoA>h{Wi#qvMXxd=?M?6nWd`_=c&Y|b0JTvKzrUYpdv+|VUM(lqBbi}hSa-wxIq!;vY8hr6G9wy(=4leflo#L-k`Fw_p{nNLkGy zw&WSg9WqU-B5sD}H{Qd!CwYSpWNPY4%iJqkD(+3P@AmlWJIxn-Yo&d1t42@NeEXTV zm0PyR;J~8ijted%tp~}^b|m;xsWR@s;hu2KjRhtO{Z&j>2G8so++zRI1S)D8KUK@? z%QyL!Y1~1JzsW0P}HZ?UiHx6Hai>tu#E0gfvEp;9Nlk*$Z%>fIo2zjzdukA#BNGE@PW!btVieC90Md{{km=-3U1a;+jN>iUeq(JkAtqljCi z+>%spl3}_4L^pJqU5et{GF~R|7)#tCM?L0tC9fp8W8l;eL=V&1;mih7)%v8-Ga7ZV zmrqS6nt(YUxzC?7dUBV3#cE6_mhO*Uupc;0Ozx@{%Tn_B2j3#Xq62K{#Rqe17vh)~0&Q)( z^2A;+3bA6^z8a$`WL;WQTiDxr>$>hx_@#GB`+0EhhkSIoHsM2B#E`md#>ih&J9o@UoeuSkJ?N_T#fW4RD4j*wVnIinC;~ZD~KF{VklUpDjzA^ z&W&!{e)E{7PWyQcfo0kEpUAOj6>bdAqh4fI>>s~O)R`)L`9()emaIwX0ZH{Kb73YI z;KrZ&r9XSx1}7xo&h4Sl)M4}>iJ@c;Nk25lO50mA)ou-Hr3LZ#YP;IQ2pe9046#+L z=mB99Ixt&B%uD#Qtdzeq1%Yl-=?3@KfC0@B3WgiW2DNA+#@}1(E`ah2=>acXTx=J{ ztzOIQCfNRr6P0uF$*t>pL1)R|BKi`B8al^LCj|L?W+-!-WbXvIUHg-Z7R(su6${|x z^h+xYQ|s`g3kr_L0s?B z6uI>3ha-lBksTCqVtCpG5+BK_=$SfaC|`)Bo3@V#nX9hdfkI7>0w&0qzf7k8PPYt zW!x$ZxTFj|MY#6jFn-}4rIAGEXjUr^{ZuAhtzEW0hQ-2 z`8EbV^Wzm7mI)H2glxr%=Tc@ntX#onl>kqXwUxo6UVv-a- zC7v?+0qzGq3~#Uf8F0JhO3dsPQ+u%62X`a9h^X9*8vM&+rDS}hp-hg%O`WjTtI_0b|RQL-d!-Z0*vDDT%y`lqzxVD3T<|B{4!{U#my-3eZzbprp8T-3J}bU~JmHpjBqP8lUeUj{G2S zqDl#X_E|(k>$4U}d?ki0gDLvB5q;Qg!y}OCQY+y)b7BNPR`7)_cLLw*`nsp^n2O7q z_&6}D@ zmY8_L&H|EN*W>|o$AK_}^f4sUedySpK+#3vdUn&`j!+>&VLCzvrBnF^$kc*Y(EUlJ zx z#MCc$NkPQ!CN3G^3($RZ8`wzE{>Kk8>hT@OB?KJ4S|s;Pe%LYKv=!S4t4#)^MbwXI zP#e?g2z}=9sRCX;CQCw%zLPm`8CmN^bWa?=pUBD`*IaTv#!U926DtDQ9IVS$>u27Y z@iBcjucp@uzUp5lG5~ro!+1&6n6%vr67VTqE|4Y6aC`|*&2bivKvyEvNhS;N-c;~t zX_Gqg+Xr`$c|FlY04plC=U@l+P#}Db)ud%JU$NA(ng|KMBv6H+ zhN3V>fOOON8s3nge)Zn}wJ%hSDUjc^R}ZkHr>9X&vL2_fDJLa|UF=_*jY=jPk8S3CB`SD-t0c=AMe@~ZF3&n_ms(C03sIENLE zb?Y5Ea@9ixFcywqwN@?dYunK9&mUL=a|YDx^uMT|xcC9ZcnKuaJJ;C!Jv>O+I~C{G zes~@+I^kCe=jmcx(NnRZZ1bgNeYL!>WmWwj`RF@1GxW+pJRcoz@wvJ#Osu7ZXHZ4ux3tJ48g{<|7_sJTtn3@ix&B{fH4;d*Gs74tcPHg^-NRk z9eKSI$-X!o*cq(I#M{%D^1*#3+AwzP(=DEoJ&&>2`;JmsK_q--hMa|+da;X`7Xq2V zb={TG4&uB1WXFis-Y8A<4F2B5m&#{gAD?k0qfcv1j-BExU{G(>r^iHC_zW^+M@Je5 zdg+BM{z}!R$|iGBC$z{PlPa%P?!yGu^vi^k4KubKh}hPP>!k5MNoNlvY%14GH=?`n zf#(2S2-(HS5bgIppo4B8Q6OV^rqXC-WoOz%AU0!NK&>6E&cuno8+FJIkVLmYz8}FeJ(%(3V?^~e5j$Yr43J$(hWxBQz0YtW z2%PW2&YlH@yH%IU)!QWP`R!IOwS50OuUzemSd;20UeK&;j21C-**xZsQu-R`Gr>zO78T52JgvW3x4wAP-?8jo3a3c95l35Usci^fFb94U=>@RKDVuveX;CTqbEl zb-*3)>o^!&@!rXJJ`1u}+Mz|?n-UEYOH9PxzB+o8>(#_2p$5k1L`nsa8bG~7V3 z1m|p!pvw5J4zPw6JNO~U2}J@+={I(12cz*$sRM{3QowJcp=k387{XNm)2o*GpV&}x zp&gfWHWG&Mf%UJSnXQ=&s*_VqoJK+*8BPYP%jO%67p7(tR~qtaY&0Rk4Ec4wFft=z3w*%3(gh2h3$Od={6PbZS1LC|RDEJb0}R*? zZ$!|^w1!OkS^iA({&l;VCA^9*w}+1z!)`q$g85Wf8@vXen#wnV;JiJ*vmf@OjyxgI za)`i>*YKt&e~dB1XWqB-aV+NNSqb*U*)gG?dZ#}|qNx#=k>I-Z)~!o8GTwGCUdjYnLV;sg_9wRBB`@ByqXh=?L=1Hk+zZ~-aj_+D-`Y* z)*p}P6qZA{CJeTfdBM9Kj<9AOnR&}*HJF?Ov6_2ysH=9u!gi$Hi#!-^tM77vhy_Wg z5ODMlx(gEBgLp$$?+)atsOFmw4ZPv#%iBC=h7mRq3k;M*SP}jkCXCBI6kO0rAkmkW z=kbIGioOfzmeUUZefJf`Lz!n@!b01A4(;ZHjhGDzbSAzU!o!vsz_#4^Rvphxu;sHieA8{K?xS14R%<5d zaugSTV5RzJmClLUvbY-zxtXKl42`52VuAO2Kdv!wjN9Dd}aKr&M zmhPj|s|I%b^abuR|FI5**Q3m21Ho#x4GdX^2`s+qN_)7hP1$NnjTkkD+;iy@k(PEg zFFXoD9C$v*eUV}*#6RsZ9O?A;aysQO{Tfs*U2OR7$4_t8bUk3%I2tFJT8dzuCKWmff(Nc@PojUc;qY~$GdZ&dc2xeA8l9Gs$RR6gyhh)Xs`TGZghUI$ z@c_jv`XEqsGJ*>irofh>!cK+%knnl6@=9IIDI3`E910ykW~JLN zT~sHc&j}Qzk~foLy7maE*KSWqXmn?ck*X>hQR<8XeC5mL&0CY=00;P~9Tig&T$%1{ z`W$_+Fz23nMZ(6PTn_|05i6a>CJLq3B4=m`;h-4p&@s7Hlh^-8;Uky72dqmsxr`~ecSG{ZLQ+~=!Z{8p)<}0$~v@Qh~MCJbp2e;DN zaa;JV=wXsb^Hg(#$1LST9jU0|?hOLs!EuqEk1*$H6F70bBjp z-uw+Vd1bFEV}cbAjaoIQPLNj5hRUmJn;lN||GXMs-t}_G_f_m14WrDNT9W3f){=^| zl^$y)%-EGD`=nkY+mT_GVtW3{L&bepqB95ZwJi{gawY^NQ0!?!o>`){V}4?-=nx@u zGlQpG(ge#M+ z!X9keim)W+`~%14nXw0oQFSDp13t}n?X&jX7f7~MxFs*^|)f}SOuJH5(38l+KiVSDHL?rs4pdQ2Ol-|Ht?n4T_HQT67A82hNebzH|4u`$M^Phuv3_O-*_?ZQjg+EtJ%Pje@8#sn@ueI6=-*u)1fCd)}r}9Xqi} z!%LE9!X`cFVVE_U%E3Ep;z=HDAv+amt+;a+(=S2hIajXS3_`+TV)q@jaywzQ1`VA~ zUh?_*x5YC5a0^NDUHWG3bx0C{jVtz)riLMRH`ANHrx#IrNHWLh-PA&?_^C?})M|w7 z%(`#4s`MY7*t%uJVR@%tqwDIN*fV_Qa9~PgPZ$JP%>PL!0(L{;83~_=^kxtF-=qL^>V)DeTcy1dW-Kw3 z9izVeK5GV_p526Yb6Z!@>frU#m%d$A0O_xrVS)nmi@20B%;d+$%G>w(*?md_trDlvA=gn;Pu;({s-r=W02h0 zmw=|`8Tu^EZs=$-Gn8x`G3o_HhncJB89Ld~0VCSZfG{WHTpvkQzm*;L^FkiCUgi#5 z6yhmzeXR@_Mg|9}j<|8ZwGp;2JdpNBB#OU)55czn*cH1oJBP#A0HeBX7-8OpE!#Q@ zDRF?@5PHV-Z0}Ep->ju z2XuZVW_&+A*C>x@hv9wNzNI_p%ih4v-kSIsD=Iscm(}DIExQd@)Mf3m5dsi@@wyRh z0YO2OkK?Mw!W&IxqQ5@8M5pdQxG+hcQzhSaT=S!3DU(hmnZZ6O!ZUDa)wz+Rn3rYR z-*J?t+U>7uX2EWoh^~qu)ulhl5TTGk9HZYJf$WAgAXoE>ii^BAl^)zV^X;T0TqypJ zM272HjlT`y6^&a1%T5{66S%cwNe~%#96{y#LfzXgwj)e|KH?&G}xSKGs3*uPIN65lBvc zHTq`BtU~~YYkq-%?e8^MGth+SJ~~;fP`NV?mZyfBw@W8nk193w`}e9(YSUJ$18`8` zYbUlGVWqKqt7E>d(Z&zZj28TlGv$ZRHu!tV{xgl?Gofkt)+%NCqN<}s0_0S(rBa=# z{BWGo?re>r$LQ{L1G}umnvBbTo>RA@(Rr?_r;ggnq1F7M@4-Hy6AbcCcssWJDQ;mL zIKCyXFSS(!!&cNQ?IC~YuP*0`l$bKsNoT7XxNamZD=-qUUMI6xTnhfNB(z9Cn$n@? z0t?bz$qEth^i{vm2MMr*=rC?O9v_);>x)5XQqsp2neFs%Cw($y)MxhaUPbhr6);bG zV8E>5MRX9vcL2N11oQCI6S)Ocj5dUYLTS6E;e&O`A7vY*yBqpyEyoM5&$g8*Z`J5k z$>k%0{LgE%_xbz2aU$cfU6JtnS0rzX%$%Yfm-k6uH3(rj z`$m7-%~kAccZPe~0Dz5sDJM*g3 zlBsKdKgbUhGV_kx#rfj=SaV1eBAm%;0srsKT0`1}RZQ(<)0QzM1RbQ&E6%?d#`Oj0 z@vxY~Qdkk*?Z3`d{uvySa$R28*pC;#ok-o~R+!mwf+qA7cTOk<=C(I>g>oAq7=zwo z8xUb)tL>3=YPF)!ok@K$dWu0v3cE3@gh~2k4b@*GHbpmye-j?e-B3FJj%6=XR{Z{?Z29bAQTyvj zed+0vs+1FFf2Mq||D$)?QU0l)MnC0hW=qJ^N%i(iKJFMyvawg}jCfDv(Og#g@cs5xb<*6X4?mHAU#oGxnOnAC_F#2EH|dFQo`69Kv2HVGep7hES5J z{?LXTD7$Kc3MN)4V(EKq<_pmmjS1`?M%2H59T(C_=AeKd30OH^)|pvS(`^ z%dsBhSPG@FlckO|qV%g{oj*wzTfZf|8`xtu5)^qXStty`P`q+ z&k2&2(8P?to7v)NESEz3R^e&fD$I0yPn(oMPl-{*IW4A7KmP&uc-mxX~fJw2zlo?PLy{5+wAY zf5^4R;7K^;c02KIxbu=^BwCQ4D^E6xd zs0l!k9L>q$bfp80uI_3uX+Sr58A%PZ=?<#xYZCn#)gq`YIk6ee#3AcG^3bE-Wm{&v zx#c|-)^dCo)mGqprq1u#d}u8S+S0X$#mEaipYVNQ%$Q|}sZ7y(t;QY_!;q<78Y+1} zhZ5M-o#n$`5(E>?WgPE)!jHwnup4=e!{O%_O9+ddHE$#^IVFcp`KKE@5jc0O4 zLu%cAj*k0@27Uo98xsPN1MT4F86v~mqiOzO+jro0T`Z!$X)AYi=VmjJX8h~w?Bqor z;A90J4h*$!c^wQ843kd?UCUhS_wuP4=_eN^-&wh<8w_IIY`9!GKN;Nn5+nlo=kA6f z1iBk|pO8>SxWCQDo!g_H?qbOpG*6 zQg=Eb5ONYdTUG-C6kD()Q^hp1))xtmw@xD0B)B=WGuMo6&-+wJnbehyorgm&vls?u zNmctdf_9%Vex2d_S|Al%FOW_2^})`~lXH0o!U@OHL)MRwQ#aH;R2cIz**qErXEE;< zkK_w24~_YeYlj>>hB22LJ(L^M4mZe+?ch9Kq`E>o`41Sgu?_Hhhry_=q%%t7{LgS| zV%pF-OxW?}J-h1?8e46L8Z)jCVtXzdsX5W$|=RKJnbXChC-=CHkyt*M)n(PIBqAzd@@$4*Z-4jk>f4|sM$!|W3K==$w;FM zJ@9zF<MdKe&e08DOf9#CQqLO>q#K)d!isYv z*MmHfjq1K5HvkZc&EqdyES1RcF4T-0iN$Gis8Q~|)npk^Yyb3ix>r$D!~EYNRKygd zzw_i5&ikqIV5!ma+34Qz=zV$rdygD3PB*?r1{N2mV1D^!Sgr4cHWk{Vo}$W64p!n6 zXN}|O&YG&ZqoIpbA=NZ~PPB)VT-iSZMK__U94_0IVz0tjZjL&i)+?G`&R+HNsqN`6 zJCK3R-P%zF-DzJOi;x)pXK*%FY(x#YfOdc!>E^0m$K#j$*RE{J6X*EBs4-AihjiDM zgyY(s&+DtcX5aY<`{-#7JYuKctQt!pKAO`>Wg_~A2h^-WM5JNXGX9AfuNHzCmikV% zr*}EsnX2r(kle57u_4iiq|{2Y!KiqjS>*S3iz2*ZI2dHj+0Y;`f!&#<<7qo6sc<(y za}0+0ht+x=4ieJ@k&`KG`eUdta$-$lgfLw4BNF6-pRyc|ExD1*%jq*HB6M!{SX z2SFw|S&RirfVRx=54)pLJRxD7;A#xxA#6V;NG=KMntG0}b#ZWXbg>7yF^BDMpcao3 zrM|PGL!iB(^WN(Q3cTU!z}5d_f-sie&Hns7k-sQtzbO$I{r>&?z`*riUDj1zijqVn z$hh9L%s7>6!^tsHutnuy)lbl${pUq;JbM}zHXVA9g!#b9;}o}LsfB)DZAg*6Q&6q_ zN9EGX5$hA2U^wZ+Mz*i)HclEnQB2Y=St*t+8zZN3tcfFKa1~}n2DSjSancOa2CC;0 zjNdPcJPr?o6VZ*IwZ4DIks)ECu2a{%^tSEcC;BqP%dE1GnCU>K_nN{DatQDM9~c5o zj0^%2g4WY-A{=?c=212MIE(HbAg#*~aWe0yr1eDM+gEj}{z_Bg$*Pcq1CX-VfjddY zwvXv3+PRX3P8VssHJ?s98Anb{CndI;lRi>>Cmb-WEg5zt*M{D;1G%eR9~Sg3&eB|= z*ZL;=S_C3w?d}M(@ZFR%+R=4JvTP_YS0Nn$*PegT`5YXLjQ~vIfWpoG-<`7Ngx-J^ zjZEzg7ZC+g;KcQTD5c*nec;E$a^bi>_`|o5_(SP4hGYLikxnx=+B9mnGjsIC`Hg@1 z@aGo{NNHo)%~<2!71^pp2v(^vEHi^c#p9oA^5DaG!NyoF!gl`#m&i|gpW2XOeQ2ni z{jVf{BC1={*bwE%R>Ps<+!pRyx5_f)V;!8m=iHVDaabRDxHo(s)-F++Td%{j^O}05vKN2bB z#S}fs7K7F@&1T%fT3?pr`@a|}Jb965+yhI_jdjX7t5^F0*w9}f&u-Lcx;5`Oe`R3X zxPC}>p773E5{u=h@wC?urtPDe1HC!2r{+>!O5-W^x%XgRY2nl=b3y zcbdiUKTI+mP4QK^`nfRmkXg<)DDzL)rC#}^IPRH{+msxE6>P7FE~5McOSpTma&YCU z%!4YU#_pVm@qH|kJCg=;#gt^$BLd2Q)_gk1e)cl^kta9og{ap}N`{7GGv$E?=vL`b*Z-&%M%K^LA^7AkXVaTS(odrDOmpDrzh35@p?++=QKm=A4Zo`H-fn?g^C z}4j;5-UJ{5N~0)&2n@{0f!PXwHrusMe@nV%8UIL8wroK>abe%S)uw7oOPW^ zUaWed`@**&SB+w(ZTxVUBanEr;{!6@L{W4aMp#Q#aVt2(?F<<%yy)(EFyf5~>|K51 z?Jvuk5+i#E1x-DZg`HZxZ}wJm`WSBe+$JKAolFOIl&RcEWJ7XX>2#BfT@cTVl2gQ$ z@P_-e{er&V^m*SBp9_!ube&i<#B1PYCzr zvsC&qklN0iUIU*3+Y&#cNwUiLLuPVgP2Ks#Q>|%}6j#NMfiu(;4gb1{?{mv0k*8KNFJeI z+8A7`eAZ1j@vVBUqyA;Ba`a%b?Up*(jIK9|DTI~XWbJsPE~b?aR?RfCrfWn2y&%?L zTcUp$>`pUVhG45Zi$=YqG@?Rxx_M{!fpyxDUeg4-!m5f~C30*xbumi)x|}VGY!g}7 z*0TB1QS+JyjvJxKXW>RV?aWv+t_utWo2+@7_HEBgti)Ab{3GL`ANo{vf^e$!t&5Rx!>FG(A+h!)wux9ns4|h z!^*N}6}(Z4VRc<+Ny_cD&)13qR`V;Y$*m6P&HTm;c5-0jd}bMQ7UH8GXZTW7OH!iFHtWAEX zfBL#OMQ;goJ4mpPz;cc|7yS#Pdd26Ojd~7)o3^bJ$<~sW_xsTPM~yyM!)hvikB05X zTPyIL?;Ikn!<}Km^oI9^>a{|JSG}@L<=aF)s(mTRe;(MI*Tp>ybYb+|OJPI^3yD zp5z%T{5|?k&DJ(Tp*B$j1;(k#S`wjc&B;>Mj;Rxsr5M&~FYC(rj%@1bSSIsH_t(Mj zwu3EGIhk9GJ&*3HUkq#5&=g^~zF}s=5gu*Oy2Ld^Nc87VD<|roJn*frRrWvr-50I? zSvFuRl#SxfH1A_&CW_!J$pjP4ilas~M@z)(9()tU^n#AiMymRgZn()U662AGcmD?+ z!!5!6+_}lctJ>G2&cCnz+%ezRy5J`T#lv4~?b|dvUJ|eq$j3r6Z1s;mQc+4A)lI8X-ZiB@*iM%_Q^_wj`4^qw$rU*x3m8;5x zcU6}ORp@-9o1-d?IS1%(JZgq8G#ffvYJ8atCym2iCTepl+8%DUq8ky$dOE7NqI)05 z)Y-^n)iM}(#$Yt6A{is#V}{LwW~>3lD(_T3Jg8i&i>>utSMM8L;0m)Lz9MZqUAOqq zIqng07gxR$pMXnCEMhj&WlOtbTm25fHfAqWO_5^!XE^$QbPay)4GzX~3-~E72rtO=ITJZK|4+{ zGIA0YOt1!KNCW(cn-Oy+nI@+BUzPWRDXu=ui^A5Ldp(o9XzZL$Sk7pc%BASAIt}G7{4Db8KN?mI4=4f;L*RhJ-BQ_- z*PHQ*P9R_K#qxk)To{;LFO+E2W3jnkkAOI@h=5x4vBg3cRyIY~0m|Y=zz*_gFs*Me z=NSIexf5qjAy>c5OkPbNFYTwf;B1Df1s$V26t0pm>mOfXh`S6|e@D#g1Iqnne`&tr zBXqPY%Tn{Y;<5T(dxTx)keKfHNO)Z1+ZB98DHXNM*q_}>7?9bZvG@7{GHNNyBclNFM5r0+z%PV4*rr4nUJwa=t5?8_Pa zT~W!W#dFLm55AUNm;hOhJR7<~s(JnC)4`4ignK7rGrtd|zr*a6qhqdgOzHI_+WXfH zzlG4p>lScqgYdLA@sWCFlV|xyA*y;$urRzaWYS0VF_JoD4>WaQEt2cDb^5l3ly$T$iJB`?Cg-Kj&L<-oOZ3>c~K=DX9 zx=_DxX=TWAU7~TW@^;f1D@Xy^$B@OMoJ~+5Q#Cvll46;%fKCbzkqQ-Wu`(g0ZgeN? zfT+muXLsvKY<6AOkN7BNK zMRbegB*~wlp8JrTx0UZVwnSc4@NO4>%aprDJYb;fb&@t42VQe_I3^VHw{V_q z*~0wrtQid5WDIeer)E5tc|& z&$I&R3!z;^S;Q<|vZz#<1Kq|q+B2M9zQ!RYmZToDV+vyKf$Kr?Eq^@K5_uSWaOYl0 zqjnKa#vj}ayV+63Dq}?vN*&Uvm912{3moz74R**-IRF~JihS4vZ|@3zmBm4VaVOp9 z7sAhZYYkoJ{qsa;55vLV36+rZW~w&Qb)Fu^ijm#f<(-IDqRIT$H9HIh|pXL$N`Xd{aI6AC;e zRLrOEfw54hcgcjDekuO%s@5w=zvBCi69S_zt{~D( z67yH$`N4$(YfAQvB-9R?7D!|CMSbCekQaOkj-xmndh4Bj6$fO)Ek}MNc(%#tVKV8< zR^vqI?SnTqcs)P-?($yfKK!N5%2iGi67DGPYF%tGYrgHB@56EQQ*H4$;QvLH8 zbSjkHzDRw_9S!=E42>9Nm~3Yz$S&uQ$w@0s{BLZM8;lbt^=~4~Ju*$+Vl-NkMfgEk z4m6x4Cz6yZy?_22^)lTmBlxvkDCz;x;($|$E>PA-g-jCMDd9mnY6}(K=%Vndl**HY z?uLwY`S>If~Y8YhjJN?sxhuhzvFhKLnN3k_=qrWDBnCi-m54dYnS>mRRC z-jYfzv0@Rhd95zl7uyM@DHF6vZoadlICbESvP^z|8xdtvw=Mo zl$*kZ_Ey!vJ}V#QvbDjS;|#R?iEWb77s^2W*0ejmS@|LM@Kdd?6?{0>85UTi2!QCN z0<^dO(6rP{evv(XiucpSu19xQo}PLh@00dQ3gOnA2c2oVE^o2%9FeB&5D^JH-Bmsc z<~I=qJ_lRetmXK3K$t`xAZ*>*7os)^dGCc(BiL6L^o-%1>PdbtZp_^S{M+&Tb*r4^ zq)gHZZjcOH+WgLu8i`^0Xc66a-GOuE=ZE@N_WvG&8Cv;O_Z(~PL2%2A|0qvD0FtMi z6^fpPNFZ6ibusEUM~L8YAF*Qf-wy144tk5i4w7v$)qFO<4pYCEjVfR4c4o1AE(1i* z=sXYEE|GU=y=Z|XMU;{=%;Jaj;Oz0`AwVIKU)KBll}M1|$ba|?0c&wq81bA&Coc{bYTVggBq}Vmr;I~e~?H8WJh%jmP$CBMIML$b41G&7P>8~nL zfNjk0|7?ooXi>n>ji^eh|GUCXM846 zBhg{Ax!YmL6sh6sa1H!0FX#$BFZI17{L-k_nCmesf=s6+K-WOd5r~cb^kk$Psrm9* z`G|>I&-FG#`KVF`vl-KT4nrRpxONEPT}Ml3EPJ%z@_23x_Lxa6u`|UXqk+$BnsK6up*PdYn1Ke)j}RiCMUD_%MUN zg_i-9WS~@$ulbg|R=BZBx$3)r_gnfB4KT0W^rLeHPDe<#}KQ;G8vsXVT?XGyan60}7D_7g3w1+$9l?N&Y zmVrSzx(zUJ!(K6W;oQIE^ssrjoSRC&t{fNB#$*_>c!|B7jUzJ%&fLF#0B*#^<;s-i zmkX@wg))e|kHq(SU;hf>v=y$G!5!I@2s>tJSJ=fA1)qSl{$R^!%y^?$pqZ1a&|D1c zdP$TbS3!FgoQg3c)lq@X%b|bG?E!aTNGs5q6 zT`ZyZl+|PAnJ5~}<%R>gn%1w1*iwWeQdt|)o!!PlN5rwp+z_(sSN#W4>hWJ|%mT1< zQ6%eQHPdRdOm473$aRlvu|1K``(keqcD&MPFwPL!~KW7?8!D#9%dX_eydy(*XR7kh4aQoMvhcC z5kwW^Wr+3xuvhx7?Z@J_O$$ra@AVHK{JBq=Fu`St;0nB2n8vD-1*EO5>BHTz$*5pI zI6y8NHD)WYQ2DzlSeeLwhs}&;C7m7HqrX%mqa)yoGxBbCPI2?z(z2B^3wQKTb{nR2EIK zhof#VYBZb)>zHHm3;jUHT<^?T@$n938QnJ&MQJ9q`KQqM!!+fLfXce~vrD zaJ?qb*-n4|pz=(8vYm*Qh`1!J?_&pUAv%C`swg}}*u?NNBqx8OUKwoJWmc0wmzwa= z3X7OB)@(C`{N@SUMVd^}^j`B}BkW+Oo5<*HCaAwjfN2_Y-wKZ^Lle#q*8`b^QuUT% z7yXLHRhxvHxk6xK@3v(9w=Z5h8vq*=t>-epdQBTIv3H>+xOx3?u{Cm#zIOwd4M z*>vmH<6vtpG*>nWw^V_0SXX~r9pDB|546HL|GTift~qc6RK5xE{=PlgZuu=EcxR_K zYcN%IYA%gfCM1=A^*m$*+n%m2U{dbS1~!l`cj3RkKh}w^cOV7oV}bPc0=Ytpl~v8H zLZj9Tp^Z1pG*3G>6yDXT+jn9v#J{V`w$@yAmZm%!y5UmKkdQt;%poXfyW!L*#yi&^ zl(mHwE`L^=Dw~V#Ckm*<>Am~&y`~)vRdEdyl6}W##&#+dnx7xf+M{gVr|w+Z{J}+E z^>XKc`Xc3xv(+brb8momY4FzkWGb4B@+14Ci)5|67#|e zlJqN0s3#}}n?T(}lYpLV$_eT&Ze3ucsUZ&tUCl&wkpN0Zb)F!s=_1!HpF3PkmV4sK zvAWSLB_kX25%I^k#r|j)x58lEy;)fyy5~KcvnqEv5p@Dsza^@TL8MTLlcVda*ZD24aU4*;bI+_Se`Qs@Iylp( zxkAwS>)#4Zb9#M71fx)RJpOT^O}+l?*_T^G$}B+Y-@M95h%5cZFRT0$Ge4kbGntRj}~zjB*0nIaVYJG-Pn<1%-Nq2Ep`;Hhk4ON=EE`CPOP!v zZ+>0br}E?hNOO(6`xRkd4UN9t+rWgDc4GkcE%xNB@bZ8pYF)9qF^7ge;9LSl36 zpP)hBkASkC-rtMAHabR37w$p8ICB^VGi|`1sW}7P{(8cc-Tr0wA(Al^a@{pYZWsL| z&mtL!!-JwxSupTGu2E&lq{<87OMEq*uQ+QK*do^EBdi>qQYw{>Bt}@I8ywO@1{QaS z_iqqzzq1UYn?`ydqJX}suCP@`yxnt47+Kpi{Gf0Z0(K!oB2>R7IU}dCkeX`X1N&kDJTTEw#QIA=OlID3oM9MAAnIeXndCx%p`Azv$Nm@KI$BuH_~Gen}UgLN{p!)e~h8`=EGnKW@fPc z!v~^6vj!>(EOgDoH*r@MhckHW7%EGC*I{D$H5Z36$vm=^2%OG>=y zkz;;be`C1)9=2d?Dw=>=9&)kYW^#gsHRc5O{} zyI?c22wfCg7B*B>nCq6T5f%_sfCi64474%AetGT=bn`g^;hhwUwvjTZizo=t(Jsa* z=g&Zykr(sa4Sb9=ySCng$~pJ66&Kj0MUd%)sE$77TzeWP(YV7>*tt_ex(qSZtQ0*H zMj8&%Ip`l4ex|apswBCy&_Vf5*y#D)E34i|>M`FR<@UnB`*OGwpXSGAWNBQKLtMli1<-+4EQF^-(X7L55IKZy%Dy@W1%ckh*` zkIOB+Q6heG(yyG?j7D_?=HcUIympNYdQ63=C!P=+NchuBppPm2%sg(*pPGHlmi|p9 zOH!uLN>Bc+m@=MF{44Pu>yK_E(tsI5)H`I6wehR<+NJz^yLu(z<44fdx?U9yv@z0= zil}m-Eq!f%VFXiNoOaW3H`a#Olp|7@DZx!MEDe3h#ExW?iT49TZaWK0*L`gpZoM|+ zr1E<9`((N#*@eH#^5{)yjPa8V3ksp!+TxkQplYna-N1hSw~0rd=N11An=6FH(wOT^ z#St0*L|5sK$fwAKor2lOXGd6-h%OMtNHo7!OH$VC9>F{dQj{7^FPMbxim8tsk2?gT z2_wC+Dn};A%#y|fYkPwDk@}8qr`GpC)H;aE?9N8szrY5F_&u=FMp4(Jx(DvRDE83(>kGe&kk~S3VjU& z?ZrUEvfHwZA@s?*}4vB=j zDtpHXIR|`QA?P`w>B2q|u#?0NWK;Sm*Nt8uH-vixl^r!lR?0op?B+W1ZK*2`-b*nI zY>P?K>8$LARix(wz%Js45Y>yHxLB-l)2x_jm1)P-qcpF=q(pEwgzPI@9C8on4&19` zq5QG3vb-Xw_T1lbA=!nH*^6Y3Z%kbFfblUz(5K#4IWC0E-dw1ahc2L;RcV#ajY(0} z2%^?c9|~ddjJLyUsoQ6`=>Ton4_=T(!c65-jkd1txU)r=R5fpss21sfbHtH3Bgs7+ zU~JPgg#}eg#XIHwE9$`KCqC;v$kJN*Wuf!^ow|#Z_3z<{PK|YkO6Jm?AtB3I&iXo#DZV^#R?&o0` zESKFXzHPc;r7gLzkBtP)xMFBA6LCU&k5o_QY$v3~qTF-_#_WUh|h7JWy1(O<|YLSsBjeJzcqFg3+O_6YKlvX2B zWI4(|$c>=UhE5>FGrDZTFXrKDTS)ulJ5j%4zWv;ggUTtq0-E3Czi@ka|ZbU0W-XCktbqLC&L)zO};XOWKY)`%$EeB)|dep-5SKWiO;0lA(fz zw}S`VvQhkM&iAq))1N`ghy;u@QlxTYDq$yfoi{qB*%!^wKN)mvO2T~G>J!Q`U2*54 zwc0UmEf)7_o^Lpe#jub}Dt4)tFttnm+;bv2sB8)p^r;|M?Q_h@HmT-TAE-FZ(9Jz? zT2k*o*FI9tfwnp^C!z3M{Lg8!Oq z{qM~6^K0=$4VS`!NuYSOn&b?ng*~`VW@n>U&(x(vgpT~yF!5gWXi3=-ds?Wmfji{F zR!_K*oK}0q!pNeN2vC| ze{Bfi{=TVu(~#)#WbGt<@cFfUt|m{YC5p@I!Q=fvC=v0^Y0K(Yl{ZhXuU#h>gU{0I zLe}mF@J4@Tj55+C=VA)+u8tlE16%o+<)=aTnqH8O(ik$S%AB9L2ph*z6X5f5FT@5T ztKzSiQw^AASlRzMaf~5TQ@rH+^?}2sDQ7k+k5@iU>XsgK{jY~JPfe`_#pM~`;W@iK zt-;jc+)L$Sj*_@Uuj1GDfPXkxbhaIL`}ST-a@Ev5hRC3@)V0c7`_0+vlCR6VUHP25htRCz&B?=N$CDqk88sz5jQ)BdgAJedM>7d6cOMmBJ!%d88eRQJe4k$YxM1uY z#}l!SiDLFdM;bR0DGpSwCm_%;>pzlfW?WZDQROOk9nAW+S6{rWN;uy9I9bBRJ8@sp zD@8JKafXbp`B>kc7B#6C!r%r)f`g*a8`js?kAT+w0=~kkKQXZ)p$pHML$U789j=ej zWK()T%BCDM=S!2`n97~_bpcF38`S_~0}i$2!t=cql$5I+^=8>T$03$hwJdJt%^Z!;(siOsx-Mw?Wh0344O7xm=Oyc^8zfDCQoP7?VO zE$_y?1P_9S+rTg?_g(MVwTpT=yen0A zpDZ_lF5e_{HG0Ltv_rB{PJ{BOO}CEX>I?Md&GgSRqYoM2;a&|DHvH~GlB*}`$n6=> z^IQ+qC)@KywEr(>Pmt9;_@b8M`M<{%)d>wn zwyT=XU-E6d(@m(-CfoAe)J%}IG4h#U#p#Ky+>7OFm4088cY2Is_^#Q5>Thv$)eKSo zt8w1%yyn}hEWtjZAAhyBxQ?8)Pl|nI$&<(g3*JKaM}_cOSSayc zda~l}RxvZMK7I#t!N*KCg0{UQi)#;GUAC>@lVyQm2$S>tOvnR|?J84Vg?;B%Hv z6GELp)t0Zb!t&%bS&VvUV$^1}Q~%4U-p}jHuKWgmwzRckkcr{wy#3W0ilXuv-fJ_n ztsfXahea+lLF&GeEV|hl%psn9*u@vw(#c}E6FO!8VIjia5qXzui}dFwfa3Plx0c6Y ze0;5C7vy5uE}=i8z|(BP6_wPQBC-DCF?NibxbkD-SGBv~`7X0=P~_WJXSTyk<*Ps7 zS>@wo{Wea2S9@t8)2b=voRSV4ae^eet{8L(E z&k42mXDZ4zS*D1h%KKl2iuCgi+;&>nHo0%5oi4HvGxzra3bl@dNPr7J`i_02+Z__n zxavB&klzWgHay93zwmWZOH3gb{bw^Sey}Mg#gak=N?Ii|%jU|Mq zL^Ve}0$uGCtGE-H#hLAcm4nVIE>{F+rLC^JYl^CdwW6dx)Re4T=%I8C!AP`dTVF_r zQLl|suHF1%r&PLNRyF|Sp|JQQ;_$JJlD9F8J^C&KAfqWgt+rxfUYSzgO8ctrLKZyB zKG^{o$OA5gm^WB?={p>jy3K+vtyHDzZo{=XC_>mMa2^zYgM*)P4#WMQV7aYK9t z8U>tY@Au=e8f`{Lf`11ycHqsqjwJV^dIQPNm$NCaGa#NdZ2vd^c*z4nv8NTiP`*@W zc}D1RQiL+3f3&CayDS7&>n_osAA?+`$dY3xOK*Lr^hcJBHOY^J_OVKR@XkEZ<@0}3 z916LE41sc_SX^(GvzOaSa@|yvM0Hfa(br~XOjxQV_cIM#(5~`atDYhm0mto~IcF28 zp|bnW+WRmUh9#Ui@7n?PqYk`$BzfX3Z@hTKA*R;X8oD4>c?e|bx*yW|h9Uuco&OQz zzeWvRZRjzR^T~g^(P8w=A@ZBl;}<&PkXZJYaz=DcYn7_y4SJmE2d6C+%O3A0k@gJM zeHM$uA{!hqNByG`Xt00iIz7q~f(OByK1SSb(F99&L3?>$7LgGW((#QcJRXV5p+LCY zc)Zkiu5e#zJ`q>n``Pbm2K^-Btu-4=egq$Bf0`6iCX}W0g%QkrO zVIT?EukeVR#I8as&B@o|tJh}DqWekeoX_A5ydyby)>YB>7k7Mz|DJ*$et{ZWI;A$p zzdd^WJ`V7zOTez_;ov@Y}@=lF@(# zgY2X0D+hHzsvmdb%1do5+|JY|!2zzNump|p8xYCan# z*@U8JtALz;4&x6VM%-ZCk@+qF_+F3q(^;!IjjxG@tf|$ym8o4*IQKS#2G_!{%C3?k$)S(RhaV^ zL=!#=`==YZ5$*z;Ryq&nybWa|{k(C*mi;%HxzmozB9CrmKhdv^*To)4G^dB8L9gmi z^YpAR9~2`T;JHYi?(}xPdilKH^q;Fj932j|w#o~M*Xz@hmAbau5r-oZ6{I&Td?pI$ z81sPrewfBiVe+fXjb_=)7qQU;ekG$?i&H)-OG+#HGSeqO$|tOGZ(l}!!NEu|Hw2TE zWXzVy)`tgTKP=PACcJtuOguT?S(X>!NWzcn5$a+@CXsE)%O0!b)q^YZRS^~-cq)=S5me6wtQH|c3KM7HG zDYu$-ZV)^lUogroQ19r0viGsql%wL`rei;BU2XDnA08QFd-m)lZpL*zNFK0D9M#DF z(M2<(mutYfdsb+Wve$sTRB1-SA4G_P@ zxjoB=bbjl9h1P{lRv(rsx?JU;+`^3EgVq8!4ICOVsr}bq!v|F*>TOc>%Nk$iDZ`?o zR2AnIZiZ*b!!oeycMG(5QTan?Y;h~8YVgd{_7pt{8&fcLB!%Okd=i%@;buVWeo`qR z-A;`ra-_{{AB0%jI$gr5=-@zT$N#l+&3IWmnqbvjb-TInYqBGF?~_2k_ZU<3s~ybg z5)MmMK4i7E%#lv~Y^89WXo4Rvfp#2@0!UP~GS`T0<s@Q0Dy3_NGnzC7mJLvJ#mL952n?=9^ZhzhcSR*NT*lO#7v zUSwTa^L))Pk3o`AW>GV0U`JUM_vg9y`qA2VA0D)8# z-{pefwP`e+!^ZSR)=bO?{Aaf!XE)^RjP@oe-+~tIfbihyELR(qG!7KIy9?{8Kc5q3 z_f6J6ej}V6ynfH%Ta6`wbsmx!v0Rk8NXAdGsoc^RqV@Im&R)bf;_iBT0Ss(x?-w$Gy=|wRmXd1 z7f3;QsPL1ms*|BN>nvvHKJIbRHI^oi)ca_a2nJ%nuQ!7nUFX7SPh`E-n0eAxq4Ms|J*^UR%gGi*k+jwXj^0EY-k-cFJoo0Vndi780`Sky)ZEa*`LFl>dI6jca#7?> znm`3YX9-!75fIUrmj^jqagAJ1m!0+17Q({Km|`v(6hRp4I;ULx9q>?{Qkp6 z7o4~Q#ln0k*wF3|vw8sLix&aB7uD1%#}?~uHk_}@{vteehn&#rlhLwBW9~Hhcn~!& zN3h%Wgw91;SUR#oQ;%iod@n^5*-Ak-7I>F6y7;74Oz}exp@dCZq>0ABb4c)NnVtKpOSw z(SbKNR)>0AG>&P{6$x`0-UQC*L*E!_E{O(zk@J6CY;}bBFc>=vGsG7bv?vJv$2%Fp zs!o&OS0wz1Ww~GzGN)_NbyNr>yn=?B)ZE7khQBu&)Qp3I!mv_)f@q_dBO8mJ-Xp8W zppn_+WSl1d>RSslS8oy1K>d}ABD-CIr1IQe3?Y(@Bms_0RO+=HLpZi>P56nQ<1& zAlyiCU@For$(hL?9t+oR3CjlanA~36Dl*rGHf>+K85=eT8mZYd=mBxiclx)N9VWU z!Pu>TNOU$Bf)YB?9ScONI$uAM6Pq*(lKno5;F$7wLcnK`iDesOiuzF784ZZJ5+=M;ozFSt2&yR>(_l8dwzO;tVa3T<&vYaR^3{S&A zqdknh)OLuAgL zt)#@VA65{!==rNH>7s_fYJJf6Rgcv+P0K#%w zf~4k(KScR~&jpkozZguOOv;nXbxe*M)|6f-$2YDn>3Kun-$vN9N{FoW2YRBTsoY)^ z8LV=$IN5=Q8>_0#bz1dkL9RdXlXGiPOm9tROG!bMa>7F)^Pcdx#zTHo6!}_-s_9;g zA#&jjpNtE4kr)o^A1;E^L^UCAA#Lb3>Bi9NHA`8#<7mUkkBQlT{>fxFUwf%k*CD%Q zoEhzisq21EW+NiXntZsCR39>3@85RN>D>)irb$S@#NNfj2Q%>nOFzNZ-BHAQ_pZ`H5``4|zEC(QcXhy7v&t;*RZXR^I9v8udJ5+^r37e=D072iSP~zEhm)U^U1r{-HxTVkI7Hi7yyqvl=`A+uW zGg;>b{B^u+#g3D1Qzy-t_O|{?`ofD9Ys80zH{T|nc&hCs(#SBC!H}{jNcpx!$Us6& z)ENysGMv9|2~9@ErhJKVhgfbwy!*DGUDIaGjaZ8n(jqA+;{UAHaTAAw?YrqfS|D{*C_dwds$} zaERbX8#C4*1DTOZX{4CxN)Iu#w@Ws;cfi?E;<3eRZIo?fPvE2fbc$8>6+&x$V}$XO zbgP~#kvHeHkw`JvrJFd+hBMNi+sltE(HGx7b5c2F;r9nsRU1~4On1J^Ri<|W{0#G4 zX_1VsfJyh0rws5-+E_+Uq;BjvW?lNA9LbY=4jsp`<*KG)iDeK1+J`)ym*p+5$6cto7qu512@!FMGK~dof0@e&R^jg4+1uIxH_J)EAf{G?8 zy?01R=Da6x@8^5p-^0H?PR`6eyRN;~XFiCThNgf<)mOCImKi{mK*d&0s@R7pDP9uj zfS!yVJs4q_dH`b_NjipiXN*RavfWc!Jc>b_cF-Nx zlWLhXfy|5ZBX)A|EjInvp0{umPH-_fan$)FBba04W(D;_x`jCjAmcnXV%D}*W!$KI zRTU@(rXO)0-S>!Sm2(QvrS;b2$`$-9Vc6eCN%N{Ne*#5Uj*qlw*6Q^0nN^P5{Gxue zyNdA4^UHu|7x1@TVnWRU694^zhH^;IY<_4eE0>=jWE)uj-T$Q$|dlY#=E}nSIw2()mly(#LeIyJ_e0{+6>0hKx_#?l3a!z={nYwycPKp?K`)4o(_m zeG|Fy=prm%6<^5Nrj?dAD9?+XP*q(@R7>^U-2_yk5RUp8Ch|ky?>^ClOnxJ98$ws| z6eg)}4ieK`)B~mv70bC_tVVeKzb4fXTYg2+ zx8_OAAdXvy)Bs2|tZJAN*GQ-srcYa|6!Rh?dgQ`$B0hv}x2QvvknwYwJgDN(YS?$z zR;^h#+=%Y0W*0?4))uiYi^uxxZ@Qc>bwAN|}=zCDrcqgY@z#)kIeT&qJ@U&eV06-L--Qjg+Am4jJW-%N2FoJTdfy2A~g zBp2}H3cqug*90w52Sf>9{U8Qjme>CfQX9?Oj9`j6EL5wkU&%Wr{*{A_0?}abn%N0% zEr!$;^7P3dGo>%*`lCweGg~+MZ@MQ|oEc{E&1l;;CTD^NeH>EVQiJZmd=n-I37nm= zU%{RTTeJhr{>MowLV;O@2BZ~;ydh~$rP@5JRA(BpvzVYSaOfrKlw++X&*bFkiKo%o zf(NN=5%;TWm18#AK-g@ zU@^7EgxW%L+m32jjx%O#?=*MiGSP6MG{sKFuO@HpnrVMuVC-8Avd=mv%4Hw8VY{5O16J;EUMI$$o@S+2#Pia1BX9pF^&*tpR zVXdqp$y6x>zdU{T8kdIDJ??bR3Y*t#XvrIrv)$tY5bVHE*WS;<8LAoXo50pWI2XbPG-8Si>j+~jH20F;Pb>aI?#hu_KaH5BaLMPWJEg|TJOo2I-g~r#04%DO_Q#xs0=3?p!6PSS} zbLh&x;D12*oRA$Qm@OQ7c2lc|ssCc3Vh1swa&u!|KaP=O?u7cqAfaR5Y$6)St^*G5k&W*{V zu!x$(KUY6T+w3!$IZ5^aPh5Qq5x&vmt$D9JNPPIY|ChTz>H;f)ewO%mWvDUg+47^* z%ZziH-vyM_(&D$u;Vqwp9njiesxkhp2ibaeO3z^;onYm<;h5PhS^n%oE>mM9`#gnA z=uYUSW!>|G4aW(!vD-9yHC)+|L|0f)2|OI$hltuLhF>^$He}CPq2}~O{cXM9Vua~E zO%>&v|M+gtVKN}Kp4zMzmnmIw%D%UEAB3f~Y~W7hm*04^oKV#A>OJ|2A;9B?h-F3s z@_{>%V4D5;A$qAbt#KR%*+eQ=)&(5-JI!g$t0DsDad+^wYIjv7nM4VtOT61`@^teg z4ME%@QX}qd>x-d|lh)yXvMXCU7ae4`>SlI+T!fa~V#UUgHTmIEpw8}}1Qr&ie4~N% zL?PFTSMsNoZ|UXMaP?{a=vZM9>q78+D<46m(=|cUkH5 z5c|EHk9}pB1?;Q1N>{sETJghgWee`oJ;%#nq$l)U2U)>xWbo~l9`F^ambh)>qz|Dp zLEHU7q<%6~48_>gB47qGk0$f5$M{12?-Dg|V9IT-=Q2#t#guwoWxc;Bx5XV3&U)fQ z;kL9U)K)KgCJkUOvQbGO5W#26>*~j&XKb~i&K6D~gZWHIOr9ANEqP?F{%(AO4^gnE zpgQ1N;-G)Xq%Kqzqwa19yvNCZO?4mrky3=0?|9;>ul%2$ByF{O|;f(xH zv$W$ubgNLB!iu}>;3!VORA4@BA4$Xu+y;*o%En2G!dz;;{;{c7@b{}6Ph)?Fnj>t# z2e(fY0oMvz%hP$-x~34XOzD-x1dI6goJl_v;;W_0y1?1iWn9^=zVx~l1?nIs&S}LF zs<*8{+PF*ATjT@F`lJJnma_TXkcbtNjt z52Pbr%hzyS&*~zLu|NFJm&1>8;!KDlDt<}}q3>f;Y^$d@a2fI;^@noCsLSj)$yMFV zC(l%q0WMn#WPLh<{jQ|vLTUhgw}V^xHEu@2MA*<%O%K333O=a$i=~2trzy<~3-Bro?y^&p@9<=ppn|$6Ek%7tdex+LmmoF@^JN~^m@^aKob5~Nt!#+koA{IA>|oiy=5GSaYVa(F zoxBRIyQ2ToH0w0?2B;eXcPENl0{50ncWs)+aI?yaE{P`x?Fnj z@iun67kb^5q&{+(F7)4+5tWI>??<-B2RyC0Kj|xWvaXW*y72;8q7&qeYPU9ng0msm zYmXCI=Jb(wjcT$lI<>i+%ohYtjHj2+-WINUFFhf<)p z7T)xLL45x|{KAUoWOMtI^R6gc)f!O4!&Pd=U&yJbk_ZR#!jXbF6A zwhO&UMdaBS^0MW`KkiP+QB=cEzJh&`qB~x;X3oa!1be7lSDY zt_-g5r{FBI`7eTwg+taALK**8Ov=TLvI)WkUdF5Fm5m+&Q2v$UIdsig`YZYWcmbUJ zp8VPe@*vO4EFVi1`=Ey`w$~15MYr0Zb3$lH{29W z%b(D{$*E4tCuBtGAGqJpmRYucf=PIvsYy{6I;XqL(H`8-upy9eTOi-qSX|7G`-@~E zG!Q=ui~K2~1d^YmY?y_Fad0p>d1msc(&VKT~~TI(^l#lvW~X;FUl;7 zU@q=PLFMw5Ez+qd*Gpdary_S>eMF9&r1$R@&>eGmc{yAep`P<6ggJtVU|Q^!1Y~Zq`8GNrUy#BJ z?Ox@7QM7O<6cwmCluBPoBT;3cYW4|zNTVuFx4Tr1Rl9dq5_k|f&5j-pn@B7kZGU~I z`ra|Yv#E5?L^7V(m)sB-D_YSz>oidmfD>KZ@^Jsh_6}jn))mHVz(ZrE2`#(AetW76 zSgBQYZp}Q3+ye~`{PgY3Z)m@t6IBJviQ({G3pyrx)c`Iv$Nk{YKrBdi}%Zk=k6OL1yKeG^wuIdp*mhY;LiUw>o>T z*H<3h(Y#S#uXM+&t*uSfY@=NJIO}vE(k8|>Xun9=U&!ub{q974U6S1GWO3Xh?cEf! zN@-KjW^M7)UykRI_(Aii(9pY&ekDo8(u;NwmPQBpmKNrs3p!B>JN-t3YQvgfG?t)- zFBURAh*^+uZ0cOm2wY(jse9DJurADO(}W;ln9nyDpJ5_wL?yE1gZ`+E7jaoYI8)&I;H8)#e*`no1;~YX;rp`YadsuN9xK<0<~I?9d%l5u~b*{G<37)q2d#XDE7<7iA9=O)lk&s;*QT>+6(5vtO|J7>O>$6obGQ%-m{!`w z4mOfuT^|o|v`FDGkrF>)*hNrt842~vNqv2NxClMk?5hdixI%tJ+c~p2XR@f%$=}V* znVE6ft>~uGk8vW_hss_zZk3fB0mQ(Gc zrn@QT7tIjP&ZXLtH{*-+TT~<0SO2beN9R=!iu<)z96P$cAt^KGXtjQme(jGf)XmS! zFEtmKpc@-boG8y&%gBeUm3BhffD4kwaCBW4bqYOuthzzS)=MC(pNWe(T>Y^FT8bqO zicxlttvgg~*;1UvONf0=UClPx?Z{7Gj)%f|+o@Py5l=j!{^u0bP_NG(A7}q0B`L@} zvo?2lY@q+s9egrpWBQuyZ1tLj)ipnx@r!UZ{jG@$%z~Ogwm$4M!YR{)y)CM#+#1c9 z5l=rMSN+?WY=zQ1$f8==8(Q>TM<_L=N9EO0vtrFd@y6A&ehcIZe(gy6&pl2Lge!M0 z#}%!cAa<-8F+EPBmTuSpgtmOp=k<%{JbX7d=*q>Oj}|`)IlZs$cuw>8>@OL*J^?8`zAhd<69*w0Mvom}P z`;LO|#tCUZ;gU_*#&hFI>h4ue*qTEchl7K|B39a|g(mVv{PpiMCM&-b&kIp%aihYW zUO)V^%ClP#YH9~N8cZ!Qi)Ja8&NR1#AKnnX!bCSh-_-DP zZqauIMG{Se;6WjWx%e>G{jGMtp~mCfR~_&ZOp7({1nq~*gfcXJ`6F#|wmj~1 z(pPRx0WufRo2npUS@N&kPH+(IQ$}2P_UJc<3flaFeQ=>l+qtqi3EBIyPZ`yR57P*R z%0+?M35?V`Fb%A8XC9&0Pl6>Wa{@oiyW{pWoY>bm+=8(TCm!sej*Dbn=7g2k7h6$b%Q?XY4f{V%*ppX z96+BIDf^xB`V;ni2RWN5o0eMQT$nalNqAwDZh$Q} zx@FKXQbx#BBpxyi^U)1A!u-~=tCSLp;Z3- zeFxbXNj>KZmVgy-WbW#`YI4aNWidE>i==NuQ(Qilvy?h_XZ8||guVmmX0l~Oc1riQ zJ`YZ@e!-z4a2YE93#)XoNuvEkhe|YjA5I1m694QdcP`>)q~}R(S#dx(=aj4<(@VR# z%V}Nd1=Rgv8LrQnNx7Kh>Qx-E$ zYbut%bU(7{r^C7MGG53T?Y`s zc61u->t;@6@JjMJ!nfuiZxmhS8ZYnMdel}|okqkzaB!QBC0~>y`8YGQ7tr||VCb4H zd4Ag-Lmh7BO1#3eZ=8vcV1(P8nlk-!g*LEQLk;4-Y64wPm<%oN*14e8N4&5rw(6D% z4!E2%6m+;j{)xyt+Y!#|-*BQQ?4?r?k__a&BAAZ4Q#%Q_3p4f8k=R!^P+y!Qy{tR6 z{tO$p$5!KaQd^3LG$nx~kY8y^`havJ&@XL@`~yK!{q=Zk zmTLopv;;1qBJF7jJ>Mv`6ly*cMA+uA7t^4_R7}b@K0&a@ zgJ|k$)D9THM)2l4Nj1vfMj-KM6gUN1xHa??V#!e0Xe8@z%ki4>p1p1;?e{NMaz3GF zu7Nm;UAZz3V93ca(gV}35~nNcWgz6dh#P;w z63XJ{)8Xx25H~9v=z(eQ#F`35&fVw?F4N@**LoPZFK?3S@-Cy|ldaOX9QoD^<>}{G zJ|S=sl-v{es~3c6=THtrJmj5{Y#3l+DQN(=+sI{;3G)T*>Pm;Zpv=-CiqkyL@%$|1 zPEYJn@U1fxb%pOhp_MMJMY{+p0aCr`sRG$Dr!aUjmKrY%@7omDpxUeR>rsHZHOP}e zv6$`)eXV(Px8^PP!)UQN^oQXc)2+SfmOrQ}aL`Po&*&1J#}RQg{Vi6Jr@wt-+Dii5 z$iUB9MMPU+28Nw@36{*;VEcviPiY{iczI-bW|!8Be`-=@Ec&I|t!*}Hb0_x)Kyv22 zXYB57n68|*WD?}gLQ7gA8OaNK#)(-xk-4LlGF3`>CyNyFZdW+P{jU!z2Cu=6jQ63< z-C4ip19r41*u>3CAbd%Of#Tp@<5vxdYfwgwa+Urd8`p3Z9mR`|Rn;qwa8gY{ai{lW zl3v6GYyY)EnTYqUW^T+8GU7*|mrFt*HzEn*TDmgst9j`Y0E?`0Zp?*L2%&t;7= zf%Opjvn#luMr)ZG@@s{RiuA0!!L``Kt}6@ujtbPO;Ofj*H+gX15`xVI;4>OC4wyO< z6%S>PI>tLRqy@nE@jtpKWF|Ek_l+Eu5&n|+*}S~8GS`2nAsF0onnS%ohnB+F&LEPJ zHNJN^vO;byI8#F_fMLpJN#CUo>YE(L65D1pNJZ6 zuM1@7_6x0#D@DObE47bnmE)z9(q9-W7fp)jU&M)@`{{K-WXoez!A(_mFL?)!VIqmA z$r!BCNqQ!2ZAUMd(-{V6%nc5_LutvZ$Qi_0B-XVp;V>H|C_H-B9itn5Ir4+k(EJL& zo_q9m{eDlpWx0lA8X{gpRuut5x`SKl2-=5CeM)yC+`1-^q{q>HBgmS+SZjeA`q7+i z7=T#O8GcTsCX)YnG6#B;CtO2`uV9)51F}pWf$6PloM^|!a+iy4+LU?pbWPet`8jm< z?0J$Y$s!crMUZ`A$4|nIFS`g~h5<9_(-c? z3Kioaof0XgH42$~u*_NU-j{dp6m!lpJ`DDxCe|!w1b0~J?{7qLe>29xBC-t(@*hJ9 zC}B?+(MfJxbsRcjN^j$+3C1T@+`=ghCArxbo6-uEGxhba(FZ?kxb>~F#vb>f@?{W~ zL*lVejU(0b6DPQaR`-hPn{}Hg@u&SD(j{vyCoic8#drvqYn;?6)J*{hsSP+78oHJ3 z?qn!btV?KsU{IXk(4$~Z)9v4(ms#KWm*rPyU(Q)^nteGCjhEhr)TN+4!l94-4HkTD zqX}G}4Y|fO)!d)q4$FDlFfak#ZIv$*z|#S6+R*9(+|kE3!JIla6gFcHw5NHNj9?GZ zVz1t;2D&BpdP#Nm@y6qp@;l9{;PcbbQyzp06hXKx-2)0z>TthZY3bj%nw#xKhSk!O zUoQVmcO_b$h##5jqw%dBehA2i`18%7LK1^`coE-;Ma6Gb1$?6Q)`Ux*cSputhn zf)-ElmzT773?>x1gKPjc#^3qX4bMBnL@0@Y7xzi3Y=EMlIpk*hj3wc(7F{7w&)@QX z3DrWnE7R*y>~Go^#hoO=)K)N;8y0{mN`+qFLwXMDXuw+-{sfAZ0?GqAXq39O#pd5R z`I9+tOTQ{RWrkb1KD=3KsV$$0K6zh4c-E?%4*toxfgND_lQ4yP9LzO}FjW}I+y|I2 z4p7XB)lu*DW8e`#df!m0xIL$9OI}PD@#!}Rqhq?zTyVJFj~?ovDbF(OISgq?vp*E#oF=}DM(hTi)(Vj{O9X`kJKbKMDJj_=k5%>Gqe#Wiud8Su%CR(LT>(O2e) z>stJw3|HCkq0AZYa@bZc&mhvz{-~1KhB<)xz28f7UCu3k|6id4>oK}tI%3npgK`qS z;GNO!+%(LoY{I`$Oco!#XGuGvX5135f|H3uHPWPmbZgkew(HbB@OH^0qFauvFSVo3 zacbyCcNY(X)j}ZDj2ZD>LHLJ$Et9YKYnS}juh19ys)mxW<>)+*{_9Y@V#Z%q z)NT>yE3LkMY(Uh&mgrtRFm+27;U<21mRW77#`=Ul@MMgvJppKgW*8oKs6WB$jzRqJ zH*f@MQ(*Q%a6eh=W?$XG>(beakxd}N6J5zcqW42QJR-Mj-KoBAcfVtN0yiR-Hh$NX6&4D%%YMIfe3~ z&#H*o;8r)0LzBA!qwr0+9f-$2j$u`yq_V<7lIKkaJp)H>-Y<00mlS^(-*VcJQ5c%# z*s=c2f#LLZ9(9jQHlv4Q>Mk+PFoCHOWBl@>L)wFEl33Tr1jelgy0mmNP^jN^7xe=O z%jD44O*pip5v_%h+`KUGg*>jzo3<51M`AEZ-v>fjj_Mg%cC`IjhNm6!;HZ~^lNV-S z%NCiEHJ#u+tk=fXCC1wv(H>n}6D4ev_W~Ka4>Oq)bp&I^f$~j2b)Szq=Nu3!I^+u# zhw0;SpeFjRGY4nP5FqOiqwkN2I6RGA$>ZX-a5%T^V29FqlpXD7#i2!bI7UW$)8X>6F3oHZDBFQvvXTj2a)yp#=&XUU~9*RS&cJMJx1B{U5vrK zD-5zfx&@vrer(nvT5XHvxW_2uE+q|zILt^MajK^|r)vBYXvPjG44=kefNe%m1wD#U z0>(eU3lfiK%;`%rrlO<=&y?qMt#2b^3Ve^o6K(@dAyq3KIB@7tHwYfY_l3g?gpxm9 zJ%|(q1FCr4N@lHP#JMW8wme(;|ok3|1Gr zj^Ze)rXV{_Vnd-y)ex{{XqQbpjN$AEpg*9g@o3jB7Szjn<5O*Qrcb^}v=?owg$O5E zMiF`Hy|a;;cAzCDE+e`0QNj=%aHGDh4jnF#^ww)T+oKJyhCw8kselANb?Oe9r>z-o0?H1;&mrG2PSZ$qL0}BsZOkx!X8a!Z^8WOTc-KE1@4S{I{m5J@ zXxWO1MIt1fBnezob5IM0@MN)&YNL?0bx;1uy^CSYFw9gDJV=~EjA$^U@hEY+89nS4 zn*B@Oqc&*ROZTsVqx~1c&RZ^j0eylE_%82B@4a~O%XA1X=Fm&IwC1fT6PT-j?(nzbI=lbTOn@?UP6PfCF8?g>a}!*T|2OsX@Tl!<0?P?+beT zQ2AQHR(FOAu6D4ezEqC2eb$fY0$)T0>9BO`LUu+8EOrj4&^A$a*LAa0q1HHs>k>&4HQhO0x_{9I%vZwwtcY>r9< z1;L^Qfc-GZQ%06-l+WDT~CPUjwRM>x`9k0v>0w((33ODCEgFtwJzw+ zydxdg_5H`V|4GJc`_Q5@`O5klq6@JmiC&ItR(es4B4jWyOquCr4O8hQB~bAz|aDc7XVH} z!XIzLQogdUum@`nM(<$0+)Xo{p!(n*^Dlx2Tih;p*k6abI^AZlcm|Y^(`Hj+qR-n7rkA=*%nT8#R6#DLftgT=BXe#dzv+S~- zPJx#oBQuzFkjblQC1QFqz5eUw*21Ehw4>S#y0`MVSG3Nia1}*1gr1AiyBfi`w**}( zgy`GKUhG0m;9+!g${%dtw|Vo#To`n^A4o`CE>%(VSm*{fh`ig0gM^CNZD@Mz2n=z7 zUx53C%T z0A>472QsfS=uVTzbLDIH*kG-ERX{nq>I1<`LcItvSOu9-Jn<2lV z->db*QhMcil$ix4h$3+>)msN&VeYOg$ATc!?_AzR0F+sYgCEYewUEVa$*TVO@NJ+;xyJ@-&iIOfA53rTG5NopCdgWSY!qLcfhnN-i_H1 z)yJZkcyOD(GMoBOb~b7#h&;J8tGr#DjVhQDG++>vT_gOruz_l8$_cl)8C_Fwd8R2F zqwQmKKk|<$sIxxs%Yt%asLbBL*Z|lR5W&U?JCitHHZsQtlUo8}#_z9`Hhbef-oFvW zHUVd`jc9&jW?^8tG8fcZzd0jEj2J_fh(PBCN3>hdNHL|HHbj$KsJwx0v(@J~)DeLU zWN+tj?E8Z09&lRZH^?#gjmU^EW}=9X5^6O@k+h{t<_zrs9!+xRyjJ&La{BVDImoXU zC(9OIn`;|xn&G=z5;d++x<~IZrBWHOcHzQ>UEZLarmyeyGy8XhyrmCD1#)G7ON}~r zxVVAn*BZu8Xr4z$yS67s?bR)RI7fXOt!nh!ohL!d3_f=$hNrD2cVq@{gIQ(brR<68 z^542Xje*%knCfw_URnSC#0ZkEB%;AB7Tj_|?cc6n>{dRCIC@7}+17Hky+^?7py<#vLyFF}S z!=(h0sd)3=Lo2lk1)o4iaEXBy*KLLJ#h;g8yk96)nUaAH4>^QV9gaqQ919}muZpc#iWafK+vRe1&rx_bcQTpL@+ zp?pb~Kg;5*=(9A<_cW4l5=P?N|DLbL+#W*zb}W~njvM^&c$g-*4OWAQwAZ*?%t>eB`IlQ1L~y3sYCno{ie zbPQ!`#3#c>G6PN+d39(<&dK&{omnwf>D`A3U6Fmo^vYXwGwv3QAuKM}Ta>EwprN?E5%6P%cn802lk z>D3MI3jD`~^&DovjV4#T%#t2LH)Tzs3tpy&>(ls5gEIjg3VTIf?tDk5si-ccQRM^cyV99M zAi8ItUD9CbQZ{asMmcIST3?a56P5e2fg49k;Z{Fb8AMRCx$&juxVb&Xqo0syP_EuE zFwfC=f`smdgVX=YmKzTAh||q}b@KNGs+;J9C<|>s=Z`+x zFslRfo$n1LSV5-&bxVSc`XJ{cAGnPB+dm>*n5Enkx2gK#ssGov!<#7n`po&iq%*O^ z(SSNXZ6eU8$10`xk|v|aF6)o8em}1Vy8m^dKfAKOLU*DrP^DYfcsuuy?qJK}M)YxV zsL~8lX9NqgLWsVh!H|xrgpKF{IKl**3Zb`#pv&c9OTKhvxNilw++!+y=q+@>f5H!* z^5{p*V7E4OR;ey3JF~^wKyye{-b@>&loujz>Ac(|_VQ1JSTr+Z=$BfVxwdcnwWw zbHhsH%dOt)Psxg;ua)n0o9qgarg$o=Z2kV!n-3xLF(p|hLHA;K!?`jeN~*6Q=M5sZ z^>tfxbgX|%;_h_7>j|H}K#gh(mgB|GZ`(r>D6ZInJ^M`+v)nq)2XOmi zB%HILZp+CD9H@_WVqC^@rugRFrh9o>Wu56mbZLiQ8vL{W5stbi>!A51m43Qjm)Rg5 z5B=?7+&z++AOg3?4ayIse&&9uTSH2A;BItjn*6B7uTYwyFDXb1VrWk)1+nS1nC6TXTU%NMqY8w2C?eM&tt7n1O~4ll*yJ2i-x zesKf5;7GX1qT|3fhm9Qd-C~lPfT{4iV%4$|m-c?A!E56?j1jqS(Yn#>RNW}~A=t0` zB$S;U%!QKAq{}?C!KUmK8`7G1f!*68{TlNNwW^}dDASvo@1&sTz}z<%LfG4Wo zH21^T6lt=na_}MC7K{L=4FbCV9O?IiUHvioqUBSaG6(VY=msBCUaCbGj9CqP*-7i1 zg`PhBrXA|_VD*CMgsdk4GQySwD`w5CQwHiZ>RK)Hh+w)hErViV3`F*nt@I`S+n)Fd z4ja~?>8)pfDQZ<0bIWW@VQ8cLTr)vswx%r7Wa_X>yc}ICcpliu23{zX+UmyZrP(Rv z7|`2C_W=|;a2`onF@wvVdXmXUtBBOyk8^gi&6xHPFP>Y-^7Xa0Mj~D>VcW5xZE0uH z8t|>GNIZ<3mdmf6eN+*-Vr>#jK*MI^sWXfK568!*|#pP&}XHqn-m{cHoU=ozk7 z|LFu8gV)f)b;=80v#%*X==K>s6*Wk?n1Rdwp*l~se+$G<)%USndA&xtE?u)2J5Qyk z4&9idU;9?RKp$t$G?qKSXAIo!G#gu$KR2xLcqCCYW#+Oyp*&xn-$bz3^j8Pi#8>V$ zBSs!&qwC?vZQ0hgr~lIk;zF0ty6TcL<=H(m0-AGIoUU;v0g}VO_Mr@Hcg;WgP5`4C zRm@XqQCZ?pZQAnH?8R*HJgxlu0^QGx2EnE-AcoKP_QE!hU4Yg7I+Jcf3pc7aVd#4l z0Ns}i`w5?{&8J@%W?gz?p)d>%+HUe2Q|9146W#f6X_tzYt*pl;^Mp%NZtoC*Z(e-| zYJFqqU-Ed|5!k*qydmkTJ5q{I>aG_mk0GfSE{NUA@T58Gy%Pw)V?O}a_M11@)WV5_ zo%novGAyyg4zs7Hnz{Yj$4!<-b^K5CJ>URyT0QDgzN1@j5BlVPn*`!!14M_Ib@o zo-w%x-J?ST7YM@VD_ZiO59|aPnRy|&pgLs@seHzQV2(EB2hsV@#a~;uzLS2^y{r@S zVG2jKYJ92m3v#uuOe&F{*QvI@lixz`!u6P{Ur`MrsTqqZM+5=pPyTru8`jUlooNkBmF!kyRdclQzNoaM>7 z#3yxuZwm z&P;dEtCqTH1K(}v=u%|VU<|=z`aDU!Ds+sY_G_>I2A+2ITQRKu<0!{O1`9)SB05cjVyCdMC zX|g4~5l#vy43hE&TS0PTo>B6Qx83M-?96mtmI-)yICi78*cJaTBI6tWBXoIX=;-f( z#fRmW6F6=oe4u1aN89Yg=igGRq(`vU{T)`hi_e@02Aci-TA9|p5v?jifz@Kj;s95I z*N?fW6IbCrDG(z%P`AAx+2@=uzX@Zlxv8~G`+aS@IR`jdmlkLF#gI$~?zIER&jYHS8sm+w>H6v_)~OtQ%SLeol{CSLMi5U~mA}hH>+9GR;=-6Q4Q-}5;1r8~f z3R>MW6W79lDfDC$=>DfZQC1h4llV8vV$(1i5gaCPS9~y8v!e@EUwDHm#~90cgLNsH z=TEJ-CS*h6hg;IuDR=ig6UB1)CU})*IqPA9BXlM!%m7GJp<&Q#_`{je0gnIj4*`=O zt=K=GzW8~%9b|p!C%uu)sxTo2eUsH@KZ^{Fn5T{>UofvmjUmZePdi z12Z@!EUmnA-^!oVBEnN=V`0#A~n)$H!@eqzAp>B$W6nhFZUx z4_?*@N8v!-kMC9`qmU)mF8;^XxzPVCCq5Xmuk^AQNa2^KT8+sgqh_Kjx`0Zl$M`Su z$;s$F_;-az9O#AH@1nj9K4w;D$5Ll zYk}gvaOKh{y5Cnm#bx@$m=bD5Ky(k6!?>fD<=VEE)Hdn|=4KJly85+rbO$$*y6lV{ zUl%WEnJK@Fhwq=Ihgf$7^2bf$0D*ePF=FEqbHWW21kA4s^s54lNIb^HY-LeBclvU# z9|kLt@H!POk=(b;>I~D{-_bdIiW;Mng!(M~XQO~je*m%^@nzKeIc9u0@l||Ten@^9 zIY8ueQv6`*e#6Ytg*n5zI(+gqjLd|Pt2T8g?&0t-d)M$ zy93q|{MVL+;1yyHk>J%Bde|72cZTyBSo+p3Kz;$0u-?B_$>@L`zCD@4U>T;6QJV=M zvIJ={y;r}=i3Gh_NG~Jy@+?jozlfkJ$ysFb&EYZIg$h%!ZRx~>w@2o-VS$pz3w?_zOtit74&d;VkNKs5 z$bT~VvGZz4SpB8t9A*dxdCl7fYnF0ewYMrVu>Eet4FwNg{7=+u4rga;rQd_frC0QQ zT!ORoFRvoIF!pfEL0y18)Cv9u#TE!$|9T%R$n1oCU{*N^l{?wims|dDiMQjV$3|^2 zBTssgZZo&kObdHd50+4J;vd^JG%wV%GYH`)`P^A3Y7&=T;KwceAa_D$!}YOM(m7}b zMp}D-;?~-z5FUYtiVL>cG2Ue;1dH7a1&eaBM(k9@U0GT6t3M1OS06VatW8tbHQLV? zCWM<1&tSfhBy^-~s-Z_>_%pD6WYQeXcTR49Z?`arDaNZLx^9NV)F z)T1SRx#?G_&<^xUS|Re+jZqX{+$_X3vmqtI11U(?nNw*z`Y}*;jkvvcUHfvk@-t5M z1juHUUU^y!t3ym=j5(!CS?5T{&>NbC8R8w z>pMjHeZ+dl8yKvNXhXo=M)7bIFxVL__G%Orip}tZ<0~=CmqXi(0M7@f?-F@D_{FtY zu}Syo@i_Ih!Q|?EV?S>4Vdi|#s2)4F#5|dCbA*&&rpzWcEh`^y3?`+h34|8E$y-=CHp?sq9cQdI(%u^{G#_)iFWCd+rGXFWJft z%mSl1_r}#SVNQAT1z~<^@0da0GWwr+1RkpZ%@cTc)iL9I^dBOQKjwy2LfKw_5vZY7-Ve>ZDsx~{Qd9CE*sX)ZE z0&z2F1+-&>eBf05H?6YJ303@(K4%5r<;}rZOA?#mg3TO)nyHQb?m*kr;ja8p7!hsQ zsouz_Cs{ZcZwq)FiN~SD2;&J@4XX6=`G$Wfj124V{V#Le4p*S46@PMFOyQFrWBmRu zuYN5*|25dZO!Td_Ifd;z4o@DH7m+)mKA$$Kf>8Jsap=FzsTZ#m3@1H^v&Exg z5Pgg*T+JOSb{+>g5Bx?M@XLmqZD@t|PvR&V4~mI0x-RPPPC!zFrQp+i9-aMgP};xc z=smQ#vHFz$=Y4dc!Xss=3%c)#-*D^z!T-n9m-xlB|Np{J5knBbWXPHWslIfp)4tDQOvPiB9tX%Z4{MCrM+q9ynpZ9&%NK@!yjNe=Y3x9 z*X#A%R8dn!Fp~LXm9XB0*$6okxq3kd%V03Wm@u8e_&^b10`YtPH*#Z2Bl~?d$Tyz$ zgqC()${fbyWS}W+D}etYx<5kX{Fk`TaAgGP~|5-)QdWdX;5I6Yz6J{Ay$uT^iXP-A_aAX@nHu6 z52JSI;9&$uiPd!6U$Wx|=ubi!o3Q?Hgz+|b`|F4$tce8eXJpVK*-Gb@$ZoYQ$>92= z)9YZVK>pB{_jV4f)Ppcr*ck-(E7$PY4;v0lrKYsJv65S=asILg!4Fu8_j-T1#n#Qv z%(8UNv!#xMLab0V+2$(SzLh)HZ$8~*+N#Rm#B+7WWIbOu#Vgyd%QRVMM$+wZ zO7(+M?nmZnBblb6@HB1prRifS_a_!t#dI{udc1CWlMz$5LT2@{>1KiE)e;oxTM#c( zOFL_(H4F~<`*c-AQ=gv`G%sR4=Wn7LV~!BaDO67(<)Lf(RsyE34fbT9&YrNTF4>Ty z8YJ&gT~)#Kh{j_)NV{u81if>?Qtd%-0UBE87ms1b0Z!1OK5Undhnx}JtAyDQ*^6Dw z8<02^U$9ofaDUj#Ypx^AtBJkgDQPYcS*Oh{Fw?g3?=^YHpb0*Az3bA7pGcBx+?!s9 zO=@oSo7+>9 zwYA68KmU@Y6=ONy@eIQsLm&D4K=E2j{^B;7@hEfAQqopJj76m-ioJ*g3<984e>v zOWpZQB~~YS?;Q(Q-+&7qGDjc6-RoH#=yYPi{lyY+5mfKPSyNR1g!zzdE;b`JnPPWv zOnNbf@mO7LUC`d%Szew}-Y)W;<)e;B;eL&{xj)8#%9Mim_yYXzWkCVf&AlvmdHP~j z)|U?-KSpP_1t{-d7fD)ey{FTQrkJoeaWi7f#?BWmbgSjVsC&(hA;@UVMsJOgB&I#J zlxr*HDzd&l6vTAC2t)C7drfKQ{S4G0QZFj4HJXGBqdQwM?`zSttfQiI{uFFFOs{Pt$#J7n%=Z&-HnXXZcTlQiU-q`FL~NcPTZ!c zcV&?^3*2HFUKxLhX-uNI$C;-Kj3yuhp5{kZT#Kd-{n|SJNJ@w{rGUG4ZO1;@rZbYa zO_j+V_Y2inidQYsbcEZcqcKU3PV7N+Pn_CI#1g8Y@HeF*@oOUAp5en@qiNieuLZ|Cw{D#} z^#q(a&lQWY3mV1Fx!CN(m)=JCVVkGQ8m7{h=JDZSWX#C1(Eiw%P)&&w0xG8^!@4wU z>qs`)2n*~AF-@SfO1UwxfIHqn-lWe;jAK%?!Q4J7>GRzgCy9&IMHi!z*W4p=1wzmx zCr&2UKmeBGoZmxG3KZFx@puiLu5k?Gq8jVZVb)v(!PMKH7{q>D)`a{}{u-F(gUtBG zBjBQmVqQ*LsDzy-F5yeSNYJ?8{wRrJdJp0(k8M{q)3XV->W22=*0$b-JXZ&Bg#cz1 zaq_NU7+i;YdEPNKfrgNb-4(iUH^LJ-{kXejA#MF{a+1!njPH`7;Wuw(+#20sM6qws zQ5m*Mr#4gI`Z)@WY-+JKiZ~W?k{TP_Aw#iyrD1;7fgIMmDPhStrSn$*quhG)eG%38o zzuFFCiVkNpmWdhx+4hQ2KwadDGn?J3jo#44>iQa_j><(DF}c}SmpZ~`2--uk^LwMp z4Ue#AGOQ3B!**tD^%Xa=IQ~Yy0_`kL zIxTZ2?N>0{g&*Z6^ znSsmcgQ!Ondf2FZ=}9d6eFW665XJp$3`s*5K(U|bM+RjXvTGtByba&b$rrUo@5R(8 z2+GIPj2QOvSAAOG07|p8FoDZ`XVzL~W;}`+Kb#+qO|2vO(C#d~1J8uaJW4bd1`~CR zUW01RuGKh3l%3LrZQzN;tOlz746$Qx<2YVgdvZYwUAsrAe!VEQ>A`E|hih|D8ZRIv zM`laB#q8)}p{ud$o>7g9fI9t9Iggt%4NdLrr+zXSIqv5&m&y2y0T$`=7CqygYpLHMamDl?*<8Ty%=9N8B zvL58j>^CoYRkIkk!9<}zZUuLlDVKN+>$|20W05?;ka<7ui+dw|3!}pZjNKeAg>(9u zvA$$!%!7`M!5tZoJJCCo(V;HgoiB4E7S~uBL8}J8{bOoRw}-2^d6TiL54PA;E9Z}d zXtC4?KHX|jW&z$RUS3pIrbmP<~oe*YOAMH@<_<Zzc z$ZQVh=GVm!Ly?_If3;*L?ZDM~9^hm?a08alvV-;cL_6Mge~u^46>~ax*F_s-aPKSV z(H&!;gvF7i;GDu$VjI;K+7JTt7|dk&xh&ce8ivq)MnR6bLDg)+(U7<@ijsy3Ue2-v z9ZKs|KUj<{ZgUraB?+qx!-ssIGX2ORUXYo}dP}Uc;L~bb7Sj^DMi@+g5raqE8JSm` zD3q)VTev^yahQLw?Xs zr`zYGf5=VlpQK%D6=2YYmg&GMrq~eErC7ByWeh3zMvegwX9Z7MVFE` zwbGlt;&8oZM~IlD+n{odvdk6(^LU9Vh?w+r58%fefzz(}ln=4aIkLNmd@)T`@!GTl z+=kiY)$q>RvDX1k!t>+|lf`_#1M^fc&6}N5X+hQ{=;62hKdPt^JSl8xb3>-zWySQW zj+t}5Uc#_&qip)6MRi@;-oU$?MDk}OJJuGgS_nlFcfCwGu`%o&O60DWDD&&Hxm$c{y84LrW$P}dB|#lWcVx9egysj*%M4t}L9@HZmIxgYw9>lg*au$4Rb zVF~;uQoNY_;U92l7T5RFN9+7c&Z0~ zpi=MLn4Fm+hR4pnVud}D%mJJ0hW>~QlF!R9U()X&@FHNir=JhX(6e7 zi$K89PV+QxCa@!#u-XsWhGtLF%7*{Ab#sFD=lusgE~7YgeTMe?L3#~3wvSNp*yTb9 z#;idZuY?B+SCM>621A?6Kde$+i5SohWwHLlB7LRf`3H4eYku+`ZDy8;v47KEhq=t| zh`v=f%B|oQ`2{;&_U+OG|Ndl*p>QP%(0CfFQ*VB#R+?yL2p-vb|8W-w2Y(QN1sR;8 z!`!ID)pw`5w6+_x7ptDDWoJ;|k#&tBcesqoB4iLF2uddML~y75i2?I*^K-a7NIRt$ z^UZ)Qx=gTVKUGS>OD|j@xoHu(rfd*~S6F_y&zAPWr*3+X+lNhD``{<9WRv`asIbfK z&fC1pPO7U$KNB&5i_i+KtlpzivH(SvC8swyJtG1_ZajBy7(?qNh!s7Cp%tsR(w^Y= zoO?Aus=b0E35jq>tH8B!QrL3*EW20J4{e;@_InhgEm(^hS1291fkF=vWQrMz+w&c8 zdY~Dl5#zcYGT}HDOpggWaVk{?maC4;ob8xu9J6X5tAn-A;2}1kXa!g}tcH`pjV+CXbVCdJBcWoH5NQ zp{cCktV|Qu6D{^L`Bqwua`Uw=X{cv@je1;}^6JT+5GiDTnjVBn0!B<+UTh4#F!pI( z<=)dMlT~90Utfwjy^07P3=OXi&DFsxs~}70vOmB*11>R&+P-ogJgNH>cBqKEsc118 zN*}4Fmx>hvoc(ZXT0NvRE}4wgCGioAU&|DADMtPrx%HR0eVkj3K&-k(EcrQ7zFIf?Ex4ZWFk=k`Ur$Msj3T*T(Z79>x- z1MX0Ax>-BoyEQQvGcWDfZ4rH>+2)bM#{NUF;Dh&VLwJwIGjmR>7pxC^B>58Vwf_j} z)>9BPIg9&xHy@}cMr6PjSu1K8EdTtCI4TCsSiMW!X051YW@B<8It`d+p`Cvle_3A% zSOoTOOMh?Nng_zBfiHRn{jBLF4#+3Qf`hqSzdO5^=eJQmp@1jVDsOS zs`uLg|J?%hu+A5G9$;m2JCg=tI`k@jqU2jREMEngM~8Dht+H`g zS|<~t9xcUbO*BfhMvJ+YYaxOK^xk$H4H7C! z911f!XU@3~aGdkk&YAlyc{%-!+5e6XMDDSoi99Trt*x4JDYhC@tlpp?Qa%b?t22fX zx$4rjaLWL4s|n^axLUA3_4O21aF(KWzs~xoap^N$+Gfs}(cGR_9heeQvj>wP93&nT z6Ku=!y)1R1+zY7QyYKv&!OylMd~E*v1VbTGLZZ9(Whv_H3Q;%N0CZLIz^I*2ycJU) z_e2MMVk|3>dq2H-S&7;(3A3+Hm19LRJRc-;49D~c{fI*OZOYjTZ@&+~8#`slle zS!jK8pZNTGrhNZzY`5#=@6^f{$ zxN+1+LWLcMdCs3OBpWenpW6NW>y~6wc+fC23Sw=1v@L?Rt z&#mYo59kaFlf~qI-hiT=E*q(?2u`?-it26bPI?dvvE;!5s1XU4M%%tp9y;M4HunDS zq#43wZ}k*Adb;`eYubH|0kJ~r-1m7SN!Od&dPA`H2gh18;sk^Xvd>?lTh1jvU|tgn z7j0Pf7ff>$If7+037^QIdHV@!H&5XSi`$WFKG_#%go_GS`P|`6HEht;99ad%pB%1X zZ)+9v052M@+_u9mvOOA_g;2g#$h@*OmYNuS^Mku*JIDUpwkg(Ok)h1JW64-0Dd}Gk zjl+7ya%sT!8N}9}P?U!ag5h}&VrgSv)rghw!H`Nl`W>1_Vv0fiMY;zUCR7&?ic}5_ zKEn0P?~X%O4T%^Ls2WyQ5$mF(_>4Y(>6=ez!yu>{W|=)28cK3)ZR4z>IqiY|5BbcGSMvyl+xhyG^qIi)|L#gy{^Gj2bOBt_lr%3Xq6KtRg@)c2 z&+{)@KGzhBHQkSNQ4U+p<#%b3^bD?iW7;Im%I;OlI=rH9ev3k0V$~DDDv892F!Qw` zYW|8Z(vp`L|FqyqZGAH)mL~=dB|iXU^uI}FEdN*x)R%O=Cu)JN!SR{%9z(Yh-Zv_UiY!H zCw1{ee>2PhGK*x+4KJRD{JjwU5w5SOZsQDuf4s*9QX}&uJ&FbZvxymjqxwE9f_8th zi%y9>jsOb_*Sq_11#W76;p z#RS3Tu(|_Bkxk1rapsF1#7#X#ykNPdeE!$|?nG@ee;b?-JL7y<9*>E1m~NZ0e8dnU z*t?K-8K{_<8Z3PXnccD}2k<8u1I*DgC)0u*psycP7hLk{7PJ}bcm8>heQn^PKQ})| z@|iBykzayMoN~5-3(UC7V?*_go9T-yc#2 zAgpz#IsE*uS>EJe4ex9s9T7u@ta2oqr!xZeNeB>f~3Ie`uq7GQUiiLR4Tz z_%31O`ii<8NWmEq(rB@3ZKq=#3j9XzuS5dK4F3fQJ{mhiY86>kO!)R;{CJEI>aY2j zb!GJJy-hvBs$mAMjP6Ng@P`euPOy^JVf7B%jyGrA)LKJ$vunll2FDryJs}CO`E5tF zpH-5La7I1z(s3T#Y#^Cw=)%ad5ciMF5H!<$KD&MlIk^rJGg^+++OocUh-{El)9H`* zbAPpWstdXj9B{3wf8U*{Dc19VFNf9|%5xN=!k3faLRb0}))rw`*usI3FKm85%r|BH z`Oh~NZ%N@(ff!1&!lVnUr#iTK%G7u5|L-Ia;0@WWF-I0AKckUYDna>aXyyAb<*`&Q zdq4M~5`m|E4>iZv#fima!mr(uJ%hPjK?@ zEPg)co-L&`q;k@DnFd%v+g86Lel>AJM>PU>AWKPhJB%>nm&1F00HII6^qgn1^N5efNO=IZ+<1X~Y#D;t&ICJ9N8cF^#@+|!RLk1y=!&*}Ae00$ zhrwztk#M?LOkh0)Bu6TuzTA!qL4rxaibS^{U)wMYHlonIGiwRmaHH)~qq* zbOc@#a?M|aB2A>K5Mi0`KfkMyQ2e2`*?V{=^T&sy~s_;EW;EPi+Zl|4K0MtFJWu~OS11K;v1KMk*kDq&nX_%(T~Xu z#D~p4u}@_r-;SBc*^r;&4uHOZMg8oVBzFUnO_w(lRYBpyy2Mew^sf>Tk!!a}3 zwnhJ52YA`3 zHRcrrgmy3VF8}Z3NkQ>oKgy1mt7oqKVf2vX+UcQ}&=etcMUPo0GB#seg@vKK4b>OG zbx`+B^Cw^8mK6@VfYv%UI?lzCm0_be%RTQ6bTtgmGeN zLfg*`%aRx;Tev)5k2PlJMwas%ss=^DI;rYBZnNjZLzq+%)Zjn!0Q)B-FZv5%NA)fDlqc961{0i?%tkJ+_yC~aH}3X7E3`j z0X}^`=W@AUk!*tOqS9aMqjhXk=5Q&PTv-^Xm4xYiat3f&co+$x+2xF}d`|?~xDk7I zm9DiaoY(_KKCoanW4_O6Uih)svGaQ|=Xgo`Fkj4f$(Dv0uKUSbQpX3q7y;gzU{~_z zlII7u@Dnzjj{fg@uo6S&D|B(LHr0)Z;ZrxOlhI^P-nW5JISbN?LOZ5RLhE$07rg1f zhx_#!#!_AWP5Je0sX1ELlDda0D2M|^3qAjCUkF`CFmo_}d5KtMeA-EUtmMNQe!{!1 zILBL^LgvXZVP3V8yEjKy5iTDG@jAqYl_N42VY<0rA025G5$pl>r^~=qd-A_4g0Ti{ zR)DLJ4HffjgB!MZxYCC9bA&(z#!zkicEh* zV9S&Zf8x)KeL44ziP(YN9S7&T$sI`dm7_B!2)CifFGW&PUJSy|JUO@?Z0w@?{oc(T z!~SvKB+)pL;VCszomJgPm*~rf+CpM9KXZQsgldiA(DQh#DH&tK7{f(OxtUiaJD%OP z1myh>)5TgNJM?_%#?dHaqZ`z02YHGMc-TYa*X@_ps837qE9LI(@J<}muL8aijBRCC zD9PqFhL_L`wgh?ka=Xu#s_}4(Xb6z@#xhk~(BBV@BsHH*Jo<082Y%Cj2~AUcm^tR0 zj}8QB9bY2*IJDfEEV)Qusxg(GMB9sG(Q1()QJmBre?G?@&{=d@oqTFv1=pw9`!7@+ zWUNx(;W3Bm@R@Ofk@1zx1T;p(zC&62G%J7!se1fw9}qL1tt7_sWtGFEYwp;ujcb|eH7F^sy|Tr zY!m^$D=>b76%>)Z#&H=dAab5;rgR#cg?D(0pyW+SxM7s`Y8>uE*coD*={jK!;~CnM z+D8TqG*+69U9u(3K=nHIMe?B?eelJ0Ui6-)8pCWhWrukES2$JHSYVyzkC9ef{~lrv zDJt6QPwm6~^P&@IvBu~G_qH>xulx`MEODSP?T~c+)s}-WI^Gz61g+MJgo#EzPzXUm zwPx@(6{khCVY$n+&X9bR<1+6(by{(LbfJ!F+PuAZM~E}0SW+=Wx(-ULSwlPKNv*H3 z4>sKfo@xj0t88(~^mx=0n~f%Fv2bkS1QHa1lwM885_sJk)`dt< z@U0@c^m%vQU{f8<%Wi53&J}MZv-bJ54Hg-9EVPC@^`yNuljDcXmQklgiUR%>6OtXm zde!nSZ`BE3`BY}gzYe_!{X(AA6p~#^f27}%R>$nA{|za8@cScoi2NiMHmD^|tk^5W z1|NxUK!GXqu;vxLP@s?(pXtP}eaGBijr-^%b*kOh;ELqAn&e5I?MXb4>g*g2j?Ly` zV)l4`$xdq?36Vt+ux1^a-hs*@?yX(4`ZH%_Mm8*jBZem>aO*nA`v~B}ZA`#sPUUdc zcs-}$GdK=?K%qYw;Ec&wL&S3K1`s8~*;lbq@XMa{7OSRt{I{X^5ujk7%JUZzR$_|Y>5vXGg#O%vVIh^>I+RkrtFv} z>>9=9=oqmn;H5A3B<|ZY_e>XVg0=R(DE9bJen5+kTyBf+s>6ZIT{B!&|F;fjEg0Lj zq@}lOWVaepBi0bFg|K`cKRl}sb0-P8byJ?wZe1ixghyqvVEzqIC2ww8jyb*ka0H&# zQ6w!PF+`n@k=F;xEAzhems^1Kj#&C|=NL6A%TXYgko$q#8*&yXuh=mwv08(G!F=y2 zw#FiiDedaTm>WqOh^0NGuEYa9BGV#IEdR5Rp8(8(R}YRcWnKKk|NThS09d7cD4?-QdD zy`fbPDDo}Gd5McZL)st_>!f+(%6>)*{fZ zqHv7T33r-NLuv{-{dVMH@Uz>|iDzvXpLn^Loxu$>Ex8UG{<;p4cFa4%Fm#~tU}hAQ zh#Ih!hrO41_GKGp>OEdzTOa9vJ^v^I1`q)iMk!E(Je!m!dU0}Se@LefB-oY{#hN%X zM*VqbOdQ@10A)cH1tNmb~MnL$T7cC_WA z;*iZPyScmb#t2=-6rVW*PIKlsUEmw*bQ;KBVXv1CU^Vp@4V0&B5{cZJXjpA2m4dG* z^!j>+H_{^ap6`m-LZK_aQ0zw7iShWbckuwCbu5(Q?6Uu@VMtgkP<)7z1k$-R$`L5F z8asj*rmYr9=fhYlwhooQR<7WRs}{VGQZ_!YOy8KGa_$Tm(dqwAHdeW&qw*u|Rf9$@ zyZ9c$XR-QlRF7bH9VdeJ^C(Xo=X2p##!b}c5;p_GYRag;wK47kh{F9uj@jWDM-OAo zHoJriHN$n-@a?ySxwjU8-0=r77H>8AnZxiikM0+~`P65f8(U!;#5hpL`3ZV>V9QGq zx1ao-`1YIo0#vsqx?g*88Dfd0XY`CCU^&;Foo!4c93bAF8Oq2BHj!%>ufvYglg|*{ zz4g|zd3=#~WPR466|^I&tqqA+E7ui`0KEw!`NrEKkyHk`=_V@m*PmHMZS$g@?o!Uu zx_w7IOWhjLGpCsi$>NxNb=z_ssi~3Qb>`#kud$RhU%9{iKHJBX@&>D45&ShjP?|llnh*`dC0!~nIT`$5r6G$352PLV{ejVP1A4*#R9~3%@MRsU* zVC^@_B<^Yvo<4JWGs`Zz3>V3#VzgL#y44-;+O{kEYuEpbZ;WqM9z+peZvTl!71eLr zWyXxb7V=TRcvp5smD#`|qW06xek=~9kn|)P3V0h+w|q==d$bahk&&PgaGDHeTCj|o9Ic^wAYO(eAVO;!p9IqE)4;9+D>f|q-1tKWEGR~SAS8o+y4o8o5@|c-jGe_h{NpE_B zwzU298uW^zeRlODDGKW(U4`N9WUW2rO;$P7|E$B*AUH&3KDJ>VnPq|PkK+CAdJR@v zVz(?~cuB_kPO;9?>>UH~4gIE%G1Xhx_sIZkZbAI_u%*BbgoB#v1gm>QbD;xm>ZUj< zCj364OAA2pnP5FshCvWp)srWGPJne(IX@vCeaGTNIGd_HW&{P-ugX%i7hCC$@5L)S zGWPtq=~Vm9L<*D1%VDA0yjg=`hKXx?E0S`va?Ggbgzo|Rv@p*L&Y>tPCW5fNJt_8* zb9eSJZ`FrL%FQe&iw0UA3Te$+xCc zA+*(Hfza4C9IXiNDELWK|CQVu`s!x}8vO;;3kkp5e=BE&)h0`{Nk3W_K9iB``StLw z*b94y5_R2Ro*Oh=vDjR!j;Ka=kKJsU(rAQ31Y34@iX8dbQAdKA^%cC#We}3oge$5i zw)69V_^5E$VEgwLLh{jZ2b>@*EGfTSuyPY(xy{m_GJM0Ayej>ZuOjefbOmXJgAl`^VgClW zm)ZuUo4Bqk)dfFk=1r0b|3rz=yd$#GR+nIiAEeL-sSa`!%E< z@d6x}@l3dFf{UOek_y%hmdy@68;F;kLqChs{;($OqlwKSWZoNIUY6ef@d>O%%unvR z0ay?!2Xt{)i*mNpC(Rg7MgoQSrfU~N+s z@;j=XMym!w5Oi*M;4Vu8w2XL8pe}WS_J?m(Z7H znL7lTtcT32uVh4fB~!0lR*dzyx%n-URBT9aRV~tn%(`v5N+u@yW1H;5;kw0LauYTisWwer2%ueRE!U*L(-32B}%^Xzy@>I-UahBJ5CQL10tG`t4NWL z7Vm|({XxjJuRvZ^biE-}eW-uSuP4td%(^a>wghM(+R*pnjX%O(prP4s)}A|U54(lA z%ct-Q4=_XcRwE(6Sdqg&yqI`o1L@i*(}q_V2`QNf`J&uZ@4C9WKSNaC9!Z&Dgxr+< zMs~b`yT*(N>@dpSrtgCam4vXA!cdLFZ_UiFD^AA1N$0UbFMR6&;GxbJ8b~74TUVSgcL2^I$+s7nYQ%VGuZZv z{=~n$fRCB+->#tfT>MpdZmyVJb~>raj;PW6xXHQHLTG67M7U60K&Wgoe}}0Bbf73d z?Nv=F3DVwc4#7fRgWD)$O3$XWTjQ9j2kR8A z%jeL#n%KM3_kquor1J&}6UFx{{C?*QgBjan_{Q34hj#|Qb>6>mtwMe3NIIJNRSesS zbInL=teU-0$5qP@7nRc|HZ+xn*=0usZ$1bgEeOVh>w3a zOG_ZU)u>4JogXmZ6HgvUch}A=>7)XKG=*t+|1@> zF5TK9B;d4w!J+E;F3Q>^T!K2~;;If{-t82P4Yg)X;4<&ioz+fN{BWw&@<#VwaOhAUV>bK0=~2-gd-k2}Y(5%AxSjxN5Id_URPb(cSG7j62OV@YuOxvIbp?2> zUCY@s>9`Vi)}vHxTWH95StTwIVq5$%kkOB?c(O;+r=zkg<8;qn@OCTRZyTOXFwB}| zTF$&0&V+6ZtF(iWqFQUly_^ zt0E^clTV_IscNG=P@8Q?eI9{%UiCv3@Qp{Vi}H{rvYnZN`T+H0q=~KCD1(D>Cl39xJ5-?U+HtyZGl%Ro!vh(?;5f3%8SxpG5N* zlzca0&%Vw(b@cEt-czmSdD49Vb(_KH1nmd|qcv z>z5VjcZ=_72d@3P_rzVFvwbK2Wk2nky0(6HO{dLdU1}N}BooXT!U?9Qqa=06zAI27 z#Ke=3NWypkEc_vRbY8Zf+f{7);4yuu0v^Zm-eMB?n;Gzc?^--d>mqKhNZwKKd6Wf(JGtti~ zYj(C=EOiV z_;&qtp*Js}s8zX`l#UQHrtIoD#Ln5UOb?!GmtAzFiXg#*y+N0gXWQRC-#7Ox25hR z`5x=2DZ?$d`3h`1#}qe}T0EJ~@4Xg`#^|yq^e~rbQ3vhwmYZ2LoaRo6GD7vpYdQRy)xv2-A^7>@ZJ?AH!ox>~kKaPoF(c*| zmwqErlktKXeF^*v5e0hwQTl+VkGY{B3Zxi3Dc&KQeL4mHUrbY zMf}NUr)^tP3C;rfZlvg6HW*zr&^BZ1w%VU zrT6uj9s+hF+VO?hrbQ2h)9FEaX-=A8&AJR!Nif|m%?!0_sQq)^5a!71OUqrxz{-xA zdFVpzrJ?uMcWf5JgJDn0Lc9%x_nn?w?Hsl99W>%4uptEN0&^7FSJHEM;Dv9>RpjLZ z!pz58VtebdS1e#G3VDkKRuWmvrlyMWCt0O4#SJU_@qC5Z&8M5i7968zY>G9$3IlmQ z1a{{ac7tzb?DZwfg!o)xb~0ILB%lnm)0<71bHt;|P@O*GK!t1>!vC=m>#(1jO1cK4 zGnCEii2htgY)^0%Dx5Y+YS1pTjk@e;oLfHZx+eLi!>^ai_(8K5_!yy$-zDcd#qhjj zvCerTDc9jxF>bbNAQ6nu`J^aYq9J4|z`$N``N9zStS^$`EiwhccPGd$<4y8JPcBcjId8l{D$h*Dy&6GYoAjQIj5zI+ZWP3-nE@824 zTtjeR*ZKXh?HzGV2OEE}*<`@Kx!sEekd_$6wK2;ZcXOh(b-q zgjlw}FfG;&85{zI1v0uRPU8?rq~u*bac zp?Q0s{N{p{+6+u|J?;T;(Z22ATji>K_{0zKCtNi;f3u=*}i(v4;fU7R!#+#whl|ICv?Q zPrxdM4g9}W6X{TU0(X@j*fzg3l)U_NywQG9ZxCOOloG&aj23pF(bhV|ZbD4n+p~hm zIy}zx22s7x=<;8r0l7^_igm+x3Fg~>)vLf*+M;&CgY+;I5>ZAw6N>Li$fhj*glkL2 zDP-6(gnE+*Cv4a;b%bk-$0{9cXts!udz(S;V*Do@C#BEM>cP>&l5FJiq#9it>1fjL zXu(1E`b9bXF+XJsCUY6bgb>1$_h)wnI#n57wkGZn%yj2p*mcjCkgpuz456JX;Hw`a zpC-K}tos~2mtZ~XRoIIY{iQCwy|!|@C7CP@Ngfn~|dBL;SVbu)%>kFH{)Gu?vM5LO$IlD))HqCZ1DlM^kA` zgL1!gNcY=KWJTFmEZcX&&%X#e5cmmrM*bDHaISp`LRqH1@zZ*RGo;(f~EryyF zx~N&UEk~9#(M+!BL_3MHj_i3b#2e!L@7H68n}W(GD6*w=7&#cEFJf|6-y^lyqy1V{ ze%3A@H@57rL$6n4Xfq*oEr zw7qdi8JJ2|8NgT*=}O|? zpU;CMM;}7>CUm83N|l;kT7h~h_;PjpY;J{AWL^C%>?24XR7rxhql8Nz*LU8%fSS%= zmBn0?Zh?g+y?NSq+K?Y;$(S-UVXnGJay3)6>Kl(2>=8F5S6yTLbuhS=pLcxddDH}a zA=L0{f?arwHiBTkkUMWdunRO`H=|MqCeDbb%giHl`;7pX&Aswb5!NDS_usz-7GlE7 zIbG>_A|!P^Gzj@?siB4eXB2EgFZSv@f?ayzpQh>{8Gab#`!vVj(L*CUmlUI@k*F=< z5#6%cECadn101_6W<`jgh@;KCm~TarMa)BQ97kLAIT>34c4Lk#>P2h=c5Y1yhpr8^ zuR2PPvbcWTaq;}ug=Y<}9{y7JoX+GzUJ7u4P(Z)?)5y$WCNG1ZMezEk17+)qgEBT4 z!>zdjDvbP8-jZy>j#)CG!L~1ChfGHuj-|A#X!L_@zSxbq$O|uj zJm;_GJ)v3 z@vUxX_B=wf+US$S$k6Q(C{3sEa?@Akm_K;c3$-7YD!L_H1M}(1LHq0IxFI4}?_%s< zY7Q1>jWBD{8Z2(3kZ`Z?S;eSZ8n=9~iPy%(UQ6bs=G9cO?38_JAHEn6Y14643Ho_f z5dL%}G4c;xW&-b%A(nsQz=}^D)RzuA&m3>HDp&Ibju?meC&T3;UT(t@Q!ti3dkQq&P^#)@3Akcx~qEvJ=w2u7-B~pjb1Sy|0zlG=u=rbY2}LVlAc038gv>A<|t1@Ay()+Dfy zwdjhV8syqyp9r$V9!hw$W_U9>)=}lt-y!b?;pffFMJeF=s#{kr{a^d%;>a$)QB&|7 z)m$NskE6hYGJn|eE<|)j@(yaMVCiDiBaxriiM|QmK3}8xF;`oEhLlcY&b2EqXJ}6l zZ-u=M(;KxjBhYH6=e{$(ng#QMoP+TA0U}}?4(&Ug{P#F^B)*x$$c1A?P7w6KmHiq0 zr3g*kAyl>Toykmdrr5?#&WAn_`g7&ehuu{J`jJw?w;NT#A2l!Yn&?rY;^~Ch;z#|x zzMt$1>x%ilzb8Au?FDxe2JfS5E~~Trxa85XPXojOTVJDaq`WelGk7D08s(T4FF*97 zlRmT&#J^Bxy%r_tQ8*ewlZJ!cu z7m*Fg?!78JYYQGkaGsDU@&}b^*Aot{JQ;mE?gSWZ9Y$pe+6Rho%lcxFSUMJ73EQb& z%v0S@TB|nloY>X>I>W#pX`j^+A+zi3zmI)~n;!cGcK(fKb}k02HlIa8$%hI<_0wjRfT84DHGOw}2RBVb;n<*ZIgiq!lr$9d%SJyh0Q?tk0E_v>lEbt!r>--K z#$@F9OX`e0H!nW&1y`MHYX@fZ0A?Cr(ZzFi#KXh0VF3g-tY?P>!oUq_MD2Jnc5}jb zfnNASU|;Tkfxkt0uK+jPGxX)i*sx_prjHi=1u9))wE*AZe@%k2_t&C4is(h#SD|&< zEZw1|%$Gcu$+$H1=tD5(kV#hCLT^4bi|MZyM6h;qk;~%ca9kQ-g{NleAIN3`cp4IE zqu@xl$Urw{8sR--&?pbRlEP83gPlDBGN=DC0;-aq&{eb>N^RlZX>$hKQ8~S7JC=j4 zM!C=`-^sH>A&3Z=0gt(vtC=ByktN|GsB%{I)}kNto}=h=$QNMaK3~{b ziYzUU-7Hql;J&~6e@wl3Tug2JKK?%E%-%Nbih%m?FA$x-&Yx5vwX_5AtIp5p!`TSm=-|OYid1=m^`+hIi`+8p&>;6oi zbT>bQ-3bRdh5P#w{|Fcojd8(V#Hx639wWpmZF|Ya2YKv0{Qq-r;*J2%)8=lJ?1yqI z6>eX2PCV6kxFXK6#e=hoxhgx}w9DvaXn35_ePYZoNN@b1#1CMB{`W+03<2-HU;$6M zB|`&Pc{#<5LGImAFlr+jvl+`!cU4zJ4DT`4T44{)@7c^}xoqG63S_BBY>CP~wJERY z)>>67FLjN5Et#o%`JHv_ISK4w@_mqw06(yB!eX4^GhNjJn>9wQK!0fQntQW2#+=TU z&<;j0#?S*2?f?n}cT0LX<(#M;5&@KUl#2dy9WO>x-2yTF2+yLz=e_QUb~b)Xg%^hZ zoAp&~5L~@kS&=Cp08)WtXL-?0L!v^*?@B;Hx5)&dcmU8Pn{r zxOffUizSqX&Yp?gx-G)sMmdykVty3doc{vFK%pb*IY5X81q_rqz+rOk#zSvGY|im! z{JGr0u5_rb;eUVV|9az@2hMkSp1yIQ-PsS=H)6WZ+7&CR(iC%(g2O{7G-icRDgk?*GYS9B zP1-PVshC@IYfd0hOH(vgf!Q0*P}>cn3qs>auOWP(Z4?Q&7?#xu_NeF;M-Uq|BtjG;AH)i8#0a@SG>7CZqnTBk2)!KdA*os4$-_;|qWluW<=j-|S93&WO2-G44 zj!;EGLe48_sCI!lOW=~8Pbh-iV8}9YTn%%LH*GMo6Ld2RI6H=;UBbV&zz7Hc%aTv8 zqs?#if&Tv!I{v5LI|bzrb?W+Zr8P&TFX6~27v>Z&&De>%jZ0y^e z*^9s!%T-RCp9<1D%k0^Oy4Q!5)4N;hBzfu!>@EPf-xu-=9T>ch#DTq@g!aXe3LCH( zG7l2MXA;f@gmz033D;FhmlQmPh6+0T1%#1c7RP@`4GPvF?4xIiR-& zh9^9QxXQpN?4MkH8wVdS#rdIWMt$ZIa?}sCh!ZuU*`ye9I8dkG> z>otH(e?t}u6-Q!fxM$fMERlG&M7~~s^trO6`!N0u&9LE>8Fpjk*8X6ZQ9Y zpWrn~VHJ9EeW{g2i+)kUB#Os176U3cV=nm5L z>pdWbhKcC^I-8?J`^c%V?6>l3_siUPyB!tm;OwXW8cWx}(MKG?d1ZKa!^!vhv8?vl`IlM~kM2|b{*-F}LD>-& zsPemdIT^lMy>J?O$n+Nk^Q$Djolbr5O8CGl*0L4oD(i8XeO)1<13+O1E^xxAaYj)0 z_6M0W^4ZGPSpUPyIr`BXo&Q+;k?`x;DDW>yCtzY;bL|$mWPu8K!4n7tC$20Db2x4` zC+{S+BIa3IFMg3w5m~kaB(9OtOMJcGLkKD!rd{xO(ct?O0qOs};4H|pMGhhGJ-hMR zGIM(UqHWlri5Z4fDScp}!G;{{;KO!6QhAGEG6FvO3vnT2{vh%JIR z{$k>M7V}}dci-C1mXzUB4?wh2-2RRIu5&b7dH<8CaDTx(H^MjwW(N*BLLa!;S@0FI zIABMIU^C)w6IwBQDe2$kq+?A|^m>UmSx6|X@cseVK>82$MO|1n`?a$ykIjm2I~!tw z1tCqK+80$Mi|BFGj(Vc_g7Vpq6$W${yuZ0Klo7xXE7HDkD?|Aj6qbs$xpVpLP?t1M z+PM0GFl#&vs+&LDV+XPRB!Pdn|9-nHXnrRQu42#WVg=aL$RiPC6jp{7Y=ozck~83E ze5EepWijkb>o9%B)+_-lXcsYyr?KlkRsD2d#{TM*9Mn&wnDt8_s+oZGdGO$5Mq ziX#6*RsRc(r|ocsC;!myG{a3Xbs^TKEmIcE13S(#=K%`8cCR19dk8ddl!ZiG_$sP! z>~D4(Oy+Fb*Fku?XW$vatNxqW=;qkaA#Bv+h?@F_pq+1K;b`;N81ic}WZ*Lx@0H)P zKxa-kgY|jy3Lwv+OYK#&sF(8XP+!LbEq5YOSY~yZn`+1OGRG1cHasaO_y81}`ls|a z*+P7e-#lE)6)1ZDfrtJ}Hasq@KHg1vMgLO1C?fkg9WPPOV*i4|Zf7SfiLeA4@EE}M zMNKJEt#d1z4A2{O4ekw*oWhJL`Y=sad;PxWo=V}cRh z;?tq%@#Ezk)-B3^vu5ee))aSRX5xe|79@InoS-8UEFl_JWfPnRb|zJ9y@Kp^bcDtL zI!36?fgP~ckW`F<^OQ3$yyLkGgH~i18194s@isZQqe`QiXvBVSIJNQhF;`SUq`9^d$tG;!SmL z$4XobgJ+@<=*9^2xieDoi}%FV;QtQdCO25^$9=#9a_p;4#RgQt!9(R+5S4-EIRlS< z+Dkh-$PB(F8i12M$OMXG`rM`z<<{$iu3=vzHd|tkH{?!`^l33XX`4hS?hrQIqKTl0 z&`V}p7;3S?_6j5Ii4uH293gLrW2{sr^?!;CD7?{e(MnYC#SV|T{93*hkwjyLl6+HlpSoNM$l3*la>Ob zz?mG!X>X5TVZjv$iq}kP;9bIuQX5r*_5a`{e-K@j5*OZe%BKQF-bay1_x4;hiP8vo zLcTCZS=>E$N%+m4wa{X*Q8(OoC1FJ7j&hCe+9P?Ze#WPup{~#P$hK4Z)kNrKiA|+2IDqrWoN4b*-3KX2d)cbWZCa{~FTx zqo6^wS&LN{Bi|S&B)g&}K?cEznz2;cSMdL(UJN^PVe+?{&FJD*`RaX%EqHW2*kA9r zjIUaBx0gO75yi)oqHT@(GJ=^(G=F4;Z#y5~*1f*LM~^o)62WG4sfZRDAs1LFYNRnszt}|3-WU>TkTo^gk?ZV& zr?;cHCk4To89syQ@?QRd@PAXhQY&0x?0CvvuV53dRBt&UC35B@-FOJnwg?eqrKvNz zUfaRgP$1KgzVT& z(Tk737=i}WyKEGypBAW=^#)-_=>H(AqWP)8+vM*aGxis}C7k!YHs zG>j^6AaZ8Vb;jW|w~@fY@7}84B~{((I(9(eZ#8c^%NDS{g`Mo#h~?~$2z|9uhyT4% z_WU-mW9+7HJ(T)G@{UJ}+Z%N~s=8kj$745*M`fAa55stkbp@M#mneIb*R&R7PR|_! z+AihQ=FAYb!>`8@DCXsaLO8|L!ski2O62CGQgL!jLz&N!J?=)7KJo)y< z33gpegefA?cq6zx1!_0iDe$EW=m*CL@i3Ga#re66Ot*!}aDkVa1nXsrce^NkFojMK z?_Zmg8n@H2)Zc^XAmp(f0>`9|f;+edBnifzuEs{cQETaX!{BXjLN`-6z~l#iWV8b3BiR(}o`a|7azfQd zsQuT>6-H2~Qyue~-FnbYvu%ZK@2#M&K#WC9N-`d zn-+-ki=5;r3^kXYB#FdKWo6~X#ib{7e%9-D*-|S>{4b?AAGpoAwRhvBIXHt$h zb#xzT-*Py!`TOsW8~u3liB*j=n)|!bbXicC~)$O?}wr>P&&ET1=mQ zxDh=hQXAljn=y)WZQC>DKn#udnZGk8a$lG_>V zWm72)S9vP2bTQ_=Fp=1_z#uMS1Q?M&6Az$hu@<8-kL|=G$b$VY|Gj$=sp_GyCky6m z-b*h4OI!bk^ONTvz?NKrJNZgaNon@JZ@sJDovRHrQM}-xZAbK*yRcI076&X@%?_CajgOTGYF7`ouPt{!!pG41md=#5 zZ1k@ZIfa+R#D@~}wS;ONPVL`ETJdc5!#F~*kexe@df=?L5i+mA6cj=@3~hTwg~Do9 zIrB1_m1~LqrEi!j%81!#wn$A)IpVk;d@@VW_^b4hL!;eSj&o0i{Rr}r8R~pN%a~0v zSEVfUyDUm@Ts}Xjbl;>&LZP0*ryU@ykc1)e_#_^+41*yIU;Xba#cV!Y`UP5$=BYQV&#tE|abWL^ds?uL6I@Z1JB5t0%w^LcSl)}>dgJCd+kU!= z-P652i1cBwko9U{#}Hty?Y9h!TlEbTb1p74b#?ah_Ob$Y#yw^7s-6*~b2(Z3o)3a9 z$Z){6pks()3kSH)XC~a>68jpJ4Rcp;6$7(i9JZw$zTx3i@SD<7RelS)?4x-8J5mUh zlcwhcVfQpwLTl9MYReIs(o$wI1HE0NHuZ{3-j@p5?i|?_<@fZ_MEhWOHUt10nQ5_= zN@hQ<)+C5X&zUkK*p=owZp!cSbxaEGIQuH`O!aWD4eUTarX~LbI>(Ml&pFcR<#wcm zuecBAOjJ7M8xGU1A((Rsy0h{X_A$yH*}8~geIiE-%rblMY)cTxc(8aEL7(8neS2X$ z6x)~!8+SCphfaO%sfs4A3-EL18_0rUDBL^}H97dgub9OzKk(?DS`@$#-b~tau%R&G zEQmX{j-xcbO{ZFB^&>sDYbR`TqRT8`BB`ma8a$h_Iba{RELtOC#!ZE{?d3mq-_|X9 zH=eNJap{lUOM|KO z#ZDTBYoSecl(QXC*%Q93(-taZNJKL;=IH14Jvq%uP=NptZo1D$RfSapr zr}>(%TT9-Z1%A;1QbuF&RNWdFx^=N{etv%U>+p)wE_EJEoA#lA`4FK~opD5XNWWMA z`tox2Ic?5^0~fHk49M8B2KMQ%6L`Nvgr}acsC#5frnPdF?)Z@}pOuz2S`18&#R!z% z1xH|vs_(%)I@70Zee4H)N6@fGA+Toc`3=l#A$&YInIYk$H>mFGwXf7_;W0RNqK_uc zim3FHN;s7R1hiq})~mQ%01og{2L(il-A6+>zcBscP~xDC-rx#hBMdy*SWrSP;VBBM z)yEfsKF$Iibra?7VgrXCE-Rmytsl|{!W%z~t$5Vw;YgJ4eHc4NxAyyyH(_FBtbn`9 z65e#j`aJ)2_Tg1fa0`DppyhQ+s-;SdLb_KM5!1tBJJsWKUidtg@X(kr5fj}H+z**z zJGqN4P{~bLm10FMJ0uTojZY@HME(j>?Fl2mT0zjERBo5Q_hiyc31f|=<_Lu)vvbFw zAQvaWDD>Kha<5fgt;xl=7r1?o&l%>CB1=_AX{Fw7x&Z=t}%M-nt3yQjXtTz|#Y z6)JWuxxKq{U)2}9bCvf@xx1PD)FSz!4AH05yjHeaJ}NKTWdgPODyD-Sc~l=VhWQ*H zkI~?iHl;Nz@`VhnDKPw5tp3y`?;6Q(W7jpTd@w|=HL zSC`_WovpVOV9xJ;-M8yskoRZh&G*-K^vueel%r3KIIhZG;sz8T~;zw?cJv6OAZ+(+3!7|8Ld^d#}J{`MO#Y$R-7Lsw>%wd2P6T{5$;KuP1nxlra zZQ&wcKY{Zr_+lsp#+n1Mc*)gDUjtNe%FI)>^QzGzp)ki^~h>-zZBDdGHMl5&YVl5Xb7cH)2!z|UI8^@3c8`_=Z zs7`#YmTbzY?>b}^1`|Zk@@mCD$Tg3hetDwUChY2Mi@!)M1xLWAn6Guf{B27|)JKgU z2enjLOcRZ#Yt$2->8gG-tTBYcm>GK70GwCVZMQ{d8b$cK9S(Pf1kz5Vu~(R*;|9fb zU&!UNMDUb|g9NQQkmm?C*;pONsqECazbsG^w%rERJ1;REON7@c=c8ToNE;6{q1U64GKDE~y6(YI#VD%M*A8wU;!lCftWRn$e1NIHieqY+?u@avh-h|~I^a1X1M*R(kW5xM(wl2IX?@Ve7fwI??)ttkZfF_Ih%WEKOV{VhuOWPFe;Con$!zn zeTrF!9Rf@a`;aPLWWA(0A|g)%`2Se z!Hp)h{R2|Xng>f6^P^nHSyHz?IWpp)7dvP-{)XC1f38jd5hXF=JK~cjLgzS(zTp6# z0~K}+9bv0mO1tEq-FQ5;dlYznvCahlUgucLF1@6^lj5K=`IhNKVKzbYFbbgahDXKh zL`dC4XX^)^?<_MjB@$iF5Q^T`VATh+`*J{WrG$ef29S6#ca7hioV?0fJH^FFG3gyN zxl1|d+Q(qP44bZ8w!i{IiJB4!2vJ-X*c^mnLEOkhio|4IDISPn@$56n+mf56Hlh@`u^Q z#hje;%G{#12;alX)og5k9|{8o}&LDue6-(AR6>DY4~ibbrH z5V)xq5V`E}3jN>~wtCjNEe1VUkwyF45kSv_w|r(7>Bvj}u@huiwphmBsm|7KkF>oU z$*#xFgNq@&!5-3Z$88K5r{e=M;%UOnU`q(J5bgH#AR}fx8SH_fD;c$;MPdP~IEJQ7 z(p*ZL#t=pds@F4T=~rsQ_pcnixF2!Cd9C7*RepYwtT(+IhB+aHuFamng$BOd>4Twe zcn}v~d0gF`>`CA3bnD1G)P3|i8#YPr^<{|6Ws zef)DoI?plkbU&y2aB& zx)xTcvkjC6PuW>d*vuQP9{KFoPZ9P+E?yHJrR(%{`)y!66Th^a#3e`yPkix$g}532 z_;eknLja+A!G-ci{zMuVP4+=kp|Culu8q+C&24vk$7Yo5fTomx0#M9TaCHz|A{ws$ zLVYd3hCt4A7@=6pZhUOGL#!w*!ovuNGQh8546nU8#1mU&puhY-|c67>A}}wj&H98|BBtdjeKFqsJ6lLrm$$%cR5VE?E5us8-Z;}=Lc?> z=mrjVC0%YN8_w_CbcKMNYOJQ)x;@E~`8BVYO>B`1;IA&_3dp%$E$;!IrIW=l_&NMD zHpd@F87wyv5!@1?H@A8^g_R~j*xYU7VTm{=CaKrD>W@5>%2OQ%e^Bu09J#y2_ukR=ZOs4Vd0ofc&bp*qaw)pkY%;L_$s$E>@oM```*+iMgZDasfZ z9!#qr#<6+Sr8LBT(k zWrtJ5r+45zpi=!EkGL*%$3wdYFw?eUtQ|S1T4HjB>{U1ie)XKrdW5nuMi_0Z5XgEn z>n`!LcR(BuPleJvuv`5nL27|8aPQM1?SOY5J@L}bzhFPICj=IQu>Ir7dV;W3sNqPWtp)o~fDa#_3 zZ3YC56AfSu)>Asy7Y>Ll;>nec5DYg1VJxLJRGm-im1v3;Xo3x?$stqY@+{e+J!1N= z3-ks<&GSEWp`j+k)rlU&-%D}#CF82*&qn{)(C4S;U20Xkca)W%k8s1j@R1Mo*}AIn z9c#_Ue|9~6)|^L3SF&f5<;`uZJ2bi_fT(+svOoCyPQ#>>K?0kL9eWA*fH#xE4zXX7 zhnf*z^hu7$V7*wer0(C5POh?p|0(8#RI!c7-0dqmN$R=u3#_e*yxVVh6p9p^g zK`hc^ezwy#tk>ZU+NsQophI2$z~~~%G0V)r&Fuk9-~=n%A3Ku|vQ)k)#EA7uTPWP6 zK0;~|!Hi1y7FK4whZ84N{__=1*`YUSv7r3puT?DfX%d~i{@-R0lZ^SlkMKVUtDgB=D|a;GjyT4z{T*TPqDq`8pOq>LE4s;lZZ`Q;=Ul5eCv zLmdgAvx%SAUC|o8W2CCIQkZb44|BexlBaM8c&=ie@7tVw_S6yjW6f&Z9)2KeTy(e%rcF5b?5Tt8(s;eU4 z8>x8&DCb8|10l8NXN2fab2Jm7F__`Om2NLP>^I;LKV{Q6M=D2o8FR8Yj5>*iix$!o zyYP^0hKT9s0&T~I^a(-Xw^a~sjj+oySA5k3b1sGVDMPIRca4LEF2>L)@E>Em7 zAf-mqrN#<(7r6VC^Zwbguh$H?dYrGFEy0|~5^bDxj167=Yx_es_kw=${M%u*E(Ol=n z(96<&Gg<0OZP`o?=?8s?J=M-21l~7F$nMX7lu4l?Hc}&pGLj*`!}= z^w?X<0)2{QK6?+O{!P}m*r1@bz2N=jE+uxj><e>*TeAkfgP`KP`#CC1X_=pOpQy;Q5RrYZnM)2Bu9~2N&49j3_U9BR|G|euv$dOQn$a z=x{LPR#&iO3r@LT=RVrwvSO^B!nByBo=s*>8o*mjpB(3 zsAs(w2W)(Bk3VO_mmH%ws|=zqHT!z+)1-@Af>59sxYms>$F4A$E1|MR#BBUPRlcto zhBn4pYkCru&wnxhPD0^*&?x9Z%r=FQ$&OUU)X%W@hNXEHo3gq9?~W)Q%!ILnIZ-;i zi@5nWp}DB`4Q+bbBB^2X(x}4Y9bs3j$hmem`*eK3| zJ<5FR0ew+$M`oNKJLDXT30`-**yg{g*co<>j&A`ITXMI8;sYPeb%o0gAb7>T_X9g} z1;~1$%ay`wi;7tRk4zDh5acP*PTfEhFrR@%p{4XcG2Lx^XF09d4h3Axc- zVpur-I&AWkP9~$5YN-Q877uvF#?)Z9q-DJ{J4O1FhJs+101K-&+1#W~b{Uqm2~qJWLX>ne3)r zGjP9h2#&CaxvH0J^oFj?+aboxCPT%Qg=@*&H(hL~&ZOU-LwRffSBf>fJz-VcpV5g2 zJXr*cJ20!pLhvJ=N(%X730gPX1S{-uFvs9>2tjqIpOsY(KnC+U%msFz2z^8cP0=jE z>&JQe4op;0Kk=2JA)$u_>Y7aymxU2Aay)XWoEoM)O)Q%tQFvt$;|vAvobSWYhD9q$ zhu+w{#lbCn02qjh-a^vHIW7dIy(?(9 z9s9l1rklSMiHX{5I5LF^{|}+nHI%zAo!h^WpN5?bus^u;L@L zF$|Yb3^Ro0{IyV6?*h5n!+@sGVZWV?5~98EWF%YVx4YN&z03?6d<6YC#bjbqQM&VL z7!M^l)`r0vcP=xR`%hDuP!V4$pY_G)!CA~1juk8VcpEr7Fe2dyQ+nZE(xV0S;>JG<-t?LlbV~$=lAgI8iT2w72vvXkAkZ1Qn;o@cG zzvh7l=8P0Wh9jg?OSTRgGmcE{jrS41i1+jlFe7qI&|TO9B_;P30fub~cMgEu=BgSD z^|KEJOb<#k0Is@WXE2TrycfQ&6!f58(5ecate#1?a9#*h4(&*#5;PNK!Tk%RaW)DYh~v{&h&|9) zzKbg;A>WD65gvz3-G>5tO2uNPlsNAPy+H<^+zoq-?`(r*oZ3(dUk6ziv`0eS{;%j& zKD}rIh6Q;PEbC4Q#YbB>yDuyE!?G%ymD3yU3?uSRK9H2?Q&xxQu`XW1>kc_p%*w5C zu3z0U$pyOo=HR2W0{qSA5HeR9i`@ob#34HdtBcW31d^2_-~&JW@GJUJ4?&nw){xX6 z#t&ve!|kq5pO0nUb|mPh;LQaW<~UA>*S1632Ny*72@_NwpcSCCw?O=ZQ#&3mae@UZ zTZY5^BxQoKJvhOc&wGj)%%8q*21BhUqhaqwQKj=a`$<_GSM{irowa~HE8%f+F%#fC zmJJ${r(WFoZqhHjc3}yM{RC6YhqAjmWjlrgI=TG|)#KJcpWM%8xvlF!vqg?SgPB!n z>rX<)V=g`%%-$_ z_vg|L?7TMx(`Jy;B`kwoh+lIQF;r;Yvj^%B-REoUxn2bA)&uVIWf0z}XJ=!wr020k z0Q7)qKR*L~BTeP=4o|m;n5|YUBz$_3=|_ZOMn=F>=v4Okoym_+ z4xE5m1-BFb^{nRP?;qKC;WXUDTdO3x7H$9{wFmj$ghScJD!gnJyJIMuA<`FQoQ>kK zEfx0_(g!t8|7?`MjY!2-b(K@@6pEe2s%j~1OWO48G1@`lN-&Kiti+p7D}(mc09*^3u$2%S^en#4_P8^B(aiyxq0*Re+_ zUN6h`Joz_tV?Xd&ZvYeL0OLc_aqf3&;k%sIOjteW75A4RS>eyvMpKO&@qHxV+Cl@Z z@i8JH+5#&*F9iP}$_zrF`wab+m!%FEplD!vL#!oZ$Nj=-bXmZ0iIqm0?BL+4e?6JN z5idgS1JR#OG|z-CvHs1@FlFj+Wi@*M1b0;M=tKSCD*NyC+_u@j`8L5KB8uYm$X(NN z*2{EmN9OnL+D@;(p@cx+PCteWkM$O0V94e5*&oNkpMEr3KM`vT1?UzpPysThZNTm> z4+abfi0^&bQdWA3yfU`&)Gxv95uC!SR~MNBg-jZDxT}WYv;5KP1ywmJR&iADeifGR z2mV`=)PsoHFn$CK;C>P`y15Yk9B@d|2pdl&FOdZAhDYWqT(paiQ46a2LVJTZl{(;? zBy#H-9E|cIwL|?Da!%=j@?KoRHEwI8{4JPTPg^ooHMROpi}{6bW#K8`l?9-B+$pd6 z-6emGgR{jxs@@1M<$Mnun%(vCN<<#fxXbiXc(YJ?RiMaSRtmu!!W&ek1pM$iyM{~; zP%VOR!-JRMunqY$nv{ad77g1$29HE)=7&1r{%m6NNJw)*?|A;2VK7tRk0&NCNaJ9E zCJom3Yk6+0g;|ssh7jA}i?iwow_6y)x$4|gW!BWX&y2}g$V&x96lmp}C!@MkOZ9ax z_Gl)H7%f4kz_dw}YWl@%>_K7S%SL{G^j)s&%$?gWXDg{3?5lGT!GSY`>K%Tx?Oke& zW0)~CX!A`#M#d2)(a;<->X`ctj(85&J{nsQbNtA1AJrxPY|R$O>2S!(@G>&-Ad73; zVMEiyv=dmiYA1AEby7VCzbjU#qG~MiSYwLllXI+T0q^xV^APm~~LqcFT_$ zy9;jm(Lz$w2j0Zv_I2AN!a20=UC;4<(Ajda;@%^o@Pl$@g@P1Ic+zulNI93)dGRA} z<*^Qs?rsEk*Rl~aP6pCASMP(-gyQ%i*5JnvKVr{=wU#vPFcucwIgAY=XzjI8 ziec~Bin;5n= z=+&1<4uEXf#~=uvBoV>^t_7@NOC8`mJPBE|Vg~7~g8bD06Y-Yr2XDbBOGU2(WT=?f z5}>l@;n|`MdO}>}H)c~1%~4bt5{s6?7z4%y7Fz^&5t8&!X0Eh%>Q0!+jkCnxINw~n zoYF{P3sqF)r5aX$;5@OXY4H>zDaOm4p>A#t)ZzP|Ne2HbLTlKi-}=JOpTE1*eq`?V zTXG-6EJq@;-THP{TeiN9gl)g{4J4D%-ezbIPg*37ppV(eak9F<#H#QOZbepDqLr?w zqL;G?e3}!$QH{o}HGi5UUPAe z7TeuSUigCYg3tdjK9mf=#@CPb2-H6p(TDEqbN#;*oYyxG@GzN{8`blRjsBC9x`nIA z4O^U_28ggzx;Re5COuJw3qh^`SsgA}>?W%yDU!Ae7# zLURqC^hMbdVbHv)$oh6R>b|oAqa!QH<%hj~)Xo2rdKGwBN=nECvYTszJn2`>@}ULk zpUNI7&u6R2Rg$)lC%l|UNU#4)YR`q>l5dw0{2oifqd#IPha*K8{^&Ep{IDU-k%gtg z(b1OZ%48wUC9MIC_wQUd9-92`L;OJ-=jqUwq^ZKR*aMpFv}JXx znI|#yLeWi=dsSyC(t2pQyZwcQX4d==`?P)~2r!y;1IK zH{%ccAg&qSE_BkpJ#P4C=p}{VmwwD5UD=V&f~(DsE%)nYy|)wJQx!C}%Iutze@JRQo`Nae)LEz+0j&yE@BPVV(Yz3#u z=L=V3rORr6=_5#nSM>oV+Ko&8h?i{4Cc2X`+IiOww}byKQ+Yh#R=#bzN*J%wv6er` z1zV`9{$4AL@D-6ndZV}8^f8f&Q3w<03DTzGwQ~I#dw%)^_=B62Sm$l5+b_?=(+or6 zZI|*;u1j6q)7QtK$Rx*szRGhA{Za5KkSJZnMkRS+(KH8U!V*aL+}Mc?^(X@E;-Tw- zQ1}w_M5KSC1uHOU*t+$GspiQS)LX>NEH$IYg4h8{rQ)AS!JO2MXf&4p;H7fF49%oc z=Rq--9s_c9LoTc^!ZyBvRO5a^^|irfq-vN4Vefwu5x8Ziiiykc#P-2AGD?n??uW@( z)XY>he9#gbR7U!9WP_tEaEEE=MB(}|)QMRsQcgLo!lBF<7`|qUe#HUh)%pnEm&!w~ zGx?umYtq!dW%cT=PRWLlUNFrTo-739KIOwJc7L@RARimC*l}?w!!~`pGz~_rn=^Z8 z-e|OBk>SC6uyrO(oQU&7c;}m6tI_rB*@lj!<|F!kE8bc_`w#~?jbH1INfdT}j_v_u zTLO4Ob^}g0HQq@x=J`v<(n2D$u_*$GC@ZuS7FjcUdHe0KQfRPI=HP73(nxG_T{%IM zbBwD!|ECz1LDA!a&MUi}$g{TS6OwF1w40&lc$Iq3KqIPXSt5NH?iZ0VyMcHMMs{#G)J+~sz5RoB zaS;i*3kbsy*2AZ5;h)zZd~rFO+Z~h>v@!`!x7JrpEBnEQCl~-WSD>(TOYJ4L03%uy zewOLr`J+UAvzvmUGiS}@nksBx5zbH3TgjT_y=XYLEEa=e^1NO;%gZ25_+btmsU5>FPlDk9yHDP z50rH8E?D>#${(j2WYth^>%Rq+b*?-f`($_5phd^`yp71xFD9V~+H*pK9sbx=tu=5_SRe>zMDh-V2JY+z~23! zItW;AL}VYP>Q{dpYxI^WwVEHhvUrHbC${qnZlQ%89=j_|=+P2CtgdWG$auXw_f zbi>1QtJvLQy5PIo2wHG2P@cXIZ-G(hane=!E-a_D`>4F>TGf7m$_Y1)2aTB;!k!b= zY6PJMBt4cBTreO-;ltljNQWD6Nbw{%2)$m4nRjWN#^31zu?oI&#jRA~TQ<>M9OvaH z5NDF31d27-MFzM3+W?d0%ol)|=oe$kqzE&-t21~0d5lFoRZj`*c+9E$I}+`g?*7XBhmj6&5fK6n(i0#C_4+SIUg+QXl5w=Zg72M=Tk_L6#O08127d=dm3*{?w$$gmz!dx|OF`ky)Jqh7$ ztmq947_XW+ZyTFbZ1UuH?M7YZquZ=G;f$$*Jec!zNG|(%S>{tGgzp&vUt+V2=|Pa5 z?mQZsQsG*>MK?N6lB>>X>f^Pc!D}1`a6y0qAdFIAL}mL43ay{WB~AboA>tPyGUp<~$wbZ^G$8S(RH`vFMQyCXTT(1BoH!t(Z!Q1iw{ z6-|yKWqV{r6g7vCrOPI&o^#-C4jeS=epj8vt~pBBh$N8T-MC<-GWYF|h{&4< zI%3lFSoIYs1;IE9=<~NbOr~ox{dIdw!&FE2uViR^dhVz=M6zC2R}8KA!N! z+H&>0d0)<3&+YseakJgCH@XL6GucveNMrjDD88I{KpK~ZTVm{Al^6vlv{NRXUn`YXS`cF$S&9DBOD>eYMq{;njYf%ECf z66BmokJQB$6ir)s8pUrkV-P-tKHmKA&?D*tQMrQ`3XbxF8FpDcZ#c_?v0?n6 ze^Q)%^@Ad$Qc?)7p+<~m)_zQn5M8V7wi(KuTHVz+L0!`}DoEo7vzJ3;h2|@P%B`=x zAc560xeY=v`b6PS^<~Y2Pm0mU-@o7QKfR!zA2u7!i@D}#&IE?Mi!LiAnyTm4d9NUH z68R`MKiP8iJrt8H4xI^5BzDjx_0-{p<%%im5&6B#d3XTM=pl|U{pr+CcSdR^pS6;A zWfDsh1@8OHjwlgsfOwSB?yRv@H?HE04fpKXRUxA)JelGw3xObBQ}8g=k)p0OzKMtjM3mu=orij{a@9*nIWPOn;kUi^^PF5{OTgp9O2W8keXuj@k_1jsULj9!d!1SDG%FBK*D*m{~M) z#vfefN?>+NXqEb2!-UlRFJ9!z)_oP8)Ky9tSFpu81Y~I*-Z=et|M4JiTSqe41_#Wi z&qbd!rz4Mor5~KsXv=Vh{}5g$Kcx548m7v4aS7pr2qv~wxj+`xd6pSH7GFpkfDs%K zFK#DYOV2+(Xt@>^6&H(OAa)x$!eEM!oZ!ZWj8Dz|s-ab_30*w$lH}u=8%D}C>OwK@ z)2;Sr%B!|4@0OkUz`g!ZwMM=DitHVN+W+p5XR2NhZa}`5>NH9LDXx1N*YlBI@>l+9Q4pN|e8zhUEf0m~uWHc?Px4#BlvppvL={TSb>NB(+B zFG+(Ng+ybS>x8mT+!b$mkv7{=`%P2jka+b1JT0~;Jc26r5^BMu^|fV5!67kfNelyaL6xy{t`i-pN~>?QV4>Cv@%s_7 z0a2^hYmv;y$Sf;Z?FYV2l37$gR5T1e@$!~G2Du5$#u?||IbZ0VwU2NuiwTfF3LN`L zZO~MA;!K7TYfKjJw8Z?>w>cDa#prp)TB#(qsJ z4ST4_n`FQBCv&mH#-gio(T-!FII$MZpvzCpW!{N!W23CPLz5#Qh;g4|Qm(PlPoiQS zc+0}&zgNpQP=3ZRpPZ7BC6%-vNGZu();}vh4Q`pRV>aDZ%I_Lyh9M)+xnv~Ye-CF? zg~lfRISV3?6JMIxx&8AhW$EwPjj6@yVV}Nnhi`MsU@?(aT~%BF1(YOTbX{eUG{=^s}EENzHPugeR<_* z^d|b_7NzbRpca5Vl?P4dNrEr5x+vEQ{779FZ%kdY;$iOU7=ihP_j@rpzQ;oS-R1m0 ziloIrX}x5$ zlXWX0N+bvOXRnR}<#rxv(5~Vgo(6AWizsKaC}+}xKT1`qTz?21(L9owA}Ehui_S=} zj`AytFp%44p$N|nBuTV4ktWrSyGZ_oT*|KaL3e@g!1SO$I0T((=JNar_VLL71nEbQ za0N-@{C9sV0zc}%S0}u_UUj!8dLEatel@3$n5(W(be{XU%=cK!(UMsZ_lH(5KkEr^ zCld|lSBEJ`b&MOYw#jJLH;MYz*bfmix*$;m-qv#onvd#J;V%zjYMNI&|=W^5jn=cA%uSj7{tgUeiuTSV-b}MpQyitT|o+#{%8S zbdLYAqXzQ&V|RfaPm1I#?Z;AiQH28Bas3Z7pd(mJSaZSoYllebqK@??`r6+w)zNim zLDL9mt19n3rU;B$wXeayt?XYm_IM*kjz*& z^D6RqO^}J6Iy=HZI8O+3lytsWxfy+oBo;nzJtqV??rw62(WXT_yy~g! z*s@a<3hRO!xo@%UVrcztPwqh71$N8qh4{#D2&f~>)#bgX2lq62F6q(y-C?7dd}U_e z_gGwMJn&q08 zN?xR8Av|;^W29PM#1a9vDCl8`JiB9v8=eG#W^%>BYcNVEKSK2hl{ykqN<`-=yk4Lh z?+CZIYvD7LIWNbMO7f8!p^K@^JTZG}VIe895AtVUY^)mEPwN_y-$jcuWi)ZiaCFT|I3aKgb}=$mk-e)fl>SVJ* zG#P4zncqQ1dVLZi?mB?v<^hH{Rv?o29$RlHH?kS#gRQ3sJYB*d!`4hx68{l1gA69N zLo9Tr0)B;xMuV4jjC#EUSUrkYM zUosV6AIRC0h3g8b0lRvsgX)|0*+(^}8VE+ukZ^E<2C*h+c7XH@@AwIyn|)kyYkb>8 zZTYkgwp`Gv5Iv8&p!AD|BVj{=6R+r z@`~R@oi{|175(3ifyz;2OBzP9X)N_x6&pz7;vGp3Vg4&v`!=DfC%m6#@l!6SeWKhP zuDy=P>Xp?j)cm}ne5UxzWD+T&Y0*n)ZPM8A@H_>=4w!$T_rjO#46ZsqW7MR!&^x+( z*oGEMo6;E`(Z4OxK7Ej2^b1W9b;f65C7#59bE2v!!hD6x&%@|*ylMLCO zf}{mlKlFe|YN5Kc*CWRg=y(^Bo6P_^Y3v)y;sQL9SXv z_4kx?^fNWd_Slg~-+0Q~pcFR+Nic(*LlSksIC5S#2^uLcI|csh9u>SIIT9lI8M?{(Qz!%7j}$vtfjwcz&d{m{%^zMoOhp*TjEu0mMs1p$Pn5^?2uXkEMhz+CT%z=N-g z!wN;pIc=dn)vabE!ArG}?reTJlctu*OcbT++`0n5=}&}X$pyVc;37toMeH5M4-iWJ zS3Sp?d`jW#Khv3}h#Wyj0@TiF}vxpdvUCmCqW0&)QfIE&YgQYLHV)EuFRD0UuANQMGvI4@iZAB|Mr9s<(iwslIh zqkioHH$^acyHl<4+T6La`r95vetVD9bc?n}1#K&swfQ1915$PoLAIPY89b(aPmk^i zCvZ(i0gSvzWRbN(G6ukX*}QJyk1W~T_Jj@9RaubOtI6&YYZ`EtcYM*3 zds`q}gi6oR#Ckb0fXs(#4ZzqABKNMC40t5`5M+v(9gwh6O8~Z{BT8!H>541c2Ot+M zrG;uhw6NI^y!3Z$giQ3Srw%uFubfML&?07ky(Of1plrs`1kXT-LOWOS4!q-bebUZ5 zYeZ#viP6Bp<@#C=H!kdlSeKW?Q}jtQxsdm#peI$&h5uCJ+tL#>Yly7ao9v|ffS?y! z5PP26*XU2zao==qX=2`mMn5|R#U<5={Hj^5+Nxb$OQ0mW^M|hc*SK2S`+hj~T=)(53vwY?9x6 z>j--s&-DZI7%Tb0b=jYm-|MKyq?09q;+?4xZO-x@j~(6V2*MD^T_KC-(qQf0<$p@C zxO+ozC^x9`Kg4c9vubY7Y2%y_@z9j}OiSi0GJ0*oE0^D;nygn6{o5udJEopLa2dGk z5VnQYJ7RMlXQ0GXq~3by1K-Djq;C&F3jbWg0}D~>`|A8v1_ArfD29@Vq~@we6Rw*wD16!IsGCV8u)QcTh&ZR9fgleh^2IOnjBfFP)^AnEPSDla5~A~*bqh=}aShdL1z^!9tsJ0Qxr7e-AK7ni~b zTl~U$2sdkZqK7c&`qi-I^oN@`Yf$1>(Z%iLODP(_zEV6l#`7nmoW-o3ICj;iCt?EE z+~~W+Kp%Jd;8bxq4*1%=8<;eho~Zdqwcu0#CcH1FsfV!6!t&hV>#g1#R7e?~FVP!FPUAY_2W@ z8L|uJ>qLg5bWe-Xv3;0v{P`M|bj99@a~3?*&bzjOFn!HMz}70JtzWsn& zzRJy?CdVJwq(5H7EQ24qttU$aayu})ryvc*O)lU;F2!0;#(!ciH2Vq_Tmt?}dh?~rxIT9a#p|oN3UZRttNM&6? z0<0MBLb29n(3j|yx&oVgKa&gDf7Wamm>PQ)`XWY1Cfd9}Y<)|8eM+`2sdE67Piwa5 zeQrO>6{guh=6z$8j>+Z7uLVbDXy%jg(v~%|#>3*Je4=NVYZY);W1|b;bApuC#n+w| zoKr^(zrS8v37$OG0I!Cl!n_0vRMjFtJ5Zz^GnUx`c3RAP3;g6HX+2YLbSP=XlU9_J zOyAh$wp5VmJR?nwH!g!?SbHiR^V3(LYQUqxc>=+$6z=Pl&T!J8Af58Z@=C6-oGzAT9p+q2* z>o}w6v8VF(Gj8hs3htpF56%)?a8Dp-dvjwJ+2jqt4u@)v-`O!Q0L8qh5)=~+3c2)u zoHIK9Zz?ZRuNOxeH%)a!t$rwFFp*kTBY7#XWA}?3j*%5vMAjs0XD(4ao^N@@jJ4hr zEw^o2GT1Vv@CiR)DI@Kh@&albZ=1p#lp|D;A<#Co5U`sNHeuyU@mhB0!}r;W=YDA-id{{z zx1ZqS??~y1kG6ZJ+_SQr-CV`tlUYod!UKJ`$=B@p>P&sXnsB$&& z^obcoixl?86Ie0=-~S3hZpf^m(&SzJH!yefm@K31Z4cH{78;B4bN7Lzen z@V<-xMBffj>putcWvrCKGNm0(_C%>A`@rniUS@)h)87JR968SLlQ$sMYzGkaS5DC) z1vC_rQ9!LEwuOEH&Wx){w^e8yho|j@o@2f31xpSfkK;s(FZa%|pnc`Fl9)~NQuL~hf3igGo^?@6cNiZ3XQ5&=hrzwJXVxkJaO zxzf$ip44sUIn-;b#FSI*p$%UK)SPb$Kr;wK@`_2B7#c7Y;ai0>v5 zAjd+)e4-#jGpjP;wPry@x_swq_){zYdAutc8$OwI@;FLHQ=hG3DL_WI2wL?m&qSx&0v}br2@UK@7zlxW5-%P%bvGP_nn{Klh6bk13LZ^|afUJ+RjFY?iGI#2JB&100kVaB~~t5H3q zA4vxg3Fh$FlY023)n|4zIkX5+;IA98pBo$1G6urID+Ob9OmF zu8W3Wd*|J8_N+yKJO(L*#eMc_zES*|~Sd zJj+@+eZSRpklSg)uD9F@LNAzohmU7;5F=WKT%Buz%TB(lvc>6ksK}9>Q%&T3IJ0+m zGoVPGXV?ph#A>{(CID6i$k$g2VLVjm-`H%4j-n({6aPADFS72e&yB9!<|a!OgNc0m z(}JTkgt6AqT9T;v=+(4*w-+t=0EA~Oz&0Cuy#|7F)zf#7#*3!b_(&xN#Dh?@7kke^ z_hpBSu`S@wx4HQ|m&1H0e3u-O45^ih-TV*DM;~Vwo^ZqnpG9~~8{z5d$rV77LM+h2 zbXCO~W4uF)C~$X@9a!l=R=Wh0Kd*TuzhKDizJ?Md{wthK`mqwhTas&0!InZ6`vFV^N|>q z$y)f`6YU{&8F>pebn(!DYualx+WLBqe@dLD39}yyeL9loYrgiUK=*uaNMqH4Q0{k+QiDWdjuO$A6=icw0gIUVh&R(XMUy^cnPo}{)t573)>jCJN&n& zHx`SXP9yma7=pHdbTUk!pgAJn5`DB1eTt8ikaXV3JeAjIAD>JVFq}O*8c(YiVo}b& zvKyU@{JF6UK#c*o=rB&;Tyu%y9Y%ZHir2{cO+>6e*|0VfDAGKW9lcL)xJmx>8WEfL zma7D4CEMbNqK2v@?r_CNy;5%H&R{Ul1!=bC)nRL>9SIBHasTiFo&he?8VI*^@t^5T zW?vjk!-J40)48r}o1kbken+{&-ice&f9S(tlB)8O-VJ@rOQBZZDFWSv`O3W|tE>VZ z@#4NL*H-fM9l;6ShPoC8lA?hG30YYwAMOc}2fsuMD?@^KVi8pB@t=w^y-?8bxL%E(#rv8PRD zgiI+Kn)kLEL$Bg=&qhCL$1tYU(gq3T#KN^`q+K7pl)}6w`lhgH2#J~Dl9QADcSWr| z;)=(>4;@Ja$t;86;n3%^p{!&jWJx?d0@gSI>$LOkW>FuPB24c`RM|JwiuBgD_Tsnc}ufr4Z!xft8SCr|3T zfI2e-*ATlR$xVJ}7MkCipQ{K}zZ%4iaIis;{V{#uLBX{g34sS`I<&yC8KlY3465rX zlv1k7T^k@-3iBw*NYIAqU*?9mPsRsOtgdt-@*Z!l%iB#DfbXT)$@J|oUC&UIH_=7) zgG@K&#!U~L@8Uf;cj5G6feW1FZyuZIF8bgQElq&(K4i*+NCq|$B}BYGhgCd3fDJg` zYZ)}&9L|~)no7RJFE(eE!W%36j_WV$?jY}khd#X5-f-l^-ElPnqJ39&1;VzIy*0q@ z8KkLc|KsR-M-T@5>6g1@`6@9iri+I`%$owA;2%cJi?8^Xj6#IWvtwmJ+}^GHll>%n zkdv4}>~2GNC{dn&)Bp3GdxSv-M0z9mrmzAmAWqek0Y`Y|MuJF*n-(NY{WNC*7XF-Y zSPzS&FXCMsC*Gn97XGv8Z6MpfR+5>Eq(dPCj`UYn@LWhc*Tc5>08F(?q+yY+YNRoQ ztQCWWYUnuXV{sT&58AoOl- zS9C=E*gM?L-ezKNv7(^;5AkrKx{<(BOSyBGDP8~%LUs>;s&y~ciaL+wS?CTSzjLpk=vEz=FCgVRQk4*OT_0r`zv*;*|Fj{> ze??nf;5ttO>0Q#ej3J)M1kTJvxXQ_H0I@m1)M>gV#C4iBqJ2)NqONyJ)P;Au+BE&g z)J2X%(vw^=g|{}5vUoCPY ztQD8#*fo%m=k&btA=QrDaUS<|Mf|@2aS$QK33O4}DPxA{uW{(8QZXVy-- zTEV_Vc)ZhyS-UiV+;d)?qg>n^h}X6P;U~8iXoj>E9G=VdcbrTym+QEQa~g#{Qp$;N zuoQMt?6S)i5N+BNzTSXo2lrfaGCyHT73Ent+S&zdS?^u2ZKDcTq_Km8$Zx-M>TI}pA`!?{;P`@pqSTQ!X&-hd^-}~ z;LEOK?&#+H?S+nbvU5hjZ5=K4kkwdNlSQJAv%ea{9Y0ai3{rcg=rjHA71V!O%f$EF zbQ*k}!NtvOAq0eh>f@uF-jYuRhu`(&B6c00VAK#33yf(;^B=6E_9s#u=|9m6+NRGg z-U5?>i4~ATbEyZp;pF;P0MnN4L{8uv=;gmgM96(598AfAJ(AjOBg9v2A!h`h@KP=% zx!_`HACzL)il%6NbotKQe(WlgzB9`yglT5%Y(*blq&4!mW|2eT!oDEli3Wl|)Ueb* zReEru+T#KKX#1yLAw1%BCpYFVEDa@zMk`Mdfq~lQIvL$zd6z8f3^#emho0yLuA%NJ z%}yQ)gJUwnA@MKn88E{r7ic<~0c;zWdz$JkT?|&RQ4UOIt7NP1%8Q5HDAoa23Pi&( zNyup6!q?N_`o2xEjYLI5sWrr`9`=To>!=p-r-U;nST89lYr>y;_#4>pZv$L z`((6gFKtB_FX$58z+XgWpDRY`IYHy-F2$=xiZ>*FxGnyhy|j!Zw#ZX5Ks%&f`z7Cj zuj&GPBA!F*;8 zS5|JWoJ;3`>erRdvh+l^KCgV|Ac76KD)^=&|4ZRUDap{I23!u#<-*CJ7*s2Q&<=tr z+Gwd-Fjf2T7}j~%;FJ%L{wwa}C*(yJZ-kB7WASg^NxAf{R?cU{_PB!+FL4c5-839Z zpy4r5q`ee9+>84^9aSqMCBQQxL+t47UCol!WCkv=9g2%wU&yR0NN=;u=8TMPLckC{ z4C>d;ji99b)Kw*zya=KVkg$HFWKJR#KrkOhz!2Tu!I=gvHz~n z`{l>~T5{yCPbff(UEcu#6Qu!nX9*xMn8+2in5i@~F=sGZJvs3JdgzO_#H>49X!#2{UE>$ORDY@`fB9%FwwR27 zA?K+gc0g7(1e9}SLpc%j_jaY4HRAZ6HoYnHmK{3dj>doNCSjC|tk@8mu_xoYWCQpn zThMnew3wp7KQmQPHNIM^YA!Vmd3r<2e~6hn#06p=n&92He|@!u^0ikt>C(M3&qMk~ zt;ev`KERu^!AxI5{WuflB804wmm zz_kx%&&{pU%9{t!+^D&nK)f7UbJ4c}WOSzJIhy_ln6vfSJe2q;!RrCET+vsGbFBHwr;NnBa)E+ zqYsgiUI|Bf7YRs*7@zzCm_h{ihJsZ4StvgpZm=~LoVa4s_Z6Fj9LCu_k zfGFjKawR$ZN5WLy-+zc)rk(RocZXA?AKB~r?J(N7oKP~#+HAHVwWo?AxfbdS{Rk24 z+K%ResvFFGq+Wu~tBqTXakLlU*4N*3q;8}lJv_`7dn3mIO{t+=n}{huY+nNxAj^m8 zy)&4vI{6AZ8vfJ8et6E*F^MLoQ|I1GGE}Zdmb<8hV__|wx(?S$rSG`S*3S%zw0Ji_ zRpG6}213Zj#=yr;ss*)F@VW!hE6!NpnkYezb~5=QbO_MtN^9X{_k3>3Ao&8#g}(?2 z%hZ`Wu^Q&;UJ$|LPkXyzbts_*?3nB}#~2(>W+{Gucs1%80w*h>RWh_rRT`pTX9fZ1 zfK-=~t%!v&q1j20a%vJt;V0dc%D77+^(;9~wxO|O{<}l<8@|~1kH2yG_?_jly!jm= zPsVsVd!BY;6YGR;Uc`+)+0SA1mJc%{EVgR#1A# z<{GpGc<2Wn8hCj6kIA`xZ=JUK9e(X?+sCMVp;6CoexJADlDedIZd8w1!97;9@q6^1 z-`2fv9EIdQU<#h!iN<*8a&>Oivq9vrmJ9NtYWiR62lr7wd-LN^W>)0N9U0GNEFHpT z?0mt_g{BCD5?q#%k?~)1g1K}r{F;snZ;IrXe<4rs0>!lde(hexhAz9VMf@sAh^L42 zF8ir4tL17lw`h3pxIW#XG^{5*TVo-1tSt}_bQ|g0w$;fr)s9HoI7Z0>2WvdPJ4{S< z_RFHLJcCLNOF9ZY6X6$~C}v8a=Ho4ue6CAt@A0)Ha2GxxcrXb(H;y1Baf@@1u=OFq zkS-kuMzELv@!oLgM_bsdtQE5`kGIegrLVGq6{6nF6*`?uQutPXMnvTsxDm4{mh`ox zGzz)%R0!GLLfEdU;F`<0oRL^D#7fv%7BrkW{Ea&ls+rTVmCMm%Pk2z^y|g!@h)f5Q zmlvGS=o{bWY5-pz0gJb3%J{IiRxurFpXx&L0X@h-8vOz>i`WTzu+0~MVqbZtfc;R5 z;ws}ziE2bLJ#?aBq$S8b`@{2ox8UNp>`{~2(eq2=1NkKjl|Og{yuC{_%62!^x9EyA ziSr+6Ce7DZ&AM(=j#xJ%el4hW0qgofxKPXIP-x$)cfF2h*9uZEXxksy1MFH`RgZTef5lijfO)d@vUl_p{Oajr%7zNO}I z2-lmgNq=6Jlq}=AICa&FDNnz?YQ2|kAIgPmwyAvjZFKJ*r8wNUL^eEh$?UvYH8$Kc zg=VF-H`gxXzHrZ$)%HG7eC0|s2YZIbZ1n6cwY<{Xe`tB7x`6PsCimGe55Zv=1B-WQ z?7^yVNnR=h%;JtA_#Jv@5CxNjQUl(WX^F7>aFkcBXH7^ii64z>MdbcGgcqchGc7*JFxKrK>NLaJ%(lU; z&>OFdYclSy!E+)l*atleQDXO4N7aaJ)M-0tN50!;vuoaT8>>Tu6>WW9CS)r{gsTf5 zuG7tK%5heF-9B=IqUURxuV!(Gf=%eG7RIPq zWt=+uefHpuiaBFCqoew%3l*J(tu4_leR}#T3ZpsY-6s9cN2(r@elki?ldh*=68#y1GjqCp6Ail6KVi7b(8AhrUwF^r3Ye zQJi=C@5JjsTHTR4ReeF-aZCueR?+O4Ews{<%8bK50C)TIT&D9_f+?-rw8ov)%{IXo zP%8aa4-yaZp`x;0p%;ej`ohM>n-a()`8Mk+Hz^@a|J14X1r zG7m~o`A)L(s$pu$Qufi0M|(VRVXBs>B7Wr}PuN{25jH(f?WszM>T0fbZQ4}0@tt~Q z+P$vd@4LSw+%Q3hMRD!#!#hG`ZVAcXe;uJ$ems{_SXr6W#ipJc&@%jA&5{ak^!Ea+ zZfq+3Y@>scGG5Fpf8QeWX?E#e$-Tbw@58*iE%fc%ZJWF1EDPD7&&flZZpJFZRohW) z*NK|#Av5{vWp@lTiXrM~D87W0@jZ$~M)GkWAC6$!8-)Oij|Am{OCN-js-hg)awkEe z1GKD}0dg}o3Wk1q+6al7?L0=LEakmUlag?({b3jA03l(rjVKooQ%vy0@kDl)kDYwAK#)Z%BKCLeb4W? z2Pa3o?0>f3y|)h1qwMf|aWroSl^)mL?W&C5(2-WTVd={$qc(KPr8(vlx9$cU8)-$I+ki-c*Wrk3ta99s-KsisBL^OoO zdrE^!`E{7>aPBm3((r{a;Z;e}-+jS+g)T&7Fa6zLT{XR)jywYQK~^@OnmQCFea-r0 zw$MP%_YhPO#K(C($rNGtxEzaGvoFZu7L0_v-lj*|+A#kq!ojLX&kupeI%jD#_0SQ9 zjPVTvmu`KC3_xLRs+g0sl*%mtOQT}spabf+>hW4dj=+-Gm!h80$aUJeiT$=Z|XWZUToc(Bq zHsmGg!L$;NxJV6P{8%7;?==*oN8#*ALbzk;bXnqAfg-!J#W)z`u$p?gVLnM2Y>G>a z+Zd_M@Zh{Pz<==lAqv_%mGb@DJm3;+0dLEqZU|rQrP3R!bERU_-R`A@Lv(JOgFF|f zI|i&fS|w)3QTcI1z^o;iqB!-?$~FcBYTr@t`}qvzX(M}veLP_Ep1|VZjTmmit24$;OK$PyUQnRlN^N}VhL_EN zyabT@;;l-3Y1AO43+t`V&)O~^zwS%#&*iNLwo)Z6C!NRNw>aetQt@PR@ZDgik`FyzqbDas!s5qOEx%u<~;0;EHzj$>G#Z z1r3fLx!oiey|v1a5y68Qu=s$+=A{8YSRac2!8_;x37oI=lMZKW>P4b2@eX$7K0hF! zK9j~*;fjvSBRcXpWSOXHH0zRk@l~7oJnRi?DKZE>g7b8h-SBp>szn6k%Ekxnrzj}( zY=G*Ro2|-Z8hz1+7i31WLU`sb<@_N3qn5-D%Fsi?E@XB?`pucxn9@PBAIAxm8LQ!G z3Hcf$XZBQWN`5e5{YZ!#r- zFJCAV<^0@)Hl{s<`KEBjkEh(vE=x7I_?X(fyP!%)fI=u%$nuaMz!%bR&eWIgpi*D1 zf{+svtH`vRi0z>mBwgXWya#uPFj)^_67O~U$_t!*!mw%H9Mm4tZb7r9@DQ>6i80j4 zf4dbF2=LPcN#wVj?2|XP5o4T@xM2U7Vk$;OmgRr`S;mpmDHn{t$xrZJM~F( zI`~tE!he1XVoKVoXq+R?dH+Wsq}HX$5>aBF#(W7FgpV^Ng*jWA? zm7f$aQ+ZoFRZFVT)Up%-Qy(po5Gf7Zwr?RZ$f`rg^vqNC5JaM28`3&`ng$>n{l%DB z_q1dv1ejt18vkOmV)*2TR?G@p^z0~a-c0FGEc~i4O{O{8p`aVr6zbm%G!?$TIQovZ7EMG%Bg*`{hUqHk7a$e zK0ZkOlj`gZ)jy=5+EO{cRaIAzt-QBoo-DXAt}Fe1;cNizVZ_JpuQ9dvn7%U`Z)rzmbn=}yI)D*CD}$1J~BZB2@;f~%Z`l~ z^8!A>31P9vsE`?^%zLuYOsCn;swdvY0VC7gndYkMBVQM59@H0vfM-Al_wAEnVBT>) z6sy$fV!2cwjNfwmt#~d}w+%4KB>b?AXaW)K-yjK_N)$QNUHO=!=w>iK9WW{wn=U;hS}tiuH?$UTa75R8u?%`60P3 zlFu<`XX43%F-8oZ9z8U%orDp?c&dobF=gC%#7yVpZ;9|RSf9}Os{Hef(g5{x!nWnI z8isz-c$~4qEA+{KvWo0#e5V;-VAB=mqZz9 z4E313qwu?TLBl1VdR|3z%N}mrdx188@$FE2e+R3gTksE+w+Q>M8`fmAc#v`hm3LT7 zykU7o0vIf~vJ-Bb%e_xYns#}k>wJ0M=Oa9{@uU@YTMKzQO^cH^p}{8)AMJub8}-KxHSt@6F0PR6E}BfH)_6rQptHR{#4&} zuHR%f@a;8e{owsayA`8G0IdA^n)`L)4S7mqKAwMldXzOJ@SN<5hiKg=?nCI`b$h#j zoiQiq$swLnEUm7KqS!qVbn1LvZFnCCCz~$(4lDR!+qXAlwlF67O3U4f>K$?uz0)^% z2BOXqoGMHb5^X_bd^ZG>-Ws_eFY<&yl>!&Mi{+7Du(dG=*#^|=jpEJJ~9OQ^Oac-A>k7WS2?o;+Eu6k$Q z0Ul0krB2g()We+YP}6!}y)gMrstfXs{{w%C7y(pY zn}vK1NP2?{skrXl{>M8vkbrKnYPKN+(m<%)KZQ9%SvwEK zKPzT7z-*zXksXB7a@r|_oT5ZWai{BbSM2^*%&n&Os>a(2`+!*sW*vpI zXNOy1`{i#rd(yR7XPK$~`7`ufUU{!UVS=Ek*227VXOV-@MGqFk;Q2leZuc{j&&h{ifoGkw*ieuthj1#gPr$f;(P2Gi z-3J|*emLRuCr*80M7SpU+2(4+fBC4pc$#E+2Rg#mPMUnQYwqwu@Aa+M|R&SAGj^ ztrFtT#7md+UJv*0=ymJ2=Qe5uGN{HNq| zrp!=W((LvNr6{k_3SZ*aqpA7R$;dR*OOMr&L_x19oa&8itI8z@ zF~vJh*x`xeG0W@RBVyh`t;Ll;<)9zF<0dN$Tu8~*EP!$zX<6&TPtH0{}d&Y6%7+kOZ(V#K7fAmXZ9H7)jOYMEs2 z+pKQ|yZ_W7lv|LU`j)^IavZEvUs@AGU?_yku zztA?6|pg5zAx#^Lq8 zc)Ncpa&e7%E&Baj=O(eQ5K}`6x4L(=&lCxAeAcCV^7wg!L>os zb~wAN8r7Nt4?na0lNVhINwt~vb(t*VoGe-05c3d-c_ zaIQiCA^MCT=e$*qy|nU}E}S>Q5m+2t8Z+ty7pGgrEeq#qft5XY#?3&?MXkg`;!Iy$ z-)hJ{e_r}%x0%`Vy63wwTI|v^c(6F<1f=NZIZUDMu8u-0bR;GC?m{RJ&;ug=q5?!Y znLemoixIJb>^B$og`a2SKPJo@R3183TW;YRzxJ=eaF%jdOH?5SSZ0tZh7bRLP#>fm zlv?k7ptvxlH+poLY*)b#?$ninXIuisDBNLnx5j2Xx2CYIN_z{*UZLqBJlrCN9pifc zMU0Y5L&YX*$rX-)#0H4j5Z^Ww&tC$O*IZyr3!!LWSJc$?{qf{D&SpieG0COnUj*qR zI_Sk`kHJ4gv02-x)B1@= z!536c@*0xTDs6(Zlen_#t!DfQRQ#Rld%N}E8Q+Ceu@k%Tv=Lh+Y1(<3?!yae zm0$wBL*-mpKXSe<2i3IbaqosreE9XTq9=Qe);uo%_BUCq8+UZj04P2v075QJQiZ-z ztPk94h449d0>EA?3AmO{e|qg6nkcV?usP|stQxUc@UPR z2SZuWN6qi6TC%Q~2i>7zI#R&L2qZQ77~dCPbZ2gJugDwIJTUklOJ5!r)A#@Xx_9nu zt<#>?u_a3jQYkf;ELl>vine*bg%AxwismNdZK?2)tc^X9vQACq zIKq~>fsq>33O*d(0n8%ConE~OW@Gf-*LNQ>?OB&!vi8N2;z2ukZ7$&+l2~63` z^$>@zQVrHmMmg!CtE}wn#sAgjpFw)zuh6($ag9YwrkG@VKLov+aoZ;?X9miZp-dh? zO)n<44aPltVM;VuxS!j@>x|H(*xPdqb8>7qk0%svGqbIDy~IjR_P^BC5<)nd9E&?bX4ISna5|55I5+YwABQW}LjyXeKs+$gqK|7o~{Z^Kj6v zL>j%9iyLnP`-(-tlX`OC$TLiMTRD23`moroQEJ<2r;DugyjK53v&|9Mrra45XFJUt zjuSE~-0JJHj0Q$sqwCYdu|h69L(+2X@B|BTt)Al6!$a>^5%vS}2LiKF15X|hU`2J7 z{>_h)JB@s3U*2F&>-z+tDDe{J+!CaTZnSgY81IBj zH?e^4(D!uY1mm!SBgJ9XB}`G@jRd$PKYwQtq%Pbv47DPE_l-7C1;xEgY2=%EPaxnR z+ziKkvTbu%0({a+yzjrGMDrL~Lo)FUIyS$-s4DrM&z&~Nc|Kbc4!?tv{P$jv^hs|x z#;>h-^V4YvL0DVM!Q0~1v*mA0@ufjBlD+(D4>U~$v%^MaOp(6xOkOZO-@y(Dlc^WmqjJvVSCJcQ3IyU`*s9}~Ov^sL6 z(hk*%3!FjzmJ8c;NnN8~>rCFbJbmlD9K02<=b?c|U+lr2eyOcdN0Dk9QV^>2k3z1$GY*2`7n2;Y||tn};|ld^l#j(v&mzYi?9J~v+g`KD~@f(r<9 z8A}(Kc?cRss+TjA?QILHnbPI%mYCUX48a<;JK;x)rRXAyhK?PYkRFeCN7W;G>!iyU ztMg(z-^;FVw)^Em zPQt{xio-?$Z6p^epnh`U!N15=s;g|pT8v9#lranjaw`&ydZ0x}x1BLkpM3{vu89*l zkwxSzK$>{7kAJY?vp|)1H?8>jVN>{DmF>$9^&B4XyEXxbWlbQ-?h3IP%Is(f31mKh ze5(!*1+sD4upG6~M?QPL=E*Bw%3*}|l%8Xht)oRo8s6nCiU?K#xjEaLY_>{rY*sb78 z8z{td&>?P*4#lG*^@97KZNo|kF`gQ#EtU~f=Y1Un#p|;PZ~2$VU)s-=r8=@%V$B#tPs`n+*$AbkgrA^9(&5XdMzzg-c=<7t*i;gjmjA5Tjp2d`9q+DX$c6Eso zxDsddYBgijkQRM)5?9eR_{o%@(CU87(YV*Q^XCbO^F{8Qe{sno5|RFONDep~0T=JO zgy!mx#)$vf8#jqK_ia$RRZVQL5CYa4(ukg6o2*VP#0(>D+tr*)+yz^>iYa!iXKN13 zV2Q^_*RVwuj2h~H$40%~&TXUdNzWgC&SWNNPPA{xl?&OS{clzSJG>Y@dO^w}Xw* zSnGQn?n2@`p6mcimV^JdWLvX`?s8W%M+mKErkW1jy-9p1Y4UY}Q?~z_QF;+lRA1fI z%yy|3V#`-DdY!epxDeU&q4nEBh1MkMzE_d<7LAfd`Fh*|B*>b;X&U~<(^(c^9Im7I zaJgMPAI1=NI;@hrvSr!oymI6(6gU}WEP`TxiqwodTV1^I!)M6X613xwMr?ye!+MX` zW0;9Q7zFuCz4l_ejOp#H=ckApQQ}e5^>P-qlF~)((OTdMgwB(g&E;9He-9Qslpit% zq|DZV#{0eP*H!magIN3RUMZ?dOO~Bd&BJH`{fmdV4wONp3z0g+kgC6y2ECNdX1I6T zn20(q^)$kKGaK}`!0@_JidZw3s<><2&-Y;pN*C)58wz+vLDdZl+9Mm;mr1Np%t1s= zStdj;D`_6_V2r}Gg}pDF=6*`KJ(=*=LTnfGK}w9kEUHKnb%g)pLtap$gSAa3cVGZ@`75Xge)*C^EZ!V7& z8RPLQ5&nKGWsj9Em;t}jpJB2P7J0o(atGHXBl>Pm2Qfxg0NuzNkG7|jNc`4E;22NFsVPgbYI3{SVh#McB6 zKCfH!AD4oTCqDqu`A4ETOba1fK&!9PpWQ@08ebxW<#@Oa`irhwWYP$?zHw%a!1i$; zEh@F8Z8X4t`7tORZ%BKc$I;-e4A0Jy-#wz;$o9XpmR6ZOgdAP5D;73SQMq}ym&{1J zr5meQL>CTktuJ)wP`*Pu5(d%?yKnB1q5zgWK$!9Qo5~jm(|9dU8#r}|QG)~95HJ&~ z^hPdCXH6z(!F_hIe9*OfXOFy88iCtqsd6ph&~${_486nY2Z+$K3E+T-@>9*3Uiq8J z^`8wQ!b?iYX)+WzkN2E*cEo`cV~skMhwbTN9>XTL*hVu_O#n4;3b% zpEvv*6@YAM<_0`OH@PLo?IQazkf7=SxSGL6kg2=pMf3V&&9%zU!$2q2A zDJ{y{9{A=+B5P;wNNxC^Dt;P@{>;v^FZ?%$9%Tx5*28-&&l0E4uqcD*py%2Y5oO}D zHLh2wIWy^r61L#7FVt{<;|BIC;ta2@;@MBT`YrZp9&_l?rLOPDWMU~FWCd5j$GXcY zOw!dIas&0Vh(Ocbh^zywmVwZ*4>?}`x-#@SeN{T6WU;&DFQMcl3#xaAWL8NDP>ml4 z%MT;^VkJ7k11Mk=okHY9t2f#LewgA1eJCTHmKb=4_0 zd|l7pn|F9`GDd4w#Hpc7>B{QBf5#*8_INda4$SP!WYa~IHS;r&P46em)U%_e*28R| z*21K;)HdnF!5(zwFOBQ@B(^B|%zU;58=e4J+UE7%AAU~M;rW)#^XpiV2|}6E;8-(A z01FKLYIm4`?pe)&f?56A-O@Lw7=5KTmx??rUyN7^K4T$u3^)g`#)Y~DWM}&qWqdly z&g+&xM2j|pyHijA2#gRtDPVeYj{^^mc$D$rmKx#;-F|m<*Pmq`#jJiXdj-_zH!+oC z33&;>Xs38SZ8DSkjah_0x_56BbZk>cNk?H-s!c%{GD@8aGjg7((>S!VwrWv}IeDj% zl^!D81nQ7AHd&csecC-53I^Ztc+m)EF~**;vhTs+N9Ni8x5!1W=ck=^8<7=li^heM zl)n_B6-2rxUp5LTD?02jCfxZuWNZG1w<@EL%*DqeEg>I4^(7iggrs@GuC5RlCUW*3 z`rU+paOBZCPWu z^lL2d^bUKAMu!yqAovDZgRR<9^?0X6{ZekXwDrT~dxr4t+^$g^$if0UCc&WAC9H4Z zT0Q#G4nQ573+vKr>I8Hc6f^Gms%kDZmNKZ;$j;$7(k9+`OIzFX)p3v9ie^I?Zp^6| z3>dyf)uE;Jb57~wJB7wrnR{$q2#*q=;HyXrcv5&EZlJUy&1mq%NaepEmMuZI3Pr&v zmAq4VBA1!GVX)yS$2Q|YwGc;afYcV-mPy~UC^Ix_PDZj=L!M2X(YmfgYNE0B8x5fn(wT4=I=7W-TgDZh zWd1TLNog3)F+V1*G{Cy%D&|C;MkSfwS%s^7#U2Od?V!OsB4sv-9AD}*CFdOmD7iFAoqGfLxLb5k5&s|!V;`B;aHfkUQ znYKC^KxYNBNbM~~ZFoBsO{V_Y#hnt}EQI#KY1-gF#8M*dVk?|`$A>^3=uuX<-N z2w0^&jg>i4x6xM@FZ^cvACeFp5Fs^U}&E3@*INiV0Y z&a}F`fGKDusN7}_bs@(Yye48lJ~C*)@0wd}>3mG>fB93L7sCw@4aNZpa%S*COF{Pv`DcE=GDOi?elnZV9lOb&?;$6%qB_FAk} z#zI5?z=mlvOA&pIL;G$0Rf}l@lGBr9u%6%3NbN1-%r zW(45MwEs>0(IrYBx>+UihB7`xeAEOt&FQd9$&7)auK3}mPUQ-`F45<%3Jts%2b-3& z58bGA)k00As?bNICkR;1?byK%E=r`^CED#KT_wvj6ng8xKQ2UJreJ?j^Bly&=9cWk zXcv0@X3p%ZFU~+Ys~Drw)*l9H2lg^*RHE{174!H3^z2OOy`h!ueUjRv#=eqBrt+y^ zDoE-<-)`Zfb~bNh$#OiHX|=oReDb;`VtW=|U)!SZ1<16-1>Cy5O;FX9iBr|RjBO_K zwRG)+6qWb$5wch?E|xOriXxeLe>e2)J1)Jd3RLzQmANW=C!nw-MW##4FvIq~Mq>(2 z-Q13mu}G01yvTTsqaK0SoH}Pg3FyFZeIFJXWI^vGSZ=$cK2M=X?1!9@9R*+7TaNa( z6!=AA34S;j-MbT;|_8h^|0YuA_yeyHEwUxcJt>@8?Kg2BF7@b5g{cu^(km) z^3nBj&uimP6mH%4N*h>5ak52~cBb!oZ13vFXj`QZ)3wSbvwZf!84fUo)=)i=a}Sck zHM~%?h+gVUd_H~_6ke2^MZ#jVKxZdy36cv{YK_@05htyb`>{Et7O_(0ep|a(=I;>Tqj~H3@?F#s z@HY{2!3MZs%b`z5OYv-05apV|q3o`4viBNLd-!Zc6{BifHOk0Sfac6BY@Oks$p*mP zadGg*UK|SttC{aMV9tiv0|rW`T;{{(RRYZy*t`=c%R@d4 z3deQEEQ1_%ds8@Y7KQ)5ePVk1pe`xBOb9`&I=To2F~n%mGyY*7MgM5TQUkoEAlg{) zv%BznBw37KU*WD8VXU?<9_4`pk+Ay=E@^*m!Eri?ufy-WF z_8<&M4>8<;r+adI1i14_H3&A8L>%sx=WbTEFZ>WYl6q+j8i|QHnh>ciM(h5Yna!;3 zOuNKvLhfP*FsiLD_pY}BIX%Dw9dSjHe+GJG$8$VQ*t2;wi~6nu6|?)DGUO{m$Cu>n z`Mfw3cj3}&vEXnGm|c>|rwB>^UFC{5;bwM7uDNHTDpDU8I|+AzF7LjlI&QDyKSFhX zEE?TLxfZ6!pmGVpH-2|hX;Fz`SP;C1WDVhOs(dIRoV=hOcwjRXWWtv%5=JbPZQ|xF z9lnGch5-XKU&Cn6=s75gk(1pGB~@qD!6c9IE_XhUocxH?@2WKWtJ@nRq6P+0xqf90 z;vW*!?c3i#@^k6Y7n#>wkkJw;Mdx@l!a8LO5d9a4FRRX_oqhiki$XIlcQ7SDi!=fK zxrm7|W8c{4H&dMteqvrEwg2}^2cj{<$$FB*mtl)N3=;iu_a)nw$jDpJ_vGHXfC;<~ zHE-;dfKKcIq{sga|Kr}j_vp=cn2kGYQ1{|e!x8<*{kXwQ0`qGdE_-`iK#Xb3Hxg^1 z?3M`P7W#c}LehFUR#M9Rx;4mzwr)$tgk@6smGeBM7mJEhv}b%qtC|jC+uyaX3`AM1 z5@a?0fM?BzX{&{$&xPOIsamt*8;0msPSVJpE(&Q>WtGGJd(=HMPBmf)6EHPS5**gg zJaALP(zWaht*vN>AH>%SLR)_JJG}ASv`q(v$DlBQZgKfTHCQHP~#5n@x zLxJ!-DAIO@oMDLtbcRSsT4*Dq$EuZR2wG-L8bVnECS*OzUVT8wlrB(>z}nmwcj?-e zXo)|uvL84XT7Qy`A1biR&x$vsGi_W6;Z4-0`|3k@czD!y_(_Q8cHE7`eVphiTAXhV z^ps4rtbfQ4(i|*Yv1NEkr&tIrTR9RAF0x#4Hy_SwL18~eIo|S$!_cHmokd#Ou{Ml` zuB$9amtRn=>#g-;9F$1Le0~2|YV^D_jj;QsKv+dI=CP938H7eIk=(bj-w#tjY*ER` zi0tVh#dt-q*IN8C%YN|E4Un9u#|SLAqFNNAL_Kr6*|}78a@J#N85VHYH0;a{qC{Ey z_;#so(HyA>m{DVZ))(%8%>XSzJltQuqGXtCO)aLBYYy=a*u?e3%`ZwyENl+SPt~8k&0e?w`m)BXQG<`QCeRb)r4Dw=ZB_r+ zQq!Hd_7kh%+V!)In9n5IutxQDfcY7c=DJfuYclB4-zC=sffTz^i)^CRcQ=LjkJA@x zlY@A`VSw7%fEu3v?Ix)`gLm)U@#bZ}UjvnbJdNL!t&w=;8rJJeq_=9gR;e-vSN=f| zZlmUOTfT;(ZaLDB+&+NGoJ0_1PAz7>R7f?I@A>fE9j-*dOB?B1HVlsaIM}|OnKOZz ztduUp6sL|rEy~*&0ex>#ebzD_l3>b?(bx6yeFzDm>lhg-txEBVXN1rUKZr_{8C=;e zkSv==lq%#Oq{pSzQG5-d75)9$A?yu72U9kPr)LX`INxs5bE-8+H|RwgR5KyU->s2< z-4p5zrEw!iRwS}*x7iCQ>H*&P)}#(ANujUsCD+kg7Wo`AejUtnPPJh!4EWtdG`5d;psKb@s5Tr;9$Ln8#d}}ir#uqQ~2rO@DrUiS*`}s!ah=7u8**GLS_@LEttfd4rDS7vY&J4&bzmG z)nCR=q(}dO^UEzLKL@V!%87jI4XOk$;1YnKI}^CXL=L{c%AD5l(SS=crCtOwDGF{C zZDqVOkmF#Q5olSWGF|lcVu(^rpg2{Vv4uKfNDa-WQ04VCA7mI_Oi*68u!BQfD|&Y| zrf{b>MF>i)SOU0`$qEOghZXj4Gnj_NmEAAq`W*%Z?&&H!0N-Je-QDJhmpnzvO_nv6 zKFSlT(f9PBV#^9fvwL$|HK=ha6O3-K1ZKWO6o$(|+i!rUuf><#*DDk~qz^AwSD- zN<+=L+8Vmn1@_0sv|p@MmFrS7sR-%HZ59;zW2TCw1>1FCCpHR*0_Zy=dXL5xQCjrc zP=2yAG-7Wa-l6~2A~RI-wE5sLxbt1J+~MIAmf6W2WDnNnf;)Rn@pgk?V}S|r3RCQ# zxdja}kS_hD#|p|I*BmBMSt-*k59ShWm$~F(=wloZ&%$T8ZfFJxpXOjkUrc}pJCf&` zFaZFCh21#0h(Y(cC!n^gWDGPu9i!N%+Ey2GNvijenKh8cMYz#9TyYAf@KN6xpAg$y zP;0^w=s^tPvCn=ETV0TC9^xV#F=SJFPa-@ShlUeCxO}!`@=^k}Q^K2sAiLYqXn(%J1vOq;tc)=9!~V><%wywqOf9 zW3EqtdQ5_5W+PhAc3JC)rAG~k58cvTrwXug#KUm^GY>bX{9Yj|M$&vBjSVbwjLOgk zk4cKpotA4LIbg8cHtahXNQLC@q5?i7k|$Zo@3F8qEFLDlk1*)Q`F3h+Sa6HA2!`n%yn~rgPIyM(5)1m= zZ|L~SqSdQ8{_FJU@50*JK@)p8!bn?&4i+-MnN_nWoi^^HhPzl}!^JRo-1XWTqM5w0 zlA?HANZCZF2~8p8(G)r{6mJucf(Mwyp~NJdzpCbiL7cHBjK&Hov`LUWL^q?E8Klo+ zO3^t)n%>q{RM8@8;1NeUj)RHyRmR`*(1aLapO&9EI|>J~RwE;Lg(UtgDmS}Ae<-ds zF&!7BDor75$BR8>b0LDG&>e@>Bkxjc*>p%gjF+uD0QAtrJ0Q_O`F|6!H*dG;3q+0$ z6)eFx;b%7Kj${>L8>)0YAt^d{Ylr;B%7kvFv0vvV)0bt&lvXmF+ao*t7t9dMWj4>h zXStGbHb?5L`xv4>h`zzCFz`P#5(Kn6(2s9%FC8O|*$PTrOmsOCTc-%Rh_;mBvhXC7 z?}7BS7?s%j{a}Gsgv@R`28UjzLq3KAf9LQiC zkV`y{yo;ad!b6V1|1dJ{NTtf zwAF}%h#wTk%ATV|{lxOV_d;^L-LVe4@hDYySb+I;Gijn8xU%Z{XVO&wh6n@PvBecF zo;Sf9wQL`-5-2gk$x1I#fO6t@9=v0R=|gnPPc{nbF-xpr4sVb)V6s`#LyFw`H_}Wu zmx1f4!y~DL!;R9J;2EqM`@5|~q&zW}l8(hmqOUHu)=F>h3N@&Qt0*lHhvw0!N{al1 zI1v-E(8E`7sOkA@AR;)Zdy9wg4Ka5Vc57f*_O=MmXo5u{>C-w-U1i4cA$(9Y)LLv} zH}kJE8V(wg_S6Z4;(eieVd7kRuLbjBT3kQ?>M7O;`EXyocmgAI3Hi?Rx*cil@Pc_a!mC8*~-Awpi<-u6QN40U>FYLh7r&M%=OGzM7=jsPx-`A}Y` zsA7HUK6X%3v6<-^jjFac`eY6(d8tym`}dyMho{#gGcSQD47HyV&>!skppuQGM?Xt9 z8wum-l;3b)RkdQcfBIJ{t~scleg8c#TQ8jVO)S2KXwj0h_(d)_5fTT*Z7*)%M6}tF z02k04Iy>iM+E<`WGw@UsI(-!fRRPgIosSv9?wqhEO1TZn!YW#(4KwbYVB7!r%zR({ z^1S>qlJJ{@B#%;!n?YT;P&S?V@g;3DlhUNMr+>UIB3!Gn_ASH%xk5IE7?uZy>HV$S z$--AU<7Z=kX~J=8Hz;1KX0Y*mJ5(pXo3k2Qsm%S%LfUldb2wMFw*LJf`k;H;wmYB# zxul`|XLAvg)q;oV(UYnEJ-14i(|f~|hP$8zCe6mEc*uMws)*_k^R3Bq@PW~+);n?* zLv}^uX#`mV>0-YYpQtS!QHqZGnCxNVca8^3+Hu2|_|~M;yMC z;M9ZPzwXpmGgW9ZF~`1|ux}AH+!-4DyuGFs4I;C+aOk`-`g}KvVlm z)TRcQam)NNKAWgPRSJr-=2U#0OPw^Y)_D}}f`1CLl}JCcaUUJo@VXtj zfJ}3I@bod!3}O}jdKEk;1KHsEpilhg4C}FK@LZimhw4DOgAojr0#ylh-cOLTvR;jJ zS(j+j2uT4ZT+*Mlcc4nGT|m`3gYJJCq*@+GeKUu(-judx?!Uv9--K2rGhz}e+8R2FxlqQ8?Szz} zP*NMKJ|ylSQpTGk8?uW(&r=tNI1+!f8=BCI*c_ATq60v+F~NM2MeVt;@rKF>2fNB~ zFNU+Go_evViV6N)2)=N~WN6#jbtZYr!GYQna(4C-Xw(GK51yP0===S&_QSJh7kAzc za_g>pPZMII#GMjQv)~rypa&T?Kv}b|sFr;o#3C;NJMuySd~sLo5)8h5IK2)!gyfHb zq_=T5gAGV0EN?r7w6Hf>9d{mGxerUV70<@B*5;%w-F0`SMX06Na}k(pUg;$kJ-uaF zjyoGl{;FhSn?C|#fzMT)D#ragpTJc$nHRMuZ>Th2Gx0x)Y$j-1s&1I%F#<}aL;qUk zvO3HAwa)O-feRNJ63h0X-eoROXByCu>ZKMUjGI8o($$~C^wpJ{T6)^2!H7~oQW5+HhEPnL6`@yo1*!hJN1vJRLgtSc-j_`!ydpgNjR3@_+)>y8!SWMBu1AQj}07n@AY&= zQ|DD*>hcRSe5f)PE1N=|BElZ)ZpAKg#XnW*NNjr?(D&^Ezv|*d+=H%I%Ov{oB9@O! zhgJlSu42@>;g;uAi2b9VB(>=;_FUN#NN>YfXv}BHF0qZbmOM>QkBI^093 zfwHT}+_I;UJT(Y({k0<=8A53c%QA)DV`)2s?FA-OB&G}D3k&33s<*EtG7X|n3u4dS z2OnX_xgD@}m!-r6%6?+Tkav~P7bZXhmh|sLiCXLF>n2tG%W?-S1>o7kJfvKgN&`8AH8BaX z1EqFH_&@+k$Lnz2%w`vRs$9%NNr{I&x0*(ptyC#J5VTYw`J?<~Wslh?3_d_>Y z(sng)XV0KkoMiu)0nJ!yof(DHGNmj}XIPFMuphyu!uum^P^*K{=?+C0i`d5SyR+so+PaW;QgmDrv9r45OKm#y^28_Y zLZzdCnuhH|Lb0wh!b-zMH}@KYs@qAN&W9j{|?Eb#%@$U^Q02!1exHlzqa&TMObR%6gi zmr+sY@x4aV&8ZwB;;TMt=%(VZ(E{jy8Ei%c$G`Io_Lr#S@mgxnOTs=Q=?1kI`$n{U z_g8doMSxdRi$2L3c>hTn^Y=1{wiI)qtH)6t=1#?g`QNh2mGY|~@RR+ATuuc75f zMBO22eJ_xv^6VLOry{}Fqp`hPd!3r4-=7aAxcB`t%rI+Y+iSpF7)@v4gb)c#`|>A4 z`VI|P$`}7{5(;q?^TjEA@yDG|-wubjm;P3bsrA73h@ zHW7jKzR1=fdzLBQ^QrH_@XPevg8Em0c>6xcD9%n5BUX*Z&BSo9y)SbtlSxqe{ikGp z^NW5h4z2V4GEi%I8VmcbPgcCE|IA1RMbXR4Y8U63574?W3MNx!ch;&`CfSxeV7rCUL>-o>LuZ(!!^j;^=eXAj?>bnrQ3vK7;jKoTlSIwQQ`3_B`Y ze-h_O99f6^2!#pQEgzAvi>Tb0$`ddA|Cj~3Ig#uP9H0YPtA?uyjnIbXaKY*_*q>&B z)hYsXezmvtd{T_{4%OT@O=nqG8}KaQbu zPH}`<^kJmpN(0G0)WSUKg4tbZeCl~WDJUL7-KrTHlG01N44NY zs|a0~y*5ApM1W)(R$R@bOO?{m7&6a{kL_k=6f^UeNH4o4xHCiBJkYp%ElS>|HQ5s9 z5Ex{Eg^yF;x4*?6eQuOrbJ>Xbpqf>hy*>**^QPU?_ zylEN_o>&DM9VMet9J_z|aC!V;UdsxCiobhK<4OMD&Z zNLb7XtmGNfKZ*M`FnCUl+=zelfxbVR_!cBiKrJ}0ho0a~D$71F(8ANR*~xlvW($+V zqU3z>6ckoqj#P5ZqB+VHW-76LPifo|N%`QRC^>xaLgD+n16As+ z7n9uQ5%zB>(MNa6gQ{&>Q?xsl?E&c4i0+o732icnxsGeG&-V1{j`36HQ2P&u;%_!r zeJ$LyWLuU({_sX6SdWsdSVB+Oqxlgl#w4q$l|(Xfi6R7$cdQ;#nNPmIo8&M4mjIi+ zU<7sqCXDirW%t{R#8Ne9@=;kR9#@KyYP>)+scpd1TdCI*^Gtarm{7-G_YbeqH3rI& z#SQYmDDS`SML%a%#BU-`Y5`R>@e~_QEP>*2OeRM8F!NX+Exp_{wN%sA8~A(~knWp^ z4)DSjyW66Dbvfybk*#bX{=}Zf%SrAyZf}bQ|NZEE&Yaa@*UIWn!xYPv;PaLb(MIG4 zp)8P)SyML9;T5Juud-T%I-cZU$YP0Y^L2czp@6+flUe|eS;=$I6pA#!ZlkV^nvY;$ zyEt{lrMQZo!<+eeDEzIBPj9CU!4U%sK1vwWuCt62$2VZQwp8xusG2$bDqB9)SVxgwV`$cO;m|9uk!86XCPR3Mgqe{H+JWjnlw{BFcgE{DS zW(B4G)$6BwlDXC_{|&3Aa*UO(y%+MRf^y5U-GC` z)L&HA`uWrt!oxj#JvUpw!;a|;2*Zl`@Nq4g_#wA!fh;5d9Munswisfz_V}A*_3QldJ$28h-#yot$|Y^{h3-ZO?R@J0W!mO3ryHGQ}Fd)X9lwy|G>o z8A&tKyH71;=2drFj%uxMtc++=Cfw4dLkK*Z*Wp;t3SM>|g552+hmALc#)p|y^+|}_8l9~%MvA(d6zoCBRpwpIl*{`vvi{_}xvNso9U`a~3 zXa;IOvkDEJWM^Gi=B$zsT~))U?GUV|Xh#7$s95tBpiDYwG^DHQkA2`Lr}Cafk$iSV zkyyAl?xb=}BCq<+OT^pox$q8Xgp8lOq+*Q_rzAk(0D#oRg1489y09>^v7 zJU=4_Hw5=IC+LVZpGkHDIagi08Wc0&26p6iBk|12pU9J` zW8OJwJ_htAu4DzsM^GBniX0fjYh;hZ_z`(*7~ZgBXCj?%R|+B1>u|lv$omUN;LhFe zj6_?&e#$WpY*9-`79Xn+sd4C%Be{%Fc*`4q?0bAb!k?M6P) zR8!M#E&8n)pzG}koc!wsYf-ZeriG6gDd5vwgc{~~tsDOp4{r>m$6(k1%hzCq4{52HUZ3k-T;^*Esf%Y%`iF&kvPG)9MR24gN5BL!8{@rk<_ zhvz^1Ch4!&&`#3baDOp#Rs$Y5y7x4qihm&Y7-QS*7sM?2R@BI#vdA&xL??EiPx6pS zeQc6|YUsU&chr5{8G8mP0o`KI=aVj|Ihc>fGxQ)@%?!!tp~_?W z#U108j1`|*g{6Z1_xEYN-w%lb;H>TRs1tX=cbB<6i?qN~FWf!~VOaHS$cr&Qg=}Pm z`{B*KqsqCd>Z!+VDpyY!ad4!f<_-^gBnIb&kbMF@wu0^ZxQG*DQTSii@3`KN zB(?v~qIW>HAyQ?UWf>N#w)HX>Hh_YpHXx4jWptf?bwNQk2%aAWkyla3LSJd4VfBiR zYk&LIm}u_X78^RNeb#m@k|{zWi#Dd-+wRQR8}c$`LghO>Mgwl2^>V>i%*uYvHRScZ zZD&SwG3&11J}*Ya1wzAg$YmhA?hJXhu<@GMbpQIxKQtGF<9&lzeP6wNf|5F$uTA=L zH|rYl;2!d}}?}1bV9`GSL$T|RCEp9T&HH+9k-5>oAkJHXlusQ|Tc{O_mzWgk zM7@SjpNV88c%S2EH+!kreCjVfs(+^U&>m_!PaN%XoeK>EUkZ?{W)uiUQ}!OE(^!dv z{Gu|wsCSusTpduRy0NeY@97Q+q>Nd_37BA962W;E2+;}K|Lm|1L`@&B9;dFs_&w}T zI|Y|mKL7fi#>61ANOvM&!x3!p6j(mF)kY7NUQLTh#f~6#R{nDYeUrRsQQOLK?MQTD$AfvC8AXk78_6zNY@67K*_=Y*zpE=oY=L5hlo^TmsN6ZALr6BgfNJlJ{S$SON2v2x( zZ>v2)AyaLBf8K$( z%a?V=z17Z}@Gm%rT*&W9e2H~p;5*~mC|aU}TWf%u7pg$00_p)=LoQ^wBQ#dwNme|?{_T*h zF7d+XRsjThh$;A|5Zv(=9?|0IB7FGAu+I^v|2_{sE8a3??MX4PMqS~o#p?sX7%brc|eA-~hi z@89{iwYM$?Qj4nGzHofe-7$(yZN|$VP&HZI3qbu)Zh*^sMbOpjcMZ59yzS2!+V2V?30K~ zJ>Tubq7TBSL z8+(D|RU_j%E_TCliVcbAfJU5y&^6m)p>e$lNc_fLRS5BOFLsb}9ZDeX;b-v|M8mdy z`0wL}Ej+RBN+grh_n_2`HrL#;gxz=tze;6y)?^NzeI;nbj+=X18vY$ky*L1ibQD_w z<$vbwaW%k>v*L<^sj(yYi$+m}%J$L&vO4YmBLs^l^Wni+$Z+Ym%wqh1y>J90P%Pcg zgHR*VI|k{-_#ntaI@e+Qgi7?{2!LLRhNe*LdAuT7Kj%9+ePSa483eqUS4!} zrR%uIeNEo(R*<(C>>bL-Xw$J?R}s6wfd_5~WVS*Zf9^VG;c1S{CXT|iZ;TYj#C*(D zRV|-9Geb{ex&W^6#C4V+{J@RMPgcbc0v5cP;BjpMkPahV=OVv(s}V(sa7643Ml+$Yr$9472n8bkiDOmg)=Rsm{d zpReIvScWY=^m5Ek?3o&Xzt?>%e5nCtENq5-hIEsQCK~k^-)cn_F70kmqQf&b#3^4o zCLFIuer+X@SiTiKi7ULSt%!5d%Db{RPU0x3HD%NP{5j|pMm}V|uQ)X{Rclf9ydAK+ zkVO^61Eku7pb5qTtRLX2gJWmIOOdj^<6*y9G2>88wXV@<^E1-K0uywnl|v;Twr^$? z-&Q4@D%-N?)}1fRr-+K9@<*KshRRn;^Ro=HVmNadU=!84@;x&2EwYSRhDjD1gS`zZ zw#SV?y4`L#UV9TU5Y{hZSg2iZ@5<7!svTq2hd;y52a88jI^vTrFh{>a8*;N6iBS#1 zyud3M-CZ#5Cq}J8#)srWTx=om0uQi9R7oV<>X@+>pETz>M&K#BUU3x~!lTrqiFw1w z;9Q9EG--3kF{-ln;iT+Y1vCA>UOURwHs)*e~gF-;}3%_o|{j7Dg;uQ=TE3 z@!EuwO-NX$K6Vw3faD-$Z)I6^wu|bQ@}y{aQG>!VLp2EYdUN0b8AEAQ!93&25Y$~=G3r0 zNOFedV+6CE@U!C)UE~A{MrBIp)5h0l`Sfgtx_|sRJImNrA(=) z6s1CzxwL*;&?1yFtrVdUCCybzsZa?KGor{YJ2Usbr{DVzV8*@YJkMuch`bBEepc3; z<mg6d%%IfQqQ1w8Vp9tWZ0F?GDY*IoAC4EC1 zG`rPDOdrs#&Wmc7(lMPeQhmaElv_zM^d{FPLkDv-gMWR*FN|Vt$n&DT{KUOA3x@OX z5U`@E&Io%21E1ldGk3D^D*Eu(`XH2zxL6_YGFeIJJBB0>d-iR=HL_Ei^9uwml;;WUW}#u&5%tC^#- z|CfeXf=E1<0AZk^-Bd)YvOTSDyObM&1ObImWgt7<Xsi7}qlF z$=JNHc>SITJ{VFsHw};2KnbS+PKnIjl$3N*c9EZ}46CFgX@VE|i{P^AaD>@U&d=XA zU-HzA#+*ir=DntdXCnj9$>zB!=;tLi#z1J-|D6$VT`5~HxS7OTjcVy$@)3rP8vZz< zZC|(qJ4=_iVV;^)zIeF?J`DmYe1>FY0V{8o5^q0n)+X1ou@w|KiVs!Gu>WgG+(j_$ z1}*U#bvRADILv|lhi1i9?IV=!nCMj-WIP}If`LR)Hei zPezKEl6nn#pZ{oWwES79g^k|+rQlScB(kt`!p+Sqm@L?28?u9gK%6L`|Ij};Z zid@iGYx0d;urF3Lm6Mbeb`i`yq==(9zZ>BT9{^#TpmcxX=!TG%RKvZ$a;v0oO1NF3 zKg~sxg5IYn5K}@p8efl=RtUb*{c_`5OJQ&@vKSO8#!LbDA6gJQc8?jjgJ3YH<26t)^~22?lS+-7wg zTvw-$Ypg;}FkyC!G?IgLtYLsU9sF2?5kLHHbx?^K_g@d!Q$gKkD)JNn?)--eH+ z2d4~AfW}L)Kgdr49|N>AcoU5?Pfj1IWcrff6uXmoq0a@`L1V{7{dCWEKy zK0$ws{l+s7uV0ymO{3s2=o+7rKQyaQqrr30f6o{P+AMRWBlF45zTkGUJF8v-j{pR$ zBeX@DJTY*XSE+#8l0Mj zALkoOLhoZ8(p&wAqt7wnDCOtc8fK>}t z+WbNxZzYWLQU<4>v2N>Q+|TlF@_cfm>9o|`aG8^=XvWB3MgPlvv%yS{8fwinz?_ZI z0Y~f8fc>|#Qon%l)Pok}&QAEycaeozYrTW-AR%4q$w0aQ>|xZt=h2bhM;6vp7)D9U zI=o0*Af)k~{xOYmW;F~SD1q2Q1!qCH4s=;L8}LcD*2X*uvd4*vB zrL(EyErqZQyW%PJwzT^&ravZJ$ot3eL2vE+;dFCpCk3xaVFZaoc^>z4ItAT`(9{yn z2>jde`+1k)A8T=oEVyzwC6}xVf+zaa_gS*vGcO5@VA4nn13+C2+-t4nGM517^SjT= zf>*wKV^ErFPi&TDeB}O_y!?gy;<>=CdhCil-9c@Xl6etW8YXIi_(yp@Af*gnX#@tq zY}6GhJkJB9=^^J#ZaWz4Jhl(Q3K<6&{M%JpxC=P*XzF08 zKy|{htK(=(oK!S5SmAsB=|5r3YYOJ2#@h|H8u6kS232zHI~j1Yp;bQ6OZx8i+U6gO1O{LL+#RE`s$3DIk+M z@V>+ue6Ya4c4NsibJQ{Su_5GtXD{~nge`h9Gm(z|o8fg4{yY@4%`G>5(pE6zD>(pF z3^OQcr2A)q4eTofi{ae58LDTyBg&=((30}E-&$}w?xSC0M0dO4Fll;N0eNvQ6ryv{Jbbh#yG7HHYl_5j z$f3jn9DonW2?w>If;40C+gF&x1=Y&AL8;jc`?-J~>_m5QaWSJOy2gIZU?B~3t6Nvx z%{bw;Q2&%ot%>5##I3oE9dO`}rT|Iz-= zKn&h_zeVEs(q6V=4m6fJ|C8`Op!K(YXHKs@a1$VK)`H+DprV`tZYovS-Qn}=WCuc4HA z3>4FFHg6`df>B(PZ?7qU=CT$1IN+iSj)6Gn6B8=pN3i}0f{Z?9C!qvT6BQ+I&`=BB zznSkV$YblJ9f31?; z_GR+^0g=y*nEK0t$d68jO{+#s?d0AWA=3e_2X989M4e|dobFA`kQ=NMsW>kleoFB8 z++gVuc>z>SMZO$uW0(;GRnV-=f#5MHA6M>1A3U^Me+m-laB+Gf7A@DYpu2c z=d+rk@51~=kU8%DSd^4G>EGftmiZApHKGZjYSXH$YN-i$H2t}n7)$B^Jkj-nfb)ClhDU*y1e^z?>eQV&qBu#gaKJsii6d=9Qa&5-E+J1n?cpb= zV&wH_ODVt%(l)%g_!+5Z);7#u6>ghWXalL~qfirj<%hiU1m1EM3iXie#+4fGaRxZ- zu|Gh0wH1t@JU0|KeYg$=!J~<*cpGTrC)l_(NQV6|jtTz>x{kt>7uBrT|9vm?0XC!E9UtEwWc8m|Rp>}8>XXJ4vUJ6b+0y_3Ndn=f;mDvvPnV9*AP5gy} zT)h2+{JkrlvCnmRYLF17A&bl1TV5@j&%#ELZK9YB z4Z37O=Iq1x4dvmGvQ=BoSR#{i+DXE_L~?A zjfPHNWvUR780|z19idlNl*IWnb@>}Z?Zxm|bkXqGQ1u?q+$|Fp&4P_%qAoLu`X-R! zHUYZ>w^176?@^ve?@%Oa*h;_$PzyhcN<9~+i()sAQg|ka!U8np`^Nqa_Sjanb~UJe zFXq4{_T+sSpRj(O9dcez8StS%vb{&c14=`gSP|;GZL$AmBq!x4o*zhQSOzjEPW6;; zHpnIUxRC$(L817JpCh`onXGt1-fUFdIPyzi^RBf$V98W%{R;5z*yINUsGxa!j8gz$NcExUa!i(}HM$tpdH_%mEfbL?{9Y#)Ex|vxNUpdR6dtrvm5Rl=25sW0uU@ zKUJ`l`@*qbv0x<`it-%W#nDl|H*A2`lXNR8wp6xr{@IeghfjK|wm$M5;<~&n>lJ57 zKM*CBHE1UQ>Ss{5EfZPRWR_MmZ>=C`gzGce9W0Bi7=iV&YbVn0rZ2{pTlX8vQ`f8K zE!JH@soFmi$s;K6!-JVvl7UFo>VYPWgs_Dw)oR&V^suAV?~OO_@8%t#l}`gTq!$Ei zfc*}@nT7|#gs*hX#8u$yGz3F%28UX+3+PT=j=B1iomc)CGeE9DbATHK4>zs?Ikv)| zYfxu!JW6Kx?PvPCq&+(rJa+_Q54=Ja$DCY;@&UF0e(Uw#cfAO`fNpV)pXakM39(j8 zh6R^=AT^f(6%ZKB!kcIzMi9MECK3tdk{jF~{Lz;Wi4AR{=d$$h4*gsJ9tx(^BS41F zigdcoac2}lb7Jb8{AxO3+M8=lP19O6f`O}u{(CAmUg`IQd?X)dAsFwg{_HfrZ<16i8d3h0 zen*fT)R!9y+{(`F1sj#{pud&<(d~BBKW^9pJ=O`$W+u+WlCbXQ+B{3St3G%XuDfN@N;V)M7+4<`+9T?;o0KyXhpDBY%=sOX^A~PgV8E=PG zUU>@G68zVEn`veym_OF^{t)k}3ZISpFe?!s^Z%z80^~saOnAWxvnN8s1Q((IzNKBP zZYk^jYgf7A`pwNSt`#IEfOu1PJ#d!=*RA0fZK2Fl#Pb@#duejFAbf(0BqYHHJ%|E^ z+hMljm?5xHpnx_o!F`K(yl`-H5nZEiH2+UUW zpy2P??@~Y)I#3vWxL`ZlspJUZZ@opP3VC^jN77ZmP^{>Z59c8I_c_?RsD`4ckTZ}8!DdVBAXd5`oN*wJX_R(~lE}-Z`b1`} z;EZfy&(BfiNb;o#L!v$g(w-l)trc{Dpve7#`R{LH`zPYBf!|oUl@-WPjvL%ttvY9{>5MA$pk9zD1O)Fl<^II(U4Pb$*z%%T5$>?xHoJ# z2grkThAYNE!KDYH7FC_biRHJrzLVGoZZ)yGC*cRNYbf25+^2oUMS(y|YfzXht1 zaYddSJi8oyZUdSXnK^b%!126WDYj6rc$G1S1@=$Jq(GufbvA*yUYDZyecK+l!O9Ph zG4brvpuUETqhh*owm>h50}R2cp-#a%WxhI!1llKVRocmw7d_RFHPMFZ>RmnbyKeB7 zZ&VwG&22y8&r==w^ZEXJ?!m*mKoRt*0XQ?kfzKdV`npjhR_`q5)(8p*GCY5#2khQF z_ZC!NSR2CF=g02np#q+|-CoO+^z7`X*{{;LC>DKowL_ z+)r7=S)W2}LG4p;?TUg20LwJ7ne+F!CRWj3Eso7N=#(hyPD`CWAqsy!I!g{{ssj+E zpFsI{mbwFLKn3mkN%p1if+}VUn>N@?sXQME{>tfC;wTq*#?J zfvwWVKe$!hg1Ab-$^atX?ckW-<{y5yxBak|1+#&5A9*-_kuuf>N`Z0dU(I%LkauBq z^3n80-zO8*&Bv1_DG2=iAwnQ|cd=ZOZXw+;VAv}~rqZnimS39F{RQ7f#L2LzeSFef z4d4HfT=2`_x#B>gDY?BveBKWoSRczmj5OHw=*K^)JbN|aP^?pk=fGW&xx)=Wzbqg7 z6%lS~#UK&gFa#QC*aMuk0t+?&mkg#pQGJjM)&o@;$iL5S$%7hPpIBf13c$xQDr#s} zCh#A+=|6h826DjNW4FDecjs)tp!{>Y#Z!21+|Yr0>BmU(|C&VW$pibzNJ{(XuRCPH z2sm#9I51Gk^5(Qh5sL&K#2)!i)t&Iim!KSRsIA|({yA+~W~d5a4sX7Mj0zh>{OB}a-1pqjZG#dHktTH!Llx!qRr zSRc=3=9ysM)tJwC#nW*=4WBGst1eU$gIS2B&!*df2`@7jN4WV07rPsqpZrv60V* zG=ic}KN#C{AgZlFR4g^^gL76?haNVz5P*dY&ZOoaFH4Wk*$4c-Sde%7s~>PJWuN~B zzaX=WWWS>l41h80l1v~6PoGx(%e~HI++@jv{2w%{wXwX=PViB%lba?V1qx?K7Q*nW z_$B>zH2T`OYYb5O2|8GOfp9S>H9F%9AR>RsfAVlkzK1;mzpl^Ef$%DWa|AFDI?}h@ zft`#5uC1B50~DHOuCkQ$hA))7y`e0c7zF8}@0vq-mU}u9hUwdg@d}abVvBA62+v^R z&X)k;oerlMwHJh$VQEb1O*$}|JTPDhiH2T5WwmSr>+j%`gY%if3>Nga9VM$Xq*aWN zM;KAP7Fv65H9Cq^l}f11Syg2or+L(0c~ z8SWw?x~c_TCnl6Fu$T9zNZUmW{swF(l6MIBvTzM#_Y*rbxO*MGX%PJOk#&rmlJLy{ zCGI=ihXHCt(jW zXU!bmPh>lXy(3nE;$SGTILoZcLCZ~HruWr;-+4`pI~~iX-Z=#HeAp$+vm_?oF8;B$ zUFvK(96rr)nm{@@l5gloj&~giAMNSB8BtU;RK~^x-mp z;mL%#BbZ-krL^(yqOTpn0~M#MS3DkS+c%{x8ytBa5xwgr-rwu})-UEn{gLpou8JcO zFP;b%|6Y{c6zqF?O#0l}Z>qABi{M*f@Xx^PQ~L#N8jYj6A7#&WiOffm?cXKttkuyA zP8ziUomK15cTJNW=|dqq&2jR3{DwAlTXKsm@@D|CMMc`TXb#yjY?ygF6qvDKJY|T{ zT(WfGu+t-H>)>hKg+t!^rRyG%4~P2qrO8Nxa>Hn_mwH84w2z$0;2%9|_gs;`YCq#i zus;lkM?#cwsgn|VMOkQ1TWf~T6FBj9tWA7^!Uvvm5WG7-TMpn(fV0`0QaoqrTRHr) zA{bHO%>!EdtwH8OOrM!qTxYNkl}^?tJkYGEMNoR;8Oi2P*sMR;Zhid8;(fzUt{ytt zEAP0z`bP8Cp~y?87l#duRNYzBXMD`yMpEdn?1`c8_P>1;9%ml>ef}iNajc&^Ki2vj z+dQB;AlI*y=owiYd2>m$Z1~TIt(C%)P>)a7-hd%mScCgwffRUv6|66;<{au(htLnd&1&TJiIV2lq~4AUox&) zDbh3uctgxNqDrks}%m(p}6l9qu=d;SYS)U=#)eT7u1~{h6zfefqZo~OR9p0|b3xj@$ zJT=@H$r|R2Ysv_0Arr)SQL&PLXUy~XV%RN>ha@O6es1IaU`vAKw{5Gt0c>5c;ho?N zD~5wCZK=ZboAwv0=?$H`=BKqyl2r91rXhJ3_58qzs9W#iB&{kq%87-25E_XTHnlF5 zA^{97ImytamTQccHB%V_^ljcC|K{?p2}wDuPaIxFjnN9 zB^Q{O`rYo)ZMA0*<=Nxi=ejo!q|bUE-^Gta);cn^e5byB zxV7K3bFz`E_LOp9iXfk6(^X+5pP@L=kmmx5%o4R=r9gqaM1^+{a^|o_(iHysuAfH8 zxCypdBPf~LTzqhOCGs`na--iF;O6udDg=Hw$0JYW!8@AAJ#27rNue>5jaz{nC?1zY z;TQBuvB%p$GE-RSHxs}}7Tv`bAQqShw$*tJB+cWyrkzSek1nPIC8mmGc>o>2 za7i;$43RvD4u55-TpNBxAbne&l}ijft$rcC{-ayhnhG@Q6hPof;x!&5zPUkABQP?E z?Dh+@j|pqe*s|zHsc1EK{moY8xsgTT58LkQu}3{7EG(9@NP{B?h}S>wHqBwN2=0In`}m%{*t3j!I4E|xy%p2|Fcwr zWlSFhRnj}9jG0lcFK&4et#1vRNBU=w(}(Lff{$5zSbAEA7We)U%%FEZtVEnkCx$ei zmL7y{d^YmH>hzf4DHxb(jY6^HoTZ&>(+|slm1gH7)?cQO2?Z%1kWdZm2awFiie`W@ zDByx~zdDa;b>VgF-X%4zOp^@iUll0p$ya6~_(wlCmjYdIR~uhNQ9=3Il7@L_X}1-T z&M`Tt@-yVtCLK zr;#Tp?2BY-!y#d>m7^!z0o9b+awNpap!Liab?jp|>n0YUNqTo9q zaT!3+VnOd2xRlA?CM>swE5N~}AsUCZ@vNFH^qL*;!H9mkbTa!+pb(gfKG%acm9Q>Z5SOXb- zQ!4m9m&}n^hLHj5#Q_r{7z*Hx3YG8fyF4JQ`&>_ccqzS%fJe6x@M9QYk-%cLEaRkL zZ;#00;FS9}vPh}k9lE8km$yNpnY7{?`C~!heAj2Ui-#CFq~YKQx#;_N(F>O%GO1l= zcnY+y3~ z;D8+8E)7j#o#98?ouQ5D0WY%pKhPi#9WpnWMs%SuQloZeLE$l@8oz090O}ExULfrQ z0hmFxT5{iu=I>xN3Hl%GDuW2Ca_0EjCh&#@d38ku8=4MW3K`%G`aA;$(M(Tfg^cC+ zgHjXc`-p)A^ZWf=vU58BxC&-TtX*mk#fo;0-^3MR177x&p4{2}KCOO_A1bc`Ye_<9 z$v{`I89&0XrPpbT@_*pyV}$|o;Fz7r)33hX!BTsHTsd3Uk-vAIQ3G#o@fpPVe4^II zzd}`2q3?HF%c^_x3bfkd6izgHT+aPWyX&`S=d24mJSS|AFHuN|xWsLp*mpB@bZSXQ zRNuMi{g?U+%YqZ9`M;>!7TH@^sm|F29wI(+iQJu|mh&*VX>1LQ7>jlRqX#I6)p&ZD zV8>Yg7w#k3o)N!t!A02?f7!XZ0n0CB@n^Ckf=H+yu(wT8!Rl`Ug;!mE>qOS09hcQj zmpqCiUFTt+)WBbB&lTXv6Vg(dP?D-ly5IQOxY3%NdPkZ`EmbE!%!EZHzDST7!oH%a z$dP?We1393+hAczfkEJ}>0ZPMuKgT>Cfzfdd%Qbc@V0(@<#SnXSSC<6!^CP1G|p3y z2NK&v9$n~97@H%%>Sf2~xMgc48^SNS zH@wy2Ed#6WDgPNi zMn8drI7Rm5?rdtFClw5a)ch2!A;UbS$%BxHFp_bz4anYkyBWu0EX3)X$N<Ys$$c#$k!_8Z;P4op&H!pER&_pbwER?l^$vSkWX8yc}@FX-HLu?b6LE zpN)|Q8~FxxB(ssC*B*#pl-;JJEi!fW-gu;JW!d2LJ(V}Cu@|a&Nod|9DvuI(%Umme z3578}`tEqXkLLNSc*br;s}kq;*eS&3c_wS~CBtGy;#*#*QsO#zg&igsPLjzUoo=!_ zP$9}OOBdOVb|?HvWea5D!3DQKh#I?^Au!#IakVtSdEob99^QNfaWp$m{@!(3jwkRz zFnI~*aQ%J?!qN5}@M|S=ZgYQE}hI>E})6=>| zl^8BSJfz}%hJE?hUC3*iQ=86J&{=rjCpLx{gV(Qjp;ljR5rXzJTPD))v>NV)#T}Nc zsn!zyimQ7{WJUJmdGZaTnw-PJ>wc1^ZuD=WwcLW80om$gFW15zn zO%ZQK95(#xgIjutmS;|t7_@R1yJuwLO(J5WV-_=Ur=7A(b8LC@8`)GAk1|(VMHoqk#+P4dfOBV3iXT-2y8y*^ z)Kw8t<}t$W+b$K&wB+A1&OE6r99hSwk|&KfGt6kr>TVudm&(j8xeTl+5`X=zu|kwH zou|!Tj1j(RlY3-_9i$l|U6e!nc~v6r)>|y;M>f*=ay$h*jdDyw_{KmOO2fRtt(Sc= zk8qt#J7kzHo2M}2wEz4Qw|1puF_zYA!$;?tSK^DKPaoeW*c*D?1m7srZ9G zQ>xj&K{!l3Ar@Wnz>a)F%s7~B>=74w;zmq}d@Nhfc`0X!QL>NgvNOm{1N1I)EQc~= zi*2J?G5GT#qwZo|)65O)p=CO#nY9W+T2C(LIZy`VpyX`v4FVyj^oYn|(xi;k{0Pqf z?LP{vN5XPt3BPhkh2c*n8QD|`3%8$;<6AwN8vIH^t&VSxyJ@Fr9-7z6sXa;+=F3FS z#uwerh{^R6Ob_!gk_jRP&npq@CqmtI$nZ%&UmKKXOe8!6LaO8^e4MJm;r{B!qVTDH z3v%{kNgEd@SLaU!^aM+?Hcke# zJK+x{I{$%UdPo^hPl2tn4;W)!0pL&l)b8%QSkTi5$%YMT>Ll%;1D^vlg?&FGm@fiP zxqlrQC~ge0qtJXb=pnl)3c?j2oH7uRdkAE4y`0Z}z0V(iYF&Q)O~W+3Md&hDkJ)lB z#4mcc#3?WWBUNybFdJzw#(b&Qj^H{k3s-E$pKqgmRGoai01z*726@{h6(_(!T6q=- zVPMnPNwFi}Yvp+J;zaY`gG%txfWu|Eq+4s_OT6Vk@MD~aUIva$CH^t2CaL82iLnbe zWu!YwS`Trf27j(Rg5u-nG@FBE&7a8dh<5jWkP*bjvcW?p%m<#Ft=I7D5E;}-X6WA{ zPciYn78Q(eWAdgCRre6hh2jgk*3z~gk^kZ8>wlRIi(SdkA&uLjGGg6zv<8|8t_`<8 z4h}cSI`EG|8-h6t898+d{^9QHM(#Srb>DD@~8b!^)eQoPWo74j=FLKUe!qBEAB~zPLs&WhLu9(w>^4#F9C zCp?Y11gAU2i;;$n8fV$q(mQp9O^{y{=o48T2~RvM6FYh@70BL9m_CqRZ01S?KGJIA zFfxfMaZtg&ZgBzQx?APxLfM)#M4B}8%secf2pujOS8k2DY~420Ssgr4wC}&Z+`GXl^0{uqC#j&4}pR`4bUmY1pv&tVoq~a=$MKCTR0KxH&@nrFfHGUJV$ZU=WHZ``vl-Hpk`Ta@0X&F!|C?j1c z4p2=!tc|#>_zYqZp^ET7*VuPR<_umR8qnB5`82SGvq^sEcRU-N{XierMXdBgToq#X zT~R4kdd`b_za2@a-)}dtP>bq8$1IkH&>b`|h1gXzo(liGGWtjkyN)q-s{!|Cs4${T z8mdCHDqv6RwyXqnJ*nn^NRGI?iQH~NTyGaEh7%P(-iyNzjc`35lSKpWa`^HLP%hw~ zC2a`90n*5&L+rHGg=|*CnzuNChofXfpWme+r<>fl%NM-)N`^L0`lVkDj%AWuL~ich zrs^ohkl;QDnupW`ANEwhzghGhj~{lBE+0sLAU&SN6^~^laW5Buz%%6uu7ZPgr(clc zo0p4S(ge3DwO)JIAV;r+VpTisv1c@XVK!(87}~i53Do9)i49r}DU%^{ObZJ|b}C5j z%w^$DTiICEL+rUVRnLg=BL;%`fG;sl+Un{87{vzM4Y~oqzEy#Ljs+|1GlMP;w&LU8 zwSQg{CMt)I^?lmlx5EV3QUli}wo~SQJbabineO6PvuwJi^R`VD^>xupYVhzIK~dTmIb%qglt9{t^d^5K-V_K-ks94P3jSD;2M#QeU&?!dYTd3jX(Mygi7_8( zKPoGk2}*($z?v($(@A_F>D*0q&;H2pC<@rZSWfkj0Cd+t_TAw0?$DrG}Rj{%$ zHq7^@HP9r}bIE7Y3I>vWi0v^KWNKQiW=NiJbXB6tJZU#=U1Md(p2rBUA=2k8-Zpi< zx#30P6MjP!VYic-iiofTL|m3&GFwhU?q`_Y}qTZ?mZjKE5I&28uS%gCSn zg?aV0)LUxU-Z+kacx3_g;1b~m#M~KQ^qpQ~Al$AFSd6(#end+a_5vHTGZ(op=ZD1d zDX{SQ6Z6Dje$2U+`}I~v@9t8Kv%pssNS55t#y`Lx?-4@xat5&|Mz!j^gV~)Q`*T^B z^dGBkQYADiV;067E<<__LPxBrqHLF()x9AyWlwy(U@2TIr4=fm5KO-GD=7_9nG~y` zd6Ac?lFM^hyahwzaI(GKQpgQU_cao8-N;qr8C8Z@*`_?={U*PuR)LKza=;dG7Jc2N z#|tA-a{a{eB0|lwNzDiQd0PPo6 zb<~4v6a7IiOqc+*3N`PZg881~xi2wC^OT|3P6u`$TBdIGp%k(Dn-ACt)VebLafe4{ zbx$~7)yltP1x#n1xW2!u!6l5G!o6t)Ux3^~o->8H35(t{O|q(0^lj9yLV%MctJ{O? zDz2Z9?$Q+KjEE;1MKy!=zj}xbM;kkax${X=IjBzyZh4Vq!h7j!V3kT*Pxa4ZJx)KG zK;D37OX&;{8H#$OkxgtY|InaeD|zL@Vq@m?@#L4>15#u}@c2z9+-(=~dtL!$v}t_dWaQdlWR2g{brV1^L%ve+C%^}phnzui^Pl8r zUbyD#*bhH@dj7k^)u*W7*~r||S^CuW@!b9leQY{dt~&!P{svrJg`MEONhflYdSWH; zqAgo8V929|_pCuT&qa6Z^k}S5O`MAuO)u_x{Cmyuy80h$A5(-1>?6=v9-@({i(Eki z^?B1`Z7do#($6smPS4hF$OM9;>UbB>&=YQ^Fjc{{21TXAU8vT0lu(YyqJmY4t(AkK zGel!YMt{WQj3uUnq`m|4c73&I|Jd5^_?3OK4;t9KKf%@uVBO_;U2u-vJ!&sbUDE4C z^q&GfLPYwdF;T+jL)R%HtE;#+yV0PDZ;XGLgX(MyV3Xo6Blu=J#lN~+%j?& zrOJ~i{v_H-mQM-t!2P4-HK_u$Y%IMn1ISrmnJ^DX?F)!v*Jy{)pdkCx417Nr54y7q z30VZ5D|onb&VqodOu3Nn1yucYbgPYPsI%|Q>Fq1i$Lmz!Br~J23~`pqF$H9iNzB5> zW-G!D9Gutay#hvPaEy>`bh9?@3lg=)oMBN-W(O6Ltx%mfNbzv3u?nL)mP~xAkEJ+9 zsWruA1g+!zpv*3CX1X1qw%DdH#(l6WNM}~}fd8C73ft`WFWtd_nNnkD{zhHuy0U$t z-M)J47N3kS_>o!4+w8x^-bNd8Bu!t`0=J-_6*G_{eD+{7D!VdEW~|SPCqJSf z%*NecJtPlWDufpJ(%J?EqC@=9j!NqP|7*ZV0eb3a&BX~z%ZZbN%omr5 zt_CT2nV?CcNr5dDCu4SkW#AQ^;{fivJ4qA#K3FxKN?uBLP+19fLdma{y5#&luuIxM z2MPRyt`WhXpYO6mb4?w=cmY6z`-X4**ip+Q^HN71&GL7%DIi_6JK?94r zyWdrZSQ_#7emsQTx603$p8IDb2ju#39nR}w$4`*0ekm&m)03j+>*RBI4;Q6^ji(5s z7Bav$LiMv?B*Mk<&Fg@hglntvsO(d9a1c>shbylHJ!7Smg@jW*_pQjki)%vi+6PaZ zAd2C3ONy@F9q`KlwY~#}MTlns`9zUT!*ra%12pj%@M^9Td>f~EU7+zoF}*(VP#E%% z?IO-M$Geg|y*0wibkK{48I5OiWDJ`FcM!h|sDz;01XN|oo3&%PtE9>Y-Q~3g^@vK% zRmbIk{p>tC?j!V^fdo6#owf1zb4=f>DoCyMQv`YmHuMM6J;p!>`!Ep#9G%T6~G2*)^Fp4NnATFKXwc zkXu`VjinpD^q+kUz)$Urukp9gSJsrDSym<7k4$oZiPc-m^DOX^9=KIA(F|!8JI(*LMpVmP7l<;JJ#d!4)EQc>TM`);rn#KBAx*{#gK_0s+ZR%#0V z4M%WMPWFO%bAqVtsx=TdS#*(7YpOXd-tq~PJs;VzFz-9<#dJ&j{lnAGL8KGhzNQ2H zdx)nsSPYvu`Ckx1?FSe%f%%3yN}b2z8uch2uY8ERIxSFHxN>REY60!CnCt0;G>*^CHV29A!w7a(XQX#6RP-sXZmb%{x$O925^41P!5BJimDq}>Pn9nV6}UV_It+ttMHM9DLMK=96ax) zcBKKm&Wo&&+=*N!0^o_nN6w>o=T3}VBq(P*1WTzY=@&F(c}R}mX-}+xTDm$L>}TQ; zPQdOXF!$k2Q1n%>t&9+5jsl1`I(?CMER1U z%_;@VjCZESNtTNm{@~q$M^o1?94Bv&%JjtL(thYtm@@;c9PbFebhzcj1@4dW z$kZI7xW@rXYO}cb)UGuILX+qxgW4#GJEeovE>(5W!+sJ&2EYUy$g`g%+C$|XQt;Ra zvdR8!S6L}Sa&ePN;znxPv%omSh7(S0jJxxdz5--CK2iY|zDN7!AW#dO1C(wseS3yr->zyqqe~|3?o`0VBG8TH)uI2NXyDN9@P=~1wp{Y-7 z_$zQ{;jPIsMt<;=#^V#VKVjrrE^ zk-S;>Tn5I%AI_iHB=vh#Ec=@9sF8#JiRu#tTn3fOb>Pc$i8C_5k!)5~X2xL7$VO@d zpmg$Cb^B1h7Krj3K8}XW*$l@iNoSM~aAXaTL+LR}%J;#@E=PvLn(tUq<_yj%O7>nm zk5nXRI=pIV#7s)3a862ATc_Fzjl0VbH-uKqwf%+0xmxqQREMkT(2cDmdR!EJZ5EYQ zqJjC!&wZ4;Kq>FkqoqBHz8ydDPNgf8k|Ui;*W~X4H=1N|_Y2l|(FkSl28sFxa0L;X zok>Q*HfUg_K)G=(c&fw~`uz4D>0AM{+Nr!(WC@G#-aQrUh16UU4f>MlYvvPb8i}FL>Az*S z$KAh@FP4%MZTpR|&wkoS-njdL;ImPSsK3cGWI*|7@_nLfT-j{N25$}MX;}@fNc}dG z_50mCO0U`wJDq?6nTHO{FI^~o@*j7Qwvh$K%zpy&B|8?PIqI9^222L7wNoBm-?{>5 zKKVSI(wPE!y7ZBTWH#uGRibiy{tdEnK!u!8nFSUiKNs*m(kA~q0&at>Ck&x4+!NSH zIP4Olgj4{?-2L%y%EQJB9!L{X1s)T}Z;8GfdDlkXeKxw! z1=c0zfO-8z_f>esfOk%^vs4ID7Q-#fwpqT%=SZ<=?*pFoNPtf4QRHeRxEzV^rQw>i zUFz7ASSw?PFW^c3E;nqiQeN3INectfMne*r_=QB2Z3nn>4E$Chk`7VZ%=H*oM~>GD zdEJ~)8<0-Dug)IR-2i<7CEQ^vyl=^KntOW%pD$J?oR*#K6(vjrV5z7^qOcmM^{Y?ScE~k}Jzj$w%@LwiSl!kr}zEK*z3gP3)Jz_29u-kpImXbIJtzqGl zf@atYU?QA7uK5AmFUPy3?DH{3Hv_O0LXgTkvy9-j_Dbx3zA)oB?>>mEbQDIG2JM4M zEbaicT%jyET#PWM;V^l4oNN}0rj)esYBLx#r*-l${=EW6QqV;0fsfjA|#E@t>gm;dAFOdO&5{x^Q^ zof)$jj4foDu`k(Llon=uQi!6JQkhDn?L)gt?zI$cX!(>jrqZ4$6|Hln(xNCWiWpRc zGWNmDJ-_q){RPQ&&wZcg{XDPdKZC;P+sP&)Tm;1Ta@LKn_0(2-JX_ajEOyI<`oWlH zP`EcO`G`sSA-^kl#oBR_&xZcPEgL^$D$lUbU`QBR}cL-_&d{Pq= z@|dy$f6!eeX2ZDuEbbC};iz$R`}>C38EU^j;-})ZPzEc1k_~Uwxd!CX$F^W)r+lMk zbMvSX^oK4XD!IJaT`rT?(=%s%zT46A-7Xwl&;>2@db)Zl3i#a#2W#|YiJiZD=m zr80b<$D=Jw!ohVUE6Omn1s?L(&AwW~`S`wJ7w%#;_MJ}lbk@xk`;hAG1P`#t0qlVp zwf)FM>8uf$4HK|bXRq>(#Y=QJ^BgJ07yYW&+UPke7C3=MAeAb2pRwG*kTOXZb?oN4 zs2M}eUA|-K>es|0lAhM_#a4Vl{pP2bCL4$-3lMb_2;^p?Y2y4Lu}>|Hmbwp%&jLFY z@vK=qj;2~e&q3>~E&eh^U)|F|8?)waFdRS7vE~o2qfoGG-2*TMOCJqPa-+CbRI~O*hM)y@ zJ{k6%qR-0OMJiADa4n>X8;`F|o)vXDReBL@GegU|JifGZygsS>i0qO#IaKbR&XlD} zvoK26Gs6h-Kk`H9(cK_#{*38EJ!zqysILs)yDa)uM$M&8+p2c-tdAD>=_-{#^+cK=ZgZtyHm1>-wd1HlM^I%5qBMr?oOOio9bUf< zSxxl*0k>ZZUl3f)4n}L{ZsK3{>IR`bjnS3O)f*R}mVz3UT0WmC%N}0QC4BrQt-ri8 zyecJYK7BS2mHItTtf#+t))1RM#HySb*`@Lq>q$K@b3~jCrpk~GzRZ|W7PSz~TZ;M3 z7}Jp46;jtukKSGBzL>KxkomJ@LxHo`Bk67J43ThS(V~SuB85*xW1QU9yn_p%|X`HFz z3}9-hkuYTkHLEnCwZwe5L%mwP{jhxcVD2$Y{-VTps!HyvD_){EPNnlNc78g!Xc0Iz zf%)+au6RUTw^EI|o;;2nxD7DXhUgpYf`_y(5wQc(+Cz9|l!gieVuMoLJN}&v*QOWHBpjnWsNmz?r;dze2JV)AGtYX6{fgJ7eoM0T zJRkb5w!yz#5rdmrI_igIlw6a)*f8u0Z=414ZLr-!05UpB%u&HciP*ojvOq_7PZtpr zM;1@0XT*#L_61R;!xJw3rkmG1h|N(Rh5MZw2G;q&=VPf$#&Bz2CiKXW$L}8^o)HF! z@Jgy0uGh(Dp$UJ39Vqh$(>XA+Z9wvdo&Y)nw88GZj!U5!u5$;-_mP7-qJ6r;wt8lI&||| z+0s!iV9%r6PY1CxqrH+&bdMqv)VVcTR@7Gz{z^yEn+#2w0&G|UeTCrMH{bUdpVf+f z`^8(C2sInW1PIRt#4pRjfE^ZsR5{P#?6V*Q^Vg!*iykpva;VZVSdFiata-7h*7#9u z*2zAlbs+m0ijHAcdr7LjgJoxiE~y)|E1bwI(j`EY!(9Q_37bP1Ef58GS%#>Uy|uq8YL_~+9rnCZg|-u$;P1C$Qa-!WtiEghT5QaG z(&^VxSYTbY`|X2aZw}{N{ic*UQK4<=@D^d=T19TunfvozVpS_)>hMYXq(gCJAb#oO z66#B+BCD%8JiKgvOVB3VpI4QsgDo;DS?ECufHUJ;F^j3-=#!C2;G++w`XVQhx0SR| z=uTrOMv}q!skfIJL2NdH&yc=~!&4(ef$p&vgF4yRTrE!pBbmWYKQ1}MIerASVMUCH znVKBD(r*EXxig00ZZ|Q>hFM|cnjB$PcykW*;3nhq7duhdq!g#|*~h>Q!_?Dcgurw4 zO?;eXtB1o#;4Hc2nC_OeoE_o}5TC3}a~y2>tr8y0IpW1P zkpVeFIWUaYX}y*nAp@UUV_g!4QHEl$)*hi9&jE{vUf<2}Dwkei z3bB!%po%SryYA4JyTr+GOf2na8M5M;SOP~l5Grv@bR>K#qT=t`#vk=E5X#GCs^OicpBB>ugcz!q*dKz^AVj_H_$um zVV0tQC2+4j*TPgxaliub!Wa%ES9PT{gFJ@XE9`%m*B=KYzmQes#!juUX`p*DnO}`y zoyiZRh_e)C7bM&a0@?d_kqTyvgOA@L(;JcGrX`|ljIoD~Cz2=ku-bhW%8Hyn23xfaa(90{J4*TuxzMA>Ty{9)jTwRS zXP-tn&mn8{Jr7z9AgRa*tGT~{DNW)?1c3hOEP09rGNm4h&>H=?p*xot(|Iz!;*tTW z`Ja_&%Qu4>H%84mghwcG;`Af#%ec`-qB!8f&AKfafuYa%b#UnQ8EF+ZBF|Z}8=Jp6 zIo>qvk+%N|*+;EglSHo4w{^^ljpN7zoL(%c&OlkUl|?(Yb7!nbK7((+#~#3A(5LGimi*@MUux)+t+gxi4Ay)bqU9!3!l zEndXVe5KY)NH2qY`lw3I4;?{&tr2DpuUh|vI6DCzI;Flg@*Skx#1jXupB|QY;ifFb zhl{~Gw6bdH0*6sR{c0z;!IfZQ9#%d+!PwKSwNjZ$bT$U2I-$Rc3+BoL5ynPA?f3*Gl5v`Ey%aMOgX2vZXGvv^8IeN#AadiHiQpOqPKi<;yJl;bP zZg{8XXy_sq^PXz;9Td*jt2M-xj#I(X(z5k<#S+mZEDKBBa4MfWDIY_(EgUP^v5-sJ zVVYGOvW}q?mtcRi|6V}C9Pi))(v;tuCg!lS&wfg!PM#cZ0UG5u7_MP6;yz->?VRFX z)U%9^k)S`gJ!mGtpL}QLg)?wE!OC9Ply1uH8-+RhF%C7UrMp%tCUO&`#2 zYtVZxoa)(+)POT0cUIW7jZD+goBfzaPPsY}2rbiQNqg z=;yU^Pdc()=nQ<8fc5A_*aI1AO+w&#IH(qO!4NJy;rKn;;{eoBi!O_Qz-O~0#pYQS zqA}p}+UIrRA?H2BT;m@`WZs}hC9^OXSs4+6x~Y(;cpOs+Dq;g#IKvJM^@Y2)bdAV< z&=C$&9Mp*|blartz5I3-$wW zI$KjrDK)R~8?Goys2ZMd+-k5f^XljW@Mcr_Z1P6S_KFU0szbAGJbDZ__KlORQ4ouh zAvMS@BT|V+*T1e(!;&v5`RdSppu<%_mH?@`r7LO@id3vNenB*-PEgRsfj)r6B|d4< z1sA}XRt$ToY~VxhVd0&x@Yc`-H+ZXs(4xO)3xzu3wo$<`*>Auz-Q|L7n z%VIoBSG?hD7U+0hu_0;8%Y2zO5{k;1VA34Dl}uC(?@C9Sk@G;YR)nsRNFBWBj9z$> zfxyB^5)HCWrSnC<8TH%n!r%Lmknb&m0W>9^smO+jQk_rrPF zJVd@k!JA1zg8>@xEIMU3)|T>JtfqbQn5y*mcxR*mxj&jH!(KcZth_l`Uj9f&y7opw zd+u@dRa{z|SmRlB=G2UYJ$$&4UfmKUA(Dyb@a%ga=z>LVFOW*T0mOs?#l!hV=zm)M z39=4pes;lYSKv3*_TJVN5p;mcq+~Uwh~Lha1+&o9rRK-QUS^8kXo|uK9^8$i)2|{A z7JO3)XTU}s5cM~o+I(n)TOD4PAY@^GCp2XWHvTZ@7mWkgRiZ2G>vU?t*$& z{EM~Vzpa!ZIeaz^_%HIrstCRrvO70jw}NOfX6x(9lIThvlICAZoU{B%#ywlnO7I=| z@FM*{|8{?n%}BSb+RBv7m8xcBzKrWNUB#H@AzF*d@hD$PmrEV5BCU=wEnjXScRSc* zyW=xai3@YxLgkzVf~t4=RkugSy$U0h!fggr$PwMV(BR+Wk>>TeWqlH5(FUF|WfOrp z!*itc^D1WT5%30^$0~`GA!GZ{Lp#9WXg0nRwjHpLauT0SMpmm{Yd2sBegJb^xitxR zKFxgdEH)O7Nok1R`6D(|Q@x8g-MK$$rXa_>D=kiWE?z)Cy6;~M-(JsF>75gc_0^ky>#1PVPGXiB zNQIRH2Z8H}DZm^J1*)iI;wjv`Lye-wZe!_ChnC^H#$ZQJ_TkOs^qmz^m6p35P~o%z zaD0qs{XqbH%9t_YG~h1-Tt(Y8FU%+!=rgV{Fo*b|T!EXy>SksfCg?+}AY#a{rBT4* zWN&Y`ie_MJDnZi0yH_fCp`(nn1|D69Z{Qsx(N^Y`we+M5?k!Te#DLjM(jIgIUo=L2 zDogtb7?8b5`Se78+)XwA)Z~YWc|A|CCKKzV9p=2f&oM<9lfbGH0d2P^^ zRa1S*URgR=zm0TOUCiA?~mf8TU*0#s?1K0x$FD)S?GQ`#!<2tUX50< zRpni|XNhHf;$)@Xp&z+IB(hb~Uj!s)+v3H^=AGcg3X;b{(HI)UgV8JMMcCVeyd{ogc`_#MSDqAFGWRGXS(MA2@Z3X#S z67>C8&u}<{S}B=iIuy^fnPp0pDJM_b?}!-=EcTUddDu65X4TSA>;|gPoAWf6pCzd3f>29tF^%nv0c`*lAFtQE73QUla`>@+k z73xXU{f2Yh{?!x}MrjRSy1-26{gM~;TA|k}Oe4laV)M~P7->pRB(|JZ%D*tBl{pz4 z@;RJpMwc~3y>A#thlKd6^e6%kjkwjrz6VDuVrS*ki&1~Zv%%i8fBJ~CaF+xe>55Vk zGH*@UkZ|(h8^F_&s%U}BRtv>BA8YU`&#m$+U2pQm#>`J`H|Yt>z$kyaGr05w7_^p@ zGNk$7*BHf|Q%pWzF#`>i0vNI9SME)qy38H8WqFCge^ueV?`siA>9(AyQ< zi)OiaDu~*`^3E9r#+Qo?!TREYhjfd{j(e5IHfvUAUYd=Z9@qZ}=Mp({f9qw#HN!-I zss0E0a3Fh7ya3F=snu{4hjL6{DkmPVeJ}`J9qPmfn#C$QXKIJ=5PQca^td zO+et);7T73o-*1-vdAc660>IG)e=e|;v$7bV z3qI_8^5$S%mJVrz7P+O9np!^^9$UrO9f-#j&c#V1$$Wrr*texWz%iXIy`~4iz)J17 zo)?FnI<7qJMBQ8x>5qj3Nrb;}F1uvM(bvhbn}fhy@~)RNucJbn{8Z|;2{&0aN0(eA z$32-mpD)>;{85KwO6}G#V*1j9V4sES2srr-^5u<}H%_Z0G83aA^+R9xKkXof$iHC7iHv64A)7Q662 zUTC07u+bMgemrxhvv?*j&{v4IGC6G7B}#-Vy%6`Z(wW^_!53}E@=v8a_K3SWgROi) z)tH6NW6XF!jhxTU51v!Ce9?&3ktrAL6?-m&r|8mhaLWv^*Sk4Zkho?sc+|FH|HnNSGT?Ca#4)f2NHBWT`fpwNf1LdUqCMM!qSZtpMp2*DR_l`%Ap8_5C zPb{~STfqX(@w%j+Kfw&F=o#>5DQEf-IFNS?xpKM$um1!M^C(o{o_ET zPD0^@`=%#A9GA0(vco!tHyDCQdOp5*6H~ zYdx4XXGA_mThisn;y@p}X&F*a)+~{6IeDqla3dxk!BofHIjSu?!g!XMdRIJN^L+JU zdO)9k7(TQ&0*e=NslX(lk`c^pDFe-~z7cC(+k02qN}deF<_|}))$$GPiCrh!-pkQ0 zS(*6@7KIJ7x5FzMLv>mgp*J4DwOmR6s9Hl%hc-Xp531OBY}qJY3b98?Lzyq+)klU8 z)Dj%^>PF$x1xXqUXHY)jLZ3-L48CAKA8cFT4*&Ga$7$xejrnCuX^9rUoY_z<0KQn5 z9%ZvGscY*QVWB>t?;}ID#&0s8j@q=0GSiQEy8v82#bn-n zJa8%UGIlB*_WuTki*N~(WRYan$iu;Q;2rJ|(2{9Y<^>SpAnBAW!sJF5iB_9`>_GUX zSj)4>Z#HV@&OsM_EX094iX}{=X3t_h*!lByPfIB`p66j#dD@cNwgx=BmxILxfQ_X7 z49=4sZNVcjJ4;o=CHt2*F+Mkf8`@)!BlXEC3=iYxa3iCtG=vMqO%1L8M2rBIok)OIM-vhmuFqqnvHpH-s?o_ z;WOreQP_=1$RPkuv*K=i(vlgDl^7v-?G$Sqti1o;?s85^AdYLjC?bchprFo&`eBRB zAVdpEs5#?}6e)&evbJKSv!!a+IdIQLy0O1&_BA$V71g5r9ly;s5ZEmLTZ{HVN7Hj> zZX_Syz@69veR2|B=v;M=>GmLpI?pS#5pN9vBev)iO6`F8$hr)jY^!q@f4thRMcGJ4 zZz87!GCE_gK zI;ah=anO-%s12>WhA(6TV`>|-$_8A=4>Ky<=ZvAAhHTO=Iq$Jx3Zr!%gCfCJX6prW zEs1-nz1%VG?$Zc?V3n&qR)KrkWq$$BkB|?Yu!Gr?$OS5)sf0hc@2dRAFgvxAFkhPV zWoYPzE~QHzo`Lqfnz{20kgJislrZmGjTXh7dPQ>IhR-6|r3JLlp4Y-Vn%O@q*FDi3 z@ZBd%%Ie8g5VcA;HXr|c1Z>%(Sqf^{@L2!cl0RNNI;{)dZ<3!EpN3p`@ejL{FmHhu zUGyZ=!M1Hi!<9wyr?7AmoUbWX#qKBn7%QTE=7J70l8Jo^ahHt+v(6Vc{Kvh8OK{XN ze=kTfej*vn*hZ;^LDb3M7k^r2VMotPdS+A53EXhlNVy#WmnP3gW0lJG#LwT)a=khjq%eB*^Vc>E})cpau zP8q#{K^K1={BrDLlqrmo{t_4dNNvUf7L|v^7$}bB8P@!T8#ts3Sbc_5xX7Cs@)3O1m+DFY z{Iq5!eq|Qp)T~b6@a-$mW`gqOfK01Wy#@IBvA*d50~hoWx@pZ-t_@E*jm&dVh0g%3 zl>@<-Fi%F-Oj3TpPG7VM$iU@-C@x>|X6}jR4b0V;fK{WVBlE#pbr@M0?$@~IGf-z_ ze3=D#8b5lTnqm^OrvjiVpex|e$ckau*EAO#Qs2+75)MiX?}4|!BIc&RoXlz!F?SSU zm0BZyso66Y9T0gCnj;Sx(zTA@MlAANI&7@{IPo?;^{2-Y=+_F@>_N7G zmRh(YX3!p|y2Q1`(8C2R(Ff1rxPG=m*oDHNbD$f2fPyEQ8W?Q=U`ty)%ky_)V#~->Ll(6NtDZ$paS~XCU(ky4Ld2ZAL0C>qEF)wJh-V78 zph><1jMMT|>rNx3skv!N_Igfwc#?^dx73VutJsu~9 zh><=Lq}qKjAbaa~TfPL5Gr-Q(M&st)D>P013BGV(kT<$%ul~IBCq1AVG_Q+Bc3$)@NG$^ z`1|oUaMhy0G-N#>^pe+`&LINqRH5a>NQ>4C(=JGGF;!}KZddO6FjrSUbxXa_X#d6D zmg8%YxZEE)23}xRRiBq1ABJyTz`mi}7qovLe6$FTRfigZHFy|{91mE!VdYiu)F<%6 zQ#Q*1>>;*)u6&yKeF)Us2a|cDIf$)r9B&;dn=+(r81d5>tOwVofbvCGpkcm2Qk|J> zHZX$3I3v**Qb=NTNhy+R+~fxeWw`JFKFFEXloS~U!qe~mWJ;eJk|#dnO3p2K!XI78 zNn>QBRyc_AaDOeqX#<6~ff)!RGfc44*7(Co*5L69z+V4PoD}GJkF07#&W}}xI9V4N z1?hOpuYQE@`+C>C+c)u?>;neoyNHlbX`!)Z9d9mxxX9XLW6R(c=G2!Xyc1j-XpR4{-gF;6-gTx>|A#ZiJX#5`qBqK z`IW)drwPm9^8HQngY?|u??=;!3XM)Vv3QWt1XJSrGK&axkHwZ+;=PV|D5jQ4ZmY#`I`VZPfv;nWh1ism^h1?NhKIzI3qrBAL=?cH7nD9+5gFm-D*t7{=6^K zVgKVH6?h)T({+_v8MuKywUK=4qj>n={s)o`e5Jo+WXgytT;x}(jamp&3P~Hczzlrc z`0SOSo>6j1^dDNyQqEuq4994Pb;&+7`1uTH9wGdPI2uhM;1ux78=;%pD4cPG8L~vu zATg%qHejCrxngJ9J(dg?pHw~X%1n{#)63N5+a&|SU^s9=CDv7jszQ~*N?U!6?d^PW%rXUX6T z3w0%qOi?MJ+MEAEzD!qhSK0ZCum-a*?^8QbG(vF(j4CNAaOR4B3T-jdEk5s9WH2}Fm3wQz#?+gtUvp9NQm;y?LOs|I7QK|Nwa zb)Cj1Gx+f3C*5f`>DDNY1AN)va9%zMi0!bL_iH|kR!=rbP=)*JQkpa_+}Ia-SNx@* zwolB2em#|3YtVzrG?;~MJwz&f5&2Zj@vMYhx33aEh7DB#?cz7^iz{tnOkUWBdY98- zR6Cw(Cz&!(5X387hC82W`AR#mt4cuqRb0l#uYfaC40E4xrA3K#8e)<0 z&beb+vle*F)mKD`RbixjPC!_NmcLfq&xzCQHqF>Xh)>EV&%^GS!U=D&Z9KN;{8G*6 z5u7a`((uPLa@rR`A-YsJgHdN2i3?lI3hmyIW_xJXC~(D06s(=S@b#mVzjH)-ya*Fr z374m9dz>M83+(>o)(Zk(5~c$i>C7v73O$}gmGqe^Zgg%U)V&Xl zsi|I=gR|rT(@8-*=@vG-$shhPc`RR(m~j+tooaZALpOH_6~YxnvnunXd`sVU0bI%N z_i zR$UJ0a1j6oTr^nwCA0|c*hDW>Z66{=;iMHA^o-!qyN}GnZ`Np&(|z`Vy;ZpnjzY)X zLdlXpnqMC)-E<=?r7Xpd=KwnX9HBTE%3S<--V+?{c*jV;g1mL~aUZalSvSO&{e!8x z$_o|b_Jx8AQn%cz@9RXdjL=6zgXK#CW!6#DfO0V96CyH@%WzsDDRbM&(zByD_}w;!Ab`29mk&Mi?`71?P7qDXy+0V<~n{*>QF!!r@;i>_!my!KYvK+kE zk}{G;m+NUI2KGMxE}j9L=*@41IvUURf#%>k^+3v?T+dsgst8c)F%^BecXhI-fcoC3 zb0CK5%)Sh6cgc50&QJVEA3XqTO|fx5l|+Z{2-^2qU6dKTFeLuxoH&IMrW(E|h zawM4IXhHqJH-;*rY<2eYMQ5g+c`+B1>_2GzDv2p#XDwXa?nS!k>aMcRbiuVw;-;45 zc`TVzbu0rVi>vk{AHoe0D`J_otn4#6ou%^7XGAD;OP_JGF0!6A+@d<$s+?su;0;*H zrcxEhutyhXfb{On9$N5MohBQY@Z?$MKD^3g8W}?$6>5eiC4gU0xg(sVXfJ@vu7Pi@ z^sB>B&xhdnFz`-QR7`u*QJ3{DD}{SeL~BK_o`R^M%Xf1wuYB482eF|KM{32Hur>(z zzC)a&(;~1^#a1_zx%FMe7l%vbN}5+V>?!jUH7Sy;Rs7VxOgjB3&8=0B9XkD6TuN|oR{>a$$9zOiAOD$TsDek10_GN+x~gdKbOW0{+MU?mS@2LI zordrqc4q)E)YxS^mkh|k zvuv#vCC{>0X%NWpj6)~ZopmP`Vg2bN&|@k^k=ODh@X}Zmim;B+dRVaD8_;V(y+q}h zMy6EgGw@`}G$Ya*5w9DU1!La|$(dtFM&vuN?Hei0=K#G>>b$Ly4l1^uidl(K2DuWf zcb86`lJvM$cg7xI*_}U95Xvzb@zJqrBFpn%>T8~z#1!3%8Q!tuNMG~TvAs**Bvyou zYm@(6L0%c|S*OP4f$4K_0h7GE4GTLnv~nnPK(pfOS)ur)GB)?Li*emv2N4B_S1cY{ zF`1~+nEWKXhfY)wIB(Y=#F&Uv;#x<1L{?F6c$(q;zxy|nE%E?43_A4mJLJ?X_k@+3 z+cOPFZ&cHXk1|OT=!I+}cdqB2C#6-?e~f4^KMA(Q$MM}SbTHD|9sT4O>Vu1C{a#ji`+D8=*$9L`3b$$^il&% z8APpEsTv4tc&Z|X@2v#IpZfH+P*!l6Iu_xGHua{K#iQR6i=~c?yng4Sc_9t=v z|9vr57O3>xe-@(b8`1C!eOoeL$&0k;iFkZ_3;a34id;DcvvR~e|8OXoJ$UkWyTtu& zTF5VP8N9!Fu$Q=y3e7NYj3@D5e|zxLqd|`*c{_e>ot@`T@aXz{XYi`Eb9zEE8(Bx4 zfFiugOVY&Ha#2z*5C#1YT&c?SR3zR|;NHKAH3mjf&a+f&aMaBRO>P_QmCd%7z-uh= zMKoB#kd9M$m7yG7pnqW*JOm6%3PsEqn41wh?%2!wL zXQ6oFh{lI@u1HN5^fwK7-i6T zgL)TeCtj-$DJvBP2%}-BY}ke?7J$JEb5$Of8pf(^>1Hm96TXMry$(WWb*}8Y{3Lx6 ztS?hXO~dAygt0`4?Ue}NVM}+qh0_9B7<7}4Y!vSRyUhgp;0vpyNf!$b#AGSr@3q11 zVQ($_jc#XSksRQF9XD`enRQ?=q0o2vz$o}%kuB@p2U z8`3UOdG@G))IpCj#U^iI{+o(9u@wp#%a}3G#OWCS+T5y0?2)eIw}cqYR|r3A0lrKw zF9?-H9ogNm`H5c6uuhqoB;HS768mZ((?fYSb~qnbaHx`e%(Q4HJQf9~Mu$$jD^xsm z1b6gHe7Dvv)|~5(Ery{DkCrtEFVo`mTXI`Fs29`NIqRrN&P@0KSE-6;fHA5Tqx`AU z0W}zPhcJfCe;XRb`sAM)=n<|Bx-PU|Sb(8$%90JEP>QBZ8e@i0|RTsUdz`_eDQ zo?Kz+0`}rDlRVpiks!o|^7)sexJI>dEG{KTTC{_jME6dBD?_0hsUR!r!VDo;i36@` z7K*`OXH;vNdbhZ;{dEP~vC5lE$}W)0rea#PuYvhnW@}rBY{FI0OJuK2UOv^*p1HzZ z5C;C`Hmw(Z2CGJ1%%G;541gs*BR&{l<~A`)1zuUd8(zb)&I~Efv)Jh?xT+)hBiS&>HTe?1p81GabpOWQ^>B*@kf0 zfLJU(Z9s1L3d=GD@w4>!-HS5xXweLC9GsbK@uYU{=tpKj{R*>ql|HCQZUL+OyhH&O8Rji1-D!S%-F0Py0ogO3NvdIQ zi>f6!oCu87%=yVs9G4u&_>An+ht`o{f`p$lsxVw{XiS1`&XVT!sBP`e39SF$Fh-2L zz4M%*h~Bo4iDFNwiZ62vdyOWd!r-^>rh7=|kBM7xvC)GO>4Z;w5#G?RY(!ZH=nc5Dkh#oJ&?)|#J{v)-!R z4npBY6-3lFRs(c*^En6d6P+*~PF+2)ngX)>;?b&>(Ux>&0E1*fRd&0LCf0D6P?z$h zSpBVop$}L{G1hkgySCcAQpiIu6Gvd>)+E@3c^|!tO=rohZGBe`4!Vd&4zAPr1Cx4) zv}OzJMg@h=#m~Q6u3?K8B7leYeMK~%>3#AeUNR`&$NptZeR^svu^QN1F^^%f&KWc1 zg$05AJkU*!6RQ5(4{8jIs*`Rxq;JC{Se%Y1YQ$&bQ;kF=NsoNjf zObX*`RhUV9_TpOlA|qyKfUa`NCekCcK4JPR(7`nAwiC6sJgx>0{^fP73_?O9zj-9- z1n#mXERiU`#pD6)qd@_R7glHc*x#~1EGy(4>lwfBPPBwL_tERoy<<$K`w>(#2Qo1E z2rckwLRpz+%lC##AL7xU%dKLwuC1RhM^&aG>_wA28|(v9wpx+0Y@QM0U2e9B~X|f`pEA;>bKk z;ahULPGD`)SeBxG%k}Y!j1!=GJilZSCec#v^1#!1GOW}{@1-%;)ov{?`UyslL@D9B zcGOS5JQVpEMLN#H0&8`fn{%hDw!0Dk)+pAzv*nQqm=Ns>p}&z}4! z8xHUsR?Dg}Ef-TNY3Y=2@05=>GOk&NO(V+!LV^XGfVXz452E2DAxZlW_r)7fz`XN{ zce|z`+j%QHW+TbfzMUYNkBLM`aXhhK>*>j4U5cB;WvJ3zv2;w~ExfGuoj2@UTP!St zuJ5YHp2d0(YfHU-b&3FzV*YB0HmKHl4VqtwIvNV+n#+>q8;tK16K4kXkfb=MPI4hs z4kbJdN@RJZSY5Sx3%OTJxWZ|1kyAYJ$sBTPR4oKcc(!nm>YwH`iO|K$;I{To?3 zh%x&vcm7uZT#U(v;u>a509p#?*>j%QEuLAWbM=1{@D96@@7lUm86bvFo}?!V6o*G+ zPybcSU!KODZm^W24dQ~4#@$g~nYMLR(U1#Iu;a#=B3O-nv08*H^iuB0;< zgR)+!$>bGAf|)m^@;1dUI%b_po~;$Q1svtwxqW-teA)YVhG7au@Yk=TJ!|ZJFVB7K ze|S<;N!YXJYz|+tYUhNm0W(x)3U>d4KW#Bw4m{Np>NrhB0d>ax z9RnVR&1`26X6TZ06(Ht33ZfDC33%Xun-O_v%7gFF1N<#}c>MVH6o0SB37wqyYa7ja{}<^qRJCCET}2QR!SU*pScorS41;r0fKCS)yCTQnzG zTSnwt-*kvE?UB1Idx(7A##sDsW3ZVUQNi5VcjO^vU{C#G*fL7WP@0L9F_;EM+putv zMeC(>khV8%vK#N)PIc#KhPTuVqyxRBE9RmkTQV;$Dl++p$TOCk>JLKL5-pJ*w&aJ_ zE;rfrI`DL8&of8StEUy5BM+82;t@I`708{&B~O54b!%tm*x09&_u97!SM46E^1KJ1 zeIkeizX@oBj=-gJ(CX7En7+|7xz&RY@8H=6JW3II6?W-=hi3*e&xseQ*wyl@>Q|LC z(Tvam^cZ@qI#R7y2+Sm5|Hsjp_{H@7fBf7#d+W59wxL}p(Lyq}g(6haf@rd4Z4gCi z?u0~C*0MG}p%7&)TXR)piLw@=NvKFoNli5~=Xbupf1pQk?>*=Je!X7LmnyhXbZaEG zgboE*lj(4vk>qnHqTk~y@gMbb0HxG!>1Z<}4Xb|TdU~zUfVP7n2~b;c|FiT(1YPo+ zM!ZsGtOw^+A%5_?zxzG9{770vPpl8W*B~-?fc_4> z{8PPlyyPm2w3gPthF4Y?fOTX~YA{y_%IMepqFlFQMuVTGd-#Hksdm6+NULEJ8P)%( z@D`8jM7d-_3JaixYJ{HBvH*!>A%UHY@(U9hV(SB`ve($1IkcwRXS8_8l<2R=Q<{sw zT=5}1)y#v8rcW*b?SUj# z#*`mFqgK3wY58BTZkhf@JiQH=9?wB*$aT?}QkM&K@Wd>5(R}#Slb*)J;?mNV37f!2 z5Y*b@by2;ylTX3C-OzM+QgcFs$b|({`)2*#Tsa3Wv8dl{HF!3NizY-LCb^bQA2GbY3{?d z-=N8cUbs2MK=AUSD*p<}+=}gI$|q>cODld~`7xR2#H>rl#0R^)ew%_P_$d9{WK8M9 zTaA_4&ms-Bx5nOu37;}SrylPtb}JmD1FqFwrc6m1>U504?Khba16(w=y)E4iR_Xo= z#Z5>3=S;3U4wPSzIf<6*$~(aPa2*AO7|AOcpjexy&l{rZ0Ex#3%VSX49E0sH4mrrC zhNx=QJ&oc%eEk&V;91NfC<~YRq)(+L1u>I50>C%0ZcTXEZo0<`Mcz{?K)cE9X-M;~ z;Ag$$XKqld?9==z6wW71sDfTYArdl_M@&aDs=tT|#L1)n_1f~3i@M;!`rb7a+F03J z(Sw16;SKzrk%(WOQ}~UofeUd-jdiHnzeBf9t=mF%^6$c>Z>uynz)baKMvRW?FP(D4 ztRWMTvWKl*Ux+NA9t;CsTlM|P86bWVtbc4y9jq4BYJfR|uBzG>QbnO7*5pl$0WzFk zzBkR=YSipk2=4e$X?@Pxi2NXL5#yod9C&y*cG3rF#-^eBiwe@;g@mU$(J1BRqtYfk#pW!C2+Uefsz1 z;R4&e512qh*ufqA{;m2iX{Ar9kJG6g;AI(n`Wc>gj5Z?|(vNZ&WQtj|jDn?o5-MB9!!?3JHK=zOE~S@<42-irK5yIL|i@?JAo zuV+;J$)x5xT9a`d!6ecVLrG^>^3b93iWhm?&wfukM5mlGUBdKbUDmr{oGosX#^7=& zzS?&QQ4A)Bx4{hu6xgkV;hoYTEd0aYSPwAy)MOQZr?^A+3_ordW_*XNP0GB-qFl8d z{rrXD5UL;o+ezRJVr9#!VTT^Rn76d@%&}3j_W}$#UEjX;_zRU6f5L7<&^J6q45CQAXqPh0ejwHe=L}zcuQ9r^a-b;k zI8<#VpK0hbWM!@(1dAC*Y%|FXBW+oP52$Tcit09#ogaRa`%=o?aQQAr5D6S7fe38Q z3^1cjImd$N!|DU{fbO@2be2^^!WtqZ3G6(>CG)yRg+7AEQW#OdCH9boV7z!%m}?`w zCC;1rw9F7oH{-s-a`Dr<-a2-&LzxZX+LHUb)MxEzfBcx_$<@|d8MPVUDf8Q9nSBJq zT!(Zcne<6rZ)XLtRX}?YrJOSvOxYrcBacE zC}B37cgX_)4r9x}qgA5asC5gRWzMo1{QGj^VYPdA&%grTp1mg9WbN5f6uZp(n9ZRJY%XoRzTSZBE)Gx`aD)|HWKL8)+Wkmp}%*&TMD~0W85LHQGqA zG>G=UYI`G60$pzEa&@B@Nr%O`mNYIcK)cuwXQudppT|Il zndCfz`pWgPKxwkJd~7gN{n!*2^^O;dqI9^NP&RASW1-|q{-M-gKYu*MauJHCBTpz< zx(=B0fX^~euw@pSQf$oxbVq8*c#XvIzBiMNJ80?VGkeQFL3=KAM;7nh7Ddi_P6y3q4505}pavBJEbTDjjUTCX z?24TxTGiCpVBIlrq1|+F@jgTisi9znLX^1^4IBP)k*PDB^CQPhy?7oxVJ4^PlOJwE zhYL4aP#4|NjOCqL({8|Nqy4B|r-U@_eDdN95VT9Q1&Z3M)8=7Q|G>q}rdTV6E?5tT zx?Qe=6?EQ7@XC7Gnk|kml&jki{j0w9TR}k>sEG6h8xwzF#mETI304?46rU=AJG$k6 zS4arfujy6|D*Tc`vu|pS6Ls)K=UB-KX6{NNIc5ffw-vLW0%~K78Uh?pkrF*upA@Nn zUzkEuKHPbWi&@QzC`-`La`)Z()=29v!4`SZcNtTDM7=3-0=(Od%R9n$Xe-c%R%0*V z?g*F-PGT$c1l`y|Ch5-Z_MN#rkg8c@i1|%uaO!4z)f!S>7_*}{?f~$K1FZ97^Wm6V z4!Pg3N1E&z;-Y;tK?owml+lTb*u}j$GrKv_oxi5?d|}mNA}WejnaE89s}N(OK?nRL zAG3<1UoGBw1e;d34vc0vVp@ND$QkKKVw;4KW65?8cD@sO3LEmm4F|WVwrTdpI)QB1 zHcl1XRzFEY)m{f5`QBE2?u3Oo>P9_s{l9{m78Ji$i+pip9BIP2zeV#_JcCbE{Km&h z{?t!jaKVWeqFKGM>D5w3E|~eFJ7LN~V=tVrN8i?t{dq6p$e_aoe*0;8$N+y2e3=Z^ z#{6w8p7Oo)weD1{VyQtru}FSpiQhl{C-*1I-ucUr_RzKZS-XX`*GVtr{J89ne$JeB zD>7Zz6$PYT)ngm92&4beacfk^wGcbD*&u!jcuxUl{Hqfgh`?=%+txN-0{FPpa+FFOysPR)6BO^b~C>C>-SJ-Io|21rF zqYc7ZER~+vaA~2FeArOxyFk*}Amu3dRxd>%&-$UZ2DBJ4hr7k^b>e=+E*&yB^sk%% zpQgaE7e$LxgH4{rq@*}j@y}MWlp>}%8N7`aTA~hvEvfCAcjQp?p!=ey7=iq3}_>y}AX`8PMDmY9szikc~MZ==eSvYnQ zc2R?vVM^Y^-UgwoQwE+|WC#q>SC2N7?Kr^PosIZ}8&PRg-;c*0`OWH)=ho7Zc5jF%Jp**CoCho; z)fQ!!L|v-iZJ$ye!yqu>^n6WnBUtsfOSA>^YTWa&)LSL`xE4c0%0K=gR>R(pR<3Ic z$<}7G?uRb(`$o1e?Hjo=LAOTsIx^**fgzBOIZUqe!!lBSvg+8>i6HP3J-Gg&w6y;Ez;uPw zD_By4JxG0gmI%ZiXvrO(&L}Qqga6Hq1b()1-$?GMMF#H*-qW?$moghvJxzCSTGDtL zRKz2paj_*f+K^bAUSaF#O2*Sq2Vj!p&y~)Pmk_&r(hq)}?iE?_;*Re|Z5~H*7-*UQ ziEU1s#g?)IbCA3`@?QdwAr+T0vDRvRUx;WhU43{bzYBG@0Xi;xa}l^= zWmbd>3{)2UuIeg4Kz2{~X?X8pSaoAE__db$PQQ-QB;eJ{dI^J^`Sq+(5H!GU|7ss1xii*2nY z_=meGvO;+3_T%3mkRio=8O}`txyc$<38~1#G>_W&ll5J??T_1o4gxE-2XSXbMMY3c z<$j0p?uRY;o_uz170Xmv>Vs*MPNa!yO;l)Oo_ceGy3f*MB-E1oA08w05!d0#EYbt@ zSf9RjjW(eKYO45eBh`VL#A6KbPdIJk-75@=jjMDVl|1hjPpDv7(n;7QS z8Un5JEYDY<2ItWQMr`WHX`qC=RRdbNExU@LCI=fmI!HVH0V8=Kf=r$zrf4dETRvcG zB?~7D!7t5hL$X@jKPGgGe##{*5i!8kKHlET!BL%QyiU@Bd%)edsCc|-I;PIh62!$F zW{?}L@6kGLTZG=y^BC*Ds|3-wWKPXk<%db6URm$kAYDHwT#6Y^2D#X9;Bc4*JEV6* z8GMM)UH=NSvCOL33*bv-NLdah+EmZC`!T)ou|jkz2iw}ya#~+eBy4qrg+o2&Ym`&g zn~T12Dr(gEucgH>DF{seIvvk-0aLFitE>12$Jq4;D){t|gIXXqmw^Bam)TUag^oIF z%UF;&1I)aw-I44tz@Lvc7p5CQQ%}NAsAyS=7MRmC(XJYu1=EE}ey}`5Qi_5%cVKVr zN;hCjmt|ZBw<5rSR_T*k_yKT>DeqH_r<~9o$Q5(6Vhz6}HCb-b_`Rt}?906ZzR+SO z4^clI$y73x>9w5I6#lQ0or(G+mRX5%=2WQm`RnM*wsBNf@Yis#<^VVQd9dffaDV+cE z>(pPBa7{T~))uRW3QErA#AoOJCMl3gOi9c4#7?SkA4n z4dXE@J46Ko%Dx*542$PJLejjt_XJHAMxAhRY4|XXN-rxIeTg%w>Dor}npyR$31(yf zEzV1z|&cp@i^|f&T&7JN}s9ozt|m3e{yR zK;TU7>&k+;xEIWkF{sZ2bm|A3J7W{d=r$%K^<}z&XRL;S;Es?sv_s}9Pd%|_tCHje z^Wd2-h$yb9k+vXZQ3B-m9+T3H)gvP>O>#WCr>u3rZ`9*exHOca)Wk9MB}q)b?Nk9-owNHG<}0} z-)oN5BE5)FT9RWFLdc(;5I8cli$Ynz>0V*+v_yMi3qvpnu9}iAoEu}n0tVBtgvJpr z5eJQOA7i3P+iWD*LYHK$BmzKMs%;trOFfKRg?Y>Qno-zyVL)%}HM$R{_#y&~A}icC z$8GeQ-2$W<*cZ2Sg3lMRL{-YRZBM}AEU+2R)gmoGI_f51G37nAGCY6H0$0-eV~X1R z>tKswncZLZtydZ`9}nLK(ii~;9Z4b9I~ZVwsA^lNB92Aer4shqnPkSNPaoYU^+^~9 z#Nf0M&VBmsZF@F|@qEQ!Gqh$T|K5foI3gUXe*uNcBvfVQ*avy1uTzb`+fzpdXRT7c zU{j^-T3j>24-DLjf@bI{;rUV7R-T%HU>TE#mSodqa~|M^c&HfGws#eh|00&FGk%JM zVBEN;7+9%h&+wXl`7oX0%b?E~U=nh;-2BZvyT2iIqA5z74rjIbc*z(>=CZ^^V}bi5 zx#wCB=unxpOJ!Hucoc7Z+)(OGT6{R<^L>c8{r$A7BS_Y`WGKsBxL@FvYs^@L7_Q_} zj5j2@m-r!e3~uoLFVg=mBQ@r)2JbeW`rZr$O$d!Guz0070GlA*@_pv0LoY0-OW+HF znVDec3ze;`jw@Pp-ktI1 zaKTHs=5502oOpKpn|_h?7SX0**k|aeCcgK$T3%n)R^NVj`16?la_v622yHvnJ#)N8 z&s3gAuc-$M^1h`Qh_dLi;4z?R3(gaw+{6-K&n^S~g{Zq|B__D^MX3vP^Q8fW{1JGy zvtW>1@=K9uA{CKg6T{jbz_ zM-SXx;Jgw3k;7N#aXU|%w;=b&uBUPTXabw>Qx+TMf1sbyGog+}#DNDa%KGj5_msf~ zZTuKr7Ip&RFAPA}G@cHW3RVj?a+JRNad@qlT43Z=u80l*XsK`|LVQaDFkKs7oRpz9I|Ton zLIcR2EGXDbyP<`$8?lw!cSwi!wx|xy0n<5(?45tI&EYH>VI{1cM2_7n_!pkgjA^?e zabJ;i0vwQy=VuKk_q3FL0k*KZ&bpxGGTn8v`s!FffMxpfC6^Ybis_OQmg?n)dj8F8 zg*y)DRQ=)4g9*IB!F3N*o(Dy&*8?W2VLiXcu^*yUoF-kep))7#;7z5=TfR}tnBjJX zHHYX&MAQ2x4agPE?Vjz6D^y#A?USijt6|s@)&08IUbUv$X1H3Rs|Yze!4@d4Hc#tU z_+%^fYKNSr$KLNc1AaJ@=7`%KV=UAjhq?cvyUp{-fU{oVZ!FP+>~MRTCXqHOy6p`y zQt)w8=pTuG7L_Ni1M#|`=4X|e9VWp8l+qpVP4JNN$@o03UcRv2V7nIeaQRguvY%b{ z#a*z?By)z?Wr|7Aj`VMvQbRF6FKYauY?&sjS{$n5xs=>!N-(hK0lF+u0QjT6dtL#5 zb)p$^1q@2SV;^o_DK<2We$G4`BZ0b2x*sv)?E1$ysc1vf2MD~tNtmgjQ z5Z^`ipyf&7{>Cs&aWWDN)}|^%Wh(ba?;5*8M{=aorU$7+&(Fa(gASiX2b5nlZ}Ru3 zw=EbN{A>e^F7OLjgOFUOv{RH%@Uj-SoCUmM=Wq3P?$im~^6h#}(pS**XhIFrhjDsd|4tvK*KszO zF|}bSM%KcQBvWp*mli)Ex8(8dv0Q!JXXgqNCsHQ-N$BQv)afB1ba$)r`*^@->DQ}uJODl5UEskq-{UMQ)#$%vpMeBR|5BxO5qk6lUr(KM5ivkuf!ZE1S(^AmH?rIKt$fiseu5`7QzHOGvmUwqEJQU`)-GP^ zc6523TaQ@1y+9cEu^6}S@2NPYF6`GmHvv=Y!B%fnnVkHwR3`F|gi{A-$78F9&PLMY zHCEJjHJo`75zQN((4V9Kd=DGM zyw=}6m5P1DdKB^K5r=g5Jw)G~aJ|uSbn=Smsd(QG(&`E_c)esUAm4~oTk^DnrUEyT zCumU)zYGrnqnu|jK&;K5f>`azGHFtGN%NW`x<^;AC*Rw`No=RB_XqL61{afYw`rBP zt<8N0;b%P)ATT0X0iZJ53Iqc~MMB8!YeQ|Z9~1A2rl~)-Lbz#gf;8;x#{r?Wfc|`s z!h}t`Se#+s^u+#)9&K^oQ+-;nPdw)maee)=v8KQJuOH?Lt;2es8KphF;B}~(%yqpS zBl91>cgS-hd^b3Kq_UuWd&|9wIm4-?+NSq+$qG446Mxy2wjAMGxrQzf!Tt zO0B1+sWmYkv#jokbf*7fk=e*^-%f{1v9baW@ZyA{tcjj)hvdvTy}x3O#J`UYSq~~F z9BuA5Unpq(@ovF~zXj*Q*!xYX$490t|KaXr3GC$n7}! z4`jEk2x&QN$$P;G#Yjilz6Ur@pXzz-PIxjTg#lDEt;WaKC4f%x_PwYXfB$X)jeN$mU+6i=#7E zs*SO;lvgZz@>0~14{T4tob5`_Ux-HKG^l$KQ7}fqX9Icsk)E_}L}2)e%+JKAkuA+f z)wai^UMg?-YQ<{rm<%wDhRf%o&-ZXttTLqQ7_c1?y@7Uv4xiituQ8|50Y`JIW>W&1S$ zAoaNg%>0vM?Le}z@cBM)Z4B9s@55wf8J>S`< z8)S0grF%Jp>lrQk3sQpHpR7 zL?viC`bn}R-0T*L#ye~5)_(eFYzfw&$?l|PLG0aIZuOkFSEV zuKHin1F#^q>Xc}|Y7ak;JCyQiF0?x*g`e5vR&eyV`oSp*Ivp7@X?av1utbO&i_pZo z!E`WTP;bcF0wY4;U4teIxTec`4wRR>7ova-B?<;zYYIyG|CzrTVzhBa4#sdtpt%-Y zidE=2qZeV>A(u4mmfUf@!fOC)&Gy$PKno4 z@9x8fEQqwXBj>RGE8GPRw8XjQZnj`DS-5&twT`TS|7BQF9fH^&VN|B#%8j4xrA@;o zwjgz-vy9YBr#V4$JKslp=)%4KfkQxflLrbG;xfS*Y0wnnXRQ@A4C~h40&HI*an2Aw z0Blq(G$cFjE}DT~!+CeSFYc*Uv0ADB}yw}-Mqu#EN#>>!<8?(fW z^igEpQqDXRL(ZgyrV!P8q32;6a!dO`T%L9r7&hI( zRhpErW?#$D{M^_VWS^1PWlx&&+4|BKX2e|oF%BCLxdMc<2@Bb(pH{Ava!jiTBt22} zD!gPTSAr?H>=Ssgfc*6l9@|Pw)@ium;|q2XnBP>HLR;t9Dm`*@-)o)tE!Ykocr2LW zL>G*n52jwwAXnnHkpJ!)5Q1CVHvM9`l{s~k-X$*>`65b<_P0al>^g#@4Cqo-h5`27 zaLjvb;IvND7n_DthsvC>OjByj3eaOY-Q9btYM~w@)D}%lXj%)u{4c@lsb@mBTv0lL zsU7Z(-g#}2B(ES(S#sEpI@7>j(1mQ&*I1U3bR zA^-_+1{MEnuGy`t{F9Jjp8pOmK0G{v<)AH|LbOcrHd;Ar+RHZSBbfGAy~7p+F15j) z*1@o!aPhQ}0Pk zNzpeblf6&x+XW)5)hmv4xoHuO0^`4o`#Y>`s7jk)=uBDl>0BmV7dwW1@Q3v zXDn!}z>dgyH`I8Z8$%w)Ots~+zGMOq?r0~@)alCArAx%D9m_E>uyEdg zsy-Sgoyp&?)GYagE9xMc%kMSp~y!-33VWEb~3Z+?uHW8q*DTG12QiG8=$j|sI{lmydcC0EG8n3fjl$SVQ zf>4!w{hn}s%jSpORb+rueDn+n5@a7afz{y*!57=15(5jDqt}#gAB*x;z1+?FrZNl7 ztKNCWhcM)^SR}B2IXw;pZdmM^XODVhhQWD#-VwIpRgCwwB@;wkAUz|nipB!G?9F>l zP*|0ReZvvbYfSQzM6!321lZ!P47nR&L<_}T|D(%F^uhDN@iM*(e(UfYVmW>N?N6_@ z$up|X7pp$IU?jHN)B;{rTC0`Fq2BWFV zG+y6}*9Eho{KzV63Kw|1NAhwg8*Ie}lLxHl!gBSn&m*L=p8F>)Q-`(ZOje(s{^t&S z_8y+?g}OXM6b}8MaF&-I6cz2LMY9!HhVrd8crG6_TQkU0qMdy%b>Z zsngY44n2*n|2*^Z=2TKJwa zKk*tV|FC7TNwdd9veypmpLOJuHF_Y6QJuW7P%yvZuM z>!QV4sDx_ zUc&8vS{%N$&U&CvUa|g~NGHaK4$p6Cbp+qK@3RbGdE74tWzuSq!NuO5opX^rOWs3C zzt-Qhh*g+-5dGry*heFx3uCj6EY_kx_SWSfaEUK5evL+@L`=Lx{q|>QPga9OHd%_g&n)DN{sZS%lT{!x z(ro}*wUH%r5x2f8Kb3N*!zyeg5-@rcFCSY{PQQxh<44cX5^cb#67b!Y-1gO&haEhSgZs~7hV(gkk}$f@PnBrJLbPT7G>IX@45UqjUSa@zj_ zv)(gRNuS`z;gP^Leyl3?=`Xd<^eM^&M-H+h&j633K;8nZVuKO6XR8tR;pNQf^Sl2f zRakHzif~wk9mVH-6y;YwFboG@EW78N8*&W<*(b7yMy{)yemkvpCMndCHzm@RW>E!K zL6%UrEPf~WIEm`LVM{E+j;_M~9cOzL?4~=ceDrw&PoWW0yLvV*S(2_To~h0M;DR+> zn?^fumsrLSSW5o9gr`mo_}ss)D=-hDeqPIAG$aeEQ6(%l7=KmBCO$rmKJwI1ATp!W z24Kns9eXmDPH9l>0pMaXCfJ#FnNA;sPcl@mwZGDu+6eV^AFZLrx4d)BABfEi*AUVO zwJmagie@XX7pb`%@(rY!gZv2KMwcCT1X1^8s8P@Q^G#_fTLr`GL>K=$RD@)IZfJ=M zP(yDnX>%O7s_)<9-yPwvngox?3XXyczHRIHoW;}-eoe-# zYtNAxjB(HNHrZl`^59J#wnZ9TTVw}>bai=TK(FMdzLQ8f=h6mtsqpN7g9Yjt` z^H^Zq6qX^_j0bN6SIlXD7_&{mGWAR}C*$%wH=Kwqc_$is2)D}gl>4SJLT}P#MFps3 zV>~Wfp7akHZ>{6It*cPM4}VoSOqJK4gHkT(9{|>OSWk^C`3rsC%DcCS?zM@caLS!r z)6#>uN&k&eoV9?Mn&ogf3~n7j=$fA|b=~_1m3unACoEjF^Y<51vTn$XL8ZQpPd1~r zVcWui5~s?CBN^(7PN~B7K)KDU_zWq{h{O|a3JgF62f^cM-qWVZI^>zE*>UpE0@o1 z!*uf)v}0V-&JH|u0yT_J;~VwK+vIk0Nf>?G=Tonp$XN_I16!n5wr!6iMW0EJ9sdUN z_Yf@51Jdm)K!Wz*7-0xq;L6N(0HUG^L_q)T=#i)&En#5iI{!iNO|vdjeZ}0|zn3Mv zmHPvnGgN#o5KZuy>W8?T29jBLRUIEwu}~UXwuDTiaTk%+N4aEuCP;n!zY5=!OX|lz z5Le`7SG_#piRj)ipKGMT8$iuK>-5*6*Iw9LXL7zS(XGS#haGh#qq1?w0dH?!AU%8*WuwKy zxeqM!=yVNgm;6KwQRV;~mg5cm8iZ~j**Qya-&QX=9=OoA-L*_^3hK(<@xioVu?%2&hlk0HDN%X&*}WG~QTU+ky*% zBy)B9zWA|K9@B)5EZQ$xjU~`0b7+{Npl3cV*aEDAW=V|c0tH+@h31%cot(yB#ikTI4+k%oz_~wNBzzs1I2`gBwt4(pEiDq+VWlk?Pf=itSXCh&Fsw7@F|-brTaVUP z&xVeZKgDX$iC1V!Z?5#QRZ9IYr>#=MZFOlW3FBTWccNYLgu$F%Y4(ply*;nScOOAI zqmuL0rQH@Bu@71)j>KIxD0h2cFr6i^naW6<2+UgHSv|ONnEyi8m7G`&HvjMq@87fw z3#~*~7>ED><^>Owgrj!gXceK zGd>bQ*a5ascbC|27T64en2!4CD|J?(wZ5;zj?rKTt7*;czEMQc1IPU3h-<`q%Gy|V zrZw*JJO3k7 z4ZwZ8Vj~@-tz=OC>P0fAk1Yy7NEhL*s+`v+W&EQc z)PSPt_UU~Or-hCMrnvl!4X_UHa?w^t9rh@*7V0!(Ak=aVh2LoT7s*3;$N zD}3S___rn>cLgoh7D{No4;4>?Xr|zZxMH-x%^zE#Dg3i&vu;KHgHONz_gO`Qz;7(N zb1o?MV&>Ohq;J(XlB`^p-oz2=($Wthu7B>7{IR&(RBE66t}QN9fBP{Glkvz0It@h()xEA~D6v+Hv?c(zvT+hNswkhh6@zw2SOfmSxwkPps)Df3Luc zZ9xg>e*zQ-HE`}_P&xd|cmXyVLs9Ke61x56XQO(<95<2w7ngHLnUd0e!$u!fk1pml ze>TwB2M9&T9zIjuo6rH^?a6vrJIQ_Y2H{=Gp7nGG@G}>7VVN;xco&v`vM&qTeNj6r|0+U)bHDxA zxpA#kwJtJjkYPFk3#`EgD;p=1hmF^m=|D~PWHfHy@ckj#7!xRrt^Y3)1#BADe)Og; zPX)_09GBoF3*Ix?ocND7(L&GFNPq|9#SUyI%66!A-p7-Y!LFi7iP$kN_<|){qP^bK zOXg)uZZMi2C*9JrX*w1R3R%1DsB0E9Q+?TGd~jJqJPmZ_M%4GlVC*w;p^@WZ7W<(Mqm9c@9RyS8MgT-`CMkM+u8sI>?R3 zXg}yYJuvUkJ5k2qM15?u$m8`TW8w5XR)!JLM{tgX^a zH61eHpt(x7awCIU4cO|eo*Z51_%EloC0%s4z0?6GXHnJjLHARCBaxj3c%`JPCk!|w zqvIfF5`5VyvJAOd-OQiF=}0goIGFH?=r_z-Ct5#_9B=ge7PfRgE;9rUFrmquxT%OG z)~=gCbl;&_c%2?;u+KoSdl2X`Dulk8xXa%o`oIQ@ z)})qIYM}`!D+qJcq%FN(OMba0&ZRwgep)kNDyrD20jA8nbUTAY^3+9J!3ihOPP5)- zh>pkg8&=)j4>I+*Hsa=~l5zH?BOqx!i>oOZIX9P+-ZIBL3H)gu51xXMWp;!ah+w2~ z+%d>n%@+B#12SeFnu{yqM=c-nCy;OPPMK-j>>K1Up++ojMQctz}VNv>9 zU~V^y3<6Jf>QMjonC^M;K$P5{a1nl1Y?oOE$q8e}Szes6w6$P@Q8bN|h=sMzz+qm0 z0GRiE0GxLleJN(CagU=prmxd5gJC*IKZi)l5g@X8CGmKoOgZ}(v#tr#*CVE)f}aXS z(o8);b^u^MHL#TVe8573oe%)FZu1ud(%}#;5te4wPnK;@HDHe-XW?t_ZXrG!jbn&0 zbI2jl<@`^za%%%pb0u9e8#DclB#|w;y;zo70@wpttxJlK-mp(u^xS&G z$W{ekqjVTjJmQvqlKk z=R7Xav)*Y266K?%2pKWzepTWl`~ zGneqpy#qKG6TfP9{un zp#bGEA_IUrivt!T1Lg^hOovcyOm5(oLb5xOx=xp-VOMBfR41j=uC>YxEY?bjJmyfc zv1V=!GQW(q1-3xsk8|z2!g?^FKutVIqgeZ0YQQ^O!Fvo(T45bb+1{Me8$+=^;ONkc zy|Dbh=hht6lyL+4Xo%Z5Ulhwy>z)D@oqgFIIQ3166d}&Kt$RgpRo|ekB^IhL#Nznz z=0YC8Rt}s8%~|r6y`L6oNOr+LH=73?zCzs}9kF9YKc^}04~Z6-5qt2m^+oW3;qBfE_u8R?0Doutnna|u)|HTp^y)o{BPjvPaX$THEURR z2|3=id75O6=EW_f`%~t)in09+ky@)-T&b(gX&E0L+;HNEL&yww-?Q}7U!#}}40z>) zuOFz);gH$tF`(pzmEfT`bwb&ZI^;kGflghL9uVdG*K-a2sqhMv$@d}_XK&^Ger%P+;F9aFD#g37VE zH?TvrR9Y{Y=i(dT`kALO*(^*a*IDzcr;%jukaUqbfeR0$lgse3UxuW-D_{pT@4H4~ zIsOsHk{m0-5pi_(Y)0W_ENX7NKI_^MP1hCJVg{uTrVQj&THozYk#rKer#W)pSw?~k zkVzv|@YP`b8UE;@+5^aar4Df(hPCFU1~9fqgX}F}qZM`a=94?^D@Uxg;4yG|5?!z< z?7%A1so@u}{v3E6myiFWPS_&jBc6U&tbJdspU4RIBFZV?s&5A@_*$$5fG+>>^auQn|+ySRxOf*#{IO#&lH zA|rP-sKT?Y4hE-tSqM)oKR?Ah--`@kmAt~E6E)D4qC?()_Axxx>??S$L2e+2Zc;`+ z!1zWzK~_47)}w1GHg|5rtqqzPEcAGSX_cv4VxE%^IJwy%Q65r)_F2;sYS$2d9F0gE zx3dlP!<;4xk0he6ipCs)dFA?q|Jb>SjFV@1C7j{S%9(HU>9#VhM*4*aaWxOvElFGQ z5B{ns?D`6hZUE zb2%eLqoH_!cEp?4gP%TQr-}ZSTys=^6Jys4>qCeBws427J=K;M3Z>=LlYC=e0O!fX~B6PVu#wLO-I~9y6VFj>Ql>Z-Paq zVSPN5pV)Ltq~~j@?tSuV7Pzyu$pl;r+)H{JIg^N{zJ<0skt`lne9we?1-mhpsQo{R&O9up?~mi>-dUQN_I=mTs#4k7YcA5FsK}Z$ z)0mis%u|9KvddFISHpU?aKdi7Fv z`VgOs%gng_8_uex?8Ix=s0T%;04;EM4^3m*F;n+Y`zh{ z%DCSZ!yn&$dI$_$XK$lS9mSU(sQ!#!vx!l5#`r)_HD37{{%Xj$069yI4314h1}@S= z=Hiq#1~ClVv&-1P@*M+vvw0@I4&7g)%V@zz9k~(n%aqssT|QrHF#~)Vs`1T!EDB+#^3pCy}lQubXDsie7J0pR&#nKDJDOJRVSQ$G{k%#hYQRBpY3 zJni)8&|IFqUQ75QO`bkk{1N0>gLjwOOzECFRD;K#$=oUXU=XVWhMcD1wQE(0|F(jK zh)$}!{1|Uy-iT9~$7?{H-^8R;#DRXYrDC(7g_fy-+bIz-U=;)hH5yRvmw8p>&7To);}x=mpa zkByMXdt-vlRB&2u{uLBWUz3Zss(3xeDrsi+M3D=#`AZ6B$O7;;d3W#OLl?S?A@X7h##Ca{%A5Ef}k!v9=uXZ6ART3uN02Yzi!6ti-WL-&& z7}V{+3>}t${KX}TNTU`3V8+I1Dtb97_}OjpR;v7y(;_eUl((o{k@RN}XJtP?)h=Uz zlS7v#Om^xYzoUH@1B&GXOdw?{CDUzV{iy;Lb+PNnQD8D{BI>V*T->@KAp8QV~@L3(_r84 zIkrudYwb1Zv5tkHs=kMeG~|+0ekPLorJ2Fj!u;^#lnWgcyB%oIu+LzRSR8N1fMt|` z_V7^+7vyFFm^0qc`vH*}@V|b93wP~!rxdV4vD1jV{xVdm2#c^(IwrM`#o_f;PvGIW zm4SQ6-dTZP7x7(Vh&6@%FZ`Bv8#B$Cb-$N2 z`(Qr*>Pn=3kS*I@ua=A?yJ5jV?q&g&(HX#gEe8ha_JPx6v*{W?aD;CPvLz=jlHnhF zI<({q9g*FnpVaBFKyq7dDdrfVG1r`ESP!{Kfkt+Gn(WAvEe)(a%ae7%ahO#_-{q6l z2k}f`yB3AaJeMh_!%J@CQxt0O{}C z!2l{6=Ioa{{e&79H}V*L_-xyQowK1givLl6zo>9fZ(+r329okQaVeBMF)b|iExUxa z8L+Q|FRFTuNRXD27DSRg%>wo1ne`KNa&=b-v4n=@f_$_1=QS*~mDI?|y`Z?I4Lwiy*QnRrS^ zn;HaqnkbtE_~feHh83F&(JOvIE{F;9$!oA*eMA}Q(09GgZ#jphshY)bH?NGsuL7wT zj977hsLiWAX|kAS@GntOq&i!nGQ8^b0s=0$j1lp)z4)p8JV$cg|Am+TcPX>T8Kenk z*#%Ct^^{^gF^r=x&V zFY8pNanHp8EqX|L_!A~z5Bcl_vaJSV?OOPsD2ne0PnZ;LO$H3B4`NEvz0%oBzgAJ| ztiU>H_HWb(?l_c$9zVV2Z@>c1;|;G`UH0nv{$KjU&PPR|#wSc62h@SXfgtV7Z)o>> zJXs3SPT_Cf0s^V`z;12*hxkz$(;sWLYB6f9JJW6E(_)>2#2t<$=3@nleZvn7hdQ3? zs>6rb{hVF#6s%02EjjW)?zR(3(OU1%Aj|rDh>E|L!xySjoOTR9Pf6IX_#zhmjA8J`q{VNwVsF6aF$Ngj<@&A}V%D5A zWa@6GVahR{SN8D&V0+ArJspr+P=`}gm;LIWSl0SU+8_WYJF zLM1;pk_{z8xY4e=i|jdgQlegFVMjnY)yQXE{(m{s6wNOYGL1}zb0`7v3j58njVV79Qdoe z%Z~`DqdK295-#cnU)1p#nDW11*3}Ts>P&*2zdV(=B1XNHe<*Bzv`* zZz)zxt@dLOvjV}EBA*k|@+Hqdk#q{DNP9&b3lM#tRZ&jIo&b!()t5I6=##e?pdDn^lbbK- z;{hORK=VCmF_!*_te8sw82*fOmrL&Oyr09?#qI4XFqgXwsj%aPj_G!C_TVn7nT-xw z{Py!OUE;HMaNz4CZ{|hPSo*Vgp)h=4>^NXIRQd$tyGI&+fGIPub!qkY0`AERr7Z;n z0V*x~)_v04vJB{6|HX&NqAAMigI_?8%#M2<#>CU``?K`kCjBQH=NJdg<>{ztuHL>4FQEN4AY9Gc^ta!H!i(>6QWX=us z#b2W_{*4!G)~l--pu2tjgE|%POMJf#6yaiiKX_@!`k{)7J_bJW^hPm1qH4-MgLmt@ zS6_75T7$-8%+fON6G< zWx+)7k(6nMQ}#EY@xkQRYmS?INO8(i&{Zv)0VrOeYJn~u3HFIOZQ(xy1F6FG$AM7R zp?kQNyr2%Ak^lOJUX#~Ey-9>X$P@of&+<^GIEV%H2(DZXGV93S(!9sYeLYCVRnKgh z&AF5~a`MN|o$6Dcj~V|3rHup&1mngOayh5c6K*cDOu>oA=Avslv_Id?gTZEMWw#$Z6nc)NY_|RdYOe4cs0HITy7BN;*{q45yd$tdupE0|43UM_(Q}Ps z-X&8*{E%Ba_XK6A%L^;=SIUa_cYV(*Q>)pN^5}$HR#*iSzl&c02^popdfHcsIVueJ zKnarWVpD}j-4VPmZ|Hy|FoOJC_-W$Mn%$&om5P+ptW2I*0MbVF5xy>voF-=@m6=u` zTxk`^gyvq*9Y><1(|wVGDR1@&XQ@;{oVT&0x4gg{UyF#0@ehM%?kW?xWpZOmq_~Lh z{mh3(bpPY)u&1D_WasZZrVOre{!>dL|GfYsmyauR#)m``-@>~>?ImX5O?u64EFa9j zo$oMzK|O#f31iF)U+hZNtIaB$@MmJ_4X1X|?Jj_xUw>BDGd8@>{zZu^C?jyeer5jB z#5fC!98}8~3DNRBxAG3id8rK6BOCV22F7!xmY!fcbJP$|qmU2RQXRyF3{l1`@YHoY zI(7!$gY0q67^SZb$A7by=))w?;bG7LjFt=;7 zj}fplZ-I)|a;VrNd6};Bdt?cN$Rnew^I~}`<*KeVrK{xHJlFQainY8Gq{Lz(u9|$N z31={nv`q~%g&0Y-PO@*bK1j%0-WIwR4O&k9vWN_~1AHU7OiVV9%bMRo6Y9semQaz& zHdgoJtFvk>L z$@<0Tz#A&@w6e?bc?|V<8aSy?`uXGA*c@^rC1?$Jts{CgvF|(+d#5CCr)R8_yPC_0 zU79Li;F_@%Fb4mrV6kZ2FUQ7QO3riaI{1;6{07gT3Gvf38c`-JFvCuryFkhHeUT{N z#UP&gf*ty3#m#l(D$Q&pG>bORcx2IXLNH>+oxezN)fpfv5207gM!Z$o`|+XXkDJgH z%LoKL4ic77h37pPMASM(BX#_{ErRLt515VREhGh>zi=*3@uZbZSzEX?JA6u5eN^%Y z?Ylu?{{-$?SICIt%YdhdD!dpE=+&f~wm6(ly2`^d>v-qI_CI+};s`o-6*wadwAo;= z3R&~P0Q7oML@I>0#~FHQ_CBQ95j)@bXOt(ItTcW@et<}Qf%`8O+*PK%ldtVPOicMV zFHrIVX}^>cPuzwnjG*n9+eT#E z<_)!?9Xz5}tVABib3dzrUDaADA!_^rGkhU(-)wd*?5k171Hdx))jvfgUIB+bACdhw z!s0aYex5D&zoi3*&jPj)w-`ox<{od`HT}7%^s^hL!=1~HOT@_)i9nib4j#yddEaiM zAL;_%so^nWA?cG;lH7|pC@Z&XNvL5A;#B_O>fya~KTxqQd&xnOoT2Y0EeayjXO+8UOqv72&e zGy6M;ZwvJ87`cOO9OXssq|`4a278KzSUp?#x~*yzX+}bohty+`>XvWOw@`%IkyaBK z7RDLg&txUcA2x{dW+vVZps!gdxNF3J)0EiHlxEwj*40VfQl%rNwd#ntAXLo5NhL}j%$$tB zd(3MJ=*&AVZyXR*wce8Eg(34^49$U$gsw-qk9$5(a?X-hmN)kKAUT^<`Hy8UznH9^ zIzM}Xw}?0BZu_=r}9$~qcs1d`i*P@#BO~I4M`uf6|Re- ze$mF@L+>8F@fJ%>5Oy6n>+^4V5%I{#(!^?gfz~*lJ!0C;Y3K&o& z4uH_|Q%)NmxO%dho6xK%x2=`wY z6NCCLTHdNI`XCR&5fLZzJ#_i{Ed()D(WklvTb~!+B4_)unl~@2DUkZ0RJ6i3&xIqWo2kru5f~PO-csGr04ziUIao1@(7Fa32kOQK| z1wuixe9sT#3E3yuQX_MN<-7W#=gXVA;8ho0Z=njp&@YoJ{M}pd8iZ|)-JOcQmW;Ur z+6#ReH((VgApguZOPIEP5c*T?Zz+xxypoHi=fF9vEfwMKe$P}$Qh!Z|eV)dDb6tAZt+e4sg>_9Tl97k~3X z51JppLi$|sSC8zTrV(X}7I-9YU;yJ_kgy1gQj3pV3lfaqf@u$zPj>78PtU1;nbVY* zpjxqWH|nHGXVZ|?jVcbbG-Aedy}OAby{@Mf)sj6HOh)^oo5I8%62{doXaIb)M`sfW zu|PUi{o8;C;>~RC-)~g0&7S#*hY7>8sBYV5@3|jR@h2%p0ot$N0VDmYj<=hE0M;pi zSV0TlZVp$`r@oWqrSExeqVk@&F=K#P7NR@k%Z7A}l-+&cHiB z8l5z8XbF_r$z!$K*SHsrHuqsOKc{&Pd-KJ@THn=NuF}m)Y;3ZsiYj8JR1>$KHoj9-dG%!4T z3Ebk%(^ZYynN)P$qR%K6H0eg|NGfGuJ)iH~xoLw>Gsh?2?&cqmZSy>Z_T2;}#*HD= z#xuFwnXH|-VXHd3$?){gh@&9JyouI49C+F@d4*)DW5yED5c<8iZO&G36&)yAN0g@uX%*0})I>#LS5PVAzJZ}Nc&L!sggxV|_s`mX}Tx!n|rZ%_j_P_{JM;0`AU z1S6M1?^rfYQ^+vqlfB`=7WgyW#+SUu_RX{J;_dW>zG^ve#4lY3OEB^!Hn``0;H{MN zt4cTr1%6m1#p)_4`5Z`^ZUcD?i1Pn1H$m((`peB?jV)iHq|upvSg%T z+5*(jHN9A^m%S}74#1l5l2c^SCMPbBg*hE&Zv~|kK7+d>>BAlBH2L3ObAt9FyO+!i zg4@wxG5O41lQ`w3oT>#VlljIX?OEtSE-0E+x$8$#A{;ex}lzWn}Rr+Gd zZQt-!BkA0qMa@XSMtzuw8xl1SH7?QPv5ml5$;f`3%-sG-mSBKR87k;+V(` z+wz*&v!&tl?vbqr&_*`0K4b5qMIcHk=!i`4!2oNZ@+C<^57KM?f;v!XlfzUhrPzI% z^>b^7c9oSIKFT7pkqIwkRqR>(-&vG~LS zDany|ft7<9wF6^8%f}%GqbG)ak6sspbEzhFl)gkzwV2A?|3wY&VsYPEgQXGFs5#G_ zzUpW2zV|(j(24BZD!e?0``(lj~>yfKZ*Ax4HsBPJWi-JvlTw?F02@CMBEHaTY z@MArH*BYwV|1pNEX&o2gGeNa{qr2!;9#>b?7T2f_S?m*HBjFV##Mz^J3*OEk?s&o4 z?NJx(R)VBMOBd6$JtsL?ysCZMBXB`t8b>sw{Bbbf!g(dI`*Rsknl|v zQM=DMZvqQmY$c)TZ3%6(wq;R(+(v$P=58`AFKr2#3&9hxGZ_L1mL26zirQW|G>SOJ~>Fn@0GbzS6k2s7U54Y7(Id2tgqQ>8tsC4v2h z_2pxS7G3u{(cMnKfR8L1!x))cm~SzeIgQ$L5Is>3HdPLt2ZTCy zJ~%J0$Qij@qTnn}UxY3>O?`BZQO&#k_wSxwoJ(mnL`vH7jIWHzK&yUCcxQ(O*aS=x zM%ACnx#M|A!vYNQ8*NF+SF-wU&GSSf9_1pcYW(A}0-Hlp2LFsk4|5oRi?|a`zzSq` zkq+>75p@CX+79sImeBB%TJpIUILQZeL*%Q+IyUicN6FJWJT}AX{WEwB#71kM)Bp1Dm1KY0Dol61UG&VhG30T#0TTwV6ry!+tp*Cno`&6s?kD<+xMA|Ku zw<*|ywr+kGA=cazaYKCNb^*Ys_}l|a-v$;JR%1uZxi0v2W}O|{It_G^`RCDrrl%Gv zb>8UE>tcMJYQ=Vc*etKS$#qw-vI3)2ZC9+0KK1*B&vYYSS5(D6kc&`=5zNsoB@*>Z%o$_7h1vcX~WzmML4P)*TR9UqJ${!QCHxx^!v~};M-$bmW!bODw{`8)J9%;RpyQ;u4Q|>t3!gJ? zGj&MngYem)_&=#JA$#12SB_<4p~A%7$Wm@RU7okms5sztCAfzp~ESYrW*nYMZe z-f-PUbi)4_3m78{s5#0PVeWIx>%dx(X9!JQ?xQ4}7l&Md@vFeuNUSy%OvP3RRstoV z(*X|A*AY;}leK64))@R@-mL21xUPET8{KnkoDUM(E&!^-g#EolH1)$W#Q{x2y=Nvl z)qPRJb9cN_Jt4r!d=0D`2&exwDTf@o@93sh-nPj+TJOe{Q{(ku$uQ>-ea-$~*-jv& zQ@}yB6fhl9p$c7-<-=NUzrHUW?E6l(JmZwh%}0ChCd=22=KZWA>pzCS|H+%x1+$$w zAGM+ST#d#*yJ+(6q)7zth}(PGDGz}CpIpK=(^)9|7jtw%p1r=$ejRzHf5;q%2d@JQ zJW{b4T%;mQ%SR2v;Ay=1Xf>|}O-9(Xoc+&Im+RQ7S06_kr)t#ktfy$ku%Kfz;3=xv z057oNKzUx;)Bzo}H^4ae(N{$)ZA5B9?=+#o>{*M|okzEo8n-{#gb=$a1zs3O#%Wkj zx&Oel;`WwBnn|H$#_=ou-|7`+w>|WuB{y}=5dMBRjJnV6#I)3^@L{4O_ppfzR1W`U z081jcpYh|-U7?0_LW$7C^$*cv4(|wKU@MY&s{rHgVm*h3A6YJH88fQq52)`OCu9j2 zQ#cm_8lG#S839th__BTBg#OqW9lRq=!;KMzX~9!WEE)}O<>hwnsMBnnG8L1@Uy;>J zq8bjO@)sz905Ii(N;xwJ4g26%C8x9g@)2L$6rB6+h@%--Aab^$^+|9~`g>{dhrCZO zIt&C~L@iQT_^c(!93S{xp~?+|)q_k`Xk9n*VkzDEi?NluxD~KPxbznunu%LH)GmqP zs{O+i%YS(&XPXxPY`YCGavIfung#Jtw+>h#@dwLtQn-)lCBMh|yRU7dq%er@MD_v- z#)MkmAYIIU1}4|ydKLmJZA?dWa~du&(RM}%nJo9;{z>QV3iDUspNsb@;S9nJE;Co4!sBunn;eLC z{7P?b{d5^yuQu=OBCadf&W5}6+@aa8ctOg95mht;W{5SmA+YN48~&Pl(}+N6;k{|{ zAx*`cS@VFG~zDQg$ z49iYZo>?vU@~`RtBp1ePSX~FE( zNIJV%Fr32^&!dr89gF_R&b`;lkMr1kS_KhiaKS|kf zQc0AtFR{|JL={X< z%Znf_Z55E#^Gq_r1VGf$bSKX}v2fym*dAl~)|AWv*I@F)Rd)XO(Sd0_4OB@j0+&k@)a7CZVrwpyrG;GM_=IGLNb4WoH?KsNv`OKap{~oQfn%X+r{ga zre7!fUcw2*exz!>lRuE`uSUL29Ht59Ka{CXGvZ<@K9ItOHZSNPR=Z zAW|xg*22;E;p)!?r!M0$15TfL0Z4pb);YG{+w&)c5Wc?`JYhy%z9(3gsgh{`UtKYN z9{k1R!{F^4jso-pT z89zLZjxGjlX1sDbaIbS}YuR}gskk9Y+~%mueW$CyUml$||0B{JF;8JV#Q|Z=d>>B! zdU@;7^O0b@;+K;ad#|p8@rFGEc|CEBM_EAb@&3RV=aNFYJaBo>(4Dwp!Qh@0S?wRe z;6Dmx;uL@=B-e2;Q?~G;p{m1@q759US9mlW$ZFChaU0^s3H8B zcOAM(qcJmM^XFr zF~fw`h1H8eE~7D>RdMdX+~r`^CS7jvPJ@iCz({pqNm7lWk5gY;!xoX zb~ojyG24rREmbQ+*gC$K(1su^X6;(huDThI#`K{p$=Sz8 z5))L2V|%ZH3~EfvH`(ix19aHO%`Q+Q?$Z#*e1x;3!*fh zV~1)vzf|HvSE!4jgD;$i5LUzmEeUU^(9o)v0k@>fOT+j4Jc3FGE%+BQsoHvENz2P6 zU=Vi5_qDS4n%9woPFzo&%C;Ss1Bk41xZ?xr9crVaHDR&U@Znm7>qL}&qelPqfVgrB z#9wM2($MoItedC{{BSLrjy2}Yz*P8)6D`NXDJ2%55H?w1x@D(KS9FQs&5hHCL6>{m zyAnfGBVnTIBI)E#abR**&2H{L&(hQ7u0ixr{KVv@-lz6!0z2N`N|ALbX6CJ;^ul=X zgG=AOEn9J1(MW!5IM0_*kK$jnS=a{1Yr?eUnus{v9m)A% z1Llq_EI+&hp5v9d)4?w#eu5-D-cpx*{bzTyykw+SqQ6fTe!5!Fqe||$Xe9htskBB5 z_x463oui_2+5`!^uHYBZ#K%tz-v_^TRAPVNRLy+lGcak79&s6o9?T7u*vM;5dWuYe zFCt`dJ&yB+=telmb)Kz8QB&bwM#EgyR=|DRHYWBtb}>?yjF9cUe!?Yox{Wqqzl?la ziG;7TLVKnWG>V^(+O;0euP0anOIi3zQ94DtiPjZ0Ygi;WE79SOa`f+GNbvt zc|~BhjhZI%C`Sg?IXQan>q2B9efL-K5&*Lc&vr*lk+5h zAK7#YE`fkvCf-FVJy!_;cFrh_7>DU$zu^G(1!?|FTwEF6J2i2Ib5N39FCSg`MjN|N z6@}rhPnvUv4F}|#3lYoyduR+i zU04e2co5%`w-yX!CE+s+S|kQ_tiuQ)gnKR0N*>_1zu2cm2@A z-#@I18r(4lzk@{WHOu%6uJ(9=-^>@6_%jUqb`G#qKH?@o5VKo|b`PF?B zitIrS`bEj6plM1?|=w%vZut}N#DOU}6QGMz1K@Q>>tHP*qElAC*fHrUS_ znmSy6GyD-)h2k_~i$_9e^t`(+pqtM{@d&LUA4qsxX_+DKwtt6|qA|0IL9;QjOwQo; z2iB(jbwfnM#EJ7oSmWJfwDE9Z+b*pL;J@P5Zd%4hAeiV-)^kBtw;HfdkHs=YHv>?I ze0;mBLpC)ytRe=ymUUT!4dHd$*~cl14}m#|`;d4q9HtBL_`#tYFNTDz?`+bZVDuj6lCNITf5HwplE2{`aby)X~7lmeAP1*&C#; zqv7zYYwQqMGCUDPw{k^acwl8Kodd{ua)G~yhc%M#+wYS{DcO@M118R2>>+^)+d-BS zvP_U{iqE+4{}({mb}BA%HQu1G67R43$#Sq^*bjSb-q=QmW#Sf9i1)suJ^i zY~m`-69R~5AikR&@@TKm5KqdYz;bSV~%th~U*2@d0 zOsaW#VnK0)y&{mPWK$!*0cZmB`^kggtqlw!wVHR2qGsU$qp}ZGQ8kDVeY!w;BDksk z@qaW}-+tuO7yXNu$eVay7jU~u3EzvaMAkqL&kpImJ;b)o=v>lagfe0yt)02>bsq1k z&zcMzZU6k2Yb&lMX}xp;eqASt2Un`4$_dmc6A2_N{|kA2shAi ztnfP@2Q5hIW?(krKF1BOq49lyY!#)bo zw}f%98mXR5;~&L}klV{FPonp4Ah#2OW84n^bD4#%``f!`7XLdnDmL6fP(6k}ZHc0d zJ_1kZ6-f0uji6Ra!p0p*NBEc6R;=8_82*Y&+CFB&`K2g)9~e&uOOwSF4YlQ(Uh^4Q!1Xj~o_=`m?cckS_HDx400RQiL=<)0Z#pQf ze4BTHZ?a#UJ~ecye8}?O5z*9)sXQiGo>$N;=;CyT-jq-DPeCddk$;3qoDCT60RMQ= zRQAwV1gk<96~(hrwI3X!XTObA7tcNTjS+aV1t`2u97>YKiBAp+Ny1#>AiH09$}Wo}*=G z;ZJXZ=4`n!Y-4}XlIEdeQgTHwS0QIfDp+scc;92u`}vbc&c|bWXSq7SI5 zGPEjCu`kfHwWDDj(B*Kf^Fl?~j}*zSRgn2hCLo zcAvNX9Is9D+iBj-GOSS6Kq@NBpm zjQcYV0CP2yGNi;Z{`rY4wu(Yf_4BW>ixUGWh%gOUo!YQ2iQM;R6}7@6ao0srXz<(& zCbHwzNBpd*=)fnf#y!xeyBPU2oBfAeqh6v_ZHFXNeXTNDJ!*CXJ0@`&02EuRT()|kk=bk%%4S%vo zH3+YuubEItT-rv>DBvfePzK<4v_>fv6&*+eL0TYAs_lPxflM^EFG)TTG1RLg-!^`N zOnNQh<$fibl;tuFyx-!*DQ)8H-GPqX&E+OHP602%<#BCo*8eN+N#x1h{~ry#kp}*R zK@QYre%FcV;VXGh$FqeUqf_BC@K4%Asyew#7xP9^%EYPGjqFAI^|I5TkxPb~mMQPB za?Jbb2+o1}qY)YFj-+J67;Mv__?~VR_9}2qS&at1g8^T$iCW?qOOt=}Pp2m6Rd65B z!kXKXN}AZQhTW>FzP*E@Q&b#*gD@r=09qXCp*imJ@FJMVI>#hT|=i;dkiY*CHXAEW5MHx!u)%{9~_BNL&V1!*u9ye z4%zhvpQtHkQel7`54{GU|DaTpQsI%UiaG|bgvdDJA9>G*1p|4oCKNJRzK{H`mYl{Ux}R%;y;O&f*F}NL z$>DEj9+LTArwKVYIU4zE#ayU79?z>GFRcJObmS3hC^;uLfm8+dp!|$L{USEXi$HSb z^-|tUs~!NG=)`l z;B{7%A$Ex-k|gk+5n(To+bDnWg5?Gd9ha5a%UJ!*X%O~tJdN)_TjZY>)R#o%uB_P3 z>Rya{FjJJtb4crwefYBP2Do`*T0Z30VJh4FL*3aPTgTLVV23%$d|AdgiMh?kup4Mrc zS8mS2R=~UDZ@tUn$zJ>C;>Uadp<$>>kTf*j2~>hh>iv=-rwa)6xVob~6OO8Fg?h4x z;mRRT1KICed?i?DL}kzZsqQB&t={E}yDh|=K9BJ5AdYWZkW&PACIVLm?i1xLC*r8! z<_%R74|objK0$K^A`~l14aN5r`R!pyiay~LJMLuXGLgAg;U{OqI9}isJJRhpd5HJW zvA~NcJUmbKuA9?U2yq?`KNsTl+TZ}_KTA~`f)S4LU?+Xz)#-QCeU}!5-KG_3+K9fBGF>ZC*=%X_?y_2$pb+U@ zP6HM`%YmctzcvUJSCxSKA*6&qj7=&J;A{9Tw`sQ~4nM>P;2?N9?(B$uBF+=Jdps5LQJSg3B5nn^gW< zm^de_x{k$~!A-`)mQaaUTztT~6QlMRx< zSrLMi-a~_^q()=Mvz?;$orv`4OqF2)OH|y>+CQ%@&Oj_uSq>MHDUP#)9BxhR zM9=zyKZcLB!9-cCVq?j4WFnZ6Gk*#zvJxr1Am5;5L+%KS5_4veCo+CF<$V!M*j6Xs z&(y?AMjtJg*~`|bBUX-JEsdWi3LIt!O=~3F1yMpW*U`mq)d*5ReM3J5Jyfct8KM%Ru-yQ9t)g z!Ew=Bwg)8>a{0f;g+JdZ41a;1|4k~rlE+I=eBxw~f5*v2&pEg?-?+PQd;z#A64;|L zfC<)u`Zt-Y7noi}^gi;EUBE#QFIr7^ z(A)~@>pZZFsBme5vf%wAu}S-eqHKC8Vz50^?JvD?lW-pXVnnxsgodwG(rgDW%~P54 zwH@c!9i5|!uLQpG+K7l9ZA#=HFBQn|lGK4*74A>OCj;TDJJ=#@RXuY^Q48?{HW!}@ zZuZ7`SZ0ReTZj{JRm(*~3ut|%*OU|Y(JPdF@YT?v?Cf83vB1_X2A|ld8WTO!=t%f> zi%9||(d{P;n|Q@a18eE=cI4>Zlk~_%ei`?WC~s@5RhR2RJiJ3&9?ZW_8}gh#iKT0( zR2bN*FLn;vNLNCtryDxdP?~lvRr~fP7bpwcn*4#|s`6xOB1mewPT*OCP^G7Pb#H-~ zNL*Pd_7e{GnkXo$YY-$WSP?Zf4IMC8a)juzin$U38o`TM*or@N>mel^*ur_+x}_R; z7^NapcItQZyr0t5P#M%fUN4p8?a6E$YWy=#GSqqW+3!!Rxqe`>IQ%ck=b&(YP&8J| zLo*IctpFAUe@SPvw#t-4B~x=BUp4xj4`b0Ck_8k!rWvx`WHbFx36zGGtZHi3)`Z{TG6k{lZif zTa9jE_U%#->I2{~4H440Q8R?3@?#yisi*-uIJB7i+Mr()g{k=K$?OnH#2H{basG$V znrm$!HaTUeWy=QkG#JWCtpY82%7jy5%jGI+j25;I?XzNQ(U$uVx35|Fx}kmS7?MdG zO94^4^d)3;+~*U1g#8nC&{k|Gb(U_WjTImn|5t8KsPszylY&JzpiyN>RDf>zO zEJfyB?wPW`N8xK@_w+UK&^^X6vjQd__BZhqI!)Y>*Apj1>2z$vu(e$9Zje-xo4Ag; zGKqZnN?Qa&cVQxq4=4#gumfA17t={ej6JI*isUZVYGP`I(^M@GW5 zUj}N`A1~}bi5%iNJ7Zs_43e#o^qBo7=V2fFS+2Afh zXb>>RKQo9)TQeL!<}4=%=Tc)`z&H?U+f#0a;H!fds0|=OCBT4B^1*yS%nWX3kEN=( zC8DL_8&$Y7@iR1Evm;9pYjv57^RM+faz{nfs6!1kC0^DkSKL}#?M-dI-fwz|oH;Gy z1~I;3wQi~_p>vEfYeBHE@(VR=bpC>S5tShpZ|G^UgHIY%<~Cqf`M2!UHv&RhknefXdI3PLZuC~T@%O5b@OZEp50 z2cDWVcHf;Mb%!If3?&h5;`DzUHQ-LVW%QFvC>wO8s^aSQR1>+{1uFl^P`RPJmqFO7 zgH-^hkMf3`+~Ld;dQW=KE#T$I_ef1#ZhXBe25AfmmkBdMN9BdDVQX~mrd-~4D)+hU zXmy_8j5h9V`X1T0qS62;kDJQRtMc0&o^bjo@5ax!I(Xx!bzevL5@F&;$bhvnwcQh5mSc!@^Q-;8Cm{_0YA4Ou}0v%o7l5QTqOT&7NOe)oOZia$3gIa&PuUP#wU{0z13 z#q)dWo`I=gfST&XJ6L{|y8Fith_hITs*NG?8y3RfyW`v1myICTO(7XWT`gh!;tl4L z$el?QruaADsT0Xz5dZ7wOx&UB-#>nzGiMgt82gekWesJBP|8Uqg-D4W%Csn@n0BSi zp-oA&swg9cHmRPZc+AnFg`$;88Br<9SYj|U=Xbup`2)^1*UWY9&*#4H_xttU5da-5 zvRd_dm7cJpI$=QsU%cHhAH4uiS(4L~lv{s0I&YelW=Jj;hzscK&_^2Nb)Of70ji^w zGiapHrq{eE#5s+zThwi}9; zHf6A-@Bd37=#i+|I%Vh8fi=#UY@4xa!*`!*sl4b^Vly^{aj4@F*D z(dt|GG+$)bqZ?tWg4(@1A8s@0)TD(W_)wlTOj6B^6!jcezcskh%|@Q8LMK}Io5DpT z>Qp4|hPpBu*5U2oxL(%1d4fFYqkZg7B$P?e2)N63rMXyT=o|@#dNCzUV2H_B?z5r_ z+tVJ;p3Vj?tpD@eh#u=;f>vVnC|NKKpy0)+=TqGgN)t_?4VeD@HdXiYYT?4#l-sWe zl7(}c{vJSr|Kk#^cw9M)o~+`CHXAhMZEk6>Qzzsf1J9;S{ENUxJk9CeZxyDR{!#rS zFIuD_%w%-mZ-zW;nGta_Z>Fs;Nd>3>=)57;aV3A$A^lDbcQ9YM`1XhP(v&+FI$F~2AY{^j- zh|`rf^2UPuVi3vm&UD=#DAJ;{SBX#G{X9I2jhd!ooD*GIVSCxJh_^gh?s3S=_b>^}M zJ9c*b5ywwFt2QtWxv^PAbXnWJ`O@mZ#8-%CqopU|v~i`p=)7>ZB?nhG()8u?s6+=2 z6OXN%w`fb=xHu3G+zPfQn3LURdgL9()Q0SDl;b(dYm6jkRD(bK4w{16dlM@kvxEy) zT%eH-=8y{_aljCHX~K+6cYcgUUUHfa8mqpKX^7JP_nVej)vyEk7-4qUvL{~woWT^v zs)7`e33(phPc7A8Cw@In$0wWKPu-&_cNYOo@wx2JDZD^Vvh!Nb`b>0lv!Svtz9+k6 zEad4UoJo_fbx(WR_o-(d{vM=5ZA9WEVjO&f^%9ha5i}D2aRBYyF^Pv(IIU~iMRZ<4 z{9Q$FuF=kfsL2*pMoigG8VfW7KS=3Dzv~nGRp&+bDV#A}7lx-i?%vVReE=-Xxk%#e zMU2D>Hrk+Sqm#nFHY~i{?IxvHSE28a`y3zD&R-&5+CsZrESfn3* z2eGCptt(#-TA4Rgumwr;XgJL?7yf%j*mGJ2q%#^7AmuA)-}<2yo3MjWZ*OWJ)!e*N zQ}!Ml7>Rn4g|j71sl#*!cs6+v8P)z^3@hOI%aF!cTF4H)Fvr-YKp4 zGm>RZu(yYDe%yEYDXe4TMzWn6Opb{-@t=25p4lwhsg}-Z4FJ#Jw9po7udEO zXi4FQ?qQ!eSL$AG_qYRUr-dEPEx*t9w3K`}ft2cqF8UoTy)c}UPMtlXc3;Cdz45mg z9a(`qbpV@bP^Oot-#AihuMGF*sA{rhbQtxs{=6NhGeT6Q;>c<6!@-E4^D&p@N8;H? zC1EHFo`#IjFr^(V{uAP+4sJ?>65KBzo)`)*=_)dH>1*5z-|GD2ubL5KgN1+1`2}DY zPPB69Iea7Ssbi9xiH%&g;T)j@y8a*GWKHRK_(dy@c2Iq%&Ld@C7ZQs!A=tIY6BOma7K zFD9cmJh%PebgKh{0MUTXP0Tdgg4$vk94?AXj{`pgk-C1`nY4!wb1vS1b>w~(>y80WsN=ND_n zyD}1=>mWI=!iawC?lmjHOU%_NMLhr032aJ7rUk7y9-@NkkR^N#B#TJF zgPYjh?TQ)e08_|={ScCq5!awYpO6>HXYHWc_T?@D9@? zRWT`zRlevnQolP@TT=Letkg){o<_qBqc78mh`s4k0~T&!DpHSD5=y)6XV}F&dB8f2 zv?xUS*bB$al6qBo{BMma@CWW=NJ57{k1G z)VC5$cu$uO@*`%7|6d85o=W?u$|?d*QEbIn4gNLyDI7b(%Ke3M)bdx-@2jYPni;e~ z+tvXsolMTv?0uD+w{zO%zpvbuRmtN_l?m-+p4>-BJ>_iu_;!mM*!X~}V!jjrx7(bUlsXb94uxr}0S^*NRx zFP-%OrwI#P|LD-(db*VqZEL?&`y9bJi7k&9%U*>Lb{z$owJ43lo3(-b!Pt2?pj*l`$zWyPbt^N3ZLaHS-Ob1D{phg7BP6*_6QCoV8F z(~Wc{c^c$+Yw+3UNUv@ZPnpQsE;5r9NT#9EGA0=N{3)`Xr>(F|uJwh~k=D*&3ROf` zsx#)|JwFf?;D~GtF)!7hRlXt;r8yN}X~-V&oI|Q!b^Xrkq4v?14tMIf-awxQKgn(R z01bQ)C1R4{MpI1fI9kkAwH7W|nz6%3^6AOIhNlUOdBjRDG^7lP_%k1FEs~5KU-ptg z=#xukh}SC_{nF}c@z^1DJM9AXx$@fL40U9ok>RdkuEkS5LT@94u;~8L&u>n~aCCrD zJjqK_P=G?q_k$WCp~_pg?}pJS3kz`hRI!UH|3gZ(xZS$(V-SNO+fUwaq3UOkBBs|8 zR}JAHx@9(QL4zxBGsN?~QAu!@0V0Z|#pmOY5NkmboQ-GyY3?4q-8?po_UZ;PBV58# z79;jQ*&X>-f+ASOp-sj|5y||s`l+oxx6+{5P|<#n&I$4RiI;GjS{U2DTE29E)q0Xu zWH2@1ILC=u-N9(Tp~^hS;h#*AuWLiP9hl{}?$h}t2B|X_$k?SU&;$qKu=!GVqHQ;Q zR0qT2##Id9>wXmX3>Whmt#L7^G|NYpt-nwr78>w35KRX$x(#?i^-8$3(MpTn(>OGR zVXf|X&l;OYCU3?Q%gm1i?NWC(jz^xRsS6gX^X}}YHYvAbGB*Q2|688>Bb+jSXbXoZ zc7OhgnK@d`ZC#d+$6mC|nQoy6qZon-jNgF?Tcy)nVI~BQl8yV2Kl>Kykq6L&Y?!ZnkxzRe z7c3cR>%U?1WKrA?Q@E-g^ZN(O5FDn#*!DFK!;l-b>gaf=H6l2&1D5EPu843Q;$eOS zniW7#7}9j&lRmAd|LiGqJ;~?%BEr#21NTr3xMjH$C+As`j>hOMOy)NWChjnUZq#P1 z=|8FVCY;DrdOUq)+$JqvBeLDqov2@F#=i+=frg?_zp*;5WWoV}!EJh_SL0Hac4LAZ zqUclbTMeEEbN^+9({<#5J89Q%LU)IwimtLmyAm*b0-(e4-t<7~XP9v49GPJ2nN|yF zu-BA`HZh}oxS6d`%?*h_Vs#{jgePu4;hzm9J;p?-r6>a`I?-4yGcvLn{5exQ5-i_4y9ZErp5(kCDT{$EUd{0zl@R_$b~&jyk~gR zm1YKSrqa?EipQbxNCpPkpj8Kzx-UPpTsTft$E9R&W!^CVkI7V-@@jma_{0Ak`|10c zqBHI88LWm=d|H2xt=gG-;Y3~~o8QTm#fWQ-83EoQwR^-`^UzOK)BGJ6+s{}iE=rar zU(%YfU0-4U$uPpu&N#iNhonP^>t_6hd5FS7($AMAN-^OQx~KdG{|R?kE)ydx+Ed_M zr?J<(A(?oT8akGqU^u^}>DG9Cm72bI=?)8+0eVA31Rxge_zF?Aa^B7+R`H=Z&geAjD6ydilUP~t<)?+-1hA68|he3MsCI= zHD+XdZFfCfH6qS*@Cj2qrH$9Qau;O0g$_fY6_Y07H`=O7#ShA0y=3o`WWTH26~$`9xh2Ge!O`%p5$IDpVtxo4%O{OwP;erOuGY-j3!sO(A7 z7j(-sX2%H!$SRnTarBh~u@{W#ACN}N)lKA2)GDmsAH+PIE>>R09cz(TJ$`q7Bx1sD z827g2T^nw%alzxUQPY+0?eNaJM8` z;jRx)k*_MsAaMs)9xYK>y@D|ZXUqRMzaOpW$bLNvNu$kAvMCW`l68y;4s{YW+=ee< z`2WvY*~w=_<-6mXHw1*y3zqWG69`>d&m*pkQX9MgqaJt8^-+e)q}wJB_|ww?I=$t& zxgM`(>a-yoP)@q3LmM;>PeRCq&|C0pJ`&sR4ZR=UUZcT4 z<}X$M4*483(N)?ra64haf+=-_(^P{Opfc)*Oq$_|2vb&qdZ`A!ORK|%He~`!G<#!k zd-t|n9a-ou_IcG%UWO5b8#rBu&qt8mJok%v;Hj@fpT`!Dl3?RM9n0c=m>T| z%4T=_%Te_zkSlZq+hxuWV^q^o z6&0`;QD4^}lWe)Mw_L*gAw(-;FCyda`rJB3S9%1w=4m9%eB;Ard^ds~wCc(hG>a+O z3sIpc867zj(xIKXHx_@01kS~q4Q55s3%)MvjSv<`lsUj@dgRFug^vp+(*p9h>g^se zTBQ}26T0q4@Ov5la~rI#GKACl*N{>NPfujJuN`@K3UUJJ_lIMH*#`7HxJ*dhX!EH| zGs=2ey>y9QmNlLZYcv&)^$CIs+SuWRiaOuxG6xQXx6{Fs7>h9EKLrDSv`H_`4w;46 z8}W?cGY20+X>c~xk_Fn{)EtF#tNW9V1lJH+23PrEX61snwr?lI^F`bM&=lpC@S&E$ zBc63=H}D7{Dx110v0->liMXq5Y=7Q~=Xv}G$Rvjx)k*_mELi=+=;Gjqs5`qjS((h- zgWiBrI-h=AU5o2vWA@|m@yf=gzV5x$!_atYOj1(>8WF$fNdJE{u1~dNS`^|huiw86 zp7uwV5`ktR2@^?!ks#=@!Dm3>J6420w6&+^xQ@Ozj+i=AcmdV^mlbhvJH#l|hpHAi zBN2%GN4R^{h`xNS;|N)znQ^IqOu6LLqjvML*t_$R;Px}ZW%x-t6dQC#eDXHhDaOJ51C^~tQL&IYcmnJWAm}EL>P`2e?MEY7P^j%(SC`Vr9~7(_xOLSWvl?R@oqPcmWq9d7AfNW(&QjWr@N=niGQ z7nETegF_ZhN@W<3?t6HIE*+eiflO9JUsBP*CE7Q-6C|}G-UE^3l!>i(mcMLEj4bxb zI<;q65A|YM@BTEf*o+Aa4}(*2EZALE*$kB@2Ca)lPvk&^nU&)JX2XIaR=y zy>k9gKp!!3OlGzNoYWQ5=)YA~NS{*=cF9sv<+Qihg1ImZiL{;o6mDv5O!n*gjpX4D zMjJxDmj1Jj%Fz)AZ2lAdt#6J2@!v`1BL$7A|9J1c&Cl{(MS<*rp|=k{sTZR2O|&QQu>8+!R+trlB3Zi-{7N!b(grAZ)C` z9t<0zE2n>*O&`-M}rm0M`;^GwZ}eMx0GnS z2(EAxJ5XaptI;FXh`fk~EEUjG6ofMup9Qw`DVP1vVwLU)b#&6SR_gLwEU|JFVn1`h zXD>AUZ2A5^f3)SX&OMlZ@&TlqYatIh@Spf;uOazGgWQz)TD-+D+X{3#=_1K114Y)~ z=o@NbPiEPxqyP3k$)`r$l!VTJb@y7O%H3vKlKYH%T7(g7`CBm)&#Y52P<5?sf5Mit z2IBeWy<@_})$WVavXF-HGVPE|eU`xFKlkh^M}6(@^X@}@Ce0{+!1bk$=)px!sVgT< zqG*z8A*atT@iQP-3NEdfGm#v#2^@)}Nqj%X^JAd>b&cs_Hk>vVNOhClm?`f1<>%A>I2Wwj?Sf% z2KuIe4w2LET#>$x{9YD96x}PtX{xRr`7KLZJC2xZqWx6-l8&c22U#zsj)VH?)Dli8UKM@})bA={TlY+o@e%K#l?GY*)Dn>(l2ALXWVjiKtvkN1P8kf=+Ch#L$x zf3!^N7bharj`np&Acig1UTg9L0J`J)-`Q7rrD~FMpTU%O|Kk@K5Qm&(n}prj(6wqZ?F{9Xtk$5|oK8NVBnv+UVMC(1j(c;a(fuL^GiGS2#{WB)M_M%66 zh4_}*aPWf-c`ZoO2eIuvZ6Q9A) z3VoWzYlE0xXqS4RG#H_QgH5GHYS@6NEybf}iaI{dw(26IWXn6K`%fIsl(_a$Vf%a= zS}llF@cumqNt;E)8R`bQd|qx)nsowOzs3uH&5WRTz71MPp;6adQHV276OE z`x+S!+k)2eZ>N3^N-{EaXZ~_0J-0GKtVy>!3?5TKovk?g-u|{zT~i7AQ?hSv)GEh2 z|DNQ|%^eeUk$)96`NJ}|5LnM&a^}%8&h>%vQtfFow-_7yRaajaJ9+-aOD5NS#;S_G zf9c!(C#fa#%B(eCT<7Yoj0>~ddVVDL$3s)pkP)a260MGW0sXFfLz(4t0p@ACzyepw zE+y-+E%e<(zM~D+I2+ENPS+!&ZAK^V5x`AImuWrPD{NvkYx-D)8e3$rE&)G>0kbD$ zH=3WPY7u;`spwr4RY`{hsDtNjo^XU3FKByZlxx@O^75sh4Zk|a+0Kh9igq=I*y-x2 zhRa&UBX9wYsQ%eIVQwZr{qPF0XWtF!zmL+ziXAy?x~aOl+&t>dv#=*%?MvP2@VU$E zXj+QjA1w%jfN7)HT~UxoTUvL2Xn7nq+$tOLNjQGw_a&nz4*yI3bsqSqr8AX^kUVllCIr zY{na-^*d3OKEHCbQNW&-SXcSccw`_(PhR7}9EWoLA=%Vn4&enKQNmK5TD(cq3EvF7 zT8RA3MTqTOkoQ=g5l>S-9Q6h{V5-62m~sH)_~~;+9nbd^U!79{{#b_@EMa(i>?e6# zi^a%mgT%}MSirv!Q@!1CzwI8m@xzlx5z>{u1xbclT$3o{WRCN$xCzs#nfI z5IA6a)m$MJrgOLad05Mu0fv)lLT_;Bf#G{K()jaSc@^w)*QnqA zh3J{Edh|+uL-xvL89?511wpl<8+1ZAyn!W9iQ#lqx0lb{F5M#(cd=Ubp=Grw=MA-G z;8x)wR~@`!6U};$aAN$j)+ZjZI}lvMdamfKJK7AuWIxTeH2*rMAN`#6vs zsE6jBIs3d6g1(FOKsgS;)~f`*O6{Auesw6vi2n)#4MTFPInzhkpiWGuG{`~VG^L6B zYcFE(X;@w{77;#&pGqi>s1H5qCRqyoEhn7kt%QH_m5nc`g9xsJ#s+rg$!h3K*EU6w z8^>^4aDG_Oxz8QDGoNiwK|R@1iC`wIHUf!`D0L`-hZ{l1Wo^PAHqUMoH?C5z>pi91 z^5We~Y6^rz4gcT{PVRVehgxMuGfiYGqf+PdpFAH7Q|cuv*d41CMm-?m zdFP7MI>(6nk6k69I^^v|9La2AfXO6ZRc@6ZQHTGX%94+ijsv(R9cDgU~L>+-6M)l}z< z1&DAQx@$7onKBtGr{9G?RHhq^s}-0guZ@&AYH&FGy17A2%$dB~7;$>9)8tWGH#y;Z zhN9VYG9mlnw92Vz*5JvIO`8D(aze-L!dp;CedA#h7CIMVVcA%SC_y0D+K|MFPvx4x z;l-ss)idRh+)IpZSCpeqjHY2vK%80)!$U0u6%K+V?)fbkoa9JuUZeVp5coC1_!E6Z zEl@f4DT=JDUsTI>XHF%&CbHF0AnY1y;Xo5ET!lP1t#SA2*`cc$($K1uX6YKL$PR^= zsnq+4sgybUvFZ>F6*pM7{4Wj=}jnRz~EdY(D z;jkexAUfJGLJPK;!C}$;CqKn$Je*Z^&(3Rx?}%mARG6=32j|V32W#Op!cVTU00F9~ z9$@fw_jzmMzVGP})d+L5cDncB?q?UHUI+&yW~_ z+ja=dH<8M%C#z#l`qcbAP$sQiF#M!V++FiNW14bVx*;w=>jM3dcIwXj{jzW{WagrT z?LqNL4v8Yq7{1!jIIr?+|Bt!}UaGuzFQm8C!NI{VA+aagE(ShstEu1-n1*%XoTmew zHW`HVFe9S$ZTG z#Rey!%>`mM@Amy5d}nzTgPzuLC~@RUfHv~=rwJco7)RXr5fx~yK631c4}EMX6+fQm zo$a}Crn>R2SbDw)_8(`!YGhV^Kv*^JXn*Xa%NoZHU);+K(GhR<~Hbz71A$(F&(mI%C3turt?c7XVHt2LncqMoK1l)={!a z95G`Kk^~L5?|quTjtEqZHD{Vgx?yyq2zB1ro>qNwMU$Di}>BW zcmr~AT*D?vaA(Urfp`o)Uit)@YI)T8Yf1WCZ@&2A2ZnWxYMu^Jgw)yn4Nl_WBa~uf zj-e)R`ky$QH-LV`$>qzqvXN8+44fwaf|btXyzOzB51uU^I*{E@^o2!MG&9}4?4xOP z9FYB)c?2QzEhmTtBf3AWuA%-WBEbc3DAz&|s|>FGTH+V@GZVGma3?_Gc?4Lf_gzz2 zy*(4x=i4$a*a&_hjW=!W$8ff7Yrslp0Dt;M=a8BAR%=l0&mTeFcZ9Axr9TPJ>%@Jejq{3^T~H&0c`sF;Z`~;QgQjt01#KW;3zx(pr=F~aO`CTQ z90#KB8_1k@$v!L2Iygk=#_}K>D?ipei<9LGtN%E5?%9!*)SmU9>g7>lx=9F+l%EE2 z9pbNnZzE=3=kT&R-b(t@ctiTr`!$*BC9+E6S zXw82OJ`9YH!9hId8sqS95U!&sEKuL{i6}NgN^`&-P~>E0c{rP4OmM zL=p9QN=5fc&lk%|wFEQ~!E_+oWK*9w|AUgUq;q?}O9KmU$hAH8F)MfVAK25jSh6hP z%i)WO%4J$DYp-PG&+@1`j;9rh@QtvNCA_;r#gVQ*oNAC*LPy8|4m?7&rLs z+m;Y-Agi8H6rtOk-+(zVz6Vv()PnxZQ;glO)N$XVcMWCTiax$gcz293)WsmU^KoX= zgh5#JB6$UOvBO6QW0zi?LM)xCoB*-wU*~Ly@5q^jHCOhDB2YL^v=qdnn@CT1hN2whzMIO1wgm{~^UVT4xM@^Aw~0%U=D zQ0cqXhC_Yj`&b(iy9hJ&EJnk5;iE#B#SOkbUq+@ul_L|vII>JlG`n*H~uJF454ncE*xHBAW$ov@4qRs-*MnpbDLcHdg;A` z_sg&LBu&u#I+eb}86%5s>Ae8FpwP#PA&IsbTYavVv)r|*yiI(wf6Z_r@TZQv*chGg zzBl_mOfAzE&Rq)sb{>fP$@(nlEm~vw=gKtIr!r}uT9IH`9+2VS3hPk&4UAu>KA`CW zNuds}5u_7-lzhg(ZTrv66r&@TP$xEAL=QW_{Red;Q`k#5CaePtu#eOp~QzBqLVIA%8_V*;LLz~pHy^x#dp1+Sse9Im($~w=cZ4F*ldx? zCY?Bei3Gws$Ik*E^ADujM0VYdU kP_CM#E}BBL1TK(^k;y#MDsJ57JfJ^wXV0Hi;ww!3Kg^`nX#fBK literal 0 HcmV?d00001 diff --git a/project/resource/texts/bg_BG.lang b/project/resource/texts/bg_BG.lang new file mode 100644 index 0000000..0d537d7 --- /dev/null +++ b/project/resource/texts/bg_BG.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Този анти-чийт е създаден от най-добрите създатели на Minecraft и също така използва най-добрата функционалност на Minecraft, за да забрани тези хакери и да защити вашия сървър или всяко творение, което искате да запазите. + diff --git a/project/resource/texts/cs_CZ.lang b/project/resource/texts/cs_CZ.lang new file mode 100644 index 0000000..9c62ee8 --- /dev/null +++ b/project/resource/texts/cs_CZ.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Tento anti-cheat byl vytvořen nejlepšími tvůrci Minecraftu a také využívá špičkovou funkci Minecraftu k zákazu těchto hackerů a ochraně vašeho serveru nebo jakéhokoli výtvoru, který chcete mít v bezpečí. + diff --git a/project/resource/texts/da_DK.lang b/project/resource/texts/da_DK.lang new file mode 100644 index 0000000..fc6c7bf --- /dev/null +++ b/project/resource/texts/da_DK.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Denne anti-cheat blev skabt af Minecrafts topskabere og bruger også Minecrafts topfunktionalitet til at forbyde disse hackere og beskytte din server eller enhver skabelse, du ønsker at holde sikker. + diff --git a/project/resource/texts/de_DE.lang b/project/resource/texts/de_DE.lang new file mode 100644 index 0000000..4f870ab --- /dev/null +++ b/project/resource/texts/de_DE.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Dieser Anti-Cheat wurde von den Top-Entwicklern von Minecraft entwickelt und nutzt auch die Top-Funktionalität von Minecraft, um diese Hacker zu verbieten und Ihren Server oder jede Kreation zu schützen, die Sie schützen möchten. + diff --git a/project/resource/texts/el_GR.lang b/project/resource/texts/el_GR.lang new file mode 100644 index 0000000..e260036 --- /dev/null +++ b/project/resource/texts/el_GR.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Αυτό το anti-cheat δημιουργήθηκε από τους κορυφαίους δημιουργούς του Minecraft και χρησιμοποιεί επίσης την κορυφαία λειτουργικότητα του Minecraft για να απαγορεύσει αυτούς τους χάκερ και να προστατεύσει τον διακομιστή σας ή οποιαδήποτε δημιουργία θέλετε να κρατήσετε ασφαλή. + diff --git a/project/resource/texts/en_GB.lang b/project/resource/texts/en_GB.lang new file mode 100644 index 0000000..73bfa65 --- /dev/null +++ b/project/resource/texts/en_GB.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=This anti-cheat was created by Minecraft's top creators and also uses Minecraft's top functionality to ban those hackers and protect your server or any creation you want to keep safe. + diff --git a/project/resource/texts/en_US.lang b/project/resource/texts/en_US.lang new file mode 100644 index 0000000..73bfa65 --- /dev/null +++ b/project/resource/texts/en_US.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=This anti-cheat was created by Minecraft's top creators and also uses Minecraft's top functionality to ban those hackers and protect your server or any creation you want to keep safe. + diff --git a/project/resource/texts/es_ES.lang b/project/resource/texts/es_ES.lang new file mode 100644 index 0000000..b1a7573 --- /dev/null +++ b/project/resource/texts/es_ES.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Este anti-trampas fue creado por los principales creadores de Minecraft y también utiliza la funcionalidad principal de Minecraft para prohibir a esos piratas informáticos y proteger su servidor o cualquier creación que desee mantener segura. + diff --git a/project/resource/texts/es_MX.lang b/project/resource/texts/es_MX.lang new file mode 100644 index 0000000..b1a7573 --- /dev/null +++ b/project/resource/texts/es_MX.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Este anti-trampas fue creado por los principales creadores de Minecraft y también utiliza la funcionalidad principal de Minecraft para prohibir a esos piratas informáticos y proteger su servidor o cualquier creación que desee mantener segura. + diff --git a/project/resource/texts/fi_FI.lang b/project/resource/texts/fi_FI.lang new file mode 100644 index 0000000..2b0e8fa --- /dev/null +++ b/project/resource/texts/fi_FI.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Tämän huijauksen eston ovat luoneet Minecraftin parhaat luojat, ja se käyttää myös Minecraftin huipputoimintoja estääkseen hakkerit ja suojellakseen palvelintasi tai mitä tahansa luomusta, jonka haluat pitää turvassa. + diff --git a/project/resource/texts/fr_CA.lang b/project/resource/texts/fr_CA.lang new file mode 100644 index 0000000..b57be97 --- /dev/null +++ b/project/resource/texts/fr_CA.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Cet anti-triche a été créé par les meilleurs créateurs de Minecraft et utilise également les meilleures fonctionnalités de Minecraft pour interdire ces pirates et protéger votre serveur ou toute création que vous souhaitez protéger. + diff --git a/project/resource/texts/fr_FR.lang b/project/resource/texts/fr_FR.lang new file mode 100644 index 0000000..b57be97 --- /dev/null +++ b/project/resource/texts/fr_FR.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Cet anti-triche a été créé par les meilleurs créateurs de Minecraft et utilise également les meilleures fonctionnalités de Minecraft pour interdire ces pirates et protéger votre serveur ou toute création que vous souhaitez protéger. + diff --git a/project/resource/texts/hu_HU.lang b/project/resource/texts/hu_HU.lang new file mode 100644 index 0000000..5e08073 --- /dev/null +++ b/project/resource/texts/hu_HU.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Ezt a csalás elleni védelmet a Minecraft legjobb alkotói hozták létre, és a Minecraft legfőbb funkcióit is használja a hackerek kitiltására, valamint a szerver vagy a biztonságban tartani kívánt alkotások védelmére. + diff --git a/project/resource/texts/id_ID.lang b/project/resource/texts/id_ID.lang new file mode 100644 index 0000000..36877a4 --- /dev/null +++ b/project/resource/texts/id_ID.lang @@ -0,0 +1,3 @@ +pack.name=l§o§kii§r cRubedo fRES 7v1.0.0 +pack.description=Anti-cheat ini dibuat oleh pembuat top Minecraft dan juga menggunakan fungsionalitas teratas Minecraft untuk melarang peretas tersebut dan melindungi server Anda atau kreasi apa pun yang ingin Anda jaga agar tetap aman. + diff --git a/project/resource/texts/it_IT.lang b/project/resource/texts/it_IT.lang new file mode 100644 index 0000000..8a23c64 --- /dev/null +++ b/project/resource/texts/it_IT.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Questo anti-cheat è stato creato dai migliori creatori di Minecraft e utilizza anche le migliori funzionalità di Minecraft per bandire quegli hacker e proteggere il tuo server o qualsiasi creazione che desideri tenere al sicuro. + diff --git a/project/resource/texts/ja_JP.lang b/project/resource/texts/ja_JP.lang new file mode 100644 index 0000000..784a988 --- /dev/null +++ b/project/resource/texts/ja_JP.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cルベド §fRES §7v2.0.0 +pack.description=このチート対策は Minecraft のトップ クリエイターによって作成され、Minecraft のトップ機能を使用してそれらのハッカーを禁止し、サーバーや安全に保ちたいすべての作品を保護します。 + diff --git a/project/resource/texts/ko_KR.lang b/project/resource/texts/ko_KR.lang new file mode 100644 index 0000000..bf27a8d --- /dev/null +++ b/project/resource/texts/ko_KR.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=이 안티 치트는 Minecraft의 최고 제작자에 의해 만들어졌으며 Minecraft의 최고 기능을 사용하여 해당 해커를 차단하고 서버 또는 안전하게 유지하려는 모든 창작물을 보호합니다. + diff --git a/project/resource/texts/language_names.json b/project/resource/texts/language_names.json new file mode 100644 index 0000000..fe53bf6 --- /dev/null +++ b/project/resource/texts/language_names.json @@ -0,0 +1,118 @@ +[ + [ + "en_US", + "English (US)" + ], + [ + "en_GB", + "English (UK)" + ], + [ + "de_DE", + "Deutsch (Deutschland)" + ], + [ + "es_ES", + "Español (España)" + ], + [ + "es_MX", + "Español (México)" + ], + [ + "fr_FR", + "Français (France)" + ], + [ + "fr_CA", + "Français (Canada)" + ], + [ + "it_IT", + "Italiano (Italia)" + ], + [ + "ja_JP", + "日本語 (日本)" + ], + [ + "ko_KR", + "한국어 (대한민국)" + ], + [ + "pt_BR", + "Português (Brasil)" + ], + [ + "pt_PT", + "Português (Portugal)" + ], + [ + "ru_RU", + "Русский (Россия)" + ], + [ + "zh_CN", + "简体中文 (中国)" + ], + [ + "zh_TW", + "繁體中文 (台灣)" + ], + [ + "nl_NL", + "Nederlands (Nederland)" + ], + [ + "bg_BG", + "Български (BG)" + ], + [ + "cs_CZ", + "Čeština (Česká republika)" + ], + [ + "da_DK", + "Dansk (DA)" + ], + [ + "el_GR", + "Ελληνικά (Ελλάδα)" + ], + [ + "fi_FI", + "Suomi (Suomi)" + ], + [ + "hu_HU", + "Magyar (HU)" + ], + [ + "id_ID", + "Bahasa Indonesia (Indonesia)" + ], + [ + "nb_NO", + "Norsk bokmål (Norge)" + ], + [ + "pl_PL", + "Polski (PL)" + ], + [ + "sk_SK", + "Slovensky (SK)" + ], + [ + "sv_SE", + "Svenska (Sverige)" + ], + [ + "tr_TR", + "Türkçe (Türkiye)" + ], + [ + "uk_UA", + "Українська (Україна)" + ] +] \ No newline at end of file diff --git a/project/resource/texts/languages.json b/project/resource/texts/languages.json new file mode 100644 index 0000000..d20bd32 --- /dev/null +++ b/project/resource/texts/languages.json @@ -0,0 +1,31 @@ +[ + "en_US", + "en_GB", + "de_DE", + "es_ES", + "es_MX", + "fr_FR", + "fr_CA", + "it_IT", + "ja_JP", + "ko_KR", + "pt_BR", + "pt_PT", + "ru_RU", + "zh_CN", + "zh_TW", + "nl_NL", + "bg_BG", + "cs_CZ", + "da_DK", + "el_GR", + "fi_FI", + "hu_HU", + "id_ID", + "nb_NO", + "pl_PL", + "sk_SK", + "sv_SE", + "tr_TR", + "uk_UA" +] \ No newline at end of file diff --git a/project/resource/texts/nb_NO.lang b/project/resource/texts/nb_NO.lang new file mode 100644 index 0000000..4bab03a --- /dev/null +++ b/project/resource/texts/nb_NO.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Denne anti-juksen ble laget av Minecrafts beste skapere og bruker også Minecrafts toppfunksjonalitet for å utestenge disse hackerne og beskytte serveren din eller en hvilken som helst kreasjon du vil holde trygg. + diff --git a/project/resource/texts/nl_NL.lang b/project/resource/texts/nl_NL.lang new file mode 100644 index 0000000..7a4ee90 --- /dev/null +++ b/project/resource/texts/nl_NL.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Deze anti-cheat is gemaakt door de beste makers van Minecraft en gebruikt ook de topfunctionaliteit van Minecraft om die hackers te verbannen en je server of elke creatie die je veilig wilt houden te beschermen. + diff --git a/project/resource/texts/pl_PL.lang b/project/resource/texts/pl_PL.lang new file mode 100644 index 0000000..768cee2 --- /dev/null +++ b/project/resource/texts/pl_PL.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Ten anty-cheat został stworzony przez najlepszych twórców Minecrafta, a także wykorzystuje najlepsze funkcje Minecrafta do blokowania tych hakerów i ochrony serwera lub dowolnego dzieła, które chcesz zabezpieczyć. + diff --git a/project/resource/texts/pt_BR.lang b/project/resource/texts/pt_BR.lang new file mode 100644 index 0000000..67bfad6 --- /dev/null +++ b/project/resource/texts/pt_BR.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Este anti-cheat foi criado pelos principais criadores do Minecraft e também usa a principal funcionalidade do Minecraft para banir esses hackers e proteger seu servidor ou qualquer criação que você queira manter segura. + diff --git a/project/resource/texts/pt_PT.lang b/project/resource/texts/pt_PT.lang new file mode 100644 index 0000000..67bfad6 --- /dev/null +++ b/project/resource/texts/pt_PT.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Este anti-cheat foi criado pelos principais criadores do Minecraft e também usa a principal funcionalidade do Minecraft para banir esses hackers e proteger seu servidor ou qualquer criação que você queira manter segura. + diff --git a/project/resource/texts/ru_RU.lang b/project/resource/texts/ru_RU.lang new file mode 100644 index 0000000..2716ec6 --- /dev/null +++ b/project/resource/texts/ru_RU.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Этот античит был создан лучшими создателями Minecraft, а также использует лучшие функциональные возможности Minecraft для блокировки этих хакеров и защиты вашего сервера или любого творения, которое вы хотите сохранить в безопасности. + diff --git a/project/resource/texts/sk_SK.lang b/project/resource/texts/sk_SK.lang new file mode 100644 index 0000000..e6d615a --- /dev/null +++ b/project/resource/texts/sk_SK.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Tento anti-cheat bol vytvorený špičkovými tvorcami Minecraftu a tiež využíva špičkové funkcie Minecraftu na zákaz týchto hackerov a ochranu vášho servera alebo akéhokoľvek výtvoru, ktorý chcete zachovať v bezpečí. + diff --git a/project/resource/texts/sv_SE.lang b/project/resource/texts/sv_SE.lang new file mode 100644 index 0000000..a76734b --- /dev/null +++ b/project/resource/texts/sv_SE.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Detta anti-fusk skapades av Minecrafts främsta skapare och använder även Minecrafts toppfunktioner för att förbjuda dessa hackare och skydda din server eller någon skapelse du vill hålla säker. + diff --git a/project/resource/texts/tr_TR.lang b/project/resource/texts/tr_TR.lang new file mode 100644 index 0000000..52e49df --- /dev/null +++ b/project/resource/texts/tr_TR.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Bu hile karşıtı, Minecraft'ın en iyi yaratıcıları tarafından oluşturuldu ve aynı zamanda bu bilgisayar korsanlarını yasaklamak ve sunucunuzu veya güvende tutmak istediğiniz herhangi bir ürünü korumak için Minecraft'ın en iyi işlevselliğini kullanıyor. + diff --git a/project/resource/texts/uk_UA.lang b/project/resource/texts/uk_UA.lang new file mode 100644 index 0000000..249941d --- /dev/null +++ b/project/resource/texts/uk_UA.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=Цей античіт був створений найкращими творцями Minecraft, а також використовує найкращі функції Minecraft, щоб заборонити цих хакерів і захистити ваш сервер або будь-яке творіння, яке ви хочете зберегти. + diff --git a/project/resource/texts/zh_CN.lang b/project/resource/texts/zh_CN.lang new file mode 100644 index 0000000..7e8cecb --- /dev/null +++ b/project/resource/texts/zh_CN.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=这种反作弊是由 Minecraft 的顶级创作者创建的,并且还使用 Minecraft 的顶级功能来禁止这些黑客并保护您的服务器或您想要保持安全的任何创作。 + diff --git a/project/resource/texts/zh_TW.lang b/project/resource/texts/zh_TW.lang new file mode 100644 index 0000000..7e8cecb --- /dev/null +++ b/project/resource/texts/zh_TW.lang @@ -0,0 +1,3 @@ +pack.name=§l§o§kii§r §cRubedo §fRES §7v2.0.0 +pack.description=这种反作弊是由 Minecraft 的顶级创作者创建的,并且还使用 Minecraft 的顶级功能来禁止这些黑客并保护您的服务器或您想要保持安全的任何创作。 + diff --git a/project/resource/ui/chest_screen.json b/project/resource/ui/chest_screen.json new file mode 100644 index 0000000..4bef10f --- /dev/null +++ b/project/resource/ui/chest_screen.json @@ -0,0 +1,283 @@ +{ + "namespace": "chest", + + "chest_label": { + "$new_container_title|default": "$container_title", + "text": "$new_container_title", + "controls": [ + { + "dynamic_title_stack_panel": { + "type": "stack_panel", + "controls": [ + { + "dynamic_title": { + "type": "panel" + } + } + ] + } + } + ] + }, + + "small_chest_grid": { + "type": "grid", + "size": [162, 54], + "anchor_from": "top_left", + "anchor_to": "top_left", + "grid_dimensions": [9, 3], + "grid_item_template": "chest.chest_grid_item", + "collection_name": "container_items" + }, + + "45_grid": { + "type": "grid", + "size": [162, 90], + "anchor_from": "top_left", + "anchor_to": "top_left", + "grid_dimensions": [9, 5], + "grid_item_template": "chest.chest_grid_item", + "collection_name": "container_items" + }, + + "54_grid": { + "type": "grid", + "size": [162, 108], + "anchor_from": "top_left", + "anchor_to": "top_left", + "grid_dimensions": [9, 6], + "grid_item_template": "chest.chest_grid_item", + "collection_name": "container_items" + }, + + "81_grid": { + "type": "grid", + "size": [162, 162], + "anchor_from": "top_left", + "anchor_to": "top_left", + "grid_dimensions": [9, 9], + "grid_item_template": "chest.chest_grid_item", + "collection_name": "container_items" + }, + + "108_grid": { + "type": "grid", + "size": [216, 162], + "anchor_from": "top_left", + "anchor_to": "top_left", + "grid_dimensions": [12, 9], + "grid_item_template": "chest.chest_grid_item", + "collection_name": "container_items" + }, + + "small_chest_panel_top_half": { + "type": "panel", + "size": ["100%", "50%"], + "offset": [0, 12], + "anchor_to": "top_left", + "anchor_from": "top_left", + "controls": [ + { "chest_label@chest.chest_label": {} }, + { + "small_chest_grid@chest.small_chest_grid": { + "offset": [7, 9] + } + } + ] + }, + + "45_panel_top_half": { + "type": "panel", + "size": ["100%", 132], + "offset": [0, 11], + "anchor_to": "top_left", + "anchor_from": "top_left", + "controls": [ + { "chest_label@chest.chest_label": {} }, + { + "large_chest_grid@chest.45_grid": { + "offset": [7, 10] + } + } + ] + }, + + "54_panel_top_half": { + "type": "panel", + "size": ["100%", 132], + "offset": [0, 11], + "anchor_to": "top_left", + "anchor_from": "top_left", + "controls": [ + { "chest_label@chest.chest_label": {} }, + { + "large_chest_grid@chest.54_grid": { + "offset": [7, 10] + } + } + ] + }, + + "81_panel_top_half": { + "type": "panel", + "size": ["100%", 132], + "offset": [0, 11], + "anchor_to": "top_left", + "anchor_from": "top_left", + "controls": [ + { "chest_label@chest.chest_label": {} }, + { + "large_chest_grid@chest.81_grid": { + "offset": [7, 10] + } + } + ] + }, + + "108_panel_top_half": { + "type": "panel", + "size": ["100%", 132], + "offset": [0, 11], + "anchor_to": "top_left", + "anchor_from": "top_left", + "controls": [ + { "chest_label@chest.chest_label": {} }, + { + "large_chest_grid@chest.108_grid": { + "offset": [7, 10] + } + } + ] + }, + + "small_root_panel@common.root_panel": { + "$chest_panel|default": "chest.small_chest_panel_top_half", + "layer": 1, + "controls": [ + { "common_panel@common.common_panel": {} }, + { + "chest_panel": { + "type": "panel", + "layer": 5, + "controls": [ + { "small_chest_panel_top_half@$chest_panel": {} }, + { + "inventory_panel_bottom_half_with_label@common.inventory_panel_bottom_half_with_label": {} + }, + { "hotbar_grid@common.hotbar_grid_template": {} }, + { + "inventory_take_progress_icon_button@common.inventory_take_progress_icon_button": {} + } + ] + } + }, + { + "inventory_selected_icon_button@common.inventory_selected_icon_button": {} + }, + { "gamepad_cursor@common.gamepad_cursor_button": {} } + ] + }, + + "45_root_panel@small_root_panel": { + "size": [176, 184], + "$chest_panel": "chest.45_panel_top_half" + }, + + "54_root_panel@small_root_panel": { + "size": [176, 220], + "$chest_panel": "chest.54_panel_top_half" + }, + + "81_root_panel@small_root_panel": { + "size": [176, 275], + "$chest_panel": "chest.81_panel_top_half" + }, + + "108_root_panel@small_root_panel": { + "size": [230, 275], + "$chest_panel": "chest.108_panel_top_half" + }, + + "small_chest_panel": { + "type": "panel", + "controls": [ + { "container_gamepad_helpers@common.container_gamepad_helpers": {} }, + { + "flying_item_renderer@common.flying_item_renderer": { + "layer": 11 + } + }, + { + "selected_item_details_factory@common.selected_item_details_factory": { + "control_name": "@chest.selected_item_details" + } + }, + { + "item_lock_notification_factory@common.item_lock_notification_factory": { + "control_name": "@common.item_lock_notification" + } + }, + { + "root_panel@$root_panel": {} + } + ] + }, + "small_chest_screen@common.inventory_screen_common": { + "$close_on_player_hurt|default": true, + "close_on_player_hurt": "$close_on_player_hurt", + "$root_panel|default": "chest.small_root_panel", + "$new_container_title|default": "$container_title", + "$container_size|default": 27, + "variables": [ + { + "requires": "($container_title = 'size:45')", + "$root_panel": "chest.45_root_panel", + "$new_container_title": "Chest GUI", + "$container_size": 45 + }, + { + "requires": "($container_title = 'size:54')", + "$root_panel": "chest.54_root_panel", + "$new_container_title": "Chest GUI", + "$container_size": 54 + }, + { + "requires": "($container_title = 'size:81')", + "$root_panel": "chest.81_root_panel", + "$new_container_title": "Chest GUI", + "$container_size": 81 + }, + { + "requires": "($container_title = 'size:108')", + "$root_panel": "chest.108_root_panel", + "$new_container_title": "Chest GUI", + "$container_size": 108 + }, + { + "requires": "$desktop_screen", + "$screen_content": "chest.small_chest_panel", + "$screen_bg_content": "common.screen_background" + }, + { + "requires": "$pocket_screen", + "$container_title": "$new_container_title", + "$screen_content": "pocket_containers.panel" + } + ] + }, + "ender_chest_screen@common.inventory_screen_common": { + "$close_on_player_hurt|default": true, + "close_on_player_hurt": "$close_on_player_hurt", + "variables": [ + { + "requires": "$desktop_screen", + "$screen_content": "chest.small_root_panel", + "$screen_bg_content": "common.screen_background" + }, + { + "requires": "$pocket_screen", + "$screen_content": "pocket_containers.ender_chest_panel" + } + ] + } +} diff --git a/project/resource/ui/pocket_containers.json b/project/resource/ui/pocket_containers.json new file mode 100644 index 0000000..946258e --- /dev/null +++ b/project/resource/ui/pocket_containers.json @@ -0,0 +1,179 @@ +{ + "namespace": "pocket_containers", + + "generic_label": { + "type": "label", + "layer": 2, + "anchor_from": "center", + "anchor_to": "center", + "color": "$pocket_title_text_color" + }, + + //---------------------- + // Header Panel + //---------------------- + + "header_panel": { + "type": "panel", + "layer": 1, + "size": [ "50%", "27px" ], + "anchor_from": "top_left", + "anchor_to": "top_left", + "controls": [ + { + "header_background": { + "type": "image", + "texture": "textures/ui/header_bar" + } + }, + { + "title_label@generic_label": { "text": "$header_label" } + } + ] + }, + + "header_area": { + "type": "panel", + "controls": [ + { "x@common.legacy_pocket_close_button": { "layer": 3 } }, + { + "inventory_header@pocket_containers.header_panel": { + "$header_label": "chestScreen.header.player" + } + }, + { + "container_header@pocket_containers.header_panel": { + "layer": 2, + "anchor_from": "top_middle", + "$header_label": "$container_title" + } + } + ] + }, + + //----------------- + // Inventory Panels + //----------------- + + "dark_bg": { + "type": "image", + "texture": "textures/ui/dark_bg", + "layer": 3 + }, + + "panel_outline": { + "type": "image", + "texture": "textures/ui/panel_outline" + }, + + "background_panel": { + "type": "image", + "size": [ "100%", "100%" ], + "texture": "textures/ui/background_panel", + "layer": 2 + }, + + "inventory_grid": { + "type": "grid", + "grid_rescaling_type": "horizontal", + "anchor_to": "top_left", + "anchor_from": "top_left", + "size": [ "100%", "default" ], + "maximum_grid_items": "$container_size", + "collection_name": "$pane_collection", + "grid_item_template": "common.pocket_ui_container_item", + "$item_collection_name": "$pane_collection" + }, + + "inventory_panel": { + "type": "panel", + "size": [ "80%", "95%" ], + "anchor_to": "center", + "anchor_from": "center", + "controls": [ + { + "scrolling_panel@common.scrolling_panel": { + "layer": 1, + "$scrolling_pane_size": [ "100%", "100%-2px" ], + "$scrolling_content": "pocket_containers.inventory_grid", + "$scroll_box_mouse_image_control": "common-classic.button_state_default", + "$scroll_size": [ "8px", "100%" ] + } + } + ] + }, + + "half_screen": { + "type": "panel", + "size": [ "50%", "100%-27px" ], + "offset": [ 0, 27 ], + "anchor_from": "top_left", + "anchor_to": "top_left", + "controls": [ + { "inventory_panel@inventory_panel": {} } + ] + }, + + //-------------------- + // Screen Definitions + //-------------------- + + "panel": { + "type": "panel", + "controls": [ + { "container_gamepad_helpers@common.container_gamepad_helpers": { "layer": 3 } }, + { "header@header_area": { "layer": 2 } }, + { "bg@background_panel": { "layer": 0 } }, + { + "inventory@half_screen": { + "$container_size": 36, + "$pane_collection": "combined_hotbar_and_inventory_items" + } + }, + { + "container@half_screen": { + "anchor_from": "top_middle", + "$pane_collection": "container_items" + } + }, + { "selected_item_details_factory@common.selected_item_details_factory": {} }, + { + "item_lock_notification_factory@common.item_lock_notification_factory": { + "$offset": [ 0, "85%" ] + } + }, + { "gamepad_cursor@common.gamepad_cursor_button": {} }, + { "inventory_selected_icon_button@common.inventory_selected_icon_button": {} }, + { "hold_icon@common.inventory_take_progress_icon_button": {} }, + { "flying_item_renderer@common.flying_item_renderer": {} } + ] + }, + + "small_chest_panel@panel": { + "$container_size": 27 + }, + + "large_chest_panel@panel": { + "$container_size": 54 + }, + + "hopper_panel@panel": { + "$container_size": 5 + }, + + "dispenser_panel@panel": { + "$container_size": 9 + }, + + "dropper_panel@panel": { + "$container_size": 9 + }, + + "ender_chest_panel@panel": { + "$container_size": 27 + }, + "shulker_box_panel@small_chest_panel": { + }, + "barrel_panel@small_chest_panel": { + } +} \ No newline at end of file From bdd420769e541a52fd4e6c597580c1651fe79066 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:28:29 +0000 Subject: [PATCH 11/12] Updated tsconfig.json and .gitignore --- .gitignore | 2 +- tsconfig.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index db3d923..8fb471d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ node_modules build.js -project/scripts +project/behavior/scripts dist \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c366bff..405a4f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,6 @@ "emitDeclarationOnly": true, "declaration": true }, - "include": ["src"], - "exclude": ["scripts", "node_modules"] + "include": ["**/src"], + "exclude": ["**/scripts", "node_modules"] } From a994da81ababe0184da7bbd909ba5530064f8b96 Mon Sep 17 00:00:00 2001 From: ReallyFatYoshi <86920416+ReallyFatYoshi@users.noreply.github.com> Date: Tue, 3 Jan 2023 22:29:34 +0100 Subject: [PATCH 12/12] Delete index.js --- project/behavior/scripts/index.js | 4232 ----------------------------- 1 file changed, 4232 deletions(-) delete mode 100644 project/behavior/scripts/index.js diff --git a/project/behavior/scripts/index.js b/project/behavior/scripts/index.js deleted file mode 100644 index aa1df5e..0000000 --- a/project/behavior/scripts/index.js +++ /dev/null @@ -1,4232 +0,0 @@ -// project/behavior/src/index.ts -import { - ItemStack as ItemStack5, - MinecraftItemTypes as MinecraftItemTypes7, - system as system14 -} from "@minecraft/server"; - -// project/behavior/src/lib/Command/index.ts -import { world as world4 } from "@minecraft/server"; - -// project/behavior/src/config/commands.ts -var PREFIX = "-"; - -// project/behavior/src/lib/Command/ArgumentTypes.ts -import { world as world3 } from "@minecraft/server"; - -// project/behavior/src/database/Database.ts -import { ItemStack, MinecraftItemTypes } from "@minecraft/server"; - -// project/behavior/src/config/database.ts -import { BlockLocation } from "@minecraft/server"; -var MAX_DATABASE_STRING_SIZE = 32e3; -var ENTITY_IDENTIFIER = "rubedo:database"; -var ENTITY_LOCATION = new BlockLocation(0, -64, 0); -var INVENTORY_SIZE = 128; - -// project/behavior/src/lib/Events/EntitiesLoad.ts -import { system as system2, world as world2 } from "@minecraft/server"; - -// project/behavior/src/utils.ts -import { - BlockLocation as BlockLocation2, - MinecraftDimensionTypes, - system, - world -} from "@minecraft/server"; - -// project/behavior/src/lib/Form/Models/MessageForm.ts -import { MessageFormData } from "@minecraft/server-ui"; - -// project/behavior/src/config/form.ts -var TIMEOUT_THRESHOLD = 200; - -// project/behavior/src/lib/Form/Models/MessageForm.ts -var MessageForm = class { - constructor(title, body) { - this.title = title; - this.body = body; - this.form = new MessageFormData(); - if (title) - this.form.title(title); - if (body) - this.form.body(body); - this.triedToShow = 0; - } - setButton1(text2, callback) { - this.button1 = { text: text2, callback }; - this.form.button1(text2); - return this; - } - setButton2(text2, callback) { - this.button2 = { text: text2, callback }; - this.form.button2(text2); - return this; - } - show(player) { - this.form.show(player).then((response) => { - if (response.canceled) { - if (response.cancelationReason == "userBusy") { - if (this.triedToShow > TIMEOUT_THRESHOLD) - return player.tell( - `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` - ); - this.triedToShow++; - this.show(player); - } - return; - } - if (response.selection == 1) - this.button1?.callback?.(); - if (response.selection == 0) - this.button2?.callback?.(); - }); - } -}; - -// project/behavior/src/utils.ts -var DIMENSIONS = { - overworld: world.getDimension(MinecraftDimensionTypes.overworld), - nether: world.getDimension(MinecraftDimensionTypes.nether), - theEnd: world.getDimension(MinecraftDimensionTypes.theEnd), - "minecraft:overworld": world.getDimension(MinecraftDimensionTypes.overworld), - "minecraft:nether": world.getDimension(MinecraftDimensionTypes.nether), - "minecraft:the_end": world.getDimension(MinecraftDimensionTypes.theEnd) -}; -function durationToMs(duration) { - const values = duration.split(","); - console.warn(values.length); - let ms = 0; - for (const value of values) { - const length = parseInt(value.match(/\D+|\d+/g)[0]); - const unit = value.match(/\D+|\d+/g)[1]; - if (unit == "y") - ms = ms + 317098e-16 * length; - if (unit == "w") - ms = ms + 6048e5 * length; - if (unit == "d") - ms = ms + 864e5 * length; - if (unit == "h") - ms = ms + 36e5 * length; - if (unit == "m") - ms = ms + 6e4 * length; - if (unit == "s") - ms = ms + 1e3 * length; - if (unit == "ms") - ms = ms + length; - } - return ms; -} -function msToTime(duration) { - return new Date(duration).toString(); -} -function vector3ToBlockLocation(loc) { - return new BlockLocation2( - Math.floor(loc.x), - Math.floor(loc.y), - Math.floor(loc.z) - ); -} -function confirmAction(player, action, onConfirm, onCancel = () => { -}) { - new MessageForm("Confirm To Continue", action).setButton1("Confirm", onConfirm).setButton2("Never Mind", onCancel).show(player); -} -function sleep(tick) { - return new Promise((resolve) => { - let runScheduleId = system.runSchedule(() => { - resolve(); - system.clearRunSchedule(runScheduleId); - }, tick); - }); -} -function LocationEquals(a, b) { - let aLocations = [a.x, a.y, a.z]; - let bLocations = [a.x, a.y, a.z]; - if (a instanceof BlockLocation2 || b instanceof BlockLocation2) { - aLocations = aLocations.map((v) => Math.trunc(v)); - bLocations = bLocations.map((v) => Math.trunc(v)); - } - return aLocations.find((v, i) => bLocations[i] != v) ? false : true; -} -function sort3DVectors(vector1, vector2) { - const { x: x1, y: y1, z: z1 } = vector1; - const { x: x2, y: y2, z: z2 } = vector2; - const ox1 = x1 < x2 ? x1 : x2; - const oy1 = y1 < y2 ? y1 : y2; - const oz1 = z1 < z2 ? z1 : z2; - const ox2 = x1 < x2 ? x2 : x1; - const oy2 = y1 < y2 ? y2 : y1; - const oz2 = z1 < z2 ? z2 : z1; - return [ - { x: ox1, y: oy1, z: oz1 }, - { x: ox2, y: oy2, z: oz2 } - ]; -} -function betweenVector3(target, vector1, vector2) { - const [{ x: x1, y: y1, z: z1 }, { x: x2, y: y2, z: z2 }] = sort3DVectors( - vector1, - vector2 - ); - let { x, y, z } = target; - return x >= x1 && x <= x2 && y >= y1 && y <= y2 && z >= z1 && z <= z2; -} -function chunkString(str, length) { - return str.match(new RegExp(".{1," + length + "}", "g")); -} - -// project/behavior/src/lib/Events/EntitiesLoad.ts -var CALLBACKS = {}; -var ENTITIES_LOADED = false; -system2.run(async () => { - try { - await DIMENSIONS.overworld.runCommandAsync(`testfor @a`); - ENTITIES_LOADED = true; - for (const [i, callback] of Object.entries(CALLBACKS)) { - callback(); - delete CALLBACKS[i]; - } - } catch (error) { - let e2 = world2.events.entityCreate.subscribe((data) => { - system2.run(() => { - ENTITIES_LOADED = true; - for (const [i, callback] of Object.entries(CALLBACKS)) { - callback(); - delete CALLBACKS[i]; - } - world2.events.entityCreate.unsubscribe(e2); - }); - }); - } -}); -var EntitiesLoad = class { - static async awaitLoad() { - if (ENTITIES_LOADED) - return; - return new Promise((resolve) => { - EntitiesLoad.subscribe(resolve); - }); - } - static subscribe(callback) { - if (ENTITIES_LOADED) { - callback(); - return; - } - const key = Object.keys(CALLBACKS).length; - CALLBACKS[key] = callback; - return key; - } - static unsubscribe(key) { - delete CALLBACKS[key]; - } -}; - -// project/behavior/src/database/Database.ts -var Database = class { - constructor(tableName) { - this.tableName = tableName; - this.tableName = tableName; - this.MEMORY = null; - this.QUEUE = []; - EntitiesLoad.subscribe(async () => { - await this.initData(); - this.QUEUE.forEach((v) => v()); - }); - } - static createTableEntity(tableName, index) { - const entity = DIMENSIONS.overworld.spawnEntity( - ENTITY_IDENTIFIER, - ENTITY_LOCATION - ); - entity.setDynamicProperty("tableName", tableName); - entity.nameTag = `\xA7aDatabase Table: ${tableName}\xA7r`; - if (index) - entity.setDynamicProperty("index", index); - return entity; - } - static getTableEntities(tableName) { - return DIMENSIONS.overworld.getEntitiesAtBlockLocation(ENTITY_LOCATION).filter( - (e2) => e2.typeId == ENTITY_IDENTIFIER && e2.getDynamicProperty("tableName") == tableName - ); - } - async addQueueTask() { - return new Promise((resolve) => { - this.QUEUE.push(resolve); - }); - } - async saveData() { - if (!this.MEMORY) - await this.addQueueTask(); - let entities = Database.getTableEntities(this.tableName); - let chunks = chunkString( - JSON.stringify(this.MEMORY), - MAX_DATABASE_STRING_SIZE - ); - const entitiesNeeded = Math.ceil(chunks.length / INVENTORY_SIZE) - entities.length; - if (entitiesNeeded > 0) { - for (let i = 0; i < entitiesNeeded; i++) { - entities.push(Database.createTableEntity(this.tableName)); - } - } - for (const [i, entity] of entities.entries()) { - const inventory = entity.getComponent("inventory").container; - for (const [i2, chunk] of chunks.entries()) { - if (!chunk) - continue; - if (i2 > inventory.size - 1) - break; - let item = new ItemStack(MinecraftItemTypes.acaciaBoat); - item.nameTag = chunk; - inventory.setItem(i2, item); - chunks[i2] = null; - } - for (let i2 = chunks.length + 1; i2 < inventory.size; i2++) { - inventory.setItem(i2, new ItemStack(MinecraftItemTypes.stick, 0)); - } - entity.setDynamicProperty("index", i); - entities[i] = null; - if (!chunks.find((v) => v)) - break; - } - entities.filter((e2) => e2).forEach((e2) => e2.triggerEvent("despawn")); - return; - } - async initData() { - let entities = Database.getTableEntities(this.tableName).sort( - (a, b) => a.getDynamicProperty("index") - b.getDynamicProperty("index") - ); - let stringifiedData = ""; - for (const entity of entities) { - const inventory = entity.getComponent("inventory").container; - for (let i = 0; i < inventory.size; i++) { - const item = inventory.getItem(i); - if (!item) - continue; - stringifiedData = stringifiedData + item.nameTag; - } - } - const data = stringifiedData == "" ? {} : JSON.parse(stringifiedData); - this.MEMORY = data; - return data; - } - async set(key, value) { - this.MEMORY[key] = value; - return this.saveData(); - } - get(key) { - if (!this.MEMORY) - throw new Error( - "Entities not loaded! Consider using `getAsync` instead!" - ); - return this.MEMORY[key]; - } - async getSync(key) { - if (this.MEMORY) - return this.get(key); - await this.addQueueTask(); - return this.MEMORY[key]; - } - keys() { - if (!this.MEMORY) - throw new Error( - "Entities not loaded! Consider using `keysSync` instead!" - ); - return Object.keys(this.MEMORY); - } - async keysSync() { - if (this.MEMORY) - return this.keys(); - await this.addQueueTask(); - return Object.keys(this.MEMORY); - } - values() { - if (!this.MEMORY) - throw new Error( - "Entities not loaded! Consider using `valuesSync` instead!" - ); - return Object.values(this.MEMORY); - } - async valuesSync() { - if (this.MEMORY) - return this.values(); - await this.addQueueTask(); - return Object.values(this.MEMORY); - } - has(key) { - if (!this.MEMORY) - throw new Error("Entities not loaded! Consider using `hasSync` instead!"); - return Object.keys(this.MEMORY).includes(key); - } - async hasSync(key) { - if (this.MEMORY) - return this.has(key); - await this.addQueueTask(); - return Object.keys(this.MEMORY).includes(key); - } - collection() { - if (!this.MEMORY) - throw new Error( - "Entities not loaded! Consider using `collectionSync` instead!" - ); - return this.MEMORY; - } - async collectionSync() { - if (this.MEMORY) - return this.collection(); - await this.addQueueTask(); - return this.MEMORY; - } - async delete(key) { - const status = delete this.MEMORY[key]; - await this.saveData(); - return status; - } - async clear() { - this.MEMORY = {}; - return await this.saveData(); - } -}; - -// project/behavior/src/database/tables.ts -var TABLES = { - config: new Database("config"), - freezes: new Database("freezes"), - mutes: new Database("mutes"), - bans: new Database("bans"), - regions: new Database("regions"), - roles: new Database("roles"), - tasks: new Database("tasks"), - npcs: new Database("npcs"), - ids: new Database("ids"), - logs: new Database("logs"), - protections: new Database("protections") -}; - -// project/behavior/src/lib/Command/ArgumentTypes.ts -function fetch(playerName) { - return [...world3.getPlayers()].find((player) => player.name === playerName); -} -var LiteralArgumentType = class { - constructor(name = "literal") { - this.name = name; - this.typeName = "literal"; - this.name = name; - } - matches(value) { - return { - success: this.name == value - }; - } - fail(value) { - return `${value} should be ${this.name}!`; - } -}; -var StringArgumentType = class { - constructor(name = "string") { - this.name = name; - this.typeName = "string"; - this.name = name; - } - matches(value) { - return { - success: value && value != "", - value - }; - } - fail(value) { - return `Value must be of type string!`; - } -}; -var IntegerArgumentType = class { - constructor(name = "integer") { - this.name = name; - this.typeName = "int"; - this.name = name; - } - matches(value) { - return { - success: !isNaN(value), - value: parseInt(value) - }; - } - fail(value) { - return `Value must be valid number!`; - } -}; -var FloatArgumentType = class { - constructor(name = "float") { - this.name = name; - this.typeName = "float"; - this.name = name; - } - matches(value) { - return { - success: Boolean(value?.match(/^\d+\.\d+$/)?.[0]), - value: parseInt(value) - }; - } - fail(value) { - return `Value must be valid float!`; - } -}; -var LocationArgumentType = class { - constructor(name = "location") { - this.name = name; - this.typeName = "location"; - this.name = name; - } - matches(value) { - return { - success: /^([~^]{0,1}(-\d)?(\d*)?(\.(\d+))?)$/.test(value), - value - }; - } - fail(value) { - return `Value needs to be a valid number, value can include: [~,^]`; - } -}; -var BooleanArgumentType = class { - constructor(name = "boolean") { - this.name = name; - this.typeName = "boolean"; - this.name = name; - } - matches(value) { - return { - success: Boolean(value?.match(/^(true|false)$/)?.[0]), - value: value == "true" ? true : false - }; - } - fail(value) { - return `"${value}" can be either "true" or "false"`; - } -}; -var PlayerArgumentType = class { - constructor(name = "player") { - this.name = name; - this.typeName = "Player"; - this.name = name; - } - matches(value) { - return { - success: fetch(value) ? true : false, - value: fetch(value) - }; - } - fail(value) { - return `player: "${value}", is not in this world`; - } -}; -var TargetArgumentType = class { - constructor(name = "target") { - this.name = name; - this.typeName = "Target"; - this.name = name; - } - matches(value) { - return { - success: Boolean(value?.match(/^(@.|"[\s\S]+")$/)?.[0]), - value - }; - } - fail(value) { - return `${value} is not a valid target`; - } -}; -var ArrayArgumentType = class { - constructor(name = "array", types) { - this.name = name; - this.types = types; - this.typeName = "string"; - this.name = name; - this.types = types; - this.typeName = types.join(" | ").replace(/(.{25})..+/, "$1..."); - } - matches(value) { - return { - success: this.types.includes(value), - value - }; - } - fail(value) { - return `"${value}" must be one of these values: ${this.types.join(" | ")}`; - } -}; -var DurationArgumentType = class { - constructor(name) { - this.name = name; - this.typeName = "Duration"; - } - matches(value) { - return { - success: /^(\d+[hdysmw],?)+$/.test(value), - value - }; - } - fail(value) { - return `"${value}" must be a value like "10d" or "3s" the first part is the length second is unit`; - } -}; -var PlayerNameArgumentType = class { - constructor(name = "playerName") { - this.name = name; - this.typeName = "playerName"; - this.name = name; - } - matches(value) { - const player = TABLES.ids.get(value); - return { - success: player ? true : false, - value - }; - } - fail(value) { - return `player: "${value}" has never played this world before! Tip: if the name has spaces in it use quotes around name!`; - } -}; -var ArgumentTypes = { - string: StringArgumentType, - int: IntegerArgumentType, - float: FloatArgumentType, - location: LocationArgumentType, - boolean: BooleanArgumentType, - player: PlayerArgumentType, - target: TargetArgumentType, - array: ArrayArgumentType, - duration: DurationArgumentType, - playerName: PlayerNameArgumentType -}; - -// project/behavior/src/lib/Command/Callback.ts -var CommandCallback = class { - constructor(data) { - this.data = data; - this.sender = data.sender; - } - reply(text2) { - this.sender.tell(text2); - } -}; - -// project/behavior/src/lib/Command/utils.ts -function getChatAugments(message, prefix) { - try { - return message.slice(prefix.length).trim().match(/"[^"]+"|[^\s]+/g).map((e2) => e2.replace(/"(.+)"/, "$1").toString()); - } catch (error) { - return []; - } -} -function commandNotFound(player, command2) { - player.tell({ - rawtext: [ - { - text: `\xA7c` - }, - { - translate: `commands.generic.unknown`, - with: [`${command2}`] - } - ] - }); -} -function noPerm(player, command2) { - player.tell({ - rawtext: [ - { - text: command2.data.invalidPermission ? command2.data.invalidPermission : `\xA7cYou do not have permission to use "${command2.data.name}"` - } - ] - }); -} -function commandSyntaxFail(player, baseCommand, command2, args, i) { - player.tell({ - rawtext: [ - { - text: `\xA7c` - }, - { - translate: `commands.generic.syntax`, - with: [ - `${PREFIX}${baseCommand.data.name} ${args.slice(0, i).join(" ")}`, - args[i] ?? " ", - args.slice(i + 1).join(" ") - ] - } - ] - }); - if (command2.children.length > 1 || !args[i]) { - const types = command2.children.map( - (c) => c.type instanceof LiteralArgumentType ? c.type.name : c.type?.typeName - ); - player.tell( - `\xA7c"${args[i] ?? "undefined"}" is not valid! Argument "${[...new Set(command2.children.map((c) => c.type.name))][0]}" can be typeof: "${types.join('", "')}"` - ); - } else { - player.tell(`\xA7c${command2.children[0]?.type?.fail(args[i])}`); - } -} -function parseLocationArgs([x, y, z], { location, viewVector }) { - if (!x || !y || !x) - return null; - const locations = [location.x, location.y, location.z]; - const viewVectors = [viewVector.x, viewVector.y, viewVector.z]; - const a = [x, y, z].map((arg) => { - const r = parseFloat(arg); - return isNaN(r) ? 0 : r; - }); - const b = [x, y, z].map((arg, index) => { - return arg.includes("~") ? a[index] + locations[index] : arg.includes("^") ? a[index] + viewVectors[index] : a[index]; - }); - return { x: b[0], y: b[1], z: b[2] }; -} -function sendCallback(cmdArgs, args, event, baseCommand) { - const lastArg = args[args.length - 1] ?? baseCommand; - const argsToReturn = []; - for (const [i, arg] of args.entries()) { - if (arg.type.name.endsWith("*")) - continue; - if (arg.type instanceof LocationArgumentType) { - argsToReturn.push( - parseLocationArgs( - [cmdArgs[i], cmdArgs[i + 1], cmdArgs[i + 2]], - event.sender - ) - ); - continue; - } - if (arg.type instanceof LiteralArgumentType) - continue; - argsToReturn.push(arg.type.matches(cmdArgs[i]).value ?? cmdArgs[i]); - } - lastArg.callback(new CommandCallback(event), ...argsToReturn); -} - -// project/behavior/src/lib/Command/index.ts -var COMMANDS = []; -world4.events.beforeChat.subscribe((data) => { - if (!data.message.startsWith(PREFIX)) - return; - data.cancel = true; - const args = getChatAugments(data.message, PREFIX); - const command2 = COMMANDS.find( - (c) => c.depth == 0 && (c.data.name == args[0] || c.data?.aliases?.includes(args[0])) - ); - const event = { - message: data.message, - sendToTargets: data.sendToTargets, - sender: data.sender, - targets: data.targets - }; - if (!command2) - return commandNotFound(data.sender, args[0]); - if (!command2.data?.requires(data.sender)) - return noPerm(event.sender, command2); - args.shift(); - const verifiedCommands = []; - const getArg = (start, i) => { - if (start.children.length > 0) { - const arg = start.children.find((v2) => v2.type.matches(args[i]).success); - if (!arg && !args[i] && start.callback) - return; - if (!arg) - return commandSyntaxFail(event.sender, command2, start, args, i), "fail"; - if (!arg.data?.requires(event.sender)) - return noPerm(event.sender, arg), "fail"; - verifiedCommands.push(arg); - return getArg(arg, i + 1); - } - }; - let v = getArg(command2, 0); - if (v == "fail") - return; - sendCallback(args, verifiedCommands, event, command2); -}); - -// project/behavior/src/lib/Chest GUI/index.ts -import { system as system6, world as world6 } from "@minecraft/server"; - -// project/behavior/src/config/chest.ts -var GUI_ITEM = "rubedo:gui"; -var ENTITY_INVENTORY = "rubedo:inventory"; - -// project/behavior/src/plugins/Anti-Cheat/utils.ts -import { - world as world5, - Player as Player3, - BlockLocation as BlockLocation4, - MinecraftBlockTypes as MinecraftBlockTypes3, - GameMode, - system as system3 -} from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts -import { BlockLocation as BlockLocation3, MinecraftBlockTypes } from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/config/region.ts -var DEFAULT_REGION_PERMISSIONS = { - doorsAndSwitches: true, - openContainers: true, - pvp: false, - allowedEntities: [ - "minecraft:player", - "minecraft:npc", - "minecraft:item", - "rubedo:inventory", - "rubedo:database" - ] -}; -var DOORS_SWITCHES = [ - "minecraft:acacia_door", - "minecraft:acacia_trapdoor", - "minecraft:acacia_button", - "minecraft:birch_door", - "minecraft:birch_trapdoor", - "minecraft:birch_button", - "minecraft:crimson_door", - "minecraft:crimson_trapdoor", - "minecraft:crimson_button", - "minecraft:dark_oak_door", - "minecraft:dark_oak_trapdoor", - "minecraft:dark_oak_button", - "minecraft:jungle_door", - "minecraft:jungle_trapdoor", - "minecraft:jungle_button", - "minecraft:mangrove_door", - "minecraft:mangrove_trapdoor", - "minecraft:mangrove_button", - "minecraft:spruce_door", - "minecraft:spruce_trapdoor", - "minecraft:spruce_button", - "minecraft:warped_door", - "minecraft:warped_trapdoor", - "minecraft:warped_button", - "minecraft:wooden_door", - "minecraft:wooden_button", - "minecraft:trapdoor", - "minecraft:iron_door", - "minecraft:iron_trapdoor", - "minecraft:polished_blackstone_button", - "minecraft:lever" -]; -var BLOCK_CONTAINERS = [ - "minecraft:chest", - "minecraft:ender_chest", - "minecraft:barrel", - "minecraft:trapped_chest", - "minecraft:dispenser", - "minecraft:dropper", - "minecraft:furnace", - "minecraft:blast_furnace", - "minecraft:lit_furnace", - "minecraft:lit_blast_furnace", - "minecraft:hopper", - "minecraft:shulker_box", - "minecraft:undyed_shulker_box", - "minecraft:lit_smoker", - "minecraft:smoker" -]; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Region.ts -var REGIONS = []; -var REGIONS_HAVE_BEEN_GRABBED = false; -var LOWEST_Y_VALUE = -64; -var HIGHEST_Y_VALUE = 320; -var Region = class { - static async getAllRegionsSync() { - if (REGIONS_HAVE_BEEN_GRABBED) - return REGIONS; - const regions = (await TABLES.regions.valuesSync()).map( - (region) => new Region( - region.from, - region.to, - region.dimensionId, - region.permissions, - region.key - ) - ); - regions.forEach((r) => { - REGIONS.push(r); - }); - REGIONS_HAVE_BEEN_GRABBED = true; - return regions; - } - static getAllRegions() { - if (REGIONS_HAVE_BEEN_GRABBED) - return REGIONS; - const regions = TABLES.regions.values().map( - (region) => new Region( - region.from, - region.to, - region.dimensionId, - region.permissions, - region.key - ) - ); - regions.forEach((r) => { - REGIONS.push(r); - }); - REGIONS_HAVE_BEEN_GRABBED = true; - return regions; - } - static blockLocationInRegion(blockLocation, dimensionId) { - return this.getAllRegions().find( - (region) => region.dimensionId == dimensionId && betweenVector3( - blockLocation, - { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z }, - { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z } - ) - ); - } - static async blockLocationInRegionSync(blockLocation, dimensionId) { - return (await this.getAllRegionsSync()).find( - (region) => region.dimensionId == dimensionId && betweenVector3( - blockLocation, - { x: region.from.x, y: LOWEST_Y_VALUE, z: region.from.z }, - { x: region.to.x, y: HIGHEST_Y_VALUE, z: region.to.z } - ) - ); - } - static async removeRegionAtBlockLocation(blockLocation, dimensionId) { - const region = this.blockLocationInRegion(blockLocation, dimensionId); - if (!region) - return false; - return TABLES.regions.delete(region.key); - } - constructor(from, to, dimensionId, permissions, key) { - this.from = from; - this.to = to; - this.dimensionId = dimensionId; - this.permissions = permissions ?? DEFAULT_REGION_PERMISSIONS; - this.key = key ? key : Date.now().toString(); - if (!key) { - this.update().then(() => { - loadRegionDenys(); - REGIONS.push(this); - }); - } - } - async update() { - return TABLES.regions.set(this.key, { - key: this.key, - from: this.from, - dimensionId: this.dimensionId, - permissions: this.permissions, - to: this.to - }); - } - async delete() { - const region = TABLES.regions.get(this.key); - const loc1 = new BlockLocation3( - region.from.x, - region.dimensionId == "minecraft:overworld" ? -64 : 0, - region.from.z - ); - const loc2 = new BlockLocation3( - region.to.x, - region.dimensionId == "minecraft:overworld" ? -64 : 0, - region.to.z - ); - for (const blockLocation of loc1.blocksBetween(loc2)) { - DIMENSIONS[region.dimensionId].getBlock(blockLocation)?.setType(MinecraftBlockTypes.bedrock); - } - REGIONS = REGIONS.filter((r) => r.key != this.key); - return TABLES.regions.delete(this.key); - } - entityInRegion(entity) { - return this.dimensionId == entity.dimension.id && betweenVector3( - entity.location, - { x: this.from.x, y: LOWEST_Y_VALUE, z: this.from.z }, - { x: this.to.x, y: HIGHEST_Y_VALUE, z: this.to.z } - ); - } - changePermission(key, value) { - this.permissions[key] = value; - this.update(); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Task.ts -var ChangePlayerRoleTask = class { - static getTasks() { - return TABLES.tasks.get("changePlayerRole") ?? []; - } - static getPlayersRoleToSet(playerName) { - const tasks = ChangePlayerRoleTask.getTasks(); - return tasks.find((t) => t.playerName == playerName)?.role; - } - constructor(playerName, role) { - let tasks = ChangePlayerRoleTask.getTasks(); - tasks.push({ playerName, role }); - TABLES.tasks.set("changePlayerRole", tasks); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/config/moderation.ts -import { MinecraftBlockTypes as MinecraftBlockTypes2, MinecraftItemTypes as MinecraftItemTypes2 } from "@minecraft/server"; -var FORBIDDEN_ITEMS = [ - MinecraftItemTypes2.beehive.id, - MinecraftItemTypes2.beeNest.id, - MinecraftItemTypes2.axolotlBucket.id, - MinecraftItemTypes2.codBucket.id, - MinecraftItemTypes2.tadpoleBucket.id, - MinecraftItemTypes2.tropicalFishBucket.id, - MinecraftItemTypes2.salmonBucket.id, - MinecraftItemTypes2.pufferfishBucket.id -]; -var BANNED_ITEMS = [ - MinecraftItemTypes2.allow.id, - MinecraftItemTypes2.barrier.id, - MinecraftItemTypes2.borderBlock.id, - MinecraftItemTypes2.debugStick?.id ?? "minecraft:debug_stick", - MinecraftItemTypes2.deny.id, - MinecraftItemTypes2.jigsaw.id, - MinecraftItemTypes2.lightBlock.id, - MinecraftItemTypes2.commandBlock.id, - MinecraftItemTypes2.repeatingCommandBlock.id, - MinecraftItemTypes2.chainCommandBlock.id, - MinecraftItemTypes2.commandBlockMinecart.id, - MinecraftItemTypes2.structureBlock.id, - MinecraftItemTypes2.structureVoid.id, - MinecraftItemTypes2.bedrock.id, - MinecraftItemTypes2.endPortalFrame.id, - "minecraft:info_update", - "minecraft:info_update2", - "minecraft:reserved3", - "minecraft:reserved4", - "minecraft:reserved6", - "minecraft:movingBlock", - "minecraft:moving_block", - "minecraft:movingblock", - "minecraft:piston_arm_collision", - "minecraft:piston_arm_collision", - "minecraft:pistonarmcollision", - "minecraft:stickyPistonArmCollision", - "minecraft:sticky_piston_arm_collision", - "minecraft:unknown", - "minecraft:glowingobsidian", - "minecraft:invisible_bedrock", - "minecraft:invisiblebedrock", - "minecraft:netherreactor", - "minecraft:portal", - "minecraft:fire", - "minecraft:water", - "minecraft:lava", - "minecraft:flowing_lava", - "minecraft:flowing_water", - "minecraft:soul_fire" -]; -var FORBIDDEN_BLOCKS = [ - MinecraftBlockTypes2.dispenser.id -]; -var BANNED_BLOCKS = [ - MinecraftBlockTypes2.bedrock.id, - MinecraftBlockTypes2.barrier.id, - "minecraft:invisiblebedrock", - "minecraft:movingBlock", - "minecraft:movingblock", - "minecraft:moving_block" -]; -var API_CONTAINERS = [ - MinecraftBlockTypes2.chest.id, - MinecraftBlockTypes2.trappedChest.id -]; -var CONTAINERS = [ - MinecraftItemTypes2.chest.id, - MinecraftItemTypes2.trappedChest.id, - MinecraftItemTypes2.barrel.id, - MinecraftItemTypes2.dispenser.id, - MinecraftItemTypes2.dropper.id, - MinecraftItemTypes2.furnace.id, - "minecraft:lit_furnace", - MinecraftItemTypes2.blastFurnace.id, - "minecraft:lit_blast_furnace", - MinecraftItemTypes2.smoker.id, - "minecraft:lit_smoker", - MinecraftItemTypes2.hopper.id, - MinecraftItemTypes2.shulkerBox.id, - MinecraftItemTypes2.undyedShulkerBox.id -]; -var CHECK_SIZE = { x: 7, y: 7, z: 7 }; - -// project/behavior/src/plugins/Anti-Cheat/config/enchantments.ts -var ENCHANTMENTS = { - aquaAffinity: 1, - baneOfArthropods: 5, - binding: 1, - blastProtection: 4, - channeling: 1, - depthStrider: 3, - efficiency: 5, - featherFalling: 4, - fireAspect: 2, - fireProtection: 4, - flame: 1, - fortune: 3, - frostWalker: 2, - impaling: 5, - infinity: 1, - knockback: 2, - looting: 3, - loyalty: 4, - luckOfTheSea: 3, - lure: 3, - mending: 1, - multishot: 1, - piercing: 4, - power: 5, - projectileProtection: 4, - protection: 4, - punch: 2, - quickCharge: 3, - respiration: 3, - riptide: 3, - sharpness: 5, - silkTouch: 1, - smite: 5, - soulSpeed: 3, - swiftSneak: 4, - thorns: 3, - unbreaking: 3, - vanishing: 1 -}; - -// project/behavior/src/config/app.ts -var VERSION = "2.6.4-beta"; -var APPEAL_LINK = "https://discord.gg/dMa3A5UYKX"; - -// project/behavior/src/plugins/Anti-Cheat/utils.ts -function kick(player, message = [], onFail) { - if (isServerOwner(player)) { - console.warn(`[WARNING]: TRIED TO KICK OWNER`); - player.tell(`You have been tried to kick, but you cant!`); - return onFail?.(); - } - try { - player.runCommandAsync(`kick @s \xA7r${message.join("\n")}`); - player.triggerEvent("kick"); - } catch (error) { - player.triggerEvent("kick"); - if (!/"statusCode":-2147352576/.test(error)) - return; - if (onFail) - onFail(); - } -} -function getRole(player) { - if (player instanceof Player3) { - return TABLES.roles.get(player.name) ?? "member"; - } else { - return TABLES.roles.get(player) ?? "member"; - } -} -function setRole(player, value) { - if (typeof player == "string") { - TABLES.roles.set(player, value); - const inGamePlayer = [...world5.getPlayers()].find((p) => p.name == player); - if (inGamePlayer) { - inGamePlayer.setDynamicProperty("role", value); - } else { - new ChangePlayerRoleTask(player, value); - } - } else { - TABLES.roles.set(player.name, value); - player.setDynamicProperty("role", value); - } -} -function isServerOwner(player) { - return world5.getDynamicProperty("worldsOwner") == player.id; -} -function getServerOwner() { - const id = world5.getDynamicProperty("worldsOwner"); - if (!id || id == "") - return null; - return id; -} -function getServerOwnerName() { - const ownerId = getServerOwner(); - if (!ownerId) - return null; - const ids = TABLES.ids.collection(); - return Object.keys(ids).find((key) => ids[key] === ownerId); -} -function setServerOwner(player) { - if (!player) - return world5.setDynamicProperty("worldsOwner", ""); - world5.setDynamicProperty("worldsOwner", player.id.toString()); -} -function isLockedDown() { - return world5.getDynamicProperty("isLockDown") ?? false; -} -function setLockDown(val) { - world5.setDynamicProperty("isLockDown", val); -} -function loadRegionDenys() { - for (const region of Region.getAllRegions()) { - const loc1 = new BlockLocation4( - region.from.x, - region.dimensionId == "minecraft:overworld" ? -64 : 0, - region.from.z - ); - const loc2 = new BlockLocation4( - region.to.x, - region.dimensionId == "minecraft:overworld" ? -64 : 0, - region.to.z - ); - for (const blockLocation of loc1.blocksBetween(loc2)) { - DIMENSIONS[region.dimensionId].getBlock(blockLocation)?.setType(MinecraftBlockTypes3.deny); - } - } -} -var CALLBACKS2 = []; -var forEachValidPlayerCalls = 0; -function forEachValidPlayer(callback, delay = 0) { - const key = forEachValidPlayerCalls; - CALLBACKS2[key] = { - callback, - delay, - lastCall: 0 - }; - forEachValidPlayerCalls = key + 1; - return key; -} -function clearForEachValidPlayer(key) { - delete CALLBACKS2[key]; -} -EntitiesLoad.subscribe(() => { - system3.runSchedule(() => { - const players = [...world5.getPlayers()]; - for (const [i, player] of players.entries()) { - if (getRole(player) == "admin") - continue; - for (const CALLBACK of Object.values(CALLBACKS2)) { - if (CALLBACK.delay != 0 && system3.currentTick - CALLBACK.lastCall < CALLBACK.delay) - continue; - CALLBACK.callback(player); - if (i == players.length - 1) - CALLBACK.lastCall = system3.currentTick; - } - } - }); -}); -function getConfigId(id) { - switch (id) { - case "spam_config": - return TABLES.config.get("spam_config") ?? { - repeatedMessages: true, - zalgo: true, - violationCount: 0, - permMutePlayer: false - }; - case "cbe_config": - return TABLES.config.get("cbe_config") ?? { - clearItem: true, - violationCount: 0, - banPlayer: false, - canAddEnchantment: false - }; - case "gamemode_config": - return TABLES.config.get("gamemode_config") ?? { - setToSurvival: true, - clearPlayer: true, - violationCount: 0, - banPlayer: false - }; - case "nuker_data": - return TABLES.config.get("nuker_data") ?? { - violationCount: 0, - banPlayer: false - }; - case "banned_items": - return TABLES.config.get("banned_items") ?? BANNED_ITEMS; - case "banned_blocks": - return TABLES.config.get("banned_blocks") ?? BANNED_BLOCKS; - case "enchantments": - return TABLES.config.get("enchantments") ?? ENCHANTMENTS; - case "appealLink": - return TABLES.config.get("appealLink") ?? APPEAL_LINK; - } -} -function setConfigId(key, value) { - TABLES.config.set(key, value); -} -function getMaxEnchantmentLevel(enchantment) { - const MAX_ENCHANTMENTS = getConfigId("enchantments"); - return MAX_ENCHANTMENTS[enchantment.type.id] ?? enchantment.type.maxLevel; -} -function getGamemode(player) { - return Object.values(GameMode).find( - (g) => [...world5.getPlayers({ name: player.name, gameMode: g })].length - ); -} - -// project/behavior/src/lib/Chest GUI/Models/EntityChest.ts -import { system as system5 } from "@minecraft/server"; - -// project/behavior/src/lib/Events/onSlotChange.ts -import { - system as system4 -} from "@minecraft/server"; -var CALLBACKS3 = {}; -var MAPPED_INVENTORIES = {}; -var PREVIOUS_CHANGE = {}; -function getSlotChanges(entity, oldInv, newInv) { - if (oldInv.length != newInv.length) - return []; - const changes = []; - for (let i = 0; i < newInv.length; i++) { - if (oldInv[i]?.item?.amount < newInv[i]?.item?.amount || oldInv[i]?.item?.amount > newInv[i]?.item?.amount && oldInv[i]?.item?.amount != 0) { - const change_data = { - slot: i, - uid: newInv[i].uid, - oldUid: oldInv[i].uid, - item: newInv[i].item, - oldItem: oldInv[i].item, - changeType: "fluctuation" - }; - changes.push(change_data); - PREVIOUS_CHANGE[entity.id] = change_data; - continue; - } - if (newInv[i].uid == oldInv[i].uid) - continue; - if (oldInv[i]?.item && newInv[i]?.item) { - const change_data = { - slot: i, - uid: newInv[i].uid, - oldUid: oldInv[i].uid, - item: newInv[i].item, - oldItem: oldInv[i].item, - changeType: "swap" - }; - changes.push(change_data); - PREVIOUS_CHANGE[entity.id] = change_data; - } else if (!newInv[i]?.item) { - const change_data = { - slot: i, - uid: oldInv[i].uid, - item: oldInv[i].item, - changeType: "delete" - }; - changes.push(change_data); - PREVIOUS_CHANGE[entity.id] = change_data; - } else if (newInv[i]?.item) { - if (PREVIOUS_CHANGE[entity.id]?.changeType == "delete" && PREVIOUS_CHANGE[entity.id]?.uid == newInv[i].uid) { - const change_data = { - slot: i, - uid: newInv[i].uid, - item: newInv[i].item, - changeType: "move" - }; - changes.push(change_data); - PREVIOUS_CHANGE[entity.id] = change_data; - continue; - } else { - const change_data = { - slot: i, - uid: newInv[i].uid, - item: newInv[i].item, - changeType: "put" - }; - changes.push(change_data); - PREVIOUS_CHANGE[entity.id] = change_data; - } - } - } - return changes; -} -function getItemUid(item) { - if (!item) - return ""; - const data = []; - data.push(item.typeId); - data.push(item.nameTag); - data.push(item.data); - data.push(item.getLore().join("")); - return data.join(""); -} -function mapInventory(container) { - const inventory = []; - for (let i = 0; i < container.size; i++) { - let item = container.getItem(i); - inventory[i] = { - uid: getItemUid(item), - item - }; - } - return inventory; -} -system4.runSchedule(() => { - for (const callback of Object.values(CALLBACKS3)) { - for (const entity of DIMENSIONS.overworld.getEntities(callback.entities)) { - const inventory = mapInventory( - entity.getComponent("inventory").container - ); - const changes = getSlotChanges( - entity, - MAPPED_INVENTORIES[entity.id] ?? inventory, - inventory - ); - MAPPED_INVENTORIES[entity.id] = inventory; - if (changes.length == 0) - continue; - if (entity.hasTag("skipCheck")) { - entity.removeTag("skipCheck"); - delete PREVIOUS_CHANGE[entity.id]; - continue; - } - for (const change of changes) { - callback.callback(entity, change); - } - } - } -}, 5); -var onEntityInventorySlotChange = class { - static subscribe(entities, callback) { - const key = Date.now(); - CALLBACKS3[key] = { callback, entities }; - return key; - } - static unsubscribe(key) { - delete CALLBACKS3[key]; - } -}; - -// project/behavior/src/lib/Chest GUI/utils.ts -import { Location as Location2 } from "@minecraft/server"; -var CHESTGUIS = {}; -var PAGES = {}; -function getHeldItem(player) { - const inventory = player.getComponent("minecraft:inventory").container; - return inventory.getItem(player.selectedSlot); -} -async function clearPlayersPointer(player, ItemToClear) { - try { - const inventory = player.getComponent("minecraft:inventory").container; - let itemsToLoad = []; - for (let i = 0; i < inventory.size; i++) { - const item = inventory.getItem(i); - if (!item) - continue; - if (item?.typeId == ItemToClear?.typeId) { - itemsToLoad.push({ slot: i, item }); - inventory.setItem; - if (i < 9) { - player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`); - } else { - player.runCommandAsync( - `replaceitem entity @s slot.inventory ${i - 9} air` - ); - } - } - } - await player.runCommandAsync( - `clear @s ${ItemToClear?.typeId} ${ItemToClear.data} ${ItemToClear.amount}` - ); - for (const item of itemsToLoad) { - inventory.setItem(item.slot, item.item); - } - } catch (error) { - [ - ...player.dimension.getEntities({ - type: "minecraft:item", - location: new Location2( - player.location.x, - player.location.y, - player.location.z - ), - maxDistance: 2, - closest: 1 - }) - ].forEach((e2) => e2.kill()); - } -} -function getItemAtSlot(entity, slot) { - const inventory = entity.getComponent("minecraft:inventory").container; - return inventory.getItem(slot); -} - -// project/behavior/src/lib/Chest GUI/Models/ItemGrabbedCallback.ts -var ItemGrabbedCallback = class { - constructor(gui, slot, change) { - this.gui = gui; - this.slot = slot; - this.change = change; - } - message(text2) { - this.gui.player.tell(text2); - } - getItemAdded() { - if (this.slot.item) - return null; - return this.gui.entity.getComponent("minecraft:inventory").container.getItem(this.change.slot); - } - GiveAction(item = this.slot.item.itemStack) { - this.gui.player.getComponent("minecraft:inventory").container.addItem(item); - } - TakeAction(db = null) { - this.gui.player.getComponent("minecraft:inventory").container.addItem(this.slot.item.itemStack); - this.gui.page.slots[this.change.slot] = null; - if (!db) - return; - db.delete(this.slot.item.components.dbKey); - } - PageAction(page, extras) { - this.gui.setPage(page, extras); - } - CloseAction() { - this.gui.despawn(); - } - SetAction() { - const container = this.gui.entity.getComponent( - "minecraft:inventory" - ).container; - container.setItem(this.change.slot, this.slot.item.itemStack); - } - async FormAction(form) { - this.CloseAction(); - await sleep(5); - return await form.show(this.gui.player); - } -}; - -// project/behavior/src/lib/Chest GUI/Models/EntityChest.ts -var ChestGUI = class { - static spawnEntity(player) { - try { - return player.dimension.spawnEntity( - ENTITY_INVENTORY, - player.headLocation - ); - } catch (error) { - return null; - } - } - constructor(player) { - this.player = player; - this.entity = ChestGUI.spawnEntity(player); - if (this.entity) { - this.hasChestOpen = false; - this.setPage("home"); - } - this.runScheduleId = system5.runSchedule(() => { - if (!this.entity) - return this.despawn(); - if (this.player.getComponent("mark_variant").value == 1) { - if (!this.hasChestOpen) { - this.slotChangeEvent = onEntityInventorySlotChange.subscribe( - { type: ENTITY_INVENTORY }, - (entity, change) => { - if (entity.id != this.entity.id) - return; - this.onSlotChange(change); - } - ); - } - this.hasChestOpen = true; - } else { - try { - this.entity.teleport( - this.player.headLocation, - this.player.dimension, - this.player.rotation.x, - this.player.rotation.y, - true - ); - } catch (error) { - this.despawn(); - } - } - }, 5); - } - setPage(pageId, extras) { - const c = this.entity.getComponent("inventory").container; - for (let i = 0; i < c.size; i++) { - c.setItem(i, AIR); - } - if (!Object.keys(PAGES).includes(pageId)) - throw new Error(`pageId ${pageId} does not exist!`); - const page = PAGES[pageId]; - this.page = page; - page.fillType(this.entity, page, extras); - this.entity.nameTag = `size:54`; - } - onSlotChange(change) { - const slot = this.page.slots[change.slot]; - if (!slot) { - this.entity.getComponent("inventory").container.setItem(change.slot, AIR); - } else if (change.changeType == "delete") { - if (slot.item) - clearPlayersPointer(this.player, change.item); - if (!slot.item && !getItemAtSlot(this.entity, change.slot)) - return; - slot.action(new ItemGrabbedCallback(this, slot, change)); - } - } - despawn() { - try { - this.entity?.triggerEvent("despawn"); - } catch (error) { - } - try { - delete CHESTGUIS[this.player.name]; - } catch (error) { - } - if (this.runScheduleId) - system5.clearRunSchedule(this.runScheduleId); - if (this.slotChangeEvent) - onEntityInventorySlotChange.unsubscribe(this.slotChangeEvent); - } -}; - -// project/behavior/src/lib/Chest GUI/Models/PageItem.ts -import { - ItemStack as ItemStack4 -} from "@minecraft/server"; -var PageItem = class { - constructor(itemType, components = {}, itemStack) { - this.itemType = itemType; - this.components = components; - this.setItemStack = itemStack; - } - get itemStack() { - if (this.setItemStack) - return this.setItemStack; - const itemStack = new ItemStack4(this.itemType); - if (this.components) { - itemStack.amount = this.components?.amount ?? 1; - itemStack.data = this.components?.data ?? 0; - itemStack.nameTag = this.components?.nameTag; - itemStack.setLore(this.components?.loreList ?? []); - const enchantments = itemStack.getComponent("enchantments").enchantments; - for (const enchantment of this.components?.enchantments ?? []) { - enchantments.addEnchantment(enchantment); - } - itemStack.getComponent("enchantments").enchantments = enchantments; - } - return itemStack; - } -}; - -// project/behavior/src/lib/Chest GUI/Models/FillTypes.ts -function DefaultFill(entity, page, extras) { - const container = entity.getComponent("minecraft:inventory").container; - for (let i = 0; i < container.size; i++) { - const slot = page.slots[i]; - if (!slot || !slot.item) { - container.setItem(i, AIR); - continue; - } - container.setItem(i, slot.item.itemStack); - } -} - -// project/behavior/src/lib/Chest GUI/Models/Page.ts -var Page = class { - constructor(id, fillType = DefaultFill) { - if (Object.keys(PAGES).includes(id)) - throw new Error(`Page: ${id}, Already exists!`); - this.id = id; - this.fillType = fillType; - this.slots = []; - PAGES[id] = this; - } - setSlots(slot, item, action) { - const data = item ? { item, action } : null; - for (const i of slot) { - this.slots[i] = data; - } - return this; - } -}; - -// project/behavior/src/lib/Chest GUI/pages/home.ts -import { MinecraftItemTypes as MinecraftItemTypes3 } from "@minecraft/server"; -var HOME_PAGE = new Page("home").setSlots( - [22], - new PageItem(MinecraftItemTypes3.enderChest, { - nameTag: "\xA7l\xA7bInventory Viewer" - }), - (ctx) => { - ctx.PageAction("moderation:see"); - } -).setSlots( - [54], - new PageItem(MinecraftItemTypes3.barrier, { nameTag: "\xA7cClose GUI" }), - (ctx) => { - ctx.CloseAction(); - } -); - -// project/behavior/src/lib/Chest GUI/index.ts -EntitiesLoad.subscribe(() => { - system6.runSchedule(() => { - for (const player of world6.getPlayers()) { - if (getHeldItem(player)?.typeId != GUI_ITEM) { - if (CHESTGUIS[player.name]) - CHESTGUIS[player.name].despawn(); - continue; - } - if (Object.keys(CHESTGUIS).includes(player?.name)) - continue; - if (getRole(player) != "admin") - continue; - CHESTGUIS[player.name] = new ChestGUI(player); - } - }, 10); -}); -system6.runSchedule(() => { - const validIds = Object.values(CHESTGUIS).map((c) => c.entity.id); - for (const entity of DIMENSIONS.overworld.getEntities({ - type: ENTITY_INVENTORY - })) { - if (validIds.includes(entity.id)) - continue; - entity.triggerEvent("despawn"); - } -}, 100); - -// project/behavior/src/plugins/Anti-Cheat/protections.ts -import { system as system7 } from "@minecraft/server"; -var PROTECTIONS = {}; -EntitiesLoad.subscribe(() => { - system7.run(() => { - for (const protection6 of Object.values(PROTECTIONS)) { - if (!protection6.getConfig().enabled) - continue; - protection6.enable(); - } - }); -}); - -// project/behavior/src/lang/text.ts -var text = { - "api.name": () => "Smelly API", - "api.error.unknown": () => "An unknown error has occurred.", - "api.database.error.table_name": (a, b) => `The display name ${a} is too long for an objective, it can be at most ${b} characters long`, - "api.utilities.formatter.error.ms": (a) => `${a} is not a string or a number`, - "api.Providers.form.invalidType": (a, b) => `Type ${a} is not a valid type to add a ${b}`, - "modules.protections.cps.clickingToFast": () => `You are clicking to fast! Please click slower!`, - "modules.managers.mute.isMuted": () => `\xA7cYou've been temporarily muted in chat.`, - "modules.commands.ban.reply": (playerName, duration, reason = "") => `\xA7cBanned \xA7f"\xA7a${playerName}\xA7f" \xA7cfor ${duration} Because: "${reason ?? "No reason Provided"}" \xA7aSuccessfully`, - "lockdown.kick.message": () => [ - `\xA7cYou have been kicked!`, - `\xA7aReason: \xA7fServer is currently under LockDown`, - `\xA7fServer will be up soon, Try to join later` - ], - "commands.ban.list.player": (name, reason, expire) => `- "${name}" Because: ${reason}, Expiry ${expire}`, - "commands.freeze.list.player": (name, reason) => `- "${name}" Because: ${reason}`, - "commands.mutes.list.player": (name, reason, expire) => `- "${name}" Because: ${reason}, Expiry: ${expire}`, - "commands.lockdown.confirm": "Are you sure you want to lockdown the server, this will kick all active players and all players who try to join who are not admin" -}; - -// project/behavior/src/lib/Command/Command.ts -var Command = class { - constructor(data, type, depth = 0, parent) { - this.data = data; - this.type = type; - this.depth = depth; - this.parent = parent; - if (!data.requires) - data.requires = (player) => true; - this.data = data; - this.type = type ?? new LiteralArgumentType(this.data.name); - this.children = []; - this.depth = depth; - this.parent = parent; - this.callback = null; - COMMANDS.push(this); - } - argument(type) { - const cmd = new Command( - this.data, - type, - this.depth + 1, - this - ); - this.children.push(cmd); - return cmd; - } - string(name) { - return this.argument(new StringArgumentType(name)); - } - int(name) { - return this.argument(new IntegerArgumentType(name)); - } - array(name, types) { - return this.argument(new ArrayArgumentType(name, types)); - } - boolean(name) { - return this.argument(new BooleanArgumentType(name)); - } - location(name) { - const cmd = this.argument(new LocationArgumentType(name)); - if (!name.endsWith("*")) { - const newArg = cmd.location(name + "_y*").location(name + "_z*"); - return newArg; - } - return cmd; - } - literal(data) { - const cmd = new Command( - data, - new LiteralArgumentType(data.name), - this.depth + 1, - this - ); - this.children.push(cmd); - return cmd; - } - executes(callback) { - this.callback = callback; - return this; - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Ban.ts -import { Player as Player6 } from "@minecraft/server"; -function setBan(player, id, duration, reason = "No Reason", by = "Rubedo Auto Mod") { - const data = { - key: id, - playerName: player instanceof Player6 ? player.name : player, - date: Date.now(), - duration: duration ? durationToMs(duration) : null, - expire: duration ? durationToMs(duration) + Date.now() : null, - reason, - by - }; - TABLES.bans.set(id, data); -} -var Ban = class { - constructor(player, duration, reason = "No Reason", by = "Rubedo Auto Mod") { - if (player instanceof Player6) { - setBan(player, player.id, duration, reason, by); - } else { - setBan(player, TABLES.ids.get(player), duration, reason, by); - } - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/ban.ts -function ban(ctx, player, duration, reason, by) { - if (TABLES.bans.get(TABLES.ids.get(player))) - return ctx.reply(`\xA7c${player} is already banned`); - ctx.reply(`\xA7aClose chat to confirm`); - confirmAction( - ctx.sender, - `Are you sure you want to ban ${player}, for ${duration ?? "forever"}`, - () => { - new Ban(player, duration, reason, ctx.sender.name); - ctx.reply(text["modules.commands.ban.reply"](player, duration, reason)); - } - ); -} -var root = new Command({ - name: "ban", - description: "Manage bans", - requires: (player) => ["admin", "moderator"].includes(getRole(player)) -}); -root.literal({ - name: "add", - description: "Bans a player" -}).argument(new ArgumentTypes.playerName()).executes((ctx, player) => { - ban(ctx, player, null, null, ctx.sender.name); -}).argument(new ArgumentTypes.duration("duration")).executes((ctx, player, duration) => { - ban(ctx, player, duration, null, ctx.sender.name); -}).string("reason").executes((ctx, player, duration, reason) => { - ban(ctx, player, duration, reason, ctx.sender.name); -}); -root.literal({ - name: "remove", - description: "un-bans a player" -}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { - const banData = TABLES.bans.values().find((ban2) => ban2.playerName == playerName); - if (!banData) - return ctx.reply(`${playerName} is not banned`); - if (TABLES.bans.delete(banData.key)) { - ctx.reply(`\xA7a${playerName}\xA7r has been Unbanned!`); - } else { - ctx.reply(`\xA7cFailed to un-ban ${playerName}`); - } -}); -root.literal({ - name: "list", - description: "Lists all bans" -}).executes((ctx) => { - const bans = TABLES.bans.values(); - if (bans.length == 0) - return ctx.sender.tell(`\xA7cNo one is banned!`); - ctx.sender.tell(`\xA72--- Showing Bans (${bans.length}) ---`); - for (const ban2 of bans) { - ctx.sender.tell( - text["commands.ban.list.player"]( - ban2.playerName, - ban2.reason, - ban2.expire ? msToTime(ban2.duration) : "Forever" - ) - ); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/database.ts -var root2 = new Command({ - name: "database", - description: "Interacts with SA Database", - aliases: ["db"], - requires: (player) => getRole(player) == "admin" -}); -root2.literal({ - name: "get" -}).string("table").string("key").executes((ctx, table, key) => { - try { - const data = TABLES[table].get(key); - if (data) { - ctx.reply(JSON.stringify(data)); - } else { - ctx.reply(`No data could be found for key ${key}`); - } - } catch (error) { - ctx.reply(error + error.stack); - } -}); -root2.literal({ - name: "set" -}).string("table").string("key").string("value").executes((ctx, table, key, value) => { - try { - TABLES[table].set(key, value); - ctx.reply(`Set Key: "${key}", to value: "${value}" on table: "${table}"`); - } catch (error) { - ctx.reply(error + error.stack); - } -}); -root2.literal({ - name: "clear" -}).string("table").executes((ctx, table) => { - try { - TABLES[table].clear(); - ctx.reply(`Cleared Table ${table}`); - } catch (error) { - ctx.reply(error + error.stack); - } -}); -root2.literal({ - name: "keys", - description: "Returns all keys on a database" -}).string("table").executes((ctx, table) => { - try { - const keys = TABLES[table].keys(); - ctx.reply(`Keys on database: ${table}: ${keys}`); - } catch (error) { - ctx.reply(error + error.stack); - } -}); -root2.literal({ - name: "values", - description: "Returns all values on a database" -}).string("table").executes((ctx, table) => { - try { - const values = TABLES[table].values(); - ctx.reply( - `Values on database: ${table}: ${JSON.stringify(values, null, 2)}` - ); - } catch (error) { - if (error instanceof TypeError) { - ctx.reply(`No values on database ${table}`); - } else { - ctx.reply(error + error.stack); - } - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/ecwipe.ts -new Command({ - name: "ecwipe", - description: "Clears a players ender chest", - requires: (player) => getRole(player) == "admin" -}).argument(new ArgumentTypes.player("player")).executes((ctx, player) => { - for (let i = 0; i < 27; i++) { - player.runCommandAsync(`replaceitem entity @s slot.enderchest ${i} air`); - } - ctx.reply(`\xA7aCleared "${player.name}"'s Ender chest!`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Freeze.ts -var Freeze = class { - constructor(player, reason = "No Reason") { - const data = { - playerName: player.name, - key: player.id, - reason, - location: { - x: player.location.x, - y: player.location.y, - z: player.location.z, - dimension: player.dimension.id - } - }; - TABLES.freezes.set(player.id, data); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/freeze.ts -var root3 = new Command({ - name: "freeze", - description: "Manage Freezes", - requires: (player) => ["admin", "moderator"].includes(getRole(player)) -}); -root3.literal({ - name: "add", - description: "Freezes a player" -}).argument(new ArgumentTypes.player("player")).string("reason").executes((ctx, player, reason) => { - new Freeze(player, reason); - ctx.reply( - `\xA7cFroze \xA7f"\xA7a${player.name}\xA7f" Because: "${reason}" \xA7aSuccessfully` - ); - ctx.sender.tell( - `\xA7cYou have been frozen by \xA7f"\xA7a${ctx.sender.name}\xA7f" Because: "${reason}"` - ); -}); -root3.literal({ - name: "remove", - description: "unfreezes a player" -}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { - const freeze = TABLES.freezes.values().find((freeze2) => freeze2.playerName == playerName); - if (!freeze) - return ctx.reply(`${playerName} is not frozen`); - TABLES.freezes.delete(freeze.key); - ctx.reply(`\xA7a${playerName}\xA7r has been UnFrozen!`); -}); -root3.literal({ - name: "list", - description: "Lists all freezes" -}).executes((ctx) => { - const freezes = TABLES.freezes.values(); - if (freezes.length == 0) - return ctx.sender.tell(`\xA7cNo one is frozen!`); - ctx.sender.tell(`\xA72--- Showing Freezes (${freezes.length}) ---`); - for (const freeze of freezes) { - ctx.sender.tell( - text["commands.freeze.list.player"](freeze.playerName, freeze.reason) - ); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/help.ts -var CommandNameArgumentType = class { - constructor(name) { - this.name = name; - this.typeName = "CommandName"; - } - matches(value) { - return { - success: Boolean( - COMMANDS.find((c) => c.depth == 0 && c.data.name == value) - ), - value - }; - } - fail(value) { - return `"${value}" is not a valid command`; - } -}; -function sendCommandType(baseCommand, args, player) { - player.tell( - `${PREFIX}${baseCommand.data.name} ${args.map( - (a) => a.type.typeName == "literal" ? a.data.name : `<${a.type.name}: ${a.type.typeName}>` - ).join(" ")}` - ); -} -function sendArguments(bc, c, args, p) { - if (!c.data?.requires(p)) - return; - if (c.callback) { - sendCommandType(bc, c.depth == 0 ? args : args.concat(c), p); - } - if (c.children.length > 0) { - for (const child of c.children) { - sendArguments(bc, child, c.depth == 0 ? args : args.concat(c), p); - } - } -} -function sendPageHeader(player, p, maxPages) { - player.tell( - `\xA72--- Showing help page ${p} of ${maxPages} (${PREFIX}help ) ---` - ); -} -function getCommands(player) { - return COMMANDS.filter((c) => { - return c.depth == 0 && c.data?.requires(player); - }); -} -function getMaxPages(player) { - const commands = getCommands(player); - if (commands.length == 0) - return 0; - return Math.ceil(commands.length / 5); -} -var root4 = new Command({ - name: "help", - description: "Provides help/list of commands.", - aliases: ["?", "h"] -}).executes((ctx) => { - const maxPages = getMaxPages(ctx.sender); - const commands = getCommands(ctx.sender).slice(1 * 5 - 5, 1 * 5); - sendPageHeader(ctx.sender, 1, maxPages); - for (const cmd of commands) { - sendArguments(cmd, cmd, [], ctx.sender); - } -}); -root4.int("page").executes((ctx, p) => { - const maxPages = getMaxPages(ctx.sender); - if (p > maxPages) - p = maxPages; - const commands = getCommands(ctx.sender).slice(p * 5 - 5, p * 5); - sendPageHeader(ctx.sender, p, maxPages); - for (const cmd of commands) { - sendArguments(cmd, cmd, [], ctx.sender); - } -}); -root4.argument(new CommandNameArgumentType("command")).executes((ctx, command2) => { - const cmd = COMMANDS.filter( - (c) => c.depth == 0 && c.data.name == command2 - )[0]; - ctx.sender.tell( - `\xA7e${cmd.data.name}: ${cmd.data.aliases ? `aliases (${cmd.data.aliases.join(", ")})` : ""}` - ); - ctx.sender.tell(`\xA7e${cmd.data.description}`); - ctx.sender.tell(`Usage:`); - sendArguments(cmd, cmd, [], ctx.sender); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/lockdown.ts -import { world as world7 } from "@minecraft/server"; -new Command({ - name: "lockdown", - description: "Toggles the servers lockdown, meaning no one can join", - requires: (player) => getRole(player) == "admin" -}).executes((ctx) => { - if (isLockedDown()) { - setLockDown(false); - ctx.sender.tell(`\xA7aUnlocked the server!`); - } else { - ctx.reply(`\xA7aClose chat to confirm lockdown`); - confirmAction(ctx.sender, text["commands.lockdown.confirm"], () => { - setLockDown(true); - for (const player of world7.getPlayers()) { - if (getRole(player) == "admin") - continue; - kick(player, text["lockdown.kick.message"]()); - } - world7.say(`\xA7l\xA7cServer is now LOCKED!`); - }); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Mute.ts -var Mute = class { - static getMuteData(player) { - return TABLES.mutes.get(player.name); - } - constructor(player, duration, reason = "No Reason", by = "Rubedo Auto Mod") { - const msLength = duration ? durationToMs(duration) : null; - const data = { - playerName: player.name, - date: Date.now(), - duration: msLength, - expire: msLength ? msLength + Date.now() : null, - reason, - by - }; - TABLES.mutes.set(player.name, data); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/mute.ts -var root5 = new Command({ - name: "mute", - description: "Manage Mutes", - requires: (player) => ["admin", "moderator"].includes(getRole(player)) -}); -root5.literal({ - name: "add", - description: "Mutes a player" -}).argument(new ArgumentTypes.player("player")).argument(new ArgumentTypes.duration("duration")).string("reason").executes((ctx, player, duration, reason) => { - new Mute(player, duration, reason, ctx.sender.name); - ctx.reply( - `\xA7cMuted \xA7f"\xA7a${player.name}\xA7f" \xA7cfor ${duration} Because: "${reason}" \xA7aSuccessfully` - ); - player.tell( - `\xA7cYou have been muted by \xA7f"${ctx.sender.name}" \xA7cfor ${duration} Because: "${reason}"` - ); -}); -root5.literal({ - name: "remove", - description: "un-mutes a player" -}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { - const mute = TABLES.mutes.values().find((mute2) => mute2.playerName == playerName); - if (!mute) - return ctx.reply(`${playerName} is not muted!`); - TABLES.mutes.delete(mute.playerName); - try { - ctx.sender.runCommandAsync(`ability "${playerName}" mute false`); - } catch (error) { - } - ctx.reply(`\xA7a${playerName}\xA7r has been UnMuted!`); -}); -root5.literal({ - name: "list", - description: "Lists all freezes" -}).executes((ctx) => { - const mutes = TABLES.mutes.values(); - if (mutes.length == 0) - return ctx.sender.tell(`\xA7cNo one is muted!`); - ctx.sender.tell(`\xA72--- Showing Mutes (${mutes.length}) ---`); - for (const mute of mutes) { - ctx.sender.tell( - text["commands.mutes.list.player"]( - mute.playerName, - mute.reason, - mute.expire ? msToTime(mute.expire) : "Forever" - ) - ); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts -import { Location as Location3 } from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Npc.ts -var Npc = class { - static isValid(entity) { - if (entity.typeId != "minecraft:npc") - return false; - if (NPC_LOCATIONS.find((l) => LocationEquals(l, entity.location))) - return true; - return TABLES.npcs.keys().find((key) => entity.id == key) ? true : false; - } - constructor(location, dimension) { - NPC_LOCATIONS.push(location); - const entity = dimension.spawnEntity("minecraft:npc", location); - const data = { - dimension: entity.dimension.id, - x: entity.location.x, - y: entity.location.y, - z: entity.location.z - }; - TABLES.npcs.set(entity.id, data); - clearNpcLocations(); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/npc.ts -new Command({ - name: "npc", - description: "Spawns a npc at your coordinates", - requires: (player) => getRole(player) == "admin" -}).executes((ctx) => { - const { x, y, z } = ctx.sender.location; - new Npc(new Location3(x, y, z), ctx.sender.dimension); - ctx.reply(`Spawned a verified npc at your current location`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/ping.ts -import { system as system8 } from "@minecraft/server"; -async function getServerTPS() { - let startTime = Date.now(); - let ticks = 0; - return new Promise((resolve) => { - let s = system8.runSchedule(() => { - if (Date.now() - startTime < 1e3) { - ticks++; - } else { - system8.clearRunSchedule(s); - resolve(ticks); - } - }); - }); -} -new Command({ - name: "ping", - description: "Returns the current Ticks Per Second of the servers ping" -}).executes(async (ctx) => { - let ticks = await getServerTPS(); - ctx.reply( - `\xA7aCurrent Ticks Per Second: ${ticks > 18 ? "\xA7f{ \xA7aGood" : ticks > 13 ? "\xA7f{ \xA7eOk" : "\xA7f{ \xA7cSevere"} ${ticks} \xA7f}` - ); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/region.ts -import { BlockLocation as BlockLocation5 } from "@minecraft/server"; -var command = new Command({ - name: "region", - description: "Create a Region", - requires: (player) => getRole(player) == "admin" -}); -command.literal({ - name: "add", - description: "Adds a new protection region" -}).int("from_x").int("from_z").int("to_x").int("to_z").executes((ctx, from_x, from_z, to_x, to_z) => { - new Region( - { x: from_x, z: from_z }, - { x: to_x, z: to_z }, - ctx.sender.dimension.id - ); - ctx.reply( - `Created Region From ${from_x} -64 ${from_z} ${to_x} 320 ${to_z}` - ); -}); -command.literal({ - name: "remove", - description: "Removes a region at the players current position" -}).executes((ctx) => { - const loc = new BlockLocation5( - ctx.sender.location.x, - ctx.sender.location.y, - ctx.sender.location.z - ); - const r = Region.removeRegionAtBlockLocation(loc, ctx.sender.dimension.id); - if (r) { - ctx.reply(`Removed Region at ${loc.x} ${loc.y} ${loc.z}`); - } else { - ctx.reply(`Failed to find/remove region at ${loc.x} ${loc.y} ${loc.z}`); - } -}); -command.literal({ - name: "removeAll", - description: "Removes all regions" -}).executes((ctx) => { - Region.getAllRegions().forEach((r) => r.delete()); - ctx.reply(`Removed All regions`); -}); -command.literal({ - name: "list", - description: "Lists all regions and positions" -}).executes((ctx) => { - const regions = Region.getAllRegions(); - for (const region of regions) { - ctx.reply( - `Region from ${region.from.x}, ${region.from.z} to ${region.to.x}, ${region.to.z} in dimension ${region.dimensionId}` - ); - } - if (regions.length == 0) - return ctx.reply(`No regions have been made yet`); -}); -var permission = command.literal({ - name: "permission", - description: "Handles permissions for regions" -}); -permission.literal({ - name: "set", - description: "Sets a certain permission on the region the player is currently in to a value" -}).array("key", ["doorsAndSwitches", "openContainers", "pvp"]).boolean("value").executes((ctx, key, value) => { - const region = Region.blockLocationInRegion( - new BlockLocation5( - ctx.sender.location.x, - ctx.sender.location.y, - ctx.sender.location.z - ), - ctx.sender.dimension.id - ); - if (!region) - return ctx.reply(`You are not in a region`); - region.changePermission(key, value); - ctx.reply(`Changed permission ${key} to ${value}`); -}); -permission.literal({ - name: "list", - description: "Lists the permissions for the current region" -}).executes((ctx) => { - const region = Region.blockLocationInRegion( - new BlockLocation5( - ctx.sender.location.x, - ctx.sender.location.y, - ctx.sender.location.z - ), - ctx.sender.dimension.id - ); - if (!region) - return ctx.reply(`You are not in a region`); - ctx.reply( - `Current region permissions ${JSON.stringify(region.permissions)}` - ); -}); -var entityCommands = permission.literal({ - name: "entities", - description: "Holds the subCommands for adding or removing allowedEntities" -}); -entityCommands.literal({ - name: "add", - description: "Adds a entity to the allowed entities list" -}).string("entity").executes((ctx, entity) => { - const region = Region.blockLocationInRegion( - new BlockLocation5( - ctx.sender.location.x, - ctx.sender.location.y, - ctx.sender.location.z - ), - ctx.sender.dimension.id - ); - if (!region) - return ctx.reply(`You are not in a region`); - const currentAllowedEntities = region.permissions.allowedEntities; - currentAllowedEntities.push(entity); - region.changePermission("allowedEntities", currentAllowedEntities); - ctx.reply( - `Added entity ${entity} to the allowed entities of the region your currently standing in` - ); -}); -entityCommands.literal({ - name: "remove", - description: "Removes a entity from the allowed entities in the region" -}).string("entity").executes((ctx, entity) => { - const region = Region.blockLocationInRegion( - new BlockLocation5( - ctx.sender.location.x, - ctx.sender.location.y, - ctx.sender.location.z - ), - ctx.sender.dimension.id - ); - if (!region) - return ctx.reply(`You are not in a region`); - let currentAllowedEntities = region.permissions.allowedEntities; - if (!currentAllowedEntities.includes(entity)) - return ctx.reply( - `The entity ${entity} is not allowed to enter the region` - ); - currentAllowedEntities = currentAllowedEntities.filter((v) => v != entity); - region.changePermission("allowedEntities", currentAllowedEntities); - ctx.reply( - `Removed entity ${entity} to the allowed entities of the region your currently standing in` - ); -}); - -// project/behavior/src/types.ts -var ROLES = /* @__PURE__ */ ((ROLES2) => { - ROLES2[ROLES2["member"] = 0] = "member"; - ROLES2[ROLES2["admin"] = 1] = "admin"; - ROLES2[ROLES2["moderator"] = 2] = "moderator"; - ROLES2[ROLES2["builder"] = 3] = "builder"; - return ROLES2; -})(ROLES || {}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/role.ts -var StringIsNumber = (value) => isNaN(Number(value)) === false; -function ToArray(enumme) { - return Object.keys(enumme).filter(StringIsNumber).map((key) => enumme[key]); -} -var root6 = new Command({ - name: "role", - description: "Changes the role for a player", - requires: (player) => getRole(player) == "admin" || isServerOwner(player) -}); -root6.literal({ - name: "set", - description: "Sets the role for a player" -}).argument(new ArgumentTypes.playerName("playerName")).argument(new ArgumentTypes.array("role", ToArray(ROLES))).executes((ctx, playerName, role) => { - setRole(playerName, role); - ctx.reply(`Changed role of ${playerName} to ${role}`); -}); -root6.literal({ - name: "get", - description: "Gets the role of a player" -}).argument(new ArgumentTypes.playerName("playerName")).executes((ctx, playerName) => { - const role = getRole(playerName); - ctx.reply(`${playerName} has role: ${role}`); -}); -var ownerRoot = root6.literal({ - name: "owner", - description: "Manages the owner" -}); -ownerRoot.literal({ - name: "get", - description: "Gets the owner of the world" -}).executes((ctx) => { - const ownerId = getServerOwner(); - const ids = TABLES.ids.collection(); - const ownerName = Object.keys(ids).find((key) => ids[key] === ownerId); - ctx.reply(`\xA7aServer Owner: ${ownerName} (id: ${ownerId})`); -}); -ownerRoot.literal({ - name: "transfer", - description: "Transfers the owner of the world", - requires: (player) => isServerOwner(player) -}).argument(new ArgumentTypes.player()).executes((ctx, player) => { - confirmAction( - ctx.sender, - `Are you sure you want to transfer the server ownership to ${player.name}, this action is not reversible!`, - () => { - setServerOwner(player); - ctx.reply( - `\xA7aSet the server Owner to: ${player.name} (id: ${player.id})` - ); - } - ); - ctx.reply(`\xA7aClose chat to confirm`); -}); -ownerRoot.literal({ - name: "clear", - description: "clear's the owner of the world", - requires: (player) => isServerOwner(player) -}).executes((ctx) => { - confirmAction( - ctx.sender, - "Are you sure you want to clear the server owner, this action is not reversible!", - () => { - setServerOwner(null); - ctx.reply( - `\xA7aCleared the server owner! run "/reload" or reload world to run "/function start" again!` - ); - } - ); - ctx.reply(`\xA7aClose chat to confirm`); -}); - -// project/behavior/src/lib/Form/Models/ActionForm.ts -import { ActionFormData } from "@minecraft/server-ui"; -var ActionForm = class { - constructor(title, body) { - this.title = title; - this.body = body; - this.form = new ActionFormData(); - if (title) - this.form.title(title); - if (body) - this.form.body(body); - this.buttons = []; - this.triedToShow = 0; - } - addButton(text2, iconPath = null, callback) { - this.buttons.push({ - text: text2, - iconPath, - callback - }); - this.form.button(text2, iconPath); - return this; - } - show(player) { - this.form.show(player).then((response) => { - if (response.canceled) { - if (response.cancelationReason == "userBusy") { - if (this.triedToShow > TIMEOUT_THRESHOLD) - return player.tell( - `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` - ); - this.triedToShow++; - this.show(player); - } - return; - } - this.buttons[response.selection].callback?.(); - }); - } -}; - -// project/behavior/src/lib/Form/Models/ModelForm.ts -import { ModalFormData } from "@minecraft/server-ui"; - -// project/behavior/src/lib/Form/Models/FormCallback.ts -var FormCallback = class { - constructor(form, player, callback) { - this.form = form; - this.player = player; - this.callback = callback; - } - error(message) { - new MessageForm("Error", message).setButton1("Return to form", () => { - this.form.show(this.player, this.callback); - }).setButton2("Cancel", null).show(this.player); - } -}; - -// project/behavior/src/lib/Form/Models/ModelForm.ts -var ModalForm = class { - constructor(title) { - this.title = title; - this.form = new ModalFormData(); - if (title) - this.form.title(title); - this.args = []; - } - addDropdown(label, options, defaultValueIndex) { - this.args.push({ type: "dropdown", options }); - this.form.dropdown(label, options, defaultValueIndex); - return this; - } - addSlider(label, minimumValue, maximumValue, valueStep, defaultValue) { - this.args.push({ type: "slider" }); - this.form.slider( - label, - minimumValue, - maximumValue, - valueStep, - defaultValue - ); - return this; - } - addToggle(label, defaultValue) { - this.args.push({ type: "toggle" }); - this.form.toggle(label, defaultValue); - return this; - } - addTextField(label, placeholderText, defaultValue) { - this.args.push({ type: "textField" }); - this.form.textField(label, placeholderText, defaultValue); - return this; - } - async show(player, callback) { - for (let i = 0; i < TIMEOUT_THRESHOLD; i++) { - let response = await this.form.show(player); - if (response.cancelationReason == "userBusy") - continue; - callback( - new FormCallback(this, player, callback), - ...response.formValues.map( - (v, i2) => this.args[i2].type == "dropdown" ? this.args[i2].options[v] : v - ) - ); - return; - } - return player.tell( - `\xA7cForm Timeout: tried to show form, but you were busy (close chat after running command)` - ); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/forms/settings.ts -function manageBannedItemsForm(player) { - new ActionForm("Manage Banned Items").addButton("Remove a Banned Item", null, () => { - removeBannedItemForm(player); - }).addButton("Ban an item", null, () => { - addBannedItemForm(player); - }).show(player); -} -function removeBannedItemForm(player) { - new ModalForm("Remove Banned Items").addDropdown("Select item to remove", getConfigId("banned_items")).show(player, (ctx, item) => { - let items = getConfigId("banned_items"); - items = items.filter((p) => p != item); - setConfigId("banned_items", items); - player.tell(`Removed Banned item "${item}"`); - }); -} -function addBannedItemForm(player) { - new ModalForm("Add Banned Item").addTextField("Item Id", "minecraft:string").show(player, (ctx, item) => { - let items = getConfigId("banned_items"); - if (items.includes(item)) - return ctx.error(`\xA7cItem "${item}" is already banned`); - items.push(item); - setConfigId("banned_items", items); - player.tell(`Banned the item "${item}"`); - }); -} -function manageBannedBlocksForm(player) { - new ActionForm("Manage Banned Blocks").addButton("Remove a Banned Block", null, () => { - removeBannedBlockForm(player); - }).addButton("Ban an block", null, () => { - addBannedBlockForm(player); - }).show(player); -} -function removeBannedBlockForm(player) { - new ModalForm("Remove Banned Block").addDropdown("Select block to remove", getConfigId("banned_blocks")).show(player, (ctx, block) => { - let blocks = getConfigId("banned_blocks"); - blocks = blocks.filter((p) => p != block); - setConfigId("banned_blocks", blocks); - player.tell(`Removed Banned block "${block}"`); - }); -} -function addBannedBlockForm(player) { - new ModalForm("Add Banned Block").addTextField("Block Id", "minecraft:barrier").show(player, (ctx, block) => { - let blocks = getConfigId("banned_blocks"); - if (blocks.includes(block)) - return ctx.error(`\xA7cBlock "${block}" is already banned`); - blocks.push(block); - setConfigId("banned_blocks", blocks); - player.tell(`Banned the block "${block}"`); - }); -} -function manageEnchantmentLevelsForm(player) { - new ModalForm("Manage Enchantment Levels").addDropdown("Enchantment to change", Object.keys(ENCHANTMENTS), 0).addTextField("Level (number)", "5").show(player, (ctx, enchantment, levelString) => { - if (isNaN(levelString)) - return ctx.error( - `\xA7c"${levelString}" is not a number, please enter a value like, "3", "9", etc.` - ); - const level = parseInt(levelString); - let enchants = getConfigId("enchantments"); - enchants[enchantment] = level; - setConfigId("enchantments", enchants); - player.tell(`Set max level for ${enchantment} to ${level}`); - }); -} -function manageAppealLinkForm(player) { - new ModalForm("Manage Appeal Link").addTextField("Appeal Link", APPEAL_LINK).show(player, (ctx, link) => { - setConfigId("appealLink", link); - player.tell(`Changed the servers appeal link to ${link}`); - }); -} - -// project/behavior/src/plugins/Anti-Cheat/modules/forms/automod.ts -function showAutoModHomeForm(player) { - const form = new ActionForm("Manage Protections"); - for (const protection6 of Object.values(PROTECTIONS)) { - form.addButton(protection6.name, protection6.iconPath, () => { - showProtectionConfig(protection6, player); - }); - } - form.addButton("Back", "textures/ui/arrow_dark_left_stretch.png", () => { - showHomeForm(player); - }).show(player); -} -function showProtectionConfig(protection6, player) { - const data = protection6.getConfig(); - const form = new ModalForm( - `Manage ${protection6.name} Protection Config` - ).addToggle("Enabled", data["enabled"]); - let keys = []; - for (const [key, value] of Object.entries(protection6.configDefault)) { - keys.push(key); - if (typeof value.defaultValue == "boolean") { - form.addToggle(value.description, data[key]); - } else if (typeof value.defaultValue == "number") { - form.addSlider(value.description, 0, 100, 1, data[key]); - } else { - form.addTextField(value.description, null, data[key]); - } - } - form.show(player, (ctx, enabled, ...keys2) => { - if (enabled != data["enabled"]) { - if (enabled) - protection6.enable(); - if (!enabled) - protection6.disable(); - } - let config = { - enabled - }; - for (const [i, key] of Object.keys(protection6.configDefault).entries()) { - config[key] = keys2[i]; - } - protection6.setConfig(config); - player.tell(`Updated config for ${protection6.name}!`); - }); -} - -// project/behavior/src/plugins/Anti-Cheat/modules/forms/home.ts -function showHomeForm(player) { - new ActionForm("Rubedo Settings").addButton("Auto Mod", "textures/ui/permissions_op_crown.png", () => { - showAutoModHomeForm(player); - }).addButton("Banned items", "textures/blocks/sculk_shrieker_top.png", () => { - manageBannedItemsForm(player); - }).addButton("Banned blocks", "textures/blocks/barrier.png", () => { - manageBannedBlocksForm(player); - }).addButton("Enchantments", "textures/items/book_enchanted.png", () => { - manageEnchantmentLevelsForm(player); - }).addButton("Appeal Link", "textures/ui/Feedback.png", () => { - manageAppealLinkForm(player); - }).show(player); -} - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/settings.ts -new Command({ - name: "settings", - description: "Opens up the settings menu for the player", - requires: (player) => ["admin", "moderator"].includes(getRole(player)) -}).executes((ctx) => { - showHomeForm(ctx.sender); - ctx.sender.tell(`\xA7aForm request sent, close chat to continue!`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/vanish.ts -import { world as world8 } from "@minecraft/server"; -function vanish(player, say) { - if (player.hasTag(`spectator`)) { - player.runCommandAsync(`gamemode c`); - player.triggerEvent(`removeSpectator`); - player.removeTag(`spectator`); - if (!say) - return; - world8.say({ - rawtext: [ - { - translate: "multiplayer.player.joined", - with: [`\xA7e${player.name}`] - } - ] - }); - } else { - player.runCommandAsync(`gamemode spectator`); - player.triggerEvent(`addSpectator`); - player.addTag(`spectator`); - if (!say) - return; - world8.say({ - rawtext: [ - { - translate: "multiplayer.player.left", - with: [`\xA7e${player.name}`] - } - ] - }); - } -} -new Command({ - name: "vanish", - description: "Toggles Vanish Mode on the sender", - requires: (player) => getRole(player) == "admin" -}).executes((ctx) => { - vanish(ctx.sender, false); -}).boolean("say").executes((ctx, say) => { - vanish(ctx.sender, say); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/version.ts -new Command({ - name: "version", - description: "Get Current Version", - aliases: ["v"] -}).executes((ctx) => { - ctx.reply(`Current Rubedo Version: ${VERSION}`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/kick.ts -new Command({ - name: "kick", - description: "Kicks a player from the game", - requires: (player) => getRole(player) == "admin" -}).argument(new ArgumentTypes.player()).string("reason").executes((ctx, player, reason) => { - kick(player, [reason]); - ctx.reply(`\xA7aKicked ${player.name} from world`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Log.ts -var Log = class { - constructor(data) { - this.data = data; - console.warn(`[LOG]: ${data.message}`); - TABLES.logs.set(Date.now().toString(), data); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/log.ts -function timeDifference(previous) { - var msPerMinute = 60 * 1e3; - var msPerHour = msPerMinute * 60; - var msPerDay = msPerHour * 24; - var msPerMonth = msPerDay * 30; - var msPerYear = msPerDay * 365; - var elapsed = Date.now() - previous; - if (elapsed < msPerMinute) { - return Math.round(elapsed / 1e3) + " seconds ago"; - } else if (elapsed < msPerHour) { - return Math.round(elapsed / msPerMinute) + " minutes ago"; - } else if (elapsed < msPerDay) { - return Math.round(elapsed / msPerHour) + " hours ago"; - } else if (elapsed < msPerMonth) { - return "approximately " + Math.round(elapsed / msPerDay) + " days ago"; - } else if (elapsed < msPerYear) { - return "approximately " + Math.round(elapsed / msPerMonth) + " months ago"; - } else { - return "approximately " + Math.round(elapsed / msPerYear) + " years ago"; - } -} -var root7 = new Command({ - name: "log", - description: "Manages the log command", - requires: (player) => getRole(player) == "admin" -}); -root7.literal({ - name: "add", - description: "Adds a new log" -}).string("message").executes((ctx, message) => { - new Log({ message }); - ctx.reply(`\xA7aAdded new log: ${message}`); -}); -root7.literal({ - name: "getAll", - description: "Gets all logs sorted in descending" -}).int("page").array("order", ["ascending", "descending"]).executes((ctx, page, order) => { - const allLogs = Object.entries(TABLES.logs.collection()).sort( - (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) - ); - if (allLogs.length == 0) - return ctx.reply(`\xA7cNo Logs have been made!`); - const maxPages = Math.ceil(allLogs.length / 8); - if (page > maxPages) - page = maxPages; - ctx.reply( - `\xA72--- Showing logs page ${page} of ${maxPages} (${PREFIX}log getAll ) ---` - ); - for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { - ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); - } -}); -root7.literal({ - name: "getPlayersLogs", - description: "Gets all logs associated with a player" -}).argument(new ArgumentTypes.playerName()).int("page").array("order", ["ascending", "descending"]).executes((ctx, playerName, page, order) => { - const allLogs = Object.entries(TABLES.logs.collection()).filter((v) => v[1].playerName == playerName).sort( - (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) - ); - if (allLogs.length == 0) - return ctx.reply(`\xA7cNo Logs exists for "${playerName}"!`); - const maxPages = Math.ceil(allLogs.length / 8); - if (page > maxPages) - page = maxPages; - ctx.reply( - `\xA72--- Showing logs for "${playerName}" page ${page} of ${maxPages} ---` - ); - for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { - ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); - } -}); -root7.literal({ - name: "getProtectionLogs", - description: "Gets all logs associated with a protection" -}).string("protection").int("page").array("order", ["ascending", "descending"]).executes((ctx, protection6, page, order) => { - const allLogs = Object.entries(TABLES.logs.collection()).filter((v) => v[1].protection == protection6).sort( - (a, b) => order == "ascending" ? parseInt(b[0]) - parseInt(a[0]) : parseInt(a[0]) - parseInt(b[0]) - ); - if (allLogs.length == 0) - return ctx.reply(`\xA7cNo Logs exists for protection: "${protection6}"!`); - const maxPages = Math.ceil(allLogs.length / 8); - if (page > maxPages) - page = maxPages; - ctx.reply( - `\xA72--- Showing logs for Protection: "${protection6}" page ${page} of ${maxPages} ---` - ); - for (const [key, value] of allLogs.slice(page * 8 - 8, page * 8)) { - ctx.reply(`${timeDifference(parseInt(key))}: ${value.message}`); - } -}); -root7.literal({ - name: "clearAll", - description: "Clears all logs" -}).executes((ctx) => { - TABLES.logs.clear(); - ctx.reply(`\xA7aCleared All logs!`); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/commands/teleport.ts -var root8 = new Command({ - name: "teleport", - description: "Teleports entities (players, mobs, etc.).", - aliases: ["tp"], - requires: (player) => getRole(player) == "admin" -}); -root8.argument(new ArgumentTypes.player()).location("destination").executes((ctx, player, destination) => { - player.addTag("skip-movement-check"); - player.teleport(destination, player.dimension, 0, 0); - ctx.reply( - `Teleported ${player.name} to ${destination.x} ${destination.y} ${destination.z}` - ); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/ban.ts -forEachValidPlayer((player) => { - try { - const banData = TABLES.bans.get(player.id); - if (!banData) - return; - if (banData.expire && banData.expire < Date.now()) - return TABLES.bans.delete(player.id); - kick( - player, - [ - `\xA7cYou have been banned!`, - `\xA7aReason: \xA7f${banData.reason}`, - `\xA7fExpiry: \xA7b${banData.expire ? msToTime(banData.expire - Date.now()) : "Forever"}`, - `\xA7fAppeal at: \xA7b${getConfigId("appealLink")}` - ], - () => { - console.warn(new Error("Failed to kick player")); - TABLES.bans.delete(player.id); - } - ); - } catch (error) { - console.warn(error + error.stack); - } -}, 20); - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/freeze.ts -import { Location as Location4 } from "@minecraft/server"; -forEachValidPlayer((player) => { - try { - const freezeData = TABLES.freezes.get(player.id); - if (!freezeData) - return player.getComponent("movement").resetToDefaultValue(); - player.getComponent("movement").setCurrent(0); - player.teleport( - new Location4( - freezeData.location.x, - freezeData.location.y, - freezeData.location.z - ), - DIMENSIONS[freezeData.location.dimension], - 0, - 0 - ); - } catch (error) { - } -}, 200); - -// project/behavior/src/lib/Events/beforeChat.ts -import { world as world9 } from "@minecraft/server"; -var CALLBACKS4 = {}; -world9.events.beforeChat.subscribe((data) => { - if (data.message.startsWith(PREFIX)) - return; - for (const callback of Object.values(CALLBACKS4)) { - callback.callback(data); - } -}); -var beforeChat = class { - static subscribe(callback) { - const key = Date.now(); - CALLBACKS4[key] = { callback }; - return key; - } - static unsubscribe(key) { - delete CALLBACKS4[key]; - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/mute.ts -beforeChat.subscribe((data) => { - const muteData = Mute.getMuteData(data.sender); - if (!muteData) - return; - if (muteData.expire && muteData.expire < Date.now()) - return TABLES.mutes.delete(data.sender.name); - data.cancel = true; - data.sender.tell(text["modules.managers.mute.isMuted"]()); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/region.ts -import { BlockLocation as BlockLocation6, system as system9, world as world10 } from "@minecraft/server"; -system9.runSchedule(() => { - loadRegionDenys(); -}, 6e3); -world10.events.beforeItemUseOn.subscribe((data) => { - if (["moderator", "admin"].includes(getRole(data.source))) - return; - const region = Region.blockLocationInRegion( - data.blockLocation, - data.source.dimension.id - ); - if (!region) - return; - const block = data.source.dimension.getBlock(data.blockLocation); - if (DOORS_SWITCHES.includes(block.typeId) && region.permissions.doorsAndSwitches) - return; - if (BLOCK_CONTAINERS.includes(block.typeId) && region.permissions.openContainers) - return; - data.cancel = true; -}); -world10.events.beforeExplosion.subscribe((data) => { - for (let i = 0; i < data.impactedBlocks.length; i++) { - const bL = data.impactedBlocks[i]; - let region = Region.blockLocationInRegion(bL, data.dimension.id); - if (region) - return data.cancel = true; - } -}); -world10.events.entityCreate.subscribe(async ({ entity }) => { - const region = await Region.blockLocationInRegionSync( - new BlockLocation6(entity.location.x, entity.location.y, entity.location.z), - entity.dimension.id - ); - if (!region) - return; - if (region.permissions.allowedEntities.includes(entity.typeId)) - return; - entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0); - entity.kill(); -}); -EntitiesLoad.subscribe(() => { - system9.runSchedule(async () => { - for (const region of await Region.getAllRegionsSync()) { - for (const entity of DIMENSIONS[region.dimensionId].getEntities({ excludeTypes: region.permissions.allowedEntities })) { - if (!region.entityInRegion(entity)) - continue; - entity.teleport({ x: 0, y: -64, z: 0 }, entity.dimension, 0, 0); - entity.kill(); - } - } - }, 100); -}); -forEachValidPlayer((player) => { - for (const region of Region.getAllRegions()) { - if (region.entityInRegion(player)) { - player.addTag(`inRegion`); - if (!region.permissions.pvp) - player.addTag(`region-protected`); - } else { - player.removeTag(`inRegion`); - player.removeTag(`region-protected`); - } - } -}, 5); - -// project/behavior/src/plugins/Anti-Cheat/modules/events/playerJoin.ts -import { world as world11 } from "@minecraft/server"; -world11.events.playerJoin.subscribe(async ({ player }) => { - await EntitiesLoad.awaitLoad(); - if (isLockedDown() && getRole(player) != "admin") - return kick(player, text["lockdown.kick.message"]()); - if (Mute.getMuteData(player)) - player.runCommandAsync(`ability @s mute true`); - if (!TABLES.ids.has(player.name)) { - TABLES.ids.set(player.name, player.id); - } else { - player.addTag("old"); - } - const roleToSet = ChangePlayerRoleTask.getPlayersRoleToSet(player.name); - if (roleToSet) - setRole(player, roleToSet); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/pages/see.ts -import { - Items, - MinecraftItemTypes as MinecraftItemTypes4, - world as world12 -} from "@minecraft/server"; -var FILLABLE_SLOTS = [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44 -]; -var FILLABLE_SLOTS_ENDERCHEST = [ - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 37, - 38, - 39, - 40, - 41, - 42, - 43 -]; -function ViewPlayersFill(entity, page, extras) { - const container = entity.getComponent( - "minecraft:inventory" - ).container; - for (let i = 0; i < container.size; i++) { - const slot = page.slots[i]; - if (!slot || !slot.item) { - container.setItem(i, AIR); - continue; - } - container.setItem(i, slot.item.itemStack); - } - for (const [i, player] of [...world12.getPlayers()].entries()) { - const slot = FILLABLE_SLOTS[i]; - const item = new PageItem(MinecraftItemTypes4.skull, { - nameTag: player.name, - data: 3 - }); - container.setItem(slot, item.itemStack); - page.slots[slot] = { - item, - action: (ctx) => { - ctx.PageAction("moderation:see_inventory", { name: player.name }); - } - }; - } -} -function ViewPlayerInventoryFill(entity, page, extras) { - const container = entity.getComponent("minecraft:inventory").container; - for (let i = 0; i < container.size; i++) { - const slot = page.slots[i]; - if (!slot || !slot.item) { - container.setItem(i, AIR); - continue; - } - container.setItem(i, slot.item.itemStack); - } - const EnderChestItem = new PageItem(MinecraftItemTypes4.enderChest, { - nameTag: `\xA7eView \xA7f${extras?.name}\xA7e Ender Chest -\xA7fNote: \xA7cThis will not grab \xA7lANY NBT!\xA7r` - }); - container.setItem(49, EnderChestItem.itemStack); - page.slots[49] = { - item: EnderChestItem, - action: (ctx) => { - ctx.PageAction("moderation:see_ender_chest", { name: extras.name }); - } - }; - const player = [...world12.getPlayers()].find((p) => p.name == extras.name); - if (!player) { - const gui = Object.values(CHESTGUIS).find((e2) => e2.entity.id == entity.id); - gui.despawn(); - player.tell(`"${extras.name}" Could not be found, Gui Crashed`); - } - const inventory = player.getComponent("inventory").container; - let used_slots = 0; - for (let i = 0; i < inventory.size; i++) { - const item = inventory.getItem(i); - const slot = FILLABLE_SLOTS[used_slots]; - used_slots++; - if (!item) { - container.setItem(slot, AIR); - continue; - } - container.setItem(slot, item); - page.slots[slot] = { - item: new PageItem( - Items.get(item.typeId), - { amount: item.amount, data: item.data }, - item - ), - action: (ctx) => { - if (i < 9) { - player.runCommandAsync(`replaceitem entity @s slot.hotbar ${i} air`); - } else { - player.runCommandAsync( - `replaceitem entity @s slot.inventory ${i - 9} air` - ); - } - ctx.GiveAction(); - page.slots[slot] = { - item: null, - action: (ctx2) => { - inventory.addItem(ctx2.getItemAdded()); - } - }; - } - }; - } -} -async function ViewPlayerEnderChestFill(entity, page, extras) { - const container = entity.getComponent("minecraft:inventory").container; - for (let i = 0; i < container.size; i++) { - const slot = page.slots[i]; - if (!slot || !slot.item) { - container.setItem(i, AIR); - continue; - } - container.setItem(i, slot.item.itemStack); - } - const player = [...world12.getPlayers()].find((p) => p.name == extras?.name); - if (!player) { - const gui = Object.values(CHESTGUIS).find((e2) => e2.entity.id == entity.id); - gui.despawn(); - player.tell(`"${extras.name}" Could not be found, Gui Crashed`); - } - let used_slots = 0; - const ItemTypes = Object.values(MinecraftItemTypes4); - for (const item of ItemTypes) { - try { - await player.runCommandAsync( - `testfor @s[hasitem={item=${item.id},location=slot.enderchest}]` - ); - const ChestGuiItem = new PageItem(item, { - nameTag: "Note: \xA7l\xA7cThis is not the exact item" - }); - const slot = FILLABLE_SLOTS_ENDERCHEST[used_slots]; - container.setItem(slot, ChestGuiItem.itemStack); - page.slots[slot] = { - item: ChestGuiItem, - action: (ctx) => { - ctx.GiveAction(); - page.slots[slot] = null; - } - }; - used_slots++; - } catch (error) { - } - } -} -new Page("moderation:see", ViewPlayersFill).setSlots( - [50], - new PageItem(MinecraftItemTypes4.arrow, { - nameTag: "\xA7fBack" - }), - (ctx) => { - ctx.PageAction("home"); - } -).setSlots( - [48], - new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), - (ctx) => { - ctx.CloseAction(); - } -); -new Page("moderation:see_inventory", ViewPlayerInventoryFill).setSlots( - [50], - new PageItem(MinecraftItemTypes4.arrow, { - nameTag: "\xA7fBack" - }), - (ctx) => { - ctx.PageAction("moderation:see"); - } -).setSlots( - [48], - new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), - (ctx) => { - ctx.CloseAction(); - } -); -new Page("moderation:see_ender_chest", ViewPlayerEnderChestFill).setSlots( - [50], - new PageItem(MinecraftItemTypes4.arrow, { - nameTag: "\xA7fBack" - }), - (ctx) => { - ctx.PageAction("moderation:see"); - } -).setSlots( - [48], - new PageItem(MinecraftItemTypes4.barrier, { nameTag: "\xA7cClose GUI" }), - (ctx) => { - ctx.CloseAction(); - } -); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts -import { Player as Player10, MinecraftBlockTypes as MinecraftBlockTypes4 } from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/Protection.ts -import { system as system10, world as world13 } from "@minecraft/server"; -var Protection = class { - constructor(name, description, iconPath, isEnabledByDefault) { - this.name = name; - this.description = description; - this.iconPath = iconPath; - this.isEnabledByDefault = isEnabledByDefault; - this.name = name; - this.description = description; - this.iconPath = iconPath; - this.configDefault = {}; - this.isEnabled = false; - this.isEnabledByDefault = isEnabledByDefault; - this.events = {}; - this.schedules = []; - this.forEachValidPlayers = []; - PROTECTIONS[this.name] = this; - } - setConfigDefault(data) { - this.configDefault = data; - TABLES.protections.hasSync(this.name).then((v) => { - if (v) - return; - let saveData = { - enabled: true - }; - for (const key of Object.keys(data)) { - saveData[key] = data[key].defaultValue; - } - TABLES.protections.set(this.name, saveData); - }); - return this; - } - getConfig() { - let config = TABLES.protections.get(this.name); - if (!config) - config = { enabled: this.isEnabled }; - return config; - } - async setConfig(data) { - return TABLES.protections.set(this.name, data); - } - triggerChange(enabled) { - if (enabled) { - this.isEnabled = true; - this.onEnableCallback?.(); - for (const [key, value] of Object.entries(this.events)) { - if (value.triggered) - continue; - let callback = world13.events[key].subscribe( - value.callback - ); - value.triggered = true; - value.callback = callback; - } - for (const v of this.forEachValidPlayers) { - if (v.key) - continue; - let key = forEachValidPlayer(v.callback, v.delay); - v.key = key; - } - for (const v of this.schedules) { - if (v.runScheduleId) - continue; - let runScheduleId = system10.runSchedule(v.callback); - v.runScheduleId = runScheduleId; - } - } else { - this.isEnabled = false; - this.onDisableCallback?.(); - for (const [key, value] of Object.entries(this.events)) { - if (!value.triggered) - continue; - world13.events[key].unsubscribe(value.callback); - value.triggered = false; - } - for (const v of this.forEachValidPlayers) { - if (!v.key) - continue; - clearForEachValidPlayer(v.key); - v.key = null; - } - for (const v of this.schedules) { - if (!v.runScheduleId) - continue; - system10.clearRunSchedule(v.runScheduleId); - v.runScheduleId = null; - } - } - } - onEnable(callback) { - this.onEnableCallback = callback; - return this; - } - onDisable(callback) { - this.onDisableCallback = callback; - return this; - } - subscribe(id, callback) { - this.events[id] = { - callback, - triggered: false - }; - return this; - } - runSchedule(callback, tickInterval) { - this.schedules.push({ - callback, - tickInterval, - runScheduleId: null - }); - return this; - } - forEachValidPlayer(callback, delay = 0) { - this.forEachValidPlayers.push({ - callback, - delay, - key: null - }); - return this; - } - enable() { - this.triggerChange(true); - } - disable() { - this.triggerChange(false); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/cbe.ts -var CBE_ENTITIES = ["minecraft:command_block_minecart"]; -var protection = new Protection( - "cbe", - "Stops CBE", - "textures/blocks/command_block.png", - true -).setConfigDefault({ - entityCreate: { - description: "Adds NPC protection", - defaultValue: true - }, - banSpawnEggs: { - description: "If spawn eggs should be banned", - defaultValue: true - } -}); -protection.subscribe("entityCreate", ({ entity }) => { - const config = protection.getConfig(); - if (!config.entityCreate) - return; - const kill = () => { - try { - entity.triggerEvent("despawn"); - entity.kill(); - } catch (error) { - entity.kill(); - } - }; - if (CBE_ENTITIES.includes(entity.typeId)) - return kill(); - if (entity.typeId == "minecraft:npc" && !Npc.isValid(entity)) - return kill(); -}); -protection.subscribe("beforeItemUseOn", (data) => { - if (!(data.source instanceof Player10)) - return; - if (["admin", "moderator"].includes(getRole(data.source))) - return; - const config = protection.getConfig(); - if (data.item.typeId.endsWith("spawn_egg")) { - if (!config.banSpawnEggs) - return; - const block = data.source.dimension.getBlock(data.blockLocation); - if (block.typeId == MinecraftBlockTypes4.mobSpawner.id) - return; - data.cancel = true; - data.source.tell(`\xA7c[Rubedo]: You cannot place spawnEggs on the floor!`); - data.source.playSound(`note.bass`); - } else { - if (FORBIDDEN_BLOCKS.includes(data.item.typeId)) { - data.cancel = true; - return; - } - const BANNED_BLOCKS2 = getConfigId("banned_blocks"); - if (!BANNED_BLOCKS2.includes(data.item.typeId)) - return; - data.cancel = true; - new Ban(data.source, null, "Placing Banned Blocks"); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/crasher.ts -var DISTANCE = 32e4; -new Protection( - "crasher", - "Protection against type 1 crasher", - "textures/ui/servers.png", - true -).forEachValidPlayer((player) => { - if (Math.abs(player.location.x) > DISTANCE || Math.abs(player.location.y) > DISTANCE || Math.abs(player.location.z) > DISTANCE) { - new Ban(player, null, "Crasher detected"); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts -import { GameMode as GameMode2, world as world15 } from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/PlayerLog.ts -import { world as world14 } from "@minecraft/server"; -var PlayerLog = class { - constructor() { - this.data = /* @__PURE__ */ new Map(); - this.events = { - playerLeave: world14.events.playerLeave.subscribe( - (data) => this.data.delete(data.playerName) - ) - }; - } - set(player, value) { - this.data.set(player.name, value); - } - get(player) { - return this.data.get(player.name); - } - delete(player) { - this.data.delete(player.name); - } - clear() { - this.data.clear(); - } - playerNames() { - return [...this.data.keys()]; - } - includes(player) { - return this.playerNames().includes(player.name); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/gamemode.ts -var ILLEGAL_GAMEMODE = GameMode2.creative; -var ViolationCount = new PlayerLog(); -var protection2 = new Protection( - "gamemode", - "Blocks illegal gamemode", - "textures/ui/creative_icon.png", - true -).setConfigDefault({ - clearPlayer: { - description: "Whether to clear players inventory.", - defaultValue: true - }, - setToSurvival: { - description: "If player should be set to survival after being flagged.", - defaultValue: true - }, - banPlayer: { - description: "If player should be banned after violation count is met.", - defaultValue: false - }, - violationCount: { - description: "The amount of violations before ban.", - defaultValue: 0 - } -}); -protection2.runSchedule(() => { - const config = protection2.getConfig(); - for (const player of world15.getPlayers({ gameMode: ILLEGAL_GAMEMODE })) { - if (["moderator", "admin", "builder"].includes(getRole(player))) - continue; - try { - if (config.setToSurvival) - player.runCommandAsync(`gamemode s`); - if (config.clearPlayer) - player.runCommandAsync(`clear @s`); - } catch (error) { - } - new Log({ - playerName: player.name, - protection: "Gamemode", - message: `${player.name} has entered into a illegal gamemode!` - }); - const count = (ViolationCount.get(player) ?? 0) + 1; - ViolationCount.set(player, count); - if (config.banPlayer && count >= config.violationCount) - new Ban(player, null, "Illegal Gamemode"); - } -}, 20); - -// project/behavior/src/lib/Events/beforeBlockBreak.ts -import { - world as world17, - Location as Location5, - system as system12 -} from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts -import { system as system11, world as world16 } from "@minecraft/server"; - -// project/behavior/src/plugins/Anti-Cheat/modules/models/BlockInventory.ts -var BlockInventory = class { - constructor(inventory) { - this.emptySlotsCount = inventory.emptySlotsCount; - this.size = inventory.size; - this.items = []; - for (let i = 0; i < this.size; i++) { - this.items[i] = inventory.getItem(i); - } - } - load(block) { - for (let i = 0; i < block.size; i++) { - if (!this.items[i]) - continue; - block.setItem(i, this.items[i]); - } - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/managers/containers.ts -var CONTAINER_LOCATIONS = {}; -system11.runSchedule(() => { - CONTAINER_LOCATIONS = {}; - for (const player of world16.getPlayers()) { - if (player.dimension.id != "minecraft:overworld") - continue; - const blockLoc = vector3ToBlockLocation(player.location); - const pos1 = blockLoc.offset(CHECK_SIZE.x, CHECK_SIZE.y, CHECK_SIZE.z); - const pos2 = blockLoc.offset(-CHECK_SIZE.x, -CHECK_SIZE.y, -CHECK_SIZE.z); - for (const location of pos1.blocksBetween(pos2)) { - if (location.y < -64) - continue; - const block = player.dimension.getBlock(location); - if (!block) - continue; - if (!API_CONTAINERS.includes(block.typeId)) - continue; - CONTAINER_LOCATIONS[JSON.stringify(location)] = new BlockInventory( - block.getComponent("inventory").container - ); - } - } -}, 100); - -// project/behavior/src/lib/Events/beforeBlockBreak.ts -var CALLBACKS5 = {}; -world17.events.blockBreak.subscribe((data) => { - for (const callback of Object.values(CALLBACKS5)) { - callback.callback( - new BeforeBlockBreakEvent( - data.block, - data.brokenBlockPermutation, - data.dimension, - data.player - ) - ); - } -}); -var beforeBlockBreak = class { - static subscribe(callback) { - const key = Date.now(); - CALLBACKS5[key] = { callback }; - return key; - } - static unsubscribe(key) { - delete CALLBACKS5[key]; - } -}; -var BeforeBlockBreakEvent = class { - constructor(block, brokenBlockPermutation, dimension, player) { - this.block = block; - this.brokenBlockPermutation = brokenBlockPermutation; - this.dimension = dimension; - this.player = player; - this.block = block; - this.brokenBlockPermutation = brokenBlockPermutation; - this.dimension = dimension; - this.player = player; - } - set cancel(value) { - this.dimension.getBlock(this.block.location).setPermutation(this.brokenBlockPermutation.clone()); - if (API_CONTAINERS.includes(this.brokenBlockPermutation.type.id)) { - const OLD_INVENTORY = CONTAINER_LOCATIONS[JSON.stringify(this.block.location)]; - if (OLD_INVENTORY) { - OLD_INVENTORY.load(this.block.getComponent("inventory").container); - } - } - system12.run(() => { - [ - ...this.dimension.getEntities({ - maxDistance: 2, - type: "minecraft:item", - location: new Location5( - this.block.location.x, - this.block.location.y, - this.block.location.z - ) - }) - ].forEach((e2) => e2.kill()); - }); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/nuker.ts -var log = new PlayerLog(); -var IMPOSSIBLE_BREAK_TIME = 15; -var VALID_BLOCK_TAGS = [ - "snow", - "lush_plants_replaceable", - "azalea_log_replaceable", - "minecraft:crop", - "fertilize_area" -]; -var IMPOSSIBLE_BREAKS = [ - "minecraft:water", - "minecraft:flowing_water", - "minecraft:lava", - "minecraft:flowing_lava", - "minecraft:bedrock" -]; -var ViolationCount2 = new PlayerLog(); -var beforeBlockBreakKey = null; -var protection3 = new Protection( - "nuker", - "Blocks block breaking too fast", - "textures/blocks/dirt.png", - true -).setConfigDefault({ - banPlayer: { - description: "If the player should be banned once violation count is met", - defaultValue: false - }, - violationCount: { - description: "Violations before ban", - defaultValue: 0 - } -}); -protection3.onEnable(() => { - const config = protection3.getConfig(); - beforeBlockBreakKey = beforeBlockBreak.subscribe((data) => { - if (["moderator", "admin"].includes(getRole(data.player))) - return; - if (data.block.getTags().some((tag) => VALID_BLOCK_TAGS.includes(tag))) - return; - const old = log.get(data.player); - log.set(data.player, Date.now()); - if (!old) - return; - if (!IMPOSSIBLE_BREAKS.includes(data.block.typeId)) { - if (old < Date.now() - IMPOSSIBLE_BREAK_TIME) - return; - const count = (ViolationCount2.get(data.player) ?? 0) + 1; - ViolationCount2.set(data.player, count); - if (config.banPlayer && count >= config.violationCount) - new Ban(data.player, null, "Using Nuker"); - } - data.cancel = true; - }); -}).onDisable(() => { - beforeBlockBreak.unsubscribe(beforeBlockBreakKey); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/spam.ts -var previousMessage = new PlayerLog(); -var ViolationCount3 = new PlayerLog(); -var protection4 = new Protection( - "spam", - "Blocks spam in chat", - "textures/ui/mute_on.png", - true -).setConfigDefault({ - permMutePlayer: { - description: "If player should be permanently muted once violation count is met.", - defaultValue: false - }, - violationCount: { - description: "Violation count before permanent mute", - defaultValue: 0 - }, - repeatedMessages: { - description: "Blocks repeated messages", - defaultValue: true - }, - zalgo: { - description: "Blocks zalgo", - defaultValue: true - } -}); -protection4.subscribe("beforeChat", (data) => { - try { - if (data.message.startsWith(PREFIX)) - return; - if (["admin", "moderator"].includes(getRole(data.sender))) - return; - const config = protection4.getConfig(); - const isSpam = () => { - const count = (ViolationCount3.get(data.sender) ?? 0) + 1; - ViolationCount3.set(data.sender, count); - if (config.permMutePlayer && count >= config.violationCount) - new Mute(data.sender, null, "Spamming"); - }; - if (config.repeatedMessages && previousMessage.get(data.sender) == data.message) { - data.cancel = true; - isSpam(); - return data.sender.tell(`\xA7cRepeated message detected!`); - } - if (config.zalgo && /%CC%/g.test(encodeURIComponent(data.message))) { - data.cancel = true; - isSpam(); - return data.sender.tell( - `\xA7cYou message contains some type of zalgo and cannot be sent!` - ); - } - previousMessage.set(data.sender, data.message); - } catch (error) { - console.warn(error + error.stack); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/unobtainable.ts -var ViolationCount4 = new PlayerLog(); -function flag(player, index) { - const inventory = player.getComponent("inventory").container; - const item = inventory.getItem(index); - const data = getConfigId("cbe_config"); - if (data.clearItem) - inventory.setItem(index, AIR); - new Log({ - playerName: player.name, - message: `${player.name} Has obtained a unobtainable item: ${item.typeId}`, - protection: "unobtainable" - }); - if (!data.banPlayer) - return; - const violations2 = (ViolationCount4.get(player) ?? 0) + 1; - ViolationCount4.set(player, violations2); - if (violations2 < data.violationCount) - return; - new Ban(player, null, "Possession of Unobtainable item"); -} -new Protection( - "unobtainable", - "Blocks unobtainable items", - "textures/blocks/end_portal.png", - true -).forEachValidPlayer((player) => { - console.warn(`unobtainable`); - const BANNED_ITEMS2 = getConfigId("banned_items"); - const inventory = player.getComponent("inventory").container; - for (let i = 0; i < inventory.size; i++) { - const item = inventory.getItem(i); - if (!item) - continue; - if (BANNED_ITEMS2.includes(item.typeId)) - return flag(player, i); - if (FORBIDDEN_ITEMS.includes(item.typeId)) { - new Log({ - playerName: player.name, - message: `${player.name} Has obtained a Forbidden item: ${item.typeId}`, - protection: "unobtainable" - }); - return inventory.setItem(i, AIR); - } - let enchantments = []; - for (const enchantment of item.getComponent("enchantments").enchantments) { - const MAX_LEVEL = getMaxEnchantmentLevel(enchantment); - if (enchantment.level > MAX_LEVEL) - return flag(player, i); - if (enchantment.level < 1) - return flag(player, i); - if (enchantments.includes(enchantment.type.id)) - return flag(player, i); - enchantments.push(enchantment.type.id); - } - } -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/nbt.ts -import { - MinecraftBlockTypes as MinecraftBlockTypes5, - MinecraftEntityTypes, - MinecraftItemTypes as MinecraftItemTypes5, - Player as Player13 -} from "@minecraft/server"; -var BLOCKS = [ - MinecraftBlockTypes5.chest.id, - MinecraftBlockTypes5.trappedChest.id, - MinecraftBlockTypes5.barrel.id, - MinecraftBlockTypes5.dispenser.id, - MinecraftBlockTypes5.dropper.id, - MinecraftBlockTypes5.furnace.id, - MinecraftBlockTypes5.litFurnace.id, - MinecraftBlockTypes5.blastFurnace.id, - MinecraftBlockTypes5.litBlastFurnace.id, - MinecraftBlockTypes5.smoker.id, - MinecraftBlockTypes5.litSmoker.id, - MinecraftBlockTypes5.hopper.id, - MinecraftBlockTypes5.beehive.id, - MinecraftBlockTypes5.beeNest.id, - MinecraftBlockTypes5.mobSpawner.id -]; -var CHEST_BOATS = [ - MinecraftItemTypes5.chestBoat.id, - MinecraftItemTypes5.oakChestBoat.id, - MinecraftItemTypes5.birchChestBoat.id, - MinecraftItemTypes5.acaciaChestBoat.id, - MinecraftItemTypes5.jungleChestBoat.id, - MinecraftItemTypes5.spruceChestBoat.id, - MinecraftItemTypes5.darkOakChestBoat.id, - MinecraftItemTypes5.mangroveChestBoat.id -]; -new Protection( - "nbt", - "Blocks illegal nbt on items", - "textures/ui/icon_random.png", - true -).subscribe("blockPlace", async ({ block }) => { - if (!BLOCKS.includes(block.typeId)) - return; - const permutation = block.permutation; - await block.dimension.runCommandAsync( - `setblock ${block.x} ${block.y} ${block.z} ${block.typeId}` - ); - block.setPermutation(permutation); -}).subscribe("beforeItemUseOn", (data) => { - if (!(data.source instanceof Player13)) - return; - if (!CHEST_BOATS.includes(data.item.typeId)) - return; - data.cancel = true; - data.source.dimension.spawnEntity( - MinecraftEntityTypes.chestBoat.id, - data.blockLocation.above() - ); - if (getGamemode(data.source) == "creative") - return; - data.source.getComponent("inventory").container.setItem(data.source.selectedSlot, AIR); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts -import { - MinecraftEffectTypes, - MinecraftItemTypes as MinecraftItemTypes6, - Player as Player15 -} from "@minecraft/server"; - -// project/behavior/src/lib/Events/onPlayerMove.ts -import { system as system13, world as world18 } from "@minecraft/server"; -var CALLBACKS6 = {}; -function vector3Equals(from, to) { - if (from.x != to.x) - return false; - if (from.y != to.y) - return false; - if (from.z != to.z) - return false; - return true; -} -var playerLocation = new PlayerLog(); -system13.runSchedule(() => { - const sendCallback2 = (player, data) => { - for (const callback of Object.values(CALLBACKS6)) { - callback.callback(player, data); - } - }; - for (const player of world18.getPlayers()) { - const oldLocation = playerLocation.get(player); - if (oldLocation) { - if (vector3Equals(player.location, oldLocation.location)) { - continue; - } - } - playerLocation.set(player, { - location: player.location, - dimension: player.dimension - }); - if (!oldLocation) - continue; - sendCallback2(player, oldLocation); - } -}); -var onPlayerMove = class { - static subscribe(callback) { - const key = Date.now(); - CALLBACKS6[key] = { callback }; - return key; - } - static unsubscribe(key) { - delete CALLBACKS6[key]; - } - static delete(player) { - playerLocation.delete(player); - } -}; - -// project/behavior/src/plugins/Anti-Cheat/config/movement.ts -var MOVEMENT_DISTANCE_THRESHOLD = 0.8; -var MOVEMENT_CONSTANTS = { - walk: { - velocity: 0.17, - distance: 0.23 - }, - run: { - velocity: 0.19, - distance: 0.35 - } -}; -var SPEED_EFFECT_INCREASE = 0.056; -var ANTI_TP_DISTANCE_THRESHOLD = 10; -var TAGS = ["gliding", "riding"]; - -// project/behavior/src/plugins/Anti-Cheat/modules/protections/movement.ts -var violations = new PlayerLog(); -function distanceBetween(loc1, loc2) { - return Math.hypot(loc2.x - loc1.x, loc2.z - loc1.z); -} -function getSpeedOffset(player) { - const speed = player.getEffect(MinecraftEffectTypes.speed)?.amplifier ?? 0; - return speed * SPEED_EFFECT_INCREASE; -} -function isDistanceFlag(distance, player) { - const speedIntensity = getSpeedOffset(player); - const offset = MOVEMENT_CONSTANTS.run.distance + MOVEMENT_DISTANCE_THRESHOLD; - return distance > speedIntensity + offset; -} -function flag2(player, old) { - const violationCount = (violations.get(player) ?? 0) + 1; - violations.set(player, violationCount); - onPlayerMove.delete(player); - if (violationCount < 3) - return; - player.teleport( - old.location, - old.dimension, - player.rotation.x, - player.rotation.y - ); -} -var onPlayerMoveSubKey = null; -var protection5 = new Protection( - "movement", - "Blocks illegal movements on players", - "textures/ui/move.png", - true -).setConfigDefault({ - tpCheck: { - description: "If teleports should be flagged", - defaultValue: true - } -}); -protection5.onEnable(() => { - const config = protection5.getConfig(); - onPlayerMoveSubKey = onPlayerMove.subscribe((player, old) => { - if (getRole(player) == "admin") - return; - if (player.dimension.id != old.dimension.id) - return; - if (player.getTags().some((tag) => TAGS.includes(tag))) - return; - const distance = distanceBetween(player.location, old.location); - if (player.hasTag(`skip-movement-check`)) - return player.removeTag(`skip-movement-check`); - if (distance > ANTI_TP_DISTANCE_THRESHOLD) { - if (!config.tpCheck) - return; - flag2(player, old); - } else { - if (!isDistanceFlag(distance, player)) - return; - flag2(player, old); - } - }); -}).onDisable(() => { - onPlayerMove.unsubscribe(onPlayerMoveSubKey); -}); -protection5.subscribe("dataDrivenEntityTriggerEvent", (data) => { - if (!(data.entity instanceof Player15)) - return; - if (data.id != "on_death") - return; - onPlayerMove.delete(data.entity); -}); -protection5.subscribe("projectileHit", ({ projectile, source }) => { - if (projectile.typeId != MinecraftItemTypes6.enderPearl.id) - return; - if (!(source instanceof Player15)) - return; - onPlayerMove.delete(source); -}); -protection5.subscribe("itemCompleteCharge", ({ itemStack, source }) => { - if (itemStack.typeId != MinecraftItemTypes6.chorusFruit.id) - return; - if (!(source instanceof Player15)) - return; - onPlayerMove.delete(source); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/events/beforeDataDrivenEntityTriggerEvent.ts -import { MinecraftEffectTypes as MinecraftEffectTypes2, Player as Player16, world as world19 } from "@minecraft/server"; -var e = world19.events.beforeDataDrivenEntityTriggerEvent.subscribe((data) => { - if (!(data.entity instanceof Player16)) - return; - if (data.id != "rubedo:becomeAdmin") - return; - data.entity.removeTag("CHECK_PACK"); - const serverOwnerName = getServerOwnerName(); - if (serverOwnerName) { - data.entity.playSound("note.bass"); - data.entity.tell( - `\xA7cFailed to give server owner: "${serverOwnerName}" is already owner!` - ); - return world19.events.beforeDataDrivenEntityTriggerEvent.unsubscribe(e); - } - setRole(data.entity, "admin"); - setServerOwner(data.entity); - data.entity.addEffect(MinecraftEffectTypes2.blindness, 3, 255, true); - data.entity.tell( - `\xA7aYou have now been set as the "owner" of this server. The command "/function start" will not do anything anymore, type "-help" for more information!` - ); -}); - -// project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts -import { - DynamicPropertiesDefinition, - MinecraftEntityTypes as MinecraftEntityTypes2, - world as world20 -} from "@minecraft/server"; - -// project/behavior/src/config/objectives.ts -var OBJECTIVES = []; - -// project/behavior/src/plugins/Anti-Cheat/modules/events/worldInitialize.ts -world20.events.worldInitialize.subscribe(({ propertyRegistry }) => { - let def2 = new DynamicPropertiesDefinition(); - def2.defineString("role", 30); - propertyRegistry.registerEntityTypeDynamicProperties( - def2, - MinecraftEntityTypes2.player - ); - let def3 = new DynamicPropertiesDefinition(); - def3.defineString("worldsOwner", 100); - def3.defineBoolean("isLockDown"); - propertyRegistry.registerWorldDynamicProperties(def3); - for (const obj of OBJECTIVES) { - world20.scoreboard.addObjective(obj.objective, obj.displayName ?? ""); - } -}); - -// project/behavior/src/plugins/Anti-Cheat/index.ts -var NPC_LOCATIONS = []; -function clearNpcLocations() { - NPC_LOCATIONS = []; -} - -// project/behavior/src/plugins/import.ts -console.warn(`----- Importing Plugins -----`); - -// project/behavior/src/database/index.ts -import { - DynamicPropertiesDefinition as DynamicPropertiesDefinition2, - EntityTypes, - world as world21 -} from "@minecraft/server"; -world21.events.worldInitialize.subscribe(({ propertyRegistry }) => { - DIMENSIONS.overworld.runCommandAsync( - `tickingarea add ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} ${ENTITY_LOCATION.x} ${ENTITY_LOCATION.y} ${ENTITY_LOCATION.z} db true` - ); - let def = new DynamicPropertiesDefinition2(); - def.defineString("tableName", 30); - def.defineNumber("index"); - propertyRegistry.registerEntityTypeDynamicProperties( - def, - EntityTypes.get(ENTITY_IDENTIFIER) - ); -}); - -// project/behavior/src/index.ts -console.warn(`---- STARTING RUBEDO ----`); -system14.events.beforeWatchdogTerminate.subscribe((data) => { - data.cancel = true; - console.warn(`WATCHDOG TRIED TO CRASH = ${data.terminateReason}`); -}); -var AIR = new ItemStack5(MinecraftItemTypes7.stick, 0); -export { - AIR -};