@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
112 lines (107 loc) • 22.2 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const chat_Chat = require('../../chat/Chat.cjs.cjs');
const network_packet_RespawnPacket = require('../packet/RespawnPacket.cjs.cjs');
const network_packet_SetSpawnPositionPacket = require('../packet/SetSpawnPositionPacket.cjs.cjs');
const minecraft = require('@jsprismarine/minecraft');
const events_chat_ChatEvent = require('../../events/chat/ChatEvent.cjs.cjs');
const events_player_PlayerSpawnEvent = require('../../events/player/PlayerSpawnEvent.cjs.cjs');
const network_Identifiers = require('../Identifiers.cjs.cjs');
const network_packet_AvailableActorIdentifiersPacket = require('../packet/AvailableActorIdentifiersPacket.cjs.cjs');
const network_packet_BiomeDefinitionListPacket = require('../packet/BiomeDefinitionListPacket.cjs.cjs');
const network_packet_ItemComponentPacket = require('../packet/ItemComponentPacket.cjs.cjs');
const network_packet_ResourcePackStackPacket = require('../packet/ResourcePackStackPacket.cjs.cjs');
const network_packet_StartGamePacket = require('../packet/StartGamePacket.cjs.cjs');
const network_type_PlayStatusType = require('../type/PlayStatusType.cjs.cjs');
const network_type_ResourcePackStatusType = require('../type/ResourcePackStatusType.cjs.cjs');
class ResourcePackResponseHandler {
static NetID = network_Identifiers.default.ResourcePackResponsePacket;
async handle(packet, server, session) {
if (packet.status === network_type_ResourcePackStatusType.default.HaveAllPacks) {
const resourcePackStack = new network_packet_ResourcePackStackPacket.default();
resourcePackStack.texturePackRequired = false;
resourcePackStack.experimentsAlreadyEnabled = false;
await session.getConnection().sendDataPacket(resourcePackStack);
} else if (packet.status === network_type_ResourcePackStatusType.default.Completed) {
const player = session.getPlayer();
server.getLogger().info(
`§b${player.getName()}§f is attempting to join with id §b${player.getUUID()}§f (§b${player.getRuntimeId()}§f) from ${player.getAddress().getAddress()}:${player.getAddress().getPort()}`
);
const spawnEvent = new events_player_PlayerSpawnEvent.default(player);
server.post(["playerSpawn", spawnEvent]);
if (spawnEvent.isCancelled()) return;
const world = player.getWorld();
await session.addToPlayerList();
await session.sendTime(world.getTicks());
const startGame = new network_packet_StartGamePacket.default();
startGame.entityId = player.getRuntimeId();
startGame.runtimeEntityId = player.getRuntimeId();
startGame.gamemode = player.gamemode;
startGame.defaultGamemode = minecraft.getGametypeId(server.getConfig().getGamemode());
const worldSpawnPos = await world.getSpawnPosition();
startGame.worldSpawnPos = worldSpawnPos;
startGame.playerPos = player.getPosition();
startGame.pitch = player.pitch;
startGame.yaw = player.yaw;
startGame.serverIdentifier = "JSPrismarine";
startGame.worldIdentifier = world.getName();
startGame.scenarioIdentifier = "JSPrismarine";
startGame.levelId = world.getUUID();
startGame.ticks = server.getTick();
startGame.time = world.getTicks();
startGame.worldName = world.getName();
startGame.seed = world.getSeed();
startGame.gamerules = world.getGameruleManager();
await session.getConnection().sendDataPacket(startGame);
const itemComponent = new network_packet_ItemComponentPacket.default();
await session.getConnection().sendDataPacket(itemComponent);
const setSpawnPos = new network_packet_SetSpawnPositionPacket.default();
setSpawnPos.dimension = 0;
setSpawnPos.position = await world.getSpawnPosition();
setSpawnPos.blockPosition = setSpawnPos.position;
setSpawnPos.type = network_packet_SetSpawnPositionPacket.SpawnType.PLAYER_SPAWN;
await session.getConnection().sendDataPacket(setSpawnPos);
await session.sendTime(world.getTicks());
await session.sendSettings();
await session.sendAvailableCommands();
await session.sendPlayerList();
await session.getConnection().sendDataPacket(new network_packet_BiomeDefinitionListPacket.default());
await session.getConnection().sendDataPacket(new network_packet_AvailableActorIdentifiersPacket.default());
await session.sendAttributes();
await session.sendMetadata();
await session.sendAbilities();
await session.sendCreativeContents();
const respawnPacket = new network_packet_RespawnPacket.default();
respawnPacket.state = network_packet_RespawnPacket.RespawnState.SERVER_SEARCHING_FOR_SPAWN;
respawnPacket.position = player.getPosition();
respawnPacket.runtimeEntityId = player.getRuntimeId();
await session.getConnection().sendDataPacket(respawnPacket);
respawnPacket.state = network_packet_RespawnPacket.RespawnState.SERVER_READY_TO_SPAWN;
await session.getConnection().sendDataPacket(respawnPacket);
respawnPacket.state = network_packet_RespawnPacket.RespawnState.CLIENT_READY_TO_SPAWN;
await session.getConnection().sendDataPacket(respawnPacket);
await session.getPlayer().sendSpawn();
await session.getPlayer().sendInitialSpawnChunks();
await session.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
await Promise.all([
server.getSessionManager().getAllPlayers().filter((p) => p !== player).map(async (p) => {
await p.getNetworkSession().sendSpawn(player);
await session.sendSpawn(p);
}),
player.getWorld().getEntities().filter((e) => !e.isPlayer()).map(async (entity) => entity.sendSpawn(player))
]);
const chatSpawnEvent = new events_chat_ChatEvent.default(
new chat_Chat.Chat({
sender: server.getConsole(),
message: `§e%multiplayer.player.joined`,
parameters: [player.getName()],
needsTranslation: true,
type: chat_Chat.ChatType.TRANSLATION
})
);
await server.emit("chat", chatSpawnEvent);
}
}
}
exports.default = ResourcePackResponseHandler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VQYWNrUmVzcG9uc2VIYW5kbGVyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL2hhbmRsZXIvUmVzb3VyY2VQYWNrUmVzcG9uc2VIYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYXQsIENoYXRUeXBlIH0gZnJvbSAnLi4vLi4vY2hhdC9DaGF0JztcbmltcG9ydCBSZXNwYXduUGFja2V0LCB7IFJlc3Bhd25TdGF0ZSB9IGZyb20gJy4uL3BhY2tldC9SZXNwYXduUGFja2V0JztcbmltcG9ydCBTZXRTcGF3blBvc2l0aW9uUGFja2V0LCB7IFNwYXduVHlwZSB9IGZyb20gJy4uL3BhY2tldC9TZXRTcGF3blBvc2l0aW9uUGFja2V0JztcblxuaW1wb3J0IHsgZ2V0R2FtZXR5cGVJZCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWluZWNyYWZ0JztcbmltcG9ydCB0eXBlIHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLy4uLyc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vLi4vU2VydmVyJztcbmltcG9ydCBDaGF0RXZlbnQgZnJvbSAnLi4vLi4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcbmltcG9ydCBQbGF5ZXJTcGF3bkV2ZW50IGZyb20gJy4uLy4uL2V2ZW50cy9wbGF5ZXIvUGxheWVyU3Bhd25FdmVudCc7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IEF2YWlsYWJsZUFjdG9ySWRlbnRpZmllcnNQYWNrZXQgZnJvbSAnLi4vcGFja2V0L0F2YWlsYWJsZUFjdG9ySWRlbnRpZmllcnNQYWNrZXQnO1xuaW1wb3J0IEJpb21lRGVmaW5pdGlvbkxpc3RQYWNrZXQgZnJvbSAnLi4vcGFja2V0L0Jpb21lRGVmaW5pdGlvbkxpc3RQYWNrZXQnO1xuaW1wb3J0IEl0ZW1Db21wb25lbnRQYWNrZXQgZnJvbSAnLi4vcGFja2V0L0l0ZW1Db21wb25lbnRQYWNrZXQnO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VQYWNrUmVzcG9uc2VQYWNrZXQgZnJvbSAnLi4vcGFja2V0L1Jlc291cmNlUGFja1Jlc3BvbnNlUGFja2V0JztcbmltcG9ydCBSZXNvdXJjZVBhY2tTdGFja1BhY2tldCBmcm9tICcuLi9wYWNrZXQvUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQnO1xuaW1wb3J0IFN0YXJ0R2FtZVBhY2tldCBmcm9tICcuLi9wYWNrZXQvU3RhcnRHYW1lUGFja2V0JztcbmltcG9ydCBQbGF5U3RhdHVzVHlwZSBmcm9tICcuLi90eXBlL1BsYXlTdGF0dXNUeXBlJztcbmltcG9ydCBSZXNvdXJjZVBhY2tTdGF0dXNUeXBlIGZyb20gJy4uL3R5cGUvUmVzb3VyY2VQYWNrU3RhdHVzVHlwZSc7XG5pbXBvcnQgdHlwZSBQYWNrZXRIYW5kbGVyIGZyb20gJy4vUGFja2V0SGFuZGxlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc291cmNlUGFja1Jlc3BvbnNlSGFuZGxlciBpbXBsZW1lbnRzIFBhY2tldEhhbmRsZXI8UmVzb3VyY2VQYWNrUmVzcG9uc2VQYWNrZXQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIE5ldElEID0gSWRlbnRpZmllcnMuUmVzb3VyY2VQYWNrUmVzcG9uc2VQYWNrZXQ7XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHBhY2tldDogUmVzb3VyY2VQYWNrUmVzcG9uc2VQYWNrZXQsIHNlcnZlcjogU2VydmVyLCBzZXNzaW9uOiBQbGF5ZXJTZXNzaW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChwYWNrZXQuc3RhdHVzID09PSBSZXNvdXJjZVBhY2tTdGF0dXNUeXBlLkhhdmVBbGxQYWNrcykge1xuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VQYWNrU3RhY2sgPSBuZXcgUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQoKTtcbiAgICAgICAgICAgIHJlc291cmNlUGFja1N0YWNrLnRleHR1cmVQYWNrUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc291cmNlUGFja1N0YWNrLmV4cGVyaW1lbnRzQWxyZWFkeUVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHJlc291cmNlUGFja1N0YWNrKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWNrZXQuc3RhdHVzID09PSBSZXNvdXJjZVBhY2tTdGF0dXNUeXBlLkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29uc3QgcGxheWVyID0gc2Vzc2lvbi5nZXRQbGF5ZXIoKTtcbiAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAgIC5pbmZvKFxuICAgICAgICAgICAgICAgICAgICBgwqdiJHtwbGF5ZXIuZ2V0TmFtZSgpfcKnZiBpcyBhdHRlbXB0aW5nIHRvIGpvaW4gd2l0aCBpZCDCp2Ike3BsYXllci5nZXRVVUlEKCl9wqdmICjCp2Ike3BsYXllci5nZXRSdW50aW1lSWQoKX3Cp2YpIGZyb20gJHtwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCl9OiR7cGxheWVyLmdldEFkZHJlc3MoKS5nZXRQb3J0KCl9YFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEVtaXQgcGxheWVyU3Bhd24gZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IHNwYXduRXZlbnQgPSBuZXcgUGxheWVyU3Bhd25FdmVudChwbGF5ZXIpO1xuICAgICAgICAgICAgc2VydmVyLnBvc3QoWydwbGF5ZXJTcGF3bicsIHNwYXduRXZlbnRdKTtcbiAgICAgICAgICAgIGlmIChzcGF3bkV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVE9ETzogc2VuZCBpbnZlbnRvcnkgc2xvdHNcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gcGxheWVyLmdldFdvcmxkKCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uYWRkVG9QbGF5ZXJMaXN0KCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRUaW1lKHdvcmxkLmdldFRpY2tzKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdGFydEdhbWUgPSBuZXcgU3RhcnRHYW1lUGFja2V0KCk7XG4gICAgICAgICAgICBzdGFydEdhbWUuZW50aXR5SWQgPSBwbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUucnVudGltZUVudGl0eUlkID0gcGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLmdhbWVtb2RlID0gcGxheWVyLmdhbWVtb2RlO1xuICAgICAgICAgICAgc3RhcnRHYW1lLmRlZmF1bHRHYW1lbW9kZSA9IGdldEdhbWV0eXBlSWQoc2VydmVyLmdldENvbmZpZygpLmdldEdhbWVtb2RlKCkpO1xuXG4gICAgICAgICAgICBjb25zdCB3b3JsZFNwYXduUG9zID0gYXdhaXQgd29ybGQuZ2V0U3Bhd25Qb3NpdGlvbigpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLndvcmxkU3Bhd25Qb3MgPSB3b3JsZFNwYXduUG9zO1xuXG4gICAgICAgICAgICBzdGFydEdhbWUucGxheWVyUG9zID0gcGxheWVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUucGl0Y2ggPSBwbGF5ZXIucGl0Y2g7XG4gICAgICAgICAgICBzdGFydEdhbWUueWF3ID0gcGxheWVyLnlhdztcblxuICAgICAgICAgICAgc3RhcnRHYW1lLnNlcnZlcklkZW50aWZpZXIgPSAnSlNQcmlzbWFyaW5lJztcbiAgICAgICAgICAgIHN0YXJ0R2FtZS53b3JsZElkZW50aWZpZXIgPSB3b3JsZC5nZXROYW1lKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUuc2NlbmFyaW9JZGVudGlmaWVyID0gJ0pTUHJpc21hcmluZSc7XG4gICAgICAgICAgICBzdGFydEdhbWUubGV2ZWxJZCA9IHdvcmxkLmdldFVVSUQoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS50aWNrcyA9IHNlcnZlci5nZXRUaWNrKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUudGltZSA9IHdvcmxkLmdldFRpY2tzKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUud29ybGROYW1lID0gd29ybGQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnNlZWQgPSB3b3JsZC5nZXRTZWVkKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUuZ2FtZXJ1bGVzID0gd29ybGQuZ2V0R2FtZXJ1bGVNYW5hZ2VyKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChzdGFydEdhbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29tcG9uZW50ID0gbmV3IEl0ZW1Db21wb25lbnRQYWNrZXQoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGl0ZW1Db21wb25lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBzZXRTcGF3blBvcyA9IG5ldyBTZXRTcGF3blBvc2l0aW9uUGFja2V0KCk7XG4gICAgICAgICAgICBzZXRTcGF3blBvcy5kaW1lbnNpb24gPSAwOyAvLyBUT0RPOiBlbnVtXG4gICAgICAgICAgICBzZXRTcGF3blBvcy5wb3NpdGlvbiA9IGF3YWl0IHdvcmxkLmdldFNwYXduUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHNldFNwYXduUG9zLmJsb2NrUG9zaXRpb24gPSBzZXRTcGF3blBvcy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHNldFNwYXduUG9zLnR5cGUgPSBTcGF3blR5cGUuUExBWUVSX1NQQVdOO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoc2V0U3Bhd25Qb3MpO1xuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRUaW1lKHdvcmxkLmdldFRpY2tzKCkpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBzZXQgZGlmZmljdWx0eSBwYWNrZXRcbiAgICAgICAgICAgIC8vIFRPRE86IHNldCBjb21tYW5kcyBlbmFibGVkIHBhY2tldFxuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRTZXR0aW5ncygpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kQXZhaWxhYmxlQ29tbWFuZHMoKTtcblxuICAgICAgICAgICAgLy8gVE9ETzogZ2FtZSBydWxlcyBjaGFuZ2VkIHBhY2tldFxuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRQbGF5ZXJMaXN0KCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KG5ldyBCaW9tZURlZmluaXRpb25MaXN0UGFja2V0KCkpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQobmV3IEF2YWlsYWJsZUFjdG9ySWRlbnRpZmllcnNQYWNrZXQoKSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHBsYXllciBmb2cgcGFja2V0XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZEF0dHJpYnV0ZXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRBYmlsaXRpZXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZENyZWF0aXZlQ29udGVudHMoKTtcblxuICAgICAgICAgICAgLy8gU29tZSBwYWNrZXRzLi4uXG5cbiAgICAgICAgICAgIC8vIFRPRE86IGludmVudG9yeSBjcmFmdGluZyBkYXRhXG5cbiAgICAgICAgICAgIC8vIFRPRE86IGF2YWlsYWJsZSBjb21tYW5kc1xuXG4gICAgICAgICAgICBjb25zdCByZXNwYXduUGFja2V0ID0gbmV3IFJlc3Bhd25QYWNrZXQoKTtcbiAgICAgICAgICAgIHJlc3Bhd25QYWNrZXQuc3RhdGUgPSBSZXNwYXduU3RhdGUuU0VSVkVSX1NFQVJDSElOR19GT1JfU1BBV047XG4gICAgICAgICAgICByZXNwYXduUGFja2V0LnBvc2l0aW9uID0gcGxheWVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICByZXNwYXduUGFja2V0LnJ1bnRpbWVFbnRpdHlJZCA9IHBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHJlc3Bhd25QYWNrZXQpO1xuXG4gICAgICAgICAgICByZXNwYXduUGFja2V0LnN0YXRlID0gUmVzcGF3blN0YXRlLlNFUlZFUl9SRUFEWV9UT19TUEFXTjtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHJlc3Bhd25QYWNrZXQpO1xuICAgICAgICAgICAgcmVzcGF3blBhY2tldC5zdGF0ZSA9IFJlc3Bhd25TdGF0ZS5DTElFTlRfUkVBRFlfVE9fU1BBV047XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChyZXNwYXduUGFja2V0KTtcblxuICAgICAgICAgICAgLy8gU2VudCB0byBsZXQga25vdyB0aGUgY2xpZW50IHNhdmVkIGNodW5rc1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRQbGF5ZXIoKS5zZW5kU3Bhd24oKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0UGxheWVyKCkuc2VuZEluaXRpYWxTcGF3bkNodW5rcygpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5QbGF5ZXJTcGF3bik7XG5cbiAgICAgICAgICAgIC8vIFN1bW1vbiBwbGF5ZXIocykgJiBlbnRpdGllc1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IHBsYXllcilcbiAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcC5nZXROZXR3b3JrU2Vzc2lvbigpLnNlbmRTcGF3bihwbGF5ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kU3Bhd24ocCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHBsYXllclxuICAgICAgICAgICAgICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0RW50aXRpZXMoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiAhZS5pc1BsYXllcigpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zZW5kU3Bhd24ocGxheWVyKSlcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAvLyBBbm5vdW5jZSBjb25uZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBjaGF0U3Bhd25FdmVudCA9IG5ldyBDaGF0RXZlbnQoXG4gICAgICAgICAgICAgICAgbmV3IENoYXQoe1xuICAgICAgICAgICAgICAgICAgICBzZW5kZXI6IHNlcnZlci5nZXRDb25zb2xlKCkhLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdlJW11bHRpcGxheWVyLnBsYXllci5qb2luZWRgLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbcGxheWVyLmdldE5hbWUoKV0sXG4gICAgICAgICAgICAgICAgICAgIG5lZWRzVHJhbnNsYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IENoYXRUeXBlLlRSQU5TTEFUSU9OXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuZW1pdCgnY2hhdCcsIGNoYXRTcGF3bkV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJJZGVudGlmaWVycyIsIlJlc291cmNlUGFja1N0YXR1c1R5cGUiLCJSZXNvdXJjZVBhY2tTdGFja1BhY2tldCIsIlBsYXllclNwYXduRXZlbnQiLCJTdGFydEdhbWVQYWNrZXQiLCJnZXRHYW1ldHlwZUlkIiwiSXRlbUNvbXBvbmVudFBhY2tldCIsIlNldFNwYXduUG9zaXRpb25QYWNrZXQiLCJTcGF3blR5cGUiLCJCaW9tZURlZmluaXRpb25MaXN0UGFja2V0IiwiQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCIsIlJlc3Bhd25QYWNrZXQiLCJSZXNwYXduU3RhdGUiLCJQbGF5U3RhdHVzVHlwZSIsIkNoYXRFdmVudCIsIkNoYXQiLCJDaGF0VHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxNQUFxQiwyQkFBaUYsQ0FBQTtBQUFBLEVBQ2xHLE9BQWMsUUFBUUEsMkJBQVksQ0FBQSwwQkFBQTtBQUFBLEVBRWxDLE1BQWEsTUFBQSxDQUFPLE1BQW9DLEVBQUEsTUFBQSxFQUFnQixPQUF1QyxFQUFBO0FBQzNHLElBQUksSUFBQSxNQUFBLENBQU8sTUFBVyxLQUFBQywyQ0FBQSxDQUF1QixZQUFjLEVBQUE7QUFDdkQsTUFBTSxNQUFBLGlCQUFBLEdBQW9CLElBQUlDLDhDQUF3QixFQUFBO0FBQ3RELE1BQUEsaUJBQUEsQ0FBa0IsbUJBQXNCLEdBQUEsS0FBQTtBQUN4QyxNQUFBLGlCQUFBLENBQWtCLHlCQUE0QixHQUFBLEtBQUE7QUFDOUMsTUFBQSxNQUFNLE9BQVEsQ0FBQSxhQUFBLEVBQWdCLENB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