appium 2.0.0-beta.41 → 2.0.0-beta.44

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.
Files changed (50) hide show
  1. package/build/lib/appium.d.ts +0 -1
  2. package/build/lib/appium.d.ts.map +1 -1
  3. package/build/lib/appium.js +1 -1
  4. package/build/lib/cli/args.js +2 -2
  5. package/build/lib/cli/driver-command.d.ts +2 -1
  6. package/build/lib/cli/driver-command.d.ts.map +1 -1
  7. package/build/lib/cli/driver-command.js +5 -3
  8. package/build/lib/cli/extension-command.d.ts +5 -1
  9. package/build/lib/cli/extension-command.d.ts.map +1 -1
  10. package/build/lib/cli/extension-command.js +5 -4
  11. package/build/lib/cli/extension.d.ts +8 -4
  12. package/build/lib/cli/extension.d.ts.map +1 -1
  13. package/build/lib/cli/extension.js +2 -1
  14. package/build/lib/cli/parser.d.ts +5 -1
  15. package/build/lib/cli/parser.d.ts.map +1 -1
  16. package/build/lib/cli/parser.js +19 -6
  17. package/build/lib/cli/plugin-command.d.ts +2 -1
  18. package/build/lib/cli/plugin-command.d.ts.map +1 -1
  19. package/build/lib/cli/plugin-command.js +5 -3
  20. package/build/lib/config-file.d.ts.map +1 -1
  21. package/build/lib/config-file.js +5 -3
  22. package/build/lib/config.d.ts +1 -0
  23. package/build/lib/config.d.ts.map +1 -1
  24. package/build/lib/config.js +19 -4
  25. package/build/lib/main.d.ts.map +1 -1
  26. package/build/lib/main.js +21 -31
  27. package/build/lib/schema/cli-transformers.d.ts.map +1 -1
  28. package/build/lib/schema/cli-transformers.js +2 -2
  29. package/build/lib/utils.d.ts +8 -0
  30. package/build/lib/utils.d.ts.map +1 -1
  31. package/build/lib/utils.js +62 -1
  32. package/build/tsconfig.tsbuildinfo +1 -1
  33. package/build/types/cli.d.ts +12 -0
  34. package/build/types/cli.d.ts.map +1 -1
  35. package/lib/appium.js +5 -0
  36. package/lib/cli/args.js +2 -2
  37. package/lib/cli/driver-command.js +2 -2
  38. package/lib/cli/extension-command.js +5 -3
  39. package/lib/cli/extension.js +16 -4
  40. package/lib/cli/parser.js +27 -5
  41. package/lib/cli/plugin-command.js +2 -2
  42. package/lib/config-file.js +4 -2
  43. package/lib/config.js +22 -2
  44. package/lib/main.js +25 -31
  45. package/lib/schema/cli-transformers.js +3 -2
  46. package/lib/utils.js +60 -0
  47. package/package.json +15 -16
  48. package/types/cli.ts +15 -0
  49. package/test.d.ts +0 -7
  50. package/test.js +0 -13
@@ -444,7 +444,7 @@ class ExtensionCommand {
444
444
  let unsafeUpdate = await _support.npm.getLatestVersion(this.config.appiumHome, pkgName);
445
445
  let safeUpdate = await _support.npm.getLatestSafeUpgradeVersion(this.config.appiumHome, pkgName, version);
446
446
 
447
- if (!_support.util.compareVersions(unsafeUpdate, '>', version)) {
447
+ if (unsafeUpdate !== null && !_support.util.compareVersions(unsafeUpdate, '>', version)) {
448
448
  unsafeUpdate = null;
449
449
  safeUpdate = null;
450
450
  }
@@ -479,7 +479,8 @@ class ExtensionCommand {
479
479
 
480
480
  async _run({
481
481
  installSpec,
482
- scriptName
482
+ scriptName,
483
+ extraArgs = []
483
484
  }) {
484
485
  if (!this.config.isInstalled(installSpec)) {
485
486
  throw this._createFatalError(`The ${this.type} "${installSpec}" is not installed`);
@@ -501,7 +502,7 @@ class ExtensionCommand {
501
502
  throw this._createFatalError(`The ${this.type} named '${installSpec}' does not support the script: '${scriptName}'`);
502
503
  }
503
504
 
504
- const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName]], {
505
+ const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName], ...extraArgs], {
505
506
  cwd: this.config.getInstallPath(installSpec)
506
507
  });
507
508
  const output = new _utils.RingBuffer(50);
@@ -531,4 +532,4 @@ class ExtensionCommand {
531
532
  exports.ExtensionCommand = ExtensionCommand;
532
533
  var _default = ExtensionCommand;
533
534
  exports.default = _default;
534
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKFxuICAgICAgdGhpcy5jb25maWcuYXBwaXVtSG9tZSxcbiAgICAgIHBrZ05hbWUsXG4gICAgICB2ZXJzaW9uXG4gICAgKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFsbFNwZWMgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24oaW5zdGFsbFNwZWMsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcbiAgICBjb25zdCBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtcbiAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgcGtnTmFtZSxcbiAgICAgIHBrZ1ZlcjogdmVyc2lvbixcbiAgICB9KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1bih7aW5zdGFsbFNwZWMsIHNjcmlwdE5hbWV9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChpbnN0YWxsU3BlYykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gXCIke2luc3RhbGxTcGVjfVwiIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdXSwge1xuICAgICAgY3dkOiB0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChpbnN0YWxsU3BlYyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgUmluZ0J1ZmZlcig1MCk7XG5cbiAgICBydW5uZXIub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIG91dHB1dC5lbnF1ZXVlKGxpbmUpO1xuICAgICAgdGhpcy5sb2cubG9nKGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICB0aGlzLmxvZy5vayhgJHtzY3JpcHROYW1lfSBzdWNjZXNzZnVsbHkgcmFuYC5ncmVlbik7XG4gICAgICByZXR1cm4ge291dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBydW5uaW5nICcke3NjcmlwdE5hbWV9JzogJHtlcnIubWVzc2FnZX1gLnJlZCk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlcnIubWVzc2FnZSwgb3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5zaW9uQ29tbWFuZDtcbmV4cG9ydCB7RXh0ZW5zaW9uQ29tbWFuZH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZH0gY29uc3RydWN0b3JcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBjb25maWcgLSB0aGUgYERyaXZlckNvbmZpZ2Agb3IgYFBsdWdpbkNvbmZpZ2AgaW5zdGFuY2UgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHN0dWZmIGFib3V0IGV4dGVuc2lvbnM7IHVzZWQgaW5kaXJlY3RseSBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW5zdGFsbGVkIC0gSWYgYHRydWVgLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1cGRhdGVWZXJzaW9uIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQsIHRoZSB2ZXJzaW9uIGl0IGNhbiBiZSB1cGRhdGVkIHRvXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZVZlcnNpb24gLSBTYW1lIGFzIGFib3ZlLCBidXQgYSBtYWpvciB2ZXJzaW9uIGJ1bXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXBUb0RhdGUgLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhlIGxhdGVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRSZWNvcmQ8RXh0VHlwZT59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1ldGFkYXRhPEV4dFR5cGU+fSBFeHRNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNYW5pZmVzdDxFeHRUeXBlPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0UGFja2FnZUpzb248RXh0VHlwZT59IEV4dFBhY2thZ2VKc29uXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYgVW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWVcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGluc3RhbGxlZFxuICovXG5cbi8qKlxuICogUG9zc2libGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkludGVybmFsTWV0YWRhdGEgJiBFeHRlbnNpb25NZXRhZGF0YX0gSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YXxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufS5cbiAqIEB0eXBlZGVmIFJ1bk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59XG4gKlxuICogQHR5cGVkZWYgUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSAtIGVycm9yIG1lc3NhZ2UgaWYgc2NyaXB0IHJhbiB1bnN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3V0cHV0IC0gc2NyaXB0IG91dHB1dFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdW5zYWZlIC0gaWYgdHJ1ZSwgd2lsbCBwZXJmb3JtIHVuc2FmZSB1cGRhdGVzIHBhc3QgbWFqb3IgcmV2aXNpb24gYm91bmRhcmllc1xuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLEVycm9yPn0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsVXBkYXRlUmVwb3J0Pn0gdXBkYXRlcyAtIG1hcCBvZiBleHQgbmFtZXMgdG8ge0BsaW5rY29kZSBVcGRhdGVSZXBvcnR9c1xuICovXG5cbi8qKlxuICogUGFydCBvZiByZXN1bHQgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdW5pbnN0YWxsfS5cbiAqIEB0eXBlZGVmIFVuaW5zdGFsbE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0UG9zdEluc3RhbGxUZXh0fVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsVmlhTnBtfVxuICogQHR5cGVkZWYgSW5zdGFsbFZpYU5wbUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlfVxuICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0RXh0ZW5zaW9uRmllbGRzfVxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0TWV0YWRhdGE8RXh0VHlwZT4gJiB7IHBrZ05hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBhcHBpdW1WZXJzaW9uOiBzdHJpbmcgfSAmIGltcG9ydCgnYXBwaXVtL3R5cGVzJykuQ29tbW9uRXh0TWV0YWRhdGF9IEV4dGVuc2lvbkZpZWxkc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0VHlwZSBleHRlbmRzIERyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogRXh0VHlwZSBleHRlbmRzIFBsdWdpblR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9QTFVHSU5TIDogbmV2ZXJ9IEtub3duRXh0ZW5zaW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd0luc3RhbGxlZCAtIHdoZXRoZXIgc2hvdWxkIHNob3cgb25seSBpbnN0YWxsZWQgZXh0ZW5zaW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxXQUFuQjs7QUFFQSxNQUFNQyxpQkFBTixTQUFnQ0MsS0FBaEMsQ0FBc0M7O0FBQ3RDLE1BQU1DLHVCQUFOLFNBQXNDRCxLQUF0QyxDQUE0Qzs7QUFLNUMsTUFBTUUsZ0JBQU4sQ0FBdUI7RUFLckJDLE1BQU07RUFNTkMsZUFBZTtFQU1mQyxZQUFZOztFQU1aQyxXQUFXLENB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
535
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRyYUFyZ3MiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICAvKiogQHR5cGUge3N0cmluZz99ICovXG4gICAgbGV0IHVuc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RWZXJzaW9uKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGxldCBzYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihcbiAgICAgIHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsXG4gICAgICBwa2dOYW1lLFxuICAgICAgdmVyc2lvblxuICAgICk7XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAhPT0gbnVsbCAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbaW5zdGFsbFNwZWNdO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe1xuICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICBwa2dOYW1lLFxuICAgICAgcGtnVmVyOiB2ZXJzaW9uLFxuICAgIH0pO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgYXdhaXQgdGhpcy5jb25maWcudXBkYXRlRXh0ZW5zaW9uKGluc3RhbGxTcGVjLCBleHREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc2NyaXB0IGNhY2hlZCBpbnNpZGUgdGhlIFwic2NyaXB0c1wiIGZpZWxkIHVuZGVyIFwiYXBwaXVtXCJcbiAgICogaW5zaWRlIG9mIHRoZSBkcml2ZXIvcGx1Z2lucyBcInBhY2thZ2UuanNvblwiIGZpbGUuIFdpbGwgdGhyb3dcbiAgICogYW4gZXJyb3IgaWYgdGhlIGRyaXZlci9wbHVnaW4gZG9lcyBub3QgY29udGFpbiBhIFwic2NyaXB0c1wiIGZpZWxkXG4gICAqIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbiwgaWYgdGhlXG4gICAqIFwic2NyaXB0c1wiIGZpZWxkIGlzIG5vdCBhIHBsYWluIG9iamVjdCwgb3IgaWYgdGhlIHNjcmlwdE5hbWUgaXNcbiAgICogbm90IGZvdW5kIHdpdGhpbiBcInNjcmlwdHNcIiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJ1bk91dHB1dD59XG4gICAqL1xuICBhc3luYyBfcnVuKHtpbnN0YWxsU3BlYywgc2NyaXB0TmFtZSwgZXh0cmFBcmdzID0gW119KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChpbnN0YWxsU3BlYykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gXCIke2luc3RhbGxTcGVjfVwiIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdLCAuLi5leHRyYUFyZ3NdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGluc3RhbGxTcGVjKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICB0aGlzLmxvZy5sb2cobGluZSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBydW5uZXIuc3RhcnQoMCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVubmVyLmpvaW4oKTtcbiAgICAgIHRoaXMubG9nLm9rKGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgJyR7c2NyaXB0TmFtZX0nOiAke2Vyci5tZXNzYWdlfWAucmVkKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGVyci5tZXNzYWdlLCBvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbnNpb25Db21tYW5kO1xuZXhwb3J0IHtFeHRlbnNpb25Db21tYW5kfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVwZGF0ZVZlcnNpb24gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlVmVyc2lvbiAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSB1cFRvRGF0ZSAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGUgbGF0ZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dFJlY29yZDxFeHRUeXBlPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBFeHRlbnNpb25Db25maWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWV0YWRhdGE8RXh0VHlwZT59IEV4dE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1hbmlmZXN0PEV4dFR5cGU+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gRXh0UGFja2FnZUpzb25cbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiBVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZVxuICogQHByb3BlcnR5IHtmYWxzZX0gaW5zdGFsbGVkXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW50ZXJuYWxNZXRhZGF0YSAmIEV4dGVuc2lvbk1ldGFkYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGE+fSBFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHJ1biBhIHNjcmlwdCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtleHRyYUFyZ3NdIC0gYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNjcmlwdFxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufVxuICpcbiAqIEB0eXBlZGVmIFJ1bk91dHB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvcl0gLSBlcnJvciBtZXNzYWdlIGlmIHNjcmlwdCByYW4gdW5zdWNjZXNzZnVsbHksIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG91dHB1dCAtIHNjcmlwdCBvdXRwdXRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uIGJvdW5kYXJpZXNcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIFVwZGF0ZVJlcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHRvXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VuaW5zdGFsbH0uXG4gKiBAdHlwZWRlZiBVbmluc3RhbGxPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldFBvc3RJbnN0YWxsVGV4dH1cbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuaW5zdGFsbFZpYU5wbX1cbiAqIEB0eXBlZGVmIEluc3RhbGxWaWFOcG1BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICovXG5cbi8qKlxuICogT2JqZWN0IHJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZX1cbiAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5faW5zdGFsbH1cbiAqIEB0eXBlZGVmIEluc3RhbGxBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW5zdGFsbFR5cGV9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICovXG5cbi8qKlxuICogUmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldEV4dGVuc2lvbkZpZWxkc31cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dE1ldGFkYXRhPEV4dFR5cGU+ICYgeyBwa2dOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYXBwaXVtVmVyc2lvbjogc3RyaW5nIH0gJiBpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkNvbW1vbkV4dE1ldGFkYXRhfSBFeHRlbnNpb25GaWVsZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fRFJJVkVSUyA6IEV4dFR5cGUgZXh0ZW5kcyBQbHVnaW5UeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOUyA6IG5ldmVyfSBLbm93bkV4dGVuc2lvbnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQTs7QUFFQSxNQUFN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
@@ -2,17 +2,21 @@ export const commandClasses: Readonly<{
2
2
  readonly driver: typeof DriverCommand;
3
3
  readonly plugin: typeof PluginCommand;
4
4
  }>;
5
- export type ExtCommand<ExtType extends import("@appium/types").ExtensionType> = ExtType extends import('@appium/types').DriverType ? import('@appium/types').Class<DriverCommand> : ExtType extends import('@appium/types').PluginType ? import('@appium/types').Class<PluginCommand> : never;
5
+ export type ExtCommand<ExtType extends import("@appium/types").ExtensionType> = ExtType extends DriverType ? Class<DriverCommand> : ExtType extends PluginType ? Class<PluginCommand> : never;
6
+ export type ExtensionType = import('@appium/types').ExtensionType;
7
+ export type DriverType = import('@appium/types').DriverType;
8
+ export type PluginType = import('@appium/types').PluginType;
9
+ export type Class<T> = import('@appium/types').Class<T>;
6
10
  import DriverCommand from "./driver-command";
7
11
  import PluginCommand from "./plugin-command";
8
12
  /**
9
13
  * Run a subcommand of the 'appium driver' type. Each subcommand has its own set of arguments which
10
14
  * can be represented as a JS object.
11
15
  *
12
- * @param {Object} args - JS object where the key is the parameter name (as defined in
16
+ * @param {import('appium/types').Args<import('appium/types').WithExtSubcommand>} args - JS object where the key is the parameter name (as defined in
13
17
  * driver-parser.js)
14
- * @template {import('../extension/manifest').ExtensionType} ExtType
18
+ * @template {ExtensionType} ExtType
15
19
  * @param {import('../extension/extension-config').ExtensionConfig<ExtType>} config - Extension config object
16
20
  */
17
- export function runExtensionCommand<ExtType extends import("@appium/types").ExtensionType>(args: any, config: import("../extension/extension-config").ExtensionConfig<ExtType>): Promise<any>;
21
+ export function runExtensionCommand<ExtType extends import("@appium/types").ExtensionType>(args: import('appium/types').Args<import('appium/types').WithExtSubcommand>, config: import("../extension/extension-config").ExtensionConfig<ExtType>): Promise<any>;
18
22
  //# sourceMappingURL=extension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../lib/cli/extension.js"],"names":[],"mappings":"AAMA;;;GAKE;gFAgDW,OAAO,SAAS,OAAO,eAAe,EAAE,UAAU,GAAG,OAAO,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,SAAS,OAAO,eAAe,EAAE,UAAU,GAAG,OAAO,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK;;;AA9C1N;;;;;;;;GAQG;AACH,8LA+BC"}
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../lib/cli/extension.js"],"names":[],"mappings":"AAMA;;;GAKE;gFAiDW,OAAO,SAAS,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,OAAO,SAAS,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,KAAK;4BAI7G,OAAO,eAAe,EAAE,aAAa;yBACrC,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;uBAKlC,OAAO,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;;;AA1D7C;;;;;;;;GAQG;AACH,iGALW,OAAO,cAAc,EAAE,IAAI,CAAC,OAAO,cAAc,EAAE,iBAAiB,CAAC,0FAqC/E"}
@@ -39,6 +39,7 @@ async function runExtensionCommand(args, config) {
39
39
  json,
40
40
  suppressOutput
41
41
  } = args;
42
+ json = Boolean(json);
42
43
 
43
44
  if (suppressOutput) {
44
45
  json = true;
@@ -66,4 +67,4 @@ async function runExtensionCommand(args, config) {
66
67
 
67
68
  return jsonResult;
68
69
  }
69
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kQ2xhc3NlcyIsIk9iamVjdCIsImZyZWV6ZSIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwiUGx1Z2luQ29tbWFuZCIsInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwiY29uZmlnIiwianNvblJlc3VsdCIsImV4dGVuc2lvblR5cGUiLCJ0eXBlIiwiZXh0Q21kIiwiVHlwZUVycm9yIiwianNvbiIsInN1cHByZXNzT3V0cHV0IiwiQ29tbWFuZENsYXNzIiwiY21kIiwiZXhlY3V0ZSIsImVyciIsImVyckFuZFF1aXQiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsIkpTT05fU1BBQ0VTIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NsaS9leHRlbnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IERyaXZlckNvbW1hbmQgZnJvbSAnLi9kcml2ZXItY29tbWFuZCc7XG5pbXBvcnQgUGx1Z2luQ29tbWFuZCBmcm9tICcuL3BsdWdpbi1jb21tYW5kJztcbmltcG9ydCB7RFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtlcnJBbmRRdWl0LCBKU09OX1NQQUNFU30gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kQ2xhc3NlcyA9IE9iamVjdC5mcmVlemUoXG4gIC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gICAgW0RSSVZFUl9UWVBFXTogRHJpdmVyQ29tbWFuZCxcbiAgICBbUExVR0lOX1RZUEVdOiBQbHVnaW5Db21tYW5kLFxuICB9KVxuKTtcblxuLyoqXG4gKiBSdW4gYSBzdWJjb21tYW5kIG9mIHRoZSAnYXBwaXVtIGRyaXZlcicgdHlwZS4gRWFjaCBzdWJjb21tYW5kIGhhcyBpdHMgb3duIHNldCBvZiBhcmd1bWVudHMgd2hpY2hcbiAqIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIEpTIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIEpTIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIHRoZSBwYXJhbWV0ZXIgbmFtZSAoYXMgZGVmaW5lZCBpblxuICogZHJpdmVyLXBhcnNlci5qcylcbiAqIEB0ZW1wbGF0ZSB7aW1wb3J0KCcuLi9leHRlbnNpb24vbWFuaWZlc3QnKS5FeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnKS5FeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIEV4dGVuc2lvbiBjb25maWcgb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkV4dGVuc2lvbkNvbW1hbmQoYXJncywgY29uZmlnKSB7XG4gIC8vIFRPRE8gZHJpdmVyIGNvbmZpZyBmaWxlIHNob3VsZCBiZSBsb2NrZWQgd2hpbGUgYW55IG9mIHRoZXNlIGNvbW1hbmRzIGFyZVxuICAvLyBydW5uaW5nIHRvIHByZXZlbnQgd2VpcmQgc2l0dWF0aW9uc1xuICBsZXQganNvblJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IHtleHRlbnNpb25UeXBlOiB0eXBlfSA9IGNvbmZpZztcbiAgY29uc3QgZXh0Q21kID0gYXJnc1tgJHt0eXBlfUNvbW1hbmRgXTtcbiAgaWYgKCFleHRDbWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgY2FsbCAke3R5cGV9IGNvbW1hbmQgd2l0aG91dCBhIHN1YmNvbW1hbmQgbGlrZSAnaW5zdGFsbCdgKTtcbiAgfVxuICBsZXQge2pzb24sIHN1cHByZXNzT3V0cHV0fSA9IGFyZ3M7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IC8qKiBAdHlwZSB7RXh0Q29tbWFuZDxFeHRUeXBlPn0gKi8gKGNvbW1hbmRDbGFzc2VzW3R5cGVdKTtcbiAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnLCBqc29ufSk7XG4gIHRyeSB7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge3J1bkV4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlID8gaW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8RHJpdmVyQ29tbWFuZD4gOiBFeHRUeXBlIGV4dGVuZHMgaW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZSA/IGltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNsYXNzPFBsdWdpbkNvbW1hbmQ+IDogbmV2ZXJ9IEV4dENvbW1hbmRcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFTyxNQUFNQSxjQUFjLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUNOO0VBQ3BCLENBQUNDLHNCQUFELEdBQWVDLHNCQURLO0VBRXBCLENBQUNDLHNCQUFELEdBQWVDO0FBRkssQ0FETSxDQUF2Qjs7O0FBZ0JQLGVBQWVDLG1CQUFmLENBQW1DQyxJQUFuQyxFQUF5Q0MsTUFBekMsRUFBaUQ7RUFHL0MsSUFBSUMsVUFBVSxHQUFHLElBQWpCO0VBQ0EsTUFBTTtJQUFDQyxhQUFhLEVBQUVDO0VBQWhCLElBQXdCSCxNQUE5QjtFQUNBLE1BQU1JLE1BQU0sR0FBR0wsSUFBSSxDQUFFLEdBQUVJLElBQUssU0FBVCxDQUFuQjs7RUFDQSxJQUFJLENBQUNDLE1BQUwsRUFBYTtJQUNYLE1BQU0sSUFBSUMsU0FBSixDQUFlLGVBQWNGLElBQUssOENBQWxDLENBQU47RUFDRDs7RUFDRCxJQUFJO0lBQUNHLElBQUQ7SUFBT0M7RUFBUCxJQUF5QlIsSUFBN0I7O0VBQ0EsSUFBSVEsY0FBSixFQUFvQjtJQUNsQkQsSUFBSSxHQUFHLElBQVA7RUFDRDs7RUFDRCxNQUFNRSxZQUFZLEdBQXVDakIsY0FBYyxDQUFDWSxJQUFELENBQXZFO0VBQ0EsTUFBTU0sR0FBRyxHQUFHLElBQUlELFlBQUosQ0FBaUI7SUFBQ1IsTUFBRDtJQUFTTTtFQUFULENBQWpCLENBQVo7O0VBQ0EsSUFBSTtJQUNGTCxVQUFVLEdBQUcsTUFBTVEsR0FBRyxDQUFDQyxPQUFKLENBQVlYLElBQVosQ0FBbkI7RUFDRCxDQUZELENBRUUsT0FBT1ksR0FBUCxFQUFZO0lBR1osSUFBSUosY0FBSixFQUFvQjtNQUNsQixNQUFNSSxHQUFOO0lBQ0Q7O0lBQ0QsSUFBQUMsaUJBQUEsRUFBV04sSUFBWCxFQUFpQkssR0FBakI7RUFDRDs7RUFFRCxJQUFJTCxJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtJQUMzQk0sT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlZixVQUFmLEVBQTJCLElBQTNCLEVBQWlDZ0Isa0JBQWpDLENBQVo7RUFDRDs7RUFFRCxPQUFPaEIsVUFBUDtBQUNEIn0=
70
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kQ2xhc3NlcyIsIk9iamVjdCIsImZyZWV6ZSIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwiUGx1Z2luQ29tbWFuZCIsInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwiY29uZmlnIiwianNvblJlc3VsdCIsImV4dGVuc2lvblR5cGUiLCJ0eXBlIiwiZXh0Q21kIiwiVHlwZUVycm9yIiwianNvbiIsInN1cHByZXNzT3V0cHV0IiwiQm9vbGVhbiIsIkNvbW1hbmRDbGFzcyIsImNtZCIsImV4ZWN1dGUiLCJlcnIiLCJlcnJBbmRRdWl0IiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJKU09OX1NQQUNFUyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRX0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZXJyQW5kUXVpdCwgSlNPTl9TUEFDRVN9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY29tbWFuZENsYXNzZXMgPSBPYmplY3QuZnJlZXplKFxuICAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAgIFtEUklWRVJfVFlQRV06IERyaXZlckNvbW1hbmQsXG4gICAgW1BMVUdJTl9UWVBFXTogUGx1Z2luQ29tbWFuZCxcbiAgfSlcbik7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5XaXRoRXh0U3ViY29tbWFuZD59IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRXh0ZW5zaW9uQ29tbWFuZChhcmdzLCBjb25maWcpIHtcbiAgLy8gVE9ETyBkcml2ZXIgY29uZmlnIGZpbGUgc2hvdWxkIGJlIGxvY2tlZCB3aGlsZSBhbnkgb2YgdGhlc2UgY29tbWFuZHMgYXJlXG4gIC8vIHJ1bm5pbmcgdG8gcHJldmVudCB3ZWlyZCBzaXR1YXRpb25zXG4gIGxldCBqc29uUmVzdWx0ID0gbnVsbDtcbiAgY29uc3Qge2V4dGVuc2lvblR5cGU6IHR5cGV9ID0gY29uZmlnO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAganNvbiA9IEJvb2xlYW4oanNvbik7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IC8qKiBAdHlwZSB7RXh0Q29tbWFuZDxFeHRUeXBlPn0gKi8gKGNvbW1hbmRDbGFzc2VzW3R5cGVdKTtcbiAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnLCBqc29ufSk7XG4gIHRyeSB7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge3J1bkV4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gQ2xhc3M8RHJpdmVyQ29tbWFuZD4gOiBFeHRUeXBlIGV4dGVuZHMgUGx1Z2luVHlwZSA/IENsYXNzPFBsdWdpbkNvbW1hbmQ+IDogbmV2ZXJ9IEV4dENvbW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8VD59IENsYXNzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRU8sTUFBTUEsY0FBYyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FDTjtFQUNwQixDQUFDQyxzQkFBRCxHQUFlQyxzQkFESztFQUVwQixDQUFDQyxzQkFBRCxHQUFlQztBQUZLLENBRE0sQ0FBdkI7OztBQWdCUCxlQUFlQyxtQkFBZixDQUFtQ0MsSUFBbkMsRUFBeUNDLE1BQXpDLEVBQWlEO0VBRy9DLElBQUlDLFVBQVUsR0FBRyxJQUFqQjtFQUNBLE1BQU07SUFBQ0MsYUFBYSxFQUFFQztFQUFoQixJQUF3QkgsTUFBOUI7RUFDQSxNQUFNSSxNQUFNLEdBQUdMLElBQUksQ0FBRSxHQUFFSSxJQUFLLFNBQVQsQ0FBbkI7O0VBQ0EsSUFBSSxDQUFDQyxNQUFMLEVBQWE7SUFDWCxNQUFNLElBQUlDLFNBQUosQ0FBZSxlQUFjRixJQUFLLDhDQUFsQyxDQUFOO0VBQ0Q7O0VBQ0QsSUFBSTtJQUFDRyxJQUFEO0lBQU9DO0VBQVAsSUFBeUJSLElBQTdCO0VBQ0FPLElBQUksR0FBR0UsT0FBTyxDQUFDRixJQUFELENBQWQ7O0VBQ0EsSUFBSUMsY0FBSixFQUFvQjtJQUNsQkQsSUFBSSxHQUFHLElBQVA7RUFDRDs7RUFDRCxNQUFNRyxZQUFZLEdBQXVDbEIsY0FBYyxDQUFDWSxJQUFELENBQXZFO0VBQ0EsTUFBTU8sR0FBRyxHQUFHLElBQUlELFlBQUosQ0FBaUI7SUFBQ1QsTUFBRDtJQUFTTTtFQUFULENBQWpCLENBQVo7O0VBQ0EsSUFBSTtJQUNGTCxVQUFVLEdBQUcsTUFBTVMsR0FBRyxDQUFDQyxPQUFKLENBQVlaLElBQVosQ0FBbkI7RUFDRCxDQUZELENBRUUsT0FBT2EsR0FBUCxFQUFZO0lBR1osSUFBSUwsY0FBSixFQUFvQjtNQUNsQixNQUFNSyxHQUFOO0lBQ0Q7O0lBQ0QsSUFBQUMsaUJBQUEsRUFBV1AsSUFBWCxFQUFpQk0sR0FBakI7RUFDRDs7RUFFRCxJQUFJTixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtJQUMzQk8sT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlaEIsVUFBZixFQUEyQixJQUEzQixFQUFpQ2lCLGtCQUFqQyxDQUFaO0VBQ0Q7O0VBRUQsT0FBT2pCLFVBQVA7QUFDRCJ9
@@ -1,3 +1,6 @@
1
+ export const EXTRA_ARGS: "extraArgs";
2
+ export type DriverType = import('@appium/types').DriverType;
3
+ export type PluginType = import('@appium/types').PluginType;
1
4
  /**
2
5
  * Creates a {@link ArgParser} instance; finalizes the config schema.
3
6
  *
@@ -21,9 +24,10 @@ export class ArgParser {
21
24
  *
22
25
  * E.g., `{'driver-foo-bar': baz}` becomes `{driver: {foo: {bar: 'baz'}}}`
23
26
  * @param {object} args
27
+ * @param {string[]} [unknownArgs]
24
28
  * @returns {object}
25
29
  */
26
- static _transformParsedArgs(args: object): object;
30
+ static _transformParsedArgs(args: object, unknownArgs?: string[] | undefined): object;
27
31
  /**
28
32
  * Patches the `exit()` method of the parser to throw an error, so we can handle it manually.
29
33
  * @param {ArgumentParser} parser
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../lib/cli/parser.js"],"names":[],"mappings":"AAkPA;;;;;;GAMG;AACH,wDAFa,SAAS,CAMrB;AA1OD;;;;;;GAMG;AACH;IA4FE;;;;;;;;OAQG;IACH,kCAHW,MAAM,GACJ,MAAM,CAiBlB;IAED;;;OAGG;IACH,0BAFW,cAAc,QASxB;IAED;;;;OAIG;IACH,qCAHW,OAAO,UAAU,EAAE,SAAS,GAC1B,OAAO,QAAQ,EAAE,mBAAmB,CAkBhD;IAED;;;OAGG;IACH,iDAFW,OAAO,UAAU,EAAE,SAAS,QAyDtC;IApND;;OAEG;IACH,yCAmDC;IAxCC;;;OAGG;IACH,MAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,OAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,QAFU,cAAc,CAEJ;IAcpB,8CAAyB;IAMzB;;OAEG;IACH,YAFU,SAAS,CAAC,WAAW,CAAC,CAEA;IAGlC;;;;;;;;;OASG;IACH,wHAuBC;CA4HF"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../lib/cli/parser.js"],"names":[],"mappings":"AASA,qCAAsC;yBA0QzB,OAAO,eAAe,EAAE,UAAU;yBAClC,OAAO,eAAe,EAAE,UAAU;AAjB/C;;;;;;GAMG;AACH,wDAFa,SAAS,CAMrB;AAzPD;;;;;;GAMG;AACH;IAqGE;;;;;;;;;OASG;IACH,kCAJW,MAAM,uCAEJ,MAAM,CAmBlB;IAED;;;OAGG;IACH,0BAFW,cAAc,QASxB;IAED;;;;OAIG;IACH,qCAHW,OAAO,UAAU,EAAE,SAAS,GAC1B,OAAO,QAAQ,EAAE,mBAAmB,CAkBhD;IAED;;;OAGG;IACH,iDAFW,OAAO,UAAU,EAAE,SAAS,QA4DtC;IAnOD;;OAEG;IACH,yCAmDC;IAxCC;;;OAGG;IACH,MAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,OAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,QAFU,cAAc,CAEJ;IAcpB,8CAAyB;IAMzB;;OAEG;IACH,YAFU,SAAS,CAAC,WAAW,CAAC,CAEA;IAGlC;;;;;;;;;OASG;IACH,wHAgCC;CAkIF"}
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.ArgParser = void 0;
8
+ exports.EXTRA_ARGS = exports.ArgParser = void 0;
9
9
  exports.getParser = getParser;
10
10
 
11
11
  require("source-map-support/register");
@@ -26,6 +26,8 @@ var _config = require("../config");
26
26
 
27
27
  var _args = require("./args");
28
28
 
29
+ const EXTRA_ARGS = 'extraArgs';
30
+ exports.EXTRA_ARGS = EXTRA_ARGS;
29
31
  const NON_SERVER_ARGS = Object.freeze(new Set([_constants.DRIVER_TYPE, _constants.PLUGIN_TYPE, _constants.SERVER_SUBCOMMAND, '-h', '--help', '-v', '--version']));
30
32
 
31
33
  const version = _support.fs.readPackageJsonFrom(_config.rootDir).version;
@@ -67,8 +69,16 @@ class ArgParser {
67
69
  }
68
70
 
69
71
  try {
70
- const parsed = this.parser.parse_args(args);
71
- return ArgParser._transformParsedArgs(parsed);
72
+ const parsed = this.parser.parse_known_args(args);
73
+ const [knownArgs, unknownArgs] = parsed;
74
+
75
+ if (unknownArgs !== null && unknownArgs !== void 0 && unknownArgs.length && (knownArgs.driverCommand === 'run' || knownArgs.pluginCommand === 'run')) {
76
+ return ArgParser._transformParsedArgs(knownArgs, unknownArgs);
77
+ } else if (unknownArgs !== null && unknownArgs !== void 0 && unknownArgs.length) {
78
+ throw new Error(`[ERROR] Unrecognized arguments: ${unknownArgs.join(' ')}`);
79
+ }
80
+
81
+ return ArgParser._transformParsedArgs(knownArgs);
72
82
  } catch (err) {
73
83
  if (this.debug) {
74
84
  throw err;
@@ -82,8 +92,8 @@ class ArgParser {
82
92
  }
83
93
  }
84
94
 
85
- static _transformParsedArgs(args) {
86
- return _lodash.default.reduce(args, (unpacked, value, key) => {
95
+ static _transformParsedArgs(args, unknownArgs = []) {
96
+ const result = _lodash.default.reduce(args, (unpacked, value, key) => {
87
97
  if (!_lodash.default.isUndefined(value) && (0, _schema.hasArgSpec)(key)) {
88
98
  const {
89
99
  dest
@@ -96,6 +106,9 @@ class ArgParser {
96
106
 
97
107
  return unpacked;
98
108
  }, {});
109
+
110
+ result[EXTRA_ARGS] = unknownArgs;
111
+ return result;
99
112
  }
100
113
 
101
114
  static _patchExit(parser) {
@@ -188,4 +201,4 @@ function getParser(debug) {
188
201
  (0, _schema.finalizeSchema)();
189
202
  return new ArgParser(debug);
190
203
  }
191
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT05fU0VSVkVSX0FSR1MiLCJPYmplY3QiLCJmcmVlemUiLCJTZXQiLCJEUklWRVJfVFlQRSIsIlBMVUdJTl9UWVBFIiwiU0VSVkVSX1NVQkNPTU1BTkQiLCJ2ZXJzaW9uIiwiZnMiLCJyZWFkUGFja2FnZUpzb25Gcm9tIiwicm9vdERpciIsIkFyZ1BhcnNlciIsImNvbnN0cnVjdG9yIiwiZGVidWciLCJwcm9nIiwicHJvY2VzcyIsImFyZ3YiLCJwYXRoIiwiYmFzZW5hbWUiLCJwYXJzZXIiLCJBcmd1bWVudFBhcnNlciIsImFkZF9oZWxwIiwiZGVzY3JpcHRpb24iLCJfcGF0Y2hFeGl0IiwiYWRkX2FyZ3VtZW50IiwiYWN0aW9uIiwic3ViUGFyc2VycyIsImFkZF9zdWJwYXJzZXJzIiwiZGVzdCIsInNlcnZlckFyZ3MiLCJfYWRkU2VydmVyVG9QYXJzZXIiLCJyYXdBcmdzIiwiX2FkZEV4dGVuc2lvbkNvbW1hbmRzVG9QYXJzZXIiLCJwYXJzZV9hcmdzIiwicGFyc2VBcmdzIiwiYXJncyIsInNsaWNlIiwiaGFzIiwidW5zaGlmdCIsInBhcnNlZCIsIl90cmFuc2Zvcm1QYXJzZWRBcmdzIiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwibWVzc2FnZSIsImV4aXQiLCJfIiwicmVkdWNlIiwidW5wYWNrZWQiLCJ2YWx1ZSIsImtleSIsImlzVW5kZWZpbmVkIiwiaGFzQXJnU3BlYyIsImdldEFyZ1NwZWMiLCJzZXQiLCJjb2RlIiwibXNnIiwiRXJyb3IiLCJzdWJQYXJzZXIiLCJzZXJ2ZXJQYXJzZXIiLCJhZGRfcGFyc2VyIiwiaGVscCIsImdldFNlcnZlckFyZ3MiLCJmbGFnc09yTmFtZXMiLCJvcHRzIiwidHlwZSIsImV4dFBhcnNlciIsImV4dFN1YlBhcnNlcnMiLCJleHRlbnNpb25BcmdzIiwiZ2V0RXh0ZW5zaW9uQXJncyIsInBhcnNlclNwZWNzIiwiY29tbWFuZCIsImxpc3QiLCJpbnN0YWxsIiwidW5pbnN0YWxsIiwidXBkYXRlIiwicnVuIiwiZ2V0UGFyc2VyIiwiZmluYWxpemVTY2hlbWEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY2xpL3BhcnNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2ZzfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtBcmd1bWVudFBhcnNlcn0gZnJvbSAnYXJncGFyc2UnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUsIFNFUlZFUl9TVUJDT01NQU5EfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtmaW5hbGl6ZVNjaGVtYSwgZ2V0QXJnU3BlYywgaGFzQXJnU3BlY30gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7cm9vdERpcn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7Z2V0RXh0ZW5zaW9uQXJncywgZ2V0U2VydmVyQXJnc30gZnJvbSAnLi9hcmdzJztcblxuLyoqXG4gKiBJZiB0aGUgcGFyc2VkIGFyZ3MgZG8gbm90IGNvbnRhaW4gYW55IG9mIHRoZXNlIHZhbHVlcywgdGhlbiB3ZVxuICogd2lsbCBhdXRvbWF0aWFsbHkgaW5qZWN0IHRoZSBgc2VydmVyYCBzdWJjb21tYW5kLlxuICovXG5jb25zdCBOT05fU0VSVkVSX0FSR1MgPSBPYmplY3QuZnJlZXplKFxuICBuZXcgU2V0KFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUsIFNFUlZFUl9TVUJDT01NQU5ELCAnLWgnLCAnLS1oZWxwJywgJy12JywgJy0tdmVyc2lvbiddKVxuKTtcblxuY29uc3QgdmVyc2lvbiA9IGZzLnJlYWRQYWNrYWdlSnNvbkZyb20ocm9vdERpcikudmVyc2lvbjtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIGBhcmdwYXJzZWBcbiAqXG4gKiAtIEhhbmRsZXMgaW5zdGFudGlhdGlvbiwgY29uZmlndXJhdGlvbiwgYW5kIG1vbmtleXBhdGNoaW5nIG9mIGFuXG4gKiAgICBgQXJndW1lbnRQYXJzZXJgIGluc3RhbmNlIGZvciBBcHBpdW0gc2VydmVyIGFuZCBpdHMgZXh0ZW5zaW9uc1xuICogLSBIYW5kbGVzIGVycm9yIGNvbmRpdGlvbnMsIG1lc3NhZ2VzLCBhbmQgZXhpdCBiZWhhdmlvclxuICovXG5jbGFzcyBBcmdQYXJzZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBbZGVidWddIC0gSWYgdHJ1ZSwgdGhyb3cgaW5zdGVhZCBvZiBleGl0IG9uIGVycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZGVidWcgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb2cgPSBwcm9jZXNzLmFyZ3ZbMV0gPyBwYXRoLmJhc2VuYW1lKHByb2Nlc3MuYXJndlsxXSkgOiAnYXBwaXVtJztcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQXJndW1lbnRQYXJzZXIoe1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0Egd2ViZHJpdmVyLWNvbXBhdGlibGUgc2VydmVyIHRoYXQgZmFjaWxpdGF0ZXMgYXV0b21hdGlvbiBvZiB3ZWIsIG1vYmlsZSwgYW5kIG90aGVyIHR5cGVzIG9mIGFwcHMgYWNyb3NzIHZhcmlvdXMgcGxhdGZvcm1zLicsXG4gICAgICBwcm9nLFxuICAgIH0pO1xuXG4gICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQocGFyc2VyKTtcblxuICAgIC8qKlxuICAgICAqIFByb2dyYW0gbmFtZSAodHlwaWNhbGx5IGBhcHBpdW1gKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5wcm9nID0gcHJvZztcblxuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhyb3cgYW4gZXJyb3Igb24gcGFyc2UgZmFpbHVyZSBpbnN0ZWFkIG9mIHByaW50aW5nIGhlbHBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcGVkIGBBcmd1bWVudFBhcnNlcmAgaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7QXJndW1lbnRQYXJzZXJ9XG4gICAgICovXG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cbiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcnNpb24nLCB7XG4gICAgICBhY3Rpb246ICd2ZXJzaW9uJyxcbiAgICAgIHZlcnNpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJQYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKHtkZXN0OiAnc3ViY29tbWFuZCd9KTtcblxuICAgIC8vIGFkZCB0aGUgJ3NlcnZlcicgc3ViY29tbWFuZCwgYW5kIHN0b3JlIHRoZSByYXcgYXJndW1lbnRzIG9uIHRoZSBwYXJzZXJcbiAgICAvLyBvYmplY3QgYXMgYSB3YXkgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIHRvIHdvcmsgd2l0aCB0aGUgYXJndW1lbnRzXG4gICAgLy8gY29uY2VwdHVhbGx5IHJhdGhlciB0aGFuIGp1c3QgdGhyb3VnaCBhcmdwYXJzZVxuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBBcmdQYXJzZXIuX2FkZFNlcnZlclRvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgdGhpcy5yYXdBcmdzID0gc2VydmVyQXJncztcblxuICAgIC8vIGFkZCB0aGUgJ2RyaXZlcicgYW5kICdwbHVnaW4nIHN1YmNvbW1hbmRzXG4gICAgQXJnUGFyc2VyLl9hZGRFeHRlbnNpb25Db21tYW5kc1RvUGFyc2VyKHN1YlBhcnNlcnMpO1xuXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgLyBkcm9wLWluIHdyYXBwZXJcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QXJnUGFyc2VyWydwYXJzZUFyZ3MnXX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnNlX2FyZ3MgPSB0aGlzLnBhcnNlQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBJZiBubyBzdWJjb21tYW5kIGlzIHBhc3NlZCBpbiwgdGhpcyBtZXRob2Qgd2lsbCBpbmplY3QgdGhlIGBzZXJ2ZXJgIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIGBBcmdQYXJzZXIucHJvdG90eXBlLnBhcnNlX2FyZ3NgIGlzIGFuIGFsaWFzIG9mIHRoaXMgbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgW1Q9aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3NdIC0gQXJyYXkgb2YgYXJndW1lbnRzLCBvc3RlbnNpYmx5IGZyb20gYHByb2Nlc3MuYXJndmAuIEdhdGhlcnMgYXJncyBmcm9tIGBwcm9jZXNzLmFyZ3ZgIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHJldHVybnMge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuQXJnczxUPn0gLSBUaGUgcGFyc2VkIGFyZ3VtZW50c1xuICAgKi9cbiAgcGFyc2VBcmdzKGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpIHtcbiAgICBpZiAoIU5PTl9TRVJWRVJfQVJHUy5oYXMoYXJnc1swXSkpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChTRVJWRVJfU1VCQ09NTUFORCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VyLnBhcnNlX2FyZ3MoYXJncyk7XG4gICAgICByZXR1cm4gQXJnUGFyc2VyLl90cmFuc2Zvcm1QYXJzZWRBcmdzKHBhcnNlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIGlzbid0IHRlc3RlZCB2aWEgdW5pdCB0ZXN0cyAod2UgdXNlIGBkZWJ1ZzogdHJ1ZWApIHNvIG1heSBlc2NhcGUgY292ZXJhZ2UuXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKTsgLy8gbmVlZCBhbiBleHRyYSBzcGFjZSBzaW5jZSBhcmdwYXJzZSBwcmludHMgdXNhZ2UuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIG9iamVjdCBmdWxsIG9mIGFyZ3VtZW50cyBhcyByZXR1cm5lZCBieSBgYXJncGFyc2VyLnBhcnNlX2FyZ3NgLFxuICAgKiBleHBhbmQgdGhlIG9uZXMgZm9yIGV4dGVuc2lvbnMgaW50byBhIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlIGFuZCByZW5hbWVcbiAgICoga2V5cyB0byBtYXRjaCB0aGUgaW50ZW5kZWQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIEUuZy4sIGB7J2RyaXZlci1mb28tYmFyJzogYmF6fWAgYmVjb21lcyBge2RyaXZlcjoge2Zvbzoge2JhcjogJ2Jheid9fX1gXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBzdGF0aWMgX3RyYW5zZm9ybVBhcnNlZEFyZ3MoYXJncykge1xuICAgIHJldHVybiBfLnJlZHVjZShcbiAgICAgIGFyZ3MsXG4gICAgICAodW5wYWNrZWQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHZhbHVlKSAmJiBoYXNBcmdTcGVjKGtleSkpIHtcbiAgICAgICAgICBjb25zdCB7ZGVzdH0gPSAvKiogQHR5cGUge2ltcG9ydCgnLi4vc2NoZW1hL2FyZy1zcGVjJykuQXJnU3BlY30gKi8gKGdldEFyZ1NwZWMoa2V5KSk7XG4gICAgICAgICAgXy5zZXQodW5wYWNrZWQsIGRlc3QsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueXRoaW5nIHRoYXQgX2lzbid0XyBhIHNlcnZlciBhcmdcbiAgICAgICAgICB1bnBhY2tlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucGFja2VkO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSBgZXhpdCgpYCBtZXRob2Qgb2YgdGhlIHBhcnNlciB0byB0aHJvdyBhbiBlcnJvciwgc28gd2UgY2FuIGhhbmRsZSBpdCBtYW51YWxseS5cbiAgICogQHBhcmFtIHtBcmd1bWVudFBhcnNlcn0gcGFyc2VyXG4gICAqL1xuICBzdGF0aWMgX3BhdGNoRXhpdChwYXJzZXIpIHtcbiAgICBwYXJzZXIuZXhpdCA9IChjb2RlLCBtc2cpID0+IHtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYXJncGFyc2UnKS5TdWJQYXJzZXJ9IHN1YlBhcnNlclxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL2FyZ3MnKS5Bcmd1bWVudERlZmluaXRpb25zfVxuICAgKi9cbiAgc3RhdGljIF9hZGRTZXJ2ZXJUb1BhcnNlcihzdWJQYXJzZXIpIHtcbiAgICBjb25zdCBzZXJ2ZXJQYXJzZXIgPSBzdWJQYXJzZXIuYWRkX3BhcnNlcignc2VydmVyJywge1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBoZWxwOiAnUnVuIGFuIEFwcGl1bSBzZXJ2ZXInLFxuICAgIH0pO1xuXG4gICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQoc2VydmVyUGFyc2VyKTtcblxuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBnZXRTZXJ2ZXJBcmdzKCk7XG4gICAgZm9yIChjb25zdCBbZmxhZ3NPck5hbWVzLCBvcHRzXSBvZiBzZXJ2ZXJBcmdzKSB7XG4gICAgICAvLyBUUyBkb2Vzbid0IGxpa2UgdGhlIHNwcmVhZCBvcGVyYXRvciBoZXJlLlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgc2VydmVyUGFyc2VyLmFkZF9hcmd1bWVudCguLi5mbGFnc09yTmFtZXMsIHsuLi5vcHRzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZlckFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBleHRlbnNpb24gc3ViLXN1Yi1jb21tYW5kcyB0byBgZHJpdmVyYC9gcGx1Z2luYCBzdWJjb21tYW5kc1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnYXJncGFyc2UnKS5TdWJQYXJzZXJ9IHN1YlBhcnNlcnNcbiAgICovXG4gIHN0YXRpYyBfYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlcihzdWJQYXJzZXJzKSB7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVdKSB7XG4gICAgICBjb25zdCBleHRQYXJzZXIgPSBzdWJQYXJzZXJzLmFkZF9wYXJzZXIodHlwZSwge1xuICAgICAgICBhZGRfaGVscDogdHJ1ZSxcbiAgICAgICAgaGVscDogYEFjY2VzcyB0aGUgJHt0eXBlfSBtYW5hZ2VtZW50IENMSSBjb21tYW5kc2AsXG4gICAgICB9KTtcblxuICAgICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQoZXh0UGFyc2VyKTtcblxuICAgICAgY29uc3QgZXh0U3ViUGFyc2VycyA9IGV4dFBhcnNlci5hZGRfc3VicGFyc2Vycyh7XG4gICAgICAgIGRlc3Q6IGAke3R5cGV9Q29tbWFuZGAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbkFyZ3MgPSBnZXRFeHRlbnNpb25BcmdzKCk7XG4gICAgICBjb25zdCBwYXJzZXJTcGVjcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdsaXN0JyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLmxpc3QsXG4gICAgICAgICAgaGVscDogYExpc3QgYXZhaWxhYmxlIGFuZCBpbnN0YWxsZWQgJHt0eXBlfXNgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ2luc3RhbGwnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0uaW5zdGFsbCxcbiAgICAgICAgICBoZWxwOiBgSW5zdGFsbCBhICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ3VuaW5zdGFsbCcsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51bmluc3RhbGwsXG4gICAgICAgICAgaGVscDogYFVuaW5zdGFsbCBhICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ3VwZGF0ZScsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51cGRhdGUsXG4gICAgICAgICAgaGVscDogYFVwZGF0ZSBpbnN0YWxsZWQgJHt0eXBlfXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdydW4nLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0ucnVuLFxuICAgICAgICAgIGhlbHA6XG4gICAgICAgICAgICBgUnVuIGEgc2NyaXB0IChkZWZpbmVkIGluc2lkZSB0aGUgJHt0eXBlfSdzIHBhY2thZ2UuanNvbiB1bmRlciB0aGUgYCArXG4gICAgICAgICAgICBg4oCcc2NyaXB0c+KAnSBmaWVsZCBpbnNpZGUgdGhlIOKAnGFwcGl1beKAnSBmaWVsZCkgZnJvbSBhbiBpbnN0YWxsZWQgJHt0eXBlfWAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IHtjb21tYW5kLCBhcmdzLCBoZWxwfSBvZiBwYXJzZXJTcGVjcykge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBleHRTdWJQYXJzZXJzLmFkZF9wYXJzZXIoY29tbWFuZCwge2hlbHB9KTtcblxuICAgICAgICBBcmdQYXJzZXIuX3BhdGNoRXhpdChwYXJzZXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZsYWdzT3JOYW1lcywgb3B0c10gb2YgYXJncykge1xuICAgICAgICAgIC8vIGFkZF9hcmd1bWVudCBtdXRhdGVzIHBhcmFtcyBzbyBtYWtlIHN1cmUgdG8gc2VuZCBpbiBjb3BpZXMgaW5zdGVhZFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KC4uLmZsYWdzT3JOYW1lcywgey4uLm9wdHN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgQXJnUGFyc2VyfSBpbnN0YW5jZTsgZmluYWxpemVzIHRoZSBjb25maWcgc2NoZW1hLlxuICpcbiAqIEBjb25zdHJ1Y3RzIEFyZ1BhcnNlclxuICogQHBhcmFtIHtib29sZWFufSBbZGVidWddIC0gSWYgYHRydWVgLCB0aHJvdyBpbnN0ZWFkIG9mIGV4aXQgdXBvbiBwYXJzaW5nIGVycm9yXG4gKiBAcmV0dXJucyB7QXJnUGFyc2VyfVxuICovXG5mdW5jdGlvbiBnZXRQYXJzZXIoZGVidWcpIHtcbiAgZmluYWxpemVTY2hlbWEoKTtcblxuICByZXR1cm4gbmV3IEFyZ1BhcnNlcihkZWJ1Zyk7XG59XG5cbmV4cG9ydCB7Z2V0UGFyc2VyLCBBcmdQYXJzZXJ9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQSxNQUFNQSxlQUFlLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUN0QixJQUFJQyxHQUFKLENBQVEsQ0FBQ0Msc0JBQUQsRUFBY0Msc0JBQWQsRUFBMkJDLDRCQUEzQixFQUE4QyxJQUE5QyxFQUFvRCxRQUFwRCxFQUE4RCxJQUE5RCxFQUFvRSxXQUFwRSxDQUFSLENBRHNCLENBQXhCOztBQUlBLE1BQU1DLE9BQU8sR0FBR0MsV0FBQSxDQUFHQyxtQkFBSCxDQUF1QkMsZUFBdkIsRUFBZ0NILE9BQWhEOztBQVNBLE1BQU1JLFNBQU4sQ0FBZ0I7RUFJZEMsV0FBVyxDQUFDQyxLQUFLLEdBQUcsS0FBVCxFQUFnQjtJQUN6QixNQUFNQyxJQUFJLEdBQUdDLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLENBQWIsSUFBa0JDLGFBQUEsQ0FBS0MsUUFBTCxDQUFjSCxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiLENBQWQsQ0FBbEIsR0FBbUQsUUFBaEU7SUFDQSxNQUFNRyxNQUFNLEdBQUcsSUFBSUMsd0JBQUosQ0FBbUI7TUFDaENDLFFBQVEsRUFBRSxJQURzQjtNQUVoQ0MsV0FBVyxFQUNULDZIQUg4QjtNQUloQ1I7SUFKZ0MsQ0FBbkIsQ0FBZjs7SUFPQUgsU0FBUyxDQUFDWSxVQUFWLENBQXFCSixNQUFyQjs7SUFNQSxLQUFLTCxJQUFMLEdBQVlBLElBQVo7SUFNQSxLQUFLRCxLQUFMLEdBQWFBLEtBQWI7SUFNQSxLQUFLTSxNQUFMLEdBQWNBLE1BQWQ7SUFFQUEsTUFBTSxDQUFDSyxZQUFQLENBQW9CLElBQXBCLEVBQTBCLFdBQTFCLEVBQXVDO01BQ3JDQyxNQUFNLEVBQUUsU0FENkI7TUFFckNsQjtJQUZxQyxDQUF2QztJQUtBLE1BQU1tQixVQUFVLEdBQUdQLE1BQU0sQ0FBQ1EsY0FBUCxDQUFzQjtNQUFDQyxJQUFJLEVBQUU7SUFBUCxDQUF0QixDQUFuQjs7SUFLQSxNQUFNQyxVQUFVLEdBQUdsQixTQUFTLENBQUNtQixrQkFBVixDQUE2QkosVUFBN0IsQ0FBbkI7O0lBRUEsS0FBS0ssT0FBTCxHQUFlRixVQUFmOztJQUdBbEIsU0FBUyxDQUFDcUIsNkJBQVYsQ0FBd0NOLFVBQXhDOztJQU1BLEtBQUtPLFVBQUwsR0FBa0IsS0FBS0MsU0FBdkI7RUFDRDs7RUFZREEsU0FBUyxDQUFDQyxJQUFJLEdBQUdwQixPQUFPLENBQUNDLElBQVIsQ0FBYW9CLEtBQWIsQ0FBbUIsQ0FBbkIsQ0FBUixFQUErQjtJQUN0QyxJQUFJLENBQUNwQyxlQUFlLENBQUNxQyxHQUFoQixDQUFvQkYsSUFBSSxDQUFDLENBQUQsQ0FBeEIsQ0FBTCxFQUFtQztNQUNqQ0EsSUFBSSxDQUFDRyxPQUFMLENBQWFoQyw0QkFBYjtJQUNEOztJQUVELElBQUk7TUFDRixNQUFNaUMsTUFBTSxHQUFHLEtBQUtwQixNQUFMLENBQVljLFVBQVosQ0FBdUJFLElBQXZCLENBQWY7TUFDQSxPQUFPeEIsU0FBUyxDQUFDNkIsb0JBQVYsQ0FBK0JELE1BQS9CLENBQVA7SUFDRCxDQUhELENBR0UsT0FBT0UsR0FBUCxFQUFZO01BQ1osSUFBSSxLQUFLNUIsS0FBVCxFQUFnQjtRQUNkLE1BQU00QixHQUFOO01BQ0Q7O01BSUQ7UUFFRUMsT0FBTyxDQUFDQyxLQUFSO1FBRUFELE9BQU8sQ0FBQ0MsS0FBUixDQUFjRixHQUFHLENBQUNHLE9BQWxCO1FBQ0E3QixPQUFPLENBQUM4QixJQUFSLENBQWEsQ0FBYjtNQUNEO0lBQ0Y7RUFDRjs7RUFXMEIsT0FBcEJMLG9CQUFvQixDQUFDTCxJQUFELEVBQU87SUFDaEMsT0FBT1csZUFBQSxDQUFFQyxNQUFGLENBQ0xaLElBREssRUFFTCxDQUFDYSxRQUFELEVBQVdDLEtBQVgsRUFBa0JDLEdBQWxCLEtBQTBCO01BQ3hCLElBQUksQ0FBQ0osZUFBQSxDQUFFSyxXQUFGLENBQWNGLEtBQWQsQ0FBRCxJQUF5QixJQUFBRyxrQkFBQSxFQUFXRixHQUFYLENBQTdCLEVBQThDO1FBQzVDLE1BQU07VUFBQ3RCO1FBQUQsSUFBOEQsSUFBQXlCLGtCQUFBLEVBQVdILEdBQVgsQ0FBcEU7O1FBQ0FKLGVBQUEsQ0FBRVEsR0FBRixDQUFNTixRQUFOLEVBQWdCcEIsSUFBaEIsRUFBc0JxQixLQUF0QjtNQUNELENBSEQsTUFHTztRQUVMRCxRQUFRLENBQUNFLEdBQUQsQ0FBUixHQUFnQkQsS0FBaEI7TUFDRDs7TUFDRCxPQUFPRCxRQUFQO0lBQ0QsQ0FYSSxFQVlMLEVBWkssQ0FBUDtFQWNEOztFQU1nQixPQUFWekIsVUFBVSxDQUFDSixNQUFELEVBQVM7SUFDeEJBLE1BQU0sQ0FBQzBCLElBQVAsR0FBYyxDQUFDVSxJQUFELEVBQU9DLEdBQVAsS0FBZTtNQUMzQixJQUFJRCxJQUFKLEVBQVU7UUFDUixNQUFNLElBQUlFLEtBQUosQ0FBVUQsR0FBVixDQUFOO01BQ0Q7O01BQ0R6QyxPQUFPLENBQUM4QixJQUFSO0lBQ0QsQ0FMRDtFQU1EOztFQU93QixPQUFsQmYsa0JBQWtCLENBQUM0QixTQUFELEVBQVk7SUFDbkMsTUFBTUMsWUFBWSxHQUFHRCxTQUFTLENBQUNFLFVBQVYsQ0FBcUIsUUFBckIsRUFBK0I7TUFDbER2QyxRQUFRLEVBQUUsSUFEd0M7TUFFbER3QyxJQUFJLEVBQUU7SUFGNEMsQ0FBL0IsQ0FBckI7O0lBS0FsRCxTQUFTLENBQUNZLFVBQVYsQ0FBcUJvQyxZQUFyQjs7SUFFQSxNQUFNOUIsVUFBVSxHQUFHLElBQUFpQyxtQkFBQSxHQUFuQjs7SUFDQSxLQUFLLE1BQU0sQ0FBQ0MsWUFBRCxFQUFlQyxJQUFmLENBQVgsSUFBbUNuQyxVQUFuQyxFQUErQztNQUc3QzhCLFlBQVksQ0FBQ25DLFlBQWIsQ0FBMEIsR0FBR3VDLFlBQTdCLEVBQTJDLEVBQUMsR0FBR0M7TUFBSixDQUEzQztJQUNEOztJQUVELE9BQU9uQyxVQUFQO0VBQ0Q7O0VBTW1DLE9BQTdCRyw2QkFBNkIsQ0FBQ04sVUFBRCxFQUFhO0lBQy9DLEtBQUssTUFBTXVDLElBQVgsSUFBbUIsQ0FBQzdELHNCQUFELEVBQWNDLHNCQUFkLENBQW5CLEVBQStDO01BQzdDLE1BQU02RCxTQUFTLEdBQUd4QyxVQUFVLENBQUNrQyxVQUFYLENBQXNCSyxJQUF0QixFQUE0QjtRQUM1QzVDLFFBQVEsRUFBRSxJQURrQztRQUU1Q3dDLElBQUksRUFBRyxjQUFhSSxJQUFLO01BRm1CLENBQTVCLENBQWxCOztNQUtBdEQsU0FBUyxDQUFDWSxVQUFWLENBQXFCMkMsU0FBckI7O01BRUEsTUFBTUMsYUFBYSxHQUFHRCxTQUFTLENBQUN2QyxjQUFWLENBQXlCO1FBQzdDQyxJQUFJLEVBQUcsR0FBRXFDLElBQUs7TUFEK0IsQ0FBekIsQ0FBdEI7TUFHQSxNQUFNRyxhQUFhLEdBQUcsSUFBQUMsc0JBQUEsR0FBdEI7TUFDQSxNQUFNQyxXQUFXLEdBQUcsQ0FDbEI7UUFDRUMsT0FBTyxFQUFFLE1BRFg7UUFFRXBDLElBQUksRUFBRWlDLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CTyxJQUY1QjtRQUdFWCxJQUFJLEVBQUcsZ0NBQStCSSxJQUFLO01BSDdDLENBRGtCLEVBTWxCO1FBQ0VNLE9BQU8sRUFBRSxTQURYO1FBRUVwQyxJQUFJLEVBQUVpQyxhQUFhLENBQUNILElBQUQsQ0FBYixDQUFvQlEsT0FGNUI7UUFHRVosSUFBSSxFQUFHLGFBQVlJLElBQUs7TUFIMUIsQ0FOa0IsRUFXbEI7UUFDRU0sT0FBTyxFQUFFLFdBRFg7UUFFRXBDLElBQUksRUFBRWlDLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CUyxTQUY1QjtRQUdFYixJQUFJLEVBQUcsZUFBY0ksSUFBSztNQUg1QixDQVhrQixFQWdCbEI7UUFDRU0sT0FBTyxFQUFFLFFBRFg7UUFFRXBDLElBQUksRUFBRWlDLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CVSxNQUY1QjtRQUdFZCxJQUFJLEVBQUcsb0JBQW1CSSxJQUFLO01BSGpDLENBaEJrQixFQXFCbEI7UUFDRU0sT0FBTyxFQUFFLEtBRFg7UUFFRXBDLElBQUksRUFBRWlDLGFBQWEsQ0FBQ0gsSUFBRCxDQUFiLENBQW9CVyxHQUY1QjtRQUdFZixJQUFJLEVBQ0Qsb0NBQW1DSSxJQUFLLDRCQUF6QyxHQUNDLGdFQUErREEsSUFBSztNQUx6RSxDQXJCa0IsQ0FBcEI7O01BOEJBLEtBQUssTUFBTTtRQUFDTSxPQUFEO1FBQVVwQyxJQUFWO1FBQWdCMEI7TUFBaEIsQ0FBWCxJQUFvQ1MsV0FBcEMsRUFBaUQ7UUFDL0MsTUFBTW5ELE1BQU0sR0FBR2dELGFBQWEsQ0FBQ1AsVUFBZCxDQUF5QlcsT0FBekIsRUFBa0M7VUFBQ1Y7UUFBRCxDQUFsQyxDQUFmOztRQUVBbEQsU0FBUyxDQUFDWSxVQUFWLENBQXFCSixNQUFyQjs7UUFFQSxLQUFLLE1BQU0sQ0FBQzRDLFlBQUQsRUFBZUMsSUFBZixDQUFYLElBQW1DN0IsSUFBbkMsRUFBeUM7VUFHdkNoQixNQUFNLENBQUNLLFlBQVAsQ0FBb0IsR0FBR3VDLFlBQXZCLEVBQXFDLEVBQUMsR0FBR0M7VUFBSixDQUFyQztRQUNEO01BQ0Y7SUFDRjtFQUNGOztBQXJOYTs7OztBQStOaEIsU0FBU2EsU0FBVCxDQUFtQmhFLEtBQW5CLEVBQTBCO0VBQ3hCLElBQUFpRSxzQkFBQTtFQUVBLE9BQU8sSUFBSW5FLFNBQUosQ0FBY0UsS0FBZCxDQUFQO0FBQ0QifQ==
204
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFWFRSQV9BUkdTIiwiTk9OX1NFUlZFUl9BUkdTIiwiT2JqZWN0IiwiZnJlZXplIiwiU2V0IiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsIlNFUlZFUl9TVUJDT01NQU5EIiwidmVyc2lvbiIsImZzIiwicmVhZFBhY2thZ2VKc29uRnJvbSIsInJvb3REaXIiLCJBcmdQYXJzZXIiLCJjb25zdHJ1Y3RvciIsImRlYnVnIiwicHJvZyIsInByb2Nlc3MiLCJhcmd2IiwicGF0aCIsImJhc2VuYW1lIiwicGFyc2VyIiwiQXJndW1lbnRQYXJzZXIiLCJhZGRfaGVscCIsImRlc2NyaXB0aW9uIiwiX3BhdGNoRXhpdCIsImFkZF9hcmd1bWVudCIsImFjdGlvbiIsInN1YlBhcnNlcnMiLCJhZGRfc3VicGFyc2VycyIsImRlc3QiLCJzZXJ2ZXJBcmdzIiwiX2FkZFNlcnZlclRvUGFyc2VyIiwicmF3QXJncyIsIl9hZGRFeHRlbnNpb25Db21tYW5kc1RvUGFyc2VyIiwicGFyc2VfYXJncyIsInBhcnNlQXJncyIsImFyZ3MiLCJzbGljZSIsImhhcyIsInVuc2hpZnQiLCJwYXJzZWQiLCJwYXJzZV9rbm93bl9hcmdzIiwia25vd25BcmdzIiwidW5rbm93bkFyZ3MiLCJsZW5ndGgiLCJkcml2ZXJDb21tYW5kIiwicGx1Z2luQ29tbWFuZCIsIl90cmFuc2Zvcm1QYXJzZWRBcmdzIiwiRXJyb3IiLCJqb2luIiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwibWVzc2FnZSIsImV4aXQiLCJyZXN1bHQiLCJfIiwicmVkdWNlIiwidW5wYWNrZWQiLCJ2YWx1ZSIsImtleSIsImlzVW5kZWZpbmVkIiwiaGFzQXJnU3BlYyIsImdldEFyZ1NwZWMiLCJzZXQiLCJjb2RlIiwibXNnIiwic3ViUGFyc2VyIiwic2VydmVyUGFyc2VyIiwiYWRkX3BhcnNlciIsImhlbHAiLCJnZXRTZXJ2ZXJBcmdzIiwiZmxhZ3NPck5hbWVzIiwib3B0cyIsInR5cGUiLCJleHRQYXJzZXIiLCJleHRTdWJQYXJzZXJzIiwiZXh0ZW5zaW9uQXJncyIsImdldEV4dGVuc2lvbkFyZ3MiLCJwYXJzZXJTcGVjcyIsImNvbW1hbmQiLCJsaXN0IiwiaW5zdGFsbCIsInVuaW5zdGFsbCIsInVwZGF0ZSIsInJ1biIsImdldFBhcnNlciIsImZpbmFsaXplU2NoZW1hIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NsaS9wYXJzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtmc30gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7QXJndW1lbnRQYXJzZXJ9IGZyb20gJ2FyZ3BhcnNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7RFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFLCBTRVJWRVJfU1VCQ09NTUFORH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZmluYWxpemVTY2hlbWEsIGdldEFyZ1NwZWMsIGhhc0FyZ1NwZWN9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQge3Jvb3REaXJ9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge2dldEV4dGVuc2lvbkFyZ3MsIGdldFNlcnZlckFyZ3N9IGZyb20gJy4vYXJncyc7XG5cbmV4cG9ydCBjb25zdCBFWFRSQV9BUkdTID0gJ2V4dHJhQXJncyc7XG5cbi8qKlxuICogSWYgdGhlIHBhcnNlZCBhcmdzIGRvIG5vdCBjb250YWluIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRoZW4gd2VcbiAqIHdpbGwgYXV0b21hdGlhbGx5IGluamVjdCB0aGUgYHNlcnZlcmAgc3ViY29tbWFuZC5cbiAqL1xuY29uc3QgTk9OX1NFUlZFUl9BUkdTID0gT2JqZWN0LmZyZWV6ZShcbiAgbmV3IFNldChbRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFLCBTRVJWRVJfU1VCQ09NTUFORCwgJy1oJywgJy0taGVscCcsICctdicsICctLXZlcnNpb24nXSlcbik7XG5cbmNvbnN0IHZlcnNpb24gPSBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKHJvb3REaXIpLnZlcnNpb247XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBgYXJncGFyc2VgXG4gKlxuICogLSBIYW5kbGVzIGluc3RhbnRpYXRpb24sIGNvbmZpZ3VyYXRpb24sIGFuZCBtb25rZXlwYXRjaGluZyBvZiBhblxuICogICAgYEFyZ3VtZW50UGFyc2VyYCBpbnN0YW5jZSBmb3IgQXBwaXVtIHNlcnZlciBhbmQgaXRzIGV4dGVuc2lvbnNcbiAqIC0gSGFuZGxlcyBlcnJvciBjb25kaXRpb25zLCBtZXNzYWdlcywgYW5kIGV4aXQgYmVoYXZpb3JcbiAqL1xuY2xhc3MgQXJnUGFyc2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlYnVnXSAtIElmIHRydWUsIHRocm93IGluc3RlYWQgb2YgZXhpdCBvbiBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRlYnVnID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm9nID0gcHJvY2Vzcy5hcmd2WzFdID8gcGF0aC5iYXNlbmFtZShwcm9jZXNzLmFyZ3ZbMV0pIDogJ2FwcGl1bSc7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IEFyZ3VtZW50UGFyc2VyKHtcbiAgICAgIGFkZF9oZWxwOiB0cnVlLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdBIHdlYmRyaXZlci1jb21wYXRpYmxlIHNlcnZlciB0aGF0IGZhY2lsaXRhdGVzIGF1dG9tYXRpb24gb2Ygd2ViLCBtb2JpbGUsIGFuZCBvdGhlciB0eXBlcyBvZiBhcHBzIGFjcm9zcyB2YXJpb3VzIHBsYXRmb3Jtcy4nLFxuICAgICAgcHJvZyxcbiAgICB9KTtcblxuICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KHBhcnNlcik7XG5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtIG5hbWUgKHR5cGljYWxseSBgYXBwaXVtYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMucHJvZyA9IHByb2c7XG5cbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRocm93IGFuIGVycm9yIG9uIHBhcnNlIGZhaWx1cmUgaW5zdGVhZCBvZiBwcmludGluZyBoZWxwXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuXG4gICAgLyoqXG4gICAgICogV3JhcHBlZCBgQXJndW1lbnRQYXJzZXJgIGluc3RhbmNlXG4gICAgICogQHR5cGUge0FyZ3VtZW50UGFyc2VyfVxuICAgICAqL1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuXG4gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJzaW9uJywge1xuICAgICAgYWN0aW9uOiAndmVyc2lvbicsXG4gICAgICB2ZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3ViUGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2Vycyh7ZGVzdDogJ3N1YmNvbW1hbmQnfSk7XG5cbiAgICAvLyBhZGQgdGhlICdzZXJ2ZXInIHN1YmNvbW1hbmQsIGFuZCBzdG9yZSB0aGUgcmF3IGFyZ3VtZW50cyBvbiB0aGUgcGFyc2VyXG4gICAgLy8gb2JqZWN0IGFzIGEgd2F5IGZvciBvdGhlciBwYXJ0cyBvZiB0aGUgY29kZSB0byB3b3JrIHdpdGggdGhlIGFyZ3VtZW50c1xuICAgIC8vIGNvbmNlcHR1YWxseSByYXRoZXIgdGhhbiBqdXN0IHRocm91Z2ggYXJncGFyc2VcbiAgICBjb25zdCBzZXJ2ZXJBcmdzID0gQXJnUGFyc2VyLl9hZGRTZXJ2ZXJUb1BhcnNlcihzdWJQYXJzZXJzKTtcblxuICAgIHRoaXMucmF3QXJncyA9IHNlcnZlckFyZ3M7XG5cbiAgICAvLyBhZGQgdGhlICdkcml2ZXInIGFuZCAncGx1Z2luJyBzdWJjb21tYW5kc1xuICAgIEFyZ1BhcnNlci5fYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlcihzdWJQYXJzZXJzKTtcblxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IC8gZHJvcC1pbiB3cmFwcGVyXG4gICAgLyoqXG4gICAgICogQHR5cGUge0FyZ1BhcnNlclsncGFyc2VBcmdzJ119XG4gICAgICovXG4gICAgdGhpcy5wYXJzZV9hcmdzID0gdGhpcy5wYXJzZUFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYXJndW1lbnRzIGZyb20gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogSWYgbm8gc3ViY29tbWFuZCBpcyBwYXNzZWQgaW4sIHRoaXMgbWV0aG9kIHdpbGwgaW5qZWN0IHRoZSBgc2VydmVyYCBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBgQXJnUGFyc2VyLnByb3RvdHlwZS5wYXJzZV9hcmdzYCBpcyBhbiBhbGlhcyBvZiB0aGlzIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIFtUPWltcG9ydCgnYXBwaXVtL3R5cGVzJykuV2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzXSAtIEFycmF5IG9mIGFyZ3VtZW50cywgb3N0ZW5zaWJseSBmcm9tIGBwcm9jZXNzLmFyZ3ZgLiBHYXRoZXJzIGFyZ3MgZnJvbSBgcHJvY2Vzcy5hcmd2YCBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8VD59IC0gVGhlIHBhcnNlZCBhcmd1bWVudHNcbiAgICovXG4gIHBhcnNlQXJncyhhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpKSB7XG4gICAgaWYgKCFOT05fU0VSVkVSX0FSR1MuaGFzKGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzLnVuc2hpZnQoU0VSVkVSX1NVQkNPTU1BTkQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlci5wYXJzZV9rbm93bl9hcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgW2tub3duQXJncywgdW5rbm93bkFyZ3NdID0gcGFyc2VkO1xuICAgICAgaWYgKFxuICAgICAgICB1bmtub3duQXJncz8ubGVuZ3RoICYmXG4gICAgICAgIChrbm93bkFyZ3MuZHJpdmVyQ29tbWFuZCA9PT0gJ3J1bicgfHwga25vd25BcmdzLnBsdWdpbkNvbW1hbmQgPT09ICdydW4nKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBBcmdQYXJzZXIuX3RyYW5zZm9ybVBhcnNlZEFyZ3Moa25vd25BcmdzLCB1bmtub3duQXJncyk7XG4gICAgICB9IGVsc2UgaWYgKHVua25vd25BcmdzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbRVJST1JdIFVucmVjb2duaXplZCBhcmd1bWVudHM6ICR7dW5rbm93bkFyZ3Muam9pbignICcpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEFyZ1BhcnNlci5fdHJhbnNmb3JtUGFyc2VkQXJncyhrbm93bkFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gdGhpcyBpc24ndCB0ZXN0ZWQgdmlhIHVuaXQgdGVzdHMgKHdlIHVzZSBgZGVidWc6IHRydWVgKSBzbyBtYXkgZXNjYXBlIGNvdmVyYWdlLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKCk7IC8vIG5lZWQgYW4gZXh0cmEgc3BhY2Ugc2luY2UgYXJncGFyc2UgcHJpbnRzIHVzYWdlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBvYmplY3QgZnVsbCBvZiBhcmd1bWVudHMgYXMgcmV0dXJuZWQgYnkgYGFyZ3BhcnNlci5wYXJzZV9hcmdzYCxcbiAgICogZXhwYW5kIHRoZSBvbmVzIGZvciBleHRlbnNpb25zIGludG8gYSBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZSBhbmQgcmVuYW1lXG4gICAqIGtleXMgdG8gbWF0Y2ggdGhlIGludGVuZGVkIGRlc3RpbmF0aW9uLlxuICAgKlxuICAgKiBFLmcuLCBgeydkcml2ZXItZm9vLWJhcic6IGJhen1gIGJlY29tZXMgYHtkcml2ZXI6IHtmb286IHtiYXI6ICdiYXonfX19YFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdW5rbm93bkFyZ3NdXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBzdGF0aWMgX3RyYW5zZm9ybVBhcnNlZEFyZ3MoYXJncywgdW5rbm93bkFyZ3MgPSBbXSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IF8ucmVkdWNlKFxuICAgICAgYXJncyxcbiAgICAgICh1bnBhY2tlZCwgdmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodmFsdWUpICYmIGhhc0FyZ1NwZWMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IHtkZXN0fSA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9zY2hlbWEvYXJnLXNwZWMnKS5BcmdTcGVjfSAqLyAoZ2V0QXJnU3BlYyhrZXkpKTtcbiAgICAgICAgICBfLnNldCh1bnBhY2tlZCwgZGVzdCwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYW55dGhpbmcgdGhhdCBfaXNuJ3RfIGEgc2VydmVyIGFyZ1xuICAgICAgICAgIHVucGFja2VkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIHJlc3VsdFtFWFRSQV9BUkdTXSA9IHVua25vd25BcmdzO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgYGV4aXQoKWAgbWV0aG9kIG9mIHRoZSBwYXJzZXIgdG8gdGhyb3cgYW4gZXJyb3IsIHNvIHdlIGNhbiBoYW5kbGUgaXQgbWFudWFsbHkuXG4gICAqIEBwYXJhbSB7QXJndW1lbnRQYXJzZXJ9IHBhcnNlclxuICAgKi9cbiAgc3RhdGljIF9wYXRjaEV4aXQocGFyc2VyKSB7XG4gICAgcGFyc2VyLmV4aXQgPSAoY29kZSwgbXNnKSA9PiB7XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2FyZ3BhcnNlJykuU3ViUGFyc2VyfSBzdWJQYXJzZXJcbiAgICogQHJldHVybnMge2ltcG9ydCgnLi9hcmdzJykuQXJndW1lbnREZWZpbml0aW9uc31cbiAgICovXG4gIHN0YXRpYyBfYWRkU2VydmVyVG9QYXJzZXIoc3ViUGFyc2VyKSB7XG4gICAgY29uc3Qgc2VydmVyUGFyc2VyID0gc3ViUGFyc2VyLmFkZF9wYXJzZXIoJ3NlcnZlcicsIHtcbiAgICAgIGFkZF9oZWxwOiB0cnVlLFxuICAgICAgaGVscDogJ1J1biBhbiBBcHBpdW0gc2VydmVyJyxcbiAgICB9KTtcblxuICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KHNlcnZlclBhcnNlcik7XG5cbiAgICBjb25zdCBzZXJ2ZXJBcmdzID0gZ2V0U2VydmVyQXJncygpO1xuICAgIGZvciAoY29uc3QgW2ZsYWdzT3JOYW1lcywgb3B0c10gb2Ygc2VydmVyQXJncykge1xuICAgICAgLy8gVFMgZG9lc24ndCBsaWtlIHRoZSBzcHJlYWQgb3BlcmF0b3IgaGVyZS5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHNlcnZlclBhcnNlci5hZGRfYXJndW1lbnQoLi4uZmxhZ3NPck5hbWVzLCB7Li4ub3B0c30pO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXh0ZW5zaW9uIHN1Yi1zdWItY29tbWFuZHMgdG8gYGRyaXZlcmAvYHBsdWdpbmAgc3ViY29tbWFuZHNcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2FyZ3BhcnNlJykuU3ViUGFyc2VyfSBzdWJQYXJzZXJzXG4gICAqL1xuICBzdGF0aWMgX2FkZEV4dGVuc2lvbkNvbW1hbmRzVG9QYXJzZXIoc3ViUGFyc2Vycykge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiAvKiogQHR5cGUge1tEcml2ZXJUeXBlLCBQbHVnaW5UeXBlXX0gKi8gKFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVdKSkge1xuICAgICAgY29uc3QgZXh0UGFyc2VyID0gc3ViUGFyc2Vycy5hZGRfcGFyc2VyKHR5cGUsIHtcbiAgICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICAgIGhlbHA6IGBBY2Nlc3MgdGhlICR7dHlwZX0gbWFuYWdlbWVudCBDTEkgY29tbWFuZHNgLFxuICAgICAgfSk7XG5cbiAgICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KGV4dFBhcnNlcik7XG5cbiAgICAgIGNvbnN0IGV4dFN1YlBhcnNlcnMgPSBleHRQYXJzZXIuYWRkX3N1YnBhcnNlcnMoe1xuICAgICAgICBkZXN0OiBgJHt0eXBlfUNvbW1hbmRgLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRlbnNpb25BcmdzID0gZ2V0RXh0ZW5zaW9uQXJncygpO1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7IHtjb21tYW5kOiBpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkNsaUV4dGVuc2lvblN1YmNvbW1hbmQsIGFyZ3M6IGltcG9ydCgnLi9hcmdzJykuQXJndW1lbnREZWZpbml0aW9ucywgaGVscDogc3RyaW5nfVtdIH1cbiAgICAgICAqL1xuICAgICAgY29uc3QgcGFyc2VyU3BlY3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAnbGlzdCcsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS5saXN0LFxuICAgICAgICAgIGhlbHA6IGBMaXN0IGF2YWlsYWJsZSBhbmQgaW5zdGFsbGVkICR7dHlwZX1zYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICdpbnN0YWxsJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLmluc3RhbGwsXG4gICAgICAgICAgaGVscDogYEluc3RhbGwgYSAke3R5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICd1bmluc3RhbGwnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0udW5pbnN0YWxsLFxuICAgICAgICAgIGhlbHA6IGBVbmluc3RhbGwgYSAke3R5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1hbmQ6ICd1cGRhdGUnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0udXBkYXRlLFxuICAgICAgICAgIGhlbHA6IGBVcGRhdGUgaW5zdGFsbGVkICR7dHlwZX1zIHRvIHRoZSBsYXRlc3QgdmVyc2lvbmAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAncnVuJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLnJ1bixcbiAgICAgICAgICBoZWxwOlxuICAgICAgICAgICAgYFJ1biBhIHNjcmlwdCAoZGVmaW5lZCBpbnNpZGUgdGhlICR7dHlwZX0ncyBwYWNrYWdlLmpzb24gdW5kZXIgdGhlIGAgK1xuICAgICAgICAgICAgYOKAnHNjcmlwdHPigJ0gZmllbGQgaW5zaWRlIHRoZSDigJxhcHBpdW3igJ0gZmllbGQpIGZyb20gYW4gaW5zdGFsbGVkICR7dHlwZX1gLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCB7Y29tbWFuZCwgYXJncywgaGVscH0gb2YgcGFyc2VyU3BlY3MpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gZXh0U3ViUGFyc2Vycy5hZGRfcGFyc2VyKGNvbW1hbmQsIHtoZWxwfSk7XG5cbiAgICAgICAgQXJnUGFyc2VyLl9wYXRjaEV4aXQocGFyc2VyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmbGFnc09yTmFtZXMsIG9wdHNdIG9mIGFyZ3MpIHtcbiAgICAgICAgICAvLyBhZGRfYXJndW1lbnQgbXV0YXRlcyBwYXJhbXMgc28gbWFrZSBzdXJlIHRvIHNlbmQgaW4gY29waWVzIGluc3RlYWRcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCguLi5mbGFnc09yTmFtZXMsIHsuLi5vcHRzfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEFyZ1BhcnNlcn0gaW5zdGFuY2U7IGZpbmFsaXplcyB0aGUgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAY29uc3RydWN0cyBBcmdQYXJzZXJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlYnVnXSAtIElmIGB0cnVlYCwgdGhyb3cgaW5zdGVhZCBvZiBleGl0IHVwb24gcGFyc2luZyBlcnJvclxuICogQHJldHVybnMge0FyZ1BhcnNlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UGFyc2VyKGRlYnVnKSB7XG4gIGZpbmFsaXplU2NoZW1hKCk7XG5cbiAgcmV0dXJuIG5ldyBBcmdQYXJzZXIoZGVidWcpO1xufVxuXG5leHBvcnQge2dldFBhcnNlciwgQXJnUGFyc2VyfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7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
@@ -19,9 +19,10 @@ export default class PluginCommand extends ExtensionCommand<"plugin"> {
19
19
  plugin: any;
20
20
  unsafe: any;
21
21
  }): Promise<import("./extension-command").ExtensionUpdateResult>;
22
- run({ plugin, scriptName }: {
22
+ run({ plugin, scriptName, extraArgs }: {
23
23
  plugin: any;
24
24
  scriptName: any;
25
+ extraArgs: any;
25
26
  }): Promise<import("./extension-command").RunOutput>;
26
27
  getPostInstallText({ extName, extData }: {
27
28
  extName: any;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-command.d.ts","sourceRoot":"","sources":["../../../lib/cli/plugin-command.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IACE;;;OAGG;IACH,8BAFW,OAAO,qBAAqB,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAK3E;IAED;;;;mEAMC;IAED;;mEAEC;IAED;;;qEAEC;IAED;;;yDAEC;IAED;;;eAEC;CAyBF;yBAGY,OAAO,eAAe,EAAE,UAAU"}
1
+ {"version":3,"file":"plugin-command.d.ts","sourceRoot":"","sources":["../../../lib/cli/plugin-command.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IACE;;;OAGG;IACH,8BAFW,OAAO,qBAAqB,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAK3E;IAED;;;;mEAMC;IAED;;mEAEC;IAED;;;qEAEC;IAED;;;;yDAEC;IAED;;;eAEC;CAyBF;yBAGY,OAAO,eAAe,EAAE,UAAU"}