@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
133 lines (132 loc) • 18 kB
JavaScript
import { Item } from "../../item/Item.es.js";
import { NetworkUtil } from "../NetworkUtil.es.js";
import Identifiers from "../Identifiers.es.js";
import DataPacket from "./DataPacket.es.js";
import { Vector3 } from "@jsprismarine/math";
//#region src/network/packet/InventoryTransactionPacket.ts
var UseItemAction = /* @__PURE__ */ function(UseItemAction) {
UseItemAction[UseItemAction["CLICK_BLOCK"] = 0] = "CLICK_BLOCK";
UseItemAction[UseItemAction["CLICK_AIR"] = 1] = "CLICK_AIR";
UseItemAction[UseItemAction["BREAK_BLOCK"] = 2] = "BREAK_BLOCK";
return UseItemAction;
}({});
var TransactionType = /* @__PURE__ */ function(TransactionType) {
TransactionType[TransactionType["NORMAL"] = 0] = "NORMAL";
TransactionType[TransactionType["MISMATCH"] = 1] = "MISMATCH";
TransactionType[TransactionType["USE_ITEM"] = 2] = "USE_ITEM";
TransactionType[TransactionType["USE_ITEM_ON_ENTITY"] = 3] = "USE_ITEM_ON_ENTITY";
TransactionType[TransactionType["RELASE_ITEM"] = 4] = "RELASE_ITEM";
return TransactionType;
}({});
var LegacySlotChange = class LegacySlotChange {
containerId;
slots;
constructor(containerId, slots) {
this.containerId = containerId;
this.slots = slots;
}
static fromNetwork(stream) {
const containerId = stream.readByte();
const slotCount = stream.readUnsignedVarInt();
return new LegacySlotChange(containerId, Array.from(stream.read(slotCount)));
}
toNetwork(stream) {
stream.writeByte(this.containerId);
stream.writeUnsignedVarInt(this.slots.length);
stream.write(Buffer.from(this.slots));
}
};
var ActionSource = /* @__PURE__ */ function(ActionSource) {
ActionSource[ActionSource["INVALID"] = -1] = "INVALID";
ActionSource[ActionSource["CONTAINER"] = 0] = "CONTAINER";
ActionSource[ActionSource["GLOBAL"] = 1] = "GLOBAL";
ActionSource[ActionSource["WORLD"] = 2] = "WORLD";
ActionSource[ActionSource["CREATIVE"] = 3] = "CREATIVE";
ActionSource[ActionSource["UNTRACKED_INTERACTION_UI"] = 100] = "UNTRACKED_INTERACTION_UI";
ActionSource[ActionSource["NON_IMPLEMENTED_TODO"] = 99999] = "NON_IMPLEMENTED_TODO";
return ActionSource;
}({});
var InventoryAction = class InventoryAction {
sourceType;
windowId;
sourceFlags;
targetSlot;
oldItem;
newItem;
constructor(sourceType, windowId, sourceFlags, targetSlot, oldItem, newItem) {
this.sourceType = sourceType;
this.windowId = windowId;
this.sourceFlags = sourceFlags;
this.targetSlot = targetSlot;
this.oldItem = oldItem;
this.newItem = newItem;
}
static fromNetwork(stream) {
const sourceType = stream.readUnsignedVarInt();
return new InventoryAction(sourceType, sourceType === 0 || sourceType === 99999 ? stream.readVarInt() : null, sourceType === 2 ? stream.readUnsignedVarInt() : null, stream.readUnsignedVarInt(), Item.networkDeserialize(stream), Item.networkDeserialize(stream));
}
toNetwork(stream) {
stream.writeUnsignedVarInt(this.sourceType);
[0, 99999].includes(this.sourceType) && stream.writeVarInt(this.windowId);
this.sourceType === 2 && stream.writeUnsignedVarInt(this.sourceFlags);
stream.writeUnsignedVarInt(this.targetSlot);
this.oldItem.networkSerialize(stream);
this.newItem.networkSerialize(stream);
}
};
var InventoryTransactionPacket = class extends DataPacket {
static NetID = Identifiers.InventoryTransactionPacket;
legacyRequestId;
legacySlotChanges;
transactionType;
inventoryActions;
transactionData;
decodePayload() {
this.legacyRequestId = this.readVarInt();
if (this.legacyRequestId !== 0) {
const slotChanges = this.readUnsignedVarInt();
this.legacySlotChanges = Array.from({ length: slotChanges }, () => LegacySlotChange.fromNetwork(this));
}
this.transactionType = this.readUnsignedVarInt();
const actionsCount = this.readUnsignedVarInt();
this.inventoryActions = Array.from({ length: actionsCount }, () => InventoryAction.fromNetwork(this));
switch (this.transactionType) {
case 0:
case 1: break;
case 2:
this.transactionData = {
actionType: this.readUnsignedVarInt(),
blockPosition: NetworkUtil.readBlockPosition(this),
blockFace: this.readVarInt(),
hotbarSlot: this.readVarInt(),
itemInHand: Item.networkDeserialize(this),
playerPosition: new Vector3(this.readFloatLE(), this.readFloatLE(), this.readFloatLE()),
clickPosition: new Vector3(this.readFloatLE(), this.readFloatLE(), this.readFloatLE()),
blockRuntimeId: this.readUnsignedVarInt()
};
break;
case 3:
this.transactionData = {
entityRuntimeId: this.readUnsignedVarLong(),
actionType: this.readUnsignedVarInt(),
hotbarSlot: this.readVarInt(),
itemInHand: Item.networkDeserialize(this),
playerPosition: new Vector3(this.readFloatLE(), this.readFloatLE(), this.readFloatLE()),
clickPosition: new Vector3(this.readFloatLE(), this.readFloatLE(), this.readFloatLE())
};
break;
case 4:
this.transactionData = {
actionType: this.readUnsignedVarInt(),
hotbarSlot: this.readVarInt(),
itemInHand: Item.networkDeserialize(this),
headRotation: new Vector3(this.readFloatLE(), this.readFloatLE(), this.readFloatLE())
};
break;
default: throw new TypeError(`Unknown transaction type ${this.transactionType}`);
}
}
};
//#endregion
export { ActionSource, InventoryAction, LegacySlotChange, TransactionType, UseItemAction, InventoryTransactionPacket as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25ldHdvcmsvcGFja2V0L0ludmVudG9yeVRyYW5zYWN0aW9uUGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgeyBJdGVtIH0gZnJvbSAnLi4vLi4vaXRlbS9JdGVtJztcbmltcG9ydCB0eXBlIEJsb2NrUG9zaXRpb24gZnJvbSAnLi4vLi4vd29ybGQvQmxvY2tQb3NpdGlvbic7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi9OZXR3b3JrVXRpbCc7XG5pbXBvcnQgRGF0YVBhY2tldCBmcm9tICcuL0RhdGFQYWNrZXQnO1xuXG5leHBvcnQgZW51bSBVc2VJdGVtQWN0aW9uIHtcbiAgICBDTElDS19CTE9DSyxcbiAgICBDTElDS19BSVIsXG4gICAgQlJFQUtfQkxPQ0tcbn1cblxuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBOT1JNQUwsXG4gICAgTUlTTUFUQ0gsXG4gICAgVVNFX0lURU0sXG4gICAgVVNFX0lURU1fT05fRU5USVRZLFxuICAgIFJFTEFTRV9JVEVNXG59XG5cbmV4cG9ydCBjbGFzcyBMZWdhY3lTbG90Q2hhbmdlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjb250YWluZXJJZDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgc2xvdHM6IG51bWJlcltdXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tTmV0d29yayhzdHJlYW06IEJpbmFyeVN0cmVhbSk6IExlZ2FjeVNsb3RDaGFuZ2Uge1xuICAgICAgICBjb25zdCBjb250YWluZXJJZCA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgICBjb25zdCBzbG90Q291bnQgPSBzdHJlYW0ucmVhZFVuc2lnbmVkVmFySW50KCk7XG4gICAgICAgIGNvbnN0IHNsb3RzID0gQXJyYXkuZnJvbShzdHJlYW0ucmVhZChzbG90Q291bnQpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lTbG90Q2hhbmdlKGNvbnRhaW5lcklkLCBzbG90cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTmV0d29yayhzdHJlYW06IEJpbmFyeVN0cmVhbSk6IHZvaWQge1xuICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKHRoaXMuY29udGFpbmVySWQpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLnNsb3RzLmxlbmd0aCk7XG4gICAgICAgIHN0cmVhbS53cml0ZShCdWZmZXIuZnJvbSh0aGlzLnNsb3RzKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBBY3Rpb25Tb3VyY2Uge1xuICAgIElOVkFMSUQgPSAtMSxcbiAgICBDT05UQUlORVIsXG4gICAgR0xPQkFMLFxuICAgIFdPUkxELFxuICAgIENSRUFUSVZFLFxuICAgIFVOVFJBQ0tFRF9JTlRFUkFDVElPTl9VSSA9IDEwMCxcbiAgICBOT05fSU1QTEVNRU5URURfVE9ETyA9IDk5OTk5XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZlbnRvcnlBY3Rpb24ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNvdXJjZVR5cGU6IG51bWJlcixcbiAgICAgICAgcHVibGljIHdpbmRvd0lkOiBudW1iZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgc291cmNlRmxhZ3M6IG51bWJlciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyB0YXJnZXRTbG90OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBvbGRJdGVtOiBJdGVtLFxuICAgICAgICBwdWJsaWMgbmV3SXRlbTogSXRlbVxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU5ldHdvcmsoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBJbnZlbnRvcnlBY3Rpb24ge1xuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc3RyZWFtLnJlYWRVbnNpZ25lZFZhckludCgpO1xuICAgICAgICBjb25zdCB3aW5kb3dJZCA9XG4gICAgICAgICAgICBzb3VyY2VUeXBlID09PSBBY3Rpb25Tb3VyY2UuQ09OVEFJTkVSIHx8IHNvdXJjZVR5cGUgPT09IEFjdGlvblNvdXJjZS5OT05fSU1QTEVNRU5URURfVE9ET1xuICAgICAgICAgICAgICAgID8gc3RyZWFtLnJlYWRWYXJJbnQoKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc291cmNlRmxhZ3MgPSBzb3VyY2VUeXBlID09PSBBY3Rpb25Tb3VyY2UuV09STEQgPyBzdHJlYW0ucmVhZFVuc2lnbmVkVmFySW50KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IEludmVudG9yeUFjdGlvbihcbiAgICAgICAgICAgIHNvdXJjZVR5cGUsXG4gICAgICAgICAgICB3aW5kb3dJZCxcbiAgICAgICAgICAgIHNvdXJjZUZsYWdzLFxuICAgICAgICAgICAgc3RyZWFtLnJlYWRVbnNpZ25lZFZhckludCgpLFxuICAgICAgICAgICAgSXRlbS5uZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtKSxcbiAgICAgICAgICAgIEl0ZW0ubmV0d29ya0Rlc2VyaWFsaXplKHN0cmVhbSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9OZXR3b3JrKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogdm9pZCB7XG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuc291cmNlVHlwZSk7XG4gICAgICAgIFtBY3Rpb25Tb3VyY2UuQ09OVEFJTkVSLCBBY3Rpb25Tb3VyY2UuTk9OX0lNUExFTUVOVEVEX1RPRE9dLmluY2x1ZGVzKHRoaXMuc291cmNlVHlwZSkgJiZcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludCh0aGlzLndpbmRvd0lkISk7XG4gICAgICAgIHRoaXMuc291cmNlVHlwZSA9PT0gQWN0aW9uU291cmNlLldPUkxEICYmIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuc291cmNlRmxhZ3MhKTtcbiAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRWYXJJbnQodGhpcy50YXJnZXRTbG90KTtcbiAgICAgICAgdGhpcy5vbGRJdGVtLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcbiAgICAgICAgdGhpcy5uZXdJdGVtLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25EYXRhIHtcbiAgICBhY3Rpb25UeXBlOiBudW1iZXI7XG4gICAgaG90YmFyU2xvdDogbnVtYmVyO1xuICAgIGl0ZW1JbkhhbmQ6IEl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlSXRlbURhdGEgZXh0ZW5kcyBUcmFuc2FjdGlvbkRhdGEge1xuICAgIGJsb2NrUG9zaXRpb246IEJsb2NrUG9zaXRpb247XG4gICAgYmxvY2tGYWNlOiBudW1iZXI7XG4gICAgcGxheWVyUG9zaXRpb246IFZlY3RvcjM7XG4gICAgY2xpY2tQb3NpdGlvbjogVmVjdG9yMztcbiAgICBibG9ja1J1bnRpbWVJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUl0ZW1PbkVudGl0eURhdGEgZXh0ZW5kcyBUcmFuc2FjdGlvbkRhdGEge1xuICAgIGVudGl0eVJ1bnRpbWVJZDogYmlnaW50O1xuICAgIHBsYXllclBvc2l0aW9uOiBWZWN0b3IzO1xuICAgIGNsaWNrUG9zaXRpb246IFZlY3RvcjM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXNlSXRlbURhdGEgZXh0ZW5kcyBUcmFuc2FjdGlvbkRhdGEge1xuICAgIGhlYWRSb3RhdGlvbjogVmVjdG9yMztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQgZXh0ZW5kcyBEYXRhUGFja2V0IHtcbiAgICBwdWJsaWMgc3RhdGljIE5ldElEID0gSWRlbnRpZmllcnMuSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQ7XG5cbiAgICBwdWJsaWMgbGVnYWN5UmVxdWVzdElkITogbnVtYmVyO1xuICAgIHB1YmxpYyBsZWdhY3lTbG90Q2hhbmdlcyE6IExlZ2FjeVNsb3RDaGFuZ2VbXTtcblxuICAgIHB1YmxpYyB0cmFuc2FjdGlvblR5cGUhOiBUcmFuc2FjdGlvblR5cGU7XG4gICAgcHVibGljIGludmVudG9yeUFjdGlvbnMhOiBJbnZlbnRvcnlBY3Rpb25bXTtcblxuICAgIHB1YmxpYyB0cmFuc2FjdGlvbkRhdGEhOiBUcmFuc2FjdGlvbkRhdGE7XG5cbiAgICBwdWJsaWMgZGVjb2RlUGF5bG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sZWdhY3lSZXF1ZXN0SWQgPSB0aGlzLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgaWYgKHRoaXMubGVnYWN5UmVxdWVzdElkICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90Q2hhbmdlcyA9IHRoaXMucmVhZFVuc2lnbmVkVmFySW50KCk7XG4gICAgICAgICAgICB0aGlzLmxlZ2FjeVNsb3RDaGFuZ2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogc2xvdENoYW5nZXMgfSwgKCkgPT4gTGVnYWN5U2xvdENoYW5nZS5mcm9tTmV0d29yayh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IHRoaXMucmVhZFVuc2lnbmVkVmFySW50KCk7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uc0NvdW50ID0gdGhpcy5yZWFkVW5zaWduZWRWYXJJbnQoKTtcbiAgICAgICAgdGhpcy5pbnZlbnRvcnlBY3Rpb25zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogYWN0aW9uc0NvdW50IH0sICgpID0+IEludmVudG9yeUFjdGlvbi5mcm9tTmV0d29yayh0aGlzKSk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuTk9STUFMOlxuICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuTUlTTUFUQ0g6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5VU0VfSVRFTTpcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGF0YSA9IDxVc2VJdGVtRGF0YT57XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6IHRoaXMucmVhZFVuc2lnbmVkVmFySW50KCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrUG9zaXRpb246IE5ldHdvcmtVdGlsLnJlYWRCbG9ja1Bvc2l0aW9uKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBibG9ja0ZhY2U6IHRoaXMucmVhZFZhckludCgpLFxuICAgICAgICAgICAgICAgICAgICBob3RiYXJTbG90OiB0aGlzLnJlYWRWYXJJbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUluSGFuZDogSXRlbS5uZXR3b3JrRGVzZXJpYWxpemUodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIHBsYXllclBvc2l0aW9uOiBuZXcgVmVjdG9yMyh0aGlzLnJlYWRGbG9hdExFKCksIHRoaXMucmVhZEZsb2F0TEUoKSwgdGhpcy5yZWFkRmxvYXRMRSgpKSxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tQb3NpdGlvbjogbmV3IFZlY3RvcjModGhpcy5yZWFkRmxvYXRMRSgpLCB0aGlzLnJlYWRGbG9hdExFKCksIHRoaXMucmVhZEZsb2F0TEUoKSksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrUnVudGltZUlkOiB0aGlzLnJlYWRVbnNpZ25lZFZhckludCgpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlVTRV9JVEVNX09OX0VOVElUWTpcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRGF0YSA9IDxVc2VJdGVtT25FbnRpdHlEYXRhPntcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5UnVudGltZUlkOiB0aGlzLnJlYWRVbnNpZ25lZFZhckxvbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5yZWFkVW5zaWduZWRWYXJJbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgaG90YmFyU2xvdDogdGhpcy5yZWFkVmFySW50KCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JbkhhbmQ6IEl0ZW0ubmV0d29ya0Rlc2VyaWFsaXplKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBwbGF5ZXJQb3NpdGlvbjogbmV3IFZlY3RvcjModGhpcy5yZWFkRmxvYXRMRSgpLCB0aGlzLnJlYWRGbG9hdExFKCksIHRoaXMucmVhZEZsb2F0TEUoKSksXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrUG9zaXRpb246IG5ldyBWZWN0b3IzKHRoaXMucmVhZEZsb2F0TEUoKSwgdGhpcy5yZWFkRmxvYXRMRSgpLCB0aGlzLnJlYWRGbG9hdExFKCkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlJFTEFTRV9JVEVNOlxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25EYXRhID0gPFJlbGFzZUl0ZW1EYXRhPntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5yZWFkVW5zaWduZWRWYXJJbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgaG90YmFyU2xvdDogdGhpcy5yZWFkVmFySW50KCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JbkhhbmQ6IEl0ZW0ubmV0d29ya0Rlc2VyaWFsaXplKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBoZWFkUm90YXRpb246IG5ldyBWZWN0b3IzKHRoaXMucmVhZEZsb2F0TEUoKSwgdGhpcy5yZWFkRmxvYXRMRSgpLCB0aGlzLnJlYWRGbG9hdExFKCkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0cmFuc2FjdGlvbiB0eXBlICR7dGhpcy50cmFuc2FjdGlvblR5cGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVFBLElBQVksZ0JBQUwseUJBQUEsZUFBQTtDQUNILGNBQUEsY0FBQSxpQkFBQSxLQUFBO0NBQ0EsY0FBQSxjQUFBLGVBQUEsS0FBQTtDQUNBLGNBQUEsY0FBQSxpQkFBQSxLQUFBOztBQUNKLEVBQUEsQ0FBQSxDQUFBO0FBRUEsSUFBWSxrQkFBTCx5QkFBQSxpQkFBQTtDQUNILGdCQUFBLGdCQUFBLFlBQUEsS0FBQTtDQUNBLGdCQUFBLGdCQUFBLGNBQUEsS0FBQTtDQUNBLGdCQUFBLGdCQUFBLGNBQUEsS0FBQTtDQUNBLGdCQUFBLGdCQUFBLHdCQUFBLEtBQUE7Q0FDQSxnQkFBQSxnQkFBQSxpQkFBQSxLQUFBOztBQUNKLEVBQUEsQ0FBQSxDQUFBO0FBRUEsSUFBYSxtQkFBYixNQUFhLGlCQUFpQjtDQUVmO0NBQ0E7Q0FGWCxZQUNJLGFBQ0EsT0FDRjtFQUZTLEtBQUEsY0FBQTtFQUNBLEtBQUEsUUFBQTtDQUNSO0NBRUgsT0FBYyxZQUFZLFFBQXdDO0VBQzlELE1BQU0sY0FBYyxPQUFPLFNBQVM7RUFDcEMsTUFBTSxZQUFZLE9BQU8sbUJBQW1CO0VBRTVDLE9BQU8sSUFBSSxpQkFBaUIsYUFEZCxNQUFNLEtBQUssT0FBTyxLQUFLLFNBQVMsQ0FDTCxDQUFLO0NBQ2xEO0NBRUEsVUFBaUIsUUFBNEI7RUFDekMsT0FBTyxVQUFVLEtBQUss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