UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

68 lines (67 loc) 16.3 kB
import { BlockMappings } from "../../block/BlockMappings.es.js"; import Identifiers from "../Identifiers.es.js"; import { TransactionType, UseItemAction } from "../packet/InventoryTransactionPacket.es.js"; import LevelSoundEventPacket from "../packet/LevelSoundEventPacket.es.js"; import UpdateBlockPacket from "../packet/UpdateBlockPacket.es.js"; import { Gametype } from "@jsprismarine/minecraft"; //#region src/network/handler/InventoryTransactionHandler.ts var InventoryTransactionHandler = class { static NetID = Identifiers.InventoryTransactionPacket; async handle(packet, server, connection) { const player = connection.getPlayer(); if (!player.isOnline()) return; if (player.gamemode === Gametype.SPECTATOR) return; switch (packet.transactionType) { case TransactionType.NORMAL: packet.inventoryActions.forEach(async (action) => { switch (action.sourceType) { case 0: break; default: server.getLogger().debug(`Unknown source type: ${action.sourceType}`); } }); break; case TransactionType.USE_ITEM: { const useItemData = packet.transactionData; switch (useItemData.actionType) { case UseItemAction.CLICK_BLOCK: await player.getWorld().useItemOn(server.getBlockManager().getBlockByIdAndMeta(useItemData.itemInHand.getId(), useItemData.itemInHand.meta), useItemData.blockPosition, useItemData.blockFace, useItemData.clickPosition, player); break; case UseItemAction.CLICK_AIR: break; case UseItemAction.BREAK_BLOCK: { const chunk = await player.getWorld().getChunkAt(useItemData.blockPosition); const blockId = chunk.getBlock(useItemData.blockPosition); const block = server.getBlockManager().getBlockByIdAndMeta(blockId.id, blockId.meta); if (!block) return; const pk = new UpdateBlockPacket(); pk.x = useItemData.blockPosition.getX(); pk.y = useItemData.blockPosition.getY(); pk.z = useItemData.blockPosition.getZ(); pk.blockRuntimeId = BlockMappings.getRuntimeId("minecraft:air"); await Promise.all(server.getSessionManager().getAllPlayers().filter((p) => p.getWorld().getUUID() === player.getWorld().getUUID()).map(async (player) => player.getNetworkSession().getConnection().sendDataPacket(pk))); const chunkPos = useItemData.blockPosition; chunk.setBlock(chunkPos.getX(), chunkPos.getY(), chunkPos.getZ(), server.getBlockManager().getBlock("minecraft:air")); const soundPk = new LevelSoundEventPacket(); soundPk.sound = 5; soundPk.positionX = player.getX(); soundPk.positionY = player.getY(); soundPk.positionZ = player.getZ(); soundPk.extraData = BlockMappings.getRuntimeId(block.getName()); soundPk.entityType = ":"; soundPk.isBabyMob = false; soundPk.disableRelativeVolume = false; await Promise.all(player.getWorld().getPlayers().map((target) => target.getNetworkSession().send(soundPk))); break; } default: server.getLogger().debug(`Unknown action type: ${useItemData.actionType}`); } break; } default: server.getLogger().verbose(`Unknown type: ${packet.transactionType}`); throw new Error("Invalid InventoryTransactionType"); } } }; //#endregion export { InventoryTransactionHandler as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL2hhbmRsZXIvSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdhbWV0eXBlIH0gZnJvbSAnQGpzcHJpc21hcmluZS9taW5lY3JhZnQnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXJTZXNzaW9uIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi8uLi9TZXJ2ZXInO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIHsgSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQgfSBmcm9tICcuLi9QYWNrZXRzJztcbmltcG9ydCB7IExldmVsU291bmRFdmVudFBhY2tldCwgVXBkYXRlQmxvY2tQYWNrZXQgfSBmcm9tICcuLi9QYWNrZXRzJztcbmltcG9ydCB0eXBlIHsgVXNlSXRlbURhdGEgfSBmcm9tICcuLi9wYWNrZXQvSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBVc2VJdGVtQWN0aW9uIH0gZnJvbSAnLi4vcGFja2V0L0ludmVudG9yeVRyYW5zYWN0aW9uUGFja2V0JztcbmltcG9ydCB0eXBlIFBhY2tldEhhbmRsZXIgZnJvbSAnLi9QYWNrZXRIYW5kbGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgUGFja2V0SGFuZGxlcjxJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5JbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldDtcblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldCwgc2VydmVyOiBTZXJ2ZXIsIGNvbm5lY3Rpb246IFBsYXllclNlc3Npb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gY29ubmVjdGlvbi5nZXRQbGF5ZXIoKTtcbiAgICAgICAgaWYgKCFwbGF5ZXIuaXNPbmxpbmUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAocGxheWVyLmdhbWVtb2RlID09PSBHYW1ldHlwZS5TUEVDVEFUT1IpIHJldHVybjsgLy8gU3BlY3RhdG9ycyBzaG91bGRuJ3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoIHRoZSB3b3JsZC5cblxuICAgICAgICBzd2l0Y2ggKHBhY2tldC50cmFuc2FjdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLk5PUk1BTDoge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRoaXMgY3JhcC5cbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBiYXNlIGl0IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW1wL1BvY2tldE1pbmUtTVAvYmxvYi9kMTlkYjVkMmU0NGQwOTI1Nzk4YzI4ODI0N2MzYmRkYjcxZDIzOTc1L3NyYy9wb2NrZXRtaW5lL1BsYXllci5waHAjTDIzOTkgb3Igc29tZXRoaW5nIHNpbWlsYXIuXG4gICAgICAgICAgICAgICAgLy8gbGV0IG1vdmVkSXRlbTogQ29udGFpbmVyRW50cnkgfCBudWxsO1xuICAgICAgICAgICAgICAgIHBhY2tldC5pbnZlbnRvcnlBY3Rpb25zLmZvckVhY2goYXN5bmMgKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5zb3VyY2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogSGFjayBmb3IgY3JlYXRpdmUgaW52ZW50b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoYWN0aW9uLndpbmRvd0lkID09PSAxMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBjcmVhdGl2ZSBpbnZlbnRvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5nYW1lbW9kZSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKGBQbGF5ZXIgaXNuJ3QgaW4gY3JlYXRpdmUgbW9kZWApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGlkID0gYWN0aW9uLm9sZEl0ZW0uZ2V0SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgbWV0YSA9IGFjdGlvbi5vbGRJdGVtLm1ldGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgaXRlbSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNlcnZlci5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW1CeUlkKGlkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzZXJ2ZXIuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2tCeUlkQW5kTWV0YShpZCwgbWV0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvdW50ID0gNjQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZWRJdGVtID0gbmV3IENvbnRhaW5lckVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLm5ld0l0ZW0uZ2V0SWQoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlZEl0ZW0gPSBwbGF5ZXIuZ2V0SW52ZW50b3J5KCkuZ2V0SXRlbShhY3Rpb24udGFyZ2V0U2xvdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5nZXRJbnZlbnRvcnkoKS5yZW1vdmVJdGVtKGFjdGlvbi50YXJnZXRTbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW92ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgbW92ZWRJdGVtIGlzIHVuZGVmaW5lZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmdldEludmVudG9yeSgpLnNldEl0ZW0oYWN0aW9uLnRhcmdldFNsb3QsIG1vdmVkSXRlbSk7Ki9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldExvZ2dlcigpLmRlYnVnKGBVbmtub3duIHNvdXJjZSB0eXBlOiAke2FjdGlvbi5zb3VyY2VUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5VU0VfSVRFTToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZUl0ZW1EYXRhID0gPFVzZUl0ZW1EYXRhPnBhY2tldC50cmFuc2FjdGlvbkRhdGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh1c2VJdGVtRGF0YS5hY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlSXRlbUFjdGlvbi5DTElDS19CTE9DSzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzZUl0ZW1PbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmxvY2tNYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCbG9ja0J5SWRBbmRNZXRhKHVzZUl0ZW1EYXRhLml0ZW1JbkhhbmQuZ2V0SWQoKSwgdXNlSXRlbURhdGEuaXRlbUluSGFuZC5tZXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSXRlbURhdGEuYmxvY2tGYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJdGVtRGF0YS5jbGlja1Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlSXRlbUFjdGlvbi5DTElDS19BSVI6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBVc2VJdGVtQWN0aW9uLkJSRUFLX0JMT0NLOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHBsYXllci5nZXRXb3JsZCgpLmdldENodW5rQXQodXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSBjaHVuay5nZXRCbG9jayh1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gc2VydmVyLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrQnlJZEFuZE1ldGEoYmxvY2tJZC5pZCwgYmxvY2tJZC5tZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnggPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnkgPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnogPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFooKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJ1biBhIGZ1bmN0aW9uIGZyb20gYmxvY2suZ2V0QnJlYWtDb25zZXF1ZW5jZXMoKSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJva2VuIGJsb2NrIG1heSBwbGFjZSBtb3JlIGJsb2NrcyBvciBydW4gYmxvY2sgcmVsYXRlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWNlIHNob3VsZCByZXBsYWNlIGl0c2VsZiB3aXRoIGEgd2F0ZXIgc291cmNlIGJsb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBzdXJ2aXZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgcGsuYmxvY2tSdW50aW1lSWQgPSBCbG9ja01hcHBpbmdzLmdldFJ1bnRpbWVJZCgnbWluZWNyYWZ0OmFpcicpOyAvLyBBaXJcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBibG9jay1icmVhayBwYWNrZXQgdG8gYWxsIHBsYXllcnMgaW4gdGhlIHNhbWUgd29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHAuZ2V0V29ybGQoKS5nZXRVVUlEKCkgPT09IHBsYXllci5nZXRXb3JsZCgpLmdldFVVSUQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmtQb3MgPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsuc2V0QmxvY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MuZ2V0WCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUG9zLmdldFkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5nZXRaKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrKCdtaW5lY3JhZnQ6YWlyJykhXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZFBrID0gbmV3IExldmVsU291bmRFdmVudFBhY2tldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5zb3VuZCA9IDU7IC8vIFRPRE86IGVudW1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblggPSBwbGF5ZXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblkgPSBwbGF5ZXIuZ2V0WSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblogPSBwbGF5ZXIuZ2V0WigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA/IDAgb3IgaWQgJiAweGZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsuZXh0cmFEYXRhID0gQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQoYmxvY2suZ2V0TmFtZSgpKTsgLy8gSW4gdGhpcyBjYXNlIHJlZmVycyB0byBibG9jayBydW50aW1lIElkXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFBrLmVudGl0eVR5cGUgPSAnOic7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFBrLmlzQmFieU1vYiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5kaXNhYmxlUmVsYXRpdmVWb2x1bWUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kKHNvdW5kUGspKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgVW5rbm93biBhY3Rpb24gdHlwZTogJHt1c2VJdGVtRGF0YS5hY3Rpb25UeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc2VydmVyLmdldExvZ2dlcigpLnZlcmJvc2UoYFVua25vd24gdHlwZTogJHtwYWNrZXQudHJhbnNhY3Rpb25UeXBlfWApO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVdBLElBQXFCLDhCQUFyQixNQUFzRztDQUNsRyxPQUFjLFFBQVEsWUFBWTtDQUVsQyxNQUFhLE9BQU8sUUFBb0MsUUFBZ0IsWUFB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