appium-ios-simulator 4.0.1 → 4.0.2

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.
@@ -486,16 +486,16 @@ class SimulatorXcode6 extends _events.EventEmitter {
486
486
  }
487
487
 
488
488
  async launchAndQuit(safari = false, startupTimeout = this.startupTimeout) {
489
- _logger.default.debug('Attempting to launch and quit the simulator, to create directory structure');
490
-
491
- _logger.default.debug(`Will launch with Safari? ${safari}`);
489
+ _logger.default.debug('Attempting to launch and quit the simulator to create the directory structure');
492
490
 
493
491
  await this.run({
494
492
  startupTimeout
495
493
  });
496
494
 
497
495
  if (safari) {
498
- await this.openUrl('http://www.appium.io');
496
+ _logger.default.debug('Spawning Safari browser in order to create the necessary file system items');
497
+
498
+ await (0, _utils.launchApp)(this.simctl, _utils.MOBILE_SAFARI_BUNDLE_ID);
499
499
  }
500
500
 
501
501
  try {
@@ -616,11 +616,11 @@ class SimulatorXcode6 extends _events.EventEmitter {
616
616
  _logger.default.debug('Deleting Safari apps from simulator');
617
617
 
618
618
  let dirs = [];
619
- dirs.push(await this.getAppDir('com.apple.mobilesafari'));
619
+ dirs.push(await this.getAppDir(_utils.MOBILE_SAFARI_BUNDLE_ID));
620
620
  let pv = await this.getPlatformVersion();
621
621
 
622
622
  if (pv >= 8) {
623
- dirs.push(await this.getAppDir('com.apple.mobilesafari', 'Bundle'));
623
+ dirs.push(await this.getAppDir(_utils.MOBILE_SAFARI_BUNDLE_ID, 'Bundle'));
624
624
  }
625
625
 
626
626
  let deletePromises = [];
@@ -645,7 +645,7 @@ class SimulatorXcode6 extends _events.EventEmitter {
645
645
 
646
646
  let libraryDir = _path.default.resolve(this.getDir(), 'Library');
647
647
 
648
- let safariRoot = await this.getAppDir('com.apple.mobilesafari');
648
+ let safariRoot = await this.getAppDir(_utils.MOBILE_SAFARI_BUNDLE_ID);
649
649
 
650
650
  if (!safariRoot) {
651
651
  _logger.default.info('Could not find Safari support directories to clean out old ' + 'data. Probably there is nothing to clean out');
@@ -655,7 +655,7 @@ class SimulatorXcode6 extends _events.EventEmitter {
655
655
 
656
656
  let safariLibraryDir = _path.default.resolve(safariRoot, 'Library');
657
657
 
658
- let filesToDelete = ['Caches/Snapshots/com.apple.mobilesafari', 'Caches/com.apple.mobilesafari/*', 'Caches/com.apple.WebAppCache/*', 'Caches/com.apple.WebKit.Networking/*', 'Caches/com.apple.WebKit.WebContent/*', 'Image Cache/*', 'WebKit/com.apple.mobilesafari/*', 'WebKit/GeolocationSites.plist', 'WebKit/LocalStorage/*.*', 'Safari/*', 'Cookies/*.binarycookies', 'Caches/com.apple.UIStatusBar/*', 'Caches/com.apple.keyboards/images/*', 'Caches/com.apple.Safari.SafeBrowsing/*', '../tmp/com.apple.mobilesafari/*'];
658
+ let filesToDelete = [`Caches/Snapshots/${_utils.MOBILE_SAFARI_BUNDLE_ID}`, `Caches/${_utils.MOBILE_SAFARI_BUNDLE_ID}/*`, 'Caches/com.apple.WebAppCache/*', 'Caches/com.apple.WebKit.Networking/*', 'Caches/com.apple.WebKit.WebContent/*', 'Image Cache/*', `WebKit/${_utils.MOBILE_SAFARI_BUNDLE_ID}/*`, 'WebKit/GeolocationSites.plist', 'WebKit/LocalStorage/*.*', 'Safari/*', 'Cookies/*.binarycookies', 'Caches/com.apple.UIStatusBar/*', 'Caches/com.apple.keyboards/images/*', 'Caches/com.apple.Safari.SafeBrowsing/*', `../tmp/${_utils.MOBILE_SAFARI_BUNDLE_ID}/*`];
659
659
  let deletePromises = [];
660
660
 
661
661
  for (let file of filesToDelete) {
@@ -1141,4 +1141,4 @@ var _default = SimulatorXcode6;
1141
1141
  exports.default = _default;require('source-map-support').install();
1142
1142
 
1143
1143
 
1144
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtNi5qcyJdLCJuYW1lcyI6WyJTVEFSVFVQX1RJTUVPVVQiLCJFWFRSQV9TVEFSVFVQX1RJTUUiLCJVSV9DTElFTlRfQUNDRVNTX0dVQVJEIiwiQXN5bmNMb2NrIiwiVUlfQ0xJRU5UX0JVTkRMRV9JRCIsIlNQUklOR0JPQVJEX0JVTkRMRV9JRCIsIkJPT1RfQ09NUExFVEVEX0VWRU5UIiwiU2ltdWxhdG9yWGNvZGU2IiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJ1ZGlkIiwieGNvZGVWZXJzaW9uIiwiU3RyaW5nIiwic2ltY3RsIiwiU2ltY3RsIiwiX3BsYXRmb3JtVmVyc2lvbiIsImtleWNoYWluUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0RGlyIiwic2ltdWxhdG9yQXBwIiwiYXBwRGF0YUJ1bmRsZVBhdGhzIiwiaXNGcmVzaEZpbGVzIiwiZXh0cmFTdGFydHVwVGltZSIsImNhbGVuZGFyIiwiQ2FsZW5kYXIiLCJwZXJtaXNzaW9ucyIsIlBlcm1pc3Npb25zIiwidWlDbGllbnRCdW5kbGVJZCIsImRldmljZXNTZXRQYXRoIiwidmFsdWUiLCJnZXRVSUNsaWVudFBpZCIsInN0ZG91dCIsImUiLCJpc05hTiIsInBhcnNlSW50IiwidHJpbSIsImxvZyIsImRlYnVnIiwiaXNVSUNsaWVudFJ1bm5pbmciLCJfIiwiaXNOdWxsIiwic3RhcnR1cFRpbWVvdXQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJzZGsiLCJzdGF0IiwiZ2V0Um9vdERpciIsImhvbWUiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsImdldExvZ0RpciIsImluc3RhbGxBcHAiLCJhcHAiLCJpc0FwcEluc3RhbGxlZCIsImJ1bmRsZUlkIiwiYXBwRmlsZSIsImFwcERpcnMiLCJnZXRBcHBEaXJzIiwibGVuZ3RoIiwiZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSIsImJ1bmRsZU5hbWUiLCJyb290VXNlckFwcERpciIsImJ1aWxkQnVuZGxlUGF0aE1hcCIsImJ1bmRsZUlkcyIsImlzRW1wdHkiLCJ1c2VyQXBwRGlyUGF0aCIsIk9iamVjdCIsImVudHJpZXMiLCJmcyIsInJlYWRkaXIiLCJmaW5kIiwiZmlsZSIsImV4dG5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZm9QbGlzdFBhdGgiLCJleGlzdHMiLCJpbmZvUGxpc3QiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwiQ0ZCdW5kbGVOYW1lIiwicHVzaCIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiZ2V0QXBwRGlyIiwiaWQiLCJzdWJEaXIiLCJpc0ZyZXNoIiwiYXBwbGljYXRpb25MaXN0IiwicGF0aEJ1bmRsZVBhaXIiLCJkaXIiLCJhcHBGaWxlcyIsImdsb2IiLCJtYXRjaCIsInJlYWRCdW5kbGVJZCIsIm1ldGFkYXRhIiwic2V0dGluZ3MiLCJyZWFkIiwiTUNNTWV0YWRhdGFJZGVudGlmaWVyIiwiYnVuZGxlUGF0aERpcnMiLCJidW5kbGVQYXRoUGFpcnMiLCJyZWR1Y2UiLCJidW5kbGVNYXAiLCJidW5kbGVQYXRoIiwiZGV2aWNlQXJyIiwidG9QYWlycyIsImdldERldmljZXMiLCJkZXZpY2UiLCJmaWxlcyIsInB2IiwibWFwIiwicyIsImV4aXN0ZW5jZXMiLCJmIiwiaGFzQWNjZXNzIiwiZnJlc2giLCJjb21wYWN0IiwiaXNSdW5uaW5nIiwiZ2V0RW52IiwiaXNTaHV0ZG93biIsImluY2x1ZGVzIiwic3RkZXJyIiwid2FpdEZvckJvb3QiLCJib290ZWRJbmRpY2F0b3IiLCJnZXRCb290ZWRJbmRpY2F0b3JTdHJpbmciLCJ0YWlsTG9nc1VudGlsIiwiQiIsImRlbGF5IiwiZW1pdCIsImluZGljYXRvciIsInBsYXRmb3JtVmVyc2lvbiIsInN0YXJ0VUlDbGllbnQiLCJvcHRzIiwiY2xvbmVEZWVwIiwiZGVmYXVsdHNEZWVwIiwic2NhbGVGYWN0b3IiLCJhcmdzIiwibmFtZSIsImZvcm1hdHRlZERldmljZU5hbWUiLCJyZXBsYWNlIiwiYXJndW1lbnROYW1lIiwiaW5mbyIsImpvaW4iLCJ0aW1lb3V0IiwicnVuIiwiYXNzaWduIiwiaXNTZXJ2ZXJSdW5uaW5nIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic2h1dGRvd24iLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJjbGVhbiIsImVuZFNpbXVsYXRvckRhZW1vbiIsImVyYXNlRGV2aWNlIiwic2NydWJDdXN0b21BcHAiLCJhcHBCdW5kbGVJZCIsImNsZWFuQ3VzdG9tQXBwIiwic2NydWIiLCJkZWxldGVQcm9taXNlcyIsInJpbXJhZiIsInJlbFJtUGF0aCIsInJtUGF0aCIsImFsbCIsImRpcnMiLCJkYXRhIiwiYnVuZGxlIiwidW5kZWZpbmVkIiwic3JjIiwibGF1bmNoQW5kUXVpdCIsInNhZmFyaSIsIm9wZW5VcmwiLCJFcnJvciIsImxhdW5jaGN0bENtZCIsInN0b3BDbWQiLCJyZW1vdmVDbWQiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwic2h1dGRvd25EZXZpY2UiLCJiaW5kIiwiZGVsZXRlIiwiZGVsZXRlRGV2aWNlIiwidXBkYXRlU2V0dGluZ3MiLCJ1cGRhdGVzIiwidXBkYXRlTG9jYXRpb25TZXR0aW5ncyIsImF1dGhvcml6ZWQiLCJzZXRSZWR1Y2VNb3Rpb24iLCJyZWR1Y2VNb3Rpb24iLCJzZXRBcHBlYXJhbmNlIiwiZ2V0QXBwZWFyYW5jZSIsInVwZGF0ZVNhZmFyaVNldHRpbmdzIiwidXBkYXRlZCIsInVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyIsInVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzIiwidXBkYXRlTG9jYWxlIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJjYWxlbmRhckZvcm1hdCIsImRlbGV0ZVNhZmFyaSIsImNsZWFuU2FmYXJpIiwia2VlcFByZWZzIiwibGlicmFyeURpciIsInNhZmFyaVJvb3QiLCJzYWZhcmlMaWJyYXJ5RGlyIiwiZmlsZXNUb0RlbGV0ZSIsInJlbW92ZUFwcCIsIm1vdmVCdWlsdEluQXBwIiwiYXBwTmFtZSIsImFwcFBhdGgiLCJuZXdBcHBQYXRoIiwiY29weUZpbGUiLCJ1cmwiLCJTQUZBUklfQk9PVEVEX0lORElDQVRPUiIsIlNBRkFSSV9TVEFSVFVQX1RJTUVPVVQiLCJjbGVhckNhY2hlcyIsImZvbGRlck5hbWVzIiwiY2FjaGVzUm9vdCIsIml0ZW1zVG9SZW1vdmUiLCJ4IiwiZmlsdGVyIiwiaXNEaXJlY3RvcnkiLCJ1dGlsIiwicGx1cmFsaXplIiwidGltZW91dE1zIiwic2ltTG9nIiwiZW5hYmxlQ2FsZW5kYXJBY2Nlc3MiLCJidW5kbGVJRCIsImRpc2FibGVDYWxlbmRhckFjY2VzcyIsImhhc0NhbGVuZGFyQWNjZXNzIiwiX2FjdGl2YXRlV2luZG93IiwicGlkIiwiZXhlY3V0ZVVJQ2xpZW50U2NyaXB0IiwiYXBwbGVTY3JpcHQiLCJ3aW5kb3dBY3RpdmF0aW9uU2NyaXB0IiwicmVzdWx0U2NyaXB0IiwiYWNxdWlyZSIsImVycm9yQW5kVGhyb3ciLCJpc0Jpb21ldHJpY0Vucm9sbGVkIiwib3V0cHV0IiwiaXNTdHJpbmciLCJlbnJvbGxCaW9tZXRyaWMiLCJpc0VuYWJsZWQiLCJzZW5kQmlvbWV0cmljTWF0Y2giLCJzaG91bGRNYXRjaCIsImRpc21pc3NEYXRhYmFzZUFsZXJ0IiwiaW5jcmVhc2UiLCJidXR0b24iLCJiYWNrdXBLZXljaGFpbnMiLCJiYWNrdXBQYXRoIiwidGVtcERpciIsInByZWZpeCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwic3VmZml4IiwiemlwQXJncyIsInNlcCIsIl9rZXljaGFpbnNCYWNrdXBQYXRoIiwidW5saW5rIiwicmVzdG9yZUtleWNoYWlucyIsImV4Y2x1ZGVQYXR0ZXJucyIsInNwbGl0IiwicGxpc3RQYXRoIiwiZ2V0TGF1bmNoRGFlbW9uc1Jvb3QiLCJzcGF3blByb2Nlc3MiLCJ1bnppcEFyZ3MiLCJmbGF0TWFwIiwiY2xlYXJLZXljaGFpbnMiLCJwcyIsInNlcnZpY2VzTWF0Y2giLCJleGVjIiwicmVzdWx0IiwicGF0dGVybiIsImdyb3VwIiwidHJpbUVuZCIsInNldFBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwic2V0UGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc01hcHBpbmciLCJKU09OIiwic3RyaW5naWZ5Iiwic2V0QWNjZXNzIiwiZ2V0UGVybWlzc2lvbiIsInNlcnZpY2VOYW1lIiwiZ2V0QWNjZXNzIiwiYWRkQ2VydGlmaWNhdGUiLCJwYXlsb2FkIiwidHJ1bmNhdGUiLCJwdXNoTm90aWZpY2F0aW9uIiwiZGV2Um9vdCIsIl9nZXREZXZpY2VTdHJpbmdQbGF0Zm9ybVZlcnNpb24iLCJyZXFWZXJzaW9uIiwieGNvZGUiLCJnZXRNYXhJT1NTREsiLCJfZ2V0RGV2aWNlU3RyaW5nVmVyc2lvblN0cmluZyIsIl9nZXREZXZpY2VTdHJpbmdDb25maWdGaXgiLCJnZXREZXZpY2VTdHJpbmciLCJkZXZpY2VOYW1lIiwiZm9yY2VJcGhvbmUiLCJmb3JjZUlwYWQiLCJsb2dPcHRzIiwiaXNpUGhvbmUiLCJpbmRleE9mIiwiaW9zRGV2aWNlU3RyaW5nIiwidGVzdCIsIkNPTkZJR19GSVgiLCJjb25maWdGaXgiLCJnZXRXZWJJbnNwZWN0b3JTb2NrZXQiLCJjbWQiLCJmbiIsImV4dGVuc2lvbnMiLCJwcm90b3R5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBLE1BQU1BLGVBQWUsR0FBRyxLQUFLLElBQTdCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsSUFBM0I7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxJQUFJQyxrQkFBSixFQUEvQjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLDJCQUE1QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLHVCQUE5Qjs7QUFVQSxNQUFNQyxvQkFBb0IsR0FBRyxlQUE3Qjs7O0FBR0EsTUFBTUMsZUFBTixTQUE4QkMsb0JBQTlCLENBQTJD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VyxnQ0FBK0IrRixJQUFJLENBQUMwSyxVQUFXLElBQWhELEdBQ0MsT0FBTU0sZUFBZ0IsR0FEakM7QUFFRDs7QUFFRGhSLG9CQUFJQyxLQUFKLENBQVcsMkJBQTBCK1EsZUFBZ0IsR0FBckQ7O0FBQ0EsV0FBT0EsZUFBUDtBQUNEOztBQU0wQixRQUFyQkkscUJBQXFCLEdBQUk7QUFFN0IsV0FBTyxJQUFQO0FBQ0Q7O0FBajlDd0M7Ozs7QUFvOUMzQyxLQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxFQUFOLENBQVQsSUFBc0JuUixnQkFBRWtFLE9BQUYsQ0FBVWtOLGNBQVYsQ0FBdEIsRUFBNkM7QUFDM0NyVCxFQUFBQSxlQUFlLENBQUNzVCxTQUFoQixDQUEwQkgsR0FBMUIsSUFBaUNDLEVBQWpDO0FBQ0Q7O2VBRWNwVCxlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHhjb2RlLCBnZXRQYXRoIGFzIGdldFhjb2RlUGF0aCB9IGZyb20gJ2FwcGl1bS14Y29kZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBta2RpcnAsIHBsaXN0LCB0aW1pbmcsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQge1xuICBzYWZlUmltUmFmLCBnZXREZXZlbG9wZXJSb290LCBpbnN0YWxsU1NMQ2VydCwgaGFzU1NMQ2VydCwgYWN0aXZhdGVBcHAsXG59IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgYXN5bmNtYXAsIHJldHJ5SW50ZXJ2YWwsIHdhaXRGb3JDb25kaXRpb24sIHJldHJ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0ICogYXMgc2V0dGluZ3MgZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IHRhaWxVbnRpbCB9IGZyb20gJy4vdGFpbC11bnRpbC5qcyc7XG5pbXBvcnQgZXh0ZW5zaW9ucyBmcm9tICcuL2V4dGVuc2lvbnMvaW5kZXgnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL2NhbGVuZGFyJztcbmltcG9ydCBQZXJtaXNzaW9ucyBmcm9tICcuL3Blcm1pc3Npb25zJztcbmltcG9ydCBTaW1jdGwgZnJvbSAnbm9kZS1zaW1jdGwnO1xuXG5cbmNvbnN0IFNUQVJUVVBfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IEVYVFJBX1NUQVJUVVBfVElNRSA9IDIwMDA7XG5jb25zdCBVSV9DTElFTlRfQUNDRVNTX0dVQVJEID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgVUlfQ0xJRU5UX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUuaXBob25lc2ltdWxhdG9yJztcbmNvbnN0IFNQUklOR0JPQVJEX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUuU3ByaW5nQm9hcmQnO1xuXG4vKlxuICogVGhpcyBldmVudCBpcyBlbWl0dGVkIGFzIHNvb24gYXMgaU9TIFNpbXVsYXRvclxuICogaGFzIGZpbmlzaGVkIGJvb3RpbmcgYW5kIGl0IGlzIHJlYWR5IHRvIGFjY2VwdCB4Y3J1biBjb21tYW5kcy5cbiAqIFRoZSBldmVudCBoYW5kbGVyIGlzIGNhbGxlZCBhZnRlciAncnVuJyBtZXRob2QgaXMgY29tcGxldGVkXG4gKiBmb3IgWGNvZGUgNyBhbmQgb2xkZXIgYW5kIGlzIG9ubHkgdXNlZnVsIGluIFhjb2RlIDgrLFxuICogc2luY2Ugb25lIGNhbiBzdGFydCBkb2luZyBzdHVmZiAoZm9yIGV4YW1wbGUgaW5zdGFsbC91bmluc3RhbGwgYW4gYXBwKSBpbiBwYXJhbGxlbFxuICogd2l0aCBTaW11bGF0b3IgVUkgc3RhcnR1cCwgd2hpY2ggc2hvcnRlbnMgc2Vzc2lvbiBzdGFydHVwIHRpbWUuXG4gKi9cbmNvbnN0IEJPT1RfQ09NUExFVEVEX0VWRU5UID0gJ2Jvb3RDb21wbGV0ZWQnO1xuXG5cbmNsYXNzIFNpbXVsYXRvclhjb2RlNiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIG9iamVjdCB3aXRoIHRoZSBgdWRpZGAgYW5kIHZlcnNpb24gb2YgWGNvZGUuIFVzZSB0aGUgZXhwb3J0ZWQgYGdldFNpbXVsYXRvcih1ZGlkKWAgbWV0aG9kIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1ZGlkIC0gVGhlIFNpbXVsYXRvciBJRC5cbiAgICogQHBhcmFtIHtvYmplY3R9IHhjb2RlVmVyc2lvbiAtIFRoZSB0YXJnZXQgWGNvZGUgdmVyc2lvbiBpbiBmb3JtYXQge21ham9yLCBtaW5vciwgYnVpbGR9LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHVkaWQsIHhjb2RlVmVyc2lvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnVkaWQgPSBTdHJpbmcodWRpZCk7XG4gICAgdGhpcy5zaW1jdGwgPSBuZXcgU2ltY3RsKHtcbiAgICAgIHVkaWQ6IHRoaXMudWRpZCxcbiAgICB9KTtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIC8vIHBsYXRmb3JtVmVyc2lvbiBjYW5ub3QgYmUgZm91bmQgaW5pdGlhbGx5LCBzaW5jZSBnZXR0aW5nIGl0IGhhcyBzaWRlIGVmZmVjdHMgZm9yXG4gICAgLy8gb3VyIGxvZ2ljIGZvciBmaWd1cmluZyBvdXQgaWYgYSBzaW0gaGFzIGJlZW4gcnVuXG4gICAgLy8gaXQgd2lsbCBiZSBzZXQgd2hlbiBpdCBpcyBuZWVkZWRcbiAgICB0aGlzLl9wbGF0Zm9ybVZlcnNpb24gPSBudWxsO1xuXG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5nZXREaXIoKSwgJ0xpYnJhcnknLCAnS2V5Y2hhaW5zJyk7XG4gICAgdGhpcy5zaW11bGF0b3JBcHAgPSAnaU9TIFNpbXVsYXRvci5hcHAnO1xuXG4gICAgdGhpcy5hcHBEYXRhQnVuZGxlUGF0aHMgPSB7fTtcblxuICAgIC8vIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgZm9yIHdoZW4gc2VlaW5nIGlmIGEgc2ltdWxhdG9yIGlzIFwiZnJlc2hcIlxuICAgIC8vIChtZWFuaW5nIGl0IGhhcyBuZXZlciBiZWVuIGJvb3RlZCkuXG4gICAgLy8gSWYgdGhlc2UgZmlsZXMgYXJlIHByZXNlbnQsIHdlIGFzc3VtZSBpdCdzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvb3RlZFxuICAgIHRoaXMuaXNGcmVzaEZpbGVzID0gW1xuICAgICAgJ0xpYnJhcnkvQ29uZmlndXJhdGlvblByb2ZpbGVzJyxcbiAgICAgICdMaWJyYXJ5L0Nvb2tpZXMnLFxuICAgICAgJ0xpYnJhcnkvUHJlZmVyZW5jZXMvLkdsb2JhbFByZWZlcmVuY2VzLnBsaXN0JyxcbiAgICAgICdMaWJyYXJ5L1ByZWZlcmVuY2VzL2NvbS5hcHBsZS5zcHJpbmdib2FyZC5wbGlzdCcsXG4gICAgICAndmFyL3J1bi9zeXNsb2cucGlkJ1xuICAgIF07XG5cbiAgICAvLyBleHRyYSB0aW1lIHRvIHdhaXQgZm9yIHNpbXVsYXRvciB0byBiZSBkZWVtZWQgYm9vdGVkXG4gICAgdGhpcy5leHRyYVN0YXJ0dXBUaW1lID0gRVhUUkFfU1RBUlRVUF9USU1FO1xuXG4gICAgdGhpcy5jYWxlbmRhciA9IG5ldyBDYWxlbmRhcih4Y29kZVZlcnNpb24sIHRoaXMuZ2V0RGlyKCkpO1xuICAgIHRoaXMucGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbnMoeGNvZGVWZXJzaW9uLCB0aGlzLmdldERpcigpLCB0aGlzLnVkaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQnVuZGxlIGlkZW50aWZpZXIgb2YgU2ltdWxhdG9yIFVJIGNsaWVudC5cbiAgICovXG4gIGdldCB1aUNsaWVudEJ1bmRsZUlkICgpIHtcbiAgICByZXR1cm4gVUlfQ0xJRU5UX0JVTkRMRV9JRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkZXZpY2VzIHNldCB3aGVyZSB0aGUgY3VycmVudCBzaW11bGF0b3IgaXMgbG9jYXRlZC5cbiAgICogYG51bGxgIHZhbHVlIG1lYW5zIHRoYXQgdGhlIGRlZmF1bHQgcGF0aCBpcyB1c2VkLCB3aGljaCBpcyB1c3VhbGx5IGB+L0xpYnJhcnkvRGV2ZWxvcGVyL0NvcmVTaW11bGF0b3IvRGV2aWNlc2BcbiAgICovXG4gIGdldCBkZXZpY2VzU2V0UGF0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2ltY3RsLmRldmljZXNTZXRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkZXZpY2VzIHNldC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgdmFsdWVcbiAgICogb25jZSByaWdodCBhZnRlciBTaW11bGF0b3IgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgdG8gbm90IGNoYW5nZSBpdCBkdXJpbmdcbiAgICogdGhlIGluc3RhbmNlIGxpZmVjeWNsZVxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRldmljZXMgc2V0IHJvb3Qgb24gdGhlXG4gICAqIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAqL1xuICBzZXQgZGV2aWNlc1NldFBhdGggKHZhbHVlKSB7XG4gICAgdGhpcy5zaW1jdGwuZGV2aWNlc1NldFBhdGggPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZCBvZiB0aGUgVUkgY2xpZW50XG4gICAqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBwcm9jZXNzIElEIG9yIG51bGwgaWYgdGhlIFVJIGNsaWVudCBpcyBub3QgcnVubmluZ1xuICAgKi9cbiAgYXN5bmMgZ2V0VUlDbGllbnRQaWQgKCkge1xuICAgIGxldCBzdGRvdXQ7XG4gICAgdHJ5IHtcbiAgICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3BncmVwJywgWyctZm4nLCBgJHt0aGlzLnNpbXVsYXRvckFwcH0vQ29udGVudHMvTWFjT1MvYF0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGlzTmFOKHBhcnNlSW50KHN0ZG91dCwgMTApKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0ZG91dCA9IHN0ZG91dC50cmltKCk7XG4gICAgbG9nLmRlYnVnKGBHb3QgU2ltdWxhdG9yIFVJIGNsaWVudCBQSUQ6ICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHN0YXRlIG9mIFNpbXVsYXRvciBVSSBjbGllbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgb2YgaWYgVUkgY2xpZW50IGlzIHJ1bm5pbmcgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgaXNVSUNsaWVudFJ1bm5pbmcgKCkge1xuICAgIHJldHVybiAhXy5pc051bGwoYXdhaXQgdGhpcy5nZXRVSUNsaWVudFBpZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvciBhYm91dCBTaW11bGF0b3Igc3RhcnR1cCB0aW1lb3V0IGhhcHBlbmVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZ2V0IHN0YXJ0dXBUaW1lb3V0ICgpIHtcbiAgICByZXR1cm4gU1RBUlRVUF9USU1FT1VUO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY3VycmVudCBTaW11bGF0b3IuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gU0RLIHZlcnNpb24sIGZvciBleGFtcGxlICc4LjMnLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3BsYXRmb3JtVmVyc2lvbikge1xuICAgICAgbGV0IHtzZGt9ID0gYXdhaXQgdGhpcy5zdGF0KCk7XG4gICAgICB0aGlzLl9wbGF0Zm9ybVZlcnNpb24gPSBzZGs7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wbGF0Zm9ybVZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIFNpbXVsYXRvciBzdHVmZiBpcyBsb2NhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRoIHN0cmluZy5cbiAgICovXG4gIGdldFJvb3REaXIgKCkge1xuICAgIGxldCBob21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGhvbWUsICdMaWJyYXJ5JywgJ0RldmVsb3BlcicsICdDb3JlU2ltdWxhdG9yJywgJ0RldmljZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgU2ltdWxhdG9yIGFwcGxpY2F0aW9ucyBkYXRhIGlzIGxvY2F0ZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhdGggc3RyaW5nLlxuICAgKi9cbiAgZ2V0RGlyICgpIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0Um9vdERpcigpLCB0aGlzLnVkaWQsICdkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIFNpbXVsYXRvciBsb2dzIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhdGggc3RyaW5nLlxuICAgKi9cbiAgZ2V0TG9nRGlyICgpIHtcbiAgICBsZXQgaG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShob21lLCAnTGlicmFyeScsICdMb2dzJywgJ0NvcmVTaW11bGF0b3InLCB0aGlzLnVkaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdmFsaWQgLmFwcCBwYWNrYWdlIG9uIFNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcCAtIFRoZSBwYXRoIHRvIHRoZSAuYXBwIHBhY2thZ2UuXG4gICAqL1xuICBhc3luYyBpbnN0YWxsQXBwIChhcHApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zaW1jdGwuaW5zdGFsbEFwcChhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvbiBTaW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBidW5kbGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGNoZWNrZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBGdWxlIC0gQXBwbGljYXRpb24gbmFtZSBtaW51cyBcIi5hcHBcIiAoZm9yIGlPUyA3LjEpXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZFxuICAgKi9cbiAgYXN5bmMgaXNBcHBJbnN0YWxsZWQgKGJ1bmRsZUlkLCBhcHBGaWxlID0gbnVsbCkge1xuICAgIC8vIGBhcHBGaWxlYCBhcmd1bWVudCBvbmx5IG5lY2Vzc2FyeSBmb3IgaU9TIGJlbG93IHZlcnNpb24gOFxuICAgIGxldCBhcHBEaXJzID0gYXdhaXQgdGhpcy5nZXRBcHBEaXJzKGFwcEZpbGUsIGJ1bmRsZUlkKTtcbiAgICByZXR1cm4gYXBwRGlycy5sZW5ndGggIT09IDA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1c2VyIGluc3RhbGxlZCBidW5kbGUgaWRzIHdoaWNoIGhhcyAnYnVuZGxlTmFtZScgaW4gdGhlaXIgSW5mby5QbGlzdCBhcyAnQ0ZCdW5kbGVOYW1lJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgLSBUaGUgYnVuZGxlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBjaGVja2VkLlxuICAgKiBAcmV0dXJuIHthcnJheTxzdHJpbmc+fSAtIFRoZSBsaXN0IG9mIGJ1bmRsZSBpZHMgd2hpY2ggaGF2ZSAnYnVuZGxlTmFtZSdcbiAgICovXG4gIGFzeW5jIGdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUgKGJ1bmRsZU5hbWUpIHtcbiAgICBjb25zdCByb290VXNlckFwcERpciA9IGF3YWl0IHRoaXMuYnVpbGRCdW5kbGVQYXRoTWFwKCdCdW5kbGUnKTtcbiAgICBjb25zdCBidW5kbGVJZHMgPSBbXTtcbiAgICBpZiAoXy5pc0VtcHR5KHJvb3RVc2VyQXBwRGlyKSkge1xuICAgICAgcmV0dXJuIGJ1bmRsZUlkcztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtidW5kbGVJZCwgdXNlckFwcERpclBhdGhdIG9mIE9iamVjdC5lbnRyaWVzKHJvb3RVc2VyQXBwRGlyKSkge1xuICAgICAgY29uc3QgYXBwRmlsZSA9IChhd2FpdCBmcy5yZWFkZGlyKHVzZXJBcHBEaXJQYXRoKSkuZmluZChcbiAgICAgICAgKGZpbGUpID0+IHBhdGguZXh0bmFtZShmaWxlKS50b0xvd2VyQ2FzZSgpID09PSAnLmFwcCcpO1xuICAgICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZSh1c2VyQXBwRGlyUGF0aCwgYXBwRmlsZSwgJ0luZm8ucGxpc3QnKTtcbiAgICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGluZm9QbGlzdFBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5mb1BsaXN0ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUoaW5mb1BsaXN0UGF0aCwgZmFsc2UpO1xuICAgICAgICBpZiAoaW5mb1BsaXN0LkNGQnVuZGxlTmFtZSA9PT0gYnVuZGxlTmFtZSkge1xuICAgICAgICAgIGJ1bmRsZUlkcy5wdXNoKGJ1bmRsZUlkKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gcmVhZCBwbGlzdCAke2luZm9QbGlzdFBhdGh9LiBPcmlnaW5hbCBlcnJvciAnJHtlcnIubWVzc2FnZX0nYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2cuZGVidWcoYFRoZSBzaW11bGF0b3IgaGFzICcke2J1bmRsZUlkcy5sZW5ndGh9JyBidW5kbGVzIHdoaWNoIGhhdmUgJyR7YnVuZGxlTmFtZX0nIGFzIHRoZWlyICdDRkJ1bmRsZU5hbWUnOmApO1xuICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgYnVuZGxlSWRzKSB7XG4gICAgICBsb2cuZGVidWcoYCAgICAnJHtidW5kbGVJZH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBidW5kbGVJZHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRpcmVjdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uJ3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gRWl0aGVyIGEgYnVuZGxlSWQgKGUuZy4sIGNvbS5hcHBsZS5tb2JpbGVzYWZhcmkpIG9yLCBmb3IgaU9TIDcuMSwgdGhlIGFwcCBuYW1lIHdpdGhvdXQgYC5hcHBgIChlLmcuLCBNb2JpbGVTYWZhcmkpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJkaXIgLSBUaGUgc3ViLWRpcmVjdG9yeSB3ZSBleHBlY3QgdG8gYmUgd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIFwiRGF0YVwiLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb290IGFwcGxpY2F0aW9uIGZvbGRlci5cbiAgICovXG4gIGFzeW5jIGdldEFwcERpciAoaWQsIHN1YkRpciA9ICdEYXRhJykge1xuICAgIHRoaXMuYXBwRGF0YUJ1bmRsZVBhdGhzW3N1YkRpcl0gPSB0aGlzLmFwcERhdGFCdW5kbGVQYXRoc1tzdWJEaXJdIHx8IHt9O1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5hcHBEYXRhQnVuZGxlUGF0aHNbc3ViRGlyXSkgJiYgIWF3YWl0IHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICB0aGlzLmFwcERhdGFCdW5kbGVQYXRoc1tzdWJEaXJdID0gYXdhaXQgdGhpcy5idWlsZEJ1bmRsZVBhdGhNYXAoc3ViRGlyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBwRGF0YUJ1bmRsZVBhdGhzW3N1YkRpcl1baWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB4Y29kZSA2IHNpbXVsYXRvcnMgYXJlIHJlYWxseSBhbm5veWluZywgYW5kIGJ1cnkgdGhlIG1haW4gYXBwXG4gICAqIGRpcmVjdG9yaWVzIGluc2lkZSBkaXJlY3RvcmllcyBqdXN0IG5hbWVkIHdpdGggSGFzaGVzLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBwcm9wZXIgZGlyZWN0b3J5IGJ5IHRyYXZlcnNpbmcgYWxsIG9mIHRoZW1cbiAgICogYW5kIHJlYWRpbmcgYSBtZXRhZGF0YSBwbGlzdCAoTW9iaWxlIENvbnRhaW5lciBNYW5hZ2VyKSB0byBnZXQgdGhlXG4gICAqIGJ1bmRsZSBpZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmRpciAtIFRoZSBzdWItZGlyZWN0b3J5IHdlIGV4cGVjdCB0byBiZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8gXCJEYXRhXCIuXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIGxpc3Qgb2YgcGF0aC1idW5kbGUgcGFpcnMgdG8gYW4gb2JqZWN0IHdoZXJlIGJ1bmRsZUlkcyBhcmUgbWFwcGVkIHRvIHBhdGhzLlxuICAgKi9cbiAgYXN5bmMgYnVpbGRCdW5kbGVQYXRoTWFwIChzdWJEaXIgPSAnRGF0YScpIHtcbiAgICBsb2cuZGVidWcoJ0J1aWxkaW5nIGJ1bmRsZSBwYXRoIG1hcCcpO1xuICAgIGxldCBhcHBsaWNhdGlvbkxpc3Q7XG4gICAgbGV0IHBhdGhCdW5kbGVQYWlyO1xuICAgIGlmIChhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpID09PSAnNy4xJykge1xuICAgICAgLy8gYXBwcyBhdmFpbGFibGVcbiAgICAgIC8vICAgV2ViLmFwcCxcbiAgICAgIC8vICAgV2ViVmlld1NlcnZpY2UuYXBwLFxuICAgICAgLy8gICBNb2JpbGVTYWZhcmkuYXBwLFxuICAgICAgLy8gICBXZWJDb250ZW50QW5hbHlzaXNVSS5hcHAsXG4gICAgICAvLyAgIEREQWN0aW9uc1NlcnZpY2UuYXBwLFxuICAgICAgLy8gICBTdG9yZUtpdFVJU2VydmljZS5hcHBcbiAgICAgIGFwcGxpY2F0aW9uTGlzdCA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldERpcigpLCAnQXBwbGljYXRpb25zJyk7XG4gICAgICBwYXRoQnVuZGxlUGFpciA9IGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgZGlyID0gcGF0aC5yZXNvbHZlKGFwcGxpY2F0aW9uTGlzdCwgZGlyKTtcbiAgICAgICAgbGV0IGFwcEZpbGVzID0gYXdhaXQgZnMuZ2xvYihgJHtkaXJ9LyouYXBwYCk7XG4gICAgICAgIGxldCBidW5kbGVJZCA9IGFwcEZpbGVzWzBdLm1hdGNoKC8uKlxcLyguKilcXC5hcHAvKVsxXTtcbiAgICAgICAgcmV0dXJuIHtwYXRoOiBkaXIsIGJ1bmRsZUlkfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGxpY2F0aW9uTGlzdCA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldERpcigpLCAnQ29udGFpbmVycycsIHN1YkRpciwgJ0FwcGxpY2F0aW9uJyk7XG4gICAgICAvLyBnaXZlbiBhIGRpcmVjdG9yeSwgZmluZCB0aGUgcGxpc3QgZmlsZSBhbmQgcHVsbCB0aGUgYnVuZGxlIGlkIGZyb20gaXRcbiAgICAgIGxldCByZWFkQnVuZGxlSWQgPSBhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgIGxldCBwbGlzdCA9IHBhdGgucmVzb2x2ZShkaXIsICcuY29tLmFwcGxlLm1vYmlsZV9jb250YWluZXJfbWFuYWdlci5tZXRhZGF0YS5wbGlzdCcpO1xuICAgICAgICBsZXQgbWV0YWRhdGEgPSBhd2FpdCBzZXR0aW5ncy5yZWFkKHBsaXN0KTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLk1DTU1ldGFkYXRhSWRlbnRpZmllcjtcbiAgICAgIH07XG4gICAgICAvLyBnaXZlbiBhIGRpcmVjdG9yeSwgcmV0dXJuIHRoZSBwYXRoIGFuZCBidW5kbGUgaWQgYXNzb2NpYXRlZCB3aXRoIGl0XG4gICAgICBwYXRoQnVuZGxlUGFpciA9IGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgZGlyID0gcGF0aC5yZXNvbHZlKGFwcGxpY2F0aW9uTGlzdCwgZGlyKTtcbiAgICAgICAgbGV0IGJ1bmRsZUlkID0gYXdhaXQgcmVhZEJ1bmRsZUlkKGRpcik7XG4gICAgICAgIHJldHVybiB7cGF0aDogZGlyLCBidW5kbGVJZH07XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcGxpY2F0aW9uTGlzdCkpIHtcbiAgICAgIGxvZy53YXJuKGBObyBkaXJlY3RvcnkgcGF0aCAnJHthcHBsaWNhdGlvbkxpc3R9J2ApO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGxldCBidW5kbGVQYXRoRGlycyA9IGF3YWl0IGZzLnJlYWRkaXIoYXBwbGljYXRpb25MaXN0KTtcbiAgICBsZXQgYnVuZGxlUGF0aFBhaXJzID0gYXdhaXQgYXN5bmNtYXAoYnVuZGxlUGF0aERpcnMsIGFzeW5jIGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgIHJldHVybiBhd2FpdCBwYXRoQnVuZGxlUGFpcihkaXIpO1xuICAgIH0sIGZhbHNlKTtcblxuICAgIC8vIHJlZHVjZSB0aGUgbGlzdCBvZiBwYXRoLWJ1bmRsZSBwYWlycyB0byBhbiBvYmplY3Qgd2hlcmUgYnVuZGxlSWRzIGFyZSBtYXBwZWQgdG8gcGF0aHNcbiAgICByZXR1cm4gYnVuZGxlUGF0aFBhaXJzLnJlZHVjZSgoYnVuZGxlTWFwLCBidW5kbGVQYXRoKSA9PiB7XG4gICAgICBidW5kbGVNYXBbYnVuZGxlUGF0aC5idW5kbGVJZF0gPSBidW5kbGVQYXRoLnBhdGg7XG4gICAgICByZXR1cm4gYnVuZGxlTWFwO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YXRlIGFuZCBzcGVjaWZpY3Mgb2YgdGhpcyBzaW0uXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gU2ltdWxhdG9yIHN0YXRzIG1hcHBpbmcsIGZvciBleGFtcGxlOlxuICAgKiB7IG5hbWU6ICdpUGhvbmUgNHMnLFxuICAgKiAgIHVkaWQ6ICdDMDlCMzRFNS03RENCLTQ0MkUtQjc5Qy1BQjZCQzAzNTc0MTcnLFxuICAgKiAgIHN0YXRlOiAnU2h1dGRvd24nLFxuICAgKiAgIHNkazogJzguMydcbiAgICogfVxuICAgKi9cbiAgYXN5bmMgc3RhdCAoKSB7XG4gICAgZm9yIChsZXQgW3NkaywgZGV2aWNlQXJyXSBvZiBfLnRvUGFpcnMoYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RGV2aWNlcygpKSkge1xuICAgICAgZm9yIChsZXQgZGV2aWNlIG9mIGRldmljZUFycikge1xuICAgICAgICBpZiAoZGV2aWNlLnVkaWQgPT09IHRoaXMudWRpZCkge1xuICAgICAgICAgIGRldmljZS5zZGsgPSBzZGs7XG4gICAgICAgICAgcmV0dXJuIGRldmljZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgYmVzdC1iZXQgaGV1cmlzdGljIGZvciB3aGV0aGVyIG9yIG5vdCBhIHNpbSBoYXMgYmVlbiBib290ZWRcbiAgICogYmVmb3JlLiBXZSB1c3VhbGx5IHdhbnQgdG8gc3RhcnQgYSBzaW11bGF0b3IgdG8gXCJ3YXJtXCIgaXQgdXAsIGhhdmVcbiAgICogWGNvZGUgcG9wdWxhdGUgaXQgd2l0aCBwbGlzdHMgZm9yIHVzIHRvIG1hbmlwdWxhdGUgYmVmb3JlIGEgcmVhbFxuICAgKiB0ZXN0IHJ1bi5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgaGFzIG5ldmVyIGJlZW4gc3RhcnRlZCBiZWZvcmVcbiAgICovXG4gIGFzeW5jIGlzRnJlc2ggKCkge1xuICAgIC8vIGlmIHRoZSBmb2xsb3dpbmcgZmlsZXMgZG9uJ3QgZXhpc3QsIGl0IGhhc24ndCBiZWVuIGJvb3RlZC5cbiAgICAvLyBUSElTIElTIE5PVCBBTiBFWEhBVVNUSVZFIExJU1RcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmlzRnJlc2hGaWxlcztcblxuICAgIGxldCBwdiA9IGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKHB2ICE9PSAnNy4xJykge1xuICAgICAgZmlsZXMucHVzaCgnTGlicmFyeS9QcmVmZXJlbmNlcy9jb20uYXBwbGUuUHJlZmVyZW5jZXMucGxpc3QnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZXMucHVzaCgnQXBwbGljYXRpb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyID0gdGhpcy5nZXREaXIoKTtcbiAgICBmaWxlcyA9IGZpbGVzLm1hcCgocykgPT4gcGF0aC5yZXNvbHZlKGRpciwgcykpO1xuXG4gICAgY29uc3QgZXhpc3RlbmNlcyA9IGF3YWl0IGFzeW5jbWFwKGZpbGVzLCBhc3luYyAoZikgPT4gYXdhaXQgZnMuaGFzQWNjZXNzKGYpKTtcbiAgICBjb25zdCBmcmVzaCA9IF8uY29tcGFjdChleGlzdGVuY2VzKS5sZW5ndGggIT09IGZpbGVzLmxlbmd0aDtcbiAgICBsb2cuZGVidWcoYENoZWNraW5nIHdoZXRoZXIgc2ltdWxhdG9yIGhhcyBiZWVuIHJ1biBiZWZvcmU6ICR7ZnJlc2ggPyAnbm8nIDogJ3llcyd9YCk7XG5cbiAgICByZXR1cm4gZnJlc2g7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBTaW11bGF0b3IuIE9uZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhlXG4gICAqIHN0YXRlcyBvZiBTaW11bGF0b3IgVUkgYW5kIHRoZSBTaW11bGF0b3IgaXRzZWxmLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IFNpbXVsYXRvciBpcyBydW5uaW5nLlxuICAgKi9cbiAgYXN5bmMgaXNSdW5uaW5nICgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RW52KCdkdW1teScpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNpbXVsYXRvciBpcyBpbiBzaHV0ZG93biBzdGF0ZS5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIFNpbXVsYXRvciBtaWdodCBhbHNvIGJlXG4gICAqIGluIHRoZSB0cmFuc2l0aW9uYWwgU2h1dHRpbmcgRG93biBzdGF0ZSByaWdodCBhZnRlciB0aGUgYHNodXRkb3duYFxuICAgKiBjb21tYW5kIGhhcyBiZWVuIGlzc3VlZC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgaXMgc2h1dCBkb3duLlxuICAgKi9cbiAgYXN5bmMgaXNTaHV0ZG93biAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLmdldEVudignZHVtbXknKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ0N1cnJlbnQgc3RhdGU6IFNodXRkb3duJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIHRoZSBTaW11bGF0b3IgYm9vdGluZyBpcyBjb21wbGV0ZWQgYW5kL29yIHdhaXQgZm9yIGl0XG4gICAqIHVudGlsIHRoZSB0aW1lb3V0IGV4cGlyZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydHVwVGltZW91dCAtIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgYm9vdGluZyBpcyBjb21wbGV0ZWQuXG4gICAqIEBlbWl0cyBCT09UX0NPTVBMRVRFRF9FVkVOVCBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgaXMgcmVhZHkgdG8gYWNjZXB0IHNpbWN0bCBjb21tYW5kcywgbGlrZSAnaW5zdGFsbCcuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQm9vdCAoc3RhcnR1cFRpbWVvdXQpIHtcbiAgICAvLyB3YWl0IGZvciB0aGUgc2ltdWxhdG9yIHRvIGJvb3RcbiAgICAvLyB3YWl0aW5nIGZvciB0aGUgc2ltdWxhdG9yIHN0YXR1cyB0byBiZSAnYm9vdGVkJyBpc24ndCBnb29kIGVub3VnaFxuICAgIC8vIGl0IGNsYWltcyB0byBiZSBib290ZWQgd2F5IGJlZm9yZSBmaW5pc2hpbmcgbG9hZGluZ1xuICAgIC8vIGxldCdzIHRhaWwgdGhlIHNpbXVsYXRvciBzeXN0ZW0gbG9nIHVudGlsIHdlIHNlZSBhIG1hZ2ljIGxpbmUgKHRoaXMuYm9vdGVkSW5kaWNhdG9yKVxuICAgIGxldCBib290ZWRJbmRpY2F0b3IgPSBhd2FpdCB0aGlzLmdldEJvb3RlZEluZGljYXRvclN0cmluZygpO1xuICAgIGF3YWl0IHRoaXMudGFpbExvZ3NVbnRpbChib290ZWRJbmRpY2F0b3IsIHN0YXJ0dXBUaW1lb3V0KTtcblxuICAgIC8vIHNvIHNvcnJ5LCBidXQgd2Ugc2hvdWxkIHdhaXQgYW5vdGhlciB0d28gc2Vjb25kcywganVzdCB0byBtYWtlIHN1cmUgd2UndmUgcmVhbGx5IHN0YXJ0ZWRcbiAgICAvLyB3ZSBjYW4ndCBsb29rIGZvciBhbm90aGVyIG1hZ2ljIGxvZyBsaW5lLCBiZWNhdXNlIHRoZXkgc2VlbSB0byBiZSBhcHAtZGVwZW5kZW50IChub3Qgc3lzdGVtIGRlcGVuZGVudClcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgYW4gZXh0cmEgJHt0aGlzLmV4dHJhU3RhcnR1cFRpbWV9bXMgZm9yIHRoZSBzaW11bGF0b3IgdG8gcmVhbGx5IGZpbmlzaCBib290aW5nYCk7XG4gICAgYXdhaXQgQi5kZWxheSh0aGlzLmV4dHJhU3RhcnR1cFRpbWUpO1xuICAgIGxvZy5kZWJ1ZygnRG9uZSB3YWl0aW5nIGV4dHJhIHRpbWUgZm9yIHNpbXVsYXRvcicpO1xuXG4gICAgdGhpcy5lbWl0KEJPT1RfQ09NUExFVEVEX0VWRU5UKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbWFnaWMgc3RyaW5nLCB3aGljaCwgaWYgcHJlc2VudCBpbiBsb2dzLCByZWZsZWN0cyB0aGUgZmFjdCB0aGF0IHNpbXVsYXRvciBib290aW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFnaWMgbG9nIHN0cmluZy5cbiAgICovXG4gIGFzeW5jIGdldEJvb3RlZEluZGljYXRvclN0cmluZyAoKSB7XG4gICAgbGV0IGluZGljYXRvcjtcbiAgICBsZXQgcGxhdGZvcm1WZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgY2FzZSAnNy4xJzpcbiAgICAgIGNhc2UgJzguMSc6XG4gICAgICBjYXNlICc4LjInOlxuICAgICAgY2FzZSAnOC4zJzpcbiAgICAgIGNhc2UgJzguNCc6XG4gICAgICAgIGluZGljYXRvciA9ICdwcm9maWxlZDogU2VydmljZSBzdGFydGluZy4uLic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnOS4wJzpcbiAgICAgIGNhc2UgJzkuMSc6XG4gICAgICBjYXNlICc5LjInOlxuICAgICAgY2FzZSAnOS4zJzpcbiAgICAgICAgaW5kaWNhdG9yID0gJ1N5c3RlbSBhcHAgXCJjb20uYXBwbGUuc3ByaW5nYm9hcmRcIiBmaW5pc2hlZCBzdGFydHVwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcxMC4wJzpcbiAgICAgICAgaW5kaWNhdG9yID0gJ1N3aXRjaGluZyB0byBrZXlib2FyZCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLndhcm4oYE5vIGJvb3QgaW5kaWNhdG9yIGNhc2UgZm9yIHBsYXRmb3JtIHZlcnNpb24gJyR7cGxhdGZvcm1WZXJzaW9ufSdgKTtcbiAgICAgICAgaW5kaWNhdG9yID0gJ25vIGJvb3QgaW5kaWNhdG9yIHN0cmluZyBhdmFpbGFibGUnO1xuICAgIH1cbiAgICByZXR1cm4gaW5kaWNhdG9yO1xuICB9XG5cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU2ltdWxhdG9yT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IHNjYWxlRmFjdG9yIFtudWxsXSAtIERlZmluZXMgdGhlIHdpbmRvdyBzY2FsZSB2YWx1ZSBmb3IgdGhlIFVJIGNsaWVudCB3aW5kb3cgZm9yIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICogICBFcXVhbHMgdG8gbnVsbCBieSBkZWZhdWx0LCB3aGljaCBrZWVwcyB0aGUgY3VycmVudCBzY2FsZSB1bmNoYW5nZWQuXG4gICAqICAgSXQgc2hvdWxkIGJlIG9uZSBvZiBbJzEuMCcsICcwLjc1JywgJzAuNScsICcwLjMzJywgJzAuMjUnXS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0dXBUaW1lb3V0IFs2MDAwMF0gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgU2ltdWxhdG9yIGJvb3RpbmdcbiAgICogICBwcm9jZXNzIGlzIGNvbXBsZXRlZC4gVGhlIGRlZmF1bHQgdGltZW91dCB3aWxsIGJlIHVzZWQgaWYgbm90IHNldCBleHBsaWNpdGx5LlxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnQgdGhlIFNpbXVsYXRvciBVSSBjbGllbnQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG4gICAqIEBwYXJhbSB7U2ltdWxhdG9yT3B0aW9uc30gb3B0cyAtIFNpbXVsYXRvciBzdGFydHVwIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIHN0YXJ0VUlDbGllbnQgKG9wdHMgPSB7fSkge1xuICAgIG9wdHMgPSBfLmNsb25lRGVlcChvcHRzKTtcbiAgICBfLmRlZmF1bHRzRGVlcChvcHRzLCB7XG4gICAgICBzY2FsZUZhY3RvcjogbnVsbCxcbiAgICAgIHN0YXJ0dXBUaW1lb3V0OiB0aGlzLnN0YXJ0dXBUaW1lb3V0LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2ltdWxhdG9yQXBwID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldFhjb2RlUGF0aCgpLCAnQXBwbGljYXRpb25zJywgdGhpcy5zaW11bGF0b3JBcHApO1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAnLUZuJywgc2ltdWxhdG9yQXBwLFxuICAgICAgJy0tYXJncycsICctQ3VycmVudERldmljZVVESUQnLCB0aGlzLnVkaWQsXG4gICAgXTtcblxuICAgIGlmIChvcHRzLnNjYWxlRmFjdG9yKSB7XG4gICAgICBjb25zdCB7bmFtZX0gPSBhd2FpdCB0aGlzLnN0YXQoKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERldmljZU5hbWUgPSBuYW1lLnJlcGxhY2UoL1xccysvZywgJy0nKTtcbiAgICAgIGNvbnN0IGFyZ3VtZW50TmFtZSA9IGAtU2ltdWxhdG9yV2luZG93TGFzdFNjYWxlLWNvbS5hcHBsZS5Db3JlU2ltdWxhdG9yLlNpbURldmljZVR5cGUuJHtmb3JtYXR0ZWREZXZpY2VOYW1lfWA7XG4gICAgICBhcmdzLnB1c2goYXJndW1lbnROYW1lLCBvcHRzLnNjYWxlRmFjdG9yKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgU2ltdWxhdG9yIFVJIHdpdGggY29tbWFuZDogb3BlbiAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdvcGVuJywgYXJncywge3RpbWVvdXQ6IG9wdHMuc3RhcnR1cFRpbWVvdXR9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICghKGVyci5zdGRvdXQgfHwgJycpLmluY2x1ZGVzKCctMTA4MjUnKSAmJiAhKGVyci5zdGRlcnIgfHwgJycpLmluY2x1ZGVzKCctMTA4MjUnKSkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBsb2cud2FybihgRXJyb3Igd2hpbGUgb3BlbmluZyBVSTogJHtlcnIuc3Rkb3V0IHx8IGVyci5zdGRlcnJ9LiBDb250aW51aW5nYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGdpdmVuIFNpbXVsYXRvciB3aXRoIG9wdGlvbnMuIFRoZSBTaW11bGF0b3Igd2lsbCBub3QgYmUgcmVzdGFydGVkIGlmXG4gICAqIGl0IGlzIGFscmVhZHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBPbmUgb3IgbW9yZSBvZiBhdmFpbGFibGUgU2ltdWxhdG9yIG9wdGlvbnMuXG4gICAqICAgU2VlIHsjc3RhcnRVSUNsaWVudChvcHRzKX0gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIG90aGVyIHN1cHBvcnRlZCBrZXlzLlxuICAgKi9cbiAgYXN5bmMgcnVuIChvcHRzID0ge30pIHtcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBzdGFydHVwVGltZW91dDogdGhpcy5zdGFydHVwVGltZW91dCxcbiAgICB9LCBvcHRzKTtcbiAgICBjb25zdCBpc1NlcnZlclJ1bm5pbmcgPSBhd2FpdCB0aGlzLmlzUnVubmluZygpO1xuICAgIGNvbnN0IGlzVUlDbGllbnRSdW5uaW5nID0gYXdhaXQgdGhpcy5pc1VJQ2xpZW50UnVubmluZygpO1xuICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgaXNVSUNsaWVudFJ1bm5pbmcpIHtcbiAgICAgIGxvZy5pbmZvKGBCb3RoIFNpbXVsYXRvciB3aXRoIFVESUQgJHt0aGlzLnVkaWR9IGFuZCB0aGUgVUkgY2xpZW50IGFyZSBjdXJyZW50bHkgcnVubmluZ2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNodXRkb3duKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRXJyb3Igb24gU2ltdWxhdG9yIHNodXRkb3duOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN0YXJ0VUlDbGllbnQob3B0cyk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KG9wdHMuc3RhcnR1cFRpbWVvdXQpO1xuICAgIGxvZy5pbmZvKGBTaW11bGF0b3Igd2l0aCBVRElEICR7dGhpcy51ZGlkfSBib290ZWQgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXNgKTtcbiAgfVxuXG4gIC8vIFRPRE8ga2VlcCBrZXljaGFpbnNcbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjdXJyZW50IFNpbXVsYXRvciB0byB0aGUgY2xlYW4gc3RhdGUuXG4gICAqL1xuICBhc3luYyBjbGVhbiAoKSB7XG4gICAgYXdhaXQgdGhpcy5lbmRTaW11bGF0b3JEYWVtb24oKTtcbiAgICBsb2cuaW5mbyhgQ2xlYW5pbmcgc2ltdWxhdG9yICR7dGhpcy51ZGlkfWApO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLmVyYXNlRGV2aWNlKDEwMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3J1YiAoZGVsZXRlIHRoZSBwcmVmZXJlbmNlcyBhbmQgY2hhbmdlZCBmaWxlcykgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gU2ltdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwRmlsZSAtIEFwcGxpY2F0aW9uIG5hbWUgbWludXMgXCIuYXBwXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBCdW5kbGVJZCAtIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGFzeW5jIHNjcnViQ3VzdG9tQXBwIChhcHBGaWxlLCBhcHBCdW5kbGVJZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsZWFuQ3VzdG9tQXBwKGFwcEZpbGUsIGFwcEJ1bmRsZUlkLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbi9zY3J1YiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiBTaW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBGaWxlIC0gQXBwbGljYXRpb24gbmFtZSBtaW51cyBcIi5hcHBcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEJ1bmRsZUlkIC0gQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjcnViIC0gSWYgYHNjcnViYCBpcyBmYWxzZSwgd2Ugd2FudCB0byBjbGVhbiBieSBkZWxldGluZyB0aGUgYXBwIGFuZCBhbGxcbiAgICogICBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQuIElmIGBzY3J1YmAgaXMgdHJ1ZSwgd2UganVzdCB3YW50IHRvIGRlbGV0ZSB0aGUgcHJlZmVyZW5jZXMgYW5kXG4gICAqICAgY2hhbmdlZCBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGNsZWFuQ3VzdG9tQXBwIChhcHBGaWxlLCBhcHBCdW5kbGVJZCwgc2NydWIgPSBmYWxzZSkge1xuICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgYXBwIGRhdGEgZmlsZXMgZm9yICcke2FwcEZpbGV9JywgJyR7YXBwQnVuZGxlSWR9J2ApO1xuICAgIGlmICghc2NydWIpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRpbmcgYXBwIGFsdG9nZXRoZXJgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIGRlbGV0ZWRcbiAgICBsZXQgYXBwRGlycyA9IGF3YWl0IHRoaXMuZ2V0QXBwRGlycyhhcHBGaWxlLCBhcHBCdW5kbGVJZCwgc2NydWIpO1xuXG4gICAgaWYgKGFwcERpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2cuZGVidWcoJ0NvdWxkIG5vdCBmaW5kIGFwcCBkaXJlY3RvcmllcyB0byBkZWxldGUuIEl0IGlzIHByb2JhYmx5IG5vdCBpbnN0YWxsZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGRpciBvZiBhcHBEaXJzKSB7XG4gICAgICBsb2cuZGVidWcoYERlbGV0aW5nIGRpcmVjdG9yeTogJyR7ZGlyfSdgKTtcbiAgICAgIGRlbGV0ZVByb21pc2VzLnB1c2goZnMucmltcmFmKGRpcikpO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpID49IDgpIHtcbiAgICAgIGxldCByZWxSbVBhdGggPSBgTGlicmFyeS9QcmVmZXJlbmNlcy8ke2FwcEJ1bmRsZUlkfS5wbGlzdGA7XG4gICAgICBsZXQgcm1QYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0Um9vdERpcigpLCByZWxSbVBhdGgpO1xuICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyBmaWxlOiAnJHtybVBhdGh9J2ApO1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYocm1QYXRoKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgQi5hbGwoZGVsZXRlUHJvbWlzZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHBhdGhzIHRvIGRpcnMgd2hlcmUgYXBwbGljYXRpb24gZGF0YSBpcyBzdG9yZWQuIGlPUyA4KyBzdG9yZXMgYXBwIGRhdGEgaW4gdHdvIHBsYWNlcyxcbiAgICogYW5kIGlPUyA3LjEgaGFzIG9ubHkgb25lIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwRmlsZSAtIEFwcGxpY2F0aW9uIG5hbWUgbWludXMgXCIuYXBwXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBCdW5kbGVJZCAtIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzY3J1YiAtIFRoZSBgQnVuZGxlYCBkaXJlY3RvcnkgaGFzIHRoZSBhY3R1YWwgYXBwIGluIGl0LiBJZiB3ZSBhcmUganVzdCBzY3J1YmJpbmcsXG4gICAqICAgd2Ugd2FudCB0aGlzIHRvIHN0YXkuIElmIHdlIGFyZSBjbGVhbmluZyB3ZSBkZWxldGUuXG4gICAqIEByZXR1cm4ge2FycmF5PHN0cmluZz59IEFycmF5IG9mIGFwcGxpY2F0aW9uIGRhdGEgcGF0aHMuXG4gICAqL1xuICBhc3luYyBnZXRBcHBEaXJzIChhcHBGaWxlLCBhcHBCdW5kbGVJZCwgc2NydWIgPSBmYWxzZSkge1xuICAgIGxldCBkaXJzID0gW107XG4gICAgaWYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkgPj0gOCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldEFwcERpcihhcHBCdW5kbGVJZCk7XG4gICAgICBpZiAoIWRhdGEpIHJldHVybiBkaXJzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAgIGxldCBidW5kbGUgPSAhc2NydWIgPyBhd2FpdCB0aGlzLmdldEFwcERpcihhcHBCdW5kbGVJZCwgJ0J1bmRsZScpIDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGxldCBzcmMgb2YgW2RhdGEsIGJ1bmRsZV0pIHtcbiAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgIGRpcnMucHVzaChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5nZXRBcHBEaXIoYXBwRmlsZSk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkaXJzLnB1c2goZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIFNpbXVsYXRvciBpbiBvcmRlciB0byBoYXZlIHRoZSBpbml0aWFsIGZpbGUgc3RydWN0dXJlIGNyZWF0ZWQgYW5kIHNodXRkb3duIGl0IGFmdGVyd2FyZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2FmYXJpIC0gV2hldGhlciB0byBleGVjdXRlIG1vYmlsZSBTYWZhcmkgYWZ0ZXIgc3RhcnR1cC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0dXBUaW1lb3V0IC0gSG93IGxvbmcgdG8gd2FpdCB1bnRpbCBTaW11bGF0b3IgYm9vdGluZyBpcyBjb21wbGV0ZWQgKGluIG1pbGxpc2Vjb25kcykuXG4gICAqL1xuICBhc3luYyBsYXVuY2hBbmRRdWl0IChzYWZhcmkgPSBmYWxzZSwgc3RhcnR1cFRpbWVvdXQgPSB0aGlzLnN0YXJ0dXBUaW1lb3V0KSB7XG4gICAgbG9nLmRlYnVnKCdBdHRlbXB0aW5nIHRvIGxhdW5jaCBhbmQgcXVpdCB0aGUgc2ltdWxhdG9yLCB0byBjcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZScpO1xuICAgIGxvZy5kZWJ1ZyhgV2lsbCBsYXVuY2ggd2l0aCBTYWZhcmk/ICR7c2FmYXJpfWApO1xuXG4gICAgYXdhaXQgdGhpcy5ydW4oe3N0YXJ0dXBUaW1lb3V0fSk7XG5cbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICBhd2FpdCB0aGlzLm9wZW5VcmwoJ2h0dHA6Ly93d3cuYXBwaXVtLmlvJyk7XG4gICAgfVxuXG4gICAgLy8gd2FpdCBmb3IgdGhlIHN5c3RlbSB0byBjcmVhdGUgdGhlIGZpbGVzIHdlIHdpbGwgbWFuaXB1bGF0ZVxuICAgIC8vIG5lZWQgcXVpdGUgYSBoaWdoIHJldHJ5IG51bWJlciwgaW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgaU9TIDcuMVxuICAgIC8vIGxvY2FsbHksIDcuMSBhdmVyYWdlcyA4LjUgcmV0cmllcyAoZnJvbSA2IC0gMTIpXG4gICAgLy8gICAgICAgICAgOCBhdmVyYWdlcyAwLjYgcmV0cmllcyAoZnJvbSAwIC0gMilcbiAgICAvLyAgICAgICAgICA5IGF2ZXJhZ2VzIDE0IHJldHJpZXNcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCg2MCwgMjUwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmlzRnJlc2goKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2ltdWxhdG9yIGZpbGVzIG5vdCBmdWxseSBjcmVhdGVkLiBXYWl0aW5nIGEgYml0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYFRpbWVvdXQgd2FpdGluZyBmb3Igc2ltdWxhdG9yIGZpbGVzIHRvIGJlIGNyZWF0ZWQuIENvbnRpbnVpbmdgKTtcbiAgICB9XG5cbiAgICAvLyBhbmQgcXVpdFxuICAgIGF3YWl0IHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyBmb3IgbGF1bmNoZCBkYWVtb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpbSB1ZGlkIGFuZCB0cmllcyB0byBzdG9wIHRoZW0gY2xlYW5seVxuICAgKiBUaGlzIHByZXZlbnRzIHhjcnVuIHNpbWN0bCBlcmFzZSBmcm9tIGhhbmdpbmcuXG4gICAqL1xuICBhc3luYyBlbmRTaW11bGF0b3JEYWVtb24gKCkge1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBhbnkgc2ltdWxhdG9yIGRhZW1vbnMgZm9yICR7dGhpcy51ZGlkfWApO1xuXG4gICAgbGV0IGxhdW5jaGN0bENtZCA9IGBsYXVuY2hjdGwgbGlzdCB8IGdyZXAgJHt0aGlzLnVkaWR9IHwgY3V0IC1mIDMgfCB4YXJncyAtbiAxIGxhdW5jaGN0bGA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzdG9wQ21kID0gYCR7bGF1bmNoY3RsQ21kfSBzdG9wYDtcbiAgICAgIGF3YWl0IGV4ZWMoJ2Jhc2gnLCBbJy1jJywgc3RvcENtZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYENvdWxkIG5vdCBzdG9wIHNpbXVsYXRvciBkYWVtb25zOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgbG9nLmRlYnVnKCdDYXJyeWluZyBvbiBhbnl3YXkhJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsZXQgcmVtb3ZlQ21kID0gYCR7bGF1bmNoY3RsQ21kfSByZW1vdmVgO1xuICAgICAgYXdhaXQgZXhlYygnYmFzaCcsIFsnLWMnLCByZW1vdmVDbWRdKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3QgcmVtb3ZlIHNpbXVsYXRvciBkYWVtb25zOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgbG9nLmRlYnVnKCdDYXJyeWluZyBvbiBhbnl3YXkhJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyBXYWl0cyAxMCBzZWMgZm9yIHRoZSBzaW11bGF0b3IgbGF1bmNoZCBzZXJ2aWNlcyB0byBzdG9wLlxuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2Jhc2gnLCBbJy1jJyxcbiAgICAgICAgICBgcHMgLWUgIHwgZ3JlcCAke3RoaXMudWRpZH0gfCBncmVwIGxhdW5jaGRfc2ltIHwgZ3JlcCAtdiBiYXNoIHwgZ3JlcCAtdiBncmVwIHwgYXdrIHsncHJpbnQkMSd9YF0pO1xuICAgICAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICB9LCB7d2FpdE1zOiAxMDAwMCwgaW50ZXJ2YWxNczogNTAwfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgQ291bGQgbm90IGVuZCBzaW11bGF0b3IgZGFlbW9uIGZvciAke3RoaXMudWRpZH06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2cuZGVidWcoJ0NhcnJ5aW5nIG9uIGFueXdheSEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU2h1dGRvd25PcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICAgKiBTaW11bGF0b3IgaXMgc2h1dCBkb3duIGNvbXBsZXRlbHkuIE5vIHdhaXQgaGFwcGVucyBpZiB0aGUgdGltZW91dCB2YWx1ZSBpcyBub3Qgc2V0XG4gICAqL1xuXG4gIC8qKlxuICAgKiBTaHV0IGRvd24gdGhlIGN1cnJlbnQgU2ltdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gez9TaHV0ZG93bk9wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIFNpbXVsYXRvciBmYWlscyB0byB0cmFuc2l0aW9uIGludG8gU2h1dGRvd24gc3RhdGUgYWZ0ZXJcbiAgICogdGhlIGdpdmVuIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIHNodXRkb3duIChvcHRzID0ge30pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1NodXRkb3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCByZXRyeUludGVydmFsKDUsIDUwMCwgdGhpcy5zaW1jdGwuc2h1dGRvd25EZXZpY2UuYmluZCh0aGlzLnNpbWN0bCkpO1xuICAgIGNvbnN0IHdhaXRNcyA9IHBhcnNlSW50KG9wdHMudGltZW91dCwgMTApO1xuICAgIGlmICh3YWl0TXMgPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTaHV0ZG93bigpLCB7XG4gICAgICAgICAgd2FpdE1zLFxuICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaW11bGF0b3IgaXMgbm90IGluICdTaHV0ZG93bicgc3RhdGUgYWZ0ZXIgJHt3YWl0TXN9bXNgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBwYXJ0aWN1bGFyIFNpbXVsYXRvciBmcm9tIGRldmljZXMgbGlzdFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlICgpIHtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5kZWxldGVEZXZpY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBhcnRpY3VsYXIgcHJlZmVyZW5jZSBmaWxlIHdpdGggdGhlIGdpdmVuIGtleS92YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBsaXN0IC0gVGhlIHByZWZlcmVuY2VzIGZpbGUgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdXBkYXRlcyAtIFRoZSBrZXkvdmFsdWUgcGFpcnMgdG8gdXBkYXRlLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2V0dGluZ3MgKHBsaXN0LCB1cGRhdGVzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHNldHRpbmdzLnVwZGF0ZVNldHRpbmdzKHRoaXMsIHBsaXN0LCB1cGRhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemUvZGUtYXV0aG9yaXplIGxvY2F0aW9uIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBhcHBsaWNhdGlvbiBJRCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXV0aG9yaXplZCAtIFdoZXRoZXIgb3Igbm90IHRvIGF1dGhvcml6ZS5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MgKGJ1bmRsZUlkLCBhdXRob3JpemVkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHNldHRpbmdzLnVwZGF0ZUxvY2F0aW9uU2V0dGluZ3ModGhpcywgYnVuZGxlSWQsIGF1dGhvcml6ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9EaXNhYmxlIHJlZHVjZSBtb3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVkdWNlTW90aW9uIC0gV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGl0LlxuICAgKi9cbiAgYXN5bmMgc2V0UmVkdWNlTW90aW9uIChyZWR1Y2VNb3Rpb24gPSB0cnVlKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmxhdW5jaEFuZFF1aXQoZmFsc2UsIFNUQVJUVVBfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2V0dGluZ3Muc2V0UmVkdWNlTW90aW9uKHRoaXMsIHJlZHVjZU1vdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBVSSBhcHBlYXJhbmNlIHN0eWxlLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIGJvb3RlZCBzaW11bGF0b3IuXG4gICAqXG4gICAqIEBzaW5jZSBYY29kZSBTREsgMTEuNFxuICAgKi9cbiAgYXN5bmMgc2V0QXBwZWFyYW5jZSAoLyogdmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgdGhyb3cgbmV3IEVycm9yKGBYY29kZSBTREsgJyR7dGhpcy54Y29kZVZlcnNpb259JyBpcyB0b28gb2xkIHRvIHNldCBVSSBhcHBlYXJhbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBVSSBhcHBlYXJhbmNlIHN0eWxlXG4gICAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgYm9vdGVkIHNpbXVsYXRvci5cbiAgICpcbiAgICogQHNpbmNlIFhjb2RlIFNESyAxMS40XG4gICAqL1xuICBhc3luYyBnZXRBcHBlYXJhbmNlICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgdGhyb3cgbmV3IEVycm9yKGBYY29kZSBTREsgJyR7dGhpcy54Y29kZVZlcnNpb259JyBpcyB0b28gb2xkIHRvIGdldCBVSSBhcHBlYXJhbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHNldHRpbmdzIGZvciBTYWZhcmkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIC0gVGhlIGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIHRvIHVwZGF0ZSBmb3IgU2FmYXJpLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2FmYXJpU2V0dGluZ3MgKHVwZGF0ZXMpIHtcbiAgICBsZXQgdXBkYXRlZCA9IGF3YWl0IHNldHRpbmdzLnVwZGF0ZVNhZmFyaVVzZXJTZXR0aW5ncyh0aGlzLCB1cGRhdGVzKTtcbiAgICByZXR1cm4gYXdhaXQgc2V0dGluZ3MudXBkYXRlU2V0dGluZ3ModGhpcywgJ21vYmlsZVNhZmFyaScsIHVwZGF0ZXMpIHx8IHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGdsb2JhbCBzZXR0aW5ncyBmb3IgU2FmYXJpLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdXBkYXRlcyAtIFRoZSBoYXNoIG9mIGtleS92YWx1ZSBwYWlycyB0byB1cGRhdGUgZm9yIFNhZmFyaS5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzICh1cGRhdGVzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHNldHRpbmdzLnVwZGF0ZVNhZmFyaUdsb2JhbFNldHRpbmdzKHRoaXMsIHVwZGF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgbG9jYWxlIGZvciB0aGUgU2ltdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgZm9yIHRoZSBzaW11bGF0b3IuIEUuZy4sIGBcImZyX1VTXCJgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIC0gVGhlIGxvY2FsZSB0byBzZXQgZm9yIHRoZSBzaW11bGF0b3IuIEUuZy4sIGBcImVuXCJgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsZW5kYXJGb3JtYXQgLSBUaGUgZm9ybWF0IG9mIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUxvY2FsZSAobGFuZ3VhZ2UsIGxvY2FsZSwgY2FsZW5kYXJGb3JtYXQpIHtcbiAgICByZXR1cm4gYXdhaXQgc2V0dGluZ3MudXBkYXRlTG9jYWxlKHRoaXMsIGxhbmd1YWdlLCBsb2NhbGUsIGNhbGVuZGFyRm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZWx5IGRlbGV0ZSBtb2JpbGUgU2FmYXJpIGFwcGxpY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgU2ltdWxhdG9yLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlU2FmYXJpICgpIHtcbiAgICBsb2cuZGVidWcoJ0RlbGV0aW5nIFNhZmFyaSBhcHBzIGZyb20gc2ltdWxhdG9yJyk7XG5cbiAgICBsZXQgZGlycyA9IFtdO1xuXG4gICAgLy8gZ2V0IHRoZSBkYXRhIGRpcmVjdG9yeVxuICAgIGRpcnMucHVzaChhd2FpdCB0aGlzLmdldEFwcERpcignY29tLmFwcGxlLm1vYmlsZXNhZmFyaScpKTtcblxuICAgIGxldCBwdiA9IGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKHB2ID49IDgpIHtcbiAgICAgIC8vIGdldCB0aGUgYnVuZGxlIGRpcmVjdG9yeVxuICAgICAgZGlycy5wdXNoKGF3YWl0IHRoaXMuZ2V0QXBwRGlyKCdjb20uYXBwbGUubW9iaWxlc2FmYXJpJywgJ0J1bmRsZScpKTtcbiAgICB9XG5cbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGxldCBkaXIgb2YgXy5jb21wYWN0KGRpcnMpKSB7XG4gICAgICBsb2cuZGVidWcoYERlbGV0aW5nIGRpcmVjdG9yeTogJyR7ZGlyfSdgKTtcbiAgICAgIGRlbGV0ZVByb21pc2VzLnB1c2goZnMucmltcmFmKGRpcikpO1xuICAgIH1cbiAgICBhd2FpdCBCLmFsbChkZWxldGVQcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIGRpcmVjdG9yaWVzIGZvciBtb2JpbGUgU2FmYXJpLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBQcmVmcyAtIFdoZXRoZXIgdG8ga2VlcCBTYWZhcmkgcHJlZmVyZW5jZXMgZnJvbSBiZWluZyBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW5TYWZhcmkgKGtlZXBQcmVmcyA9IHRydWUpIHtcbiAgICBsb2cuZGVidWcoJ0NsZWFuaW5nIG1vYmlsZSBzYWZhcmkgZGF0YSBmaWxlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmlzRnJlc2goKSkge1xuICAgICAgbG9nLmluZm8oJ0NvdWxkIG5vdCBmaW5kIFNhZmFyaSBzdXBwb3J0IGRpcmVjdG9yaWVzIHRvIGNsZWFuIG91dCBvbGQgJyArXG4gICAgICAgICAgICAgICAnZGF0YS4gUHJvYmFibHkgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiBvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbGlicmFyeURpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldERpcigpLCAnTGlicmFyeScpO1xuICAgIGxldCBzYWZhcmlSb290ID0gYXdhaXQgdGhpcy5nZXRBcHBEaXIoJ2NvbS5hcHBsZS5tb2JpbGVzYWZhcmknKTtcbiAgICBpZiAoIXNhZmFyaVJvb3QpIHtcbiAgICAgIGxvZy5pbmZvKCdDb3VsZCBub3QgZmluZCBTYWZhcmkgc3VwcG9ydCBkaXJlY3RvcmllcyB0byBjbGVhbiBvdXQgb2xkICcgK1xuICAgICAgICAgICAgICAgJ2RhdGEuIFByb2JhYmx5IHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xlYW4gb3V0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzYWZhcmlMaWJyYXJ5RGlyID0gcGF0aC5yZXNvbHZlKHNhZmFyaVJvb3QsICdMaWJyYXJ5Jyk7XG4gICAgbGV0IGZpbGVzVG9EZWxldGUgPSBbXG4gICAgICAnQ2FjaGVzL1NuYXBzaG90cy9jb20uYXBwbGUubW9iaWxlc2FmYXJpJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLm1vYmlsZXNhZmFyaS8qJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLldlYkFwcENhY2hlLyonLFxuICAgICAgJ0NhY2hlcy9jb20uYXBwbGUuV2ViS2l0Lk5ldHdvcmtpbmcvKicsXG4gICAgICAnQ2FjaGVzL2NvbS5hcHBsZS5XZWJLaXQuV2ViQ29udGVudC8qJyxcbiAgICAgICdJbWFnZSBDYWNoZS8qJyxcbiAgICAgICdXZWJLaXQvY29tLmFwcGxlLm1vYmlsZXNhZmFyaS8qJyxcbiAgICAgICdXZWJLaXQvR2VvbG9jYXRpb25TaXRlcy5wbGlzdCcsXG4gICAgICAnV2ViS2l0L0xvY2FsU3RvcmFnZS8qLionLFxuICAgICAgJ1NhZmFyaS8qJyxcbiAgICAgICdDb29raWVzLyouYmluYXJ5Y29va2llcycsXG4gICAgICAnQ2FjaGVzL2NvbS5hcHBsZS5VSVN0YXR1c0Jhci8qJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLmtleWJvYXJkcy9pbWFnZXMvKicsXG4gICAgICAnQ2FjaGVzL2NvbS5hcHBsZS5TYWZhcmkuU2FmZUJyb3dzaW5nLyonLFxuICAgICAgJy4uL3RtcC9jb20uYXBwbGUubW9iaWxlc2FmYXJpLyonXG4gICAgXTtcbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXNUb0RlbGV0ZSkge1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYocGF0aC5yZXNvbHZlKGxpYnJhcnlEaXIsIGZpbGUpKSk7XG4gICAgICBkZWxldGVQcm9taXNlcy5wdXNoKGZzLnJpbXJhZihwYXRoLnJlc29sdmUoc2FmYXJpTGlicmFyeURpciwgZmlsZSkpKTtcbiAgICB9XG5cbiAgICBpZiAoIWtlZXBQcmVmcykge1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHNhZmFyaUxpYnJhcnlEaXIsICdQcmVmZXJlbmNlcy8qLnBsaXN0JykpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBCLmFsbChkZWxldGVQcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1aW5kbGUgSUQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlbW92ZWQuXG4gICAqL1xuICBhc3luYyByZW1vdmVBcHAgKGJ1bmRsZUlkKSB7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwucmVtb3ZlQXBwKGJ1bmRsZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgYnVpbHQtaW4gYXBwbGljYXRpb24gdG8gYSBuZXcgcGxhY2UgKGFjdHVhbGx5LCByZW5hbWUgaXQpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhcHAgdG8gYmUgbW92ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGN1cnJlbnQgcGF0aCB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdBcHBQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogICBJZiBzb21lIGFwcGxpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGJ5IHRoaXMgcGF0aCB0aGVuIGl0J3MgZ29pbmcgdG8gYmUgcmVtb3ZlZC5cbiAgICovXG4gIGFzeW5jIG1vdmVCdWlsdEluQXBwIChhcHBOYW1lLCBhcHBQYXRoLCBuZXdBcHBQYXRoKSB7XG4gICAgYXdhaXQgc2FmZVJpbVJhZihuZXdBcHBQYXRoKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBuZXdBcHBQYXRoKTtcbiAgICBsb2cuZGVidWcoYENvcGllZCAnJHthcHBOYW1lfScgdG8gJyR7bmV3QXBwUGF0aH0nYCk7XG5cbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBUZW1wb3JhcmlseSBkZWxldGVkIG9yaWdpbmFsIGFwcCBhdCAnJHthcHBQYXRofSdgKTtcblxuICAgIHJldHVybiBbbmV3QXBwUGF0aCwgYXBwUGF0aF07XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZ2l2ZW4gVVJMIGluIG1vYmlsZSBTYWZhcmkgYnJvd3Nlci5cbiAgICogVGhlIGJyb3dzZXIgd2lsbCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgaWYgaXQgaXMgbm90IHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGJlIG9wZW5lZC5cbiAgICovXG4gIGFzeW5jIG9wZW5VcmwgKHVybCkge1xuICAgIGNvbnN0IFNBRkFSSV9CT09URURfSU5ESUNBVE9SID0gJ01vYmlsZVNhZmFyaVsnO1xuICAgIGNvbnN0IFNBRkFSSV9TVEFSVFVQX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4gICAgY29uc3QgRVhUUkFfU1RBUlRVUF9USU1FID0gMyAqIDEwMDA7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgYXdhaXQgcmV0cnkoNTAwMCwgdGhpcy5zaW1jdGwub3BlblVybC5iaW5kKHRoaXMuc2ltY3RsKSwgdXJsKTtcbiAgICAgIGF3YWl0IHRoaXMudGFpbExvZ3NVbnRpbChTQUZBUklfQk9PVEVEX0lORElDQVRPUiwgU0FGQVJJX1NUQVJUVVBfVElNRU9VVCk7XG4gICAgICAvLyBTbyBzb3JyeSwgYnV0IHRoZSBsb2dzIGhhdmUgbm90aGluZyBlbHNlIGZvciBTYWZhcmkgc3RhcnRpbmcuLiBqdXN0IGRlbGF5IGEgbGl0dGxlIGJpdFxuICAgICAgbG9nLmRlYnVnKGBTYWZhcmkgc3RhcnRlZCwgd2FpdGluZyAke0VYVFJBX1NUQVJUVVBfVElNRX1tcyBmb3IgaXQgdG8gZnVsbHkgc3RhcnRgKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoRVhUUkFfU1RBUlRVUF9USU1FKTtcbiAgICAgIGxvZy5kZWJ1ZygnRG9uZSB3YWl0aW5nIGZvciBTYWZhcmknKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBvcGVuIGEgdXJsLCBidXQgdGhlIFNpbXVsYXRvciBpcyBub3QgQm9vdGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gU2ltdWxhdG9yIGNhY2hlcyBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ30gZm9sZGVyTmFtZXMgLSBUaGUgbmFtZXMgb2YgQ2FjaGVzIHN1YmZvbGRlcnMgdG8gYmUgY2xlYW5lZC5cbiAgICogICBOb24tYWNjZXNzaWJsZS9ub24tZXhpc3Rpbmcgc3ViZm9sZGVycyB3aWxsIGJlIHNraXBwZWQuXG4gICAqICAgQWxsIGV4aXN0aW5nIHN1YmZvbGRlcnMgdW5kZXIgQ2FjaGVzIHdpbGwgYmUgZGVsZXRlZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY291bnQgb2YgY2xlYW5lZCBjYWNoZSBpdGVtcy5cbiAgICogICBaZXJvIGlzIHJldHVybmVkIGlmIG5vIGl0ZW1zIHdlcmUgbWF0Y2hlZCBmb3IgY2xlYW51cCAoZWl0aGVyIG5vdCBhY2Nlc3NpYmxlIG9yIG5vdCBkaXJlY3RvcmllcykuXG4gICAqL1xuICBhc3luYyBjbGVhckNhY2hlcyAoLi4uZm9sZGVyTmFtZXMpIHtcbiAgICBjb25zdCBjYWNoZXNSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0RGlyKCksICdMaWJyYXJ5JywgJ0NhY2hlcycpO1xuICAgIGlmICghKGF3YWl0IGZzLmhhc0FjY2VzcyhjYWNoZXNSb290KSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ2FjaGVzIHJvb3QgYXQgJyR7Y2FjaGVzUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLiBOb3RoaW5nIHRvIGRvIHRoZXJlYCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgaXRlbXNUb1JlbW92ZSA9IGZvbGRlck5hbWVzLmxlbmd0aCA/IGZvbGRlck5hbWVzIDogKGF3YWl0IGZzLnJlYWRkaXIoY2FjaGVzUm9vdCkpO1xuICAgIGl0ZW1zVG9SZW1vdmUgPSBpdGVtc1RvUmVtb3ZlLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKGNhY2hlc1Jvb3QsIHgpKTtcbiAgICBpZiAoZm9sZGVyTmFtZXMubGVuZ3RoKSB7XG4gICAgICBpdGVtc1RvUmVtb3ZlID0gYXdhaXQgQi5maWx0ZXIoaXRlbXNUb1JlbW92ZSwgKHgpID0+IGZzLmhhc0FjY2Vzcyh4KSk7XG4gICAgfVxuICAgIGl0ZW1zVG9SZW1vdmUgPSBhd2FpdCBCLmZpbHRlcihpdGVtc1RvUmVtb3ZlLCBhc3luYyAoeCkgPT4gKGF3YWl0IGZzLnN0YXQoeCkpLmlzRGlyZWN0b3J5KCkpO1xuICAgIGlmICghaXRlbXNUb1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm8gU2ltdWxhdG9yIGNhY2hlIGl0ZW1zIGZvciBjbGVhbnVwIHdlcmUgbWF0Y2hlZCBpbiAnJHtjYWNoZXNSb290fSdgKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgTWF0Y2hlZCAke3V0aWwucGx1cmFsaXplKCdzaW11bGF0b3IgY2FjaGUgaXRlbScsIGl0ZW1zVG9SZW1vdmUubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgZm9yIGNsZWFudXA6ICR7aXRlbXNUb1JlbW92ZX1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQi5hbGwoaXRlbXNUb1JlbW92ZSwgKHgpID0+IGZzLnJpbXJhZih4KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oYEdvdCBhbiBleGNlcHRpb24gd2hpbGUgY2xlYW5pbmcgU2ltdWxhdG9yIGNhY2hlczogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtc1RvUmVtb3ZlLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCbG9ja3MgdW50aWwgdGhlIGdpdmVuIGluZGljYXRlciBzdHJpbmcgYXBwZWFycyBpbiBTaW11bGF0b3IgbG9ncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJvb3RlZEluZGljYXRvciAtIFRoZSBtYWdpYyBzdHJpbmcsIHdoaWNoIGFwcGVhcnMgaW4gbG9ncyBhZnRlciBTaW11bGF0b3IgYm9vdGluZyBpcyBjb21wbGV0ZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgLSBUaGUgbWF4aW11bW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc3RyaW5nIGluZGljYXRvciBwcmVzZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGlvcyBzaW11bGF0b3IgbG9ncyBvdXRwdXQgYSBsaW5lIG1hdGNoaW5nIGBib290ZWRJbmRpY2F0b3JgXG4gICAqIHRpbWVzIG91dCBhZnRlciB0aW1lb3V0TXNcbiAgICovXG4gIGFzeW5jIHRhaWxMb2dzVW50aWwgKGJvb3RlZEluZGljYXRvciwgdGltZW91dE1zKSB7XG4gICAgbGV0IHNpbUxvZyA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldExvZ0RpcigpLCAnc3lzdGVtLmxvZycpO1xuXG4gICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgbG9nIGZpbGUgZXhpc3RzIGJlZm9yZSB3ZSBjYW4gdGFpbCBpdFxuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoMjAwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBleGlzdHMgPSBhd2FpdCBmcy5leGlzdHMoc2ltTG9nKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgU2ltdWxhdG9yIGxvZzogJyR7c2ltTG9nfSdgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZy5pbmZvKGBTaW11bGF0b3IgbG9nIGF0ICcke3NpbUxvZ30nYCk7XG4gICAgbG9nLmluZm8oYFRhaWxpbmcgc2ltdWxhdG9yIGxvZ3MgdW50aWwgd2UgZW5jb3VudGVyIHRoZSBzdHJpbmcgXCIke2Jvb3RlZEluZGljYXRvcn1cImApO1xuICAgIGxvZy5pbmZvKGBXZSB3aWxsIHRpbWUgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRhaWxVbnRpbChzaW1Mb2csIGJvb3RlZEluZGljYXRvciwgdGltZW91dE1zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5kZWJ1ZygnU2ltdWxhdG9yIHN0YXJ0dXAgdGltZWQgb3V0LiBDb250aW51aW5nIGFueXdheS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIENhbGVuZGFyIGFjY2VzcyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSUQgLSBCdW5kbGUgSUQgb2YgdGhlIGFwcGxpY2F0aW9uLCBmb3Igd2hpY2ggdGhlIGFjY2VzcyBzaG91bGQgYmUgZ3JhbnRlZC5cbiAgICovXG4gIGFzeW5jIGVuYWJsZUNhbGVuZGFyQWNjZXNzIChidW5kbGVJRCkge1xuICAgIGF3YWl0IHRoaXMuY2FsZW5kYXIuZW5hYmxlQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgQ2FsZW5kYXIgYWNjZXNzIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJRCAtIEJ1bmRsZSBJRCBvZiB0aGUgYXBwbGljYXRpb24sIGZvciB3aGljaCB0aGUgYWNjZXNzIHNob3VsZCBiZSBkZW5pZWQuXG4gICAqL1xuICBhc3luYyBkaXNhYmxlQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgYXdhaXQgdGhpcy5jYWxlbmRhci5kaXNhYmxlQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGhhcyBhY2Nlc3MgdG8gQ2FsZW5kYXIuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGhhcyB0aGUgYWNjZXNzLlxuICAgKi9cbiAgYXN5bmMgaGFzQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsZW5kYXIuaGFzQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyBTaW11bGF0b3Igd2luZG93LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7P3N0cmluZ30gSWYgdGhlIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHRoZW4gaXQgc2hvdWxkIGJlIGEgdmFsaWQgQXBwbGUgU2NyaXB0IHdoaWNoXG4gICAqIGlzIGFwcGVuZGVkIGJlZm9yZSBlYWNoIFVJIGNsaWVudCBjb21tYW5kIGlzIGV4ZWN1dGVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCBzaG91bGQgYWN0aXZhdGUgdGhlIHdpbmRvd1xuICAgKiBpdHNlbGYgYW5kIHJldHVybiBub3RoaW5nLlxuICAgKi9cbiAgYXN5bmMgX2FjdGl2YXRlV2luZG93ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgY29uc3QgcGlkID0gYXdhaXQgdGhpcy5nZXRVSUNsaWVudFBpZCgpO1xuICAgIGlmIChwaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUFwcChwaWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cuZGVidWcoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBzZXQgZnJvbnRtb3N0IHRvIGZhbHNlXG4gICAgICAgICAgc2V0IGZyb250bW9zdCB0byB0cnVlXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBnaXZlbiBBcHBsZSBTY3JpcHQgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiwgc28gb3RoZXJcbiAgICogc2Vzc2lvbnMgY2Fubm90IGluZmx1ZW5jZSB0aGUgVUkgY2xpZW50IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBsZVNjcmlwdCAtIFRoZSB2YWxpZCBBcHBsZSBTY3JpcHQgc25pcHBldCB0byBiZSBleGVjdXRlZC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3Rkb3V0IG91dHB1dCBwcm9kdWNlZCBieSB0aGUgc2NyaXB0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3Nhc2NyaXB0IHRvb2wgcmV0dXJucyBub24temVybyBleGl0IGNvZGUuXG4gICAqL1xuICBhc3luYyBleGVjdXRlVUlDbGllbnRTY3JpcHQgKGFwcGxlU2NyaXB0KSB7XG4gICAgY29uc3Qgd2luZG93QWN0aXZhdGlvblNjcmlwdCA9IGF3YWl0IHRoaXMuX2FjdGl2YXRlV2luZG93KCk7XG4gICAgY29uc3QgcmVzdWx0U2NyaXB0ID0gYCR7d2luZG93QWN0aXZhdGlvblNjcmlwdCA/IHdpbmRvd0FjdGl2YXRpb25TY3JpcHQgKyAnXFxuJyA6ICcnfSR7YXBwbGVTY3JpcHR9YDtcbiAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyBVSSBBcHBsZSBTY3JpcHQgb24gU2ltdWxhdG9yIHdpdGggVURJRCAke3RoaXMudWRpZH06ICR7cmVzdWx0U2NyaXB0fWApO1xuICAgIHJldHVybiBhd2FpdCBVSV9DTElFTlRfQUNDRVNTX0dVQVJELmFjcXVpcmUodGhpcy5zaW11bGF0b3JBcHAsIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnb3Nhc2NyaXB0JywgWyctZScsIHJlc3VsdFNjcmlwdF0pO1xuICAgICAgICByZXR1cm4gc3Rkb3V0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgY29tcGxldGUgb3BlcmF0aW9uLiBNYWtlIHN1cmUgU2ltdWxhdG9yIFVJIGlzIHJ1bm5pbmcgYW5kIHRoZSBwYXJlbnQgQXBwaXVtIGFwcGxpY2F0aW9uIChlLiBnLiBBcHBpdW0uYXBwIG9yIFRlcm1pbmFsLmFwcCkgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBpcyBwcmVzZW50IGluIFN5c3RlbSBQcmVmZXJlbmNlcyA+IFNlY3VyaXR5ICYgUHJpdmFjeSA+IFByaXZhY3kgPiBBY2Nlc3NpYmlsaXR5IGxpc3QuIElmIHRoZSBvcGVyYXRpb24gaXMgc3RpbGwgdW5zdWNjZXNzZnVsIHRoZW4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgU2ltdWxhdG9yLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBCaW9tZXRyaWMgRW5yb2xsbWVudCBmZWF0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gRWl0aGVyIHRydWUgb3IgZmFsc2VcbiAgICogQHRocm93cyB7RXJyb3J9IElmIEVucm9sbG1lbnQgc3RhdGUgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIGFzeW5jIGlzQmlvbWV0cmljRW5yb2xsZWQgKCkge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBzZXQgZHN0TWVudUl0ZW0gdG8gbWVudSBpdGVtIFwiVG91Y2ggSUQgRW5yb2xsZWRcIiBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIkhhcmR3YXJlXCIgb2YgbWVudSBiYXIgMVxuICAgICAgICAgIHNldCBpc0NoZWNrZWQgdG8gKHZhbHVlIG9mIGF0dHJpYnV0ZSBcIkFYTWVudUl0ZW1NYXJrQ2hhclwiIG9mIGRzdE1lbnVJdGVtKSBpcyBcIuKck1wiXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICAgIGxvZy5kZWJ1ZyhgVG91Y2ggSUQgZW5yb2xsZWQgc3RhdGU6ICR7b3V0cHV0fWApO1xuICAgIHJldHVybiBfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRyaW0oKSA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucm9sbHMgYmlvbWV0cmljIChUb3VjaElkLCBGYWNlSWQpIGZlYXR1cmUgdGVzdGluZyBpbiBTaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW5hYmxlZCAtIERlZmluZXMgd2hldGhlciBiaW9tZXRyaWMgc3RhdGUgaXMgZW5hYmxlZC9kaXNhYmxlZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVucm9sbGVkIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkXG4gICAqL1xuICBhc3luYyBlbnJvbGxCaW9tZXRyaWMgKGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIlRvdWNoIElEIEVucm9sbGVkXCIgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJIYXJkd2FyZVwiIG9mIG1lbnUgYmFyIDFcbiAgICAgICAgICBzZXQgaXNDaGVja2VkIHRvICh2YWx1ZSBvZiBhdHRyaWJ1dGUgXCJBWE1lbnVJdGVtTWFya0NoYXJcIiBvZiBkc3RNZW51SXRlbSkgaXMgXCLinJNcIlxuICAgICAgICAgIGlmICR7aXNFbmFibGVkID8gJ25vdCAnIDogJyd9aXNDaGVja2VkIHRoZW5cbiAgICAgICAgICAgIGNsaWNrIGRzdE1lbnVJdGVtXG4gICAgICAgICAgZW5kIGlmXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIG1hdGNoL25vdCBtYXRjaCB0aGUgdG91Y2ggaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IHNob3VsZE1hdGNoIFt0cnVlXSAtIFNldCBpdCB0byB0cnVlIG9yIGZhbHNlIGluIG9yZGVyIHRvIGVtdWxhdGVcbiAgICogbWF0Y2hpbmcvbm90IG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpb21ldHJpY1xuICAgKi9cbiAgYXN5bmMgc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIiR7c2hvdWxkTWF0Y2ggPyAnTWF0Y2hpbmcnIDogJ05vbi1tYXRjaGluZyd9XCIgb2YgbWVudSAxIG9mIG1lbnUgaXRlbSBcIlNpbXVsYXRlIEZpbmdlciBUb3VjaFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgICAgY2xpY2sgZHN0TWVudUl0ZW1cbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNwZWNpYWwgQXBwbGUgc2NyaXB0LCB3aGljaCBjbGlja3MgdGhlIHBhcnRpY3VsYXIgYnV0dG9uIG9uIERhdGFiYXNlIGFsZXJ0LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY3JlYXNlIC0gQ2xpY2sgdGhlIGJ1dHRvbiB3aXRoICdJbmNyZWFzZScgdGl0bGUgb24gdGhlIGFsZXJ0IGlmIHRoaXNcbiAgICogICBwYXJhbWV0ZXIgaXMgdHJ1ZS4gVGhlICdDYW5jZWwnIGJ1dHRvbiB3aWxsIGJlIGNsaWNrZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgZGlzbWlzc0RhdGFiYXNlQWxlcnQgKGluY3JlYXNlID0gdHJ1ZSkge1xuICAgIGxldCBidXR0b24gPSBpbmNyZWFzZSA/ICdJbmNyZWFzZScgOiAnQ2FuY2VsJztcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gZGlzbWlzcyBkYXRhYmFzZSBhbGVydCB3aXRoICcke2J1dHRvbn0nIGJ1dHRvbmApO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBjbGljayBidXR0b24gXCIke2J1dHRvbn1cIiBvZiB3aW5kb3cgMVxuICAgICAgICBlbmQgdGVsbFxuICAgICAgZW5kIHRlbGxcbiAgICBgKTtcbiAgfVxuXG4gIC8vcmVnaW9uIEtleWNoYWlucyBJbnRlcmFjdGlvblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBiYWNrdXAgb2Yga2V5Y2hhaW5zIGZvbGRlci5cbiAgICogVGhlIHByZXZpb3VzbHkgY3JlYXRlZCBiYWNrdXAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIGRlbGV0ZWQgaWYgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCB0d2ljZSBpbiBhIHJvdyB3aXRob3V0XG4gICAqIGByZXN0b3JlS2V5Y2hhaW5zYCBiZWluZyBpbnZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYmFja3VwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bGwuXG4gICAqL1xuICBhc3luYyBiYWNrdXBLZXljaGFpbnMgKCkge1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMua2V5Y2hhaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFBhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe1xuICAgICAgcHJlZml4OiBga2V5Y2hhaW5zX2JhY2t1cF8ke01hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSl9YCxcbiAgICAgIHN1ZmZpeDogJy56aXAnLFxuICAgIH0pO1xuICAgIGNvbnN0IHppcEFyZ3MgPSBbXG4gICAgICAnLXInLCBiYWNrdXBQYXRoLFxuICAgICAgYCR7dGhpcy5rZXljaGFpblBhdGh9JHtwYXRoLnNlcH1gXG4gICAgXTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIGtleWNoYWlucyBiYWNrdXAgd2l0aCAnemlwICR7emlwQXJncy5qb2luKCcgJyl9JyBjb21tYW5kYCk7XG4gICAgYXdhaXQgZXhlYygnemlwJywgemlwQXJncyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCkgJiYgYXdhaXQgZnMuZXhpc3RzKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGggPSBiYWNrdXBQYXRoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgdGhlIHByZXZpc291bHkgY3JlYXRlZCBrZXljaGFpbnMgYmFja3VwLlxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gZXhjbHVkZVBhdHRlcm5zIC0gVGhlIGxpc3RcbiAgICogb2YgZmlsZSBuYW1lIHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkIGZyb20gcmVzdG9yZS4gVGhlIGZvcm1hdFxuICAgKiBvZiBlYWNoIGl0ZW0gc2hvdWxkIGJlIHRoZSBzYW1lIGFzICcteCcgb3B0aW9uIGZvcm1hdCBmb3JcbiAgICogJ3VuemlwJyB1dGlsaXR5LiBUaGlzIGNhbiBhbHNvIGJlIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyxcbiAgICogd2hpY2ggaXMgZ29pbmcgYmUgdHJhbnNmb3JtZWQgaW50byBhIGxpc3QgYXV0b21hdGljYWxseSxcbiAgICogZm9yIGV4YW1wbGU6ICcqLmRiKixibGFibGEuc3FsaXRlJ1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgdGhlIHJlc3RvcmUgb3ByYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBubyBrZXljaGFpbnMgYmFja3VwIGF2YWlsYWJsZSBmb3IgcmVzdG9yZS5cbiAgICovXG4gIGFzeW5jIHJlc3RvcmVLZXljaGFpbnMgKGV4Y2x1ZGVQYXR0ZXJucyA9IFtdKSB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpIHx8ICFhd2FpdCBmcy5leGlzdHModGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGtleWNoYWlucyBiYWNrdXAgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYEFyZSB5b3Ugc3VyZSBpdCB3YXMgY3JlYXRlZCBiZWZvcmU/YCk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNTdHJpbmcoZXhjbHVkZVBhdHRlcm5zKSkge1xuICAgICAgZXhjbHVkZVBhdHRlcm5zID0gZXhjbHVkZVBhdHRlcm5zLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSk7XG4gICAgfVxuICAgIGNvbnN0IGlzU2VydmVyUnVubmluZyA9IGF3YWl0IHRoaXMuaXNSdW5uaW5nKCk7XG4gICAgbGV0IHBsaXN0UGF0aDtcbiAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nKSB7XG4gICAgICBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGhpcy5nZXRMYXVuY2hEYWVtb25zUm9vdCgpLCAnY29tLmFwcGxlLnNlY3VyaXR5ZC5wbGlzdCcpO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBrZXljaGFpbnMgYmVjYXVzZSAnJHtwbGlzdFBhdGh9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRoaXMua2V5Y2hhaW5QYXRoKTtcbiAgICAgIGF3YWl0IG1rZGlycCh0aGlzLmtleWNoYWluUGF0aCk7XG4gICAgICBjb25zdCB1bnppcEFyZ3MgPSBbXG4gICAgICAgICctbycsIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgsXG4gICAgICAgIC4uLihfLmZsYXRNYXAoZXhjbHVkZVBhdHRlcm5zLm1hcCgoeCkgPT4gWycteCcsIHhdKSkpLFxuICAgICAgICAnLWQnLCAnLydcbiAgICAgIF07XG4gICAgICBsb2cuZGVidWcoYFJlc3RvcmluZyBrZXljaGFpbnMgd2l0aCAndW56aXAgJHt1bnppcEFyZ3Muam9pbignICcpfScgY29tbWFuZGApO1xuICAgICAgYXdhaXQgZXhlYygndW56aXAnLCB1bnppcEFyZ3MpO1xuICAgICAgYXdhaXQgZnMudW5saW5rKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpO1xuICAgICAgdGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCA9IG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgcGxpc3RQYXRoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbJ2xhdW5jaGN0bCcsICdsb2FkJywgcGxpc3RQYXRoXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBLZXljaGFpbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHNpbXVsYXRvciBpbiBydW50aW1lICh0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3AgaXQpLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYga2V5Y2hhaW4gY2xlYW51cCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYXJLZXljaGFpbnMgKCkge1xuICAgIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0aGlzLmdldExhdW5jaERhZW1vbnNSb290KCksICdjb20uYXBwbGUuc2VjdXJpdHlkLnBsaXN0Jyk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIga2V5Y2hhaW5zIGJlY2F1c2UgJyR7cGxpc3RQYXRofScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMua2V5Y2hhaW5QYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5rZXljaGFpblBhdGgpO1xuICAgICAgICBhd2FpdCBta2RpcnAodGhpcy5rZXljaGFpblBhdGgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoWydsYXVuY2hjdGwnLCAnbG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaWQgVGhlIGFjdHVhbCBwcm9jZXNzIGlkZW50aWZpZXIuXG4gICAqIENvdWxkIGJlIHplcm8gaWYgdGhlIHByb2Nlc3MgaXMgdGhlIHN5c3RlbSBvbmUuXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZ3JvdXAgVGhlIHByb2Nlc3MgZ3JvdXAgaWRlbnRpZmllci5cbiAgICogVGhpcyBjb3VsZCBiZSBgbnVsbGAgaWYgdGhlIHByb2Nlc3MgaXMgbm90IGEgcGFydCBvZiB0aGVcbiAgICogcGFydGljdWxhciBncm91cC4gRm9yIGBub3JtYWxgIGFwcGxpY2F0aW9uIHByb2Nlc3NlcyB0aGUgZ3JvdXBcbiAgICogbmFtZSB1c3VhbGx5IGVxdWFscyB0byBgVUlLaXRBcHBsaWNhdGlvbmAuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9jZXNzIG5hbWUsIGZvciBleGFtcGxlXG4gICAqIGBjb20uYXBwbGUuUHJlZmVyZW5jZXNgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0cyBwcm9jZXNzZXMgdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIGdpdmVuIFNpbXVsYXRvci5cbiAgICogVGhlIHNpbXVsYXRvciBtdXN0IGJlIGluIHJ1bm5pbmcgc3RhdGUgaW4gb3JkZXIgZm9yIHRoaXNcbiAgICogbWV0aG9kIHRvIHdvcmsgcHJvcGVybHkuXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5PFByb2Nlc3NJbmZvPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHByb2Nlc3NcbiAgICogaW5mb3JtYXRpb25cbiAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIHByb2Nlc3MgaW5mb3JtYXRpb24gY291bGQgYmUgcmV0cmlldmVkLlxuICAgKi9cbiAgYXN5bmMgcHMgKCkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdsYXVuY2hjdGwnLFxuICAgICAgJ3ByaW50JyxcbiAgICAgICdzeXN0ZW0nLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2VydmljZXNNYXRjaCA9IC9eXFxzKnNlcnZpY2VzXFxzKj1cXHMqeyhbXn1dKykvbS5leGVjKHN0ZG91dCk7XG4gICAgaWYgKCFzZXJ2aWNlc01hdGNoKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGxpc3Qgb2YgYWN0aXZlIHByb2Nlc3NlcyBjYW5ub3QgYmUgcmV0cmlldmVkYCk7XG4gICAgfVxuICAgIC8qXG4gICAgRXhhbXBsZSBtYXRjaDpcbiAgICAgICAgMCAgICAgNzggXHRjb20uYXBwbGUucmVzb3VyY2VncmFiYmVyZFxuICAgIDgyMTU4ICAgICAgLSBcdGNvbS5hcHBsZS5hc3Npc3RhbnRfc2VydmljZVxuICAgIDgyMTIwICAgICAgLSBcdGNvbS5hcHBsZS5uYW5vcmVnaXN0cnlkXG4gICAgODIwODcgICAgICAtIFx0Y29tLmFwcGxlLm5vdGlmeWRcbiAgICA4MjI2NCAgICAgIC0gXHRVSUtpdEFwcGxpY2F0aW9uOmNvbS5hcHBsZS5QcmVmZXJlbmNlc1s3MDRiXVtyYi1sZWdhY3ldXG4gICAgKi9cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqKFxcZCspXFxzK1tcXGQtXStcXHMrKFtcXHdcXC0uXSs6KT8oW1xcd1xcLS5dKykvZ207XG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc2VydmljZXNNYXRjaFsxXSkpKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHBpZDogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSxcbiAgICAgICAgZ3JvdXA6IF8udHJpbUVuZChtYXRjaFsyXSwgJzonKSB8fCBudWxsLFxuICAgICAgICBuYW1lOiBtYXRjaFszXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhcnRpY3VsYXIgcGVybWlzc2lvbiB0byB0aGUgYXBwbGljYXRpb24gYnVuZGxlLiBTZWVcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3dpeC9BcHBsZVNpbXVsYXRvclV0aWxzIGZvciBtb3JlIGRldGFpbHMgb25cbiAgICogdGhlIGF2YWlsYWJsZSBzZXJ2aWNlIG5hbWVzIGFuZCBzdGF0dXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gQXBwbGljYXRpb24gYnVuZGxlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gU2VydmljZSBuYW1lIHRvIGJlIHNldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIGRlc2lyZWQgc3RhdHVzIGZvciB0aGUgc2VydmljZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgc2V0UGVybWlzc2lvbiAoYnVuZGxlSWQsIHBlcm1pc3Npb24sIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRQZXJtaXNzaW9ucyhidW5kbGVJZCwge1twZXJtaXNzaW9uXTogdmFsdWV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYnVuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgLSBBcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBlcm1pc3Npb25zTWFwcGluZyAtIEEgbWFwcGluZyB3aGVyZSBrYXlzXG4gICAqIGFyZSBzZXJ2aWNlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzIHZhbHVlcy5cbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aXgvQXBwbGVTaW11bGF0b3JVdGlsc1xuICAgKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBzZXJ2aWNlIG5hbWVzIGFuZCBzdGF0dXNlcy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIGFzeW5jIHNldFBlcm1pc3Npb25zIChidW5kbGVJZCwgcGVybWlzc2lvbnNNYXBwaW5nKSB7XG4gICAgbG9nLmRlYnVnKGBTZXR0aW5nIGFjY2VzcyBmb3IgJyR7YnVuZGxlSWR9JzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9uc01hcHBpbmcsIG51bGwsIDIpKTtcbiAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25zLnNldEFjY2VzcyhidW5kbGVJZCwgcGVybWlzc2lvbnNNYXBwaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY3VycmVudCBwZXJtaXNzaW9uIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gQXBwbGljYXRpb24gYnVuZGxlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSAtIE9uZSBvZiBhdmFpbGFibGUgc2VydmljZSBuYW1lcy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGVybWlzc2lvbiAoYnVuZGxlSWQsIHNlcnZpY2VOYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9ucy5nZXRBY2Nlc3MoYnVuZGxlSWQsIHNlcnZpY2VOYW1lKTtcbiAgICBsb2cuZGVidWcoYEdvdCAke3NlcnZpY2VOYW1lfSBhY2Nlc3Mgc3RhdHVzIGZvciAnJHtidW5kbGVJZH0nOiAke3Jlc3VsdH1gKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGdpdmVuIGNlcnRpZmljYXRlIGludG8gdGhlIFRydXN0ZWQgUm9vdCBTdG9yZSBvbiB0aGUgc2ltdWxhdG9yLlxuICAgKiBUaGUgc2ltdWxhdG9yIG11c3QgYmUgc2h1dCBkb3duIGluIG9yZGVyIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrIHByb3Blcmx5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF5bG9hZCB0aGUgY29udGVudCBvZiB0aGUgUEVNIGNlcnRpZmljYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNlcnRpZmljYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWRcbiAgICogb3IgYGZhbHNlYCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHRoZXJlXG4gICAqL1xuICBhc3luYyBhZGRDZXJ0aWZpY2F0ZSAocGF5bG9hZCwgLyogb3B0cyA9IHt9ICovKSB7XG4gICAgaWYgKGF3YWl0IGhhc1NTTENlcnQocGF5bG9hZCwgdGhpcy51ZGlkKSkge1xuICAgICAgbG9nLmluZm8oYFNTTCBjZXJ0aWZpY2F0ZSAnJHtfLnRydW5jYXRlKHBheWxvYWQsIHtsZW5ndGg6IDIwfSl9JyBhbHJlYWR5IGluc3RhbGxlZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBTU0wgcm9vdCBjZXJ0aWZpY2F0ZSAnJHtfLnRydW5jYXRlKHBheWxvYWQsIHtsZW5ndGg6IDIwfSl9J2ApO1xuICAgIGF3YWl0IGluc3RhbGxTU0xDZXJ0KHBheWxvYWQsIHRoaXMudWRpZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGVzIHB1c2ggbm90aWZpY2F0aW9uIGRlbGl2ZXJ5XG4gICAqXG4gICAqIEBzaW5jZSBYY29kZSBTREsgMTEuNFxuICAgKi9cbiAgYXN5bmMgcHVzaE5vdGlmaWNhdGlvbiAoLyogcGF5bG9hZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFhjb2RlIFNESyAnJHt0aGlzLnhjb2RlVmVyc2lvbn0nIGlzIHRvbyBvbGQgdG8gcHVzaCBub3RpZmljYXRpb25zYCk7XG4gIH1cblxuICBhc3luYyBnZXRMYXVuY2hEYWVtb25zUm9vdCAoKSB7XG4gICAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRldlJvb3QsXG4gICAgICAnUGxhdGZvcm1zL2lQaG9uZVNpbXVsYXRvci5wbGF0Zm9ybS9EZXZlbG9wZXIvU0RLcy9pUGhvbmVTaW11bGF0b3Iuc2RrL1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZ2V0RGV2aWNlU3RyaW5nUGxhdGZvcm1WZXJzaW9uIChwbGF0Zm9ybVZlcnNpb24pIHtcbiAgICBsZXQgcmVxVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICBpZiAoIXJlcVZlcnNpb24pIHtcbiAgICAgIHJlcVZlcnNpb24gPSBhd2FpdCB4Y29kZS5nZXRNYXhJT1NTREsoKTtcbiAgICAgIGxvZy53YXJuKGBObyBwbGF0Zm9ybSB2ZXJzaW9uIHNldC4gVXNpbmcgbWF4IFNESyB2ZXJzaW9uOiAke3JlcVZlcnNpb259YCk7XG4gICAgICAvLyB0aGlzIHdpbGwgYmUgYSBudW1iZXIsIGFuZCBwb3NzaWJseSBhbiBpbnRlZ2VyIChlLmcuLCBpZiBtYXggaU9TIFNESyBpcyA5KVxuICAgICAgLy8gc28gdHVybiBpdCBpbnRvIGEgc3RyaW5nIGFuZCBhZGQgYSAuMCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmICghXy5pc1N0cmluZyhyZXFWZXJzaW9uKSkge1xuICAgICAgICByZXFWZXJzaW9uID0gKHJlcVZlcnNpb24gJSAxKSA/IFN0cmluZyhyZXFWZXJzaW9uKSA6IGAke3JlcVZlcnNpb259LjBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVxVmVyc2lvbjtcbiAgfVxuXG4gIC8vIGNoYW5nZSB0aGUgZm9ybWF0IGluIHN1YmNsYXNzZXMsIGFzIG5lY2Vzc2FyeVxuICBzdGF0aWMgYXN5bmMgX2dldERldmljZVN0cmluZ1ZlcnNpb25TdHJpbmcgKHBsYXRmb3JtVmVyc2lvbikge1xuICAgIGxldCByZXFWZXJzaW9uID0gYXdhaXQgdGhpcy5fZ2V0RGV2aWNlU3RyaW5nUGxhdGZvcm1WZXJzaW9uKHBsYXRmb3JtVmVyc2lvbik7XG5cbiAgICByZXR1cm4gYCgke3JlcVZlcnNpb259IFNpbXVsYXRvcilgO1xuICB9XG5cbiAgLy8gY2hhbmdlIHRoZSBmb3JtYXQgaW4gc3ViY2xhc3NlcywgYXMgbmVjZXNzYXJ5XG4gIHN0YXRpYyBfZ2V0RGV2aWNlU3RyaW5nQ29uZmlnRml4ICgpIHtcbiAgICAvLyBzb21lIGRldmljZXMgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgcmV0dXJuIHtcbiAgICAgICdpUGFkIFNpbXVsYXRvciAoNy4xIFNpbXVsYXRvciknOiAnaVBhZCAyICg3LjEgU2ltdWxhdG9yKScsXG4gICAgICAnaVBhZCBTaW11bGF0b3IgKDguMCBTaW11bGF0b3IpJzogJ2lQYWQgMiAoOC4wIFNpbXVsYXRvciknLFxuICAgICAgJ2lQYWQgU2ltdWxhdG9yICg4LjEgU2ltdWxhdG9yKSc6ICdpUGFkIDIgKDguMSBTaW11bGF0b3IpJyxcbiAgICAgICdpUGFkIFNpbXVsYXRvciAoOC4yIFNpbXVsYXRvciknOiAnaVBhZCAyICg4LjIgU2ltdWxhdG9yKScsXG4gICAgICAnaVBhZCBTaW11bGF0b3IgKDguMyBTaW11bGF0b3IpJzogJ2lQYWQgMiAoOC4zIFNpbXVsYXRvciknLFxuICAgICAgJ2lQYWQgU2ltdWxhdG9yICg4LjQgU2ltdWxhdG9yKSc6ICdpUGFkIDIgKDguNCBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg3LjEgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNXMgKDcuMSBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg4LjQgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNiAoOC40IFNpbXVsYXRvciknLFxuICAgICAgJ2lQaG9uZSBTaW11bGF0b3IgKDguMyBTaW11bGF0b3IpJzogJ2lQaG9uZSA2ICg4LjMgU2ltdWxhdG9yKScsXG4gICAgICAnaVBob25lIFNpbXVsYXRvciAoOC4yIFNpbXVsYXRvciknOiAnaVBob25lIDYgKDguMiBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg4LjEgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNiAoOC4xIFNpbXVsYXRvciknLFxuICAgICAgJ2lQaG9uZSBTaW11bGF0b3IgKDguMCBTaW11bGF0b3IpJzogJ2lQaG9uZSA2ICg4LjAgU2ltdWxhdG9yKSdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgc2V0IG9mIG9wdGlvbnMgYW5kIGZpbmRzIHRoZSBjb3JyZWN0IGRldmljZSBzdHJpbmcgaW4gb3JkZXIgZm9yIEluc3RydW1lbnRzIHRvXG4gICAqIGlkZW50aWZ5IHRoZSBjb3JyZWN0IHNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOlxuICAgKiAgIC0gYGRldmljZU5hbWVgIC0gYSBuYW1lIGZvciB0aGUgZGV2aWNlLiBJZiB0aGUgZ2l2ZW4gZGV2aWNlIG5hbWUgc3RhcnRzIHdpdGggYD1gLCB0aGUgbmFtZSwgbGVzcyB0aGUgZXF1YWxzIHNpZ24sIGlzIHJldHVybmVkLlxuICAgKiAgIC0gYHBsYXRmb3JtVmVyc2lvbmAgLSB0aGUgdmVyc2lvbiBvZiBpT1MgdG8gdXNlLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBYY29kZSdzIG1heGltdW0gU0RLIHZlcnNpb24uXG4gICAqICAgLSBgZm9yY2VJcGhvbmVgIC0gZm9yY2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRldmljZSBzdHJpbmcgdG8gaVBob25lLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiAgIC0gYGZvcmNlSXBhZGAgLSBmb3JjZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZGV2aWNlIHN0cmluZyB0byBpUGFkLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiAgIElmIGJvdGggYGZvcmNlSXBob25lYCBhbmQgYGZvcmNlSXBhZGAgYXJlIHRydWUsIHRoZSBkZXZpY2Ugd2lsbCBiZSBmb3JjZWQgdG8gaVBob25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3VuZCBkZXZpY2Ugc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERldmljZVN0cmluZyAob3B0cykge1xuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICBkZXZpY2VOYW1lOiBudWxsLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBudWxsLFxuICAgICAgZm9yY2VJcGhvbmU6IGZhbHNlLFxuICAgICAgZm9yY2VJcGFkOiBmYWxzZVxuICAgIH0sIG9wdHMpO1xuICAgIGxldCBsb2dPcHRzID0ge1xuICAgICAgZGV2aWNlTmFtZTogb3B0cy5kZXZpY2VOYW1lLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBvcHRzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgIGZvcmNlSXBob25lOiBvcHRzLmZvcmNlSXBob25lLFxuICAgICAgZm9yY2VJcGFkOiBvcHRzLmZvcmNlSXBhZFxuICAgIH07XG4gICAgbG9nLmRlYnVnKGBHZXR0aW5nIGRldmljZSBzdHJpbmcgZnJvbSBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KGxvZ09wdHMpfWApO1xuXG4gICAgLy8gc2hvcnQgY2lyY3VpdCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZXZpY2UgbmFtZVxuICAgIGlmICgob3B0cy5kZXZpY2VOYW1lIHx8ICcnKVswXSA9PT0gJz0nKSB7XG4gICAgICByZXR1cm4gb3B0cy5kZXZpY2VOYW1lLnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICBsZXQgaXNpUGhvbmUgPSAhIW9wdHMuZm9yY2VJcGhvbmUgfHwgIW9wdHMuZm9yY2VJcGFkO1xuXG4gICAgaWYgKG9wdHMuZGV2aWNlTmFtZSkge1xuICAgICAgbGV0IGRldmljZSA9IG9wdHMuZGV2aWNlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGRldmljZS5pbmRleE9mKCdpcGhvbmUnKSAhPT0gLTEpIHtcbiAgICAgICAgaXNpUGhvbmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChkZXZpY2UuaW5kZXhPZignaXBhZCcpICE9PSAtMSkge1xuICAgICAgICBpc2lQaG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpb3NEZXZpY2VTdHJpbmcgPSBvcHRzLmRldmljZU5hbWUgfHwgKGlzaVBob25lID8gJ2lQaG9uZSBTaW11bGF0b3InIDogJ2lQYWQgU2ltdWxhdG9yJyk7XG5cbiAgICAvLyBpZiBzb21lb25lIHBhc3NlcyBpbiBqdXN0IFwiaVBob25lXCIsIG1ha2UgdGhhdCBcImlQaG9uZSBTaW11bGF0b3JcIiB0b1xuICAgIC8vIGNvbmZvcm0gdG8gYWxsIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICgvXihpUGhvbmV8aVBhZCkkLy50ZXN0KGlvc0RldmljZVN0cmluZykpIHtcbiAgICAgIGlvc0RldmljZVN0cmluZyArPSAnIFNpbXVsYXRvcic7XG4gICAgfVxuXG4gICAgLy8gd2Ugc3VwcG9ydCBkZXZpY2VOYW1lOiBcImlQaG9uZSBTaW11bGF0b3JcIiwgYW5kIGFsc28gd2FudCB0byBzdXBwb3J0XG4gICAgLy8gXCJpUGhvbmUgWFlaIFNpbXVsYXRvclwiLCBidXQgdGhlc2Ugc3RyaW5ncyBhcmVuJ3QgaW4gdGhlIGRldmljZSBsaXN0LlxuICAgIC8vIFNvLCBpZiBzb21lb25lIHNlbnQgaW4gXCJpUGhvbmUgWFlaIFNpbXVsYXRvclwiLCBzdHJpcCBvZmYgXCIgU2ltdWxhdG9yXCJcbiAgICAvLyBpbiBvcmRlciB0byBhbGxvdyB0aGUgZGVmYXVsdCBcImlQaG9uZSBYWVpcIiBtYXRjaFxuICAgIGlmICgvW14oaVBob25lfGlQYWQpXSBTaW11bGF0b3IvLnRlc3QoaW9zRGV2aWNlU3RyaW5nKSkge1xuICAgICAgaW9zRGV2aWNlU3RyaW5nID0gaW9zRGV2aWNlU3RyaW5nLnJlcGxhY2UoJyBTaW11bGF0b3InLCAnJyk7XG4gICAgfVxuICAgIGlvc0RldmljZVN0cmluZyArPSBgICR7YXdhaXQgdGhpcy5fZ2V0RGV2aWNlU3RyaW5nVmVyc2lvblN0cmluZyhvcHRzLnBsYXRmb3JtVmVyc2lvbil9YDtcblxuICAgIGxldCBDT05GSUdfRklYID0gdGhpcy5fZ2V0RGV2aWNlU3RyaW5nQ29uZmlnRml4KCk7XG5cbiAgICBsZXQgY29uZmlnRml4ID0gQ09ORklHX0ZJWDtcbiAgICBpZiAoY29uZmlnRml4W2lvc0RldmljZVN0cmluZ10pIHtcbiAgICAgIGlvc0RldmljZVN0cmluZyA9IGNvbmZpZ0ZpeFtpb3NEZXZpY2VTdHJpbmddO1xuICAgICAgbG9nLmRlYnVnKGBGaXhpbmcgZGV2aWNlLiBDaGFuZ2VkIGZyb20gJyR7b3B0cy5kZXZpY2VOYW1lfScgYCArXG4gICAgICAgICAgICAgICAgYHRvICcke2lvc0RldmljZVN0cmluZ30nYCk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBGaW5hbCBkZXZpY2Ugc3RyaW5nIGlzICcke2lvc0RldmljZVN0cmluZ30nYCk7XG4gICAgcmV0dXJuIGlvc0RldmljZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBzaW11bGF0b3IncyBXZWJJbnNwZWN0b3IgVW5peCBEb21haW4gU29ja2V0XG4gICAqICAgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHNvY2tldC5cbiAgICovXG4gIGFzeW5jIGdldFdlYkluc3BlY3RvclNvY2tldCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIC8vIHRoZXJlIGlzIG5vIFdlYkluc3BlY3RvciBzb2NrZXQgZm9yIHRoaXMgdmVyc2lvbiBvZiBYY29kZVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoZXh0ZW5zaW9ucykpIHtcbiAgU2ltdWxhdG9yWGNvZGU2LnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpbXVsYXRvclhjb2RlNjtcbmV4cG9ydCB7IFNpbXVsYXRvclhjb2RlNiwgQk9PVF9DT01QTEVURURfRVZFTlQsIFNQUklOR0JPQVJEX0JVTkRMRV9JRCB9O1xuIl0sImZpbGUiOiJsaWIvc2ltdWxhdG9yLXhjb2RlLTYuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
1144
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtNi5qcyJdLCJuYW1lcyI6WyJTVEFSVFVQX1RJTUVPVVQiLCJFWFRSQV9TVEFSVFVQX1RJTUUiLCJVSV9DTElFTlRfQUNDRVNTX0dVQVJEIiwiQXN5bmNMb2NrIiwiVUlfQ0xJRU5UX0JVTkRMRV9JRCIsIlNQUklOR0JPQVJEX0JVTkRMRV9JRCIsIkJPT1RfQ09NUExFVEVEX0VWRU5UIiwiU2ltdWxhdG9yWGNvZGU2IiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJ1ZGlkIiwieGNvZGVWZXJzaW9uIiwiU3RyaW5nIiwic2ltY3RsIiwiU2ltY3RsIiwiX3BsYXRmb3JtVmVyc2lvbiIsImtleWNoYWluUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0RGlyIiwic2ltdWxhdG9yQXBwIiwiYXBwRGF0YUJ1bmRsZVBhdGhzIiwiaXNGcmVzaEZpbGVzIiwiZXh0cmFTdGFydHVwVGltZSIsImNhbGVuZGFyIiwiQ2FsZW5kYXIiLCJwZXJtaXNzaW9ucyIsIlBlcm1pc3Npb25zIiwidWlDbGllbnRCdW5kbGVJZCIsImRldmljZXNTZXRQYXRoIiwidmFsdWUiLCJnZXRVSUNsaWVudFBpZCIsInN0ZG91dCIsImUiLCJpc05hTiIsInBhcnNlSW50IiwidHJpbSIsImxvZyIsImRlYnVnIiwiaXNVSUNsaWVudFJ1bm5pbmciLCJfIiwiaXNOdWxsIiwic3RhcnR1cFRpbWVvdXQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJzZGsiLCJzdGF0IiwiZ2V0Um9vdERpciIsImhvbWUiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsImdldExvZ0RpciIsImluc3RhbGxBcHAiLCJhcHAiLCJpc0FwcEluc3RhbGxlZCIsImJ1bmRsZUlkIiwiYXBwRmlsZSIsImFwcERpcnMiLCJnZXRBcHBEaXJzIiwibGVuZ3RoIiwiZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSIsImJ1bmRsZU5hbWUiLCJyb290VXNlckFwcERpciIsImJ1aWxkQnVuZGxlUGF0aE1hcCIsImJ1bmRsZUlkcyIsImlzRW1wdHkiLCJ1c2VyQXBwRGlyUGF0aCIsIk9iamVjdCIsImVudHJpZXMiLCJmcyIsInJlYWRkaXIiLCJmaW5kIiwiZmlsZSIsImV4dG5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZm9QbGlzdFBhdGgiLCJleGlzdHMiLCJpbmZvUGxpc3QiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwiQ0ZCdW5kbGVOYW1lIiwicHVzaCIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiZ2V0QXBwRGlyIiwiaWQiLCJzdWJEaXIiLCJpc0ZyZXNoIiwiYXBwbGljYXRpb25MaXN0IiwicGF0aEJ1bmRsZVBhaXIiLCJkaXIiLCJhcHBGaWxlcyIsImdsb2IiLCJtYXRjaCIsInJlYWRCdW5kbGVJZCIsIm1ldGFkYXRhIiwic2V0dGluZ3MiLCJyZWFkIiwiTUNNTWV0YWRhdGFJZGVudGlmaWVyIiwiYnVuZGxlUGF0aERpcnMiLCJidW5kbGVQYXRoUGFpcnMiLCJyZWR1Y2UiLCJidW5kbGVNYXAiLCJidW5kbGVQYXRoIiwiZGV2aWNlQXJyIiwidG9QYWlycyIsImdldERldmljZXMiLCJkZXZpY2UiLCJmaWxlcyIsInB2IiwibWFwIiwicyIsImV4aXN0ZW5jZXMiLCJmIiwiaGFzQWNjZXNzIiwiZnJlc2giLCJjb21wYWN0IiwiaXNSdW5uaW5nIiwiZ2V0RW52IiwiaXNTaHV0ZG93biIsImluY2x1ZGVzIiwic3RkZXJyIiwid2FpdEZvckJvb3QiLCJib290ZWRJbmRpY2F0b3IiLCJnZXRCb290ZWRJbmRpY2F0b3JTdHJpbmciLCJ0YWlsTG9nc1VudGlsIiwiQiIsImRlbGF5IiwiZW1pdCIsImluZGljYXRvciIsInBsYXRmb3JtVmVyc2lvbiIsInN0YXJ0VUlDbGllbnQiLCJvcHRzIiwiY2xvbmVEZWVwIiwiZGVmYXVsdHNEZWVwIiwic2NhbGVGYWN0b3IiLCJhcmdzIiwibmFtZSIsImZvcm1hdHRlZERldmljZU5hbWUiLCJyZXBsYWNlIiwiYXJndW1lbnROYW1lIiwiaW5mbyIsImpvaW4iLCJ0aW1lb3V0IiwicnVuIiwiYXNzaWduIiwiaXNTZXJ2ZXJSdW5uaW5nIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic2h1dGRvd24iLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJjbGVhbiIsImVuZFNpbXVsYXRvckRhZW1vbiIsImVyYXNlRGV2aWNlIiwic2NydWJDdXN0b21BcHAiLCJhcHBCdW5kbGVJZCIsImNsZWFuQ3VzdG9tQXBwIiwic2NydWIiLCJkZWxldGVQcm9taXNlcyIsInJpbXJhZiIsInJlbFJtUGF0aCIsInJtUGF0aCIsImFsbCIsImRpcnMiLCJkYXRhIiwiYnVuZGxlIiwidW5kZWZpbmVkIiwic3JjIiwibGF1bmNoQW5kUXVpdCIsInNhZmFyaSIsIk1PQklMRV9TQUZBUklfQlVORExFX0lEIiwiRXJyb3IiLCJsYXVuY2hjdGxDbWQiLCJzdG9wQ21kIiwicmVtb3ZlQ21kIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsInNodXRkb3duRGV2aWNlIiwiYmluZCIsImRlbGV0ZSIsImRlbGV0ZURldmljZSIsInVwZGF0ZVNldHRpbmdzIiwidXBkYXRlcyIsInVwZGF0ZUxvY2F0aW9uU2V0dGluZ3MiLCJhdXRob3JpemVkIiwic2V0UmVkdWNlTW90aW9uIiwicmVkdWNlTW90aW9uIiwic2V0QXBwZWFyYW5jZSIsImdldEFwcGVhcmFuY2UiLCJ1cGRhdGVTYWZhcmlTZXR0aW5ncyIsInVwZGF0ZWQiLCJ1cGRhdGVTYWZhcmlVc2VyU2V0dGluZ3MiLCJ1cGRhdGVTYWZhcmlHbG9iYWxTZXR0aW5ncyIsInVwZGF0ZUxvY2FsZSIsImxhbmd1YWdlIiwibG9jYWxlIiwiY2FsZW5kYXJGb3JtYXQiLCJkZWxldGVTYWZhcmkiLCJjbGVhblNhZmFyaSIsImtlZXBQcmVmcyIsImxpYnJhcnlEaXIiLCJzYWZhcmlSb290Iiwic2FmYXJpTGlicmFyeURpciIsImZpbGVzVG9EZWxldGUiLCJyZW1vdmVBcHAiLCJtb3ZlQnVpbHRJbkFwcCIsImFwcE5hbWUiLCJhcHBQYXRoIiwibmV3QXBwUGF0aCIsImNvcHlGaWxlIiwib3BlblVybCIsInVybCIsIlNBRkFSSV9CT09URURfSU5ESUNBVE9SIiwiU0FGQVJJX1NUQVJUVVBfVElNRU9VVCIsImNsZWFyQ2FjaGVzIiwiZm9sZGVyTmFtZXMiLCJjYWNoZXNSb290IiwiaXRlbXNUb1JlbW92ZSIsIngiLCJmaWx0ZXIiLCJpc0RpcmVjdG9yeSIsInV0aWwiLCJwbHVyYWxpemUiLCJ0aW1lb3V0TXMiLCJzaW1Mb2ciLCJlbmFibGVDYWxlbmRhckFjY2VzcyIsImJ1bmRsZUlEIiwiZGlzYWJsZUNhbGVuZGFyQWNjZXNzIiwiaGFzQ2FsZW5kYXJBY2Nlc3MiLCJfYWN0aXZhdGVXaW5kb3ciLCJwaWQiLCJleGVjdXRlVUlDbGllbnRTY3JpcHQiLCJhcHBsZVNjcmlwdCIsIndpbmRvd0FjdGl2YXRpb25TY3JpcHQiLCJyZXN1bHRTY3JpcHQiLCJhY3F1aXJlIiwiZXJyb3JBbmRUaHJvdyIsImlzQmlvbWV0cmljRW5yb2xsZWQiLCJvdXRwdXQiLCJpc1N0cmluZyIsImVucm9sbEJpb21ldHJpYyIsImlzRW5hYmxlZCIsInNlbmRCaW9tZXRyaWNNYXRjaCIsInNob3VsZE1hdGNoIiwiZGlzbWlzc0RhdGFiYXNlQWxlcnQiLCJpbmNyZWFzZSIsImJ1dHRvbiIsImJhY2t1cEtleWNoYWlucyIsImJhY2t1cFBhdGgiLCJ0ZW1wRGlyIiwicHJlZml4IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJzdWZmaXgiLCJ6aXBBcmdzIiwic2VwIiwiX2tleWNoYWluc0JhY2t1cFBhdGgiLCJ1bmxpbmsiLCJyZXN0b3JlS2V5Y2hhaW5zIiwiZXhjbHVkZVBhdHRlcm5zIiwic3BsaXQiLCJwbGlzdFBhdGgiLCJnZXRMYXVuY2hEYWVtb25zUm9vdCIsInNwYXduUHJvY2VzcyIsInVuemlwQXJncyIsImZsYXRNYXAiLCJjbGVhcktleWNoYWlucyIsInBzIiwic2VydmljZXNNYXRjaCIsImV4ZWMiLCJyZXN1bHQiLCJwYXR0ZXJuIiwiZ3JvdXAiLCJ0cmltRW5kIiwic2V0UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJzZXRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zTWFwcGluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZXRBY2Nlc3MiLCJnZXRQZXJtaXNzaW9uIiwic2VydmljZU5hbWUiLCJnZXRBY2Nlc3MiLCJhZGRDZXJ0aWZpY2F0ZSIsInBheWxvYWQiLCJ0cnVuY2F0ZSIsInB1c2hOb3RpZmljYXRpb24iLCJkZXZSb290IiwiX2dldERldmljZVN0cmluZ1BsYXRmb3JtVmVyc2lvbiIsInJlcVZlcnNpb24iLCJ4Y29kZSIsImdldE1heElPU1NESyIsIl9nZXREZXZpY2VTdHJpbmdWZXJzaW9uU3RyaW5nIiwiX2dldERldmljZVN0cmluZ0NvbmZpZ0ZpeCIsImdldERldmljZVN0cmluZyIsImRldmljZU5hbWUiLCJmb3JjZUlwaG9uZSIsImZvcmNlSXBhZCIsImxvZ09wdHMiLCJpc2lQaG9uZSIsImluZGV4T2YiLCJpb3NEZXZpY2VTdHJpbmciLCJ0ZXN0IiwiQ09ORklHX0ZJWCIsImNvbmZpZ0ZpeCIsImdldFdlYkluc3BlY3RvclNvY2tldCIsImNtZCIsImZuIiwiZXh0ZW5zaW9ucyIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBR0EsTUFBTUEsZUFBZSxHQUFHLEtBQUssSUFBN0I7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxJQUEzQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFKLEVBQS9CO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsMkJBQTVCO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsdUJBQTlCOztBQVVBLE1BQU1DLG9CQUFvQixHQUFHLGVBQTdCOzs7QUFHQSxNQUFN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QWIsRUFBZ0M7QUFDOUJBLE1BQUFBLGVBQWUsR0FBR0csU0FBUyxDQUFDSCxlQUFELENBQTNCOztBQUNBalIsc0JBQUlDLEtBQUosQ0FBVyxnQ0FBK0IrRixJQUFJLENBQUMySyxVQUFXLElBQWhELEdBQ0MsT0FBTU0sZUFBZ0IsR0FEakM7QUFFRDs7QUFFRGpSLG9CQUFJQyxLQUFKLENBQVcsMkJBQTBCZ1IsZUFBZ0IsR0FBckQ7O0FBQ0EsV0FBT0EsZUFBUDtBQUNEOztBQU0wQixRQUFyQkkscUJBQXFCLEdBQUk7QUFFN0IsV0FBTyxJQUFQO0FBQ0Q7O0FBaDlDd0M7Ozs7QUFtOUMzQyxLQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxFQUFOLENBQVQsSUFBc0JwUixnQkFBRWtFLE9BQUYsQ0FBVW1OLGNBQVYsQ0FBdEIsRUFBNkM7QUFDM0N0VCxFQUFBQSxlQUFlLENBQUN1VCxTQUFoQixDQUEwQkgsR0FBMUIsSUFBaUNDLEVBQWpDO0FBQ0Q7O2VBRWNyVCxlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHhjb2RlLCBnZXRQYXRoIGFzIGdldFhjb2RlUGF0aCB9IGZyb20gJ2FwcGl1bS14Y29kZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBta2RpcnAsIHBsaXN0LCB0aW1pbmcsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQge1xuICBzYWZlUmltUmFmLCBnZXREZXZlbG9wZXJSb290LCBpbnN0YWxsU1NMQ2VydCwgaGFzU1NMQ2VydCwgYWN0aXZhdGVBcHAsXG4gIE1PQklMRV9TQUZBUklfQlVORExFX0lELCBsYXVuY2hBcHBcbn0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBhc3luY21hcCwgcmV0cnlJbnRlcnZhbCwgd2FpdEZvckNvbmRpdGlvbiwgcmV0cnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgKiBhcyBzZXR0aW5ncyBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgdGFpbFVudGlsIH0gZnJvbSAnLi90YWlsLXVudGlsLmpzJztcbmltcG9ydCBleHRlbnNpb25zIGZyb20gJy4vZXh0ZW5zaW9ucy9pbmRleCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IENhbGVuZGFyIGZyb20gJy4vY2FsZW5kYXInO1xuaW1wb3J0IFBlcm1pc3Npb25zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IFNpbWN0bCBmcm9tICdub2RlLXNpbWN0bCc7XG5cblxuY29uc3QgU1RBUlRVUF9USU1FT1VUID0gNjAgKiAxMDAwO1xuY29uc3QgRVhUUkFfU1RBUlRVUF9USU1FID0gMjAwMDtcbmNvbnN0IFVJX0NMSUVOVF9BQ0NFU1NfR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBVSV9DTElFTlRfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5pcGhvbmVzaW11bGF0b3InO1xuY29uc3QgU1BSSU5HQk9BUkRfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5TcHJpbmdCb2FyZCc7XG5cbi8qXG4gKiBUaGlzIGV2ZW50IGlzIGVtaXR0ZWQgYXMgc29vbiBhcyBpT1MgU2ltdWxhdG9yXG4gKiBoYXMgZmluaXNoZWQgYm9vdGluZyBhbmQgaXQgaXMgcmVhZHkgdG8gYWNjZXB0IHhjcnVuIGNvbW1hbmRzLlxuICogVGhlIGV2ZW50IGhhbmRsZXIgaXMgY2FsbGVkIGFmdGVyICdydW4nIG1ldGhvZCBpcyBjb21wbGV0ZWRcbiAqIGZvciBYY29kZSA3IGFuZCBvbGRlciBhbmQgaXMgb25seSB1c2VmdWwgaW4gWGNvZGUgOCssXG4gKiBzaW5jZSBvbmUgY2FuIHN0YXJ0IGRvaW5nIHN0dWZmIChmb3IgZXhhbXBsZSBpbnN0YWxsL3VuaW5zdGFsbCBhbiBhcHApIGluIHBhcmFsbGVsXG4gKiB3aXRoIFNpbXVsYXRvciBVSSBzdGFydHVwLCB3aGljaCBzaG9ydGVucyBzZXNzaW9uIHN0YXJ0dXAgdGltZS5cbiAqL1xuY29uc3QgQk9PVF9DT01QTEVURURfRVZFTlQgPSAnYm9vdENvbXBsZXRlZCc7XG5cblxuY2xhc3MgU2ltdWxhdG9yWGNvZGU2IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgb2JqZWN0IHdpdGggdGhlIGB1ZGlkYCBhbmQgdmVyc2lvbiBvZiBYY29kZS4gVXNlIHRoZSBleHBvcnRlZCBgZ2V0U2ltdWxhdG9yKHVkaWQpYCBtZXRob2QgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgLSBUaGUgU2ltdWxhdG9yIElELlxuICAgKiBAcGFyYW0ge29iamVjdH0geGNvZGVWZXJzaW9uIC0gVGhlIHRhcmdldCBYY29kZSB2ZXJzaW9uIGluIGZvcm1hdCB7bWFqb3IsIG1pbm9yLCBidWlsZH0uXG4gICAqL1xuICBjb25zdHJ1Y3RvciAodWRpZCwgeGNvZGVWZXJzaW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudWRpZCA9IFN0cmluZyh1ZGlkKTtcbiAgICB0aGlzLnNpbWN0bCA9IG5ldyBTaW1jdGwoe1xuICAgICAgdWRpZDogdGhpcy51ZGlkLFxuICAgIH0pO1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgLy8gcGxhdGZvcm1WZXJzaW9uIGNhbm5vdCBiZSBmb3VuZCBpbml0aWFsbHksIHNpbmNlIGdldHRpbmcgaXQgaGFzIHNpZGUgZWZmZWN0cyBmb3JcbiAgICAvLyBvdXIgbG9naWMgZm9yIGZpZ3VyaW5nIG91dCBpZiBhIHNpbSBoYXMgYmVlbiBydW5cbiAgICAvLyBpdCB3aWxsIGJlIHNldCB3aGVuIGl0IGlzIG5lZWRlZFxuICAgIHRoaXMuX3BsYXRmb3JtVmVyc2lvbiA9IG51bGw7XG5cbiAgICB0aGlzLmtleWNoYWluUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldERpcigpLCAnTGlicmFyeScsICdLZXljaGFpbnMnKTtcbiAgICB0aGlzLnNpbXVsYXRvckFwcCA9ICdpT1MgU2ltdWxhdG9yLmFwcCc7XG5cbiAgICB0aGlzLmFwcERhdGFCdW5kbGVQYXRocyA9IHt9O1xuXG4gICAgLy8gbGlzdCBvZiBmaWxlcyB0byBjaGVjayBmb3Igd2hlbiBzZWVpbmcgaWYgYSBzaW11bGF0b3IgaXMgXCJmcmVzaFwiXG4gICAgLy8gKG1lYW5pbmcgaXQgaGFzIG5ldmVyIGJlZW4gYm9vdGVkKS5cbiAgICAvLyBJZiB0aGVzZSBmaWxlcyBhcmUgcHJlc2VudCwgd2UgYXNzdW1lIGl0J3MgYmVlbiBzdWNjZXNzZnVsbHkgYm9vdGVkXG4gICAgdGhpcy5pc0ZyZXNoRmlsZXMgPSBbXG4gICAgICAnTGlicmFyeS9Db25maWd1cmF0aW9uUHJvZmlsZXMnLFxuICAgICAgJ0xpYnJhcnkvQ29va2llcycsXG4gICAgICAnTGlicmFyeS9QcmVmZXJlbmNlcy8uR2xvYmFsUHJlZmVyZW5jZXMucGxpc3QnLFxuICAgICAgJ0xpYnJhcnkvUHJlZmVyZW5jZXMvY29tLmFwcGxlLnNwcmluZ2JvYXJkLnBsaXN0JyxcbiAgICAgICd2YXIvcnVuL3N5c2xvZy5waWQnXG4gICAgXTtcblxuICAgIC8vIGV4dHJhIHRpbWUgdG8gd2FpdCBmb3Igc2ltdWxhdG9yIHRvIGJlIGRlZW1lZCBib290ZWRcbiAgICB0aGlzLmV4dHJhU3RhcnR1cFRpbWUgPSBFWFRSQV9TVEFSVFVQX1RJTUU7XG5cbiAgICB0aGlzLmNhbGVuZGFyID0gbmV3IENhbGVuZGFyKHhjb2RlVmVyc2lvbiwgdGhpcy5nZXREaXIoKSk7XG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9ucyh4Y29kZVZlcnNpb24sIHRoaXMuZ2V0RGlyKCksIHRoaXMudWRpZCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBCdW5kbGUgaWRlbnRpZmllciBvZiBTaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKi9cbiAgZ2V0IHVpQ2xpZW50QnVuZGxlSWQgKCkge1xuICAgIHJldHVybiBVSV9DTElFTlRfQlVORExFX0lEO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGRldmljZXMgc2V0IHdoZXJlIHRoZSBjdXJyZW50IHNpbXVsYXRvciBpcyBsb2NhdGVkLlxuICAgKiBgbnVsbGAgdmFsdWUgbWVhbnMgdGhhdCB0aGUgZGVmYXVsdCBwYXRoIGlzIHVzZWQsIHdoaWNoIGlzIHVzdWFsbHkgYH4vTGlicmFyeS9EZXZlbG9wZXIvQ29yZVNpbXVsYXRvci9EZXZpY2VzYFxuICAgKi9cbiAgZ2V0IGRldmljZXNTZXRQYXRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5zaW1jdGwuZGV2aWNlc1NldFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGRldmljZXMgc2V0LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgdGhpcyB2YWx1ZVxuICAgKiBvbmNlIHJpZ2h0IGFmdGVyIFNpbXVsYXRvciBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCB0byBub3QgY2hhbmdlIGl0IGR1cmluZ1xuICAgKiB0aGUgaW5zdGFuY2UgbGlmZWN5Y2xlXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGV2aWNlcyBzZXQgcm9vdCBvbiB0aGVcbiAgICogbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICovXG4gIHNldCBkZXZpY2VzU2V0UGF0aCAodmFsdWUpIHtcbiAgICB0aGlzLnNpbWN0bC5kZXZpY2VzU2V0UGF0aCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwcm9jZXNzIGlkIG9mIHRoZSBVSSBjbGllbnRcbiAgICpcbiAgICogQHJldHVybiB7P3N0cmluZ30gVGhlIHByb2Nlc3MgSUQgb3IgbnVsbCBpZiB0aGUgVUkgY2xpZW50IGlzIG5vdCBydW5uaW5nXG4gICAqL1xuICBhc3luYyBnZXRVSUNsaWVudFBpZCAoKSB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncGdyZXAnLCBbJy1mbicsIGAke3RoaXMuc2ltdWxhdG9yQXBwfS9Db250ZW50cy9NYWNPUy9gXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNOYU4ocGFyc2VJbnQoc3Rkb3V0LCAxMCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3Rkb3V0ID0gc3Rkb3V0LnRyaW0oKTtcbiAgICBsb2cuZGVidWcoYEdvdCBTaW11bGF0b3IgVUkgY2xpZW50IFBJRDogJHtzdGRvdXR9YCk7XG4gICAgcmV0dXJuIHN0ZG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgc3RhdGUgb2YgU2ltdWxhdG9yIFVJIGNsaWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBvZiBpZiBVSSBjbGllbnQgaXMgcnVubmluZyBvciBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBpc1VJQ2xpZW50UnVubmluZyAoKSB7XG4gICAgcmV0dXJuICFfLmlzTnVsbChhd2FpdCB0aGlzLmdldFVJQ2xpZW50UGlkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHRocm93aW5nIGFuIGVycm9yIGFib3V0IFNpbXVsYXRvciBzdGFydHVwIHRpbWVvdXQgaGFwcGVuZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBnZXQgc3RhcnR1cFRpbWVvdXQgKCkge1xuICAgIHJldHVybiBTVEFSVFVQX1RJTUVPVVQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBTREsgdmVyc2lvbiwgZm9yIGV4YW1wbGUgJzguMycuXG4gICAqL1xuICBhc3luYyBnZXRQbGF0Zm9ybVZlcnNpb24gKCkge1xuICAgIGlmICghdGhpcy5fcGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBsZXQge3Nka30gPSBhd2FpdCB0aGlzLnN0YXQoKTtcbiAgICAgIHRoaXMuX3BsYXRmb3JtVmVyc2lvbiA9IHNkaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgU2ltdWxhdG9yIHN0dWZmIGlzIGxvY2F0ZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhdGggc3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9vdERpciAoKSB7XG4gICAgbGV0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoaG9tZSwgJ0xpYnJhcnknLCAnRGV2ZWxvcGVyJywgJ0NvcmVTaW11bGF0b3InLCAnRGV2aWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBTaW11bGF0b3IgYXBwbGljYXRpb25zIGRhdGEgaXMgbG9jYXRlZC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGF0aCBzdHJpbmcuXG4gICAqL1xuICBnZXREaXIgKCkge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5nZXRSb290RGlyKCksIHRoaXMudWRpZCwgJ2RhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgU2ltdWxhdG9yIGxvZ3MgYXJlIHN0b3JlZC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGF0aCBzdHJpbmcuXG4gICAqL1xuICBnZXRMb2dEaXIgKCkge1xuICAgIGxldCBob21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGhvbWUsICdMaWJyYXJ5JywgJ0xvZ3MnLCAnQ29yZVNpbXVsYXRvcicsIHRoaXMudWRpZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB2YWxpZCAuYXBwIHBhY2thZ2Ugb24gU2ltdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwIC0gVGhlIHBhdGggdG8gdGhlIC5hcHAgcGFja2FnZS5cbiAgICovXG4gIGFzeW5jIGluc3RhbGxBcHAgKGFwcCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNpbWN0bC5pbnN0YWxsQXBwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9uIFNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1bmRsZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgY2hlY2tlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEZ1bGUgLSBBcHBsaWNhdGlvbiBuYW1lIG1pbnVzIFwiLmFwcFwiIChmb3IgaU9TIDcuMSlcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkXG4gICAqL1xuICBhc3luYyBpc0FwcEluc3RhbGxlZCAoYnVuZGxlSWQsIGFwcEZpbGUgPSBudWxsKSB7XG4gICAgLy8gYGFwcEZpbGVgIGFyZ3VtZW50IG9ubHkgbmVjZXNzYXJ5IGZvciBpT1MgYmVsb3cgdmVyc2lvbiA4XG4gICAgbGV0IGFwcERpcnMgPSBhd2FpdCB0aGlzLmdldEFwcERpcnMoYXBwRmlsZSwgYnVuZGxlSWQpO1xuICAgIHJldHVybiBhcHBEaXJzLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHVzZXIgaW5zdGFsbGVkIGJ1bmRsZSBpZHMgd2hpY2ggaGFzICdidW5kbGVOYW1lJyBpbiB0aGVpciBJbmZvLlBsaXN0IGFzICdDRkJ1bmRsZU5hbWUnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBidW5kbGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm4ge2FycmF5PHN0cmluZz59IC0gVGhlIGxpc3Qgb2YgYnVuZGxlIGlkcyB3aGljaCBoYXZlICdidW5kbGVOYW1lJ1xuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSAoYnVuZGxlTmFtZSkge1xuICAgIGNvbnN0IHJvb3RVc2VyQXBwRGlyID0gYXdhaXQgdGhpcy5idWlsZEJ1bmRsZVBhdGhNYXAoJ0J1bmRsZScpO1xuICAgIGNvbnN0IGJ1bmRsZUlkcyA9IFtdO1xuICAgIGlmIChfLmlzRW1wdHkocm9vdFVzZXJBcHBEaXIpKSB7XG4gICAgICByZXR1cm4gYnVuZGxlSWRzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2J1bmRsZUlkLCB1c2VyQXBwRGlyUGF0aF0gb2YgT2JqZWN0LmVudHJpZXMocm9vdFVzZXJBcHBEaXIpKSB7XG4gICAgICBjb25zdCBhcHBGaWxlID0gKGF3YWl0IGZzLnJlYWRkaXIodXNlckFwcERpclBhdGgpKS5maW5kKFxuICAgICAgICAoZmlsZSkgPT4gcGF0aC5leHRuYW1lKGZpbGUpLnRvTG93ZXJDYXNlKCkgPT09ICcuYXBwJyk7XG4gICAgICBjb25zdCBpbmZvUGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKHVzZXJBcHBEaXJQYXRoLCBhcHBGaWxlLCAnSW5mby5wbGlzdCcpO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoaW5mb1BsaXN0UGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmZvUGxpc3QgPSBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShpbmZvUGxpc3RQYXRoLCBmYWxzZSk7XG4gICAgICAgIGlmIChpbmZvUGxpc3QuQ0ZCdW5kbGVOYW1lID09PSBidW5kbGVOYW1lKSB7XG4gICAgICAgICAgYnVuZGxlSWRzLnB1c2goYnVuZGxlSWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byByZWFkIHBsaXN0ICR7aW5mb1BsaXN0UGF0aH0uIE9yaWdpbmFsIGVycm9yICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgVGhlIHNpbXVsYXRvciBoYXMgJyR7YnVuZGxlSWRzLmxlbmd0aH0nIGJ1bmRsZXMgd2hpY2ggaGF2ZSAnJHtidW5kbGVOYW1lfScgYXMgdGhlaXIgJ0NGQnVuZGxlTmFtZSc6YCk7XG4gICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBidW5kbGVJZHMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgICAgICcke2J1bmRsZUlkfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1bmRsZUlkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGlyZWN0b3J5IGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24ncyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBFaXRoZXIgYSBidW5kbGVJZCAoZS5nLiwgY29tLmFwcGxlLm1vYmlsZXNhZmFyaSkgb3IsIGZvciBpT1MgNy4xLCB0aGUgYXBwIG5hbWUgd2l0aG91dCBgLmFwcGAgKGUuZy4sIE1vYmlsZVNhZmFyaSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmRpciAtIFRoZSBzdWItZGlyZWN0b3J5IHdlIGV4cGVjdCB0byBiZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8gXCJEYXRhXCIuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJvb3QgYXBwbGljYXRpb24gZm9sZGVyLlxuICAgKi9cbiAgYXN5bmMgZ2V0QXBwRGlyIChpZCwgc3ViRGlyID0gJ0RhdGEnKSB7XG4gICAgdGhpcy5hcHBEYXRhQnVuZGxlUGF0aHNbc3ViRGlyXSA9IHRoaXMuYXBwRGF0YUJ1bmRsZVBhdGhzW3N1YkRpcl0gfHwge307XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmFwcERhdGFCdW5kbGVQYXRoc1tzdWJEaXJdKSAmJiAhYXdhaXQgdGhpcy5pc0ZyZXNoKCkpIHtcbiAgICAgIHRoaXMuYXBwRGF0YUJ1bmRsZVBhdGhzW3N1YkRpcl0gPSBhd2FpdCB0aGlzLmJ1aWxkQnVuZGxlUGF0aE1hcChzdWJEaXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hcHBEYXRhQnVuZGxlUGF0aHNbc3ViRGlyXVtpZF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHhjb2RlIDYgc2ltdWxhdG9ycyBhcmUgcmVhbGx5IGFubm95aW5nLCBhbmQgYnVyeSB0aGUgbWFpbiBhcHBcbiAgICogZGlyZWN0b3JpZXMgaW5zaWRlIGRpcmVjdG9yaWVzIGp1c3QgbmFtZWQgd2l0aCBIYXNoZXMuXG4gICAqIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHByb3BlciBkaXJlY3RvcnkgYnkgdHJhdmVyc2luZyBhbGwgb2YgdGhlbVxuICAgKiBhbmQgcmVhZGluZyBhIG1ldGFkYXRhIHBsaXN0IChNb2JpbGUgQ29udGFpbmVyIE1hbmFnZXIpIHRvIGdldCB0aGVcbiAgICogYnVuZGxlIGlkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViZGlyIC0gVGhlIHN1Yi1kaXJlY3Rvcnkgd2UgZXhwZWN0IHRvIGJlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gZGlyZWN0b3J5LiBEZWZhdWx0cyB0byBcIkRhdGFcIi5cbiAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgbGlzdCBvZiBwYXRoLWJ1bmRsZSBwYWlycyB0byBhbiBvYmplY3Qgd2hlcmUgYnVuZGxlSWRzIGFyZSBtYXBwZWQgdG8gcGF0aHMuXG4gICAqL1xuICBhc3luYyBidWlsZEJ1bmRsZVBhdGhNYXAgKHN1YkRpciA9ICdEYXRhJykge1xuICAgIGxvZy5kZWJ1ZygnQnVpbGRpbmcgYnVuZGxlIHBhdGggbWFwJyk7XG4gICAgbGV0IGFwcGxpY2F0aW9uTGlzdDtcbiAgICBsZXQgcGF0aEJ1bmRsZVBhaXI7XG4gICAgaWYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkgPT09ICc3LjEnKSB7XG4gICAgICAvLyBhcHBzIGF2YWlsYWJsZVxuICAgICAgLy8gICBXZWIuYXBwLFxuICAgICAgLy8gICBXZWJWaWV3U2VydmljZS5hcHAsXG4gICAgICAvLyAgIE1vYmlsZVNhZmFyaS5hcHAsXG4gICAgICAvLyAgIFdlYkNvbnRlbnRBbmFseXNpc1VJLmFwcCxcbiAgICAgIC8vICAgRERBY3Rpb25zU2VydmljZS5hcHAsXG4gICAgICAvLyAgIFN0b3JlS2l0VUlTZXJ2aWNlLmFwcFxuICAgICAgYXBwbGljYXRpb25MaXN0ID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0RGlyKCksICdBcHBsaWNhdGlvbnMnKTtcbiAgICAgIHBhdGhCdW5kbGVQYWlyID0gYXN5bmMgKGRpcikgPT4ge1xuICAgICAgICBkaXIgPSBwYXRoLnJlc29sdmUoYXBwbGljYXRpb25MaXN0LCBkaXIpO1xuICAgICAgICBsZXQgYXBwRmlsZXMgPSBhd2FpdCBmcy5nbG9iKGAke2Rpcn0vKi5hcHBgKTtcbiAgICAgICAgbGV0IGJ1bmRsZUlkID0gYXBwRmlsZXNbMF0ubWF0Y2goLy4qXFwvKC4qKVxcLmFwcC8pWzFdO1xuICAgICAgICByZXR1cm4ge3BhdGg6IGRpciwgYnVuZGxlSWR9O1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbGljYXRpb25MaXN0ID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0RGlyKCksICdDb250YWluZXJzJywgc3ViRGlyLCAnQXBwbGljYXRpb24nKTtcbiAgICAgIC8vIGdpdmVuIGEgZGlyZWN0b3J5LCBmaW5kIHRoZSBwbGlzdCBmaWxlIGFuZCBwdWxsIHRoZSBidW5kbGUgaWQgZnJvbSBpdFxuICAgICAgbGV0IHJlYWRCdW5kbGVJZCA9IGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgbGV0IHBsaXN0ID0gcGF0aC5yZXNvbHZlKGRpciwgJy5jb20uYXBwbGUubW9iaWxlX2NvbnRhaW5lcl9tYW5hZ2VyLm1ldGFkYXRhLnBsaXN0Jyk7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IGF3YWl0IHNldHRpbmdzLnJlYWQocGxpc3QpO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGEuTUNNTWV0YWRhdGFJZGVudGlmaWVyO1xuICAgICAgfTtcbiAgICAgIC8vIGdpdmVuIGEgZGlyZWN0b3J5LCByZXR1cm4gdGhlIHBhdGggYW5kIGJ1bmRsZSBpZCBhc3NvY2lhdGVkIHdpdGggaXRcbiAgICAgIHBhdGhCdW5kbGVQYWlyID0gYXN5bmMgKGRpcikgPT4ge1xuICAgICAgICBkaXIgPSBwYXRoLnJlc29sdmUoYXBwbGljYXRpb25MaXN0LCBkaXIpO1xuICAgICAgICBsZXQgYnVuZGxlSWQgPSBhd2FpdCByZWFkQnVuZGxlSWQoZGlyKTtcbiAgICAgICAgcmV0dXJuIHtwYXRoOiBkaXIsIGJ1bmRsZUlkfTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYXBwbGljYXRpb25MaXN0KSkge1xuICAgICAgbG9nLndhcm4oYE5vIGRpcmVjdG9yeSBwYXRoICcke2FwcGxpY2F0aW9uTGlzdH0nYCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZVBhdGhEaXJzID0gYXdhaXQgZnMucmVhZGRpcihhcHBsaWNhdGlvbkxpc3QpO1xuICAgIGxldCBidW5kbGVQYXRoUGFpcnMgPSBhd2FpdCBhc3luY21hcChidW5kbGVQYXRoRGlycywgYXN5bmMgZnVuY3Rpb24gKGRpcikge1xuICAgICAgcmV0dXJuIGF3YWl0IHBhdGhCdW5kbGVQYWlyKGRpcik7XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgLy8gcmVkdWNlIHRoZSBsaXN0IG9mIHBhdGgtYnVuZGxlIHBhaXJzIHRvIGFuIG9iamVjdCB3aGVyZSBidW5kbGVJZHMgYXJlIG1hcHBlZCB0byBwYXRoc1xuICAgIHJldHVybiBidW5kbGVQYXRoUGFpcnMucmVkdWNlKChidW5kbGVNYXAsIGJ1bmRsZVBhdGgpID0+IHtcbiAgICAgIGJ1bmRsZU1hcFtidW5kbGVQYXRoLmJ1bmRsZUlkXSA9IGJ1bmRsZVBhdGgucGF0aDtcbiAgICAgIHJldHVybiBidW5kbGVNYXA7XG4gICAgfSwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhdGUgYW5kIHNwZWNpZmljcyBvZiB0aGlzIHNpbS5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSBTaW11bGF0b3Igc3RhdHMgbWFwcGluZywgZm9yIGV4YW1wbGU6XG4gICAqIHsgbmFtZTogJ2lQaG9uZSA0cycsXG4gICAqICAgdWRpZDogJ0MwOUIzNEU1LTdEQ0ItNDQyRS1CNzlDLUFCNkJDMDM1NzQxNycsXG4gICAqICAgc3RhdGU6ICdTaHV0ZG93bicsXG4gICAqICAgc2RrOiAnOC4zJ1xuICAgKiB9XG4gICAqL1xuICBhc3luYyBzdGF0ICgpIHtcbiAgICBmb3IgKGxldCBbc2RrLCBkZXZpY2VBcnJdIG9mIF8udG9QYWlycyhhd2FpdCB0aGlzLnNpbWN0bC5nZXREZXZpY2VzKCkpKSB7XG4gICAgICBmb3IgKGxldCBkZXZpY2Ugb2YgZGV2aWNlQXJyKSB7XG4gICAgICAgIGlmIChkZXZpY2UudWRpZCA9PT0gdGhpcy51ZGlkKSB7XG4gICAgICAgICAgZGV2aWNlLnNkayA9IHNkaztcbiAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBiZXN0LWJldCBoZXVyaXN0aWMgZm9yIHdoZXRoZXIgb3Igbm90IGEgc2ltIGhhcyBiZWVuIGJvb3RlZFxuICAgKiBiZWZvcmUuIFdlIHVzdWFsbHkgd2FudCB0byBzdGFydCBhIHNpbXVsYXRvciB0byBcIndhcm1cIiBpdCB1cCwgaGF2ZVxuICAgKiBYY29kZSBwb3B1bGF0ZSBpdCB3aXRoIHBsaXN0cyBmb3IgdXMgdG8gbWFuaXB1bGF0ZSBiZWZvcmUgYSByZWFsXG4gICAqIHRlc3QgcnVuLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IFNpbXVsYXRvciBoYXMgbmV2ZXIgYmVlbiBzdGFydGVkIGJlZm9yZVxuICAgKi9cbiAgYXN5bmMgaXNGcmVzaCAoKSB7XG4gICAgLy8gaWYgdGhlIGZvbGxvd2luZyBmaWxlcyBkb24ndCBleGlzdCwgaXQgaGFzbid0IGJlZW4gYm9vdGVkLlxuICAgIC8vIFRISVMgSVMgTk9UIEFOIEVYSEFVU1RJVkUgTElTVFxuICAgIGxldCBmaWxlcyA9IHRoaXMuaXNGcmVzaEZpbGVzO1xuXG4gICAgbGV0IHB2ID0gYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICBpZiAocHYgIT09ICc3LjEnKSB7XG4gICAgICBmaWxlcy5wdXNoKCdMaWJyYXJ5L1ByZWZlcmVuY2VzL2NvbS5hcHBsZS5QcmVmZXJlbmNlcy5wbGlzdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWxlcy5wdXNoKCdBcHBsaWNhdGlvbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXIgPSB0aGlzLmdldERpcigpO1xuICAgIGZpbGVzID0gZmlsZXMubWFwKChzKSA9PiBwYXRoLnJlc29sdmUoZGlyLCBzKSk7XG5cbiAgICBjb25zdCBleGlzdGVuY2VzID0gYXdhaXQgYXN5bmNtYXAoZmlsZXMsIGFzeW5jIChmKSA9PiBhd2FpdCBmcy5oYXNBY2Nlc3MoZikpO1xuICAgIGNvbnN0IGZyZXNoID0gXy5jb21wYWN0KGV4aXN0ZW5jZXMpLmxlbmd0aCAhPT0gZmlsZXMubGVuZ3RoO1xuICAgIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgd2hldGhlciBzaW11bGF0b3IgaGFzIGJlZW4gcnVuIGJlZm9yZTogJHtmcmVzaCA/ICdubycgOiAneWVzJ31gKTtcblxuICAgIHJldHVybiBmcmVzaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IFNpbXVsYXRvci4gT25lIHNob3VsZCBkaXN0aW5ndWlzaCB0aGVcbiAgICogc3RhdGVzIG9mIFNpbXVsYXRvciBVSSBhbmQgdGhlIFNpbXVsYXRvciBpdHNlbGYuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGN1cnJlbnQgU2ltdWxhdG9yIGlzIHJ1bm5pbmcuXG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC5nZXRFbnYoJ2R1bW15Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgc2ltdWxhdG9yIGlzIGluIHNodXRkb3duIHN0YXRlLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnksIGJlY2F1c2UgU2ltdWxhdG9yIG1pZ2h0IGFsc28gYmVcbiAgICogaW4gdGhlIHRyYW5zaXRpb25hbCBTaHV0dGluZyBEb3duIHN0YXRlIHJpZ2h0IGFmdGVyIHRoZSBgc2h1dGRvd25gXG4gICAqIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IFNpbXVsYXRvciBpcyBzaHV0IGRvd24uXG4gICAqL1xuICBhc3luYyBpc1NodXRkb3duICgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RW52KCdkdW1teScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBfLmluY2x1ZGVzKGUuc3RkZXJyLCAnQ3VycmVudCBzdGF0ZTogU2h1dGRvd24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgdGhlIFNpbXVsYXRvciBib290aW5nIGlzIGNvbXBsZXRlZCBhbmQvb3Igd2FpdCBmb3IgaXRcbiAgICogdW50aWwgdGhlIHRpbWVvdXQgZXhwaXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0dXBUaW1lb3V0IC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBib290aW5nIGlzIGNvbXBsZXRlZC5cbiAgICogQGVtaXRzIEJPT1RfQ09NUExFVEVEX0VWRU5UIGlmIHRoZSBjdXJyZW50IFNpbXVsYXRvciBpcyByZWFkeSB0byBhY2NlcHQgc2ltY3RsIGNvbW1hbmRzLCBsaWtlICdpbnN0YWxsJy5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JCb290IChzdGFydHVwVGltZW91dCkge1xuICAgIC8vIHdhaXQgZm9yIHRoZSBzaW11bGF0b3IgdG8gYm9vdFxuICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBzaW11bGF0b3Igc3RhdHVzIHRvIGJlICdib290ZWQnIGlzbid0IGdvb2QgZW5vdWdoXG4gICAgLy8gaXQgY2xhaW1zIHRvIGJlIGJvb3RlZCB3YXkgYmVmb3JlIGZpbmlzaGluZyBsb2FkaW5nXG4gICAgLy8gbGV0J3MgdGFpbCB0aGUgc2ltdWxhdG9yIHN5c3RlbSBsb2cgdW50aWwgd2Ugc2VlIGEgbWFnaWMgbGluZSAodGhpcy5ib290ZWRJbmRpY2F0b3IpXG4gICAgbGV0IGJvb3RlZEluZGljYXRvciA9IGF3YWl0IHRoaXMuZ2V0Qm9vdGVkSW5kaWNhdG9yU3RyaW5nKCk7XG4gICAgYXdhaXQgdGhpcy50YWlsTG9nc1VudGlsKGJvb3RlZEluZGljYXRvciwgc3RhcnR1cFRpbWVvdXQpO1xuXG4gICAgLy8gc28gc29ycnksIGJ1dCB3ZSBzaG91bGQgd2FpdCBhbm90aGVyIHR3byBzZWNvbmRzLCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSd2ZSByZWFsbHkgc3RhcnRlZFxuICAgIC8vIHdlIGNhbid0IGxvb2sgZm9yIGFub3RoZXIgbWFnaWMgbG9nIGxpbmUsIGJlY2F1c2UgdGhleSBzZWVtIHRvIGJlIGFwcC1kZXBlbmRlbnQgKG5vdCBzeXN0ZW0gZGVwZW5kZW50KVxuICAgIGxvZy5kZWJ1ZyhgV2FpdGluZyBhbiBleHRyYSAke3RoaXMuZXh0cmFTdGFydHVwVGltZX1tcyBmb3IgdGhlIHNpbXVsYXRvciB0byByZWFsbHkgZmluaXNoIGJvb3RpbmdgKTtcbiAgICBhd2FpdCBCLmRlbGF5KHRoaXMuZXh0cmFTdGFydHVwVGltZSk7XG4gICAgbG9nLmRlYnVnKCdEb25lIHdhaXRpbmcgZXh0cmEgdGltZSBmb3Igc2ltdWxhdG9yJyk7XG5cbiAgICB0aGlzLmVtaXQoQk9PVF9DT01QTEVURURfRVZFTlQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBtYWdpYyBzdHJpbmcsIHdoaWNoLCBpZiBwcmVzZW50IGluIGxvZ3MsIHJlZmxlY3RzIHRoZSBmYWN0IHRoYXQgc2ltdWxhdG9yIGJvb3RpbmcgaGFzIGJlZW4gY29tcGxldGVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtYWdpYyBsb2cgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0Qm9vdGVkSW5kaWNhdG9yU3RyaW5nICgpIHtcbiAgICBsZXQgaW5kaWNhdG9yO1xuICAgIGxldCBwbGF0Zm9ybVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHN3aXRjaCAocGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBjYXNlICc3LjEnOlxuICAgICAgY2FzZSAnOC4xJzpcbiAgICAgIGNhc2UgJzguMic6XG4gICAgICBjYXNlICc4LjMnOlxuICAgICAgY2FzZSAnOC40JzpcbiAgICAgICAgaW5kaWNhdG9yID0gJ3Byb2ZpbGVkOiBTZXJ2aWNlIHN0YXJ0aW5nLi4uJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc5LjAnOlxuICAgICAgY2FzZSAnOS4xJzpcbiAgICAgIGNhc2UgJzkuMic6XG4gICAgICBjYXNlICc5LjMnOlxuICAgICAgICBpbmRpY2F0b3IgPSAnU3lzdGVtIGFwcCBcImNvbS5hcHBsZS5zcHJpbmdib2FyZFwiIGZpbmlzaGVkIHN0YXJ0dXAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzEwLjAnOlxuICAgICAgICBpbmRpY2F0b3IgPSAnU3dpdGNoaW5nIHRvIGtleWJvYXJkJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cud2FybihgTm8gYm9vdCBpbmRpY2F0b3IgY2FzZSBmb3IgcGxhdGZvcm0gdmVyc2lvbiAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuICAgICAgICBpbmRpY2F0b3IgPSAnbm8gYm9vdCBpbmRpY2F0b3Igc3RyaW5nIGF2YWlsYWJsZSc7XG4gICAgfVxuICAgIHJldHVybiBpbmRpY2F0b3I7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTaW11bGF0b3JPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc2NhbGVGYWN0b3IgW251bGxdIC0gRGVmaW5lcyB0aGUgd2luZG93IHNjYWxlIHZhbHVlIGZvciB0aGUgVUkgY2xpZW50IHdpbmRvdyBmb3IgdGhlIGN1cnJlbnQgU2ltdWxhdG9yLlxuICAgKiAgIEVxdWFscyB0byBudWxsIGJ5IGRlZmF1bHQsIHdoaWNoIGtlZXBzIHRoZSBjdXJyZW50IHNjYWxlIHVuY2hhbmdlZC5cbiAgICogICBJdCBzaG91bGQgYmUgb25lIG9mIFsnMS4wJywgJzAuNzUnLCAnMC41JywgJzAuMzMnLCAnMC4yNSddLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc3RhcnR1cFRpbWVvdXQgWzYwMDAwXSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBTaW11bGF0b3IgYm9vdGluZ1xuICAgKiAgIHByb2Nlc3MgaXMgY29tcGxldGVkLiBUaGUgZGVmYXVsdCB0aW1lb3V0IHdpbGwgYmUgdXNlZCBpZiBub3Qgc2V0IGV4cGxpY2l0bHkuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgU2ltdWxhdG9yIFVJIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcbiAgICogQHBhcmFtIHtTaW11bGF0b3JPcHRpb25zfSBvcHRzIC0gU2ltdWxhdG9yIHN0YXJ0dXAgb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgc3RhcnRVSUNsaWVudCAob3B0cyA9IHt9KSB7XG4gICAgb3B0cyA9IF8uY2xvbmVEZWVwKG9wdHMpO1xuICAgIF8uZGVmYXVsdHNEZWVwKG9wdHMsIHtcbiAgICAgIHNjYWxlRmFjdG9yOiBudWxsLFxuICAgICAgc3RhcnR1cFRpbWVvdXQ6IHRoaXMuc3RhcnR1cFRpbWVvdXQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaW11bGF0b3JBcHAgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0WGNvZGVQYXRoKCksICdBcHBsaWNhdGlvbnMnLCB0aGlzLnNpbXVsYXRvckFwcCk7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICctRm4nLCBzaW11bGF0b3JBcHAsXG4gICAgICAnLS1hcmdzJywgJy1DdXJyZW50RGV2aWNlVURJRCcsIHRoaXMudWRpZCxcbiAgICBdO1xuXG4gICAgaWYgKG9wdHMuc2NhbGVGYWN0b3IpIHtcbiAgICAgIGNvbnN0IHtuYW1lfSA9IGF3YWl0IHRoaXMuc3RhdCgpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkRGV2aWNlTmFtZSA9IG5hbWUucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuICAgICAgY29uc3QgYXJndW1lbnROYW1lID0gYC1TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUtY29tLmFwcGxlLkNvcmVTaW11bGF0b3IuU2ltRGV2aWNlVHlwZS4ke2Zvcm1hdHRlZERldmljZU5hbWV9YDtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudE5hbWUsIG9wdHMuc2NhbGVGYWN0b3IpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBTdGFydGluZyBTaW11bGF0b3IgVUkgd2l0aCBjb21tYW5kOiBvcGVuICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ29wZW4nLCBhcmdzLCB7dGltZW91dDogb3B0cy5zdGFydHVwVGltZW91dH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCEoZXJyLnN0ZG91dCB8fCAnJykuaW5jbHVkZXMoJy0xMDgyNScpICYmICEoZXJyLnN0ZGVyciB8fCAnJykuaW5jbHVkZXMoJy0xMDgyNScpKSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGBFcnJvciB3aGlsZSBvcGVuaW5nIFVJOiAke2Vyci5zdGRvdXQgfHwgZXJyLnN0ZGVycn0uIENvbnRpbnVpbmdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgZ2l2ZW4gU2ltdWxhdG9yIHdpdGggb3B0aW9ucy4gVGhlIFNpbXVsYXRvciB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQgaWZcbiAgICogaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIE9uZSBvciBtb3JlIG9mIGF2YWlsYWJsZSBTaW11bGF0b3Igb3B0aW9ucy5cbiAgICogICBTZWUgeyNzdGFydFVJQ2xpZW50KG9wdHMpfSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gb3RoZXIgc3VwcG9ydGVkIGtleXMuXG4gICAqL1xuICBhc3luYyBydW4gKG9wdHMgPSB7fSkge1xuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHN0YXJ0dXBUaW1lb3V0OiB0aGlzLnN0YXJ0dXBUaW1lb3V0LFxuICAgIH0sIG9wdHMpO1xuICAgIGNvbnN0IGlzU2VydmVyUnVubmluZyA9IGF3YWl0IHRoaXMuaXNSdW5uaW5nKCk7XG4gICAgY29uc3QgaXNVSUNsaWVudFJ1bm5pbmcgPSBhd2FpdCB0aGlzLmlzVUlDbGllbnRSdW5uaW5nKCk7XG4gICAgaWYgKGlzU2VydmVyUnVubmluZyAmJiBpc1VJQ2xpZW50UnVubmluZykge1xuICAgICAgbG9nLmluZm8oYEJvdGggU2ltdWxhdG9yIHdpdGggVURJRCAke3RoaXMudWRpZH0gYW5kIHRoZSBVSSBjbGllbnQgYXJlIGN1cnJlbnRseSBydW5uaW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBFcnJvciBvbiBTaW11bGF0b3Igc2h1dGRvd246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc3RhcnRVSUNsaWVudChvcHRzKTtcblxuICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3Qob3B0cy5zdGFydHVwVGltZW91dCk7XG4gICAgbG9nLmluZm8oYFNpbXVsYXRvciB3aXRoIFVESUQgJHt0aGlzLnVkaWR9IGJvb3RlZCBpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9c2ApO1xuICB9XG5cbiAgLy8gVE9ETyBrZWVwIGtleWNoYWluc1xuICAvKipcbiAgICogUmVzZXQgdGhlIGN1cnJlbnQgU2ltdWxhdG9yIHRvIHRoZSBjbGVhbiBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIGNsZWFuICgpIHtcbiAgICBhd2FpdCB0aGlzLmVuZFNpbXVsYXRvckRhZW1vbigpO1xuICAgIGxvZy5pbmZvKGBDbGVhbmluZyBzaW11bGF0b3IgJHt0aGlzLnVkaWR9YCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuZXJhc2VEZXZpY2UoMTAwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcnViIChkZWxldGUgdGhlIHByZWZlcmVuY2VzIGFuZCBjaGFuZ2VkIGZpbGVzKSB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiBTaW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBGaWxlIC0gQXBwbGljYXRpb24gbmFtZSBtaW51cyBcIi5hcHBcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEJ1bmRsZUlkIC0gQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2NydWJDdXN0b21BcHAgKGFwcEZpbGUsIGFwcEJ1bmRsZUlkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xlYW5DdXN0b21BcHAoYXBwRmlsZSwgYXBwQnVuZGxlSWQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuL3NjcnViIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIFNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEZpbGUgLSBBcHBsaWNhdGlvbiBuYW1lIG1pbnVzIFwiLmFwcFwiLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwQnVuZGxlSWQgLSBCdW5kbGUgaWRlbnRpZmllciBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2NydWIgLSBJZiBgc2NydWJgIGlzIGZhbHNlLCB3ZSB3YW50IHRvIGNsZWFuIGJ5IGRlbGV0aW5nIHRoZSBhcHAgYW5kIGFsbFxuICAgKiAgIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgYHNjcnViYCBpcyB0cnVlLCB3ZSBqdXN0IHdhbnQgdG8gZGVsZXRlIHRoZSBwcmVmZXJlbmNlcyBhbmRcbiAgICogICBjaGFuZ2VkIGZpbGVzLlxuICAgKi9cbiAgYXN5bmMgY2xlYW5DdXN0b21BcHAgKGFwcEZpbGUsIGFwcEJ1bmRsZUlkLCBzY3J1YiA9IGZhbHNlKSB7XG4gICAgbG9nLmRlYnVnKGBDbGVhbmluZyBhcHAgZGF0YSBmaWxlcyBmb3IgJyR7YXBwRmlsZX0nLCAnJHthcHBCdW5kbGVJZH0nYCk7XG4gICAgaWYgKCFzY3J1Yikge1xuICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyBhcHAgYWx0b2dldGhlcmApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgZGVsZXRlZFxuICAgIGxldCBhcHBEaXJzID0gYXdhaXQgdGhpcy5nZXRBcHBEaXJzKGFwcEZpbGUsIGFwcEJ1bmRsZUlkLCBzY3J1Yik7XG5cbiAgICBpZiAoYXBwRGlycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZy5kZWJ1ZygnQ291bGQgbm90IGZpbmQgYXBwIGRpcmVjdG9yaWVzIHRvIGRlbGV0ZS4gSXQgaXMgcHJvYmFibHkgbm90IGluc3RhbGxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBkZWxldGVQcm9taXNlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgZGlyIG9mIGFwcERpcnMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRpbmcgZGlyZWN0b3J5OiAnJHtkaXJ9J2ApO1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYoZGlyKSk7XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkgPj0gOCkge1xuICAgICAgbGV0IHJlbFJtUGF0aCA9IGBMaWJyYXJ5L1ByZWZlcmVuY2VzLyR7YXBwQnVuZGxlSWR9LnBsaXN0YDtcbiAgICAgIGxldCBybVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5nZXRSb290RGlyKCksIHJlbFJtUGF0aCk7XG4gICAgICBsb2cuZGVidWcoYERlbGV0aW5nIGZpbGU6ICcke3JtUGF0aH0nYCk7XG4gICAgICBkZWxldGVQcm9taXNlcy5wdXNoKGZzLnJpbXJhZihybVBhdGgpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBCLmFsbChkZWxldGVQcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgcGF0aHMgdG8gZGlycyB3aGVyZSBhcHBsaWNhdGlvbiBkYXRhIGlzIHN0b3JlZC4gaU9TIDgrIHN0b3JlcyBhcHAgZGF0YSBpbiB0d28gcGxhY2VzLFxuICAgKiBhbmQgaU9TIDcuMSBoYXMgb25seSBvbmUgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBGaWxlIC0gQXBwbGljYXRpb24gbmFtZSBtaW51cyBcIi5hcHBcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEJ1bmRsZUlkIC0gQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjcnViIC0gVGhlIGBCdW5kbGVgIGRpcmVjdG9yeSBoYXMgdGhlIGFjdHVhbCBhcHAgaW4gaXQuIElmIHdlIGFyZSBqdXN0IHNjcnViYmluZyxcbiAgICogICB3ZSB3YW50IHRoaXMgdG8gc3RheS4gSWYgd2UgYXJlIGNsZWFuaW5nIHdlIGRlbGV0ZS5cbiAgICogQHJldHVybiB7YXJyYXk8c3RyaW5nPn0gQXJyYXkgb2YgYXBwbGljYXRpb24gZGF0YSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGdldEFwcERpcnMgKGFwcEZpbGUsIGFwcEJ1bmRsZUlkLCBzY3J1YiA9IGZhbHNlKSB7XG4gICAgbGV0IGRpcnMgPSBbXTtcbiAgICBpZiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSA+PSA4KSB7XG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0QXBwRGlyKGFwcEJ1bmRsZUlkKTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuIGRpcnM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgICAgbGV0IGJ1bmRsZSA9ICFzY3J1YiA/IGF3YWl0IHRoaXMuZ2V0QXBwRGlyKGFwcEJ1bmRsZUlkLCAnQnVuZGxlJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAobGV0IHNyYyBvZiBbZGF0YSwgYnVuZGxlXSkge1xuICAgICAgICBpZiAoc3JjKSB7XG4gICAgICAgICAgZGlycy5wdXNoKHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldEFwcERpcihhcHBGaWxlKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRpcnMucHVzaChkYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnM7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgU2ltdWxhdG9yIGluIG9yZGVyIHRvIGhhdmUgdGhlIGluaXRpYWwgZmlsZSBzdHJ1Y3R1cmUgY3JlYXRlZCBhbmQgc2h1dGRvd24gaXQgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzYWZhcmkgLSBXaGV0aGVyIHRvIGV4ZWN1dGUgbW9iaWxlIFNhZmFyaSBhZnRlciBzdGFydHVwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnR1cFRpbWVvdXQgLSBIb3cgbG9uZyB0byB3YWl0IHVudGlsIFNpbXVsYXRvciBib290aW5nIGlzIGNvbXBsZXRlZCAoaW4gbWlsbGlzZWNvbmRzKS5cbiAgICovXG4gIGFzeW5jIGxhdW5jaEFuZFF1aXQgKHNhZmFyaSA9IGZhbHNlLCBzdGFydHVwVGltZW91dCA9IHRoaXMuc3RhcnR1cFRpbWVvdXQpIHtcbiAgICBsb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gbGF1bmNoIGFuZCBxdWl0IHRoZSBzaW11bGF0b3IgdG8gY3JlYXRlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlJyk7XG4gICAgYXdhaXQgdGhpcy5ydW4oe3N0YXJ0dXBUaW1lb3V0fSk7XG5cbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICBsb2cuZGVidWcoJ1NwYXduaW5nIFNhZmFyaSBicm93c2VyIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IGZpbGUgc3lzdGVtIGl0ZW1zJyk7XG4gICAgICBhd2FpdCBsYXVuY2hBcHAodGhpcy5zaW1jdGwsIE1PQklMRV9TQUZBUklfQlVORExFX0lEKTtcbiAgICB9XG5cbiAgICAvLyB3YWl0IGZvciB0aGUgc3lzdGVtIHRvIGNyZWF0ZSB0aGUgZmlsZXMgd2Ugd2lsbCBtYW5pcHVsYXRlXG4gICAgLy8gbmVlZCBxdWl0ZSBhIGhpZ2ggcmV0cnkgbnVtYmVyLCBpbiBvcmRlciB0byBhY2NvbW1vZGF0ZSBpT1MgNy4xXG4gICAgLy8gbG9jYWxseSwgNy4xIGF2ZXJhZ2VzIDguNSByZXRyaWVzIChmcm9tIDYgLSAxMilcbiAgICAvLyAgICAgICAgICA4IGF2ZXJhZ2VzIDAuNiByZXRyaWVzIChmcm9tIDAgLSAyKVxuICAgIC8vICAgICAgICAgIDkgYXZlcmFnZXMgMTQgcmV0cmllc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKDYwLCAyNTAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaW11bGF0b3IgZmlsZXMgbm90IGZ1bGx5IGNyZWF0ZWQuIFdhaXRpbmcgYSBiaXQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgVGltZW91dCB3YWl0aW5nIGZvciBzaW11bGF0b3IgZmlsZXMgdG8gYmUgY3JlYXRlZC4gQ29udGludWluZ2ApO1xuICAgIH1cblxuICAgIC8vIGFuZCBxdWl0XG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2tzIGZvciBsYXVuY2hkIGRhZW1vbnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2ltIHVkaWQgYW5kIHRyaWVzIHRvIHN0b3AgdGhlbSBjbGVhbmx5XG4gICAqIFRoaXMgcHJldmVudHMgeGNydW4gc2ltY3RsIGVyYXNlIGZyb20gaGFuZ2luZy5cbiAgICovXG4gIGFzeW5jIGVuZFNpbXVsYXRvckRhZW1vbiAoKSB7XG4gICAgbG9nLmRlYnVnKGBLaWxsaW5nIGFueSBzaW11bGF0b3IgZGFlbW9ucyBmb3IgJHt0aGlzLnVkaWR9YCk7XG5cbiAgICBsZXQgbGF1bmNoY3RsQ21kID0gYGxhdW5jaGN0bCBsaXN0IHwgZ3JlcCAke3RoaXMudWRpZH0gfCBjdXQgLWYgMyB8IHhhcmdzIC1uIDEgbGF1bmNoY3RsYDtcbiAgICB0cnkge1xuICAgICAgbGV0IHN0b3BDbWQgPSBgJHtsYXVuY2hjdGxDbWR9IHN0b3BgO1xuICAgICAgYXdhaXQgZXhlYygnYmFzaCcsIFsnLWMnLCBzdG9wQ21kXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgQ291bGQgbm90IHN0b3Agc2ltdWxhdG9yIGRhZW1vbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2cuZGVidWcoJ0NhcnJ5aW5nIG9uIGFueXdheSEnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZW1vdmVDbWQgPSBgJHtsYXVuY2hjdGxDbWR9IHJlbW92ZWA7XG4gICAgICBhd2FpdCBleGVjKCdiYXNoJywgWyctYycsIHJlbW92ZUNtZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYENvdWxkIG5vdCByZW1vdmUgc2ltdWxhdG9yIGRhZW1vbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2cuZGVidWcoJ0NhcnJ5aW5nIG9uIGFueXdheSEnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdhaXRzIDEwIHNlYyBmb3IgdGhlIHNpbXVsYXRvciBsYXVuY2hkIHNlcnZpY2VzIHRvIHN0b3AuXG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnYmFzaCcsIFsnLWMnLFxuICAgICAgICAgIGBwcyAtZSAgfCBncmVwICR7dGhpcy51ZGlkfSB8IGdyZXAgbGF1bmNoZF9zaW0gfCBncmVwIC12IGJhc2ggfCBncmVwIC12IGdyZXAgfCBhd2sgeydwcmludCQxJ31gXSk7XG4gICAgICAgIHJldHVybiBzdGRvdXQudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICAgIH0sIHt3YWl0TXM6IDEwMDAwLCBpbnRlcnZhbE1zOiA1MDB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3QgZW5kIHNpbXVsYXRvciBkYWVtb24gZm9yICR7dGhpcy51ZGlkfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy5kZWJ1ZygnQ2Fycnlpbmcgb24gYW55d2F5IScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTaHV0ZG93bk9wdGlvbnNcbiAgICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gICAqIFNpbXVsYXRvciBpcyBzaHV0IGRvd24gY29tcGxldGVseS4gTm8gd2FpdCBoYXBwZW5zIGlmIHRoZSB0aW1lb3V0IHZhbHVlIGlzIG5vdCBzZXRcbiAgICovXG5cbiAgLyoqXG4gICAqIFNodXQgZG93biB0aGUgY3VycmVudCBTaW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7P1NodXRkb3duT3B0aW9uc30gb3B0c1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgU2ltdWxhdG9yIGZhaWxzIHRvIHRyYW5zaXRpb24gaW50byBTaHV0ZG93biBzdGF0ZSBhZnRlclxuICAgKiB0aGUgZ2l2ZW4gdGltZW91dFxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24gKG9wdHMgPSB7fSkge1xuICAgIGlmIChhd2FpdCB0aGlzLmlzU2h1dGRvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgNTAwLCB0aGlzLnNpbWN0bC5zaHV0ZG93bkRldmljZS5iaW5kKHRoaXMuc2ltY3RsKSk7XG4gICAgY29uc3Qgd2FpdE1zID0gcGFyc2VJbnQob3B0cy50aW1lb3V0LCAxMCk7XG4gICAgaWYgKHdhaXRNcyA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NodXRkb3duKCksIHtcbiAgICAgICAgICB3YWl0TXMsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMTAwLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpbXVsYXRvciBpcyBub3QgaW4gJ1NodXRkb3duJyBzdGF0ZSBhZnRlciAke3dhaXRNc31tc2ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIHBhcnRpY3VsYXIgU2ltdWxhdG9yIGZyb20gZGV2aWNlcyBsaXN0XG4gICAqL1xuICBhc3luYyBkZWxldGUgKCkge1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLmRlbGV0ZURldmljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcGFydGljdWxhciBwcmVmZXJlbmNlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGxpc3QgLSBUaGUgcHJlZmVyZW5jZXMgZmlsZSB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIC0gVGhlIGtleS92YWx1ZSBwYWlycyB0byB1cGRhdGUuXG4gICAqL1xuICBhc3luYyB1cGRhdGVTZXR0aW5ncyAocGxpc3QsIHVwZGF0ZXMpIHtcbiAgICByZXR1cm4gYXdhaXQgc2V0dGluZ3MudXBkYXRlU2V0dGluZ3ModGhpcywgcGxpc3QsIHVwZGF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZS9kZS1hdXRob3JpemUgbG9jYXRpb24gc2V0dGluZ3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGFwcGxpY2F0aW9uIElEIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBhdXRob3JpemVkIC0gV2hldGhlciBvciBub3QgdG8gYXV0aG9yaXplLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTG9jYXRpb25TZXR0aW5ncyAoYnVuZGxlSWQsIGF1dGhvcml6ZWQpIHtcbiAgICByZXR1cm4gYXdhaXQgc2V0dGluZ3MudXBkYXRlTG9jYXRpb25TZXR0aW5ncyh0aGlzLCBidW5kbGVJZCwgYXV0aG9yaXplZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgcmVkdWNlIG1vdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSByZWR1Y2VNb3Rpb24gLSBXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgaXQuXG4gICAqL1xuICBhc3luYyBzZXRSZWR1Y2VNb3Rpb24gKHJlZHVjZU1vdGlvbiA9IHRydWUpIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0ZyZXNoKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMubGF1bmNoQW5kUXVpdChmYWxzZSwgU1RBUlRVUF9USU1FT1VUKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXR0aW5ncy5zZXRSZWR1Y2VNb3Rpb24odGhpcywgcmVkdWNlTW90aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIFVJIGFwcGVhcmFuY2Ugc3R5bGUuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgYm9vdGVkIHNpbXVsYXRvci5cbiAgICpcbiAgICogQHNpbmNlIFhjb2RlIFNESyAxMS40XG4gICAqL1xuICBhc3luYyBzZXRBcHBlYXJhbmNlICgvKiB2YWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFhjb2RlIFNESyAnJHt0aGlzLnhjb2RlVmVyc2lvbn0nIGlzIHRvbyBvbGQgdG8gc2V0IFVJIGFwcGVhcmFuY2VgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IFVJIGFwcGVhcmFuY2Ugc3R5bGVcbiAgICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBib290ZWQgc2ltdWxhdG9yLlxuICAgKlxuICAgKiBAc2luY2UgWGNvZGUgU0RLIDExLjRcbiAgICovXG4gIGFzeW5jIGdldEFwcGVhcmFuY2UgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFhjb2RlIFNESyAnJHt0aGlzLnhjb2RlVmVyc2lvbn0nIGlzIHRvbyBvbGQgdG8gZ2V0IFVJIGFwcGVhcmFuY2VgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc2V0dGluZ3MgZm9yIFNhZmFyaS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHVwZGF0ZXMgLSBUaGUgaGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMgdG8gdXBkYXRlIGZvciBTYWZhcmkuXG4gICAqL1xuICBhc3luYyB1cGRhdGVTYWZhcmlTZXR0aW5ncyAodXBkYXRlcykge1xuICAgIGxldCB1cGRhdGVkID0gYXdhaXQgc2V0dGluZ3MudXBkYXRlU2FmYXJpVXNlclNldHRpbmdzKHRoaXMsIHVwZGF0ZXMpO1xuICAgIHJldHVybiBhd2FpdCBzZXR0aW5ncy51cGRhdGVTZXR0aW5ncyh0aGlzLCAnbW9iaWxlU2FmYXJpJywgdXBkYXRlcykgfHwgdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZ2xvYmFsIHNldHRpbmdzIGZvciBTYWZhcmkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVzIC0gVGhlIGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIHRvIHVwZGF0ZSBmb3IgU2FmYXJpLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3MgKHVwZGF0ZXMpIHtcbiAgICByZXR1cm4gYXdhaXQgc2V0dGluZ3MudXBkYXRlU2FmYXJpR2xvYmFsU2V0dGluZ3ModGhpcywgdXBkYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBsb2NhbGUgZm9yIHRoZSBTaW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIFRoZSBsYW5ndWFnZSBmb3IgdGhlIHNpbXVsYXRvci4gRS5nLiwgYFwiZnJfVVNcImAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgLSBUaGUgbG9jYWxlIHRvIHNldCBmb3IgdGhlIHNpbXVsYXRvci4gRS5nLiwgYFwiZW5cImAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxlbmRhckZvcm1hdCAtIFRoZSBmb3JtYXQgb2YgdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTG9jYWxlIChsYW5ndWFnZSwgbG9jYWxlLCBjYWxlbmRhckZvcm1hdCkge1xuICAgIHJldHVybiBhd2FpdCBzZXR0aW5ncy51cGRhdGVMb2NhbGUodGhpcywgbGFuZ3VhZ2UsIGxvY2FsZSwgY2FsZW5kYXJGb3JtYXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlbHkgZGVsZXRlIG1vYmlsZSBTYWZhcmkgYXBwbGljYXRpb24gZnJvbSB0aGUgY3VycmVudCBTaW11bGF0b3IuXG4gICAqL1xuICBhc3luYyBkZWxldGVTYWZhcmkgKCkge1xuICAgIGxvZy5kZWJ1ZygnRGVsZXRpbmcgU2FmYXJpIGFwcHMgZnJvbSBzaW11bGF0b3InKTtcblxuICAgIGxldCBkaXJzID0gW107XG5cbiAgICAvLyBnZXQgdGhlIGRhdGEgZGlyZWN0b3J5XG4gICAgZGlycy5wdXNoKGF3YWl0IHRoaXMuZ2V0QXBwRGlyKE1PQklMRV9TQUZBUklfQlVORExFX0lEKSk7XG5cbiAgICBsZXQgcHYgPSBhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIGlmIChwdiA+PSA4KSB7XG4gICAgICAvLyBnZXQgdGhlIGJ1bmRsZSBkaXJlY3RvcnlcbiAgICAgIGRpcnMucHVzaChhd2FpdCB0aGlzLmdldEFwcERpcihNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCwgJ0J1bmRsZScpKTtcbiAgICB9XG5cbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGxldCBkaXIgb2YgXy5jb21wYWN0KGRpcnMpKSB7XG4gICAgICBsb2cuZGVidWcoYERlbGV0aW5nIGRpcmVjdG9yeTogJyR7ZGlyfSdgKTtcbiAgICAgIGRlbGV0ZVByb21pc2VzLnB1c2goZnMucmltcmFmKGRpcikpO1xuICAgIH1cbiAgICBhd2FpdCBCLmFsbChkZWxldGVQcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIGRpcmVjdG9yaWVzIGZvciBtb2JpbGUgU2FmYXJpLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBQcmVmcyAtIFdoZXRoZXIgdG8ga2VlcCBTYWZhcmkgcHJlZmVyZW5jZXMgZnJvbSBiZWluZyBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW5TYWZhcmkgKGtlZXBQcmVmcyA9IHRydWUpIHtcbiAgICBsb2cuZGVidWcoJ0NsZWFuaW5nIG1vYmlsZSBzYWZhcmkgZGF0YSBmaWxlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmlzRnJlc2goKSkge1xuICAgICAgbG9nLmluZm8oJ0NvdWxkIG5vdCBmaW5kIFNhZmFyaSBzdXBwb3J0IGRpcmVjdG9yaWVzIHRvIGNsZWFuIG91dCBvbGQgJyArXG4gICAgICAgICAgICAgICAnZGF0YS4gUHJvYmFibHkgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiBvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbGlicmFyeURpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldERpcigpLCAnTGlicmFyeScpO1xuICAgIGxldCBzYWZhcmlSb290ID0gYXdhaXQgdGhpcy5nZXRBcHBEaXIoTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQpO1xuICAgIGlmICghc2FmYXJpUm9vdCkge1xuICAgICAgbG9nLmluZm8oJ0NvdWxkIG5vdCBmaW5kIFNhZmFyaSBzdXBwb3J0IGRpcmVjdG9yaWVzIHRvIGNsZWFuIG91dCBvbGQgJyArXG4gICAgICAgICAgICAgICAnZGF0YS4gUHJvYmFibHkgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiBvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNhZmFyaUxpYnJhcnlEaXIgPSBwYXRoLnJlc29sdmUoc2FmYXJpUm9vdCwgJ0xpYnJhcnknKTtcbiAgICBsZXQgZmlsZXNUb0RlbGV0ZSA9IFtcbiAgICAgIGBDYWNoZXMvU25hcHNob3RzLyR7TU9CSUxFX1NBRkFSSV9CVU5ETEVfSUR9YCxcbiAgICAgIGBDYWNoZXMvJHtNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRH0vKmAsXG4gICAgICAnQ2FjaGVzL2NvbS5hcHBsZS5XZWJBcHBDYWNoZS8qJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLldlYktpdC5OZXR3b3JraW5nLyonLFxuICAgICAgJ0NhY2hlcy9jb20uYXBwbGUuV2ViS2l0LldlYkNvbnRlbnQvKicsXG4gICAgICAnSW1hZ2UgQ2FjaGUvKicsXG4gICAgICBgV2ViS2l0LyR7TU9CSUxFX1NBRkFSSV9CVU5ETEVfSUR9LypgLFxuICAgICAgJ1dlYktpdC9HZW9sb2NhdGlvblNpdGVzLnBsaXN0JyxcbiAgICAgICdXZWJLaXQvTG9jYWxTdG9yYWdlLyouKicsXG4gICAgICAnU2FmYXJpLyonLFxuICAgICAgJ0Nvb2tpZXMvKi5iaW5hcnljb29raWVzJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLlVJU3RhdHVzQmFyLyonLFxuICAgICAgJ0NhY2hlcy9jb20uYXBwbGUua2V5Ym9hcmRzL2ltYWdlcy8qJyxcbiAgICAgICdDYWNoZXMvY29tLmFwcGxlLlNhZmFyaS5TYWZlQnJvd3NpbmcvKicsXG4gICAgICBgLi4vdG1wLyR7TU9CSUxFX1NBRkFSSV9CVU5ETEVfSUR9LypgXG4gICAgXTtcbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXNUb0RlbGV0ZSkge1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYocGF0aC5yZXNvbHZlKGxpYnJhcnlEaXIsIGZpbGUpKSk7XG4gICAgICBkZWxldGVQcm9taXNlcy5wdXNoKGZzLnJpbXJhZihwYXRoLnJlc29sdmUoc2FmYXJpTGlicmFyeURpciwgZmlsZSkpKTtcbiAgICB9XG5cbiAgICBpZiAoIWtlZXBQcmVmcykge1xuICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHNhZmFyaUxpYnJhcnlEaXIsICdQcmVmZXJlbmNlcy8qLnBsaXN0JykpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBCLmFsbChkZWxldGVQcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1aW5kbGUgSUQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlbW92ZWQuXG4gICAqL1xuICBhc3luYyByZW1vdmVBcHAgKGJ1bmRsZUlkKSB7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwucmVtb3ZlQXBwKGJ1bmRsZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgYnVpbHQtaW4gYXBwbGljYXRpb24gdG8gYSBuZXcgcGxhY2UgKGFjdHVhbGx5LCByZW5hbWUgaXQpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhcHAgdG8gYmUgbW92ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGN1cnJlbnQgcGF0aCB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdBcHBQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogICBJZiBzb21lIGFwcGxpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGJ5IHRoaXMgcGF0aCB0aGVuIGl0J3MgZ29pbmcgdG8gYmUgcmVtb3ZlZC5cbiAgICovXG4gIGFzeW5jIG1vdmVCdWlsdEluQXBwIChhcHBOYW1lLCBhcHBQYXRoLCBuZXdBcHBQYXRoKSB7XG4gICAgYXdhaXQgc2FmZVJpbVJhZihuZXdBcHBQYXRoKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBuZXdBcHBQYXRoKTtcbiAgICBsb2cuZGVidWcoYENvcGllZCAnJHthcHBOYW1lfScgdG8gJyR7bmV3QXBwUGF0aH0nYCk7XG5cbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBUZW1wb3JhcmlseSBkZWxldGVkIG9yaWdpbmFsIGFwcCBhdCAnJHthcHBQYXRofSdgKTtcblxuICAgIHJldHVybiBbbmV3QXBwUGF0aCwgYXBwUGF0aF07XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZ2l2ZW4gVVJMIGluIG1vYmlsZSBTYWZhcmkgYnJvd3Nlci5cbiAgICogVGhlIGJyb3dzZXIgd2lsbCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgaWYgaXQgaXMgbm90IHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGJlIG9wZW5lZC5cbiAgICovXG4gIGFzeW5jIG9wZW5VcmwgKHVybCkge1xuICAgIGNvbnN0IFNBRkFSSV9CT09URURfSU5ESUNBVE9SID0gJ01vYmlsZVNhZmFyaVsnO1xuICAgIGNvbnN0IFNBRkFSSV9TVEFSVFVQX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4gICAgY29uc3QgRVhUUkFfU1RBUlRVUF9USU1FID0gMyAqIDEwMDA7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgYXdhaXQgcmV0cnkoNTAwMCwgdGhpcy5zaW1jdGwub3BlblVybC5iaW5kKHRoaXMuc2ltY3RsKSwgdXJsKTtcbiAgICAgIGF3YWl0IHRoaXMudGFpbExvZ3NVbnRpbChTQUZBUklfQk9PVEVEX0lORElDQVRPUiwgU0FGQVJJX1NUQVJUVVBfVElNRU9VVCk7XG4gICAgICAvLyBTbyBzb3JyeSwgYnV0IHRoZSBsb2dzIGhhdmUgbm90aGluZyBlbHNlIGZvciBTYWZhcmkgc3RhcnRpbmcuLiBqdXN0IGRlbGF5IGEgbGl0dGxlIGJpdFxuICAgICAgbG9nLmRlYnVnKGBTYWZhcmkgc3RhcnRlZCwgd2FpdGluZyAke0VYVFJBX1NUQVJUVVBfVElNRX1tcyBmb3IgaXQgdG8gZnVsbHkgc3RhcnRgKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoRVhUUkFfU1RBUlRVUF9USU1FKTtcbiAgICAgIGxvZy5kZWJ1ZygnRG9uZSB3YWl0aW5nIGZvciBTYWZhcmknKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBvcGVuIGEgdXJsLCBidXQgdGhlIFNpbXVsYXRvciBpcyBub3QgQm9vdGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gU2ltdWxhdG9yIGNhY2hlcyBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ30gZm9sZGVyTmFtZXMgLSBUaGUgbmFtZXMgb2YgQ2FjaGVzIHN1YmZvbGRlcnMgdG8gYmUgY2xlYW5lZC5cbiAgICogICBOb24tYWNjZXNzaWJsZS9ub24tZXhpc3Rpbmcgc3ViZm9sZGVycyB3aWxsIGJlIHNraXBwZWQuXG4gICAqICAgQWxsIGV4aXN0aW5nIHN1YmZvbGRlcnMgdW5kZXIgQ2FjaGVzIHdpbGwgYmUgZGVsZXRlZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY291bnQgb2YgY2xlYW5lZCBjYWNoZSBpdGVtcy5cbiAgICogICBaZXJvIGlzIHJldHVybmVkIGlmIG5vIGl0ZW1zIHdlcmUgbWF0Y2hlZCBmb3IgY2xlYW51cCAoZWl0aGVyIG5vdCBhY2Nlc3NpYmxlIG9yIG5vdCBkaXJlY3RvcmllcykuXG4gICAqL1xuICBhc3luYyBjbGVhckNhY2hlcyAoLi4uZm9sZGVyTmFtZXMpIHtcbiAgICBjb25zdCBjYWNoZXNSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0RGlyKCksICdMaWJyYXJ5JywgJ0NhY2hlcycpO1xuICAgIGlmICghKGF3YWl0IGZzLmhhc0FjY2VzcyhjYWNoZXNSb290KSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ2FjaGVzIHJvb3QgYXQgJyR7Y2FjaGVzUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLiBOb3RoaW5nIHRvIGRvIHRoZXJlYCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgaXRlbXNUb1JlbW92ZSA9IGZvbGRlck5hbWVzLmxlbmd0aCA/IGZvbGRlck5hbWVzIDogKGF3YWl0IGZzLnJlYWRkaXIoY2FjaGVzUm9vdCkpO1xuICAgIGl0ZW1zVG9SZW1vdmUgPSBpdGVtc1RvUmVtb3ZlLm1hcCgoeCkgPT4gcGF0aC5yZXNvbHZlKGNhY2hlc1Jvb3QsIHgpKTtcbiAgICBpZiAoZm9sZGVyTmFtZXMubGVuZ3RoKSB7XG4gICAgICBpdGVtc1RvUmVtb3ZlID0gYXdhaXQgQi5maWx0ZXIoaXRlbXNUb1JlbW92ZSwgKHgpID0+IGZzLmhhc0FjY2Vzcyh4KSk7XG4gICAgfVxuICAgIGl0ZW1zVG9SZW1vdmUgPSBhd2FpdCBCLmZpbHRlcihpdGVtc1RvUmVtb3ZlLCBhc3luYyAoeCkgPT4gKGF3YWl0IGZzLnN0YXQoeCkpLmlzRGlyZWN0b3J5KCkpO1xuICAgIGlmICghaXRlbXNUb1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm8gU2ltdWxhdG9yIGNhY2hlIGl0ZW1zIGZvciBjbGVhbnVwIHdlcmUgbWF0Y2hlZCBpbiAnJHtjYWNoZXNSb290fSdgKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgTWF0Y2hlZCAke3V0aWwucGx1cmFsaXplKCdzaW11bGF0b3IgY2FjaGUgaXRlbScsIGl0ZW1zVG9SZW1vdmUubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgZm9yIGNsZWFudXA6ICR7aXRlbXNUb1JlbW92ZX1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQi5hbGwoaXRlbXNUb1JlbW92ZSwgKHgpID0+IGZzLnJpbXJhZih4KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oYEdvdCBhbiBleGNlcHRpb24gd2hpbGUgY2xlYW5pbmcgU2ltdWxhdG9yIGNhY2hlczogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtc1RvUmVtb3ZlLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCbG9ja3MgdW50aWwgdGhlIGdpdmVuIGluZGljYXRlciBzdHJpbmcgYXBwZWFycyBpbiBTaW11bGF0b3IgbG9ncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJvb3RlZEluZGljYXRvciAtIFRoZSBtYWdpYyBzdHJpbmcsIHdoaWNoIGFwcGVhcnMgaW4gbG9ncyBhZnRlciBTaW11bGF0b3IgYm9vdGluZyBpcyBjb21wbGV0ZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgLSBUaGUgbWF4aW11bW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc3RyaW5nIGluZGljYXRvciBwcmVzZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGlvcyBzaW11bGF0b3IgbG9ncyBvdXRwdXQgYSBsaW5lIG1hdGNoaW5nIGBib290ZWRJbmRpY2F0b3JgXG4gICAqIHRpbWVzIG91dCBhZnRlciB0aW1lb3V0TXNcbiAgICovXG4gIGFzeW5jIHRhaWxMb2dzVW50aWwgKGJvb3RlZEluZGljYXRvciwgdGltZW91dE1zKSB7XG4gICAgbGV0IHNpbUxvZyA9IHBhdGgucmVzb2x2ZSh0aGlzLmdldExvZ0RpcigpLCAnc3lzdGVtLmxvZycpO1xuXG4gICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgbG9nIGZpbGUgZXhpc3RzIGJlZm9yZSB3ZSBjYW4gdGFpbCBpdFxuICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoMjAwLCAyMDAsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBleGlzdHMgPSBhd2FpdCBmcy5leGlzdHMoc2ltTG9nKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgU2ltdWxhdG9yIGxvZzogJyR7c2ltTG9nfSdgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZy5pbmZvKGBTaW11bGF0b3IgbG9nIGF0ICcke3NpbUxvZ30nYCk7XG4gICAgbG9nLmluZm8oYFRhaWxpbmcgc2ltdWxhdG9yIGxvZ3MgdW50aWwgd2UgZW5jb3VudGVyIHRoZSBzdHJpbmcgXCIke2Jvb3RlZEluZGljYXRvcn1cImApO1xuICAgIGxvZy5pbmZvKGBXZSB3aWxsIHRpbWUgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRhaWxVbnRpbChzaW1Mb2csIGJvb3RlZEluZGljYXRvciwgdGltZW91dE1zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5kZWJ1ZygnU2ltdWxhdG9yIHN0YXJ0dXAgdGltZWQgb3V0LiBDb250aW51aW5nIGFueXdheS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIENhbGVuZGFyIGFjY2VzcyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSUQgLSBCdW5kbGUgSUQgb2YgdGhlIGFwcGxpY2F0aW9uLCBmb3Igd2hpY2ggdGhlIGFjY2VzcyBzaG91bGQgYmUgZ3JhbnRlZC5cbiAgICovXG4gIGFzeW5jIGVuYWJsZUNhbGVuZGFyQWNjZXNzIChidW5kbGVJRCkge1xuICAgIGF3YWl0IHRoaXMuY2FsZW5kYXIuZW5hYmxlQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgQ2FsZW5kYXIgYWNjZXNzIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJRCAtIEJ1bmRsZSBJRCBvZiB0aGUgYXBwbGljYXRpb24sIGZvciB3aGljaCB0aGUgYWNjZXNzIHNob3VsZCBiZSBkZW5pZWQuXG4gICAqL1xuICBhc3luYyBkaXNhYmxlQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgYXdhaXQgdGhpcy5jYWxlbmRhci5kaXNhYmxlQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGhhcyBhY2Nlc3MgdG8gQ2FsZW5kYXIuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGhhcyB0aGUgYWNjZXNzLlxuICAgKi9cbiAgYXN5bmMgaGFzQ2FsZW5kYXJBY2Nlc3MgKGJ1bmRsZUlEKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsZW5kYXIuaGFzQ2FsZW5kYXJBY2Nlc3MoYnVuZGxlSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyBTaW11bGF0b3Igd2luZG93LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7P3N0cmluZ30gSWYgdGhlIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHRoZW4gaXQgc2hvdWxkIGJlIGEgdmFsaWQgQXBwbGUgU2NyaXB0IHdoaWNoXG4gICAqIGlzIGFwcGVuZGVkIGJlZm9yZSBlYWNoIFVJIGNsaWVudCBjb21tYW5kIGlzIGV4ZWN1dGVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCBzaG91bGQgYWN0aXZhdGUgdGhlIHdpbmRvd1xuICAgKiBpdHNlbGYgYW5kIHJldHVybiBub3RoaW5nLlxuICAgKi9cbiAgYXN5bmMgX2FjdGl2YXRlV2luZG93ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgY29uc3QgcGlkID0gYXdhaXQgdGhpcy5nZXRVSUNsaWVudFBpZCgpO1xuICAgIGlmIChwaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUFwcChwaWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cuZGVidWcoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBzZXQgZnJvbnRtb3N0IHRvIGZhbHNlXG4gICAgICAgICAgc2V0IGZyb250bW9zdCB0byB0cnVlXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBnaXZlbiBBcHBsZSBTY3JpcHQgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiwgc28gb3RoZXJcbiAgICogc2Vzc2lvbnMgY2Fubm90IGluZmx1ZW5jZSB0aGUgVUkgY2xpZW50IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBsZVNjcmlwdCAtIFRoZSB2YWxpZCBBcHBsZSBTY3JpcHQgc25pcHBldCB0byBiZSBleGVjdXRlZC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3Rkb3V0IG91dHB1dCBwcm9kdWNlZCBieSB0aGUgc2NyaXB0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3Nhc2NyaXB0IHRvb2wgcmV0dXJucyBub24temVybyBleGl0IGNvZGUuXG4gICAqL1xuICBhc3luYyBleGVjdXRlVUlDbGllbnRTY3JpcHQgKGFwcGxlU2NyaXB0KSB7XG4gICAgY29uc3Qgd2luZG93QWN0aXZhdGlvblNjcmlwdCA9IGF3YWl0IHRoaXMuX2FjdGl2YXRlV2luZG93KCk7XG4gICAgY29uc3QgcmVzdWx0U2NyaXB0ID0gYCR7d2luZG93QWN0aXZhdGlvblNjcmlwdCA/IHdpbmRvd0FjdGl2YXRpb25TY3JpcHQgKyAnXFxuJyA6ICcnfSR7YXBwbGVTY3JpcHR9YDtcbiAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyBVSSBBcHBsZSBTY3JpcHQgb24gU2ltdWxhdG9yIHdpdGggVURJRCAke3RoaXMudWRpZH06ICR7cmVzdWx0U2NyaXB0fWApO1xuICAgIHJldHVybiBhd2FpdCBVSV9DTElFTlRfQUNDRVNTX0dVQVJELmFjcXVpcmUodGhpcy5zaW11bGF0b3JBcHAsIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnb3Nhc2NyaXB0JywgWyctZScsIHJlc3VsdFNjcmlwdF0pO1xuICAgICAgICByZXR1cm4gc3Rkb3V0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgY29tcGxldGUgb3BlcmF0aW9uLiBNYWtlIHN1cmUgU2ltdWxhdG9yIFVJIGlzIHJ1bm5pbmcgYW5kIHRoZSBwYXJlbnQgQXBwaXVtIGFwcGxpY2F0aW9uIChlLiBnLiBBcHBpdW0uYXBwIG9yIFRlcm1pbmFsLmFwcCkgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBpcyBwcmVzZW50IGluIFN5c3RlbSBQcmVmZXJlbmNlcyA+IFNlY3VyaXR5ICYgUHJpdmFjeSA+IFByaXZhY3kgPiBBY2Nlc3NpYmlsaXR5IGxpc3QuIElmIHRoZSBvcGVyYXRpb24gaXMgc3RpbGwgdW5zdWNjZXNzZnVsIHRoZW4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgU2ltdWxhdG9yLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBCaW9tZXRyaWMgRW5yb2xsbWVudCBmZWF0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gRWl0aGVyIHRydWUgb3IgZmFsc2VcbiAgICogQHRocm93cyB7RXJyb3J9IElmIEVucm9sbG1lbnQgc3RhdGUgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIGFzeW5jIGlzQmlvbWV0cmljRW5yb2xsZWQgKCkge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBzZXQgZHN0TWVudUl0ZW0gdG8gbWVudSBpdGVtIFwiVG91Y2ggSUQgRW5yb2xsZWRcIiBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIkhhcmR3YXJlXCIgb2YgbWVudSBiYXIgMVxuICAgICAgICAgIHNldCBpc0NoZWNrZWQgdG8gKHZhbHVlIG9mIGF0dHJpYnV0ZSBcIkFYTWVudUl0ZW1NYXJrQ2hhclwiIG9mIGRzdE1lbnVJdGVtKSBpcyBcIuKck1wiXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICAgIGxvZy5kZWJ1ZyhgVG91Y2ggSUQgZW5yb2xsZWQgc3RhdGU6ICR7b3V0cHV0fWApO1xuICAgIHJldHVybiBfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRyaW0oKSA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucm9sbHMgYmlvbWV0cmljIChUb3VjaElkLCBGYWNlSWQpIGZlYXR1cmUgdGVzdGluZyBpbiBTaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW5hYmxlZCAtIERlZmluZXMgd2hldGhlciBiaW9tZXRyaWMgc3RhdGUgaXMgZW5hYmxlZC9kaXNhYmxlZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVucm9sbGVkIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkXG4gICAqL1xuICBhc3luYyBlbnJvbGxCaW9tZXRyaWMgKGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIlRvdWNoIElEIEVucm9sbGVkXCIgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJIYXJkd2FyZVwiIG9mIG1lbnUgYmFyIDFcbiAgICAgICAgICBzZXQgaXNDaGVja2VkIHRvICh2YWx1ZSBvZiBhdHRyaWJ1dGUgXCJBWE1lbnVJdGVtTWFya0NoYXJcIiBvZiBkc3RNZW51SXRlbSkgaXMgXCLinJNcIlxuICAgICAgICAgIGlmICR7aXNFbmFibGVkID8gJ25vdCAnIDogJyd9aXNDaGVja2VkIHRoZW5cbiAgICAgICAgICAgIGNsaWNrIGRzdE1lbnVJdGVtXG4gICAgICAgICAgZW5kIGlmXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIG1hdGNoL25vdCBtYXRjaCB0aGUgdG91Y2ggaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IHNob3VsZE1hdGNoIFt0cnVlXSAtIFNldCBpdCB0byB0cnVlIG9yIGZhbHNlIGluIG9yZGVyIHRvIGVtdWxhdGVcbiAgICogbWF0Y2hpbmcvbm90IG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpb21ldHJpY1xuICAgKi9cbiAgYXN5bmMgc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIiR7c2hvdWxkTWF0Y2ggPyAnTWF0Y2hpbmcnIDogJ05vbi1tYXRjaGluZyd9XCIgb2YgbWVudSAxIG9mIG1lbnUgaXRlbSBcIlNpbXVsYXRlIEZpbmdlciBUb3VjaFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgICAgY2xpY2sgZHN0TWVudUl0ZW1cbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNwZWNpYWwgQXBwbGUgc2NyaXB0LCB3aGljaCBjbGlja3MgdGhlIHBhcnRpY3VsYXIgYnV0dG9uIG9uIERhdGFiYXNlIGFsZXJ0LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY3JlYXNlIC0gQ2xpY2sgdGhlIGJ1dHRvbiB3aXRoICdJbmNyZWFzZScgdGl0bGUgb24gdGhlIGFsZXJ0IGlmIHRoaXNcbiAgICogICBwYXJhbWV0ZXIgaXMgdHJ1ZS4gVGhlICdDYW5jZWwnIGJ1dHRvbiB3aWxsIGJlIGNsaWNrZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgZGlzbWlzc0RhdGFiYXNlQWxlcnQgKGluY3JlYXNlID0gdHJ1ZSkge1xuICAgIGxldCBidXR0b24gPSBpbmNyZWFzZSA/ICdJbmNyZWFzZScgOiAnQ2FuY2VsJztcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gZGlzbWlzcyBkYXRhYmFzZSBhbGVydCB3aXRoICcke2J1dHRvbn0nIGJ1dHRvbmApO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBjbGljayBidXR0b24gXCIke2J1dHRvbn1cIiBvZiB3aW5kb3cgMVxuICAgICAgICBlbmQgdGVsbFxuICAgICAgZW5kIHRlbGxcbiAgICBgKTtcbiAgfVxuXG4gIC8vcmVnaW9uIEtleWNoYWlucyBJbnRlcmFjdGlvblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBiYWNrdXAgb2Yga2V5Y2hhaW5zIGZvbGRlci5cbiAgICogVGhlIHByZXZpb3VzbHkgY3JlYXRlZCBiYWNrdXAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIGRlbGV0ZWQgaWYgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCB0d2ljZSBpbiBhIHJvdyB3aXRob3V0XG4gICAqIGByZXN0b3JlS2V5Y2hhaW5zYCBiZWluZyBpbnZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYmFja3VwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bGwuXG4gICAqL1xuICBhc3luYyBiYWNrdXBLZXljaGFpbnMgKCkge1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMua2V5Y2hhaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFBhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe1xuICAgICAgcHJlZml4OiBga2V5Y2hhaW5zX2JhY2t1cF8ke01hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSl9YCxcbiAgICAgIHN1ZmZpeDogJy56aXAnLFxuICAgIH0pO1xuICAgIGNvbnN0IHppcEFyZ3MgPSBbXG4gICAgICAnLXInLCBiYWNrdXBQYXRoLFxuICAgICAgYCR7dGhpcy5rZXljaGFpblBhdGh9JHtwYXRoLnNlcH1gXG4gICAgXTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIGtleWNoYWlucyBiYWNrdXAgd2l0aCAnemlwICR7emlwQXJncy5qb2luKCcgJyl9JyBjb21tYW5kYCk7XG4gICAgYXdhaXQgZXhlYygnemlwJywgemlwQXJncyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCkgJiYgYXdhaXQgZnMuZXhpc3RzKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGggPSBiYWNrdXBQYXRoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgdGhlIHByZXZpc291bHkgY3JlYXRlZCBrZXljaGFpbnMgYmFja3VwLlxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gZXhjbHVkZVBhdHRlcm5zIC0gVGhlIGxpc3RcbiAgICogb2YgZmlsZSBuYW1lIHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkIGZyb20gcmVzdG9yZS4gVGhlIGZvcm1hdFxuICAgKiBvZiBlYWNoIGl0ZW0gc2hvdWxkIGJlIHRoZSBzYW1lIGFzICcteCcgb3B0aW9uIGZvcm1hdCBmb3JcbiAgICogJ3VuemlwJyB1dGlsaXR5LiBUaGlzIGNhbiBhbHNvIGJlIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyxcbiAgICogd2hpY2ggaXMgZ29pbmcgYmUgdHJhbnNmb3JtZWQgaW50byBhIGxpc3QgYXV0b21hdGljYWxseSxcbiAgICogZm9yIGV4YW1wbGU6ICcqLmRiKixibGFibGEuc3FsaXRlJ1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgdGhlIHJlc3RvcmUgb3ByYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBubyBrZXljaGFpbnMgYmFja3VwIGF2YWlsYWJsZSBmb3IgcmVzdG9yZS5cbiAgICovXG4gIGFzeW5jIHJlc3RvcmVLZXljaGFpbnMgKGV4Y2x1ZGVQYXR0ZXJucyA9IFtdKSB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpIHx8ICFhd2FpdCBmcy5leGlzdHModGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGtleWNoYWlucyBiYWNrdXAgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYEFyZSB5b3Ugc3VyZSBpdCB3YXMgY3JlYXRlZCBiZWZvcmU/YCk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNTdHJpbmcoZXhjbHVkZVBhdHRlcm5zKSkge1xuICAgICAgZXhjbHVkZVBhdHRlcm5zID0gZXhjbHVkZVBhdHRlcm5zLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSk7XG4gICAgfVxuICAgIGNvbnN0IGlzU2VydmVyUnVubmluZyA9IGF3YWl0IHRoaXMuaXNSdW5uaW5nKCk7XG4gICAgbGV0IHBsaXN0UGF0aDtcbiAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nKSB7XG4gICAgICBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGhpcy5nZXRMYXVuY2hEYWVtb25zUm9vdCgpLCAnY29tLmFwcGxlLnNlY3VyaXR5ZC5wbGlzdCcpO1xuICAgICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBrZXljaGFpbnMgYmVjYXVzZSAnJHtwbGlzdFBhdGh9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRoaXMua2V5Y2hhaW5QYXRoKTtcbiAgICAgIGF3YWl0IG1rZGlycCh0aGlzLmtleWNoYWluUGF0aCk7XG4gICAgICBjb25zdCB1bnppcEFyZ3MgPSBbXG4gICAgICAgICctbycsIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgsXG4gICAgICAgIC4uLihfLmZsYXRNYXAoZXhjbHVkZVBhdHRlcm5zLm1hcCgoeCkgPT4gWycteCcsIHhdKSkpLFxuICAgICAgICAnLWQnLCAnLydcbiAgICAgIF07XG4gICAgICBsb2cuZGVidWcoYFJlc3RvcmluZyBrZXljaGFpbnMgd2l0aCAndW56aXAgJHt1bnppcEFyZ3Muam9pbignICcpfScgY29tbWFuZGApO1xuICAgICAgYXdhaXQgZXhlYygndW56aXAnLCB1bnppcEFyZ3MpO1xuICAgICAgYXdhaXQgZnMudW5saW5rKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpO1xuICAgICAgdGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCA9IG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgcGxpc3RQYXRoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbJ2xhdW5jaGN0bCcsICdsb2FkJywgcGxpc3RQYXRoXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBLZXljaGFpbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHNpbXVsYXRvciBpbiBydW50aW1lICh0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3AgaXQpLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYga2V5Y2hhaW4gY2xlYW51cCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYXJLZXljaGFpbnMgKCkge1xuICAgIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0aGlzLmdldExhdW5jaERhZW1vbnNSb290KCksICdjb20uYXBwbGUuc2VjdXJpdHlkLnBsaXN0Jyk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIga2V5Y2hhaW5zIGJlY2F1c2UgJyR7cGxpc3RQYXRofScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMua2V5Y2hhaW5QYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5rZXljaGFpblBhdGgpO1xuICAgICAgICBhd2FpdCBta2RpcnAodGhpcy5rZXljaGFpblBhdGgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoWydsYXVuY2hjdGwnLCAnbG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaWQgVGhlIGFjdHVhbCBwcm9jZXNzIGlkZW50aWZpZXIuXG4gICAqIENvdWxkIGJlIHplcm8gaWYgdGhlIHByb2Nlc3MgaXMgdGhlIHN5c3RlbSBvbmUuXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZ3JvdXAgVGhlIHByb2Nlc3MgZ3JvdXAgaWRlbnRpZmllci5cbiAgICogVGhpcyBjb3VsZCBiZSBgbnVsbGAgaWYgdGhlIHByb2Nlc3MgaXMgbm90IGEgcGFydCBvZiB0aGVcbiAgICogcGFydGljdWxhciBncm91cC4gRm9yIGBub3JtYWxgIGFwcGxpY2F0aW9uIHByb2Nlc3NlcyB0aGUgZ3JvdXBcbiAgICogbmFtZSB1c3VhbGx5IGVxdWFscyB0byBgVUlLaXRBcHBsaWNhdGlvbmAuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9jZXNzIG5hbWUsIGZvciBleGFtcGxlXG4gICAqIGBjb20uYXBwbGUuUHJlZmVyZW5jZXNgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0cyBwcm9jZXNzZXMgdGhhdCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIGdpdmVuIFNpbXVsYXRvci5cbiAgICogVGhlIHNpbXVsYXRvciBtdXN0IGJlIGluIHJ1bm5pbmcgc3RhdGUgaW4gb3JkZXIgZm9yIHRoaXNcbiAgICogbWV0aG9kIHRvIHdvcmsgcHJvcGVybHkuXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5PFByb2Nlc3NJbmZvPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHByb2Nlc3NcbiAgICogaW5mb3JtYXRpb25cbiAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIHByb2Nlc3MgaW5mb3JtYXRpb24gY291bGQgYmUgcmV0cmlldmVkLlxuICAgKi9cbiAgYXN5bmMgcHMgKCkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdsYXVuY2hjdGwnLFxuICAgICAgJ3ByaW50JyxcbiAgICAgICdzeXN0ZW0nLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgc2VydmljZXNNYXRjaCA9IC9eXFxzKnNlcnZpY2VzXFxzKj1cXHMqeyhbXn1dKykvbS5leGVjKHN0ZG91dCk7XG4gICAgaWYgKCFzZXJ2aWNlc01hdGNoKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGxpc3Qgb2YgYWN0aXZlIHByb2Nlc3NlcyBjYW5ub3QgYmUgcmV0cmlldmVkYCk7XG4gICAgfVxuICAgIC8qXG4gICAgRXhhbXBsZSBtYXRjaDpcbiAgICAgICAgMCAgICAgNzggXHRjb20uYXBwbGUucmVzb3VyY2VncmFiYmVyZFxuICAgIDgyMTU4ICAgICAgLSBcdGNvbS5hcHBsZS5hc3Npc3RhbnRfc2VydmljZVxuICAgIDgyMTIwICAgICAgLSBcdGNvbS5hcHBsZS5uYW5vcmVnaXN0cnlkXG4gICAgODIwODcgICAgICAtIFx0Y29tLmFwcGxlLm5vdGlmeWRcbiAgICA4MjI2NCAgICAgIC0gXHRVSUtpdEFwcGxpY2F0aW9uOmNvbS5hcHBsZS5QcmVmZXJlbmNlc1s3MDRiXVtyYi1sZWdhY3ldXG4gICAgKi9cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqKFxcZCspXFxzK1tcXGQtXStcXHMrKFtcXHdcXC0uXSs6KT8oW1xcd1xcLS5dKykvZ207XG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc2VydmljZXNNYXRjaFsxXSkpKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHBpZDogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSxcbiAgICAgICAgZ3JvdXA6IF8udHJpbUVuZChtYXRjaFsyXSwgJzonKSB8fCBudWxsLFxuICAgICAgICBuYW1lOiBtYXRjaFszXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhcnRpY3VsYXIgcGVybWlzc2lvbiB0byB0aGUgYXBwbGljYXRpb24gYnVuZGxlLiBTZWVcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3dpeC9BcHBsZVNpbXVsYXRvclV0aWxzIGZvciBtb3JlIGRldGFpbHMgb25cbiAgICogdGhlIGF2YWlsYWJsZSBzZXJ2aWNlIG5hbWVzIGFuZCBzdGF0dXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gQXBwbGljYXRpb24gYnVuZGxlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gU2VydmljZSBuYW1lIHRvIGJlIHNldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIGRlc2lyZWQgc3RhdHVzIGZvciB0aGUgc2VydmljZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgc2V0UGVybWlzc2lvbiAoYnVuZGxlSWQsIHBlcm1pc3Npb24sIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRQZXJtaXNzaW9ucyhidW5kbGVJZCwge1twZXJtaXNzaW9uXTogdmFsdWV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYnVuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgLSBBcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBlcm1pc3Npb25zTWFwcGluZyAtIEEgbWFwcGluZyB3aGVyZSBrYXlzXG4gICAqIGFyZSBzZXJ2aWNlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzIHZhbHVlcy5cbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aXgvQXBwbGVTaW11bGF0b3JVdGlsc1xuICAgKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBzZXJ2aWNlIG5hbWVzIGFuZCBzdGF0dXNlcy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIGFzeW5jIHNldFBlcm1pc3Npb25zIChidW5kbGVJZCwgcGVybWlzc2lvbnNNYXBwaW5nKSB7XG4gICAgbG9nLmRlYnVnKGBTZXR0aW5nIGFjY2VzcyBmb3IgJyR7YnVuZGxlSWR9JzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9uc01hcHBpbmcsIG51bGwsIDIpKTtcbiAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25zLnNldEFjY2VzcyhidW5kbGVJZCwgcGVybWlzc2lvbnNNYXBwaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY3VycmVudCBwZXJtaXNzaW9uIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gQXBwbGljYXRpb24gYnVuZGxlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSAtIE9uZSBvZiBhdmFpbGFibGUgc2VydmljZSBuYW1lcy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGVybWlzc2lvbiAoYnVuZGxlSWQsIHNlcnZpY2VOYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9ucy5nZXRBY2Nlc3MoYnVuZGxlSWQsIHNlcnZpY2VOYW1lKTtcbiAgICBsb2cuZGVidWcoYEdvdCAke3NlcnZpY2VOYW1lfSBhY2Nlc3Mgc3RhdHVzIGZvciAnJHtidW5kbGVJZH0nOiAke3Jlc3VsdH1gKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGdpdmVuIGNlcnRpZmljYXRlIGludG8gdGhlIFRydXN0ZWQgUm9vdCBTdG9yZSBvbiB0aGUgc2ltdWxhdG9yLlxuICAgKiBUaGUgc2ltdWxhdG9yIG11c3QgYmUgc2h1dCBkb3duIGluIG9yZGVyIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrIHByb3Blcmx5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF5bG9hZCB0aGUgY29udGVudCBvZiB0aGUgUEVNIGNlcnRpZmljYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNlcnRpZmljYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWRcbiAgICogb3IgYGZhbHNlYCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHRoZXJlXG4gICAqL1xuICBhc3luYyBhZGRDZXJ0aWZpY2F0ZSAocGF5bG9hZCwgLyogb3B0cyA9IHt9ICovKSB7XG4gICAgaWYgKGF3YWl0IGhhc1NTTENlcnQocGF5bG9hZCwgdGhpcy51ZGlkKSkge1xuICAgICAgbG9nLmluZm8oYFNTTCBjZXJ0aWZpY2F0ZSAnJHtfLnRydW5jYXRlKHBheWxvYWQsIHtsZW5ndGg6IDIwfSl9JyBhbHJlYWR5IGluc3RhbGxlZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBTU0wgcm9vdCBjZXJ0aWZpY2F0ZSAnJHtfLnRydW5jYXRlKHBheWxvYWQsIHtsZW5ndGg6IDIwfSl9J2ApO1xuICAgIGF3YWl0IGluc3RhbGxTU0xDZXJ0KHBheWxvYWQsIHRoaXMudWRpZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGVzIHB1c2ggbm90aWZpY2F0aW9uIGRlbGl2ZXJ5XG4gICAqXG4gICAqIEBzaW5jZSBYY29kZSBTREsgMTEuNFxuICAgKi9cbiAgYXN5bmMgcHVzaE5vdGlmaWNhdGlvbiAoLyogcGF5bG9hZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFhjb2RlIFNESyAnJHt0aGlzLnhjb2RlVmVyc2lvbn0nIGlzIHRvbyBvbGQgdG8gcHVzaCBub3RpZmljYXRpb25zYCk7XG4gIH1cblxuICBhc3luYyBnZXRMYXVuY2hEYWVtb25zUm9vdCAoKSB7XG4gICAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRldlJvb3QsXG4gICAgICAnUGxhdGZvcm1zL2lQaG9uZVNpbXVsYXRvci5wbGF0Zm9ybS9EZXZlbG9wZXIvU0RLcy9pUGhvbmVTaW11bGF0b3Iuc2RrL1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZ2V0RGV2aWNlU3RyaW5nUGxhdGZvcm1WZXJzaW9uIChwbGF0Zm9ybVZlcnNpb24pIHtcbiAgICBsZXQgcmVxVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICBpZiAoIXJlcVZlcnNpb24pIHtcbiAgICAgIHJlcVZlcnNpb24gPSBhd2FpdCB4Y29kZS5nZXRNYXhJT1NTREsoKTtcbiAgICAgIGxvZy53YXJuKGBObyBwbGF0Zm9ybSB2ZXJzaW9uIHNldC4gVXNpbmcgbWF4IFNESyB2ZXJzaW9uOiAke3JlcVZlcnNpb259YCk7XG4gICAgICAvLyB0aGlzIHdpbGwgYmUgYSBudW1iZXIsIGFuZCBwb3NzaWJseSBhbiBpbnRlZ2VyIChlLmcuLCBpZiBtYXggaU9TIFNESyBpcyA5KVxuICAgICAgLy8gc28gdHVybiBpdCBpbnRvIGEgc3RyaW5nIGFuZCBhZGQgYSAuMCBpZiBuZWNlc3NhcnlcbiAgICAgIGlmICghXy5pc1N0cmluZyhyZXFWZXJzaW9uKSkge1xuICAgICAgICByZXFWZXJzaW9uID0gKHJlcVZlcnNpb24gJSAxKSA/IFN0cmluZyhyZXFWZXJzaW9uKSA6IGAke3JlcVZlcnNpb259LjBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVxVmVyc2lvbjtcbiAgfVxuXG4gIC8vIGNoYW5nZSB0aGUgZm9ybWF0IGluIHN1YmNsYXNzZXMsIGFzIG5lY2Vzc2FyeVxuICBzdGF0aWMgYXN5bmMgX2dldERldmljZVN0cmluZ1ZlcnNpb25TdHJpbmcgKHBsYXRmb3JtVmVyc2lvbikge1xuICAgIGxldCByZXFWZXJzaW9uID0gYXdhaXQgdGhpcy5fZ2V0RGV2aWNlU3RyaW5nUGxhdGZvcm1WZXJzaW9uKHBsYXRmb3JtVmVyc2lvbik7XG5cbiAgICByZXR1cm4gYCgke3JlcVZlcnNpb259IFNpbXVsYXRvcilgO1xuICB9XG5cbiAgLy8gY2hhbmdlIHRoZSBmb3JtYXQgaW4gc3ViY2xhc3NlcywgYXMgbmVjZXNzYXJ5XG4gIHN0YXRpYyBfZ2V0RGV2aWNlU3RyaW5nQ29uZmlnRml4ICgpIHtcbiAgICAvLyBzb21lIGRldmljZXMgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgcmV0dXJuIHtcbiAgICAgICdpUGFkIFNpbXVsYXRvciAoNy4xIFNpbXVsYXRvciknOiAnaVBhZCAyICg3LjEgU2ltdWxhdG9yKScsXG4gICAgICAnaVBhZCBTaW11bGF0b3IgKDguMCBTaW11bGF0b3IpJzogJ2lQYWQgMiAoOC4wIFNpbXVsYXRvciknLFxuICAgICAgJ2lQYWQgU2ltdWxhdG9yICg4LjEgU2ltdWxhdG9yKSc6ICdpUGFkIDIgKDguMSBTaW11bGF0b3IpJyxcbiAgICAgICdpUGFkIFNpbXVsYXRvciAoOC4yIFNpbXVsYXRvciknOiAnaVBhZCAyICg4LjIgU2ltdWxhdG9yKScsXG4gICAgICAnaVBhZCBTaW11bGF0b3IgKDguMyBTaW11bGF0b3IpJzogJ2lQYWQgMiAoOC4zIFNpbXVsYXRvciknLFxuICAgICAgJ2lQYWQgU2ltdWxhdG9yICg4LjQgU2ltdWxhdG9yKSc6ICdpUGFkIDIgKDguNCBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg3LjEgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNXMgKDcuMSBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg4LjQgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNiAoOC40IFNpbXVsYXRvciknLFxuICAgICAgJ2lQaG9uZSBTaW11bGF0b3IgKDguMyBTaW11bGF0b3IpJzogJ2lQaG9uZSA2ICg4LjMgU2ltdWxhdG9yKScsXG4gICAgICAnaVBob25lIFNpbXVsYXRvciAoOC4yIFNpbXVsYXRvciknOiAnaVBob25lIDYgKDguMiBTaW11bGF0b3IpJyxcbiAgICAgICdpUGhvbmUgU2ltdWxhdG9yICg4LjEgU2ltdWxhdG9yKSc6ICdpUGhvbmUgNiAoOC4xIFNpbXVsYXRvciknLFxuICAgICAgJ2lQaG9uZSBTaW11bGF0b3IgKDguMCBTaW11bGF0b3IpJzogJ2lQaG9uZSA2ICg4LjAgU2ltdWxhdG9yKSdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgc2V0IG9mIG9wdGlvbnMgYW5kIGZpbmRzIHRoZSBjb3JyZWN0IGRldmljZSBzdHJpbmcgaW4gb3JkZXIgZm9yIEluc3RydW1lbnRzIHRvXG4gICAqIGlkZW50aWZ5IHRoZSBjb3JyZWN0IHNpbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOlxuICAgKiAgIC0gYGRldmljZU5hbWVgIC0gYSBuYW1lIGZvciB0aGUgZGV2aWNlLiBJZiB0aGUgZ2l2ZW4gZGV2aWNlIG5hbWUgc3RhcnRzIHdpdGggYD1gLCB0aGUgbmFtZSwgbGVzcyB0aGUgZXF1YWxzIHNpZ24sIGlzIHJldHVybmVkLlxuICAgKiAgIC0gYHBsYXRmb3JtVmVyc2lvbmAgLSB0aGUgdmVyc2lvbiBvZiBpT1MgdG8gdXNlLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBYY29kZSdzIG1heGltdW0gU0RLIHZlcnNpb24uXG4gICAqICAgLSBgZm9yY2VJcGhvbmVgIC0gZm9yY2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRldmljZSBzdHJpbmcgdG8gaVBob25lLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiAgIC0gYGZvcmNlSXBhZGAgLSBmb3JjZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZGV2aWNlIHN0cmluZyB0byBpUGFkLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKiAgIElmIGJvdGggYGZvcmNlSXBob25lYCBhbmQgYGZvcmNlSXBhZGAgYXJlIHRydWUsIHRoZSBkZXZpY2Ugd2lsbCBiZSBmb3JjZWQgdG8gaVBob25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3VuZCBkZXZpY2Ugc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERldmljZVN0cmluZyAob3B0cykge1xuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICBkZXZpY2VOYW1lOiBudWxsLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBudWxsLFxuICAgICAgZm9yY2VJcGhvbmU6IGZhbHNlLFxuICAgICAgZm9yY2VJcGFkOiBmYWxzZVxuICAgIH0sIG9wdHMpO1xuICAgIGxldCBsb2dPcHRzID0ge1xuICAgICAgZGV2aWNlTmFtZTogb3B0cy5kZXZpY2VOYW1lLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBvcHRzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgIGZvcmNlSXBob25lOiBvcHRzLmZvcmNlSXBob25lLFxuICAgICAgZm9yY2VJcGFkOiBvcHRzLmZvcmNlSXBhZFxuICAgIH07XG4gICAgbG9nLmRlYnVnKGBHZXR0aW5nIGRldmljZSBzdHJpbmcgZnJvbSBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KGxvZ09wdHMpfWApO1xuXG4gICAgLy8gc2hvcnQgY2lyY3VpdCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZXZpY2UgbmFtZVxuICAgIGlmICgob3B0cy5kZXZpY2VOYW1lIHx8ICcnKVswXSA9PT0gJz0nKSB7XG4gICAgICByZXR1cm4gb3B0cy5kZXZpY2VOYW1lLnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICBsZXQgaXNpUGhvbmUgPSAhIW9wdHMuZm9yY2VJcGhvbmUgfHwgIW9wdHMuZm9yY2VJcGFkO1xuXG4gICAgaWYgKG9wdHMuZGV2aWNlTmFtZSkge1xuICAgICAgbGV0IGRldmljZSA9IG9wdHMuZGV2aWNlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGRldmljZS5pbmRleE9mKCdpcGhvbmUnKSAhPT0gLTEpIHtcbiAgICAgICAgaXNpUGhvbmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChkZXZpY2UuaW5kZXhPZignaXBhZCcpICE9PSAtMSkge1xuICAgICAgICBpc2lQaG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpb3NEZXZpY2VTdHJpbmcgPSBvcHRzLmRldmljZU5hbWUgfHwgKGlzaVBob25lID8gJ2lQaG9uZSBTaW11bGF0b3InIDogJ2lQYWQgU2ltdWxhdG9yJyk7XG5cbiAgICAvLyBpZiBzb21lb25lIHBhc3NlcyBpbiBqdXN0IFwiaVBob25lXCIsIG1ha2UgdGhhdCBcImlQaG9uZSBTaW11bGF0b3JcIiB0b1xuICAgIC8vIGNvbmZvcm0gdG8gYWxsIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICgvXihpUGhvbmV8aVBhZCkkLy50ZXN0KGlvc0RldmljZVN0cmluZykpIHtcbiAgICAgIGlvc0RldmljZVN0cmluZyArPSAnIFNpbXVsYXRvcic7XG4gICAgfVxuXG4gICAgLy8gd2Ugc3VwcG9ydCBkZXZpY2VOYW1lOiBcImlQaG9uZSBTaW11bGF0b3JcIiwgYW5kIGFsc28gd2FudCB0byBzdXBwb3J0XG4gICAgLy8gXCJpUGhvbmUgWFlaIFNpbXVsYXRvclwiLCBidXQgdGhlc2Ugc3RyaW5ncyBhcmVuJ3QgaW4gdGhlIGRldmljZSBsaXN0LlxuICAgIC8vIFNvLCBpZiBzb21lb25lIHNlbnQgaW4gXCJpUGhvbmUgWFlaIFNpbXVsYXRvclwiLCBzdHJpcCBvZmYgXCIgU2ltdWxhdG9yXCJcbiAgICAvLyBpbiBvcmRlciB0byBhbGxvdyB0aGUgZGVmYXVsdCBcImlQaG9uZSBYWVpcIiBtYXRjaFxuICAgIGlmICgvW14oaVBob25lfGlQYWQpXSBTaW11bGF0b3IvLnRlc3QoaW9zRGV2aWNlU3RyaW5nKSkge1xuICAgICAgaW9zRGV2aWNlU3RyaW5nID0gaW9zRGV2aWNlU3RyaW5nLnJlcGxhY2UoJyBTaW11bGF0b3InLCAnJyk7XG4gICAgfVxuICAgIGlvc0RldmljZVN0cmluZyArPSBgICR7YXdhaXQgdGhpcy5fZ2V0RGV2aWNlU3RyaW5nVmVyc2lvblN0cmluZyhvcHRzLnBsYXRmb3JtVmVyc2lvbil9YDtcblxuICAgIGxldCBDT05GSUdfRklYID0gdGhpcy5fZ2V0RGV2aWNlU3RyaW5nQ29uZmlnRml4KCk7XG5cbiAgICBsZXQgY29uZmlnRml4ID0gQ09ORklHX0ZJWDtcbiAgICBpZiAoY29uZmlnRml4W2lvc0RldmljZVN0cmluZ10pIHtcbiAgICAgIGlvc0RldmljZVN0cmluZyA9IGNvbmZpZ0ZpeFtpb3NEZXZpY2VTdHJpbmddO1xuICAgICAgbG9nLmRlYnVnKGBGaXhpbmcgZGV2aWNlLiBDaGFuZ2VkIGZyb20gJyR7b3B0cy5kZXZpY2VOYW1lfScgYCArXG4gICAgICAgICAgICAgICAgYHRvICcke2lvc0RldmljZVN0cmluZ30nYCk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBGaW5hbCBkZXZpY2Ugc3RyaW5nIGlzICcke2lvc0RldmljZVN0cmluZ30nYCk7XG4gICAgcmV0dXJuIGlvc0RldmljZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBzaW11bGF0b3IncyBXZWJJbnNwZWN0b3IgVW5peCBEb21haW4gU29ja2V0XG4gICAqICAgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHNvY2tldC5cbiAgICovXG4gIGFzeW5jIGdldFdlYkluc3BlY3RvclNvY2tldCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIC8vIHRoZXJlIGlzIG5vIFdlYkluc3BlY3RvciBzb2NrZXQgZm9yIHRoaXMgdmVyc2lvbiBvZiBYY29kZVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoZXh0ZW5zaW9ucykpIHtcbiAgU2ltdWxhdG9yWGNvZGU2LnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpbXVsYXRvclhjb2RlNjtcbmV4cG9ydCB7IFNpbXVsYXRvclhjb2RlNiwgQk9PVF9DT01QTEVURURfRVZFTlQsIFNQUklOR0JPQVJEX0JVTkRMRV9JRCB9O1xuIl0sImZpbGUiOiJsaWIvc2ltdWxhdG9yLXhjb2RlLTYuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -17,8 +17,6 @@ var _lodash = _interopRequireDefault(require("lodash"));
17
17
 
18
18
  var _logger = _interopRequireDefault(require("./logger"));
19
19
 
20
- var _asyncbox = require("asyncbox");
21
-
22
20
  var _teen_process = require("teen_process");
23
21
 
24
22
  var _geolocation = require("./geolocation");
@@ -29,8 +27,6 @@ var _utils = require("./utils");
29
27
 
30
28
  const STARTUP_TIMEOUT = 120 * 1000;
31
29
 
32
- const PROCESS_LAUNCH_OK_PATTERN = bundleId => new RegExp(`${bundleId.replace('.', '\\.')}:\\s+\\d+`);
33
-
34
30
  class SimulatorXcode8 extends _simulatorXcode2.default {
35
31
  constructor(udid, xcodeVersion) {
36
32
  super(udid, xcodeVersion);
@@ -103,30 +99,12 @@ class SimulatorXcode8 extends _simulatorXcode2.default {
103
99
  }
104
100
 
105
101
  const timer = new _support.timing.Timer().start();
106
- let lastError = null;
107
102
 
108
103
  try {
109
- await (0, _asyncbox.waitForCondition)(async () => {
110
- try {
111
- const stdout = await this.simctl.launchApp(_utils.MOBILE_SAFARI_BUNDLE_ID);
112
-
113
- if (PROCESS_LAUNCH_OK_PATTERN(_utils.MOBILE_SAFARI_BUNDLE_ID).test(stdout)) {
114
- await this.simctl.openUrl(url);
115
- return true;
116
- }
117
- } catch (err) {
118
- _logger.default.warn(`Failed to open '${url}' in Safari. Retrying...`);
119
-
120
- lastError = err.stderr || err.message;
121
- }
122
-
123
- return false;
124
- }, {
125
- waitMs: _utils.SAFARI_STARTUP_TIMEOUT,
126
- intervalMs: 500
127
- });
104
+ await (0, _utils.launchApp)(this.simctl, _utils.MOBILE_SAFARI_BUNDLE_ID, _utils.SAFARI_STARTUP_TIMEOUT);
105
+ await this.simctl.openUrl(url);
128
106
  } catch (err) {
129
- throw new Error(`Safari cannot open '${url}' after ${timer.getDuration().asSeconds.toFixed(3)}s ` + `because of: ${lastError || 'an unknown error'}`);
107
+ throw new Error(`Safari could not open '${url}' after ${timer.getDuration().asSeconds.toFixed(3)}s. ` + `Original error: ${err.stderr || err.message}`);
130
108
  }
131
109
 
132
110
  _logger.default.debug(`Safari successfully opened '${url}' in ${timer.getDuration().asSeconds.toFixed(3)}s`);
@@ -220,4 +198,4 @@ var _default = SimulatorXcode8;
220
198
  exports.default = _default;require('source-map-support').install();
221
199
 
222
200
 
223
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOC5qcyJdLCJuYW1lcyI6WyJTVEFSVFVQX1RJTUVPVVQiLCJQUk9DRVNTX0xBVU5DSF9PS19QQVRURVJOIiwiYnVuZGxlSWQiLCJSZWdFeHAiLCJyZXBsYWNlIiwiU2ltdWxhdG9yWGNvZGU4IiwiU2ltdWxhdG9yWGNvZGU3IiwiY29uc3RydWN0b3IiLCJ1ZGlkIiwieGNvZGVWZXJzaW9uIiwiaXNGcmVzaEZpbGVzIiwiX2lkYiIsIl9sb2NhdGlvbk1lbnUiLCJpZGIiLCJ2YWx1ZSIsImtpbGxVSUNsaWVudCIsIm9wdHMiLCJwaWQiLCJzaWduYWwiLCJnZXRVSUNsaWVudFBpZCIsImxvZyIsImRlYnVnIiwiZSIsImNvZGUiLCJFcnJvciIsIm1lc3NhZ2UiLCJpc0FwcEluc3RhbGxlZCIsImFwcENvbnRhaW5lciIsInNpbWN0bCIsImdldEFwcENvbnRhaW5lciIsImVuZHNXaXRoIiwiZXJyIiwiaW5mbyIsImFwcEluZm8iLCJpbmNsdWRlcyIsInN0YXJ0dXBUaW1lb3V0Iiwid2FpdEZvckJvb3QiLCJzdGFydEJvb3RNb25pdG9yIiwidGltZW91dCIsImVtaXQiLCJCT09UX0NPTVBMRVRFRF9FVkVOVCIsIm9wZW5VcmwiLCJ1cmwiLCJpc1J1bm5pbmciLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJsYXN0RXJyb3IiLCJzdGRvdXQiLCJsYXVuY2hBcHAiLCJNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCIsInRlc3QiLCJ3YXJuIiwic3RkZXJyIiwid2FpdE1zIiwiU0FGQVJJX1NUQVJUVVBfVElNRU9VVCIsImludGVydmFsTXMiLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJjbGVhblNhZmFyaSIsImtlZXBQcmVmcyIsInRlcm1pbmF0ZUFwcCIsImlnbiIsImNsZWFuQ3VzdG9tQXBwIiwiYXBwRmlsZSIsImFwcEJ1bmRsZUlkIiwic2NydWIiLCJzaGFrZSIsInNwYXduUHJvY2VzcyIsImlzQmlvbWV0cmljRW5yb2xsZWQiLCJvdXRwdXQiLCJleGVjdXRlVUlDbGllbnRTY3JpcHQiLCJfIiwiaXNTdHJpbmciLCJ0cmltIiwiZW5yb2xsQmlvbWV0cmljIiwiaXNFbmFibGVkIiwic2VuZEJpb21ldHJpY01hdGNoIiwic2hvdWxkTWF0Y2giLCJzZXRHZW9sb2NhdGlvbiIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwibG9jYXRpb25TZXR0ZXJzIiwic2V0dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUlBLE1BQU1BLGVBQWUsR0FBRyxNQUFNLElBQTlCOztBQUNBLE1BQU1DLHlCQUF5QixHQUFJQyxRQUFELElBQWMsSUFBSUMsTUFBSixDQUFZLEdBQUVELFFBQVEsQ0FBQ0UsT0FBVCxDQUFpQixHQUFqQixFQUFzQixLQUF0QixDQUE2QixXQUEzQyxDQUFoRDs7QUFFQSxNQUFNQyxlQUFOLFNBQThCQyx3QkFBOUIsQ0FBOEM7QUFDNUNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRQyxZQUFSLEVBQXNCO0FBQy9CLFVBQU1ELElBQU4sRUFBWUMsWUFBWjtBQUtBLFNBQUtDLFlBQUwsR0FBb0IsQ0FDbEIsaUJBRGtCLEVBRWxCLDhDQUZrQixFQUdsQixpREFIa0IsRUFJbEIsb0JBSmtCLENBQXBCO0FBTUEsU0FBS0MsSUFBTCxHQUFZLElBQVo7QUFJQSxTQUFLQyxhQUFMLEdBQXFCLE9BQXJCO0FBQ0Q7O0FBT00sTUFBSEMsR0FBRyxDQUFFQyxLQUFGLEVBQVM7QUFDZCxTQUFLSCxJQUFMLEdBQVlHLEtBQVo7QUFDRDs7QUFLTSxNQUFIRCxHQUFHLEdBQUk7QUFDVCxXQUFPLEtBQUtGLElBQVo7QUFDRDs7QUFpQmlCLFFBQVpJLFlBQVksQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUM3QixRQUFJO0FBQ0ZDLE1BQUFBLEdBREU7QUFFRkMsTUFBQUEsTUFBTSxHQUFHO0FBRlAsUUFHQUYs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cEMsVUFBSTtBQUNGLGNBQU1DLE1BQU0sRUFBWjtBQUNBLGVBQU8sSUFBUDtBQUNELE9BSEQsQ0FHRSxPQUFPL0QsQ0FBUCxFQUFVO0FBQ1ZGLHdCQUFJWSxJQUFKLENBQVNWLENBQUMsQ0FBQ0csT0FBWDs7QUFDQXVCLFFBQUFBLFNBQVMsR0FBRzFCLENBQVo7QUFDRDtBQUNGOztBQUNELFVBQU0wQixTQUFOO0FBQ0Q7O0FBclIyQzs7ZUF3Ui9CM0MsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJPT1RfQ09NUExFVEVEX0VWRU5UIH0gZnJvbSAnLi9zaW11bGF0b3IteGNvZGUtNic7XG5pbXBvcnQgU2ltdWxhdG9yWGNvZGU3IGZyb20gJy4vc2ltdWxhdG9yLXhjb2RlLTcnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgc2V0TG9jYXRpb25XaXRoTHlmdCxcbiAgc2V0TG9jYXRpb25XaXRoSWRiLFxuICBzZXRMb2NhdGlvbldpdGhBcHBsZVNjcmlwdCB9IGZyb20gJy4vZ2VvbG9jYXRpb24nO1xuaW1wb3J0IHsgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IE1PQklMRV9TQUZBUklfQlVORExFX0lELCBTQUZBUklfU1RBUlRVUF9USU1FT1VUIH0gZnJvbSAnLi91dGlscyc7XG5cblxuLy8gdGhlc2Ugc2ltcyBhcmUgc2xvb29vb29vb3dcbmNvbnN0IFNUQVJUVVBfVElNRU9VVCA9IDEyMCAqIDEwMDA7XG5jb25zdCBQUk9DRVNTX0xBVU5DSF9PS19QQVRURVJOID0gKGJ1bmRsZUlkKSA9PiBuZXcgUmVnRXhwKGAke2J1bmRsZUlkLnJlcGxhY2UoJy4nLCAnXFxcXC4nKX06XFxcXHMrXFxcXGQrYCk7XG5cbmNsYXNzIFNpbXVsYXRvclhjb2RlOCBleHRlbmRzIFNpbXVsYXRvclhjb2RlNyB7XG4gIGNvbnN0cnVjdG9yICh1ZGlkLCB4Y29kZVZlcnNpb24pIHtcbiAgICBzdXBlcih1ZGlkLCB4Y29kZVZlcnNpb24pO1xuXG4gICAgLy8gbGlzdCBvZiBmaWxlcyB0byBjaGVjayBmb3Igd2hlbiBzZWVpbmcgaWYgYSBzaW11bGF0b3IgaXMgXCJmcmVzaFwiXG4gICAgLy8gKG1lYW5pbmcgaXQgaGFzIG5ldmVyIGJlZW4gYm9vdGVkKS5cbiAgICAvLyBJZiB0aGVzZSBmaWxlcyBhcmUgcHJlc2VudCwgd2UgYXNzdW1lIGl0J3MgYmVlbiBzdWNjZXNzZnVsbHkgYm9vdGVkXG4gICAgdGhpcy5pc0ZyZXNoRmlsZXMgPSBbXG4gICAgICAnTGlicmFyeS9Db29raWVzJyxcbiAgICAgICdMaWJyYXJ5L1ByZWZlcmVuY2VzLy5HbG9iYWxQcmVmZXJlbmNlcy5wbGlzdCcsXG4gICAgICAnTGlicmFyeS9QcmVmZXJlbmNlcy9jb20uYXBwbGUuc3ByaW5nYm9hcmQucGxpc3QnLFxuICAgICAgJ3Zhci9ydW4vc3lzbG9nLnBpZCdcbiAgICBdO1xuICAgIHRoaXMuX2lkYiA9IG51bGw7XG5cbiAgICAvLyBmb3Igc2V0dGluZyB0aGUgbG9jYXRpb24gdXNpbmcgQXBwbGVTY3JpcHQsIHRoZSB0b3AtbGV2ZWwgbWVudSB0aHJvdWdoIHdoaWNoXG4gICAgLy8gdGhlICdMb2NhdGlvbicgb3B0aW9uIGlzIGZvdW5kXG4gICAgdGhpcy5fbG9jYXRpb25NZW51ID0gJ0RlYnVnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJREIgaW5zdGFuY2Ugc2V0dGVyXG4gICAqXG4gICAqIEBwYXJhbSB7SURCfSB2YWx1ZVxuICAgKi9cbiAgc2V0IGlkYiAodmFsdWUpIHtcbiAgICB0aGlzLl9pZGIgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtJREJ9IGlkYiBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IGlkYiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBraWxsT3B0c1xuICAgKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBwaWQgLSBQcm9jZXNzIGlkIG9mIHRoZSBVSSBTaW11bGF0b3Igd2luZG93XG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gc2lnbmFsIFsyXSAtIFRoZSBzaWduYWwgbnVtYmVyIHRvIHNlbmQgdG8gdGhlXG4gICAqIGBraWxsYCBjb21tYW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBLaWxsIHRoZSBVSSBjbGllbnQgaWYgaXQgaXMgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHs/a2lsbE9wdHN9IG9wdHNcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgVUkgY2xpZW50IHdhcyBzdWNjZXNzZnVsbHkga2lsbGVkIG9yIGZhbHNlXG4gICAqICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIG5vdCBydW5uaW5nLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2VuZGluZyB0aGUgc2lnbmFsIHRvIHRoZSBjbGllbnQgcHJvY2VzcyBmYWlsc1xuICAgKi9cbiAgYXN5bmMga2lsbFVJQ2xpZW50IChvcHRzID0ge30pIHtcbiAgICBsZXQge1xuICAgICAgcGlkLFxuICAgICAgc2lnbmFsID0gMixcbiAgICB9ID0gb3B0cztcbiAgICBwaWQgPSBwaWQgfHwgYXdhaXQgdGhpcy5nZXRVSUNsaWVudFBpZCgpO1xuICAgIGlmICghcGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBTZW5kaW5nICR7c2lnbmFsfSBraWxsIHNpZ25hbCB0byBTaW11bGF0b3IgVUkgY2xpZW50IHdpdGggUElEICR7cGlkfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgW2AtJHtzaWduYWx9YCwgcGlkXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGtpbGwgdGhlIFNpbXVsYXRvciBVSSBjbGllbnQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9uIFNpbXVsYXRvci5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBidW5kbGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZC5cbiAgICovXG4gIGFzeW5jIGlzQXBwSW5zdGFsbGVkIChidW5kbGVJZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBDb250YWluZXIgPSBhd2FpdCB0aGlzLnNpbWN0bC5nZXRBcHBDb250YWluZXIoYnVuZGxlSWQpO1xuICAgICAgcmV0dXJuIGFwcENvbnRhaW5lci5lbmRzV2l0aCgnLmFwcCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZ2V0X2FwcF9jb250YWluZXIgc3ViY29tbWFuZCBmYWlscyBmb3Igc3lzdGVtIGFwcGxpY2F0aW9ucyxcbiAgICAgIC8vIHNvIHdlIHRyeSB0aGUgaGlkZGVuIGFwcGluZm8gc3ViY29tbWFuZCwgd2hpY2ggcHJpbnRzIGNvcnJlY3QgaW5mbyBmb3JcbiAgICAgIC8vIHN5c3RlbS9oaWRkZW4gYXBwc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuc2ltY3RsLmFwcEluZm8oYnVuZGxlSWQpO1xuICAgICAgICByZXR1cm4gaW5mby5pbmNsdWRlcygnQXBwbGljYXRpb25UeXBlJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4IG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBTaW11bGF0b3IgYm9vdGluZyBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBnZXQgc3RhcnR1cFRpbWVvdXQgKCkge1xuICAgIHJldHVybiBTVEFSVFVQX1RJTUVPVVQ7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgdGhlIFNpbXVsYXRvciBib290aW5nIGlzIGNvbXBsZXRlZCBhbmQvb3Igd2FpdCBmb3IgaXRcbiAgICogdW50aWwgdGhlIHRpbWVvdXQgZXhwaXJlcy5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydHVwVGltZW91dCAtIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgYm9vdGluZyBpcyBjb21wbGV0ZWQuXG4gICAqIEBlbWl0cyBCT09UX0NPTVBMRVRFRF9FVkVOVCBpZiB0aGUgY3VycmVudCBTaW11bGF0b3IgaXMgcmVhZHkgdG8gYWNjZXB0IHNpbWN0bCBjb21tYW5kcywgbGlrZSAnaW5zdGFsbCcuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQm9vdCAoc3RhcnR1cFRpbWVvdXQpIHtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5zdGFydEJvb3RNb25pdG9yKHt0aW1lb3V0OiBzdGFydHVwVGltZW91dH0pO1xuICAgIHRoaXMuZW1pdChCT09UX0NPTVBMRVRFRF9FVkVOVCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZ2l2ZW4gVVJMIGluIG1vYmlsZSBTYWZhcmkgYnJvd3Nlci5cbiAgICogVGhlIGJyb3dzZXIgd2lsbCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgaWYgaXQgaXMgbm90IHJ1bm5pbmcuXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBiZSBvcGVuZWQuXG4gICAqL1xuICBhc3luYyBvcGVuVXJsICh1cmwpIHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gb3BlbiAnJHt1cmx9JywgYnV0IFNpbXVsYXRvciBpcyBub3QgaW4gQm9vdGVkIHN0YXRlYCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdG8gbWFrZSBzdXJlIFNhZmFyaSBpcyBhbHJlYWR5IHJ1bm5pbmdcbiAgICAgICAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNpbWN0bC5sYXVuY2hBcHAoTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQpO1xuICAgICAgICAgIGlmIChQUk9DRVNTX0xBVU5DSF9PS19QQVRURVJOKE1PQklMRV9TQUZBUklfQlVORExFX0lEKS50ZXN0KHN0ZG91dCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLm9wZW5VcmwodXJsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBvcGVuICcke3VybH0nIGluIFNhZmFyaS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlcnIuc3RkZXJyIHx8IGVyci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sIHt3YWl0TXM6IFNBRkFSSV9TVEFSVFVQX1RJTUVPVVQsIGludGVydmFsTXM6IDUwMH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYWZhcmkgY2Fubm90IG9wZW4gJyR7dXJsfScgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXMgYCArXG4gICAgICAgIGBiZWNhdXNlIG9mOiAke2xhc3RFcnJvciB8fCAnYW4gdW5rbm93biBlcnJvcid9YCk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgU2FmYXJpIHN1Y2Nlc3NmdWxseSBvcGVuZWQgJyR7dXJsfScgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCB0aGUgZGlyZWN0b3JpZXMgZm9yIG1vYmlsZSBTYWZhcmkuXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBQcmVmcyAtIFdoZXRoZXIgdG8ga2VlcCBTYWZhcmkgcHJlZmVyZW5jZXMgZnJvbSBiZWluZyBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW5TYWZhcmkgKGtlZXBQcmVmcyA9IHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaW1jdGwudGVybWluYXRlQXBwKE1PQklMRV9TQUZBUklfQlVORExFX0lEKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvclxuICAgIH1cbiAgICBhd2FpdCBzdXBlci5jbGVhblNhZmFyaShrZWVwUHJlZnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuL3NjcnViIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIFNpbXVsYXRvci5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBGaWxlIC0gQXBwbGljYXRpb24gbmFtZSBtaW51cyBcIi5hcHBcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcEJ1bmRsZUlkIC0gQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjcnViIC0gSWYgYHNjcnViYCBpcyBmYWxzZSwgd2Ugd2FudCB0byBjbGVhbiBieSBkZWxldGluZyB0aGUgYXBwIGFuZCBhbGxcbiAgICogICBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQuIElmIGBzY3J1YmAgaXMgdHJ1ZSwgd2UganVzdCB3YW50IHRvIGRlbGV0ZSB0aGUgcHJlZmVyZW5jZXMgYW5kXG4gICAqICAgY2hhbmdlZCBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGNsZWFuQ3VzdG9tQXBwIChhcHBGaWxlLCBhcHBCdW5kbGVJZCwgc2NydWIgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC50ZXJtaW5hdGVBcHAoYXBwQnVuZGxlSWQpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgLy8gaWdub3JlIGVycm9yXG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmNsZWFuQ3VzdG9tQXBwKGFwcEZpbGUsIGFwcEJ1bmRsZUlkLCBzY3J1Yik7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBTaGFrZSBnZXN0dXJlIG9uIFNpbXVsYXRvciB3aW5kb3cuXG4gICAqL1xuICBhc3luYyBzaGFrZSAoKSB7XG4gICAgbG9nLmluZm8oYFBlcmZvcm1pbmcgc2hha2UgZ2VzdHVyZSBvbiAke3RoaXMudWRpZH0gU2ltdWxhdG9yYCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctcCcsICdjb20uYXBwbGUuVUlLaXQuU2ltdWxhdG9yU2hha2UnXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBpc0Jpb21ldHJpY0Vucm9sbGVkICgpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIlRvZ2dsZSBFbnJvbGxlZCBTdGF0ZVwiIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJUb3VjaCBJRFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgICAgc2V0IGlzQ2hlY2tlZCB0byAodmFsdWUgb2YgYXR0cmlidXRlIFwiQVhNZW51SXRlbU1hcmtDaGFyXCIgb2YgZHN0TWVudUl0ZW0pIGlzIFwi4pyTXCJcbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYCk7XG4gICAgbG9nLmRlYnVnKGBUb3VjaCBJRCBlbnJvbGxlZCBzdGF0ZTogJHtvdXRwdXR9YCk7XG4gICAgcmV0dXJuIF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudHJpbSgpID09PSAndHJ1ZSc7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBlbnJvbGxCaW9tZXRyaWMgKGlzRW5hYmxlZCA9IHRydWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIlRvZ2dsZSBFbnJvbGxlZCBTdGF0ZVwiIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJUb3VjaCBJRFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgICAgc2V0IGlzQ2hlY2tlZCB0byAodmFsdWUgb2YgYXR0cmlidXRlIFwiQVhNZW51SXRlbU1hcmtDaGFyXCIgb2YgZHN0TWVudUl0ZW0pIGlzIFwi4pyTXCJcbiAgICAgICAgICBpZiAke2lzRW5hYmxlZCA/ICdub3QgJyA6ICcnfWlzQ2hlY2tlZCB0aGVuXG4gICAgICAgICAgICBjbGljayBkc3RNZW51SXRlbVxuICAgICAgICAgIGVuZCBpZlxuICAgICAgICBlbmQgdGVsbFxuICAgICAgZW5kIHRlbGxcbiAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIHNlbmRCaW9tZXRyaWNNYXRjaCAoc2hvdWxkTWF0Y2ggPSB0cnVlKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlVUlDbGllbnRTY3JpcHQoYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBkc3RNZW51SXRlbSB0byBtZW51IGl0ZW0gXCIke3Nob3VsZE1hdGNoID8gJ01hdGNoaW5nIFRvdWNoJyA6ICdOb24tbWF0Y2hpbmcgVG91Y2gnfVwiIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJUb3VjaCBJRFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgICAgY2xpY2sgZHN0TWVudUl0ZW1cbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1c3RvbSBnZW9sb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgZ2l2ZW4gU2ltdWxhdG9yIHVzaW5nIEFwcGxlU2NyaXB0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhdGl0dWRlIC0gVGhlIGxhdGl0dWRlIHZhbHVlLCB3aGljaCBpcyBnb2luZyB0byBiZSBlbnRlcmVkXG4gICAqICAgaW50byB0aGUgY29ycmVzcG9uZGluZyBlZGl0IGZpZWxkLCBmb3IgZXhhbXBsZSAnMzksMDAwNicuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbG9uZ2l0dWRlIC0gVGhlIGxvbmdpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICAgKiAgIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBmaWVsZCwgZm9yIGV4YW1wbGUgJzE5LDAwNjgnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBoYXZlIGNvcnJlY3QgZm9ybWF0IGFuZCB3ZXJlIHN1Y2Nlc3NmdWxseSBhY2NlcHRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBzZXR0aW5nIHRoZSBsb2NhdGlvblxuICAgKi9cbiAgYXN5bmMgc2V0R2VvbG9jYXRpb24gKGxhdGl0dWRlLCBsb25naXR1ZGUpIHtcbiAgICBjb25zdCBsb2NhdGlvblNldHRlcnMgPSBbXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCBzZXRMb2NhdGlvbldpdGhMeWZ0KHRoaXMudWRpZCwgbGF0aXR1ZGUsIGxvbmdpdHVkZSksXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCBzZXRMb2NhdGlvbldpdGhJZGIodGhpcy5pZGIsIGxhdGl0dWRlLCBsb25naXR1ZGUpLFxuICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgc2V0TG9jYXRpb25XaXRoQXBwbGVTY3JpcHQodGhpcywgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgdGhpcy5fbG9jYXRpb25NZW51KSxcbiAgICBdO1xuXG4gICAgbGV0IGxhc3RFcnJvcjtcbiAgICBmb3IgKGNvbnN0IHNldHRlciBvZiBsb2NhdGlvblNldHRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNldHRlcigpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmluZm8oZS5tZXNzYWdlKTtcbiAgICAgICAgbGFzdEVycm9yID0gZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpbXVsYXRvclhjb2RlODtcbiJdLCJmaWxlIjoibGliL3NpbXVsYXRvci14Y29kZS04LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
201
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOC5qcyJdLCJuYW1lcyI6WyJTVEFSVFVQX1RJTUVPVVQiLCJTaW11bGF0b3JYY29kZTgiLCJTaW11bGF0b3JYY29kZTciLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ4Y29kZVZlcnNpb24iLCJpc0ZyZXNoRmlsZXMiLCJfaWRiIiwiX2xvY2F0aW9uTWVudSIsImlkYiIsInZhbHVlIiwia2lsbFVJQ2xpZW50Iiwib3B0cyIsInBpZCIsInNpZ25hbCIsImdldFVJQ2xpZW50UGlkIiwibG9nIiwiZGVidWciLCJlIiwiY29kZSIsIkVycm9yIiwibWVzc2FnZSIsImlzQXBwSW5zdGFsbGVkIiwiYnVuZGxlSWQiLCJhcHBDb250YWluZXIiLCJzaW1jdGwiLCJnZXRBcHBDb250YWluZXIiLCJlbmRzV2l0aCIsImVyciIsImluZm8iLCJhcHBJbmZvIiwiaW5jbHVkZXMiLCJzdGFydHVwVGltZW91dCIsIndhaXRGb3JCb290Iiwic3RhcnRCb290TW9uaXRvciIsInRpbWVvdXQiLCJlbWl0IiwiQk9PVF9DT01QTEVURURfRVZFTlQiLCJvcGVuVXJsIiwidXJsIiwiaXNSdW5uaW5nIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwiTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQiLCJTQUZBUklfU1RBUlRVUF9USU1FT1VUIiwiZ2V0RHVyYXRpb24iLCJhc1NlY29uZHMiLCJ0b0ZpeGVkIiwic3RkZXJyIiwiY2xlYW5TYWZhcmkiLCJrZWVwUHJlZnMiLCJ0ZXJtaW5hdGVBcHAiLCJpZ24iLCJjbGVhbkN1c3RvbUFwcCIsImFwcEZpbGUiLCJhcHBCdW5kbGVJZCIsInNjcnViIiwic2hha2UiLCJzcGF3blByb2Nlc3MiLCJpc0Jpb21ldHJpY0Vucm9sbGVkIiwib3V0cHV0IiwiZXhlY3V0ZVVJQ2xpZW50U2NyaXB0IiwiXyIsImlzU3RyaW5nIiwidHJpbSIsImVucm9sbEJpb21ldHJpYyIsImlzRW5hYmxlZCIsInNlbmRCaW9tZXRyaWNNYXRjaCIsInNob3VsZE1hdGNoIiwic2V0R2VvbG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImxvY2F0aW9uU2V0dGVycyIsImxhc3RFcnJvciIsInNldHRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFJQSxNQUFNQSxlQUFlLEdBQUcsTUFBTSxJQUE5Qjs7QUFFQSxNQUFNQyxlQUFOLFNBQThCQyx3QkFBOUIsQ0FBOEM7QUFDNUNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRQyxZQUFSLEVBQXNCO0FBQy9CLFVBQU1ELElBQU4sRUFBWUMsWUFBWjtBQUtBLFNBQUtDLFlBQUwsR0FBb0IsQ0FDbEIsaUJBRGtCLEVBRWxCLDhDQUZrQixFQUdsQixpREFIa0IsRUFJbEIsb0JBSmtCLENBQXBCO0FBTUEsU0FBS0MsSUFBTCxHQUFZLElBQVo7QUFJQSxTQUFLQyxhQUFMLEdBQXFCLE9BQXJCO0FBQ0Q7O0FBT00sTUFBSEMsR0FBRyxDQUFFQyxLQUFGLEVBQVM7QUFDZCxTQUFLSCxJQUFMLEdBQVlHLEtBQVo7QUFDRDs7QUFLTSxNQUFIRCxHQUFHLEdBQUk7QUFDVCxXQUFPLEtBQUtGLElBQVo7QUFDRDs7QUFpQmlCLFFBQVpJLFlBQVksQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUM3QixRQUFJO0FBQ0ZDLE1BQUFBLEdBREU7QUFFRkMsTUFBQUEsTUFBTSxHQUFHO0FBRlAsUUFHQUYsSUFISjtBQUlBQyxJQUFBQSxHQUFHLEdBQUdBLEdBQUcsS0FBSSxNQUFNLEtBQUtFLGNBQUwsRUFBVixDQUFUOztBQUNBLFFBQUksQ0FBQ0YsR0FBTCxFQUFVO0FBQ1IsYUFBTyxLQUFQO0FBQ0Q7O0FBRURHLG9CQUFJQyxLQUFKLENBQVcsV0FBVUgsTUFBTyxnREFBK0NELEdBQUksRUFBL0U7O0FBQ0EsUUFBSTtBQUNGLFlBQU0sd0JBQUssTUFBTCxFQUFhLENBQUUsSUFBR0MsTUFBTyxFQUFaLEVB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LFlBQVksTUFBTSxzQ0FBb0IsS0FBS3RFLElBQXpCLEVBQStCb0UsUUFBL0IsRUFBeUNDLFNBQXpDLENBREksRUFFdEIsWUFBWSxNQUFNLHFDQUFtQixLQUFLaEUsR0FBeEIsRUFBNkIrRCxRQUE3QixFQUF1Q0MsU0FBdkMsQ0FGSSxFQUd0QixZQUFZLE1BQU0sNkNBQTJCLElBQTNCLEVBQWlDRCxRQUFqQyxFQUEyQ0MsU0FBM0MsRUFBc0QsS0FBS2pFLGFBQTNELENBSEksQ0FBeEI7QUFNQSxRQUFJbUUsU0FBSjs7QUFDQSxTQUFLLE1BQU1DLE1BQVgsSUFBcUJGLGVBQXJCLEVBQXNDO0FBQ3BDLFVBQUk7QUFDRixjQUFNRSxNQUFNLEVBQVo7QUFDQSxlQUFPLElBQVA7QUFDRCxPQUhELENBR0UsT0FBTzFELENBQVAsRUFBVTtBQUNWRix3QkFBSWEsSUFBSixDQUFTWCxDQUFDLENBQUNHLE9BQVg7O0FBQ0FzRCxRQUFBQSxTQUFTLEdBQUd6RCxDQUFaO0FBQ0Q7QUFDRjs7QUFDRCxVQUFNeUQsU0FBTjtBQUNEOztBQXhRMkM7O2VBMlEvQjFFLGUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCT09UX0NPTVBMRVRFRF9FVkVOVCB9IGZyb20gJy4vc2ltdWxhdG9yLXhjb2RlLTYnO1xuaW1wb3J0IFNpbXVsYXRvclhjb2RlNyBmcm9tICcuL3NpbXVsYXRvci14Y29kZS03JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgc2V0TG9jYXRpb25XaXRoTHlmdCxcbiAgc2V0TG9jYXRpb25XaXRoSWRiLFxuICBzZXRMb2NhdGlvbldpdGhBcHBsZVNjcmlwdCB9IGZyb20gJy4vZ2VvbG9jYXRpb24nO1xuaW1wb3J0IHsgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IE1PQklMRV9TQUZBUklfQlVORExFX0lELCBTQUZBUklfU1RBUlRVUF9USU1FT1VULCBsYXVuY2hBcHAgfSBmcm9tICcuL3V0aWxzJztcblxuXG4vLyB0aGVzZSBzaW1zIGFyZSBzbG9vb29vb29vd1xuY29uc3QgU1RBUlRVUF9USU1FT1VUID0gMTIwICogMTAwMDtcblxuY2xhc3MgU2ltdWxhdG9yWGNvZGU4IGV4dGVuZHMgU2ltdWxhdG9yWGNvZGU3IHtcbiAgY29uc3RydWN0b3IgKHVkaWQsIHhjb2RlVmVyc2lvbikge1xuICAgIHN1cGVyKHVkaWQsIHhjb2RlVmVyc2lvbik7XG5cbiAgICAvLyBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGZvciB3aGVuIHNlZWluZyBpZiBhIHNpbXVsYXRvciBpcyBcImZyZXNoXCJcbiAgICAvLyAobWVhbmluZyBpdCBoYXMgbmV2ZXIgYmVlbiBib290ZWQpLlxuICAgIC8vIElmIHRoZXNlIGZpbGVzIGFyZSBwcmVzZW50LCB3ZSBhc3N1bWUgaXQncyBiZWVuIHN1Y2Nlc3NmdWxseSBib290ZWRcbiAgICB0aGlzLmlzRnJlc2hGaWxlcyA9IFtcbiAgICAgICdMaWJyYXJ5L0Nvb2tpZXMnLFxuICAgICAgJ0xpYnJhcnkvUHJlZmVyZW5jZXMvLkdsb2JhbFByZWZlcmVuY2VzLnBsaXN0JyxcbiAgICAgICdMaWJyYXJ5L1ByZWZlcmVuY2VzL2NvbS5hcHBsZS5zcHJpbmdib2FyZC5wbGlzdCcsXG4gICAgICAndmFyL3J1bi9zeXNsb2cucGlkJ1xuICAgIF07XG4gICAgdGhpcy5faWRiID0gbnVsbDtcblxuICAgIC8vIGZvciBzZXR0aW5nIHRoZSBsb2NhdGlvbiB1c2luZyBBcHBsZVNjcmlwdCwgdGhlIHRvcC1sZXZlbCBtZW51IHRocm91Z2ggd2hpY2hcbiAgICAvLyB0aGUgJ0xvY2F0aW9uJyBvcHRpb24gaXMgZm91bmRcbiAgICB0aGlzLl9sb2NhdGlvbk1lbnUgPSAnRGVidWcnO1xuICB9XG5cbiAgLyoqXG4gICAqIElEQiBpbnN0YW5jZSBzZXR0ZXJcbiAgICpcbiAgICogQHBhcmFtIHtJREJ9IHZhbHVlXG4gICAqL1xuICBzZXQgaWRiICh2YWx1ZSkge1xuICAgIHRoaXMuX2lkYiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0lEQn0gaWRiIGluc3RhbmNlXG4gICAqL1xuICBnZXQgaWRiICgpIHtcbiAgICByZXR1cm4gdGhpcy5faWRiO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IGtpbGxPcHRzXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHBpZCAtIFByb2Nlc3MgaWQgb2YgdGhlIFVJIFNpbXVsYXRvciB3aW5kb3dcbiAgICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSBzaWduYWwgWzJdIC0gVGhlIHNpZ25hbCBudW1iZXIgdG8gc2VuZCB0byB0aGVcbiAgICogYGtpbGxgIGNvbW1hbmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEtpbGwgdGhlIFVJIGNsaWVudCBpZiBpdCBpcyBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gez9raWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBVSSBjbGllbnQgd2FzIHN1Y2Nlc3NmdWxseSBraWxsZWQgb3IgZmFsc2VcbiAgICogICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbm90IHJ1bm5pbmcuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzZW5kaW5nIHRoZSBzaWduYWwgdG8gdGhlIGNsaWVudCBwcm9jZXNzIGZhaWxzXG4gICAqL1xuICBhc3luYyBraWxsVUlDbGllbnQgKG9wdHMgPSB7fSkge1xuICAgIGxldCB7XG4gICAgICBwaWQsXG4gICAgICBzaWduYWwgPSAyLFxuICAgIH0gPSBvcHRzO1xuICAgIHBpZCA9IHBpZCB8fCBhd2FpdCB0aGlzLmdldFVJQ2xpZW50UGlkKCk7XG4gICAgaWYgKCFwaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsb2cuZGVidWcoYFNlbmRpbmcgJHtzaWduYWx9IGtpbGwgc2lnbmFsIHRvIFNpbXVsYXRvciBVSSBjbGllbnQgd2l0aCBQSUQgJHtwaWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBbYC0ke3NpZ25hbH1gLCBwaWRdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qga2lsbCB0aGUgU2ltdWxhdG9yIFVJIGNsaWVudC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb24gU2ltdWxhdG9yLlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1bmRsZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgY2hlY2tlZC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkLlxuICAgKi9cbiAgYXN5bmMgaXNBcHBJbnN0YWxsZWQgKGJ1bmRsZUlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwcENvbnRhaW5lciA9IGF3YWl0IHRoaXMuc2ltY3RsLmdldEFwcENvbnRhaW5lcihidW5kbGVJZCk7XG4gICAgICByZXR1cm4gYXBwQ29udGFpbmVyLmVuZHNXaXRoKCcuYXBwJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBnZXRfYXBwX2NvbnRhaW5lciBzdWJjb21tYW5kIGZhaWxzIGZvciBzeXN0ZW0gYXBwbGljYXRpb25zLFxuICAgICAgLy8gc28gd2UgdHJ5IHRoZSBoaWRkZW4gYXBwaW5mbyBzdWJjb21tYW5kLCB3aGljaCBwcmludHMgY29ycmVjdCBpbmZvIGZvclxuICAgICAgLy8gc3lzdGVtL2hpZGRlbiBhcHBzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5zaW1jdGwuYXBwSW5mbyhidW5kbGVJZCk7XG4gICAgICAgIHJldHVybiBpbmZvLmluY2x1ZGVzKCdBcHBsaWNhdGlvblR5cGUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXggbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIFNpbXVsYXRvciBib290aW5nIGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIGdldCBzdGFydHVwVGltZW91dCAoKSB7XG4gICAgcmV0dXJuIFNUQVJUVVBfVElNRU9VVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciB0aGUgU2ltdWxhdG9yIGJvb3RpbmcgaXMgY29tcGxldGVkIGFuZC9vciB3YWl0IGZvciBpdFxuICAgKiB1bnRpbCB0aGUgdGltZW91dCBleHBpcmVzLlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0dXBUaW1lb3V0IC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCBib290aW5nIGlzIGNvbXBsZXRlZC5cbiAgICogQGVtaXRzIEJPT1RfQ09NUExFVEVEX0VWRU5UIGlmIHRoZSBjdXJyZW50IFNpbXVsYXRvciBpcyByZWFkeSB0byBhY2NlcHQgc2ltY3RsIGNvbW1hbmRzLCBsaWtlICdpbnN0YWxsJy5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JCb290IChzdGFydHVwVGltZW91dCkge1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnN0YXJ0Qm9vdE1vbml0b3Ioe3RpbWVvdXQ6IHN0YXJ0dXBUaW1lb3V0fSk7XG4gICAgdGhpcy5lbWl0KEJPT1RfQ09NUExFVEVEX0VWRU5UKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBnaXZlbiBVUkwgaW4gbW9iaWxlIFNhZmFyaSBicm93c2VyLlxuICAgKiBUaGUgYnJvd3NlciB3aWxsIGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSBpZiBpdCBpcyBub3QgcnVubmluZy5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGJlIG9wZW5lZC5cbiAgICovXG4gIGFzeW5jIG9wZW5VcmwgKHVybCkge1xuICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBvcGVuICcke3VybH0nLCBidXQgU2ltdWxhdG9yIGlzIG5vdCBpbiBCb290ZWQgc3RhdGVgKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGF1bmNoQXBwKHRoaXMuc2ltY3RsLCBNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCwgU0FGQVJJX1NUQVJUVVBfVElNRU9VVCk7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC5vcGVuVXJsKHVybCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmFyaSBjb3VsZCBub3Qgb3BlbiAnJHt1cmx9JyBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9cy4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIuc3RkZXJyIHx8IGVyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFNhZmFyaSBzdWNjZXNzZnVsbHkgb3BlbmVkICcke3VybH0nIGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc1NlY29uZHMudG9GaXhlZCgzKX1zYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIGRpcmVjdG9yaWVzIGZvciBtb2JpbGUgU2FmYXJpLlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBrZWVwUHJlZnMgLSBXaGV0aGVyIHRvIGtlZXAgU2FmYXJpIHByZWZlcmVuY2VzIGZyb20gYmVpbmcgZGVsZXRlZC5cbiAgICovXG4gIGFzeW5jIGNsZWFuU2FmYXJpIChrZWVwUHJlZnMgPSB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2ltY3RsLnRlcm1pbmF0ZUFwcChNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAvLyBpZ25vcmUgZXJyb3JcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuY2xlYW5TYWZhcmkoa2VlcFByZWZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbi9zY3J1YiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiBTaW11bGF0b3IuXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwRmlsZSAtIEFwcGxpY2F0aW9uIG5hbWUgbWludXMgXCIuYXBwXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBCdW5kbGVJZCAtIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzY3J1YiAtIElmIGBzY3J1YmAgaXMgZmFsc2UsIHdlIHdhbnQgdG8gY2xlYW4gYnkgZGVsZXRpbmcgdGhlIGFwcCBhbmQgYWxsXG4gICAqICAgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LiBJZiBgc2NydWJgIGlzIHRydWUsIHdlIGp1c3Qgd2FudCB0byBkZWxldGUgdGhlIHByZWZlcmVuY2VzIGFuZFxuICAgKiAgIGNoYW5nZWQgZmlsZXMuXG4gICAqL1xuICBhc3luYyBjbGVhbkN1c3RvbUFwcCAoYXBwRmlsZSwgYXBwQnVuZGxlSWQsIHNjcnViID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaW1jdGwudGVybWluYXRlQXBwKGFwcEJ1bmRsZUlkKTtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvclxuICAgIH1cbiAgICBhd2FpdCBzdXBlci5jbGVhbkN1c3RvbUFwcChhcHBGaWxlLCBhcHBCdW5kbGVJZCwgc2NydWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gU2hha2UgZ2VzdHVyZSBvbiBTaW11bGF0b3Igd2luZG93LlxuICAgKi9cbiAgYXN5bmMgc2hha2UgKCkge1xuICAgIGxvZy5pbmZvKGBQZXJmb3JtaW5nIHNoYWtlIGdlc3R1cmUgb24gJHt0aGlzLnVkaWR9IFNpbXVsYXRvcmApO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLXAnLCAnY29tLmFwcGxlLlVJS2l0LlNpbXVsYXRvclNoYWtlJ1xuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgYXN5bmMgaXNCaW9tZXRyaWNFbnJvbGxlZCAoKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlVUlDbGllbnRTY3JpcHQoYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBkc3RNZW51SXRlbSB0byBtZW51IGl0ZW0gXCJUb2dnbGUgRW5yb2xsZWQgU3RhdGVcIiBvZiBtZW51IDEgb2YgbWVudSBpdGVtIFwiVG91Y2ggSURcIiBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIkhhcmR3YXJlXCIgb2YgbWVudSBiYXIgMVxuICAgICAgICAgIHNldCBpc0NoZWNrZWQgdG8gKHZhbHVlIG9mIGF0dHJpYnV0ZSBcIkFYTWVudUl0ZW1NYXJrQ2hhclwiIG9mIGRzdE1lbnVJdGVtKSBpcyBcIuKck1wiXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICAgIGxvZy5kZWJ1ZyhgVG91Y2ggSUQgZW5yb2xsZWQgc3RhdGU6ICR7b3V0cHV0fWApO1xuICAgIHJldHVybiBfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRyaW0oKSA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgYXN5bmMgZW5yb2xsQmlvbWV0cmljIChpc0VuYWJsZWQgPSB0cnVlKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlVUlDbGllbnRTY3JpcHQoYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBkc3RNZW51SXRlbSB0byBtZW51IGl0ZW0gXCJUb2dnbGUgRW5yb2xsZWQgU3RhdGVcIiBvZiBtZW51IDEgb2YgbWVudSBpdGVtIFwiVG91Y2ggSURcIiBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIkhhcmR3YXJlXCIgb2YgbWVudSBiYXIgMVxuICAgICAgICAgIHNldCBpc0NoZWNrZWQgdG8gKHZhbHVlIG9mIGF0dHJpYnV0ZSBcIkFYTWVudUl0ZW1NYXJrQ2hhclwiIG9mIGRzdE1lbnVJdGVtKSBpcyBcIuKck1wiXG4gICAgICAgICAgaWYgJHtpc0VuYWJsZWQgPyAnbm90ICcgOiAnJ31pc0NoZWNrZWQgdGhlblxuICAgICAgICAgICAgY2xpY2sgZHN0TWVudUl0ZW1cbiAgICAgICAgICBlbmQgaWZcbiAgICAgICAgZW5kIHRlbGxcbiAgICAgIGVuZCB0ZWxsXG4gICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBzZW5kQmlvbWV0cmljTWF0Y2ggKHNob3VsZE1hdGNoID0gdHJ1ZSkge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgICBzZXQgZHN0TWVudUl0ZW0gdG8gbWVudSBpdGVtIFwiJHtzaG91bGRNYXRjaCA/ICdNYXRjaGluZyBUb3VjaCcgOiAnTm9uLW1hdGNoaW5nIFRvdWNoJ31cIiBvZiBtZW51IDEgb2YgbWVudSBpdGVtIFwiVG91Y2ggSURcIiBvZiBtZW51IDEgb2YgbWVudSBiYXIgaXRlbSBcIkhhcmR3YXJlXCIgb2YgbWVudSBiYXIgMVxuICAgICAgICAgIGNsaWNrIGRzdE1lbnVJdGVtXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXN0b20gZ2VvbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIFNpbXVsYXRvciB1c2luZyBBcHBsZVNjcmlwdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICAgKiAgIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBmaWVsZCwgZm9yIGV4YW1wbGUgJzM5LDAwMDYnLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxvbmdpdHVkZSAtIFRoZSBsb25naXR1ZGUgdmFsdWUsIHdoaWNoIGlzIGdvaW5nIHRvIGJlIGVudGVyZWRcbiAgICogICBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVkaXQgZmllbGQsIGZvciBleGFtcGxlICcxOSwwMDY4Jy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHBhcmFtZXRlcnMgaGF2ZSBjb3JyZWN0IGZvcm1hdCBhbmQgd2VyZSBzdWNjZXNzZnVsbHkgYWNjZXB0ZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgbG9jYXRpb25cbiAgICovXG4gIGFzeW5jIHNldEdlb2xvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gICAgY29uc3QgbG9jYXRpb25TZXR0ZXJzID0gW1xuICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgc2V0TG9jYXRpb25XaXRoTHlmdCh0aGlzLnVkaWQsIGxhdGl0dWRlLCBsb25naXR1ZGUpLFxuICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgc2V0TG9jYXRpb25XaXRoSWRiKHRoaXMuaWRiLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKSxcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0IHNldExvY2F0aW9uV2l0aEFwcGxlU2NyaXB0KHRoaXMsIGxhdGl0dWRlLCBsb25naXR1ZGUsIHRoaXMuX2xvY2F0aW9uTWVudSksXG4gICAgXTtcblxuICAgIGxldCBsYXN0RXJyb3I7XG4gICAgZm9yIChjb25zdCBzZXR0ZXIgb2YgbG9jYXRpb25TZXR0ZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5pbmZvKGUubWVzc2FnZSk7XG4gICAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW11bGF0b3JYY29kZTg7XG4iXSwiZmlsZSI6ImxpYi9zaW11bGF0b3IteGNvZGUtOC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -14,6 +14,7 @@ exports.getSimulatorInfo = getSimulatorInfo;
14
14
  exports.hasSSLCert = hasSSLCert;
15
15
  exports.installSSLCert = installSSLCert;
16
16
  exports.killAllSimulators = killAllSimulators;
17
+ exports.launchApp = launchApp;
17
18
  exports.safeRimRaf = safeRimRaf;
18
19
  exports.simExists = simExists;
19
20
  exports.toBiometricDomainComponent = toBiometricDomainComponent;
@@ -47,6 +48,8 @@ exports.SAFARI_STARTUP_TIMEOUT = SAFARI_STARTUP_TIMEOUT;
47
48
  const MOBILE_SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
48
49
  exports.MOBILE_SAFARI_BUNDLE_ID = MOBILE_SAFARI_BUNDLE_ID;
49
50
 
51
+ const PROCESS_LAUNCH_OK_PATTERN = bundleId => new RegExp(`${bundleId.replace('.', '\\.')}:\\s+\\d+`);
52
+
50
53
  const APP_ACTIVATION_SCRIPT = pid => `#!/usr/bin/python
51
54
 
52
55
  from AppKit import NSApplicationActivateIgnoringOtherApps, NSApplicationActivateAllWindows
@@ -352,7 +355,35 @@ async function activateApp(pid) {
352
355
  } finally {
353
356
  await _support.fs.rimraf(tmpScript);
354
357
  }
358
+ }
359
+
360
+ async function launchApp(simctl, bundleId, timeoutMs = 25000) {
361
+ let lastError;
362
+
363
+ try {
364
+ await (0, _asyncbox.waitForCondition)(async () => {
365
+ try {
366
+ const stdout = await simctl.launchApp(MOBILE_SAFARI_BUNDLE_ID, 1);
367
+ return PROCESS_LAUNCH_OK_PATTERN(MOBILE_SAFARI_BUNDLE_ID).test(stdout);
368
+ } catch (err) {
369
+ lastError = err.stderr || err.message;
370
+ }
371
+
372
+ return false;
373
+ }, {
374
+ waitMs: timeoutMs,
375
+ intervalMs: 500
376
+ });
377
+ } catch (e) {
378
+ let msg = `'${bundleId}' did not run after ${timeoutMs}ms timeout.`;
379
+
380
+ if (lastError) {
381
+ msg += ` Original error: ${lastError}`;
382
+ }
383
+
384
+ throw new Error(msg);
385
+ }
355
386
  }require('source-map-support').install();
356
387
 
357
388
 
358
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUIiwiU0FGQVJJX1NUQVJUVVBfVElNRU9VVCIsIk1PQklMRV9TQUZBUklfQlVORExFX0lEIiwiQVBQX0FDVElWQVRJT05fU0NSSVBUIiwicGlkIiwiQklPTUVUUklDUyIsInRvdWNoSWQiLCJmYWNlSWQiLCJ0b0Jpb21ldHJpY0RvbWFpbkNvbXBvbmVudCIsIm5hbWUiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJfIiwia2V5cyIsInBraWxsIiwiYXBwTmFtZSIsImZvcmNlS2lsbCIsImFyZ3MiLCJwdXNoIiwiZXJyIiwiaXNVbmRlZmluZWQiLCJjb2RlIiwibG9nIiwiZXJyb3IiLCJtZXNzYWdlIiwia2lsbEFsbFNpbXVsYXRvcnMiLCJ0aW1lb3V0IiwiZGVidWciLCJ4Y29kZVZlcnNpb24iLCJtYWpvciIsImlnbiIsInBpZHMiLCJzdGRvdXQiLCJ0cmltIiwic3BsaXQiLCJlIiwiaXNFbXB0eSIsIndhcm4iLCJqb2luIiwibWFwIiwicmVtYWluaW5nRGV2aWNlcyIsImFsbFNpbXNBcmVEb3duIiwiZGV2aWNlcyIsIlNpbWN0bCIsImdldERldmljZXMiLCJmbGF0dGVuIiwidmFsdWVzIiwiZXZlcnkiLCJzaW0iLCJzdGF0ZSIsInRvTG93ZXJDYXNlIiwiZG9uZSIsInNkayIsInVkaWQiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwibGVuZ3RoIiwiZGV2aWNlIiwiZW5kQWxsU2ltdWxhdG9yRGFlbW9ucyIsInNlcnZpY2VQYXR0ZXJuIiwibGF1bmNoQ3RsQ29tbWFuZCIsInN0b3BDbWQiLCJyZW1vdmVDbWQiLCJnZXRTaW11bGF0b3JJbmZvIiwib3B0cyIsImRldmljZXNTZXRQYXRoIiwidG9QYWlycyIsInBhaXIiLCJyZWR1Y2UiLCJhIiwiYiIsImNvbmNhdCIsImZpbmQiLCJzaW1FeGlzdHMiLCJzYWZlUmltUmFmIiwiZGVsUGF0aCIsInRyeU51bSIsImZzIiwicmltcmFmIiwiaW5kZXhPZiIsImluc3RhbGxTU0xDZXJ0IiwicGVtVGV4dCIsIndoaWNoIiwiZXJyb3JBbmRUaHJvdyIsInRlbXBGaWxlTmFtZSIsInBhdGgiLCJyZXNvbHZlIiwidGVtcERpciIsIm9wZW5EaXIiLCJwYXRoVG9LZXljaGFpbiIsIlNpbXVsYXRvciIsImdldERpciIsIndyaXRlRmlsZSIsInN0YXQiLCJjZXJ0aWZpY2F0ZSIsIkNlcnRpZmljYXRlIiwiYWRkIiwidW5saW5rIiwidW5pbnN0YWxsU1NMQ2VydCIsIl9fZGlybmFtZSIsInJlbW92ZSIsImhhc1NTTENlcnQiLCJoYXMiLCJleGVjU1FMaXRlUXVlcnkiLCJkYiIsInF1ZXJ5IiwicXVlcnlQYXJhbXMiLCJyZXBsYWNlIiwicXVlcnlUb2tlbnMiLCJmb3JtYXR0ZWRRdWVyeSIsInBhcmFtIiwiZm9yRWFjaCIsImkiLCJzdGRlcnIiLCJnZXREZXZlbG9wZXJSb290IiwiYWN0aXZhdGVBcHAiLCJ0bXBTY3JpcHQiLCJwcmVmaXgiLCJ1dGlsIiwidXVpZFY0Iiwic3Vic3RyaW5nIiwic3VmZml4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLDRCQUE0QixHQUFHLEtBQXJDO0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsS0FBSyxJQUFwQzs7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyx3QkFBaEM7OztBQUNBLE1BQU1DLHFCQUFxQixHQUFJQyxHQUFELElBQVU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0VBLEdBQUk7QUFDMUU7QUFDQSxxQ0FBcUNBLEdBQUk7QUFDekM7QUFDQSxxQ0FBcUNBLEdBQUk7QUFDekMsQ0FWQTs7QUFhQSxNQUFNQyxVQUFVLEdBQUc7QUFDakJDLEVBQUFBLE9BQU8sRUFBRSxhQURRO0FBRWpCQyxFQUFBQSxNQUFNLEVBQUU7QUFGUyxDQUFuQjs7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LGVBQWVrRixXQUFmLENBQTRCaEgsR0FBNUIsRUFBaUM7QUFDL0IsUUFBTWlILFNBQVMsR0FBRyxNQUFNN0IsaUJBQVFGLElBQVIsQ0FBYTtBQUNuQ2dDLElBQUFBLE1BQU0sRUFBRyxnQkFBZUMsY0FBS0MsTUFBTCxHQUFjQyxTQUFkLENBQXdCLENBQXhCLEVBQTJCLENBQTNCLENBQThCLEVBRG5CO0FBRW5DQyxJQUFBQSxNQUFNLEVBQUU7QUFGMkIsR0FBYixDQUF4QjtBQUlBLFFBQU01QyxZQUFHZSxTQUFILENBQWF3QixTQUFiLEVBQXdCbEgscUJBQXFCLENBQUNDLEdBQUQsQ0FBN0MsRUFBb0QsTUFBcEQsQ0FBTjs7QUFDQSxNQUFJO0FBQ0YsVUFBTSx3QkFBSyxpQkFBTCxFQUF3QixDQUFDaUgsU0FBRCxDQUF4QixDQUFOO0FBQ0QsR0FGRCxTQUVVO0FBQ1IsVUFBTXZDLFlBQUdDLE1BQUgsQ0FBVXNDLFNBQVYsQ0FBTjtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uIH0gZnJvbSAnYXBwaXVtLXhjb2RlJztcbmltcG9ydCBTaW1jdGwgZnJvbSAnbm9kZS1zaW1jdGwnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tICcuL2NlcnRpZmljYXRlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFNpbXVsYXRvciBmcm9tICcuL3NpbXVsYXRvci14Y29kZS02JztcblxuXG5jb25zdCBERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTQUZBUklfU1RBUlRVUF9USU1FT1VUID0gMjUgKiAxMDAwO1xuY29uc3QgTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQgPSAnY29tLmFwcGxlLm1vYmlsZXNhZmFyaSc7XG5jb25zdCBBUFBfQUNUSVZBVElPTl9TQ1JJUFQgPSAocGlkKSA9PiBgIyEvdXNyL2Jpbi9weXRob25cblxuZnJvbSBBcHBLaXQgaW1wb3J0IE5TQXBwbGljYXRpb25BY3RpdmF0ZUlnbm9yaW5nT3RoZXJBcHBzLCBOU0FwcGxpY2F0aW9uQWN0aXZhdGVBbGxXaW5kb3dzXG5mcm9tIENvY29hIGltcG9ydCBOU1J1bm5pbmdBcHBsaWNhdGlvblxuXG5hcHAgPSBOU1J1bm5pbmdBcHBsaWNhdGlvbi5ydW5uaW5nQXBwbGljYXRpb25XaXRoUHJvY2Vzc0lkZW50aWZpZXJfKCR7cGlkfSlcbmlmIG5vdCBhcHA6XG4gICAgcmFpc2UgVmFsdWVFcnJvcignQXBwIHdpdGggUElEICR7cGlkfSBpcyBub3QgcnVubmluZycpXG5pZiBub3QgYXBwLmFjdGl2YXRlV2l0aE9wdGlvbnNfKE5TQXBwbGljYXRpb25BY3RpdmF0ZUFsbFdpbmRvd3MgfCBOU0FwcGxpY2F0aW9uQWN0aXZhdGVJZ25vcmluZ090aGVyQXBwcyk6XG4gICAgcmFpc2UgVmFsdWVFcnJvcignQXBwIHdpdGggUElEICR7cGlkfSBjYW5ub3QgYmUgYWN0aXZhdGVkJylcbmA7XG5cblxuY29uc3QgQklPTUVUUklDUyA9IHtcbiAgdG91Y2hJZDogJ2ZpbmdlclRvdWNoJyxcbiAgZmFjZUlkOiAncGVhcmwnLFxufTtcblxuZnVuY3Rpb24gdG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQgKG5hbWUpIHtcbiAgaWYgKCFCSU9NRVRSSUNTW25hbWVdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgdmFsaWQgYmlvbWV0cmljLiBVc2Ugb25lIG9mOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhCSU9NRVRSSUNTKSl9YCk7XG4gIH1cbiAgcmV0dXJuIEJJT01FVFJJQ1NbbmFtZV07XG59XG5cbi8vIHBncmVwL3BraWxsIGV4aXQgY29kZXM6XG4vLyAwICAgICAgIE9uZSBvciBtb3JlIHByb2Nlc3NlcyB3ZXJlIG1hdGNoZWQuXG4vLyAxICAgICAgIE5vIHByb2Nlc3NlcyB3ZXJlIG1hdGNoZWQuXG4vLyAyICAgICAgIEludmFsaWQgb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLlxuLy8gMyAgICAgICBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC5cblxuYXN5bmMgZnVuY3Rpb24gcGtpbGwgKGFwcE5hbWUsIGZvcmNlS2lsbCA9IGZhbHNlKSB7XG4gIGxldCBhcmdzID0gZm9yY2VLaWxsID8gWyctOSddIDogW107XG4gIGFyZ3MucHVzaCgnLXgnLCBhcHBOYW1lKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKCdwa2lsbCcsIGFyZ3MpO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZXJyLmNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZSAke2FwcE5hbWV9LiBwa2lsbCBlcnJvciBjb2RlOiAke2Vyci5jb2RlfWApO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoYFJlY2VpdmVkIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGtpbGwgJHthcHBOYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFsbFNpbXVsYXRvcnMgKHRpbWVvdXQgPSBERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUKSB7XG4gIGxvZy5kZWJ1ZygnS2lsbGluZyBhbGwgaU9TIFNpbXVsYXRvcnMnKTtcbiAgY29uc3QgeGNvZGVWZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlKTtcbiAgY29uc3QgYXBwTmFtZSA9IHhjb2RlVmVyc2lvbi5tYWpvciA+PSA3ID8gJ1NpbXVsYXRvcicgOiAnaU9TIFNpbXVsYXRvcic7XG5cbiAgLy8gbGF0ZXIgdmVyc2lvbnMgYXJlIHNsb3dlciB0byBjbG9zZVxuICB0aW1lb3V0ID0gdGltZW91dCAqICh4Y29kZVZlcnNpb24ubWFqb3IgPj0gOCA/IDIgOiAxKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoJ3hjcnVuJywgWydzaW1jdGwnLCAnc2h1dGRvd24nLCB4Y29kZVZlcnNpb24ubWFqb3IgPiA4ID8gJ2FsbCcgOiAnYm9vdGVkJ10sIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBjb25zdCBwaWRzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwZ3JlcCcsIFsnLWYnLCBgJHthcHBOYW1lfS5hcHAvQ29udGVudHMvTWFjT1MvYF0pO1xuICAgIGlmIChzdGRvdXQudHJpbSgpKSB7XG4gICAgICBwaWRzLnB1c2goLi4uKHN0ZG91dC50cmltKCkuc3BsaXQoL1xccysvKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09IDEpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgJHthcHBOYW1lfSBpcyBub3QgcnVubmluZy4gQ29udGludWluZy4uLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cud2FybihgcGdyZXAgZXJyb3IgJHtlLmNvZGV9IHdoaWxlIGRldGVjdGluZyB3aGV0aGVyICR7YXBwTmFtZX0gaXMgcnVubmluZy4gVHJ5aW5nIHRvIGtpbGwgYW55d2F5LmApO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwaWRzKSkge1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBwcm9jZXNzZXM6ICR7cGlkcy5qb2luKCcsICcpfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgWyctOScsIC4uLihwaWRzLm1hcCgocGlkKSA9PiBgJHtwaWR9YCkpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmRlYnVnKGBVc2luZyBwa2lsbCB0byBraWxsIGFwcGxpY2F0aW9uOiAke2FwcE5hbWV9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGtpbGwoYXBwTmFtZSwgdHJ1ZSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICAvLyB3YWl0IGZvciBhbGwgdGhlIGRldmljZXMgdG8gYmUgc2h1dGRvd24gYmVmb3JlIENvbnRpbnVpbmdcbiAgLy8gYnV0IG9ubHkgcHJpbnQgb3V0IHRoZSBmYWlsZWQgb25lcyB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5IGZ1bGx5IGZhaWxlZFxuICBsZXQgcmVtYWluaW5nRGV2aWNlcyA9IFtdO1xuICBhc3luYyBmdW5jdGlvbiBhbGxTaW1zQXJlRG93biAoKSB7XG4gICAgcmVtYWluaW5nRGV2aWNlcyA9IFtdO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgbmV3IFNpbWN0bCgpLmdldERldmljZXMoKTtcbiAgICBkZXZpY2VzID0gXy5mbGF0dGVuKF8udmFsdWVzKGRldmljZXMpKTtcbiAgICByZXR1cm4gXy5ldmVyeShkZXZpY2VzLCAoc2ltKSA9PiB7XG4gICAgICBsZXQgc3RhdGUgPSBzaW0uc3RhdGUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGxldCBkb25lID0gc3RhdGUgPT09ICdzaHV0ZG93bicgfHxcbiAgICAgICAgICAgICAgICAgc3RhdGUgPT09ICd1bmF2YWlsYWJsZScgfHxcbiAgICAgICAgICAgICAgICAgc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgIHJlbWFpbmluZ0RldmljZXMucHVzaChgJHtzaW0ubmFtZX0gKCR7c2ltLnNka30sIHVkaWQ6ICR7c2ltLnVkaWR9KSBpcyBzdGlsbCBpbiBzdGF0ZSAnJHtzdGF0ZX0nYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9uZTtcbiAgICB9KTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYWxsU2ltc0FyZURvd24sIHtcbiAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgIGludGVydmFsTXM6IDIwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocmVtYWluaW5nRGV2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihgVGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBzdGlsbCBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdGUgYWZ0ZXIgJHt0aW1lb3V0fSBtczpgKTtcbiAgICAgIGZvciAobGV0IGRldmljZSBvZiByZW1haW5pbmdEZXZpY2VzKSB7XG4gICAgICAgIGxvZy53YXJuKGAgICAgJHtkZXZpY2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbmRBbGxTaW11bGF0b3JEYWVtb25zICgpIHtcbiAgbG9nLmRlYnVnKCdFbmRpbmcgYWxsIHNpbXVsYXRvciBkYWVtb25zJyk7XG4gIGZvciAobGV0IHNlcnZpY2VQYXR0ZXJuIG9mIFsnY29tLmFwcGxlLmlwaG9uZXNpbXVsYXRvcicsICdjb20uYXBwbGUuQ29yZVNpbXVsYXRvciddKSB7XG4gICAgbG9nLmRlYnVnKGBLaWxsaW5nIGFueSBvdGhlciAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zYCk7XG4gICAgbGV0IGxhdW5jaEN0bENvbW1hbmQgPSBgbGF1bmNoY3RsIGxpc3QgfCBncmVwICR7c2VydmljZVBhdHRlcm59IHwgY3V0IC1mIDMgfCB4YXJncyAtbiAxIGxhdW5jaGN0bGA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzdG9wQ21kID0gYCR7bGF1bmNoQ3RsQ29tbWFuZH0gc3RvcGA7XG4gICAgICBhd2FpdCBleGVjKCdiYXNoJywgWyctYycsIHN0b3BDbWRdKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3Qgc3RvcCAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zLCBjYXJyeWluZyBvbiBhbnl3YXkhYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsZXQgcmVtb3ZlQ21kID0gYCR7bGF1bmNoQ3RsQ29tbWFuZH0gcmVtb3ZlYDtcbiAgICAgIGF3YWl0IGV4ZWMoJ2Jhc2gnLCBbJy1jJywgcmVtb3ZlQ21kXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgQ291bGQgbm90IHJlbW92ZSAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zLCBjYXJyeWluZyBvbiBhbnl3YXkhYCk7XG4gICAgfVxuICB9XG4gIC8vIHdhaXRpbmcgdW50aWwgdGhlIHNpbXVsYXRvciBzZXJ2aWNlIGhhcyBkaWVkLlxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnYmFzaCcsIFsnLWMnLFxuICAgICAgICBgcHMgLWUgIHwgZ3JlcCBsYXVuY2hkX3NpbSB8IGdyZXAgLXYgYmFzaCB8IGdyZXAgLXYgZ3JlcCB8IGF3ayB7J3ByaW50JDEnfWBdKTtcbiAgICAgIHJldHVybiBzdGRvdXQudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICB9LCB7d2FpdE1zOiA1MDAwLCBpbnRlcnZhbE1zOiA1MDB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENvdWxkIG5vdCBlbmQgYWxsIHNpbXVsYXRvciBkYWVtb25zLCBjYXJyeWluZyBvbiFgKTtcbiAgfVxuICBsb2cuZGVidWcoJ0ZpbmlzaGluZyBlbmRpbmcgYWxsIHNpbXVsYXRvciBkYWVtb25zJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNpbXVsYXRvckluZm8gKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZGV2aWNlc1NldFBhdGhcbiAgfSA9IG9wdHM7XG4gIC8vIHNlZSB0aGUgUkVBRE1FIGZvciBnaXRodWIuY29tL2FwcGl1bS9ub2RlLXNpbWN0bCBmb3IgZXhhbXBsZSBvdXRwdXQgb2YgZ2V0RGV2aWNlcygpXG4gIGxldCBkZXZpY2VzID0gYXdhaXQgbmV3IFNpbWN0bCh7XG4gICAgZGV2aWNlc1NldFBhdGhcbiAgfSkuZ2V0RGV2aWNlcygpO1xuXG4gIGRldmljZXMgPSBfLnRvUGFpcnMoZGV2aWNlcylcbiAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKVxuICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG4gIHJldHVybiBfLmZpbmQoZGV2aWNlcywgKHNpbSkgPT4gc2ltLnVkaWQgPT09IHVkaWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaW1FeGlzdHMgKHVkaWQpIHtcbiAgcmV0dXJuICEhKGF3YWl0IGdldFNpbXVsYXRvckluZm8odWRpZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYWZlUmltUmFmIChkZWxQYXRoLCB0cnlOdW0gPSAwKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucmltcmFmKGRlbFBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHJ5TnVtIDwgMjApIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZS5pbmRleE9mKCdFTk9URU1QVFknKSAhPT0gLTEpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBQYXRoICcke2RlbFBhdGh9JyB3YXMgbm90IGVtcHR5IGR1cmluZyBkZWxldGU7IHJldHJ5aW5nYCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBzYWZlUmltUmFmKGRlbFBhdGgsIHRyeU51bSArIDEpO1xuICAgICAgfSBlbHNlIGlmIChlcnIubWVzc2FnZS5pbmRleE9mKCdFTk9FTlQnKSAhPT0gLTEpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBQYXRoICcke2RlbFBhdGh9JyBkaWQgbm90IGV4aXN0IHdoZW4gd2UgdHJpZWQgdG8gZGVsZXRlLCBpZ25vcmluZ2ApO1xuICAgICAgICByZXR1cm4gYXdhaXQgc2FmZVJpbVJhZihkZWxQYXRoLCB0cnlOdW0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxsIGFuIFNTTCBjZXJ0aWZpY2F0ZSB0byBhIGRldmljZSB3aXRoIGdpdmVuIHVkaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwZW1UZXh0IFNTTCBwZW0gdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgSWRlbnRpZmllciBvZiB0aGUgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxTU0xDZXJ0IChwZW1UZXh0LCB1ZGlkKSB7XG4gIC8vIENoZWNrIHRoYXQgb3BlbnNzbCBpcyBpbnN0YWxsZWQgb24gdGhlIHBhdGhcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53aGljaCgnb3BlbnNzbCcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGBjdXN0b21TU0xDZXJ0IHJlcXVpcmVzIG9wZW5zc2wgdG8gYmUgYXZhaWxhYmxlIG9uIHBhdGhgKTtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ29tbWFuZCAnb3BlbnNzbCcgbm90IGZvdW5kYCk7XG4gIH1cblxuICAvLyBDaGVjayB0aGF0IHNxbGl0ZTMgaXMgaW5zdGFsbGVkIG9uIHRoZSBwYXRoXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goJ3NxbGl0ZTMnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZyhgY3VzdG9tU1NMQ2VydCByZXF1aXJlcyBzcWxpdGUzIHRvIGJlIGF2YWlsYWJsZSBvbiBwYXRoYCk7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvbW1hbmQgJ3NxbGl0ZTMnIG5vdCBmb3VuZGApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgUEVNIHRleHRcbiAgLy8gKGEgdGVtcCBmaWxlIGlzIG5lY2Vzc2FyeSB0byBydW4gYG9wZW5zc2xgIHNoZWxsIGNvbW1hbmRzLCBjYW4ndCBiZSBkb25lIGluIG1lbW9yeSlcbiAgbGV0IHRlbXBGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ3RlbXAtc3NsLWNlcnQucGVtJyk7XG4gIGxldCBwYXRoVG9LZXljaGFpbiA9IG5ldyBTaW11bGF0b3IodWRpZCkuZ2V0RGlyKCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wRmlsZU5hbWUsIHBlbVRleHQpO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnN0YXQocGF0aFRvS2V5Y2hhaW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGBDb3VsZCBub3QgaW5zdGFsbCBTU0wgY2VydGlmaWNhdGUuIE5vIHNpbXVsYXRvciB3aXRoIHVkaWQgJyR7dWRpZH0nYCk7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coZSk7XG4gIH1cblxuICAvLyBEbyB0aGUgY2VydGlmaWNhdGUgaW5zdGFsbGF0aW9uXG4gIGxldCBjZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZSh0ZW1wRmlsZU5hbWUpO1xuICBsb2cuZGVidWcoYEluc3RhbGxpbmcgY2VydGlmaWNhdGUgdG8gJHtwYXRoVG9LZXljaGFpbn1gKTtcbiAgYXdhaXQgY2VydGlmaWNhdGUuYWRkKHBhdGhUb0tleWNoYWluKTtcblxuICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gIGF3YWl0IGZzLnVubGluayh0ZW1wRmlsZU5hbWUpO1xuXG4gIHJldHVybiBjZXJ0aWZpY2F0ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsU1NMQ2VydCAocGVtVGV4dCwgdWRpZCkge1xuICB0cnkge1xuICAgIGxldCB0ZW1wRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndGVtcC1zc2wtY2VydC5wZW0nKTtcbiAgICBsZXQgcGF0aFRvS2V5Y2hhaW4gPSBwYXRoLnJlc29sdmUobmV3IFNpbXVsYXRvcih1ZGlkKS5nZXREaXIoKSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBGaWxlTmFtZSwgcGVtVGV4dCk7XG4gICAgbGV0IGNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKHRlbXBGaWxlTmFtZSk7XG4gICAgYXdhaXQgY2VydGlmaWNhdGUucmVtb3ZlKHBhdGhUb0tleWNoYWluKTtcbiAgICBhd2FpdCBmcy51bmxpbmsodGVtcEZpbGVOYW1lKTtcbiAgICByZXR1cm4gY2VydGlmaWNhdGU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYENvdWxkIG5vdCB1bmluc3RhbGwgU1NMIGNlcnRpZmljYXRlLiBObyBzaW11bGF0b3Igd2l0aCB1ZGlkICcke3VkaWR9J2ApO1xuICAgIGxvZy5lcnJvckFuZFRocm93KGUpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIFNpbXVsYXRvciBhbHJlYWR5IGhhcyB0aGlzIFNTTCBjZXJ0aWZpY2F0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBlbVRleHQgUEVNIHRleHQgb2YgU1NMIGNlcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1ZGlkIElkZW50aWZpZXIgb2YgdGhlIFNpbXVsYXRvclxuICovXG5hc3luYyBmdW5jdGlvbiBoYXNTU0xDZXJ0IChwZW1UZXh0LCB1ZGlkKSB7XG4gIGNvbnN0IHRlbXBGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ3RlbXAtc3NsLWNlcnQucGVtJyk7XG4gIGNvbnN0IHBhdGhUb0tleWNoYWluID0gbmV3IFNpbXVsYXRvcih1ZGlkKS5nZXREaXIoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBGaWxlTmFtZSwgcGVtVGV4dCk7XG4gIGNvbnN0IGNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKHRlbXBGaWxlTmFtZSk7XG4gIHJldHVybiBjZXJ0aWZpY2F0ZS5oYXMocGF0aFRvS2V5Y2hhaW4pO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgc3FsaXRlMyBxdWVyeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYiAtIEZ1bGwgcGF0aCB0byBzcWxpdGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSAtIFRoZSBhY3R1YWwgcXVlcnkgc3RyaW5nXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcXVlcnlQYXJhbXMgLSBUaGUgbGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBzcWxpdGUgY29tbWFuZCBzdGRvdXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY1NRTGl0ZVF1ZXJ5IChkYiwgcXVlcnksIC4uLnF1ZXJ5UGFyYW1zKSB7XG4gIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvXFxuKy9nLCAnICcpO1xuICBsZXQgcXVlcnlUb2tlbnMgPSBxdWVyeS5zcGxpdCgnPycpO1xuICBsZXQgZm9ybWF0dGVkUXVlcnkgPSBbXTtcbiAgcXVlcnlQYXJhbXNcbiAgICAubWFwKChwYXJhbSkgPT4gYCR7cGFyYW19YClcbiAgICAuZm9yRWFjaCgocGFyYW0sIGkpID0+IHtcbiAgICAgIGZvcm1hdHRlZFF1ZXJ5LnB1c2gocXVlcnlUb2tlbnNbaV0pO1xuICAgICAgZm9ybWF0dGVkUXVlcnkucHVzaChwYXJhbS5yZXBsYWNlKC8nL2csIFwiJydcIikpO1xuICAgIH0pO1xuICBmb3JtYXR0ZWRRdWVyeS5wdXNoKHF1ZXJ5VG9rZW5zW3F1ZXJ5VG9rZW5zLmxlbmd0aCAtIDFdKTtcblxuICBsb2cuZGVidWcoYEV4ZWN1dGluZyBTUUwgcXVlcnkgXCIke2Zvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpfVwiIG9uICcke2RifSdgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IGV4ZWMoJ3NxbGl0ZTMnLCBbJy1saW5lJywgZGIsIGZvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpXSkpLnN0ZG91dDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXhlY3V0ZSBTUUxpdGUgcXVlcnkgXCIke2Zvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpfVwiIHRvICcke2RifScuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5zdGRlcnJ9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2ZWxvcGVyUm9vdCAoKSB7XG4gIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygneGNvZGUtc2VsZWN0JywgWyctcCddKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCk7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBhcHAgaGF2aW5nIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXIuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vYXBwa2l0L25zcnVubmluZ2FwcGxpY2F0aW9uLzE1Mjg3MjUtYWN0aXZhdGV3aXRob3B0aW9ucz9sYW5ndWFnZT1vYmpjXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gcGlkIEFwcCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIG5vdCBydW5uaW5nIG9yIHRoZXJlIHdhcyBhIGZhaWx1cmVcbiAqIHdoaWxlIGFjdGl2YXRpbmcgdGhlIGFwcFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUFwcCAocGlkKSB7XG4gIGNvbnN0IHRtcFNjcmlwdCA9IGF3YWl0IHRlbXBEaXIucGF0aCh7XG4gICAgcHJlZml4OiBgYWN0aXZhdGVfc2ltXyR7dXRpbC51dWlkVjQoKS5zdWJzdHJpbmcoMCwgOCl9YCxcbiAgICBzdWZmaXg6ICcucHknLFxuICB9KTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHRtcFNjcmlwdCwgQVBQX0FDVElWQVRJT05fU0NSSVBUKHBpZCksICd1dGY4Jyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYygnL3Vzci9iaW4vcHl0aG9uJywgW3RtcFNjcmlwdF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBTY3JpcHQpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGtpbGxBbGxTaW11bGF0b3JzLFxuICBlbmRBbGxTaW11bGF0b3JEYWVtb25zLFxuICBzYWZlUmltUmFmLFxuICBzaW1FeGlzdHMsXG4gIGdldFNpbXVsYXRvckluZm8sXG4gIGluc3RhbGxTU0xDZXJ0LFxuICB1bmluc3RhbGxTU0xDZXJ0LFxuICBoYXNTU0xDZXJ0LFxuICBleGVjU1FMaXRlUXVlcnksXG4gIHRvQmlvbWV0cmljRG9tYWluQ29tcG9uZW50LFxuICBnZXREZXZlbG9wZXJSb290LFxuICBhY3RpdmF0ZUFwcCxcbiAgU0FGQVJJX1NUQVJUVVBfVElNRU9VVCxcbiAgTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQsXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
389
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUIiwiU0FGQVJJX1NUQVJUVVBfVElNRU9VVCIsIk1PQklMRV9TQUZBUklfQlVORExFX0lEIiwiUFJPQ0VTU19MQVVOQ0hfT0tfUEFUVEVSTiIsImJ1bmRsZUlkIiwiUmVnRXhwIiwicmVwbGFjZSIsIkFQUF9BQ1RJVkFUSU9OX1NDUklQVCIsInBpZCIsIkJJT01FVFJJQ1MiLCJ0b3VjaElkIiwiZmFjZUlkIiwidG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQiLCJuYW1lIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiXyIsImtleXMiLCJwa2lsbCIsImFwcE5hbWUiLCJmb3JjZUtpbGwiLCJhcmdzIiwicHVzaCIsImVyciIsImlzVW5kZWZpbmVkIiwiY29kZSIsImxvZyIsImVycm9yIiwibWVzc2FnZSIsImtpbGxBbGxTaW11bGF0b3JzIiwidGltZW91dCIsImRlYnVnIiwieGNvZGVWZXJzaW9uIiwibWFqb3IiLCJpZ24iLCJwaWRzIiwic3Rkb3V0IiwidHJpbSIsInNwbGl0IiwiZSIsImlzRW1wdHkiLCJ3YXJuIiwiam9pbiIsIm1hcCIsInJlbWFpbmluZ0RldmljZXMiLCJhbGxTaW1zQXJlRG93biIsImRldmljZXMiLCJTaW1jdGwiLCJnZXREZXZpY2VzIiwiZmxhdHRlbiIsInZhbHVlcyIsImV2ZXJ5Iiwic2ltIiwic3RhdGUiLCJ0b0xvd2VyQ2FzZSIsImRvbmUiLCJzZGsiLCJ1ZGlkIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImxlbmd0aCIsImRldmljZSIsImVuZEFsbFNpbXVsYXRvckRhZW1vbnMiLCJzZXJ2aWNlUGF0dGVybiIsImxhdW5jaEN0bENvbW1hbmQiLCJzdG9wQ21kIiwicmVtb3ZlQ21kIiwiZ2V0U2ltdWxhdG9ySW5mbyIsIm9wdHMiLCJkZXZpY2VzU2V0UGF0aCIsInRvUGFpcnMiLCJwYWlyIiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJmaW5kIiwic2ltRXhpc3RzIiwic2FmZVJpbVJhZiIsImRlbFBhdGgiLCJ0cnlOdW0iLCJmcyIsInJpbXJhZiIsImluZGV4T2YiLCJpbnN0YWxsU1NMQ2VydCIsInBlbVRleHQiLCJ3aGljaCIsImVycm9yQW5kVGhyb3ciLCJ0ZW1wRmlsZU5hbWUiLCJwYXRoIiwicmVzb2x2ZSIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGF0aFRvS2V5Y2hhaW4iLCJTaW11bGF0b3IiLCJnZXREaXIiLCJ3cml0ZUZpbGUiLCJzdGF0IiwiY2VydGlmaWNhdGUiLCJDZXJ0aWZpY2F0ZSIsImFkZCIsInVubGluayIsInVuaW5zdGFsbFNTTENlcnQiLCJfX2Rpcm5hbWUiLCJyZW1vdmUiLCJoYXNTU0xDZXJ0IiwiaGFzIiwiZXhlY1NRTGl0ZVF1ZXJ5IiwiZGIiLCJxdWVyeSIsInF1ZXJ5UGFyYW1zIiwicXVlcnlUb2tlbnMiLCJmb3JtYXR0ZWRRdWVyeSIsInBhcmFtIiwiZm9yRWFjaCIsImkiLCJzdGRlcnIiLCJnZXREZXZlbG9wZXJSb290IiwiYWN0aXZhdGVBcHAiLCJ0bXBTY3JpcHQiLCJwcmVmaXgiLCJ1dGlsIiwidXVpZFY0Iiwic3Vic3RyaW5nIiwic3VmZml4IiwibGF1bmNoQXBwIiwic2ltY3RsIiwidGltZW91dE1zIiwibGFzdEVycm9yIiwidGVzdCIsIm1zZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsNEJBQTRCLEdBQUcsS0FBckM7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxLQUFLLElBQXBDOztBQUNBLE1BQU1DLHVCQUF1QixHQUFHLHdCQUFoQzs7O0FBQ0EsTUFBTUMseUJBQXlCLEdBQUlDLFFBQUQsSUFBYyxJQUFJQyxNQUFKLENBQVksR0FBRUQsUUFBUSxDQUFDRSxPQUFULENBQWlCLEdBQWpCLEVBQXNCLEtBQXRCLENBQTZCLFdBQTNDLENB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Z0ksSUFBbkQsQ0FBd0Q3RixNQUF4RCxDQUFQO0FBQ0QsT0FIRCxDQUdFLE9BQU9iLEdBQVAsRUFBWTtBQUNaeUcsUUFBQUEsU0FBUyxHQUFHekcsR0FBRyxDQUFDNkYsTUFBSixJQUFjN0YsR0FBRyxDQUFDSyxPQUE5QjtBQUNEOztBQUNELGFBQU8sS0FBUDtBQUNELEtBUkssRUFRSDtBQUFDOEIsTUFBQUEsTUFBTSxFQUFFcUUsU0FBVDtBQUFvQnBFLE1BQUFBLFVBQVUsRUFBRTtBQUFoQyxLQVJHLENBQU47QUFTRCxHQVZELENBVUUsT0FBT3BCLENBQVAsRUFBVTtBQUNWLFFBQUkyRixHQUFHLEdBQUksSUFBRy9ILFFBQVMsdUJBQXNCNEgsU0FBVSxhQUF2RDs7QUFDQSxRQUFJQyxTQUFKLEVBQWU7QUFDYkUsTUFBQUEsR0FBRyxJQUFLLG9CQUFtQkYsU0FBVSxFQUFyQztBQUNEOztBQUNELFVBQU0sSUFBSW5ILEtBQUosQ0FBVXFILEdBQVYsQ0FBTjtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uIH0gZnJvbSAnYXBwaXVtLXhjb2RlJztcbmltcG9ydCBTaW1jdGwgZnJvbSAnbm9kZS1zaW1jdGwnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tICcuL2NlcnRpZmljYXRlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFNpbXVsYXRvciBmcm9tICcuL3NpbXVsYXRvci14Y29kZS02JztcblxuXG5jb25zdCBERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTQUZBUklfU1RBUlRVUF9USU1FT1VUID0gMjUgKiAxMDAwO1xuY29uc3QgTU9CSUxFX1NBRkFSSV9CVU5ETEVfSUQgPSAnY29tLmFwcGxlLm1vYmlsZXNhZmFyaSc7XG5jb25zdCBQUk9DRVNTX0xBVU5DSF9PS19QQVRURVJOID0gKGJ1bmRsZUlkKSA9PiBuZXcgUmVnRXhwKGAke2J1bmRsZUlkLnJlcGxhY2UoJy4nLCAnXFxcXC4nKX06XFxcXHMrXFxcXGQrYCk7XG5jb25zdCBBUFBfQUNUSVZBVElPTl9TQ1JJUFQgPSAocGlkKSA9PiBgIyEvdXNyL2Jpbi9weXRob25cblxuZnJvbSBBcHBLaXQgaW1wb3J0IE5TQXBwbGljYXRpb25BY3RpdmF0ZUlnbm9yaW5nT3RoZXJBcHBzLCBOU0FwcGxpY2F0aW9uQWN0aXZhdGVBbGxXaW5kb3dzXG5mcm9tIENvY29hIGltcG9ydCBOU1J1bm5pbmdBcHBsaWNhdGlvblxuXG5hcHAgPSBOU1J1bm5pbmdBcHBsaWNhdGlvbi5ydW5uaW5nQXBwbGljYXRpb25XaXRoUHJvY2Vzc0lkZW50aWZpZXJfKCR7cGlkfSlcbmlmIG5vdCBhcHA6XG4gICAgcmFpc2UgVmFsdWVFcnJvcignQXBwIHdpdGggUElEICR7cGlkfSBpcyBub3QgcnVubmluZycpXG5pZiBub3QgYXBwLmFjdGl2YXRlV2l0aE9wdGlvbnNfKE5TQXBwbGljYXRpb25BY3RpdmF0ZUFsbFdpbmRvd3MgfCBOU0FwcGxpY2F0aW9uQWN0aXZhdGVJZ25vcmluZ090aGVyQXBwcyk6XG4gICAgcmFpc2UgVmFsdWVFcnJvcignQXBwIHdpdGggUElEICR7cGlkfSBjYW5ub3QgYmUgYWN0aXZhdGVkJylcbmA7XG5cblxuY29uc3QgQklPTUVUUklDUyA9IHtcbiAgdG91Y2hJZDogJ2ZpbmdlclRvdWNoJyxcbiAgZmFjZUlkOiAncGVhcmwnLFxufTtcblxuZnVuY3Rpb24gdG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQgKG5hbWUpIHtcbiAgaWYgKCFCSU9NRVRSSUNTW25hbWVdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgdmFsaWQgYmlvbWV0cmljLiBVc2Ugb25lIG9mOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhCSU9NRVRSSUNTKSl9YCk7XG4gIH1cbiAgcmV0dXJuIEJJT01FVFJJQ1NbbmFtZV07XG59XG5cbi8vIHBncmVwL3BraWxsIGV4aXQgY29kZXM6XG4vLyAwICAgICAgIE9uZSBvciBtb3JlIHByb2Nlc3NlcyB3ZXJlIG1hdGNoZWQuXG4vLyAxICAgICAgIE5vIHByb2Nlc3NlcyB3ZXJlIG1hdGNoZWQuXG4vLyAyICAgICAgIEludmFsaWQgb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLlxuLy8gMyAgICAgICBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC5cblxuYXN5bmMgZnVuY3Rpb24gcGtpbGwgKGFwcE5hbWUsIGZvcmNlS2lsbCA9IGZhbHNlKSB7XG4gIGxldCBhcmdzID0gZm9yY2VLaWxsID8gWyctOSddIDogW107XG4gIGFyZ3MucHVzaCgnLXgnLCBhcHBOYW1lKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKCdwa2lsbCcsIGFyZ3MpO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZXJyLmNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZSAke2FwcE5hbWV9LiBwa2lsbCBlcnJvciBjb2RlOiAke2Vyci5jb2RlfWApO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoYFJlY2VpdmVkIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGtpbGwgJHthcHBOYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFsbFNpbXVsYXRvcnMgKHRpbWVvdXQgPSBERUZBVUxUX1NJTV9TSFVURE9XTl9USU1FT1VUKSB7XG4gIGxvZy5kZWJ1ZygnS2lsbGluZyBhbGwgaU9TIFNpbXVsYXRvcnMnKTtcbiAgY29uc3QgeGNvZGVWZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlKTtcbiAgY29uc3QgYXBwTmFtZSA9IHhjb2RlVmVyc2lvbi5tYWpvciA+PSA3ID8gJ1NpbXVsYXRvcicgOiAnaU9TIFNpbXVsYXRvcic7XG5cbiAgLy8gbGF0ZXIgdmVyc2lvbnMgYXJlIHNsb3dlciB0byBjbG9zZVxuICB0aW1lb3V0ID0gdGltZW91dCAqICh4Y29kZVZlcnNpb24ubWFqb3IgPj0gOCA/IDIgOiAxKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoJ3hjcnVuJywgWydzaW1jdGwnLCAnc2h1dGRvd24nLCB4Y29kZVZlcnNpb24ubWFqb3IgPiA4ID8gJ2FsbCcgOiAnYm9vdGVkJ10sIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBjb25zdCBwaWRzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwZ3JlcCcsIFsnLWYnLCBgJHthcHBOYW1lfS5hcHAvQ29udGVudHMvTWFjT1MvYF0pO1xuICAgIGlmIChzdGRvdXQudHJpbSgpKSB7XG4gICAgICBwaWRzLnB1c2goLi4uKHN0ZG91dC50cmltKCkuc3BsaXQoL1xccysvKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09IDEpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgJHthcHBOYW1lfSBpcyBub3QgcnVubmluZy4gQ29udGludWluZy4uLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cud2FybihgcGdyZXAgZXJyb3IgJHtlLmNvZGV9IHdoaWxlIGRldGVjdGluZyB3aGV0aGVyICR7YXBwTmFtZX0gaXMgcnVubmluZy4gVHJ5aW5nIHRvIGtpbGwgYW55d2F5LmApO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwaWRzKSkge1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBwcm9jZXNzZXM6ICR7cGlkcy5qb2luKCcsICcpfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgWyctOScsIC4uLihwaWRzLm1hcCgocGlkKSA9PiBgJHtwaWR9YCkpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmRlYnVnKGBVc2luZyBwa2lsbCB0byBraWxsIGFwcGxpY2F0aW9uOiAke2FwcE5hbWV9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGtpbGwoYXBwTmFtZSwgdHJ1ZSk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICAvLyB3YWl0IGZvciBhbGwgdGhlIGRldmljZXMgdG8gYmUgc2h1dGRvd24gYmVmb3JlIENvbnRpbnVpbmdcbiAgLy8gYnV0IG9ubHkgcHJpbnQgb3V0IHRoZSBmYWlsZWQgb25lcyB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5IGZ1bGx5IGZhaWxlZFxuICBsZXQgcmVtYWluaW5nRGV2aWNlcyA9IFtdO1xuICBhc3luYyBmdW5jdGlvbiBhbGxTaW1zQXJlRG93biAoKSB7XG4gICAgcmVtYWluaW5nRGV2aWNlcyA9IFtdO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgbmV3IFNpbWN0bCgpLmdldERldmljZXMoKTtcbiAgICBkZXZpY2VzID0gXy5mbGF0dGVuKF8udmFsdWVzKGRldmljZXMpKTtcbiAgICByZXR1cm4gXy5ldmVyeShkZXZpY2VzLCAoc2ltKSA9PiB7XG4gICAgICBsZXQgc3RhdGUgPSBzaW0uc3RhdGUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGxldCBkb25lID0gc3RhdGUgPT09ICdzaHV0ZG93bicgfHxcbiAgICAgICAgICAgICAgICAgc3RhdGUgPT09ICd1bmF2YWlsYWJsZScgfHxcbiAgICAgICAgICAgICAgICAgc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgIHJlbWFpbmluZ0RldmljZXMucHVzaChgJHtzaW0ubmFtZX0gKCR7c2ltLnNka30sIHVkaWQ6ICR7c2ltLnVkaWR9KSBpcyBzdGlsbCBpbiBzdGF0ZSAnJHtzdGF0ZX0nYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9uZTtcbiAgICB9KTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYWxsU2ltc0FyZURvd24sIHtcbiAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgIGludGVydmFsTXM6IDIwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocmVtYWluaW5nRGV2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihgVGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBzdGlsbCBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdGUgYWZ0ZXIgJHt0aW1lb3V0fSBtczpgKTtcbiAgICAgIGZvciAobGV0IGRldmljZSBvZiByZW1haW5pbmdEZXZpY2VzKSB7XG4gICAgICAgIGxvZy53YXJuKGAgICAgJHtkZXZpY2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbmRBbGxTaW11bGF0b3JEYWVtb25zICgpIHtcbiAgbG9nLmRlYnVnKCdFbmRpbmcgYWxsIHNpbXVsYXRvciBkYWVtb25zJyk7XG4gIGZvciAobGV0IHNlcnZpY2VQYXR0ZXJuIG9mIFsnY29tLmFwcGxlLmlwaG9uZXNpbXVsYXRvcicsICdjb20uYXBwbGUuQ29yZVNpbXVsYXRvciddKSB7XG4gICAgbG9nLmRlYnVnKGBLaWxsaW5nIGFueSBvdGhlciAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zYCk7XG4gICAgbGV0IGxhdW5jaEN0bENvbW1hbmQgPSBgbGF1bmNoY3RsIGxpc3QgfCBncmVwICR7c2VydmljZVBhdHRlcm59IHwgY3V0IC1mIDMgfCB4YXJncyAtbiAxIGxhdW5jaGN0bGA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzdG9wQ21kID0gYCR7bGF1bmNoQ3RsQ29tbWFuZH0gc3RvcGA7XG4gICAgICBhd2FpdCBleGVjKCdiYXNoJywgWyctYycsIHN0b3BDbWRdKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3Qgc3RvcCAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zLCBjYXJyeWluZyBvbiBhbnl3YXkhYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsZXQgcmVtb3ZlQ21kID0gYCR7bGF1bmNoQ3RsQ29tbWFuZH0gcmVtb3ZlYDtcbiAgICAgIGF3YWl0IGV4ZWMoJ2Jhc2gnLCBbJy1jJywgcmVtb3ZlQ21kXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgQ291bGQgbm90IHJlbW92ZSAke3NlcnZpY2VQYXR0ZXJufSBkYWVtb25zLCBjYXJyeWluZyBvbiBhbnl3YXkhYCk7XG4gICAgfVxuICB9XG4gIC8vIHdhaXRpbmcgdW50aWwgdGhlIHNpbXVsYXRvciBzZXJ2aWNlIGhhcyBkaWVkLlxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnYmFzaCcsIFsnLWMnLFxuICAgICAgICBgcHMgLWUgIHwgZ3JlcCBsYXVuY2hkX3NpbSB8IGdyZXAgLXYgYmFzaCB8IGdyZXAgLXYgZ3JlcCB8IGF3ayB7J3ByaW50JDEnfWBdKTtcbiAgICAgIHJldHVybiBzdGRvdXQudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICB9LCB7d2FpdE1zOiA1MDAwLCBpbnRlcnZhbE1zOiA1MDB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENvdWxkIG5vdCBlbmQgYWxsIHNpbXVsYXRvciBkYWVtb25zLCBjYXJyeWluZyBvbiFgKTtcbiAgfVxuICBsb2cuZGVidWcoJ0ZpbmlzaGluZyBlbmRpbmcgYWxsIHNpbXVsYXRvciBkYWVtb25zJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNpbXVsYXRvckluZm8gKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZGV2aWNlc1NldFBhdGhcbiAgfSA9IG9wdHM7XG4gIC8vIHNlZSB0aGUgUkVBRE1FIGZvciBnaXRodWIuY29tL2FwcGl1bS9ub2RlLXNpbWN0bCBmb3IgZXhhbXBsZSBvdXRwdXQgb2YgZ2V0RGV2aWNlcygpXG4gIGxldCBkZXZpY2VzID0gYXdhaXQgbmV3IFNpbWN0bCh7XG4gICAgZGV2aWNlc1NldFBhdGhcbiAgfSkuZ2V0RGV2aWNlcygpO1xuXG4gIGRldmljZXMgPSBfLnRvUGFpcnMoZGV2aWNlcylcbiAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKVxuICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG4gIHJldHVybiBfLmZpbmQoZGV2aWNlcywgKHNpbSkgPT4gc2ltLnVkaWQgPT09IHVkaWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaW1FeGlzdHMgKHVkaWQpIHtcbiAgcmV0dXJuICEhKGF3YWl0IGdldFNpbXVsYXRvckluZm8odWRpZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYWZlUmltUmFmIChkZWxQYXRoLCB0cnlOdW0gPSAwKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucmltcmFmKGRlbFBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodHJ5TnVtIDwgMjApIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZS5pbmRleE9mKCdFTk9URU1QVFknKSAhPT0gLTEpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBQYXRoICcke2RlbFBhdGh9JyB3YXMgbm90IGVtcHR5IGR1cmluZyBkZWxldGU7IHJldHJ5aW5nYCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBzYWZlUmltUmFmKGRlbFBhdGgsIHRyeU51bSArIDEpO1xuICAgICAgfSBlbHNlIGlmIChlcnIubWVzc2FnZS5pbmRleE9mKCdFTk9FTlQnKSAhPT0gLTEpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBQYXRoICcke2RlbFBhdGh9JyBkaWQgbm90IGV4aXN0IHdoZW4gd2UgdHJpZWQgdG8gZGVsZXRlLCBpZ25vcmluZ2ApO1xuICAgICAgICByZXR1cm4gYXdhaXQgc2FmZVJpbVJhZihkZWxQYXRoLCB0cnlOdW0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxsIGFuIFNTTCBjZXJ0aWZpY2F0ZSB0byBhIGRldmljZSB3aXRoIGdpdmVuIHVkaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwZW1UZXh0IFNTTCBwZW0gdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgSWRlbnRpZmllciBvZiB0aGUgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxTU0xDZXJ0IChwZW1UZXh0LCB1ZGlkKSB7XG4gIC8vIENoZWNrIHRoYXQgb3BlbnNzbCBpcyBpbnN0YWxsZWQgb24gdGhlIHBhdGhcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53aGljaCgnb3BlbnNzbCcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGBjdXN0b21TU0xDZXJ0IHJlcXVpcmVzIG9wZW5zc2wgdG8gYmUgYXZhaWxhYmxlIG9uIHBhdGhgKTtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ29tbWFuZCAnb3BlbnNzbCcgbm90IGZvdW5kYCk7XG4gIH1cblxuICAvLyBDaGVjayB0aGF0IHNxbGl0ZTMgaXMgaW5zdGFsbGVkIG9uIHRoZSBwYXRoXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goJ3NxbGl0ZTMnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZyhgY3VzdG9tU1NMQ2VydCByZXF1aXJlcyBzcWxpdGUzIHRvIGJlIGF2YWlsYWJsZSBvbiBwYXRoYCk7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvbW1hbmQgJ3NxbGl0ZTMnIG5vdCBmb3VuZGApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgUEVNIHRleHRcbiAgLy8gKGEgdGVtcCBmaWxlIGlzIG5lY2Vzc2FyeSB0byBydW4gYG9wZW5zc2xgIHNoZWxsIGNvbW1hbmRzLCBjYW4ndCBiZSBkb25lIGluIG1lbW9yeSlcbiAgbGV0IHRlbXBGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ3RlbXAtc3NsLWNlcnQucGVtJyk7XG4gIGxldCBwYXRoVG9LZXljaGFpbiA9IG5ldyBTaW11bGF0b3IodWRpZCkuZ2V0RGlyKCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wRmlsZU5hbWUsIHBlbVRleHQpO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnN0YXQocGF0aFRvS2V5Y2hhaW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGBDb3VsZCBub3QgaW5zdGFsbCBTU0wgY2VydGlmaWNhdGUuIE5vIHNpbXVsYXRvciB3aXRoIHVkaWQgJyR7dWRpZH0nYCk7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coZSk7XG4gIH1cblxuICAvLyBEbyB0aGUgY2VydGlmaWNhdGUgaW5zdGFsbGF0aW9uXG4gIGxldCBjZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZSh0ZW1wRmlsZU5hbWUpO1xuICBsb2cuZGVidWcoYEluc3RhbGxpbmcgY2VydGlmaWNhdGUgdG8gJHtwYXRoVG9LZXljaGFpbn1gKTtcbiAgYXdhaXQgY2VydGlmaWNhdGUuYWRkKHBhdGhUb0tleWNoYWluKTtcblxuICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gIGF3YWl0IGZzLnVubGluayh0ZW1wRmlsZU5hbWUpO1xuXG4gIHJldHVybiBjZXJ0aWZpY2F0ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsU1NMQ2VydCAocGVtVGV4dCwgdWRpZCkge1xuICB0cnkge1xuICAgIGxldCB0ZW1wRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndGVtcC1zc2wtY2VydC5wZW0nKTtcbiAgICBsZXQgcGF0aFRvS2V5Y2hhaW4gPSBwYXRoLnJlc29sdmUobmV3IFNpbXVsYXRvcih1ZGlkKS5nZXREaXIoKSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBGaWxlTmFtZSwgcGVtVGV4dCk7XG4gICAgbGV0IGNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKHRlbXBGaWxlTmFtZSk7XG4gICAgYXdhaXQgY2VydGlmaWNhdGUucmVtb3ZlKHBhdGhUb0tleWNoYWluKTtcbiAgICBhd2FpdCBmcy51bmxpbmsodGVtcEZpbGVOYW1lKTtcbiAgICByZXR1cm4gY2VydGlmaWNhdGU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYENvdWxkIG5vdCB1bmluc3RhbGwgU1NMIGNlcnRpZmljYXRlLiBObyBzaW11bGF0b3Igd2l0aCB1ZGlkICcke3VkaWR9J2ApO1xuICAgIGxvZy5lcnJvckFuZFRocm93KGUpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIFNpbXVsYXRvciBhbHJlYWR5IGhhcyB0aGlzIFNTTCBjZXJ0aWZpY2F0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBlbVRleHQgUEVNIHRleHQgb2YgU1NMIGNlcnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1ZGlkIElkZW50aWZpZXIgb2YgdGhlIFNpbXVsYXRvclxuICovXG5hc3luYyBmdW5jdGlvbiBoYXNTU0xDZXJ0IChwZW1UZXh0LCB1ZGlkKSB7XG4gIGNvbnN0IHRlbXBGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ3RlbXAtc3NsLWNlcnQucGVtJyk7XG4gIGNvbnN0IHBhdGhUb0tleWNoYWluID0gbmV3IFNpbXVsYXRvcih1ZGlkKS5nZXREaXIoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBGaWxlTmFtZSwgcGVtVGV4dCk7XG4gIGNvbnN0IGNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKHRlbXBGaWxlTmFtZSk7XG4gIHJldHVybiBjZXJ0aWZpY2F0ZS5oYXMocGF0aFRvS2V5Y2hhaW4pO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgc3FsaXRlMyBxdWVyeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYiAtIEZ1bGwgcGF0aCB0byBzcWxpdGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSAtIFRoZSBhY3R1YWwgcXVlcnkgc3RyaW5nXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcXVlcnlQYXJhbXMgLSBUaGUgbGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBzcWxpdGUgY29tbWFuZCBzdGRvdXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY1NRTGl0ZVF1ZXJ5IChkYiwgcXVlcnksIC4uLnF1ZXJ5UGFyYW1zKSB7XG4gIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvXFxuKy9nLCAnICcpO1xuICBsZXQgcXVlcnlUb2tlbnMgPSBxdWVyeS5zcGxpdCgnPycpO1xuICBsZXQgZm9ybWF0dGVkUXVlcnkgPSBbXTtcbiAgcXVlcnlQYXJhbXNcbiAgICAubWFwKChwYXJhbSkgPT4gYCR7cGFyYW19YClcbiAgICAuZm9yRWFjaCgocGFyYW0sIGkpID0+IHtcbiAgICAgIGZvcm1hdHRlZFF1ZXJ5LnB1c2gocXVlcnlUb2tlbnNbaV0pO1xuICAgICAgZm9ybWF0dGVkUXVlcnkucHVzaChwYXJhbS5yZXBsYWNlKC8nL2csIFwiJydcIikpO1xuICAgIH0pO1xuICBmb3JtYXR0ZWRRdWVyeS5wdXNoKHF1ZXJ5VG9rZW5zW3F1ZXJ5VG9rZW5zLmxlbmd0aCAtIDFdKTtcblxuICBsb2cuZGVidWcoYEV4ZWN1dGluZyBTUUwgcXVlcnkgXCIke2Zvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpfVwiIG9uICcke2RifSdgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IGV4ZWMoJ3NxbGl0ZTMnLCBbJy1saW5lJywgZGIsIGZvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpXSkpLnN0ZG91dDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZXhlY3V0ZSBTUUxpdGUgcXVlcnkgXCIke2Zvcm1hdHRlZFF1ZXJ5LmpvaW4oJycpfVwiIHRvICcke2RifScuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5zdGRlcnJ9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2ZWxvcGVyUm9vdCAoKSB7XG4gIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygneGNvZGUtc2VsZWN0JywgWyctcCddKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCk7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBhcHAgaGF2aW5nIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXIuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vYXBwa2l0L25zcnVubmluZ2FwcGxpY2F0aW9uLzE1Mjg3MjUtYWN0aXZhdGV3aXRob3B0aW9ucz9sYW5ndWFnZT1vYmpjXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gcGlkIEFwcCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIG5vdCBydW5uaW5nIG9yIHRoZXJlIHdhcyBhIGZhaWx1cmVcbiAqIHdoaWxlIGFjdGl2YXRpbmcgdGhlIGFwcFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUFwcCAocGlkKSB7XG4gIGNvbnN0IHRtcFNjcmlwdCA9IGF3YWl0IHRlbXBEaXIucGF0aCh7XG4gICAgcHJlZml4OiBgYWN0aXZhdGVfc2ltXyR7dXRpbC51dWlkVjQoKS5zdWJzdHJpbmcoMCwgOCl9YCxcbiAgICBzdWZmaXg6ICcucHknLFxuICB9KTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHRtcFNjcmlwdCwgQVBQX0FDVElWQVRJT05fU0NSSVBUKHBpZCksICd1dGY4Jyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYygnL3Vzci9iaW4vcHl0aG9uJywgW3RtcFNjcmlwdF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBTY3JpcHQpO1xuICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYW4gYXBwIGFuZCB2ZXJpZmllcyBpZiBpdCB3YXMgbGF1bmNoZWQgcHJvcGVybHlcbiAqXG4gKiBAcGFyYW0ge1NpbWN0bH0gc2ltY3RsIFNpbWN0bCBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIGJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSBkZXN0aW5hdGlvbiBhcHBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgWzI1MDAwXSBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgdW50aWxcbiAqIHRoZSBhcHAgaXMgcnVubmluZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcHAgaXMgc3RpbGwgbm90IHJ1bm5pbmcgYWZ0ZXIgdGhlIGdpdmVuIHRpbWVvdXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwIChzaW1jdGwsIGJ1bmRsZUlkLCB0aW1lb3V0TXMgPSAyNTAwMCkge1xuICBsZXQgbGFzdEVycm9yO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgc2ltY3RsLmxhdW5jaEFwcChNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCwgMSk7XG4gICAgICAgIHJldHVybiBQUk9DRVNTX0xBVU5DSF9PS19QQVRURVJOKE1PQklMRV9TQUZBUklfQlVORExFX0lEKS50ZXN0KHN0ZG91dCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyLnN0ZGVyciB8fCBlcnIubWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCB7d2FpdE1zOiB0aW1lb3V0TXMsIGludGVydmFsTXM6IDUwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbGV0IG1zZyA9IGAnJHtidW5kbGVJZH0nIGRpZCBub3QgcnVuIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXQuYDtcbiAgICBpZiAobGFzdEVycm9yKSB7XG4gICAgICBtc2cgKz0gYCBPcmlnaW5hbCBlcnJvcjogJHtsYXN0RXJyb3J9YDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAga2lsbEFsbFNpbXVsYXRvcnMsXG4gIGVuZEFsbFNpbXVsYXRvckRhZW1vbnMsXG4gIHNhZmVSaW1SYWYsXG4gIHNpbUV4aXN0cyxcbiAgZ2V0U2ltdWxhdG9ySW5mbyxcbiAgaW5zdGFsbFNTTENlcnQsXG4gIHVuaW5zdGFsbFNTTENlcnQsXG4gIGhhc1NTTENlcnQsXG4gIGV4ZWNTUUxpdGVRdWVyeSxcbiAgdG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQsXG4gIGdldERldmVsb3BlclJvb3QsXG4gIGFjdGl2YXRlQXBwLFxuICBTQUZBUklfU1RBUlRVUF9USU1FT1VULFxuICBNT0JJTEVfU0FGQVJJX0JVTkRMRV9JRCxcbiAgbGF1bmNoQXBwLFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -7,6 +7,7 @@ import _ from 'lodash';
7
7
  import AsyncLock from 'async-lock';
8
8
  import {
9
9
  safeRimRaf, getDeveloperRoot, installSSLCert, hasSSLCert, activateApp,
10
+ MOBILE_SAFARI_BUNDLE_ID, launchApp
10
11
  } from './utils.js';
11
12
  import { asyncmap, retryInterval, waitForCondition, retry } from 'asyncbox';
12
13
  import * as settings from './settings';
@@ -637,13 +638,12 @@ class SimulatorXcode6 extends EventEmitter {
637
638
  * @param {number} startupTimeout - How long to wait until Simulator booting is completed (in milliseconds).
638
639
  */
639
640
  async launchAndQuit (safari = false, startupTimeout = this.startupTimeout) {
640
- log.debug('Attempting to launch and quit the simulator, to create directory structure');
641
- log.debug(`Will launch with Safari? ${safari}`);
642
-
641
+ log.debug('Attempting to launch and quit the simulator to create the directory structure');
643
642
  await this.run({startupTimeout});
644
643
 
645
644
  if (safari) {
646
- await this.openUrl('http://www.appium.io');
645
+ log.debug('Spawning Safari browser in order to create the necessary file system items');
646
+ await launchApp(this.simctl, MOBILE_SAFARI_BUNDLE_ID);
647
647
  }
648
648
 
649
649
  // wait for the system to create the files we will manipulate
@@ -831,12 +831,12 @@ class SimulatorXcode6 extends EventEmitter {
831
831
  let dirs = [];
832
832
 
833
833
  // get the data directory
834
- dirs.push(await this.getAppDir('com.apple.mobilesafari'));
834
+ dirs.push(await this.getAppDir(MOBILE_SAFARI_BUNDLE_ID));
835
835
 
836
836
  let pv = await this.getPlatformVersion();
837
837
  if (pv >= 8) {
838
838
  // get the bundle directory
839
- dirs.push(await this.getAppDir('com.apple.mobilesafari', 'Bundle'));
839
+ dirs.push(await this.getAppDir(MOBILE_SAFARI_BUNDLE_ID, 'Bundle'));
840
840
  }
841
841
 
842
842
  let deletePromises = [];
@@ -861,7 +861,7 @@ class SimulatorXcode6 extends EventEmitter {
861
861
  }
862
862
 
863
863
  let libraryDir = path.resolve(this.getDir(), 'Library');
864
- let safariRoot = await this.getAppDir('com.apple.mobilesafari');
864
+ let safariRoot = await this.getAppDir(MOBILE_SAFARI_BUNDLE_ID);
865
865
  if (!safariRoot) {
866
866
  log.info('Could not find Safari support directories to clean out old ' +
867
867
  'data. Probably there is nothing to clean out');
@@ -869,13 +869,13 @@ class SimulatorXcode6 extends EventEmitter {
869
869
  }
870
870
  let safariLibraryDir = path.resolve(safariRoot, 'Library');
871
871
  let filesToDelete = [
872
- 'Caches/Snapshots/com.apple.mobilesafari',
873
- 'Caches/com.apple.mobilesafari/*',
872
+ `Caches/Snapshots/${MOBILE_SAFARI_BUNDLE_ID}`,
873
+ `Caches/${MOBILE_SAFARI_BUNDLE_ID}/*`,
874
874
  'Caches/com.apple.WebAppCache/*',
875
875
  'Caches/com.apple.WebKit.Networking/*',
876
876
  'Caches/com.apple.WebKit.WebContent/*',
877
877
  'Image Cache/*',
878
- 'WebKit/com.apple.mobilesafari/*',
878
+ `WebKit/${MOBILE_SAFARI_BUNDLE_ID}/*`,
879
879
  'WebKit/GeolocationSites.plist',
880
880
  'WebKit/LocalStorage/*.*',
881
881
  'Safari/*',
@@ -883,7 +883,7 @@ class SimulatorXcode6 extends EventEmitter {
883
883
  'Caches/com.apple.UIStatusBar/*',
884
884
  'Caches/com.apple.keyboards/images/*',
885
885
  'Caches/com.apple.Safari.SafeBrowsing/*',
886
- '../tmp/com.apple.mobilesafari/*'
886
+ `../tmp/${MOBILE_SAFARI_BUNDLE_ID}/*`
887
887
  ];
888
888
  let deletePromises = [];
889
889
 
@@ -2,19 +2,17 @@ import { BOOT_COMPLETED_EVENT } from './simulator-xcode-6';
2
2
  import SimulatorXcode7 from './simulator-xcode-7';
3
3
  import _ from 'lodash';
4
4
  import log from './logger';
5
- import { waitForCondition } from 'asyncbox';
6
5
  import { exec } from 'teen_process';
7
6
  import {
8
7
  setLocationWithLyft,
9
8
  setLocationWithIdb,
10
9
  setLocationWithAppleScript } from './geolocation';
11
10
  import { timing } from '@appium/support';
12
- import { MOBILE_SAFARI_BUNDLE_ID, SAFARI_STARTUP_TIMEOUT } from './utils';
11
+ import { MOBILE_SAFARI_BUNDLE_ID, SAFARI_STARTUP_TIMEOUT, launchApp } from './utils';
13
12
 
14
13
 
15
14
  // these sims are sloooooooow
16
15
  const STARTUP_TIMEOUT = 120 * 1000;
17
- const PROCESS_LAUNCH_OK_PATTERN = (bundleId) => new RegExp(`${bundleId.replace('.', '\\.')}:\\s+\\d+`);
18
16
 
19
17
  class SimulatorXcode8 extends SimulatorXcode7 {
20
18
  constructor (udid, xcodeVersion) {
@@ -145,25 +143,12 @@ class SimulatorXcode8 extends SimulatorXcode7 {
145
143
  throw new Error(`Tried to open '${url}', but Simulator is not in Booted state`);
146
144
  }
147
145
  const timer = new timing.Timer().start();
148
- let lastError = null;
149
146
  try {
150
- await waitForCondition(async () => {
151
- try {
152
- // This is to make sure Safari is already running
153
- const stdout = await this.simctl.launchApp(MOBILE_SAFARI_BUNDLE_ID);
154
- if (PROCESS_LAUNCH_OK_PATTERN(MOBILE_SAFARI_BUNDLE_ID).test(stdout)) {
155
- await this.simctl.openUrl(url);
156
- return true;
157
- }
158
- } catch (err) {
159
- log.warn(`Failed to open '${url}' in Safari. Retrying...`);
160
- lastError = err.stderr || err.message;
161
- }
162
- return false;
163
- }, {waitMs: SAFARI_STARTUP_TIMEOUT, intervalMs: 500});
147
+ await launchApp(this.simctl, MOBILE_SAFARI_BUNDLE_ID, SAFARI_STARTUP_TIMEOUT);
148
+ await this.simctl.openUrl(url);
164
149
  } catch (err) {
165
- throw new Error(`Safari cannot open '${url}' after ${timer.getDuration().asSeconds.toFixed(3)}s ` +
166
- `because of: ${lastError || 'an unknown error'}`);
150
+ throw new Error(`Safari could not open '${url}' after ${timer.getDuration().asSeconds.toFixed(3)}s. ` +
151
+ `Original error: ${err.stderr || err.message}`);
167
152
  }
168
153
  log.debug(`Safari successfully opened '${url}' in ${timer.getDuration().asSeconds.toFixed(3)}s`);
169
154
  }
package/lib/utils.js CHANGED
@@ -13,6 +13,7 @@ import Simulator from './simulator-xcode-6';
13
13
  const DEFAULT_SIM_SHUTDOWN_TIMEOUT = 30000;
14
14
  const SAFARI_STARTUP_TIMEOUT = 25 * 1000;
15
15
  const MOBILE_SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
16
+ const PROCESS_LAUNCH_OK_PATTERN = (bundleId) => new RegExp(`${bundleId.replace('.', '\\.')}:\\s+\\d+`);
16
17
  const APP_ACTIVATION_SCRIPT = (pid) => `#!/usr/bin/python
17
18
 
18
19
  from AppKit import NSApplicationActivateIgnoringOtherApps, NSApplicationActivateAllWindows
@@ -327,6 +328,36 @@ async function activateApp (pid) {
327
328
  }
328
329
  }
329
330
 
331
+ /**
332
+ * Executes an app and verifies if it was launched properly
333
+ *
334
+ * @param {Simctl} simctl Simctl instance
335
+ * @param {string} bundleId bundle identifier of the destination app
336
+ * @param {number} timeoutMs [25000] The maximum time to wait until
337
+ * the app is running
338
+ * @throws {Error} If the app is still not running after the given timeout
339
+ */
340
+ async function launchApp (simctl, bundleId, timeoutMs = 25000) {
341
+ let lastError;
342
+ try {
343
+ await waitForCondition(async () => {
344
+ try {
345
+ const stdout = await simctl.launchApp(MOBILE_SAFARI_BUNDLE_ID, 1);
346
+ return PROCESS_LAUNCH_OK_PATTERN(MOBILE_SAFARI_BUNDLE_ID).test(stdout);
347
+ } catch (err) {
348
+ lastError = err.stderr || err.message;
349
+ }
350
+ return false;
351
+ }, {waitMs: timeoutMs, intervalMs: 500});
352
+ } catch (e) {
353
+ let msg = `'${bundleId}' did not run after ${timeoutMs}ms timeout.`;
354
+ if (lastError) {
355
+ msg += ` Original error: ${lastError}`;
356
+ }
357
+ throw new Error(msg);
358
+ }
359
+ }
360
+
330
361
  export {
331
362
  killAllSimulators,
332
363
  endAllSimulatorDaemons,
@@ -342,4 +373,5 @@ export {
342
373
  activateApp,
343
374
  SAFARI_STARTUP_TIMEOUT,
344
375
  MOBILE_SAFARI_BUNDLE_ID,
376
+ launchApp,
345
377
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "keywords": [
5
5
  "appium"
6
6
  ],
7
- "version": "4.0.1",
7
+ "version": "4.0.2",
8
8
  "author": "appium",
9
9
  "license": "Apache-2.0",
10
10
  "repository": {
@@ -63,9 +63,9 @@
63
63
  "devDependencies": {
64
64
  "@appium/gulp-plugins": "^6.0.0",
65
65
  "@appium/eslint-config-appium": "^5.0.0",
66
+ "@colors/colors": "^1.5.0",
66
67
  "chai": "^4.1.0",
67
68
  "chai-as-promised": "^7.1.1",
68
- "colors": "^1.1.2",
69
69
  "fs-extra": "^10.0.0",
70
70
  "gulp": "^4.0.0",
71
71
  "ios-test-app": "^3.0.0",