@discordeno/gateway 22.0.1-next.fca3cbb → 22.0.1-next.fdb61e1
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/dist/Shard.d.ts +2 -3
- package/dist/Shard.d.ts.map +1 -1
- package/dist/Shard.js +11 -21
- package/dist/manager.d.ts +11 -1
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +12 -1
- package/package.json +13 -13
package/dist/Shard.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
1
|
import { type Inflate, type ZstdDecompress } from 'node:zlib';
|
|
3
2
|
import type { DiscordGatewayPayload, DiscordUpdatePresence } from '@discordeno/types';
|
|
4
3
|
import { LeakyBucket, logger } from '@discordeno/utils';
|
|
@@ -90,13 +89,13 @@ export declare class DiscordenoShard {
|
|
|
90
89
|
/** Handle a gateway connection close. */
|
|
91
90
|
handleClose(close: CloseEvent): Promise<void>;
|
|
92
91
|
/** Handle an incoming gateway message. */
|
|
93
|
-
handleMessage(message: MessageEvent): Promise<void>;
|
|
92
|
+
handleMessage(message: MessageEvent<ArrayBuffer | string>): Promise<void>;
|
|
94
93
|
/**
|
|
95
94
|
* Decompress a zlib/zstd compressed packet
|
|
96
95
|
*
|
|
97
96
|
* @private
|
|
98
97
|
*/
|
|
99
|
-
decompressPacket(data: ArrayBuffer
|
|
98
|
+
decompressPacket(data: ArrayBuffer): Promise<string | null>;
|
|
100
99
|
/** Handles a incoming gateway packet. */
|
|
101
100
|
handleDiscordPacket(packet: DiscordGatewayPayload): Promise<void>;
|
|
102
101
|
/**
|
package/dist/Shard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shard.d.ts","sourceRoot":"","sources":["../src/Shard.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Shard.d.ts","sourceRoot":"","sources":["../src/Shard.ts"],"names":[],"mappings":"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"}
|
package/dist/Shard.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
1
|
import { createInflate, createZstdDecompress, inflateSync, constants as zlibConstants } from 'node:zlib';
|
|
3
2
|
import { GatewayCloseEventCodes, GatewayOpcodes } from '@discordeno/types';
|
|
4
3
|
import { delay, LeakyBucket, logger } from '@discordeno/utils';
|
|
@@ -346,20 +345,17 @@ export class DiscordenoShard {
|
|
|
346
345
|
}
|
|
347
346
|
}
|
|
348
347
|
/** Handle an incoming gateway message. */ async handleMessage(message) {
|
|
349
|
-
|
|
350
|
-
const isCompressed = message.data instanceof ArrayBuffer || message.data instanceof Buffer;
|
|
351
|
-
const data = isCompressed ? await this.decompressPacket(message.data) : JSON.parse(message.data);
|
|
348
|
+
const data = message.data instanceof ArrayBuffer ? await this.decompressPacket(message.data) : message.data;
|
|
352
349
|
// Check if the decompression was not successful
|
|
353
350
|
if (!data) return;
|
|
354
|
-
await this.handleDiscordPacket(data);
|
|
351
|
+
await this.handleDiscordPacket(JSON.parse(data));
|
|
355
352
|
}
|
|
356
353
|
/**
|
|
357
354
|
* Decompress a zlib/zstd compressed packet
|
|
358
355
|
*
|
|
359
356
|
* @private
|
|
360
357
|
*/ async decompressPacket(data) {
|
|
361
|
-
|
|
362
|
-
const compressedData = data instanceof Buffer ? data : new Uint8Array(data);
|
|
358
|
+
const compressedData = new Uint8Array(data);
|
|
363
359
|
if (this.gatewayConfig.transportCompression) {
|
|
364
360
|
if (!this.inflate) {
|
|
365
361
|
this.logger.fatal('[Shard] Transport compression was enabled but no instance of the decompression was found.');
|
|
@@ -376,12 +372,12 @@ export class DiscordenoShard {
|
|
|
376
372
|
}
|
|
377
373
|
const decodedData = this.textDecoder.decode(this.inflateBuffer);
|
|
378
374
|
this.inflateBuffer = null;
|
|
379
|
-
return
|
|
375
|
+
return decodedData;
|
|
380
376
|
}
|
|
381
377
|
if (this.gatewayConfig.compress) {
|
|
382
378
|
const decompressed = inflateSync(compressedData);
|
|
383
379
|
const decodedData = this.textDecoder.decode(decompressed);
|
|
384
|
-
return
|
|
380
|
+
return decodedData;
|
|
385
381
|
}
|
|
386
382
|
return null;
|
|
387
383
|
}
|
|
@@ -409,21 +405,15 @@ export class DiscordenoShard {
|
|
|
409
405
|
const interval = packet.d.heartbeat_interval;
|
|
410
406
|
this.logger.debug(`[Shard] Shard #${this.id} received Hello`);
|
|
411
407
|
this.startHeartbeating(interval);
|
|
408
|
+
// We need to recalculate the safe requests here, since the heartbeat interval could have changed
|
|
409
|
+
this.bucket.max = this.calculateSafeRequests();
|
|
410
|
+
this.bucket.refillAmount = this.calculateSafeRequests();
|
|
412
411
|
if (this.state !== ShardState.Resuming) {
|
|
413
|
-
const currentQueue = [
|
|
414
|
-
...this.bucket.queue
|
|
415
|
-
];
|
|
416
412
|
// HELLO has been send on a non resume action.
|
|
417
413
|
// This means that the shard starts a new session,
|
|
418
414
|
// therefore the rate limit interval has been reset too.
|
|
419
|
-
this.bucket =
|
|
420
|
-
|
|
421
|
-
refillInterval: 60000,
|
|
422
|
-
refillAmount: this.calculateSafeRequests(),
|
|
423
|
-
logger: this.logger
|
|
424
|
-
});
|
|
425
|
-
// Queue should not be lost on a re-identify.
|
|
426
|
-
this.bucket.queue.unshift(...currentQueue);
|
|
415
|
+
this.bucket.used = 0;
|
|
416
|
+
this.bucket.refillBucket();
|
|
427
417
|
}
|
|
428
418
|
this.events.hello?.(this);
|
|
429
419
|
break;
|
|
@@ -588,4 +578,4 @@ export class DiscordenoShard {
|
|
|
588
578
|
}
|
|
589
579
|
export default DiscordenoShard;
|
|
590
580
|
|
|
591
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQgeyBjcmVhdGVJbmZsYXRlLCBjcmVhdGVac3RkRGVjb21wcmVzcywgdHlwZSBJbmZsYXRlLCBpbmZsYXRlU3luYywgdHlwZSBac3RkRGVjb21wcmVzcywgY29uc3RhbnRzIGFzIHpsaWJDb25zdGFudHMgfSBmcm9tICdub2RlOnpsaWInO1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5LCBEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcyc7XG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJztcbmltcG9ydCB7IGRlbGF5LCBMZWFreUJ1Y2tldCwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBTaGFyZEV2ZW50cyxcbiAgdHlwZSBTaGFyZEdhdGV3YXlDb25maWcsXG4gIHR5cGUgU2hhcmRIZWFydCxcbiAgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLFxuICB0eXBlIFNoYXJkU29ja2V0UmVxdWVzdCxcbiAgU2hhcmRTdGF0ZSxcbiAgVHJhbnNwb3J0Q29tcHJlc3Npb24sXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBaTElCX1NZTkNfRkxVU0ggPSBuZXcgVWludDhBcnJheShbMHgwLCAweDAsIDB4ZmYsIDB4ZmZdKTtcblxuZXhwb3J0IGNsYXNzIERpc2NvcmRlbm9TaGFyZCB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNoYXJkLiAqL1xuICBpZDogbnVtYmVyO1xuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZztcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnQ7XG4gIC8qKiBUaGUgbWF4aW11bSBvZiByZXF1ZXN0cyB3aGljaCBjYW4gYmUgc2VuZCB0byBkaXNjb3JkIHBlciByYXRlIGxpbWl0IHRpY2suIFR5cGljYWxseSB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gKi9cbiAgbWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrOiBudW1iZXIgPSAxMjA7XG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDA7XG4gIC8qKiBDdXJyZW50IHNlc3Npb24gaWQgb2YgdGhlIHNoYXJkIGlmIHByZXNlbnQuICovXG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IFdlYlNvY2tldDtcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICAvKiogVGhlIHVybCBwcm92aWRlZCBieSBkaXNjb3JkIHRvIHVzZSB3aGVuIHJlc3VtaW5nIGEgY29ubmVjdGlvbiBmb3IgdGhpcyB0aGlzLiAqL1xuICByZXN1bWVHYXRld2F5VXJsOiBzdHJpbmcgPSAnJztcbiAgLyoqIFRoZSBzaGFyZCByZWxhdGVkIGV2ZW50IGhhbmRsZXJzLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzID0ge307XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIC8qKiBSZXNvbHZlIGludGVybmFsIHdhaXRpbmcgc3RhdGVzLiBNYXBwZWQgYnkgU2VsZWN0ZWRFdmVudHMgPT4gUmVzb2x2ZUZ1bmN0aW9uICovXG4gIHJlc29sdmVzID0gbmV3IE1hcDwnUkVBRFknIHwgJ1JFU1VNRUQnIHwgJ0lOVkFMSURfU0VTU0lPTicsIChwYXlsb2FkOiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpID0+IHZvaWQ+KCk7XG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXQ7XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKipcbiAgICogSXMgdGhlIHNoYXJkIGdvaW5nIG9mZmxpbmU/XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgd2lsbCBiZSB0cnVlIGlmIHRoZSBjbG9zZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHdpdGggZWl0aGVyIDEwMDAgb3IgMTAwMVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ29pbmdPZmZsaW5lID0gZmFsc2U7XG4gIC8qKiBUZXh0IGRlY29kZXIgdXNlZCBmb3IgY29tcHJlc3NlZCBwYXlsb2Fkcy4gKi9cbiAgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgLyoqIHpsaWIgSW5mbGF0ZSBvciB6c3RkIGRlY29tcHJlc3MgaW5zdGFuY2UgZm9yIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGUgfCBac3RkRGVjb21wcmVzcztcbiAgLyoqIHpsaWIgaW5mbGF0ZS96c3RkIGJ1ZmZlci4gKi9cbiAgaW5mbGF0ZUJ1ZmZlcjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhlIHNvY2tldCBpcyBjbG9zZWQgYW5kIGhhbmRsZUNsb3NlKCkgaGFzIGZpbmlzaGVkIHVwZGF0aW5nIGludGVybmFsIHN0YXRlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogVGhpcyBpcyBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb25seSwgYW5kIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcy5cbiAgICovXG4gIHJlc29sdmVBZnRlckNsb3NlPzogKGNsb3NlOiBDbG9zZUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYXJkQ3JlYXRlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvbjtcbiAgICB0aGlzLmV2ZW50cyA9IG9wdGlvbnMuZXZlbnRzO1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyO1xuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RJZGVudGlmeSkgdGhpcy5yZXF1ZXN0SWRlbnRpZnkgPSBvcHRpb25zLnJlcXVlc3RJZGVudGlmeTtcbiAgICBpZiAob3B0aW9ucy5tYWtlUHJlc2VuY2UpIHRoaXMubWFrZVByZXNlbmNlID0gb3B0aW9ucy5tYWtlUHJlc2VuY2U7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBnYXRld2F5IGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQuICovXG4gIGdldCBnYXRld2F5Q29uZmlnKCk6IFNoYXJkR2F0ZXdheUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbjtcbiAgfVxuXG4gIC8qKiBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uIEluaXRpYWxseSB0aGlzIGlzIHRoZSBkaXNjb3JkIGdhdGV3YXkgdXJsLCBhbmQgdGhlbiBpcyBzd2l0Y2hlZCB0byByZXN1bWUgZ2F0ZXdheSB1cmwgb25jZSBhIFJFQURZIGlzIHJlY2VpdmVkLiAqL1xuICBnZXQgY29ubmVjdGlvblVybCgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB8fCBhbmQgbm90ID8/IGhlcmUuID8/IHdpbGwgY2F1c2UgYSBidWcuXG4gICAgcmV0dXJuIHRoaXMucmVzdW1lR2F0ZXdheVVybCB8fCB0aGlzLmdhdGV3YXlDb25maWcudXJsO1xuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDI7XG5cbiAgICByZXR1cm4gc2FmZVJlcXVlc3RzIDwgMCA/IDAgOiBzYWZlUmVxdWVzdHM7XG4gIH1cblxuICBhc3luYyBjaGVja09mZmxpbmUoaGlnaFByaW9yaXR5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpO1xuICAgICAgZWxzZSB0aGlzLm9mZmxpbmVTZW5kUXVldWUucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVxdWVzdCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gdG8gY2xvc2UgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKTtcblxuICAgIGlmICh0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9J3MgcmVhZHkgc3RhdGUgaXMgJHt0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZX0sIFVuYWJsZSB0byBjbG9zZS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdvaW5nT2ZmbGluZSA9IGNvZGUgPT09IEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm9ybWFsQ2xvc3VyZSB8fCBjb2RlID09PSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkdvaW5nQXdheTtcblxuICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbCB0byBzb2NrZXQuY2xvc2UgYXMgZm9yIGV4YW1wbGUgQnVuIGNhbGxzIHNvY2tldC5vbmNsb3NlIGltbWVkaWF0ZWx5IG9uIHRoZSAuY2xvc2UoKSBjYWxsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZW5kXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHJlYXNvbik7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBXYWl0aW5nIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB0byBjbG9zZSB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGJlIGZ1bGx5IGNsb3NlZCwgb3RoZXJ3aXNlIHRoZXJlJ2xsIGJlIHJhY2UgY29uZGl0aW9uIGlzc3VlcyBpZiB3ZSB0cnkgdG8gY29ubmVjdCBhZ2FpbiwgcmVzdWx0aW5nIGluIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAgYXdhaXQgcHJvbWlzZTtcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApO1xuXG4gICAgLy8gUmVzZXQgdGhlIHJlc29sdmVBZnRlckNsb3NlIGZ1bmN0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29ubmVjdCB0aGUgc2hhcmQgd2l0aCB0aGUgZ2F0ZXdheSBhbmQgc3RhcnQgaGVhcnRiZWF0aW5nLiBUaGlzIHdpbGwgbm90IGlkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPERpc2NvcmRlbm9TaGFyZD4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgQ29ubmVjdGluZ2Agc3RhdGUsXG4gICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBDb25uZWN0aW5nIFNoYXJkICMke3RoaXMuaWR9IHNvY2tldC5gKTtcblxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25uZWN0aW9uVXJsKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJyk7XG5cbiAgICAvLyBTZXQgdGhlIGNvbXByZXNzIHVybCBwYXJhbSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0c1xuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb21wcmVzcycsIHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbik7XG5cbiAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpsaWIpIHtcbiAgICAgICAgdGhpcy5pbmZsYXRlID0gY3JlYXRlSW5mbGF0ZSh7XG4gICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWJDb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZSA9IGNyZWF0ZVpzdGREZWNvbXByZXNzKHtcbiAgICAgICAgICBjaHVua1NpemU6IDY0ICogMTAyNCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtTaGFyZF0gVW5rbm93biB0cmFuc3BvcnQgY29tcHJlc3Npb24gdHlwZTogJHt0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb259YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5mbGF0ZS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVGhlIHdhcyBhbiBlcnJvciBpbiBkZWNvbXByZXNzaW5nIGEgY29tcHJlc3NlZCBwYXlsb2FkJywgZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuaW5mbGF0ZUJ1ZmZlci5ieXRlTGVuZ3RoICsgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuaW5mbGF0ZUJ1ZmZlcik7XG4gICAgICAgICAgbmV3QnVmZmVyLnNldChkYXRhLCB0aGlzLmluZmxhdGVCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbmV3QnVmZmVyO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gZGF0YTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFBheWxvYWQgY29tcHJlc3Npb24gaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgdHJhbnNwb3J0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYXMgd2VsbC4nKTtcbiAgICAgIHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldCA9ICh0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKSk7XG5cbiAgICAvLyBCeSBkZWZhdWx0IFdlYlNvY2tldCB3aWxsIGdpdmUgdXMgYSBCbG9iLCB0aGlzIGNoYW5nZXMgaXQgc28gdGhhdCBpdCBnaXZlcyB1cyBhbiBBcnJheUJ1ZmZlclxuICAgIHNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgIHNvY2tldC5vbmVycm9yID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZUVycm9yKGV2ZW50KTtcbiAgICBzb2NrZXQub25jbG9zZSA9IChjbG9zZUV2ZW50KSA9PiB0aGlzLmhhbmRsZUNsb3NlKGNsb3NlRXZlbnQpO1xuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBVbmlkZW50aWZpZWRgIHN0YXRlIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gc29ja2V0IGNvbm5lY3RlZC5gKTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuIElmIG5vdCBjb25uZWN0ZWQsIHRoaXMgd2lsbCBhbHNvIGNvbm5lY3QgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LlxuICAgKiBAcGFyYW0gYnlwYXNzUmVxdWVzdCAtIFdoZXRoZXIgdG8gYnlwYXNzIHRoZSByZXF1ZXN0SWRlbnRpZnkgaGFuZGxlciBhbmQgaWRlbnRpZnkgaW1tZWRpYXRlbHkuIFRoaXMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5IGFzIGl0IGNhbiBjYXVzZSBpbnZhbGlkIHNlc3Npb25zLlxuICAgKi9cbiAgYXN5bmMgaWRlbnRpZnkoYnlwYXNzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSWRlbnRpZnlpbmcgb3BlbiBTaGFyZCAjJHt0aGlzLmlkfSwgY2xvc2luZyB0aGUgY29ubmVjdGlvbmApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZywgJ1JlLWlkZW50aWZ5aW5nIGNsb3N1cmUgb2Ygb2xkIGNvbm5lY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFieXBhc3NSZXF1ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nO1xuICAgIHRoaXMuZXZlbnRzLmlkZW50aWZ5aW5nPy4odGhpcyk7XG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNlbmRpbmcgSWRlbnRpZnkgcGF5bG9hZCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0uYCk7XG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5JZGVudGlmeSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgY29tcHJlc3M6IHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmdhdGV3YXlDb25maWcucHJvcGVydGllcyxcbiAgICAgICAgICBpbnRlbnRzOiB0aGlzLmdhdGV3YXlDb25maWcuaW50ZW50cyxcbiAgICAgICAgICBzaGFyZDogW3RoaXMuaWQsIHRoaXMuZ2F0ZXdheUNvbmZpZy50b3RhbFNoYXJkc10sXG4gICAgICAgICAgcHJlc2VuY2U6IGF3YWl0IHRoaXMubWFrZVByZXNlbmNlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgLy8gV2hlbiBpZGVudGlmeWluZyB0b28gZmFzdCwgRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZC5cbiAgICAgIC8vIFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHRob3VnaCBhbmQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBpZGVudGlmeSBhY3Rpb24uXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byBEaXNjb3JkIGlzIGN1cnJlbnRseSBvcGVuLiAqL1xuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgfVxuXG4gIC8qKiBBdHRlbXB0IHRvIHJlc3VtZSB0aGUgcHJldmlvdXMgc2hhcmRzIHNlc3Npb24gd2l0aCB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YCk7XG5cbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIG9wZW4gU2hhcmQgIyR7dGhpcy5pZH0sIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25gKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIFNoYXJkICMke3RoaXMuaWR9IHdpdGhvdXQgdGhlIHNlc3Npb24gaWQuIElkZW50aWZ5aW5nIHRoZSBzaGFyZCBpbnN0ZWFkLmApO1xuXG4gICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmc7XG5cbiAgICAvLyBCZWZvcmUgd2UgY2FuIHJlc3VtZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB3aXRoIERpc2NvcmQncyBnYXRld2F5LlxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpO1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gY29ubmVjdGVkLiBTZXNzaW9uIGlkOiAke3RoaXMuc2Vzc2lvbklkfSB8IFNlcXVlbmNlOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKTtcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKTtcblxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0gaGlnaFByaW9yaXR5IC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpO1xuXG4gICAgYXdhaXQgdGhpcy5idWNrZXQuYWNxdWlyZShoaWdoUHJpb3JpdHkpO1xuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSk7XG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gIH1cblxuICAvKiogU2h1dGRvd24gdGhlIHRoaXMuIEZvcmNlZnVsbHkgZGlzY29ubmVjdCB0aGUgc2hhcmQgZnJvbSBEaXNjb3JkLiBUaGUgc2hhcmQgbWF5IG5vdCBhdHRlbXB0IHRvIHJlY29ubmVjdCB3aXRoIERpc2NvcmQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duLCAnU2hhcmQgc2h1dHRpbmcgZG93bi4nKTtcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfS5gLCBlcnJvcik7XG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdGluZygpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIHpsaWIvenN0ZCBkYXRhXG4gICAgdGhpcy5pbmZsYXRlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGw7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0ke2Nsb3NlLnJlYXNvbiA/IGAsIGFuZCByZWFzb246ICR7Y2xvc2UucmVhc29ufWAgOiAnJ30uYCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBjbG9zZSBwcm9taXNlIGlmIGl0IGV4aXN0c1xuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2U/LihjbG9zZSk7XG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlc2UgY29kZXMgYXJlIHJlY2VpdmVkIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZy5cbiAgICAgIC8vIE9uIHRob3NlIHdlIGNhbm5vdCBzdGFydCBhIHJlY29ubmVjdCBhdHRlbXB0LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkF1dGhlbnRpY2F0aW9uRmFpbGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTaGFyZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TaGFyZGluZ1JlcXVpcmVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRBcGlWZXJzaW9uOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRJbnRlbnRzOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRpc2FsbG93ZWRJbnRlbnRzOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmU7XG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKTtcbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3RBdXRoZW50aWNhdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTZXE6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2Vzc2lvblRpbWVkT3V0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCByZXF1aXJpbmcgcmUtaWRlbnRpZnkuYCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nO1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IFRoaXMgY2FzZSBtdXN0IGFsd2F5cyBiZSByaWdodCBhYm92ZSB0aGUgY2FzZXMgdGhhdCBydW5zIHdpdGggZGVmYXVsdCBjYXNlIGJlY2F1c2Ugb2YgaG93IHN3aXRjaCB3b3JrcyB3aGVuIHlvdSBkb24ndCBicmVhayAvIHJldHVybiwgbW9yZSBpbmZvIGJlbG93LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vcm1hbENsb3N1cmU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuR29pbmdBd2F5OiB7XG4gICAgICAgIC8vIElmIHRoZSBzaGFyZCBpcyBtYXJrZWQgYXMgZ29pbmdPZmZsaW5lLCBpdCBzdGF5cyBkaXNjb25uZWN0ZWQuXG4gICAgICAgIGlmICh0aGlzLmdvaW5nT2ZmbGluZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZDtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICAgIHRoaXMuZ29pbmdPZmZsaW5lID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHdhbnQgdGhlIHNoYXJkIHRvIGdvIHRocm91Z2ggdGhlIGRlZmF1bHQgY2FzZSB3aGVyZSBpdCBnZXRzIHJlc3VtZWQsIGFzIGl0IG1pZ2h0IGJlIGFuIHVuZXhwZWN0ZWQgY2xvc3VyZSBmcm9tIERpc2NvcmQgb3IgQ2xvdWRmbGFyZSBmb3IgZXhhbXBsZSwgc28gd2UgZG9uJ3QgdXNlIGJyZWFrIC8gcmV0dXJuIGhlcmUuXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGVjb2RlRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuUmF0ZUxpbWl0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQWxyZWFkeUF1dGhlbnRpY2F0ZWQ6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVyZSB3ZSByZXN1bWUgZm9yZXZlciwgc28gaWYgd2Ugd2VyZSBhbHJlYWR5IHJlc3VtaW5nIHdlIGlkZW50aWZ5IGluc3RlYWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcgPyBTaGFyZFN0YXRlLklkZW50aWZ5aW5nIDogU2hhcmRTdGF0ZS5SZXN1bWluZztcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlIGFuIGluY29taW5nIGdhdGV3YXkgbWVzc2FnZS4gKi9cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgd3MgbnBtIHBhY2thZ2Ugd2lsbCB1c2UgYSBCdWZmZXIsIHdoaWxlIHRoZSBnbG9iYWwgYnVpbHQtaW4gd2lsbCB1c2UgQXJyYXlCdWZmZXJcbiAgICBjb25zdCBpc0NvbXByZXNzZWQgPSBtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBCdWZmZXI7XG5cbiAgICBjb25zdCBkYXRhID0gaXNDb21wcmVzc2VkID8gYXdhaXQgdGhpcy5kZWNvbXByZXNzUGFja2V0KG1lc3NhZ2UuZGF0YSkgOiAoSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpIGFzIERpc2NvcmRHYXRld2F5UGF5bG9hZCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGVjb21wcmVzc2lvbiB3YXMgbm90IHN1Y2Nlc3NmdWxcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGEgemxpYi96c3RkIGNvbXByZXNzZWQgcGFja2V0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBkZWNvbXByZXNzUGFja2V0KGRhdGE6IEFycmF5QnVmZmVyIHwgQnVmZmVyKTogUHJvbWlzZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQgfCBudWxsPiB7XG4gICAgLy8gQSBidWZmZXIgaXMgYSBVaW50OEFycmF5IHVuZGVyIHRoZSBob29kLiBBbiBBcnJheUJ1ZmZlciBpcyBnZW5lcmljLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgVWludDhBcnJheSB0aGF0IHVzZXMgdGhlIHdob2xlIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY29tcHJlc3NlZERhdGE6IFVpbnQ4QXJyYXkgPSBkYXRhIGluc3RhbmNlb2YgQnVmZmVyID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbikge1xuICAgICAgaWYgKCF0aGlzLmluZmxhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoJ1tTaGFyZF0gVHJhbnNwb3J0IGNvbXByZXNzaW9uIHdhcyBlbmFibGVkIGJ1dCBubyBpbnN0YW5jZSBvZiB0aGUgZGVjb21wcmVzc2lvbiB3YXMgZm91bmQuJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cml0ZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZSEud3JpdGUoY29tcHJlc3NlZERhdGEsICdiaW5hcnknLCAoZXJyb3IpID0+IChlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKCkpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliICYmICFlbmRzV2l0aE1hcmtlcihjb21wcmVzc2VkRGF0YSwgWkxJQl9TWU5DX0ZMVVNIKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGF3YWl0IHdyaXRlUHJvbWlzZTtcblxuICAgICAgaWYgKCF0aGlzLmluZmxhdGVCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBUaGUgWkxpYiBpbmZsYXRlIGJ1ZmZlciB3YXMgY2xlYXJlZCBhdCBhbiB1bmV4cGVjdGVkIG1vbWVudC4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUodGhpcy5pbmZsYXRlQnVmZmVyKTtcbiAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGw7XG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWREYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWQgPSBpbmZsYXRlU3luYyhjb21wcmVzc2VkRGF0YSk7XG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRlY29tcHJlc3NlZCk7XG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgaW5jb21pbmcgZ2F0ZXdheSBwYWNrZXQuICovXG4gIGFzeW5jIGhhbmRsZURpc2NvcmRQYWNrZXQocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFZGdlIGNhc2Ugc3RhcnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8vaXNzdWVzLzIzMTFcbiAgICB0aGlzLmhlYXJ0Lmxhc3RBY2sgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZTtcbiAgICAvLyBFZGdlIGNhc2UgZW5kIVxuXG4gICAgc3dpdGNoIChwYWNrZXQub3ApIHtcbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0OiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBEaXNjb3JkIHJhbmRvbWx5IHNlbmRzIHRoaXMgcmVxdWlyaW5nIGFuIGltbWVkaWF0ZSBoZWFydGJlYXQgYmFjay5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcyk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlbGxvOiB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gKHBhY2tldC5kIGFzIERpc2NvcmRIZWxsbykuaGVhcnRiZWF0X2ludGVydmFsO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBIZWxsb2ApO1xuICAgICAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsKTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV07XG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdEFjaz8uKHRoaXMpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgYSBSZWNvbm5lY3QgZm9yIFNoYXJkICMke3RoaXMuaWR9YCk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKCk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWFibGUgYXMgJHtyZXN1bWFibGV9YCk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaW52YWxpZFNlc3Npb24/Lih0aGlzLCByZXN1bWFibGUpO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiAxIGFuZCA1XG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXkjcmVzdW1pbmdcbiAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDQgKyAxKSAqIDEwMDApKTtcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpO1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnSU5WQUxJRF9TRVNTSU9OJyk7XG5cbiAgICAgICAgLy8gV2hlbiByZXN1bWFibGUgaXMgZmFsc2Ugd2UgbmVlZCB0byByZS1pZGVudGlmeVxuICAgICAgICBpZiAoIXJlc3VtYWJsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlICdSRVNVTUVEJzpcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgUkVTVU1FRGApO1xuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHk7XG5cbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgdGhpcy5yZXN1bWVHYXRld2F5VXJsID0gcGF5bG9hZC5yZXN1bWVfZ2F0ZXdheV91cmw7XG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZDtcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBSRUFEWWApO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZWFkeT8uKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIC8vIEltcG9ydGFudCB3aGVuIHRoaXMgaXMgYSByZS1pZGVudGlmeVxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KTtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRzLm1lc3NhZ2U/Lih0aGlzLCBwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPERpc2NvcmRVcGRhdGVQcmVzZW5jZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS5cbiAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuXG4gICAqL1xuICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBTdGFydCBzZW5kaW5nIGhlYXJ0YmVhdCBwYXlsb2FkcyB0byBEaXNjb3JkIGluIHRoZSBwcm92aWRlZCBpbnRlcnZhbC4gKi9cbiAgc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFN0YXJ0IGhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApO1xuXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKTtcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbDtcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkIGlzIGRpc2Nvbm5lY3RlZCBvciBvZmZsaW5lIGJ1dCB0aGUgaGVhcnRiZWF0IHdhcyBzdGFydGVkICMke3RoaXMuaWR9YCk7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2V2ZW50cy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSk7XG5cbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQmVnaW5uaW5nIGhlYXJ0YmVhdGluZyBwcm9jZXNzIGZvciBTaGFyZCAjJHt0aGlzLmlkfWApO1xuXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApO1xuXG4gICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2U7XG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGlzIG5vdCBvcGVuLCBidXQgYXR0ZW1wdGVkIGhlYXJ0YmVhdCwgaWdub3JpbmcuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0uIEFzc3VtaW5nIHpvbWJpZWQgY29ubmVjdGlvbi5gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbiwgJ1pvbWJpZWQgY29ubmVjdGlvbiwgZGlkIG5vdCByZWNlaXZlIGFuIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gU2hhcmQgIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YCk7XG5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKTtcbiAgICAgIH0sIHRoaXMuaGVhcnQuaW50ZXJ2YWwpO1xuICAgIH0sIGppdHRlcik7XG4gIH1cblxuICAvKiogU3RvcCB0aGUgaGVhcnRiZWF0aW5nIHByb2Nlc3Mgd2l0aCBkaXNjb3JkLiAqL1xuICBzdG9wSGVhcnRiZWF0aW5nKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSByZWd1bGFyIGhlYXJ0YmVhdCBpbnRlcnZhbC5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCk7XG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBTaGFyZCBnb3QgY2xvc2VkIGJlZm9yZSB0aGUgZmlyc3Qgaml0dGVyZWQgaGVhcnRiZWF0LlxuICAgIC8vIFRvIGdvIHNhZmUgd2Ugc2hvdWxkIGNsZWFyIHRoZSByZWxhdGVkIHRpbWVvdXQgdG9vLlxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZCk7XG4gIH1cbn1cblxuLyoqIENoZWNrIGlmIHRoZSBidWZmZXIgZW5kcyB3aXRoIHRoZSBtYXJrZXIgKi9cbmZ1bmN0aW9uIGVuZHNXaXRoTWFya2VyKGJ1ZmZlcjogVWludDhBcnJheSwgbWFya2VyOiBVaW50OEFycmF5KSB7XG4gIGlmIChidWZmZXIubGVuZ3RoIDwgbWFya2VyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gbWFya2VyLmxlbmd0aCArIGldICE9PSBtYXJrZXJbaV0pIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJkQ3JlYXRlT3B0aW9ucyB7XG4gIC8qKiBUaGUgc2hhcmQgaWQgKi9cbiAgaWQ6IG51bWJlcjtcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnO1xuICAvKiogVGhlIGV2ZW50IGhhbmRsZXJzIGZvciBldmVudHMgb24gdGhlIHNoYXJkLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzO1xuICAvKiogVGhlIGxvZ2dlciBmb3IgdGhlIHNoYXJkICovXG4gIGxvZ2dlcj86IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPjtcbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGJvdCBzdGF0dXMgdG8gc2VuZCBvbiBJZGVudGlmeSByZXF1ZXN0cyAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPERpc2NvcmRVcGRhdGVQcmVzZW5jZSB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZDtcbiJdLCJuYW1lcyI6WyJCdWZmZXIiLCJjcmVhdGVJbmZsYXRlIiwiY3JlYXRlWnN0ZERlY29tcHJlc3MiLCJpbmZsYXRlU3luYyIsImNvbnN0YW50cyIsInpsaWJDb25zdGFudHMiLCJHYXRld2F5Q2xvc2VFdmVudENvZGVzIiwiR2F0ZXdheU9wY29kZXMiLCJkZWxheSIsIkxlYWt5QnVja2V0IiwibG9nZ2VyIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIiwiU2hhcmRTdGF0ZSIsIlRyYW5zcG9ydENvbXByZXNzaW9uIiwiWkxJQl9TWU5DX0ZMVVNIIiwiVWludDhBcnJheSIsIkRpc2NvcmRlbm9TaGFyZCIsIm9wdGlvbnMiLCJtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2siLCJwcmV2aW91c1NlcXVlbmNlTnVtYmVyIiwicmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCIsInN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJnb2luZ09mZmxpbmUiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwiaW5mbGF0ZUJ1ZmZlciIsImlkIiwiY29ubmVjdGlvbiIsImhlYXJ0IiwiYWNrbm93bGVkZ2VkIiwiaW50ZXJ2YWwiLCJyZXF1ZXN0SWRlbnRpZnkiLCJtYWtlUHJlc2VuY2UiLCJidWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwiZGVidWciLCJzb2NrZXQiLCJyZWFkeVN0YXRlIiwiV2ViU29ja2V0IiwiT1BFTiIsIk5vcm1hbENsb3N1cmUiLCJHb2luZ0F3YXkiLCJwcm9taXNlIiwicmVzb2x2ZUFmdGVyQ2xvc2UiLCJ1bmRlZmluZWQiLCJjb25uZWN0IiwiSWRlbnRpZnlpbmciLCJSZXN1bWluZyIsImluY2x1ZGVzIiwiQ29ubmVjdGluZyIsImNvbm5lY3RpbmciLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ2ZXJzaW9uIiwidG9TdHJpbmciLCJ0cmFuc3BvcnRDb21wcmVzc2lvbiIsInpsaWIiLCJpbmZsYXRlIiwiZmluaXNoRmx1c2giLCJaX1NZTkNfRkxVU0giLCJjaHVua1NpemUiLCJ6c3RkIiwiRXJyb3IiLCJvbiIsImUiLCJlcnJvciIsImRhdGEiLCJuZXdCdWZmZXIiLCJieXRlTGVuZ3RoIiwiY29tcHJlc3MiLCJ3YXJuIiwiYmluYXJ5VHlwZSIsIm9uZXJyb3IiLCJldmVudCIsImhhbmRsZUVycm9yIiwib25jbG9zZSIsImNsb3NlRXZlbnQiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2VFdmVudCIsImhhbmRsZU1lc3NhZ2UiLCJvbm9wZW4iLCJVbmlkZW50aWZpZWQiLCJjb25uZWN0ZWQiLCJpZGVudGlmeSIsImJ5cGFzc1JlcXVlc3QiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJJZGVudGlmeSIsImQiLCJ0b2tlbiIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwiZGVsZXRlIiwicmVzdW1lIiwiUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24iLCJzZXNzaW9uSWQiLCJSZXN1bWUiLCJzZXNzaW9uX2lkIiwic2VxIiwibWVzc2FnZSIsImFjcXVpcmUiLCJKU09OIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJEaXNjb25uZWN0ZWQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJOb3RBdXRoZW50aWNhdGVkIiwiSW52YWxpZFNlcSIsIlNlc3Npb25UaW1lZE91dCIsIlVua25vd25FcnJvciIsIlVua25vd25PcGNvZGUiLCJEZWNvZGVFcnJvciIsIlJhdGVMaW1pdGVkIiwiQWxyZWFkeUF1dGhlbnRpY2F0ZWQiLCJpc0NvbXByZXNzZWQiLCJBcnJheUJ1ZmZlciIsImRlY29tcHJlc3NQYWNrZXQiLCJwYXJzZSIsImhhbmRsZURpc2NvcmRQYWNrZXQiLCJjb21wcmVzc2VkRGF0YSIsImZhdGFsIiwid3JpdGVQcm9taXNlIiwicmVqZWN0Iiwid3JpdGUiLCJlbmRzV2l0aE1hcmtlciIsImRlY29kZWREYXRhIiwiZGVjb2RlIiwiZGVjb21wcmVzc2VkIiwicGFja2V0IiwibGFzdEFjayIsIkRhdGUiLCJub3ciLCJIZWFydGJlYXQiLCJsYXN0QmVhdCIsImhlYXJ0YmVhdCIsIkhlbGxvIiwiaGVhcnRiZWF0X2ludGVydmFsIiwic3RhcnRIZWFydGJlYXRpbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwicnR0IiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImZsb29yIiwicmFuZG9tIiwiZ2V0IiwidCIsIkNvbm5lY3RlZCIsInJlc3VtZWQiLCJmb3JFYWNoIiwibGVuZ3RoIiwicGF5bG9hZCIsInJlc3VtZV9nYXRld2F5X3VybCIsInJlYWR5IiwicyIsImppdHRlciIsInRpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJpbnRlcnZhbElkIiwic2V0SW50ZXJ2YWwiLCJab21iaWVkQ29ubmVjdGlvbiIsImNsZWFySW50ZXJ2YWwiLCJjbGVhclRpbWVvdXQiLCJidWZmZXIiLCJtYXJrZXIiLCJpIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxNQUFNLFFBQVEsY0FBYztBQUNyQyxTQUFTQyxhQUFhLEVBQUVDLG9CQUFvQixFQUFnQkMsV0FBVyxFQUF1QkMsYUFBYUMsYUFBYSxRQUFRLFlBQVk7QUFFNUksU0FBU0Msc0JBQXNCLEVBQUVDLGNBQWMsUUFBUSxvQkFBb0I7QUFDM0UsU0FBU0MsS0FBSyxFQUFFQyxXQUFXLEVB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
|
|
581
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVJbmZsYXRlLCBjcmVhdGVac3RkRGVjb21wcmVzcywgdHlwZSBJbmZsYXRlLCBpbmZsYXRlU3luYywgdHlwZSBac3RkRGVjb21wcmVzcywgY29uc3RhbnRzIGFzIHpsaWJDb25zdGFudHMgfSBmcm9tICdub2RlOnpsaWInO1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5LCBEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcyc7XG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJztcbmltcG9ydCB7IGRlbGF5LCBMZWFreUJ1Y2tldCwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBTaGFyZEV2ZW50cyxcbiAgdHlwZSBTaGFyZEdhdGV3YXlDb25maWcsXG4gIHR5cGUgU2hhcmRIZWFydCxcbiAgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLFxuICB0eXBlIFNoYXJkU29ja2V0UmVxdWVzdCxcbiAgU2hhcmRTdGF0ZSxcbiAgVHJhbnNwb3J0Q29tcHJlc3Npb24sXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBaTElCX1NZTkNfRkxVU0ggPSBuZXcgVWludDhBcnJheShbMHgwLCAweDAsIDB4ZmYsIDB4ZmZdKTtcblxuZXhwb3J0IGNsYXNzIERpc2NvcmRlbm9TaGFyZCB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNoYXJkLiAqL1xuICBpZDogbnVtYmVyO1xuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZztcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnQ7XG4gIC8qKiBUaGUgbWF4aW11bSBvZiByZXF1ZXN0cyB3aGljaCBjYW4gYmUgc2VuZCB0byBkaXNjb3JkIHBlciByYXRlIGxpbWl0IHRpY2suIFR5cGljYWxseSB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gKi9cbiAgbWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrOiBudW1iZXIgPSAxMjA7XG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDA7XG4gIC8qKiBDdXJyZW50IHNlc3Npb24gaWQgb2YgdGhlIHNoYXJkIGlmIHByZXNlbnQuICovXG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IFdlYlNvY2tldDtcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICAvKiogVGhlIHVybCBwcm92aWRlZCBieSBkaXNjb3JkIHRvIHVzZSB3aGVuIHJlc3VtaW5nIGEgY29ubmVjdGlvbiBmb3IgdGhpcyB0aGlzLiAqL1xuICByZXN1bWVHYXRld2F5VXJsOiBzdHJpbmcgPSAnJztcbiAgLyoqIFRoZSBzaGFyZCByZWxhdGVkIGV2ZW50IGhhbmRsZXJzLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzID0ge307XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIC8qKiBSZXNvbHZlIGludGVybmFsIHdhaXRpbmcgc3RhdGVzLiBNYXBwZWQgYnkgU2VsZWN0ZWRFdmVudHMgPT4gUmVzb2x2ZUZ1bmN0aW9uICovXG4gIHJlc29sdmVzID0gbmV3IE1hcDwnUkVBRFknIHwgJ1JFU1VNRUQnIHwgJ0lOVkFMSURfU0VTU0lPTicsIChwYXlsb2FkOiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpID0+IHZvaWQ+KCk7XG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXQ7XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKipcbiAgICogSXMgdGhlIHNoYXJkIGdvaW5nIG9mZmxpbmU/XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgd2lsbCBiZSB0cnVlIGlmIHRoZSBjbG9zZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHdpdGggZWl0aGVyIDEwMDAgb3IgMTAwMVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ29pbmdPZmZsaW5lID0gZmFsc2U7XG4gIC8qKiBUZXh0IGRlY29kZXIgdXNlZCBmb3IgY29tcHJlc3NlZCBwYXlsb2Fkcy4gKi9cbiAgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgLyoqIHpsaWIgSW5mbGF0ZSBvciB6c3RkIGRlY29tcHJlc3MgaW5zdGFuY2UgZm9yIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGUgfCBac3RkRGVjb21wcmVzcztcbiAgLyoqIHpsaWIgaW5mbGF0ZS96c3RkIGJ1ZmZlci4gKi9cbiAgaW5mbGF0ZUJ1ZmZlcjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhlIHNvY2tldCBpcyBjbG9zZWQgYW5kIGhhbmRsZUNsb3NlKCkgaGFzIGZpbmlzaGVkIHVwZGF0aW5nIGludGVybmFsIHN0YXRlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogVGhpcyBpcyBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb25seSwgYW5kIHN1YmplY3QgdG8gYnJlYWtpbmcgY2hhbmdlcy5cbiAgICovXG4gIHJlc29sdmVBZnRlckNsb3NlPzogKGNsb3NlOiBDbG9zZUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYXJkQ3JlYXRlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvbjtcbiAgICB0aGlzLmV2ZW50cyA9IG9wdGlvbnMuZXZlbnRzO1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyO1xuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RJZGVudGlmeSkgdGhpcy5yZXF1ZXN0SWRlbnRpZnkgPSBvcHRpb25zLnJlcXVlc3RJZGVudGlmeTtcbiAgICBpZiAob3B0aW9ucy5tYWtlUHJlc2VuY2UpIHRoaXMubWFrZVByZXNlbmNlID0gb3B0aW9ucy5tYWtlUHJlc2VuY2U7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBnYXRld2F5IGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQuICovXG4gIGdldCBnYXRld2F5Q29uZmlnKCk6IFNoYXJkR2F0ZXdheUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbjtcbiAgfVxuXG4gIC8qKiBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uIEluaXRpYWxseSB0aGlzIGlzIHRoZSBkaXNjb3JkIGdhdGV3YXkgdXJsLCBhbmQgdGhlbiBpcyBzd2l0Y2hlZCB0byByZXN1bWUgZ2F0ZXdheSB1cmwgb25jZSBhIFJFQURZIGlzIHJlY2VpdmVkLiAqL1xuICBnZXQgY29ubmVjdGlvblVybCgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB8fCBhbmQgbm90ID8/IGhlcmUuID8/IHdpbGwgY2F1c2UgYSBidWcuXG4gICAgcmV0dXJuIHRoaXMucmVzdW1lR2F0ZXdheVVybCB8fCB0aGlzLmdhdGV3YXlDb25maWcudXJsO1xuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDI7XG5cbiAgICByZXR1cm4gc2FmZVJlcXVlc3RzIDwgMCA/IDAgOiBzYWZlUmVxdWVzdHM7XG4gIH1cblxuICBhc3luYyBjaGVja09mZmxpbmUoaGlnaFByaW9yaXR5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpO1xuICAgICAgZWxzZSB0aGlzLm9mZmxpbmVTZW5kUXVldWUucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVxdWVzdCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gdG8gY2xvc2UgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKTtcblxuICAgIGlmICh0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9J3MgcmVhZHkgc3RhdGUgaXMgJHt0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZX0sIFVuYWJsZSB0byBjbG9zZS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdvaW5nT2ZmbGluZSA9IGNvZGUgPT09IEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm9ybWFsQ2xvc3VyZSB8fCBjb2RlID09PSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkdvaW5nQXdheTtcblxuICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbCB0byBzb2NrZXQuY2xvc2UgYXMgZm9yIGV4YW1wbGUgQnVuIGNhbGxzIHNvY2tldC5vbmNsb3NlIGltbWVkaWF0ZWx5IG9uIHRoZSAuY2xvc2UoKSBjYWxsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZW5kXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHJlYXNvbik7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBXYWl0aW5nIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB0byBjbG9zZSB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGJlIGZ1bGx5IGNsb3NlZCwgb3RoZXJ3aXNlIHRoZXJlJ2xsIGJlIHJhY2UgY29uZGl0aW9uIGlzc3VlcyBpZiB3ZSB0cnkgdG8gY29ubmVjdCBhZ2FpbiwgcmVzdWx0aW5nIGluIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAgYXdhaXQgcHJvbWlzZTtcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApO1xuXG4gICAgLy8gUmVzZXQgdGhlIHJlc29sdmVBZnRlckNsb3NlIGZ1bmN0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29ubmVjdCB0aGUgc2hhcmQgd2l0aCB0aGUgZ2F0ZXdheSBhbmQgc3RhcnQgaGVhcnRiZWF0aW5nLiBUaGlzIHdpbGwgbm90IGlkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPERpc2NvcmRlbm9TaGFyZD4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgQ29ubmVjdGluZ2Agc3RhdGUsXG4gICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBDb25uZWN0aW5nIFNoYXJkICMke3RoaXMuaWR9IHNvY2tldC5gKTtcblxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25uZWN0aW9uVXJsKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJyk7XG5cbiAgICAvLyBTZXQgdGhlIGNvbXByZXNzIHVybCBwYXJhbSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0c1xuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb21wcmVzcycsIHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbik7XG5cbiAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpsaWIpIHtcbiAgICAgICAgdGhpcy5pbmZsYXRlID0gY3JlYXRlSW5mbGF0ZSh7XG4gICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWJDb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZSA9IGNyZWF0ZVpzdGREZWNvbXByZXNzKHtcbiAgICAgICAgICBjaHVua1NpemU6IDY0ICogMTAyNCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtTaGFyZF0gVW5rbm93biB0cmFuc3BvcnQgY29tcHJlc3Npb24gdHlwZTogJHt0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb259YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5mbGF0ZS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVGhlIHdhcyBhbiBlcnJvciBpbiBkZWNvbXByZXNzaW5nIGEgY29tcHJlc3NlZCBwYXlsb2FkJywgZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuaW5mbGF0ZUJ1ZmZlci5ieXRlTGVuZ3RoICsgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuaW5mbGF0ZUJ1ZmZlcik7XG4gICAgICAgICAgbmV3QnVmZmVyLnNldChkYXRhLCB0aGlzLmluZmxhdGVCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbmV3QnVmZmVyO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gZGF0YTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFBheWxvYWQgY29tcHJlc3Npb24gaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgdHJhbnNwb3J0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYXMgd2VsbC4nKTtcbiAgICAgIHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldCA9ICh0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKSk7XG5cbiAgICAvLyBCeSBkZWZhdWx0IFdlYlNvY2tldCB3aWxsIGdpdmUgdXMgYSBCbG9iLCB0aGlzIGNoYW5nZXMgaXQgc28gdGhhdCBpdCBnaXZlcyB1cyBhbiBBcnJheUJ1ZmZlclxuICAgIHNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgIHNvY2tldC5vbmVycm9yID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZUVycm9yKGV2ZW50KTtcbiAgICBzb2NrZXQub25jbG9zZSA9IChjbG9zZUV2ZW50KSA9PiB0aGlzLmhhbmRsZUNsb3NlKGNsb3NlRXZlbnQpO1xuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBVbmlkZW50aWZpZWRgIHN0YXRlIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gc29ja2V0IGNvbm5lY3RlZC5gKTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuIElmIG5vdCBjb25uZWN0ZWQsIHRoaXMgd2lsbCBhbHNvIGNvbm5lY3QgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LlxuICAgKiBAcGFyYW0gYnlwYXNzUmVxdWVzdCAtIFdoZXRoZXIgdG8gYnlwYXNzIHRoZSByZXF1ZXN0SWRlbnRpZnkgaGFuZGxlciBhbmQgaWRlbnRpZnkgaW1tZWRpYXRlbHkuIFRoaXMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5IGFzIGl0IGNhbiBjYXVzZSBpbnZhbGlkIHNlc3Npb25zLlxuICAgKi9cbiAgYXN5bmMgaWRlbnRpZnkoYnlwYXNzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSWRlbnRpZnlpbmcgb3BlbiBTaGFyZCAjJHt0aGlzLmlkfSwgY2xvc2luZyB0aGUgY29ubmVjdGlvbmApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZywgJ1JlLWlkZW50aWZ5aW5nIGNsb3N1cmUgb2Ygb2xkIGNvbm5lY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFieXBhc3NSZXF1ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nO1xuICAgIHRoaXMuZXZlbnRzLmlkZW50aWZ5aW5nPy4odGhpcyk7XG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNlbmRpbmcgSWRlbnRpZnkgcGF5bG9hZCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0uYCk7XG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5JZGVudGlmeSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgY29tcHJlc3M6IHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmdhdGV3YXlDb25maWcucHJvcGVydGllcyxcbiAgICAgICAgICBpbnRlbnRzOiB0aGlzLmdhdGV3YXlDb25maWcuaW50ZW50cyxcbiAgICAgICAgICBzaGFyZDogW3RoaXMuaWQsIHRoaXMuZ2F0ZXdheUNvbmZpZy50b3RhbFNoYXJkc10sXG4gICAgICAgICAgcHJlc2VuY2U6IGF3YWl0IHRoaXMubWFrZVByZXNlbmNlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgLy8gV2hlbiBpZGVudGlmeWluZyB0b28gZmFzdCwgRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZC5cbiAgICAgIC8vIFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHRob3VnaCBhbmQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBpZGVudGlmeSBhY3Rpb24uXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byBEaXNjb3JkIGlzIGN1cnJlbnRseSBvcGVuLiAqL1xuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgfVxuXG4gIC8qKiBBdHRlbXB0IHRvIHJlc3VtZSB0aGUgcHJldmlvdXMgc2hhcmRzIHNlc3Npb24gd2l0aCB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YCk7XG5cbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIG9wZW4gU2hhcmQgIyR7dGhpcy5pZH0sIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25gKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIFNoYXJkICMke3RoaXMuaWR9IHdpdGhvdXQgdGhlIHNlc3Npb24gaWQuIElkZW50aWZ5aW5nIHRoZSBzaGFyZCBpbnN0ZWFkLmApO1xuXG4gICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmc7XG5cbiAgICAvLyBCZWZvcmUgd2UgY2FuIHJlc3VtZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB3aXRoIERpc2NvcmQncyBnYXRld2F5LlxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpO1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gY29ubmVjdGVkLiBTZXNzaW9uIGlkOiAke3RoaXMuc2Vzc2lvbklkfSB8IFNlcXVlbmNlOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKTtcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKTtcblxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0gaGlnaFByaW9yaXR5IC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpO1xuXG4gICAgYXdhaXQgdGhpcy5idWNrZXQuYWNxdWlyZShoaWdoUHJpb3JpdHkpO1xuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSk7XG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gIH1cblxuICAvKiogU2h1dGRvd24gdGhlIHRoaXMuIEZvcmNlZnVsbHkgZGlzY29ubmVjdCB0aGUgc2hhcmQgZnJvbSBEaXNjb3JkLiBUaGUgc2hhcmQgbWF5IG5vdCBhdHRlbXB0IHRvIHJlY29ubmVjdCB3aXRoIERpc2NvcmQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duLCAnU2hhcmQgc2h1dHRpbmcgZG93bi4nKTtcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfS5gLCBlcnJvcik7XG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdGluZygpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIHpsaWIvenN0ZCBkYXRhXG4gICAgdGhpcy5pbmZsYXRlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGw7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0ke2Nsb3NlLnJlYXNvbiA/IGAsIGFuZCByZWFzb246ICR7Y2xvc2UucmVhc29ufWAgOiAnJ30uYCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBjbG9zZSBwcm9taXNlIGlmIGl0IGV4aXN0c1xuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2U/LihjbG9zZSk7XG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lO1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlc2UgY29kZXMgYXJlIHJlY2VpdmVkIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZy5cbiAgICAgIC8vIE9uIHRob3NlIHdlIGNhbm5vdCBzdGFydCBhIHJlY29ubmVjdCBhdHRlbXB0LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkF1dGhlbnRpY2F0aW9uRmFpbGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTaGFyZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TaGFyZGluZ1JlcXVpcmVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRBcGlWZXJzaW9uOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRJbnRlbnRzOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRpc2FsbG93ZWRJbnRlbnRzOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmU7XG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKTtcbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Ob3RBdXRoZW50aWNhdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkludmFsaWRTZXE6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2Vzc2lvblRpbWVkT3V0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCByZXF1aXJpbmcgcmUtaWRlbnRpZnkuYCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nO1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IFRoaXMgY2FzZSBtdXN0IGFsd2F5cyBiZSByaWdodCBhYm92ZSB0aGUgY2FzZXMgdGhhdCBydW5zIHdpdGggZGVmYXVsdCBjYXNlIGJlY2F1c2Ugb2YgaG93IHN3aXRjaCB3b3JrcyB3aGVuIHlvdSBkb24ndCBicmVhayAvIHJldHVybiwgbW9yZSBpbmZvIGJlbG93LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vcm1hbENsb3N1cmU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuR29pbmdBd2F5OiB7XG4gICAgICAgIC8vIElmIHRoZSBzaGFyZCBpcyBtYXJrZWQgYXMgZ29pbmdPZmZsaW5lLCBpdCBzdGF5cyBkaXNjb25uZWN0ZWQuXG4gICAgICAgIGlmICh0aGlzLmdvaW5nT2ZmbGluZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZDtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKTtcblxuICAgICAgICAgIHRoaXMuZ29pbmdPZmZsaW5lID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHdhbnQgdGhlIHNoYXJkIHRvIGdvIHRocm91Z2ggdGhlIGRlZmF1bHQgY2FzZSB3aGVyZSBpdCBnZXRzIHJlc3VtZWQsIGFzIGl0IG1pZ2h0IGJlIGFuIHVuZXhwZWN0ZWQgY2xvc3VyZSBmcm9tIERpc2NvcmQgb3IgQ2xvdWRmbGFyZSBmb3IgZXhhbXBsZSwgc28gd2UgZG9uJ3QgdXNlIGJyZWFrIC8gcmV0dXJuIGhlcmUuXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGVjb2RlRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuUmF0ZUxpbWl0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQWxyZWFkeUF1dGhlbnRpY2F0ZWQ6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVyZSB3ZSByZXN1bWUgZm9yZXZlciwgc28gaWYgd2Ugd2VyZSBhbHJlYWR5IHJlc3VtaW5nIHdlIGlkZW50aWZ5IGluc3RlYWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcgPyBTaGFyZFN0YXRlLklkZW50aWZ5aW5nIDogU2hhcmRTdGF0ZS5SZXN1bWluZztcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlIGFuIGluY29taW5nIGdhdGV3YXkgbWVzc2FnZS4gKi9cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlRXZlbnQ8QXJyYXlCdWZmZXIgfCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gYXdhaXQgdGhpcy5kZWNvbXByZXNzUGFja2V0KG1lc3NhZ2UuZGF0YSkgOiBtZXNzYWdlLmRhdGE7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGVjb21wcmVzc2lvbiB3YXMgbm90IHN1Y2Nlc3NmdWxcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChKU09OLnBhcnNlKGRhdGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGEgemxpYi96c3RkIGNvbXByZXNzZWQgcGFja2V0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBkZWNvbXByZXNzUGFja2V0KGRhdGE6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgY29tcHJlc3NlZERhdGEgPSBuZXcgVWludDhBcnJheShkYXRhKTtcblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pIHtcbiAgICAgIGlmICghdGhpcy5pbmZsYXRlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdbU2hhcmRdIFRyYW5zcG9ydCBjb21wcmVzc2lvbiB3YXMgZW5hYmxlZCBidXQgbm8gaW5zdGFuY2Ugb2YgdGhlIGRlY29tcHJlc3Npb24gd2FzIGZvdW5kLicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JpdGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmluZmxhdGUhLndyaXRlKGNvbXByZXNzZWREYXRhLCAnYmluYXJ5JywgKGVycm9yKSA9PiAoZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpKSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uemxpYiAmJiAhZW5kc1dpdGhNYXJrZXIoY29tcHJlc3NlZERhdGEsIFpMSUJfU1lOQ19GTFVTSCkpIHJldHVybiBudWxsO1xuXG4gICAgICBhd2FpdCB3cml0ZVByb21pc2U7XG5cbiAgICAgIGlmICghdGhpcy5pbmZsYXRlQnVmZmVyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1tTaGFyZF0gVGhlIFpMaWIgaW5mbGF0ZSBidWZmZXIgd2FzIGNsZWFyZWQgYXQgYW4gdW5leHBlY3RlZCBtb21lbnQuJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuaW5mbGF0ZUJ1ZmZlcik7XG4gICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBudWxsO1xuXG4gICAgICByZXR1cm4gZGVjb2RlZERhdGE7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcykge1xuICAgICAgY29uc3QgZGVjb21wcmVzc2VkID0gaW5mbGF0ZVN5bmMoY29tcHJlc3NlZERhdGEpO1xuICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSB0aGlzLnRleHREZWNvZGVyLmRlY29kZShkZWNvbXByZXNzZWQpO1xuXG4gICAgICByZXR1cm4gZGVjb2RlZERhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IHRydWU7XG4gICAgLy8gRWRnZSBjYXNlIGVuZCFcblxuICAgIHN3aXRjaCAocGFja2V0Lm9wKSB7XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdDoge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbDtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgSGVsbG9gKTtcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbCk7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgc2FmZSByZXF1ZXN0cyBoZXJlLCBzaW5jZSB0aGUgaGVhcnRiZWF0IGludGVydmFsIGNvdWxkIGhhdmUgY2hhbmdlZFxuICAgICAgICB0aGlzLmJ1Y2tldC5tYXggPSB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmJ1Y2tldC5yZWZpbGxBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTaGFyZFN0YXRlLlJlc3VtaW5nKSB7XG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldC51c2VkID0gMDtcbiAgICAgICAgICB0aGlzLmJ1Y2tldC5yZWZpbGxCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlbGxvPy4odGhpcyk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGluZyB0aGUgcm91bmQgdHJpcCB0aW1lIGZvciB1c2VycyB3aG8gbmVlZCBpdC5cbiAgICAgICAgaWYgKHRoaXMuaGVhcnQubGFzdEJlYXQpIHtcbiAgICAgICAgICB0aGlzLmhlYXJ0LnJ0dCA9IHRoaXMuaGVhcnQubGFzdEFjayAtIHRoaXMuaGVhcnQubGFzdEJlYXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuUmVjb25uZWN0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIGEgUmVjb25uZWN0IGZvciBTaGFyZCAjJHt0aGlzLmlkfWApO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZWNlaXZlZCBJbnZhbGlkIFNlc3Npb24gZm9yIFNoYXJkICMke3RoaXMuaWR9IHdpdGggcmVzdW1hYmxlIGFzICR7cmVzdW1hYmxlfWApO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLmludmFsaWRTZXNzaW9uPy4odGhpcywgcmVzdW1hYmxlKTtcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2V2ZW50cy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSk7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ0lOVkFMSURfU0VTU0lPTicpPy4ocGFja2V0KTtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ0lOVkFMSURfU0VTU0lPTicpO1xuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgYnV0IGFwcGFyZW50bHkgaXQgaXMgcmVzdW1hYmxlXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKCk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZDtcbiAgICAgICAgdGhpcy5ldmVudHMucmVzdW1lZD8uKHRoaXMpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHJlY2VpdmVkIFJFU1VNRURgKTtcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRVNVTUVEJyk/LihwYWNrZXQpO1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1JFQURZJzoge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgRGlzY29yZFJlYWR5O1xuXG4gICAgICAgIC8vIEltcG9ydGFudCBmb3IgZnV0dXJlIHJlc3VtZXMuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZDtcblxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgUkVBRFlgKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVhZHk/Lih0aGlzKTtcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSk7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVBRFknKT8uKHBhY2tldCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBwcmVzZW50XG4gICAgLy8gYHNgIGNhbiBiZSBlaXRoZXIgYG51bGxgIG9yIGEgYG51bWJlcmAuXG4gICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCB1cGRhdGUgbWlzc2VzIHdoZW4gYHNgIGlzIGAwYCB3ZSBjaGVjayBhZ2FpbnN0IG51bGwuXG4gICAgaWYgKHBhY2tldC5zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQucztcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgcGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byBrbm93IHdoZXRoZXIgaXRzIGZyZWUgdG8gaWRlbnRpZnkuXG4gICAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXNvbHZlcywgdGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBpcyBhbGxvd2VkIHRvIHNlbmQgYW4gaWRlbnRpZnkgcGF5bG9hZCB0byBkaXNjb3JkLlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTdGFydCBoZWFydGJlYXRpbmcgb24gU2hhcmQgIyR7dGhpcy5pZH1gKTtcblxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKCk7XG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWw7XG5cbiAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQncyBzdGF0ZSB0byBgVW5pZGVudGlmaWVkYFxuICAgIC8vIGlmIGhlYXJ0YmVhdGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBkdWUgdG8gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoW1NoYXJkU3RhdGUuRGlzY29ubmVjdGVkLCBTaGFyZFN0YXRlLk9mZmxpbmVdLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCBpcyBkaXNjb25uZWN0ZWQgb3Igb2ZmbGluZSBidXQgdGhlIGhlYXJ0YmVhdCB3YXMgc3RhcnRlZCAjJHt0aGlzLmlkfWApO1xuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkO1xuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpO1xuXG4gICAgdGhpcy5oZWFydC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEJlZ2lubmluZyBoZWFydGJlYXRpbmcgcHJvY2VzcyBmb3IgU2hhcmQgIyR7dGhpcy5pZH1gKTtcblxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm47XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfS4gUHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKTtcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBBZnRlciB0aGUgcmFuZG9tIGhlYXJ0YmVhdCBqaXR0ZXIgd2UgY2FuIHN0YXJ0IGEgbm9ybWFsIGludGVydmFsLlxuICAgICAgdGhpcy5oZWFydC5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBpcyBub3Qgb3BlbiwgYnV0IGF0dGVtcHRlZCBoZWFydGJlYXQsIGlnbm9yaW5nLmApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2V2ZW50cy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIFNoYXJkICMke3RoaXMuaWR9LiBBc3N1bWluZyB6b21iaWVkIGNvbm5lY3Rpb24uYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb24sICdab21iaWVkIGNvbm5lY3Rpb24sIGRpZCBub3QgcmVjZWl2ZSBhbiBoZWFydGJlYXQgQUNLIGluIHRpbWUuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApO1xuXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcyk7XG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKTtcbiAgICB9LCBqaXR0ZXIpO1xuICB9XG5cbiAgLyoqIFN0b3AgdGhlIGhlYXJ0YmVhdGluZyBwcm9jZXNzIHdpdGggZGlzY29yZC4gKi9cbiAgc3RvcEhlYXJ0YmVhdGluZygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciB0aGUgcmVndWxhciBoZWFydGJlYXQgaW50ZXJ2YWwuXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpO1xuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpO1xuICB9XG59XG5cbi8qKiBDaGVjayBpZiB0aGUgYnVmZmVyIGVuZHMgd2l0aCB0aGUgbWFya2VyICovXG5mdW5jdGlvbiBlbmRzV2l0aE1hcmtlcihidWZmZXI6IFVpbnQ4QXJyYXksIG1hcmtlcjogVWludDhBcnJheSkge1xuICBpZiAoYnVmZmVyLmxlbmd0aCA8IG1hcmtlci5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChidWZmZXJbYnVmZmVyLmxlbmd0aCAtIG1hcmtlci5sZW5ndGggKyBpXSAhPT0gbWFya2VyW2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKiBUaGUgY29ubmVjdGlvbiBkZXRhaWxzICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZztcbiAgLyoqIFRoZSBldmVudCBoYW5kbGVycyBmb3IgZXZlbnRzIG9uIHRoZSBzaGFyZC4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cztcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz47XG4gIC8qKiBUaGUgaGFuZGxlciB0byByZXF1ZXN0IGEgc3BhY2UgdG8gbWFrZSBhbiBpZGVudGlmeSByZXF1ZXN0LiAqL1xuICByZXF1ZXN0SWRlbnRpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBib3Qgc3RhdHVzIHRvIHNlbmQgb24gSWRlbnRpZnkgcmVxdWVzdHMgKi9cbiAgbWFrZVByZXNlbmNlPzogKCkgPT4gUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3JkZW5vU2hhcmQ7XG4iXSwibmFtZXMiOlsiY3JlYXRlSW5mbGF0ZSIsImNyZWF0ZVpzdGREZWNvbXByZXNzIiwiaW5mbGF0ZVN5bmMiLCJjb25zdGFudHMiLCJ6bGliQ29uc3RhbnRzIiwiR2F0ZXdheUNsb3NlRXZlbnRDb2RlcyIsIkdhdGV3YXlPcGNvZGVzIiwiZGVsYXkiLCJMZWFreUJ1Y2tldCIsImxvZ2dlciIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlNoYXJkU3RhdGUiLCJUcmFuc3BvcnRDb21wcmVzc2lvbiIsIlpMSUJfU1lOQ19GTFVTSCIsIlVpbnQ4QXJyYXkiLCJEaXNjb3JkZW5vU2hhcmQiLCJvcHRpb25zIiwibWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIiwicHJldmlvdXNTZXF1ZW5jZU51bWJlciIsInJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwiLCJzdGF0ZSIsIk9mZmxpbmUiLCJyZXN1bWVHYXRld2F5VXJsIiwiZXZlbnRzIiwib2ZmbGluZVNlbmRRdWV1ZSIsInJlc29sdmVzIiwiTWFwIiwiZ29pbmdPZmZsaW5lIiwidGV4dERlY29kZXIiLCJUZXh0RGVjb2RlciIsImluZmxhdGVCdWZmZXIiLCJpZCIsImNvbm5lY3Rpb24iLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5IiwibWFrZVByZXNlbmNlIiwiYnVja2V0IiwibWF4IiwiY2FsY3VsYXRlU2FmZVJlcXVlc3RzIiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnYXRld2F5Q29uZmlnIiwiY29ubmVjdGlvblVybCIsInVybCIsInNhZmVSZXF1ZXN0cyIsIk1hdGgiLCJjZWlsIiwiY2hlY2tPZmZsaW5lIiwiaGlnaFByaW9yaXR5IiwiaXNPcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bnNoaWZ0IiwicHVzaCIsImNsb3NlIiwiY29kZSIsInJlYXNvbiIsImRlYnVnIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIldlYlNvY2tldCIsIk9QRU4iLCJOb3JtYWxDbG9zdXJlIiwiR29pbmdBd2F5IiwicHJvbWlzZSIsInJlc29sdmVBZnRlckNsb3NlIiwidW5kZWZpbmVkIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJ6bGliIiwiaW5mbGF0ZSIsImZpbmlzaEZsdXNoIiwiWl9TWU5DX0ZMVVNIIiwiY2h1bmtTaXplIiwienN0ZCIsIkVycm9yIiwib24iLCJlIiwiZXJyb3IiLCJkYXRhIiwibmV3QnVmZmVyIiwiYnl0ZUxlbmd0aCIsImNvbXByZXNzIiwid2FybiIsImJpbmFyeVR5cGUiLCJvbmVycm9yIiwiZXZlbnQiLCJoYW5kbGVFcnJvciIsIm9uY2xvc2UiLCJjbG9zZUV2ZW50IiwiaGFuZGxlQ2xvc2UiLCJvbm1lc3NhZ2UiLCJtZXNzYWdlRXZlbnQiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJieXBhc3NSZXF1ZXN0IiwiUmVJZGVudGlmeWluZyIsImlkZW50aWZ5aW5nIiwic2VuZCIsIm9wIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwiSlNPTiIsInN0cmluZ2lmeSIsInNodXRkb3duIiwiU2h1dGRvd24iLCJzdG9wSGVhcnRiZWF0aW5nIiwiVGVzdGluZ0ZpbmlzaGVkIiwiZGlzY29ubmVjdGVkIiwiUmVzaGFyZGVkIiwiRGlzY29ubmVjdGVkIiwiQXV0aGVudGljYXRpb25GYWlsZWQiLCJJbnZhbGlkU2hhcmQiLCJTaGFyZGluZ1JlcXVpcmVkIiwiSW52YWxpZEFwaVZlcnNpb24iLCJJbnZhbGlkSW50ZW50cyIsIkRpc2FsbG93ZWRJbnRlbnRzIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJTZXNzaW9uVGltZWRPdXQiLCJVbmtub3duRXJyb3IiLCJVbmtub3duT3Bjb2RlIiwiRGVjb2RlRXJyb3IiLCJSYXRlTGltaXRlZCIsIkFscmVhZHlBdXRoZW50aWNhdGVkIiwiQXJyYXlCdWZmZXIiLCJkZWNvbXByZXNzUGFja2V0IiwiaGFuZGxlRGlzY29yZFBhY2tldCIsInBhcnNlIiwiY29tcHJlc3NlZERhdGEiLCJmYXRhbCIsIndyaXRlUHJvbWlzZSIsInJlamVjdCIsIndyaXRlIiwiZW5kc1dpdGhNYXJrZXIiLCJkZWNvZGVkRGF0YSIsImRlY29kZSIsImRlY29tcHJlc3NlZCIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwidXNlZCIsInJlZmlsbEJ1Y2tldCIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwicnR0IiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImZsb29yIiwicmFuZG9tIiwiZ2V0IiwidCIsIkNvbm5lY3RlZCIsInJlc3VtZWQiLCJmb3JFYWNoIiwibGVuZ3RoIiwicGF5bG9hZCIsInJlc3VtZV9nYXRld2F5X3VybCIsInJlYWR5IiwicyIsImppdHRlciIsInRpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJpbnRlcnZhbElkIiwic2V0SW50ZXJ2YWwiLCJab21iaWVkQ29ubmVjdGlvbiIsImNsZWFySW50ZXJ2YWwiLCJjbGVhclRpbWVvdXQiLCJidWZmZXIiLCJtYXJrZXIiLCJpIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLEVBQUVDLG9CQUFvQixFQUFnQkMsV0FBVyxFQUF1QkMsYUFBYUMsYUFBYSxRQUFRLFlBQVk7QUFFNUksU0FBU0Msc0JBQXNCLEVBQUVDLGNBQWMsUUFBUSxvQkFBb0I7QUFDM0UsU0FBU0MsS0FBSyxFQUFFQyxXQUFXLEVBQUVDLE1BQU0sUUFBUSxvQkFBb0I7QUFDL0QsU0FJRUMscUJBQXFCLEVBRXJCQyxVQUFVLEVBQ1ZDLG9CQUFvQixRQUNmLGFBQWE7QUFFcEIsTUFBTUMsa0JBQWtCLElBQUlDLFdBQVc7SUFBQztJQUFLO0lBQUs7SUFBTTtDQUFLO0FBRTdELE9BQU8sTUFBTUM7SUF1RFgsWUFBWUMsT0FBMkIsQ0FBRTtRQWhEekMsMEhBQTBILFFBQzFIQyw4QkFBc0M7UUFDdEMsMENBQTBDLFFBQzFDQyx5QkFBd0M7UUFDeEMsNEVBQTRFLFFBQzVFQyx5QkFBaUM7UUFLakMsd0NBQXdDLFFBQ3hDQyxRQUFRVCxXQUFXVSxPQUFPO1FBQzFCLGlGQUFpRixRQUNqRkMsbUJBQTJCO1FBQzNCLHNDQUFzQyxRQUN0Q0MsU0FBc0IsQ0FBQztRQUN2QixtR0FBbUcsUUFDbkdDLG1CQUFtQyxFQUFFO1FBQ3JDLGlGQUFpRixRQUNqRkMsV0FBVyxJQUFJQztRQUtmOzs7Ozs7OztHQVFDLFFBQ0RDLGVBQWU7UUFDZiwrQ0FBK0MsUUFDL0NDLGNBQWMsSUFBSUM7UUFHbEIsOEJBQThCLFFBQzlCQyxnQkFBbUM7UUFVakMsSUFBSSxDQUFDQyxFQUFFLEdBQUdmLFFBQVFlLEVBQUU7UUFDcEIsSUFBSSxDQUFDQyxVQUFVLEdBQUdoQixRQUFRZ0IsVUFBVTtRQUNwQyxJQUFJLENBQUNULE1BQU0sR0FB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
|
package/dist/manager.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AtLeastOne, type BigString, type Camelize, type DiscordGetGatewayBot, type DiscordMemberWithUser, type DiscordUpdatePresence, type RequestGuildMembers } from '@discordeno/types';
|
|
1
|
+
import { type AtLeastOne, type BigString, type Camelize, type DiscordGetGatewayBot, type DiscordMemberWithUser, type DiscordUpdatePresence, type RequestChannelInfo, type RequestGuildMembers } from '@discordeno/types';
|
|
2
2
|
import { Collection, LeakyBucket, logger } from '@discordeno/utils';
|
|
3
3
|
import Shard from './Shard.js';
|
|
4
4
|
import { type ShardEvents, type ShardSocketRequest, type TransportCompression, type UpdateVoiceState } from './types.js';
|
|
@@ -276,6 +276,16 @@ export interface GatewayManager extends Required<CreateGatewayManagerOptions> {
|
|
|
276
276
|
* @see {@link https://docs.discord.com/developers/events/gateway-events#request-guild-members}
|
|
277
277
|
*/
|
|
278
278
|
requestMembers: (guildId: BigString, options?: Omit<RequestGuildMembers, 'guildId'>) => Promise<Camelize<DiscordMemberWithUser[]>>;
|
|
279
|
+
/**
|
|
280
|
+
* Requests ephemeral channel data for channels in a guild
|
|
281
|
+
*
|
|
282
|
+
* @param guildId - The ID of the guild to get the ephemeral channel data for.
|
|
283
|
+
* @param options - The parameters for the fetching of the ephemeral channel data.
|
|
284
|
+
* @returns - This method returns nothing. The server will send a CHANNEL_INFO event
|
|
285
|
+
*
|
|
286
|
+
* @see {@link https://docs.discord.com/developers/events/gateway-events#request-channel-info}
|
|
287
|
+
*/
|
|
288
|
+
requestChannelInfo: (guildId: BigString, options: Omit<RequestChannelInfo, 'guildId'>) => Promise<void>;
|
|
279
289
|
/**
|
|
280
290
|
* Leaves the voice channel the bot user is currently in.
|
|
281
291
|
*
|
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/manager.js
CHANGED
|
@@ -413,6 +413,17 @@ export function createGatewayManager(options) {
|
|
|
413
413
|
});
|
|
414
414
|
return await members;
|
|
415
415
|
},
|
|
416
|
+
async requestChannelInfo (guildId, options) {
|
|
417
|
+
const shardId = gateway.calculateShardId(guildId);
|
|
418
|
+
gateway.logger.debug(`[Gateway] requestChannelInfo guildId: ${guildId}`);
|
|
419
|
+
await gateway.sendPayload(shardId, {
|
|
420
|
+
op: GatewayOpcodes.RequestChannelInfo,
|
|
421
|
+
d: {
|
|
422
|
+
guild_id: guildId.toString(),
|
|
423
|
+
fields: options.fields
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
},
|
|
416
427
|
async leaveVoiceChannel (guildId) {
|
|
417
428
|
const shardId = gateway.calculateShardId(guildId);
|
|
418
429
|
gateway.logger.debug(`[Gateway] leaveVoiceChannel guildId: ${guildId} Shard ${shardId}`);
|
|
@@ -450,4 +461,4 @@ export function createGatewayManager(options) {
|
|
|
450
461
|
return gateway;
|
|
451
462
|
}
|
|
452
463
|
|
|
453
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgdHlwZSBBdExlYXN0T25lLFxuICB0eXBlIEJpZ1N0cmluZyxcbiAgdHlwZSBDYW1lbGl6ZSxcbiAgdHlwZSBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyV2l0aFVzZXIsXG4gIHR5cGUgRGlzY29yZFJlYWR5LFxuICB0eXBlIERpc2NvcmRVcGRhdGVQcmVzZW5jZSxcbiAgR2F0ZXdheUludGVudHMsXG4gIEdhdGV3YXlPcGNvZGVzLFxuICB0eXBlIFJlcXVlc3RHdWlsZE1lbWJlcnMsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIGpzb25TYWZlUmVwbGFjZXIsIExlYWt5QnVja2V0LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscyc7XG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcyc7XG5pbXBvcnQgeyB0eXBlIFNoYXJkRXZlbnRzLCBTaGFyZFNvY2tldENsb3NlQ29kZXMsIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LCB0eXBlIFRyYW5zcG9ydENvbXByZXNzaW9uLCB0eXBlIFVwZGF0ZVZvaWNlU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdhdGV3YXlNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9ucyk6IEdhdGV3YXlNYW5hZ2VyIHtcbiAgY29uc3QgY29ubmVjdGlvbk9wdGlvbnMgPSBvcHRpb25zLmNvbm5lY3Rpb24gPz8ge1xuICAgIHVybDogJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgc2hhcmRzOiAxLFxuICAgIHNlc3Npb25TdGFydExpbWl0OiB7XG4gICAgICBtYXhDb25jdXJyZW5jeTogMSxcbiAgICAgIHJlbWFpbmluZzogMTAwMCxcbiAgICAgIHRvdGFsOiAxMDAwLFxuICAgICAgcmVzZXRBZnRlcjogMTAwMCAqIDYwICogNjAgKiAyNCxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgc2hhcmRzOiBuZXcgTWFwKCksXG4gICAgYnVja2V0czogbmV3IE1hcCgpLFxuICAgIGNhY2hlOiB7XG4gICAgICByZXF1ZXN0TWVtYmVyczoge1xuICAgICAgICBlbmFibGVkOiBvcHRpb25zLmNhY2hlPy5yZXF1ZXN0TWVtYmVycz8uZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgcGVuZGluZzogbmV3IENvbGxlY3Rpb24oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlcixcbiAgICBtYWtlUHJlc2VuY2U6IG9wdGlvbnMubWFrZVByZXNlbmNlID8/ICgoKSA9PiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKSksXG4gICAgcmVzaGFyZGluZzoge1xuICAgICAgZW5hYmxlZDogb3B0aW9ucy5yZXNoYXJkaW5nPy5lbmFibGVkID8/IHRydWUsXG4gICAgICBzaGFyZHNGdWxsUGVyY2VudGFnZTogb3B0aW9ucy5yZXNoYXJkaW5nPy5zaGFyZHNGdWxsUGVyY2VudGFnZSA/PyA4MCxcbiAgICAgIGNoZWNrSW50ZXJ2YWw6IG9wdGlvbnMucmVzaGFyZGluZz8uY2hlY2tJbnRlcnZhbCA/PyAyODgwMDAwMCwgLy8gOCBob3Vyc1xuICAgICAgc2hhcmRzOiBuZXcgTWFwKCksXG4gICAgICBnZXRTZXNzaW9uSW5mbzogb3B0aW9ucy5yZXNoYXJkaW5nPy5nZXRTZXNzaW9uSW5mbyxcbiAgICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ6IG9wdGlvbnMucmVzaGFyZGluZz8udXBkYXRlR3VpbGRzU2hhcmRJZCxcbiAgICAgIGFzeW5jIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQoKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gQ2hlY2tpbmcgaWYgcmVzaGFyZGluZyBpcyBuZWVkZWQuJyk7XG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBkaXNhYmxlZC4nKTtcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgbm8gJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgaXMgbm90IHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkLicpO1xuXG4gICAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBTZXNzaW9uIGluZm8gcmV0cmlldmVkOiAke0pTT04uc3RyaW5naWZ5KHNlc3Npb25JbmZvKX1gKTtcblxuICAgICAgICAvLyBEb24ndCBoYXZlIGVub3VnaCBpZGVudGlmeSBsaW1pdHMgdG8gdHJ5IHJlc2hhcmRpbmdcbiAgICAgICAgaWYgKHNlc3Npb25JbmZvLnNlc3Npb25TdGFydExpbWl0LnJlbWFpbmluZyA8IHNlc3Npb25JbmZvLnNoYXJkcykge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gTm90IGVub3VnaCBzZXNzaW9uIHN0YXJ0IGxpbWl0cyBsZWZ0IHRvIHJlc2hhcmQuJyk7XG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBBYmxlIHRvIHJlc2hhcmQsIGNoZWNraW5nIHdoZXRoZXIgbmVjZXNzYXJ5IG5vdy4nKTtcblxuICAgICAgICAvLyAyNTAwIGlzIHRoZSBtYXggYW1vdW50IG9mIGd1aWxkcyBhIHNpbmdsZSBzaGFyZCBjYW4gaGFuZGxlXG4gICAgICAgIC8vIDEwMDAgaXMgdGhlIGFtb3VudCBvZiBndWlsZHMgZGlzY29yZCB1c2VzIHRvIGRldGVybWluZSBob3cgbWFueSBzaGFyZHMgdG8gcmVjb21tZW5kLlxuICAgICAgICAvLyBUaGlzIGFsZ28gaGVscHMgY2hlY2sgaWYgeW91ciBib3QgaGFzIGdyb3duIGVub3VnaCB0byByZXNoYXJkLlxuICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGltcHJlY2lzZSBhcyBkaXNjb3JkIGNoYW5nZXMgdGhlIHJlY29tbWVuZGVkIG51bWJlciBvZiBzaGFyZCBldmVyeSAxMDAwIGd1aWxkcyBpdCBpcyBnb29kIGVub3VnaFxuICAgICAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gc3RvcmUgdGhlIGd1aWxkIGNvdW50IGZvciBlYWNoIHNoYXJkIGFuZCByZXF1aXJlIHRoZSBHdWlsZHMgaW50ZW50IGZvciBgR1VJTERfQ1JFQVRFYCBhbmQgYEdVSUxEX0RFTEVURWAgZXZlbnRzXG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoc2Vzc2lvbkluZm8uc2hhcmRzIC8gKChnYXRld2F5LnRvdGFsU2hhcmRzICogMjUwMCkgLyAxMDAwKSkgKiAxMDA7XG5cbiAgICAgICAgLy8gTGVzcyB0aGFuIG5lY2Vzc2FyeSUgYmVpbmcgdXNlZCBzbyBkbyBub3RoaW5nXG4gICAgICAgIGlmIChwZXJjZW50YWdlIDwgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkc0Z1bGxQZXJjZW50YWdlKSB7XG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIG5vdCBuZWVkZWQuJyk7XG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgbmVlZGVkLicpO1xuXG4gICAgICAgIHJldHVybiB7IG5lZWRlZDogdHJ1ZSwgaW5mbzogc2Vzc2lvbkluZm8gfTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXNoYXJkKGluZm8pIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIFN0YXJ0aW5nIHRoZSByZXNoYXJkIHByb2Nlc3MuIFByZXZpb3VzIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApO1xuICAgICAgICAvLyBTZXQgdmFsdWVzIG9uIGdhdGV3YXlcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGluZm8uc2hhcmRzO1xuICAgICAgICAvLyBIYW5kbGVzIHByZXBhcmluZyBtaWQgc2l6ZWQgYm90cyBmb3IgTEJTXG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBnYXRld2F5LmNhbGN1bGF0ZVRvdGFsU2hhcmRzKCk7XG4gICAgICAgIC8vIFNldCBmaXJzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5maXJzdFNoYXJkSWQgPT09ICdudW1iZXInKSBnYXRld2F5LmZpcnN0U2hhcmRJZCA9IGluZm8uZmlyc3RTaGFyZElkO1xuICAgICAgICAvLyBTZXQgbGFzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5sYXN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkubGFzdFNoYXJkSWQgPSBpbmZvLmxhc3RTaGFyZElkO1xuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZ2V0IGFueSBsYXN0U2hhcmRJZCwgd2UgYXNzdW1lIGFsbCB0aGUgc2hhcmRzIGFyZSB0byBiZSB1c2VkXG4gICAgICAgIGVsc2UgZ2F0ZXdheS5sYXN0U2hhcmRJZCA9IGdhdGV3YXkudG90YWxTaGFyZHMgLSAxO1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU3RhcnRpbmcgdGhlIHJlc2hhcmQgcHJvY2Vzcy4gTmV3IHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApO1xuXG4gICAgICAgIC8vIFJlc2V0dGluZyBidWNrZXRzXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5jbGVhcigpO1xuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpO1xuXG4gICAgICAgIC8vIENhbGwgYWxsIHRoZSBidWNrZXRzIGFuZCB0ZWxsIHRoZWlyIHdvcmtlcnMgJiBzaGFyZHMgdG8gaWRlbnRpZnlcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKGdhdGV3YXkuYnVja2V0cy5lbnRyaWVzKCkpLm1hcChhc3luYyAoW2J1Y2tldElkLCBidWNrZXRdKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIEFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuYCk7XG5cbiAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLm9uUmVzaGFyZGluZ1N3aXRjaCgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gVGVsbGluZyB3b3JrZXIgdG8gcHJlcGFyZS4gV29ya2VyOiAke3dvcmtlcklkfSB8IFNoYXJkOiAke3NoYXJkSWR9IHwgQnVja2V0OiAke2J1Y2tldElkfS5gKTtcbiAgICAgICAgY29uc3Qgc2hhcmQgPSBuZXcgU2hhcmQoe1xuICAgICAgICAgIGlkOiBzaGFyZElkLFxuICAgICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAgIGNvbXByZXNzOiBnYXRld2F5LmNvbXByZXNzLFxuICAgICAgICAgICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IGdhdGV3YXkudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgICAgIGludGVudHM6IGdhdGV3YXkuaW50ZW50cyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGdhdGV3YXkucHJvcGVydGllcyxcbiAgICAgICAgICAgIHRva2VuOiBnYXRld2F5LnRva2VuLFxuICAgICAgICAgICAgdG90YWxTaGFyZHM6IGdhdGV3YXkudG90YWxTaGFyZHMsXG4gICAgICAgICAgICB1cmw6IGdhdGV3YXkudXJsLFxuICAgICAgICAgICAgdmVyc2lvbjogZ2F0ZXdheS52ZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKF9zaGFyZCwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGV2ZW50cyB1bnRpbCB3ZSBzd2ljaCBmcm9tIHRoZSBvbGQgc2hhcmRzIHRvIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgaWYgKHBheWxvYWQudCA9PT0gJ1JFQURZJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy51cGRhdGVHdWlsZHNTaGFyZElkPy4oXG4gICAgICAgICAgICAgICAgICAocGF5bG9hZC5kIGFzIERpc2NvcmRSZWFkeSkuZ3VpbGRzLm1hcCgoZykgPT4gZy5pZCksXG4gICAgICAgICAgICAgICAgICBzaGFyZElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsb2dnZXI6IGdhdGV3YXkubG9nZ2VyLFxuICAgICAgICAgIHJlcXVlc3RJZGVudGlmeTogYXN5bmMgKCkgPT4gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCksXG4gICAgICAgICAgbWFrZVByZXNlbmNlOiBnYXRld2F5Lm1ha2VQcmVzZW5jZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy5zZXQoc2hhcmRJZCwgc2hhcmQpO1xuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBTaGFyZCAjJHtzaGFyZElkfSBpZGVudGlmaWVkLmApO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIG9uUmVzaGFyZGluZ1N3aXRjaCgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBNYWtpbmcgdGhlIHN3aXRjaCBmcm9tIHRoZSBvbGQgc2hhcmRzIHRvIHRoZSBuZXcgb25lcy5gKTtcblxuICAgICAgICAvLyBNb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0gZ2F0ZXdheS5ldmVudHMgPz8ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbGQgc2hhcmRzIHN0b3AgcHJvY2Vzc2luZyBldmVudHNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnNoYXJkcy52YWx1ZXMoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEhhbmRsZXIgPSBzaGFyZC5ldmVudHMubWVzc2FnZTtcblxuICAgICAgICAgIC8vIENoYW5nZSB3aXRoIHNwcmVhZCBvcGVyYXRvciB0byBub3QgYWZmZWN0IG5ldyBzaGFyZHMsIGFzIGNoYW5naW5nIGFueXRoaW5nIG9uIHNoYXJkLmV2ZW50cyB3aWxsIGRpcmVjdGx5IGNoYW5nZSBnYXRld2F5LmV2ZW50cywgd2hpY2ggY2hhbmdlcyBuZXcgc2hhcmRzJyBldmVudHNcbiAgICAgICAgICBzaGFyZC5ldmVudHMgPSB7XG4gICAgICAgICAgICAuLi5zaGFyZC5ldmVudHMsXG4gICAgICAgICAgICBtZXNzYWdlOiBhc3luYyBmdW5jdGlvbiAoXywgbWVzc2FnZSkge1xuICAgICAgICAgICAgICAvLyBNZW1iZXIgY2hlY2tzIG5lZWQgdG8gY29udGludWUgYnV0IG90aGVycyBjYW4gc3RvcFxuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50ID09PSAnR1VJTERfTUVNQkVSU19DSFVOSycpIHtcbiAgICAgICAgICAgICAgICBvbGRIYW5kbGVyPy4oc2hhcmQsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU2h1dHRpbmcgZG93biBvbGQgc2hhcmRzLmApO1xuICAgICAgICBhd2FpdCBnYXRld2F5LnNodXRkb3duKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQsICdSZXNoYXJkZWQhJywgZmFsc2UpO1xuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBDb21wbGV0ZWQuYCk7XG4gICAgICAgIGdhdGV3YXkuc2hhcmRzID0gbmV3IE1hcChnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzKTtcbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy5jbGVhcigpO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgY2FsY3VsYXRlVG90YWxTaGFyZHMoKSB7XG4gICAgICAvLyBCb3RzIHVuZGVyIDEwMGsgc2VydmVycyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gTEJTLlxuICAgICAgaWYgKGdhdGV3YXkudG90YWxTaGFyZHMgPCAxMDApIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBDYWxjdWxhdGluZyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKTtcbiAgICAgICAgcmV0dXJuIGdhdGV3YXkudG90YWxTaGFyZHM7XG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KTtcbiAgICAgIC8vIENhbGN1bGF0ZSBhIG11bHRpcGxlIG9mIGBtYXhDb25jdXJyZW5jeWAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZ2F0ZXdheS5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICBnYXRld2F5LnRvdGFsU2hhcmRzIC9cbiAgICAgICAgICAgIC8vIElmIGBtYXhDb25jdXJyZW5jeWAgaXMgMSwgd2UgY2FuIHNhZmVseSB1c2UgMTYgdG8gZ2V0IGB0b3RhbFNoYXJkc2AgdG8gYmUgaW4gYSBtdWx0aXBsZSBvZiAxNiBzbyB0aGF0IHdlIGNhbiBwcmVwYXJlIGJvdHMgd2l0aCAxMDBrIHNlcnZlcnMgZm9yIExCUy5cbiAgICAgICAgICAgIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSksXG4gICAgICAgICkgKiAoZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5ID09PSAxID8gMTYgOiBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG4gICAgICApO1xuICAgIH0sXG4gICAgY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZCkge1xuICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LnNwcmVhZFNoYXJkc0luUm91bmRSb2JpblxuICAgICAgICA/IHNoYXJkSWQgJSBnYXRld2F5LnRvdGFsV29ya2Vyc1xuICAgICAgICA6IE1hdGgubWluKE1hdGguZmxvb3Ioc2hhcmRJZCAvIGdhdGV3YXkuc2hhcmRzUGVyV29ya2VyKSwgZ2F0ZXdheS50b3RhbFdvcmtlcnMgLSAxKTtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdvcmtlcklkO1xuICAgIH0sXG4gICAgcHJlcGFyZUJ1Y2tldHMoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeTsgKytpKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUHJlcGFyaW5nIGJ1Y2tldHMgZm9yIGNvbmN1cnJlbmN5OiAke2l9YCk7XG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGxlYWt5QnVja2V0OiBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiAxLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IGdhdGV3YXkuc3Bhd25TaGFyZERlbGF5LFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9yZ2FuaXplIGFsbCBzaGFyZHMgaW50byB0aGVpciBvd24gYnVja2V0c1xuICAgICAgZm9yIChsZXQgc2hhcmRJZCA9IGdhdGV3YXkuZmlyc3RTaGFyZElkOyBzaGFyZElkIDw9IGdhdGV3YXkubGFzdFNoYXJkSWQ7ICsrc2hhcmRJZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBzaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIGlmIChzaGFyZElkID49IGdhdGV3YXkudG90YWxTaGFyZHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSkgaXMgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB1c2VkIGFtb3VudCBvZiB1c2VkIHNoYXJkcyB3aGljaCBpcyAke2dhdGV3YXkudG90YWxTaGFyZHN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRJZCA9IHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoYnVja2V0SWQpO1xuXG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNoYXJkIChpZDogJHtzaGFyZElkfSkgZ290IGFzc2lnbmVkIHRvIGFuIGlsbGVnYWwgYnVja2V0IGlkOiAke2J1Y2tldElkfSwgZXhwZWN0ZWQgYSBidWNrZXQgaWQgYmV0d2VlbiAwIGFuZCAke1xuICAgICAgICAgICAgICBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgLSAxXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSB3b3JrZXIgaWQgZm9yIHRoaXMgc2hhcmRcbiAgICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LmNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpO1xuICAgICAgICBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LmlkID09PSB3b3JrZXJJZCk7XG5cbiAgICAgICAgLy8gSWYgdGhpcyB3b3JrZXIgYWxyZWFkeSBleGlzdHMsIGFkZCB0aGUgc2hhcmQgdG8gaXRzIHF1ZXVlXG4gICAgICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgICB3b3JrZXIucXVldWUucHVzaChzaGFyZElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud29ya2Vycy5wdXNoKHsgaWQ6IHdvcmtlcklkLCBxdWV1ZTogW3NoYXJkSWRdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzcGF3blNoYXJkcygpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIGNvbmN1cnJlbmN5IGJ1Y2tldHNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKTtcblxuICAgICAgY29uc3QgcHJvbWlzZXMgPSBbLi4uZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKV0ubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNoYXJkSWQgb2Ygd29ya2VyLnF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCBnYXRld2F5LnRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlci5pZCwgc2hhcmRJZCwgYnVja2V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdlIHVzZSBQcm9taXNlLmFsbCBzbyB3ZSBjYW4gc3RhcnQgYWxsIGJ1Y2tldHMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4gICAgICAvLyBDaGVjayBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5IGlmIGF1dG8gcmVzaGFyZGluZyBpcyBlbmFibGVkLlxuICAgICAgaWYgKGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkICYmIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsICE9PSAtMSkge1xuICAgICAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gZW5zdXJlIHRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZVxuICAgICAgICBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpO1xuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci53YXJuKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgd2FzIG5vdCBwcm92aWRlZC4gRGlzYWJsaW5nIHJlc2hhcmRpbmcuXCIpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNoYXJkaW5nSW5mbyA9IGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkKCk7XG5cbiAgICAgICAgICBpZiAocmVzaGFyZGluZ0luZm8ubmVlZGVkICYmIHJlc2hhcmRpbmdJbmZvLmluZm8pIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5yZXNoYXJkKHJlc2hhcmRpbmdJbmZvLmluZm8pO1xuICAgICAgICB9LCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzaHV0ZG93bihjb2RlLCByZWFzb24sIGNsZWFyUmVzaGFyZGluZ0ludGVydmFsID0gdHJ1ZSkge1xuICAgICAgaWYgKGNsZWFyUmVzaGFyZGluZ0ludGVydmFsKSBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKS5tYXAoKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKSk7XG4gICAgfSxcbiAgICBhc3luYyBzZW5kUGF5bG9hZChzaGFyZElkLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IGdhdGV3YXkuc2hhcmRzLmdldChzaGFyZElkKTtcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuc2VuZChwYXlsb2FkKTtcbiAgICB9LFxuICAgIGFzeW5jIHRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlcklkLCBzaGFyZElkLCBidWNrZXRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBUZWxsIHdvcmtlciAjJHt3b3JrZXJJZH0gdG8gaWRlbnRpZnkgc2hhcmQgIyR7c2hhcmRJZH0gZnJvbSBidWNrZXQgJHtidWNrZXRJZH1gKTtcbiAgICAgIGF3YWl0IGdhdGV3YXkuaWRlbnRpZnkoc2hhcmRJZCk7XG4gICAgfSxcbiAgICBhc3luYyBpZGVudGlmeShzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGxldCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKTtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYCk7XG5cbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgc2hhcmQgPSBuZXcgU2hhcmQoe1xuICAgICAgICAgIGlkOiBzaGFyZElkLFxuICAgICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmNvbXByZXNzLFxuICAgICAgICAgICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IGdhdGV3YXkudHJhbnNwb3J0Q29tcHJlc3Npb24sXG4gICAgICAgICAgICBpbnRlbnRzOiB0aGlzLmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogdGhpcy50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiB0aGlzLnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogZ2F0ZXdheS5ldmVudHMgPz8ge30sXG4gICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RJZGVudGlmeShzaGFyZElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHJlcXVlc3RlZCBhbiBpZGVudGlmeS5gKTtcblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KTtcblxuICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmVxdWVzdCBpZGVudGlmeSBmb3IgYSBzaGFyZCB0aGF0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgYnVja2V0LlwiKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYnVja2V0LmxlYWt5QnVja2V0LmFjcXVpcmUoKTtcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBBcHByb3ZlZCBpZGVudGlmeSByZXF1ZXN0IGZvciBTaGFyZCAjJHtzaGFyZElkfS5gKTtcbiAgICB9LFxuXG4gICAgYXN5bmMga2lsbChzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gdGhpcy5zaGFyZHMuZ2V0KHNoYXJkSWQpO1xuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHdhcyByZXF1ZXN0ZWQgdG8gYmUga2lsbGVkLCBidXQgdGhlIHNoYXJkIGNvdWxkIG5vdCBiZSBmb3VuZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEtpbGxpbmcgU2hhcmQgIyR7c2hhcmRJZH1gKTtcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKTtcbiAgICAgIGF3YWl0IHNoYXJkLnNodXRkb3duKCk7XG4gICAgfSxcblxuICAgIC8vIEhlbHBlcnMgbWV0aG9kcyBiZWxvdyB0aGlzXG5cbiAgICBjYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQsIHRvdGFsU2hhcmRzKSB7XG4gICAgICAvLyBJZiBub25lIGlzIHByb3ZpZGVkLCB1c2UgdGhlIHRvdGFsIHNoYXJkcyBudW1iZXIgZnJvbSBnYXRld2F5IG9iamVjdC5cbiAgICAgIGlmICghdG90YWxTaGFyZHMpIHRvdGFsU2hhcmRzID0gZ2F0ZXdheS50b3RhbFNoYXJkcztcbiAgICAgIC8vIElmIGl0IGlzIG9ubHkgMSBzaGFyZCwgaXQgd2lsbCBhbHdheXMgYmUgc2hhcmQgaWQgMFxuICAgICAgaWYgKHRvdGFsU2hhcmRzID09PSAxKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoMSBzaGFyZClgKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoZ3VpbGRJZDogJHtndWlsZElkfSwgdG90YWxTaGFyZHM6ICR7dG90YWxTaGFyZHN9KWApO1xuICAgICAgcmV0dXJuIE51bWJlcigoQmlnSW50KGd1aWxkSWQpID4+IDIybikgJSBCaWdJbnQodG90YWxTaGFyZHMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblZvaWNlQ2hhbm5lbChndWlsZElkLCBjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCk7XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gam9pblZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IGNoYW5uZWxJZDogJHtjaGFubmVsSWR9YCk7XG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogY2hhbm5lbElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgc2VsZl9tdXRlOiBvcHRpb25zPy5zZWxmTXV0ZSA/PyBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IG9wdGlvbnM/LnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFN0YXR1cyhkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRCb3RTdGF0dXMgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uU2FmZVJlcGxhY2VyKX1gKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5nYXRld2F5LnNoYXJkcy52YWx1ZXMoKV0ubWFwKGFzeW5jIChzaGFyZCkgPT4ge1xuICAgICAgICAgIGdhdGV3YXkuZWRpdFNoYXJkU3RhdHVzKHNoYXJkLmlkLCBkYXRhKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2hhcmRTdGF0dXMoc2hhcmRJZCwgZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0U2hhcmRTdGF0dXMgc2hhcmRJZDogJHtzaGFyZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlByZXNlbmNlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgc2luY2U6IG51bGwsXG4gICAgICAgICAgYWZrOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpdml0aWVzOiBkYXRhLmFjdGl2aXRpZXMsXG4gICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpO1xuXG4gICAgICBpZiAoKCFvcHRpb25zPy5saW1pdCB8fCBvcHRpb25zLmxpbWl0ID4gMSkgJiYgKGdhdGV3YXkuaW50ZW50cyAmIEdhdGV3YXlJbnRlbnRzLkd1aWxkTWVtYmVycykgPT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIG1vcmUgdGhlbiAxIG1lbWJlciB3aXRob3V0IHRoZSBHVUlMRF9NRU1CRVJTIGludGVudCcpO1xuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnVzZXJJZHM/Lmxlbmd0aCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gc2V0dGluZyB1c2VyIGxpbWl0IGJhc2VkIG9uIHVzZXJJZHMgbGVuZ3RoOiAke29wdGlvbnMudXNlcklkcy5sZW5ndGh9YCk7XG5cbiAgICAgICAgb3B0aW9ucy5saW1pdCA9IG9wdGlvbnMudXNlcklkcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgbGV0IG5vbmNlID0gJyc7XG5cbiAgICAgICAgd2hpbGUgKCFub25jZSB8fCBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuaGFzKG5vbmNlKSkge1xuICAgICAgICAgIG5vbmNlID0gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPz89IHsgbGltaXQ6IDAgfTtcbiAgICAgICAgb3B0aW9ucy5ub25jZSA9IG5vbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZW1iZXJzID0gIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICAgICAgICAgICAgaWYgKCFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuc2V0KG9wdGlvbnMubm9uY2UsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIG1lbWJlcnM6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdEd1aWxkTWVtYmVycyxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgLy8gSWYgYSBxdWVyeSBpcyBwcm92aWRlZCB1c2UgaXQsIE9SIGlmIGEgbGltaXQgaXMgTk9UIHByb3ZpZGVkIHVzZSBcIlwiXG4gICAgICAgICAgcXVlcnk6IG9wdGlvbnM/LnF1ZXJ5ID8/IChvcHRpb25zPy5saW1pdCA/IHVuZGVmaW5lZCA6ICcnKSxcbiAgICAgICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gMCxcbiAgICAgICAgICBwcmVzZW5jZXM6IG9wdGlvbnM/LnByZXNlbmNlcyA/PyBmYWxzZSxcbiAgICAgICAgICB1c2VyX2lkczogb3B0aW9ucz8udXNlcklkcz8ubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgICAgbm9uY2U6IG9wdGlvbnM/Lm5vbmNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZW1iZXJzO1xuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVZvaWNlQ2hhbm5lbChndWlsZElkKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpO1xuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGxlYXZlVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gU2hhcmQgJHtzaGFyZElkfWApO1xuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IG51bGwsXG4gICAgICAgICAgc2VsZl9tdXRlOiBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RTb3VuZGJvYXJkU291bmRzKGd1aWxkSWRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIERpc2NvcmQgd2lsbCBzZW5kIHRoZSBldmVudHMgZm9yIHRoZSBndWlsZHMgdGhhdCBhcmUgXCJ1bmRlciB0aGUgc2hhcmRcIiB0aGF0IHNlbmRzIHRoZSBvcGNvZGUuXG4gICAgICAgKiBGb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBncm91cCB0aGUgaWRzIHdpdGggdGhlIHNoYXJkIHRoZSBjYWxjdWxhdGVTaGFyZElkIG1ldGhvZCBnaXZlc1xuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBCaWdTdHJpbmdbXT4oKTtcblxuICAgICAgZm9yIChjb25zdCBndWlsZElkIG9mIGd1aWxkSWRzKSB7XG4gICAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCk7XG5cbiAgICAgICAgY29uc3QgaWRzID0gbWFwLmdldChzaGFyZElkKSA/PyBbXTtcbiAgICAgICAgbWFwLnNldChzaGFyZElkLCBpZHMpO1xuXG4gICAgICAgIGlkcy5wdXNoKGd1aWxkSWQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLm1hcC5lbnRyaWVzKCldLm1hcCgoW3NoYXJkSWQsIGlkc10pID0+XG4gICAgICAgICAgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMsXG4gICAgICAgICAgICBkOiB7XG4gICAgICAgICAgICAgIGd1aWxkX2lkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZ2F0ZXdheTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogSWQgb2YgdGhlIGZpcnN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGZpcnN0U2hhcmRJZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBsYXN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGxhc3RTaGFyZElkPzogbnVtYmVyO1xuICAvKipcbiAgICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNwYXduaW5nIG5leHQgc2hhcmQuIE9QVElNQUwgSVMgQUJPVkUgNTEwMC4gWU9VIERPTidUIFdBTlQgVE8gSElUIFRIRSBSQVRFIExJTUlUISEhXG4gICAqIEBkZWZhdWx0IDUzMDBcbiAgICovXG4gIHNwYXduU2hhcmREZWxheT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRvdGFsIGFtb3VudCBvZiBzaGFyZHMgeW91ciBib3QgdXNlcy4gVXNlZnVsIGZvciB6ZXJvLWRvd250aW1lIHVwZGF0ZXMgb3IgcmVzaGFyZGluZy5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdG90YWxTaGFyZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHNoYXJkcyB0byBsb2FkIHBlciB3b3JrZXIuXG4gICAqIEBkZWZhdWx0IDI1XG4gICAqL1xuICBzaGFyZHNQZXJXb3JrZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIHdvcmtlcnMgdG8gdXNlIGZvciB5b3VyIGJvdC5cbiAgICogQGRlZmF1bHQgNFxuICAgKi9cbiAgdG90YWxXb3JrZXJzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hldGhlciB0byBzcHJlYWQgc2hhcmRzIGFjcm9zcyB3b3JrZXJzIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBCeSBkZWZhdWx0LCBzaGFyZHMgYXJlIGFzc2lnbmVkIHRvIHdvcmtlcnMgaW4gY29udGlndW91cyBibG9ja3MgYmFzZWQgb24gc2hhcmRzUGVyV29ya2VyLiBJZiBhbnkgc2hhcmQgaXMgbGVmdCBvdmVyLCBpdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBsYXN0IHdvcmtlci5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzIHdoaWxlIHNoYXJkc1BlcldvcmtlciBpcyAxMCwgdGhlIGZpcnN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMC05LCB0aGUgc2Vjb25kIHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMTAtMTksIGFuZCBzbyBvbiwgdGhlIGxhc3Qgd29ya2VyIHdpbGwgZ2V0IHNoYXJkcyAyMC0zOS5cbiAgICpcbiAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoZSBzaGFyZHMgd2lsbCBiZSBhc3NpZ25lZCBpbiBhIHJvdW5kLXJvYmluIG1hbm5lciB0byBzcHJlYWQgbW9yZSBldmVubHkgYWNyb3NzIHdvcmtlcnMuXG4gICAqIEZvciBleGFtcGxlLCB3aXRoIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzLCB0aGUgZmlyc3Qgc2hhcmQgd2lsbCBnbyB0byB3b3JrZXIgMCwgdGhlIHNlY29uZCBzaGFyZCB0byB3b3JrZXIgMSwgdGhlIHRoaXJkIHNoYXJkIHRvIHdvcmtlciAyLCB0aGUgZm91cnRoIHNoYXJkIHRvIHdvcmtlciAwLCBhbmQgc28gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4/OiBib29sZWFuO1xuICAvKiogSW1wb3J0YW50IGRhdGEgd2hpY2ggaXMgdXNlZCBieSB0aGUgbWFuYWdlciB0byBjb25uZWN0IHNoYXJkcyB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGlvbj86IENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90PjtcbiAgLyoqIFdoZXRoZXIgaW5jb21pbmcgcGF5bG9hZHMgYXJlIGNvbXByZXNzZWQgdXNpbmcgemxpYi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGNvbXByZXNzPzogYm9vbGVhbjtcbiAgLyoqIFdoYXQgdHJhbnNwb3J0IGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkICovXG4gIHRyYW5zcG9ydENvbXByZXNzaW9uPzogVHJhbnNwb3J0Q29tcHJlc3Npb24gfCBudWxsO1xuICAvKiogVGhlIGNhbGN1bGF0ZWQgaW50ZW50IHZhbHVlIG9mIHRoZSBldmVudHMgd2hpY2ggdGhlIHNoYXJkIHNob3VsZCByZWNlaXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBpbnRlbnRzPzogbnVtYmVyO1xuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllcz86IHtcbiAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSB0aGUgc2hhcmQgcnVucyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZGFyd2luXCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIlxuICAgICAqL1xuICAgIG9zOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBcImJyb3dzZXJcIiB3aGVyZSB0aGlzIHNoYXJkIGlzIHJ1bm5pbmcgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGJyb3dzZXI6IHN0cmluZztcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmc7XG4gIH07XG4gIC8qKiBCb3QgdG9rZW4gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQgKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xuICAvKiogVGhlIGdhdGV3YXkgdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHZlcnNpb24/OiBudW1iZXI7XG4gIC8qKiBUaGUgZXZlbnRzIGhhbmRsZXJzICovXG4gIGV2ZW50cz86IFNoYXJkRXZlbnRzO1xuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZT86IHtcbiAgICByZXF1ZXN0TWVtYmVycz86IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciBvciBub3QgcmVxdWVzdCBtZW1iZXIgcmVxdWVzdHMgc2hvdWxkIGJlIGNhY2hlZC5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGdhdGV3YXkgbWFuYWdlciB3aWxsIHVzZS5cbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKipcbiAgICogTWFrZSB0aGUgcHJlc2VuY2UgZm9yIHdoZW4gdGhlIGJvdCBjb25uZWN0cyB0byB0aGUgZ2F0ZXdheVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSBhIFNoYXJkIGlzIGdvaW5nIHRvIGlkZW50aWZ5XG4gICAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPERpc2NvcmRVcGRhdGVQcmVzZW5jZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBPcHRpb25zIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZz86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBhdXRvbWF0ZWQgcmVzaGFyZGluZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgJSBvZiBob3cgZnVsbCBhIHNoYXJkIGlzIHdoZW4gcmVzaGFyZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBXZSB1c2UgZGlzY29yZCByZWNvbW1lbmRlZCBzaGFyZCB2YWx1ZSB0byBnZXQgYW4gKiphcHByb3hpbWF0aW9uKiogb2YgdGhlIHNoYXJkIGZ1bGwgcGVyY2VudGFnZSB0byBjb21wYXJlIHdpdGggdGhpcyB2YWx1ZSBzbyB0aGUgYm90IG1heSBub3QgcmVzaGFyZCBhdCB0aGUgZXhhY3QgcGVyY2VudGFnZSBwcm92aWRlZCBidXQgbWF5IHJlc2hhcmQgd2hlbiBpdCBpcyBhIGJpdCBoaWdoZXIgdGhhbiB0aGUgcHJvdmlkZWQgcGVyY2VudGFnZS5cbiAgICAgKiBGb3IgYWNjdXJhdGUgY2FsY3VsYXRpb24sIHlvdSBtYXkgb3ZlcnJpZGUgdGhlIGBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkYCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODAgYXMgaW4gODAlXG4gICAgICovXG4gICAgc2hhcmRzRnVsbFBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLCBvZiBob3cgb2Z0ZW4gdG8gY2hlY2sgd2hldGhlciByZXNoYXJkaW5nIGlzIG5lZWRlZCBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5LiBTZXQgdG8gLTEgdG8gZGlzYWJsZSBhdXRvIHJlc2hhcmRpbmcuXG4gICAgICogQGRlZmF1bHQgMjg4MDAwMDAgKDggaG91cnMpXG4gICAgICovXG4gICAgY2hlY2tJbnRlcnZhbDogbnVtYmVyO1xuICAgIC8qKiBIYW5kbGVyIHRvIGdldCBzaGFyZCBjb3VudCBhbmQgb3RoZXIgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIGdldFNlc3Npb25JbmZvPzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4+O1xuICAgIC8qKiBIYW5kbGVyIHRvIGVkaXQgdGhlIHNoYXJkIGlkIG9uIGFueSBjYWNoZWQgZ3VpbGRzLiAqL1xuICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ/OiAoZ3VpbGRJZHM6IHN0cmluZ1tdLCBzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+O1xuICAgICAgLyoqIFRoZSBidWNrZXQgdG8gcXVldWUgdGhlIGlkZW50aWZpZXMuICovXG4gICAgICBsZWFreUJ1Y2tldDogTGVha3lCdWNrZXQ7XG4gICAgfVxuICA+O1xuICAvKiogVGhlIHNoYXJkcyB0aGF0IGFyZSBjcmVhdGVkLiAqL1xuICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPjtcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKiogRXZlcnl0aGluZyByZWxhdGVkIHRvIHJlc2hhcmRpbmcuICovXG4gIHJlc2hhcmRpbmc6IENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9uc1sncmVzaGFyZGluZyddICYge1xuICAgIC8qKiBUaGUgaW50ZXJ2YWwgaWQgb2YgdGhlIGNoZWNrIGludGVydmFsLiBUaGlzIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVydmFsIHdoZW4gdGhlIG1hbmFnZXIgaXMgc2h1dGRvd24uICovXG4gICAgY2hlY2tJbnRlcnZhbElkPzogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPjtcbiAgICAvKiogSGFuZGxlciB0byBjaGVjayBpZiByZXNoYXJkaW5nIGlzIG5lY2Vzc2FyeS4gKi9cbiAgICBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkOiAoKSA9PiBQcm9taXNlPHsgbmVlZGVkOiBib29sZWFuOyBpbmZvPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+IH0+O1xuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgdG8gYmVnaW4gcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgb25jZSB0aGUgcmVzaGFyZGluZyBpcyBkb25lLlxuICAgICAqIFNvIHdoZW4gYWxsIHRoZSBjYWxscyB0byB7QGxpbmsgdGVsbFdvcmtlclRvUHJlcGFyZX0gYW5kIHtAbGluayBvblJlc2hhcmRpbmdTd2l0Y2h9IGFyZSBkb25lLlxuICAgICAqL1xuICAgIHJlc2hhcmQ6IChpbmZvOiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gJiB7IGZpcnN0U2hhcmRJZD86IG51bWJlcjsgbGFzdFNoYXJkSWQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgaXQgbmVlZHMgdG8gc3Bhd24gYSBuZXcgc2hhcmQgYW5kIGlkZW50aWZ5IGl0IGZvciB0aGUgcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoYW5kbGVyIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUge0BsaW5rIHRlbGxXb3JrZXJUb0lkZW50aWZ5fSBoYW5kbGVyLlxuICAgICAqIFNvIHlvdSBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICB0ZWxsV29ya2VyVG9QcmVwYXJlOiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEhhbmRsZSBjYWxsZWQgd2hlbiBhbGwgdGhlIHdvcmtlcnMgaGF2ZSBmaW5pc2hlZCBwcmVwYXJpbmcgZm9yIHRoZSByZXNoYXJkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBzaG91bGQgbWFrZSB0aGUgbmV3IHJlc2hhcmRlZCBzaGFyZHMgYmVjb21lIHRoZSBhY3RpdmUgb25lcyBhbmQgc2h1dGRvd24gdGhlIG9sZCBvbmVzXG4gICAgICovXG4gICAgb25SZXNoYXJkaW5nU3dpdGNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9O1xuICAvKiogRGV0ZXJtaW5lIG1heCBudW1iZXIgb2Ygc2hhcmRzIHRvIHVzZSBiYXNlZCB1cG9uIHRoZSBtYXggY29uY3VycmVuY3kuICovXG4gIGNhbGN1bGF0ZVRvdGFsU2hhcmRzOiAoKSA9PiBudW1iZXI7XG4gIC8qKiBEZXRlcm1pbmUgdGhlIGlkIG9mIHRoZSB3b3JrZXIgd2hpY2ggaXMgaGFuZGxpbmcgYSBzaGFyZC4gKi9cbiAgY2FsY3VsYXRlV29ya2VySWQ6IChzaGFyZElkOiBudW1iZXIpID0+IG51bWJlcjtcbiAgLyoqIFByZXBhcmVzIGFsbCB0aGUgYnVja2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGlkZW50aWZ5aW5nIHRoZSBzaGFyZHMuICovXG4gIHByZXBhcmVCdWNrZXRzOiAoKSA9PiB2b2lkO1xuICAvKiogU3RhcnQgaWRlbnRpZnlpbmcgYWxsIHRoZSBzaGFyZHMuICovXG4gIHNwYXduU2hhcmRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU2h1dGRvd24gYWxsIHNoYXJkcy4gKi9cbiAgc2h1dGRvd246IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nLCBjbGVhclJlc2hhcmRpbmdJbnRlcnZhbD86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gaG9vayBpbiBhbmQgY2hhbmdlIHRvIGNvbW11bmljYXRlIHRvIGRpZmZlcmVudCB3b3JrZXJzIGFjcm9zcyBkaWZmZXJlbnQgc2VydmVycyBvciBhbnl0aGluZyB0aGV5IGxpa2UuXG4gICAqIEZvciBleGFtcGxlIHVzaW5nIHJlZGlzIHB1YnN1YiB0byB0YWxrIHRvIG90aGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgc2hvdWxkIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gaGF2ZSBpZGVudGlmaWVkIHRoZSBzaGFyZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAqL1xuICB0ZWxsV29ya2VyVG9JZGVudGlmeTogKHdvcmtlcklkOiBudW1iZXIsIHNoYXJkSWQ6IG51bWJlciwgYnVja2V0SWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRlbGwgdGhlIG1hbmFnZXIgdG8gaWRlbnRpZnkgYSBTaGFyZC4gSWYgdGhpcyBTaGFyZCBpcyBub3QgYWxyZWFkeSBtYW5hZ2VkIHRoaXMgd2lsbCBhbHNvIGFkZCB0aGUgU2hhcmQgdG8gdGhlIG1hbmFnZXIuICovXG4gIGlkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogS2lsbCBhIHNoYXJkLiBDbG9zZSBhIHNoYXJkcyBjb25uZWN0aW9uIHRvIERpc2NvcmQncyBnYXRld2F5IChpZiBhbnkpIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbWFuYWdlci4gKi9cbiAga2lsbDogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWNrZXQgaXMgYWxsb3dlZCB0byBtYWtlIHRoZSBuZXh0IGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBzaGFyZHMgYmFzZWQgb24gdGhlIGd1aWxkIGlkIGFuZCB0b3RhbCBzaGFyZHMuICovXG4gIGNhbGN1bGF0ZVNoYXJkSWQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRvdGFsU2hhcmRzPzogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25uZWN0cyB0aGUgYm90IHVzZXIgdG8gYSB2b2ljZSBvciBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBfVXBkYXRlIFZvaWNlIFN0YXRlXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSB2b2ljZSBjaGFubmVsIHRvIGxlYXZlIGlzIGluLlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHlvdSB3YW50IHRvIGpvaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgQ09OTkVDVGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheS1ldmVudHMjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgam9pblZvaWNlQ2hhbm5lbDogKFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBjaGFubmVsSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zPzogQXRMZWFzdE9uZTxPbWl0PFVwZGF0ZVZvaWNlU3RhdGUsICdndWlsZElkJyB8ICdjaGFubmVsSWQnPj4sXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3Qgc3RhdHVzIGluIGFsbCBzaGFyZHMgdGhhdCB0aGlzIGdhdGV3YXkgbWFuYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIG5vdGhpbmdcbiAgICovXG4gIGVkaXRCb3RTdGF0dXM6IChkYXRhOiBEaXNjb3JkVXBkYXRlUHJlc2VuY2UpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90J3Mgc3RhdHVzIG9uIG9uZSBzaGFyZC5cbiAgICpcbiAgICogQHBhcmFtIHNoYXJkSWQgVGhlIHNoYXJkIGlkIHRvIGVkaXQgdGhlIHN0YXR1cyBmb3IuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0U2hhcmRTdGF0dXM6IChzaGFyZElkOiBudW1iZXIsIGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZCBvdmVyIHRoZSBnYXRld2F5LiBJZiBgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkYCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGFuZCB5b3UnbGwgaGF2ZSB0byBoYW5kbGUgdGhlIGBHVUlMRF9NRU1CRVJTX0NIVU5LYCBldmVudHMgeW91cnNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgcmVxdWVzdGluZyB0aGUgZW50aXJlIG1lbWJlciBsaXN0OlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIHByZXNlbmNlcyAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMucHJlc2VuY2VzIHwgcHJlc2VuY2VzfSBzZXQgdG8gYHRydWVgKTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYEdVSUxEX1BSRVNFTkNFU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgcHJlZml4ICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5xdWVyeSB8IHF1ZXJ5fSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgdXNlcnMgYnkgSUQgKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnVzZXJJZHMgfCB1c2VySWRzfSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXJzIENodW5rXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSAxMDAwIG1lbWJlcnMgZmV0Y2hlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXktZXZlbnRzI3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICovXG4gIHJlcXVlc3RNZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogT21pdDxSZXF1ZXN0R3VpbGRNZW1iZXJzLCAnZ3VpbGRJZCc+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPj47XG4gIC8qKlxuICAgKiBMZWF2ZXMgdGhlIHZvaWNlIGNoYW5uZWwgdGhlIGJvdCB1c2VyIGlzIGN1cnJlbnRseSBpbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheS1ldmVudHMjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgbGVhdmVWb2ljZUNoYW5uZWw6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBVc2VkIHRvIHJlcXVlc3Qgc291bmRib2FyZCBzb3VuZHMgZm9yIGEgbGlzdCBvZiBndWlsZHMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgbXVsdGlwbGUgKHNlZSByZW1hcmtzKSBfUmVxdWVzdCBTb3VuZGJvYXJkIFNvdW5kc18gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkcyAtIFRoZSBndWlsZHMgdG8gZ2V0IHRoZSBzb3VuZHMgZnJvbVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9Tb3VuZGJvYXJkIFNvdW5kc18gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICog4pqg77iPIERpc2NvcmQgd2lsbCBzZW5kIHRoZSBfU291bmRib2FyZCBTb3VuZHNfIGZvciBlYWNoIG9mIHRoZSBndWlsZCBpZHNcbiAgICogaG93ZXZlciB5b3UgbWF5IG5vdCByZWNlaXZlIHRoZSBzYW1lIG51bWJlciBvZiBldmVudHMgYXMgdGhlIGlkcyBwYXNzZWQgdG8gX1JlcXVlc3QgU291bmRib2FyZCBTb3VuZHNfIGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxuICAgKiAtIFRoZSBib3QgaXMgbm90IGluIHRoZSBzZXJ2ZXIgcHJvdmlkZWRcbiAgICogLSBUaGUgc2hhcmQgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCBmcm9tIGRvZXMgbm90IHJlY2VpdmUgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGd1aWxkXG4gICAqXG4gICAqIFRvIGF2b2lkIHRoaXMgRGlzY29yZGVubyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGdyb3VwIHRoZSBpZHMgYmFzZWQgb24gd2hhdCBzaGFyZCB0aGV5IHdpbGwgbmVlZCB0byBiZSBzZW50LCBidXQgdGhpcyBpbnZvbHZlcyBzZW5kaW5nIG11bHRpcGxlIG1lc3NhZ2VzIGluIG11bHRpcGxlIHNoYXJkc1xuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheS1ldmVudHMjcmVxdWVzdC1zb3VuZGJvYXJkLXNvdW5kc31cbiAgICovXG4gIHJlcXVlc3RTb3VuZGJvYXJkU291bmRzOiAoZ3VpbGRJZHM6IEJpZ1N0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZToge1xuICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkOiBib29sZWFuO1xuICAgICAgLyoqIFRoZSBwZW5kaW5nIHJlcXVlc3RzLiAqL1xuICAgICAgcGVuZGluZzogQ29sbGVjdGlvbjxzdHJpbmcsIFJlcXVlc3RNZW1iZXJSZXF1ZXN0PjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RNZW1iZXJSZXF1ZXN0IHtcbiAgLyoqIFRoZSB1bmlxdWUgbm9uY2UgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbm9uY2U6IHN0cmluZztcbiAgLyoqIFRoZSByZXNvbHZlciBoYW5kbGVyIHRvIHJ1biB3aGVuIGFsbCBtZW1iZXJzIGFycml2ZS4gKi9cbiAgcmVzb2x2ZTogKHZhbHVlOiBDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4gfCBQcm9taXNlTGlrZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+KSA9PiB2b2lkO1xuICAvKiogVGhlIG1lbWJlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXJyaXZlZCBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBtZW1iZXJzOiBEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXTtcbn1cbiJdLCJuYW1lcyI6WyJyYW5kb21CeXRlcyIsIkdhdGV3YXlJbnRlbnRzIiwiR2F0ZXdheU9wY29kZXMiLCJDb2xsZWN0aW9uIiwianNvblNhZmVSZXBsYWNlciIsIkxlYWt5QnVja2V0IiwibG9nZ2VyIiwiU2hhcmQiLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJjcmVhdGVHYXRld2F5TWFuYWdlciIsIm9wdGlvbnMiLCJjb25uZWN0aW9uT3B0aW9ucyIsImNvbm5lY3Rpb24iLCJ1cmwiLCJzaGFyZHMiLCJzZXNzaW9uU3RhcnRMaW1pdCIsIm1heENvbmN1cnJlbmN5IiwicmVtYWluaW5nIiwidG90YWwiLCJyZXNldEFmdGVyIiwiZ2F0ZXdheSIsImV2ZW50cyIsImNvbXByZXNzIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJpbnRlbnRzIiwicHJvcGVydGllcyIsIm9zIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYnJvd3NlciIsImRldmljZSIsInRva2VuIiwidmVyc2lvbiIsInRvdGFsU2hhcmRzIiwibGFzdFNoYXJkSWQiLCJmaXJzdFNoYXJkSWQiLCJ0b3RhbFdvcmtlcnMiLCJzaGFyZHNQZXJXb3JrZXIiLCJzcGF3blNoYXJkRGVsYXkiLCJzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4iLCJNYXAiLCJidWNrZXRzIiwiY2FjaGUiLCJyZXF1ZXN0TWVtYmVycyIsImVuYWJsZWQiLCJwZW5kaW5nIiwibWFrZVByZXNlbmNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bmRlZmluZWQiLCJyZXNoYXJkaW5nIiwic2hhcmRzRnVsbFBlcmNlbnRhZ2UiLCJjaGVja0ludGVydmFsIiwiZ2V0U2Vzc2lvbkluZm8iLCJ1cGRhdGVHdWlsZHNTaGFyZElkIiwiY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCIsImRlYnVnIiwibmVlZGVkIiwiRXJyb3IiLCJzZXNzaW9uSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbmZvIiwicGVyY2VudGFnZSIsInJlc2hhcmQiLCJjYWxjdWxhdGVUb3RhbFNoYXJkcyIsImNsZWFyIiwicHJlcGFyZUJ1Y2tldHMiLCJwcm9taXNlcyIsIkFycmF5IiwiZnJvbSIsImVudHJpZXMiLCJtYXAiLCJidWNrZXRJZCIsImJ1Y2tldCIsIndvcmtlciIsIndvcmtlcnMiLCJzaGFyZElkIiwicXVldWUiLCJ0ZWxsV29ya2VyVG9QcmVwYXJlIiwiaWQiLCJhbGwiLCJvblJlc2hhcmRpbmdTd2l0Y2giLCJ3b3JrZXJJZCIsInNoYXJkIiwibWVzc2FnZSIsIl9zaGFyZCIsInBheWxvYWQiLCJ0IiwiZCIsImd1aWxkcyIsImciLCJyZXF1ZXN0SWRlbnRpZnkiLCJzZXQiLCJpZGVudGlmeSIsInZhbHVlcyIsIm9sZEhhbmRsZXIiLCJfIiwic2h1dGRvd24iLCJSZXNoYXJkZWQiLCJNYXRoIiwiY2VpbCIsImNhbGN1bGF0ZVdvcmtlcklkIiwibWluIiwiZmxvb3IiLCJpIiwibGVha3lCdWNrZXQiLCJtYXgiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdldCIsImZpbmQiLCJ3IiwicHVzaCIsInNwYXduU2hhcmRzIiwidGVsbFdvcmtlclRvSWRlbnRpZnkiLCJjbGVhckludGVydmFsIiwiY2hlY2tJbnRlcnZhbElkIiwid2FybiIsInNldEludGVydmFsIiwicmVzaGFyZGluZ0luZm8iLCJjb2RlIiwicmVhc29uIiwiY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwiLCJjbG9zZSIsInNlbmRQYXlsb2FkIiwic2VuZCIsImFjcXVpcmUiLCJraWxsIiwiZGVsZXRlIiwiY2FsY3VsYXRlU2hhcmRJZCIsImd1aWxkSWQiLCJOdW1iZXIiLCJCaWdJbnQiLCJqb2luVm9pY2VDaGFubmVsIiwiY2hhbm5lbElkIiwib3AiLCJWb2ljZVN0YXRlVXBkYXRlIiwiZ3VpbGRfaWQiLCJ0b1N0cmluZyIsImNoYW5uZWxfaWQiLCJzZWxmX211dGUiLCJzZWxmTXV0ZSIsInNlbGZfZGVhZiIsInNlbGZEZWFmIiwiZWRpdEJvdFN0YXR1cyIsImRhdGEiLCJlZGl0U2hhcmRTdGF0dXMiLCJQcmVzZW5jZVVwZGF0ZSIsInNpbmNlIiwiYWZrIiwiYWN0aXZpdGllcyIsInN0YXR1cyIsImxpbWl0IiwiR3VpbGRNZW1iZXJzIiwidXNlcklkcyIsImxlbmd0aCIsIm5vbmNlIiwiaGFzIiwibWVtYmVycyIsInJlamVjdCIsIlJlcXVlc3RHdWlsZE1lbWJlcnMiLCJxdWVyeSIsInByZXNlbmNlcyIsInVzZXJfaWRzIiwibGVhdmVWb2ljZUNoYW5uZWwiLCJyZXF1ZXN0U291bmRib2FyZFNvdW5kcyIsImd1aWxkSWRzIiwiaWRzIiwiUmVxdWVzdFNv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
|
|
464
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgdHlwZSBBdExlYXN0T25lLFxuICB0eXBlIEJpZ1N0cmluZyxcbiAgdHlwZSBDYW1lbGl6ZSxcbiAgdHlwZSBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyV2l0aFVzZXIsXG4gIHR5cGUgRGlzY29yZFJlYWR5LFxuICB0eXBlIERpc2NvcmRSZXF1ZXN0Q2hhbm5lbEluZm8sXG4gIHR5cGUgRGlzY29yZFVwZGF0ZVByZXNlbmNlLFxuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgUmVxdWVzdENoYW5uZWxJbmZvLFxuICB0eXBlIFJlcXVlc3RHdWlsZE1lbWJlcnMsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIGpzb25TYWZlUmVwbGFjZXIsIExlYWt5QnVja2V0LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscyc7XG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcyc7XG5pbXBvcnQgeyB0eXBlIFNoYXJkRXZlbnRzLCBTaGFyZFNvY2tldENsb3NlQ29kZXMsIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LCB0eXBlIFRyYW5zcG9ydENvbXByZXNzaW9uLCB0eXBlIFVwZGF0ZVZvaWNlU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdhdGV3YXlNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9ucyk6IEdhdGV3YXlNYW5hZ2VyIHtcbiAgY29uc3QgY29ubmVjdGlvbk9wdGlvbnMgPSBvcHRpb25zLmNvbm5lY3Rpb24gPz8ge1xuICAgIHVybDogJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgc2hhcmRzOiAxLFxuICAgIHNlc3Npb25TdGFydExpbWl0OiB7XG4gICAgICBtYXhDb25jdXJyZW5jeTogMSxcbiAgICAgIHJlbWFpbmluZzogMTAwMCxcbiAgICAgIHRvdGFsOiAxMDAwLFxuICAgICAgcmVzZXRBZnRlcjogMTAwMCAqIDYwICogNjAgKiAyNCxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgc2hhcmRzOiBuZXcgTWFwKCksXG4gICAgYnVja2V0czogbmV3IE1hcCgpLFxuICAgIGNhY2hlOiB7XG4gICAgICByZXF1ZXN0TWVtYmVyczoge1xuICAgICAgICBlbmFibGVkOiBvcHRpb25zLmNhY2hlPy5yZXF1ZXN0TWVtYmVycz8uZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgcGVuZGluZzogbmV3IENvbGxlY3Rpb24oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlcixcbiAgICBtYWtlUHJlc2VuY2U6IG9wdGlvbnMubWFrZVByZXNlbmNlID8/ICgoKSA9PiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKSksXG4gICAgcmVzaGFyZGluZzoge1xuICAgICAgZW5hYmxlZDogb3B0aW9ucy5yZXNoYXJkaW5nPy5lbmFibGVkID8/IHRydWUsXG4gICAgICBzaGFyZHNGdWxsUGVyY2VudGFnZTogb3B0aW9ucy5yZXNoYXJkaW5nPy5zaGFyZHNGdWxsUGVyY2VudGFnZSA/PyA4MCxcbiAgICAgIGNoZWNrSW50ZXJ2YWw6IG9wdGlvbnMucmVzaGFyZGluZz8uY2hlY2tJbnRlcnZhbCA/PyAyODgwMDAwMCwgLy8gOCBob3Vyc1xuICAgICAgc2hhcmRzOiBuZXcgTWFwKCksXG4gICAgICBnZXRTZXNzaW9uSW5mbzogb3B0aW9ucy5yZXNoYXJkaW5nPy5nZXRTZXNzaW9uSW5mbyxcbiAgICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ6IG9wdGlvbnMucmVzaGFyZGluZz8udXBkYXRlR3VpbGRzU2hhcmRJZCxcbiAgICAgIGFzeW5jIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQoKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gQ2hlY2tpbmcgaWYgcmVzaGFyZGluZyBpcyBuZWVkZWQuJyk7XG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBkaXNhYmxlZC4nKTtcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgbm8gJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgaXMgbm90IHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkLicpO1xuXG4gICAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBTZXNzaW9uIGluZm8gcmV0cmlldmVkOiAke0pTT04uc3RyaW5naWZ5KHNlc3Npb25JbmZvKX1gKTtcblxuICAgICAgICAvLyBEb24ndCBoYXZlIGVub3VnaCBpZGVudGlmeSBsaW1pdHMgdG8gdHJ5IHJlc2hhcmRpbmdcbiAgICAgICAgaWYgKHNlc3Npb25JbmZvLnNlc3Npb25TdGFydExpbWl0LnJlbWFpbmluZyA8IHNlc3Npb25JbmZvLnNoYXJkcykge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gTm90IGVub3VnaCBzZXNzaW9uIHN0YXJ0IGxpbWl0cyBsZWZ0IHRvIHJlc2hhcmQuJyk7XG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBBYmxlIHRvIHJlc2hhcmQsIGNoZWNraW5nIHdoZXRoZXIgbmVjZXNzYXJ5IG5vdy4nKTtcblxuICAgICAgICAvLyAyNTAwIGlzIHRoZSBtYXggYW1vdW50IG9mIGd1aWxkcyBhIHNpbmdsZSBzaGFyZCBjYW4gaGFuZGxlXG4gICAgICAgIC8vIDEwMDAgaXMgdGhlIGFtb3VudCBvZiBndWlsZHMgZGlzY29yZCB1c2VzIHRvIGRldGVybWluZSBob3cgbWFueSBzaGFyZHMgdG8gcmVjb21tZW5kLlxuICAgICAgICAvLyBUaGlzIGFsZ28gaGVscHMgY2hlY2sgaWYgeW91ciBib3QgaGFzIGdyb3duIGVub3VnaCB0byByZXNoYXJkLlxuICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGltcHJlY2lzZSBhcyBkaXNjb3JkIGNoYW5nZXMgdGhlIHJlY29tbWVuZGVkIG51bWJlciBvZiBzaGFyZCBldmVyeSAxMDAwIGd1aWxkcyBpdCBpcyBnb29kIGVub3VnaFxuICAgICAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gc3RvcmUgdGhlIGd1aWxkIGNvdW50IGZvciBlYWNoIHNoYXJkIGFuZCByZXF1aXJlIHRoZSBHdWlsZHMgaW50ZW50IGZvciBgR1VJTERfQ1JFQVRFYCBhbmQgYEdVSUxEX0RFTEVURWAgZXZlbnRzXG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoc2Vzc2lvbkluZm8uc2hhcmRzIC8gKChnYXRld2F5LnRvdGFsU2hhcmRzICogMjUwMCkgLyAxMDAwKSkgKiAxMDA7XG5cbiAgICAgICAgLy8gTGVzcyB0aGFuIG5lY2Vzc2FyeSUgYmVpbmcgdXNlZCBzbyBkbyBub3RoaW5nXG4gICAgICAgIGlmIChwZXJjZW50YWdlIDwgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkc0Z1bGxQZXJjZW50YWdlKSB7XG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIG5vdCBuZWVkZWQuJyk7XG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgbmVlZGVkLicpO1xuXG4gICAgICAgIHJldHVybiB7IG5lZWRlZDogdHJ1ZSwgaW5mbzogc2Vzc2lvbkluZm8gfTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXNoYXJkKGluZm8pIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIFN0YXJ0aW5nIHRoZSByZXNoYXJkIHByb2Nlc3MuIFByZXZpb3VzIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApO1xuICAgICAgICAvLyBTZXQgdmFsdWVzIG9uIGdhdGV3YXlcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGluZm8uc2hhcmRzO1xuICAgICAgICAvLyBIYW5kbGVzIHByZXBhcmluZyBtaWQgc2l6ZWQgYm90cyBmb3IgTEJTXG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBnYXRld2F5LmNhbGN1bGF0ZVRvdGFsU2hhcmRzKCk7XG4gICAgICAgIC8vIFNldCBmaXJzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5maXJzdFNoYXJkSWQgPT09ICdudW1iZXInKSBnYXRld2F5LmZpcnN0U2hhcmRJZCA9IGluZm8uZmlyc3RTaGFyZElkO1xuICAgICAgICAvLyBTZXQgbGFzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5sYXN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkubGFzdFNoYXJkSWQgPSBpbmZvLmxhc3RTaGFyZElkO1xuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZ2V0IGFueSBsYXN0U2hhcmRJZCwgd2UgYXNzdW1lIGFsbCB0aGUgc2hhcmRzIGFyZSB0byBiZSB1c2VkXG4gICAgICAgIGVsc2UgZ2F0ZXdheS5sYXN0U2hhcmRJZCA9IGdhdGV3YXkudG90YWxTaGFyZHMgLSAxO1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU3RhcnRpbmcgdGhlIHJlc2hhcmQgcHJvY2Vzcy4gTmV3IHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApO1xuXG4gICAgICAgIC8vIFJlc2V0dGluZyBidWNrZXRzXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5jbGVhcigpO1xuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpO1xuXG4gICAgICAgIC8vIENhbGwgYWxsIHRoZSBidWNrZXRzIGFuZCB0ZWxsIHRoZWlyIHdvcmtlcnMgJiBzaGFyZHMgdG8gaWRlbnRpZnlcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKGdhdGV3YXkuYnVja2V0cy5lbnRyaWVzKCkpLm1hcChhc3luYyAoW2J1Y2tldElkLCBidWNrZXRdKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIEFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuYCk7XG5cbiAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLm9uUmVzaGFyZGluZ1N3aXRjaCgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gVGVsbGluZyB3b3JrZXIgdG8gcHJlcGFyZS4gV29ya2VyOiAke3dvcmtlcklkfSB8IFNoYXJkOiAke3NoYXJkSWR9IHwgQnVja2V0OiAke2J1Y2tldElkfS5gKTtcbiAgICAgICAgY29uc3Qgc2hhcmQgPSBuZXcgU2hhcmQoe1xuICAgICAgICAgIGlkOiBzaGFyZElkLFxuICAgICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAgIGNvbXByZXNzOiBnYXRld2F5LmNvbXByZXNzLFxuICAgICAgICAgICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IGdhdGV3YXkudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgICAgIGludGVudHM6IGdhdGV3YXkuaW50ZW50cyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGdhdGV3YXkucHJvcGVydGllcyxcbiAgICAgICAgICAgIHRva2VuOiBnYXRld2F5LnRva2VuLFxuICAgICAgICAgICAgdG90YWxTaGFyZHM6IGdhdGV3YXkudG90YWxTaGFyZHMsXG4gICAgICAgICAgICB1cmw6IGdhdGV3YXkudXJsLFxuICAgICAgICAgICAgdmVyc2lvbjogZ2F0ZXdheS52ZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKF9zaGFyZCwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGV2ZW50cyB1bnRpbCB3ZSBzd2ljaCBmcm9tIHRoZSBvbGQgc2hhcmRzIHRvIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgaWYgKHBheWxvYWQudCA9PT0gJ1JFQURZJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy51cGRhdGVHdWlsZHNTaGFyZElkPy4oXG4gICAgICAgICAgICAgICAgICAocGF5bG9hZC5kIGFzIERpc2NvcmRSZWFkeSkuZ3VpbGRzLm1hcCgoZykgPT4gZy5pZCksXG4gICAgICAgICAgICAgICAgICBzaGFyZElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsb2dnZXI6IGdhdGV3YXkubG9nZ2VyLFxuICAgICAgICAgIHJlcXVlc3RJZGVudGlmeTogYXN5bmMgKCkgPT4gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCksXG4gICAgICAgICAgbWFrZVByZXNlbmNlOiBnYXRld2F5Lm1ha2VQcmVzZW5jZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy5zZXQoc2hhcmRJZCwgc2hhcmQpO1xuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCk7XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBTaGFyZCAjJHtzaGFyZElkfSBpZGVudGlmaWVkLmApO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIG9uUmVzaGFyZGluZ1N3aXRjaCgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBNYWtpbmcgdGhlIHN3aXRjaCBmcm9tIHRoZSBvbGQgc2hhcmRzIHRvIHRoZSBuZXcgb25lcy5gKTtcblxuICAgICAgICAvLyBNb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0gZ2F0ZXdheS5ldmVudHMgPz8ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbGQgc2hhcmRzIHN0b3AgcHJvY2Vzc2luZyBldmVudHNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnNoYXJkcy52YWx1ZXMoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEhhbmRsZXIgPSBzaGFyZC5ldmVudHMubWVzc2FnZTtcblxuICAgICAgICAgIC8vIENoYW5nZSB3aXRoIHNwcmVhZCBvcGVyYXRvciB0byBub3QgYWZmZWN0IG5ldyBzaGFyZHMsIGFzIGNoYW5naW5nIGFueXRoaW5nIG9uIHNoYXJkLmV2ZW50cyB3aWxsIGRpcmVjdGx5IGNoYW5nZSBnYXRld2F5LmV2ZW50cywgd2hpY2ggY2hhbmdlcyBuZXcgc2hhcmRzJyBldmVudHNcbiAgICAgICAgICBzaGFyZC5ldmVudHMgPSB7XG4gICAgICAgICAgICAuLi5zaGFyZC5ldmVudHMsXG4gICAgICAgICAgICBtZXNzYWdlOiBhc3luYyBmdW5jdGlvbiAoXywgbWVzc2FnZSkge1xuICAgICAgICAgICAgICAvLyBNZW1iZXIgY2hlY2tzIG5lZWQgdG8gY29udGludWUgYnV0IG90aGVycyBjYW4gc3RvcFxuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50ID09PSAnR1VJTERfTUVNQkVSU19DSFVOSycpIHtcbiAgICAgICAgICAgICAgICBvbGRIYW5kbGVyPy4oc2hhcmQsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU2h1dHRpbmcgZG93biBvbGQgc2hhcmRzLmApO1xuICAgICAgICBhd2FpdCBnYXRld2F5LnNodXRkb3duKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQsICdSZXNoYXJkZWQhJywgZmFsc2UpO1xuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBDb21wbGV0ZWQuYCk7XG4gICAgICAgIGdhdGV3YXkuc2hhcmRzID0gbmV3IE1hcChnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzKTtcbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy5jbGVhcigpO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgY2FsY3VsYXRlVG90YWxTaGFyZHMoKSB7XG4gICAgICAvLyBCb3RzIHVuZGVyIDEwMGsgc2VydmVycyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gTEJTLlxuICAgICAgaWYgKGdhdGV3YXkudG90YWxTaGFyZHMgPCAxMDApIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBDYWxjdWxhdGluZyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKTtcbiAgICAgICAgcmV0dXJuIGdhdGV3YXkudG90YWxTaGFyZHM7XG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KTtcbiAgICAgIC8vIENhbGN1bGF0ZSBhIG11bHRpcGxlIG9mIGBtYXhDb25jdXJyZW5jeWAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZ2F0ZXdheS5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICBnYXRld2F5LnRvdGFsU2hhcmRzIC9cbiAgICAgICAgICAgIC8vIElmIGBtYXhDb25jdXJyZW5jeWAgaXMgMSwgd2UgY2FuIHNhZmVseSB1c2UgMTYgdG8gZ2V0IGB0b3RhbFNoYXJkc2AgdG8gYmUgaW4gYSBtdWx0aXBsZSBvZiAxNiBzbyB0aGF0IHdlIGNhbiBwcmVwYXJlIGJvdHMgd2l0aCAxMDBrIHNlcnZlcnMgZm9yIExCUy5cbiAgICAgICAgICAgIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSksXG4gICAgICAgICkgKiAoZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5ID09PSAxID8gMTYgOiBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG4gICAgICApO1xuICAgIH0sXG4gICAgY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZCkge1xuICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LnNwcmVhZFNoYXJkc0luUm91bmRSb2JpblxuICAgICAgICA/IHNoYXJkSWQgJSBnYXRld2F5LnRvdGFsV29ya2Vyc1xuICAgICAgICA6IE1hdGgubWluKE1hdGguZmxvb3Ioc2hhcmRJZCAvIGdhdGV3YXkuc2hhcmRzUGVyV29ya2VyKSwgZ2F0ZXdheS50b3RhbFdvcmtlcnMgLSAxKTtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdvcmtlcklkO1xuICAgIH0sXG4gICAgcHJlcGFyZUJ1Y2tldHMoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeTsgKytpKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUHJlcGFyaW5nIGJ1Y2tldHMgZm9yIGNvbmN1cnJlbmN5OiAke2l9YCk7XG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGxlYWt5QnVja2V0OiBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiAxLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IGdhdGV3YXkuc3Bhd25TaGFyZERlbGF5LFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9yZ2FuaXplIGFsbCBzaGFyZHMgaW50byB0aGVpciBvd24gYnVja2V0c1xuICAgICAgZm9yIChsZXQgc2hhcmRJZCA9IGdhdGV3YXkuZmlyc3RTaGFyZElkOyBzaGFyZElkIDw9IGdhdGV3YXkubGFzdFNoYXJkSWQ7ICsrc2hhcmRJZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBzaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIGlmIChzaGFyZElkID49IGdhdGV3YXkudG90YWxTaGFyZHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSkgaXMgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB1c2VkIGFtb3VudCBvZiB1c2VkIHNoYXJkcyB3aGljaCBpcyAke2dhdGV3YXkudG90YWxTaGFyZHN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRJZCA9IHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoYnVja2V0SWQpO1xuXG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNoYXJkIChpZDogJHtzaGFyZElkfSkgZ290IGFzc2lnbmVkIHRvIGFuIGlsbGVnYWwgYnVja2V0IGlkOiAke2J1Y2tldElkfSwgZXhwZWN0ZWQgYSBidWNrZXQgaWQgYmV0d2VlbiAwIGFuZCAke1xuICAgICAgICAgICAgICBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgLSAxXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSB3b3JrZXIgaWQgZm9yIHRoaXMgc2hhcmRcbiAgICAgICAgY29uc3Qgd29ya2VySWQgPSBnYXRld2F5LmNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpO1xuICAgICAgICBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LmlkID09PSB3b3JrZXJJZCk7XG5cbiAgICAgICAgLy8gSWYgdGhpcyB3b3JrZXIgYWxyZWFkeSBleGlzdHMsIGFkZCB0aGUgc2hhcmQgdG8gaXRzIHF1ZXVlXG4gICAgICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgICB3b3JrZXIucXVldWUucHVzaChzaGFyZElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud29ya2Vycy5wdXNoKHsgaWQ6IHdvcmtlcklkLCBxdWV1ZTogW3NoYXJkSWRdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzcGF3blNoYXJkcygpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIGNvbmN1cnJlbmN5IGJ1Y2tldHNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKTtcblxuICAgICAgY29uc3QgcHJvbWlzZXMgPSBbLi4uZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKV0ubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNoYXJkSWQgb2Ygd29ya2VyLnF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCBnYXRld2F5LnRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlci5pZCwgc2hhcmRJZCwgYnVja2V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdlIHVzZSBQcm9taXNlLmFsbCBzbyB3ZSBjYW4gc3RhcnQgYWxsIGJ1Y2tldHMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4gICAgICAvLyBDaGVjayBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5IGlmIGF1dG8gcmVzaGFyZGluZyBpcyBlbmFibGVkLlxuICAgICAgaWYgKGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkICYmIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsICE9PSAtMSkge1xuICAgICAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gZW5zdXJlIHRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZVxuICAgICAgICBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpO1xuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci53YXJuKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgd2FzIG5vdCBwcm92aWRlZC4gRGlzYWJsaW5nIHJlc2hhcmRpbmcuXCIpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNoYXJkaW5nSW5mbyA9IGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkKCk7XG5cbiAgICAgICAgICBpZiAocmVzaGFyZGluZ0luZm8ubmVlZGVkICYmIHJlc2hhcmRpbmdJbmZvLmluZm8pIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5yZXNoYXJkKHJlc2hhcmRpbmdJbmZvLmluZm8pO1xuICAgICAgICB9LCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzaHV0ZG93bihjb2RlLCByZWFzb24sIGNsZWFyUmVzaGFyZGluZ0ludGVydmFsID0gdHJ1ZSkge1xuICAgICAgaWYgKGNsZWFyUmVzaGFyZGluZ0ludGVydmFsKSBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKS5tYXAoKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKSk7XG4gICAgfSxcbiAgICBhc3luYyBzZW5kUGF5bG9hZChzaGFyZElkLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IGdhdGV3YXkuc2hhcmRzLmdldChzaGFyZElkKTtcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuc2VuZChwYXlsb2FkKTtcbiAgICB9LFxuICAgIGFzeW5jIHRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlcklkLCBzaGFyZElkLCBidWNrZXRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBUZWxsIHdvcmtlciAjJHt3b3JrZXJJZH0gdG8gaWRlbnRpZnkgc2hhcmQgIyR7c2hhcmRJZH0gZnJvbSBidWNrZXQgJHtidWNrZXRJZH1gKTtcbiAgICAgIGF3YWl0IGdhdGV3YXkuaWRlbnRpZnkoc2hhcmRJZCk7XG4gICAgfSxcbiAgICBhc3luYyBpZGVudGlmeShzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGxldCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKTtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYCk7XG5cbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgc2hhcmQgPSBuZXcgU2hhcmQoe1xuICAgICAgICAgIGlkOiBzaGFyZElkLFxuICAgICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmNvbXByZXNzLFxuICAgICAgICAgICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IGdhdGV3YXkudHJhbnNwb3J0Q29tcHJlc3Npb24sXG4gICAgICAgICAgICBpbnRlbnRzOiB0aGlzLmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogdGhpcy50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiB0aGlzLnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogZ2F0ZXdheS5ldmVudHMgPz8ge30sXG4gICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RJZGVudGlmeShzaGFyZElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHJlcXVlc3RlZCBhbiBpZGVudGlmeS5gKTtcblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KTtcblxuICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmVxdWVzdCBpZGVudGlmeSBmb3IgYSBzaGFyZCB0aGF0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgYnVja2V0LlwiKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYnVja2V0LmxlYWt5QnVja2V0LmFjcXVpcmUoKTtcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBBcHByb3ZlZCBpZGVudGlmeSByZXF1ZXN0IGZvciBTaGFyZCAjJHtzaGFyZElkfS5gKTtcbiAgICB9LFxuXG4gICAgYXN5bmMga2lsbChzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gdGhpcy5zaGFyZHMuZ2V0KHNoYXJkSWQpO1xuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHdhcyByZXF1ZXN0ZWQgdG8gYmUga2lsbGVkLCBidXQgdGhlIHNoYXJkIGNvdWxkIG5vdCBiZSBmb3VuZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEtpbGxpbmcgU2hhcmQgIyR7c2hhcmRJZH1gKTtcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKTtcbiAgICAgIGF3YWl0IHNoYXJkLnNodXRkb3duKCk7XG4gICAgfSxcblxuICAgIC8vIEhlbHBlcnMgbWV0aG9kcyBiZWxvdyB0aGlzXG5cbiAgICBjYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQsIHRvdGFsU2hhcmRzKSB7XG4gICAgICAvLyBJZiBub25lIGlzIHByb3ZpZGVkLCB1c2UgdGhlIHRvdGFsIHNoYXJkcyBudW1iZXIgZnJvbSBnYXRld2F5IG9iamVjdC5cbiAgICAgIGlmICghdG90YWxTaGFyZHMpIHRvdGFsU2hhcmRzID0gZ2F0ZXdheS50b3RhbFNoYXJkcztcbiAgICAgIC8vIElmIGl0IGlzIG9ubHkgMSBzaGFyZCwgaXQgd2lsbCBhbHdheXMgYmUgc2hhcmQgaWQgMFxuICAgICAgaWYgKHRvdGFsU2hhcmRzID09PSAxKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoMSBzaGFyZClgKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoZ3VpbGRJZDogJHtndWlsZElkfSwgdG90YWxTaGFyZHM6ICR7dG90YWxTaGFyZHN9KWApO1xuICAgICAgcmV0dXJuIE51bWJlcigoQmlnSW50KGd1aWxkSWQpID4+IDIybikgJSBCaWdJbnQodG90YWxTaGFyZHMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblZvaWNlQ2hhbm5lbChndWlsZElkLCBjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCk7XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gam9pblZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IGNoYW5uZWxJZDogJHtjaGFubmVsSWR9YCk7XG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogY2hhbm5lbElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgc2VsZl9tdXRlOiBvcHRpb25zPy5zZWxmTXV0ZSA/PyBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IG9wdGlvbnM/LnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFN0YXR1cyhkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRCb3RTdGF0dXMgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uU2FmZVJlcGxhY2VyKX1gKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5nYXRld2F5LnNoYXJkcy52YWx1ZXMoKV0ubWFwKGFzeW5jIChzaGFyZCkgPT4ge1xuICAgICAgICAgIGdhdGV3YXkuZWRpdFNoYXJkU3RhdHVzKHNoYXJkLmlkLCBkYXRhKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2hhcmRTdGF0dXMoc2hhcmRJZCwgZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0U2hhcmRTdGF0dXMgc2hhcmRJZDogJHtzaGFyZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlByZXNlbmNlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgc2luY2U6IG51bGwsXG4gICAgICAgICAgYWZrOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpdml0aWVzOiBkYXRhLmFjdGl2aXRpZXMsXG4gICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpO1xuXG4gICAgICBpZiAoKCFvcHRpb25zPy5saW1pdCB8fCBvcHRpb25zLmxpbWl0ID4gMSkgJiYgKGdhdGV3YXkuaW50ZW50cyAmIEdhdGV3YXlJbnRlbnRzLkd1aWxkTWVtYmVycykgPT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIG1vcmUgdGhlbiAxIG1lbWJlciB3aXRob3V0IHRoZSBHVUlMRF9NRU1CRVJTIGludGVudCcpO1xuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnVzZXJJZHM/Lmxlbmd0aCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gc2V0dGluZyB1c2VyIGxpbWl0IGJhc2VkIG9uIHVzZXJJZHMgbGVuZ3RoOiAke29wdGlvbnMudXNlcklkcy5sZW5ndGh9YCk7XG5cbiAgICAgICAgb3B0aW9ucy5saW1pdCA9IG9wdGlvbnMudXNlcklkcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgbGV0IG5vbmNlID0gJyc7XG5cbiAgICAgICAgd2hpbGUgKCFub25jZSB8fCBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuaGFzKG5vbmNlKSkge1xuICAgICAgICAgIG5vbmNlID0gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPz89IHsgbGltaXQ6IDAgfTtcbiAgICAgICAgb3B0aW9ucy5ub25jZSA9IG5vbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZW1iZXJzID0gIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICAgICAgICAgICAgaWYgKCFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuc2V0KG9wdGlvbnMubm9uY2UsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIG1lbWJlcnM6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdEd1aWxkTWVtYmVycyxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgLy8gSWYgYSBxdWVyeSBpcyBwcm92aWRlZCB1c2UgaXQsIE9SIGlmIGEgbGltaXQgaXMgTk9UIHByb3ZpZGVkIHVzZSBcIlwiXG4gICAgICAgICAgcXVlcnk6IG9wdGlvbnM/LnF1ZXJ5ID8/IChvcHRpb25zPy5saW1pdCA/IHVuZGVmaW5lZCA6ICcnKSxcbiAgICAgICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gMCxcbiAgICAgICAgICBwcmVzZW5jZXM6IG9wdGlvbnM/LnByZXNlbmNlcyA/PyBmYWxzZSxcbiAgICAgICAgICB1c2VyX2lkczogb3B0aW9ucz8udXNlcklkcz8ubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgICAgbm9uY2U6IG9wdGlvbnM/Lm5vbmNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZW1iZXJzO1xuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0Q2hhbm5lbEluZm8oZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKTtcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0Q2hhbm5lbEluZm8gZ3VpbGRJZDogJHtndWlsZElkfWApO1xuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlcXVlc3RDaGFubmVsSW5mbyxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgZmllbGRzOiBvcHRpb25zLmZpZWxkcyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgRGlzY29yZFJlcXVlc3RDaGFubmVsSW5mbyxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVZvaWNlQ2hhbm5lbChndWlsZElkKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpO1xuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGxlYXZlVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gU2hhcmQgJHtzaGFyZElkfWApO1xuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IG51bGwsXG4gICAgICAgICAgc2VsZl9tdXRlOiBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RTb3VuZGJvYXJkU291bmRzKGd1aWxkSWRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIERpc2NvcmQgd2lsbCBzZW5kIHRoZSBldmVudHMgZm9yIHRoZSBndWlsZHMgdGhhdCBhcmUgXCJ1bmRlciB0aGUgc2hhcmRcIiB0aGF0IHNlbmRzIHRoZSBvcGNvZGUuXG4gICAgICAgKiBGb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBncm91cCB0aGUgaWRzIHdpdGggdGhlIHNoYXJkIHRoZSBjYWxjdWxhdGVTaGFyZElkIG1ldGhvZCBnaXZlc1xuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBCaWdTdHJpbmdbXT4oKTtcblxuICAgICAgZm9yIChjb25zdCBndWlsZElkIG9mIGd1aWxkSWRzKSB7XG4gICAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCk7XG5cbiAgICAgICAgY29uc3QgaWRzID0gbWFwLmdldChzaGFyZElkKSA/PyBbXTtcbiAgICAgICAgbWFwLnNldChzaGFyZElkLCBpZHMpO1xuXG4gICAgICAgIGlkcy5wdXNoKGd1aWxkSWQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLm1hcC5lbnRyaWVzKCldLm1hcCgoW3NoYXJkSWQsIGlkc10pID0+XG4gICAgICAgICAgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMsXG4gICAgICAgICAgICBkOiB7XG4gICAgICAgICAgICAgIGd1aWxkX2lkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZ2F0ZXdheTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogSWQgb2YgdGhlIGZpcnN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGZpcnN0U2hhcmRJZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBsYXN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGxhc3RTaGFyZElkPzogbnVtYmVyO1xuICAvKipcbiAgICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNwYXduaW5nIG5leHQgc2hhcmQuIE9QVElNQUwgSVMgQUJPVkUgNTEwMC4gWU9VIERPTidUIFdBTlQgVE8gSElUIFRIRSBSQVRFIExJTUlUISEhXG4gICAqIEBkZWZhdWx0IDUzMDBcbiAgICovXG4gIHNwYXduU2hhcmREZWxheT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRvdGFsIGFtb3VudCBvZiBzaGFyZHMgeW91ciBib3QgdXNlcy4gVXNlZnVsIGZvciB6ZXJvLWRvd250aW1lIHVwZGF0ZXMgb3IgcmVzaGFyZGluZy5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdG90YWxTaGFyZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHNoYXJkcyB0byBsb2FkIHBlciB3b3JrZXIuXG4gICAqIEBkZWZhdWx0IDI1XG4gICAqL1xuICBzaGFyZHNQZXJXb3JrZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIHdvcmtlcnMgdG8gdXNlIGZvciB5b3VyIGJvdC5cbiAgICogQGRlZmF1bHQgNFxuICAgKi9cbiAgdG90YWxXb3JrZXJzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hldGhlciB0byBzcHJlYWQgc2hhcmRzIGFjcm9zcyB3b3JrZXJzIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBCeSBkZWZhdWx0LCBzaGFyZHMgYXJlIGFzc2lnbmVkIHRvIHdvcmtlcnMgaW4gY29udGlndW91cyBibG9ja3MgYmFzZWQgb24gc2hhcmRzUGVyV29ya2VyLiBJZiBhbnkgc2hhcmQgaXMgbGVmdCBvdmVyLCBpdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBsYXN0IHdvcmtlci5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzIHdoaWxlIHNoYXJkc1BlcldvcmtlciBpcyAxMCwgdGhlIGZpcnN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMC05LCB0aGUgc2Vjb25kIHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMTAtMTksIGFuZCBzbyBvbiwgdGhlIGxhc3Qgd29ya2VyIHdpbGwgZ2V0IHNoYXJkcyAyMC0zOS5cbiAgICpcbiAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoZSBzaGFyZHMgd2lsbCBiZSBhc3NpZ25lZCBpbiBhIHJvdW5kLXJvYmluIG1hbm5lciB0byBzcHJlYWQgbW9yZSBldmVubHkgYWNyb3NzIHdvcmtlcnMuXG4gICAqIEZvciBleGFtcGxlLCB3aXRoIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzLCB0aGUgZmlyc3Qgc2hhcmQgd2lsbCBnbyB0byB3b3JrZXIgMCwgdGhlIHNlY29uZCBzaGFyZCB0byB3b3JrZXIgMSwgdGhlIHRoaXJkIHNoYXJkIHRvIHdvcmtlciAyLCB0aGUgZm91cnRoIHNoYXJkIHRvIHdvcmtlciAwLCBhbmQgc28gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4/OiBib29sZWFuO1xuICAvKiogSW1wb3J0YW50IGRhdGEgd2hpY2ggaXMgdXNlZCBieSB0aGUgbWFuYWdlciB0byBjb25uZWN0IHNoYXJkcyB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGlvbj86IENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90PjtcbiAgLyoqIFdoZXRoZXIgaW5jb21pbmcgcGF5bG9hZHMgYXJlIGNvbXByZXNzZWQgdXNpbmcgemxpYi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGNvbXByZXNzPzogYm9vbGVhbjtcbiAgLyoqIFdoYXQgdHJhbnNwb3J0IGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkICovXG4gIHRyYW5zcG9ydENvbXByZXNzaW9uPzogVHJhbnNwb3J0Q29tcHJlc3Npb24gfCBudWxsO1xuICAvKiogVGhlIGNhbGN1bGF0ZWQgaW50ZW50IHZhbHVlIG9mIHRoZSBldmVudHMgd2hpY2ggdGhlIHNoYXJkIHNob3VsZCByZWNlaXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBpbnRlbnRzPzogbnVtYmVyO1xuICAvKiogSWRlbnRpZnkgcHJvcGVydGllcyB0byB1c2UgKi9cbiAgcHJvcGVydGllcz86IHtcbiAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSB0aGUgc2hhcmQgcnVucyBvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZGFyd2luXCIgfCBcImxpbnV4XCIgfCBcIndpbmRvd3NcIlxuICAgICAqL1xuICAgIG9zOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBcImJyb3dzZXJcIiB3aGVyZSB0aGlzIHNoYXJkIGlzIHJ1bm5pbmcgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGJyb3dzZXI6IHN0cmluZztcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmc7XG4gIH07XG4gIC8qKiBCb3QgdG9rZW4gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQgKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xuICAvKiogVGhlIGdhdGV3YXkgdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHZlcnNpb24/OiBudW1iZXI7XG4gIC8qKiBUaGUgZXZlbnRzIGhhbmRsZXJzICovXG4gIGV2ZW50cz86IFNoYXJkRXZlbnRzO1xuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZT86IHtcbiAgICByZXF1ZXN0TWVtYmVycz86IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciBvciBub3QgcmVxdWVzdCBtZW1iZXIgcmVxdWVzdHMgc2hvdWxkIGJlIGNhY2hlZC5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGdhdGV3YXkgbWFuYWdlciB3aWxsIHVzZS5cbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKipcbiAgICogTWFrZSB0aGUgcHJlc2VuY2UgZm9yIHdoZW4gdGhlIGJvdCBjb25uZWN0cyB0byB0aGUgZ2F0ZXdheVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSBhIFNoYXJkIGlzIGdvaW5nIHRvIGlkZW50aWZ5XG4gICAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPERpc2NvcmRVcGRhdGVQcmVzZW5jZSB8IHVuZGVmaW5lZD47XG4gIC8qKiBPcHRpb25zIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZz86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBhdXRvbWF0ZWQgcmVzaGFyZGluZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgJSBvZiBob3cgZnVsbCBhIHNoYXJkIGlzIHdoZW4gcmVzaGFyZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBXZSB1c2UgZGlzY29yZCByZWNvbW1lbmRlZCBzaGFyZCB2YWx1ZSB0byBnZXQgYW4gKiphcHByb3hpbWF0aW9uKiogb2YgdGhlIHNoYXJkIGZ1bGwgcGVyY2VudGFnZSB0byBjb21wYXJlIHdpdGggdGhpcyB2YWx1ZSBzbyB0aGUgYm90IG1heSBub3QgcmVzaGFyZCBhdCB0aGUgZXhhY3QgcGVyY2VudGFnZSBwcm92aWRlZCBidXQgbWF5IHJlc2hhcmQgd2hlbiBpdCBpcyBhIGJpdCBoaWdoZXIgdGhhbiB0aGUgcHJvdmlkZWQgcGVyY2VudGFnZS5cbiAgICAgKiBGb3IgYWNjdXJhdGUgY2FsY3VsYXRpb24sIHlvdSBtYXkgb3ZlcnJpZGUgdGhlIGBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkYCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODAgYXMgaW4gODAlXG4gICAgICovXG4gICAgc2hhcmRzRnVsbFBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLCBvZiBob3cgb2Z0ZW4gdG8gY2hlY2sgd2hldGhlciByZXNoYXJkaW5nIGlzIG5lZWRlZCBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5LiBTZXQgdG8gLTEgdG8gZGlzYWJsZSBhdXRvIHJlc2hhcmRpbmcuXG4gICAgICogQGRlZmF1bHQgMjg4MDAwMDAgKDggaG91cnMpXG4gICAgICovXG4gICAgY2hlY2tJbnRlcnZhbDogbnVtYmVyO1xuICAgIC8qKiBIYW5kbGVyIHRvIGdldCBzaGFyZCBjb3VudCBhbmQgb3RoZXIgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIGdldFNlc3Npb25JbmZvPzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4+O1xuICAgIC8qKiBIYW5kbGVyIHRvIGVkaXQgdGhlIHNoYXJkIGlkIG9uIGFueSBjYWNoZWQgZ3VpbGRzLiAqL1xuICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ/OiAoZ3VpbGRJZHM6IHN0cmluZ1tdLCBzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+O1xuICAgICAgLyoqIFRoZSBidWNrZXQgdG8gcXVldWUgdGhlIGlkZW50aWZpZXMuICovXG4gICAgICBsZWFreUJ1Y2tldDogTGVha3lCdWNrZXQ7XG4gICAgfVxuICA+O1xuICAvKiogVGhlIHNoYXJkcyB0aGF0IGFyZSBjcmVhdGVkLiAqL1xuICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPjtcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+O1xuICAvKiogRXZlcnl0aGluZyByZWxhdGVkIHRvIHJlc2hhcmRpbmcuICovXG4gIHJlc2hhcmRpbmc6IENyZWF0ZUdhdGV3YXlNYW5hZ2VyT3B0aW9uc1sncmVzaGFyZGluZyddICYge1xuICAgIC8qKiBUaGUgaW50ZXJ2YWwgaWQgb2YgdGhlIGNoZWNrIGludGVydmFsLiBUaGlzIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVydmFsIHdoZW4gdGhlIG1hbmFnZXIgaXMgc2h1dGRvd24uICovXG4gICAgY2hlY2tJbnRlcnZhbElkPzogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPjtcbiAgICAvKiogSGFuZGxlciB0byBjaGVjayBpZiByZXNoYXJkaW5nIGlzIG5lY2Vzc2FyeS4gKi9cbiAgICBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkOiAoKSA9PiBQcm9taXNlPHsgbmVlZGVkOiBib29sZWFuOyBpbmZvPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+IH0+O1xuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgdG8gYmVnaW4gcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgb25jZSB0aGUgcmVzaGFyZGluZyBpcyBkb25lLlxuICAgICAqIFNvIHdoZW4gYWxsIHRoZSBjYWxscyB0byB7QGxpbmsgdGVsbFdvcmtlclRvUHJlcGFyZX0gYW5kIHtAbGluayBvblJlc2hhcmRpbmdTd2l0Y2h9IGFyZSBkb25lLlxuICAgICAqL1xuICAgIHJlc2hhcmQ6IChpbmZvOiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gJiB7IGZpcnN0U2hhcmRJZD86IG51bWJlcjsgbGFzdFNoYXJkSWQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgaXQgbmVlZHMgdG8gc3Bhd24gYSBuZXcgc2hhcmQgYW5kIGlkZW50aWZ5IGl0IGZvciB0aGUgcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoYW5kbGVyIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUge0BsaW5rIHRlbGxXb3JrZXJUb0lkZW50aWZ5fSBoYW5kbGVyLlxuICAgICAqIFNvIHlvdSBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICB0ZWxsV29ya2VyVG9QcmVwYXJlOiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEhhbmRsZSBjYWxsZWQgd2hlbiBhbGwgdGhlIHdvcmtlcnMgaGF2ZSBmaW5pc2hlZCBwcmVwYXJpbmcgZm9yIHRoZSByZXNoYXJkaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBzaG91bGQgbWFrZSB0aGUgbmV3IHJlc2hhcmRlZCBzaGFyZHMgYmVjb21lIHRoZSBhY3RpdmUgb25lcyBhbmQgc2h1dGRvd24gdGhlIG9sZCBvbmVzXG4gICAgICovXG4gICAgb25SZXNoYXJkaW5nU3dpdGNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9O1xuICAvKiogRGV0ZXJtaW5lIG1heCBudW1iZXIgb2Ygc2hhcmRzIHRvIHVzZSBiYXNlZCB1cG9uIHRoZSBtYXggY29uY3VycmVuY3kuICovXG4gIGNhbGN1bGF0ZVRvdGFsU2hhcmRzOiAoKSA9PiBudW1iZXI7XG4gIC8qKiBEZXRlcm1pbmUgdGhlIGlkIG9mIHRoZSB3b3JrZXIgd2hpY2ggaXMgaGFuZGxpbmcgYSBzaGFyZC4gKi9cbiAgY2FsY3VsYXRlV29ya2VySWQ6IChzaGFyZElkOiBudW1iZXIpID0+IG51bWJlcjtcbiAgLyoqIFByZXBhcmVzIGFsbCB0aGUgYnVja2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGlkZW50aWZ5aW5nIHRoZSBzaGFyZHMuICovXG4gIHByZXBhcmVCdWNrZXRzOiAoKSA9PiB2b2lkO1xuICAvKiogU3RhcnQgaWRlbnRpZnlpbmcgYWxsIHRoZSBzaGFyZHMuICovXG4gIHNwYXduU2hhcmRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU2h1dGRvd24gYWxsIHNoYXJkcy4gKi9cbiAgc2h1dGRvd246IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nLCBjbGVhclJlc2hhcmRpbmdJbnRlcnZhbD86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gaG9vayBpbiBhbmQgY2hhbmdlIHRvIGNvbW11bmljYXRlIHRvIGRpZmZlcmVudCB3b3JrZXJzIGFjcm9zcyBkaWZmZXJlbnQgc2VydmVycyBvciBhbnl0aGluZyB0aGV5IGxpa2UuXG4gICAqIEZvciBleGFtcGxlIHVzaW5nIHJlZGlzIHB1YnN1YiB0byB0YWxrIHRvIG90aGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgc2hvdWxkIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gaGF2ZSBpZGVudGlmaWVkIHRoZSBzaGFyZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAqL1xuICB0ZWxsV29ya2VyVG9JZGVudGlmeTogKHdvcmtlcklkOiBudW1iZXIsIHNoYXJkSWQ6IG51bWJlciwgYnVja2V0SWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRlbGwgdGhlIG1hbmFnZXIgdG8gaWRlbnRpZnkgYSBTaGFyZC4gSWYgdGhpcyBTaGFyZCBpcyBub3QgYWxyZWFkeSBtYW5hZ2VkIHRoaXMgd2lsbCBhbHNvIGFkZCB0aGUgU2hhcmQgdG8gdGhlIG1hbmFnZXIuICovXG4gIGlkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogS2lsbCBhIHNoYXJkLiBDbG9zZSBhIHNoYXJkcyBjb25uZWN0aW9uIHRvIERpc2NvcmQncyBnYXRld2F5IChpZiBhbnkpIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbWFuYWdlci4gKi9cbiAga2lsbDogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWNrZXQgaXMgYWxsb3dlZCB0byBtYWtlIHRoZSBuZXh0IGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBzaGFyZHMgYmFzZWQgb24gdGhlIGd1aWxkIGlkIGFuZCB0b3RhbCBzaGFyZHMuICovXG4gIGNhbGN1bGF0ZVNoYXJkSWQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRvdGFsU2hhcmRzPzogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25uZWN0cyB0aGUgYm90IHVzZXIgdG8gYSB2b2ljZSBvciBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBfVXBkYXRlIFZvaWNlIFN0YXRlXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSB2b2ljZSBjaGFubmVsIHRvIGxlYXZlIGlzIGluLlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHlvdSB3YW50IHRvIGpvaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgQ09OTkVDVGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheS1ldmVudHMjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgam9pblZvaWNlQ2hhbm5lbDogKFxuICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICBjaGFubmVsSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zPzogQXRMZWFzdE9uZTxPbWl0PFVwZGF0ZVZvaWNlU3RhdGUsICdndWlsZElkJyB8ICdjaGFubmVsSWQnPj4sXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBib3Qgc3RhdHVzIGluIGFsbCBzaGFyZHMgdGhhdCB0aGlzIGdhdGV3YXkgbWFuYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIHN0YXR1cyBkYXRhIHRvIHNldCB0aGUgYm90cyBzdGF0dXMgdG8uXG4gICAqIEByZXR1cm5zIG5vdGhpbmdcbiAgICovXG4gIGVkaXRCb3RTdGF0dXM6IChkYXRhOiBEaXNjb3JkVXBkYXRlUHJlc2VuY2UpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90J3Mgc3RhdHVzIG9uIG9uZSBzaGFyZC5cbiAgICpcbiAgICogQHBhcmFtIHNoYXJkSWQgVGhlIHNoYXJkIGlkIHRvIGVkaXQgdGhlIHN0YXR1cyBmb3IuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0U2hhcmRTdGF0dXM6IChzaGFyZElkOiBudW1iZXIsIGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZCBvdmVyIHRoZSBnYXRld2F5LiBJZiBgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkYCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGFuZCB5b3UnbGwgaGF2ZSB0byBoYW5kbGUgdGhlIGBHVUlMRF9NRU1CRVJTX0NIVU5LYCBldmVudHMgeW91cnNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgcmVxdWVzdGluZyB0aGUgZW50aXJlIG1lbWJlciBsaXN0OlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIHByZXNlbmNlcyAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMucHJlc2VuY2VzIHwgcHJlc2VuY2VzfSBzZXQgdG8gYHRydWVgKTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYEdVSUxEX1BSRVNFTkNFU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgcHJlZml4ICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5xdWVyeSB8IHF1ZXJ5fSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgdXNlcnMgYnkgSUQgKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnVzZXJJZHMgfCB1c2VySWRzfSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXJzIENodW5rXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSAxMDAwIG1lbWJlcnMgZmV0Y2hlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXktZXZlbnRzI3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICovXG4gIHJlcXVlc3RNZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogT21pdDxSZXF1ZXN0R3VpbGRNZW1iZXJzLCAnZ3VpbGRJZCc+KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPj47XG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBlcGhlbWVyYWwgY2hhbm5lbCBkYXRhIGZvciBjaGFubmVscyBpbiBhIGd1aWxkXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGVwaGVtZXJhbCBjaGFubmVsIGRhdGEgZm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGVwaGVtZXJhbCBjaGFubmVsIGRhdGEuXG4gICAqIEByZXR1cm5zIC0gVGhpcyBtZXRob2QgcmV0dXJucyBub3RoaW5nLiBUaGUgc2VydmVyIHdpbGwgc2VuZCBhIENIQU5ORUxfSU5GTyBldmVudFxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuZGlzY29yZC5jb20vZGV2ZWxvcGVycy9ldmVudHMvZ2F0ZXdheS1ldmVudHMjcmVxdWVzdC1jaGFubmVsLWluZm99XG4gICAqL1xuICByZXF1ZXN0Q2hhbm5lbEluZm86IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE9taXQ8UmVxdWVzdENoYW5uZWxJbmZvLCAnZ3VpbGRJZCc+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogTGVhdmVzIHRoZSB2b2ljZSBjaGFubmVsIHRoZSBib3QgdXNlciBpcyBjdXJyZW50bHkgaW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIF9VcGRhdGUgVm9pY2UgU3RhdGVfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIHZvaWNlIGNoYW5uZWwgdG8gbGVhdmUgaXMgaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX1ZvaWNlIFN0YXRlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXktZXZlbnRzI3VwZGF0ZS12b2ljZS1zdGF0ZX1cbiAgICovXG4gIGxlYXZlVm9pY2VDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVXNlZCB0byByZXF1ZXN0IHNvdW5kYm9hcmQgc291bmRzIGZvciBhIGxpc3Qgb2YgZ3VpbGRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIG11bHRpcGxlIChzZWUgcmVtYXJrcykgX1JlcXVlc3QgU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZHMgLSBUaGUgZ3VpbGRzIHRvIGdldCB0aGUgc291bmRzIGZyb21cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIOKaoO+4jyBEaXNjb3JkIHdpbGwgc2VuZCB0aGUgX1NvdW5kYm9hcmQgU291bmRzXyBmb3IgZWFjaCBvZiB0aGUgZ3VpbGQgaWRzXG4gICAqIGhvd2V2ZXIgeW91IG1heSBub3QgcmVjZWl2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZXZlbnRzIGFzIHRoZSBpZHMgcGFzc2VkIHRvIF9SZXF1ZXN0IFNvdW5kYm9hcmQgU291bmRzXyBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcbiAgICogLSBUaGUgYm90IGlzIG5vdCBpbiB0aGUgc2VydmVyIHByb3ZpZGVkXG4gICAqIC0gVGhlIHNoYXJkIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHNlbnQgZnJvbSBkb2VzIG5vdCByZWNlaXZlIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBndWlsZFxuICAgKlxuICAgKiBUbyBhdm9pZCB0aGlzIERpc2NvcmRlbm8gd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBncm91cCB0aGUgaWRzIGJhc2VkIG9uIHdoYXQgc2hhcmQgdGhleSB3aWxsIG5lZWQgdG8gYmUgc2VudCwgYnV0IHRoaXMgaW52b2x2ZXMgc2VuZGluZyBtdWx0aXBsZSBtZXNzYWdlcyBpbiBtdWx0aXBsZSBzaGFyZHNcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRpc2NvcmQuY29tL2RldmVsb3BlcnMvZXZlbnRzL2dhdGV3YXktZXZlbnRzI3JlcXVlc3Qtc291bmRib2FyZC1zb3VuZHN9XG4gICAqL1xuICByZXF1ZXN0U291bmRib2FyZFNvdW5kczogKGd1aWxkSWRzOiBCaWdTdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFRoaXMgbWFuYWdlcnMgY2FjaGUgcmVsYXRlZCBzZXR0aW5ncy4gKi9cbiAgY2FjaGU6IHtcbiAgICByZXF1ZXN0TWVtYmVyczoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIG9yIG5vdCByZXF1ZXN0IG1lbWJlciByZXF1ZXN0cyBzaG91bGQgYmUgY2FjaGVkLlxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAgIC8qKiBUaGUgcGVuZGluZyByZXF1ZXN0cy4gKi9cbiAgICAgIHBlbmRpbmc6IENvbGxlY3Rpb248c3RyaW5nLCBSZXF1ZXN0TWVtYmVyUmVxdWVzdD47XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0TWVtYmVyUmVxdWVzdCB7XG4gIC8qKiBUaGUgdW5pcXVlIG5vbmNlIGZvciB0aGlzIHJlcXVlc3QuICovXG4gIG5vbmNlOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVzb2x2ZXIgaGFuZGxlciB0byBydW4gd2hlbiBhbGwgbWVtYmVycyBhcnJpdmUuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogQ2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+IHwgUHJvbWlzZUxpa2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PikgPT4gdm9pZDtcbiAgLyoqIFRoZSBtZW1iZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGFycml2ZWQgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbWVtYmVyczogRGlzY29yZE1lbWJlcldpdGhVc2VyW107XG59XG4iXSwibmFtZXMiOlsicmFuZG9tQnl0ZXMiLCJHYXRld2F5SW50ZW50cyIsIkdhdGV3YXlPcGNvZGVzIiwiQ29sbGVjdGlvbiIsImpzb25TYWZlUmVwbGFjZXIiLCJMZWFreUJ1Y2tldCIsImxvZ2dlciIsIlNoYXJkIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIiwiY3JlYXRlR2F0ZXdheU1hbmFnZXIiLCJvcHRpb25zIiwiY29ubmVjdGlvbk9wdGlvbnMiLCJjb25uZWN0aW9uIiwidXJsIiwic2hhcmRzIiwic2Vzc2lvblN0YXJ0TGltaXQiLCJtYXhDb25jdXJyZW5jeSIsInJlbWFpbmluZyIsInRvdGFsIiwicmVzZXRBZnRlciIsImdhdGV3YXkiLCJldmVudHMiLCJjb21wcmVzcyIsInRyYW5zcG9ydENvbXByZXNzaW9uIiwiaW50ZW50cyIsInByb3BlcnRpZXMiLCJvcyIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImJyb3dzZXIiLCJkZXZpY2UiLCJ0b2tlbiIsInZlcnNpb24iLCJ0b3RhbFNoYXJkcyIsImxhc3RTaGFyZElkIiwiZmlyc3RTaGFyZElkIiwidG90YWxXb3JrZXJzIiwic2hhcmRzUGVyV29ya2VyIiwic3Bhd25TaGFyZERlbGF5Iiwic3ByZWFkU2hhcmRzSW5Sb3VuZFJvYmluIiwiTWFwIiwiYnVja2V0cyIsImNhY2hlIiwicmVxdWVzdE1lbWJlcnMiLCJlbmFibGVkIiwicGVuZGluZyIsIm1ha2VQcmVzZW5jZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5kZWZpbmVkIiwicmVzaGFyZGluZyIsInNoYXJkc0Z1bGxQZXJjZW50YWdlIiwiY2hlY2tJbnRlcnZhbCIsImdldFNlc3Npb25JbmZvIiwidXBkYXRlR3VpbGRzU2hhcmRJZCIsImNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQiLCJkZWJ1ZyIsIm5lZWRlZCIsIkVycm9yIiwic2Vzc2lvbkluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiaW5mbyIsInBlcmNlbnRhZ2UiLCJyZXNoYXJkIiwiY2FsY3VsYXRlVG90YWxTaGFyZHMiLCJjbGVhciIsInByZXBhcmVCdWNrZXRzIiwicHJvbWlzZXMiLCJBcnJheSIsImZyb20iLCJlbnRyaWVzIiwibWFwIiwiYnVja2V0SWQiLCJidWNrZXQiLCJ3b3JrZXIiLCJ3b3JrZXJzIiwic2hhcmRJZCIsInF1ZXVlIiwidGVsbFdvcmtlclRvUHJlcGFyZSIsImlkIiwiYWxsIiwib25SZXNoYXJkaW5nU3dpdGNoIiwid29ya2VySWQiLCJzaGFyZCIsIm1lc3NhZ2UiLCJfc2hhcmQiLCJwYXlsb2FkIiwidCIsImQiLCJndWlsZHMiLCJnIiwicmVxdWVzdElkZW50aWZ5Iiwic2V0IiwiaWRlbnRpZnkiLCJ2YWx1ZXMiLCJvbGRIYW5kbGVyIiwiXyIsInNodXRkb3duIiwiUmVzaGFyZGVkIiwiTWF0aCIsImNlaWwiLCJjYWxjdWxhdGVXb3JrZXJJZCIsIm1pbiIsImZsb29yIiwiaSIsImxlYWt5QnVja2V0IiwibWF4IiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnZXQiLCJmaW5kIiwidyIsInB1c2giLCJzcGF3blNoYXJkcyIsInRlbGxXb3JrZXJUb0lkZW50aWZ5IiwiY2xlYXJJbnRlcnZhbCIsImNoZWNrSW50ZXJ2YWxJZCIsIndhcm4iLCJzZXRJbnRlcnZhbCIsInJlc2hhcmRpbmdJbmZvIiwiY29kZSIsInJlYXNvbiIsImNsZWFyUmVzaGFyZGluZ0ludGVydmFsIiwiY2xvc2UiLCJzZW5kUGF5bG9hZCIsInNlbmQiLCJhY3F1aXJlIiwia2lsbCIsImRlbGV0ZSIsImNhbGN1bGF0ZVNoYXJkSWQiLCJndWlsZElkIiwiTnVtYmVyIiwiQmlnSW50Iiwiam9pblZvaWNlQ2hhbm5lbCIsImNoYW5uZWxJZCIsIm9wIiwiVm9pY2VTdGF0ZVVwZGF0ZSIsImd1aWxkX2lkIiwidG9TdHJpbmciLCJjaGFubmVsX2lkIiwic2VsZl9tdXRlIiwic2VsZk11dGUiLCJzZWxmX2RlYWYiLCJzZWxmRGVhZiIsImVkaXRCb3RTdGF0dXMiLCJkYXRhIiwiZWRpdFNoYXJkU3RhdHVzIiwiUHJlc2VuY2VVcGRhdGUiLCJzaW5jZSIsImFmayIsImFjdGl2aXRpZXMiLCJzdGF0dXMiLCJsaW1pdCIsIkd1aWxkTWVtYmVycyIsInVzZXJJZHMiLCJsZW5ndGgiLCJub25jZSIsImhhcyIsIm1lbWJlcnMiLCJyZWplY3QiLCJSZXF1ZXN0R3VpbGRNZW1iZXJzIiwicXVlcnkiLCJwcmVzZW5jZXMiLCJ1c2VyX2lkcyIsInJlcXVlc3RDaGFubmVsSW5mbyIsIlJlcXVlc3RDaGFubmVsSW5mbyIsImZpZWxkcyIsImxlYXZlVm9pY2VDaGFubmVsIiwicmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZElkcyIsImlkcyIsIlJlcXVlc3RTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRfaWRzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXLFFBQVEsY0FBYztBQUMxQyxTQVNFQyxjQUFjLEVBQ2RDLGNBQWMsUUFHVCxvQkFBb0I7QUFDM0IsU0FBU0MsVUFBVSxFQUFFQyxnQkFBZ0IsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLFFBQVEsb0JBQW9CO0FBQ3RGLE9BQU9DLFdBQVcsYUFBYTtBQUMvQixTQUEyQkMscUJBQXFCLFFBQW1GLGFBQWE7QUFFaEosT0FBTyxTQUFTQyxxQkFBcUJDLE9BQW9DO0lBQ3ZFLE1BQU1DLG9CQUFvQkQsUUFBUUUsVUFBVSxJQUFJO1FBQzlDQyxLQUFLO1FBQ0xDLFFBQVE7UUFDUkMsbUJBQW1CO1lBQ2pCQyxnQkFBZ0I7WUFDaEJDLFdBQVc7WUFDWEMsT0FBTztZQUNQQyxZQUFZLE9BQU8sS0FBSyxLQUFLO1FBQy9CO0lBQ0Y7SUFFQSxNQUFNQyxVQUEwQjtRQUM5QkMsUUFBUVgsUUFBUVcsTUFBTSxJQUFJLENBQUM7UUFDM0JDLFVBQVVaLFFBQVFZLFFBQVEsSUFBSTtRQUM5QkMsc0JBQXNCYixRQUFRYSxvQkFBb0IsSUFBSTtRQUN0REMsU0FBU2QsUUFBUWMsT0FBTyxJQUFJO1FBQzVCQyxZQUFZO1lBQ1ZDLElBQUloQixRQUFRZSxVQUFVLEVBQUVDLE1BQU1DLFFBQVFDLFFBQVE7WUFDOUNDLFNBQVNuQixRQUFRZSxVQUFVLEVBQUVJLFdBQVc7WUFDeENDLFFBQVFwQixRQUFRZSxVQUFVLEVBQUVLLFVBQVU7UUFDeEM7UUFDQUMsT0FBT3JC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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@discordeno/gateway",
|
|
3
|
-
"version": "22.0.1-next.
|
|
3
|
+
"version": "22.0.1-next.fdb61e1",
|
|
4
4
|
"exports": "./dist/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -25,25 +25,25 @@
|
|
|
25
25
|
"test:type": "tsc --noEmit"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@discordeno/types": "22.0.1-next.
|
|
29
|
-
"@discordeno/utils": "22.0.1-next.
|
|
28
|
+
"@discordeno/types": "22.0.1-next.fdb61e1",
|
|
29
|
+
"@discordeno/utils": "22.0.1-next.fdb61e1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@biomejs/biome": "2.5.
|
|
32
|
+
"@biomejs/biome": "2.5.15",
|
|
33
33
|
"@swc/cli": "^0.8.1",
|
|
34
|
-
"@swc/core": "^1.
|
|
34
|
+
"@swc/core": "^1.16.18",
|
|
35
35
|
"@types/chai": "^5.2.3",
|
|
36
36
|
"@types/mocha": "^10.0.10",
|
|
37
|
-
"@types/node": "^26.
|
|
38
|
-
"@types/sinon": "^
|
|
39
|
-
"@types/ws": "^8.18.
|
|
37
|
+
"@types/node": "^26.6.5",
|
|
38
|
+
"@types/sinon": "^22.0.0",
|
|
39
|
+
"@types/ws": "^8.18.2",
|
|
40
40
|
"c8": "^12.0.0",
|
|
41
|
-
"chai": "^6.
|
|
42
|
-
"mocha": "^
|
|
43
|
-
"sinon": "^22.
|
|
41
|
+
"chai": "^6.3.0",
|
|
42
|
+
"mocha": "^12.0.3",
|
|
43
|
+
"sinon": "^22.1.0",
|
|
44
44
|
"tsconfig": "*",
|
|
45
|
-
"tsx": "^4.23.
|
|
45
|
+
"tsx": "^4.23.15",
|
|
46
46
|
"typescript": "^6.0.3",
|
|
47
|
-
"ws": "^8.
|
|
47
|
+
"ws": "^8.22.0"
|
|
48
48
|
}
|
|
49
49
|
}
|