UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

319 lines (318 loc) • 32 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); require("../_virtual/_rolldown/runtime.cjs.cjs"); const require_network_type_CommandParameter = require("../network/type/CommandParameter.cjs.cjs"); const require_network_type_CommandEnum = require("../network/type/CommandEnum.cjs.cjs"); const require_utils_ParseTargetSelector = require("../utils/ParseTargetSelector.cjs.cjs"); const require_utils_ParseTildeCaretNotation = require("../utils/ParseTildeCaretNotation.cjs.cjs"); let _jsprismarine_math = require("@jsprismarine/math"); let _jsprismarine_minecraft = require("@jsprismarine/minecraft"); let _jsprismarine_brigadier = require("@jsprismarine/brigadier"); //#region src/command/CommandArguments.ts var CommandArgument = class { getReadableType() { return ""; } getParameters(server) { return /* @__PURE__ */ new Set(); } }; var CommandArgumentGamemode = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "gameMode"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, _context) { return (0, _jsprismarine_minecraft.getGametypeName)((0, _jsprismarine_minecraft.getGametypeId)(reader.readString())); } async listSuggestions(_context, _builder) { return _jsprismarine_brigadier.Suggestions.empty(); } getExamples() { return [ "survival", "creative", "adventure", "spectator" ]; } getReadableType() { return this.name; } getParameters() { const gameModeEnum = new require_network_type_CommandEnum.CommandEnum(); gameModeEnum.name = "GameMode"; gameModeEnum.values = [ "survival", "creative", "adventure", "spectator" ]; return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, isOptional: this.optional, flags: this.flags, enum: gameModeEnum, postfix: this.postfix })]); } }; var CommandArgumentMob = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "entityType"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, _context) { let str = ""; while (reader.canRead()) { const pos = reader.getCursor(); const char = reader.read(); if (char === " ") { reader.setCursor(pos); break; } str += char; } return str; } async listSuggestions(_context, _builder) { return _jsprismarine_brigadier.Suggestions.empty(); } getExamples() { return []; } getReadableType() { return this.name; } getParameters() { const entityTypeEnum = new require_network_type_CommandEnum.CommandEnum(); entityTypeEnum.name = "EntityType"; entityTypeEnum.values = []; return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, isOptional: this.optional, flags: this.flags, enum: entityTypeEnum, postfix: this.postfix })]); } }; var CommandArgumentEntity = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "target"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, context) { let player = ""; while (reader.canRead()) { const pos = reader.getCursor(); const char = reader.read(); if (char === " ") { reader.setCursor(pos); break; } player += char; } if (player.startsWith("@")) try { return require_utils_ParseTargetSelector.default({ input: player, source: context.getSource(), entities: context.getSource().getWorld().getEntities() }); } catch (error) { if (!error.message.includes("no results")) throw error; return []; } return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)]; } getReadableType() { return this.name; } getParameters() { return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, paramType: require_network_type_CommandParameter.CommandParameterType.Target, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var CommandArgumentPosition = class extends _jsprismarine_math.Vector3 { name; optional; flags; postfix; constructor(data) { super(0, 0, 0); this.name = data?.name ?? "position"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, context) { const getPos = () => { let pos = ""; while (reader.canRead()) { const cursor = reader.getCursor(); const char = reader.read(); if (char === " ") { reader.setCursor(cursor); break; } pos += char; } return pos; }; this.setX(require_utils_ParseTildeCaretNotation.default({ input: getPos(), source: context.getSource(), type: "x" })); reader.skip(); this.setY(require_utils_ParseTildeCaretNotation.default({ input: getPos(), source: context.getSource(), type: "y" })); reader.skip(); this.setZ(require_utils_ParseTildeCaretNotation.default({ input: getPos(), source: context.getSource(), type: "z" })); return this; } getReadableType() { return this.name; } getParameters() { return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, paramType: require_network_type_CommandParameter.CommandParameterType.Position, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var CommandArgumentCommand = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "command"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, _context) { return reader.readString(); } getReadableType() { return this.name; } getParameters() { return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, paramType: require_network_type_CommandParameter.CommandParameterType.Position, isOptional: this.optional, flags: this.flags, postfix: this.postfix })]); } }; var BooleanArgumentCommand = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "boolean"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, _context) { if (reader.readString() === "true") return true; return false; } getReadableType() { return this.name; } getParameters() { const booleanEnum = new require_network_type_CommandEnum.CommandEnum(); booleanEnum.name = "Boolean"; booleanEnum.values = ["true", "false"]; return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, isOptional: this.optional, enum: booleanEnum, flags: this.flags, postfix: this.postfix })]); } }; var PlayerArgumentCommand = class { name; optional; flags; postfix; constructor(data) { this.name = data?.name ?? "player"; this.optional = data?.optional ?? false; this.flags = data?.flags ?? require_network_type_CommandParameter.CommandParameterFlags.NONE; this.postfix = data?.postfix ?? null; } parse(reader, _context) { return reader.readString(); } getReadableType() { return this.name; } getParameters(server) { const playerEnum = new require_network_type_CommandEnum.CommandEnum(); playerEnum.name = "Player"; try { playerEnum.values = server.getSessionManager().getAllPlayers().map((player) => player.getName()); } catch { playerEnum.values = []; } return new Set([new require_network_type_CommandParameter.default({ paramName: this.name, isOptional: this.optional, enum: playerEnum, flags: this.flags, postfix: this.postfix })]); } }; //#endregion exports.BooleanArgumentCommand = BooleanArgumentCommand; exports.CommandArgument = CommandArgument; exports.CommandArgumentCommand = CommandArgumentCommand; exports.CommandArgumentEntity = CommandArgumentEntity; exports.CommandArgumentGamemode = CommandArgumentGamemode; exports.CommandArgumentMob = CommandArgumentMob; exports.CommandArgumentPosition = CommandArgumentPosition; exports.PlayerArgumentCommand = PlayerArgumentCommand; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZEFyZ3VtZW50cy5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kL0NvbW1hbmRBcmd1bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21tYW5kQ29udGV4dCwgU3RyaW5nUmVhZGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IHsgU3VnZ2VzdGlvbnMgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JyaWdhZGllcic7XG5pbXBvcnQgQ29tbWFuZFBhcmFtZXRlciwgeyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MsIENvbW1hbmRQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRQYXJhbWV0ZXInO1xuXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9tYXRoJztcbmltcG9ydCB7IGdldEdhbWV0eXBlSWQsIGdldEdhbWV0eXBlTmFtZSB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWluZWNyYWZ0JztcbmltcG9ydCB0eXBlIFBsYXllciBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgeyBDb21tYW5kRW51bSB9IGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgUGFyc2VUYXJnZXRTZWxlY3RvciBmcm9tICcuLi91dGlscy9QYXJzZVRhcmdldFNlbGVjdG9yJztcbmltcG9ydCBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbiBmcm9tICcuLi91dGlscy9QYXJzZVRpbGRlQ2FyZXROb3RhdGlvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tYW5kQXJndW1lbnQge1xuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycyhzZXJ2ZXI6IFNlcnZlcik6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50R2FtZW1vZGUgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnZ2FtZU1vZGUnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgcmV0dXJuIGdldEdhbWV0eXBlTmFtZShnZXRHYW1ldHlwZUlkKHJlYWRlci5yZWFkU3RyaW5nKCkpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGxpc3RTdWdnZXN0aW9ucyhfY29udGV4dDogYW55LCBfYnVpbGRlcjogYW55KSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuIFN1Z2dlc3Rpb25zLmVtcHR5KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFeGFtcGxlcygpIHtcbiAgICAgICAgcmV0dXJuIFsnc3Vydml2YWwnLCAnY3JlYXRpdmUnLCAnYWR2ZW50dXJlJywgJ3NwZWN0YXRvciddO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBnYW1lTW9kZUVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgZ2FtZU1vZGVFbnVtLm5hbWUgPSAnR2FtZU1vZGUnO1xuXG4gICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGR5bmFtaWNcbiAgICAgICAgZ2FtZU1vZGVFbnVtLnZhbHVlcyA9IFsnc3Vydml2YWwnLCAnY3JlYXRpdmUnLCAnYWR2ZW50dXJlJywgJ3NwZWN0YXRvciddO1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBlbnVtOiBnYW1lTW9kZUVudW0sXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRNb2IgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnZW50aXR5VHlwZSc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgIHdoaWxlIChyZWFkZXIuY2FuUmVhZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKHBvcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0ciArPSBjaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGxpc3RTdWdnZXN0aW9ucyhfY29udGV4dDogYW55LCBfYnVpbGRlcjogYW55KSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuIFN1Z2dlc3Rpb25zLmVtcHR5KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFeGFtcGxlcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBlbnRpdHlUeXBlRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBlbnRpdHlUeXBlRW51bS5uYW1lID0gJ0VudGl0eVR5cGUnO1xuICAgICAgICBlbnRpdHlUeXBlRW51bS52YWx1ZXMgPSBbXTsgLy9PYmplY3QuZW50cmllcyhFbnRpdGllcykubWFwKChbLCBlbnRpdHldKSA9PiBlbnRpdHkuTU9CX0lEKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgZW51bTogZW50aXR5VHlwZUVudW0sXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRFbnRpdHkgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAndGFyZ2V0JztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIGNvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgbGV0IHBsYXllciA9ICcnO1xuICAgICAgICB3aGlsZSAocmVhZGVyLmNhblJlYWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gcmVhZGVyLmdldEN1cnNvcigpO1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnNldEN1cnNvcihwb3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwbGF5ZXIgKz0gY2hhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGF5ZXIuc3RhcnRzV2l0aCgnQCcpKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VUYXJnZXRTZWxlY3Rvcih7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBwbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgZW50aXRpZXM6IGNvbnRleHQuZ2V0U291cmNlKCkuZ2V0V29ybGQoKS5nZXRFbnRpdGllcygpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIGlmICghKGVycm9yIGFzIGFueSkubWVzc2FnZS5pbmNsdWRlcygnbm8gcmVzdWx0cycpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjb250ZXh0LmdldFNvdXJjZSgpLmdldFNlcnZlcigpLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyQnlFeGFjdE5hbWUocGxheWVyKV07IC8vIFRPRE86IGJ5IG5hbWUgbm90IGV4YWN0XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlRhcmdldCxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50UG9zaXRpb24gZXh0ZW5kcyBWZWN0b3IzIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHN1cGVyKDAsIDAsIDApO1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdwb3NpdGlvbic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGdldFBvcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSAnJztcbiAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuY2FuUmVhZCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yID0gcmVhZGVyLmdldEN1cnNvcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNldEN1cnNvcihjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwb3MgKz0gY2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXRYKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3gnXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZWFkZXIuc2tpcCgpO1xuICAgICAgICB0aGlzLnNldFkoXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJlYWRlci5za2lwKCk7XG4gICAgICAgIHRoaXMuc2V0WihcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd6J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2NvbW1hbmQnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuQXJndW1lbnRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2Jvb2xlYW4nO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgY29uc3QgYm9vbGVhbiA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKGJvb2xlYW4gPT09ICd0cnVlJykgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBib29sZWFuRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBib29sZWFuRW51bS5uYW1lID0gJ0Jvb2xlYW4nO1xuICAgICAgICBib29sZWFuRW51bS52YWx1ZXMgPSBbJ3RydWUnLCAnZmFsc2UnXTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZW51bTogYm9vbGVhbkVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJBcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncGxheWVyJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKHNlcnZlcjogU2VydmVyKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgcGxheWVyRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBwbGF5ZXJFbnVtLm5hbWUgPSAnUGxheWVyJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsYXllckVudW0udmFsdWVzID0gc2VydmVyXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLnZhbHVlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZW51bTogcGxheWVyRW51bSxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFZQSxJQUFzQixrQkFBdEIsTUFBc0M7Q0FDbEMsa0JBQWlDO0VBQzdCLE9BQU87Q0FDWDtDQUVBLGNBQXFCLFFBQW1EO0VBQ3BFLHVCQUFPLElBQUksSUFBSTtDQUNuQjtBQUNKO0FBRUEsSUFBYSwwQkFBYixNQUFnRTtDQUM1RDtDQUNBO0NBQ0E7Q0FDQTtDQUVBLFlBQW1CLE1BQStGO0VBQzlHLEtBQUssT0FBTyxNQUFNLFFBQVE7RUFDMUIsS0FBSyxXQUFXLE1BQU0sWUFBWTtFQUNsQyxLQUFLLFFBQVEsTUFBTSxTQUFTLHNDQUFBLHNCQUFzQjtFQUNsRCxLQUFLLFVBQVUsTUFBTSxXQUFXO0NBQ3BDO0NBRUEsTUFBYSxRQUFzQixVQUFrQztFQUNqRSxRQUFBLEdBQUEsd0JBQUEsa0JBQUEsR0FBQSx3QkFBQSxlQUFxQyxPQUFPLFdBQVcsQ0FBQyxDQUFDO0NBQzdEO0NBQ0EsTUFBYSxnQkFBZ0IsVUFBZSxVQUFlO0VBRXZELE9BQU8sd0JBQUEsWUFBWSxNQUFNO0NBQzdCO0NBQ0EsY0FBcUI7RUFDakIsT0FBTztHQUFDO0dBQVk7R0FBWTtHQUFhO0VBQVc7Q0FDNUQ7Q0FFQSxrQkFBaUM7RUFDN0IsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsZ0JBQThDO0VBQzFDLE1BQU0sZUFBZSxJQUFJLGlDQUFBLFlBQVk7RUFDckMsYUFBYSxPQUFPO0VBR3BCLGFBQWEsU0FBUztHQUFDO0dBQVk7R0FBWTtHQUFhO0VBQVc7RUFDdkUsT0FBTyxJQUFJLElBQUksQ0FDWCxJQUFJLHNDQUFBLFFBQWlCO0dBQ2pCLFdBQVcsS0FBSztHQUNoQixZQUFZLEtBQUs7R0FDakIsT0FBTyxLQUFLO0dBQ1osTUFBTTtHQUNOLFNBQVMsS0FBSztFQUNsQixDQUFDLENBQ0wsQ0FBQztDQUNMO0FBQ0o7QUFFQSxJQUFhLHFCQUFiLE1BQTJEO0NBQ3ZEO0NBQ0E7Q0FDQTtDQUNBO0NBRUEsWUFBbUIsTUFBK0Y7RUFDOUcsS0FBSyxPQUFPLE1BQU0sUUFBUTtFQUMxQixLQUFLLFdBQVcsTUFBTSxZQUFZO0VBQ2xDLEtBQUssUUFBUSxNQUFNLFNBQVMsc0NBQUEsc0JBQXNCO0VBQ2xELEtBQUssVUFBVSxNQUFNLFdBQVc7Q0FDcEM7Q0FFQSxNQUFhLFFBQXNCLFVBQWtDO0VBQ2pFLElBQUksTUFBTTtFQUNWLE9BQU8sT0FBTyxRQUFRLEdBQUc7R0FDckIsTUFBTSxNQUFNLE9BQU8sVUFBVTtHQUM3QixNQUFNLE9BQU8sT0FBTyxLQUFLO0dBQ3pCLElBQUksU0FBUyxLQUFLO0lBQ2QsT0FBTyxVQUFVLEdBQUc7SUFDcEI7R0FDSjtHQUVBLE9BQU87RUFDWDtFQUVBLE9BQU87Q0FDWDtDQUNBLE1BQWEsZ0JBQWdCLFVBQWUsVUFBZTtFQUV2RCxPQUFPLHdCQUFBLFlBQVksTUFBTTtDQUM3QjtDQUNBLGNBQXFCO0VBQ2pCLE9BQU8sQ0FBQztDQUNaO0NBRUEsa0JBQWlDO0VBQzdCLE9BQU8sS0FBSztDQUNoQjtDQUVBLGdCQUE4QztFQUMxQyxNQUFNLGlCQUFpQixJQUFJLGlDQUFBLFlBQVk7RUFDdkMsZUFBZSxPQUFPO0VBQ3RCLGVBQWUsU0FBUyxDQUFDO0VBQ3pCLE9BQU8sSUFBSSxJQUFJLENBQ1gsSUFBSSxzQ0FBQSxRQUFpQjtHQUNqQixXQUFXLEtBQUs7R0FDaEIsWUFBWSxLQUFLO0dBQ2pCLE9BQU8sS0FBSztHQUNaLE1BQU07R0FDTixTQUFTLEtBQUs7RUFDbEIsQ0FBQyxDQUNMLENBQUM7Q0FDTDtBQUNKO0FBRUEsSUFBYSx3QkFBYixNQUE4RDtDQUMxRDtDQUNBO0NBQ0E7Q0FDQTtDQUVBLFlBQW1CLE1BQStGO0VBQzlHLEtBQUssT0FBTyxNQUFNLFFBQVE7RUFDMUIsS0FBSyxXQUFXLE1BQU0sWUFBWTtFQUNsQyxLQUFLLFFBQVEsTUFBTSxTQUFTLHNDQUFBLHNCQUFzQjtFQUNsRCxLQUFLLFVBQVUsTUFBTSxXQUFXO0NBQ3BDO0NBRUEsTUFBYSxRQUFzQixTQUFpQztFQUNoRSxJQUFJLFNBQVM7RUFDYixPQUFPLE9BQU8sUUFBUSxHQUFHO0dBQ3JCLE1BQU0sTUFBTSxPQUFPLFVBQVU7R0FDN0IsTUFBTSxPQUFPLE9BQU8sS0FBSztHQUN6QixJQUFJLFNBQVMsS0FBSztJQUNkLE9BQU8sVUFBVSxHQUFHO0lBQ3BCO0dBQ0o7R0FFQSxVQUFVO0VBQ2Q7RUFFQSxJQUFJLE9BQU8sV0FBVyxHQUFHLEdBQ3JCLElBQUk7R0FDQSxPQUFPLGtDQUFBLFFBQW9CO0lBQ3ZCLE9BQU87SUFDUCxRQUFRLFFBQVEsVUFBVTtJQUMxQixVQUFVLFFBQVEsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZO0dBQ3pELENBQUM7RUFDTCxTQUFTLE9BQWdCO0dBQ3JCLElBQUksQ0FBRSxNQUFjLFFBQVEsU0FBUyxZQUFZLEdBQUcsTUFBTTtHQUMxRCxPQUFPLENBQUM7RUFDWjtFQUVKLE9BQU8sQ0FBQyxRQUFRLFVBQVUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLE1BQU0sQ0FBQztDQUM1RjtDQUVBLGtCQUFpQztFQUM3QixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxnQkFBOEM7RUFDMUMsT0FBTyxJQUFJLElBQUksQ0FDWCxJQUFJLHNDQUFBLFFBQWlCO0dBQ2pCLFdBQVcsS0FBSztHQUNoQixXQUFXLHNDQUFBLHFCQUFxQjtHQUNoQyxZQUFZLEtBQUs7R0FDakIsT0FBTyxLQUFLO0dBQ1osU0FBUyxLQUFLO0VBQ2xCLENBQUMsQ0FDTCxDQUFDO0NBQ0w7QUFDSjtBQUVBLElBQWEsMEJBQWIsY0FBNkMsbUJBQUEsUUFBbUM7Q0FDNUU7Q0FDQTtDQUNBO0NBQ0E7Q0FFQSxZQUFtQixNQUErRjtFQUM5RyxNQUFNLEdBQUcsR0FBRyxDQUFDO0VBQ2IsS0FBSyxPQUFPLE1BQU0sUUFBUTtFQUMxQixLQUFLLFdBQVcsTUFBTSxZQUFZO0VBQ2xDLEtBQUssUUFBUSxNQUFNLFNBQVMsc0NBQUEsc0JBQXNCO0VBQ2xELEtBQUssVUFBVSxNQUFNLFdBQVc7Q0FDcEM7Q0FFQSxNQUFhLFFBQXNCLFNBQWlDO0VBQ2hFLE1BQU0sZUFBZTtHQUNqQixJQUFJLE1BQU07R0FDVixPQUFPLE9BQU8sUUFBUSxHQUFHO0lBQ3JCLE1BQU0sU0FBUyxPQUFPLFVBQVU7SUFDaEMsTUFBTSxPQUFPLE9BQU8sS0FBSztJQUN6QixJQUFJLFNBQVMsS0FBSztLQUNkLE9BQU8sVUFBVSxNQUFNO0tBQ3ZCO0lBQ0o7SUFFQSxPQUFPO0dBQ1g7R0FDQSxPQUFPO0VBQ1g7RUFFQSxLQUFLLEtBQ0Qsc0NBQUEsUUFBd0I7R0FDcEIsT0FBTyxPQUFPO0dBQ2QsUUFBUSxRQUFRLFVBQVU7R0FDMUIsTUFBTTtFQUNWLENBQUMsQ0FDTDtFQUNBLE9BQU8sS0FBSztFQUNaLEtBQUssS0FDRCxzQ0FBQSxRQUF3QjtHQUNwQixPQUFPLE9BQU87R0FDZCxRQUFRLFFBQVEsVUFBVTtHQUMxQixNQUFNO0VBQ1YsQ0FBQyxDQUNMO0VBQ0EsT0FBTyxLQUFLO0VBQ1osS0FBSyxLQUNELHNDQUFBLFFBQXdCO0dBQ3BCLE9BQU8sT0FBTztHQUNkLFFBQVEsUUFBUSxVQUFVO0dBQzFCLE1BQU07RUFDVixDQUFDLENBQ0w7RUFDQSxPQUFPO0NBQ1g7Q0FFQSxrQkFBaUM7RUFDN0IsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsZ0JBQThDO0VBQzFDLE9BQU8sSUFBSSxJQUFJLENBQ1gsSUFBSSxzQ0FBQSxRQUFpQjtHQUNqQixXQUFXLEtBQUs7R0FDaEIsV0FBVyxzQ0FBQSxxQkFBcUI7R0FDaEMsWUFBWSxLQUFLO0dBQ2pCLE9BQU8sS0FBSztHQUNaLFNBQVMsS0FBSztFQUNsQixDQUFDLENBQ0wsQ0FBQztDQUNMO0FBQ0o7QUFFQSxJQUFhLHlCQUFiLE1BQStEO0NBQzNEO0NBQ0E7Q0FDQTtDQUNBO0NBRUEsWUFBbUIsTUFBK0Y7RUFDOUcsS0FBSyxPQUFPLE1BQU0sUUFBUTtFQUMxQixLQUFLLFdBQVcsTUFBTSxZQUFZO0VBQ2xDLEtBQUssUUFBUSxNQUFNLFNBQVMsc0NBQUEsc0JBQXNCO0VBQ2xELEtBQUssVUFBVSxNQUFNLFdBQVc7Q0FDcEM7Q0FFQSxNQUFhLFFBQXNCLFVBQWtDO0VBR2pFLE9BRmdCLE9BQU8sV0FFaEI7Q0FDWDtDQUVBLGtCQUFpQztFQUM3QixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxnQkFBOEM7RUFDMUMsT0FBTyxJQUFJLElBQUksQ0FDWCxJQUFJLHNDQUFBLFFBQWlCO0dBQ2pCLFdBQVcsS0FBSztHQUNoQixXQUFXLHNDQUFBLHFCQUFxQjtHQUNoQyxZQUFZLEtBQUs7R0FDakIsT0FBTyxLQUFLO0dBQ1osU0FBUyxLQUFLO0VBQ2xCLENBQUMsQ0FDTCxDQUFDO0NBQ0w7QUFDSjtBQUVBLElBQWEseUJBQWIsTUFBK0Q7Q0FDM0Q7Q0FDQTtDQUNBO0NBQ0E7Q0FFQSxZQUFtQixNQUErRjtFQUM5RyxLQUFLLE9BQU8sTUFBTSxRQUFRO0VBQzFCLEtBQUssV0FBVyxNQUFNLFlBQVk7RUFDbEMsS0FBSyxRQUFRLE1BQU0sU0FBUyxzQ0FBQSxzQkFBc0I7RUFDbEQsS0FBSyxVQUFVLE1BQU0sV0FBVztDQUNwQztDQUVBLE1BQWEsUUFBc0IsVUFBa0M7RUFHakUsSUFGZ0IsT0FBTyxXQUVuQixNQUFZLFFBQVEsT0FBTztFQUUvQixPQUFPO0NBQ1g7Q0FFQSxrQkFBaUM7RUFDN0IsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsZ0JBQThDO0VBQzFDLE1BQU0sY0FBYyxJQUFJLGlDQUFBLFlBQVk7RUFDcEMsWUFBWSxPQUFPO0VBQ25CLFlBQVksU0FBUyxDQUFDLFFBQVEsT0FBTztFQUNyQyxPQUFPLElBQUksSUFBSSxDQUNYLElBQUksc0NBQUEsUUFBaUI7R0FDakIsV0FBVyxLQUFLO0dBQ2hCLFlBQVksS0FBSztHQUNqQixNQUFNO0dBQ04sT0FBTyxLQUFLO0dBQ1osU0FBUyxLQUFLO0VBQ2xCLENBQUMsQ0FDTCxDQUFDO0NBQ0w7QUFDSjtBQUVBLElBQWEsd0JBQWIsTUFBOEQ7Q0FDMUQ7Q0FDQTtDQUNBO0NBQ0E7Q0FFQSxZQUFtQixNQUErRjtFQUM5RyxLQUFLLE9BQU8sTUFBTSxRQUFRO0VBQzFCLEtBQUssV0FBVyxNQUFNLFlBQVk7RUFDbEMsS0FBSyxRQUFRLE1BQU0sU0FBUyxzQ0FBQSxzQkFBc0I7RUFDbEQsS0FBSyxVQUFVLE1BQU0sV0FBVztDQUNwQztDQUVBLE1BQWEsUUFBc0IsVUFBa0M7RUFFakUsT0FEZSxPQUFPLFdBQ2Y7Q0FDWDtDQUVBLGtCQUFpQztFQUM3QixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxjQUFxQixRQUF1QztFQUN4RCxNQUFNLGFBQWEsSUFBSSxpQ0FBQSxZQUFZO0VBQ25DLFdBQVcsT0FBTztFQUNsQixJQUFJO0dBQ0EsV0FBVyxTQUFTLE9BQ2Ysa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLFdBQVcsT0FBTyxRQUFRLENBQUM7RUFDekMsUUFBUTtHQUNKLFdBQVcsU0FBUyxDQUFDO0VBQ3pCO0VBRUEsT0FBTyxJQUFJLElBQUksQ0FDWCxJQUFJLHNDQUFBLFFBQWlCO0dBQ2pCLFdBQVcsS0FBSztHQUNoQixZQUFZLEtBQUs7R0FDakIsTUFBTTtHQUNOLE9BQU8sS0FBSztHQUNaLFNBQVMsS0FBSztFQUNsQixDQUFDLENBQ0wsQ0FBQztDQUNMO0FBQ0oifQ==