@jsprismarine/prismarine 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/Console.cjs.js +2 -2
  3. package/dist/Console.d.ts +1 -1
  4. package/dist/Console.d.ts.map +1 -1
  5. package/dist/Console.es.js +2 -2
  6. package/dist/Player.cjs.js +1 -1
  7. package/dist/Player.es.js +1 -1
  8. package/dist/{Protocol-C1DcF_Iw.cjs → Protocol-BVaFul30.cjs} +2 -2
  9. package/dist/{Protocol-9T3wX43U.js → Protocol-D9dzQTbF.js} +2 -2
  10. package/dist/Server-DAXmO2Rm.js +1864 -0
  11. package/dist/Server-nY-WO-m_.cjs +1886 -0
  12. package/dist/Server.cjs.js +1 -1
  13. package/dist/Server.d.ts.map +1 -1
  14. package/dist/Server.es.js +1 -1
  15. package/dist/block/Block.cjs.js +2 -2
  16. package/dist/block/Block.es.js +2 -2
  17. package/dist/block/blocks/Bookshelf.d.ts +1 -1
  18. package/dist/block/blocks/CoalOre.d.ts +1 -1
  19. package/dist/block/blocks/Gravel.d.ts +1 -1
  20. package/dist/block/blocks/WhiteBed.d.ts +1 -1
  21. package/dist/chat/ChatManager.cjs.js +1 -1
  22. package/dist/chat/ChatManager.d.ts.map +1 -1
  23. package/dist/chat/ChatManager.es.js +1 -1
  24. package/dist/command/Command.cjs.js +2 -2
  25. package/dist/command/Command.es.js +2 -2
  26. package/dist/command/CommandArguments.cjs.js +1 -1
  27. package/dist/command/CommandArguments.es.js +1 -1
  28. package/dist/command/CommandManager.cjs.js +2 -2
  29. package/dist/command/CommandManager.es.js +2 -2
  30. package/dist/command/Commands.cjs.js +1 -1
  31. package/dist/command/Commands.es.js +1 -1
  32. package/dist/command/index.cjs.js +1 -1
  33. package/dist/command/index.es.js +1 -1
  34. package/dist/command/vanilla/BanCommand.cjs.js +1 -1
  35. package/dist/command/vanilla/BanCommand.es.js +1 -1
  36. package/dist/command/vanilla/DeopCommand.cjs.js +1 -1
  37. package/dist/command/vanilla/DeopCommand.es.js +1 -1
  38. package/dist/command/vanilla/ExecuteCommand.cjs.js +1 -1
  39. package/dist/command/vanilla/ExecuteCommand.es.js +1 -1
  40. package/dist/command/vanilla/GamemodeCommand.cjs.js +1 -1
  41. package/dist/command/vanilla/GamemodeCommand.es.js +1 -1
  42. package/dist/command/vanilla/KickCommand.cjs.js +1 -1
  43. package/dist/command/vanilla/KickCommand.es.js +1 -1
  44. package/dist/command/vanilla/OpCommand.cjs.js +1 -1
  45. package/dist/command/vanilla/OpCommand.es.js +1 -1
  46. package/dist/command/vanilla/PardonCommand.cjs.js +1 -1
  47. package/dist/command/vanilla/PardonCommand.es.js +1 -1
  48. package/dist/command/vanilla/SummonCommand.cjs.js +1 -1
  49. package/dist/command/vanilla/SummonCommand.es.js +1 -1
  50. package/dist/command/vanilla/TpCommand.cjs.js +1 -1
  51. package/dist/command/vanilla/TpCommand.es.js +1 -1
  52. package/dist/config/ConfigBuilder.cjs.js +12 -4
  53. package/dist/config/ConfigBuilder.d.ts.map +1 -1
  54. package/dist/config/ConfigBuilder.es.js +12 -4
  55. package/dist/entity/Attribute.cjs.js +1 -1
  56. package/dist/entity/Attribute.d.ts.map +1 -1
  57. package/dist/entity/Attribute.es.js +1 -1
  58. package/dist/entity/Entity.cjs.js +4 -3
  59. package/dist/entity/Entity.d.ts.map +1 -1
  60. package/dist/entity/Entity.es.js +4 -3
  61. package/dist/entity/Metadata.cjs.js +1 -1
  62. package/dist/entity/Metadata.d.ts.map +1 -1
  63. package/dist/entity/Metadata.es.js +1 -1
  64. package/dist/events/EventManager.cjs.js +1 -1
  65. package/dist/events/EventManager.d.ts.map +1 -1
  66. package/dist/events/EventManager.es.js +1 -1
  67. package/dist/form/Form.cjs.js +2 -2
  68. package/dist/form/Form.d.ts +1 -1
  69. package/dist/form/Form.d.ts.map +1 -1
  70. package/dist/form/Form.es.js +2 -2
  71. package/dist/form/FormManager.cjs.js +1 -1
  72. package/dist/form/FormManager.d.ts.map +1 -1
  73. package/dist/form/FormManager.es.js +1 -1
  74. package/dist/form/IForm.d.ts.map +1 -1
  75. package/dist/form/ModalForm.cjs.js +1 -1
  76. package/dist/form/ModalForm.d.ts.map +1 -1
  77. package/dist/form/ModalForm.es.js +1 -1
  78. package/dist/{index-D7ZMTxc2.cjs → index-CVGv9HUF.cjs} +2 -2
  79. package/dist/{index-B3UWpR-P.js → index-O6jPg9jt.js} +2 -2
  80. package/dist/index.cjs.js +3 -3
  81. package/dist/index.es.js +3 -3
  82. package/dist/inventory/HumanInventory.cjs.js +1 -1
  83. package/dist/inventory/HumanInventory.d.ts.map +1 -1
  84. package/dist/inventory/HumanInventory.es.js +1 -1
  85. package/dist/inventory/Inventory.cjs.js +1 -1
  86. package/dist/inventory/Inventory.d.ts.map +1 -1
  87. package/dist/inventory/Inventory.es.js +1 -1
  88. package/dist/inventory/WindowManager.cjs.js +1 -1
  89. package/dist/inventory/WindowManager.d.ts.map +1 -1
  90. package/dist/inventory/WindowManager.es.js +1 -1
  91. package/dist/item/Armor.cjs.js +1 -1
  92. package/dist/item/Armor.d.ts +1 -1
  93. package/dist/item/Armor.d.ts.map +1 -1
  94. package/dist/item/Armor.es.js +1 -1
  95. package/dist/item/Item.cjs.js +2 -2
  96. package/dist/item/Item.es.js +2 -2
  97. package/dist/item/ItemManager.cjs.js +2 -2
  98. package/dist/item/ItemManager.d.ts +2 -2
  99. package/dist/item/ItemManager.d.ts.map +1 -1
  100. package/dist/item/ItemManager.es.js +2 -2
  101. package/dist/item/TieredTool.cjs.js +1 -1
  102. package/dist/item/TieredTool.d.ts.map +1 -1
  103. package/dist/item/TieredTool.es.js +1 -1
  104. package/dist/item/Tool.cjs.js +1 -1
  105. package/dist/item/Tool.d.ts +1 -1
  106. package/dist/item/Tool.d.ts.map +1 -1
  107. package/dist/item/Tool.es.js +1 -1
  108. package/dist/network/ClientConnection.cjs.js +1 -1
  109. package/dist/network/ClientConnection.d.ts +1 -1
  110. package/dist/network/ClientConnection.d.ts.map +1 -1
  111. package/dist/network/ClientConnection.es.js +1 -1
  112. package/dist/network/Handlers.cjs.js +1 -1
  113. package/dist/network/Handlers.es.js +1 -1
  114. package/dist/network/MinecraftSession.cjs.js +1 -1
  115. package/dist/network/MinecraftSession.d.ts +1 -1
  116. package/dist/network/MinecraftSession.d.ts.map +1 -1
  117. package/dist/network/MinecraftSession.es.js +1 -1
  118. package/dist/network/NetworkUtil.cjs.js +1 -1
  119. package/dist/network/NetworkUtil.d.ts.map +1 -1
  120. package/dist/network/NetworkUtil.es.js +1 -1
  121. package/dist/network/PacketRegistry.cjs.js +1 -1
  122. package/dist/network/PacketRegistry.d.ts +6 -6
  123. package/dist/network/PacketRegistry.d.ts.map +1 -1
  124. package/dist/network/PacketRegistry.es.js +1 -1
  125. package/dist/network/PlayerSession.cjs.js +1 -1
  126. package/dist/network/PlayerSession.d.ts.map +1 -1
  127. package/dist/network/PlayerSession.es.js +1 -1
  128. package/dist/network/Protocol.cjs.js +1 -1
  129. package/dist/network/Protocol.es.js +1 -1
  130. package/dist/network/handler/LoginHandler.cjs.js +1 -1
  131. package/dist/network/handler/LoginHandler.es.js +1 -1
  132. package/dist/permission/PermissionManager.cjs.js +4 -4
  133. package/dist/permission/PermissionManager.d.ts +1 -1
  134. package/dist/permission/PermissionManager.d.ts.map +1 -1
  135. package/dist/permission/PermissionManager.es.js +4 -4
  136. package/dist/plugin/PluginFile.cjs.js +1 -1
  137. package/dist/plugin/PluginFile.d.ts.map +1 -1
  138. package/dist/plugin/PluginFile.es.js +1 -1
  139. package/dist/plugin/PluginManager.cjs.js +5 -4
  140. package/dist/plugin/PluginManager.d.ts +2 -2
  141. package/dist/plugin/PluginManager.d.ts.map +1 -1
  142. package/dist/plugin/PluginManager.es.js +5 -4
  143. package/dist/query/QueryManager.cjs.js +1 -1
  144. package/dist/query/QueryManager.es.js +1 -1
  145. package/dist/utils/Logger.cjs.js +49 -38
  146. package/dist/utils/Logger.d.ts +4 -1
  147. package/dist/utils/Logger.d.ts.map +1 -1
  148. package/dist/utils/Logger.es.js +49 -38
  149. package/dist/utils/ParseTildeCaretNotation.cjs.js +1 -1
  150. package/dist/utils/ParseTildeCaretNotation.d.ts.map +1 -1
  151. package/dist/utils/ParseTildeCaretNotation.es.js +1 -1
  152. package/dist/utils/Timer.cjs.js +1 -1
  153. package/dist/utils/Timer.d.ts.map +1 -1
  154. package/dist/utils/Timer.es.js +1 -1
  155. package/dist/utils/UUID.cjs.js +2 -2
  156. package/dist/utils/UUID.es.js +2 -2
  157. package/dist/world/BaseGenerator.cjs.js +1 -1
  158. package/dist/world/BaseGenerator.d.ts.map +1 -1
  159. package/dist/world/BaseGenerator.es.js +1 -1
  160. package/dist/world/BlockPosition.cjs.js +1 -1
  161. package/dist/world/BlockPosition.d.ts.map +1 -1
  162. package/dist/world/BlockPosition.es.js +1 -1
  163. package/dist/world/GameruleManager.cjs.js +4 -4
  164. package/dist/world/GameruleManager.d.ts +3 -3
  165. package/dist/world/GameruleManager.d.ts.map +1 -1
  166. package/dist/world/GameruleManager.es.js +4 -4
  167. package/dist/world/Generator.d.ts.map +1 -1
  168. package/dist/world/WorldManager.cjs.js +3 -7
  169. package/dist/world/WorldManager.d.ts +1 -1
  170. package/dist/world/WorldManager.d.ts.map +1 -1
  171. package/dist/world/WorldManager.es.js +3 -7
  172. package/package.json +5 -5
  173. package/dist/Server-AfmPsq74.cjs +0 -1884
  174. package/dist/Server-Dyy9OCM8.js +0 -1862
@@ -1,1862 +0,0 @@
1
- import { RakNetListener } from '@jsprismarine/raknet';
2
- import Chat, { ChatType } from './chat/Chat.es.js';
3
- import BanManager from './ban/BanManager.es.js';
4
- import BatchPacket from './network/packet/BatchPacket.es.js';
5
- import BlockManager from './block/BlockManager.es.js';
6
- import { BlockMappings } from './block/BlockMappings.es.js';
7
- import ChatEvent from './events/chat/ChatEvent.es.js';
8
- import ChatManager from './chat/ChatManager.es.js';
9
- import { E as Entities } from './Entities-BTndRlb_.js';
10
- import { Suggestions } from '@jsprismarine/brigadier';
11
- import CommandParameter, { CommandParameterFlags, CommandParameterType } from './network/type/CommandParameter.es.js';
12
- import CommandEnum from './network/type/CommandEnum.es.js';
13
- import Gamemode from './world/Gamemode.es.js';
14
- import ParseTargetSelector from './utils/ParseTargetSelector.es.js';
15
- import ParseTildeCaretNotation from './utils/ParseTildeCaretNotation.es.js';
16
- import CommandManager from './command/CommandManager.es.js';
17
- import Console from './Console.es.js';
18
- import { EventManager } from './events/EventManager.es.js';
19
- import Identifiers from './network/Identifiers.es.js';
20
- import ItemManager from './item/ItemManager.es.js';
21
- import AnimateHandler from './network/handler/AnimateHandler.es.js';
22
- import ClientCacheStatusHandler from './network/handler/ClientCacheStatusHandler.es.js';
23
- import CommandRequestHandler from './network/handler/CommandRequestHandler.es.js';
24
- import ContainerCloseHandler from './network/handler/ContainerCloseHandler.es.js';
25
- import EmoteListHandler from './network/handler/EmoteListHandler.es.js';
26
- import InteractHandler from './network/handler/InteractHandler.es.js';
27
- import InventoryTransactionHandler from './network/handler/InventoryTransactionHandler.es.js';
28
- import LevelSoundEventHandler from './network/handler/LevelSoundEventHandler.es.js';
29
- import PlayStatusPacket from './network/packet/PlayStatusPacket.es.js';
30
- import ResourcePacksInfoPacket from './network/packet/ResourcePacksInfoPacket.es.js';
31
- import PlayStatusType from './network/type/PlayStatusType.es.js';
32
- import ChangeDimensionPacket from './network/packet/ChangeDimensionPacket.es.js';
33
- import LevelChunkPacket from './network/packet/LevelChunkPacket.es.js';
34
- import { MetadataFlag, FlagType } from './entity/Metadata.es.js';
35
- import ContainerEntry from './inventory/ContainerEntry.es.js';
36
- import CoordinateUtils from './world/CoordinateUtils.es.js';
37
- import FormManager from './form/FormManager.es.js';
38
- import Human from './entity/Human.es.js';
39
- import MovementType from './network/type/MovementType.es.js';
40
- import PlayerSetGamemodeEvent from './events/player/PlayerSetGamemodeEvent.es.js';
41
- import PlayerToggleFlightEvent from './events/player/PlayerToggleFlightEvent.es.js';
42
- import PlayerToggleSprintEvent from './events/player/PlayerToggleSprintEvent.es.js';
43
- import TextType from './network/type/TextType.es.js';
44
- import Timer from './utils/Timer.es.js';
45
- import Vector3 from './math/Vector3.es.js';
46
- import WindowManager, { WindowIds } from './inventory/WindowManager.es.js';
47
- import MobEquipmentHandler from './network/handler/MobEquipmentHandler.es.js';
48
- import ModalFormResponseHandler from './network/handler/ModalFormResponseHandler.es.js';
49
- import MovePlayerHandler from './network/handler/MovePlayerHandler.es.js';
50
- import PacketViolationWarningHandler from './network/handler/PacketViolationWarningHandler.es.js';
51
- import PlayerActionHandler from './network/handler/PlayerActionHandler.es.js';
52
- import RequestChunkRadiusHandler from './network/handler/RequestChunkRadiusHandler.es.js';
53
- import ResourcePackResponseHandler from './network/handler/ResourcePackResponseHandler.es.js';
54
- import ServerSettingsRequestHandler from './network/handler/ServerSettingsRequestHandler.es.js';
55
- import SetDefaultGameTypeHandler from './network/handler/SetDefaultGameTypeHandler.es.js';
56
- import SetLocalPlayerAsInitializedHandler from './network/handler/SetLocalPlayerAsInitializedHandler.es.js';
57
- import SetPlayerGameTypeHandler from './network/handler/SetPlayerGameTypeHandler.es.js';
58
- import TextHandler from './network/handler/TextHandler.es.js';
59
- import TickSyncHandler from './network/handler/TickSyncHandler.es.js';
60
- import RequestNetworkSettingsHandler from './network/handler/RequestNetworkSettingsHandler.es.js';
61
- import { P as Packets } from './Packets-CmLdpaty.js';
62
- import PermissionManager from './permission/PermissionManager.es.js';
63
- import PluginManager from './plugin/PluginManager.es.js';
64
- import QueryManager from './query/QueryManager.es.js';
65
- import RaknetConnectEvent from './events/raknet/RaknetConnectEvent.es.js';
66
- import RaknetDisconnectEvent from './events/raknet/RaknetDisconnectEvent.es.js';
67
- import RaknetEncapsulatedPacketEvent from './events/raknet/RaknetEncapsulatedPacketEvent.es.js';
68
- import SessionManager from './SessionManager.es.js';
69
- import TickEvent from './events/other/TickEvent.es.js';
70
- import WorldManager from './world/WorldManager.es.js';
71
- import NetworkChunkPublisherUpdatePacket from './network/packet/NetworkChunkPublisherUpdatePacket.es.js';
72
- import PlayerListPacket, { PlayerListAction, PlayerListEntry } from './network/packet/PlayerListPacket.es.js';
73
- import UpdateAbilitiesPacket, { AbilityLayerType, AbilityLayerFlag, AbilityLayer } from './network/packet/UpdateAbilitiesPacket.es.js';
74
- import AddPlayerPacket from './network/packet/AddPlayerPacket.es.js';
75
- import AvailableCommandsPacket from './network/packet/AvailableCommandsPacket.es.js';
76
- import UpdateAdventureSettingsPacket from './network/packet/UpdateAdventureSettingsPacket.es.js';
77
- import ChunkRadiusUpdatedPacket from './network/packet/ChunkRadiusUpdatedPacket.es.js';
78
- import CreativeContentPacket from './network/packet/CreativeContentPacket.es.js';
79
- import DisconnectPacket from './network/packet/DisconnectPacket.es.js';
80
- import InventoryContentPacket from './network/packet/InventoryContentPacket.es.js';
81
- import MobEquipmentPacket from './network/packet/MobEquipmentPacket.es.js';
82
- import ModalFormRequestPacket from './network/packet/ModalFormRequestPacket.es.js';
83
- import MovePlayerPacket from './network/packet/MovePlayerPacket.es.js';
84
- import RemoveActorPacket from './network/packet/RemoveActorPacket.es.js';
85
- import SetActorDataPacket from './network/packet/SetActorDataPacket.es.js';
86
- import SetPlayerGameTypePacket from './network/packet/SetPlayerGameTypePacket.es.js';
87
- import SetTimePacket from './network/packet/SetTimePacket.es.js';
88
- import TextPacket from './network/packet/TextPacket.es.js';
89
- import UpdateAttributesPacket from './network/packet/UpdateAttributesPacket.es.js';
90
- import ToastRequestPacket from './network/packet/ToastRequestPacket.es.js';
91
- import BlockPosition from './world/BlockPosition.es.js';
92
- import Chunk from './world/chunk/Chunk.es.js';
93
- import CommandData from './network/type/CommandData.es.js';
94
- import Heap from 'heap';
95
- import Item from './item/Item.es.js';
96
- import PermissionType from './network/type/PermissionType.es.js';
97
- import PlayerPermissionType from './network/type/PlayerPermissionType.es.js';
98
- import UUID from './utils/UUID.es.js';
99
- import { creativeitems } from '@jsprismarine/bedrock-data';
100
- import MinecraftSession from './network/MinecraftSession.es.js';
101
- import assert from 'assert';
102
-
103
- class CommandArgument {
104
- getReadableType() {
105
- return "";
106
- }
107
- getParameters() {
108
- return /* @__PURE__ */ new Set();
109
- }
110
- }
111
- class CommandArgumentGamemode {
112
- name;
113
- optional;
114
- flags;
115
- postfix;
116
- constructor(data) {
117
- this.name = data?.name ?? "gameMode";
118
- this.optional = data?.optional ?? false;
119
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
120
- this.postfix = data?.postfix ?? null;
121
- }
122
- parse(reader, _context) {
123
- const gm = reader.readString();
124
- Gamemode.getGamemodeId(gm);
125
- return gm;
126
- }
127
- async listSuggestions(_context, _builder) {
128
- return Suggestions.empty();
129
- }
130
- getExamples() {
131
- return ["survival", "creative", "adventure", "spectator"];
132
- }
133
- getReadableType() {
134
- return this.name;
135
- }
136
- getParameters() {
137
- const gameModeEnum = new CommandEnum();
138
- gameModeEnum.enumName = "GameMode";
139
- gameModeEnum.enumValues = ["survival", "creative", "adventure", "spectator"];
140
- return /* @__PURE__ */ new Set([
141
- new CommandParameter({
142
- paramName: this.name,
143
- isOptional: this.optional,
144
- flags: this.flags,
145
- enum: gameModeEnum,
146
- postfix: this.postfix
147
- })
148
- ]);
149
- }
150
- }
151
- class CommandArgumentMob {
152
- name;
153
- optional;
154
- flags;
155
- postfix;
156
- constructor(data) {
157
- this.name = data?.name ?? "entityType";
158
- this.optional = data?.optional ?? false;
159
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
160
- this.postfix = data?.postfix ?? null;
161
- }
162
- parse(reader, _context) {
163
- let str = "";
164
- while (true) {
165
- if (!reader.canRead())
166
- break;
167
- const pos = reader.getCursor();
168
- const char = reader.read();
169
- if (char === " ") {
170
- reader.setCursor(pos);
171
- break;
172
- }
173
- str += char;
174
- }
175
- return str;
176
- }
177
- async listSuggestions(_context, _builder) {
178
- return Suggestions.empty();
179
- }
180
- getExamples() {
181
- return [];
182
- }
183
- getReadableType() {
184
- return this.name;
185
- }
186
- getParameters() {
187
- const entityTypeEnum = new CommandEnum();
188
- entityTypeEnum.enumName = "EntityType";
189
- entityTypeEnum.enumValues = Object.entries(Entities).map(([, entity]) => entity.MOB_ID);
190
- return /* @__PURE__ */ new Set([
191
- new CommandParameter({
192
- paramName: this.name,
193
- isOptional: this.optional,
194
- flags: this.flags,
195
- enum: entityTypeEnum,
196
- postfix: this.postfix
197
- })
198
- ]);
199
- }
200
- }
201
- class CommandArgumentEntity {
202
- name;
203
- optional;
204
- flags;
205
- postfix;
206
- constructor(data) {
207
- this.name = data?.name ?? "target";
208
- this.optional = data?.optional ?? false;
209
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
210
- this.postfix = data?.postfix ?? null;
211
- }
212
- parse(reader, context) {
213
- let player = "";
214
- while (true) {
215
- if (!reader.canRead())
216
- break;
217
- const pos = reader.getCursor();
218
- const char = reader.read();
219
- if (char === " ") {
220
- reader.setCursor(pos);
221
- break;
222
- }
223
- player += char;
224
- }
225
- if (player.startsWith("@"))
226
- try {
227
- return ParseTargetSelector({
228
- input: player,
229
- source: context.getSource(),
230
- entities: context.getSource().getWorld().getEntities()
231
- });
232
- } catch (error) {
233
- if (!error.message.includes("no results"))
234
- throw error;
235
- return [];
236
- }
237
- return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)];
238
- }
239
- getReadableType() {
240
- return this.name;
241
- }
242
- getParameters() {
243
- return /* @__PURE__ */ new Set([
244
- new CommandParameter({
245
- paramName: this.name,
246
- paramType: CommandParameterType.Target,
247
- isOptional: this.optional,
248
- flags: this.flags,
249
- postfix: this.postfix
250
- })
251
- ]);
252
- }
253
- }
254
- class CommandArgumentPosition extends Vector3 {
255
- name;
256
- optional;
257
- flags;
258
- postfix;
259
- constructor(data) {
260
- super();
261
- this.name = data?.name ?? "position";
262
- this.optional = data?.optional ?? false;
263
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
264
- this.postfix = data?.postfix ?? null;
265
- }
266
- parse(reader, context) {
267
- const getPos = () => {
268
- let pos = "";
269
- while (true) {
270
- if (!reader.canRead())
271
- break;
272
- const cursor = reader.getCursor();
273
- const char = reader.read();
274
- if (char === " ") {
275
- reader.setCursor(cursor);
276
- break;
277
- }
278
- pos += char;
279
- }
280
- return pos;
281
- };
282
- this.setX(
283
- ParseTildeCaretNotation({
284
- input: getPos(),
285
- source: context.getSource(),
286
- type: "x"
287
- })
288
- );
289
- reader.skip();
290
- this.setY(
291
- ParseTildeCaretNotation({
292
- input: getPos(),
293
- source: context.getSource(),
294
- type: "y"
295
- })
296
- );
297
- reader.skip();
298
- this.setZ(
299
- ParseTildeCaretNotation({
300
- input: getPos(),
301
- source: context.getSource(),
302
- type: "z"
303
- })
304
- );
305
- return this;
306
- }
307
- getReadableType() {
308
- return this.name;
309
- }
310
- getParameters() {
311
- return /* @__PURE__ */ new Set([
312
- new CommandParameter({
313
- paramName: this.name,
314
- paramType: CommandParameterType.Position,
315
- isOptional: this.optional,
316
- flags: this.flags,
317
- postfix: this.postfix
318
- })
319
- ]);
320
- }
321
- }
322
- class CommandArgumentCommand {
323
- name;
324
- optional;
325
- flags;
326
- postfix;
327
- constructor(data) {
328
- this.name = data?.name ?? "command";
329
- this.optional = data?.optional ?? false;
330
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
331
- this.postfix = data?.postfix ?? null;
332
- }
333
- parse(reader, _context) {
334
- const command = reader.readString();
335
- return command;
336
- }
337
- getReadableType() {
338
- return this.name;
339
- }
340
- getParameters() {
341
- return /* @__PURE__ */ new Set([
342
- new CommandParameter({
343
- paramName: this.name,
344
- paramType: CommandParameterType.Position,
345
- isOptional: this.optional,
346
- flags: this.flags,
347
- postfix: this.postfix
348
- })
349
- ]);
350
- }
351
- }
352
- class BooleanArgumentCommand {
353
- name;
354
- optional;
355
- flags;
356
- postfix;
357
- constructor(data) {
358
- this.name = data?.name ?? "boolean";
359
- this.optional = data?.optional ?? false;
360
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
361
- this.postfix = data?.postfix ?? null;
362
- }
363
- parse(reader, _context) {
364
- const boolean = reader.readString();
365
- if (boolean === "true")
366
- return true;
367
- return false;
368
- }
369
- getReadableType() {
370
- return this.name;
371
- }
372
- getParameters() {
373
- const booleanEnum = new CommandEnum();
374
- booleanEnum.enumName = "Boolean";
375
- booleanEnum.enumValues = ["true", "false"];
376
- return /* @__PURE__ */ new Set([
377
- new CommandParameter({
378
- paramName: this.name,
379
- isOptional: this.optional,
380
- enum: booleanEnum,
381
- flags: this.flags,
382
- postfix: this.postfix
383
- })
384
- ]);
385
- }
386
- }
387
- class PlayerArgumentCommand {
388
- name;
389
- optional;
390
- flags;
391
- postfix;
392
- constructor(data) {
393
- this.name = data?.name ?? "player";
394
- this.optional = data?.optional ?? false;
395
- this.flags = data?.flags ?? CommandParameterFlags.NONE;
396
- this.postfix = data?.postfix ?? null;
397
- }
398
- parse(reader, _context) {
399
- const player = reader.readString();
400
- return player;
401
- }
402
- getReadableType() {
403
- return this.name;
404
- }
405
- getParameters() {
406
- const playerEnum = new CommandEnum();
407
- playerEnum.enumName = "Player";
408
- try {
409
- playerEnum.enumValues = Server.instance.getSessionManager().getAllPlayers().map((player) => player.getName());
410
- } catch {
411
- playerEnum.enumValues = [];
412
- }
413
- return /* @__PURE__ */ new Set([
414
- new CommandParameter({
415
- paramName: this.name,
416
- isOptional: this.optional,
417
- enum: playerEnum,
418
- flags: this.flags,
419
- postfix: this.postfix
420
- })
421
- ]);
422
- }
423
- }
424
-
425
- class LoginHandler {
426
- static NetID = Identifiers.LoginPacket;
427
- async handle(packet, server, connection) {
428
- const playStatus = new PlayStatusPacket();
429
- if (packet.protocol !== Identifiers.Protocol) {
430
- playStatus.status = packet.protocol < Identifiers.Protocol ? PlayStatusType.LoginFailedClient : PlayStatusType.LoginFailedServer;
431
- await connection.sendDataPacket(playStatus, true);
432
- return;
433
- }
434
- if (!packet.displayName) {
435
- connection.disconnect("Invalid username!", false);
436
- return;
437
- }
438
- const world = server.getWorldManager().getDefaultWorld();
439
- const player = new Player(connection, world, server);
440
- player.username.name = packet.displayName;
441
- player.locale = packet.languageCode;
442
- player.randomId = packet.clientRandomId;
443
- player.uuid = packet.identity;
444
- player.xuid = packet.XUID;
445
- player.skin = packet.skin;
446
- player.device = packet.device;
447
- try {
448
- const oldPlayer = server.getSessionManager().getPlayerByExactName(packet.displayName);
449
- await oldPlayer.kick("Logged in from another location");
450
- } catch {
451
- }
452
- if (!player.xuid && server.getConfig().getOnlineMode()) {
453
- await player.kick("Server is in online-mode!");
454
- return;
455
- }
456
- await player.onEnable();
457
- const reason = server.getBanManager().isBanned(player);
458
- if (reason !== false) {
459
- await player.kick(`You have been banned${reason ? ` for reason: ${reason}` : ""}!`);
460
- return;
461
- }
462
- const session = connection.initPlayerConnection(server, player);
463
- await session.sendPlayStatus(PlayStatusType.LoginSuccess);
464
- await world.addEntity(player);
465
- const resourcePacksInfo = new ResourcePacksInfoPacket();
466
- resourcePacksInfo.resourcePackRequired = false;
467
- resourcePacksInfo.forceServerPacksEnabled = false;
468
- resourcePacksInfo.hasScripts = false;
469
- resourcePacksInfo.hasAddonPacks = false;
470
- await connection.sendDataPacket(resourcePacksInfo, true);
471
- }
472
- }
473
-
474
- const Handlers = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
475
- __proto__: null,
476
- AnimateHandler,
477
- ClientCacheStatusHandler,
478
- CommandRequestHandler,
479
- ContainerCloseHandler,
480
- EmoteListHandler,
481
- InteractHandler,
482
- InventoryTransactionHandler,
483
- LevelSoundEventHandler,
484
- LoginHandler,
485
- MobEquipmentHandler,
486
- ModalFormResponseHandler,
487
- MovePlayerHandler,
488
- PacketViolationWarningHandler,
489
- PlayerActionHandler,
490
- RequestChunkRadiusHandler,
491
- RequestNetworkSettingsHandler,
492
- ResourcePackResponseHandler,
493
- ServerSettingsRequestHandler,
494
- SetDefaultGameTypeHandler,
495
- SetLocalPlayerAsInitializedHandler,
496
- SetPlayerGameTypeHandler,
497
- TextHandler,
498
- TickSyncHandler
499
- }, Symbol.toStringTag, { value: 'Module' }));
500
-
501
- class PlayerSession {
502
- connection;
503
- server;
504
- player;
505
- chunkSendQueue = [];
506
- loadedChunks = /* @__PURE__ */ new Set();
507
- loadingChunks = /* @__PURE__ */ new Set();
508
- constructor(server, connection, player) {
509
- this.server = server;
510
- this.connection = connection;
511
- this.player = player;
512
- }
513
- async update(_tick) {
514
- if (this.chunkSendQueue.length > 0) {
515
- const chunksToSend = this.chunkSendQueue.splice(0, Math.min(this.chunkSendQueue.length, 50));
516
- const batch = new BatchPacket();
517
- for (const chunk of chunksToSend) {
518
- const pk = new LevelChunkPacket();
519
- pk.chunkX = chunk.getX();
520
- pk.chunkZ = chunk.getZ();
521
- pk.clientSubChunkRequestsEnabled = false;
522
- pk.subChunkCount = chunk.getTopEmpty() + 4;
523
- pk.data = chunk.networkSerialize();
524
- batch.addPacket(pk);
525
- const hash = Chunk.packXZ(chunk.getX(), chunk.getZ());
526
- this.loadedChunks.add(hash);
527
- this.loadingChunks.delete(hash);
528
- }
529
- this.connection.sendBatch(batch, false);
530
- }
531
- this.player.viewDistance && await this.needNewChunks();
532
- }
533
- /**
534
- * Notify a client about change(s) to the adventure settings.
535
- *
536
- * @param player - The client-controlled entity
537
- */
538
- async sendSettings(player) {
539
- const target = player ?? this.player;
540
- const pk = new UpdateAdventureSettingsPacket();
541
- pk.worldImmutable = target.gamemode === Gamemode.Spectator;
542
- pk.noAttackingPlayers = target.gamemode === Gamemode.Spectator;
543
- pk.noAttackingMobs = target.gamemode === Gamemode.Spectator;
544
- pk.autoJump = true;
545
- pk.showNameTags = true;
546
- await this.connection.sendDataPacket(pk);
547
- }
548
- async sendAbilities(player) {
549
- const target = player ?? this.player;
550
- const pk = new UpdateAbilitiesPacket();
551
- pk.commandPermission = target.isOp() ? PermissionType.Operator : PermissionType.Normal;
552
- pk.playerPermission = target.isOp() ? PlayerPermissionType.Operator : PlayerPermissionType.Member;
553
- pk.targetActorUniqueId = target.getRuntimeId();
554
- const mainLayer = new AbilityLayer();
555
- mainLayer.layerType = AbilityLayerType.BASE;
556
- mainLayer.layerFlags = /* @__PURE__ */ new Map([
557
- [AbilityLayerFlag.FLY_SPEED, true],
558
- [AbilityLayerFlag.WALK_SPEED, true],
559
- [AbilityLayerFlag.MAY_FLY, target.getAllowFlight()],
560
- [AbilityLayerFlag.FLYING, target.isFlying()],
561
- [AbilityLayerFlag.NO_CLIP, target.gamemode === Gamemode.Spectator],
562
- [AbilityLayerFlag.OPERATOR_COMMANDS, target.isOp()],
563
- [AbilityLayerFlag.TELEPORT, target.isOp()],
564
- [AbilityLayerFlag.INVULNERABLE, target.gamemode === Gamemode.Creative],
565
- [AbilityLayerFlag.MUTED, false],
566
- [AbilityLayerFlag.WORLD_BUILDER, false],
567
- [AbilityLayerFlag.INSTABUILD, target.gamemode === Gamemode.Creative],
568
- [AbilityLayerFlag.LIGHTNING, false],
569
- [AbilityLayerFlag.BUILD, target.gamemode !== Gamemode.Spectator],
570
- [AbilityLayerFlag.MINE, target.gamemode !== Gamemode.Spectator],
571
- [AbilityLayerFlag.DOORS_AND_SWITCHES, target.gamemode !== Gamemode.Spectator],
572
- [AbilityLayerFlag.OPEN_CONTAINERS, target.gamemode !== Gamemode.Spectator],
573
- [AbilityLayerFlag.ATTACK_PLAYERS, target.gamemode !== Gamemode.Spectator],
574
- [AbilityLayerFlag.ATTACK_MOBS, target.gamemode !== Gamemode.Spectator]
575
- ]);
576
- mainLayer.flySpeed = 0.05;
577
- mainLayer.walkSpeed = 0.1;
578
- pk.abilityLayers = [mainLayer];
579
- await this.connection.sendDataPacket(pk);
580
- }
581
- async needNewChunks(forceResend = false, dist) {
582
- const currentXChunk = CoordinateUtils.fromBlockToChunk(this.player.getX());
583
- const currentZChunk = CoordinateUtils.fromBlockToChunk(this.player.getZ());
584
- const viewDistance = this.player.viewDistance ?? dist;
585
- const chunksToSendHeap = new Heap((a, b) => {
586
- const distXFirst = Math.abs(a[0] - currentXChunk);
587
- const distXSecond = Math.abs(b[0] - currentXChunk);
588
- const distZFirst = Math.abs(a[1] - currentZChunk);
589
- const distZSecond = Math.abs(b[1] - currentZChunk);
590
- return distXFirst + distZFirst > distXSecond + distZSecond ? 1 : -1;
591
- });
592
- for (let sendXChunk = -viewDistance; sendXChunk <= viewDistance; sendXChunk++) {
593
- for (let sendZChunk = -viewDistance; sendZChunk <= viewDistance; sendZChunk++) {
594
- if (sendXChunk * sendXChunk + sendZChunk * sendZChunk > viewDistance * viewDistance)
595
- continue;
596
- const newChunk = [currentXChunk + sendXChunk, currentZChunk + sendZChunk];
597
- const hash = Chunk.packXZ(newChunk[0], newChunk[1]);
598
- if (forceResend) {
599
- chunksToSendHeap.push(newChunk);
600
- } else if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
601
- chunksToSendHeap.push(newChunk);
602
- }
603
- }
604
- }
605
- while (chunksToSendHeap.size() > 0) {
606
- const closestChunk = chunksToSendHeap.pop();
607
- const hash = Chunk.packXZ(closestChunk[0], closestChunk[1]);
608
- if (forceResend) {
609
- if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
610
- this.loadingChunks.add(hash);
611
- await this.requestChunk(closestChunk[0], closestChunk[1]);
612
- } else {
613
- const loadedChunk = await this.player.getWorld().getChunk(closestChunk[0], closestChunk[1]);
614
- await this.sendChunk(loadedChunk);
615
- }
616
- } else {
617
- this.loadingChunks.add(hash);
618
- await this.requestChunk(closestChunk[0], closestChunk[1]);
619
- }
620
- }
621
- let unloaded = false;
622
- for (const hash of this.loadedChunks) {
623
- const [x, z] = Chunk.unpackXZ(hash);
624
- if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
625
- unloaded = true;
626
- this.loadedChunks.delete(hash);
627
- }
628
- }
629
- for (const hash of this.loadingChunks) {
630
- const [x, z] = Chunk.unpackXZ(hash);
631
- if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
632
- this.loadingChunks.delete(hash);
633
- }
634
- }
635
- if (!unloaded && this.chunkSendQueue.length !== 0) {
636
- await this.sendNetworkChunkPublisher(dist ?? viewDistance, []);
637
- }
638
- }
639
- async requestChunk(x, z) {
640
- const chunk = await this.player.getWorld().getChunk(x, z);
641
- this.chunkSendQueue.push(chunk);
642
- }
643
- /**
644
- * Clear the currently loaded and loading chunks.
645
- *
646
- * @remarks
647
- * Usually used for changing dimension, world, etc.
648
- */
649
- async clearChunks() {
650
- this.loadedChunks.clear();
651
- this.loadingChunks.clear();
652
- }
653
- async sendInventory() {
654
- const pk = new InventoryContentPacket();
655
- pk.items = this.player.getInventory().getItems(true);
656
- pk.windowId = WindowIds.INVENTORY;
657
- await this.connection.sendDataPacket(pk);
658
- await this.sendHandItem(this.player.getInventory().getItemInHand());
659
- }
660
- async sendCreativeContents(empty = false) {
661
- const pk = new CreativeContentPacket();
662
- if (empty) {
663
- await this.connection.sendDataPacket(pk);
664
- return;
665
- }
666
- const entries = [
667
- ...this.player.getServer().getBlockManager().getBlocks(),
668
- ...this.player.getServer().getItemManager().getItems()
669
- ];
670
- creativeitems.forEach((item) => {
671
- pk.items.push(
672
- ...entries.filter((entry) => {
673
- return entry.meta === (item.damage ?? 0) && entry.getId() === item.id;
674
- }).map(
675
- (entry) => new Item({
676
- id: entry.getId(),
677
- name: entry.getName(),
678
- meta: entry.meta
679
- })
680
- )
681
- );
682
- });
683
- await this.connection.sendDataPacket(pk);
684
- }
685
- /**
686
- * Sets the item in the player hand.
687
- *
688
- * @param item - The entity.
689
- */
690
- async sendHandItem(item) {
691
- const pk = new MobEquipmentPacket();
692
- pk.runtimeEntityId = this.player.getRuntimeId();
693
- pk.item = item;
694
- pk.inventorySlot = this.player.getInventory().getHandSlotIndex();
695
- pk.hotbarSlot = this.player.getInventory().getHandSlotIndex();
696
- pk.windowId = 0;
697
- await this.connection.sendDataPacket(pk);
698
- }
699
- async sendForm(form) {
700
- const id = this.player.getFormManager().addForm(form);
701
- const pk = new ModalFormRequestPacket();
702
- pk.formId = id;
703
- pk.formData = form.jsonSerialize();
704
- await this.connection.sendDataPacket(pk);
705
- }
706
- /**
707
- * Set the client's current tick.
708
- *
709
- * @param tick - The tick
710
- */
711
- async sendTime(tick) {
712
- const pk = new SetTimePacket();
713
- pk.time = tick;
714
- await this.connection.sendDataPacket(pk);
715
- }
716
- /**
717
- * Set the client's gamemode.
718
- *
719
- * @param gamemode - the numeric gamemode ID
720
- */
721
- async sendGamemode(gamemode) {
722
- const pk = new SetPlayerGameTypePacket();
723
- pk.gamemode = gamemode;
724
- await this.connection.sendDataPacket(pk);
725
- }
726
- async sendNetworkChunkPublisher(distance, savedChunks) {
727
- const pk = new NetworkChunkPublisherUpdatePacket();
728
- pk.position = BlockPosition.fromVector3(this.player);
729
- pk.radius = distance << 4;
730
- pk.savedChunks = savedChunks;
731
- await this.connection.sendDataPacket(pk);
732
- }
733
- async sendAvailableCommands() {
734
- const pk = new AvailableCommandsPacket();
735
- this.server.getCommandManager().getCommandsList().forEach((command) => {
736
- const commandClass = Array.from(this.server.getCommandManager().getCommands().values()).find(
737
- (cmd2) => cmd2.id.split(":")[1] === command[0]
738
- );
739
- if (!commandClass) {
740
- this.player.getServer().getLogger()?.warn(`Can't find corresponding command class for "${command[0]}"`);
741
- return;
742
- }
743
- if (!this.player.getServer().getPermissionManager().can(this.player).execute(commandClass.permission))
744
- return;
745
- const cmd = new CommandData();
746
- cmd.commandName = command[0];
747
- cmd.commandDescription = commandClass.description;
748
- if (commandClass.aliases.length > 0) {
749
- const cmdAliases = new CommandEnum();
750
- cmdAliases.enumName = `${command[0]}Aliases`;
751
- cmdAliases.enumValues = commandClass.aliases.concat(command[0]);
752
- cmd.aliases = cmdAliases;
753
- }
754
- command[2].forEach((arg, index) => {
755
- const parameters = arg.map((parameter) => {
756
- const parameters2 = parameter.getParameters();
757
- if (parameters2)
758
- return Array.from(parameters2.values());
759
- if (parameter instanceof CommandArgumentEntity)
760
- return [
761
- new CommandParameter({
762
- paramName: "target",
763
- paramType: CommandParameterType.Target
764
- })
765
- ];
766
- if (parameter instanceof CommandArgumentGamemode)
767
- return [
768
- new CommandParameter({
769
- paramName: "gamemode",
770
- paramType: CommandParameterType.String
771
- })
772
- ];
773
- if (parameter.constructor.name === "StringArgumentType")
774
- return [
775
- new CommandParameter({
776
- paramName: "value",
777
- paramType: CommandParameterType.String
778
- })
779
- ];
780
- if (parameter.constructor.name === "IntegerArgumentType")
781
- return [
782
- new CommandParameter({
783
- paramName: "number",
784
- paramType: CommandParameterType.Int
785
- })
786
- ];
787
- this.server.getLogger()?.warn(`Invalid parameter ${parameter.constructor.name}`);
788
- return [
789
- new CommandParameter({
790
- paramName: "value",
791
- paramType: CommandParameterType.String
792
- })
793
- ];
794
- }).filter((a) => a).flat();
795
- cmd.overloads[index] = parameters;
796
- });
797
- pk.commandData.push(cmd);
798
- });
799
- const playerEnum = new CommandEnum();
800
- playerEnum.enumName = "Player";
801
- playerEnum.enumValues = this.player.getServer().getSessionManager().getAllPlayers().map((player) => player.getName());
802
- pk.softEnums = [playerEnum];
803
- }
804
- /**
805
- * Set the client's maximum view distance.
806
- *
807
- * @param distance - The view distance
808
- */
809
- async setViewDistance(distance) {
810
- this.player.viewDistance = distance;
811
- const pk = new ChunkRadiusUpdatedPacket();
812
- pk.radius = distance;
813
- await this.connection.sendDataPacket(pk);
814
- }
815
- async sendAttributes(attributes) {
816
- const pk = new UpdateAttributesPacket();
817
- pk.runtimeEntityId = this.player.getRuntimeId();
818
- pk.attributes = attributes ?? this.player.getAttributeManager().getAttributes();
819
- pk.tick = BigInt(0);
820
- await this.connection.sendDataPacket(pk);
821
- }
822
- async sendMetadata() {
823
- const pk = new SetActorDataPacket();
824
- pk.runtimeEntityId = this.player.getRuntimeId();
825
- pk.metadata = this.player.getMetadataManager();
826
- pk.tick = BigInt(0);
827
- await this.connection.sendDataPacket(pk);
828
- }
829
- /**
830
- * Send a chat message to the client.
831
- *
832
- * @remarks
833
- * Refactor this completely.
834
- *
835
- * @param message - The message
836
- * @param xuid - The source xuid
837
- * @param parameters -
838
- * @param needsTranslation - If the TextType requires translation
839
- * @param type - The text type
840
- */
841
- async sendMessage(message, xuid = "", parameters = [], needsTranslation = false, type = TextType.Raw) {
842
- if (!message)
843
- throw new Error("A message is required");
844
- const pk = new TextPacket();
845
- pk.type = type;
846
- pk.sourceName = "";
847
- pk.message = message;
848
- pk.needsTranslation = needsTranslation;
849
- pk.xuid = xuid;
850
- pk.platformChatId = "";
851
- pk.parameters = parameters;
852
- await this.connection.sendDataPacket(pk);
853
- }
854
- async sendToast(title, body) {
855
- if (!title)
856
- throw new Error("A toast title is required");
857
- if (!body)
858
- throw new Error("A toast body is required.");
859
- const pk = new ToastRequestPacket();
860
- pk.title = title;
861
- pk.body = body;
862
- await this.connection.sendDataPacket(pk);
863
- }
864
- async sendChunk(chunk) {
865
- const pk = new LevelChunkPacket();
866
- pk.chunkX = chunk.getX();
867
- pk.chunkZ = chunk.getZ();
868
- pk.clientSubChunkRequestsEnabled = false;
869
- pk.subChunkCount = chunk.getTopEmpty() + 4;
870
- pk.data = chunk.networkSerialize();
871
- await this.connection.sendDataPacket(pk, void 0, false);
872
- const hash = Chunk.packXZ(chunk.getX(), chunk.getZ());
873
- this.loadedChunks.add(hash);
874
- this.loadingChunks.delete(hash);
875
- }
876
- /**
877
- * Broadcast the movement to a defined player
878
- */
879
- async broadcastMove(player, mode = MovementType.Normal) {
880
- const pk = new MovePlayerPacket();
881
- pk.runtimeEntityId = player.getRuntimeId();
882
- pk.positionX = player.getX();
883
- pk.positionY = player.getY();
884
- pk.positionZ = player.getZ();
885
- pk.pitch = player.pitch;
886
- pk.yaw = player.yaw;
887
- pk.headYaw = player.headYaw;
888
- pk.mode = mode;
889
- pk.onGround = player.isOnGround();
890
- if (mode === MovementType.Teleport) {
891
- pk.teleportCause = 0;
892
- pk.teleportItemId = 0;
893
- }
894
- pk.ridingEntityRuntimeId = BigInt(0);
895
- pk.tick = BigInt(0);
896
- await this.connection.sendDataPacket(pk);
897
- }
898
- /**
899
- * Adds the client to the player list of every player inside
900
- * the server and also to the player itself.
901
- */
902
- async addToPlayerList() {
903
- const playerList = new PlayerListPacket();
904
- playerList.type = PlayerListAction.TYPE_ADD;
905
- const entry = new PlayerListEntry({
906
- uuid: UUID.fromString(this.player.uuid),
907
- uniqueEntityid: this.player.getRuntimeId(),
908
- name: this.player.getName(),
909
- xuid: this.player.xuid,
910
- platformChatId: "",
911
- // TODO: read this value from Login
912
- buildPlatform: this.player.device ? this.player.device.os : -1,
913
- skin: this.player.skin,
914
- isTeacher: false,
915
- // TODO: figure out where to read teacher and host
916
- isHost: false
917
- });
918
- playerList.entries.push(entry);
919
- await this.server.broadcastPacket(playerList);
920
- this.server.getSessionManager().getPlayerList().set(this.player.uuid, entry);
921
- }
922
- /**
923
- * Removes a player from other players list
924
- */
925
- async removeFromPlayerList() {
926
- if (!this.player.uuid)
927
- return;
928
- const pk = new PlayerListPacket();
929
- pk.type = PlayerListAction.TYPE_REMOVE;
930
- const entry = new PlayerListEntry({
931
- uuid: UUID.fromString(this.player.getUUID())
932
- });
933
- pk.entries.push(entry);
934
- this.server.getSessionManager().getPlayerList().delete(this.player.uuid);
935
- await Promise.all(
936
- this.server.getSessionManager().getAllPlayers().map(async (player) => player.getNetworkSession().getConnection().sendDataPacket(pk))
937
- );
938
- }
939
- /**
940
- * Sends the full player list to the player.
941
- */
942
- async sendPlayerList() {
943
- const playerList = new PlayerListPacket();
944
- playerList.type = PlayerListAction.TYPE_ADD;
945
- playerList.entries = Array.from(this.server.getSessionManager().getPlayerList().values());
946
- await this.connection.sendDataPacket(playerList);
947
- }
948
- /**
949
- * Spawn the player for another player
950
- *
951
- * @param player - the player to send the AddPlayerPacket to
952
- */
953
- async sendSpawn(player) {
954
- if (!player.getUUID()) {
955
- this.server.getLogger()?.error(`UUID for player ${player.getName()} is undefined`);
956
- return;
957
- }
958
- const pk = new AddPlayerPacket();
959
- pk.uuid = UUID.fromString(this.player.getUUID());
960
- pk.runtimeEntityId = this.player.getRuntimeId();
961
- pk.name = this.player.getName();
962
- pk.positionX = this.player.getX();
963
- pk.positionY = this.player.getY();
964
- pk.positionZ = this.player.getZ();
965
- pk.motionX = 0;
966
- pk.motionY = 0;
967
- pk.motionZ = 0;
968
- pk.pitch = this.player.pitch;
969
- pk.yaw = this.player.yaw;
970
- pk.headYaw = this.player.headYaw;
971
- pk.item = this.player.getInventory().getItemInHand();
972
- pk.deviceId = this.player.device?.id ?? "";
973
- pk.metadata = this.player.getMetadataManager();
974
- await player.getNetworkSession().getConnection().sendDataPacket(pk);
975
- }
976
- /**
977
- * Despawn the player entity from another player
978
- */
979
- async sendDespawn(player) {
980
- const pk = new RemoveActorPacket();
981
- pk.uniqueEntityId = this.player.getRuntimeId();
982
- await player.getNetworkSession().getConnection().sendDataPacket(pk);
983
- }
984
- async sendPlayStatus(status) {
985
- const pk = new PlayStatusPacket();
986
- pk.status = status;
987
- await this.connection.sendDataPacket(pk, true);
988
- }
989
- async kick(reason = "unknown reason") {
990
- const pk = new DisconnectPacket();
991
- pk.skipMessage = false;
992
- pk.message = reason;
993
- await this.connection.sendDataPacket(pk, true);
994
- }
995
- getConnection() {
996
- return this.connection;
997
- }
998
- getPlayer() {
999
- return this.player;
1000
- }
1001
- }
1002
-
1003
- const VANILLA_DEFAULT_SPAWN_RADIUS = 4;
1004
- class Player extends Human {
1005
- address;
1006
- networkSession;
1007
- permissions;
1008
- // Only used for metrics
1009
- joinTimer = new Timer();
1010
- // TODO: finish implementation
1011
- windows;
1012
- connected = false;
1013
- username = {
1014
- prefix: "<",
1015
- suffix: ">",
1016
- name: ""
1017
- };
1018
- locale = "";
1019
- randomId = 0;
1020
- uuid = "";
1021
- xuid = "";
1022
- skin = null;
1023
- viewDistance = 0;
1024
- gamemode = 0;
1025
- pitch = 0;
1026
- yaw = 0;
1027
- headYaw = 0;
1028
- onGround = false;
1029
- sprinting = false;
1030
- flying = false;
1031
- sneaking = false;
1032
- allowFight = false;
1033
- platformChatId = "";
1034
- device = null;
1035
- cacheSupport = false;
1036
- chunkSendQueue = /* @__PURE__ */ new Set();
1037
- currentChunk = null;
1038
- forms;
1039
- chatHandler;
1040
- /**
1041
- * Player's constructor.
1042
- */
1043
- constructor(connection, world, server) {
1044
- super(world, server);
1045
- this.address = connection.getRakNetSession().getAddress();
1046
- this.networkSession = new PlayerSession(server, connection, this);
1047
- this.windows = new WindowManager();
1048
- this.forms = new FormManager();
1049
- this.permissions = [];
1050
- this.joinTimer.reset();
1051
- this.chatHandler = async (evt) => {
1052
- if (evt.isCancelled())
1053
- return;
1054
- if (evt.getChat().getChannel() === "*.everyone" || evt.getChat().getChannel() === "*.ops" && this.isOp() || evt.getChat().getChannel() === `*.player.${this.getName()}`)
1055
- await this.sendMessage(
1056
- evt.getChat().getMessage(),
1057
- evt.getChat().getType(),
1058
- evt.getChat().getParameters(),
1059
- evt.getChat().isNeedsTranslation()
1060
- );
1061
- };
1062
- server.getEventManager().on("chat", this.chatHandler);
1063
- }
1064
- async onEnable() {
1065
- this.permissions = await this.getServer().getPermissionManager().getPermissions(this);
1066
- const playerData = await this.getWorld().getPlayerData(this);
1067
- await this.setX(playerData.position.x);
1068
- await this.setY(playerData.position.y);
1069
- await this.setZ(playerData.position.z);
1070
- this.pitch = playerData.position.pitch ?? 0;
1071
- this.yaw = playerData.position.yaw ?? 0;
1072
- playerData.inventory.forEach((item) => {
1073
- const entry = this.getServer().getItemManager().getItem(item.id) || this.getServer().getBlockManager().getBlock(item.id);
1074
- if (!entry) {
1075
- this.getServer().getLogger()?.warn(`Item/block with id ${item.id} is invalid`, "Player/onEnable");
1076
- return;
1077
- }
1078
- this.getInventory().setItem(
1079
- item.position,
1080
- new ContainerEntry({
1081
- item: entry,
1082
- count: item.count
1083
- })
1084
- );
1085
- });
1086
- if (!this.connected)
1087
- this.getServer().getLogger()?.debug(`(Complete player creation took ${this.joinTimer.stop()} ms)`, "Player/onEnable");
1088
- this.connected = true;
1089
- }
1090
- async onDisable() {
1091
- if (this.connected && this.xuid)
1092
- await this.getWorld().savePlayerData(this);
1093
- this.server.getEventManager().removeListener("chat", this.chatHandler);
1094
- this.connected = false;
1095
- }
1096
- /**
1097
- * Used to match vanilla behavior, will send chunks
1098
- * with an initial view radius of VANILLA_DEFAULT_SPAWN_RADIUS.
1099
- */
1100
- async sendInitialSpawnChunks() {
1101
- const minX = CoordinateUtils.fromBlockToChunk(this.x) - VANILLA_DEFAULT_SPAWN_RADIUS;
1102
- const minZ = CoordinateUtils.fromBlockToChunk(this.z) - VANILLA_DEFAULT_SPAWN_RADIUS;
1103
- const maxX = CoordinateUtils.fromBlockToChunk(this.x) + VANILLA_DEFAULT_SPAWN_RADIUS;
1104
- const maxZ = CoordinateUtils.fromBlockToChunk(this.z) + VANILLA_DEFAULT_SPAWN_RADIUS;
1105
- const savedChunks = [];
1106
- const sendQueue = [];
1107
- for (let chunkX = minX; chunkX <= maxX; ++chunkX) {
1108
- for (let chunkZ = minZ; chunkZ <= maxZ; ++chunkZ) {
1109
- savedChunks.push({ x: chunkX, z: chunkZ });
1110
- sendQueue.push(this.getWorld().getChunk(chunkX, chunkZ));
1111
- }
1112
- }
1113
- await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, savedChunks);
1114
- const getUniqueChunks = (sendList) => {
1115
- const xSet = /* @__PURE__ */ new Set();
1116
- const zSet = /* @__PURE__ */ new Set();
1117
- for (const coord of sendList) {
1118
- xSet.add(coord.x);
1119
- zSet.add(coord.z);
1120
- }
1121
- return Math.floor((xSet.size + zSet.size) / 2);
1122
- };
1123
- for (let i = 0; i < getUniqueChunks(savedChunks); ++i) {
1124
- await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, []);
1125
- }
1126
- for await (const chunk of sendQueue) {
1127
- await this.networkSession.sendChunk(chunk);
1128
- }
1129
- }
1130
- /**
1131
- * Change the player's current world.
1132
- *
1133
- * @param world - the new world
1134
- */
1135
- async setWorld(world) {
1136
- const dim0 = new ChangeDimensionPacket();
1137
- dim0.dimension = 0;
1138
- dim0.position = this;
1139
- dim0.respawn = false;
1140
- const dim1 = new ChangeDimensionPacket();
1141
- dim1.dimension = 1;
1142
- dim1.position = new Vector3(0, 0, 0);
1143
- dim1.respawn = false;
1144
- await this.networkSession.getConnection().sendDataPacket(dim0);
1145
- await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1146
- await this.networkSession.getConnection().sendDataPacket(dim1);
1147
- await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1148
- await this.getWorld().removeEntity(this);
1149
- await world.addEntity(this);
1150
- await super.setWorld.bind(this)(world);
1151
- await this.setPosition(new Vector3(0, 0, 0));
1152
- for (let x = -3; x < 3; x++) {
1153
- for (let z = -3; z < 3; z++) {
1154
- const pk = new LevelChunkPacket();
1155
- pk.clientSubChunkRequestsEnabled = false;
1156
- pk.chunkX = x;
1157
- pk.chunkZ = z;
1158
- pk.data = Buffer.from("");
1159
- pk.subChunkCount = 0;
1160
- await this.networkSession.getConnection().sendDataPacket(pk);
1161
- }
1162
- }
1163
- await this.networkSession.getConnection().sendDataPacket(dim1);
1164
- await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1165
- await this.networkSession.getConnection().sendDataPacket(dim0);
1166
- await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1167
- this.currentChunk = null;
1168
- await this.networkSession.clearChunks();
1169
- await this.networkSession.needNewChunks();
1170
- await this.onEnable();
1171
- await this.networkSession.sendPlayStatus(PlayStatusType.PlayerSpawn);
1172
- }
1173
- isOnline() {
1174
- return this.connected;
1175
- }
1176
- async update(tick) {
1177
- await super.update.bind(this)(tick);
1178
- await this.networkSession.update(tick);
1179
- if (tick % (20 * 5 * 60 * 1) === 0) {
1180
- await this.networkSession.sendTime(tick);
1181
- }
1182
- for (const chunk of this.chunkSendQueue) {
1183
- await this.networkSession.sendNetworkChunkPublisher(this.viewDistance ?? VANILLA_DEFAULT_SPAWN_RADIUS, []);
1184
- await this.networkSession.sendChunk(chunk);
1185
- this.chunkSendQueue.delete(chunk);
1186
- }
1187
- }
1188
- async kick(reason = "unknown reason") {
1189
- this.getServer().getLogger()?.verbose(`Player with id §b${this.getRuntimeId()}§r was kicked: ${reason}`, "Player/kick");
1190
- await this.networkSession.kick(reason);
1191
- }
1192
- async sendSettings() {
1193
- }
1194
- // Return all the players in the same chunk,.
1195
- // TODO: move to world
1196
- getPlayersInChunk() {
1197
- return this.getServer().getSessionManager().getAllPlayers().filter((player) => player.getCurrentChunk() === this.getCurrentChunk());
1198
- }
1199
- // TODO: these
1200
- async sendSpawn() {
1201
- }
1202
- async sendDespawn() {
1203
- }
1204
- /**
1205
- * Send a chat message to the client.
1206
- * @param message - the message
1207
- */
1208
- async sendMessage(message, type = TextType.Raw, parameters = [], needsTranslation = false) {
1209
- await this.networkSession.sendMessage(message, "", parameters, needsTranslation, type);
1210
- }
1211
- /**
1212
- * Send a toast notification (like Xbox Live notifications)
1213
- * @param title - the toast title
1214
- * @param body - the toast body
1215
- */
1216
- async sendToast(title, body) {
1217
- await this.networkSession.sendToast(title, body);
1218
- }
1219
- async setGamemode(mode) {
1220
- const event = new PlayerSetGamemodeEvent(this, mode);
1221
- this.getServer().getEventManager().post(["playerSetGamemode", event]);
1222
- if (event.isCancelled())
1223
- return;
1224
- this.gamemode = event.getGamemode();
1225
- await this.networkSession.sendGamemode(this.gamemode);
1226
- if (this.gamemode === Gamemode.Creative || this.gamemode === Gamemode.Spectator)
1227
- this.allowFight = true;
1228
- else {
1229
- this.allowFight = false;
1230
- await this.setFlying(false);
1231
- }
1232
- await this.sendSettings();
1233
- }
1234
- getGamemode() {
1235
- return Gamemode.getGamemodeName(this.gamemode).toLowerCase();
1236
- }
1237
- getNetworkSession() {
1238
- return this.networkSession;
1239
- }
1240
- getAddress() {
1241
- return this.address;
1242
- }
1243
- getName() {
1244
- return this.username.name;
1245
- }
1246
- getFormattedUsername() {
1247
- return `${this.username.prefix}${this.username.name}${this.username.suffix}`;
1248
- }
1249
- getPermissions() {
1250
- return this.permissions;
1251
- }
1252
- getUUID() {
1253
- if (!this.uuid)
1254
- throw new Error("uuid is missing!");
1255
- return this.uuid;
1256
- }
1257
- getXUID() {
1258
- if (!this.xuid)
1259
- throw new Error("xuid is missing!");
1260
- return this.xuid;
1261
- }
1262
- getFormManager() {
1263
- return this.forms;
1264
- }
1265
- getWindows() {
1266
- return this.windows;
1267
- }
1268
- getAllowFlight() {
1269
- return this.allowFight;
1270
- }
1271
- isPlayer() {
1272
- return true;
1273
- }
1274
- /**
1275
- * Check if the `Player` is an operator.
1276
- *
1277
- * @returns `true` if this player is an operator otherwise `false`.
1278
- */
1279
- isOp() {
1280
- return this.getServer().getPermissionManager().isOp(this.getName());
1281
- }
1282
- /**
1283
- * Check if the `Player` is sprinting.
1284
- *
1285
- * @returns `true` if this player is sprinting otherwise `false`.
1286
- */
1287
- isSprinting() {
1288
- return this.sprinting;
1289
- }
1290
- async setSprinting(sprinting) {
1291
- if (sprinting === this.isSprinting())
1292
- return;
1293
- const event = new PlayerToggleSprintEvent(this, sprinting);
1294
- this.getServer().getEventManager().post(["playerToggleSprint", event]);
1295
- if (event.isCancelled())
1296
- return;
1297
- this.sprinting = event.getIsSprinting();
1298
- this.setDataFlag(MetadataFlag.INDEX, MetadataFlag.SPRINTING, this.isSprinting(), FlagType.BYTE);
1299
- await this.networkSession.sendMetadata();
1300
- }
1301
- isFlying() {
1302
- return this.flying;
1303
- }
1304
- async setFlying(flying) {
1305
- if (flying === this.isFlying())
1306
- return;
1307
- if (!this.getAllowFlight()) {
1308
- this.flying = false;
1309
- return;
1310
- }
1311
- const event = new PlayerToggleFlightEvent(this, flying);
1312
- this.getServer().getEventManager().post(["playerToggleFlight", event]);
1313
- if (event.isCancelled())
1314
- return;
1315
- this.flying = event.getIsFlying();
1316
- await this.sendSettings();
1317
- }
1318
- isSneaking() {
1319
- return this.sneaking;
1320
- }
1321
- async setSneaking(val) {
1322
- this.sneaking = val;
1323
- await this.sendSettings();
1324
- }
1325
- isOnGround() {
1326
- return this.onGround;
1327
- }
1328
- async setOnGround(val) {
1329
- if (val === this.onGround)
1330
- return;
1331
- this.onGround = val;
1332
- }
1333
- /**
1334
- * Set the position.
1335
- *
1336
- * @remarks
1337
- * This will notify the player's client about the position change.
1338
- *
1339
- * @param position - The position
1340
- * @param type - The movement type
1341
- */
1342
- async setPosition(position, type = MovementType.Normal) {
1343
- await this.setX(position.getX());
1344
- await this.setY(position.getY());
1345
- await this.setZ(position.getZ());
1346
- await this.networkSession.broadcastMove(this, type);
1347
- }
1348
- setCurrentChunk(chunk) {
1349
- if (this.currentChunk === chunk)
1350
- return;
1351
- this.currentChunk = chunk;
1352
- }
1353
- getCurrentChunk() {
1354
- return this.currentChunk;
1355
- }
1356
- }
1357
-
1358
- class ClientConnection extends MinecraftSession {
1359
- playerSession = null;
1360
- hasCompression = false;
1361
- constructor(session, logger) {
1362
- super(session, logger);
1363
- }
1364
- /**
1365
- * @internal
1366
- *
1367
- * @param server - the server instance
1368
- * @param player - the player instance
1369
- * @returns the new player session
1370
- */
1371
- initPlayerConnection(server, player) {
1372
- assert(this.playerSession === null, "Player session was already created");
1373
- this.playerSession = new PlayerSession(server, this, player);
1374
- return this.playerSession;
1375
- }
1376
- disconnect(reason = "disconnect.disconnected", hideReason = true) {
1377
- const packet = new DisconnectPacket();
1378
- packet.skipMessage = hideReason;
1379
- packet.message = reason;
1380
- void this.sendDataPacket(packet);
1381
- this.rakSession.disconnect();
1382
- }
1383
- getPlayerSession() {
1384
- return this.playerSession;
1385
- }
1386
- getRakNetSession() {
1387
- return this.rakSession;
1388
- }
1389
- }
1390
-
1391
- class PacketRegistry {
1392
- server;
1393
- packets = /* @__PURE__ */ new Map();
1394
- handlers = /* @__PURE__ */ new Map();
1395
- constructor(server) {
1396
- this.server = server;
1397
- }
1398
- async onEnable() {
1399
- await this.registerPackets();
1400
- await this.registerHandlers();
1401
- }
1402
- async onDisable() {
1403
- this.handlers.clear();
1404
- this.packets.clear();
1405
- }
1406
- /**
1407
- * Register a packet.
1408
- * @param packet the packet.
1409
- */
1410
- registerPacket(packet) {
1411
- if (this.packets.has(packet.NetID))
1412
- throw new Error(
1413
- `Packet ${packet.name} is trying to use id ${packet.NetID.toString(16)} which already exists!`
1414
- );
1415
- this.packets.set(packet.NetID, packet);
1416
- this.server.getLogger()?.debug(`Packet with id §b${packet.name}§r registered`, "PacketRegistry/registerPacket");
1417
- }
1418
- /**
1419
- * Get a packet by it's network ID.
1420
- * @param id the NetID.
1421
- */
1422
- getPacket(id) {
1423
- if (!this.packets.has(id))
1424
- throw new Error(`Invalid packet with id ${id}!`);
1425
- return this.packets.get(id);
1426
- }
1427
- /**
1428
- * Remove a packet from the registry.
1429
- * @param id the NetID.
1430
- */
1431
- removePacket(id) {
1432
- this.packets.delete(id);
1433
- }
1434
- registerHandler(id, handler) {
1435
- if (this.handlers.has(id))
1436
- throw new Error(`Handler with id ${id} already exists!`);
1437
- this.handlers.set(id, handler);
1438
- this.server.getLogger()?.debug(`Handler with id §b${handler.constructor.name}§r registered`, "PacketRegistry/registerHandler");
1439
- }
1440
- getHandler(id) {
1441
- if (!this.handlers.has(id))
1442
- throw new Error(`Invalid handler with id ${id.toString(16)}!`);
1443
- return this.handlers.get(id);
1444
- }
1445
- /**
1446
- * Merge two handlers.
1447
- * This is useful if you want to extend a handler without actually replacing it.
1448
- *
1449
- * @param handler the first handler, executed first.
1450
- * @param handler2 the second handler.
1451
- */
1452
- appendHandler(handler, handler2) {
1453
- const res = new class Handler {
1454
- async handle(packet, server, session) {
1455
- await handler.handle(packet, server, session);
1456
- await handler2.handle(packet, server, session);
1457
- }
1458
- }();
1459
- return res;
1460
- }
1461
- /**
1462
- * Remove a handler from the registry.
1463
- * @param id the handler id.
1464
- */
1465
- removeHandler(id) {
1466
- this.handlers.delete(id);
1467
- }
1468
- /**
1469
- * Dynamically register all packets exported by './Protocol'.
1470
- */
1471
- async registerPackets() {
1472
- const timer = new Timer();
1473
- Object.entries(Packets).filter(([, value]) => value.name !== "DataPacket" && value.name !== "BatchPacket").map(([, value]) => this.registerPacket(value));
1474
- this.server.getLogger()?.verbose(
1475
- `Registered §b${this.packets.size}§r of §b${Array.from(Object.keys(Identifiers)).length - 2}§r packet(s) (took ${timer.stop()} ms)!`,
1476
- "PacketRegistry/registerPackets"
1477
- );
1478
- }
1479
- /**
1480
- * Dynamically register all handlers exported by './Handlers'.
1481
- */
1482
- async registerHandlers() {
1483
- const timer = new Timer();
1484
- Object.entries(Handlers).map(([, value]) => this.registerHandler(value.NetID, new value()));
1485
- this.server.getLogger()?.verbose(
1486
- `Registered §b${this.handlers.size}§r packet handler(s) (took ${timer.stop()} ms)!`,
1487
- "PacketRegistry/registerHandlers"
1488
- );
1489
- }
1490
- /**
1491
- * Get all packets from the registry.
1492
- */
1493
- getPackets() {
1494
- return this.packets;
1495
- }
1496
- /**
1497
- * Get all handlers from the registry.
1498
- */
1499
- getHandlers() {
1500
- return this.handlers;
1501
- }
1502
- }
1503
-
1504
- class Server {
1505
- version;
1506
- raknet;
1507
- logger;
1508
- config;
1509
- tps = 20;
1510
- console;
1511
- eventManager = new EventManager();
1512
- packetRegistry;
1513
- sessionManager = new SessionManager();
1514
- pluginManager;
1515
- commandManager;
1516
- worldManager;
1517
- itemManager;
1518
- blockManager;
1519
- queryManager;
1520
- chatManager;
1521
- permissionManager;
1522
- banManager;
1523
- stopping = false;
1524
- tickerTimer;
1525
- static MINECRAFT_TICK_TIME_MS = 1e3 / 20;
1526
- /**
1527
- * @deprecated
1528
- */
1529
- static instance;
1530
- constructor({ logger, config, version }) {
1531
- const advertisedVersion = Identifiers.MinecraftVersions.length <= 1 ? `§ev${Identifiers.MinecraftVersions.at(0)}§r` : `§ev${Identifiers.MinecraftVersions.at(0)}§r-§ev${Identifiers.MinecraftVersions.at(-1)}§r`;
1532
- logger?.info(
1533
- `Starting JSPrismarine server version §ev${version}§r for Minecraft: Bedrock Edition ${advertisedVersion} (protocol version §e${Identifiers.Protocol}§r)`,
1534
- "Server"
1535
- );
1536
- this.version = version;
1537
- this.logger = logger;
1538
- this.config = config;
1539
- this.console = new Console(this);
1540
- this.packetRegistry = new PacketRegistry(this);
1541
- this.itemManager = new ItemManager(this);
1542
- this.blockManager = new BlockManager(this);
1543
- this.worldManager = new WorldManager(this);
1544
- this.commandManager = new CommandManager(this);
1545
- this.pluginManager = new PluginManager(this);
1546
- this.queryManager = new QueryManager(this);
1547
- this.chatManager = new ChatManager(this);
1548
- this.permissionManager = new PermissionManager(this);
1549
- this.banManager = new BanManager(this);
1550
- Server.instance = this;
1551
- }
1552
- async onEnable() {
1553
- this.config.onEnable();
1554
- await this.permissionManager.onEnable();
1555
- await this.pluginManager.onEnable();
1556
- await this.banManager.onEnable();
1557
- await this.itemManager.onEnable();
1558
- await this.blockManager.onEnable();
1559
- await this.commandManager.onEnable();
1560
- }
1561
- async onDisable() {
1562
- await this.commandManager.onDisable();
1563
- await this.blockManager.onDisable();
1564
- await this.itemManager.onDisable();
1565
- await this.banManager.onDisable();
1566
- await this.pluginManager.onDisable();
1567
- await this.permissionManager.onDisable();
1568
- await this.packetRegistry.onDisable();
1569
- this.config.onDisable();
1570
- }
1571
- async reload() {
1572
- await this.onDisable();
1573
- await this.onEnable();
1574
- }
1575
- async bootstrap(serverIp = "0.0.0.0", port = 19132) {
1576
- await this.onEnable();
1577
- BlockMappings.initMappings();
1578
- await this.worldManager.onEnable();
1579
- await this.packetRegistry.onEnable();
1580
- this.raknet = new RakNetListener(this.getConfig().getMaxPlayers(), false);
1581
- this.raknet.start(serverIp, port);
1582
- this.raknet.on("openConnection", async (session) => {
1583
- const event = new RaknetConnectEvent(session);
1584
- await this.eventManager.emit("raknetConnect", event);
1585
- if (event.isCancelled()) {
1586
- session.disconnect();
1587
- return;
1588
- }
1589
- const token = session.getAddress().toToken();
1590
- if (this.sessionManager.has(token)) {
1591
- this.logger.error(
1592
- `Another client with token (${token}) is already connected!`,
1593
- "Server/listen/openConnection"
1594
- );
1595
- session.disconnect("Already connected from another location");
1596
- return;
1597
- }
1598
- const timer = new Timer();
1599
- this.logger.debug(`${token} is attempting to connect`, "Server/listen/openConnection");
1600
- this.sessionManager.add(token, new ClientConnection(session, this.logger));
1601
- this.logger.verbose(`New connection handling took ${timer.stop()} ms`, "Server/listen/openConnection");
1602
- });
1603
- this.raknet.on("closeConnection", async (inetAddr, reason) => {
1604
- const event = new RaknetDisconnectEvent(inetAddr, reason);
1605
- await this.eventManager.emit("raknetDisconnect", event);
1606
- const time = Date.now();
1607
- const token = inetAddr.toToken();
1608
- try {
1609
- const player = this.sessionManager.getPlayer(token);
1610
- await player.getNetworkSession().removeFromPlayerList();
1611
- for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1612
- await player.getNetworkSession().sendDespawn(onlinePlayer);
1613
- }
1614
- if (player.getName()) {
1615
- const event2 = new ChatEvent(
1616
- new Chat(
1617
- this.console,
1618
- `§e%multiplayer.player.left`,
1619
- [player.getName()],
1620
- true,
1621
- "*.everyone",
1622
- ChatType.TRANSLATION
1623
- )
1624
- );
1625
- await this.eventManager.emit("chat", event2);
1626
- }
1627
- await player.onDisable();
1628
- await player.getWorld().removeEntity(player);
1629
- this.sessionManager.remove(token);
1630
- } catch (error) {
1631
- this.logger.debug(
1632
- `Cannot remove connection from non-existing player (${token})`,
1633
- "Server/listen/raknetDisconnect"
1634
- );
1635
- this.logger.error(error, "Server/listen/raknetDisconnect");
1636
- }
1637
- this.logger.debug(`${token} disconnected due to ${reason}`, "Server/listen/raknetDisconnect");
1638
- this.logger.debug(
1639
- `Player destruction took about ${Date.now() - time} ms`,
1640
- "Server/listen/raknetDisconnect"
1641
- );
1642
- });
1643
- this.raknet.on("encapsulated", async (packet, inetAddr) => {
1644
- const event = new RaknetEncapsulatedPacketEvent(inetAddr, packet);
1645
- await this.eventManager.emit("raknetEncapsulatedPacket", event);
1646
- let connection;
1647
- if ((connection = this.sessionManager.get(inetAddr.toToken()) ?? null) === null) {
1648
- this.logger.error(`Got a packet from a closed connection (${inetAddr.toToken()})`);
1649
- return;
1650
- }
1651
- try {
1652
- const batched = new BatchPacket(packet.content);
1653
- batched.compressed = connection.hasCompression;
1654
- for (const buf of await batched.asyncDecode()) {
1655
- const pid = buf[0];
1656
- if (!this.packetRegistry.getPackets().has(pid)) {
1657
- this.logger.warn(
1658
- `Packet 0x${pid.toString(16)} isn't implemented`,
1659
- "Server/listen/raknetEncapsulatedPacket"
1660
- );
1661
- continue;
1662
- }
1663
- const packet2 = new (this.packetRegistry.getPackets().get(pid))(buf);
1664
- try {
1665
- packet2.decode();
1666
- } catch (error) {
1667
- this.logger.error(error);
1668
- this.logger.error(
1669
- `Error while decoding packet: ${packet2.constructor.name}: ${error}`,
1670
- "Server/listen/raknetEncapsulatedPacket"
1671
- );
1672
- continue;
1673
- }
1674
- try {
1675
- const handler = this.packetRegistry.getHandler(pid);
1676
- this.logger.silly(
1677
- `Received §b${packet2.constructor.name}§r packet`,
1678
- "Server/listen/raknetEncapsulatedPacket"
1679
- );
1680
- await handler.handle(packet2, this, connection.getPlayerSession() ?? connection);
1681
- } catch (error) {
1682
- this.logger.error(
1683
- `Handler error ${packet2.constructor.name}-handler: (${error})`,
1684
- "Server/listen/raknetEncapsulatedPacket"
1685
- );
1686
- this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1687
- }
1688
- }
1689
- } catch (error) {
1690
- this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1691
- }
1692
- });
1693
- this.raknet.on("raw", async (buffer, inetAddr) => {
1694
- try {
1695
- await this.queryManager.onRaw(buffer, inetAddr);
1696
- } catch (error) {
1697
- this.logger.error(error, "Server/listen/raw");
1698
- this.logger.verbose(`QueryManager failed with error: ${error}`, "Server/listen/raw");
1699
- }
1700
- });
1701
- let tickCount = 0;
1702
- const tick = () => setTimeout(() => {
1703
- const event = new TickEvent(tickCount);
1704
- void this.eventManager.emit("tick", event);
1705
- for (const world of this.worldManager.getWorlds()) {
1706
- void world.update(event.getTick());
1707
- }
1708
- ++tickCount;
1709
- tick();
1710
- }, Server.MINECRAFT_TICK_TIME_MS);
1711
- this.tickerTimer = tick();
1712
- this.tickerTimer.unref();
1713
- this.logger.info(`JSPrismarine is now listening on port §b${port}`, "Server/listen");
1714
- }
1715
- /**
1716
- * Kills the server asynchronously.
1717
- */
1718
- async shutdown(options) {
1719
- if (this.stopping)
1720
- return;
1721
- this.stopping = true;
1722
- this.logger.info("Stopping server", "Server/kill");
1723
- await this.console.onDisable();
1724
- clearInterval(this.tickerTimer);
1725
- try {
1726
- for (const player of this.sessionManager.getAllPlayers()) {
1727
- await player.kick("Server closed.");
1728
- }
1729
- if (!options?.withoutSaving)
1730
- await this.worldManager.save();
1731
- await this.worldManager.onDisable();
1732
- await this.onDisable();
1733
- this.raknet.kill();
1734
- process.exit(options?.crash ? 1 : 0);
1735
- } catch (error) {
1736
- this.logger.error(error, "Server/kill");
1737
- process.exit(1);
1738
- }
1739
- }
1740
- async broadcastPacket(dataPacket) {
1741
- for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1742
- await onlinePlayer.getNetworkSession().getConnection().sendDataPacket(dataPacket);
1743
- }
1744
- }
1745
- getVersion() {
1746
- return this.version;
1747
- }
1748
- getIdentifiers() {
1749
- return Identifiers;
1750
- }
1751
- /**
1752
- * Returns the query manager
1753
- */
1754
- getQueryManager() {
1755
- return this.queryManager;
1756
- }
1757
- /**
1758
- * Returns the command manager
1759
- */
1760
- getCommandManager() {
1761
- return this.commandManager;
1762
- }
1763
- /**
1764
- * Returns the player manager
1765
- */
1766
- getSessionManager() {
1767
- return this.sessionManager;
1768
- }
1769
- /**
1770
- * Returns the world manager
1771
- */
1772
- getWorldManager() {
1773
- return this.worldManager;
1774
- }
1775
- /**
1776
- * Returns the item manager
1777
- */
1778
- getItemManager() {
1779
- return this.itemManager;
1780
- }
1781
- /**
1782
- * Returns the block manager
1783
- */
1784
- getBlockManager() {
1785
- return this.blockManager;
1786
- }
1787
- /**
1788
- * Returns the logger
1789
- */
1790
- getLogger() {
1791
- return this.logger;
1792
- }
1793
- /**
1794
- * Returns the packet registry
1795
- */
1796
- getPacketRegistry() {
1797
- return this.packetRegistry;
1798
- }
1799
- /**
1800
- * Returns the raknet instance
1801
- */
1802
- getRaknet() {
1803
- return this.raknet;
1804
- }
1805
- /**
1806
- * Returns the plugin manager
1807
- */
1808
- getPluginManager() {
1809
- return this.pluginManager;
1810
- }
1811
- /**
1812
- * Returns the event manager
1813
- */
1814
- getEventManager() {
1815
- return this.eventManager;
1816
- }
1817
- /**
1818
- * Returns the chat manager
1819
- */
1820
- getChatManager() {
1821
- return this.chatManager;
1822
- }
1823
- /**
1824
- * Returns the config
1825
- */
1826
- getConfig() {
1827
- return this.config;
1828
- }
1829
- /**
1830
- * Returns the console instance
1831
- */
1832
- getConsole() {
1833
- return this.console;
1834
- }
1835
- /**
1836
- * Returns the permission manager
1837
- */
1838
- getPermissionManager() {
1839
- return this.permissionManager;
1840
- }
1841
- /**
1842
- * Returns the ban manager
1843
- */
1844
- getBanManager() {
1845
- return this.banManager;
1846
- }
1847
- /**
1848
- * Returns this Prismarine instance
1849
- */
1850
- getServer() {
1851
- return this;
1852
- }
1853
- /**
1854
- * Returns the current TPS
1855
- */
1856
- getTPS() {
1857
- return this.tps;
1858
- }
1859
- }
1860
-
1861
- export { BooleanArgumentCommand as B, CommandArgument as C, Handlers as H, LoginHandler as L, Player as P, Server as S, VANILLA_DEFAULT_SPAWN_RADIUS as V, PlayerSession as a, CommandArgumentCommand as b, CommandArgumentEntity as c, CommandArgumentGamemode as d, CommandArgumentMob as e, CommandArgumentPosition as f, PlayerArgumentCommand as g, ClientConnection as h, PacketRegistry as i };
1862
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVyLUR5eTlPQ004LmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29tbWFuZC9Db21tYW5kQXJndW1lbnRzLnRzIiwiLi4vc3JjL25ldHdvcmsvaGFuZGxlci9Mb2dpbkhhbmRsZXIudHMiLCIuLi9zcmMvbmV0d29yay9QbGF5ZXJTZXNzaW9uLnRzIiwiLi4vc3JjL1BsYXllci50cyIsIi4uL3NyYy9uZXR3b3JrL0NsaWVudENvbm5lY3Rpb24udHMiLCIuLi9zcmMvbmV0d29yay9QYWNrZXRSZWdpc3RyeS50cyIsIi4uL3NyYy9TZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRW50aXRpZXMgZnJvbSAnLi4vZW50aXR5L0VudGl0aWVzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kQ29udGV4dCwgU3RyaW5nUmVhZGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IHsgU3VnZ2VzdGlvbnMgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JyaWdhZGllcic7XG5pbXBvcnQgQ29tbWFuZFBhcmFtZXRlciwgeyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MsIENvbW1hbmRQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRQYXJhbWV0ZXInO1xuXG5pbXBvcnQgQ29tbWFuZEVudW0gZnJvbSAnLi4vbmV0d29yay90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCBHYW1lbW9kZSBmcm9tICcuLi93b3JsZC9HYW1lbW9kZSc7XG5pbXBvcnQgUGFyc2VUYXJnZXRTZWxlY3RvciBmcm9tICcuLi91dGlscy9QYXJzZVRhcmdldFNlbGVjdG9yJztcbmltcG9ydCBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbiBmcm9tICcuLi91dGlscy9QYXJzZVRpbGRlQ2FyZXROb3RhdGlvbic7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJy4uLyc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdnYW1lTW9kZSc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBnbSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG5cbiAgICAgICAgR2FtZW1vZGUuZ2V0R2FtZW1vZGVJZChnbSk7XG4gICAgICAgIHJldHVybiBnbTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGxpc3RTdWdnZXN0aW9ucyhfY29udGV4dDogYW55LCBfYnVpbGRlcjogYW55KSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuIFN1Z2dlc3Rpb25zLmVtcHR5KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFeGFtcGxlcygpIHtcbiAgICAgICAgcmV0dXJuIFsnc3Vydml2YWwnLCAnY3JlYXRpdmUnLCAnYWR2ZW50dXJlJywgJ3NwZWN0YXRvciddO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBnYW1lTW9kZUVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgZ2FtZU1vZGVFbnVtLmVudW1OYW1lID0gJ0dhbWVNb2RlJztcblxuICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBkeW5hbWljXG4gICAgICAgIGdhbWVNb2RlRW51bS5lbnVtVmFsdWVzID0gWydzdXJ2aXZhbCcsICdjcmVhdGl2ZScsICdhZHZlbnR1cmUnLCAnc3BlY3RhdG9yJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGdhbWVNb2RlRW51bSxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudE1vYiBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdlbnRpdHlUeXBlJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLmNhblJlYWQoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgbGlzdFN1Z2dlc3Rpb25zKF9jb250ZXh0OiBhbnksIF9idWlsZGVyOiBhbnkpIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICByZXR1cm4gU3VnZ2VzdGlvbnMuZW1wdHkoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEV4YW1wbGVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGVudGl0eVR5cGVFbnVtLmVudW1OYW1lID0gJ0VudGl0eVR5cGUnO1xuICAgICAgICBlbnRpdHlUeXBlRW51bS5lbnVtVmFsdWVzID0gT2JqZWN0LmVudHJpZXMoRW50aXRpZXMpLm1hcCgoWywgZW50aXR5XSkgPT4gZW50aXR5Lk1PQl9JRCk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGVudGl0eVR5cGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50RW50aXR5IGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3RhcmdldCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBwbGF5ZXIgPSAnJztcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLmNhblJlYWQoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxheWVyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVyLnN0YXJ0c1dpdGgoJ0AnKSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVGFyZ2V0U2VsZWN0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzOiBjb250ZXh0LmdldFNvdXJjZSgpLmdldFdvcmxkKCkuZ2V0RW50aXRpZXMoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBhcyBhbnkpLm1lc3NhZ2UuaW5jbHVkZXMoJ25vIHJlc3VsdHMnKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dC5nZXRTb3VyY2UoKS5nZXRTZXJ2ZXIoKS5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckJ5RXhhY3ROYW1lKHBsYXllcildOyAvLyBUT0RPOiBieSBuYW1lIG5vdCBleGFjdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXQsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudFBvc2l0aW9uIGV4dGVuZHMgVmVjdG9yMyBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdwb3NpdGlvbic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGdldFBvcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSAnJztcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkZXIuY2FuUmVhZCgpKSBicmVhaztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zICs9IGNoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2V0WChcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd4J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRZKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3knXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZWFkZXIuc2tpcCgpO1xuICAgICAgICB0aGlzLnNldFooXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdjb21tYW5kJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdib29sZWFuJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW4gPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIGlmIChib29sZWFuID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgYm9vbGVhbkVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgYm9vbGVhbkVudW0uZW51bU5hbWUgPSAnQm9vbGVhbic7XG4gICAgICAgIGJvb2xlYW5FbnVtLmVudW1WYWx1ZXMgPSBbJ3RydWUnLCAnZmFsc2UnXTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZW51bTogYm9vbGVhbkVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJBcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncGxheWVyJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5lbnVtTmFtZSA9ICdQbGF5ZXInO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGxheWVyRW51bS5lbnVtVmFsdWVzID0gU2VydmVyLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLmVudW1WYWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IHBsYXllckVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBDbGllbnRDb25uZWN0aW9uIGZyb20gJy4uL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIExvZ2luUGFja2V0IGZyb20gJy4uL3BhY2tldC9Mb2dpblBhY2tldCc7XG5pbXBvcnQgeyBQbGF5U3RhdHVzUGFja2V0IH0gZnJvbSAnLi4vUGFja2V0cyc7XG5pbXBvcnQgUGxheVN0YXR1c1R5cGUgZnJvbSAnLi4vdHlwZS9QbGF5U3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHR5cGUgUHJlTG9naW5QYWNrZXRIYW5kbGVyIGZyb20gJy4vUHJlTG9naW5QYWNrZXRIYW5kbGVyJztcbmltcG9ydCBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCBmcm9tICcuLi9wYWNrZXQvUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uLy4uL1NlcnZlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2luSGFuZGxlciBpbXBsZW1lbnRzIFByZUxvZ2luUGFja2V0SGFuZGxlcjxMb2dpblBhY2tldD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5Mb2dpblBhY2tldDtcblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBMb2dpblBhY2tldCwgc2VydmVyOiBTZXJ2ZXIsIGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgcGxheWVyIGNvdW50ID49IG1heCBwbGF5ZXJzXG5cbiAgICAgICAgY29uc3QgcGxheVN0YXR1cyA9IG5ldyBQbGF5U3RhdHVzUGFja2V0KCk7XG5cbiAgICAgICAgLy8gS2ljayBjbGllbnQgaWYgaGFzIG5ld2VyIC8gb2xkZXIgY2xpZW50IHZlcnNpb25cbiAgICAgICAgaWYgKHBhY2tldC5wcm90b2NvbCAhPT0gSWRlbnRpZmllcnMuUHJvdG9jb2wpIHtcbiAgICAgICAgICAgIHBsYXlTdGF0dXMuc3RhdHVzID1cbiAgICAgICAgICAgICAgICBwYWNrZXQucHJvdG9jb2wgPCBJZGVudGlmaWVycy5Qcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICA/IFBsYXlTdGF0dXNUeXBlLkxvZ2luRmFpbGVkQ2xpZW50XG4gICAgICAgICAgICAgICAgICAgIDogUGxheVN0YXR1c1R5cGUuTG9naW5GYWlsZWRTZXJ2ZXI7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBsYXlTdGF0dXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2ljayB0aGUgcGxheWVyIGlmIHRoZWlyIHVzZXJuYW1lIGlzIGludmFsaWRcbiAgICAgICAgaWYgKCFwYWNrZXQuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgnSW52YWxpZCB1c2VybmFtZSEnLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgdHJhc2hcbiAgICAgICAgY29uc3Qgd29ybGQgPSBzZXJ2ZXIuZ2V0V29ybGRNYW5hZ2VyKCkuZ2V0RGVmYXVsdFdvcmxkKCk7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBQbGF5ZXIoY29ubmVjdGlvbiwgd29ybGQsIHNlcnZlcik7XG4gICAgICAgIHBsYXllci51c2VybmFtZS5uYW1lID0gcGFja2V0LmRpc3BsYXlOYW1lO1xuICAgICAgICBwbGF5ZXIubG9jYWxlID0gcGFja2V0Lmxhbmd1YWdlQ29kZTtcbiAgICAgICAgcGxheWVyLnJhbmRvbUlkID0gcGFja2V0LmNsaWVudFJhbmRvbUlkO1xuICAgICAgICBwbGF5ZXIudXVpZCA9IHBhY2tldC5pZGVudGl0eTtcbiAgICAgICAgcGxheWVyLnh1aWQgPSBwYWNrZXQuWFVJRDtcbiAgICAgICAgcGxheWVyLnNraW4gPSBwYWNrZXQuc2tpbjtcbiAgICAgICAgcGxheWVyLmRldmljZSA9IHBhY2tldC5kZXZpY2U7XG5cbiAgICAgICAgLy8gUGxheWVyIHdpdGggc2FtZSBuYW1lIGlzIGFscmVhZHkgb25saW5lXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvbGRQbGF5ZXIgPSBzZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJCeUV4YWN0TmFtZShwYWNrZXQuZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgb2xkUGxheWVyLmtpY2soJ0xvZ2dlZCBpbiBmcm9tIGFub3RoZXIgbG9jYXRpb24nKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIGlmICghcGxheWVyLnh1aWQgJiYgc2VydmVyLmdldENvbmZpZygpLmdldE9ubGluZU1vZGUoKSkge1xuICAgICAgICAgICAgYXdhaXQgcGxheWVyLmtpY2soJ1NlcnZlciBpcyBpbiBvbmxpbmUtbW9kZSEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHBsYXllci5vbkVuYWJsZSgpO1xuXG4gICAgICAgIC8vIFRPRE86IGVuY3J5cHRpb24gaGFuZHNoYWtlXG5cbiAgICAgICAgY29uc3QgcmVhc29uID0gc2VydmVyLmdldEJhbk1hbmFnZXIoKS5pc0Jhbm5lZChwbGF5ZXIpO1xuICAgICAgICBpZiAocmVhc29uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgYXdhaXQgcGxheWVyLmtpY2soYFlvdSBoYXZlIGJlZW4gYmFubmVkJHtyZWFzb24gPyBgIGZvciByZWFzb246ICR7cmVhc29ufWAgOiAnJ30hYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXllciBjb25uZWN0aW9uIHRvIGJlIHJlY29nbml6ZWQgYXMgYSBjb25uZWN0ZWQgcGxheWVyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBjb25uZWN0aW9uLmluaXRQbGF5ZXJDb25uZWN0aW9uKHNlcnZlciwgcGxheWVyKTtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5Mb2dpblN1Y2Nlc3MpO1xuXG4gICAgICAgIGF3YWl0IHdvcmxkLmFkZEVudGl0eShwbGF5ZXIpO1xuXG4gICAgICAgIC8vIEZpbmFsaXplIGNvbm5lY3Rpb24gaGFuZHNoYWtlXG4gICAgICAgIGNvbnN0IHJlc291cmNlUGFja3NJbmZvID0gbmV3IFJlc291cmNlUGFja3NJbmZvUGFja2V0KCk7XG4gICAgICAgIHJlc291cmNlUGFja3NJbmZvLnJlc291cmNlUGFja1JlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHJlc291cmNlUGFja3NJbmZvLmZvcmNlU2VydmVyUGFja3NFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHJlc291cmNlUGFja3NJbmZvLmhhc1NjcmlwdHMgPSBmYWxzZTtcbiAgICAgICAgcmVzb3VyY2VQYWNrc0luZm8uaGFzQWRkb25QYWNrcyA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHJlc291cmNlUGFja3NJbmZvLCB0cnVlKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb21tYW5kQXJndW1lbnRFbnRpdHksIENvbW1hbmRBcmd1bWVudEdhbWVtb2RlIH0gZnJvbSAnLi4vY29tbWFuZC9Db21tYW5kQXJndW1lbnRzJztcbmltcG9ydCBDb21tYW5kUGFyYW1ldGVyLCB7IENvbW1hbmRQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi90eXBlL0NvbW1hbmRQYXJhbWV0ZXInO1xuaW1wb3J0IHR5cGUgeyBDaHVua0Nvb3JkIH0gZnJvbSAnLi9wYWNrZXQvTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0JztcbmltcG9ydCBOZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0JztcbmltcG9ydCBQbGF5ZXJMaXN0UGFja2V0LCB7IFBsYXllckxpc3RBY3Rpb24sIFBsYXllckxpc3RFbnRyeSB9IGZyb20gJy4vcGFja2V0L1BsYXllckxpc3RQYWNrZXQnO1xuaW1wb3J0IFVwZGF0ZUFiaWxpdGllc1BhY2tldCwge1xuICAgIEFiaWxpdHlMYXllcixcbiAgICBBYmlsaXR5TGF5ZXJGbGFnLFxuICAgIEFiaWxpdHlMYXllclR5cGVcbn0gZnJvbSAnLi9wYWNrZXQvVXBkYXRlQWJpbGl0aWVzUGFja2V0JztcblxuaW1wb3J0IEFkZFBsYXllclBhY2tldCBmcm9tICcuL3BhY2tldC9BZGRQbGF5ZXJQYWNrZXQnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGUgfSBmcm9tICcuLi9lbnRpdHkvQXR0cmlidXRlJztcbmltcG9ydCBBdmFpbGFibGVDb21tYW5kc1BhY2tldCBmcm9tICcuL3BhY2tldC9BdmFpbGFibGVDb21tYW5kc1BhY2tldCc7XG5pbXBvcnQgeyBCYXRjaFBhY2tldCB9IGZyb20gJy4vUGFja2V0cyc7XG5pbXBvcnQgQmxvY2tQb3NpdGlvbiBmcm9tICcuLi93b3JsZC9CbG9ja1Bvc2l0aW9uJztcbmltcG9ydCBDaHVuayBmcm9tICcuLi93b3JsZC9jaHVuay9DaHVuayc7XG5pbXBvcnQgQ2h1bmtSYWRpdXNVcGRhdGVkUGFja2V0IGZyb20gJy4vcGFja2V0L0NodW5rUmFkaXVzVXBkYXRlZFBhY2tldCc7XG5pbXBvcnQgdHlwZSBDbGllbnRDb25uZWN0aW9uIGZyb20gJy4vQ2xpZW50Q29ubmVjdGlvbic7XG5pbXBvcnQgQ29tbWFuZERhdGEgZnJvbSAnLi90eXBlL0NvbW1hbmREYXRhJztcbmltcG9ydCBDb21tYW5kRW51bSBmcm9tICcuL3R5cGUvQ29tbWFuZEVudW0nO1xuaW1wb3J0IENvb3JkaW5hdGVVdGlscyBmcm9tICcuLi93b3JsZC9Db29yZGluYXRlVXRpbHMnO1xuaW1wb3J0IENyZWF0aXZlQ29udGVudFBhY2tldCBmcm9tICcuL3BhY2tldC9DcmVhdGl2ZUNvbnRlbnRQYWNrZXQnO1xuaW1wb3J0IERpc2Nvbm5lY3RQYWNrZXQgZnJvbSAnLi9wYWNrZXQvRGlzY29ubmVjdFBhY2tldCc7XG5pbXBvcnQgR2FtZW1vZGUgZnJvbSAnLi4vd29ybGQvR2FtZW1vZGUnO1xuaW1wb3J0IEhlYXAgZnJvbSAnaGVhcCc7XG5pbXBvcnQgdHlwZSBJRm9ybSBmcm9tICcuLi9mb3JtL0lGb3JtJztcbmltcG9ydCBJbnZlbnRvcnlDb250ZW50UGFja2V0IGZyb20gJy4vcGFja2V0L0ludmVudG9yeUNvbnRlbnRQYWNrZXQnO1xuaW1wb3J0IEl0ZW0gZnJvbSAnLi4vaXRlbS9JdGVtJztcbmltcG9ydCBMZXZlbENodW5rUGFja2V0IGZyb20gJy4vcGFja2V0L0xldmVsQ2h1bmtQYWNrZXQnO1xuaW1wb3J0IE1vYkVxdWlwbWVudFBhY2tldCBmcm9tICcuL3BhY2tldC9Nb2JFcXVpcG1lbnRQYWNrZXQnO1xuaW1wb3J0IE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTW9kYWxGb3JtUmVxdWVzdFBhY2tldCc7XG5pbXBvcnQgTW92ZVBsYXllclBhY2tldCBmcm9tICcuL3BhY2tldC9Nb3ZlUGxheWVyUGFja2V0JztcbmltcG9ydCBNb3ZlbWVudFR5cGUgZnJvbSAnLi90eXBlL01vdmVtZW50VHlwZSc7XG5pbXBvcnQgUGVybWlzc2lvblR5cGUgZnJvbSAnLi90eXBlL1Blcm1pc3Npb25UeXBlJztcbmltcG9ydCBQbGF5U3RhdHVzUGFja2V0IGZyb20gJy4vcGFja2V0L1BsYXlTdGF0dXNQYWNrZXQnO1xuaW1wb3J0IHR5cGUgUGxheWVyIGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgUGxheWVyUGVybWlzc2lvblR5cGUgZnJvbSAnLi90eXBlL1BsYXllclBlcm1pc3Npb25UeXBlJztcbmltcG9ydCBSZW1vdmVBY3RvclBhY2tldCBmcm9tICcuL3BhY2tldC9SZW1vdmVBY3RvclBhY2tldCc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCBTZXRBY3RvckRhdGFQYWNrZXQgZnJvbSAnLi9wYWNrZXQvU2V0QWN0b3JEYXRhUGFja2V0JztcbmltcG9ydCBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCBmcm9tICcuL3BhY2tldC9TZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCc7XG5pbXBvcnQgU2V0VGltZVBhY2tldCBmcm9tICcuL3BhY2tldC9TZXRUaW1lUGFja2V0JztcbmltcG9ydCBUZXh0UGFja2V0IGZyb20gJy4vcGFja2V0L1RleHRQYWNrZXQnO1xuaW1wb3J0IFRleHRUeXBlIGZyb20gJy4vdHlwZS9UZXh0VHlwZSc7XG5pbXBvcnQgVG9hc3RSZXF1ZXN0UGFja2V0IGZyb20gJy4vcGFja2V0L1RvYXN0UmVxdWVzdFBhY2tldCc7XG5pbXBvcnQgVVVJRCBmcm9tICcuLi91dGlscy9VVUlEJztcbmltcG9ydCBVcGRhdGVBZHZlbnR1cmVTZXR0aW5nc1BhY2tldCBmcm9tICcuL3BhY2tldC9VcGRhdGVBZHZlbnR1cmVTZXR0aW5nc1BhY2tldCc7XG5pbXBvcnQgVXBkYXRlQXR0cmlidXRlc1BhY2tldCBmcm9tICcuL3BhY2tldC9VcGRhdGVBdHRyaWJ1dGVzUGFja2V0JztcbmltcG9ydCB7IFdpbmRvd0lkcyB9IGZyb20gJy4uL2ludmVudG9yeS9XaW5kb3dNYW5hZ2VyJztcbmltcG9ydCB7IGNyZWF0aXZlaXRlbXMgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXllclNlc3Npb24ge1xuICAgIHByaXZhdGUgY29ubmVjdGlvbjogQ2xpZW50Q29ubmVjdGlvbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcGxheWVyOiBQbGF5ZXI7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNodW5rU2VuZFF1ZXVlOiBDaHVua1tdID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkZWRDaHVua3M6IFNldDxiaWdpbnQ+ID0gbmV3IFNldCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ0NodW5rczogU2V0PGJpZ2ludD4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIsIGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb24sIHBsYXllcjogUGxheWVyKSB7XG4gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKF90aWNrOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTZW5kUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmtzVG9TZW5kID0gdGhpcy5jaHVua1NlbmRRdWV1ZS5zcGxpY2UoMCwgTWF0aC5taW4odGhpcy5jaHVua1NlbmRRdWV1ZS5sZW5ndGgsIDUwKSk7XG4gICAgICAgICAgICBjb25zdCBiYXRjaCA9IG5ldyBCYXRjaFBhY2tldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3NUb1NlbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IG5ldyBMZXZlbENodW5rUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgcGsuY2h1bmtYID0gY2h1bmsuZ2V0WCgpO1xuICAgICAgICAgICAgICAgIHBrLmNodW5rWiA9IGNodW5rLmdldFooKTtcbiAgICAgICAgICAgICAgICBway5jbGllbnRTdWJDaHVua1JlcXVlc3RzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBrLnN1YkNodW5rQ291bnQgPSBjaHVuay5nZXRUb3BFbXB0eSgpICsgNDtcbiAgICAgICAgICAgICAgICBway5kYXRhID0gY2h1bmsubmV0d29ya1NlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgICAgIGJhdGNoLmFkZFBhY2tldChwayk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKGNodW5rLmdldFgoKSwgY2h1bmsuZ2V0WigpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5hZGQoaGFzaCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmRlbGV0ZShoYXNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kQmF0Y2goYmF0Y2gsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheWVyLnZpZXdEaXN0YW5jZSAmJiAoYXdhaXQgdGhpcy5uZWVkTmV3Q2h1bmtzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmeSBhIGNsaWVudCBhYm91dCBjaGFuZ2UocykgdG8gdGhlIGFkdmVudHVyZSBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGF5ZXIgLSBUaGUgY2xpZW50LWNvbnRyb2xsZWQgZW50aXR5XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRTZXR0aW5ncyhwbGF5ZXI/OiBQbGF5ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGxheWVyID8/IHRoaXMucGxheWVyO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFVwZGF0ZUFkdmVudHVyZVNldHRpbmdzUGFja2V0KCk7XG4gICAgICAgIHBrLndvcmxkSW1tdXRhYmxlID0gdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3I7XG4gICAgICAgIHBrLm5vQXR0YWNraW5nUGxheWVycyA9IHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3BlY3RhdG9yO1xuICAgICAgICBway5ub0F0dGFja2luZ01vYnMgPSB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcjtcbiAgICAgICAgcGsuYXV0b0p1bXAgPSB0cnVlOyAvLyBUT0RPOiBncmFiIHRoaXMgaW5mbyBlbHNld2hlcmVcbiAgICAgICAgcGsuc2hvd05hbWVUYWdzID0gdHJ1ZTsgLy8gVE9ETzogcGxheWVyIG1heSBiZSBhYmxlIHRvIGhpZGUgdGhlbVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRBYmlsaXRpZXMocGxheWVyPzogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBsYXllciA/PyB0aGlzLnBsYXllcjtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBVcGRhdGVBYmlsaXRpZXNQYWNrZXQoKTtcbiAgICAgICAgcGsuY29tbWFuZFBlcm1pc3Npb24gPSB0YXJnZXQuaXNPcCgpID8gUGVybWlzc2lvblR5cGUuT3BlcmF0b3IgOiBQZXJtaXNzaW9uVHlwZS5Ob3JtYWw7XG4gICAgICAgIHBrLnBsYXllclBlcm1pc3Npb24gPSB0YXJnZXQuaXNPcCgpID8gUGxheWVyUGVybWlzc2lvblR5cGUuT3BlcmF0b3IgOiBQbGF5ZXJQZXJtaXNzaW9uVHlwZS5NZW1iZXI7XG4gICAgICAgIHBrLnRhcmdldEFjdG9yVW5pcXVlSWQgPSB0YXJnZXQuZ2V0UnVudGltZUlkKCk7XG5cbiAgICAgICAgY29uc3QgbWFpbkxheWVyID0gbmV3IEFiaWxpdHlMYXllcigpO1xuICAgICAgICBtYWluTGF5ZXIubGF5ZXJUeXBlID0gQWJpbGl0eUxheWVyVHlwZS5CQVNFO1xuICAgICAgICBtYWluTGF5ZXIubGF5ZXJGbGFncyA9IG5ldyBNYXAoW1xuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuRkxZX1NQRUVELCB0cnVlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLldBTEtfU1BFRUQsIHRydWVdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTUFZX0ZMWSwgdGFyZ2V0LmdldEFsbG93RmxpZ2h0KCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuRkxZSU5HLCB0YXJnZXQuaXNGbHlpbmcoKV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5OT19DTElQLCB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5PUEVSQVRPUl9DT01NQU5EUywgdGFyZ2V0LmlzT3AoKV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5URUxFUE9SVCwgdGFyZ2V0LmlzT3AoKV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5JTlZVTE5FUkFCTEUsIHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuQ3JlYXRpdmVdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTVVURUQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLldPUkxEX0JVSUxERVIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLklOU1RBQlVJTEQsIHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuQ3JlYXRpdmVdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTElHSFROSU5HLCBmYWxzZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5CVUlMRCwgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTUlORSwgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuRE9PUlNfQU5EX1NXSVRDSEVTLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5PUEVOX0NPTlRBSU5FUlMsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkFUVEFDS19QTEFZRVJTLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5BVFRBQ0tfTU9CUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdXG4gICAgICAgIF0pO1xuICAgICAgICBtYWluTGF5ZXIuZmx5U3BlZWQgPSAwLjA1O1xuICAgICAgICBtYWluTGF5ZXIud2Fsa1NwZWVkID0gMC4xO1xuXG4gICAgICAgIHBrLmFiaWxpdHlMYXllcnMgPSBbbWFpbkxheWVyXTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBuZWVkTmV3Q2h1bmtzKGZvcmNlUmVzZW5kID0gZmFsc2UsIGRpc3Q/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFhDaHVuayA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMucGxheWVyLmdldFgoKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRaQ2h1bmsgPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLnBsYXllci5nZXRaKCkpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdEaXN0YW5jZSA9IHRoaXMucGxheWVyLnZpZXdEaXN0YW5jZSA/PyBkaXN0O1xuXG4gICAgICAgIGNvbnN0IGNodW5rc1RvU2VuZEhlYXAgPSBuZXcgSGVhcCgoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXN0WEZpcnN0ID0gTWF0aC5hYnMoYVswXSEgLSBjdXJyZW50WENodW5rKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RYU2Vjb25kID0gTWF0aC5hYnMoYlswXSEgLSBjdXJyZW50WENodW5rKTtcblxuICAgICAgICAgICAgY29uc3QgZGlzdFpGaXJzdCA9IE1hdGguYWJzKGFbMV0hIC0gY3VycmVudFpDaHVuayk7XG4gICAgICAgICAgICBjb25zdCBkaXN0WlNlY29uZCA9IE1hdGguYWJzKGJbMV0hIC0gY3VycmVudFpDaHVuayk7XG5cbiAgICAgICAgICAgIHJldHVybiBkaXN0WEZpcnN0ICsgZGlzdFpGaXJzdCA+IGRpc3RYU2Vjb25kICsgZGlzdFpTZWNvbmQgPyAxIDogLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAobGV0IHNlbmRYQ2h1bmsgPSAtdmlld0Rpc3RhbmNlOyBzZW5kWENodW5rIDw9IHZpZXdEaXN0YW5jZTsgc2VuZFhDaHVuaysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzZW5kWkNodW5rID0gLXZpZXdEaXN0YW5jZTsgc2VuZFpDaHVuayA8PSB2aWV3RGlzdGFuY2U7IHNlbmRaQ2h1bmsrKykge1xuICAgICAgICAgICAgICAgIGlmIChzZW5kWENodW5rICogc2VuZFhDaHVuayArIHNlbmRaQ2h1bmsgKiBzZW5kWkNodW5rID4gdmlld0Rpc3RhbmNlICogdmlld0Rpc3RhbmNlKSBjb250aW51ZTsgLy8gZWFybHkgZXhpdCBpZiBjaHVuayBpcyBvdXRzaWRlIG9mIHZpZXcgZGlzdGFuY2VcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDaHVuayA9IFtjdXJyZW50WENodW5rICsgc2VuZFhDaHVuaywgY3VycmVudFpDaHVuayArIHNlbmRaQ2h1bmtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBDaHVuay5wYWNrWFoobmV3Q2h1bmtbMF0hLCBuZXdDaHVua1sxXSEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVzZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rc1RvU2VuZEhlYXAucHVzaChuZXdDaHVuayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5sb2FkZWRDaHVua3MuaGFzKGhhc2gpICYmICF0aGlzLmxvYWRpbmdDaHVua3MuaGFzKGhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rc1RvU2VuZEhlYXAucHVzaChuZXdDaHVuayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGNodW5rc1RvU2VuZEhlYXAuc2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY2xvc2VzdENodW5rID0gY2h1bmtzVG9TZW5kSGVhcC5wb3AoKSE7XG4gICAgICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgaWYgKGZvcmNlUmVzZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZENodW5rcy5oYXMoaGFzaCkgJiYgIXRoaXMubG9hZGluZ0NodW5rcy5oYXMoaGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0Q2h1bmsoY2xvc2VzdENodW5rWzBdISwgY2xvc2VzdENodW5rWzFdISk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkQ2h1bmsgPSBhd2FpdCB0aGlzLnBsYXllci5nZXRXb3JsZCgpLmdldENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaHVuayhsb2FkZWRDaHVuayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuYWRkKGhhc2gpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVubG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMubG9hZGVkQ2h1bmtzKSB7XG4gICAgICAgICAgICBjb25zdCBbeCwgel0gPSBDaHVuay51bnBhY2tYWihoYXNoKTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHghIC0gY3VycmVudFhDaHVuaykgPiB2aWV3RGlzdGFuY2UgfHwgTWF0aC5hYnMoeiEgLSBjdXJyZW50WkNodW5rKSA+IHZpZXdEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHVubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdGhpcy5sb2FkaW5nQ2h1bmtzKSB7XG4gICAgICAgICAgICBjb25zdCBbeCwgel0gPSBDaHVuay51bnBhY2tYWihoYXNoKTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHghIC0gY3VycmVudFhDaHVuaykgPiB2aWV3RGlzdGFuY2UgfHwgTWF0aC5hYnMoeiEgLSBjdXJyZW50WkNodW5rKSA+IHZpZXdEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVubG9hZGVkICYmIHRoaXMuY2h1bmtTZW5kUXVldWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoZGlzdCA/PyB2aWV3RGlzdGFuY2UsIFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0Q2h1bmsoeDogbnVtYmVyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBhd2FpdCB0aGlzLnBsYXllci5nZXRXb3JsZCgpLmdldENodW5rKHgsIHopO1xuICAgICAgICB0aGlzLmNodW5rU2VuZFF1ZXVlLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjdXJyZW50bHkgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXN1YWxseSB1c2VkIGZvciBjaGFuZ2luZyBkaW1lbnNpb24sIHdvcmxkLCBldGMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNsZWFyQ2h1bmtzKCkge1xuICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEludmVudG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldCgpO1xuICAgICAgICBway5pdGVtcyA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1zKHRydWUpO1xuICAgICAgICBway53aW5kb3dJZCA9IFdpbmRvd0lkcy5JTlZFTlRPUlk7IC8vIEludmVudG9yeSB3aW5kb3dcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSGFuZEl0ZW0odGhpcy5wbGF5ZXIuZ2V0SW52ZW50b3J5KCkuZ2V0SXRlbUluSGFuZCgpKTtcblxuICAgICAgICAvKiBUT0RPOiBub3Qgd29ya2luZy4uXG4gICAgICAgIHBrID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcbiAgICAgICAgcGsuaXRlbXMgPSBbXTsgLy8gVE9ET1xuICAgICAgICBway53aW5kb3dJZCA9IDc4OyAvLyBBcm1vckludmVudG9yeSB3aW5kb3dcbiAgICAgICAgdGhpcy5zZW5kRGF0YVBhY2tldChwayk7XG5cbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL05pY2xhc09sb2Zzc29uL01pTkVUL2Jsb2IvbWFzdGVyL3NyYy9NaU5FVC9NaU5FVC9QbGF5ZXIuY3MjTDE3MzZcbiAgICAgICAgLy8gVE9ETzogZG9jdW1lbnRhdGUgYWJvdXRcbiAgICAgICAgMHg3YyAodWkgY29udGVudClcbiAgICAgICAgMHg3NyAob2ZmIGhhbmQpXG4gICAgICAgICovXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRDcmVhdGl2ZUNvbnRlbnRzKGVtcHR5ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQ3JlYXRpdmVDb250ZW50UGFja2V0KCk7XG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRCbG9ja01hbmFnZXIoKS5nZXRCbG9ja3MoKSxcbiAgICAgICAgICAgIC4uLnRoaXMucGxheWVyLmdldFNlcnZlcigpLmdldEl0ZW1NYW5hZ2VyKCkuZ2V0SXRlbXMoKVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFNvcnQgYmFzZWQgb24gUG1tUCBCZWRyb2NrLWRhdGFcbiAgICAgICAgY3JlYXRpdmVpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHBrLml0ZW1zLnB1c2goXG4gICAgICAgICAgICAgICAgLi4uZW50cmllc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubWV0YSA9PT0gKGl0ZW0uZGFtYWdlID8/IDApICYmIGVudHJ5LmdldElkKCkgPT09IGl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZW50cnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZW50cnkuZ2V0SWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW50cnkuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBlbnRyeS5tZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpdGVtIGluIHRoZSBwbGF5ZXIgaGFuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEhhbmRJdGVtKGl0ZW06IEl0ZW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTW9iRXF1aXBtZW50UGFja2V0KCk7XG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICBway5pdGVtID0gaXRlbTtcbiAgICAgICAgcGsuaW52ZW50b3J5U2xvdCA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEhhbmRTbG90SW5kZXgoKTtcbiAgICAgICAgcGsuaG90YmFyU2xvdCA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEhhbmRTbG90SW5kZXgoKTtcbiAgICAgICAgcGsud2luZG93SWQgPSAwOyAvLyBJbnZlbnRvcnkgSURcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEZvcm0oZm9ybTogSUZvcm0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnBsYXllci5nZXRGb3JtTWFuYWdlcigpLmFkZEZvcm0oZm9ybSk7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQoKTtcbiAgICAgICAgcGsuZm9ybUlkID0gaWQ7XG4gICAgICAgIHBrLmZvcm1EYXRhID0gZm9ybS5qc29uU2VyaWFsaXplKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjbGllbnQncyBjdXJyZW50IHRpY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGljayAtIFRoZSB0aWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRUaW1lKHRpY2s6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRUaW1lUGFja2V0KCk7XG4gICAgICAgIHBrLnRpbWUgPSB0aWNrO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgZ2FtZW1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ2FtZW1vZGUgLSB0aGUgbnVtZXJpYyBnYW1lbW9kZSBJRFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kR2FtZW1vZGUoZ2FtZW1vZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCgpO1xuICAgICAgICBway5nYW1lbW9kZSA9IGdhbWVtb2RlO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKGRpc3RhbmNlOiBudW1iZXIsIHNhdmVkQ2h1bmtzOiBDaHVua0Nvb3JkW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0KCk7XG4gICAgICAgIHBrLnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi5mcm9tVmVjdG9yMyh0aGlzLnBsYXllcik7XG4gICAgICAgIHBrLnJhZGl1cyA9IGRpc3RhbmNlIDw8IDQ7XG4gICAgICAgIHBrLnNhdmVkQ2h1bmtzID0gc2F2ZWRDaHVua3M7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRBdmFpbGFibGVDb21tYW5kcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQoKTtcblxuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldENvbW1hbmRNYW5hZ2VyKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kc0xpc3QoKVxuICAgICAgICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kQ2xhc3MgPSBBcnJheS5mcm9tKHRoaXMuc2VydmVyLmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0Q29tbWFuZHMoKS52YWx1ZXMoKSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGNtZCkgPT4gY21kLmlkLnNwbGl0KCc6JylbMV0gPT09IGNvbW1hbmRbMF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjb21tYW5kQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lndhcm4oYENhbid0IGZpbmQgY29ycmVzcG9uZGluZyBjb21tYW5kIGNsYXNzIGZvciBcIiR7Y29tbWFuZFswXX1cImApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRQZXJtaXNzaW9uTWFuYWdlcigpLmNhbih0aGlzLnBsYXllcikuZXhlY3V0ZShjb21tYW5kQ2xhc3MucGVybWlzc2lvbikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kRGF0YSgpO1xuICAgICAgICAgICAgICAgIGNtZC5jb21tYW5kTmFtZSA9IGNvbW1hbmRbMF07XG4gICAgICAgICAgICAgICAgY21kLmNvbW1hbmREZXNjcmlwdGlvbiA9IGNvbW1hbmRDbGFzcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZENsYXNzLmFsaWFzZXMhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21kQWxpYXNlcyA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICAgICAgICAgICAgICBjbWRBbGlhc2VzLmVudW1OYW1lID0gYCR7Y29tbWFuZFswXX1BbGlhc2VzYDtcbiAgICAgICAgICAgICAgICAgICAgY21kQWxpYXNlcy5lbnVtVmFsdWVzID0gY29tbWFuZENsYXNzLmFsaWFzZXMhLmNvbmNhdChjb21tYW5kWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY21kLmFsaWFzZXMgPSBjbWRBbGlhc2VzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbW1hbmRbMl0uZm9yRWFjaCgoYXJnLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gYXJnXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyYW1ldGVyLmdldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycykgcmV0dXJuIEFycmF5LmZyb20ocGFyYW1ldGVycy52YWx1ZXMoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgQ29tbWFuZEFyZ3VtZW50RW50aXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlciBpbnN0YW5jZW9mIENvbW1hbmRBcmd1bWVudEdhbWVtb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ2dhbWVtb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdTdHJpbmdBcmd1bWVudFR5cGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdJbnRlZ2VyQXJndW1lbnRUeXBlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuSW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCk/Lndhcm4oYEludmFsaWQgcGFyYW1ldGVyICR7cGFyYW1ldGVyLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmxhdCgpO1xuICAgICAgICAgICAgICAgICAgICBjbWQub3ZlcmxvYWRzW2luZGV4XSA9IHBhcmFtZXRlcnM7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGsuY29tbWFuZERhdGEucHVzaChjbWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5lbnVtTmFtZSA9ICdQbGF5ZXInO1xuICAgICAgICBwbGF5ZXJFbnVtLmVudW1WYWx1ZXMgPSB0aGlzLnBsYXllclxuICAgICAgICAgICAgLmdldFNlcnZlcigpXG4gICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgcGsuc29mdEVudW1zID0gW3BsYXllckVudW1dO1xuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgY29tbWFuZHNcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgbWF4aW11bSB2aWV3IGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpc3RhbmNlIC0gVGhlIHZpZXcgZGlzdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0Vmlld0Rpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wbGF5ZXIudmlld0Rpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IENodW5rUmFkaXVzVXBkYXRlZFBhY2tldCgpO1xuICAgICAgICBway5yYWRpdXMgPSBkaXN0YW5jZTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEF0dHJpYnV0ZXMoYXR0cmlidXRlczogQXR0cmlidXRlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQXR0cmlidXRlc1BhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgPz8gdGhpcy5wbGF5ZXIuZ2V0QXR0cmlidXRlTWFuYWdlcigpLmdldEF0dHJpYnV0ZXMoKTtcbiAgICAgICAgcGsudGljayA9IEJpZ0ludCgwKTsgLy8gVE9ET1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kTWV0YWRhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFNldEFjdG9yRGF0YVBhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsubWV0YWRhdGEgPSB0aGlzLnBsYXllci5nZXRNZXRhZGF0YU1hbmFnZXIoKTtcbiAgICAgICAgcGsudGljayA9IEJpZ0ludCgwKTsgLy8gVE9ET1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjaGF0IG1lc3NhZ2UgdG8gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVmYWN0b3IgdGhpcyBjb21wbGV0ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZVxuICAgICAqIEBwYXJhbSB4dWlkIC0gVGhlIHNvdXJjZSB4dWlkXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgLVxuICAgICAqIEBwYXJhbSBuZWVkc1RyYW5zbGF0aW9uIC0gSWYgdGhlIFRleHRUeXBlIHJlcXVpcmVzIHRyYW5zbGF0aW9uXG4gICAgICogQHBhcmFtIHR5cGUgLSBUaGUgdGV4dCB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIHh1aWQgPSAnJyxcbiAgICAgICAgcGFyYW1ldGVyczogc3RyaW5nW10gPSBbXSxcbiAgICAgICAgbmVlZHNUcmFuc2xhdGlvbiA9IGZhbHNlLFxuICAgICAgICB0eXBlID0gVGV4dFR5cGUuUmF3XG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKCdBIG1lc3NhZ2UgaXMgcmVxdWlyZWQnKTtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBUZXh0UGFja2V0KCk7XG4gICAgICAgIHBrLnR5cGUgPSB0eXBlO1xuICAgICAgICBway5zb3VyY2VOYW1lID0gJyc7XG4gICAgICAgIHBrLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBway5uZWVkc1RyYW5zbGF0aW9uID0gbmVlZHNUcmFuc2xhdGlvbjtcbiAgICAgICAgcGsueHVpZCA9IHh1aWQ7XG4gICAgICAgIHBrLnBsYXRmb3JtQ2hhdElkID0gJyc7IC8vIFRPRE9cbiAgICAgICAgcGsucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRUb2FzdCh0aXRsZTogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aXRsZSkgdGhyb3cgbmV3IEVycm9yKCdBIHRvYXN0IHRpdGxlIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIGlmICghYm9keSkgdGhyb3cgbmV3IEVycm9yKCdBIHRvYXN0IGJvZHkgaXMgcmVxdWlyZWQuJyk7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVG9hc3RSZXF1ZXN0UGFja2V0KCk7XG4gICAgICAgIHBrLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHBrLmJvZHkgPSBib2R5O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRDaHVuayhjaHVuazogQ2h1bmspOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuICAgICAgICBway5jaHVua1ggPSBjaHVuay5nZXRYKCk7XG4gICAgICAgIHBrLmNodW5rWiA9IGNodW5rLmdldFooKTtcbiAgICAgICAgcGsuY2xpZW50U3ViQ2h1bmtSZXF1ZXN0c0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcGsuc3ViQ2h1bmtDb3VudCA9IGNodW5rLmdldFRvcEVtcHR5KCkgKyA0OyAvLyBhZGQgdGhlIHVzZWxlc3MgbGF5ZXJzIGhhY2tcbiAgICAgICAgcGsuZGF0YSA9IGNodW5rLm5ldHdvcmtTZXJpYWxpemUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrLCB1bmRlZmluZWQsIGZhbHNlKTtcblxuICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKGNodW5rLmdldFgoKSwgY2h1bmsuZ2V0WigpKTtcbiAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuYWRkKGhhc2gpO1xuICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdCB0aGUgbW92ZW1lbnQgdG8gYSBkZWZpbmVkIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBicm9hZGNhc3RNb3ZlKHBsYXllcjogUGxheWVyLCBtb2RlID0gTW92ZW1lbnRUeXBlLk5vcm1hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBNb3ZlUGxheWVyUGFja2V0KCk7XG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHBsYXllci5nZXRSdW50aW1lSWQoKTtcblxuICAgICAgICBway5wb3NpdGlvblggPSBwbGF5ZXIuZ2V0WCgpO1xuICAgICAgICBway5wb3NpdGlvblkgPSBwbGF5ZXIuZ2V0WSgpO1xuICAgICAgICBway5wb3NpdGlvblogPSBwbGF5ZXIuZ2V0WigpO1xuXG4gICAgICAgIHBrLnBpdGNoID0gcGxheWVyLnBpdGNoO1xuICAgICAgICBway55YXcgPSBwbGF5ZXIueWF3O1xuICAgICAgICBway5oZWFkWWF3ID0gcGxheWVyLmhlYWRZYXc7XG5cbiAgICAgICAgcGsubW9kZSA9IG1vZGU7XG5cbiAgICAgICAgcGsub25Hcm91bmQgPSBwbGF5ZXIuaXNPbkdyb3VuZCgpO1xuXG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgaWYgKG1vZGUgPT09IE1vdmVtZW50VHlwZS5UZWxlcG9ydCkge1xuICAgICAgICAgICAgcGsudGVsZXBvcnRDYXVzZSA9IDA7XG4gICAgICAgICAgICBway50ZWxlcG9ydEl0ZW1JZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBway5yaWRpbmdFbnRpdHlSdW50aW1lSWQgPSBCaWdJbnQoMCk7XG4gICAgICAgIHBrLnRpY2sgPSBCaWdJbnQoMCk7IC8vIFRPRE9cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBjbGllbnQgdG8gdGhlIHBsYXllciBsaXN0IG9mIGV2ZXJ5IHBsYXllciBpbnNpZGVcbiAgICAgKiB0aGUgc2VydmVyIGFuZCBhbHNvIHRvIHRoZSBwbGF5ZXIgaXRzZWxmLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhZGRUb1BsYXllckxpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckxpc3QgPSBuZXcgUGxheWVyTGlzdFBhY2tldCgpO1xuICAgICAgICBwbGF5ZXJMaXN0LnR5cGUgPSBQbGF5ZXJMaXN0QWN0aW9uLlRZUEVfQUREO1xuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IFBsYXllckxpc3RFbnRyeSh7XG4gICAgICAgICAgICB1dWlkOiBVVUlELmZyb21TdHJpbmcodGhpcy5wbGF5ZXIudXVpZCksXG4gICAgICAgICAgICB1bmlxdWVFbnRpdHlpZDogdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnBsYXllci5nZXROYW1lKCksXG4gICAgICAgICAgICB4dWlkOiB0aGlzLnBsYXllci54dWlkLFxuICAgICAgICAgICAgcGxhdGZvcm1DaGF0SWQ6ICcnLCAvLyBUT0RPOiByZWFkIHRoaXMgdmFsdWUgZnJvbSBMb2dpblxuICAgICAgICAgICAgYnVpbGRQbGF0Zm9ybTogdGhpcy5wbGF5ZXIuZGV2aWNlID8gdGhpcy5wbGF5ZXIuZGV2aWNlLm9zIDogLTEsXG4gICAgICAgICAgICBza2luOiB0aGlzLnBsYXllci5za2luISxcbiAgICAgICAgICAgIGlzVGVhY2hlcjogZmFsc2UsIC8vIFRPRE86IGZpZ3VyZSBvdXQgd2hlcmUgdG8gcmVhZCB0ZWFjaGVyIGFuZCBob3N0XG4gICAgICAgICAgICBpc0hvc3Q6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBwbGF5ZXJMaXN0LmVudHJpZXMucHVzaChlbnRyeSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIuYnJvYWRjYXN0UGFja2V0KHBsYXllckxpc3QpO1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckxpc3QoKS5zZXQodGhpcy5wbGF5ZXIudXVpZCwgZW50cnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBwbGF5ZXIgZnJvbSBvdGhlciBwbGF5ZXJzIGxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlRnJvbVBsYXllckxpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wbGF5ZXIudXVpZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICAgICAgcGsudHlwZSA9IFBsYXllckxpc3RBY3Rpb24uVFlQRV9SRU1PVkU7XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgUGxheWVyTGlzdEVudHJ5KHtcbiAgICAgICAgICAgIHV1aWQ6IFVVSUQuZnJvbVN0cmluZyh0aGlzLnBsYXllci5nZXRVVUlEKCkpXG4gICAgICAgIH0pO1xuICAgICAgICBway5lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyTGlzdCgpLmRlbGV0ZSh0aGlzLnBsYXllci51dWlkKTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIHRoZSBmdWxsIHBsYXllciBsaXN0IHRvIHRoZSBwbGF5ZXIuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRQbGF5ZXJMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwbGF5ZXJMaXN0ID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICAgICAgcGxheWVyTGlzdC50eXBlID0gUGxheWVyTGlzdEFjdGlvbi5UWVBFX0FERDtcbiAgICAgICAgcGxheWVyTGlzdC5lbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLnNlcnZlci5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckxpc3QoKS52YWx1ZXMoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwbGF5ZXJMaXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGF3biB0aGUgcGxheWVyIGZvciBhbm90aGVyIHBsYXllclxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYXllciAtIHRoZSBwbGF5ZXIgdG8gc2VuZCB0aGUgQWRkUGxheWVyUGFja2V0IHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRTcGF3bihwbGF5ZXI6IFBsYXllcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXBsYXllci5nZXRVVUlEKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpPy5lcnJvcihgVVVJRCBmb3IgcGxheWVyICR7cGxheWVyLmdldE5hbWUoKX0gaXMgdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwayA9IG5ldyBBZGRQbGF5ZXJQYWNrZXQoKTtcbiAgICAgICAgcGsudXVpZCA9IFVVSUQuZnJvbVN0cmluZyh0aGlzLnBsYXllci5nZXRVVUlEKCkpOyAvLyBUT0RPOiB0ZW1wIHNvbHV0aW9uXG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICBway5uYW1lID0gdGhpcy5wbGF5ZXIuZ2V0TmFtZSgpO1xuXG4gICAgICAgIHBrLnBvc2l0aW9uWCA9IHRoaXMucGxheWVyLmdldFgoKTtcbiAgICAgICAgcGsucG9zaXRpb25ZID0gdGhpcy5wbGF5ZXIuZ2V0WSgpO1xuICAgICAgICBway5wb3NpdGlvblogPSB0aGlzLnBsYXllci5nZXRaKCk7XG5cbiAgICAgICAgLy8gVE9ETzogbW90aW9uXG4gICAgICAgIHBrLm1vdGlvblggPSAwO1xuICAgICAgICBway5tb3Rpb25ZID0gMDtcbiAgICAgICAgcGsubW90aW9uWiA9IDA7XG5cbiAgICAgICAgcGsucGl0Y2ggPSB0aGlzLnBsYXllci5waXRjaDtcbiAgICAgICAgcGsueWF3ID0gdGhpcy5wbGF5ZXIueWF3O1xuICAgICAgICBway5oZWFkWWF3ID0gdGhpcy5wbGF5ZXIuaGVhZFlhdztcblxuICAgICAgICBway5pdGVtID0gdGhpcy5wbGF5ZXIuZ2V0SW52ZW50b3J5KCkuZ2V0SXRlbUluSGFuZCgpO1xuXG4gICAgICAgIHBrLmRldmljZUlkID0gdGhpcy5wbGF5ZXIuZGV2aWNlPy5pZCA/PyAnJztcbiAgICAgICAgcGsubWV0YWRhdGEgPSB0aGlzLnBsYXllci5nZXRNZXRhZGF0YU1hbmFnZXIoKTtcbiAgICAgICAgYXdhaXQgcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgLy8gVE9ETzogYXdhaXQgdGhpcy5zZW5kU2V0dGluZ3MocGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNwYXduIHRoZSBwbGF5ZXIgZW50aXR5IGZyb20gYW5vdGhlciBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZERlc3Bhd24ocGxheWVyOiBQbGF5ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgUmVtb3ZlQWN0b3JQYWNrZXQoKTtcbiAgICAgICAgcGsudW5pcXVlRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTsgLy8gV2UgdXNlIHJ1bnRpbWUgYXMgdW5pcXVlXG4gICAgICAgIGF3YWl0IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRQbGF5U3RhdHVzKHN0YXR1czogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFBsYXlTdGF0dXNQYWNrZXQoKTtcbiAgICAgICAgcGsuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGssIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBraWNrKHJlYXNvbiA9ICd1bmtub3duIHJlYXNvbicpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgRGlzY29ubmVjdFBhY2tldCgpO1xuICAgICAgICBway5za2lwTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICBway5tZXNzYWdlID0gcmVhc29uO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGssIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKCk6IENsaWVudENvbm5lY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF5ZXIoKTogUGxheWVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENoYW5nZURpbWVuc2lvblBhY2tldCwgTGV2ZWxDaHVua1BhY2tldCB9IGZyb20gJy4vbmV0d29yay9QYWNrZXRzJztcbmltcG9ydCB7IEZsYWdUeXBlLCBNZXRhZGF0YUZsYWcgfSBmcm9tICcuL2VudGl0eS9NZXRhZGF0YSc7XG5pbXBvcnQgdHlwZSBDaGF0RXZlbnQgZnJvbSAnLi9ldmVudHMvY2hhdC9DaGF0RXZlbnQnO1xuaW1wb3J0IHR5cGUgQ2h1bmsgZnJvbSAnLi93b3JsZC9jaHVuay9DaHVuayc7XG5pbXBvcnQgdHlwZSB7IENodW5rQ29vcmQgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L05ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCc7XG5pbXBvcnQgdHlwZSBDbGllbnRDb25uZWN0aW9uIGZyb20gJy4vbmV0d29yay9DbGllbnRDb25uZWN0aW9uJztcbmltcG9ydCBDb250YWluZXJFbnRyeSBmcm9tICcuL2ludmVudG9yeS9Db250YWluZXJFbnRyeSc7XG5pbXBvcnQgQ29vcmRpbmF0ZVV0aWxzIGZyb20gJy4vd29ybGQvQ29vcmRpbmF0ZVV0aWxzJztcbmltcG9ydCB0eXBlIERldmljZSBmcm9tICcuL3V0aWxzL0RldmljZSc7XG5pbXBvcnQgRm9ybU1hbmFnZXIgZnJvbSAnLi9mb3JtL0Zvcm1NYW5hZ2VyJztcbmltcG9ydCBHYW1lbW9kZSBmcm9tICcuL3dvcmxkL0dhbWVtb2RlJztcbmltcG9ydCBIdW1hbiBmcm9tICcuL2VudGl0eS9IdW1hbic7XG5pbXBvcnQgdHlwZSB7IEluZXRBZGRyZXNzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuaW1wb3J0IE1vdmVtZW50VHlwZSBmcm9tICcuL25ldHdvcmsvdHlwZS9Nb3ZlbWVudFR5cGUnO1xuaW1wb3J0IFBsYXlTdGF0dXNUeXBlIGZyb20gJy4vbmV0d29yay90eXBlL1BsYXlTdGF0dXNUeXBlJztcbmltcG9ydCBQbGF5ZXJTZXNzaW9uIGZyb20gJy4vbmV0d29yay9QbGF5ZXJTZXNzaW9uJztcbmltcG9ydCBQbGF5ZXJTZXRHYW1lbW9kZUV2ZW50IGZyb20gJy4vZXZlbnRzL3BsYXllci9QbGF5ZXJTZXRHYW1lbW9kZUV2ZW50JztcbmltcG9ydCBQbGF5ZXJUb2dnbGVGbGlnaHRFdmVudCBmcm9tICcuL2V2ZW50cy9wbGF5ZXIvUGxheWVyVG9nZ2xlRmxpZ2h0RXZlbnQnO1xuaW1wb3J0IFBsYXllclRvZ2dsZVNwcmludEV2ZW50IGZyb20gJy4vZXZlbnRzL3BsYXllci9QbGF5ZXJUb2dnbGVTcHJpbnRFdmVudCc7XG5pbXBvcnQgdHlwZSBTa2luIGZyb20gJy4vdXRpbHMvc2tpbi9Ta2luJztcbmltcG9ydCBUZXh0VHlwZSBmcm9tICcuL25ldHdvcmsvdHlwZS9UZXh0VHlwZSc7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi91dGlscy9UaW1lcic7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgV2luZG93TWFuYWdlciBmcm9tICcuL2ludmVudG9yeS9XaW5kb3dNYW5hZ2VyJztcbmltcG9ydCB0eXBlIFdvcmxkIGZyb20gJy4vd29ybGQvV29ybGQnO1xuXG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi9TZXJ2ZXInO1xuXG4vLyBEZWZhdWx0IHNwYXduIHZpZXcgZGlzdGFuY2UgdXNlZCBpbiB2YW5pbGxhXG5leHBvcnQgY29uc3QgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUyA9IDQ7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXllciBleHRlbmRzIEh1bWFuIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IEluZXRBZGRyZXNzO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1Nlc3Npb246IFBsYXllclNlc3Npb247XG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogc3RyaW5nW107XG5cbiAgICAvLyBPbmx5IHVzZWQgZm9yIG1ldHJpY3NcbiAgICBwcml2YXRlIGpvaW5UaW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGF0aW9uXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dzOiBXaW5kb3dNYW5hZ2VyO1xuXG4gICAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgdXNlcm5hbWUgPSB7XG4gICAgICAgIHByZWZpeDogJzwnLFxuICAgICAgICBzdWZmaXg6ICc+JyxcbiAgICAgICAgbmFtZTogJydcbiAgICB9O1xuXG4gICAgcHVibGljIGxvY2FsZSA9ICcnO1xuICAgIHB1YmxpYyByYW5kb21JZCA9IDA7XG5cbiAgICBwdWJsaWMgdXVpZCA9ICcnO1xuICAgIHB1YmxpYyB4dWlkID0gJyc7XG4gICAgcHVibGljIHNraW46IFNraW4gfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyB2aWV3RGlzdGFuY2UgPSAwO1xuICAgIHB1YmxpYyBnYW1lbW9kZSA9IDA7XG5cbiAgICBwdWJsaWMgcGl0Y2ggPSAwO1xuICAgIHB1YmxpYyB5YXcgPSAwO1xuICAgIHB1YmxpYyBoZWFkWWF3ID0gMDtcblxuICAgIHByaXZhdGUgb25Hcm91bmQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHNwcmludGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgZmx5aW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzbmVha2luZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWxsb3dGaWdodCA9IGZhbHNlO1xuXG4gICAgcHVibGljIHBsYXRmb3JtQ2hhdElkID0gJyc7XG5cbiAgICBwdWJsaWMgZGV2aWNlOiBEZXZpY2UgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBjYWNoZVN1cHBvcnQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyByZWFkb25seSBjaHVua1NlbmRRdWV1ZSA9IG5ldyBTZXQ8Q2h1bms+KCk7XG4gICAgcHVibGljIGN1cnJlbnRDaHVuazogYmlnaW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1zOiBGb3JtTWFuYWdlcjtcblxuICAgIHByaXZhdGUgY2hhdEhhbmRsZXI6IChldmVudDogQ2hhdEV2ZW50KSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogUGxheWVyJ3MgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb24sIHdvcmxkOiBXb3JsZCwgc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgc3VwZXIod29ybGQsIHNlcnZlcik7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGNvbm5lY3Rpb24uZ2V0UmFrTmV0U2Vzc2lvbigpLmdldEFkZHJlc3MoKTtcbiAgICAgICAgdGhpcy5uZXR3b3JrU2Vzc2lvbiA9IG5ldyBQbGF5ZXJTZXNzaW9uKHNlcnZlciwgY29ubmVjdGlvbiwgdGhpcyk7XG4gICAgICAgIHRoaXMud2luZG93cyA9IG5ldyBXaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmpvaW5UaW1lci5yZXNldCgpO1xuXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIG1lc3MgOi9cbiAgICAgICAgdGhpcy5jaGF0SGFuZGxlciA9IGFzeW5jIChldnQ6IENoYXRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2dC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHByb3BlciBjaGFubmVsIHN5c3RlbVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0Q2hhbm5lbCgpID09PSAnKi5ldmVyeW9uZScgfHxcbiAgICAgICAgICAgICAgICAoZXZ0LmdldENoYXQoKS5nZXRDaGFubmVsKCkgPT09ICcqLm9wcycgJiYgdGhpcy5pc09wKCkpIHx8XG4gICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRDaGFubmVsKCkgPT09IGAqLnBsYXllci4ke3RoaXMuZ2V0TmFtZSgpfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldE1lc3NhZ2UoKSxcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRUeXBlKCkgYXMgbnVtYmVyIGFzIFRleHRUeXBlLFxuICAgICAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldFBhcmFtZXRlcnMoKSxcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5pc05lZWRzVHJhbnNsYXRpb24oKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VydmVyLmdldEV2ZW50TWFuYWdlcigpLm9uKCdjaGF0JywgdGhpcy5jaGF0SGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRW5hYmxlKCkge1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRQZXJtaXNzaW9uTWFuYWdlcigpLmdldFBlcm1pc3Npb25zKHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IHBsYXllckRhdGEgPSBhd2FpdCB0aGlzLmdldFdvcmxkKCkuZ2V0UGxheWVyRGF0YSh0aGlzKTtcblxuICAgICAgICAvLyB2b2lkIHRoaXMuc2V0R2FtZW1vZGUoR2FtZW1vZGUuZ2V0R2FtZW1vZGVJZChwbGF5ZXJEYXRhLmdhbWVtb2RlKSk7XG4gICAgICAgIC8vIFRPRE86IGNhbGxpbmcgdGhpcyBiZWZvcmUgdGhlIHBsYXllciBpcyBzcGF3bmluZyB3aWxsIGNyZWF0ZSBhbiB1bmRlZmluZWQgYmVoYXZpb3JcbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBTZXRQbGF5ZXJHYW1lVHlwZSBwYWNrZXQgYnJlYWtpbmcgdGhlIGxvZ2luIHNlcXVlbmNlXG4gICAgICAgIC8vIGknbGwga2VlcCB0aGlzIGNvbW1lbnQgd2hpbGUgaXQncyBicm9rZW5cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRYKHBsYXllckRhdGEucG9zaXRpb24ueCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WShwbGF5ZXJEYXRhLnBvc2l0aW9uLnkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFoocGxheWVyRGF0YS5wb3NpdGlvbi56KTtcbiAgICAgICAgdGhpcy5waXRjaCA9IHBsYXllckRhdGEucG9zaXRpb24ucGl0Y2ggPz8gMDtcbiAgICAgICAgdGhpcy55YXcgPSBwbGF5ZXJEYXRhLnBvc2l0aW9uLnlhdyA/PyAwO1xuXG4gICAgICAgIHBsYXllckRhdGEuaW52ZW50b3J5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID1cbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEl0ZW1NYW5hZ2VyKCkuZ2V0SXRlbShpdGVtLmlkKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2soaXRlbS5pZCk7XG5cbiAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldExvZ2dlcigpPy53YXJuKGBJdGVtL2Jsb2NrIHdpdGggaWQgJHtpdGVtLmlkfSBpcyBpbnZhbGlkYCwgJ1BsYXllci9vbkVuYWJsZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nZXRJbnZlbnRvcnkoKS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgIGl0ZW0ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbmV3IENvbnRhaW5lckVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogZW50cnksXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBpdGVtLmNvdW50XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpXG4gICAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgICAgPy5kZWJ1ZyhgKENvbXBsZXRlIHBsYXllciBjcmVhdGlvbiB0b29rICR7dGhpcy5qb2luVGltZXIuc3RvcCgpfSBtcylgLCAnUGxheWVyL29uRW5hYmxlJyk7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25EaXNhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQgJiYgdGhpcy54dWlkKSBhd2FpdCB0aGlzLmdldFdvcmxkKCkuc2F2ZVBsYXllckRhdGEodGhpcyk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldEV2ZW50TWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKCdjaGF0JywgdGhpcy5jaGF0SGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIG1hdGNoIHZhbmlsbGEgYmVoYXZpb3IsIHdpbGwgc2VuZCBjaHVua3NcbiAgICAgKiB3aXRoIGFuIGluaXRpYWwgdmlldyByYWRpdXMgb2YgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEluaXRpYWxTcGF3bkNodW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWluWCA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueCkgLSBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuICAgICAgICBjb25zdCBtaW5aID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy56KSAtIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVM7XG4gICAgICAgIGNvbnN0IG1heFggPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLngpICsgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcbiAgICAgICAgY29uc3QgbWF4WiA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueikgKyBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuXG4gICAgICAgIGNvbnN0IHNhdmVkQ2h1bmtzOiBDaHVua0Nvb3JkW10gPSBbXTtcbiAgICAgICAgY29uc3Qgc2VuZFF1ZXVlOiBBcnJheTxQcm9taXNlPENodW5rPj4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmtYID0gbWluWDsgY2h1bmtYIDw9IG1heFg7ICsrY2h1bmtYKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaHVua1ogPSBtaW5aOyBjaHVua1ogPD0gbWF4WjsgKytjaHVua1opIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB2YW5pbGxhIGRvZXMgbm90IHNlbmQgYWxsIG9mIHRoZW0sIGJ1dCBpbiBhIHJhbmdlXG4gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgaXQgZG9lcyBzZW5kIHRoZW0gZnJvbSB4ID0+IFstMzsgM10gYW5kIHogPT4gWy0zOyAyXVxuICAgICAgICAgICAgICAgIHNhdmVkQ2h1bmtzLnB1c2goeyB4OiBjaHVua1gsIHo6IGNodW5rWiB9KTtcbiAgICAgICAgICAgICAgICBzZW5kUXVldWUucHVzaCh0aGlzLmdldFdvcmxkKCkuZ2V0Q2h1bmsoY2h1bmtYLCBjaHVua1opKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcihWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTLCBzYXZlZENodW5rcyk7XG5cbiAgICAgICAgY29uc3QgZ2V0VW5pcXVlQ2h1bmtzID0gKHNlbmRMaXN0OiBDaHVua0Nvb3JkW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHhTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgICAgICAgIGNvbnN0IHpTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBzZW5kTGlzdCkge1xuICAgICAgICAgICAgICAgIHhTZXQuYWRkKGNvb3JkLngpO1xuICAgICAgICAgICAgICAgIHpTZXQuYWRkKGNvb3JkLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoeFNldC5zaXplICsgelNldC5zaXplKSAvIDIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0VW5pcXVlQ2h1bmtzKHNhdmVkQ2h1bmtzKTsgKytpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUywgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzZW5kUXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZENodW5rKGNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgcGxheWVyJ3MgY3VycmVudCB3b3JsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3b3JsZCAtIHRoZSBuZXcgd29ybGRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0V29ybGQod29ybGQ6IFdvcmxkKSB7XG4gICAgICAgIGNvbnN0IGRpbTAgPSBuZXcgQ2hhbmdlRGltZW5zaW9uUGFja2V0KCk7XG4gICAgICAgIGRpbTAuZGltZW5zaW9uID0gMDtcbiAgICAgICAgZGltMC5wb3NpdGlvbiA9IHRoaXM7XG4gICAgICAgIGRpbTAucmVzcGF3biA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGRpbTEgPSBuZXcgQ2hhbmdlRGltZW5zaW9uUGFja2V0KCk7XG4gICAgICAgIGRpbTEuZGltZW5zaW9uID0gMTtcbiAgICAgICAgZGltMS5wb3NpdGlvbiA9IG5ldyBWZWN0b3IzKDAsIDAsIDApOyAvLyBUT0RPOiBsb2FkIHRoaXMgcHJvcGVybHlcbiAgICAgICAgZGltMS5yZXNwYXduID0gZmFsc2U7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkaW0xKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5QbGF5ZXJTcGF3bik7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXb3JsZCgpLnJlbW92ZUVudGl0eSh0aGlzKTtcbiAgICAgICAgYXdhaXQgd29ybGQuYWRkRW50aXR5KHRoaXMpO1xuICAgICAgICBhd2FpdCBzdXBlci5zZXRXb3JsZC5iaW5kKHRoaXMpKHdvcmxkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAsIDAsIDApKTtcbiAgICAgICAgZm9yIChsZXQgeCA9IC0zOyB4IDwgMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB6ID0gLTM7IHogPCAzOyB6KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IG5ldyBMZXZlbENodW5rUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgcGsuY2xpZW50U3ViQ2h1bmtSZXF1ZXN0c0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBway5jaHVua1ggPSB4OyAvLyBUT0RPXG4gICAgICAgICAgICAgICAgcGsuY2h1bmtaID0gejsgLy8gVE9ET1xuICAgICAgICAgICAgICAgIHBrLmRhdGEgPSBCdWZmZXIuZnJvbSgnJyk7XG4gICAgICAgICAgICAgICAgcGsuc3ViQ2h1bmtDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkaW0wKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kUGxheVN0YXR1cyhQbGF5U3RhdHVzVHlwZS5QbGF5ZXJTcGF3bik7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmsgPSBudWxsO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmNsZWFyQ2h1bmtzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24ubmVlZE5ld0NodW5rcygpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc09ubGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUodGljazogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIENhbGwgc3VwZXIgbWV0aG9kXG4gICAgICAgIGF3YWl0IHN1cGVyLnVwZGF0ZS5iaW5kKHRoaXMpKHRpY2spO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnVwZGF0ZSh0aWNrKTtcblxuICAgICAgICAvLyBUT0RPOiBnZXQgZG9jdW1lbnRhdGlvbiBhYm91dCB0aW1pbmdzIGZyb20gdmFuaWxsYVxuICAgICAgICAvLyAxIHNlY29uZCAvIDIwID0gMSB0aWNrLCAyMCAqIDUgPSAxIHNlY29uZFxuICAgICAgICAvLyAxIHNlY29uZCAqIDYwID0gMSBtaW51dGVcbiAgICAgICAgaWYgKHRpY2sgJSAoMjAgKiA1ICogNjAgKiAxKSA9PT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kVGltZSh0aWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgdGhpcy5jaHVua1NlbmRRdWV1ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKHRoaXMudmlld0Rpc3RhbmNlID8/IFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMsIFtdKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZENodW5rKGNodW5rKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTZW5kUXVldWUuZGVsZXRlKGNodW5rKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBraWNrKHJlYXNvbiA9ICd1bmtub3duIHJlYXNvbicpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LnZlcmJvc2UoYFBsYXllciB3aXRoIGlkIMKnYiR7dGhpcy5nZXRSdW50aW1lSWQoKX3Cp3Igd2FzIGtpY2tlZDogJHtyZWFzb259YCwgJ1BsYXllci9raWNrJyk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24ua2ljayhyZWFzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8qIFxuICAgICAgICAgICAgVE9ET1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpXG4gICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRhcmdldC5nZXROZXR3b3JrU2Vzc2lvbigpLnNlbmRTZXR0aW5ncyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApOyAqL1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIHNhbWUgY2h1bmssLlxuICAgIC8vIFRPRE86IG1vdmUgdG8gd29ybGRcbiAgICBwdWJsaWMgZ2V0UGxheWVyc0luQ2h1bmsoKTogUGxheWVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHBsYXllcikgPT4gcGxheWVyLmdldEN1cnJlbnRDaHVuaygpID09PSB0aGlzLmdldEN1cnJlbnRDaHVuaygpKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB0aGVzZVxuICAgIHB1YmxpYyBhc3luYyBzZW5kU3Bhd24oKSB7fVxuICAgIHB1YmxpYyBhc3luYyBzZW5kRGVzcGF3bigpIHt9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2hhdCBtZXNzYWdlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICB0eXBlOiBUZXh0VHlwZSA9IFRleHRUeXBlLlJhdyxcbiAgICAgICAgcGFyYW1ldGVyczogc3RyaW5nW10gPSBbXSxcbiAgICAgICAgbmVlZHNUcmFuc2xhdGlvbiA9IGZhbHNlXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRPRE86IERvIHRoaXMgcHJvcGVybHkgbGlrZSBqYXZhIGVkaXRpb24sXG4gICAgICAgIC8vIGluIG90aGVyIHdvcmRzLCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgSlNPTiBmb3JtYXR0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE1lc3NhZ2UobWVzc2FnZSwgJycsIHBhcmFtZXRlcnMsIG5lZWRzVHJhbnNsYXRpb24sIHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSB0b2FzdCBub3RpZmljYXRpb24gKGxpa2UgWGJveCBMaXZlIG5vdGlmaWNhdGlvbnMpXG4gICAgICogQHBhcmFtIHRpdGxlIC0gdGhlIHRvYXN0IHRpdGxlXG4gICAgICogQHBhcmFtIGJvZHkgLSB0aGUgdG9hc3QgYm9keVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kVG9hc3QodGl0bGU6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFRvYXN0KHRpdGxlLCBib2R5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0R2FtZW1vZGUobW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclNldEdhbWVtb2RlRXZlbnQodGhpcywgbW9kZSk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclNldEdhbWVtb2RlJywgZXZlbnRdKTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmdhbWVtb2RlID0gZXZlbnQuZ2V0R2FtZW1vZGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kR2FtZW1vZGUodGhpcy5nYW1lbW9kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlIHx8IHRoaXMuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcikgdGhpcy5hbGxvd0ZpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFsbG93RmlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Rmx5aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdhbWVtb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBHYW1lbW9kZS5nZXRHYW1lbW9kZU5hbWUodGhpcy5nYW1lbW9kZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV0d29ya1Nlc3Npb24oKTogUGxheWVyU2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtTZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJuYW1lLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFVzZXJuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnVzZXJuYW1lLnByZWZpeH0ke3RoaXMudXNlcm5hbWUubmFtZX0ke3RoaXMudXNlcm5hbWUuc3VmZml4fWA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBlcm1pc3Npb25zKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFVVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnV1aWQpIHRocm93IG5ldyBFcnJvcigndXVpZCBpcyBtaXNzaW5nIScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnV1aWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFhVSUQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLnh1aWQpIHRocm93IG5ldyBFcnJvcigneHVpZCBpcyBtaXNzaW5nIScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnh1aWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1NYW5hZ2VyKCk6IEZvcm1NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdpbmRvd3MoKTogV2luZG93TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvd3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbG93RmxpZ2h0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxvd0ZpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BsYXllcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGBQbGF5ZXJgIGlzIGFuIG9wZXJhdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgcGxheWVyIGlzIGFuIG9wZXJhdG9yIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXJ2ZXIoKS5nZXRQZXJtaXNzaW9uTWFuYWdlcigpLmlzT3AodGhpcy5nZXROYW1lKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBgUGxheWVyYCBpcyBzcHJpbnRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBwbGF5ZXIgaXMgc3ByaW50aW5nIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NwcmludGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ByaW50aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRTcHJpbnRpbmcoc3ByaW50aW5nOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzcHJpbnRpbmcgPT09IHRoaXMuaXNTcHJpbnRpbmcoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclRvZ2dsZVNwcmludEV2ZW50KHRoaXMsIHNwcmludGluZyk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclRvZ2dsZVNwcmludCcsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zcHJpbnRpbmcgPSBldmVudC5nZXRJc1NwcmludGluZygpO1xuXG4gICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIHB1dCB0aGlzXG4gICAgICAgIHRoaXMuc2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBNZXRhZGF0YUZsYWcuU1BSSU5USU5HLCB0aGlzLmlzU3ByaW50aW5nKCksIEZsYWdUeXBlLkJZVEUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmx5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbHlpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEZseWluZyhmbHlpbmc6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGZseWluZyA9PT0gdGhpcy5pc0ZseWluZygpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5nZXRBbGxvd0ZsaWdodCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZseWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUGxheWVyVG9nZ2xlRmxpZ2h0RXZlbnQodGhpcywgZmx5aW5nKTtcbiAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRFdmVudE1hbmFnZXIoKS5wb3N0KFsncGxheWVyVG9nZ2xlRmxpZ2h0JywgZXZlbnRdKTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmZseWluZyA9IGV2ZW50LmdldElzRmx5aW5nKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU25lYWtpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNuZWFraW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRTbmVha2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zbmVha2luZyA9IHZhbDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPbkdyb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25Hcm91bmQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldE9uR3JvdW5kKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsID09PSB0aGlzLm9uR3JvdW5kKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5vbkdyb3VuZCA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgbm90aWZ5IHRoZSBwbGF5ZXIncyBjbGllbnQgYWJvdXQgdGhlIHBvc2l0aW9uIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIG1vdmVtZW50IHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0UG9zaXRpb24ocG9zaXRpb246IFZlY3RvcjMsIHR5cGU6IE1vdmVtZW50VHlwZSA9IE1vdmVtZW50VHlwZS5Ob3JtYWwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRYKHBvc2l0aW9uLmdldFgoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WShwb3NpdGlvbi5nZXRZKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFoocG9zaXRpb24uZ2V0WigpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5icm9hZGNhc3RNb3ZlKHRoaXMsIHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDdXJyZW50Q2h1bmsoY2h1bms6IGJpZ2ludCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmsgPT09IGNodW5rKSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudENodW5rID0gY2h1bms7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRDaHVuaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENodW5rITtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb2dnZXIsIFBsYXllciwgUGxheWVyU2Vzc2lvbiwgU2VydmVyIH0gZnJvbSAnLi4vJztcblxuaW1wb3J0IHsgRGlzY29ubmVjdFBhY2tldCB9IGZyb20gJy4vUGFja2V0cyc7XG5pbXBvcnQgTWluZWNyYWZ0U2Vzc2lvbiBmcm9tICcuL01pbmVjcmFmdFNlc3Npb24nO1xuaW1wb3J0IHR5cGUgeyBSYWtOZXRTZXNzaW9uIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIHRoZSBwbGF5ZXIgY3JlYXRpb24gaXRzZWxmLCB2ZXJ5IGhlbHBmdWwgYXNcbiAqIGl0IGhlbHBzIHRvIG5vdCB3YXN0ZSByZXNvdXJjZXMgaW4gY2FzZSB0aGUgY2xpZW50IHRyeWluZyB0byBjb25uZWN0IGlzIHNpbXBseVxuICogb3V0ZGF0ZWQgb3Igc2VuZHMgaW52YWxpZCBkYXRhIGR1cmluZyB0aGUgbG9naW4gaGFuZHNoYWtlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRDb25uZWN0aW9uIGV4dGVuZHMgTWluZWNyYWZ0U2Vzc2lvbiB7XG4gICAgcHJpdmF0ZSBwbGF5ZXJTZXNzaW9uOiBQbGF5ZXJTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGhhc0NvbXByZXNzaW9uID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2Vzc2lvbjogUmFrTmV0U2Vzc2lvbiwgbG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgICAgIHN1cGVyKHNlc3Npb24sIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmVyIC0gdGhlIHNlcnZlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBwbGF5ZXIgLSB0aGUgcGxheWVyIGluc3RhbmNlXG4gICAgICogQHJldHVybnMgdGhlIG5ldyBwbGF5ZXIgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0UGxheWVyQ29ubmVjdGlvbihzZXJ2ZXI6IFNlcnZlciwgcGxheWVyOiBQbGF5ZXIpOiBQbGF5ZXJTZXNzaW9uIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMucGxheWVyU2Vzc2lvbiA9PT0gbnVsbCwgJ1BsYXllciBzZXNzaW9uIHdhcyBhbHJlYWR5IGNyZWF0ZWQnKTtcblxuICAgICAgICB0aGlzLnBsYXllclNlc3Npb24gPSBuZXcgUGxheWVyU2Vzc2lvbihzZXJ2ZXIsIHRoaXMsIHBsYXllcik7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllclNlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QocmVhc29uID0gJ2Rpc2Nvbm5lY3QuZGlzY29ubmVjdGVkJywgaGlkZVJlYXNvbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcbiAgICAgICAgcGFja2V0LnNraXBNZXNzYWdlID0gaGlkZVJlYXNvbjtcbiAgICAgICAgcGFja2V0Lm1lc3NhZ2UgPSByZWFzb247XG4gICAgICAgIHZvaWQgdGhpcy5zZW5kRGF0YVBhY2tldChwYWNrZXQpO1xuXG4gICAgICAgIC8vIEZvcmNlIFJha05ldCB0byByZW1vdmUgdGhlIHNlc3Npb25cbiAgICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdGhlIGRlYWQgc2Vzc2lvblxuICAgICAgICB0aGlzLnJha1Nlc3Npb24uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF5ZXJTZXNzaW9uKCk6IFBsYXllclNlc3Npb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyU2Vzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmFrTmV0U2Vzc2lvbigpOiBSYWtOZXRTZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFrU2Vzc2lvbjtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBIYW5kbGVycyBmcm9tICcuL0hhbmRsZXJzJztcbmltcG9ydCAqIGFzIFBhY2tldHMgZnJvbSAnLi9QYWNrZXRzJztcblxuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IFBhY2tldEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL1BhY2tldEhhbmRsZXInO1xuaW1wb3J0IHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLyc7XG5pbXBvcnQgUHJlTG9naW5QYWNrZXRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9QcmVMb2dpblBhY2tldEhhbmRsZXInO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi4vdXRpbHMvVGltZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWNrZXRSZWdpc3RyeSB7XG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IFNlcnZlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldHM6IE1hcDxudW1iZXIsIHR5cGVvZiBQYWNrZXRzLkRhdGFQYWNrZXQ+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IE1hcDxudW1iZXIsIFBhY2tldEhhbmRsZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRW5hYmxlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGFja2V0cygpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVySGFuZGxlcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25EaXNhYmxlKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFja2V0cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgcGFja2V0LlxuICAgICAqIEBwYXJhbSBwYWNrZXQgdGhlIHBhY2tldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJQYWNrZXQocGFja2V0OiB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhY2tldHMuaGFzKHBhY2tldC5OZXRJRCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBhY2tldCAke3BhY2tldC5uYW1lfSBpcyB0cnlpbmcgdG8gdXNlIGlkICR7cGFja2V0Lk5ldElELnRvU3RyaW5nKDE2KX0gd2hpY2ggYWxyZWFkeSBleGlzdHMhYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnBhY2tldHMuc2V0KHBhY2tldC5OZXRJRCwgcGFja2V0KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCk/LmRlYnVnKGBQYWNrZXQgd2l0aCBpZCDCp2Ike3BhY2tldC5uYW1lfcKnciByZWdpc3RlcmVkYCwgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVyUGFja2V0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcGFja2V0IGJ5IGl0J3MgbmV0d29yayBJRC5cbiAgICAgKiBAcGFyYW0gaWQgdGhlIE5ldElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXQoaWQ6IG51bWJlcik6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5wYWNrZXRzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrZXQgd2l0aCBpZCAke2lkfSFgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKiBAcGFyYW0gaWQgdGhlIE5ldElELlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVQYWNrZXQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnBhY2tldHMuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkOiBudW1iZXIsIGhhbmRsZXI6IFBhY2tldEhhbmRsZXI8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEhhbmRsZXIgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzLnNldChpZCwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgID8uZGVidWcoYEhhbmRsZXIgd2l0aCBpZCDCp2Ike2hhbmRsZXIuY29uc3RydWN0b3IubmFtZX3Cp3IgcmVnaXN0ZXJlZGAsICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlckhhbmRsZXInKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SGFuZGxlcihpZDogbnVtYmVyKTogUGFja2V0SGFuZGxlcjxhbnk+IHwgUHJlTG9naW5QYWNrZXRIYW5kbGVyPGFueT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuaGFzKGlkKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhhbmRsZXIgd2l0aCBpZCAke2lkLnRvU3RyaW5nKDE2KX0hYCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KGlkKSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgdHdvIGhhbmRsZXJzLlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGV4dGVuZCBhIGhhbmRsZXIgd2l0aG91dCBhY3R1YWxseSByZXBsYWNpbmcgaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgZmlyc3QgaGFuZGxlciwgZXhlY3V0ZWQgZmlyc3QuXG4gICAgICogQHBhcmFtIGhhbmRsZXIyIHRoZSBzZWNvbmQgaGFuZGxlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kSGFuZGxlcihoYW5kbGVyOiBQYWNrZXRIYW5kbGVyPGFueT4sIGhhbmRsZXIyOiBQYWNrZXRIYW5kbGVyPGFueT4pOiBQYWNrZXRIYW5kbGVyPGFueT4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgKGNsYXNzIEhhbmRsZXIge1xuICAgICAgICAgICAgcHVibGljIGFzeW5jIGhhbmRsZShwYWNrZXQ6IGFueSwgc2VydmVyOiBTZXJ2ZXIsIHNlc3Npb246IFBsYXllclNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZShwYWNrZXQsIHNlcnZlciwgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcjIuaGFuZGxlKHBhY2tldCwgc2VydmVyLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4gcmVzIGFzIFBhY2tldEhhbmRsZXI8YW55PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBoYW5kbGVyIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqIEBwYXJhbSBpZCB0aGUgaGFuZGxlciBpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlSGFuZGxlcihpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEeW5hbWljYWxseSByZWdpc3RlciBhbGwgcGFja2V0cyBleHBvcnRlZCBieSAnLi9Qcm90b2NvbCcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBhY2tldHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAgICAgLy8gRHluYW1pY2FsbHkgcmVnaXN0ZXIgcGFja2V0c1xuICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGlnbm9yZSBEYXRhUGFja2V0ICYgQmF0Y2hQYWNrZXRcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoUGFja2V0cylcbiAgICAgICAgICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUubmFtZSAhPT0gJ0RhdGFQYWNrZXQnICYmIHZhbHVlLm5hbWUgIT09ICdCYXRjaFBhY2tldCcpXG4gICAgICAgICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHRoaXMucmVnaXN0ZXJQYWNrZXQodmFsdWUpKTtcblxuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LnZlcmJvc2UoXG4gICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgwqdiJHt0aGlzLnBhY2tldHMuc2l6ZX3Cp3Igb2YgwqdiJHtcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbShPYmplY3Qua2V5cyhJZGVudGlmaWVycykpLmxlbmd0aCAtIDJcbiAgICAgICAgICAgICAgICB9wqdyIHBhY2tldChzKSAodG9vayAke3RpbWVyLnN0b3AoKX0gbXMpIWAsXG4gICAgICAgICAgICAgICAgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVyUGFja2V0cydcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYWxsIGhhbmRsZXJzIGV4cG9ydGVkIGJ5ICcuL0hhbmRsZXJzJy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVySGFuZGxlcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAgICAgLy8gRHluYW1pY2FsbHkgcmVnaXN0ZXIgaGFuZGxlcnNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoSGFuZGxlcnMpLm1hcCgoWywgdmFsdWVdKSA9PiB0aGlzLnJlZ2lzdGVySGFuZGxlcih2YWx1ZS5OZXRJRCEsIG5ldyAodmFsdWUgYXMgYW55KSgpKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5oYW5kbGVycy5zaXplfcKnciBwYWNrZXQgaGFuZGxlcihzKSAodG9vayAke3RpbWVyLnN0b3AoKX0gbXMpIWAsXG4gICAgICAgICAgICAgICAgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVySGFuZGxlcnMnXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgcGFja2V0cyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFja2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGhhbmRsZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUmFrTmV0TGlzdGVuZXIgfSBmcm9tICdAanNwcmlzbWFyaW5lL3Jha25ldCc7XG5pbXBvcnQgQ2hhdCwgeyBDaGF0VHlwZSB9IGZyb20gJy4vY2hhdC9DaGF0JztcbmltcG9ydCBCYW5NYW5hZ2VyIGZyb20gJy4vYmFuL0Jhbk1hbmFnZXInO1xuaW1wb3J0IEJhdGNoUGFja2V0IGZyb20gJy4vbmV0d29yay9wYWNrZXQvQmF0Y2hQYWNrZXQnO1xuaW1wb3J0IEJsb2NrTWFuYWdlciBmcm9tICcuL2Jsb2NrL0Jsb2NrTWFuYWdlcic7XG5pbXBvcnQgeyBCbG9ja01hcHBpbmdzIH0gZnJvbSAnLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCBDaGF0RXZlbnQgZnJvbSAnLi9ldmVudHMvY2hhdC9DaGF0RXZlbnQnO1xuaW1wb3J0IENoYXRNYW5hZ2VyIGZyb20gJy4vY2hhdC9DaGF0TWFuYWdlcic7XG5pbXBvcnQgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuL25ldHdvcmsvQ2xpZW50Q29ubmVjdGlvbic7XG5pbXBvcnQgQ29tbWFuZE1hbmFnZXIgZnJvbSAnLi9jb21tYW5kL0NvbW1hbmRNYW5hZ2VyJztcbmltcG9ydCBDb25zb2xlIGZyb20gJy4vQ29uc29sZSc7XG5pbXBvcnQgdHlwZSB7IERhdGFQYWNrZXQgfSBmcm9tICcuL25ldHdvcmsvUGFja2V0cyc7XG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tICcuL2V2ZW50cy9FdmVudE1hbmFnZXInO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4vbmV0d29yay9JZGVudGlmaWVycyc7XG5pbXBvcnQgSXRlbU1hbmFnZXIgZnJvbSAnLi9pdGVtL0l0ZW1NYW5hZ2VyJztcbmltcG9ydCBQYWNrZXRSZWdpc3RyeSBmcm9tICcuL25ldHdvcmsvUGFja2V0UmVnaXN0cnknO1xuaW1wb3J0IFBlcm1pc3Npb25NYW5hZ2VyIGZyb20gJy4vcGVybWlzc2lvbi9QZXJtaXNzaW9uTWFuYWdlcic7XG5pbXBvcnQgUGx1Z2luTWFuYWdlciBmcm9tICcuL3BsdWdpbi9QbHVnaW5NYW5hZ2VyJztcbmltcG9ydCBRdWVyeU1hbmFnZXIgZnJvbSAnLi9xdWVyeS9RdWVyeU1hbmFnZXInO1xuaW1wb3J0IFJha25ldENvbm5lY3RFdmVudCBmcm9tICcuL2V2ZW50cy9yYWtuZXQvUmFrbmV0Q29ubmVjdEV2ZW50JztcbmltcG9ydCBSYWtuZXREaXNjb25uZWN0RXZlbnQgZnJvbSAnLi9ldmVudHMvcmFrbmV0L1Jha25ldERpc2Nvbm5lY3RFdmVudCc7XG5pbXBvcnQgUmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0RXZlbnQgZnJvbSAnLi9ldmVudHMvcmFrbmV0L1Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldEV2ZW50JztcbmltcG9ydCBTZXNzaW9uTWFuYWdlciBmcm9tICcuL1Nlc3Npb25NYW5hZ2VyJztcbmltcG9ydCB7IFRpY2tFdmVudCB9IGZyb20gJy4vZXZlbnRzL0V2ZW50cyc7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi91dGlscy9UaW1lcic7XG5pbXBvcnQgV29ybGRNYW5hZ2VyIGZyb20gJy4vd29ybGQvV29ybGRNYW5hZ2VyJztcblxuaW1wb3J0IHR5cGUgQ29uZmlnIGZyb20gJy4vY29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgdHlwZSBMb2dnZXJCdWlsZGVyIGZyb20gJy4vdXRpbHMvTG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgUmFrTmV0U2Vzc2lvbiwgSW5ldEFkZHJlc3MgfSBmcm9tICdAanNwcmlzbWFyaW5lL3Jha25ldCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlciB7XG4gICAgcHJpdmF0ZSB2ZXJzaW9uITogc3RyaW5nO1xuICAgIHByaXZhdGUgcmFrbmV0ITogUmFrTmV0TGlzdGVuZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlckJ1aWxkZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IENvbmZpZztcbiAgICBwcml2YXRlIHRwcyA9IDIwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uc29sZTogQ29uc29sZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TWFuYWdlciA9IG5ldyBFdmVudE1hbmFnZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldFJlZ2lzdHJ5OiBQYWNrZXRSZWdpc3RyeTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25NYW5hZ2VyID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYW5hZ2VyOiBQbHVnaW5NYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZE1hbmFnZXI6IENvbW1hbmRNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ybGRNYW5hZ2VyOiBXb3JsZE1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpdGVtTWFuYWdlcjogSXRlbU1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja01hbmFnZXI6IEJsb2NrTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5TWFuYWdlcjogUXVlcnlNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhdE1hbmFnZXI6IENoYXRNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbk1hbmFnZXI6IFBlcm1pc3Npb25NYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFuTWFuYWdlcjogQmFuTWFuYWdlcjtcbiAgICBwcml2YXRlIHN0b3BwaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB0aWNrZXJUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNSU5FQ1JBRlRfVElDS19USU1FX01TID0gMTAwMCAvIDIwO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBTZXJ2ZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoeyBsb2dnZXIsIGNvbmZpZywgdmVyc2lvbiB9OiB7IGxvZ2dlcj86IExvZ2dlckJ1aWxkZXI7IGNvbmZpZzogQ29uZmlnOyB2ZXJzaW9uOiBzdHJpbmcgfSkge1xuICAgICAgICBjb25zdCBhZHZlcnRpc2VkVmVyc2lvbiA9XG4gICAgICAgICAgICBJZGVudGlmaWVycy5NaW5lY3JhZnRWZXJzaW9ucy5sZW5ndGggPD0gMVxuICAgICAgICAgICAgICAgID8gYMKnZXYke0lkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmF0KDApfcKncmBcbiAgICAgICAgICAgICAgICA6IGDCp2V2JHtJZGVudGlmaWVycy5NaW5lY3JhZnRWZXJzaW9ucy5hdCgwKX3Cp3ItwqdldiR7SWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoLTEpfcKncmA7XG5cbiAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFN0YXJ0aW5nIEpTUHJpc21hcmluZSBzZXJ2ZXIgdmVyc2lvbiDCp2V2JHt2ZXJzaW9ufcKnciBmb3IgTWluZWNyYWZ0OiBCZWRyb2NrIEVkaXRpb24gJHthZHZlcnRpc2VkVmVyc2lvbn0gKHByb3RvY29sIHZlcnNpb24gwqdlJHtJZGVudGlmaWVycy5Qcm90b2NvbH3Cp3IpYCxcbiAgICAgICAgICAgICdTZXJ2ZXInXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIhO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5jb25zb2xlID0gbmV3IENvbnNvbGUodGhpcyk7XG4gICAgICAgIHRoaXMucGFja2V0UmVnaXN0cnkgPSBuZXcgUGFja2V0UmVnaXN0cnkodGhpcyk7XG4gICAgICAgIHRoaXMuaXRlbU1hbmFnZXIgPSBuZXcgSXRlbU1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmxvY2tNYW5hZ2VyID0gbmV3IEJsb2NrTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy53b3JsZE1hbmFnZXIgPSBuZXcgV29ybGRNYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLnBsdWdpbk1hbmFnZXIgPSBuZXcgUGx1Z2luTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5xdWVyeU1hbmFnZXIgPSBuZXcgUXVlcnlNYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLmNoYXRNYW5hZ2VyID0gbmV3IENoYXRNYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25NYW5hZ2VyID0gbmV3IFBlcm1pc3Npb25NYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLmJhbk1hbmFnZXIgPSBuZXcgQmFuTWFuYWdlcih0aGlzKTtcblxuICAgICAgICBTZXJ2ZXIuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25FbmFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvbk1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW5NYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYmFuTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLml0ZW1NYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYmxvY2tNYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWFuZE1hbmFnZXIub25FbmFibGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uRGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tYW5kTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ibG9ja01hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaXRlbU1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYmFuTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW5NYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25NYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBhY2tldFJlZ2lzdHJ5Lm9uRGlzYWJsZSgpO1xuICAgICAgICB0aGlzLmNvbmZpZy5vbkRpc2FibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3RzdHJhcChzZXJ2ZXJJcCA9ICcwLjAuMC4wJywgcG9ydCA9IDE5MTMyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub25FbmFibGUoKTtcbiAgICAgICAgQmxvY2tNYXBwaW5ncy5pbml0TWFwcGluZ3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JsZE1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYWNrZXRSZWdpc3RyeS5vbkVuYWJsZSgpO1xuXG4gICAgICAgIHRoaXMucmFrbmV0ID0gbmV3IFJha05ldExpc3RlbmVyKHRoaXMuZ2V0Q29uZmlnKCkuZ2V0TWF4UGxheWVycygpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMucmFrbmV0LnN0YXJ0KHNlcnZlcklwLCBwb3J0KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignb3BlbkNvbm5lY3Rpb24nLCBhc3luYyAoc2Vzc2lvbjogUmFrTmV0U2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUmFrbmV0Q29ubmVjdEV2ZW50KHNlc3Npb24pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgncmFrbmV0Q29ubmVjdCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvbi5nZXRBZGRyZXNzKCkudG9Ub2tlbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbk1hbmFnZXIuaGFzKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQW5vdGhlciBjbGllbnQgd2l0aCB0b2tlbiAoJHt0b2tlbn0pIGlzIGFscmVhZHkgY29ubmVjdGVkIWAsXG4gICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL29wZW5Db25uZWN0aW9uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNjb25uZWN0KCdBbHJlYWR5IGNvbm5lY3RlZCBmcm9tIGFub3RoZXIgbG9jYXRpb24nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHt0b2tlbn0gaXMgYXR0ZW1wdGluZyB0byBjb25uZWN0YCwgJ1NlcnZlci9saXN0ZW4vb3BlbkNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbk1hbmFnZXIuYWRkKHRva2VuLCBuZXcgQ2xpZW50Q29ubmVjdGlvbihzZXNzaW9uLCB0aGlzLmxvZ2dlcikpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgTmV3IGNvbm5lY3Rpb24gaGFuZGxpbmcgdG9vayAke3RpbWVyLnN0b3AoKX0gbXNgLCAnU2VydmVyL2xpc3Rlbi9vcGVuQ29ubmVjdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignY2xvc2VDb25uZWN0aW9uJywgYXN5bmMgKGluZXRBZGRyOiBJbmV0QWRkcmVzcywgcmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFJha25ldERpc2Nvbm5lY3RFdmVudChpbmV0QWRkciwgcmVhc29uKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3Jha25ldERpc2Nvbm5lY3QnLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBpbmV0QWRkci50b1Rva2VuKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0UGxheWVyKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIC8vIERlLXNwYXduIHRoZSBwbGF5ZXIgdG8gYWxsIG9ubGluZSBwbGF5ZXJzXG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkucmVtb3ZlRnJvbVBsYXllckxpc3QoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG9ubGluZVBsYXllciBvZiB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldEFsbFBsYXllcnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kRGVzcGF3bihvbmxpbmVQbGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBmYWlsIGF0IGRlY29kaW5nIHRoZSB1c2VybmFtZSBmb3Igd2hhdGV2ZXIgcmVhc29uXG4gICAgICAgICAgICAgICAgaWYgKHBsYXllci5nZXROYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5ub3VuY2UgZGlzY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDaGF0RXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYMKnZSVtdWx0aXBsYXllci5wbGF5ZXIubGVmdGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXllci5nZXROYW1lKCldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyouZXZlcnlvbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXRUeXBlLlRSQU5TTEFUSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ2NoYXQnLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLm9uRGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5nZXRXb3JsZCgpLnJlbW92ZUVudGl0eShwbGF5ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbk1hbmFnZXIucmVtb3ZlKHRva2VuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgcmVtb3ZlIGNvbm5lY3Rpb24gZnJvbSBub24tZXhpc3RpbmcgcGxheWVyICgke3Rva2VufSlgLFxuICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXREaXNjb25uZWN0J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dG9rZW59IGRpc2Nvbm5lY3RlZCBkdWUgdG8gJHtyZWFzb259YCwgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RGlzY29ubmVjdCcpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIGRlc3RydWN0aW9uIHRvb2sgYWJvdXQgJHtEYXRlLm5vdygpIC0gdGltZX0gbXNgLFxuICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignZW5jYXBzdWxhdGVkJywgYXN5bmMgKHBhY2tldDogYW55LCBpbmV0QWRkcjogSW5ldEFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFJha25ldEVuY2Fwc3VsYXRlZFBhY2tldEV2ZW50KGluZXRBZGRyLCBwYWNrZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgncmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0JywgZXZlbnQpO1xuXG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbjogQ2xpZW50Q29ubmVjdGlvbiB8IG51bGw7XG4gICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb24gPSB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldChpbmV0QWRkci50b1Rva2VuKCkpID8/IG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEdvdCBhIHBhY2tldCBmcm9tIGEgY2xvc2VkIGNvbm5lY3Rpb24gKCR7aW5ldEFkZHIudG9Ub2tlbigpfSlgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCBiYXRjaCBjb250ZW50IGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoZWQgPSBuZXcgQmF0Y2hQYWNrZXQocGFja2V0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJhdGNoZWQuY29tcHJlc3NlZCA9IGNvbm5lY3Rpb24uaGFzQ29tcHJlc3Npb247XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIGFsbCBwYWNrZXRzIGluc2lkZSBiYXRjaCBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJ1ZiBvZiBhd2FpdCBiYXRjaGVkLmFzeW5jRGVjb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlkID0gYnVmWzBdITtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFja2V0UmVnaXN0cnkuZ2V0UGFja2V0cygpLmhhcyhwaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYWNrZXQgMHgke3BpZC50b1N0cmluZygxNil9IGlzbid0IGltcGxlbWVudGVkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcGFja2V0IGZyb20gcmVnaXN0cnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3ICh0aGlzLnBhY2tldFJlZ2lzdHJ5LmdldFBhY2tldHMoKS5nZXQocGlkKSEpKGJ1Zik7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC5kZWNvZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB3aGlsZSBkZWNvZGluZyBwYWNrZXQ6ICR7cGFja2V0LmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnBhY2tldFJlZ2lzdHJ5LmdldEhhbmRsZXIocGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnNpbGx5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBSZWNlaXZlZCDCp2Ike3BhY2tldC5jb25zdHJ1Y3Rvci5uYW1lfcKnciBwYWNrZXRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAoaGFuZGxlciBhcyBhbnkpLmhhbmRsZShwYWNrZXQsIHRoaXMsIGNvbm5lY3Rpb24uZ2V0UGxheWVyU2Vzc2lvbigpID8/IGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEhhbmRsZXIgZXJyb3IgJHtwYWNrZXQuY29uc3RydWN0b3IubmFtZX0taGFuZGxlcjogKCR7ZXJyb3J9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbigncmF3JywgYXN5bmMgKGJ1ZmZlcjogQnVmZmVyLCBpbmV0QWRkcjogSW5ldEFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeU1hbmFnZXIub25SYXcoYnVmZmVyLCBpbmV0QWRkcik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYXcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBRdWVyeU1hbmFnZXIgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCwgJ1NlcnZlci9saXN0ZW4vcmF3Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IGNhbGN1bGF0ZSBUUFMuXG4gICAgICAgIGxldCB0aWNrQ291bnQgPSAwO1xuICAgICAgICBjb25zdCB0aWNrID0gKCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFRpY2tFdmVudCh0aWNrQ291bnQpO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgndGljaycsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd29ybGQgb2YgdGhpcy53b3JsZE1hbmFnZXIuZ2V0V29ybGRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCB3b3JsZC51cGRhdGUoZXZlbnQuZ2V0VGljaygpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICArK3RpY2tDb3VudDtcbiAgICAgICAgICAgICAgICB0aWNrKCk7XG4gICAgICAgICAgICB9LCBTZXJ2ZXIuTUlORUNSQUZUX1RJQ0tfVElNRV9NUyk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGlja2luZ1xuICAgICAgICB0aGlzLnRpY2tlclRpbWVyID0gdGljaygpO1xuICAgICAgICB0aGlzLnRpY2tlclRpbWVyLnVucmVmKCk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSlNQcmlzbWFyaW5lIGlzIG5vdyBsaXN0ZW5pbmcgb24gcG9ydCDCp2Ike3BvcnR9YCwgJ1NlcnZlci9saXN0ZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaWxscyB0aGUgc2VydmVyIGFzeW5jaHJvbm91c2x5LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogeyB3aXRob3V0U2F2aW5nPzogYm9vbGVhbjsgY3Jhc2g/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdG9wcGluZyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnU3RvcHBpbmcgc2VydmVyJywgJ1NlcnZlci9raWxsJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc29sZS5vbkRpc2FibGUoKTtcblxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGlja2VyVGltZXIpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBLaWNrIGFsbCBvbmxpbmUgcGxheWVyc1xuICAgICAgICAgICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRBbGxQbGF5ZXJzKCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIua2ljaygnU2VydmVyIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2F2ZSBhbGwgd29ybGRzXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnM/LndpdGhvdXRTYXZpbmcpIGF3YWl0IHRoaXMud29ybGRNYW5hZ2VyLnNhdmUoKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy53b3JsZE1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uRGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5yYWtuZXQua2lsbCgpOyAvLyB0aGlzLnJha25ldCBtaWdodCBiZSB1bmRlZmluZWQgaWYgd2Uga2lsbCB0aGUgc2VydmVyIHJlYWxseSBlYXJseVxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KG9wdGlvbnM/LmNyYXNoID8gMSA6IDApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIva2lsbCcpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJyb2FkY2FzdFBhY2tldDxUIGV4dGVuZHMgRGF0YVBhY2tldD4oZGF0YVBhY2tldDogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBNYXliZSBpIGNhbiBpbXByb3ZlIHRoaXMgYnkgdXNpbmcgdGhlIFVEUCBicm9hZGNhc3QsIGFsbCB1bmNvbm5lY3RlZCBjbGllbnRzXG4gICAgICAgIC8vIHdpbGwgaWdub3JlIHRoZSBjb25uZWN0ZWQgcGFja2V0IHByb2JhYmx5LCBidXQgbWF5IGNhdXNlIGlzc3Vlcy5cbiAgICAgICAgZm9yIChjb25zdCBvbmxpbmVQbGF5ZXIgb2YgdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRBbGxQbGF5ZXJzKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9ubGluZVBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkYXRhUGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldElkZW50aWZpZXJzKCkge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcXVlcnkgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWVyeU1hbmFnZXIoKTogUXVlcnlNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbW1hbmQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb21tYW5kTWFuYWdlcigpOiBDb21tYW5kTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBsYXllciBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFNlc3Npb25NYW5hZ2VyKCk6IFNlc3Npb25NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd29ybGQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRXb3JsZE1hbmFnZXIoKTogV29ybGRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGl0ZW0gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJdGVtTWFuYWdlcigpOiBJdGVtTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJsb2NrIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tNYW5hZ2VyKCk6IEJsb2NrTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsb2dnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TG9nZ2VyKCk6IExvZ2dlckJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFja2V0IHJlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhY2tldFJlZ2lzdHJ5KCk6IFBhY2tldFJlZ2lzdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0UmVnaXN0cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmFrbmV0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldFJha25ldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFrbmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBsdWdpbiBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFBsdWdpbk1hbmFnZXIoKTogUGx1Z2luTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZXZlbnQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFdmVudE1hbmFnZXIoKTogRXZlbnRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNoYXQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDaGF0TWFuYWdlcigpOiBDaGF0TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25maWcoKTogQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbnNvbGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uc29sZSgpOiBDb25zb2xlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc29sZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwZXJtaXNzaW9uIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGVybWlzc2lvbk1hbmFnZXIoKTogUGVybWlzc2lvbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYW4gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCYW5NYW5hZ2VyKCk6IEJhbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iYW5NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBQcmlzbWFyaW5lIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldFNlcnZlcigpOiBTZXJ2ZXIge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFRQU1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUUFMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHBzO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJjbWQiLCJwYXJhbWV0ZXJzIiwiZXZlbnQiLCJwYWNrZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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