UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

128 lines (127 loc) • 13.8 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const require_runtime = require("../_virtual/_rolldown/runtime.cjs.cjs"); const require_block_BlockToolType = require("../block/BlockToolType.cjs.cjs"); const require_block_BlockMappings = require("../block/BlockMappings.cjs.cjs"); let _jsprismarine_jsbinaryutils = require("@jsprismarine/jsbinaryutils"); _jsprismarine_jsbinaryutils = require_runtime.__toESM(_jsprismarine_jsbinaryutils, 1); let _jsprismarine_bedrock_data = require("@jsprismarine/bedrock-data"); let _jsprismarine_nbt = require("@jsprismarine/nbt"); //#region src/item/Item.ts var Item = class Item { id; networkId; name; meta = 0; durability = this.getMaxDurability(); nbt = null; count = 1; constructor({ id, name, meta }) { this.id = id; this.name = name; if (meta) this.meta = meta; this.networkId = _jsprismarine_bedrock_data.item_id_map[name]; } getName() { return this.name; } getId() { return this.id; } /** * Get the Block's network numeric id */ getNetworkId() { return this.networkId || this.getId(); } isTool() { return false; } isArmorPiece() { return false; } getBurnTime() { return 0; } getToolType() { return require_block_BlockToolType.BlockToolType.None; } getToolHarvestLevel() { return 0; } getArmorDefensePoints() { return 0; } getArmorToughness() { return 0; } hasEnchantment(_enchantment) { return false; } getEnchantability() { return 0; } getMaxDurability() { return 0; } getDurability() { return this.durability; } getMaxAmount() { return 64; } getAmount() { return this.count; } isPartOfCreativeInventory() { return true; } networkSerialize(stream, additionalData = null) { stream.writeVarInt(this.getNetworkId()); if (this.getId() === 0 || this.getName() === "minecraft:air") return; stream.writeShortLE(this.getAmount()); stream.writeUnsignedVarInt(this.meta); if (additionalData) additionalData(stream); stream.writeVarInt(require_block_BlockMappings.BlockMappings.getRuntimeId(this.getName())); const str = new _jsprismarine_jsbinaryutils.default(); str.writeShortLE(0); str.writeIntLE(0); str.writeIntLE(0); if (this.getName() === "minecraft:shield") str.writeLongLE(BigInt(0)); stream.writeUnsignedVarInt(str.getBuffer().byteLength); stream.write(new Uint8Array(str.getBuffer())); } static networkDeserialize(stream, extra = false) { const id = stream.readVarInt(); if (id === 0) return new Item({ id: 0, name: "minecraft:air" }); stream.readUnsignedShortLE(); stream.readUnsignedVarInt(); if (extra && stream.readBoolean()) stream.readVarInt(); const data = stream.readVarInt() >> 8; if (stream.readUnsignedShortLE() === -1) { stream.readByte(); try { const nbtReader = new _jsprismarine_nbt.NBTReader(stream, _jsprismarine_nbt.ByteOrder.LITTLE_ENDIAN); nbtReader.setUseVarint(true); nbtReader.parse(); } catch (error) { throw new Error(`Failed to parse item stack nbt`, { cause: error }); } } const countPlaceOn = stream.readVarInt(); for (let i = 0; i < countPlaceOn; i++) stream.read(stream.readUnsignedShortLE()); const countCanBreak = stream.readVarInt(); for (let i = 0; i < countCanBreak; i++) stream.read(stream.readUnsignedShortLE()); return new Item({ id, name: "minecraft:unknown", meta: data }); } }; //#endregion exports.Item = Item; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXRlbS5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pdGVtL0l0ZW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnl0ZU9yZGVyLCBOQlRSZWFkZXIgfSBmcm9tICdAanNwcmlzbWFyaW5lL25idCc7XG5cbmltcG9ydCB7IGl0ZW1faWRfbWFwIGFzIEl0ZW1JZE1hcCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYmVkcm9jay1kYXRhJztcbmltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCB7IEJsb2NrVG9vbFR5cGUgfSBmcm9tICcuLi9ibG9jay9CbG9ja1Rvb2xUeXBlJztcbmltcG9ydCB0eXBlIHsgSXRlbUVuY2hhbnRtZW50VHlwZSB9IGZyb20gJy4vSXRlbUVuY2hhbnRtZW50VHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb3BzIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtZXRhPzogbnVtYmVyO1xuICAgIG5idD86IGFueTtcbiAgICBjb3VudD86IG51bWJlcjtcbiAgICBkdXJhYmlsaXR5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSXRlbSB7XG4gICAgcHJpdmF0ZSBpZDogbnVtYmVyO1xuICAgIHByaXZhdGUgbmV0d29ya0lkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIG1ldGEgPSAwO1xuICAgIHB1YmxpYyBkdXJhYmlsaXR5OiBudW1iZXIgPSB0aGlzLmdldE1heER1cmFiaWxpdHkoKTtcblxuICAgIC8vIFRPRE9cbiAgICBwdWJsaWMgbmJ0ID0gbnVsbDtcbiAgICBwdWJsaWMgY291bnQgPSAxO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHsgaWQsIG5hbWUsIG1ldGEgfTogSXRlbVByb3BzKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKG1ldGEpIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSAoSXRlbUlkTWFwIGFzIGFueSlbbmFtZV0gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmV0d29yayBudW1lcmljIGlkXG4gICAgICovXG4gICAgcHVibGljIGdldE5ldHdvcmtJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV0d29ya0lkIHx8IHRoaXMuZ2V0SWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUb29sKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXJtb3JQaWVjZSgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCdXJuVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRvb2xUeXBlKCkge1xuICAgICAgICByZXR1cm4gQmxvY2tUb29sVHlwZS5Ob25lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUb29sSGFydmVzdExldmVsKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJtb3JEZWZlbnNlUG9pbnRzKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJtb3JUb3VnaG5lc3MoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFbmNoYW50bWVudChfZW5jaGFudG1lbnQ6IEl0ZW1FbmNoYW50bWVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmNoYW50YWJpbGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1heER1cmFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREdXJhYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdXJhYmlsaXR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXhBbW91bnQoKSB7XG4gICAgICAgIHJldHVybiA2NDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW1vdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXJ0T2ZDcmVhdGl2ZUludmVudG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoXG4gICAgICAgIHN0cmVhbTogQmluYXJ5U3RyZWFtLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogbnVsbCB8ICgoc3RyZWFtOiBCaW5hcnlTdHJlYW0pID0+IHZvaWQpID0gbnVsbFxuICAgICk6IHZvaWQge1xuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQodGhpcy5nZXROZXR3b3JrSWQoKSk7XG4gICAgICAgIGlmICh0aGlzLmdldElkKCkgPT09IDAgfHwgdGhpcy5nZXROYW1lKCkgPT09ICdtaW5lY3JhZnQ6YWlyJykge1xuICAgICAgICAgICAgLy8gVGhlIGl0ZW0gaXMgQWlyIHNvIHRoZXJlJ3Mgbm8gYWRkaXRpb25hbCBkYXRhXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVTaG9ydExFKHRoaXMuZ2V0QW1vdW50KCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLm1ldGEpO1xuXG4gICAgICAgIC8vIFVzZSBhIGNsb3N1cmUgdG8gYWRkIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICBpZiAoYWRkaXRpb25hbERhdGEpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhKHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBQcm9wZXIgYmxvY2sgcnVudGltZSBJRFxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQodGhpcy5nZXROYW1lKCkpKTtcblxuICAgICAgICBjb25zdCBzdHIgPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAgICAgLyogaWYgKHRoaXMubmJ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHRhZ3MgdG8gd3JpdGVcbiAgICAgICAgICAgIC8vICgxKSBhY2NvcmRpbmcgdG8gdmFuaWxsYVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRTaG9ydExFKDB4ZmZmZik7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDEpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBoYXJkY29kZWQgTkJUIHRhZ1xuICAgICAgICAgICAgLy8gVE9ETzogdW5pbXBsZW1lbnRlZCBOQlQud3JpdGUobmJ0LCB0cnVlLCB0cnVlKVxuICAgICAgICB9ICovXG5cbiAgICAgICAgLy8gVE9ETzogcHJvcGVyIE5CVFxuICAgICAgICBzdHIud3JpdGVTaG9ydExFKDApO1xuXG4gICAgICAgIC8vIENhblBsYWNlIGFuZCBjYW5CcmVha1xuICAgICAgICBzdHIud3JpdGVJbnRMRSgwKTtcbiAgICAgICAgc3RyLndyaXRlSW50TEUoMCk7XG5cbiAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICBpZiAodGhpcy5nZXROYW1lKCkgPT09ICdtaW5lY3JhZnQ6c2hpZWxkJykge1xuICAgICAgICAgICAgc3RyLndyaXRlTG9uZ0xFKEJpZ0ludCgwKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludChzdHIuZ2V0QnVmZmVyKCkuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHN0cmVhbS53cml0ZShuZXcgVWludDhBcnJheShzdHIuZ2V0QnVmZmVyKCkpKTtcblxuICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0sIGV4dHJhID0gZmFsc2UpOiBJdGVtIHtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICBpZiAoaWQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGl0ZW1zXG4gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZW0oeyBpZDogMCwgbmFtZTogJ21pbmVjcmFmdDphaXInIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX2NvdW50ID0gc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCBfbmV0RGF0YSA9IHN0cmVhbS5yZWFkVW5zaWduZWRWYXJJbnQoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFyc1xuXG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIGV2ZXJ5dGhpbmcgYmFzaWNhbGx5Li4uXG4gICAgICAgIGlmIChleHRyYSAmJiBzdHJlYW0ucmVhZEJvb2xlYW4oKSkge1xuICAgICAgICAgICAgc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRlbXAgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICAvLyBjb25zdCBhbW91bnQgPSB0ZW1wICYgMHhmZjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRlbXAgPj4gODtcblxuICAgICAgICBsZXQgX25idCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGV4dHJhTGVuID0gc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKTtcbiAgICAgICAgaWYgKGV4dHJhTGVuID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IHN0cmVhbS5yZWFkQnl0ZSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJ0UmVhZGVyID0gbmV3IE5CVFJlYWRlcihzdHJlYW0sIEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTtcbiAgICAgICAgICAgICAgICBuYnRSZWFkZXIuc2V0VXNlVmFyaW50KHRydWUpO1xuICAgICAgICAgICAgICAgIF9uYnQgPSBuYnRSZWFkZXIucGFyc2UoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgaXRlbSBzdGFjayBuYnRgLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBKdXN0IGxvZyBhbmQgcmV0dXJuIEFJUlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRQbGFjZU9uID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudFBsYWNlT247IGkrKykge1xuICAgICAgICAgICAgc3RyZWFtLnJlYWQoc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudENhbkJyZWFrID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudENhbkJyZWFrOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS5yZWFkKHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgaGFzIGFkZGl0aW9uYWwgZGF0YVxuXG4gICAgICAgIC8vIFRPRE86IHJ1bnRpbWVJZFxuICAgICAgICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vSlNQcmlzbWFyaW5lL0pTUHJpc21hcmluZS9pc3N1ZXMvMTA2bmV3XG4gICAgICAgIHJldHVybiBuZXcgSXRlbSh7IGlkLCBuYW1lOiAnbWluZWNyYWZ0OnVua25vd24nLCBtZXRhOiBkYXRhIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQWlCQSxJQUFhLE9BQWIsTUFBYSxLQUFLO0NBQ2Q7Q0FDQTtDQUNBO0NBQ0EsT0FBYztDQUNkLGFBQTRCLEtBQUssaUJBQWlCO0NBR2xELE1BQWE7Q0FDYixRQUFlO0NBRWYsWUFBbUIsRUFBRSxJQUFJLE1BQU0sUUFBbUI7RUFDOUMsS0FBSyxLQUFLO0VBQ1YsS0FBSyxPQUFPO0VBQ1osSUFBSSxNQUFNLEtBQUssT0FBTztFQUV0QixLQUFLLFlBQWEsMkJBQUEsWUFBa0I7Q0FDeEM7Q0FFQSxVQUF5QjtFQUNyQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxRQUFlO0VBQ1gsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsZUFBc0I7RUFDbEIsT0FBTyxLQUFLLGFBQWEsS0FBSyxNQUFNO0NBQ3hDO0NBRUEsU0FBZ0I7RUFDWixPQUFPO0NBQ1g7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPO0NBQ1g7Q0FFQSxjQUFxQjtFQUNqQixPQUFPLDRCQUFBLGNBQWM7Q0FDekI7Q0FFQSxzQkFBNkI7RUFDekIsT0FBTztDQUNYO0NBRUEsd0JBQStCO0VBQzNCLE9BQU87Q0FDWDtDQUVBLG9CQUEyQjtFQUN2QixPQUFPO0NBQ1g7Q0FFQSxlQUFzQixjQUFtQztFQUNyRCxPQUFPO0NBQ1g7Q0FFQSxvQkFBMkI7RUFDdkIsT0FBTztDQUNYO0NBRUEsbUJBQTBCO0VBQ3RCLE9BQU87Q0FDWDtDQUVBLGdCQUF1QjtFQUNuQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxlQUFzQjtFQUNsQixPQUFPO0NBQ1g7Q0FFQSxZQUFtQjtFQUNmLE9BQU8sS0FBSztDQUNoQjtDQUVBLDRCQUFtQztFQUMvQixPQUFPO0NBQ1g7Q0FFQSxpQkFDSSxRQUNBLGlCQUEwRCxNQUN0RDtFQUNKLE9BQU8sWUFBWSxLQUFLLGFBQWEsQ0FBQztFQUN0QyxJQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0saUJBRXpDO0VBR0osT0FBTyxhQUFhLEtBQUssVUFBVSxDQUFDO0VBQ3BDLE9BQU8sb0JBQW9CLEtBQUssSUFBSTtFQUdwQyxJQUFJLGdCQUNBLGVBQWUsTUFBTTtFQUl6QixPQUFPLFlBQVksNEJBQUEsY0FBYyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUM7RUFFN0QsTUFBTSxNQUFNLElBQUksNEJBQUEsUUFBYTtFQWE3QixJQUFJLGFBQWEsQ0FBQztFQUdsQixJQUFJLFdBQVcsQ0FBQztFQUNoQixJQUFJLFdBQVcsQ0FBQztFQUdoQixJQUFJLEtBQUssUUFBUSxNQUFNLG9CQUNuQixJQUFJLFlBQVksT0FBTyxDQUFDLENBQUM7RUFHN0IsT0FBTyxvQkFBb0IsSUFBSSxVQUFVLEVBQUUsVUFBVTtFQUNyRCxPQUFPLE1BQU0sSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLENBQUM7Q0FHaEQ7Q0FFQSxPQUFjLG1CQUFtQixRQUFzQixRQUFRLE9BQWE7RUFDeEUsTUFBTSxLQUFLLE9BQU8sV0FBVztFQUM3QixJQUFJLE9BQU8sR0FFUCxPQUFPLElBQUksS0FBSztHQUFFLElBQUk7R0FBRyxNQUFNO0VBQWdCLENBQUM7RUFHckMsT0FBTyxvQkFBb0I7RUFDekIsT0FBTyxtQkFBbUI7RUFHM0MsSUFBSSxTQUFTLE9BQU8sWUFBWSxHQUM1QixPQUFPLFdBQVc7RUFLdEIsTUFBTSxPQUZPLE9BQU8sV0FFUCxLQUFRO0VBSXJCLElBRGlCLE9BQU8sb0JBQ3BCLE1BQWEsSUFBSTtHQUNELE9BQU8sU0FBUztHQUVoQyxJQUFJO0lBQ0EsTUFBTSxZQUFZLElBQUksa0JBQUEsVUFBVSxRQUFRLGtCQUFBLFVBQVUsYUFBYTtJQUMvRCxVQUFVLGFBQWEsSUFBSTtJQUMzQixVQUFpQixNQUFNO0dBQzNCLFNBQVMsT0FBZ0I7SUFDckIsTUFBTSxJQUFJLE1BQU0sa0NBQWtDLEVBQUUsT0FBTyxNQUFNLENBQUM7R0FFdEU7RUFDSjtFQUVBLE1BQU0sZUFBZSxPQUFPLFdBQVc7RUFDdkMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGNBQWMsS0FDOUIsT0FBTyxLQUFLLE9BQU8sb0JBQW9CLENBQUM7RUFHNUMsTUFBTSxnQkFBZ0IsT0FBTyxXQUFXO0VBQ3hDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLEtBQy9CLE9BQU8sS0FBSyxPQUFPLG9CQUFvQixDQUFDO0VBTzVDLE9BQU8sSUFBSSxLQUFLO0dBQUU7R0FBSSxNQUFNO0dBQXFCLE1BQU07RUFBSyxDQUFDO0NBQ2pFO0FBQ0oifQ==