velocious 1.0.562 → 1.0.563
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.
- package/README.md +3 -1
- package/build/configuration-types.js +1 -0
- package/build/configuration.js +44 -3
- package/build/http-server/client/websocket-session.js +3 -3
- package/build/http-server/client-delivery-queue.js +168 -0
- package/build/http-server/server-client.js +9 -0
- package/build/http-server/websocket-events-host.js +42 -12
- package/build/http-server/worker-handler/in-process.js +53 -14
- package/build/http-server/worker-handler/index.js +88 -18
- package/build/http-server/worker-handler/worker-thread.js +2 -2
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +34 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +40 -4
- package/build/src/http-server/client/websocket-session.js +4 -4
- package/build/src/http-server/client-delivery-queue.d.ts +121 -0
- package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
- package/build/src/http-server/client-delivery-queue.js +152 -0
- package/build/src/http-server/server-client.d.ts +6 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +10 -1
- package/build/src/http-server/websocket-events-host.d.ts +15 -4
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +39 -13
- package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +50 -14
- package/build/src/http-server/worker-handler/index.d.ts +36 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +82 -18
- package/build/src/http-server/worker-handler/worker-thread.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/configuration-types.js +1 -0
- package/src/configuration.js +44 -3
- package/src/http-server/client/websocket-session.js +3 -3
- package/src/http-server/client-delivery-queue.js +168 -0
- package/src/http-server/server-client.js +9 -0
- package/src/http-server/websocket-events-host.js +42 -12
- package/src/http-server/worker-handler/in-process.js +53 -14
- package/src/http-server/worker-handler/index.js +88 -18
- package/src/http-server/worker-handler/worker-thread.js +2 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import { ensureError } from "typanic";
|
|
3
3
|
import Logger from "../../logger.js";
|
|
4
|
+
import ClientDeliveryQueue from "../client-delivery-queue.js";
|
|
4
5
|
import { Worker } from "worker_threads";
|
|
5
6
|
import websocketEventsHost from "../websocket-events-host.js";
|
|
6
7
|
/**
|
|
@@ -50,7 +51,7 @@ export default class VelociousHttpServerWorker {
|
|
|
50
51
|
* Narrows the runtime value to the documented type.
|
|
51
52
|
* @type {Map<number, {resolve: (snapshot: Record<string, ?>) => void}>} */
|
|
52
53
|
this._debugSnapshotRequests = new Map();
|
|
53
|
-
/** @type {Map<number,
|
|
54
|
+
/** @type {Map<number, ClientDeliveryQueue>} */
|
|
54
55
|
this._clientDeliveryQueues = new Map();
|
|
55
56
|
}
|
|
56
57
|
start() {
|
|
@@ -101,6 +102,7 @@ export default class VelociousHttpServerWorker {
|
|
|
101
102
|
if (!this.clients[clientCount] && !this._clientDeliveryQueues.has(clientCount))
|
|
102
103
|
return;
|
|
103
104
|
delete this.clients[clientCount];
|
|
105
|
+
this._clientDeliveryQueues.get(clientCount)?.destroy();
|
|
104
106
|
this._clientDeliveryQueues.delete(clientCount);
|
|
105
107
|
this.worker?.postMessage({ command: "clientAbort", clientCount });
|
|
106
108
|
}
|
|
@@ -143,6 +145,10 @@ export default class VelociousHttpServerWorker {
|
|
|
143
145
|
_closeAllClients() {
|
|
144
146
|
const clients = Object.values(this.clients);
|
|
145
147
|
this.clients = {};
|
|
148
|
+
const deliveryQueues = this._clientDeliveryQueues;
|
|
149
|
+
this._clientDeliveryQueues = new Map();
|
|
150
|
+
for (const queue of deliveryQueues.values())
|
|
151
|
+
queue.destroy();
|
|
146
152
|
for (const client of clients) {
|
|
147
153
|
try {
|
|
148
154
|
void client.end();
|
|
@@ -161,6 +167,7 @@ export default class VelociousHttpServerWorker {
|
|
|
161
167
|
* @param {string} [data.filePath] - File path.
|
|
162
168
|
* @param {boolean} [data.sendBody] - Whether to send the file body.
|
|
163
169
|
* @param {number} [data.transferId] - File transfer id.
|
|
170
|
+
* @param {boolean} [data.websocketFrame] - Whether output is a completed WebSocket frame.
|
|
164
171
|
* @param {string} [data.channel] - Channel name.
|
|
165
172
|
* @param {number} [data.requestId] - Debug request id.
|
|
166
173
|
* @param {Record<string, ?>} [data.snapshot] - Worker debug snapshot.
|
|
@@ -190,7 +197,10 @@ export default class VelociousHttpServerWorker {
|
|
|
190
197
|
}
|
|
191
198
|
if (output !== null && output !== undefined) {
|
|
192
199
|
const outputLength = typeof output === "string" ? output.length : output.byteLength;
|
|
193
|
-
|
|
200
|
+
const delivery = data.websocketFrame === true
|
|
201
|
+
? this.enqueueClientFrame(client, output)
|
|
202
|
+
: this.enqueueClientControl(client, () => client.send(output));
|
|
203
|
+
void delivery.then(() => {
|
|
194
204
|
this.logger.debug(() => ["Client output delivered", {
|
|
195
205
|
clientCount,
|
|
196
206
|
outputLength,
|
|
@@ -213,7 +223,7 @@ export default class VelociousHttpServerWorker {
|
|
|
213
223
|
this.worker?.postMessage({ command: "clientFileResult", result: "aborted", transferId });
|
|
214
224
|
return;
|
|
215
225
|
}
|
|
216
|
-
void this.
|
|
226
|
+
void this.enqueueClientControl(client, async () => {
|
|
217
227
|
const result = await client.sendFile(filePath, sendBody !== false);
|
|
218
228
|
this.worker?.postMessage({ command: "clientFileResult", result, transferId });
|
|
219
229
|
}).catch((error) => {
|
|
@@ -228,7 +238,7 @@ export default class VelociousHttpServerWorker {
|
|
|
228
238
|
this.logger.error(() => [`Velocious worker ${this.workerCount} requested close for missing client ${clientCount}`, data]);
|
|
229
239
|
return;
|
|
230
240
|
}
|
|
231
|
-
void this.
|
|
241
|
+
void this.enqueueClientControl(client, () => client.end())
|
|
232
242
|
.finally(() => delete this.clients[client.clientCount]);
|
|
233
243
|
}
|
|
234
244
|
else if (command == "debugSnapshot") {
|
|
@@ -257,7 +267,12 @@ export default class VelociousHttpServerWorker {
|
|
|
257
267
|
if (typeof channel !== "string") {
|
|
258
268
|
throw new Error("Worker websocket v2-broadcast channel must be a string");
|
|
259
269
|
}
|
|
260
|
-
websocketEventsHost.broadcastV2({
|
|
270
|
+
websocketEventsHost.broadcastV2({
|
|
271
|
+
body,
|
|
272
|
+
broadcastParams: broadcastParams || {},
|
|
273
|
+
channel,
|
|
274
|
+
configuration: this.configuration
|
|
275
|
+
});
|
|
261
276
|
}
|
|
262
277
|
else {
|
|
263
278
|
throw new Error(`Unknown command: ${command}`);
|
|
@@ -265,22 +280,64 @@ export default class VelociousHttpServerWorker {
|
|
|
265
280
|
};
|
|
266
281
|
/**
|
|
267
282
|
* Preserves socket output ordering for one client.
|
|
268
|
-
* @param {
|
|
283
|
+
* @param {import("../server-client.js").default} client - Client instance.
|
|
284
|
+
* @param {string | Uint8Array} output - Complete output buffer.
|
|
285
|
+
* @returns {Promise<void>} - Queued delivery.
|
|
286
|
+
*/
|
|
287
|
+
enqueueClientFrame(client, output) {
|
|
288
|
+
const byteLength = typeof output === "string" ? Buffer.byteLength(output) : output.byteLength;
|
|
289
|
+
return this._deliveryQueueFor(client).enqueueFrame({
|
|
290
|
+
byteLength,
|
|
291
|
+
delivery: () => client.send(output)
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Preserves ordering for a delivery that retains no complete output frame.
|
|
296
|
+
* @param {import("../server-client.js").default} client - Client instance.
|
|
269
297
|
* @param {() => Promise<void>} delivery - Delivery operation.
|
|
270
298
|
* @returns {Promise<void>} - Queued delivery.
|
|
271
299
|
*/
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
300
|
+
enqueueClientControl(client, delivery) {
|
|
301
|
+
return this._deliveryQueueFor(client).enqueueControl(delivery);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Gets or creates one client's delivery queue.
|
|
305
|
+
* @param {import("../server-client.js").default} client - Client instance.
|
|
306
|
+
* @returns {ClientDeliveryQueue} - Client-owned delivery queue.
|
|
307
|
+
*/
|
|
308
|
+
_deliveryQueueFor(client) {
|
|
309
|
+
const existing = this._clientDeliveryQueues.get(client.clientCount);
|
|
310
|
+
if (existing)
|
|
311
|
+
return existing;
|
|
312
|
+
const { maxBytes, maxFrames } = this.configuration.getWebsocketOutboundQueueLimits();
|
|
313
|
+
const queue = new ClientDeliveryQueue({
|
|
314
|
+
clientCount: client.clientCount,
|
|
315
|
+
maxBytes,
|
|
316
|
+
maxFrames,
|
|
317
|
+
onOverflow: (error) => {
|
|
318
|
+
queue.destroy();
|
|
319
|
+
client.destroy(error);
|
|
320
|
+
this._reportOutboundQueueOverflow({ clientCount: client.clientCount, error });
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
this._clientDeliveryQueues.set(client.clientCount, queue);
|
|
324
|
+
return queue;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Reports a per-client outbound queue overflow.
|
|
328
|
+
* @param {object} args - Overflow details.
|
|
329
|
+
* @param {number} args.clientCount - Affected client.
|
|
330
|
+
* @param {Error} args.error - Overflow error.
|
|
331
|
+
* @returns {void}
|
|
332
|
+
*/
|
|
333
|
+
_reportOutboundQueueOverflow({ clientCount, error }) {
|
|
334
|
+
const errorPayload = {
|
|
335
|
+
context: { clientCount, websocketOutboundQueueOverflow: true, workerCount: this.workerCount },
|
|
336
|
+
error
|
|
281
337
|
};
|
|
282
|
-
|
|
283
|
-
|
|
338
|
+
const errorEvents = this.configuration.getErrorEvents();
|
|
339
|
+
errorEvents.emit("framework-error", errorPayload);
|
|
340
|
+
errorEvents.emit("all-error", { ...errorPayload, errorType: "framework-error" });
|
|
284
341
|
}
|
|
285
342
|
/**
|
|
286
343
|
* Runs get debug snapshot.
|
|
@@ -368,6 +425,13 @@ export default class VelociousHttpServerWorker {
|
|
|
368
425
|
return;
|
|
369
426
|
this.worker.postMessage({ body, broadcastParams, channel, command: "websocketV2Broadcast", eventId, createdAt });
|
|
370
427
|
}
|
|
428
|
+
/**
|
|
429
|
+
* Gets this worker's isolated V2 broadcast target.
|
|
430
|
+
* @returns {VelociousHttpServerWorker} - This worker handler.
|
|
431
|
+
*/
|
|
432
|
+
websocketV2BroadcastDispatchKey() {
|
|
433
|
+
return this;
|
|
434
|
+
}
|
|
371
435
|
/**
|
|
372
436
|
* Runs register with events host.
|
|
373
437
|
* @returns {void} */
|
|
@@ -386,4 +450,4 @@ export default class VelociousHttpServerWorker {
|
|
|
386
450
|
this.unregisterFromEventsHost = null;
|
|
387
451
|
}
|
|
388
452
|
}
|
|
389
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd29ya2VyLWhhbmRsZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sbUJBQW1CLE1BQU0sNkJBQTZCLENBQUE7QUFFN0Q7Ozs7Ozs7R0FPRztBQUNILFNBQVMsc0JBQXNCLENBQUMsSUFBSTtJQUNsQyxNQUFNLEVBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFBO0lBRTlCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sTUFBTSxDQUFBO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO1FBQ2YsQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFbEUsT0FBTztRQUNMLEdBQUcsSUFBSTtRQUNQLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLElBQUksRUFBRSxVQUFVO1NBQ2pCO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHlCQUF5QjtJQUM1Qzs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDOzsyRUFFbUU7UUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQTtRQUN4Qjs7bUZBRTJFO1FBQzNFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRXZDLHlDQUF5QztRQUN6QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN4QyxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQTtZQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDckIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUE7UUFDdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRXpGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxhQUFhLGtEQUFrRCxFQUFFO1lBQzNGLFVBQVUsRUFBRTtnQkFDVixLQUFLO2dCQUNMLFNBQVM7Z0JBQ1QsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO2dCQUNoRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDOUI7U0FDRixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLE1BQU07UUFDeEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQTtRQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0IsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUE7UUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUNuRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLFdBQVc7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU07UUFFdEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDOUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsV0FBVyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDdEUsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM1QiwyRkFBMkY7UUFDM0YsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUIsQ0FBQyxDQUFBO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRXZCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsa0NBQWtDLElBQUksRUFBRSxDQUFDLENBQUE7WUFDL0YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLHdDQUF3QyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pFLENBQUM7UUFFRCxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQTtRQUN2QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDckIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO0lBQzFCLENBQUMsQ0FBQTtJQUVEOzs7T0FHRztJQUNILGdCQUFnQjtRQUNkLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDO2dCQUNILEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBQ25CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3JFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUVqRSxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBR3RCLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1lBQ3pCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1lBRTdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVCLENBQUM7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUM3QixDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFFaEUsTUFBTSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFDbEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFdEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLHVDQUF1QyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUN4SCxPQUFNO1lBQ1IsQ0FBQztZQUVELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sWUFBWSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQTtnQkFFbkYsS0FBSyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDdkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx5QkFBeUIsRUFBRTs0QkFDbEQsV0FBVzs0QkFDWCxZQUFZOzRCQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt5QkFDOUIsQ0FBQyxDQUFDLENBQUE7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsaUNBQWlDLEVBQUU7NEJBQzFELFdBQVc7NEJBQ1gsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO3lCQUM5QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7Z0JBQ1osQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFDMUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFdEYsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtZQUU3RixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7Z0JBQ3RGLE9BQU07WUFDUixDQUFDO1lBRUQsS0FBSyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUE7Z0JBRWxFLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1lBQzdFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQyxFQUFFLEVBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDaEgsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1lBQ3hGLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFDMUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFdEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLHVDQUF1QyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUN6SCxPQUFNO1lBQ1IsQ0FBQztZQUVELEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNwRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtZQUNsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVE7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1lBQzlGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFMUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUM3QyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUE7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUE7UUFDMUIsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFFL0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1lBQ3RFLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUNqRCxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFFN0MsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO1lBQzNFLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGVBQWUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUMxRixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDaEQsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVEOzs7OztPQUtHO0lBQ0gscUJBQXFCLENBQUMsV0FBVyxFQUFFLFFBQVE7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDakYsTUFBTSxNQUFNLEdBQUcsUUFBUTthQUNwQixLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO2FBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWpCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ25ELE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTTtnQkFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVHLENBQUMsQ0FBQTtRQUVELEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFeEMsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7UUFDeEUsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQTtRQUV4QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDN0MsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsNkNBQTZDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBQzlHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUVSLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBRXhELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7WUFFMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDckIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7Z0JBQ3ZELE9BQU07WUFDUixDQUFDO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNwQixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQ3JCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQTtnQkFDbEUsQ0FBQzthQUNGLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDM0QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzFDLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUU3QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBRTFCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFBO1lBQzNCLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUMzQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILHNCQUFzQixDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDO1FBQzNELGlHQUFpRztRQUNqRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFNO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssVUFBVTtZQUFFLE9BQU07UUFFekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtJQUM1RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILDRCQUE0QixDQUFDLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQztRQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFNO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssVUFBVTtZQUFFLE9BQU07UUFFekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7SUFDaEgsQ0FBQztJQUVEOzt5QkFFcUI7SUFDckIsc0JBQXNCO1FBQ3BCLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUFFLE9BQU07UUFFekMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQ7O3lCQUVxQjtJQUNyQixnQ0FBZ0M7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFNO1FBRTFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1FBQy9CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUE7SUFDdEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQge1dvcmtlcn0gZnJvbSBcIndvcmtlcl90aHJlYWRzXCJcbmltcG9ydCB3ZWJzb2NrZXRFdmVudHNIb3N0IGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnRzLWhvc3QuanNcIlxuXG4vKipcbiAqIFJ1bnMgc3VtbWFyaXplIHdvcmtlciBtZXNzYWdlLlxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBXb3JrZXIgbWVzc2FnZSBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29tbWFuZCAtIENvbW1hbmQgbmFtZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5jbGllbnRDb3VudF0gLSBDbGllbnQgY291bnQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IFtkYXRhLm91dHB1dF0gLSBPdXRwdXQgY2h1bmsuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAtIExvZy1zYWZlIG1lc3NhZ2UgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplV29ya2VyTWVzc2FnZShkYXRhKSB7XG4gIGNvbnN0IHtvdXRwdXQsIC4uLnJlc3R9ID0gZGF0YVxuXG4gIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN0XG4gIH1cblxuICBjb25zdCBvdXRwdXRUeXBlID0gdHlwZW9mIG91dHB1dFxuICBjb25zdCBvdXRwdXRMZW5ndGggPSB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiXG4gICAgPyBvdXRwdXQubGVuZ3RoXG4gICAgOiAob3V0cHV0IGluc3RhbmNlb2YgVWludDhBcnJheSA/IG91dHB1dC5ieXRlTGVuZ3RoIDogdW5kZWZpbmVkKVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzdCxcbiAgICBvdXRwdXQ6IHtcbiAgICAgIGxlbmd0aDogb3V0cHV0TGVuZ3RoLFxuICAgICAgdHlwZTogb3V0cHV0VHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyV29ya2VyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy53b3JrZXJDb3VudCAtIFdvcmtlciBjb3VudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxudW1iZXIsIGltcG9ydChcIi4uL3NlcnZlci1jbGllbnQuanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fc3RvcHBpbmcgPSBmYWxzZVxuICAgIHRoaXMuX2RlYnVnUmVxdWVzdElkID0gMFxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPG51bWJlciwge3Jlc29sdmU6IChzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgPz4pID0+IHZvaWR9Pn0gKi9cbiAgICB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPG51bWJlciwgUHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMgPSBuZXcgTWFwKClcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5vblN0YXJ0Q2FsbGJhY2sgPSByZXNvbHZlXG4gICAgICB0aGlzLl9zcGF3bldvcmtlcigpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9zcGF3bldvcmtlcigpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWJ1Z1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKVxuICAgIGNvbnN0IHZlbG9jaW91c1BhdGggPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuZ2V0VmVsb2Npb3VzUGF0aCgpXG5cbiAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIoYCR7dmVsb2Npb3VzUGF0aH0vc3JjL2h0dHAtc2VydmVyL3dvcmtlci1oYW5kbGVyL3dvcmtlci1zY3JpcHQuanNgLCB7XG4gICAgICB3b3JrZXJEYXRhOiB7XG4gICAgICAgIGRlYnVnLFxuICAgICAgICBkaXJlY3RvcnksXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSxcbiAgICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnRcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMud29ya2VyLm9uKFwiZXJyb3JcIiwgdGhpcy5vbldvcmtlckVycm9yKVxuICAgIHRoaXMud29ya2VyLm9uKFwiZXhpdFwiLCB0aGlzLm9uV29ya2VyRXhpdClcbiAgICB0aGlzLndvcmtlci5vbihcIm1lc3NhZ2VcIiwgdGhpcy5vbldvcmtlck1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgc29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZFNvY2tldENvbm5lY3Rpb24oY2xpZW50KSB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSBjbGllbnQuY2xpZW50Q291bnRcblxuICAgIGlmICghdGhpcy53b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGNsaWVudC5zZXRXb3JrZXIodGhpcy53b3JrZXIpXG4gICAgY2xpZW50Lmxpc3RlbigpXG5cbiAgICB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdID0gY2xpZW50XG4gICAgY2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2xpZW50QWJvcnQoY2xpZW50Q291bnQpXG4gICAgfSlcbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJuZXdDbGllbnRcIiwgY2xpZW50Q291bnQsIHJlbW90ZUFkZHJlc3M6IGNsaWVudC5yZW1vdGVBZGRyZXNzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIGEgcGFyZW50LXNpZGUgc29ja2V0IGNsb3NlIGFuZCBjbGVhcnMgYWxsIHBhcmVudCBzdGF0ZSBmb3IgdGhlIGNsaWVudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNsaWVudENvdW50IC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZUNsaWVudEFib3J0KGNsaWVudENvdW50KSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdICYmICF0aGlzLl9jbGllbnREZWxpdmVyeVF1ZXVlcy5oYXMoY2xpZW50Q291bnQpKSByZXR1cm5cblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG4gICAgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMuZGVsZXRlKGNsaWVudENvdW50KVxuICAgIHRoaXMud29ya2VyPy5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRBYm9ydFwiLCBjbGllbnRDb3VudH0pXG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIGVycm9yLlxuICAgKiBAcGFyYW0gez99IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqL1xuICBvbldvcmtlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFZlbG9jaW91cyB3b3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSBlcnJvcmAsIGVycm9yKVxuICAgIHZvaWQgdGhpcy5fY2xvc2VBbGxDbGllbnRzKClcbiAgICAvLyBQcmVzZXJ2ZSBFcnJvciBpbnN0YW5jZXMgZm9yIHRoZSBvcmlnaW5hbCBiYWNrdHJhY2Ugd2hpbGUgd3JhcHBpbmcgbm9uLUVycm9yIHRocm93YWJsZXMuXG4gICAgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIGV4aXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gQ29kZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Xb3JrZXJFeGl0ID0gKGNvZGUpID0+IHtcbiAgICB0aGlzLl9oYXNFeGl0ZWQgPSB0cnVlXG4gICAgdGhpcy53b3JrZXJTdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9jbG9zZUFsbENsaWVudHMoKVxuXG4gICAgaWYgKGNvZGUgIT09IDAgJiYgIXRoaXMuX3N0b3BwaW5nKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX1gKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgd29ya2VyIHN0b3BwZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IGBDbGllbnQgd29ya2VyIHN0b3BwZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfWApXG4gICAgfVxuXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3RJZk5lZWRlZCgpXG4gICAgaWYgKHRoaXMuX3N0b3BSZXNvbHZlKSB7XG4gICAgICB0aGlzLl9zdG9wUmVzb2x2ZSgpXG4gICAgfVxuICAgIHRoaXMuX3N0b3BSZXNvbHZlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgYWxsIGNsaWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9jbG9zZUFsbENsaWVudHMoKSB7XG4gICAgY29uc3QgY2xpZW50cyA9IE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKVxuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjbGllbnRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2b2lkIGNsaWVudC5lbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBjbG9zZSBjbGllbnQgYWZ0ZXIgd29ya2VyIGV4aXRcIiwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHdvcmtlciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5jbGllbnRDb3VudF0gLSBDbGllbnQgY291bnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gW2RhdGEub3V0cHV0XSAtIE91dHB1dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVQYXRoXSAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZGF0YS5zZW5kQm9keV0gLSBXaGV0aGVyIHRvIHNlbmQgdGhlIGZpbGUgYm9keS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnRyYW5zZmVySWRdIC0gRmlsZSB0cmFuc2ZlciBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEucmVxdWVzdElkXSAtIERlYnVnIHJlcXVlc3QgaWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFtkYXRhLnNuYXBzaG90XSAtIFdvcmtlciBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHBhcmFtIHs/fSBbZGF0YS5wYXlsb2FkXSAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IFtkYXRhLmJvZHldIC0gVjIgYnJvYWRjYXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV29ya2VyTWVzc2FnZSA9IChkYXRhKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJXb3JrZXIgbWVzc2FnZVwiLCBzdW1tYXJpemVXb3JrZXJNZXNzYWdlKGRhdGEpKVxuXG4gICAgY29uc3Qge2NvbW1hbmR9ID0gZGF0YVxuXG5cbiAgICBpZiAoY29tbWFuZCA9PSBcInN0YXJ0ZWRcIikge1xuICAgICAgdGhpcy53b3JrZXJTdGFydGVkID0gdHJ1ZVxuICAgICAgdGhpcy5yZWdpc3RlcldpdGhFdmVudHNIb3N0KClcblxuICAgICAgaWYgKHRoaXMub25TdGFydENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25TdGFydENhbGxiYWNrKG51bGwpXG4gICAgICB9XG5cbiAgICAgIHRoaXMub25TdGFydENhbGxiYWNrID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudE91dHB1dFwiKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkNMSUVOVCBPVVRQVVRcIiwgc3VtbWFyaXplV29ya2VyTWVzc2FnZShkYXRhKSlcblxuICAgICAgY29uc3Qge2NsaWVudENvdW50LCBvdXRwdXR9ID0gZGF0YVxuICAgICAgY29uc3QgY2xpZW50ID0gdHlwZW9mIGNsaWVudENvdW50ID09PSBcIm51bWJlclwiID8gdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIWNsaWVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHByb2R1Y2VkIG91dHB1dCBmb3IgbWlzc2luZyBjbGllbnQgJHtjbGllbnRDb3VudH1gLCBkYXRhXSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChvdXRwdXQgIT09IG51bGwgJiYgb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IG91dHB1dC5sZW5ndGggOiBvdXRwdXQuYnl0ZUxlbmd0aFxuXG4gICAgICAgIHZvaWQgdGhpcy5lbnF1ZXVlQ2xpZW50RGVsaXZlcnkoY2xpZW50LmNsaWVudENvdW50LCAoKSA9PiBjbGllbnQuc2VuZChvdXRwdXQpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJDbGllbnQgb3V0cHV0IGRlbGl2ZXJlZFwiLCB7XG4gICAgICAgICAgICBjbGllbnRDb3VudCxcbiAgICAgICAgICAgIG91dHB1dExlbmd0aCxcbiAgICAgICAgICAgIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50XG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBkZWxpdmVyIGNsaWVudCBvdXRwdXRcIiwge1xuICAgICAgICAgICAgY2xpZW50Q291bnQsXG4gICAgICAgICAgICB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudFxuICAgICAgICAgIH0sIGVycm9yXSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjbGllbnRGaWxlXCIpIHtcbiAgICAgIGNvbnN0IHtjbGllbnRDb3VudCwgZmlsZVBhdGgsIHNlbmRCb2R5LCB0cmFuc2ZlcklkfSA9IGRhdGFcbiAgICAgIGNvbnN0IGNsaWVudCA9IHR5cGVvZiBjbGllbnRDb3VudCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHR5cGVvZiB0cmFuc2ZlcklkICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRGaWxlIHRyYW5zZmVySWQgbXVzdCBiZSBhIG51bWJlclwiKVxuXG4gICAgICBpZiAoIWNsaWVudCB8fCB0eXBlb2YgZmlsZVBhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy53b3JrZXI/LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImNsaWVudEZpbGVSZXN1bHRcIiwgcmVzdWx0OiBcImFib3J0ZWRcIiwgdHJhbnNmZXJJZH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB2b2lkIHRoaXMuZW5xdWV1ZUNsaWVudERlbGl2ZXJ5KGNsaWVudC5jbGllbnRDb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuc2VuZEZpbGUoZmlsZVBhdGgsIHNlbmRCb2R5ICE9PSBmYWxzZSlcblxuICAgICAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50RmlsZVJlc3VsdFwiLCByZXN1bHQsIHRyYW5zZmVySWR9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBkZWxpdmVyIGZpbGUgcmVzcG9uc2VcIiwge2NsaWVudENvdW50OiBjbGllbnQuY2xpZW50Q291bnQsIGZpbGVQYXRofSwgZXJyb3JdKVxuICAgICAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50RmlsZVJlc3VsdFwiLCByZXN1bHQ6IFwiYWJvcnRlZFwiLCB0cmFuc2ZlcklkfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50Q2xvc2VcIikge1xuICAgICAgY29uc3Qge2NsaWVudENvdW50fSA9IGRhdGFcbiAgICAgIGNvbnN0IGNsaWVudCA9IHR5cGVvZiBjbGllbnRDb3VudCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gcmVxdWVzdGVkIGNsb3NlIGZvciBtaXNzaW5nIGNsaWVudCAke2NsaWVudENvdW50fWAsIGRhdGFdKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdm9pZCB0aGlzLmVucXVldWVDbGllbnREZWxpdmVyeShjbGllbnQuY2xpZW50Q291bnQsICgpID0+IGNsaWVudC5lbmQoKSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnQuY2xpZW50Q291bnRdKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImRlYnVnU25hcHNob3RcIikge1xuICAgICAgY29uc3Qge3JlcXVlc3RJZCwgc25hcHNob3R9ID0gZGF0YVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImRlYnVnU25hcHNob3QgcmVxdWVzdElkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMuZ2V0KHJlcXVlc3RJZClcblxuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpXG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZShzbmFwc2hvdCB8fCB7fSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzaHV0ZG93bkNvbXBsZXRlXCIpIHtcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlPy4oKVxuICAgICAgdGhpcy5fc3RvcFJlc29sdmUgPSBudWxsXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0UHVibGlzaFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHB1Ymxpc2ggY2hhbm5lbCBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICB9XG5cbiAgICAgIHdlYnNvY2tldEV2ZW50c0hvc3QucHVibGlzaCh7Y2hhbm5lbCwgcGF5bG9hZH0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0VjJCcm9hZGNhc3RcIikge1xuICAgICAgY29uc3Qge2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHYyLWJyb2FkY2FzdCBjaGFubmVsIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0RXZlbnRzSG9zdC5icm9hZGNhc3RWMih7Ym9keSwgYnJvYWRjYXN0UGFyYW1zOiBicm9hZGNhc3RQYXJhbXMgfHwge30sIGNoYW5uZWx9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXNlcnZlcyBzb2NrZXQgb3V0cHV0IG9yZGVyaW5nIGZvciBvbmUgY2xpZW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gY2xpZW50Q291bnQgLSBDbGllbnQgY291bnQuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gZGVsaXZlcnkgLSBEZWxpdmVyeSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFF1ZXVlZCBkZWxpdmVyeS5cbiAgICovXG4gIGVucXVldWVDbGllbnREZWxpdmVyeShjbGllbnRDb3VudCwgZGVsaXZlcnkpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX2NsaWVudERlbGl2ZXJ5UXVldWVzLmdldChjbGllbnRDb3VudCkgfHwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICBjb25zdCBxdWV1ZWQgPSBwcmV2aW91c1xuICAgICAgLmNhdGNoKCgpID0+IHt9KVxuICAgICAgLnRoZW4oZGVsaXZlcnkpXG5cbiAgICB0aGlzLl9jbGllbnREZWxpdmVyeVF1ZXVlcy5zZXQoY2xpZW50Q291bnQsIHF1ZXVlZClcbiAgICBjb25zdCBjbGVhclF1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NsaWVudERlbGl2ZXJ5UXVldWVzLmdldChjbGllbnRDb3VudCkgPT09IHF1ZXVlZCkgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMuZGVsZXRlKGNsaWVudENvdW50KVxuICAgIH1cblxuICAgIHZvaWQgcXVldWVkLnRoZW4oY2xlYXJRdWV1ZSwgY2xlYXJRdWV1ZSlcblxuICAgIHJldHVybiBxdWV1ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFdvcmtlci1sb2NhbCBkZWJ1ZyBzbmFwc2hvdC5cbiAgICovXG4gIGdldERlYnVnU25hcHNob3QoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtlclN0YXJ0ZWQgfHwgIXRoaXMud29ya2VyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHthY3RpdmU6IGZhbHNlLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gKyt0aGlzLl9kZWJ1Z1JlcXVlc3RJZFxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlYnVnU25hcHNob3RSZXF1ZXN0cy5kZWxldGUocmVxdWVzdElkKVxuICAgICAgICByZXNvbHZlKHthY3RpdmU6IHRydWUsIGVycm9yOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciB3b3JrZXIgZGVidWcgc25hcHNob3RcIiwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgfSwgMjAwMClcblxuICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0LnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRpbWVvdXQudW5yZWYoKVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlclxuXG4gICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgcmVzb2x2ZSh7YWN0aXZlOiBmYWxzZSwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHtcbiAgICAgICAgcmVzb2x2ZTogKHNuYXBzaG90KSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgICAgcmVzb2x2ZSh7YWN0aXZlOiB0cnVlLCBzbmFwc2hvdCwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImRlYnVnU25hcHNob3RcIiwgcmVxdWVzdElkfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBzdG9wcGVkLlxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICBpZiAoIXRoaXMud29ya2VyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICBpZiAodGhpcy5faGFzRXhpdGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIHRoaXMuX3N0b3BwaW5nID0gdHJ1ZVxuICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3RJZk5lZWRlZCgpXG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJcblxuICAgIGlmICghd29ya2VyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5fc3RvcFJlc29sdmUgPSByZXNvbHZlXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwic2h1dGRvd25cIn0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRpc3BhdGNoIHdlYnNvY2tldCBldmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gez99IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSkge1xuICAgIC8vIFRlc3QgYW5kIHNodXRkb3duIHBhdGhzIGNhbiBsZWF2ZSBhIHJlZ2lzdGVyZWQgaGFuZGxlciB3aXRob3V0IGEgbGl2ZSB3b3JrZXItdGhyZWFkIHRyYW5zcG9ydC5cbiAgICBpZiAoIXRoaXMud29ya2VyU3RhcnRlZCkgcmV0dXJuXG4gICAgaWYgKCF0aGlzLndvcmtlciB8fCB0eXBlb2YgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuXG5cbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7Y2hhbm5lbCwgY29tbWFuZDogXCJ3ZWJzb2NrZXRFdmVudFwiLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmRzIGEgVjIgY2hhbm5lbCBicm9hZGNhc3QgdG8gdGhpcyB3b3JrZXIncyB0aHJlYWQgc28gaXQgY2FuXG4gICAqIGRpc3BhdGNoIHRvIGFueSBsb2NhbGx5LXJlZ2lzdGVyZWQgVjIgc3Vic2NyaXB0aW9ucy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gYXJncy5ib2R5IC0gTWVzc2FnZSBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBQZXJzaXN0ZWQgZXZlbnQgaWQgZm9yIHJlcGxheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRWMkJyb2FkY2FzdCh7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBldmVudElkLCBjcmVhdGVkQXR9KSB7XG4gICAgaWYgKCF0aGlzLndvcmtlclN0YXJ0ZWQpIHJldHVyblxuICAgIGlmICghdGhpcy53b3JrZXIgfHwgdHlwZW9mIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVyblxuXG4gICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgY29tbWFuZDogXCJ3ZWJzb2NrZXRWMkJyb2FkY2FzdFwiLCBldmVudElkLCBjcmVhdGVkQXR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgd2l0aCBldmVudHMgaG9zdC5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIHJlZ2lzdGVyV2l0aEV2ZW50c0hvc3QoKSB7XG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0KSByZXR1cm5cblxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gd2Vic29ja2V0RXZlbnRzSG9zdC5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5yZWdpc3RlciBmcm9tIGV2ZW50cyBob3N0IGlmIG5lZWRlZC5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIHVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdElmTmVlZGVkKCkge1xuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QpIHJldHVyblxuXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QoKVxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gbnVsbFxuICB9XG59XG4iXX0=
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd29ya2VyLWhhbmRsZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxtQkFBbUIsTUFBTSw2QkFBNkIsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDckMsT0FBTyxtQkFBbUIsTUFBTSw2QkFBNkIsQ0FBQTtBQUU3RDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxJQUFJO0lBQ2xDLE1BQU0sRUFBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUMsR0FBRyxJQUFJLENBQUE7SUFFOUIsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxNQUFNLENBQUE7SUFDaEMsTUFBTSxZQUFZLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUTtRQUM3QyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDZixDQUFDLENBQUMsQ0FBQyxNQUFNLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUVsRSxPQUFPO1FBQ0wsR0FBRyxJQUFJO1FBQ1AsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLFlBQVk7WUFDcEIsSUFBSSxFQUFFLFVBQVU7U0FDakI7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUJBQXlCO0lBQzVDOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUM7UUFDdEMsSUFB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LFNBQVMsRUFBQyxDQUFDLENBQUE7SUFDaEgsQ0FBQztJQUVEOzs7T0FHRztJQUNILCtCQUErQjtRQUM3QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7eUJBRXFCO0lBQ3JCLHNCQUFzQjtRQUNwQixJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFNO1FBRXpDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVEOzt5QkFFcUI7SUFDckIsZ0NBQWdDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCO1lBQUUsT0FBTTtRQUUxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFBO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IENsaWVudERlbGl2ZXJ5UXVldWUgZnJvbSBcIi4uL2NsaWVudC1kZWxpdmVyeS1xdWV1ZS5qc1wiXG5pbXBvcnQge1dvcmtlcn0gZnJvbSBcIndvcmtlcl90aHJlYWRzXCJcbmltcG9ydCB3ZWJzb2NrZXRFdmVudHNIb3N0IGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnRzLWhvc3QuanNcIlxuXG4vKipcbiAqIFJ1bnMgc3VtbWFyaXplIHdvcmtlciBtZXNzYWdlLlxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBXb3JrZXIgbWVzc2FnZSBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29tbWFuZCAtIENvbW1hbmQgbmFtZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5jbGllbnRDb3VudF0gLSBDbGllbnQgY291bnQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IFtkYXRhLm91dHB1dF0gLSBPdXRwdXQgY2h1bmsuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAtIExvZy1zYWZlIG1lc3NhZ2UgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplV29ya2VyTWVzc2FnZShkYXRhKSB7XG4gIGNvbnN0IHtvdXRwdXQsIC4uLnJlc3R9ID0gZGF0YVxuXG4gIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN0XG4gIH1cblxuICBjb25zdCBvdXRwdXRUeXBlID0gdHlwZW9mIG91dHB1dFxuICBjb25zdCBvdXRwdXRMZW5ndGggPSB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiXG4gICAgPyBvdXRwdXQubGVuZ3RoXG4gICAgOiAob3V0cHV0IGluc3RhbmNlb2YgVWludDhBcnJheSA/IG91dHB1dC5ieXRlTGVuZ3RoIDogdW5kZWZpbmVkKVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzdCxcbiAgICBvdXRwdXQ6IHtcbiAgICAgIGxlbmd0aDogb3V0cHV0TGVuZ3RoLFxuICAgICAgdHlwZTogb3V0cHV0VHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyV29ya2VyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy53b3JrZXJDb3VudCAtIFdvcmtlciBjb3VudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxudW1iZXIsIGltcG9ydChcIi4uL3NlcnZlci1jbGllbnQuanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fc3RvcHBpbmcgPSBmYWxzZVxuICAgIHRoaXMuX2RlYnVnUmVxdWVzdElkID0gMFxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPG51bWJlciwge3Jlc29sdmU6IChzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgPz4pID0+IHZvaWR9Pn0gKi9cbiAgICB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPG51bWJlciwgQ2xpZW50RGVsaXZlcnlRdWV1ZT59ICovXG4gICAgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMgPSBuZXcgTWFwKClcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5vblN0YXJ0Q2FsbGJhY2sgPSByZXNvbHZlXG4gICAgICB0aGlzLl9zcGF3bldvcmtlcigpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9zcGF3bldvcmtlcigpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWJ1Z1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKVxuICAgIGNvbnN0IHZlbG9jaW91c1BhdGggPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuZ2V0VmVsb2Npb3VzUGF0aCgpXG5cbiAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIoYCR7dmVsb2Npb3VzUGF0aH0vc3JjL2h0dHAtc2VydmVyL3dvcmtlci1oYW5kbGVyL3dvcmtlci1zY3JpcHQuanNgLCB7XG4gICAgICB3b3JrZXJEYXRhOiB7XG4gICAgICAgIGRlYnVnLFxuICAgICAgICBkaXJlY3RvcnksXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSxcbiAgICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnRcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMud29ya2VyLm9uKFwiZXJyb3JcIiwgdGhpcy5vbldvcmtlckVycm9yKVxuICAgIHRoaXMud29ya2VyLm9uKFwiZXhpdFwiLCB0aGlzLm9uV29ya2VyRXhpdClcbiAgICB0aGlzLndvcmtlci5vbihcIm1lc3NhZ2VcIiwgdGhpcy5vbldvcmtlck1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgc29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZFNvY2tldENvbm5lY3Rpb24oY2xpZW50KSB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSBjbGllbnQuY2xpZW50Q291bnRcblxuICAgIGlmICghdGhpcy53b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGNsaWVudC5zZXRXb3JrZXIodGhpcy53b3JrZXIpXG4gICAgY2xpZW50Lmxpc3RlbigpXG5cbiAgICB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdID0gY2xpZW50XG4gICAgY2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2xpZW50QWJvcnQoY2xpZW50Q291bnQpXG4gICAgfSlcbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJuZXdDbGllbnRcIiwgY2xpZW50Q291bnQsIHJlbW90ZUFkZHJlc3M6IGNsaWVudC5yZW1vdGVBZGRyZXNzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIGEgcGFyZW50LXNpZGUgc29ja2V0IGNsb3NlIGFuZCBjbGVhcnMgYWxsIHBhcmVudCBzdGF0ZSBmb3IgdGhlIGNsaWVudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNsaWVudENvdW50IC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZUNsaWVudEFib3J0KGNsaWVudENvdW50KSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdICYmICF0aGlzLl9jbGllbnREZWxpdmVyeVF1ZXVlcy5oYXMoY2xpZW50Q291bnQpKSByZXR1cm5cblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG4gICAgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMuZ2V0KGNsaWVudENvdW50KT8uZGVzdHJveSgpXG4gICAgdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMuZGVsZXRlKGNsaWVudENvdW50KVxuICAgIHRoaXMud29ya2VyPy5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRBYm9ydFwiLCBjbGllbnRDb3VudH0pXG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIGVycm9yLlxuICAgKiBAcGFyYW0gez99IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqL1xuICBvbldvcmtlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFZlbG9jaW91cyB3b3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSBlcnJvcmAsIGVycm9yKVxuICAgIHZvaWQgdGhpcy5fY2xvc2VBbGxDbGllbnRzKClcbiAgICAvLyBQcmVzZXJ2ZSBFcnJvciBpbnN0YW5jZXMgZm9yIHRoZSBvcmlnaW5hbCBiYWNrdHJhY2Ugd2hpbGUgd3JhcHBpbmcgbm9uLUVycm9yIHRocm93YWJsZXMuXG4gICAgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIGV4aXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gQ29kZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Xb3JrZXJFeGl0ID0gKGNvZGUpID0+IHtcbiAgICB0aGlzLl9oYXNFeGl0ZWQgPSB0cnVlXG4gICAgdGhpcy53b3JrZXJTdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9jbG9zZUFsbENsaWVudHMoKVxuXG4gICAgaWYgKGNvZGUgIT09IDAgJiYgIXRoaXMuX3N0b3BwaW5nKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX1gKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgd29ya2VyIHN0b3BwZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IGBDbGllbnQgd29ya2VyIHN0b3BwZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfWApXG4gICAgfVxuXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3RJZk5lZWRlZCgpXG4gICAgaWYgKHRoaXMuX3N0b3BSZXNvbHZlKSB7XG4gICAgICB0aGlzLl9zdG9wUmVzb2x2ZSgpXG4gICAgfVxuICAgIHRoaXMuX3N0b3BSZXNvbHZlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgYWxsIGNsaWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9jbG9zZUFsbENsaWVudHMoKSB7XG4gICAgY29uc3QgY2xpZW50cyA9IE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKVxuICAgIHRoaXMuY2xpZW50cyA9IHt9XG4gICAgY29uc3QgZGVsaXZlcnlRdWV1ZXMgPSB0aGlzLl9jbGllbnREZWxpdmVyeVF1ZXVlc1xuICAgIHRoaXMuX2NsaWVudERlbGl2ZXJ5UXVldWVzID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHF1ZXVlIG9mIGRlbGl2ZXJ5UXVldWVzLnZhbHVlcygpKSBxdWV1ZS5kZXN0cm95KClcblxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZvaWQgY2xpZW50LmVuZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIGNsaWVudCBhZnRlciB3b3JrZXIgZXhpdFwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YS5jb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBbZGF0YS5vdXRwdXRdIC0gT3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZmlsZVBhdGhdIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkYXRhLnNlbmRCb2R5XSAtIFdoZXRoZXIgdG8gc2VuZCB0aGUgZmlsZSBib2R5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEudHJhbnNmZXJJZF0gLSBGaWxlIHRyYW5zZmVyIGlkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkYXRhLndlYnNvY2tldEZyYW1lXSAtIFdoZXRoZXIgb3V0cHV0IGlzIGEgY29tcGxldGVkIFdlYlNvY2tldCBmcmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEucmVxdWVzdElkXSAtIERlYnVnIHJlcXVlc3QgaWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFtkYXRhLnNuYXBzaG90XSAtIFdvcmtlciBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHBhcmFtIHs/fSBbZGF0YS5wYXlsb2FkXSAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IFtkYXRhLmJvZHldIC0gVjIgYnJvYWRjYXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV29ya2VyTWVzc2FnZSA9IChkYXRhKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXCJXb3JrZXIgbWVzc2FnZVwiLCBzdW1tYXJpemVXb3JrZXJNZXNzYWdlKGRhdGEpKVxuXG4gICAgY29uc3Qge2NvbW1hbmR9ID0gZGF0YVxuXG5cbiAgICBpZiAoY29tbWFuZCA9PSBcInN0YXJ0ZWRcIikge1xuICAgICAgdGhpcy53b3JrZXJTdGFydGVkID0gdHJ1ZVxuICAgICAgdGhpcy5yZWdpc3RlcldpdGhFdmVudHNIb3N0KClcblxuICAgICAgaWYgKHRoaXMub25TdGFydENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25TdGFydENhbGxiYWNrKG51bGwpXG4gICAgICB9XG5cbiAgICAgIHRoaXMub25TdGFydENhbGxiYWNrID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudE91dHB1dFwiKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkNMSUVOVCBPVVRQVVRcIiwgc3VtbWFyaXplV29ya2VyTWVzc2FnZShkYXRhKSlcblxuICAgICAgY29uc3Qge2NsaWVudENvdW50LCBvdXRwdXR9ID0gZGF0YVxuICAgICAgY29uc3QgY2xpZW50ID0gdHlwZW9mIGNsaWVudENvdW50ID09PSBcIm51bWJlclwiID8gdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIWNsaWVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHByb2R1Y2VkIG91dHB1dCBmb3IgbWlzc2luZyBjbGllbnQgJHtjbGllbnRDb3VudH1gLCBkYXRhXSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChvdXRwdXQgIT09IG51bGwgJiYgb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IG91dHB1dC5sZW5ndGggOiBvdXRwdXQuYnl0ZUxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGRlbGl2ZXJ5ID0gZGF0YS53ZWJzb2NrZXRGcmFtZSA9PT0gdHJ1ZVxuICAgICAgICAgID8gdGhpcy5lbnF1ZXVlQ2xpZW50RnJhbWUoY2xpZW50LCBvdXRwdXQpXG4gICAgICAgICAgOiB0aGlzLmVucXVldWVDbGllbnRDb250cm9sKGNsaWVudCwgKCkgPT4gY2xpZW50LnNlbmQob3V0cHV0KSlcblxuICAgICAgICB2b2lkIGRlbGl2ZXJ5LnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIkNsaWVudCBvdXRwdXQgZGVsaXZlcmVkXCIsIHtcbiAgICAgICAgICAgIGNsaWVudENvdW50LFxuICAgICAgICAgICAgb3V0cHV0TGVuZ3RoLFxuICAgICAgICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnRcbiAgICAgICAgICB9XSlcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIGRlbGl2ZXIgY2xpZW50IG91dHB1dFwiLCB7XG4gICAgICAgICAgICBjbGllbnRDb3VudCxcbiAgICAgICAgICAgIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50XG4gICAgICAgICAgfSwgZXJyb3JdKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudEZpbGVcIikge1xuICAgICAgY29uc3Qge2NsaWVudENvdW50LCBmaWxlUGF0aCwgc2VuZEJvZHksIHRyYW5zZmVySWR9ID0gZGF0YVxuICAgICAgY29uc3QgY2xpZW50ID0gdHlwZW9mIGNsaWVudENvdW50ID09PSBcIm51bWJlclwiID8gdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZmVySWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImNsaWVudEZpbGUgdHJhbnNmZXJJZCBtdXN0IGJlIGEgbnVtYmVyXCIpXG5cbiAgICAgIGlmICghY2xpZW50IHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50RmlsZVJlc3VsdFwiLCByZXN1bHQ6IFwiYWJvcnRlZFwiLCB0cmFuc2ZlcklkfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZvaWQgdGhpcy5lbnF1ZXVlQ2xpZW50Q29udHJvbChjbGllbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmRGaWxlKGZpbGVQYXRoLCBzZW5kQm9keSAhPT0gZmFsc2UpXG5cbiAgICAgICAgdGhpcy53b3JrZXI/LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImNsaWVudEZpbGVSZXN1bHRcIiwgcmVzdWx0LCB0cmFuc2ZlcklkfSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZGVsaXZlciBmaWxlIHJlc3BvbnNlXCIsIHtjbGllbnRDb3VudDogY2xpZW50LmNsaWVudENvdW50LCBmaWxlUGF0aH0sIGVycm9yXSlcbiAgICAgICAgdGhpcy53b3JrZXI/LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImNsaWVudEZpbGVSZXN1bHRcIiwgcmVzdWx0OiBcImFib3J0ZWRcIiwgdHJhbnNmZXJJZH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudENsb3NlXCIpIHtcbiAgICAgIGNvbnN0IHtjbGllbnRDb3VudH0gPSBkYXRhXG4gICAgICBjb25zdCBjbGllbnQgPSB0eXBlb2YgY2xpZW50Q291bnQgPT09IFwibnVtYmVyXCIgPyB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHJlcXVlc3RlZCBjbG9zZSBmb3IgbWlzc2luZyBjbGllbnQgJHtjbGllbnRDb3VudH1gLCBkYXRhXSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZvaWQgdGhpcy5lbnF1ZXVlQ2xpZW50Q29udHJvbChjbGllbnQsICgpID0+IGNsaWVudC5lbmQoKSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnQuY2xpZW50Q291bnRdKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImRlYnVnU25hcHNob3RcIikge1xuICAgICAgY29uc3Qge3JlcXVlc3RJZCwgc25hcHNob3R9ID0gZGF0YVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImRlYnVnU25hcHNob3QgcmVxdWVzdElkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMuZ2V0KHJlcXVlc3RJZClcblxuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpXG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZShzbmFwc2hvdCB8fCB7fSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzaHV0ZG93bkNvbXBsZXRlXCIpIHtcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlPy4oKVxuICAgICAgdGhpcy5fc3RvcFJlc29sdmUgPSBudWxsXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0UHVibGlzaFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHB1Ymxpc2ggY2hhbm5lbCBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICB9XG5cbiAgICAgIHdlYnNvY2tldEV2ZW50c0hvc3QucHVibGlzaCh7Y2hhbm5lbCwgcGF5bG9hZH0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0VjJCcm9hZGNhc3RcIikge1xuICAgICAgY29uc3Qge2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHYyLWJyb2FkY2FzdCBjaGFubmVsIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0RXZlbnRzSG9zdC5icm9hZGNhc3RWMih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGJyb2FkY2FzdFBhcmFtczogYnJvYWRjYXN0UGFyYW1zIHx8IHt9LFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb25cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlc2VydmVzIHNvY2tldCBvdXRwdXQgb3JkZXJpbmcgZm9yIG9uZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gb3V0cHV0IC0gQ29tcGxldGUgb3V0cHV0IGJ1ZmZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUXVldWVkIGRlbGl2ZXJ5LlxuICAgKi9cbiAgZW5xdWV1ZUNsaWVudEZyYW1lKGNsaWVudCwgb3V0cHV0KSB7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuYnl0ZUxlbmd0aChvdXRwdXQpIDogb3V0cHV0LmJ5dGVMZW5ndGhcblxuICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeVF1ZXVlRm9yKGNsaWVudCkuZW5xdWV1ZUZyYW1lKHtcbiAgICAgIGJ5dGVMZW5ndGgsXG4gICAgICBkZWxpdmVyeTogKCkgPT4gY2xpZW50LnNlbmQob3V0cHV0KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUHJlc2VydmVzIG9yZGVyaW5nIGZvciBhIGRlbGl2ZXJ5IHRoYXQgcmV0YWlucyBubyBjb21wbGV0ZSBvdXRwdXQgZnJhbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gZGVsaXZlcnkgLSBEZWxpdmVyeSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFF1ZXVlZCBkZWxpdmVyeS5cbiAgICovXG4gIGVucXVldWVDbGllbnRDb250cm9sKGNsaWVudCwgZGVsaXZlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnlRdWV1ZUZvcihjbGllbnQpLmVucXVldWVDb250cm9sKGRlbGl2ZXJ5KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgY3JlYXRlcyBvbmUgY2xpZW50J3MgZGVsaXZlcnkgcXVldWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtDbGllbnREZWxpdmVyeVF1ZXVlfSAtIENsaWVudC1vd25lZCBkZWxpdmVyeSBxdWV1ZS5cbiAgICovXG4gIF9kZWxpdmVyeVF1ZXVlRm9yKGNsaWVudCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fY2xpZW50RGVsaXZlcnlRdWV1ZXMuZ2V0KGNsaWVudC5jbGllbnRDb3VudClcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuXG4gICAgY29uc3Qge21heEJ5dGVzLCBtYXhGcmFtZXN9ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldE91dGJvdW5kUXVldWVMaW1pdHMoKVxuICAgIGNvbnN0IHF1ZXVlID0gbmV3IENsaWVudERlbGl2ZXJ5UXVldWUoe1xuICAgICAgY2xpZW50Q291bnQ6IGNsaWVudC5jbGllbnRDb3VudCxcbiAgICAgIG1heEJ5dGVzLFxuICAgICAgbWF4RnJhbWVzLFxuICAgICAgb25PdmVyZmxvdzogKGVycm9yKSA9PiB7XG4gICAgICAgIHF1ZXVlLmRlc3Ryb3koKVxuICAgICAgICBjbGllbnQuZGVzdHJveShlcnJvcilcbiAgICAgICAgdGhpcy5fcmVwb3J0T3V0Ym91bmRRdWV1ZU92ZXJmbG93KHtjbGllbnRDb3VudDogY2xpZW50LmNsaWVudENvdW50LCBlcnJvcn0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuX2NsaWVudERlbGl2ZXJ5UXVldWVzLnNldChjbGllbnQuY2xpZW50Q291bnQsIHF1ZXVlKVxuICAgIHJldHVybiBxdWV1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwZXItY2xpZW50IG91dGJvdW5kIHF1ZXVlIG92ZXJmbG93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE92ZXJmbG93IGRldGFpbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50IC0gQWZmZWN0ZWQgY2xpZW50LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBhcmdzLmVycm9yIC0gT3ZlcmZsb3cgZXJyb3IuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlcG9ydE91dGJvdW5kUXVldWVPdmVyZmxvdyh7Y2xpZW50Q291bnQsIGVycm9yfSkge1xuICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQ6IHtjbGllbnRDb3VudCwgd2Vic29ja2V0T3V0Ym91bmRRdWV1ZU92ZXJmbG93OiB0cnVlLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0sXG4gICAgICBlcnJvclxuICAgIH1cbiAgICBjb25zdCBlcnJvckV2ZW50cyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpXG5cbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIGVycm9yUGF5bG9hZClcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBXb3JrZXItbG9jYWwgZGVidWcgc25hcHNob3QuXG4gICAqL1xuICBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIGlmICghdGhpcy53b3JrZXJTdGFydGVkIHx8ICF0aGlzLndvcmtlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7YWN0aXZlOiBmYWxzZSwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5fZGVidWdSZXF1ZXN0SWRcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMuZGVsZXRlKHJlcXVlc3RJZClcbiAgICAgICAgcmVzb2x2ZSh7YWN0aXZlOiB0cnVlLCBlcnJvcjogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igd29ya2VyIGRlYnVnIHNuYXBzaG90XCIsIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50fSlcbiAgICAgIH0sIDIwMDApXG5cbiAgICAgIGlmICh0eXBlb2YgdGltZW91dC51bnJlZiA9PT0gXCJmdW5jdGlvblwiKSB0aW1lb3V0LnVucmVmKClcblxuICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJcblxuICAgICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIHJlc29sdmUoe2FjdGl2ZTogZmFsc2UsIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50fSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RlYnVnU25hcHNob3RSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7XG4gICAgICAgIHJlc29sdmU6IChzbmFwc2hvdCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgIHJlc29sdmUoe2FjdGl2ZTogdHJ1ZSwgc25hcHNob3QsIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50fSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJkZWJ1Z1NuYXBzaG90XCIsIHJlcXVlc3RJZH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0b3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gc3RvcHBlZC5cbiAgICovXG4gIHN0b3AoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgaWYgKHRoaXMuX2hhc0V4aXRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICB0aGlzLl9zdG9wcGluZyA9IHRydWVcbiAgICB0aGlzLndvcmtlclN0YXJ0ZWQgPSBmYWxzZVxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0SWZOZWVkZWQoKVxuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyXG5cbiAgICBpZiAoIXdvcmtlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcInNodXRkb3duXCJ9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkaXNwYXRjaCB3ZWJzb2NrZXQgZXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGRpc3BhdGNoV2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pIHtcbiAgICAvLyBUZXN0IGFuZCBzaHV0ZG93biBwYXRocyBjYW4gbGVhdmUgYSByZWdpc3RlcmVkIGhhbmRsZXIgd2l0aG91dCBhIGxpdmUgd29ya2VyLXRocmVhZCB0cmFuc3BvcnQuXG4gICAgaWYgKCF0aGlzLndvcmtlclN0YXJ0ZWQpIHJldHVyblxuICAgIGlmICghdGhpcy53b3JrZXIgfHwgdHlwZW9mIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVyblxuXG4gICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe2NoYW5uZWwsIGNvbW1hbmQ6IFwid2Vic29ja2V0RXZlbnRcIiwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3J3YXJkcyBhIFYyIGNoYW5uZWwgYnJvYWRjYXN0IHRvIHRoaXMgd29ya2VyJ3MgdGhyZWFkIHNvIGl0IGNhblxuICAgKiBkaXNwYXRjaCB0byBhbnkgbG9jYWxseS1yZWdpc3RlcmVkIFYyIHN1YnNjcmlwdGlvbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3MuYnJvYWRjYXN0UGFyYW1zIC0gUm91dGluZyBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IGFyZ3MuYm9keSAtIE1lc3NhZ2UgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gUGVyc2lzdGVkIGV2ZW50IGlkIGZvciByZXBsYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZXN0YW1wLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc3BhdGNoV2Vic29ja2V0VjJCcm9hZGNhc3Qoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgZXZlbnRJZCwgY3JlYXRlZEF0fSkge1xuICAgIGlmICghdGhpcy53b3JrZXJTdGFydGVkKSByZXR1cm5cbiAgICBpZiAoIXRoaXMud29ya2VyIHx8IHR5cGVvZiB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm5cblxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGNvbW1hbmQ6IFwid2Vic29ja2V0VjJCcm9hZGNhc3RcIiwgZXZlbnRJZCwgY3JlYXRlZEF0fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoaXMgd29ya2VyJ3MgaXNvbGF0ZWQgVjIgYnJvYWRjYXN0IHRhcmdldC5cbiAgICogQHJldHVybnMge1ZlbG9jaW91c0h0dHBTZXJ2ZXJXb3JrZXJ9IC0gVGhpcyB3b3JrZXIgaGFuZGxlci5cbiAgICovXG4gIHdlYnNvY2tldFYyQnJvYWRjYXN0RGlzcGF0Y2hLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlZ2lzdGVyIHdpdGggZXZlbnRzIGhvc3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAqL1xuICByZWdpc3RlcldpdGhFdmVudHNIb3N0KCkge1xuICAgIGlmICh0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCkgcmV0dXJuXG5cbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCA9IHdlYnNvY2tldEV2ZW50c0hvc3QucmVnaXN0ZXIodGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVucmVnaXN0ZXIgZnJvbSBldmVudHMgaG9zdCBpZiBuZWVkZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAqL1xuICB1bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3RJZk5lZWRlZCgpIHtcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0KSByZXR1cm5cblxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0KClcbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCA9IG51bGxcbiAgfVxufVxuIl19
|
|
@@ -141,8 +141,8 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
141
141
|
configuration: this.configuration,
|
|
142
142
|
remoteAddress
|
|
143
143
|
});
|
|
144
|
-
client.events.on("output", (output) => {
|
|
145
|
-
this.parentPort.postMessage({ command: "clientOutput", clientCount, output });
|
|
144
|
+
client.events.on("output", (output, { websocketFrame = false } = {}) => {
|
|
145
|
+
this.parentPort.postMessage({ command: "clientOutput", clientCount, output, websocketFrame });
|
|
146
146
|
});
|
|
147
147
|
client.events.on("file", ({ filePath, sendBody, settle }) => {
|
|
148
148
|
const transferId = ++this.fileTransferCount;
|
|
@@ -312,4 +312,4 @@ export default class VelociousHttpServerWorkerHandlerWorkerThread {
|
|
|
312
312
|
await Promise.all(sendTasks);
|
|
313
313
|
}
|
|
314
314
|
}
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXRocmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItdGhyZWFkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLDBCQUEwQixNQUFNLGtDQUFrQyxDQUFBO0FBQ3pFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxpQkFBaUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNsRSxPQUFPLGVBQWUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVwRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxLQUFLO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzRixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRTVJLE9BQU8sRUFBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FB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Q25FLGtCQUFrQjtZQUNsQixTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzVJLENBQUM7UUFFRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBBcHBsaWNhdGlvbiBmcm9tIFwiLi4vLi4vYXBwbGljYXRpb24uanNcIlxuaW1wb3J0IENsaWVudCBmcm9tIFwiLi4vY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBkaXNwYXRjaENoYW5uZWxTdWJzY3JpYmVycyBmcm9tIFwiLi9jaGFubmVsLXN1YnNjcmliZXItZGlzcGF0Y2guanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBlcnJvckxvZ2dlciBmcm9tIFwiLi4vLi4vZXJyb3ItbG9nZ2VyLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldEV2ZW50cyBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50cy5qc1wiXG5cbi8qKlxuICogUnVucyBzdW1tYXJpemUgY2xpZW50IHdyaXRlIGNodW5rLlxuICogQHBhcmFtIHtCdWZmZXIgfCBVaW50OEFycmF5IHwgc3RyaW5nfSBjaHVuayAtIENsaWVudCBpbnB1dCBwYXlsb2FkLlxuICogQHJldHVybnMge3tsZW5ndGg6IG51bWJlciwgcHJldmlldzogc3RyaW5nfX0gLSBDaHVuayBzdW1tYXJ5IGZvciBsb2dnaW5nLlxuICovXG5mdW5jdGlvbiBzdW1tYXJpemVDbGllbnRXcml0ZUNodW5rKGNodW5rKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDaHVuayA9IHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGNodW5rKSA6IEJ1ZmZlci5mcm9tKGNodW5rKVxuICBjb25zdCBwcmV2aWV3ID0gbm9ybWFsaXplZENodW5rLnRvU3RyaW5nKFwibGF0aW4xXCIsIDAsIE1hdGgubWluKG5vcm1hbGl6ZWRDaHVuay5sZW5ndGgsIDE2MCkpLnJlcGxhY2VBbGwoXCJcXHJcIiwgXCJcXFxcclwiKS5yZXBsYWNlQWxsKFwiXFxuXCIsIFwiXFxcXG5cIilcblxuICByZXR1cm4ge2xlbmd0aDogbm9ybWFsaXplZENodW5rLmxlbmd0aCwgcHJldmlld31cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlcldvcmtlckhhbmRsZXJXb3JrZXJUaHJlYWQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3b3JrZXJfdGhyZWFkc1wiKS5wYXJlbnRQb3J0fSBhcmdzLnBhcmVudFBvcnQgLSBQYXJlbnQgcG9ydC5cbiAgICogQHBhcmFtIHt7ZGVidWc6IGJvb2xlYW4sIGRpcmVjdG9yeTogc3RyaW5nLCBlbnZpcm9ubWVudDogc3RyaW5nLCB3b3JrZXJDb3VudDogbnVtYmVyfX0gYXJncy53b3JrZXJEYXRhIC0gV29ya2VyIGNvbmZpZ3VyYXRpb24gZGV0YWlscy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtwYXJlbnRQb3J0LCB3b3JrZXJEYXRhfSkge1xuICAgIGlmICghcGFyZW50UG9ydCkgdGhyb3cgbmV3IEVycm9yKFwicGFyZW50UG9ydCBpcyByZXF1aXJlZFwiKVxuXG4gICAgY29uc3Qge3dvcmtlckNvdW50fSA9IHdvcmtlckRhdGFcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgQ2xpZW50Pn0gKi9cbiAgICB0aGlzLmNsaWVudHMgPSB7fVxuXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgdGhpcy5wYXJlbnRQb3J0ID0gcGFyZW50UG9ydFxuICAgIHRoaXMud29ya2VyRGF0YSA9IHdvcmtlckRhdGFcbiAgICB0aGlzLndvcmtlckNvdW50ID0gd29ya2VyQ291bnRcbiAgICB0aGlzLmZpbGVUcmFuc2ZlckNvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCB7Y2xpZW50Q291bnQ6IG51bWJlciwgc2V0dGxlOiAocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IFByb21pc2U8dm9pZD59Pn0gKi9cbiAgICB0aGlzLmZpbGVUcmFuc2ZlcnMgPSBuZXcgTWFwKClcblxuICAgIHBhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsIGVycm9yTG9nZ2VyKHRoaXMub25Db21tYW5kKSlcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJBcHBsaWNhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgdGhpcy5hcHBsaWNhdGlvbi5pbml0aWFsaXplKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gYFdvcmtlciAke3dvcmtlckNvdW50fSBzdGFydGVkYClcbiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJzdGFydGVkXCJ9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgY29uc3Qge2RlYnVnLCBkaXJlY3RvcnksIGVudmlyb25tZW50fSA9IHRoaXMud29ya2VyRGF0YVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25QYXRoID0gYCR7ZGlyZWN0b3J5fS9zcmMvY29uZmlnL2NvbmZpZ3VyYXRpb24uanNgXG4gICAgY29uc3QgY29uZmlndXJhdGlvbkltcG9ydCA9IGF3YWl0IGltcG9ydCh0b0ltcG9ydFNwZWNpZmllcihjb25maWd1cmF0aW9uUGF0aCkpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gKi9cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uSW1wb3J0LmRlZmF1bHRcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gY291bGRuJ3QgYmUgbG9hZGVkIGZyb206ICR7Y29uZmlndXJhdGlvblBhdGh9YClcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb25cblxuICAgIGNvbmZpZ3VyYXRpb24uZGVidWcgPSBkZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbmZpZ3VyYXRpb24uc2V0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpXG4gICAgY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJXb3JrZXIgdGhyZWFkIGNvbmZpZ3VyYXRpb24gbG9hZGVkXCIsIHtkZWJ1ZzogY29uZmlndXJhdGlvbi5kZWJ1Zywgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9XSlcbiAgICB0aGlzLndlYnNvY2tldEV2ZW50cyA9IG5ldyBXZWJzb2NrZXRFdmVudHMoe3BhcmVudFBvcnQ6IHRoaXMucGFyZW50UG9ydCwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgIGNvbmZpZ3VyYXRpb24uc2V0V2Vic29ja2V0RXZlbnRzKHRoaXMud2Vic29ja2V0RXZlbnRzKVxuXG4gICAgdGhpcy5hcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbih7Y29uZmlndXJhdGlvbiwgdHlwZTogXCJ3b3JrZXItaGFuZGxlclwifSlcblxuICAgIGlmICghY29uZmlndXJhdGlvbi5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZSh7dHlwZTogXCJ3b3JrZXItaGFuZGxlclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY29tbWFuZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmd9IFtkYXRhLmNodW5rXSAtIENodW5rLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEucmVtb3RlQWRkcmVzc10gLSBSZW1vdGUgYWRkcmVzcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5yZXF1ZXN0SWRdIC0gRGVidWcgcmVxdWVzdCBpZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnRyYW5zZmVySWRdIC0gRmlsZSB0cmFuc2ZlciBpZC5cbiAgICogQHBhcmFtIHtcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCJ9IFtkYXRhLnJlc3VsdF0gLSBGaWxlIHRyYW5zZmVyIHJlc3VsdC5cbiAgICogQHBhcmFtIHs/fSBbZGF0YS5wYXlsb2FkXSAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IFtkYXRhLmJvZHldIC0gVjIgYnJvYWRjYXN0IGJvZHkuXG4gICAqL1xuICBvbkNvbW1hbmQgPSBhc3luYyAoZGF0YSkgPT4ge1xuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW2BXb3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSByZWNlaXZlZCBjb21tYW5kYCwgZGF0YV0pXG5cbiAgICBjb25zdCBjb21tYW5kID0gZGF0YS5jb21tYW5kXG5cbiAgICBpZiAoY29tbWFuZCA9PSBcIm5ld0NsaWVudFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZU5ld0NsaWVudChkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudFdyaXRlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ2xpZW50V3JpdGUoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjbGllbnRGaWxlUmVzdWx0XCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ2xpZW50RmlsZVJlc3VsdChkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudEFib3J0XCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ2xpZW50QWJvcnQoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ3ZWJzb2NrZXRFdmVudFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVdlYnNvY2tldEV2ZW50KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0VjJCcm9hZGNhc3RcIikge1xuICAgICAgdGhpcy5oYW5kbGVXZWJzb2NrZXRWMkJyb2FkY2FzdChkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImRlYnVnU25hcHNob3RcIikge1xuICAgICAgdGhpcy5oYW5kbGVEZWJ1Z1NuYXBzaG90KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic2h1dGRvd25cIikge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTaHV0ZG93bigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgbmV3IGNsaWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5jbGllbnRDb3VudF0gLSBDbGllbnQgY291bnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5yZW1vdGVBZGRyZXNzXSAtIFJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZU5ld0NsaWVudChkYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjb25zdCB7Y2xpZW50Q291bnQsIHJlbW90ZUFkZHJlc3N9ID0gZGF0YVxuXG4gICAgaWYgKHR5cGVvZiBjbGllbnRDb3VudCAhPT0gXCJudW1iZXJcIikgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50Q291bnQgbXVzdCBiZSBhIG51bWJlclwiKVxuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCh7XG4gICAgICBjbGllbnRDb3VudCxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlbW90ZUFkZHJlc3NcbiAgICB9KVxuXG4gICAgY2xpZW50LmV2ZW50cy5vbihcIm91dHB1dFwiLCAob3V0cHV0KSA9PiB7XG4gICAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50T3V0cHV0XCIsIGNsaWVudENvdW50LCBvdXRwdXR9KVxuICAgIH0pXG5cbiAgICBjbGllbnQuZXZlbnRzLm9uKFwiZmlsZVwiLCAoe2ZpbGVQYXRoLCBzZW5kQm9keSwgc2V0dGxlfSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJZCA9ICsrdGhpcy5maWxlVHJhbnNmZXJDb3VudFxuXG4gICAgICB0aGlzLmZpbGVUcmFuc2ZlcnMuc2V0KHRyYW5zZmVySWQsIHtjbGllbnRDb3VudCwgc2V0dGxlfSlcbiAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRGaWxlXCIsIGNsaWVudENvdW50LCBmaWxlUGF0aCwgc2VuZEJvZHksIHRyYW5zZmVySWR9KVxuICAgIH0pXG5cbiAgICBjbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgKG91dHB1dCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBcIkNsb3NlIHJlY2VpdmVkIGZyb20gY2xpZW50IGluIHdvcmtlciAtIGZvcndhcmRpbmcgdG8gd29ya2VyIHBhcmVudFwiKVxuICAgICAgdGhpcy5wYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImNsaWVudENsb3NlXCIsIGNsaWVudENvdW50LCBvdXRwdXR9KVxuICAgIH0pXG5cbiAgICB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdID0gY2xpZW50XG4gIH1cblxuICAvKipcbiAgICogU2V0dGxlcyBhIGZpbGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIHBhcmVudCBmaW5pc2hlcyBzb2NrZXQgZGVsaXZlcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRmlsZSByZXN1bHQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnRyYW5zZmVySWRdIC0gRmlsZSB0cmFuc2ZlciBpZC5cbiAgICogQHBhcmFtIHtcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCJ9IFtkYXRhLnJlc3VsdF0gLSBGaWxlIHRyYW5zZmVyIHJlc3VsdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHdvcmtlci1zaWRlIGNvbXBsZXRpb24gY2FsbGJhY2sgc2V0dGxlcy5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUNsaWVudEZpbGVSZXN1bHQoZGF0YSkge1xuICAgIGNvbnN0IHtyZXN1bHQsIHRyYW5zZmVySWR9ID0gZGF0YVxuXG4gICAgaWYgKHR5cGVvZiB0cmFuc2ZlcklkICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2ZlcklkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICBpZiAocmVzdWx0ICE9PSBcImNvbXBsZXRlZFwiICYmIHJlc3VsdCAhPT0gXCJhYm9ydGVkXCIpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlIHRyYW5zZmVyIHJlc3VsdDogJHtyZXN1bHR9YClcblxuICAgIGNvbnN0IHRyYW5zZmVyID0gdGhpcy5maWxlVHJhbnNmZXJzLmdldCh0cmFuc2ZlcklkKVxuXG4gICAgaWYgKCF0cmFuc2ZlcikgcmV0dXJuXG5cbiAgICB0aGlzLmZpbGVUcmFuc2ZlcnMuZGVsZXRlKHRyYW5zZmVySWQpXG4gICAgYXdhaXQgdHJhbnNmZXIuc2V0dGxlKHJlc3VsdClcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZmlsZSByZXNwb25zZXMgYmVsb25naW5nIHRvIGEgY2xvc2VkIHBhcmVudC1zaWRlIHNvY2tldC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBDbGllbnQgYWJvcnQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcGVuZGluZyBjb21wbGV0aW9uIGNhbGxiYWNrcyBzZXR0bGUuXG4gICAqL1xuICBhc3luYyBoYW5kbGVDbGllbnRBYm9ydChkYXRhKSB7XG4gICAgY29uc3Qge2NsaWVudENvdW50fSA9IGRhdGFcblxuICAgIGlmICh0eXBlb2YgY2xpZW50Q291bnQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImNsaWVudENvdW50IG11c3QgYmUgYSBudW1iZXJcIilcblxuICAgIGNvbnN0IHNldHRsZW1lbnRzID0gW11cbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICBpZiAoY2xpZW50KSBzZXR0bGVtZW50cy5wdXNoKGNsaWVudC5hYm9ydFBlbmRpbmdGaWxlUmVzcG9uc2VzKCkpXG5cbiAgICBmb3IgKGNvbnN0IFt0cmFuc2ZlcklkLCB0cmFuc2Zlcl0gb2YgdGhpcy5maWxlVHJhbnNmZXJzKSB7XG4gICAgICBpZiAodHJhbnNmZXIuY2xpZW50Q291bnQgIT09IGNsaWVudENvdW50KSBjb250aW51ZVxuXG4gICAgICB0aGlzLmZpbGVUcmFuc2ZlcnMuZGVsZXRlKHRyYW5zZmVySWQpXG4gICAgICBzZXR0bGVtZW50cy5wdXNoKHRyYW5zZmVyLnNldHRsZShcImFib3J0ZWRcIikpXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZXR0bGVtZW50cylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBjbGllbnQgd3JpdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmd9IFtkYXRhLmNodW5rXSAtIENodW5rLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0aGUgY2xpZW50IHdyaXRlIGlzIGRpc3BhdGNoZWQuXG4gICAqL1xuICBhc3luYyBoYW5kbGVDbGllbnRXcml0ZShkYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbChcIkxvb2tpbmcgdXAgY2xpZW50XCIpXG5cbiAgICBjb25zdCB7Y2h1bmssIGNsaWVudENvdW50fSA9IGRhdGFcbiAgICBpZiAoIWNodW5rKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBnaXZlblwiKVxuICAgIGNvbnN0IGNsaWVudCA9IC8qKiBAdHlwZSB7Q2xpZW50IHwgdW5kZWZpbmVkfSAqLyAoZGlnZyh0aGlzLmNsaWVudHMsIGNsaWVudENvdW50KSlcblxuICAgIGlmICghY2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoYENsaWVudCBub3QgZm91bmQgZm9yIGNsaWVudFdyaXRlOiAke2NsaWVudENvdW50fWApXG5cbiAgICBjb25zdCBjbGllbnRDaHVuayA9IHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGNodW5rKSA6IEJ1ZmZlci5mcm9tKGNodW5rKVxuXG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiU2VuZGluZyBjbGllbnRXcml0ZSB0byBwYXJzZXJcIiwge2NsaWVudENvdW50LCAuLi5zdW1tYXJpemVDbGllbnRXcml0ZUNodW5rKGNsaWVudENodW5rKX1dKVxuXG4gICAgY2xpZW50Lm9uV3JpdGUoY2xpZW50Q2h1bmspXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgd2Vic29ja2V0IGV2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNoYW5uZWxdIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7P30gW2RhdGEucGF5bG9hZF0gLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHRoZSB3ZWJzb2NrZXQgZXZlbnQgaXMgZGlzcGF0Y2hlZC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVdlYnNvY2tldEV2ZW50KGRhdGEpIHtcbiAgICBjb25zdCB7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSA9IGRhdGFcblxuICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2hhbm5lbCBnaXZlblwiKVxuXG4gICAgYXdhaXQgdGhpcy5icm9hZGNhc3RXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSB3ZWJzb2NrZXQgdjIgYnJvYWRjYXN0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2RhdGEuYnJvYWRjYXN0UGFyYW1zXSAtIFYyIGJyb2FkY2FzdCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IFtkYXRhLmJvZHldIC0gVjIgYnJvYWRjYXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jaGFubmVsXSAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVXZWJzb2NrZXRWMkJyb2FkY2FzdChkYXRhKSB7XG4gICAgY29uc3Qge2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgZXZlbnRJZH0gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIk5vIGNoYW5uZWwgZ2l2ZW5cIilcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fYnJvYWRjYXN0VG9DaGFubmVsTG9jYWwoY2hhbm5lbCwgYnJvYWRjYXN0UGFyYW1zIHx8IHt9LCBib2R5LCB7ZXZlbnRJZH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgZGVidWcgc25hcHNob3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEucmVxdWVzdElkXSAtIERlYnVnIHJlcXVlc3QgaWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRGVidWdTbmFwc2hvdChkYXRhKSB7XG4gICAgY29uc3Qge3JlcXVlc3RJZH0gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIHJlcXVlc3RJZCAhPT0gXCJudW1iZXJcIikgdGhyb3cgbmV3IEVycm9yKFwiZGVidWdTbmFwc2hvdCByZXF1ZXN0SWQgbXVzdCBiZSBhIG51bWJlclwiKVxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgdGhpcy5wYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgIGNvbW1hbmQ6IFwiZGVidWdTbmFwc2hvdFwiLFxuICAgICAgcmVxdWVzdElkLFxuICAgICAgc25hcHNob3Q6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRMb2NhbERlYnVnU25hcHNob3QoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgc2h1dGRvd24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB3b3JrZXIgc2h1dGRvd24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlU2h1dGRvd24oKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyh0aGlzLmNsaWVudHMpLm1hcCgoY2xpZW50KSA9PiBjbGllbnQuYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpKSlcbiAgICB0aGlzLmZpbGVUcmFuc2ZlcnMuY2xlYXIoKVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbj8uY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKClcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwic2h1dGRvd25Db21wbGV0ZVwifSlcbiAgICBwcm9jZXNzLmV4aXQoMClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJyb2FkY2FzdCB3ZWJzb2NrZXQgZXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmNyZWF0ZWRBdCAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmV2ZW50SWQgLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gez99IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGJyb2FkY2FzdFdlYnNvY2tldEV2ZW50KHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KSB7XG4gICAgY29uc3Qgc2VuZFRhc2tzID0gW11cblxuICAgIGZvciAoY29uc3QgY2xpZW50S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY2xpZW50cykpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50c1tOdW1iZXIoY2xpZW50S2V5KV1cbiAgICAgIGlmICghY2xpZW50KSBjb250aW51ZVxuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGNsaWVudC53ZWJzb2NrZXRTZXNzaW9uXG5cbiAgICAgIGlmICghc2Vzc2lvbikgY29udGludWVcblxuICAgICAgc2VuZFRhc2tzLnB1c2goc2Vzc2lvbi5zZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWRcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIC8vIElzb2xhdGUgY2hhbm5lbCBzdWJzY3JpYmVyIGZhaWx1cmVzIHNvIGEgYnVnZ3kgaW4tcHJvY2VzcyBjYWxsYmFja1xuICAgICAgLy8gY2Fubm90IHJlamVjdCB0aGlzIGNvbW1hbmQgYW5kIGNyYXNoIHRoZSB3b3JrZXIgdGhyZWFkLCBidXQgc3RpbGxcbiAgICAgIC8vIHN1cmZhY2UgdGhlIGVycm9yIHRvIHRoZSBmcmFtZXdvcmsgZXJyb3IgZXZlbnRzIHNvIGJ1ZyByZXBvcnRlcnNcbiAgICAgIC8vIGNhbiBwaWNrIGl0IHVwLlxuICAgICAgc2VuZFRhc2tzLnB1c2goZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMoe2NoYW5uZWwsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgY3JlYXRlZEF0LCBldmVudElkLCBsb2dnZXI6IHRoaXMubG9nZ2VyLCBwYXlsb2FkfSkpXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VuZFRhc2tzKVxuICB9XG59XG4iXX0=
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXRocmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItdGhyZWFkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLDBCQUEwQixNQUFNLGtDQUFrQyxDQUFBO0FBQ3pFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxpQkFBaUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNsRSxPQUFPLGVBQWUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVwRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxLQUFLO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzRixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRTVJLE9BQU8sRUFBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FB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QUFFLENBQUM7WUFDdkIscUVBQXFFO1lBQ3JFLG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsa0JBQWtCO1lBQ2xCLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi9hcHBsaWNhdGlvbi5qc1wiXG5pbXBvcnQgQ2xpZW50IGZyb20gXCIuLi9jbGllbnQvaW5kZXguanNcIlxuaW1wb3J0IGRpc3BhdGNoQ2hhbm5lbFN1YnNjcmliZXJzIGZyb20gXCIuL2NoYW5uZWwtc3Vic2NyaWJlci1kaXNwYXRjaC5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IGVycm9yTG9nZ2VyIGZyb20gXCIuLi8uLi9lcnJvci1sb2dnZXIuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0RXZlbnRzIGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnRzLmpzXCJcblxuLyoqXG4gKiBSdW5zIHN1bW1hcml6ZSBjbGllbnQgd3JpdGUgY2h1bmsuXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmd9IGNodW5rIC0gQ2xpZW50IGlucHV0IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7e2xlbmd0aDogbnVtYmVyLCBwcmV2aWV3OiBzdHJpbmd9fSAtIENodW5rIHN1bW1hcnkgZm9yIGxvZ2dpbmcuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZUNsaWVudFdyaXRlQ2h1bmsoY2h1bmspIHtcbiAgY29uc3Qgbm9ybWFsaXplZENodW5rID0gdHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oY2h1bmspIDogQnVmZmVyLmZyb20oY2h1bmspXG4gIGNvbnN0IHByZXZpZXcgPSBub3JtYWxpemVkQ2h1bmsudG9TdHJpbmcoXCJsYXRpbjFcIiwgMCwgTWF0aC5taW4obm9ybWFsaXplZENodW5rLmxlbmd0aCwgMTYwKSkucmVwbGFjZUFsbChcIlxcclwiLCBcIlxcXFxyXCIpLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcXFxcblwiKVxuXG4gIHJldHVybiB7bGVuZ3RoOiBub3JtYWxpemVkQ2h1bmsubGVuZ3RoLCBwcmV2aWV3fVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyV29ya2VySGFuZGxlcldvcmtlclRocmVhZCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIndvcmtlcl90aHJlYWRzXCIpLnBhcmVudFBvcnR9IGFyZ3MucGFyZW50UG9ydCAtIFBhcmVudCBwb3J0LlxuICAgKiBAcGFyYW0ge3tkZWJ1ZzogYm9vbGVhbiwgZGlyZWN0b3J5OiBzdHJpbmcsIGVudmlyb25tZW50OiBzdHJpbmcsIHdvcmtlckNvdW50OiBudW1iZXJ9fSBhcmdzLndvcmtlckRhdGEgLSBXb3JrZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3BhcmVudFBvcnQsIHdvcmtlckRhdGF9KSB7XG4gICAgaWYgKCFwYXJlbnRQb3J0KSB0aHJvdyBuZXcgRXJyb3IoXCJwYXJlbnRQb3J0IGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCB7d29ya2VyQ291bnR9ID0gd29ya2VyRGF0YVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBDbGllbnQ+fSAqL1xuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLnBhcmVudFBvcnQgPSBwYXJlbnRQb3J0XG4gICAgdGhpcy53b3JrZXJEYXRhID0gd29ya2VyRGF0YVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuICAgIHRoaXMuZmlsZVRyYW5zZmVyQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge01hcDxudW1iZXIsIHtjbGllbnRDb3VudDogbnVtYmVyLCBzZXR0bGU6IChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gUHJvbWlzZTx2b2lkPn0+fSAqL1xuICAgIHRoaXMuZmlsZVRyYW5zZmVycyA9IG5ldyBNYXAoKVxuXG4gICAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgZXJyb3JMb2dnZXIodGhpcy5vbkNvbW1hbmQpKVxuXG4gICAgdGhpcy5pbml0aWFsaXplKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXBwbGljYXRpb24pIHRocm93IG5ldyBFcnJvcihcIkFwcGxpY2F0aW9uIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICB0aGlzLmFwcGxpY2F0aW9uLmluaXRpYWxpemUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgV29ya2VyICR7d29ya2VyQ291bnR9IHN0YXJ0ZWRgKVxuICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcInN0YXJ0ZWRcIn0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCB7ZGVidWcsIGRpcmVjdG9yeSwgZW52aXJvbm1lbnR9ID0gdGhpcy53b3JrZXJEYXRhXG4gICAgY29uc3QgY29uZmlndXJhdGlvblBhdGggPSBgJHtkaXJlY3Rvcnl9L3NyYy9jb25maWcvY29uZmlndXJhdGlvbi5qc2BcbiAgICBjb25zdCBjb25maWd1cmF0aW9uSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKGNvbmZpZ3VyYXRpb25QYXRoKSlcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAqL1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihgQ29uZmlndXJhdGlvbiBjb3VsZG4ndCBiZSBsb2FkZWQgZnJvbTogJHtjb25maWd1cmF0aW9uUGF0aH1gKVxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuY29uZmlndXJhdGlvblxuXG4gICAgY29uZmlndXJhdGlvbi5kZWJ1ZyA9IGRlYnVnID09PSB0cnVlXG4gICAgY29uZmlndXJhdGlvbi5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudClcbiAgICBjb25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIldvcmtlciB0aHJlYWQgY29uZmlndXJhdGlvbiBsb2FkZWRcIiwge2RlYnVnOiBjb25maWd1cmF0aW9uLmRlYnVnLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH1dKVxuICAgIHRoaXMud2Vic29ja2V0RXZlbnRzID0gbmV3IFdlYnNvY2tldEV2ZW50cyh7cGFyZW50UG9ydDogdGhpcy5wYXJlbnRQb3J0LCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgY29uZmlndXJhdGlvbi5zZXRXZWJzb2NrZXRFdmVudHModGhpcy53ZWJzb2NrZXRFdmVudHMpXG5cbiAgICB0aGlzLmFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKHtjb25maWd1cmF0aW9uLCB0eXBlOiBcIndvcmtlci1oYW5kbGVyXCJ9KVxuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplKHt0eXBlOiBcIndvcmtlci1oYW5kbGVyXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21tYW5kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IHN0cmluZ30gW2RhdGEuY2h1bmtdIC0gQ2h1bmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5yZW1vdGVBZGRyZXNzXSAtIFJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY2hhbm5lbF0gLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnJlcXVlc3RJZF0gLSBEZWJ1ZyByZXF1ZXN0IGlkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEudHJhbnNmZXJJZF0gLSBGaWxlIHRyYW5zZmVyIGlkLlxuICAgKiBAcGFyYW0ge1wiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIn0gW2RhdGEucmVzdWx0XSAtIEZpbGUgdHJhbnNmZXIgcmVzdWx0LlxuICAgKiBAcGFyYW0gez99IFtkYXRhLnBheWxvYWRdIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbZGF0YS5icm9hZGNhc3RQYXJhbXNdIC0gVjIgYnJvYWRjYXN0IGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gW2RhdGEuYm9keV0gLSBWMiBicm9hZGNhc3QgYm9keS5cbiAgICovXG4gIG9uQ29tbWFuZCA9IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBbYFdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHJlY2VpdmVkIGNvbW1hbmRgLCBkYXRhXSlcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBkYXRhLmNvbW1hbmRcblxuICAgIGlmIChjb21tYW5kID09IFwibmV3Q2xpZW50XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlTmV3Q2xpZW50KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50V3JpdGVcIikge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDbGllbnRXcml0ZShkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudEZpbGVSZXN1bHRcIikge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDbGllbnRGaWxlUmVzdWx0KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50QWJvcnRcIikge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDbGllbnRBYm9ydChkYXRhKVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIndlYnNvY2tldEV2ZW50XCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlV2Vic29ja2V0RXZlbnQoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ3ZWJzb2NrZXRWMkJyb2FkY2FzdFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVdlYnNvY2tldFYyQnJvYWRjYXN0KGRhdGEpXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZGVidWdTbmFwc2hvdFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZURlYnVnU25hcHNob3QoZGF0YSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzaHV0ZG93blwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNodXRkb3duKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBuZXcgY2xpZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnJlbW90ZUFkZHJlc3NdIC0gUmVtb3RlIGFkZHJlc3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlTmV3Q2xpZW50KGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGNvbnN0IHtjbGllbnRDb3VudCwgcmVtb3RlQWRkcmVzc30gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNsaWVudENvdW50ICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRDb3VudCBtdXN0IGJlIGEgbnVtYmVyXCIpXG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3RlQWRkcmVzc1xuICAgIH0pXG5cbiAgICBjbGllbnQuZXZlbnRzLm9uKFwib3V0cHV0XCIsIChvdXRwdXQsIHt3ZWJzb2NrZXRGcmFtZSA9IGZhbHNlfSA9IHt9KSA9PiB7XG4gICAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50T3V0cHV0XCIsIGNsaWVudENvdW50LCBvdXRwdXQsIHdlYnNvY2tldEZyYW1lfSlcbiAgICB9KVxuXG4gICAgY2xpZW50LmV2ZW50cy5vbihcImZpbGVcIiwgKHtmaWxlUGF0aCwgc2VuZEJvZHksIHNldHRsZX0pID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySWQgPSArK3RoaXMuZmlsZVRyYW5zZmVyQ291bnRcblxuICAgICAgdGhpcy5maWxlVHJhbnNmZXJzLnNldCh0cmFuc2ZlcklkLCB7Y2xpZW50Q291bnQsIHNldHRsZX0pXG4gICAgICB0aGlzLnBhcmVudFBvcnQucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiY2xpZW50RmlsZVwiLCBjbGllbnRDb3VudCwgZmlsZVBhdGgsIHNlbmRCb2R5LCB0cmFuc2ZlcklkfSlcbiAgICB9KVxuXG4gICAgY2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsIChvdXRwdXQpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gXCJDbG9zZSByZWNlaXZlZCBmcm9tIGNsaWVudCBpbiB3b3JrZXIgLSBmb3J3YXJkaW5nIHRvIHdvcmtlciBwYXJlbnRcIilcbiAgICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJjbGllbnRDbG9zZVwiLCBjbGllbnRDb3VudCwgb3V0cHV0fSlcbiAgICB9KVxuXG4gICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IGNsaWVudFxuICB9XG5cbiAgLyoqXG4gICAqIFNldHRsZXMgYSBmaWxlIHJlc3BvbnNlIGFmdGVyIHRoZSBwYXJlbnQgZmluaXNoZXMgc29ja2V0IGRlbGl2ZXJ5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEZpbGUgcmVzdWx0IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS50cmFuc2ZlcklkXSAtIEZpbGUgdHJhbnNmZXIgaWQuXG4gICAqIEBwYXJhbSB7XCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwifSBbZGF0YS5yZXN1bHRdIC0gRmlsZSB0cmFuc2ZlciByZXN1bHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSB3b3JrZXItc2lkZSBjb21wbGV0aW9uIGNhbGxiYWNrIHNldHRsZXMuXG4gICAqL1xuICBhc3luYyBoYW5kbGVDbGllbnRGaWxlUmVzdWx0KGRhdGEpIHtcbiAgICBjb25zdCB7cmVzdWx0LCB0cmFuc2ZlcklkfSA9IGRhdGFcblxuICAgIGlmICh0eXBlb2YgdHJhbnNmZXJJZCAhPT0gXCJudW1iZXJcIikgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNmZXJJZCBtdXN0IGJlIGEgbnVtYmVyXCIpXG4gICAgaWYgKHJlc3VsdCAhPT0gXCJjb21wbGV0ZWRcIiAmJiByZXN1bHQgIT09IFwiYWJvcnRlZFwiKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZSB0cmFuc2ZlciByZXN1bHQ6ICR7cmVzdWx0fWApXG5cbiAgICBjb25zdCB0cmFuc2ZlciA9IHRoaXMuZmlsZVRyYW5zZmVycy5nZXQodHJhbnNmZXJJZClcblxuICAgIGlmICghdHJhbnNmZXIpIHJldHVyblxuXG4gICAgdGhpcy5maWxlVHJhbnNmZXJzLmRlbGV0ZSh0cmFuc2ZlcklkKVxuICAgIGF3YWl0IHRyYW5zZmVyLnNldHRsZShyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGZpbGUgcmVzcG9uc2VzIGJlbG9uZ2luZyB0byBhIGNsb3NlZCBwYXJlbnQtc2lkZSBzb2NrZXQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQ2xpZW50IGFib3J0IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5jbGllbnRDb3VudF0gLSBDbGllbnQgY291bnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHBlbmRpbmcgY29tcGxldGlvbiBjYWxsYmFja3Mgc2V0dGxlLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ2xpZW50QWJvcnQoZGF0YSkge1xuICAgIGNvbnN0IHtjbGllbnRDb3VudH0gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNsaWVudENvdW50ICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRDb3VudCBtdXN0IGJlIGEgbnVtYmVyXCIpXG5cbiAgICBjb25zdCBzZXR0bGVtZW50cyA9IFtdXG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzW2NsaWVudENvdW50XVxuXG4gICAgaWYgKGNsaWVudCkgc2V0dGxlbWVudHMucHVzaChjbGllbnQuYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpKVxuXG4gICAgZm9yIChjb25zdCBbdHJhbnNmZXJJZCwgdHJhbnNmZXJdIG9mIHRoaXMuZmlsZVRyYW5zZmVycykge1xuICAgICAgaWYgKHRyYW5zZmVyLmNsaWVudENvdW50ICE9PSBjbGllbnRDb3VudCkgY29udGludWVcblxuICAgICAgdGhpcy5maWxlVHJhbnNmZXJzLmRlbGV0ZSh0cmFuc2ZlcklkKVxuICAgICAgc2V0dGxlbWVudHMucHVzaCh0cmFuc2Zlci5zZXR0bGUoXCJhYm9ydGVkXCIpKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc2V0dGxlbWVudHMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2xpZW50IHdyaXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtCdWZmZXIgfCBVaW50OEFycmF5IHwgc3RyaW5nfSBbZGF0YS5jaHVua10gLSBDaHVuay5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gdGhlIGNsaWVudCB3cml0ZSBpcyBkaXNwYXRjaGVkLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ2xpZW50V3JpdGUoZGF0YSkge1xuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoXCJMb29raW5nIHVwIGNsaWVudFwiKVxuXG4gICAgY29uc3Qge2NodW5rLCBjbGllbnRDb3VudH0gPSBkYXRhXG4gICAgaWYgKCFjaHVuaykgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2h1bmsgZ2l2ZW5cIilcbiAgICBjb25zdCBjbGllbnQgPSAvKiogQHR5cGUge0NsaWVudCB8IHVuZGVmaW5lZH0gKi8gKGRpZ2codGhpcy5jbGllbnRzLCBjbGllbnRDb3VudCkpXG5cbiAgICBpZiAoIWNsaWVudCkgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgbm90IGZvdW5kIGZvciBjbGllbnRXcml0ZTogJHtjbGllbnRDb3VudH1gKVxuXG4gICAgY29uc3QgY2xpZW50Q2h1bmsgPSB0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShjaHVuaykgOiBCdWZmZXIuZnJvbShjaHVuaylcblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlNlbmRpbmcgY2xpZW50V3JpdGUgdG8gcGFyc2VyXCIsIHtjbGllbnRDb3VudCwgLi4uc3VtbWFyaXplQ2xpZW50V3JpdGVDaHVuayhjbGllbnRDaHVuayl9XSlcblxuICAgIGNsaWVudC5vbldyaXRlKGNsaWVudENodW5rKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIHdlYnNvY2tldCBldmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jaGFubmVsXSAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXZlbnRJZF0gLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gez99IFtkYXRhLnBheWxvYWRdIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0aGUgd2Vic29ja2V0IGV2ZW50IGlzIGRpc3BhdGNoZWQuXG4gICAqL1xuICBhc3luYyBoYW5kbGVXZWJzb2NrZXRFdmVudChkYXRhKSB7XG4gICAgY29uc3Qge2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0gPSBkYXRhXG5cbiAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIk5vIGNoYW5uZWwgZ2l2ZW5cIilcblxuICAgIGF3YWl0IHRoaXMuYnJvYWRjYXN0V2Vic29ja2V0RXZlbnQoe2NoYW5uZWwsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgd2Vic29ja2V0IHYyIGJyb2FkY2FzdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFtkYXRhLmJyb2FkY2FzdFBhcmFtc10gLSBWMiBicm9hZGNhc3QgZmlsdGVyIHBhcmFtcy5cbiAgICogQHBhcmFtIHs/fSBbZGF0YS5ib2R5XSAtIFYyIGJyb2FkY2FzdCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY2hhbm5lbF0gLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlV2Vic29ja2V0VjJCcm9hZGNhc3QoZGF0YSkge1xuICAgIGNvbnN0IHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGV2ZW50SWR9ID0gZGF0YVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaGFubmVsIGdpdmVuXCIpXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2Jyb2FkY2FzdFRvQ2hhbm5lbExvY2FsKGNoYW5uZWwsIGJyb2FkY2FzdFBhcmFtcyB8fCB7fSwgYm9keSwge2V2ZW50SWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnJlcXVlc3RJZF0gLSBEZWJ1ZyByZXF1ZXN0IGlkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZURlYnVnU25hcHNob3QoZGF0YSkge1xuICAgIGNvbnN0IHtyZXF1ZXN0SWR9ID0gZGF0YVxuXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImRlYnVnU25hcHNob3QgcmVxdWVzdElkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIHRoaXMucGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICBjb21tYW5kOiBcImRlYnVnU25hcHNob3RcIixcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIHNuYXBzaG90OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0TG9jYWxEZWJ1Z1NuYXBzaG90KClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIHNodXRkb3duLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgd29ya2VyIHNodXRkb3duIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVNodXRkb3duKCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKS5tYXAoKGNsaWVudCkgPT4gY2xpZW50LmFib3J0UGVuZGluZ0ZpbGVSZXNwb25zZXMoKSkpXG4gICAgdGhpcy5maWxlVHJhbnNmZXJzLmNsZWFyKClcblxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24/LmNsb3NlRGF0YWJhc2VDb25uZWN0aW9ucykge1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmNsb3NlRGF0YWJhc2VDb25uZWN0aW9ucygpXG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcInNodXRkb3duQ29tcGxldGVcIn0pXG4gICAgcHJvY2Vzcy5leGl0KDApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBicm9hZGNhc3Qgd2Vic29ja2V0IGV2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5jcmVhdGVkQXQgLSBFdmVudCBjcmVhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5ldmVudElkIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3RXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSkge1xuICAgIGNvbnN0IHNlbmRUYXNrcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNsaWVudEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNsaWVudHMpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHNbTnVtYmVyKGNsaWVudEtleSldXG4gICAgICBpZiAoIWNsaWVudCkgY29udGludWVcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBjbGllbnQud2Vic29ja2V0U2Vzc2lvblxuXG4gICAgICBpZiAoIXNlc3Npb24pIGNvbnRpbnVlXG5cbiAgICAgIHNlbmRUYXNrcy5wdXNoKHNlc3Npb24uc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uKSB7XG4gICAgICAvLyBJc29sYXRlIGNoYW5uZWwgc3Vic2NyaWJlciBmYWlsdXJlcyBzbyBhIGJ1Z2d5IGluLXByb2Nlc3MgY2FsbGJhY2tcbiAgICAgIC8vIGNhbm5vdCByZWplY3QgdGhpcyBjb21tYW5kIGFuZCBjcmFzaCB0aGUgd29ya2VyIHRocmVhZCwgYnV0IHN0aWxsXG4gICAgICAvLyBzdXJmYWNlIHRoZSBlcnJvciB0byB0aGUgZnJhbWV3b3JrIGVycm9yIGV2ZW50cyBzbyBidWcgcmVwb3J0ZXJzXG4gICAgICAvLyBjYW4gcGljayBpdCB1cC5cbiAgICAgIHNlbmRUYXNrcy5wdXNoKGRpc3BhdGNoQ2hhbm5lbFN1YnNjcmliZXJzKHtjaGFubmVsLCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIGNyZWF0ZWRBdCwgZXZlbnRJZCwgbG9nZ2VyOiB0aGlzLmxvZ2dlciwgcGF5bG9hZH0pKVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHNlbmRUYXNrcylcbiAgfVxufVxuIl19
|