@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
319 lines (318 loc) • 32 kB
JavaScript
"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+IHtcbiAgICAgICAgY29uc3QgcGxheWVyRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBwbGF5ZXJFbnVtLm5hbWUgPSAnUGxheWVyJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsYXllckVudW0udmFsdWVzID0gc2VydmVyXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLnZhbHVlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZW51bTogcGxheWVyRW51bSxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFZQSxJQUFzQixrQkFBdEIsTUFBc0M7Q0FDbEMsa0JBQWlDO0VBQzdCLE9BQU87Q0FDWDtDQUVBLGNBQXFCLFFBQW1EO0VBQ3BFLHVCQUFPLElBQUksSUFBSTtDQUNuQjtBQUNKO0FB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