UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

150 lines (147 loc) • 21.3 kB
import { Gametype } from '@jsprismarine/minecraft'; import { BlockMappings } from '../../block/BlockMappings.es.js'; import Identifiers from '../Identifiers.es.js'; import '../packet/ActorFallPacket.es.js'; import '../packet/AddActorPacket.es.js'; import '../packet/AddItemActorPacket.es.js'; import '../packet/AddPlayerPacket.es.js'; import '../packet/AnimatePacket.es.js'; import '../packet/AvailableActorIdentifiersPacket.es.js'; import '../packet/AvailableCommandsPacket.es.js'; import '@jsprismarine/jsbinaryutils'; import 'zlib'; import '../CompressionProvider.es.js'; import '../packet/NetworkSettingsPacket.es.js'; import '../packet/BiomeDefinitionListPacket.es.js'; import '../packet/ChangeDimensionPacket.es.js'; import '../packet/ChunkRadiusUpdatedPacket.es.js'; import '../packet/CommandRequestPacket.es.js'; import '../packet/ContainerClosePacket.es.js'; import '../packet/ContainerOpenPacket.es.js'; import '../packet/CreativeContentPacket.es.js'; import '../packet/DisconnectPacket.es.js'; import '../packet/EmoteListPacket.es.js'; import '../packet/InteractPacket.es.js'; import '../packet/InventoryContentPacket.es.js'; import { TransactionType, UseItemAction } from '../packet/InventoryTransactionPacket.es.js'; import '../packet/ItemComponentPacket.es.js'; import '../packet/ItemStackRequestPacket.es.js'; import '../packet/ItemStackResponsePacket.es.js'; import '../packet/LevelChunkPacket.es.js'; import LevelSoundEventPacket from '../packet/LevelSoundEventPacket.es.js'; import '../packet/LoginPacket.es.js'; import '../packet/MobEquipmentPacket.es.js'; import '../packet/MoveActorAbsolutePacket.es.js'; import '../packet/MovePlayerPacket.es.js'; import '../packet/NetworkChunkPublisherUpdatePacket.es.js'; import '../packet/OnScreenTextureAnimationPacket.es.js'; import '../packet/PacketViolationWarningPacket.es.js'; import '../packet/PlaySoundPacket.es.js'; import '../packet/PlayStatusPacket.es.js'; import '../packet/PlayerActionPacket.es.js'; import '../packet/PlayerListPacket.es.js'; import '../packet/PlayerSkinPacket.es.js'; import '../packet/RemoveActorPacket.es.js'; import '../packet/RequestChunkRadiusPacket.es.js'; import '../packet/RequestNetworkSettingsPacket.es.js'; import '../packet/ResourcePackResponsePacket.es.js'; import '../packet/ResourcePackStackPacket.es.js'; import '../packet/ResourcePacksInfoPacket.es.js'; import '../packet/ServerSettingsRequestPacket.es.js'; import '../packet/SetActorDataPacket.es.js'; import '../packet/SetDefaultGametypePacket.es.js'; import '../packet/SetHealthPacket.es.js'; import '../packet/SetLocalPlayerAsInitializedPacket.es.js'; import '../packet/SetPlayerGametypePacket.es.js'; import '../packet/SetTimePacket.es.js'; import '../packet/ShowProfilePacket.es.js'; import '../packet/StartGamePacket.es.js'; import '../packet/TextPacket.es.js'; import '../packet/TickSyncPacket.es.js'; import '../packet/TransferPacket.es.js'; import '../packet/UpdateAdventureSettingsPacket.es.js'; import '../packet/UpdateAttributesPacket.es.js'; import UpdateBlockPacket from '../packet/UpdateBlockPacket.es.js'; import '../packet/WorldEventPacket.es.js'; class InventoryTransactionHandler { 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 (player2) => player2.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"); } } } } export { InventoryTransactionHandler as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmV0d29yay9oYW5kbGVyL0ludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1ldHlwZSB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWluZWNyYWZ0JztcbmltcG9ydCB0eXBlIHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLy4uLyc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vLi4vU2VydmVyJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSB7IEludmVudG9yeVRyYW5zYWN0aW9uUGFja2V0IH0gZnJvbSAnLi4vUGFja2V0cyc7XG5pbXBvcnQgeyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQsIFVwZGF0ZUJsb2NrUGFja2V0IH0gZnJvbSAnLi4vUGFja2V0cyc7XG5pbXBvcnQgdHlwZSB7IFVzZUl0ZW1EYXRhIH0gZnJvbSAnLi4vcGFja2V0L0ludmVudG9yeVRyYW5zYWN0aW9uUGFja2V0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgVXNlSXRlbUFjdGlvbiB9IGZyb20gJy4uL3BhY2tldC9JbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldCc7XG5pbXBvcnQgdHlwZSBQYWNrZXRIYW5kbGVyIGZyb20gJy4vUGFja2V0SGFuZGxlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIFBhY2tldEhhbmRsZXI8SW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIE5ldElEID0gSWRlbnRpZmllcnMuSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQ7XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHBhY2tldDogSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQsIHNlcnZlcjogU2VydmVyLCBjb25uZWN0aW9uOiBQbGF5ZXJTZXNzaW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IGNvbm5lY3Rpb24uZ2V0UGxheWVyKCk7XG4gICAgICAgIGlmICghcGxheWVyLmlzT25saW5lKCkpIHJldHVybjtcbiAgICAgICAgaWYgKHBsYXllci5nYW1lbW9kZSA9PT0gR2FtZXR5cGUuU1BFQ1RBVE9SKSByZXR1cm47IC8vIFNwZWN0YXRvcnMgc2hvdWxkbid0IGJlIGFibGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgd29ybGQuXG5cbiAgICAgICAgc3dpdGNoIChwYWNrZXQudHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5OT1JNQUw6IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWZhY3RvciB0aGlzIGNyYXAuXG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgYmFzZSBpdCBvbiBodHRwczovL2dpdGh1Yi5jb20vcG1tcC9Qb2NrZXRNaW5lLU1QL2Jsb2IvZDE5ZGI1ZDJlNDRkMDkyNTc5OGMyODgyNDdjM2JkZGI3MWQyMzk3NS9zcmMvcG9ja2V0bWluZS9QbGF5ZXIucGhwI0wyMzk5IG9yIHNvbWV0aGluZyBzaW1pbGFyLlxuICAgICAgICAgICAgICAgIC8vIGxldCBtb3ZlZEl0ZW06IENvbnRhaW5lckVudHJ5IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBwYWNrZXQuaW52ZW50b3J5QWN0aW9ucy5mb3JFYWNoKGFzeW5jIChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uc291cmNlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IEhhY2sgZm9yIGNyZWF0aXZlIGludmVudG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYgKGFjdGlvbi53aW5kb3dJZCA9PT0gMTI0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gY3JlYXRpdmUgaW52ZW50b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZ2FtZW1vZGUgIT09IDEpIHRocm93IG5ldyBFcnJvcihgUGxheWVyIGlzbid0IGluIGNyZWF0aXZlIG1vZGVgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBpZCA9IGFjdGlvbi5vbGRJdGVtLmdldElkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG1ldGEgPSBhY3Rpb24ub2xkSXRlbS5tZXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGl0ZW0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzZXJ2ZXIuZ2V0SXRlbU1hbmFnZXIoKS5nZXRJdGVtQnlJZChpZCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2VydmVyLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrQnlJZEFuZE1ldGEoaWQsIG1ldGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBjb3VudCA9IDY0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmVkSXRlbSA9IG5ldyBDb250YWluZXJFbnRyeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5uZXdJdGVtLmdldElkKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZWRJdGVtID0gcGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW0oYWN0aW9uLnRhcmdldFNsb3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZ2V0SW52ZW50b3J5KCkucmVtb3ZlSXRlbShhY3Rpb24udGFyZ2V0U2xvdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoYG1vdmVkSXRlbSBpcyB1bmRlZmluZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5nZXRJbnZlbnRvcnkoKS5zZXRJdGVtKGFjdGlvbi50YXJnZXRTbG90LCBtb3ZlZEl0ZW0pOyovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgVW5rbm93biBzb3VyY2UgdHlwZTogJHthY3Rpb24uc291cmNlVHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVVNFX0lURU06IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VJdGVtRGF0YSA9IDxVc2VJdGVtRGF0YT5wYWNrZXQudHJhbnNhY3Rpb25EYXRhO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodXNlSXRlbURhdGEuYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFVzZUl0ZW1BY3Rpb24uQ0xJQ0tfQkxPQ0s6XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2VJdGVtT24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJsb2NrTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmxvY2tCeUlkQW5kTWV0YSh1c2VJdGVtRGF0YS5pdGVtSW5IYW5kLmdldElkKCksIHVzZUl0ZW1EYXRhLml0ZW1JbkhhbmQubWV0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUl0ZW1EYXRhLmJsb2NrUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUl0ZW1EYXRhLmJsb2NrRmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSXRlbURhdGEuY2xpY2tQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFVzZUl0ZW1BY3Rpb24uQ0xJQ0tfQUlSOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlSXRlbUFjdGlvbi5CUkVBS19CTE9DSzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBhd2FpdCBwbGF5ZXIuZ2V0V29ybGQoKS5nZXRDaHVua0F0KHVzZUl0ZW1EYXRhLmJsb2NrUG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0lkID0gY2h1bmsuZ2V0QmxvY2sodXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHNlcnZlci5nZXRCbG9ja01hbmFnZXIoKS5nZXRCbG9ja0J5SWRBbmRNZXRhKGJsb2NrSWQuaWQsIGJsb2NrSWQubWV0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJsb2NrKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gbmV3IFVwZGF0ZUJsb2NrUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBway54ID0gdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbi5nZXRYKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBway55ID0gdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbi5nZXRZKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBway56ID0gdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbi5nZXRaKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBydW4gYSBmdW5jdGlvbiBmcm9tIGJsb2NrLmdldEJyZWFrQ29uc2VxdWVuY2VzKCkgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJyb2tlbiBibG9jayBtYXkgcGxhY2UgbW9yZSBibG9ja3Mgb3IgcnVuIGJsb2NrIHJlbGF0ZWQgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIGljZSBzaG91bGQgcmVwbGFjZSBpdHNlbGYgd2l0aCBhIHdhdGVyIHNvdXJjZSBibG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gc3Vydml2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLmJsb2NrUnVudGltZUlkID0gQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQoJ21pbmVjcmFmdDphaXInKTsgLy8gQWlyXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgYmxvY2stYnJlYWsgcGFja2V0IHRvIGFsbCBwbGF5ZXJzIGluIHRoZSBzYW1lIHdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwKSA9PiBwLmdldFdvcmxkKCkuZ2V0VVVJRCgpID09PSBwbGF5ZXIuZ2V0V29ybGQoKS5nZXRVVUlEKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHBsYXllcikgPT4gcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rUG9zID0gdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLnNldEJsb2NrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUG9zLmdldFgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5nZXRZKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MuZ2V0WigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRCbG9ja01hbmFnZXIoKS5nZXRCbG9jaygnbWluZWNyYWZ0OmFpcicpIVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRQayA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsuc291bmQgPSA1OyAvLyBUT0RPOiBlbnVtXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsucG9zaXRpb25YID0gcGxheWVyLmdldFgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsucG9zaXRpb25ZID0gcGxheWVyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsucG9zaXRpb25aID0gcGxheWVyLmdldFooKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gPyAwIG9yIGlkICYgMHhmXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFBrLmV4dHJhRGF0YSA9IEJsb2NrTWFwcGluZ3MuZ2V0UnVudGltZUlkKGJsb2NrLmdldE5hbWUoKSk7IC8vIEluIHRoaXMgY2FzZSByZWZlcnMgdG8gYmxvY2sgcnVudGltZSBJZFxuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5lbnRpdHlUeXBlID0gJzonO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5pc0JhYnlNb2IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsuZGlzYWJsZVJlbGF0aXZlVm9sdW1lID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGxheWVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmdldE5ldHdvcmtTZXNzaW9uKCkuc2VuZChzb3VuZFBrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoYFVua25vd24gYWN0aW9uIHR5cGU6ICR7dXNlSXRlbURhdGEuYWN0aW9uVHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS52ZXJib3NlKGBVbmtub3duIHR5cGU6ICR7cGFja2V0LnRyYW5zYWN0aW9uVHlwZX1gKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibmFtZXMiOlsicGxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxNQUFxQiwyQkFBaUYsQ0FBQTtBQUFBLEVBQ2xHLE9BQWMsUUFBUSxXQUFZLENBQUEsMEJBQUE7QUFBQSxFQUVsQyxNQUFhLE1BQUEsQ0FBTyxNQUFvQyxFQUFBLE1BQUEsRUFBZ0IsVUFBMEMsRUFBQTtBQUM5RyxJQUFNLE1BQUEsTUFBQSxHQUFTLFdBQVcsU0FBVSxFQUFBO0FBQ3BDLElBQUksSUFBQSxDQUFDLE1BQU8sQ0FBQSxRQUFBLEVBQVksRUFBQTtBQUN4QixJQUFJLElBQUEsTUFBQSxDQUFPLFFBQWEsS0FBQSxRQUFBLENBQVMsU0FBVyxFQUFBO0FBRTVDLElBQUEsUUFBUSxPQUFPLGVBQWlCO0FBQUEsTUFDNUIsS0FBSyxnQkFBZ0IsTUFBUSxFQUFBO0FBSXpCLFFBQU8sTUFBQSxDQUFBLGdCQUFBLENBQWlCLE9BQVEsQ0FBQSxPQUFPLE1BQVcsS0FBQTtBQUM5QyxVQUFBLFFBQVEsT0FBTyxVQUFZO0FBQUEsWUFDdkIsS0FBSyxDQUFHLEVBQUE7QUFpQ0osY0FBQTtBQUFBO0FBQ0osWUFDQTtBQUNJLGNBQUEsTUFBQSxDQUFPLFdBQVksQ0FBQSxLQUFBLENBQU0sQ0FBd0IscUJBQUEsRUFBQSxNQUFBLENBQU8sVUFBVSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBQzVFLFNBQ0gsQ0FBQTtBQUNELFFBQUE7QUFBQTtBQUNKLE1BQ0EsS0FBSyxnQkFBZ0IsUUFBVSxFQUFBO0FBQzNCLFFBQUEsTUFBTSxjQUEyQixNQUFPLENBQUEsZUFBQTtBQUN4QyxRQUFBLFFBQVEsWUFBWSxVQUFZO0FBQUEsVUFDNUIsS0FBSyxhQUFjLENBQUEsV0FBQTtBQUNmLFlBQU0sTUFBQSxNQUFBLENBQ0QsVUFDQSxDQUFBLFNBQUE7QUFBQSxjQUNHLE1BQUEsQ0FDSyxlQUFnQixFQUFBLENBQ2hCLG1CQUFvQixDQUFBLFdBQUEsQ0FBWSxXQUFXLEtBQU0sRUFBQSxFQUFHLFdBQVksQ0FBQSxVQUFBLENBQVcsSUFBSSxDQUFBO0FBQUEsY0FDcEYsV0FBWSxDQUFBLGFBQUE7QUFBQSxjQUNaLFdBQVksQ0FBQSxTQUFBO0FBQUEsY0FDWixXQUFZLENBQUEsYUFBQTtBQUFBLGNBQ1o7QUFBQSxhQUNKO0FBQ0osWUFBQTtBQUFBLFVBQ0osS0FBSyxhQUFjLENBQUEsU0FBQTtBQUNmLFlBQUE7QUFBQSxVQUNKLEtBQUssY0FBYyxXQUFhLEVBQUE7QUFDNUIsWUFBQSxNQUFNLFFBQVEsTUFBTSxNQUFBLENBQU8sVUFBVyxDQUFBLFVBQUEsQ0FBVyxZQUFZLGFBQWEsQ0FBQTtBQUUxRSxZQUFBLE1BQU0sT0FBVSxHQUFBLEtBQUEsQ0FBTSxRQUFTLENBQUEsV0FBQSxDQUFZLGFBQWEsQ0FBQTtBQUN4RCxZQUFNLE1BQUEsS0FBQSxHQUFRLE9BQU8sZUFBZ0IsRUFBQSxDQUFFLG9CQUFvQixPQUFRLENBQUEsRUFBQSxFQUFJLFFBQVEsSUFBSSxDQUFBO0FBQ25GLFlBQUEsSUFBSSxDQUFDLEtBQU8sRUFBQTtBQUVaLFlBQU0sTUFBQSxFQUFBLEdBQUssSUFBSSxpQkFBa0IsRUFBQTtBQUNqQyxZQUFHLEVBQUEsQ0FBQSxDQUFBLEdBQUksV0FBWSxDQUFBLGFBQUEsQ0FBYyxJQUFLLEVBQUE7QUFDdEMsWUFBRyxFQUFBLENBQUEsQ0FBQSxHQUFJLFdBQVksQ0FBQSxhQUFBLENBQWMsSUFBSyxFQUFBO0FBQ3RDLFlBQUcsRUFBQSxDQUFBLENBQUEsR0FBSSxXQUFZLENBQUEsYUFBQSxDQUFjLElBQUssRUFBQTtBQUt0QyxZQUFHLEVBQUEsQ0FBQSxjQUFBLEdBQWlCLGFBQWMsQ0FBQSxZQUFBLENBQWEsZUFBZSxDQUFBO0FBRzlELFlBQUEsTUFBTSxPQUFRLENBQUEsR0FBQTtBQUFBLGNBQ1YsTUFDSyxDQUFBLGlCQUFBLEVBQ0EsQ0FBQSxhQUFBLEVBQ0EsQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUFBLEtBQU0sQ0FBRSxDQUFBLFFBQUEsRUFBVyxDQUFBLE9BQUEsRUFBYyxLQUFBLE1BQUEsQ0FBTyxRQUFTLEVBQUEsQ0FBRSxPQUFRLEVBQUMsQ0FDcEUsQ0FBQSxHQUFBLENBQUksT0FBT0EsT0FBQUEsS0FBV0EsT0FBTyxDQUFBLGlCQUFBLEVBQW9CLENBQUEsYUFBQSxFQUFnQixDQUFBLGNBQUEsQ0FBZSxFQUFFLENBQUM7QUFBQSxhQUM1RjtBQUVBLFlBQUEsTUFBTSxXQUFXLFdBQVksQ0FBQSxhQUFBO0FBQzdCLFlBQU0sS0FBQSxDQUFBLFFBQUE7QUFBQSxjQUNGLFNBQVMsSUFBSyxFQUFBO0FBQUEsY0FDZCxTQUFTLElBQUssRUFBQTtBQUFBLGNBQ2QsU0FBUyxJQUFLLEVBQUE7QUFBQSxjQUNkLE1BQU8sQ0FBQSxlQUFBLEVBQWtCLENBQUEsUUFBQSxDQUFTLGVBQWU7QUFBQSxhQUNyRDtBQUVBLFlBQU0sTUFBQSxPQUFBLEdBQVUsSUFBSSxxQkFBc0IsRUFBQTtBQUMxQyxZQUFBLE9BQUEsQ0FBUSxLQUFRLEdBQUEsQ0FBQTtBQUVoQixZQUFRLE9BQUEsQ0FBQSxTQUFBLEdBQVksT0FBTyxJQUFLLEVBQUE7QUFDaEMsWUFBUSxPQUFBLENBQUEsU0FBQSxHQUFZLE9BQU8sSUFBSyxFQUFBO0FBQ2hDLFlBQVEsT0FBQSxDQUFBLFNBQUEsR0FBWSxPQUFPLElBQUssRUFBQTtBQUdoQyxZQUFBLE9BQUEsQ0FBUSxTQUFZLEdBQUEsYUFBQSxDQUFjLFlBQWEsQ0FBQSxLQUFBLENBQU0sU0FBUyxDQUFBO0FBQzlELFlBQUEsT0FBQSxDQUFRLFVBQWEsR0FBQSxHQUFBO0FBQ3JCLFlBQUEsT0FBQSxDQUFRLFNBQVksR0FBQSxLQUFBO0FBQ3BCLFlBQUEsT0FBQSxDQUFRLHFCQUF3QixHQUFBLEtBQUE7QUFFaEMsWUFBQSxNQUFNLE9BQVEsQ0FBQSxHQUFBO0FBQUEsY0FDVixNQUNLLENBQUEsUUFBQSxFQUNBLENBQUEsVUFBQSxFQUNBLENBQUEsR0FBQSxDQUFJLENBQUMsTUFBQSxLQUFXLE1BQU8sQ0FBQSxpQkFBQSxFQUFvQixDQUFBLElBQUEsQ0FBSyxPQUFPLENBQUM7QUFBQSxhQUNqRTtBQUNBLFlBQUE7QUFBQTtBQUNKLFVBQ0EsU0FBUztBQUNMLFlBQUEsTUFBQSxDQUFPLFdBQVksQ0FBQSxLQUFBLENBQU0sQ0FBd0IscUJBQUEsRUFBQSxXQUFBLENBQVksVUFBVSxDQUFFLENBQUEsQ0FBQTtBQUFBO0FBQzdFO0FBR0osUUFBQTtBQUFBO0FBQ0osTUFDQSxTQUFTO0FBQ0wsUUFBQSxNQUFBLENBQU8sV0FBWSxDQUFBLE9BQUEsQ0FBUSxDQUFpQixjQUFBLEVBQUEsTUFBQSxDQUFPLGVBQWUsQ0FBRSxDQUFBLENBQUE7QUFDcEUsUUFBTSxNQUFBLElBQUksTUFBTSxrQ0FBa0MsQ0FBQTtBQUFBO0FBQ3REO0FBQ0o7QUFFUjs7OzsifQ==