@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
138 lines (137 loc) • 20 kB
JavaScript
"use strict";
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: "Module" }
});
const require_network_NetworkUtil = require("../NetworkUtil.cjs.cjs");
const require_network_Identifiers = require("../Identifiers.cjs.cjs");
const require_network_packet_DataPacket = require("./DataPacket.cjs.cjs");
//#region src/network/packet/AvailableCommandsPacket.ts
/**
* AvailableCommandsPacket is sent by the server to the client to provide information about available commands.
* @TODO: Argument types are not implemented.
*/
var AvailableCommandsPacket = class extends require_network_packet_DataPacket.default {
static NetID = require_network_Identifiers.default.AvailableCommandsPacket;
ARG_FLAG_VALID = 1048576;
ARG_FLAG_INT = 1;
ARG_FLAG_FLOAT = 3;
ARG_TYPE_WILDCARD_INT = 5;
ARG_TYPE_STRING = 56;
ARG_TYPE_INT_POSITION = 64;
ARG_TYPE_POSITION = 65;
ARG_FLAG_ENUM = 2097152;
ARG_FLAG_POSTFIX = 16777216;
ARG_FLAG_SOFT_ENUM = 67108864;
commandData = [];
hardcodedEnums = [];
softEnums = [];
enumConstraints = [];
encodePayload() {
const enumValueIndexes = /* @__PURE__ */ new Map();
const postfixIndexes = /* @__PURE__ */ new Map();
const enums = [];
const enumIndexes = /* @__PURE__ */ new Map();
const softEnums = [];
const softEnumIndexes = /* @__PURE__ */ new Map();
const appendEnum = (_enum) => {
const { name, soft, values } = _enum;
if (soft) {
if (!softEnumIndexes.has(name)) {
const index = softEnumIndexes.set(name, softEnumIndexes.size).get(name);
softEnums[index] = _enum;
}
return;
}
values.forEach((value) => {
if (!enumValueIndexes.has(value)) enumValueIndexes.set(value, enumValueIndexes.size);
});
if (!enumIndexes.has(name)) {
const index = enumIndexes.set(name, enumIndexes.size).get(name);
enums[index] = _enum;
}
};
this.hardcodedEnums.forEach((e) => appendEnum(e));
this.softEnums.forEach((e) => appendEnum(e));
this.commandData.forEach((commandData) => {
if (commandData.aliases) appendEnum(commandData.aliases);
commandData.overloads.forEach((overload) => {
overload.forEach((parameter) => {
if (parameter.enum) appendEnum(parameter.enum);
if (parameter.postfix) {
if (!postfixIndexes.has(parameter.postfix)) postfixIndexes.set(parameter.postfix, postfixIndexes.size);
}
});
});
});
this.writeUnsignedVarInt(enumValueIndexes.size);
enumValueIndexes.forEach((_index, enumValue) => {
require_network_NetworkUtil.NetworkUtil.writeString(this, enumValue);
});
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(postfixIndexes.size);
postfixIndexes.forEach((_index, postfix) => {
require_network_NetworkUtil.NetworkUtil.writeString(this, postfix);
});
this.writeUnsignedVarInt(enums.length);
enums.forEach((_enum) => {
this.writeEnum(_enum, enumValueIndexes);
});
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(this.commandData.length);
this.commandData.forEach((data) => {
this.writeCommandData(data, enumIndexes, postfixIndexes);
});
this.writeUnsignedVarInt(this.softEnums.length);
this.softEnums.forEach((_enum) => {
this.writeSoftEnum(_enum);
});
this.writeUnsignedVarInt(this.enumConstraints.length);
this.enumConstraints.forEach((constraint) => {
this.writeEnumConstraint(constraint, enumIndexes, enumValueIndexes);
});
}
writeEnum({ name, values }, enumValueMap) {
require_network_NetworkUtil.NetworkUtil.writeString(this, name);
this.writeUnsignedVarInt(values.length);
const listSize = enumValueMap.size;
values.forEach((value) => {
const index = enumValueMap.get(value) ?? -1;
if (index === -1) return;
this.writeEnumValueIndex(index, listSize);
});
}
writeEnumValueIndex(index, valueCount) {
if (valueCount < 256) this.writeByte(index);
else if (valueCount < 65536) this.writeUnsignedShortLE(index);
else this.writeUnsignedIntLE(index);
}
writeCommandData(data, enumIndexes, _postfixIndexes) {
require_network_NetworkUtil.NetworkUtil.writeString(this, data.commandName);
require_network_NetworkUtil.NetworkUtil.writeString(this, data.commandDescription);
this.writeShortLE(data.flags);
this.writeByte(data.permission);
if (data.aliases !== null) this.writeIntLE(enumIndexes.get(data.aliases.name) ?? -1);
else this.writeIntLE(-1);
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(0);
}
writeSoftEnum(_enum) {
require_network_NetworkUtil.NetworkUtil.writeString(this, _enum.name);
this.writeUnsignedVarInt(_enum.values.length);
_enum.values.forEach((value) => {
require_network_NetworkUtil.NetworkUtil.writeString(this, value);
});
}
writeEnumConstraint(constraint, enumIndexes, enumValueIndexes) {
this.writeIntLE(enumValueIndexes.get(constraint.getAffectedValue()) ?? 0);
this.writeIntLE(enumIndexes.get(constraint.getEnum().name) ?? 0);
this.writeUnsignedVarInt(constraint.getConstraints().length);
constraint.getConstraints().forEach((v) => {
this.writeByte(v);
});
}
};
//#endregion
exports.default = AvailableCommandsPacket;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi8uLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSBDb21tYW5kRGF0YSBmcm9tICcuLi90eXBlL0NvbW1hbmREYXRhJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZEVudW0gfSBmcm9tICcuLi90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCB0eXBlIENvbW1hbmRFbnVtQ29uc3RyYWludCBmcm9tICcuLi90eXBlL0NvbW1hbmRFbnVtQ29uc3RyYWludCc7XG5pbXBvcnQgRGF0YVBhY2tldCBmcm9tICcuL0RhdGFQYWNrZXQnO1xuXG4vKipcbiAqIEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IGlzIHNlbnQgYnkgdGhlIHNlcnZlciB0byB0aGUgY2xpZW50IHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlIGNvbW1hbmRzLlxuICogQFRPRE86IEFyZ3VtZW50IHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IGV4dGVuZHMgRGF0YVBhY2tldCB7XG4gICAgcHVibGljIHN0YXRpYyBOZXRJRCA9IElkZW50aWZpZXJzLkF2YWlsYWJsZUNvbW1hbmRzUGFja2V0O1xuXG4gICAgcHVibGljIEFSR19GTEFHX1ZBTElEID0gMHgxMDAwMDA7XG4gICAgcHVibGljIEFSR19GTEFHX0lOVCA9IDE7XG4gICAgcHVibGljIEFSR19GTEFHX0ZMT0FUID0gMztcbiAgICBwdWJsaWMgQVJHX1RZUEVfV0lMRENBUkRfSU5UID0gNTtcbiAgICBwdWJsaWMgQVJHX1RZUEVfU1RSSU5HID0gNTY7XG4gICAgcHVibGljIEFSR19UWVBFX0lOVF9QT1NJVElPTiA9IDY0O1xuICAgIHB1YmxpYyBBUkdfVFlQRV9QT1NJVElPTiA9IDY1O1xuICAgIHB1YmxpYyBBUkdfRkxBR19FTlVNID0gMHgyMDAwMDA7XG4gICAgcHVibGljIEFSR19GTEFHX1BPU1RGSVggPSAweDEwMDAwMDA7XG4gICAgcHVibGljIEFSR19GTEFHX1NPRlRfRU5VTSA9IDB4NDAwMDAwMDtcblxuICAgIHB1YmxpYyBjb21tYW5kRGF0YTogQ29tbWFuZERhdGFbXSA9IFtdO1xuICAgIHB1YmxpYyBoYXJkY29kZWRFbnVtczogQ29tbWFuZEVudW1bXSA9IFtdO1xuICAgIHB1YmxpYyBzb2Z0RW51bXM6IENvbW1hbmRFbnVtW10gPSBbXTtcbiAgICBwdWJsaWMgZW51bUNvbnN0cmFpbnRzOiBDb21tYW5kRW51bUNvbnN0cmFpbnRbXSA9IFtdO1xuXG4gICAgcHVibGljIGVuY29kZVBheWxvYWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHBvc3RmaXhJbmRleGVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBlbnVtczogQ29tbWFuZEVudW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBlbnVtSW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3Qgc29mdEVudW1zOiBDb21tYW5kRW51bVtdID0gW107XG4gICAgICAgIGNvbnN0IHNvZnRFbnVtSW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAgICAgICBjb25zdCBhcHBlbmRFbnVtID0gKF9lbnVtOiBDb21tYW5kRW51bSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBzb2Z0LCB2YWx1ZXMgfSA9IF9lbnVtO1xuXG4gICAgICAgICAgICBpZiAoc29mdCkge1xuICAgICAgICAgICAgICAgIGlmICghc29mdEVudW1JbmRleGVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNvZnRFbnVtSW5kZXhlcy5zZXQobmFtZSwgc29mdEVudW1JbmRleGVzLnNpemUpLmdldChuYW1lKSE7XG4gICAgICAgICAgICAgICAgICAgIHNvZnRFbnVtc1tpbmRleF0gPSBfZW51bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudW1WYWx1ZUluZGV4ZXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnVtVmFsdWVJbmRleGVzLnNldCh2YWx1ZSwgZW51bVZhbHVlSW5kZXhlcy5zaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZW51bUluZGV4ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlbnVtSW5kZXhlcy5zZXQobmFtZSwgZW51bUluZGV4ZXMuc2l6ZSkuZ2V0KG5hbWUpITtcbiAgICAgICAgICAgICAgICBlbnVtc1tpbmRleF0gPSBfZW51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhcmRjb2RlZEVudW1zLmZvckVhY2goKGUpID0+IGFwcGVuZEVudW0oZSkpO1xuICAgICAgICB0aGlzLnNvZnRFbnVtcy5mb3JFYWNoKChlKSA9PiBhcHBlbmRFbnVtKGUpKTtcblxuICAgICAgICB0aGlzLmNvbW1hbmREYXRhLmZvckVhY2goKGNvbW1hbmREYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZERhdGEuYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGFwcGVuZEVudW0oY29tbWFuZERhdGEuYWxpYXNlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1hbmREYXRhLm92ZXJsb2Fkcy5mb3JFYWNoKChvdmVybG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIG92ZXJsb2FkLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmVudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEVudW0ocGFyYW1ldGVyLmVudW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5wb3N0Zml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc3RmaXhJbmRleGVzLmhhcyhwYXJhbWV0ZXIucG9zdGZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0Zml4SW5kZXhlcy5zZXQocGFyYW1ldGVyLnBvc3RmaXgsIHBvc3RmaXhJbmRleGVzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KGVudW1WYWx1ZUluZGV4ZXMuc2l6ZSk7XG4gICAgICAgIGVudW1WYWx1ZUluZGV4ZXMuZm9yRWFjaCgoX2luZGV4OiBudW1iZXIsIGVudW1WYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBlbnVtVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoMCk7IC8vIGNoYWluZWRTdWJDb21tYW5kVmFsdWVOYW1lSW5kZXhlc1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludChwb3N0Zml4SW5kZXhlcy5zaXplKTtcbiAgICAgICAgcG9zdGZpeEluZGV4ZXMuZm9yRWFjaCgoX2luZGV4OiBudW1iZXIsIHBvc3RmaXg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgcG9zdGZpeCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludChlbnVtcy5sZW5ndGgpO1xuICAgICAgICBlbnVtcy5mb3JFYWNoKChfZW51bTogQ29tbWFuZEVudW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVFbnVtKF9lbnVtLCBlbnVtVmFsdWVJbmRleGVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApOyAvLyBhbGxDaGFpbmVkU3ViQ29tbWFuZERhdGFcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQodGhpcy5jb21tYW5kRGF0YS5sZW5ndGgpO1xuICAgICAgICB0aGlzLmNvbW1hbmREYXRhLmZvckVhY2goKGRhdGE6IENvbW1hbmREYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQ29tbWFuZERhdGEoZGF0YSwgZW51bUluZGV4ZXMsIHBvc3RmaXhJbmRleGVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuc29mdEVudW1zLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuc29mdEVudW1zLmZvckVhY2goKF9lbnVtOiBDb21tYW5kRW51bSkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZVNvZnRFbnVtKF9lbnVtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuZW51bUNvbnN0cmFpbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuZW51bUNvbnN0cmFpbnRzLmZvckVhY2goKGNvbnN0cmFpbnQ6IENvbW1hbmRFbnVtQ29uc3RyYWludCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53cml0ZUVudW1Db25zdHJhaW50KGNvbnN0cmFpbnQsIGVudW1JbmRleGVzLCBlbnVtVmFsdWVJbmRleGVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUVudW0oeyBuYW1lLCB2YWx1ZXMgfTogQ29tbWFuZEVudW0sIGVudW1WYWx1ZU1hcDogTWFwPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBuYW1lKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHZhbHVlcy5sZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3RTaXplID0gZW51bVZhbHVlTWFwLnNpemU7XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1WYWx1ZU1hcC5nZXQodmFsdWUpID8/IC0xO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy53cml0ZUVudW1WYWx1ZUluZGV4KGluZGV4LCBsaXN0U2l6ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVFbnVtVmFsdWVJbmRleChpbmRleDogbnVtYmVyLCB2YWx1ZUNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlQ291bnQgPCAyNTYpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZUNvdW50IDwgNjU1MzYpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFNob3J0TEUoaW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUNvbW1hbmREYXRhKFxuICAgICAgICBkYXRhOiBDb21tYW5kRGF0YSxcbiAgICAgICAgZW51bUluZGV4ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIF9wb3N0Zml4SW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPlxuICAgICk6IHZvaWQge1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCBkYXRhLmNvbW1hbmROYW1lKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgZGF0YS5jb21tYW5kRGVzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLndyaXRlU2hvcnRMRShkYXRhLmZsYWdzKTtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoZGF0YS5wZXJtaXNzaW9uKTtcblxuICAgICAgICBpZiAoZGF0YS5hbGlhc2VzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50TEUoZW51bUluZGV4ZXMuZ2V0KGRhdGEuYWxpYXNlcy5uYW1lKSA/PyAtMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50TEUoLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApOyAvLyBjaGFpbmVkU3ViQ29tbWFuZERhdGFcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoMCk7XG4gICAgICAgIC8qdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KGRhdGEub3ZlcmxvYWRzLmxlbmd0aCk7XG4gICAgICAgIGRhdGEub3ZlcmxvYWRzLmZvckVhY2goKG92ZXJsb2FkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQob3ZlcmxvYWQubGVuZ3RoKTtcbiAgICAgICAgICAgIG92ZXJsb2FkLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHBhcmFtZXRlci5wYXJhbU5hbWUpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbWV0ZXIucGFyYW1UeXBlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuZW51bSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmVudW0uc29mdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BUkdfRkxBR19TT0ZUX0VOVU0gfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQVJHX0ZMQUdfVkFMSUQgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtSW5kZXhlcy5nZXQocGFyYW1ldGVyLmVudW0ubmFtZSkgPz8gLTEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRoaXMuQVJHX0ZMQUdfRU5VTSB8IHRoaXMuQVJHX0ZMQUdfVkFMSUQgfCAoZW51bUluZGV4ZXMuZ2V0KHBhcmFtZXRlci5lbnVtLm5hbWUpID8/IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnBvc3RmaXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcG9zdGZpeEluZGV4ZXMuZ2V0KHBhcmFtZXRlci5wb3N0Zml4KSA/PyAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gLTEpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRoaXMuQVJHX0ZMQUdfUE9TVEZJWCB8IGtleTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50TEUodHlwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4ocGFyYW1ldGVyLmlzT3B0aW9uYWwpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlKHBhcmFtZXRlci5mbGFncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7Ki9cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlU29mdEVudW0oX2VudW06IENvbW1hbmRFbnVtKTogdm9pZCB7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIF9lbnVtLm5hbWUpO1xuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoX2VudW0udmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIF9lbnVtLnZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVFbnVtQ29uc3RyYWludChcbiAgICAgICAgY29uc3RyYWludDogQ29tbWFuZEVudW1Db25zdHJhaW50LFxuICAgICAgICBlbnVtSW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPixcbiAgICAgICAgZW51bVZhbHVlSW5kZXhlczogTWFwPHN0cmluZywgbnVtYmVyPlxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlSW50TEUoZW51bVZhbHVlSW5kZXhlcy5nZXQoY29uc3RyYWludC5nZXRBZmZlY3RlZFZhbHVlKCkpID8/IDApO1xuICAgICAgICB0aGlzLndyaXRlSW50TEUoZW51bUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQuZ2V0RW51bSgpLm5hbWUpID8/IDApO1xuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJJbnQoY29uc3RyYWludC5nZXRDb25zdHJhaW50cygpLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0cmFpbnQuZ2V0Q29uc3RyYWludHMoKS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZSh2KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBV0EsSUFBcUIsMEJBQXJCLGNBQXFELGtDQUFBLFFBQVc7Q0FDNUQsT0FBYyxRQUFRLDRCQUFBLFFBQVk7Q0FFbEMsaUJBQXdCO0NBQ3hCLGVBQXNCO0NBQ3RCLGlCQUF3QjtDQUN4Qix3QkFBK0I7Q0FDL0Isa0JBQXlCO0NBQ3pCLHdCQUErQjtDQUMvQixvQkFBMkI7Q0FDM0IsZ0JBQXVCO0NBQ3ZCLG1CQUEwQjtDQUMxQixxQkFBNEI7Q0FFNUIsY0FBb0MsQ0FBQztDQUNyQyxpQkFBdUMsQ0FBQztDQUN4QyxZQUFrQyxDQUFDO0NBQ25DLGtCQUFrRCxDQUFDO0NBRW5ELGdCQUE2QjtFQUN6QixNQUFNLG1DQUF3QyxJQUFJLElBQUk7RUFDdEQsTUFBTSxpQ0FBc0MsSUFBSSxJQUFJO0VBQ3BELE1BQU0sUUFBdUIsQ0FBQztFQUM5QixNQUFNLDhCQUFtQyxJQUFJLElBQUk7RUFDakQsTUFBTSxZQUEyQixDQUFDO0VBQ2xDLE1BQU0sa0NBQXVDLElBQUksSUFBSTtFQUVyRCxNQUFNLGNBQWMsVUFBdUI7R0FDdkMsTUFBTSxFQUFFLE1BQU0sTUFBTSxXQUFXO0dBRS9CLElBQUksTUFBTTtJQUNOLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEdBQUc7S0FDNUIsTUFBTSxRQUFRLGdCQUFnQixJQUFJLE1BQU0sZ0JBQWdCLElBQUksRUFBRSxJQUFJLElBQUk7S0FDdEUsVUFBVSxTQUFTO0lBQ3ZCO0lBQ0E7R0FDSjtHQUVBLE9BQU8sU0FBUyxVQUFVO0lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLEdBQzNCLGlCQUFpQixJQUFJLE9BQU8saUJBQWlCLElBQUk7R0FFekQsQ0FBQztHQUNELElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxHQUFHO0lBQ3hCLE1BQU0sUUFBUSxZQUFZLElBQUksTUFBTSxZQUFZLElBQUksRUFB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