verdaccio 6.3.1 → 6.4.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.
@@ -205,46 +205,59 @@ class Storage {
205
205
  readStream.abort = function () {};
206
206
  const self = this;
207
207
 
208
- // if someone requesting tarball, it means that we should already have some
209
- // information about it, so fetching package info is unnecessary
210
-
211
- // trying local first
212
- // flow: should be IReadTarball
213
- let localStream = self.localStorage.getTarball(name, filename);
214
- let isOpen = false;
215
- localStream.on('error', err => {
216
- if (isOpen || err.status !== _constants.HTTP_STATUS.NOT_FOUND) {
217
- return readStream.emit('error', err);
208
+ // Check if the tarball is allowed by filter plugins before serving.
209
+ // Filters may block specific versions, so we verify the tarball's version
210
+ // still exists in the filtered metadata.
211
+ this._isTarballAllowedByFilters(name, filename).then(async allowed => {
212
+ if (!allowed) {
213
+ readStream.emit('error', _utils.ErrorCode.getNotFound(_constants.API_ERROR.NO_PACKAGE));
214
+ return;
218
215
  }
219
216
 
220
- // local reported 404
221
- const err404 = err;
222
- localStream.abort();
223
- localStream = null; // we force for garbage collector
224
- self.localStorage.getPackageMetadata(name, (err, info) => {
225
- if (_lodash.default.isNil(err) && info._distfiles && _lodash.default.isNil(info._distfiles[filename]) === false) {
226
- // information about this file exists locally
227
- serveFile(info._distfiles[filename]);
228
- } else {
229
- // we know nothing about this file, trying to get information elsewhere
230
- self._syncUplinksMetadata(name, info, {}, (err, info) => {
231
- if (_lodash.default.isNil(err) === false) {
232
- return readStream.emit('error', err);
217
+ // trying local first
218
+ let localStream = self.localStorage.getTarball(name, filename);
219
+ let isOpen = false;
220
+ localStream.on('error', err => {
221
+ if (isOpen || err.status !== _constants.HTTP_STATUS.NOT_FOUND) {
222
+ return readStream.emit('error', err);
223
+ }
224
+
225
+ // local reported 404
226
+ const err404 = err;
227
+ localStream.abort();
228
+ localStream = null; // we force for garbage collector
229
+
230
+ const lookupFromUplinks = info => {
231
+ self._syncUplinksMetadata(name, info, {}, (syncErr, syncInfo) => {
232
+ if (_lodash.default.isNil(syncErr) === false) {
233
+ return readStream.emit('error', syncErr);
233
234
  }
234
- if (_lodash.default.isNil(info._distfiles) || _lodash.default.isNil(info._distfiles[filename])) {
235
+ if (_lodash.default.isNil(syncInfo._distfiles) || _lodash.default.isNil(syncInfo._distfiles[filename])) {
235
236
  return readStream.emit('error', err404);
236
237
  }
237
- serveFile(info._distfiles[filename]);
238
+ serveFile(syncInfo._distfiles[filename]);
238
239
  });
239
- }
240
+ };
241
+ self.localStorage.getPackageMetadataAsync(name).then(info => {
242
+ if (info._distfiles && _lodash.default.isNil(info._distfiles[filename]) === false) {
243
+ // information about this file exists locally
244
+ serveFile(info._distfiles[filename]);
245
+ } else {
246
+ // we know nothing about this file, trying to get information elsewhere
247
+ lookupFromUplinks(info);
248
+ }
249
+ }, () => {
250
+ // we know nothing about this file, trying to get information elsewhere
251
+ lookupFromUplinks(null);
252
+ });
253
+ });
254
+ localStream.on('content-length', function (v) {
255
+ readStream.emit('content-length', v);
256
+ });
257
+ localStream.on('open', function () {
258
+ isOpen = true;
259
+ localStream.pipe(readStream);
240
260
  });
241
- });
242
- localStream.on('content-length', function (v) {
243
- readStream.emit('content-length', v);
244
- });
245
- localStream.on('open', function () {
246
- isOpen = true;
247
- localStream.pipe(readStream);
248
261
  });
249
262
  return readStream;
250
263
 
@@ -432,46 +445,50 @@ class Storage {
432
445
  * @param {*} callback
433
446
  */
434
447
  getLocalDatabase(callback) {
435
- const self = this;
436
448
  this.localStorage.storagePlugin.get((err, locals) => {
437
449
  if (err) {
438
- callback(err);
450
+ return callback(err);
439
451
  }
440
- const packages = [];
441
- const getPackage = function (itemPkg) {
442
- self.localStorage.getPackageMetadata(locals[itemPkg], function (err, pkgMetadata) {
443
- if (_lodash.default.isNil(err)) {
444
- const latest = pkgMetadata[_constants.DIST_TAGS].latest;
445
- if (latest && pkgMetadata.versions[latest]) {
446
- const version = pkgMetadata.versions[latest];
447
- const timeList = pkgMetadata.time;
448
- const time = timeList[latest];
449
- // @ts-ignore
450
- version.time = time;
452
+ this._collectLocalPackages(locals).then(packages => callback(null, packages), err => callback(err));
453
+ });
454
+ }
451
455
 
452
- // Add for stars api
453
- // @ts-ignore
454
- version.users = pkgMetadata.users;
455
- packages.push(version);
456
- } else {
457
- self.logger.warn({
458
- package: locals[itemPkg]
459
- }, 'package @{package} does not have a "latest" tag?');
460
- }
461
- }
462
- if (itemPkg >= locals.length - 1) {
463
- callback(null, packages);
464
- } else {
465
- getPackage(itemPkg + 1);
466
- }
467
- });
468
- };
469
- if (locals.length) {
470
- getPackage(0);
471
- } else {
472
- callback(null, []);
456
+ /**
457
+ * Read each local package name, apply filters, and collect the latest version.
458
+ */
459
+ async _collectLocalPackages(locals) {
460
+ const packages = [];
461
+ for (const name of locals) {
462
+ try {
463
+ const pkgMetadata = await this.localStorage.getPackageMetadataAsync(name);
464
+ const {
465
+ filteredPackage
466
+ } = await this._applyFilters(pkgMetadata);
467
+ const latest = filteredPackage[_constants.DIST_TAGS]?.latest;
468
+ if (latest && filteredPackage.versions[latest]) {
469
+ const version = filteredPackage.versions[latest];
470
+ const timeList = filteredPackage.time;
471
+ const time = timeList[latest];
472
+ // @ts-ignore
473
+ version.time = time;
474
+
475
+ // Add for stars api
476
+ // @ts-ignore
477
+ version.users = filteredPackage.users;
478
+ packages.push(version);
479
+ } else {
480
+ this.logger.warn({
481
+ package: name
482
+ }, 'package @{package} does not have a "latest" tag?');
483
+ }
484
+ } catch (err) {
485
+ this.logger.error({
486
+ err,
487
+ package: name
488
+ }, 'error reading package @{package}');
473
489
  }
474
- });
490
+ }
491
+ return packages;
475
492
  }
476
493
 
477
494
  /**
@@ -542,7 +559,7 @@ class Storage {
542
559
  });
543
560
  },
544
561
  // @ts-ignore
545
- (err, upLinksErrors) => {
562
+ async (err, upLinksErrors) => {
546
563
  (0, _assert.default)(!err && Array.isArray(upLinksErrors));
547
564
 
548
565
  // Check for connection timeout or reset errors with uplink(s)
@@ -568,30 +585,76 @@ class Storage {
568
585
  return callback(_utils.ErrorCode.getNotFound(_constants.API_ERROR.NO_PACKAGE), null, upLinksErrors);
569
586
  }
570
587
  if (upLinks.length === 0) {
571
- return callback(null, packageInfo);
588
+ const {
589
+ filteredPackage,
590
+ filterErrors
591
+ } = await self._applyFilters(packageInfo);
592
+ return callback(null, filteredPackage, filterErrors);
593
+ }
594
+ try {
595
+ const packageJsonLocal = await self.localStorage.updateVersionsAsync(name, packageInfo);
596
+ const {
597
+ filteredPackage,
598
+ filterErrors
599
+ } = await self._applyFilters(packageJsonLocal);
600
+ callback(null, filteredPackage, _lodash.default.concat(upLinksErrors, filterErrors));
601
+ } catch (err) {
602
+ callback(err);
572
603
  }
573
- self.localStorage.updateVersions(name, packageInfo, async (err, packageJsonLocal) => {
574
- if (err) {
575
- return callback(err);
576
- }
577
- // Any error here will cause a 404, like an uplink error. This is likely the right thing to do
578
- // as a broken filter is a security risk.
579
- const filterErrors = [];
580
- // This MUST be done serially and not in parallel as they modify packageJsonLocal
581
- for (const filter of self.filters ?? []) {
582
- try {
583
- // These filters can assume it's save to modify packageJsonLocal and return it directly for
584
- // performance (i.e. need not be pure)
585
- packageJsonLocal = await filter.filter_metadata(packageJsonLocal);
586
- } catch (err) {
587
- filterErrors.push(err);
588
- }
589
- }
590
- callback(null, packageJsonLocal, _lodash.default.concat(upLinksErrors, filterErrors));
591
- });
592
604
  });
593
605
  }
594
606
 
607
+ /**
608
+ * Apply all configured filter plugins to a package manifest sequentially.
609
+ * Each filter's output is passed as input to the next filter.
610
+ * Returns the filtered manifest and any errors that occurred.
611
+ */
612
+ async _applyFilters(packageInfo) {
613
+ const filterErrors = [];
614
+ let filteredPackage = packageInfo;
615
+ for (const filter of this.filters ?? []) {
616
+ try {
617
+ filteredPackage = await filter.filter_metadata(filteredPackage);
618
+ } catch (err) {
619
+ filterErrors.push(err);
620
+ }
621
+ }
622
+ return {
623
+ filteredPackage,
624
+ filterErrors
625
+ };
626
+ }
627
+
628
+ /**
629
+ * Check if a tarball should be served based on filter plugins.
630
+ * Looks up package metadata, applies filters, and verifies the tarball
631
+ * still belongs to an allowed version.
632
+ */
633
+ async _isTarballAllowedByFilters(name, filename) {
634
+ if (!this.filters?.length) {
635
+ return true;
636
+ }
637
+ try {
638
+ const pkgMetadata = await this.localStorage.getPackageMetadataAsync(name);
639
+ const {
640
+ filteredPackage
641
+ } = await this._applyFilters(pkgMetadata);
642
+ return Object.values(filteredPackage.versions || {}).some(version => version.dist?.tarball?.endsWith('/' + filename));
643
+ } catch (err) {
644
+ if (err?.status === _constants.HTTP_STATUS.NOT_FOUND) {
645
+ // Package not yet cached locally — the request will fall through to uplinks.
646
+ debug('package %o not cached locally, skipping tarball filter check', name);
647
+ } else {
648
+ this.logger.error({
649
+ package: name,
650
+ fileName: filename,
651
+ err
652
+ }, 'error checking filters for tarball @{fileName} of package @{package}: @{err.message}');
653
+ }
654
+ return true;
655
+ }
656
+ }
657
+
595
658
  /**
596
659
  * Set a hidden value for each version.
597
660
  * @param {Array} versions list of version
@@ -610,4 +673,4 @@ class Storage {
610
673
  }
611
674
  }
612
675
  var _default = exports.default = Storage;
613
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmMiLCJfZGVidWciLCJfbG9kYXNoIiwiX3N0cmVhbSIsIl9jb25maWciLCJfY29yZSIsIl9sb2FkZXJzIiwiX2xvY2FsU3RvcmFnZUxlZ2FjeSIsIl9zZWFyY2hJbmRleGVyIiwiX3N0cmVhbXMiLCJfbG9nZ2VyIiwiX2NvbnN0YW50cyIsIl9sb2NhbFN0b3JhZ2UiLCJfbWV0YWRhdGFVdGlscyIsIl9zdG9yYWdlVXRpbHMiLCJfdXBTdG9yYWdlIiwiX3VwbGlua1V0aWwiLCJfdXRpbHMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImJ1aWxkRGVidWciLCJTdG9yYWdlIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJ1cGxpbmtzIiwic2V0dXBVcExpbmtzIiwibG9nZ2VyIiwibG9jYWxTdG9yYWdlIiwiaW5pdCIsImZpbHRlcnMiLCJzdG9yYWdlSW5zdGFuY2UiLCJsb2FkU3RvcmFnZSIsIkxvY2FsU3RvcmFnZSIsImdldFNlY3JldCIsImFzeW5jTG9hZFBsdWdpbiIsInBsdWdpbiIsImZpbHRlcl9tZXRhZGF0YSIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiRklMVEVSIiwibGVuZ3RoIiwibG9hZFN0b3JlUGx1Z2luIiwiXyIsImlzTmlsIiwiYXNzZXJ0Iiwic3RvcmFnZSIsIkxvY2FsRGF0YWJhc2VQbHVnaW4iLCJpbmZvIiwibmFtZSIsInBsdWdpbkNhdGVnb3J5IiwiU1RPUkFHRSIsInBsdWdpbnMiLCJzdG9yZSIsImdldFBhY2thZ2VTdG9yYWdlIiwid2FybiIsImhlYWQiLCJhZGRQYWNrYWdlIiwibWV0YWRhdGEiLCJjYWxsYmFjayIsImNoZWNrUGFja2FnZUxvY2FsIiwiY2hlY2tQYWNrYWdlUmVtb3RlIiwiX2lzQWxsb3dQdWJsaXNoT2ZmbGluZSIsIl9zeW5jVXBsaW5rc01ldGFkYXRhIiwiYmluZCIsInB1Ymxpc2hQYWNrYWdlIiwiZXJyIiwicHVibGlzaCIsImlzQm9vbGVhbiIsImFsbG93X29mZmxpbmUiLCJyZWFkVG9rZW5zIiwiZmlsdGVyIiwic2F2ZVRva2VuIiwidG9rZW4iLCJkZWxldGVUb2tlbiIsInVzZXIiLCJ0b2tlbktleSIsImFkZFZlcnNpb24iLCJ2ZXJzaW9uIiwidGFnIiwibWVyZ2VUYWdzIiwidGFnSGFzaCIsImNoYW5nZVBhY2thZ2UiLCJyZXZpc2lvbiIsInJlbW92ZVBhY2thZ2UiLCJTZWFyY2hNZW1vcnlJbmRleGVyIiwicmVtb3ZlIiwiY2F0Y2giLCJyZWFzb24iLCJlcnJvciIsInJlbW92ZVRhcmJhbGwiLCJmaWxlbmFtZSIsImFkZFRhcmJhbGwiLCJoYXNMb2NhbFRhcmJhbGwiLCJzZWxmIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJsb2NhbFN0cmVhbSIsImdldFRhcmJhbGwiLCJpc09wZW4iLCJvbiIsInN0YXR1cyIsIkhUVFBfU1RBVFVTIiwiTk9UX0ZPVU5EIiwiYWJvcnQiLCJyZWFkU3RyZWFtIiwiUmVhZFRhcmJhbGwiLCJlbWl0IiwiZXJyNDA0IiwiZ2V0UGFja2FnZU1ldGFkYXRhIiwiX2Rpc3RmaWxlcyIsInNlcnZlRmlsZSIsInYiLCJwaXBlIiwiZmlsZSIsInVwbGluayIsInVwbGlua0lkIiwiaGFzUHJveHlUbyIsInBhY2thZ2VzIiwiUHJveHlTdG9yYWdlIiwidXJsIiwiY2FjaGUiLCJfYXV0b2dlbmVyYXRlZCIsInNhdmVzdHJlYW0iLCJvbl9vcGVuIiwicnN0cmVhbTIiLCJmZXRjaFRhcmJhbGwiLCJkb25lIiwiZmlsZU5hbWUiLCJnZXRQYWNrYWdlIiwib3B0aW9ucyIsImRhdGEiLCJJTlRFUk5BTF9FUlJPUiIsInJlcSIsInVwbGlua3NMb29rIiwiZ2V0UGFja2FnZVN5blVwTGlua3NDYWxsYmFjayIsInJlc3VsdCIsInVwbGlua0Vycm9ycyIsIm5vcm1hbGl6ZURpc3RUYWdzIiwiY2xlYW5VcExpbmtzUmVmIiwia2VlcFVwTGlua0RhdGEiLCJfYXR0YWNobWVudHMiLCJhYmJyZXZpYXRlZCIsImNvbnZlcnRBYmJyZXZpYXRlZE1hbmlmZXN0Iiwic2VhcmNoIiwic3RhcnRrZXkiLCJzZWFyY2hTdHJlYW0iLCJTdHJlYW0iLCJQYXNzVGhyb3VnaCIsIm9iamVjdE1vZGUiLCJhc3luYyIsImVhY2hTZXJpZXMiLCJPYmplY3QiLCJrZXlzIiwidXBfbmFtZSIsImNiIiwicXVlcnkiLCJsb2NhbCIsInVuZGVmaW5lZCIsInVwbGlua1N0cmVhbSIsImVuZCIsImxvY2FsU2VhcmNoU3RyZWFtIiwiZ2V0TG9jYWxEYXRhYmFzZSIsInN0b3JhZ2VQbHVnaW4iLCJnZXQiLCJsb2NhbHMiLCJpdGVtUGtnIiwicGtnTWV0YWRhdGEiLCJsYXRlc3QiLCJESVNUX1RBR1MiLCJ2ZXJzaW9ucyIsInRpbWVMaXN0IiwidGltZSIsInVzZXJzIiwicHVzaCIsInBhY2thZ2UiLCJwYWNrYWdlSW5mbyIsImZvdW5kIiwidXBMaW5rcyIsImhhc1RvTG9va0ludG9VcGxpbmtzIiwiZ2VuZXJhdGVQYWNrYWdlVGVtcGxhdGUiLCJtYXAiLCJ1cExpbmsiLCJfb3B0aW9ucyIsImFzc2lnbiIsInVwTGlua01ldGEiLCJfdXBsaW5rcyIsInVwbmFtZSIsImlzT2JqZWN0IiwiZmV0Y2hlZCIsIkRhdGUiLCJub3ciLCJtYXhhZ2UiLCJldGFnIiwiZ2V0UmVtb3RlTWV0YWRhdGEiLCJ1cExpbmtSZXNwb25zZSIsImVUYWciLCJyZW1vdGVTdGF0dXMiLCJFcnJvckNvZGUiLCJnZXRJbnRlcm5hbEVycm9yIiwidmFsaWRhdGlvblV0aWxzIiwibm9ybWFsaXplTWV0YWRhdGEiLCJzdWIiLCJtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwiLCJ1cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayIsIm1lcmdlVmVyc2lvbnMiLCJ1cExpbmtzRXJyb3JzIiwiQXJyYXkiLCJpc0FycmF5IiwidXBsaW5rVGltZW91dEVycm9yIiwiaSIsImoiLCJjb2RlIiwiZ2V0U2VydmljZVVuYXZhaWxhYmxlIiwiZ2V0Tm90Rm91bmQiLCJBUElfRVJST1IiLCJOT19QQUNLQUdFIiwidXBkYXRlVmVyc2lvbnMiLCJwYWNrYWdlSnNvbkxvY2FsIiwiZmlsdGVyRXJyb3JzIiwiY29uY2F0IiwiX3VwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiU3ltYm9sIiwiZm9yIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9zdG9yYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBhc3luYywgeyBBc3luY1Jlc3VsdEFycmF5Q2FsbGJhY2sgfSBmcm9tICdhc3luYyc7XG5pbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFN0cmVhbSBmcm9tICdzdHJlYW0nO1xuXG5pbXBvcnQgeyBoYXNQcm94eVRvIH0gZnJvbSAnQHZlcmRhY2Npby9jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX0NBVEVHT1JZLCBwbHVnaW5VdGlscywgdmFsaWRhdGlvblV0aWxzIH0gZnJvbSAnQHZlcmRhY2Npby9jb3JlJztcbmltcG9ydCB7IGFzeW5jTG9hZFBsdWdpbiB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9hZGVycyc7XG5pbXBvcnQgTG9jYWxEYXRhYmFzZVBsdWdpbiBmcm9tICdAdmVyZGFjY2lvL2xvY2FsLXN0b3JhZ2UtbGVnYWN5JztcbmltcG9ydCB7IFNlYXJjaE1lbW9yeUluZGV4ZXIgfSBmcm9tICdAdmVyZGFjY2lvL3NlYXJjaC1pbmRleGVyJztcbmltcG9ydCB7IFJlYWRUYXJiYWxsIH0gZnJvbSAnQHZlcmRhY2Npby9zdHJlYW1zJztcbmltcG9ydCB7XG4gIENhbGxiYWNrLFxuICBDb25maWcsXG4gIERpc3RGaWxlLFxuICBMb2dnZXIsXG4gIE1hbmlmZXN0LFxuICBNZXJnZVRhZ3MsXG4gIFBhY2thZ2UsXG4gIFZlcnNpb24sXG4gIFZlcnNpb25zLFxufSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCB7IEdlbmVyaWNCb2R5LCBUb2tlbiwgVG9rZW5GaWx0ZXIgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IHsgU3RvcmFnZVBsdWdpbkxlZ2FjeSB9IGZyb20gJy4uLy4uL3R5cGVzL2N1c3RvbSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcbmltcG9ydCB7IElQbHVnaW5GaWx0ZXJzLCBJU3luY1VwbGlua3MsIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQVBJX0VSUk9SLCBESVNUX1RBR1MsIEhUVFBfU1RBVFVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IExvY2FsU3RvcmFnZSwgeyBTdG9yYWdlUGx1Z2luIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IG1lcmdlVmVyc2lvbnMgfSBmcm9tICcuL21ldGFkYXRhLXV0aWxzJztcbmltcG9ydCB7XG4gIGNoZWNrUGFja2FnZUxvY2FsLFxuICBjaGVja1BhY2thZ2VSZW1vdGUsXG4gIGNsZWFuVXBMaW5rc1JlZixcbiAgY29udmVydEFiYnJldmlhdGVkTWFuaWZlc3QsXG4gIGdlbmVyYXRlUGFja2FnZVRlbXBsYXRlLFxuICBtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwsXG4gIHB1Ymxpc2hQYWNrYWdlLFxufSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuaW1wb3J0IFByb3h5U3RvcmFnZSBmcm9tICcuL3VwLXN0b3JhZ2UnO1xuaW1wb3J0IHsgc2V0dXBVcExpbmtzLCB1cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayB9IGZyb20gJy4vdXBsaW5rLXV0aWwnO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBpc09iamVjdCwgbm9ybWFsaXplRGlzdFRhZ3MgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgZGVidWcgPSBidWlsZERlYnVnKCd2ZXJkYWNjaW86c3RvcmFnZScpO1xuXG5jbGFzcyBTdG9yYWdlIHtcbiAgcHVibGljIGxvY2FsU3RvcmFnZTogTG9jYWxTdG9yYWdlO1xuICBwdWJsaWMgY29uZmlnOiBDb25maWc7XG4gIHB1YmxpYyBsb2dnZXI6IExvZ2dlcjtcbiAgcHVibGljIHVwbGlua3M6IFJlY29yZDxzdHJpbmcsIFByb3h5U3RvcmFnZT47XG4gIHB1YmxpYyBmaWx0ZXJzOiBJUGx1Z2luRmlsdGVycyB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnVwbGlua3MgPSBzZXR1cFVwTGlua3MoY29uZmlnKTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMubG9jYWxTdG9yYWdlID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0KGNvbmZpZzogQ29uZmlnLCBmaWx0ZXJzPzogSVBsdWdpbkZpbHRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5sb2NhbFN0b3JhZ2UgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICBjb25zdCBzdG9yYWdlSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmxvYWRTdG9yYWdlKGNvbmZpZywgdGhpcy5sb2dnZXIpO1xuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSBuZXcgTG9jYWxTdG9yYWdlKHRoaXMuY29uZmlnLCBsb2dnZXIsIHN0b3JhZ2VJbnN0YW5jZSk7XG4gICAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRTZWNyZXQoY29uZmlnKTtcbiAgICAgIGRlYnVnKCdpbml0aWFsaXphdGlvbiBjb21wbGV0ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ3N0b3JhZ2UgaGFzIGJlZW4gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XG4gICAgICB0aGlzLmZpbHRlcnMgPSBhd2FpdCBhc3luY0xvYWRQbHVnaW48cGx1Z2luVXRpbHMuTWFuaWZlc3RGaWx0ZXI8dW5rbm93bj4+KFxuICAgICAgICB0aGlzLmNvbmZpZy5maWx0ZXJzLFxuICAgICAgICB7XG4gICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICB9LFxuICAgICAgICAocGx1Z2luOiBwbHVnaW5VdGlscy5NYW5pZmVzdEZpbHRlcjxDb25maWc+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBwbHVnaW4uZmlsdGVyX21ldGFkYXRhICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5jb25maWc/LnNlcnZlclNldHRpbmdzPy5wbHVnaW5QcmVmaXgsXG4gICAgICAgIFBMVUdJTl9DQVRFR09SWS5GSUxURVJcbiAgICAgICk7XG4gICAgICBkZWJ1ZygnZmlsdGVycyBhdmFpbGFibGUgJW8nLCB0aGlzLmZpbHRlcnMubGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTdG9yYWdlKGNvbmZpZzogQ29uZmlnLCBsb2dnZXI6IExvZ2dlcik6IFByb21pc2U8U3RvcmFnZVBsdWdpbj4ge1xuICAgIGNvbnN0IFN0b3JhZ2UgPSBhd2FpdCB0aGlzLmxvYWRTdG9yZVBsdWdpbigpO1xuICAgIGlmIChfLmlzTmlsKFN0b3JhZ2UpKSB7XG4gICAgICBhc3NlcnQodGhpcy5jb25maWcuc3RvcmFnZSwgJ0NPTkZJRzogc3RvcmFnZSBwYXRoIG5vdCBkZWZpbmVkJyk7XG4gICAgICBkZWJ1Zygnbm8gY3VzdG9tIHN0b3JhZ2UgZm91bmQsIGxvYWRpbmcgZGVmYXVsdCBzdG9yYWdlIEB2ZXJkYWNjaW8vbG9jYWwtc3RvcmFnZScpO1xuICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IExvY2FsRGF0YWJhc2VQbHVnaW4oY29uZmlnLCBsb2dnZXIpO1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIHsgbmFtZTogJ0B2ZXJkYWNjaW8vbG9jYWwtc3RvcmFnZScsIHBsdWdpbkNhdGVnb3J5OiBQTFVHSU5fQ0FURUdPUlkuU1RPUkFHRSB9LFxuICAgICAgICAncGx1Z2luIEB7bmFtZX0gc3VjY2Vzc2Z1bGx5IGxvYWRlZCAoQHtwbHVnaW5DYXRlZ29yeX0pJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgfVxuICAgIHJldHVybiBTdG9yYWdlIGFzIFN0b3JhZ2VQbHVnaW47XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTdG9yZVBsdWdpbigpOiBQcm9taXNlPFN0b3JhZ2VQbHVnaW5MZWdhY3k8Q29uZmlnPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsdWdpbnM6IFN0b3JhZ2VQbHVnaW5MZWdhY3k8Q29uZmlnPltdID0gYXdhaXQgYXN5bmNMb2FkUGx1Z2luPFxuICAgICAgcGx1Z2luVXRpbHMuU3RvcmFnZTx1bmtub3duPlxuICAgID4oXG4gICAgICB0aGlzLmNvbmZpZy5zdG9yZSxcbiAgICAgIHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIH0sXG4gICAgICAocGx1Z2luKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGx1Z2luLmdldFBhY2thZ2VTdG9yYWdlICE9PSAndW5kZWZpbmVkJztcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5jb25maWc/LnNlcnZlclNldHRpbmdzPy5wbHVnaW5QcmVmaXgsXG4gICAgICBQTFVHSU5fQ0FURUdPUlkuU1RPUkFHRVxuICAgICk7XG5cbiAgICBpZiAocGx1Z2lucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAnbW9yZSB0aGFuIG9uZSBzdG9yYWdlIHBsdWdpbnMgaGFzIGJlZW4gZGV0ZWN0ZWQsIG11bHRpcGxlIHN0b3JhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQsIG9uZSB3aWxsIGJlIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHknXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBfLmhlYWQocGx1Z2lucyk7XG4gIH1cblxuICAvKipcbiAgICogIEFkZCBhIHtuYW1lfSBwYWNrYWdlIHRvIGEgc3lzdGVtXG4gICBGdW5jdGlvbiBjaGVja3MgaWYgcGFja2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgYXZhaWxhYmxlIGZyb20gdXBsaW5rcy5cbiAgIElmIGl0IGlzbid0LCB3ZSBjcmVhdGUgcGFja2FnZSBsb2NhbGx5XG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpICYmIHVwbGlua3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKG5hbWU6IHN0cmluZywgbWV0YWRhdGE6IGFueSwgY2FsbGJhY2s6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VMb2NhbChuYW1lLCB0aGlzLmxvY2FsU3RvcmFnZSk7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VSZW1vdGUoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRoaXMuX2lzQWxsb3dQdWJsaXNoT2ZmbGluZSgpLFxuICAgICAgICB0aGlzLl9zeW5jVXBsaW5rc01ldGFkYXRhLmJpbmQodGhpcylcbiAgICAgICk7XG4gICAgICBhd2FpdCBwdWJsaXNoUGFja2FnZShuYW1lLCBtZXRhZGF0YSwgdGhpcy5sb2NhbFN0b3JhZ2UpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc0FsbG93UHVibGlzaE9mZmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB0aGlzLmNvbmZpZy5wdWJsaXNoICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgXy5pc0Jvb2xlYW4odGhpcy5jb25maWcucHVibGlzaC5hbGxvd19vZmZsaW5lKSAmJlxuICAgICAgdGhpcy5jb25maWcucHVibGlzaC5hbGxvd19vZmZsaW5lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVG9rZW5zKGZpbHRlcjogVG9rZW5GaWx0ZXIpOiBQcm9taXNlPFRva2VuW10+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UucmVhZFRva2VucyhmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIHNhdmVUb2tlbih0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2Uuc2F2ZVRva2VuKHRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVUb2tlbih1c2VyOiBzdHJpbmcsIHRva2VuS2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZS5kZWxldGVUb2tlbih1c2VyLCB0b2tlbktleSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IHZlcnNpb24gb2YgcGFja2FnZSB7bmFtZX0gdG8gYSBzeXN0ZW1cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyBhZGRWZXJzaW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IFZlcnNpb24sXG4gICAgdGFnOiBTdHJpbmdWYWx1ZSxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuYWRkVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBtZXRhZGF0YSwgdGFnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVGFncyBhIHBhY2thZ2UgdmVyc2lvbiB3aXRoIGEgcHJvdmlkZWQgdGFnXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgbWVyZ2VUYWdzKG5hbWU6IHN0cmluZywgdGFnSGFzaDogTWVyZ2VUYWdzLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5tZXJnZVRhZ3MobmFtZSwgdGFnSGFzaCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSBhbiBleGlzdGluZyBwYWNrYWdlIChpLmUuIHVucHVibGlzaCBvbmUgdmVyc2lvbilcbiAgIEZ1bmN0aW9uIGNoYW5nZXMgYSBwYWNrYWdlIGluZm8gZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCBhbGwgdXBsaW5rcyB3aXRoIHdyaXRlIGFjY2Vzcy4vXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFja2FnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IFBhY2thZ2UsXG4gICAgcmV2aXNpb246IHN0cmluZyxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuY2hhbmdlUGFja2FnZShuYW1lLCBtZXRhZGF0YSwgcmV2aXNpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYWNrYWdlIGZyb20gYSBzeXN0ZW1cbiAgIEZ1bmN0aW9uIHJlbW92ZXMgYSBwYWNrYWdlIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhY2thZ2UobmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmVQYWNrYWdlKG5hbWUsIGNhbGxiYWNrKTtcbiAgICAvLyB1cGRhdGUgdGhlIGluZGV4ZXJcbiAgICBTZWFyY2hNZW1vcnlJbmRleGVyLnJlbW92ZShuYW1lKS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICBkZWJ1ZygnaW5kZXhlciBoYXMgZmFpbGVkIG9uIHJlbW92ZSBpdGVtICVvJywgcmVhc29uKTtcbiAgICAgIGxvZ2dlci5lcnJvcignaW5kZXhlciBoYXMgZmFpbGVkIG9uIHJlbW92ZSBpdGVtJyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgIFJlbW92ZSBhIHRhcmJhbGwgZnJvbSBhIHN5c3RlbVxuICAgRnVuY3Rpb24gcmVtb3ZlcyBhIHRhcmJhbGwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgVGFyYmFsbCBpbiBxdWVzdGlvbiBzaG91bGQgbm90IGJlIGxpbmtlZCB0byBpbiBhbnkgZXhpc3RpbmdcbiAgIHZlcnNpb25zLCBpLmUuIHBhY2thZ2UgdmVyc2lvbiBzaG91bGQgYmUgdW5wdWJsaXNoZWQgZmlyc3QuXG4gICBVc2VkIHN0b3JhZ2U6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgcmV2aXNpb246IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlVGFyYmFsbChuYW1lLCBmaWxlbmFtZSwgcmV2aXNpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYSB0YXJiYWxsIGZvciB7bmFtZX0gcGFja2FnZVxuICAgRnVuY3Rpb24gaXMgc3luY2hyb25vdXMgYW5kIHJldHVybnMgYSBXcml0YWJsZVN0cmVhbVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIGFkZFRhcmJhbGwobmFtZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLmFkZFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICB9XG5cbiAgcHVibGljIGhhc0xvY2FsVGFyYmFsbChuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgbGV0IGxvY2FsU3RyZWFtOiBhbnkgPSBzZWxmLmxvY2FsU3RvcmFnZS5nZXRUYXJiYWxsKG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIGxldCBpc09wZW4gPSBmYWxzZTtcbiAgICAgIGxvY2FsU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpOiBhbnkgPT4ge1xuICAgICAgICBpZiAoaXNPcGVuIHx8IGVyci5zdGF0dXMgIT09IEhUVFBfU1RBVFVTLk5PVF9GT1VORCkge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvY2FsIHJlcG9ydGVkIDQwNCBvciByZXF1ZXN0IHdhcyBhYm9ydGVkIGFscmVhZHlcbiAgICAgICAgaWYgKGxvY2FsU3RyZWFtKSB7XG4gICAgICAgICAgbG9jYWxTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICBsb2NhbFN0cmVhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICAgIGxvY2FsU3RyZWFtLm9uKCdvcGVuJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICBpc09wZW4gPSB0cnVlO1xuICAgICAgICBsb2NhbFN0cmVhbS5hYm9ydCgpO1xuICAgICAgICBsb2NhbFN0cmVhbSA9IG51bGw7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgR2V0IGEgdGFyYmFsbCBmcm9tIGEgc3RvcmFnZSBmb3Ige25hbWV9IHBhY2thZ2VcbiAgIEZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzIGFuZCByZXR1cm5zIGEgUmVhZGFibGVTdHJlYW1cbiAgIEZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGFyYmFsbCBsb2NhbGx5LCBpZiBpdCBmYWlscyB0aGVuIGl0IHJlYWRzIHBhY2thZ2VcbiAgIGluZm9ybWF0aW9uIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hlcmUgd2UgY2FuIGdldCB0aGlzIHRhcmJhbGwgZnJvbVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgfHwgdXBsaW5rIChqdXN0IG9uZSlcbiAgICovXG4gIHB1YmxpYyBnZXRUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBuZXcgUmVhZFRhcmJhbGwoe30pO1xuICAgIHJlYWRTdHJlYW0uYWJvcnQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gaWYgc29tZW9uZSByZXF1ZXN0aW5nIHRhcmJhbGwsIGl0IG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzb21lXG4gICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgaXQsIHNvIGZldGNoaW5nIHBhY2thZ2UgaW5mbyBpcyB1bm5lY2Vzc2FyeVxuXG4gICAgLy8gdHJ5aW5nIGxvY2FsIGZpcnN0XG4gICAgLy8gZmxvdzogc2hvdWxkIGJlIElSZWFkVGFyYmFsbFxuICAgIGxldCBsb2NhbFN0cmVhbTogYW55ID0gc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0VGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gICAgbGV0IGlzT3BlbiA9IGZhbHNlO1xuICAgIGxvY2FsU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpOiBhbnkgPT4ge1xuICAgICAgaWYgKGlzT3BlbiB8fCBlcnIuc3RhdHVzICE9PSBIVFRQX1NUQVRVUy5OT1RfRk9VTkQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2NhbCByZXBvcnRlZCA0MDRcbiAgICAgIGNvbnN0IGVycjQwNCA9IGVycjtcbiAgICAgIGxvY2FsU3RyZWFtLmFib3J0KCk7XG4gICAgICBsb2NhbFN0cmVhbSA9IG51bGw7IC8vIHdlIGZvcmNlIGZvciBnYXJiYWdlIGNvbGxlY3RvclxuICAgICAgc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKG5hbWUsIChlcnIsIGluZm86IFBhY2thZ2UpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKF8uaXNOaWwoZXJyKSAmJiBpbmZvLl9kaXN0ZmlsZXMgJiYgXy5pc05pbChpbmZvLl9kaXN0ZmlsZXNbZmlsZW5hbWVdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZpbGUgZXhpc3RzIGxvY2FsbHlcbiAgICAgICAgICBzZXJ2ZUZpbGUoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gd2Uga25vdyBub3RoaW5nIGFib3V0IHRoaXMgZmlsZSwgdHJ5aW5nIHRvIGdldCBpbmZvcm1hdGlvbiBlbHNld2hlcmVcbiAgICAgICAgICBzZWxmLl9zeW5jVXBsaW5rc01ldGFkYXRhKG5hbWUsIGluZm8sIHt9LCAoZXJyLCBpbmZvOiBQYWNrYWdlKTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmIChfLmlzTmlsKGVycikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfLmlzTmlsKGluZm8uX2Rpc3RmaWxlcykgfHwgXy5pc05pbChpbmZvLl9kaXN0ZmlsZXNbZmlsZW5hbWVdKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycjQwNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJ2ZUZpbGUoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGxvY2FsU3RyZWFtLm9uKCdjb250ZW50LWxlbmd0aCcsIGZ1bmN0aW9uICh2KTogdm9pZCB7XG4gICAgICByZWFkU3RyZWFtLmVtaXQoJ2NvbnRlbnQtbGVuZ3RoJywgdik7XG4gICAgfSk7XG4gICAgbG9jYWxTdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICBpc09wZW4gPSB0cnVlO1xuICAgICAgbG9jYWxTdHJlYW0ucGlwZShyZWFkU3RyZWFtKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhZFN0cmVhbTtcblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBjYWNoZSBsb2NhbC9yZW1vdGUgcGFja2FnZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZpbGUgZGVmaW5lIHRoZSBwYWNrYWdlIHNoYXBlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2VydmVGaWxlKGZpbGU6IERpc3RGaWxlKTogdm9pZCB7XG4gICAgICBsZXQgdXBsaW5rOiBhbnkgPSBudWxsO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbGlua0lkIGluIHNlbGYudXBsaW5rcykge1xuICAgICAgICBpZiAoaGFzUHJveHlUbyhuYW1lLCB1cGxpbmtJZCwgc2VsZi5jb25maWcucGFja2FnZXMpKSB7XG4gICAgICAgICAgdXBsaW5rID0gc2VsZi51cGxpbmtzW3VwbGlua0lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXBsaW5rID09IG51bGwpIHtcbiAgICAgICAgdXBsaW5rID0gbmV3IFByb3h5U3RvcmFnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgY2FjaGU6IHRydWUsXG4gICAgICAgICAgICBfYXV0b2dlbmVyYXRlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlbGYuY29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzYXZlc3RyZWFtOiBhbnkgPSBudWxsO1xuICAgICAgaWYgKHVwbGluay5jb25maWcuY2FjaGUpIHtcbiAgICAgICAgc2F2ZXN0cmVhbSA9IHNlbGYubG9jYWxTdG9yYWdlLmFkZFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICBsZXQgb25fb3BlbiA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZVxuICAgICAgICBvbl9vcGVuID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgIGNvbnN0IHJzdHJlYW0yID0gdXBsaW5rLmZldGNoVGFyYmFsbChmaWxlLnVybCk7XG4gICAgICAgIHJzdHJlYW0yLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYXZlc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzdHJlYW0yLm9uKCdlbmQnLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcnN0cmVhbTIub24oJ2NvbnRlbnQtbGVuZ3RoJywgZnVuY3Rpb24gKHYpOiB2b2lkIHtcbiAgICAgICAgICByZWFkU3RyZWFtLmVtaXQoJ2NvbnRlbnQtbGVuZ3RoJywgdik7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uZW1pdCgnY29udGVudC1sZW5ndGgnLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByc3RyZWFtMi5waXBlKHJlYWRTdHJlYW0pO1xuICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgIHJzdHJlYW0yLnBpcGUoc2F2ZXN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgIHNhdmVzdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgb25fb3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzYXZlc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgeyBlcnI6IGVyciwgZmlsZU5hbWU6IGZpbGUgfSxcbiAgICAgICAgICAgICdlcnJvciBzYXZpbmcgZmlsZSBAe2ZpbGVOYW1lfTogQHtlcnIubWVzc2FnZX1cXG5Ae2Vyci5zdGFja30nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYXZlc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICBvbl9vcGVuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25fb3BlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgUmV0cmlldmUgYSBwYWNrYWdlIG1ldGFkYXRhIGZvciB7bmFtZX0gcGFja2FnZVxuICAgRnVuY3Rpb24gaW52b2tlcyBsb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZSBhbmQgdXBsaW5rLmdldF9wYWNrYWdlIGZvciBldmVyeVxuICAgdXBsaW5rIHdpdGggcHJveHlfYWNjZXNzIHJpZ2h0cyBhZ2FpbnN0IHtuYW1lfSBhbmQgY29tYmluZXMgcmVzdWx0c1xuICAgaW50byBvbmUganNvbiBvYmplY3RcbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICYmIHVwbGluayAocHJveHlfYWNjZXNzKVxuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcHRpb25zLm5hbWUgUGFja2FnZSBOYW1lXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSAgb3B0aW9ucy5yZXEgRXhwcmVzcyBgcmVxYCBvYmplY3RcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBvcHRpb25zLmtlZXBVcExpbmtEYXRhIGtlZXAgdXAgbGluayBpbmZvIGluIHBhY2thZ2UgbWV0YSwgbGFzdCB1cGRhdGUsIGV0Yy5cbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gb3B0aW9ucy5jYWxsYmFjayBDYWxsYmFjayBmb3IgcmVjZWl2ZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFja2FnZShvcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKG9wdGlvbnMubmFtZSwgKGVyciwgZGF0YSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGVyciAmJiAoIWVyci5zdGF0dXMgfHwgZXJyLnN0YXR1cyA+PSBIVFRQX1NUQVRVUy5JTlRFUk5BTF9FUlJPUikpIHtcbiAgICAgICAgLy8gcmVwb3J0IGludGVybmFsIGVycm9ycyByaWdodCBhd2F5XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N5bmNVcGxpbmtzTWV0YWRhdGEoXG4gICAgICAgIG9wdGlvbnMubmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgeyByZXE6IG9wdGlvbnMucmVxLCB1cGxpbmtzTG9vazogb3B0aW9ucy51cGxpbmtzTG9vayB9LFxuICAgICAgICBmdW5jdGlvbiBnZXRQYWNrYWdlU3luVXBMaW5rc0NhbGxiYWNrKGVyciwgcmVzdWx0OiBQYWNrYWdlLCB1cGxpbmtFcnJvcnMpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vcm1hbGl6ZURpc3RUYWdzKGNsZWFuVXBMaW5rc1JlZihvcHRpb25zLmtlZXBVcExpbmtEYXRhLCByZXN1bHQpKTtcblxuICAgICAgICAgIC8vIG5wbSBjYW4gdGhyb3cgaWYgdGhpcyBmaWVsZCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgcmVzdWx0Ll9hdHRhY2htZW50cyA9IHt9O1xuICAgICAgICAgIGlmIChvcHRpb25zLmFiYnJldmlhdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKG51bGwsIGNvbnZlcnRBYmJyZXZpYXRlZE1hbmlmZXN0KHJlc3VsdCksIHVwbGlua0Vycm9ycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2sobnVsbCwgcmVzdWx0LCB1cGxpbmtFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgUmV0cmlldmUgcmVtb3RlIGFuZCBsb2NhbCBwYWNrYWdlcyBtb3JlIHJlY2VudCB0aGFuIHtzdGFydGtleX1cbiAgIEZ1bmN0aW9uIHN0cmVhbXMgYWxsIHBhY2thZ2VzIGZyb20gYWxsIHVwbGlua3MgZmlyc3QsIGFuZCB0aGVuXG4gICBsb2NhbCBwYWNrYWdlcy5cbiAgIE5vdGUgdGhhdCBsb2NhbCBwYWNrYWdlcyBjb3VsZCBvdmVycmlkZSByZWdpc3RyeSBvbmVzIGp1c3QgYmVjYXVzZVxuICAgdGhleSBhcHBlYXIgaW4gSlNPTiBsYXN0LiBUaGF0J3MgYSB0cmFkZS1vZmYgd2UgbWFrZSB0byBhdm9pZFxuICAgbWVtb3J5IGlzc3Vlcy5cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICYmIHVwbGluayAocHJveHlfYWNjZXNzKVxuICAgKiBAcGFyYW0geyp9IHN0YXJ0a2V5XG4gICAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtTdHJlYW19XG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHN0YXJ0a2V5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNlYXJjaFN0cmVhbTogYW55ID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudXBsaW5rcyksXG4gICAgICBmdW5jdGlvbiAodXBfbmFtZSwgY2IpOiB2b2lkIHtcbiAgICAgICAgLy8gc2hvcnRjdXQ6IGlmIGBsb2NhbD0xYCBpcyBzdXBwbGllZCwgZG9uJ3QgY2FsbCB1cGxpbmtzXG4gICAgICAgIGlmIChvcHRpb25zLnJlcT8ucXVlcnk/LmxvY2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgc2VhcmNoIGZvciB1cGxpbmsgJHt1cF9uYW1lfWApO1xuICAgICAgICAvLyBzZWFyY2ggYnkga2V5d29yZCBmb3IgZWFjaCB1cGxpbmtcbiAgICAgICAgY29uc3QgdXBsaW5rU3RyZWFtID0gc2VsZi51cGxpbmtzW3VwX25hbWVdLnNlYXJjaChvcHRpb25zKTtcbiAgICAgICAgLy8gam9pbiB1cGxpbmsgc3RyZWFtIHdpdGggc3RyZWFtcyBQYXNzVGhyb3VnaFxuICAgICAgICB1cGxpbmtTdHJlYW0ucGlwZShzZWFyY2hTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgdXBsaW5rU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcih7IGVycjogZXJyIH0sICd1cGxpbmsgZXJyb3I6IEB7ZXJyLm1lc3NhZ2V9Jyk7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVwbGlua1N0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgLy8gdG8gYXZvaWQgY2FsbCBjYWxsYmFjayBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCk6IHZvaWQge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlYXJjaFN0cmVhbS5hYm9ydCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBpZiAodXBsaW5rU3RyZWFtLmFib3J0KSB7XG4gICAgICAgICAgICB1cGxpbmtTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAvLyBleGVjdXRlZCBhZnRlciBhbGwgc2VyaWVzXG4gICAgICBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIC8vIGF0dGFjaCBhIGxvY2FsIHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGNvbnN0IGxvY2FsU2VhcmNoU3RyZWFtID0gc2VsZi5sb2NhbFN0b3JhZ2Uuc2VhcmNoKHN0YXJ0a2V5LCBvcHRpb25zKTtcbiAgICAgICAgc2VhcmNoU3RyZWFtLmFib3J0ID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLmFib3J0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLnBpcGUoc2VhcmNoU3RyZWFtLCB7IGVuZDogdHJ1ZSB9KTtcbiAgICAgICAgbG9jYWxTZWFyY2hTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycjogYW55KTogdm9pZCB7XG4gICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoeyBlcnI6IGVyciB9LCAnc2VhcmNoIGVycm9yOiBAe2Vyci5tZXNzYWdlfScpO1xuICAgICAgICAgIHNlYXJjaFN0cmVhbS5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBzZWFyY2hTdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb25seSBwcml2YXRlIGxvY2FsIHBhY2thZ2VzXG4gICAqIEBwYXJhbSB7Kn0gY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbERhdGFiYXNlKGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnN0b3JhZ2VQbHVnaW4uZ2V0KChlcnIsIGxvY2Fscyk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlczogVmVyc2lvbltdID0gW107XG4gICAgICBjb25zdCBnZXRQYWNrYWdlID0gZnVuY3Rpb24gKGl0ZW1Qa2cpOiB2b2lkIHtcbiAgICAgICAgc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKFxuICAgICAgICAgIGxvY2Fsc1tpdGVtUGtnXSxcbiAgICAgICAgICBmdW5jdGlvbiAoZXJyLCBwa2dNZXRhZGF0YTogUGFja2FnZSk6IHZvaWQge1xuICAgICAgICAgICAgaWYgKF8uaXNOaWwoZXJyKSkge1xuICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBwa2dNZXRhZGF0YVtESVNUX1RBR1NdLmxhdGVzdDtcbiAgICAgICAgICAgICAgaWYgKGxhdGVzdCAmJiBwa2dNZXRhZGF0YS52ZXJzaW9uc1tsYXRlc3RdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogVmVyc2lvbiA9IHBrZ01ldGFkYXRhLnZlcnNpb25zW2xhdGVzdF07XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZUxpc3QgPSBwa2dNZXRhZGF0YS50aW1lIGFzIEdlbmVyaWNCb2R5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lTGlzdFtsYXRlc3RdO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB2ZXJzaW9uLnRpbWUgPSB0aW1lO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGZvciBzdGFycyBhcGlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdmVyc2lvbi51c2VycyA9IHBrZ01ldGFkYXRhLnVzZXJzO1xuXG4gICAgICAgICAgICAgICAgcGFja2FnZXMucHVzaCh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgeyBwYWNrYWdlOiBsb2NhbHNbaXRlbVBrZ10gfSxcbiAgICAgICAgICAgICAgICAgICdwYWNrYWdlIEB7cGFja2FnZX0gZG9lcyBub3QgaGF2ZSBhIFwibGF0ZXN0XCIgdGFnPydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpdGVtUGtnID49IGxvY2Fscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHBhY2thZ2VzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGdldFBhY2thZ2UoaXRlbVBrZyArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChsb2NhbHMubGVuZ3RoKSB7XG4gICAgICAgIGdldFBhY2thZ2UoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBbXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gZmV0Y2hlcyBwYWNrYWdlIG1ldGFkYXRhIGZyb20gdXBsaW5rcyBhbmQgc3luY2hyb25pemVzIGl0IHdpdGggbG9jYWwgZGF0YVxuICAgaWYgcGFja2FnZSBpcyBhdmFpbGFibGUgbG9jYWxseSwgaXQgTVVTVCBiZSBwcm92aWRlZCBpbiBwa2dpbmZvXG4gICByZXR1cm5zIGNhbGxiYWNrKGVyciwgcmVzdWx0LCB1cGxpbmtfZXJyb3JzKVxuICAgKi9cbiAgcHVibGljIF9zeW5jVXBsaW5rc01ldGFkYXRhKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlSW5mbzogTWFuaWZlc3QsXG4gICAgb3B0aW9uczogSVN5bmNVcGxpbmtzLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFja1xuICApOiB2b2lkIHtcbiAgICBsZXQgZm91bmQgPSB0cnVlO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHVwTGlua3M6IFByb3h5U3RvcmFnZVtdID0gW107XG4gICAgY29uc3QgaGFzVG9Mb29rSW50b1VwbGlua3MgPSBfLmlzTmlsKG9wdGlvbnMudXBsaW5rc0xvb2spIHx8IG9wdGlvbnMudXBsaW5rc0xvb2s7XG5cbiAgICBpZiAoIXBhY2thZ2VJbmZvKSB7XG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgcGFja2FnZUluZm8gPSBnZW5lcmF0ZVBhY2thZ2VUZW1wbGF0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHVwbGluayBpbiB0aGlzLnVwbGlua3MpIHtcbiAgICAgIGlmIChoYXNQcm94eVRvKG5hbWUsIHVwbGluaywgdGhpcy5jb25maWcucGFja2FnZXMpICYmIGhhc1RvTG9va0ludG9VcGxpbmtzKSB7XG4gICAgICAgIHVwTGlua3MucHVzaCh0aGlzLnVwbGlua3NbdXBsaW5rXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMubWFwKFxuICAgICAgdXBMaW5rcyxcbiAgICAgICh1cExpbms6IFByb3h5U3RvcmFnZSwgY2IpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdXBMaW5rTWV0YSA9IHBhY2thZ2VJbmZvLl91cGxpbmtzW3VwTGluay51cG5hbWVdO1xuXG4gICAgICAgIGlmIChpc09iamVjdCh1cExpbmtNZXRhKSkge1xuICAgICAgICAgIGNvbnN0IGZldGNoZWQgPSB1cExpbmtNZXRhLmZldGNoZWQ7XG5cbiAgICAgICAgICBpZiAoZmV0Y2hlZCAmJiBEYXRlLm5vdygpIC0gZmV0Y2hlZCA8IHVwTGluay5tYXhhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9vcHRpb25zLmV0YWcgPSB1cExpbmtNZXRhLmV0YWc7XG4gICAgICAgIH1cblxuICAgICAgICB1cExpbmsuZ2V0UmVtb3RlTWV0YWRhdGEobmFtZSwgX29wdGlvbnMsIChlcnIsIHVwTGlua1Jlc3BvbnNlLCBlVGFnKTogdm9pZCA9PiB7XG4gICAgICAgICAgaWYgKGVyciAmJiBlcnIucmVtb3RlU3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHVwTGlua01ldGEuZmV0Y2hlZCA9IERhdGUubm93KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVyciB8fCAhdXBMaW5rUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBbZXJyIHx8IEVycm9yQ29kZS5nZXRJbnRlcm5hbEVycm9yKCdubyBkYXRhJyldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXBMaW5rUmVzcG9uc2UgPSB2YWxpZGF0aW9uVXRpbHMubm9ybWFsaXplTWV0YWRhdGEodXBMaW5rUmVzcG9uc2UsIG5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWI6ICdvdXQnLFxuICAgICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAncGFja2FnZS5qc29uIHZhbGlkYXRpbmcgZXJyb3IgQHshZXJyLm1lc3NhZ2V9XFxuQHtlcnIuc3RhY2t9J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBbZXJyXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFja2FnZUluZm8uX3VwbGlua3NbdXBMaW5rLnVwbmFtZV0gPSB7XG4gICAgICAgICAgICBldGFnOiBlVGFnLFxuICAgICAgICAgICAgZmV0Y2hlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcGFja2FnZUluZm8gPSBtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwocGFja2FnZUluZm8sIHVwTGlua1Jlc3BvbnNlKTtcblxuICAgICAgICAgIHVwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rKHVwTGlua1Jlc3BvbnNlLnZlcnNpb25zLCB1cExpbmspO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1lcmdlVmVyc2lvbnMocGFja2FnZUluZm8sIHVwTGlua1Jlc3BvbnNlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3ViOiAnb3V0JyxcbiAgICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbiBwYXJzaW5nIGVycm9yIEB7IWVyci5tZXNzYWdlfVxcbkB7ZXJyLnN0YWNrfSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgW2Vycl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIHdlIGdvdCB0byB0aGlzIHBvaW50LCBhc3N1bWUgdGhhdCB0aGUgY29ycmVjdCBwYWNrYWdlIGV4aXN0c1xuICAgICAgICAgIC8vIG9uIHRoZSB1cGxpbmtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKGVycjogRXJyb3IsIHVwTGlua3NFcnJvcnM6IGFueSk6IEFzeW5jUmVzdWx0QXJyYXlDYWxsYmFjazx1bmtub3duLCBFcnJvcj4gPT4ge1xuICAgICAgICBhc3NlcnQoIWVyciAmJiBBcnJheS5pc0FycmF5KHVwTGlua3NFcnJvcnMpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgY29ubmVjdGlvbiB0aW1lb3V0IG9yIHJlc2V0IGVycm9ycyB3aXRoIHVwbGluayhzKVxuICAgICAgICAvLyAodGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgcGFja2FnZSBub3QgYmVpbmcgZm91bmQpXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICBsZXQgdXBsaW5rVGltZW91dEVycm9yO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBMaW5rc0Vycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHVwTGlua3NFcnJvcnNbaV0pIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB1cExpbmtzRXJyb3JzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwTGlua3NFcnJvcnNbaV1bal0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB1cExpbmtzRXJyb3JzW2ldW2pdLmNvZGU7XG4gICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ0VUSU1FRE9VVCcgfHwgY29kZSA9PT0gJ0VTT0NLRVRUSU1FRE9VVCcgfHwgY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbGlua1RpbWVvdXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1cGxpbmtUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvckNvZGUuZ2V0U2VydmljZVVuYXZhaWxhYmxlKCksIG51bGwsIHVwTGlua3NFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRXJyb3JDb2RlLmdldE5vdEZvdW5kKEFQSV9FUlJPUi5OT19QQUNLQUdFKSwgbnVsbCwgdXBMaW5rc0Vycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBMaW5rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcGFja2FnZUluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5sb2NhbFN0b3JhZ2UudXBkYXRlVmVyc2lvbnMoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBwYWNrYWdlSW5mbyxcbiAgICAgICAgICBhc3luYyAoZXJyLCBwYWNrYWdlSnNvbkxvY2FsOiBQYWNrYWdlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBbnkgZXJyb3IgaGVyZSB3aWxsIGNhdXNlIGEgNDA0LCBsaWtlIGFuIHVwbGluayBlcnJvci4gVGhpcyBpcyBsaWtlbHkgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvXG4gICAgICAgICAgICAvLyBhcyBhIGJyb2tlbiBmaWx0ZXIgaXMgYSBzZWN1cml0eSByaXNrLlxuICAgICAgICAgICAgY29uc3QgZmlsdGVyRXJyb3JzOiBFcnJvcltdID0gW107XG4gICAgICAgICAgICAvLyBUaGlzIE1VU1QgYmUgZG9uZSBzZXJpYWxseSBhbmQgbm90IGluIHBhcmFsbGVsIGFzIHRoZXkgbW9kaWZ5IHBhY2thZ2VKc29uTG9jYWxcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHNlbGYuZmlsdGVycyA/PyBbXSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRoZXNlIGZpbHRlcnMgY2FuIGFzc3VtZSBpdCdzIHNhdmUgdG8gbW9kaWZ5IHBhY2thZ2VKc29uTG9jYWwgYW5kIHJldHVybiBpdCBkaXJlY3RseSBmb3JcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSAoaS5lLiBuZWVkIG5vdCBiZSBwdXJlKVxuICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uTG9jYWwgPSBhd2FpdCBmaWx0ZXIuZmlsdGVyX21ldGFkYXRhKHBhY2thZ2VKc29uTG9jYWwpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgICAgIGZpbHRlckVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHBhY2thZ2VKc29uTG9jYWwsIF8uY29uY2F0KHVwTGlua3NFcnJvcnMsIGZpbHRlckVycm9ycykpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGhpZGRlbiB2YWx1ZSBmb3IgZWFjaCB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge0FycmF5fSB2ZXJzaW9ucyBsaXN0IG9mIHZlcnNpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHVwTGluayB1cGxpbmsgbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHVibGljIF91cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayh2ZXJzaW9uczogVmVyc2lvbnMsIHVwTGluazogUHJveHlTdG9yYWdlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpIGluIHZlcnNpb25zKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZlcnNpb25zLCBpKSkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbnNbaV07XG5cbiAgICAgICAgLy8gaG9sZHMgYSBcImhpZGRlblwiIHZhbHVlIHRvIGJlIHVzZWQgYnkgdGhlIHBhY2thZ2Ugc3RvcmFnZS5cbiAgICAgICAgdmVyc2lvbltTeW1ib2wuZm9yKCdfX3ZlcmRhY2Npb191cGxpbmsnKV0gPSB1cExpbmsudXBuYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxtQkFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsY0FBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBVixPQUFBO0FBZUEsSUFBQVcsT0FBQSxHQUFBWCxPQUFBO0FBRUEsSUFBQVksVUFBQSxH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
676
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmMiLCJfZGVidWciLCJfbG9kYXNoIiwiX3N0cmVhbSIsIl9jb25maWciLCJfY29yZSIsIl9sb2FkZXJzIiwiX2xvY2FsU3RvcmFnZUxlZ2FjeSIsIl9zZWFyY2hJbmRleGVyIiwiX3N0cmVhbXMiLCJfbG9nZ2VyIiwiX2NvbnN0YW50cyIsIl9sb2NhbFN0b3JhZ2UiLCJfbWV0YWRhdGFVdGlscyIsIl9zdG9yYWdlVXRpbHMiLCJfdXBTdG9yYWdlIiwiX3VwbGlua1V0aWwiLCJfdXRpbHMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImJ1aWxkRGVidWciLCJTdG9yYWdlIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJ1cGxpbmtzIiwic2V0dXBVcExpbmtzIiwibG9nZ2VyIiwibG9jYWxTdG9yYWdlIiwiaW5pdCIsImZpbHRlcnMiLCJzdG9yYWdlSW5zdGFuY2UiLCJsb2FkU3RvcmFnZSIsIkxvY2FsU3RvcmFnZSIsImdldFNlY3JldCIsImFzeW5jTG9hZFBsdWdpbiIsInBsdWdpbiIsImZpbHRlcl9tZXRhZGF0YSIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiRklMVEVSIiwibGVuZ3RoIiwibG9hZFN0b3JlUGx1Z2luIiwiXyIsImlzTmlsIiwiYXNzZXJ0Iiwic3RvcmFnZSIsIkxvY2FsRGF0YWJhc2VQbHVnaW4iLCJpbmZvIiwibmFtZSIsInBsdWdpbkNhdGVnb3J5IiwiU1RPUkFHRSIsInBsdWdpbnMiLCJzdG9yZSIsImdldFBhY2thZ2VTdG9yYWdlIiwid2FybiIsImhlYWQiLCJhZGRQYWNrYWdlIiwibWV0YWRhdGEiLCJjYWxsYmFjayIsImNoZWNrUGFja2FnZUxvY2FsIiwiY2hlY2tQYWNrYWdlUmVtb3RlIiwiX2lzQWxsb3dQdWJsaXNoT2ZmbGluZSIsIl9zeW5jVXBsaW5rc01ldGFkYXRhIiwiYmluZCIsInB1Ymxpc2hQYWNrYWdlIiwiZXJyIiwicHVibGlzaCIsImlzQm9vbGVhbiIsImFsbG93X29mZmxpbmUiLCJyZWFkVG9rZW5zIiwiZmlsdGVyIiwic2F2ZVRva2VuIiwidG9rZW4iLCJkZWxldGVUb2tlbiIsInVzZXIiLCJ0b2tlbktleSIsImFkZFZlcnNpb24iLCJ2ZXJzaW9uIiwidGFnIiwibWVyZ2VUYWdzIiwidGFnSGFzaCIsImNoYW5nZVBhY2thZ2UiLCJyZXZpc2lvbiIsInJlbW92ZVBhY2thZ2UiLCJTZWFyY2hNZW1vcnlJbmRleGVyIiwicmVtb3ZlIiwiY2F0Y2giLCJyZWFzb24iLCJlcnJvciIsInJlbW92ZVRhcmJhbGwiLCJmaWxlbmFtZSIsImFkZFRhcmJhbGwiLCJoYXNMb2NhbFRhcmJhbGwiLCJzZWxmIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJsb2NhbFN0cmVhbSIsImdldFRhcmJhbGwiLCJpc09wZW4iLCJvbiIsInN0YXR1cyIsIkhUVFBfU1RBVFVTIiwiTk9UX0ZPVU5EIiwiYWJvcnQiLCJyZWFkU3RyZWFtIiwiUmVhZFRhcmJhbGwiLCJfaXNUYXJiYWxsQWxsb3dlZEJ5RmlsdGVycyIsInRoZW4iLCJhbGxvd2VkIiwiZW1pdCIsIkVycm9yQ29kZSIsImdldE5vdEZvdW5kIiwiQVBJX0VSUk9SIiwiTk9fUEFDS0FHRSIsImVycjQwNCIsImxvb2t1cEZyb21VcGxpbmtzIiwic3luY0VyciIsInN5bmNJbmZvIiwiX2Rpc3RmaWxlcyIsInNlcnZlRmlsZSIsImdldFBhY2thZ2VNZXRhZGF0YUFzeW5jIiwidiIsInBpcGUiLCJmaWxlIiwidXBsaW5rIiwidXBsaW5rSWQiLCJoYXNQcm94eVRvIiwicGFja2FnZXMiLCJQcm94eVN0b3JhZ2UiLCJ1cmwiLCJjYWNoZSIsIl9hdXRvZ2VuZXJhdGVkIiwic2F2ZXN0cmVhbSIsIm9uX29wZW4iLCJyc3RyZWFtMiIsImZldGNoVGFyYmFsbCIsImRvbmUiLCJmaWxlTmFtZSIsImdldFBhY2thZ2UiLCJvcHRpb25zIiwiZ2V0UGFja2FnZU1ldGFkYXRhIiwiZGF0YSIsIklOVEVSTkFMX0VSUk9SIiwicmVxIiwidXBsaW5rc0xvb2siLCJnZXRQYWNrYWdlU3luVXBMaW5rc0NhbGxiYWNrIiwicmVzdWx0IiwidXBsaW5rRXJyb3JzIiwibm9ybWFsaXplRGlzdFRhZ3MiLCJjbGVhblVwTGlua3NSZWYiLCJrZWVwVXBMaW5rRGF0YSIsIl9hdHRhY2htZW50cyIsImFiYnJldmlhdGVkIiwiY29udmVydEFiYnJldmlhdGVkTWFuaWZlc3QiLCJzZWFyY2giLCJzdGFydGtleSIsInNlYXJjaFN0cmVhbSIsIlN0cmVhbSIsIlBhc3NUaHJvdWdoIiwib2JqZWN0TW9kZSIsImFzeW5jIiwiZWFjaFNlcmllcyIsIk9iamVjdCIsImtleXMiLCJ1cF9uYW1lIiwiY2IiLCJxdWVyeSIsImxvY2FsIiwidW5kZWZpbmVkIiwidXBsaW5rU3RyZWFtIiwiZW5kIiwibG9jYWxTZWFyY2hTdHJlYW0iLCJnZXRMb2NhbERhdGFiYXNlIiwic3RvcmFnZVBsdWdpbiIsImdldCIsImxvY2FscyIsIl9jb2xsZWN0TG9jYWxQYWNrYWdlcyIsInBrZ01ldGFkYXRhIiwiZmlsdGVyZWRQYWNrYWdlIiwiX2FwcGx5RmlsdGVycyIsImxhdGVzdCIsIkRJU1RfVEFHUyIsInZlcnNpb25zIiwidGltZUxpc3QiLCJ0aW1lIiwidXNlcnMiLCJwdXNoIiwicGFja2FnZSIsInBhY2thZ2VJbmZvIiwiZm91bmQiLCJ1cExpbmtzIiwiaGFzVG9Mb29rSW50b1VwbGlua3MiLCJnZW5lcmF0ZVBhY2thZ2VUZW1wbGF0ZSIsIm1hcCIsInVwTGluayIsIl9vcHRpb25zIiwiYXNzaWduIiwidXBMaW5rTWV0YSIsIl91cGxpbmtzIiwidXBuYW1lIiwiaXNPYmplY3QiLCJmZXRjaGVkIiwiRGF0ZSIsIm5vdyIsIm1heGFnZSIsImV0YWciLCJnZXRSZW1vdGVNZXRhZGF0YSIsInVwTGlua1Jlc3BvbnNlIiwiZVRhZyIsInJlbW90ZVN0YXR1cyIsImdldEludGVybmFsRXJyb3IiLCJ2YWxpZGF0aW9uVXRpbHMiLCJub3JtYWxpemVNZXRhZGF0YSIsInN1YiIsIm1lcmdlVXBsaW5rVGltZUludG9Mb2NhbCIsInVwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rIiwibWVyZ2VWZXJzaW9ucyIsInVwTGlua3NFcnJvcnMiLCJBcnJheSIsImlzQXJyYXkiLCJ1cGxpbmtUaW1lb3V0RXJyb3IiLCJpIiwiaiIsImNvZGUiLCJnZXRTZXJ2aWNlVW5hdmFpbGFibGUiLCJmaWx0ZXJFcnJvcnMiLCJwYWNrYWdlSnNvbkxvY2FsIiwidXBkYXRlVmVyc2lvbnNBc3luYyIsImNvbmNhdCIsInZhbHVlcyIsInNvbWUiLCJkaXN0IiwidGFyYmFsbCIsImVuZHNXaXRoIiwiX3VwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiU3ltYm9sIiwiZm9yIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9zdG9yYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBhc3luYyBmcm9tICdhc3luYyc7XG5pbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFN0cmVhbSBmcm9tICdzdHJlYW0nO1xuXG5pbXBvcnQgeyBoYXNQcm94eVRvIH0gZnJvbSAnQHZlcmRhY2Npby9jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX0NBVEVHT1JZLCBwbHVnaW5VdGlscywgdmFsaWRhdGlvblV0aWxzIH0gZnJvbSAnQHZlcmRhY2Npby9jb3JlJztcbmltcG9ydCB7IGFzeW5jTG9hZFBsdWdpbiB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9hZGVycyc7XG5pbXBvcnQgTG9jYWxEYXRhYmFzZVBsdWdpbiBmcm9tICdAdmVyZGFjY2lvL2xvY2FsLXN0b3JhZ2UtbGVnYWN5JztcbmltcG9ydCB7IFNlYXJjaE1lbW9yeUluZGV4ZXIgfSBmcm9tICdAdmVyZGFjY2lvL3NlYXJjaC1pbmRleGVyJztcbmltcG9ydCB7IFJlYWRUYXJiYWxsIH0gZnJvbSAnQHZlcmRhY2Npby9zdHJlYW1zJztcbmltcG9ydCB7XG4gIENhbGxiYWNrLFxuICBDb25maWcsXG4gIERpc3RGaWxlLFxuICBMb2dnZXIsXG4gIE1hbmlmZXN0LFxuICBNZXJnZVRhZ3MsXG4gIFZlcnNpb24sXG4gIFZlcnNpb25zLFxufSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCB7IEdlbmVyaWNCb2R5LCBUb2tlbiwgVG9rZW5GaWx0ZXIgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IHsgU3RvcmFnZVBsdWdpbkxlZ2FjeSB9IGZyb20gJy4uLy4uL3R5cGVzL2N1c3RvbSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcbmltcG9ydCB7IElQbHVnaW5GaWx0ZXJzLCBJU3luY1VwbGlua3MsIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQVBJX0VSUk9SLCBESVNUX1RBR1MsIEhUVFBfU1RBVFVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IExvY2FsU3RvcmFnZSwgeyBTdG9yYWdlUGx1Z2luIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IG1lcmdlVmVyc2lvbnMgfSBmcm9tICcuL21ldGFkYXRhLXV0aWxzJztcbmltcG9ydCB7XG4gIGNoZWNrUGFja2FnZUxvY2FsLFxuICBjaGVja1BhY2thZ2VSZW1vdGUsXG4gIGNsZWFuVXBMaW5rc1JlZixcbiAgY29udmVydEFiYnJldmlhdGVkTWFuaWZlc3QsXG4gIGdlbmVyYXRlUGFja2FnZVRlbXBsYXRlLFxuICBtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwsXG4gIHB1Ymxpc2hQYWNrYWdlLFxufSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuaW1wb3J0IFByb3h5U3RvcmFnZSBmcm9tICcuL3VwLXN0b3JhZ2UnO1xuaW1wb3J0IHsgc2V0dXBVcExpbmtzLCB1cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayB9IGZyb20gJy4vdXBsaW5rLXV0aWwnO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBpc09iamVjdCwgbm9ybWFsaXplRGlzdFRhZ3MgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgZGVidWcgPSBidWlsZERlYnVnKCd2ZXJkYWNjaW86c3RvcmFnZScpO1xuXG5jbGFzcyBTdG9yYWdlIHtcbiAgcHVibGljIGxvY2FsU3RvcmFnZTogTG9jYWxTdG9yYWdlO1xuICBwdWJsaWMgY29uZmlnOiBDb25maWc7XG4gIHB1YmxpYyBsb2dnZXI6IExvZ2dlcjtcbiAgcHVibGljIHVwbGlua3M6IFJlY29yZDxzdHJpbmcsIFByb3h5U3RvcmFnZT47XG4gIHB1YmxpYyBmaWx0ZXJzOiBJUGx1Z2luRmlsdGVycyB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnVwbGlua3MgPSBzZXR1cFVwTGlua3MoY29uZmlnKTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMubG9jYWxTdG9yYWdlID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0KGNvbmZpZzogQ29uZmlnLCBmaWx0ZXJzPzogSVBsdWdpbkZpbHRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5sb2NhbFN0b3JhZ2UgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICBjb25zdCBzdG9yYWdlSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmxvYWRTdG9yYWdlKGNvbmZpZywgdGhpcy5sb2dnZXIpO1xuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSBuZXcgTG9jYWxTdG9yYWdlKHRoaXMuY29uZmlnLCBsb2dnZXIsIHN0b3JhZ2VJbnN0YW5jZSk7XG4gICAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRTZWNyZXQoY29uZmlnKTtcbiAgICAgIGRlYnVnKCdpbml0aWFsaXphdGlvbiBjb21wbGV0ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ3N0b3JhZ2UgaGFzIGJlZW4gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XG4gICAgICB0aGlzLmZpbHRlcnMgPSBhd2FpdCBhc3luY0xvYWRQbHVnaW48cGx1Z2luVXRpbHMuTWFuaWZlc3RGaWx0ZXI8dW5rbm93bj4+KFxuICAgICAgICB0aGlzLmNvbmZpZy5maWx0ZXJzLFxuICAgICAgICB7XG4gICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICB9LFxuICAgICAgICAocGx1Z2luOiBwbHVnaW5VdGlscy5NYW5pZmVzdEZpbHRlcjxDb25maWc+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBwbHVnaW4uZmlsdGVyX21ldGFkYXRhICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5jb25maWc/LnNlcnZlclNldHRpbmdzPy5wbHVnaW5QcmVmaXgsXG4gICAgICAgIFBMVUdJTl9DQVRFR09SWS5GSUxURVJcbiAgICAgICk7XG4gICAgICBkZWJ1ZygnZmlsdGVycyBhdmFpbGFibGUgJW8nLCB0aGlzLmZpbHRlcnMubGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTdG9yYWdlKGNvbmZpZzogQ29uZmlnLCBsb2dnZXI6IExvZ2dlcik6IFByb21pc2U8U3RvcmFnZVBsdWdpbj4ge1xuICAgIGNvbnN0IFN0b3JhZ2UgPSBhd2FpdCB0aGlzLmxvYWRTdG9yZVBsdWdpbigpO1xuICAgIGlmIChfLmlzTmlsKFN0b3JhZ2UpKSB7XG4gICAgICBhc3NlcnQodGhpcy5jb25maWcuc3RvcmFnZSwgJ0NPTkZJRzogc3RvcmFnZSBwYXRoIG5vdCBkZWZpbmVkJyk7XG4gICAgICBkZWJ1Zygnbm8gY3VzdG9tIHN0b3JhZ2UgZm91bmQsIGxvYWRpbmcgZGVmYXVsdCBzdG9yYWdlIEB2ZXJkYWNjaW8vbG9jYWwtc3RvcmFnZScpO1xuICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IExvY2FsRGF0YWJhc2VQbHVnaW4oY29uZmlnLCBsb2dnZXIpO1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIHsgbmFtZTogJ0B2ZXJkYWNjaW8vbG9jYWwtc3RvcmFnZScsIHBsdWdpbkNhdGVnb3J5OiBQTFVHSU5fQ0FURUdPUlkuU1RPUkFHRSB9LFxuICAgICAgICAncGx1Z2luIEB7bmFtZX0gc3VjY2Vzc2Z1bGx5IGxvYWRlZCAoQHtwbHVnaW5DYXRlZ29yeX0pJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgfVxuICAgIHJldHVybiBTdG9yYWdlIGFzIFN0b3JhZ2VQbHVnaW47XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTdG9yZVBsdWdpbigpOiBQcm9taXNlPFN0b3JhZ2VQbHVnaW5MZWdhY3k8Q29uZmlnPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsdWdpbnM6IFN0b3JhZ2VQbHVnaW5MZWdhY3k8Q29uZmlnPltdID0gYXdhaXQgYXN5bmNMb2FkUGx1Z2luPFxuICAgICAgcGx1Z2luVXRpbHMuU3RvcmFnZTx1bmtub3duPlxuICAgID4oXG4gICAgICB0aGlzLmNvbmZpZy5zdG9yZSxcbiAgICAgIHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIH0sXG4gICAgICAocGx1Z2luKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGx1Z2luLmdldFBhY2thZ2VTdG9yYWdlICE9PSAndW5kZWZpbmVkJztcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5jb25maWc/LnNlcnZlclNldHRpbmdzPy5wbHVnaW5QcmVmaXgsXG4gICAgICBQTFVHSU5fQ0FURUdPUlkuU1RPUkFHRVxuICAgICk7XG5cbiAgICBpZiAocGx1Z2lucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAnbW9yZSB0aGFuIG9uZSBzdG9yYWdlIHBsdWdpbnMgaGFzIGJlZW4gZGV0ZWN0ZWQsIG11bHRpcGxlIHN0b3JhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQsIG9uZSB3aWxsIGJlIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHknXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBfLmhlYWQocGx1Z2lucyk7XG4gIH1cblxuICAvKipcbiAgICogIEFkZCBhIHtuYW1lfSBwYWNrYWdlIHRvIGEgc3lzdGVtXG4gICBGdW5jdGlvbiBjaGVja3MgaWYgcGFja2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgYXZhaWxhYmxlIGZyb20gdXBsaW5rcy5cbiAgIElmIGl0IGlzbid0LCB3ZSBjcmVhdGUgcGFja2FnZSBsb2NhbGx5XG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpICYmIHVwbGlua3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKG5hbWU6IHN0cmluZywgbWV0YWRhdGE6IGFueSwgY2FsbGJhY2s6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VMb2NhbChuYW1lLCB0aGlzLmxvY2FsU3RvcmFnZSk7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VSZW1vdGUoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRoaXMuX2lzQWxsb3dQdWJsaXNoT2ZmbGluZSgpLFxuICAgICAgICB0aGlzLl9zeW5jVXBsaW5rc01ldGFkYXRhLmJpbmQodGhpcylcbiAgICAgICk7XG4gICAgICBhd2FpdCBwdWJsaXNoUGFja2FnZShuYW1lLCBtZXRhZGF0YSwgdGhpcy5sb2NhbFN0b3JhZ2UpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc0FsbG93UHVibGlzaE9mZmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB0aGlzLmNvbmZpZy5wdWJsaXNoICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgXy5pc0Jvb2xlYW4odGhpcy5jb25maWcucHVibGlzaC5hbGxvd19vZmZsaW5lKSAmJlxuICAgICAgdGhpcy5jb25maWcucHVibGlzaC5hbGxvd19vZmZsaW5lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVG9rZW5zKGZpbHRlcjogVG9rZW5GaWx0ZXIpOiBQcm9taXNlPFRva2VuW10+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UucmVhZFRva2VucyhmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIHNhdmVUb2tlbih0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2Uuc2F2ZVRva2VuKHRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVUb2tlbih1c2VyOiBzdHJpbmcsIHRva2VuS2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZS5kZWxldGVUb2tlbih1c2VyLCB0b2tlbktleSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IHZlcnNpb24gb2YgcGFja2FnZSB7bmFtZX0gdG8gYSBzeXN0ZW1cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyBhZGRWZXJzaW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IFZlcnNpb24sXG4gICAgdGFnOiBTdHJpbmdWYWx1ZSxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuYWRkVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBtZXRhZGF0YSwgdGFnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVGFncyBhIHBhY2thZ2UgdmVyc2lvbiB3aXRoIGEgcHJvdmlkZWQgdGFnXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgbWVyZ2VUYWdzKG5hbWU6IHN0cmluZywgdGFnSGFzaDogTWVyZ2VUYWdzLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5tZXJnZVRhZ3MobmFtZSwgdGFnSGFzaCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSBhbiBleGlzdGluZyBwYWNrYWdlIChpLmUuIHVucHVibGlzaCBvbmUgdmVyc2lvbilcbiAgIEZ1bmN0aW9uIGNoYW5nZXMgYSBwYWNrYWdlIGluZm8gZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCBhbGwgdXBsaW5rcyB3aXRoIHdyaXRlIGFjY2Vzcy4vXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFja2FnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IE1hbmlmZXN0LFxuICAgIHJldmlzaW9uOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLmNoYW5nZVBhY2thZ2UobmFtZSwgbWV0YWRhdGEsIHJldmlzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFja2FnZSBmcm9tIGEgc3lzdGVtXG4gICBGdW5jdGlvbiByZW1vdmVzIGEgcGFja2FnZSBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYWNrYWdlKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlUGFja2FnZShuYW1lLCBjYWxsYmFjayk7XG4gICAgLy8gdXBkYXRlIHRoZSBpbmRleGVyXG4gICAgU2VhcmNoTWVtb3J5SW5kZXhlci5yZW1vdmUobmFtZSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgZGVidWcoJ2luZGV4ZXIgaGFzIGZhaWxlZCBvbiByZW1vdmUgaXRlbSAlbycsIHJlYXNvbik7XG4gICAgICBsb2dnZXIuZXJyb3IoJ2luZGV4ZXIgaGFzIGZhaWxlZCBvbiByZW1vdmUgaXRlbScpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICBSZW1vdmUgYSB0YXJiYWxsIGZyb20gYSBzeXN0ZW1cbiAgIEZ1bmN0aW9uIHJlbW92ZXMgYSB0YXJiYWxsIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgIFRhcmJhbGwgaW4gcXVlc3Rpb24gc2hvdWxkIG5vdCBiZSBsaW5rZWQgdG8gaW4gYW55IGV4aXN0aW5nXG4gICB2ZXJzaW9ucywgaS5lLiBwYWNrYWdlIHZlcnNpb24gc2hvdWxkIGJlIHVucHVibGlzaGVkIGZpcnN0LlxuICAgVXNlZCBzdG9yYWdlOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVGFyYmFsbChuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIHJldmlzaW9uOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZVRhcmJhbGwobmFtZSwgZmlsZW5hbWUsIHJldmlzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGEgdGFyYmFsbCBmb3Ige25hbWV9IHBhY2thZ2VcbiAgIEZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzIGFuZCByZXR1cm5zIGEgV3JpdGFibGVTdHJlYW1cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyBhZGRUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZS5hZGRUYXJiYWxsKG5hbWUsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNMb2NhbFRhcmJhbGwobmFtZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGxldCBsb2NhbFN0cmVhbTogYW55ID0gc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0VGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gICAgICBsZXQgaXNPcGVuID0gZmFsc2U7XG4gICAgICBsb2NhbFN0cmVhbS5vbignZXJyb3InLCAoZXJyKTogYW55ID0+IHtcbiAgICAgICAgaWYgKGlzT3BlbiB8fCBlcnIuc3RhdHVzICE9PSBIVFRQX1NUQVRVUy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2NhbCByZXBvcnRlZCA0MDQgb3IgcmVxdWVzdCB3YXMgYWJvcnRlZCBhbHJlYWR5XG4gICAgICAgIGlmIChsb2NhbFN0cmVhbSkge1xuICAgICAgICAgIGxvY2FsU3RyZWFtLmFib3J0KCk7XG4gICAgICAgICAgbG9jYWxTdHJlYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBsb2NhbFN0cmVhbS5vbignb3BlbicsIGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgbG9jYWxTdHJlYW0gPSBudWxsO1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgIEdldCBhIHRhcmJhbGwgZnJvbSBhIHN0b3JhZ2UgZm9yIHtuYW1lfSBwYWNrYWdlXG4gICBGdW5jdGlvbiBpcyBzeW5jaHJvbm91cyBhbmQgcmV0dXJucyBhIFJlYWRhYmxlU3RyZWFtXG4gICBGdW5jdGlvbiB0cmllcyB0byByZWFkIHRhcmJhbGwgbG9jYWxseSwgaWYgaXQgZmFpbHMgdGhlbiBpdCByZWFkcyBwYWNrYWdlXG4gICBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXJlIHdlIGNhbiBnZXQgdGhpcyB0YXJiYWxsIGZyb21cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsIHx8IHVwbGluayAoanVzdCBvbmUpXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyYmFsbChuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gbmV3IFJlYWRUYXJiYWxsKHt9KTtcbiAgICByZWFkU3RyZWFtLmFib3J0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGlzIGFsbG93ZWQgYnkgZmlsdGVyIHBsdWdpbnMgYmVmb3JlIHNlcnZpbmcuXG4gICAgLy8gRmlsdGVycyBtYXkgYmxvY2sgc3BlY2lmaWMgdmVyc2lvbnMsIHNvIHdlIHZlcmlmeSB0aGUgdGFyYmFsbCdzIHZlcnNpb25cbiAgICAvLyBzdGlsbCBleGlzdHMgaW4gdGhlIGZpbHRlcmVkIG1ldGFkYXRhLlxuICAgIHRoaXMuX2lzVGFyYmFsbEFsbG93ZWRCeUZpbHRlcnMobmFtZSwgZmlsZW5hbWUpLnRoZW4oYXN5bmMgKGFsbG93ZWQpID0+IHtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgRXJyb3JDb2RlLmdldE5vdEZvdW5kKEFQSV9FUlJPUi5OT19QQUNLQUdFKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdHJ5aW5nIGxvY2FsIGZpcnN0XG4gICAgICBsZXQgbG9jYWxTdHJlYW06IGFueSA9IHNlbGYubG9jYWxTdG9yYWdlLmdldFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICAgICAgbGV0IGlzT3BlbiA9IGZhbHNlO1xuICAgICAgbG9jYWxTdHJlYW0ub24oJ2Vycm9yJywgKGVycik6IGFueSA9PiB7XG4gICAgICAgIGlmIChpc09wZW4gfHwgZXJyLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVMuTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbG9jYWwgcmVwb3J0ZWQgNDA0XG4gICAgICAgIGNvbnN0IGVycjQwNCA9IGVycjtcbiAgICAgICAgbG9jYWxTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgbG9jYWxTdHJlYW0gPSBudWxsOyAvLyB3ZSBmb3JjZSBmb3IgZ2FyYmFnZSBjb2xsZWN0b3JcblxuICAgICAgICBjb25zdCBsb29rdXBGcm9tVXBsaW5rcyA9IChpbmZvOiBNYW5pZmVzdCB8IG51bGwpOiB2b2lkID0+IHtcbiAgICAgICAgICBzZWxmLl9zeW5jVXBsaW5rc01ldGFkYXRhKFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZm8gYXMgTWFuaWZlc3QsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIChzeW5jRXJyLCBzeW5jSW5mbzogTWFuaWZlc3QpOiBhbnkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXy5pc05pbChzeW5jRXJyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIHN5bmNFcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfLmlzTmlsKHN5bmNJbmZvLl9kaXN0ZmlsZXMpIHx8IF8uaXNOaWwoc3luY0luZm8uX2Rpc3RmaWxlc1tmaWxlbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnI0MDQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlcnZlRmlsZShzeW5jSW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZWxmLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGFBc3luYyhuYW1lKS50aGVuKFxuICAgICAgICAgIChpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5mby5fZGlzdGZpbGVzICYmIF8uaXNOaWwoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZmlsZSBleGlzdHMgbG9jYWxseVxuICAgICAgICAgICAgICBzZXJ2ZUZpbGUoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyB3ZSBrbm93IG5vdGhpbmcgYWJvdXQgdGhpcyBmaWxlLCB0cnlpbmcgdG8gZ2V0IGluZm9ybWF0aW9uIGVsc2V3aGVyZVxuICAgICAgICAgICAgICBsb29rdXBGcm9tVXBsaW5rcyhpbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIHdlIGtub3cgbm90aGluZyBhYm91dCB0aGlzIGZpbGUsIHRyeWluZyB0byBnZXQgaW5mb3JtYXRpb24gZWxzZXdoZXJlXG4gICAgICAgICAgICBsb29rdXBGcm9tVXBsaW5rcyhudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGxvY2FsU3RyZWFtLm9uKCdjb250ZW50LWxlbmd0aCcsIGZ1bmN0aW9uICh2KTogdm9pZCB7XG4gICAgICAgIHJlYWRTdHJlYW0uZW1pdCgnY29udGVudC1sZW5ndGgnLCB2KTtcbiAgICAgIH0pO1xuICAgICAgbG9jYWxTdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIGlzT3BlbiA9IHRydWU7XG4gICAgICAgIGxvY2FsU3RyZWFtLnBpcGUocmVhZFN0cmVhbSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZWFkU3RyZWFtO1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIGNhY2hlIGxvY2FsL3JlbW90ZSBwYWNrYWdlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmlsZSBkZWZpbmUgdGhlIHBhY2thZ2Ugc2hhcGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXJ2ZUZpbGUoZmlsZTogRGlzdEZpbGUpOiB2b2lkIHtcbiAgICAgIGxldCB1cGxpbms6IGFueSA9IG51bGw7XG5cbiAgICAgIGZvciAoY29uc3QgdXBsaW5rSWQgaW4gc2VsZi51cGxpbmtzKSB7XG4gICAgICAgIGlmIChoYXNQcm94eVRvKG5hbWUsIHVwbGlua0lkLCBzZWxmLmNvbmZpZy5wYWNrYWdlcykpIHtcbiAgICAgICAgICB1cGxpbmsgPSBzZWxmLnVwbGlua3NbdXBsaW5rSWRdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxpbmsgPT0gbnVsbCkge1xuICAgICAgICB1cGxpbmsgPSBuZXcgUHJveHlTdG9yYWdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVybDogZmlsZS51cmwsXG4gICAgICAgICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgIF9hdXRvZ2VuZXJhdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZi5jb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNhdmVzdHJlYW06IGFueSA9IG51bGw7XG4gICAgICBpZiAodXBsaW5rLmNvbmZpZy5jYWNoZSkge1xuICAgICAgICBzYXZlc3RyZWFtID0gc2VsZi5sb2NhbFN0b3JhZ2UuYWRkVGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBvbl9vcGVuID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlXG4gICAgICAgIG9uX29wZW4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgY29uc3QgcnN0cmVhbTIgPSB1cGxpbmsuZmV0Y2hUYXJiYWxsKGZpbGUudXJsKTtcbiAgICAgICAgcnN0cmVhbTIub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycik6IHZvaWQge1xuICAgICAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgICAgICBzYXZlc3RyZWFtLmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNhdmVzdHJlYW0gPSBudWxsO1xuICAgICAgICAgIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcnN0cmVhbTIub24oJ2VuZCcsIGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5kb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByc3RyZWFtMi5vbignY29udGVudC1sZW5ndGgnLCBmdW5jdGlvbiAodik6IHZvaWQge1xuICAgICAgICAgIHJlYWRTdHJlYW0uZW1pdCgnY29udGVudC1sZW5ndGgnLCB2KTtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5lbWl0KCdjb250ZW50LWxlbmd0aCcsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJzdHJlYW0yLnBpcGUocmVhZFN0cmVhbSk7XG4gICAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgICAgcnN0cmVhbTIucGlwZShzYXZlc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgc2F2ZXN0cmVhbS5vbignb3BlbicsIGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBvbl9vcGVuKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNhdmVzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycik6IHZvaWQge1xuICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICB7IGVycjogZXJyLCBmaWxlTmFtZTogZmlsZSB9LFxuICAgICAgICAgICAgJ2Vycm9yIHNhdmluZyBmaWxlIEB7ZmlsZU5hbWV9OiBAe2Vyci5tZXNzYWdlfVxcbkB7ZXJyLnN0YWNrfSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgICAgICBzYXZlc3RyZWFtLmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNhdmVzdHJlYW0gPSBudWxsO1xuICAgICAgICAgIG9uX29wZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbl9vcGVuKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICBSZXRyaWV2ZSBhIHBhY2thZ2UgbWV0YWRhdGEgZm9yIHtuYW1lfSBwYWNrYWdlXG4gICBGdW5jdGlvbiBpbnZva2VzIGxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlIGFuZCB1cGxpbmsuZ2V0X3BhY2thZ2UgZm9yIGV2ZXJ5XG4gICB1cGxpbmsgd2l0aCBwcm94eV9hY2Nlc3MgcmlnaHRzIGFnYWluc3Qge25hbWV9IGFuZCBjb21iaW5lcyByZXN1bHRzXG4gICBpbnRvIG9uZSBqc29uIG9iamVjdFxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgJiYgdXBsaW5rIChwcm94eV9hY2Nlc3MpXG5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG9wdGlvbnMubmFtZSBQYWNrYWdlIE5hbWVcbiAgICogQHByb3BlcnR5IHtvYmplY3R9ICBvcHRpb25zLnJlcSBFeHByZXNzIGByZXFgIG9iamVjdFxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdGlvbnMua2VlcFVwTGlua0RhdGEga2VlcCB1cCBsaW5rIGluZm8gaW4gcGFja2FnZSBtZXRhLCBsYXN0IHVwZGF0ZSwgZXRjLlxuICAgKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBvcHRpb25zLmNhbGxiYWNrIENhbGxiYWNrIGZvciByZWNlaXZlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXRQYWNrYWdlKG9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGEob3B0aW9ucy5uYW1lLCAoZXJyLCBkYXRhKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXJyICYmICghZXJyLnN0YXR1cyB8fCBlcnIuc3RhdHVzID49IEhUVFBfU1RBVFVTLklOVEVSTkFMX0VSUk9SKSkge1xuICAgICAgICAvLyByZXBvcnQgaW50ZXJuYWwgZXJyb3JzIHJpZ2h0IGF3YXlcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3luY1VwbGlua3NNZXRhZGF0YShcbiAgICAgICAgb3B0aW9ucy5uYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7IHJlcTogb3B0aW9ucy5yZXEsIHVwbGlua3NMb29rOiBvcHRpb25zLnVwbGlua3NMb29rIH0sXG4gICAgICAgIGZ1bmN0aW9uIGdldFBhY2thZ2VTeW5VcExpbmtzQ2FsbGJhY2soZXJyLCByZXN1bHQ6IE1hbmlmZXN0LCB1cGxpbmtFcnJvcnMpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vcm1hbGl6ZURpc3RUYWdzKGNsZWFuVXBMaW5rc1JlZihvcHRpb25zLmtlZXBVcExpbmtEYXRhLCByZXN1bHQpKTtcblxuICAgICAgICAgIC8vIG5wbSBjYW4gdGhyb3cgaWYgdGhpcyBmaWVsZCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgcmVzdWx0Ll9hdHRhY2htZW50cyA9IHt9O1xuICAgICAgICAgIGlmIChvcHRpb25zLmFiYnJldmlhdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKG51bGwsIGNvbnZlcnRBYmJyZXZpYXRlZE1hbmlmZXN0KHJlc3VsdCksIHVwbGlua0Vycm9ycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2sobnVsbCwgcmVzdWx0LCB1cGxpbmtFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgUmV0cmlldmUgcmVtb3RlIGFuZCBsb2NhbCBwYWNrYWdlcyBtb3JlIHJlY2VudCB0aGFuIHtzdGFydGtleX1cbiAgIEZ1bmN0aW9uIHN0cmVhbXMgYWxsIHBhY2thZ2VzIGZyb20gYWxsIHVwbGlua3MgZmlyc3QsIGFuZCB0aGVuXG4gICBsb2NhbCBwYWNrYWdlcy5cbiAgIE5vdGUgdGhhdCBsb2NhbCBwYWNrYWdlcyBjb3VsZCBvdmVycmlkZSByZWdpc3RyeSBvbmVzIGp1c3QgYmVjYXVzZVxuICAgdGhleSBhcHBlYXIgaW4gSlNPTiBsYXN0LiBUaGF0J3MgYSB0cmFkZS1vZmYgd2UgbWFrZSB0byBhdm9pZFxuICAgbWVtb3J5IGlzc3Vlcy5cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICYmIHVwbGluayAocHJveHlfYWNjZXNzKVxuICAgKiBAcGFyYW0geyp9IHN0YXJ0a2V5XG4gICAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtTdHJlYW19XG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHN0YXJ0a2V5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNlYXJjaFN0cmVhbTogYW55ID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudXBsaW5rcyksXG4gICAgICBmdW5jdGlvbiAodXBfbmFtZSwgY2IpOiB2b2lkIHtcbiAgICAgICAgLy8gc2hvcnRjdXQ6IGlmIGBsb2NhbD0xYCBpcyBzdXBwbGllZCwgZG9uJ3QgY2FsbCB1cGxpbmtzXG4gICAgICAgIGlmIChvcHRpb25zLnJlcT8ucXVlcnk/LmxvY2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgc2VhcmNoIGZvciB1cGxpbmsgJHt1cF9uYW1lfWApO1xuICAgICAgICAvLyBzZWFyY2ggYnkga2V5d29yZCBmb3IgZWFjaCB1cGxpbmtcbiAgICAgICAgY29uc3QgdXBsaW5rU3RyZWFtID0gc2VsZi51cGxpbmtzW3VwX25hbWVdLnNlYXJjaChvcHRpb25zKTtcbiAgICAgICAgLy8gam9pbiB1cGxpbmsgc3RyZWFtIHdpdGggc3RyZWFtcyBQYXNzVGhyb3VnaFxuICAgICAgICB1cGxpbmtTdHJlYW0ucGlwZShzZWFyY2hTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgdXBsaW5rU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcih7IGVycjogZXJyIH0sICd1cGxpbmsgZXJyb3I6IEB7ZXJyLm1lc3NhZ2V9Jyk7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVwbGlua1N0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgLy8gdG8gYXZvaWQgY2FsbCBjYWxsYmFjayBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCk6IHZvaWQge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlYXJjaFN0cmVhbS5hYm9ydCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBpZiAodXBsaW5rU3RyZWFtLmFib3J0KSB7XG4gICAgICAgICAgICB1cGxpbmtTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAvLyBleGVjdXRlZCBhZnRlciBhbGwgc2VyaWVzXG4gICAgICBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIC8vIGF0dGFjaCBhIGxvY2FsIHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGNvbnN0IGxvY2FsU2VhcmNoU3RyZWFtID0gc2VsZi5sb2NhbFN0b3JhZ2Uuc2VhcmNoKHN0YXJ0a2V5LCBvcHRpb25zKTtcbiAgICAgICAgc2VhcmNoU3RyZWFtLmFib3J0ID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLmFib3J0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLnBpcGUoc2VhcmNoU3RyZWFtLCB7IGVuZDogdHJ1ZSB9KTtcbiAgICAgICAgbG9jYWxTZWFyY2hTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycjogYW55KTogdm9pZCB7XG4gICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoeyBlcnI6IGVyciB9LCAnc2VhcmNoIGVycm9yOiBAe2Vyci5tZXNzYWdlfScpO1xuICAgICAgICAgIHNlYXJjaFN0cmVhbS5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBzZWFyY2hTdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb25seSBwcml2YXRlIGxvY2FsIHBhY2thZ2VzXG4gICAqIEBwYXJhbSB7Kn0gY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbERhdGFiYXNlKGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnN0b3JhZ2VQbHVnaW4uZ2V0KChlcnIsIGxvY2Fscyk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29sbGVjdExvY2FsUGFja2FnZXMobG9jYWxzKS50aGVuKFxuICAgICAgICAocGFja2FnZXMpID0+IGNhbGxiYWNrKG51bGwsIHBhY2thZ2VzKSxcbiAgICAgICAgKGVycikgPT4gY2FsbGJhY2soZXJyKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGVhY2ggbG9jYWwgcGFja2FnZSBuYW1lLCBhcHBseSBmaWx0ZXJzLCBhbmQgY29sbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jb2xsZWN0TG9jYWxQYWNrYWdlcyhsb2NhbHM6IHN0cmluZ1tdKTogUHJvbWlzZTxWZXJzaW9uW10+IHtcbiAgICBjb25zdCBwYWNrYWdlczogVmVyc2lvbltdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGxvY2Fscykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnTWV0YWRhdGEgPSBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGFBc3luYyhuYW1lKTtcbiAgICAgICAgY29uc3QgeyBmaWx0ZXJlZFBhY2thZ2UgfSA9IGF3YWl0IHRoaXMuX2FwcGx5RmlsdGVycyhwa2dNZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IGxhdGVzdCA9IGZpbHRlcmVkUGFja2FnZVtESVNUX1RBR1NdPy5sYXRlc3Q7XG4gICAgICAgIGlmIChsYXRlc3QgJiYgZmlsdGVyZWRQYWNrYWdlLnZlcnNpb25zW2xhdGVzdF0pIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBWZXJzaW9uID0gZmlsdGVyZWRQYWNrYWdlLnZlcnNpb25zW2xhdGVzdF07XG4gICAgICAgICAgY29uc3QgdGltZUxpc3QgPSBmaWx0ZXJlZFBhY2thZ2UudGltZSBhcyBHZW5lcmljQm9keTtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZUxpc3RbbGF0ZXN0XTtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdmVyc2lvbi50aW1lID0gdGltZTtcblxuICAgICAgICAgIC8vIEFkZCBmb3Igc3RhcnMgYXBpXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHZlcnNpb24udXNlcnMgPSBmaWx0ZXJlZFBhY2thZ2UudXNlcnM7XG5cbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKHZlcnNpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oeyBwYWNrYWdlOiBuYW1lIH0sICdwYWNrYWdlIEB7cGFja2FnZX0gZG9lcyBub3QgaGF2ZSBhIFwibGF0ZXN0XCIgdGFnPycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoeyBlcnIsIHBhY2thZ2U6IG5hbWUgfSwgJ2Vycm9yIHJlYWRpbmcgcGFja2FnZSBAe3BhY2thZ2V9Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYWNrYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmZXRjaGVzIHBhY2thZ2UgbWV0YWRhdGEgZnJvbSB1cGxpbmtzIGFuZCBzeW5jaHJvbml6ZXMgaXQgd2l0aCBsb2NhbCBkYXRhXG4gICBpZiBwYWNrYWdlIGlzIGF2YWlsYWJsZSBsb2NhbGx5LCBpdCBNVVNUIGJlIHByb3ZpZGVkIGluIHBrZ2luZm9cbiAgIHJldHVybnMgY2FsbGJhY2soZXJyLCByZXN1bHQsIHVwbGlua19lcnJvcnMpXG4gICAqL1xuICBwdWJsaWMgX3N5bmNVcGxpbmtzTWV0YWRhdGEoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VJbmZvOiBNYW5pZmVzdCxcbiAgICBvcHRpb25zOiBJU3luY1VwbGlua3MsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrXG4gICk6IHZvaWQge1xuICAgIGxldCBmb3VuZCA9IHRydWU7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgdXBMaW5rczogUHJveHlTdG9yYWdlW10gPSBbXTtcbiAgICBjb25zdCBoYXNUb0xvb2tJbnRvVXBsaW5rcyA9IF8uaXNOaWwob3B0aW9ucy51cGxpbmtzTG9vaykgfHwgb3B0aW9ucy51cGxpbmtzTG9vaztcblxuICAgIGlmICghcGFja2FnZUluZm8pIHtcbiAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICBwYWNrYWdlSW5mbyA9IGdlbmVyYXRlUGFja2FnZVRlbXBsYXRlKG5hbWUpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdXBsaW5rIGluIHRoaXMudXBsaW5rcykge1xuICAgICAgaWYgKGhhc1Byb3h5VG8obmFtZSwgdXBsaW5rLCB0aGlzLmNvbmZpZy5wYWNrYWdlcykgJiYgaGFzVG9Mb29rSW50b1VwbGlua3MpIHtcbiAgICAgICAgdXBMaW5rcy5wdXNoKHRoaXMudXBsaW5rc1t1cGxpbmtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYy5tYXAoXG4gICAgICB1cExpbmtzLFxuICAgICAgKHVwTGluazogUHJveHlTdG9yYWdlLCBjYik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1cExpbmtNZXRhID0gcGFja2FnZUluZm8uX3VwbGlua3NbdXBMaW5rLnVwbmFtZV07XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KHVwTGlua01ldGEpKSB7XG4gICAgICAgICAgY29uc3QgZmV0Y2hlZCA9IHVwTGlua01ldGEuZmV0Y2hlZDtcblxuICAgICAgICAgIGlmIChmZXRjaGVkICYmIERhdGUubm93KCkgLSBmZXRjaGVkIDwgdXBMaW5rLm1heGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX29wdGlvbnMuZXRhZyA9IHVwTGlua01ldGEuZXRhZztcbiAgICAgICAgfVxuXG4gICAgICAgIHVwTGluay5nZXRSZW1vdGVNZXRhZGF0YShuYW1lLCBfb3B0aW9ucywgKGVyciwgdXBMaW5rUmVzcG9uc2UsIGVUYWcpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAoZXJyICYmIGVyci5yZW1vdGVTdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgdXBMaW5rTWV0YS5mZXRjaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXJyIHx8ICF1cExpbmtSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIFtlcnIgfHwgRXJyb3JDb2RlLmdldEludGVybmFsRXJyb3IoJ25vIGRhdGEnKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB1cExpbmtSZXNwb25zZSA9IHZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVNZXRhZGF0YSh1cExpbmtSZXNwb25zZSwgbmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1YjogJ291dCcsXG4gICAgICAgICAgICAgICAgZXJyOiBlcnIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdwYWNrYWdlLmpzb24gdmFsaWRhdGluZyBlcnJvciBAeyFlcnIubWVzc2FnZX1cXG5Ae2Vyci5zdGFja30nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIFtlcnJdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYWNrYWdlSW5mby5fdXBsaW5rc1t1cExpbmsudXBuYW1lXSA9IHtcbiAgICAgICAgICAgIGV0YWc6IGVUYWcsXG4gICAgICAgICAgICBmZXRjaGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBwYWNrYWdlSW5mbyA9IG1lcmdlVXBsaW5rVGltZUludG9Mb2NhbChwYWNrYWdlSW5mbywgdXBMaW5rUmVzcG9uc2UpO1xuXG4gICAgICAgICAgdXBkYXRlVmVyc2lvbnNIaWRkZW5VcExpbmsodXBMaW5rUmVzcG9uc2UudmVyc2lvbnMsIHVwTGluayk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWVyZ2VWZXJzaW9ucyhwYWNrYWdlSW5mbywgdXBMaW5rUmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWI6ICdvdXQnLFxuICAgICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAncGFja2FnZS5qc29uIHBhcnNpbmcgZXJyb3IgQHshZXJyLm1lc3NhZ2V9XFxuQHtlcnIuc3RhY2t9J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBbZXJyXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIGFzc3VtZSB0aGF0IHRoZSBjb3JyZWN0IHBhY2thZ2UgZXhpc3RzXG4gICAgICAgICAgLy8gb24gdGhlIHVwbGlua1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBhc3luYyAoZXJyOiBFcnJvciwgdXBMaW5rc0Vycm9yczogYW55KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGFzc2VydCghZXJyICYmIEFycmF5LmlzQXJyYXkodXBMaW5rc0Vycm9ycykpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjb25uZWN0aW9uIHRpbWVvdXQgb3IgcmVzZXQgZXJyb3JzIHdpdGggdXBsaW5rKHMpXG4gICAgICAgIC8vICh0aGVzZSBzaG91bGQgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmcm9tIHRoZSBwYWNrYWdlIG5vdCBiZWluZyBmb3VuZClcbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIGxldCB1cGxpbmtUaW1lb3V0RXJyb3I7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cExpbmtzRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodXBMaW5rc0Vycm9yc1tpXSkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHVwTGlua3NFcnJvcnNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodXBMaW5rc0Vycm9yc1tpXVtqXSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHVwTGlua3NFcnJvcnNbaV1bal0uY29kZTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAnRVRJTUVET1VUJyB8fCBjb2RlID09PSAnRVNPQ0tFVFRJTUVET1VUJyB8fCBjb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsaW5rVGltZW91dEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHVwbGlua1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEVycm9yQ29kZS5nZXRTZXJ2aWNlVW5hdmFpbGFibGUoKSwgbnVsbCwgdXBMaW5rc0Vycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvckNvZGUuZ2V0Tm90Rm91bmQoQVBJX0VSUk9SLk5PX1BBQ0tBR0UpLCBudWxsLCB1cExpbmtzRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cExpbmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyZWRQYWNrYWdlLCBmaWx0ZXJFcnJvcnMgfSA9IGF3YWl0IHNlbGYuX2FwcGx5RmlsdGVycyhcbiAgICAgICAgICAgIHBhY2thZ2VJbmZvIGFzIE1hbmlmZXN0XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgZmlsdGVyZWRQYWNrYWdlLCBmaWx0ZXJFcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbkxvY2FsID0gYXdhaXQgc2VsZi5sb2NhbFN0b3JhZ2UudXBkYXRlVmVyc2lvbnNBc3luYyhuYW1lLCBwYWNrYWdlSW5mbyk7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXJlZFBhY2thZ2UsIGZpbHRlckVycm9ycyB9ID0gYXdhaXQgc2VsZi5fYXBwbHlGaWx0ZXJzKHBhY2thZ2VKc29uTG9jYWwpO1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpbHRlcmVkUGFja2FnZSwgXy5jb25jYXQodXBMaW5rc0Vycm9ycywgZmlsdGVyRXJyb3JzKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmVkIGZpbHRlciBwbHVnaW5zIHRvIGEgcGFja2FnZSBtYW5pZmVzdCBzZXF1ZW50aWFsbHkuXG4gICAqIEVhY2ggZmlsdGVyJ3Mgb3V0cHV0IGlzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgbmV4dCBmaWx0ZXIuXG4gICAqIFJldHVybnMgdGhlIGZpbHRlcmVkIG1hbmlmZXN0IGFuZCBhbnkgZXJyb3JzIHRoYXQgb2NjdXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9hcHBseUZpbHRlcnMoXG4gICAgcGFja2FnZUluZm86IE1hbmlmZXN0XG4gICk6IFByb21pc2U8eyBmaWx0ZXJlZFBhY2thZ2U6IE1hbmlmZXN0OyBmaWx0ZXJFcnJvcnM6IEVycm9yW10gfT4ge1xuICAgIGNvbnN0IGZpbHRlckVycm9yczogRXJyb3JbXSA9IFtdO1xuICAgIGxldCBmaWx0ZXJlZFBhY2thZ2UgPSBwYWNrYWdlSW5mbztcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbHRlcmVkUGFja2FnZSA9IGF3YWl0IGZpbHRlci5maWx0ZXJfbWV0YWRhdGEoZmlsdGVyZWRQYWNrYWdlKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGZpbHRlckVycm9ycy5wdXNoKGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZpbHRlcmVkUGFja2FnZSwgZmlsdGVyRXJyb3JzIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YXJiYWxsIHNob3VsZCBiZSBzZXJ2ZWQgYmFzZWQgb24gZmlsdGVyIHBsdWdpbnMuXG4gICAqIExvb2tzIHVwIHBhY2thZ2UgbWV0YWRhdGEsIGFwcGxpZXMgZmlsdGVycywgYW5kIHZlcmlmaWVzIHRoZSB0YXJiYWxsXG4gICAqIHN0aWxsIGJlbG9uZ3MgdG8gYW4gYWxsb3dlZCB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfaXNUYXJiYWxsQWxsb3dlZEJ5RmlsdGVycyhuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuZmlsdGVycz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnTWV0YWRhdGEgPSBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGFBc3luYyhuYW1lKTtcbiAgICAgIGNvbnN0IHsgZmlsdGVyZWRQYWNrYWdlIH0gPSBhd2FpdCB0aGlzLl9hcHBseUZpbHRlcnMocGtnTWV0YWRhdGEpO1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZmlsdGVyZWRQYWNrYWdlLnZlcnNpb25zIHx8IHt9KS5zb21lKCh2ZXJzaW9uKSA9PlxuICAgICAgICAodmVyc2lvbiBhcyBWZXJzaW9uKS5kaXN0Py50YXJiYWxsPy5lbmRzV2l0aCgnLycgKyBmaWxlbmFtZSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnI/LnN0YXR1cyA9PT0gSFRUUF9TVEFUVVMuTk9UX0ZPVU5EKSB7XG4gICAgICAgIC8vIFBhY2thZ2Ugbm90IHlldCBjYWNoZWQgbG9jYWxseSDigJQgdGhlIHJlcXVlc3Qgd2lsbCBmYWxsIHRocm91Z2ggdG8gdXBsaW5rcy5cbiAgICAgICAgZGVidWcoJ3BhY2thZ2UgJW8gbm90IGNhY2hlZCBsb2NhbGx5LCBza2lwcGluZyB0YXJiYWxsIGZpbHRlciBjaGVjaycsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgeyBwYWNrYWdlOiBuYW1lLCBmaWxlTmFtZTogZmlsZW5hbWUsIGVyciB9LFxuICAgICAgICAgICdlcnJvciBjaGVja2luZyBmaWx0ZXJzIGZvciB0YXJiYWxsIEB7ZmlsZU5hbWV9IG9mIHBhY2thZ2UgQHtwYWNrYWdlfTogQHtlcnIubWVzc2FnZX0nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgaGlkZGVuIHZhbHVlIGZvciBlYWNoIHZlcnNpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZlcnNpb25zIGxpc3Qgb2YgdmVyc2lvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gdXBMaW5rIHVwbGluayBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwdWJsaWMgX3VwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rKHZlcnNpb25zOiBWZXJzaW9ucywgdXBMaW5rOiBQcm94eVN0b3JhZ2UpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gdmVyc2lvbnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmVyc2lvbnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tpXTtcblxuICAgICAgICAvLyBob2xkcyBhIFwiaGlkZGVuXCIgdmFsdWUgdG8gYmUgdXNlZCBieSB0aGUgcGFja2FnZSBzdG9yYWdlLlxuICAgICAgICB2ZXJzaW9uW1N5bWJvbC5mb3IoJ19fdmVyZGFjY2lvX3VwbGluaycpXSA9IHVwTGluay51cG5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FB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