oxygen-cli 1.32.0 → 1.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,8 @@ require("source-map-support/register");
9
9
 
10
10
  var _got = _interopRequireDefault(require("got"));
11
11
 
12
+ var _formData = _interopRequireDefault(require("form-data"));
13
+
12
14
  var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
13
15
 
14
16
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
@@ -54,6 +56,7 @@ const DEFAULT_HTTP_OPTIONS = {
54
56
  dnsLookupIpVersion: 'ipv4'
55
57
  };
56
58
  const CONTENT_TYPE_HEADER = 'content-type';
59
+ const HTTP_METHODS = ['get', 'post', 'patch'];
57
60
 
58
61
  class HttpModule extends _OxygenModule.default {
59
62
  constructor(options, context, rs, logger, modules, services) {
@@ -75,6 +78,16 @@ class HttpModule extends _OxygenModule.default {
75
78
  get name() {
76
79
  return MODULE_NAME;
77
80
  }
81
+ /*
82
+ * @summary Returns a new FormData object
83
+ * @function newFormData
84
+ * @return {FormData} new FormData object.
85
+ */
86
+
87
+
88
+ newFormData() {
89
+ return new _formData.default();
90
+ }
78
91
  /**
79
92
  * @summary Sets user defined HTTP options (such as proxy, decompress and etc.)
80
93
  * @function setOptions
@@ -167,12 +180,13 @@ class HttpModule extends _OxygenModule.default {
167
180
  * @param {String} url - URL.
168
181
  * @param {Object} data - Data.
169
182
  * @param {Object=} headers - HTTP headers.
183
+ * @param {Boolean=} isFormData - Indicates if "data" parameter is of URL-encoded form type.
170
184
  * @return {Object} Response object.
171
185
  */
172
186
 
173
187
 
174
- async post(url, data, headers) {
175
- const resolvedData = this._resolveData(data);
188
+ async post(url, data, headers, isFormData = false) {
189
+ const resolvedData = this._resolveData(data, headers, isFormData);
176
190
 
177
191
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
178
192
  ...(this._userHttpOptions || {}),
@@ -420,10 +434,117 @@ class HttpModule extends _OxygenModule.default {
420
434
  global._lastTransactionName = name;
421
435
  }
422
436
 
423
- _resolveData(data) {
437
+ getStepDisplayName(methodName, methodArgs, retval, error) {
438
+ if (!HTTP_METHODS.includes(methodName)) {
439
+ return undefined;
440
+ }
441
+
442
+ if (!this._extra || !this._extra.http || !this._extra.http.request) {
443
+ return undefined;
444
+ }
445
+
446
+ return `${methodName.toUpperCase()} ${this._extra.http.request.path}`;
447
+ }
448
+
449
+ _addRequestExtra(request, updatedOptions) {
450
+ const url = new URL(request.url);
451
+ const reqExtra = {
452
+ url: request.url,
453
+ path: `${url.pathname}${url.search}${url.hash}`,
454
+ queryParams: this._getQueryParams(url.searchParams),
455
+ method: request.method,
456
+ headers: updatedOptions.headers,
457
+ contentType: this._getContentType(updatedOptions.headers),
458
+ contentLength: this._getContentLength(updatedOptions.headers)
459
+ };
460
+
461
+ if (request.form) {
462
+ reqExtra.formData = request.form;
463
+ } else if (request.json) {
464
+ reqExtra.contentType = 'application/json';
465
+
466
+ if (request.json instanceof Object) {
467
+ reqExtra.content = JSON.stringify(request.json);
468
+ } else {
469
+ reqExtra.content = request.json;
470
+ }
471
+ } else if (request.body) {
472
+ reqExtra.content = request.body;
473
+ }
474
+
475
+ if (!this._extra.http) {
476
+ this._extra.http = {};
477
+ }
478
+
479
+ this._extra.http.request = reqExtra;
480
+ }
481
+
482
+ _getContentType(headers = {}) {
483
+ const contentType = headers['content-type'];
484
+
485
+ if (!contentType) {
486
+ return undefined;
487
+ }
488
+
489
+ const match = contentType.match(/^(.+?)(;|$)/);
490
+
491
+ if (!match || match.length < 2) {
492
+ return undefined;
493
+ }
494
+
495
+ return match[1];
496
+ }
497
+
498
+ _getContentLength(headers = {}) {
499
+ if (!headers['content-length']) {
500
+ return undefined;
501
+ }
502
+
503
+ const lengthAsStr = headers['content-length'];
504
+ return parseInt(lengthAsStr);
505
+ }
506
+
507
+ _getQueryParams(searchParams) {
508
+ return Array.from(searchParams.keys()).reduce((record, key) => {
509
+ const values = searchParams.getAll(key);
510
+ return { ...record,
511
+ [key]: values.length > 1 ? values.join(',') : values[0]
512
+ };
513
+ }, {});
514
+ }
515
+
516
+ _addResponseExtra(response) {
517
+ const resExtra = {
518
+ url: response.redirectUrls && response.redirectUrls.length && response.redirectUrls[0],
519
+ statusText: response.statusMessage,
520
+ statusCode: response.statusCode,
521
+ contentType: this._getContentType(response.headers),
522
+ contentLength: this._getContentLength(response.headers),
523
+ headers: response.headers,
524
+ version: response.httpVersion,
525
+ content: response.body
526
+ };
527
+
528
+ if (!this._extra.http) {
529
+ this._extra.http = {};
530
+ }
531
+
532
+ this._extra.http.response = resExtra;
533
+
534
+ if (response.timings && response.timings.phases) {
535
+ this._extra.http.timings = { ...response.timings.phases
536
+ };
537
+ }
538
+ }
539
+
540
+ _resolveData(data, headers, isFormData = false) {
424
541
  const dataResolver = {};
425
542
 
426
- if (data instanceof Object) {
543
+ if (isFormData) {
544
+ dataResolver.form = data;
545
+ } else if (data instanceof _formData.default) {
546
+ dataResolver.body = data;
547
+ } else if (data instanceof Object) {
427
548
  _utils.default.assertCircular(data);
428
549
 
429
550
  dataResolver.json = data;
@@ -435,10 +556,21 @@ class HttpModule extends _OxygenModule.default {
435
556
  }
436
557
 
437
558
  async _httpRequestSync(httpOpts) {
559
+ if (this._extra.http) {
560
+ delete this._extra.http;
561
+ } //this._addRequestExtra(httpOpts);
562
+
563
+
438
564
  let result;
439
565
 
440
566
  try {
441
- result = await (0, _got.default)(httpOpts);
567
+ result = await (0, _got.default)({ ...httpOpts,
568
+ hooks: {
569
+ beforeRequest: [options => {
570
+ this._addRequestExtra(httpOpts, options);
571
+ }]
572
+ }
573
+ });
442
574
 
443
575
  if (httpOpts.deflateRaw && result.headers['content-encoding'] === 'deflate') {
444
576
  const zlib = require('zlib');
@@ -513,7 +645,9 @@ class HttpModule extends _OxygenModule.default {
513
645
  retryCount: result.retryCount,
514
646
  body: result.body
515
647
  };
516
- } // store last response to allow further assertions and validations
648
+ }
649
+
650
+ this._addResponseExtra(result); // store last response to allow further assertions and validations
517
651
 
518
652
 
519
653
  this._lastResponse = result;
@@ -523,4 +657,4 @@ class HttpModule extends _OxygenModule.default {
523
657
  }
524
658
 
525
659
  exports.default = HttpModule;
526
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiQ09OVEVOVF9UWVBFX0hFQURFUiIsIkh0dHBNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfbGFzdFJlc3BvbnNlIiwiX2Jhc2VVcmwiLCJfdXNlckh0dHBPcHRpb25zIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwic2V0T3B0aW9ucyIsIm9wdHMiLCJkZWZsYXRlUmF3Iiwic2V0UHJveHkiLCJ1cmwiLCJib290c3RyYXAiLCJyZXF1aXJlIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsInJlc29sdmVkRGF0YSIsIl9yZXNvbHZlRGF0YSIsInB1dCIsInBhdGNoIiwiZGVsZXRlIiwiZ2V0UmVzcG9uc2UiLCJnZXRSZXNwb25zZUJvZHkiLCJib2R5IiwiZ2V0UmVzcG9uc2VIZWFkZXJzIiwiZ2V0UmVzcG9uc2VVcmwiLCJhc3NlcnRUZXh0IiwicGF0dGVybiIsIkFTU0VSVF9FUlJPUiIsInJlc3BDb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1vZFV0aWxzIiwibWF0Y2hQYXR0ZXJuIiwiYXNzZXJ0UmVzcG9uc2VUaW1lIiwibWF4VGltZSIsIkVycm9yIiwiYXNzZXJ0SGVhZGVyIiwiaGVhZGVyTmFtZSIsImhlYWRlclZhbHVlUGF0dGVybiIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiYWN0dWFsSGVhZGVyVmFsdWUiLCJhc3NlcnRDb29raWUiLCJjb29raWVOYW1lIiwiY29va2llVmFsdWVQYXR0ZXJuIiwiYXNzZXJ0U3RhdHVzIiwiY29kZUxpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJzdGF0dXNDb2RlIiwiaW5jbHVkZXMiLCJhc3NlcnRTdGF0dXNPayIsInRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImRhdGFSZXNvbHZlciIsIk9iamVjdCIsImFzc2VydENpcmN1bGFyIiwianNvbiIsInJlc3VsdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJzdGF0dXNNZXNzYWdlIiwicmF3Qm9keSIsImh0dHBWZXJzaW9uIiwidXBncmFkZSIsInRpbWluZ3MiLCJyZXF1ZXN0VXJsIiwicmVkaXJlY3RVcmxzIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQSxNQUFNQSxXQUFXLEdBQUcsTUFBcEI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxPQUFPLEVBQWhDLEMsQ0FBc0M7O0FBQ3RD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QUFHO0FBQ0xjLFFBQUFBLFdBQVcsRUFBRWQsTUFBTSxDQUFDYyxXQURmO0FBRUxoRSxRQUFBQSxPQUFPLEVBQUVrRCxNQUFNLENBQUNsRCxPQUZYO0FBR0xpRSxRQUFBQSxPQUFPLEVBQUVmLE1BQU0sQ0FBQ2UsT0FIWDtBQUlMakYsUUFBQUEsR0FBRyxFQUFFa0UsTUFBTSxDQUFDbEUsR0FKUDtBQUtMa0IsUUFBQUEsTUFBTSxFQUFFZ0QsTUFBTSxDQUFDaEQsTUFMVjtBQU1Mc0MsUUFBQUEsVUFBVSxFQUFFVSxNQUFNLENBQUNWLFVBTmQ7QUFPTHNCLFFBQUFBLGFBQWEsRUFBRVosTUFBTSxDQUFDWSxhQVBqQjtBQVFMSSxRQUFBQSxPQUFPLEVBQUVoQixNQUFNLENBQUNnQixPQVJYO0FBU0xDLFFBQUFBLFVBQVUsRUFBRWpCLE1BQU0sQ0FBQ2lCLFVBVGQ7QUFVTEMsUUFBQUEsWUFBWSxFQUFFbEIsTUFBTSxDQUFDa0IsWUFWaEI7QUFXTEMsUUFBQUEsV0FBVyxFQUFFbkIsTUFBTSxDQUFDbUIsV0FYZjtBQVlMQyxRQUFBQSxFQUFFLEVBQUVwQixNQUFNLENBQUNvQixFQVpOO0FBYUxDLFFBQUFBLFVBQVUsRUFBRXJCLE1BQU0sQ0FBQ3FCLFVBYmQ7QUFjTDFELFFBQUFBLElBQUksRUFBRXFDLE1BQU0sQ0FBQ3JDO0FBZFIsT0FBVDtBQWdCSCxLQTlFNEIsQ0FnRjdCOzs7QUFDQSxTQUFLdEMsYUFBTCxHQUFxQjJFLE1BQXJCO0FBRUEsV0FBT0EsTUFBUDtBQUNIOztBQTVhZ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBodHRwXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSFRUUChTKVxyXG4gKi9cclxuaW1wb3J0IGdvdCBmcm9tICdnb3QnO1xyXG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnaHR0cCc7XHJcbmNvbnN0IFJFU1BPTlNFX1RJTUVPVVQgPSAxMDAwICogNjA7ICAgLy8gaW4gbXNcclxuY29uc3QgREFGQVVMVF9IVFRQMiA9IGZhbHNlO1xyXG5jb25zdCBERUZBVUxUX0hUVFBfT1BUSU9OUyA9IHtcclxuICAgIGRlY29tcHJlc3M6IHRydWUsXHJcbiAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgIHRpbWVvdXQ6IHtcclxuICAgICAgICBsb29rdXA6IDEwMDAsXHJcbiAgICAgICAgY29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNlY3VyZUNvbm5lY3Q6IDUwMCxcclxuICAgICAgICBzb2NrZXQ6IDEwMDAwMCxcclxuICAgICAgICBzZW5kOiAxMDAwMDAsXHJcbiAgICAgICAgcmVzcG9uc2U6IFJFU1BPTlNFX1RJTUVPVVRcclxuICAgIH0sXHJcbiAgICBodHRwMjogREFGQVVMVF9IVFRQMixcclxuICAgIGh0dHBzOiB7XHJcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGRuc0xvb2t1cElwVmVyc2lvbjogJ2lwdjQnXHJcbn07XHJcbmNvbnN0IENPTlRFTlRfVFlQRV9IRUFERVIgPSAnY29udGVudC10eXBlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGRlZmluZWQgSFRUUCBvcHRpb25zIChzdWNoIGFzIHByb3h5LCBkZWNvbXByZXNzIGFuZCBldGMuKVxyXG4gICAgICogQGZ1bmN0aW9uIHNldE9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QvYmxvYi9tYWluL2RvY3VtZW50YXRpb24vMi1vcHRpb25zLm1kKS4gXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIGlmIChvcHRzLmRlZmxhdGVSYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zLmRlY29tcHJlc3MgPSBmYWxzZTsgICAgIC8vIGRlY29tcHJlc3M9dHJ1ZSBpbiBkZWZhdWx0IG9wdGlvbnMgc28gd2Ugb3ZlcnJpZGUgaXRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHByb3h5IHVybCB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLlxyXG4gICAgICogQGZ1bmN0aW9uIHNldFByb3h5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUHJveHkgc2VydmVyIFVSTC4gTm90IHBhc3NpbmcgdGhpcyBhcmd1bWVudCB3aWxsIHJlc2V0IHRoZSBwcm94eSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgc2V0UHJveHkodXJsKSB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgICAgICBib290c3RyYXBcclxuICAgICAgICAgICAgfSA9IHJlcXVpcmUoJ2dsb2JhbC1hZ2VudCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gcmVxdWlyZSgndXJsJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IHBhcnNlKHVybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnSG9zdG5hbWUgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucG9ydCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUG9ydCBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5wcm90b2NvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUHJvdG9jb2wgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xyXG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSB1cmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBHRVRcclxuICAgICAqIEBmdW5jdGlvbiBnZXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogLy8gQmFzaWMgdXNhZ2UgZXhhbXBsZTpcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KFxyXG4gICAgICogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3h5Z2VuaHEvb3h5Z2VuLWlkZS9yZWxlYXNlcycsIFxyXG4gICAgICoge1xyXG4gICAgICogICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxyXG4gICAgICogICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo4Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzg2LjAnXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICpcclxuICAgICAqIC8vIElmIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLCBgZGVmbGF0ZVJhd2AgY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyB0aGUgY29udGVudC5cclxuICAgICAqIGh0dHAuc2V0T3B0aW9ucyh7XHJcbiAgICAgKiAgIGRlZmxhdGVSYXc6IHRydWVcclxuICAgICAqIH0pO1xyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoJ2h0dHBzOi8vRk9PLkJBUicpO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldCh1cmwsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQT1NUXHJcbiAgICAgKiBAZnVuY3Rpb24gcG9zdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwb3N0KHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQVVRcclxuICAgICAqIEBmdW5jdGlvbiBwdXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcHV0KHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBBVENIXHJcbiAgICAgKiBAZnVuY3Rpb24gcGF0Y2hcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcGF0Y2godXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBERUxFVEVcclxuICAgICAqIEBmdW5jdGlvbiBkZWxldGVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGVsZXRlKHVybCwgaGVhZGVycywgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2UgYm9keVxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlQm9keVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBib2R5LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUJvZHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZSAmJiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgaGVhZGVyc1xyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlSGVhZGVyc1xyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUhlYWRlcnMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgVVJMXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VVcmxcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgVVJMLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS51cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRUZXh0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiAtIFBhdHRlcm4gdG8gYXNzZXJ0LlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRUZXh0KHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdSZXNwb25zZSBib2R5IGlzIGVtcHR5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3BDb250ZW50ID0gdHlwZW9mIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID09PSAnc3RyaW5nJyA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogSlNPTi5zdHJpbmdpZnkodGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKHJlc3BDb250ZW50LCBwYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgcmVzcG9uc2UgY29udGVudCB0byBtYXRjaDogXCIke3BhdHRlcm59XCIgYnV0IGdvdDogXCIke3Jlc3BDb250ZW50fVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHJlc3BvbnNlIHRpbWVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZVRpbWVcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lIC0gTWF4aW11bSByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0UmVzcG9uc2VUaW1lKG1heFRpbWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgaGVhZGVyIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRIZWFkZXJcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJOYW1lIC0gQSBIVFRQIGhlYWRlciBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBoZWFkZXJWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGhlYWRlciB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVQYXR0ZXJuID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghaGVhZGVyTmFtZSB8fCB0eXBlb2YgaGVhZGVyTmFtZSAhPT0gJ3N0cmluZycgfHwgaGVhZGVyTmFtZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgICAgIGlmICghaGVhZGVyc1toZWFkZXJOYW1lXSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ0V4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHRvIGJlIHByZXNlbnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVhZGVyVmFsdWVQYXR0ZXJuICYmIHR5cGVvZiBoZWFkZXJWYWx1ZVBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbEhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4oYWN0dWFsSGVhZGVyVmFsdWUsIGhlYWRlclZhbHVlUGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdmFsdWUgdG8gbWF0Y2g6IFwiJHtoZWFkZXJWYWx1ZVBhdHRlcm59XCIgYnV0IGdvdDogXCIke2FjdHVhbEhlYWRlclZhbHVlfVwiYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBjb29raWUgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydENvb2tpZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvb2tpZU5hbWUgLSBBIEhUVFAgY29va2llIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNvb2tpZVZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgY29va2llIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydENvb2tpZShjb29raWVOYW1lLCBjb29raWVWYWx1ZVBhdHRlcm4pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHRoZSBsYXN0IEhUVFAgcmVzcG9uc2UncyBzdGF0dXMgY29kZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c1xyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IGNvZGVMaXN0IC0gQSBzaW5nbGUgc3RhdHVzIGNvZGUgb3IgYSBsaXN0IG9mIGNvZGVzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXMoY29kZUxpc3QpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSB8fCAhY29kZUxpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB3ZSBnb3QgYSBzaW5nbGUgdmFsdWUsIHRoZW4gY29udmVydCBpdCB0byBhbiBhcnJheVxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2RlTGlzdCkpIHtcclxuICAgICAgICAgICAgY29kZUxpc3QgPSBbY29kZUxpc3RdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gdGhpcy5fbGFzdFJlc3BvbnNlLnN0YXR1c0NvZGU7XHJcbiAgICAgICAgaWYgKCFjb2RlTGlzdC5pbmNsdWRlcyhzdGF0dXNDb2RlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgc3RhdHVzIHRvIGJlOiBcIiR7Y29kZUxpc3R9XCIgYnV0IGdvdDogXCIke3N0YXR1c0NvZGV9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgSFRUUCAyMDAgT0sgc3RhdHVzXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzT2tcclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0U3RhdHVzKDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdICYmIHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGJvZHkgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZS5ib2R5XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5oZWFkZXJzIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNDb2RlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNNZXNzYWdlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJhd0JvZHk6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5yYXdCb2R5IDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBodHRwVmVyc2lvbjogcmVzdWx0Lmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICB1cGdyYWRlOiByZXN1bHQudXBncmFkZSxcclxuICAgICAgICAgICAgICAgIHVybDogcmVzdWx0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogcmVzdWx0Lm1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnN0YXR1c01lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICB0aW1pbmdzOiByZXN1bHQudGltaW5ncyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RVcmw6IHJlc3VsdC5yZXF1ZXN0VXJsLFxyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVcmxzOiByZXN1bHQucmVkaXJlY3RVcmxzLFxyXG4gICAgICAgICAgICAgICAgaXNGcm9tQ2FjaGU6IHJlc3VsdC5pc0Zyb21DYWNoZSxcclxuICAgICAgICAgICAgICAgIGlwOiByZXN1bHQuaXAsXHJcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50OiByZXN1bHQucmV0cnlDb3VudCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHJlc3VsdC5ib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzdG9yZSBsYXN0IHJlc3BvbnNlIHRvIGFsbG93IGZ1cnRoZXIgYXNzZXJ0aW9ucyBhbmQgdmFsaWRhdGlvbnNcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn0iXX0=
660
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiQ09OVEVOVF9UWVBFX0hFQURFUiIsIkhUVFBfTUVUSE9EUyIsIkh0dHBNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfbGFzdFJlc3BvbnNlIiwiX2Jhc2VVcmwiLCJfdXNlckh0dHBPcHRpb25zIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicmVxdWlyZSIsInBhcnNlIiwicGFyc2VkVXJsIiwiaG9zdG5hbWUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiSFRUUF9FUlJPUiIsInBvcnQiLCJwcm90b2NvbCIsImdsb2JhbCIsIkdMT0JBTF9BR0VOVCIsIkhUVFBfUFJPWFkiLCJnZXQiLCJoZWFkZXJzIiwiaHR0cE9wdHMiLCJtZXRob2QiLCJfaHR0cFJlcXVlc3RTeW5jIiwicG9zdCIsImRhdGEiLCJpc0Zvcm1EYXRhIiwicmVzb2x2ZWREYXRhIiwiX3Jlc29sdmVEYXRhIiwicHV0IiwicGF0Y2giLCJkZWxldGUiLCJnZXRSZXNwb25zZSIsImdldFJlc3BvbnNlQm9keSIsImJvZHkiLCJnZXRSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZVVybCIsImFzc2VydFRleHQiLCJwYXR0ZXJuIiwiQVNTRVJUX0VSUk9SIiwicmVzcENvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kVXRpbHMiLCJtYXRjaFBhdHRlcm4iLCJhc3NlcnRSZXNwb25zZVRpbWUiLCJtYXhUaW1lIiwiRXJyb3IiLCJhc3NlcnRIZWFkZXIiLCJoZWFkZXJOYW1lIiwiaGVhZGVyVmFsdWVQYXR0ZXJuIiwibGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhY3R1YWxIZWFkZXJWYWx1ZSIsImFzc2VydENvb2tpZSIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZVBhdHRlcm4iLCJhc3NlcnRTdGF0dXMiLCJjb2RlTGlzdCIsIkFycmF5IiwiaXNBcnJheSIsInN0YXR1c0NvZGUiLCJpbmNsdWRlcyIsImFzc2VydFN0YXR1c09rIiwidHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiZ2V0U3RlcERpc3BsYXlOYW1lIiwibWV0aG9kTmFtZSIsIm1ldGhvZEFyZ3MiLCJyZXR2YWwiLCJlcnJvciIsInVuZGVmaW5lZCIsIl9leHRyYSIsImh0dHAiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJyZXN1bHQiLCJob29rcyIsImJlZm9yZVJlcXVlc3QiLCJ6bGliIiwiZGVjb21wIiwiY3JlYXRlSW5mbGF0ZVJhdyIsIndyaXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImUiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFRQSxNQUFNQSxXQUFXLEdBQUcsTUFBcEI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxPQUFPLEVBQWhDLEMsQ0FBc0M7O0FBQ3RDLE1BQU1DLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHO0FBQ3pCQyxFQUFBQSxVQUFVLEVBQUUsSUFEYTtBQUV6QkMsRUFBQUEsWUFBWSxFQUFFLE1BRlc7QUFHekJDLEVBQUFBLE9BQU8sRUFBRTtBQUNMQyxJQUFBQSxNQUFNLEVBQUUsSUFESDtBQUVMQyxJQUFBQSxPQUFPLEVBQUUsR0FGSjtBQUdMQyxJQUFBQSxhQUFhLEVBQUUsR0FIVjtBQUlMQyxJQUFBQSxNQUFNLEVBQUUsTUFKSDtBQUtMQyxJQUFBQSxJQUFJLEVBQUUsTUFMRDtBQU1MQyxJQUFBQSxRQUFRLEVBQUVYO0FBTkwsR0FIZ0I7QUFXekJZLEVBQUFBLEtBQUss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QyxHQUE0QyxJQUxoRDtBQU1MbkcsUUFBQUEsSUFBSSxFQUFFQTtBQU5ELE9BQVQ7QUFRSCxLQXhCRCxNQXdCTztBQUNIcUYsTUFBQUEsTUFBTSxHQUFHO0FBQ0xMLFFBQUFBLFdBQVcsRUFBRUssTUFBTSxDQUFDTCxXQURmO0FBRUw5RixRQUFBQSxPQUFPLEVBQUVtRyxNQUFNLENBQUNuRyxPQUZYO0FBR0xrSCxRQUFBQSxPQUFPLEVBQUVmLE1BQU0sQ0FBQ2UsT0FIWDtBQUlMbEksUUFBQUEsR0FBRyxFQUFFbUgsTUFBTSxDQUFDbkgsR0FKUDtBQUtMa0IsUUFBQUEsTUFBTSxFQUFFaUcsTUFBTSxDQUFDakcsTUFMVjtBQU1MdUMsUUFBQUEsVUFBVSxFQUFFMEQsTUFBTSxDQUFDMUQsVUFOZDtBQU9MbUQsUUFBQUEsYUFBYSxFQUFFTyxNQUFNLENBQUNQLGFBUGpCO0FBUUxHLFFBQUFBLE9BQU8sRUFBRUksTUFBTSxDQUFDSixPQVJYO0FBU0xvQixRQUFBQSxVQUFVLEVBQUVoQixNQUFNLENBQUNnQixVQVRkO0FBVUx6QixRQUFBQSxZQUFZLEVBQUVTLE1BQU0sQ0FBQ1QsWUFWaEI7QUFXTDBCLFFBQUFBLFdBQVcsRUFBRWpCLE1BQU0sQ0FBQ2lCLFdBWGY7QUFZTEMsUUFBQUEsRUFBRSxFQUFFbEIsTUFBTSxDQUFDa0IsRUFaTjtBQWFMQyxRQUFBQSxVQUFVLEVBQUVuQixNQUFNLENBQUNtQixVQWJkO0FBY0x4RyxRQUFBQSxJQUFJLEVBQUVxRixNQUFNLENBQUNyRjtBQWRSLE9BQVQ7QUFnQkg7O0FBQ0QsU0FBSzBFLGlCQUFMLENBQXVCVyxNQUF2QixFQXZGNkIsQ0F3RjdCOzs7QUFDQSxTQUFLOUgsYUFBTCxHQUFxQjhILE1BQXJCO0FBRUEsV0FBT0EsTUFBUDtBQUNIOztBQTloQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbmV3IEZvcm1EYXRhIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIG5ld0Zvcm1EYXRhXHJcbiAgICAgKiBAcmV0dXJuIHtGb3JtRGF0YX0gbmV3IEZvcm1EYXRhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbmV3Rm9ybURhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGRlZmluZWQgSFRUUCBvcHRpb25zIChzdWNoIGFzIHByb3h5LCBkZWNvbXByZXNzIGFuZCBldGMuKVxyXG4gICAgICogQGZ1bmN0aW9uIHNldE9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QvYmxvYi9tYWluL2RvY3VtZW50YXRpb24vMi1vcHRpb25zLm1kKS4gXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIGlmIChvcHRzLmRlZmxhdGVSYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zLmRlY29tcHJlc3MgPSBmYWxzZTsgICAgIC8vIGRlY29tcHJlc3M9dHJ1ZSBpbiBkZWZhdWx0IG9wdGlvbnMgc28gd2Ugb3ZlcnJpZGUgaXRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHByb3h5IHVybCB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLlxyXG4gICAgICogQGZ1bmN0aW9uIHNldFByb3h5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUHJveHkgc2VydmVyIFVSTC4gTm90IHBhc3NpbmcgdGhpcyBhcmd1bWVudCB3aWxsIHJlc2V0IHRoZSBwcm94eSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgc2V0UHJveHkodXJsKSB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgICAgICBib290c3RyYXBcclxuICAgICAgICAgICAgfSA9IHJlcXVpcmUoJ2dsb2JhbC1hZ2VudCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gcmVxdWlyZSgndXJsJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IHBhcnNlKHVybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnSG9zdG5hbWUgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucG9ydCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUG9ydCBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5wcm90b2NvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUHJvdG9jb2wgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xyXG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSB1cmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBHRVRcclxuICAgICAqIEBmdW5jdGlvbiBnZXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogLy8gQmFzaWMgdXNhZ2UgZXhhbXBsZTpcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KFxyXG4gICAgICogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3h5Z2VuaHEvb3h5Z2VuLWlkZS9yZWxlYXNlcycsIFxyXG4gICAgICoge1xyXG4gICAgICogICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxyXG4gICAgICogICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo4Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzg2LjAnXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICpcclxuICAgICAqIC8vIElmIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLCBgZGVmbGF0ZVJhd2AgY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyB0aGUgY29udGVudC5cclxuICAgICAqIGh0dHAuc2V0T3B0aW9ucyh7XHJcbiAgICAgKiAgIGRlZmxhdGVSYXc6IHRydWVcclxuICAgICAqIH0pO1xyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoJ2h0dHBzOi8vRk9PLkJBUicpO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldCh1cmwsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQT1NUXHJcbiAgICAgKiBAZnVuY3Rpb24gcG9zdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IGlzRm9ybURhdGEgLSBJbmRpY2F0ZXMgaWYgXCJkYXRhXCIgcGFyYW1ldGVyIGlzIG9mIFVSTC1lbmNvZGVkIGZvcm0gdHlwZS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwb3N0KHVybCwgZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RlcERpc3BsYXlOYW1lKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MsIHJldHZhbCwgZXJyb3IpIHtcclxuICAgICAgICBpZiAoIUhUVFBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhIHx8ICF0aGlzLl9leHRyYS5odHRwIHx8ICF0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke21ldGhvZE5hbWUudG9VcHBlckNhc2UoKX0gJHt0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QucGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXF1ZXN0RXh0cmEocmVxdWVzdCwgdXBkYXRlZE9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcclxuICAgICAgICBjb25zdCByZXFFeHRyYSA9IHtcclxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWAsXHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLl9nZXRRdWVyeVBhcmFtcyh1cmwuc2VhcmNoUGFyYW1zKSxcclxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVyczogdXBkYXRlZE9wdGlvbnMuaGVhZGVycyxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuX2dldENvbnRlbnRUeXBlKHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMpLFxyXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9nZXRDb250ZW50TGVuZ3RoKHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZm9ybSkge1xyXG4gICAgICAgICAgICByZXFFeHRyYS5mb3JtRGF0YSA9IHJlcXVlc3QuZm9ybTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5qc29uKSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5qc29uIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXFFeHRyYS5jb250ZW50ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5qc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSByZXF1ZXN0Lmpzb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5ib2R5KSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSByZXF1ZXN0LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgdGhpcy5fZXh0cmEuaHR0cCA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QgPSByZXFFeHRyYTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudFR5cGUoaGVhZGVycyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcclxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudExlbmd0aChoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQXNTdHIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKCBzZWFyY2hQYXJhbXMua2V5cygpICkucmVkdWNlKCAoIHJlY29yZCwga2V5ICkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXNwb25zZUV4dHJhKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxyXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS50aW1pbmdzICYmIHJlc3BvbnNlLnRpbWluZ3MucGhhc2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAudGltaW5ncyA9IHsgLi4ucmVzcG9uc2UudGltaW5ncy5waGFzZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkYXRhUmVzb2x2ZXIgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmZvcm0gPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIG1vZFV0aWxzLmFzc2VydENpcmN1bGFyKGRhdGEpO1xyXG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZXNvbHZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V4dHJhLmh0dHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnb3QoeyAuLi5odHRwT3B0cywgaG9va3M6IHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICBpZiAoaHR0cE9wdHMuZGVmbGF0ZVJhdyAmJiByZXN1bHQuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09PSAnZGVmbGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvbXAgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcclxuICAgICAgICAgICAgICAgIGRlY29tcC53cml0ZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcC5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IGRhdGEudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdICYmIHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuYm9keVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzQ29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59Il19
@@ -19,20 +19,23 @@ require("source-map-support/register");
19
19
  /**
20
20
  * @summary Wait for Angular based app will be loaded
21
21
  * @function setAutoWaitForAngular
22
- * @param {Boolean} autoWaitForAngular - new autoWait value. Dafault is false;
23
- * @param {String=} rootSelector - Selector for root element, need only for Angular 1
22
+ * @param {Boolean} autoWaitForAngular - true to enable auto-wait. false to disable.
23
+ * @param {String=} rootSelector - Selector for root element, needed only for AngularJS (v1).
24
+ * In Angular (v2) first available root node will be selected automatically.
25
+ * @param {Boolean=} softWait - If true then do not produce error if stability cannot be attained. Default is false.
24
26
  * @param {Number=} timeout - Timeout in milliseconds. Default is 60 seconds.
25
27
  * @example <caption>[javascript] Usage example</caption>
26
28
  * web.init();
27
29
  * web.open("www.yourwebsite.com");
28
30
  * web.setAutoWaitForAngular(true);
29
31
  */
30
- function setAutoWaitForAngular(autoWaitForAngular = false, rootSelector = '', timeout = 60 * 1000) {
32
+ function setAutoWaitForAngular(autoWaitForAngular, rootSelector = null, softWait = false, timeout = 60 * 1000) {
31
33
  this.helpers.assertArgumentBool(autoWaitForAngular, 'autoWaitForAngular');
34
+ this.helpers.assertArgumentBool(softWait, 'softWait');
32
35
  this.helpers.assertArgumentTimeout(timeout, 'timeout');
33
- this.helpers.assertArgumentString(rootSelector, 'rootSelector');
34
36
  this.autoWaitForAngular = autoWaitForAngular;
37
+ this.autoWaitForAngularSoftWait = softWait;
35
38
  this.autoWaitForAngularRootSelector = rootSelector;
36
39
  this.autoWaitForAngularTimeout = timeout;
37
40
  }
38
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIvY29tbWFuZHMvc2V0QXV0b1dhaXRGb3JBbmd1bGFyLmpzIl0sIm5hbWVzIjpbInNldEF1dG9XYWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhciIsInJvb3RTZWxlY3RvciIsInRpbWVvdXQiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnRCb29sIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0QXJndW1lbnRTdHJpbmciLCJhdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxTQUFTQSxxQkFBVCxDQUErQkMsa0JBQWtCLEdBQUcsS0FBcEQsRUFBMkRDLFlBQVksR0FBRyxFQUExRSxFQUE4RUMsT0FBTyxHQUFHLEtBQUcsSUFBM0YsRUFBaUc7QUFDcEcsT0FBS0MsT0FBTCxDQUFhQyxrQkFBYixDQUFnQ0osa0JBQWhDLEVBQW9ELG9CQUFwRDtBQUNBLE9BQUtHLE9BQUwsQ0FBYUUscUJBQWIsQ0FBbUNILE9BQW5DLEVBQTRDLFNBQTVDO0FBQ0EsT0FBS0MsT0FBTCxDQUFhRyxvQkFBYixDQUFrQ0wsWUFBbEMsRUFBZ0QsY0FBaEQ7QUFFQSxPQUFLRCxrQkFBTCxHQUEwQkEsa0JBQTFCO0FBQ0EsT0FBS08sOEJBQUwsR0FBc0NOLFlBQXRDO0FBQ0EsT0FBS08seUJBQUwsR0FBaUNOLE9BQWpDO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAc3VtbWFyeSBXYWl0IGZvciBBbmd1bGFyIGJhc2VkIGFwcCB3aWxsIGJlIGxvYWRlZFxyXG4gKiBAZnVuY3Rpb24gc2V0QXV0b1dhaXRGb3JBbmd1bGFyXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b1dhaXRGb3JBbmd1bGFyIC0gbmV3IGF1dG9XYWl0IHZhbHVlLiBEYWZhdWx0IGlzIGZhbHNlO1xyXG4gKiBAcGFyYW0ge1N0cmluZz19IHJvb3RTZWxlY3RvciAtIFNlbGVjdG9yIGZvciByb290IGVsZW1lbnQsIG5lZWQgb25seSBmb3IgQW5ndWxhciAxXHJcbiAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gKiB3ZWIuaW5pdCgpO1xyXG4gKiB3ZWIub3BlbihcInd3dy55b3Vyd2Vic2l0ZS5jb21cIik7XHJcbiAqIHdlYi5zZXRBdXRvV2FpdEZvckFuZ3VsYXIodHJ1ZSk7XHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEF1dG9XYWl0Rm9yQW5ndWxhcihhdXRvV2FpdEZvckFuZ3VsYXIgPSBmYWxzZSwgcm9vdFNlbGVjdG9yID0gJycsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sKGF1dG9XYWl0Rm9yQW5ndWxhciwgJ2F1dG9XYWl0Rm9yQW5ndWxhcicpO1xyXG4gICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nKHJvb3RTZWxlY3RvciwgJ3Jvb3RTZWxlY3RvcicpO1xyXG5cclxuICAgIHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyID0gYXV0b1dhaXRGb3JBbmd1bGFyO1xyXG4gICAgdGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IgPSByb290U2VsZWN0b3I7XHJcbiAgICB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQgPSB0aW1lb3V0O1xyXG59Il19
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIvY29tbWFuZHMvc2V0QXV0b1dhaXRGb3JBbmd1bGFyLmpzIl0sIm5hbWVzIjpbInNldEF1dG9XYWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhciIsInJvb3RTZWxlY3RvciIsInNvZnRXYWl0IiwidGltZW91dCIsImhlbHBlcnMiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJhdXRvV2FpdEZvckFuZ3VsYXJTb2Z0V2FpdCIsImF1dG9XYWl0Rm9yQW5ndWxhclJvb3RTZWxlY3RvciIsImF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxTQUFTQSxxQkFBVCxDQUErQkMsa0JBQS9CLEVBQW1EQyxZQUFZLEdBQUcsSUFBbEUsRUFBd0VDLFFBQVEsR0FBRyxLQUFuRixFQUEwRkMsT0FBTyxHQUFHLEtBQUcsSUFBdkcsRUFBNkc7QUFDaEgsT0FBS0MsT0FBTCxDQUFhQyxrQkFBYixDQUFnQ0wsa0JBQWhDLEVBQW9ELG9CQUFwRDtBQUNBLE9BQUtJLE9BQUwsQ0FBYUMsa0JBQWIsQ0FBZ0NILFFBQWhDLEVBQTBDLFVBQTFDO0FBQ0EsT0FBS0UsT0FBTCxDQUFhRSxxQkFBYixDQUFtQ0gsT0FBbkMsRUFBNEMsU0FBNUM7QUFFQSxPQUFLSCxrQkFBTCxHQUEwQkEsa0JBQTFCO0FBQ0EsT0FBS08sMEJBQUwsR0FBa0NMLFFBQWxDO0FBQ0EsT0FBS00sOEJBQUwsR0FBc0NQLFlBQXRDO0FBQ0EsT0FBS1EseUJBQUwsR0FBaUNOLE9BQWpDO0FBQ0giLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAc3VtbWFyeSBXYWl0IGZvciBBbmd1bGFyIGJhc2VkIGFwcCB3aWxsIGJlIGxvYWRlZFxyXG4gKiBAZnVuY3Rpb24gc2V0QXV0b1dhaXRGb3JBbmd1bGFyXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b1dhaXRGb3JBbmd1bGFyIC0gdHJ1ZSB0byBlbmFibGUgYXV0by13YWl0LiBmYWxzZSB0byBkaXNhYmxlLlxyXG4gKiBAcGFyYW0ge1N0cmluZz19IHJvb3RTZWxlY3RvciAtIFNlbGVjdG9yIGZvciByb290IGVsZW1lbnQsIG5lZWRlZCBvbmx5IGZvciBBbmd1bGFySlMgKHYxKS4gXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gQW5ndWxhciAodjIpIGZpcnN0IGF2YWlsYWJsZSByb290IG5vZGUgd2lsbCBiZSBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LlxyXG4gKiBAcGFyYW0ge0Jvb2xlYW49fSBzb2Z0V2FpdCAtIElmIHRydWUgdGhlbiBkbyBub3QgcHJvZHVjZSBlcnJvciBpZiBzdGFiaWxpdHkgY2Fubm90IGJlIGF0dGFpbmVkLiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICogd2ViLmluaXQoKTtcclxuICogd2ViLm9wZW4oXCJ3d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gKiB3ZWIuc2V0QXV0b1dhaXRGb3JBbmd1bGFyKHRydWUpO1xyXG4gKi9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBdXRvV2FpdEZvckFuZ3VsYXIoYXV0b1dhaXRGb3JBbmd1bGFyLCByb290U2VsZWN0b3IgPSBudWxsLCBzb2Z0V2FpdCA9IGZhbHNlLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbChhdXRvV2FpdEZvckFuZ3VsYXIsICdhdXRvV2FpdEZvckFuZ3VsYXInKTtcclxuICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2woc29mdFdhaXQsICdzb2Z0V2FpdCcpO1xyXG4gICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG5cclxuICAgIHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyID0gYXV0b1dhaXRGb3JBbmd1bGFyO1xyXG4gICAgdGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJTb2Z0V2FpdCA9IHNvZnRXYWl0O1xyXG4gICAgdGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IgPSByb290U2VsZWN0b3I7XHJcbiAgICB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQgPSB0aW1lb3V0O1xyXG59Il19
@@ -21,72 +21,69 @@ require("source-map-support/register");
21
21
  * @function waitForAngular
22
22
  * @param {String=} rootSelector - Selector for root element, needed only for AngularJS (v1).
23
23
  * In Angular (v2) first available root node will be selected automatically.
24
+ * @param {Boolean=} softWait - If true then do not produce error if stability cannot be attained. Default is false.
24
25
  * @param {Number=} timeout - Timeout in milliseconds. Default is 60 seconds.
25
26
  * @example <caption>[javascript] Usage example</caption>
26
27
  * web.init();
27
28
  * web.open("www.yourwebsite.com");
28
29
  * web.waitForAngular();
29
30
  */
30
- async function waitForAngular(rootSelector, timeout = 60 * 1000) {
31
+ async function waitForAngular(rootSelector, softWait = false, timeout = 60 * 1000) {
31
32
  this.helpers.assertArgumentTimeout(timeout, 'timeout');
32
33
 
33
34
  try {
34
35
  await this.driver.waitUntil(async () => {
35
- // in AngularJS (v1) window.angular will be defined
36
- // in Angular (v2) window.angular will be undefined
37
- const angular1 = await this.driver.execute(() => {
38
- // eslint-disable-next-line no-undef
39
- return !!window.angular;
40
- });
41
-
42
- if (angular1) {
43
- this.helpers.assertArgumentString(rootSelector, 'rootSelector');
44
- const testable = await this.driver.executeAsync((rootSelector, done) => {
36
+ try {
37
+ // in AngularJS (v1) window.angular will be defined
38
+ // in Angular (v2) window.angular will be undefined
39
+ const angular1 = await this.driver.execute(() => {
45
40
  // eslint-disable-next-line no-undef
46
- const rootElement = window.angular.element(rootSelector); // eslint-disable-next-line no-undef
41
+ return !!window.angular;
42
+ });
47
43
 
48
- const testability = window.angular.getTestability(rootElement);
49
- testability.whenStable(() => {
50
- done(true);
51
- });
52
- }, rootSelector);
53
- return testable;
54
- } else {
55
- const stable = await this.driver.executeAsync(done => {
56
- try {
44
+ if (angular1) {
45
+ this.helpers.assertArgumentString(rootSelector, 'rootSelector');
46
+ const testable = await this.driver.execute(rootSelector => {
47
+ // eslint-disable-next-line no-undef
48
+ const rootElement = window.angular.element(rootSelector); // eslint-disable-next-line no-undef
49
+
50
+ const testability = window.angular.getTestability(rootElement);
51
+ return testability.isStable();
52
+ }, rootSelector);
53
+ return testable;
54
+ } else {
55
+ const stable = await this.driver.execute(() => {
57
56
  // following way of obtaining testability is the same as using: var testability = window.getAllAngularTestabilities()[0];
58
57
  // eslint-disable-next-line no-undef
59
58
  const rootElement = window.getAllAngularRootElements()[0]; // eslint-disable-next-line no-undef
60
59
 
61
- const testability = window.getAngularTestability(rootElement);
62
- testability.whenStable(() => {
63
- done(true);
64
- });
65
- } catch (e) {
66
- done(false);
67
- }
68
- });
69
- const version = await this.driver.execute(() => {
70
- // eslint-disable-next-line no-undef
71
- const el = document.querySelector('[ng-version]');
60
+ const testability = window.getAngularTestability(rootElement); // use isStable instead of whenStable due to this issue:
61
+ // https://stackoverflow.com/questions/54509647/testability-whenstable-returns-testability-isstable-returns-false
72
62
 
73
- if (!el) {
74
- return null;
75
- }
63
+ return testability.isStable();
64
+ });
65
+ const version = await this.driver.execute(() => {
66
+ // eslint-disable-next-line no-undef
67
+ const el = document.querySelector('[ng-version]');
76
68
 
77
- return el.getAttribute('ng-version');
78
- });
69
+ if (!el) {
70
+ return null;
71
+ }
79
72
 
80
- if (version && stable) {
81
- return true;
73
+ return el.getAttribute('ng-version');
74
+ });
75
+ return version && stable;
82
76
  }
77
+ } catch (err) {// if we got here then it's executeAsync timeout.
83
78
  }
84
79
  }, {
85
80
  timeout: timeout,
86
81
  timeoutMsg: `Unable to attain stability within ${timeout}ms (or this is not an Angular application)`
87
82
  });
88
83
  } catch (e) {
89
- throw new this.OxError(this.errHelper.errorCode.TIMEOUT, e.message);
84
+ if (!softWait) {
85
+ throw new this.OxError(this.errHelper.errorCode.TIMEOUT, e.message);
86
+ }
90
87
  }
91
88
  }
92
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIvY29tbWFuZHMvd2FpdEZvckFuZ3VsYXIuanMiXSwibmFtZXMiOlsid2FpdEZvckFuZ3VsYXIiLCJyb290U2VsZWN0b3IiLCJ0aW1lb3V0IiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImRyaXZlciIsIndhaXRVbnRpbCIsImFuZ3VsYXIxIiwiZXhlY3V0ZSIsIndpbmRvdyIsImFuZ3VsYXIiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsInRlc3RhYmxlIiwiZXhlY3V0ZUFzeW5jIiwiZG9uZSIsInJvb3RFbGVtZW50IiwiZWxlbWVudCIsInRlc3RhYmlsaXR5IiwiZ2V0VGVzdGFiaWxpdHkiLCJ3aGVuU3RhYmxlIiwic3RhYmxlIiwiZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cyIsImdldEFuZ3VsYXJUZXN0YWJpbGl0eSIsImUiLCJ2ZXJzaW9uIiwiZWwiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRBdHRyaWJ1dGUiLCJ0aW1lb3V0TXNnIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIlRJTUVPVVQiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxlQUFlQSxjQUFmLENBQThCQyxZQUE5QixFQUE0Q0MsT0FBTyxHQUFHLEtBQUcsSUFBekQsRUFBK0Q7QUFDbEUsT0FBS0MsT0FBTCxDQUFhQyxxQkFBYixDQUFtQ0YsT0FBbkMsRUFBNEMsU0FBNUM7O0FBRUEsTUFBSTtBQUNBLFVBQU0sS0FBS0csTUFBTCxDQUFZQyxTQUFaLENBQXNCLFlBQVk7QUFFcEM7QUFDQTtBQUNBLFlBQU1DLFFBQVEsR0FBRyxNQUFNLEtBQUtGLE1BQUwsQ0FBWUcsT0FBWixDQUFvQixNQUFNO0FBQzdDO0FBQ0EsZUFBTyxDQUFDLENBQUNDLE1BQU0sQ0FBQ0MsT0FBaEI7QUFDSCxPQUhzQixDQUF2Qjs7QUFLQSxVQUFJSCxRQUFKLEVBQWM7QUFDVixhQUFLSixPQUFMLENBQWFRLG9CQUFiLENBQWtDVixZQUFsQyxFQUFnRCxjQUFoRDtBQUNBLGNBQU1XLFFBQVEsR0FBRyxNQUFNLEtBQUtQLE1BQUwsQ0FBWVEsWUFBWixDQUF5QixDQUFDWixZQUFELEVBQWVhLElBQWYsS0FBd0I7QUFDcEU7QUFDQSxnQkFBTUMsV0FBVyxHQUFHTixNQUFNLENBQUNDLE9BQVAsQ0FBZU0sT0FBZixDQUF1QmYsWUFBdkIsQ0FBcEIsQ0FGb0UsQ0FHcEU7O0FBQ0EsZ0JBQU1nQixXQUFXLEdBQUdSLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlUSxjQUFmLENBQThCSCxXQUE5QixDQUFwQjtBQUNBRSxVQUFBQSxXQUFXLENBQUNFLFVBQVosQ0FBdUIsTUFBTTtBQUN6QkwsWUFBQUEsSUFBSSxDQUFDLElBQUQsQ0FBSjtBQUNILFdBRkQ7QUFHSCxTQVJzQixFQVFwQmIsWUFSb0IsQ0FBdkI7QUFVQSxlQUFPVyxRQUFQO0FBQ0gsT0FiRCxNQWFPO0FBQ0gsY0FBTVEsTUFBTSxHQUFHLE1BQU0sS0FBS2YsTUFBTCxDQUFZUSxZQUFaLENBQTBCQyxJQUFELElBQVU7QUFDcEQsY0FBSTtBQUNBO0FBQ0E7QUFDQSxrQkFBTUMsV0FBVyxHQUFHTixNQUFNLENBQUNZLHlCQUFQLEdBQW1DLENBQW5DLENBQXBCLENBSEEsQ0FJQTs7QUFDQSxrQkFBTUosV0FBVyxHQUFHUixNQUFNLENBQUNhLHFCQUFQLENBQTZCUCxXQUE3QixDQUFwQjtBQUNBRSxZQUFBQSxXQUFXLENBQUNFLFVBQVosQ0FBdUIsTUFBTTtBQUN6QkwsY0FBQUEsSUFBSSxDQUFDLElBQUQsQ0FBSjtBQUNILGFBRkQ7QUFHSCxXQVRELENBU0UsT0FBT1MsQ0FBUCxFQUFVO0FBQ1JULFlBQUFBLElBQUksQ0FBQyxLQUFELENBQUo7QUFDSDtBQUNKLFNBYm9CLENBQXJCO0FBZUEsY0FBTVUsT0FBTyxHQUFHLE1BQU0sS0FBS25CLE1BQUwsQ0FBWUcsT0FBWixDQUFvQixNQUFNO0FBQzVDO0FBQ0EsZ0JBQU1pQixFQUFFLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixjQUF2QixDQUFYOztBQUNBLGNBQUksQ0FBQ0YsRUFBTCxFQUFTO0FBQ0wsbUJBQU8sSUFBUDtBQUNIOztBQUNELGlCQUFPQSxFQUFFLENBQUNHLFlBQUgsQ0FBZ0IsWUFBaEIsQ0FBUDtBQUNILFNBUHFCLENBQXRCOztBQVNBLFlBQUlKLE9BQU8sSUFBSUosTUFBZixFQUF1QjtBQUNuQixpQkFBTyxJQUFQO0FBQ0g7QUFDSjtBQUNKLEtBbkRLLEVBbURKO0FBQ0VsQixNQUFBQSxPQUFPLEVBQUVBLE9BRFg7QUFFRTJCLE1BQUFBLFVBQVUsRUFBRyxxQ0FBb0MzQixPQUFRO0FBRjNELEtBbkRJLENBQU47QUF1REgsR0F4REQsQ0F3REUsT0FBT3FCLENBQVAsRUFBVTtBQUNSLFVBQU0sSUFBSSxLQUFLTyxPQUFULENBQWlCLEtBQUtDLFNBQUwsQ0FBZUMsU0FBZixDQUF5QkMsT0FBMUMsRUFBbURWLENBQUMsQ0FBQ1csT0FBckQsQ0FBTjtBQUNIO0FBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAc3VtbWFyeSBXYWl0IGZvciBBbmd1bGFyIGJhc2VkIGFwcCB3aWxsIGJlIGxvYWRlZFxyXG4gKiBAZnVuY3Rpb24gd2FpdEZvckFuZ3VsYXJcclxuICogQHBhcmFtIHtTdHJpbmc9fSByb290U2VsZWN0b3IgLSBTZWxlY3RvciBmb3Igcm9vdCBlbGVtZW50LCBuZWVkZWQgb25seSBmb3IgQW5ndWxhckpTICh2MSkuIFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIEFuZ3VsYXIgKHYyKSBmaXJzdCBhdmFpbGFibGUgcm9vdCBub2RlIHdpbGwgYmUgc2VsZWN0ZWQgYXV0b21hdGljYWxseS5cclxuICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAqIHdlYi5pbml0KCk7XHJcbiAqIHdlYi5vcGVuKFwid3d3LnlvdXJ3ZWJzaXRlLmNvbVwiKTtcclxuICogd2ViLndhaXRGb3JBbmd1bGFyKCk7XHJcbiAqL1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBbmd1bGFyKHJvb3RTZWxlY3RvciwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYyAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBpbiBBbmd1bGFySlMgKHYxKSB3aW5kb3cuYW5ndWxhciB3aWxsIGJlIGRlZmluZWQgXHJcbiAgICAgICAgICAgIC8vIGluIEFuZ3VsYXIgKHYyKSB3aW5kb3cuYW5ndWxhciB3aWxsIGJlIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBjb25zdCBhbmd1bGFyMSA9IGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gISF3aW5kb3cuYW5ndWxhcjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYW5ndWxhcjEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFN0cmluZyhyb290U2VsZWN0b3IsICdyb290U2VsZWN0b3InKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RhYmxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZUFzeW5jKChyb290U2VsZWN0b3IsIGRvbmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHdpbmRvdy5hbmd1bGFyLmVsZW1lbnQocm9vdFNlbGVjdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0YWJpbGl0eSA9IHdpbmRvdy5hbmd1bGFyLmdldFRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sIHJvb3RTZWxlY3Rvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RhYmxlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhYmxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZUFzeW5jKChkb25lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIHdheSBvZiBvYnRhaW5pbmcgdGVzdGFiaWxpdHkgaXMgdGhlIHNhbWUgYXMgdXNpbmc6IHZhciB0ZXN0YWJpbGl0eSA9IHdpbmRvdy5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSB3aW5kb3cuZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVzdGFiaWxpdHkgPSB3aW5kb3cuZ2V0QW5ndWxhclRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGFiaWxpdHkud2hlblN0YWJsZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ25nLXZlcnNpb24nKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICYmIHN0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSx7XHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXHJcbiAgICAgICAgICAgIHRpbWVvdXRNc2c6IGBVbmFibGUgdG8gYXR0YWluIHN0YWJpbGl0eSB3aXRoaW4gJHt0aW1lb3V0fW1zIChvciB0aGlzIGlzIG5vdCBhbiBBbmd1bGFyIGFwcGxpY2F0aW9uKWBcclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgdGhpcy5PeEVycm9yKHRoaXMuZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBlLm1lc3NhZ2UpO1xyXG4gICAgfVxyXG59Il19
89
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIvY29tbWFuZHMvd2FpdEZvckFuZ3VsYXIuanMiXSwibmFtZXMiOlsid2FpdEZvckFuZ3VsYXIiLCJyb290U2VsZWN0b3IiLCJzb2Z0V2FpdCIsInRpbWVvdXQiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiZHJpdmVyIiwid2FpdFVudGlsIiwiYW5ndWxhcjEiLCJleGVjdXRlIiwid2luZG93IiwiYW5ndWxhciIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwidGVzdGFibGUiLCJyb290RWxlbWVudCIsImVsZW1lbnQiLCJ0ZXN0YWJpbGl0eSIsImdldFRlc3RhYmlsaXR5IiwiaXNTdGFibGUiLCJzdGFibGUiLCJnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzIiwiZ2V0QW5ndWxhclRlc3RhYmlsaXR5IiwidmVyc2lvbiIsImVsIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwiZXJyIiwidGltZW91dE1zZyIsImUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiVElNRU9VVCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRU8sZUFBZUEsY0FBZixDQUE4QkMsWUFBOUIsRUFBNENDLFFBQVEsR0FBRyxLQUF2RCxFQUE4REMsT0FBTyxHQUFHLEtBQUcsSUFBM0UsRUFBaUY7QUFDcEYsT0FBS0MsT0FBTCxDQUFhQyxxQkFBYixDQUFtQ0YsT0FBbkMsRUFBNEMsU0FBNUM7O0FBRUEsTUFBSTtBQUNBLFVBQU0sS0FBS0csTUFBTCxDQUFZQyxTQUFaLENBQXNCLFlBQVk7QUFDcEMsVUFBSTtBQUVBO0FBQ0E7QUFDQSxjQUFNQyxRQUFRLEdBQUcsTUFBTSxLQUFLRixNQUFMLENBQVlHLE9BQVosQ0FBb0IsTUFBTTtBQUM3QztBQUNBLGlCQUFPLENBQUMsQ0FBQ0MsTUFBTSxDQUFDQyxPQUFoQjtBQUNILFNBSHNCLENBQXZCOztBQUtBLFlBQUlILFFBQUosRUFBYztBQUNWLGVBQUtKLE9BQUwsQ0FBYVEsb0JBQWIsQ0FBa0NYLFlBQWxDLEVBQWdELGNBQWhEO0FBQ0EsZ0JBQU1ZLFFBQVEsR0FBRyxNQUFNLEtBQUtQLE1BQUwsQ0FBWUcsT0FBWixDQUFxQlIsWUFBRCxJQUFrQjtBQUN6RDtBQUNBLGtCQUFNYSxXQUFXLEdBQUdKLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlSSxPQUFmLENBQXVCZCxZQUF2QixDQUFwQixDQUZ5RCxDQUd6RDs7QUFDQSxrQkFBTWUsV0FBVyxHQUFHTixNQUFNLENBQUNDLE9BQVAsQ0FBZU0sY0FBZixDQUE4QkgsV0FBOUIsQ0FBcEI7QUFDQSxtQkFBT0UsV0FBVyxDQUFDRSxRQUFaLEVBQVA7QUFDSCxXQU5zQixFQU1wQmpCLFlBTm9CLENBQXZCO0FBUUEsaUJBQU9ZLFFBQVA7QUFDSCxTQVhELE1BV087QUFDSCxnQkFBTU0sTUFBTSxHQUFHLE1BQU0sS0FBS2IsTUFBTCxDQUFZRyxPQUFaLENBQW9CLE1BQU07QUFDM0M7QUFDQTtBQUNBLGtCQUFNSyxXQUFXLEdBQUdKLE1BQU0sQ0FBQ1UseUJBQVAsR0FBbUMsQ0FBbkMsQ0FBcEIsQ0FIMkMsQ0FJMUM7O0FBQ0Qsa0JBQU1KLFdBQVcsR0FBR04sTUFBTSxDQUFDVyxxQkFBUCxDQUE2QlAsV0FBN0IsQ0FBcEIsQ0FMMkMsQ0FNM0M7QUFDQTs7QUFDQSxtQkFBT0UsV0FBVyxDQUFDRSxRQUFaLEVBQVA7QUFDSCxXQVRvQixDQUFyQjtBQVdBLGdCQUFNSSxPQUFPLEdBQUcsTUFBTSxLQUFLaEIsTUFBTCxDQUFZRyxPQUFaLENBQW9CLE1BQU07QUFDNUM7QUFDQSxrQkFBTWMsRUFBRSxHQUFHQyxRQUFRLENBQUNDLGFBQVQsQ0FBdUIsY0FBdkIsQ0FBWDs7QUFDQSxnQkFBSSxDQUFDRixFQUFMLEVBQVM7QUFDTCxxQkFBTyxJQUFQO0FBQ0g7O0FBQ0QsbUJBQU9BLEVBQUUsQ0FBQ0csWUFBSCxDQUFnQixZQUFoQixDQUFQO0FBQ0gsV0FQcUIsQ0FBdEI7QUFTQSxpQkFBUUosT0FBTyxJQUFJSCxNQUFuQjtBQUNIO0FBQ0osT0EzQ0QsQ0EyQ0UsT0FBT1EsR0FBUCxFQUFZLENBQ1Y7QUFDSDtBQUNKLEtBL0NLLEVBK0NKO0FBQ0V4QixNQUFBQSxPQUFPLEVBQUVBLE9BRFg7QUFFRXlCLE1BQUFBLFVBQVUsRUFBRyxxQ0FBb0N6QixPQUFRO0FBRjNELEtBL0NJLENBQU47QUFtREgsR0FwREQsQ0FvREUsT0FBTzBCLENBQVAsRUFBVTtBQUNSLFFBQUksQ0FBQzNCLFFBQUwsRUFBZTtBQUNYLFlBQU0sSUFBSSxLQUFLNEIsT0FBVCxDQUFpQixLQUFLQyxTQUFMLENBQWVDLFNBQWYsQ0FBeUJDLE9BQTFDLEVBQW1ESixDQUFDLENBQUNLLE9BQXJELENBQU47QUFDSDtBQUNKO0FBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAc3VtbWFyeSBXYWl0IGZvciBBbmd1bGFyIGJhc2VkIGFwcCB3aWxsIGJlIGxvYWRlZFxyXG4gKiBAZnVuY3Rpb24gd2FpdEZvckFuZ3VsYXJcclxuICogQHBhcmFtIHtTdHJpbmc9fSByb290U2VsZWN0b3IgLSBTZWxlY3RvciBmb3Igcm9vdCBlbGVtZW50LCBuZWVkZWQgb25seSBmb3IgQW5ndWxhckpTICh2MSkuIFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIEFuZ3VsYXIgKHYyKSBmaXJzdCBhdmFpbGFibGUgcm9vdCBub2RlIHdpbGwgYmUgc2VsZWN0ZWQgYXV0b21hdGljYWxseS5cclxuICogQHBhcmFtIHtCb29sZWFuPX0gc29mdFdhaXQgLSBJZiB0cnVlIHRoZW4gZG8gbm90IHByb2R1Y2UgZXJyb3IgaWYgc3RhYmlsaXR5IGNhbm5vdCBiZSBhdHRhaW5lZC4gRGVmYXVsdCBpcyBmYWxzZS5cclxuICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAqIHdlYi5pbml0KCk7XHJcbiAqIHdlYi5vcGVuKFwid3d3LnlvdXJ3ZWJzaXRlLmNvbVwiKTtcclxuICogd2ViLndhaXRGb3JBbmd1bGFyKCk7XHJcbiAqL1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBbmd1bGFyKHJvb3RTZWxlY3Rvciwgc29mdFdhaXQgPSBmYWxzZSwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhckpTICh2MSkgd2luZG93LmFuZ3VsYXIgd2lsbCBiZSBkZWZpbmVkIFxyXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciAodjIpIHdpbmRvdy5hbmd1bGFyIHdpbGwgYmUgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmd1bGFyMSA9IGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXdpbmRvdy5hbmd1bGFyO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nKHJvb3RTZWxlY3RvciwgJ3Jvb3RTZWxlY3RvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RhYmxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZSgocm9vdFNlbGVjdG9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHdpbmRvdy5hbmd1bGFyLmVsZW1lbnQocm9vdFNlbGVjdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RhYmlsaXR5ID0gd2luZG93LmFuZ3VsYXIuZ2V0VGVzdGFiaWxpdHkocm9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdGFiaWxpdHkuaXNTdGFibGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCByb290U2VsZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdGFibGU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWJsZSA9IGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgd2F5IG9mIG9idGFpbmluZyB0ZXN0YWJpbGl0eSBpcyB0aGUgc2FtZSBhcyB1c2luZzogdmFyIHRlc3RhYmlsaXR5ID0gd2luZG93LmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzKClbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHdpbmRvdy5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzKClbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVzdGFiaWxpdHkgPSB3aW5kb3cuZ2V0QW5ndWxhclRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGlzU3RhYmxlIGluc3RlYWQgb2Ygd2hlblN0YWJsZSBkdWUgdG8gdGhpcyBpc3N1ZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTQ1MDk2NDcvdGVzdGFiaWxpdHktd2hlbnN0YWJsZS1yZXR1cm5zLXRlc3RhYmlsaXR5LWlzc3RhYmxlLXJldHVybnMtZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RhYmlsaXR5LmlzU3RhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25nLXZlcnNpb25dJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ25nLXZlcnNpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ZXJzaW9uICYmIHN0YWJsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUgdGhlbiBpdCdzIGV4ZWN1dGVBc3luYyB0aW1lb3V0LlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSx7XHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXHJcbiAgICAgICAgICAgIHRpbWVvdXRNc2c6IGBVbmFibGUgdG8gYXR0YWluIHN0YWJpbGl0eSB3aXRoaW4gJHt0aW1lb3V0fW1zIChvciB0aGlzIGlzIG5vdCBhbiBBbmd1bGFyIGFwcGxpY2F0aW9uKWBcclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoIXNvZnRXYWl0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyB0aGlzLk94RXJyb3IodGhpcy5lcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19