appium 2.0.0-beta.19 → 2.0.0-beta.22

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 (105) hide show
  1. package/build/check-npm-pack-files.js +23 -0
  2. package/build/commands-yml/parse.js +319 -0
  3. package/build/commands-yml/validator.js +130 -0
  4. package/build/index.js +19 -0
  5. package/build/lib/appium-config.schema.json +0 -0
  6. package/build/lib/appium.js +84 -69
  7. package/build/lib/cli/args.js +87 -223
  8. package/build/lib/cli/extension-command.js +2 -2
  9. package/build/lib/cli/extension.js +14 -6
  10. package/build/lib/cli/parser.js +146 -106
  11. package/build/lib/config-file.js +141 -0
  12. package/build/lib/config.js +28 -77
  13. package/build/lib/driver-config.js +41 -20
  14. package/build/lib/ext-config-io.js +165 -0
  15. package/build/lib/extension-config.js +110 -60
  16. package/build/lib/grid-register.js +19 -21
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +18 -9
  19. package/build/lib/schema/appium-config-schema.js +253 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +188 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +72 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +24 -33
  27. package/build/postinstall.js +90 -0
  28. package/build/test/cli/cli-e2e-specs.js +221 -0
  29. package/build/test/cli/cli-helpers.js +86 -0
  30. package/build/test/cli/cli-specs.js +71 -0
  31. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  32. package/build/test/cli/schema-args-specs.js +48 -0
  33. package/build/test/cli/schema-e2e-specs.js +47 -0
  34. package/build/test/config-e2e-specs.js +112 -0
  35. package/build/test/config-file-e2e-specs.js +209 -0
  36. package/build/test/config-file-specs.js +281 -0
  37. package/build/test/config-specs.js +159 -0
  38. package/build/test/driver-e2e-specs.js +435 -0
  39. package/build/test/driver-specs.js +321 -0
  40. package/build/test/ext-config-io-specs.js +181 -0
  41. package/build/test/extension-config-specs.js +365 -0
  42. package/build/test/fixtures/allow-feat.txt +5 -0
  43. package/build/test/fixtures/caps.json +3 -0
  44. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  45. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  46. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  47. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  48. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  49. package/build/test/fixtures/config/appium.config.good.js +40 -0
  50. package/build/test/fixtures/config/appium.config.good.json +33 -0
  51. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  52. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  53. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  54. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  55. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  56. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  57. package/build/test/fixtures/config/nodeconfig.json +3 -0
  58. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  59. package/build/test/fixtures/default-args.js +35 -0
  60. package/build/test/fixtures/deny-feat.txt +5 -0
  61. package/build/test/fixtures/driver.schema.js +20 -0
  62. package/build/test/fixtures/extensions.yaml +27 -0
  63. package/build/test/fixtures/flattened-schema.js +504 -0
  64. package/build/test/fixtures/plugin.schema.js +20 -0
  65. package/build/test/fixtures/schema-with-extensions.js +28 -0
  66. package/build/test/grid-register-specs.js +74 -0
  67. package/build/test/helpers.js +75 -0
  68. package/build/test/logger-specs.js +76 -0
  69. package/build/test/npm-specs.js +20 -0
  70. package/build/test/parser-specs.js +314 -0
  71. package/build/test/plugin-e2e-specs.js +316 -0
  72. package/build/test/schema/arg-spec-specs.js +70 -0
  73. package/build/test/schema/cli-args-specs.js +431 -0
  74. package/build/test/schema/schema-specs.js +389 -0
  75. package/build/test/utils-specs.js +266 -0
  76. package/index.js +11 -0
  77. package/lib/appium-config.schema.json +278 -0
  78. package/lib/appium.js +99 -75
  79. package/lib/cli/args.js +138 -335
  80. package/lib/cli/extension-command.js +7 -6
  81. package/lib/cli/extension.js +12 -4
  82. package/lib/cli/parser.js +251 -96
  83. package/lib/config-file.js +227 -0
  84. package/lib/config.js +63 -79
  85. package/lib/driver-config.js +66 -11
  86. package/lib/ext-config-io.js +287 -0
  87. package/lib/extension-config.js +209 -66
  88. package/lib/grid-register.js +24 -21
  89. package/lib/main.js +145 -71
  90. package/lib/plugin-config.js +33 -3
  91. package/lib/schema/appium-config-schema.js +287 -0
  92. package/lib/schema/arg-spec.js +222 -0
  93. package/lib/schema/cli-args.js +285 -0
  94. package/lib/schema/cli-transformers.js +123 -0
  95. package/lib/schema/index.js +2 -0
  96. package/lib/schema/keywords.js +135 -0
  97. package/lib/schema/schema.js +577 -0
  98. package/lib/utils.js +29 -52
  99. package/package.json +17 -16
  100. package/types/appium-config.d.ts +197 -0
  101. package/types/types.d.ts +201 -0
  102. package/build/lib/cli/argparse-actions.js +0 -104
  103. package/build/lib/cli/parser-helpers.js +0 -106
  104. package/lib/cli/argparse-actions.js +0 -77
  105. package/lib/cli/parser-helpers.js +0 -106
@@ -5,7 +5,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.AppiumDriver = void 0;
8
+ exports.NoDriverProxyCommandError = exports.AppiumDriver = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
11
 
10
12
  require("source-map-support/register");
11
13
 
@@ -19,8 +21,6 @@ var _drivers = require("./drivers");
19
21
 
20
22
  var _baseDriver = require("@appium/base-driver");
21
23
 
22
- var _bluebird = _interopRequireDefault(require("bluebird"));
23
-
24
24
  var _asyncLock = _interopRequireDefault(require("async-lock"));
25
25
 
26
26
  var _utils = require("./utils");
@@ -47,9 +47,11 @@ class AppiumDriver extends _baseDriver.BaseDriver {
47
47
  }
48
48
 
49
49
  super(args);
50
+ (0, _defineProperty2.default)(this, "driverConfig", void 0);
50
51
  this.desiredCapConstraints = desiredCapabilityConstraints;
51
52
  this.newCommandTimeoutMs = 0;
52
- this.args = Object.assign({}, args);
53
+ this.args = { ...args
54
+ };
53
55
  this.sessions = {};
54
56
  this.pendingDrivers = {};
55
57
  this.pluginClasses = [];
@@ -99,18 +101,13 @@ class AppiumDriver extends _baseDriver.BaseDriver {
99
101
  return (0, _drivers.findMatchingDriver)(...args);
100
102
  }
101
103
 
102
- assignCliArgsToExtension(extType, extName, extClass, extInstance) {
103
- const cliArgs = (0, _utils.getExtensionArgs)(this.args[`${extType}Args`], extName);
104
+ assignCliArgsToExtension(extType, extName, extInstance) {
105
+ var _this$args$extType;
104
106
 
105
- if (!_lodash.default.isEmpty(cliArgs)) {
106
- if (!_lodash.default.has(extClass, 'argsConstraints')) {
107
- throw new Error(`You sent in CLI args for the ${extName} ${extType}, but it ` + `does not define any`);
108
- }
107
+ const cliArgs = (_this$args$extType = this.args[extType]) === null || _this$args$extType === void 0 ? void 0 : _this$args$extType[extName];
109
108
 
110
- (0, _utils.validateExtensionArgs)(cliArgs, extClass.argsConstraints);
109
+ if (!_lodash.default.isEmpty(cliArgs)) {
111
110
  extInstance.cliArgs = cliArgs;
112
-
113
- _logger.default.debug(`Set CLI arguments on ${extName} ${extType} instance: ${JSON.stringify(cliArgs)}`);
114
111
  }
115
112
  }
116
113
 
@@ -180,7 +177,7 @@ class AppiumDriver extends _baseDriver.BaseDriver {
180
177
  driverInstance.allowInsecure = this.args.allowInsecure;
181
178
  }
182
179
 
183
- this.assignCliArgsToExtension('driver', driverName, InnerDriver, driverInstance);
180
+ this.assignCliArgsToExtension('driver', driverName, driverInstance);
184
181
  driverInstance.server = this.server;
185
182
 
186
183
  try {
@@ -236,8 +233,24 @@ class AppiumDriver extends _baseDriver.BaseDriver {
236
233
  }
237
234
 
238
235
  attachUnexpectedShutdownHandler(driver, innerSessionId) {
239
- const removeSessionFromMasterList = (cause = new Error('Unknown error')) => {
240
- _logger.default.warn(`Closing session, cause was '${cause.message}'`);
236
+ const onShutdown = (cause = new Error('Unknown error')) => {
237
+ _logger.default.warn(`Ending session, cause was '${cause.message}'`);
238
+
239
+ if (this.sessionPlugins[innerSessionId]) {
240
+ for (const plugin of this.sessionPlugins[innerSessionId]) {
241
+ if (_lodash.default.isFunction(plugin.onUnexpectedShutdown)) {
242
+ _logger.default.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
243
+
244
+ try {
245
+ plugin.onUnexpectedShutdown(driver, cause);
246
+ } catch (e) {
247
+ _logger.default.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
248
+ }
249
+ } else {
250
+ _logger.default.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
251
+ }
252
+ }
253
+ }
241
254
 
242
255
  _logger.default.info(`Removing session '${innerSessionId}' from our master session list`);
243
256
 
@@ -245,16 +258,8 @@ class AppiumDriver extends _baseDriver.BaseDriver {
245
258
  delete this.sessionPlugins[innerSessionId];
246
259
  };
247
260
 
248
- if (_lodash.default.isFunction((driver.onUnexpectedShutdown || {}).then)) {
249
- driver.onUnexpectedShutdown.then(() => {
250
- throw new Error('Unexpected shutdown');
251
- }).catch(e => {
252
- if (!(e instanceof _bluebird.default.CancellationError)) {
253
- removeSessionFromMasterList(e);
254
- }
255
- });
256
- } else if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
257
- driver.onUnexpectedShutdown(removeSessionFromMasterList);
261
+ if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
262
+ driver.onUnexpectedShutdown(onShutdown);
258
263
  } else {
259
264
  _logger.default.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
260
265
  }
@@ -337,50 +342,46 @@ class AppiumDriver extends _baseDriver.BaseDriver {
337
342
  }
338
343
 
339
344
  pluginsForSession(sessionId = null) {
340
- let plugins = [];
341
-
342
345
  if (sessionId) {
343
346
  if (!this.sessionPlugins[sessionId]) {
344
347
  this.sessionPlugins[sessionId] = this.createPluginInstances();
345
348
  }
346
349
 
347
- plugins = this.sessionPlugins[sessionId];
348
- } else {
349
- if (_lodash.default.isEmpty(this.sessionlessPlugins)) {
350
- this.sessionlessPlugins = this.createPluginInstances();
351
- }
350
+ return this.sessionPlugins[sessionId];
351
+ }
352
352
 
353
- plugins = this.sessionlessPlugins;
353
+ if (_lodash.default.isEmpty(this.sessionlessPlugins)) {
354
+ this.sessionlessPlugins = this.createPluginInstances();
354
355
  }
355
356
 
356
- return plugins;
357
+ return this.sessionlessPlugins;
357
358
  }
358
359
 
359
360
  pluginsToHandleCmd(cmd, sessionId = null) {
360
361
  return this.pluginsForSession(sessionId).filter(p => _lodash.default.isFunction(p[cmd]) || _lodash.default.isFunction(p.handle));
361
362
  }
362
363
 
363
- createPluginInstances(sessionId) {
364
- if (!sessionId) {
365
- sessionId = 'sessionless';
366
- }
367
-
368
- sessionId = _lodash.default.truncate(sessionId, {
369
- length: 11
370
- });
364
+ createPluginInstances() {
371
365
  return this.pluginClasses.map(PluginClass => {
372
- const generalName = PluginClass.pluginName;
373
- const name = `${generalName} (${sessionId})`;
366
+ const name = PluginClass.pluginName;
374
367
  const plugin = new PluginClass(name);
375
- this.assignCliArgsToExtension('plugin', generalName, PluginClass, plugin);
368
+ this.assignCliArgsToExtension('plugin', name, plugin);
376
369
  return plugin;
377
370
  });
378
371
  }
379
372
 
380
373
  async executeCommand(cmd, ...args) {
374
+ var _$last;
375
+
381
376
  const isGetStatus = cmd === 'getStatus';
382
377
  const isUmbrellaCmd = !isGetStatus && isAppiumDriverCommand(cmd);
383
378
  const isSessionCmd = !isGetStatus && !isUmbrellaCmd;
379
+ const reqForProxy = (_$last = _lodash.default.last(args)) === null || _$last === void 0 ? void 0 : _$last.reqForProxy;
380
+
381
+ if (reqForProxy) {
382
+ args.pop();
383
+ }
384
+
384
385
  let sessionId = null;
385
386
  let dstSession = null;
386
387
  let protocol = null;
@@ -407,6 +408,14 @@ class AppiumDriver extends _baseDriver.BaseDriver {
407
408
  plugins.length && _logger.default.info(`Executing default handling behavior for command '${cmd}'`);
408
409
  cmdHandledBy.default = true;
409
410
 
411
+ if (reqForProxy) {
412
+ if (!dstSession.proxyCommand) {
413
+ throw new NoDriverProxyCommandError();
414
+ }
415
+
416
+ return await dstSession.proxyCommand(reqForProxy.originalUrl, reqForProxy.method, reqForProxy.body);
417
+ }
418
+
410
419
  if (isGetStatus) {
411
420
  return await this.getStatus();
412
421
  }
@@ -430,10 +439,20 @@ class AppiumDriver extends _baseDriver.BaseDriver {
430
439
  wrappedCmd,
431
440
  protocol
432
441
  });
433
- plugins.length && this.logPluginHandlerReport({
442
+ this.logPluginHandlerReport(plugins, {
434
443
  cmd,
435
444
  cmdHandledBy
436
445
  });
446
+
447
+ if (cmd === _baseDriver.CREATE_SESSION_COMMAND && this.sessionlessPlugins.length && !res.error) {
448
+ const sessionId = _lodash.default.first(res.value);
449
+
450
+ _logger.default.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
451
+
452
+ this.sessionPlugins[sessionId] = this.sessionlessPlugins;
453
+ this.sessionlessPlugins = [];
454
+ }
455
+
437
456
  return res;
438
457
  }
439
458
 
@@ -466,15 +485,19 @@ class AppiumDriver extends _baseDriver.BaseDriver {
466
485
  return next;
467
486
  }
468
487
 
469
- logPluginHandlerReport({
488
+ logPluginHandlerReport(plugins, {
470
489
  cmd,
471
490
  cmdHandledBy
472
491
  }) {
492
+ if (!plugins.length) {
493
+ return;
494
+ }
495
+
473
496
  const didHandle = Object.keys(cmdHandledBy).filter(k => cmdHandledBy[k]);
474
497
  const didntHandle = Object.keys(cmdHandledBy).filter(k => !cmdHandledBy[k]);
475
498
 
476
499
  if (didntHandle.length > 0) {
477
- _logger.default.info(`Command '${cmd}' was not handled by the following beahviors or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
500
+ _logger.default.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
478
501
  }
479
502
  }
480
503
 
@@ -503,24 +526,6 @@ class AppiumDriver extends _baseDriver.BaseDriver {
503
526
  return res;
504
527
  }
505
528
 
506
- proxyRouteIsAvoided(sessionId, method, url, body) {
507
- if (super.proxyRouteIsAvoided(sessionId, method, url, body)) {
508
- return true;
509
- }
510
-
511
- for (const plugin of this.pluginsForSession(sessionId)) {
512
- var _plugin$shouldAvoidPr;
513
-
514
- if ((_plugin$shouldAvoidPr = plugin.shouldAvoidProxy) !== null && _plugin$shouldAvoidPr !== void 0 && _plugin$shouldAvoidPr.call(plugin, method, url, body)) {
515
- _logger.default.info(`Request to ${url} would normally be proxied, but plugin ${plugin.name} wants ` + `to handle it internally. We'll avoid proxying in this case.`);
516
-
517
- return true;
518
- }
519
- }
520
-
521
- return false;
522
- }
523
-
524
529
  proxyActive(sessionId) {
525
530
  const dstSession = this.sessions[sessionId];
526
531
  return dstSession && _lodash.default.isFunction(dstSession.proxyActive) && dstSession.proxyActive(sessionId);
@@ -542,7 +547,17 @@ exports.AppiumDriver = AppiumDriver;
542
547
 
543
548
  function isAppiumDriverCommand(cmd) {
544
549
  return !(0, _baseDriver.isSessionCommand)(cmd) || cmd === 'deleteSession';
545
- }require('source-map-support').install();
550
+ }
551
+
552
+ class NoDriverProxyCommandError extends Error {
553
+ constructor() {
554
+ super(`The default behavior for this command was to proxy, but the driver ` + `did not have the 'proxyCommand' method defined. To fully support ` + `plugins, drivers should have 'proxyCommand' set to a jwpProxy object's ` + `'command()' method, in addition to the normal 'proxyReqRes'`);
555
+ (0, _defineProperty2.default)(this, "code", 'APPIUMERR_NO_DRIVER_PROXYCOMMAND');
556
+ }
557
+
558
+ }
559
+
560
+ exports.NoDriverProxyCommandError = NoDriverProxyCommandError;require('source-map-support').install();
546
561
 
547
562
 
548
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwiT2JqZWN0IiwiYXNzaWduIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwiYWNxdWlyZSIsIm5hbWUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImxvZyIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJfZmluZE1hdGNoaW5nRHJpdmVyIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRDbGFzcyIsImV4dEluc3RhbmNlIiwiY2xpQXJncyIsImlzRW1wdHkiLCJoYXMiLCJFcnJvciIsImFyZ3NDb25zdHJhaW50cyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWF0ZVNlc3Npb24iLCJqc29ud3BDYXBzIiwicmVxQ2FwcyIsInczY0NhcGFiaWxpdGllcyIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJjbG9uZURlZXAiLCJkZWZhdWx0U2V0dGluZ3MiLCJqd3BTZXR0aW5ncyIsInczY1NldHRpbmdzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoRW50cnkiLCJmaXJzdE1hdGNoIiwicHJvdG9jb2wiLCJpbm5lclNlc3Npb25JZCIsImRDYXBzIiwicGFyc2VkQ2FwcyIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwiZXJyb3IiLCJJbm5lckRyaXZlciIsInZlcnNpb24iLCJkcml2ZXJDb25maWciLCJzZXNzaW9uT3ZlcnJpZGUiLCJkZWxldGVBbGxTZXNzaW9ucyIsInJ1bm5pbmdEcml2ZXJzRGF0YSIsIm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhIiwiZHJpdmVySW5zdGFuY2UiLCJyZWxheGVkU2VjdXJpdHlFbmFibGVkIiwiZGVueUluc2VjdXJlIiwiYSIsImFsbG93SW5zZWN1cmUiLCJzZXJ2ZXIiLCJjdXJTZXNzaW9uRGF0YUZvckRyaXZlciIsImUiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImRydiIsImRyaXZlckRhdGEiLCJwdXNoIiwicHVsbCIsImF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiaXNXM0NQcm90b2NvbCIsInVwZGF0ZVNldHRpbmdzIiwiaXNNanNvbndwUHJvdG9jb2wiLCJ2YWx1ZSIsInJlbW92ZVNlc3Npb25Gcm9tTWFzdGVyTGlzdCIsImNhdXNlIiwid2FybiIsImlzRnVuY3Rpb24iLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsInRoZW4iLCJjYXRjaCIsIkIiLCJDYW5jZWxsYXRpb25FcnJvciIsImRhdGEiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJzIiwiZGF0dW0iLCJkZWxldGVTZXNzaW9uIiwib3RoZXJTZXNzaW9uc0RhdGEiLCJjdXJDb25zdHJ1Y3Rvck5hbWUiLCJrZXkiLCJvcHRzIiwic2Vzc2lvbnNDb3VudCIsInNpemUiLCJmb3JjZSIsInJlYXNvbiIsInV0aWwiLCJwbHVyYWxpemUiLCJjbGVhbnVwUHJvbWlzZXMiLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImtleXMiLCJjbGVhbnVwUHJvbWlzZSIsInBsdWdpbnNGb3JTZXNzaW9uIiwicGx1Z2lucyIsImNyZWF0ZVBsdWdpbkluc3RhbmNlcyIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJoYW5kbGUiLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIlBsdWdpbkNsYXNzIiwiZ2VuZXJhbE5hbWUiLCJwbHVnaW5OYW1lIiwicGx1Z2luIiwiZXhlY3V0ZUNvbW1hbmQiLCJpc0dldFN0YXR1cyIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJsYXN0IiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsIndyYXBwZWRDbWQiLCJ3cmFwQ29tbWFuZFdpdGhQbHVnaW5zIiwibmV4dCIsInJlcyIsImV4ZWN1dGVXcmFwcGVkQ29tbWFuZCIsImxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQiLCJfbmV4dCIsImRpZEhhbmRsZSIsImsiLCJkaWRudEhhbmRsZSIsImNtZFJlcyIsImNtZEVyciIsImlzUGxhaW5PYmplY3QiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwibWV0aG9kIiwidXJsIiwiYm9keSIsInNob3VsZEF2b2lkUHJveHkiLCJwcm94eUFjdGl2ZSIsImdldFByb3h5QXZvaWRMaXN0IiwiY2FuUHJveHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsNEJBQTRCLEdBQUc7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TyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxJQUFJQSxVQUFVLENBQUM0SixRQUFYLENBQW9CN0osU0FBcEIsQ0FBckI7QUFDRDs7QUFubEJtQzs7OztBQXdsQnRDLFNBQVNtSSxxQkFBVCxDQUFnQ1osR0FBaEMsRUFBcUM7QUFDbkMsU0FBTyxDQUFDLGtDQUFpQkEsR0FBakIsQ0FBRCxJQUEwQkEsR0FBRyxLQUFLLGVBQXpDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGZpbmRNYXRjaGluZ0RyaXZlciB9IGZyb20gJy4vZHJpdmVycyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBc3luY0xvY2sgZnJvbSAnYXN5bmMtbG9jayc7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb25BcmdzLCBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciwgcHVsbFNldHRpbmdzLCB2YWxpZGF0ZUV4dGVuc2lvbkFyZ3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0ge1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn07XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChhcmdzKSB7XG4gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBgLS10bXBgIGhlcmUgc2luY2UgaXQgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSIG9uY2UgYXQgYW4gaW5pdGlhbCBwb2ludCBpbiB0aGUgQXBwaXVtIGxpZmVjeWNsZS5cbiAgICAvLyBUaGUgcHJvY2VzcyBhcmd1bWVudCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgQmFzZURyaXZlci5cbiAgICAvLyBQbGVhc2UgY2FsbCBAYXBwaXVtL3N1cHBvcnQudGVtcERpciBtb2R1bGUgdG8gYXBwbHkgdGhpcyBiZW5lZml0LlxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgPSBhcmdzLnRtcERpcjtcbiAgICB9XG5cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cztcblxuICAgIC8vIHRoZSBtYWluIEFwcGl1bSBEcml2ZXIgaGFzIG5vIG5ldyBjb21tYW5kIHRpbWVvdXRcbiAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gICAgdGhpcy5hcmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XG5cbiAgICAvLyBBY2Nlc3MgdG8gc2Vzc2lvbnMgbGlzdCBtdXN0IGJlIGd1YXJkZWQgd2l0aCBhIFNlbWFwaG9yZSwgYmVjYXVzZVxuICAgIC8vIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICAvLyBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgIHRoaXMuc2Vzc2lvbnMgPSB7fTtcblxuICAgIC8vIEFjY2VzcyB0byBwZW5kaW5nIGRyaXZlcnMgbGlzdCBtdXN0IGJlIGd1YXJkZWQgd2l0aCBhIFNlbWFwaG9yZSwgYmVjYXVzZVxuICAgIC8vIGl0IG1pZ2h0IGJlIGNoYW5nZWQgYnkgb3RoZXIgYXN5bmMgY2FsbHMgYXQgYW55IHRpbWVcbiAgICAvLyBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXNzIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgb3V0c2lkZVxuICAgIHRoaXMucGVuZGluZ0RyaXZlcnMgPSB7fTtcblxuICAgIHRoaXMucGx1Z2luQ2xhc3NlcyA9IFtdOyAvLyBsaXN0IG9mIHdoaWNoIHBsdWdpbnMgYXJlIGFjdGl2ZVxuICAgIHRoaXMuc2Vzc2lvblBsdWdpbnMgPSB7fTsgLy8gbWFwIG9mIHNlc3Npb25zIHRvIGFjdHVhbCBwbHVnaW4gaW5zdGFuY2VzIHBlciBzZXNzaW9uXG4gICAgdGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMgPSBbXTsgLy8gc29tZSBjb21tYW5kcyBhcmUgc2Vzc2lvbmxlc3MsIHNvIHdlIG5lZWQgYSBzZXQgb2YgcGx1Z2lucyBmb3IgdGhlbVxuXG4gICAgLy8gYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQsIHNvIG5vIGBhd2FpdGBcbiAgICB1cGRhdGVCdWlsZEluZm8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgY29tbWFuZHMgcXVldWVpbmcgZm9yIHRoZSB1bWJyZWxsYSBBcHBpdW0gZHJpdmVyXG4gICAqL1xuICBnZXQgaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2Vzc2lvbkV4aXN0cyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLnNlc3Npb25JZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGRyaXZlckZvclNlc3Npb24gKHNlc3Npb25JZCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gIH1cblxuICBhc3luYyBnZXRTdGF0dXMgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICByZXR1cm4ge1xuICAgICAgYnVpbGQ6IF8uY2xvbmUoZ2V0QnVpbGRJbmZvKCkpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9ucyAoKSB7XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zKTtcbiAgICByZXR1cm4gXy50b1BhaXJzKHNlc3Npb25zKVxuICAgICAgLm1hcCgoW2lkLCBkcml2ZXJdKSA9PiAoe2lkLCBjYXBhYmlsaXRpZXM6IGRyaXZlci5jYXBzfSkpO1xuICB9XG5cbiAgcHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IChkcml2ZXJOYW1lLCBkcml2ZXJWZXJzaW9uLCBkcml2ZXJCYXNlVmVyc2lvbikge1xuICAgIGxvZy5pbmZvKGRyaXZlclZlcnNpb25cbiAgICAgID8gYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSAodiR7ZHJpdmVyVmVyc2lvbn0pIHNlc3Npb25gXG4gICAgICA6IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gc2Vzc2lvbmBcbiAgICApO1xuICAgIGxvZy5pbmZvKGBDaGVja2luZyBCYXNlRHJpdmVyIHZlcnNpb25zIGZvciBBcHBpdW0gYW5kICR7ZHJpdmVyTmFtZX1gKTtcbiAgICBsb2cuaW5mbyhBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb25cbiAgICAgID8gYEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke0FwcGl1bURyaXZlci5iYXNlVmVyc2lvbn1gXG4gICAgICA6IGBDb3VsZCBub3QgZGV0ZXJtaW5lIEFwcGl1bSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICAgIGxvZy5pbmZvKGRyaXZlckJhc2VWZXJzaW9uXG4gICAgICA/IGAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uIGlzICR7ZHJpdmVyQmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSAke2RyaXZlck5hbWV9J3MgQmFzZURyaXZlciB2ZXJzaW9uYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBqdXN0IGFuIGFsaWFzIGZvciBkcml2ZXIuanMncyBtZXRob2QsIHdoaWNoIGlzIG5lY2Vzc2FyeSBmb3JcbiAgICogbW9ja2luZyBpbiB0aGUgdGVzdCBzdWl0ZVxuICAgKi9cbiAgX2ZpbmRNYXRjaGluZ0RyaXZlciAoLi4uYXJncykge1xuICAgIHJldHVybiBmaW5kTWF0Y2hpbmdEcml2ZXIoLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIGFzc2lnbiBDTEkgYXJncyBmb3IgYSBkcml2ZXIgb3IgcGx1Z2luXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHRUeXBlICdkcml2ZXInIG9yICdwbHVnaW4nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIHtPYmplY3RDb25zdHJ1Y3Rvcn0gZXh0Q2xhc3MgdGhlIGNsYXNzIG9mIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dEluc3RhbmNlIHRoZSBkcml2ZXIgb3IgcGx1Z2luIGluc3RhbmNlXG4gICAqL1xuICBhc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24gKGV4dFR5cGUsIGV4dE5hbWUsIGV4dENsYXNzLCBleHRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGNsaUFyZ3MgPSBnZXRFeHRlbnNpb25BcmdzKHRoaXMuYXJnc1tgJHtleHRUeXBlfUFyZ3NgXSwgZXh0TmFtZSk7XG4gICAgaWYgKCFfLmlzRW1wdHkoY2xpQXJncykpIHtcbiAgICAgIGlmICghXy5oYXMoZXh0Q2xhc3MsICdhcmdzQ29uc3RyYWludHMnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBzZW50IGluIENMSSBhcmdzIGZvciB0aGUgJHtleHROYW1lfSAke2V4dFR5cGV9LCBidXQgaXQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgZGVmaW5lIGFueWApO1xuICAgICAgfVxuICAgICAgdmFsaWRhdGVFeHRlbnNpb25BcmdzKGNsaUFyZ3MsIGV4dENsYXNzLmFyZ3NDb25zdHJhaW50cyk7XG4gICAgICBleHRJbnN0YW5jZS5jbGlBcmdzID0gY2xpQXJncztcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0IENMSSBhcmd1bWVudHMgb24gJHtleHROYW1lfSAke2V4dFR5cGV9IGluc3RhbmNlOiAke0pTT04uc3RyaW5naWZ5KGNsaUFyZ3MpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuX2ZpbmRNYXRjaGluZ0RyaXZlcih0aGlzLmRyaXZlckNvbmZpZywgZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gbG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IGxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBJbm5lckRyaXZlciwgZHJpdmVySW5zdGFuY2UpO1xuXG5cbiAgICAgIC8vIFRoaXMgYXNzaWdubWVudCBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCB3ZWIgc29ja2V0cyBmdW5jdGlvbmFsaXR5IGluc2lkZSB0aGUgZHJpdmVyXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zZXJ2ZXIgPSB0aGlzLnNlcnZlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bm5pbmdEcml2ZXJzRGF0YSA9IGF3YWl0IHRoaXMuY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIoSW5uZXJEcml2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSB8fCBbXTtcbiAgICAgICAgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLm1hcCgoZHJ2KSA9PiBkcnYuZHJpdmVyRGF0YSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ucHVzaChkcml2ZXJJbnN0YW5jZSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgW2lubmVyU2Vzc2lvbklkLCBkQ2Fwc10gPSBhd2FpdCBkcml2ZXJJbnN0YW5jZS5jcmVhdGVTZXNzaW9uKFxuICAgICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgICByZXFDYXBzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBbLi4ucnVubmluZ0RyaXZlcnNEYXRhLCAuLi5vdGhlclBlbmRpbmdEcml2ZXJzRGF0YV1cbiAgICAgICAgKTtcbiAgICAgICAgcHJvdG9jb2wgPSBkcml2ZXJJbnN0YW5jZS5wcm90b2NvbDtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdID0gZHJpdmVySW5zdGFuY2U7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgXy5wdWxsKHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0sIGRyaXZlckluc3RhbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlcihkcml2ZXJJbnN0YW5jZSwgaW5uZXJTZXNzaW9uSWQpO1xuXG4gICAgICBsb2cuaW5mbyhgTmV3ICR7SW5uZXJEcml2ZXIubmFtZX0gc2Vzc2lvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSwgc2Vzc2lvbiBgICtcbiAgICAgICAgICAgICAgYCR7aW5uZXJTZXNzaW9uSWR9IGFkZGVkIHRvIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcblxuICAgICAgLy8gc2V0IHRoZSBOZXcgQ29tbWFuZCBUaW1lb3V0IGZvciB0aGUgaW5uZXIgZHJpdmVyXG4gICAgICBkcml2ZXJJbnN0YW5jZS5zdGFydE5ld0NvbW1hbmRUaW1lb3V0KCk7XG5cbiAgICAgIC8vIGFwcGx5IGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyAoaWYgcHJvdmlkZWQpXG4gICAgICBpZiAoZHJpdmVySW5zdGFuY2UuaXNXM0NQcm90b2NvbCgpICYmICFfLmlzRW1wdHkodzNjU2V0dGluZ3MpKSB7XG4gICAgICAgIGxvZy5pbmZvKGBBcHBseWluZyB0aGUgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIHBhcnNlZCBmcm9tIFczQyBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh3M2NTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyh3M2NTZXR0aW5ncyk7XG4gICAgICB9IGVsc2UgaWYgKGRyaXZlckluc3RhbmNlLmlzTWpzb253cFByb3RvY29sKCkgJiYgIV8uaXNFbXB0eShqd3BTZXR0aW5ncykpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gTUpTT05XUCBjYXBzOiBgICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShqd3BTZXR0aW5ncykpO1xuICAgICAgICBhd2FpdCBkcml2ZXJJbnN0YW5jZS51cGRhdGVTZXR0aW5ncyhqd3BTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvY29sLFxuICAgICAgdmFsdWU6IFtpbm5lclNlc3Npb25JZCwgZENhcHMsIHByb3RvY29sXVxuICAgIH07XG4gIH1cblxuICBhdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyIChkcml2ZXIsIGlubmVyU2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcmVtb3ZlU2Vzc2lvbkZyb21NYXN0ZXJMaXN0ID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIGxvZy53YXJuKGBDbG9zaW5nIHNlc3Npb24sIGNhdXNlIHdhcyAnJHtjYXVzZS5tZXNzYWdlfSdgKTtcbiAgICAgIGxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICcke2lubmVyU2Vzc2lvbklkfScgZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgIGlmIChfLmlzRnVuY3Rpb24oKGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93biB8fCB7fSkudGhlbikpIHtcbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGJsb2NrIGFmdGVyIGFsbCB0aGUgZHJpdmVycyB1c2UgYmFzZSBkcml2ZXIgYWJvdmUgdiA1LjAuMFxuICAgICAgLy8gUmVtb3ZlIHRoZSBzZXNzaW9uIG9uIHVuZXhwZWN0ZWQgc2h1dGRvd24sIHNvIHRoYXQgd2UgYXJlIGluIGEgcG9zaXRpb25cbiAgICAgIC8vIHRvIG9wZW4gYW5vdGhlciBzZXNzaW9uIGxhdGVyIG9uLlxuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UndmUgaGFkIGFuIHVuZXhwZWN0ZWQgc2h1dGRvd24sIHNvIGVycm9yXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNodXRkb3duJyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIC8vIGlmIHdlIGNhbmNlbGxlZCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBwcm9taXNlLCB0aGF0IG1lYW5zIHdlXG4gICAgICAgICAgLy8gbm8gbG9uZ2VyIGNhcmUgYWJvdXQgaXQsIGFuZCBjYW4gc2FmZWx5IGlnbm9yZSBpdFxuICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBCLkNhbmNlbGxhdGlvbkVycm9yKSkge1xuICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbkZyb21NYXN0ZXJMaXN0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIHRoaXMgaXMgYSBjYW5jZWxsYWJsZSBwcm9taXNlXG4gICAgfSBlbHNlIGlmIChfLmlzRnVuY3Rpb24oZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKSkge1xuICAgICAgLy8gc2luY2UgYmFzZSBkcml2ZXIgdiA1LjAuMFxuICAgICAgZHJpdmVyLm9uVW5leHBlY3RlZFNodXRkb3duKHJlbW92ZVNlc3Npb25Gcm9tTWFzdGVyTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gYXR0YWNoIHRoZSB1bmV4cGVjdGVkIHNodXRkb3duIGxpc3RlbmVyLiBgICtcbiAgICAgICAgYElzICdvblVuZXhwZWN0ZWRTaHV0ZG93bicgbWV0aG9kIGF2YWlsYWJsZSBmb3IgJyR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9Jz9gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjdXJTZXNzaW9uRGF0YUZvckRyaXZlciAoSW5uZXJEcml2ZXIpIHtcbiAgICBjb25zdCBzZXNzaW9ucyA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHRoaXMuc2Vzc2lvbnMpO1xuICAgIGNvbnN0IGRhdGEgPSBfLnZhbHVlcyhzZXNzaW9ucylcbiAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChzKSA9PiBzLmNvbnN0cnVjdG9yLm5hbWUgPT09IElubmVyRHJpdmVyLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5kcml2ZXJEYXRhKTtcbiAgICBmb3IgKGxldCBkYXR1bSBvZiBkYXRhKSB7XG4gICAgICBpZiAoIWRhdHVtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvYmxlbSBnZXR0aW5nIHNlc3Npb24gZGF0YSBmb3IgZHJpdmVyIHR5cGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtJbm5lckRyaXZlci5uYW1lfTsgZG9lcyBpdCBpbXBsZW1lbnQgJ2dldCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBkcml2ZXJEYXRhJz9gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICBsZXQgcHJvdG9jb2w7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBvdGhlclNlc3Npb25zRGF0YSA9IG51bGw7XG4gICAgICBsZXQgZHN0U2Vzc2lvbiA9IG51bGw7XG4gICAgICBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1ckNvbnN0cnVjdG9yTmFtZSA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBvdGhlclNlc3Npb25zRGF0YSA9IF8udG9QYWlycyh0aGlzLnNlc3Npb25zKVxuICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09IGN1ckNvbnN0cnVjdG9yTmFtZSAmJiBrZXkgIT09IHNlc3Npb25JZClcbiAgICAgICAgICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZS5kcml2ZXJEYXRhKTtcbiAgICAgICAgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgcHJvdG9jb2wgPSBkc3RTZXNzaW9uLnByb3RvY29sO1xuICAgICAgICBsb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH0gZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGRlbGV0ZVNlc3Npb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBvciBub3RcbiAgICAgICAgLy8gbWFrZSB0aGUgc2Vzc2lvbiB1bmF2YWlsYWJsZSwgYmVjYXVzZSB3aG8ga25vd3Mgd2hhdCBzdGF0ZSBpdCBtaWdodFxuICAgICAgICAvLyBiZSBpbiBvdGhlcndpc2VcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbc2Vzc2lvbklkXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIHZhbHVlOiBhd2FpdCBkc3RTZXNzaW9uLmRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkLCBvdGhlclNlc3Npb25zRGF0YSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvcihgSGFkIHRyb3VibGUgZW5kaW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcjogZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsU2Vzc2lvbnMgKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHNlc3Npb25zQ291bnQgPSBfLnNpemUodGhpcy5zZXNzaW9ucyk7XG4gICAgaWYgKDAgPT09IHNlc3Npb25zQ291bnQpIHtcbiAgICAgIGxvZy5kZWJ1ZygnVGhlcmUgYXJlIG5vIGFjdGl2ZSBzZXNzaW9ucyBmb3IgY2xlYW51cCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGZvcmNlID0gZmFsc2UsXG4gICAgICByZWFzb24sXG4gICAgfSA9IG9wdHM7XG4gICAgbG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke3V0aWwucGx1cmFsaXplKCdhY3RpdmUgc2Vzc2lvbicsIHNlc3Npb25zQ291bnQsIHRydWUpfWApO1xuICAgIGNvbnN0IGNsZWFudXBQcm9taXNlcyA9IGZvcmNlXG4gICAgICA/IF8udmFsdWVzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoZHJ2KSA9PiBkcnYuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24ocmVhc29uICYmIG5ldyBFcnJvcihyZWFzb24pKSlcbiAgICAgIDogXy5rZXlzKHRoaXMuc2Vzc2lvbnMpLm1hcCgoaWQpID0+IHRoaXMuZGVsZXRlU2Vzc2lvbihpZCkpO1xuICAgIGZvciAoY29uc3QgY2xlYW51cFByb21pc2Ugb2YgY2xlYW51cFByb21pc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGVhbnVwUHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIHBsdWdpbnMgZm9yIGEgc2Vzc2lvbiAob3Igc2Vzc2lvbmxlc3MgcGx1Z2lucylcbiAgICpcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBzZXNzaW9uSWQgLSB0aGUgc2Vzc2lvbklkIChvciBudWxsKSB0byB1c2UgdG8gZmluZCBwbHVnaW5zXG4gICAqIEByZXR1cm5zIHtBcnJheX0gLSBhcnJheSBvZiBwbHVnaW4gaW5zdGFuY2VzXG4gICAqL1xuICBwbHVnaW5zRm9yU2Vzc2lvbiAoc2Vzc2lvbklkID0gbnVsbCkge1xuICAgIGxldCBwbHVnaW5zID0gW107XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaWYgKCF0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICAgIH1cbiAgICAgIHBsdWdpbnMgPSB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMpKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICAgIH1cbiAgICAgIHBsdWdpbnMgPSB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgICB9XG4gICAgcmV0dXJuIHBsdWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHBsdWdpbnMgZm9yIGEgY29tbWFuZCwgd2UgZWl0aGVyIGdldCB0aGUgcGx1Z2luIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIHBhcnRpY3VsYXIgY29tbWFuZCdzIHNlc3Npb24sIG9yIGluIHRoZSBjYXNlIG9mIHNlc3Npb25sZXNzIHBsdWdpbnMsIHB1bGwgZnJvbSB0aGUgc2V0IG9mXG4gICAqIHBsdWdpbiBpbnN0YW5jZXMgcmVzZXJ2ZWQgZm9yIHNlc3Npb25sZXNzIGNvbW1hbmRzIChhbmQgd2UgbGF6aWx5IGNyZWF0ZSBwbHVnaW4gaW5zdGFuY2VzIG9uXG4gICAqIGZpcnN0IHVzZSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtZCAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGZpbmQgYSBwbHVnaW4gdG8gaGFuZGxlXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gc2Vzc2lvbklkIC0gdGhlIHBhcnRpY3VsYXIgc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZmluZCBhIHBsdWdpbiwgb3IgbnVsbCBpZlxuICAgKiBzZXNzaW9ubGVzc1xuICAgKi9cbiAgcGx1Z2luc1RvSGFuZGxlQ21kIChjbWQsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgICAvLyB0byBoYW5kbGUgYSBnaXZlbiBjb21tYW5kLCBhIHBsdWdpbiBzaG91bGQgZWl0aGVyIGltcGxlbWVudCB0aGF0IGNvbW1hbmQgYXMgYSBwbHVnaW5cbiAgICAvLyBpbnN0YW5jZSBtZXRob2Qgb3IgaXQgc2hvdWxkIGltcGxlbWVudCBhIGdlbmVyaWMgJ2hhbmRsZScgbWV0aG9kXG4gICAgcmV0dXJuIHRoaXMucGx1Z2luc0ZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgICAgLmZpbHRlcigocCkgPT4gXy5pc0Z1bmN0aW9uKHBbY21kXSkgfHwgXy5pc0Z1bmN0aW9uKHAuaGFuZGxlKSk7XG4gIH1cblxuICBjcmVhdGVQbHVnaW5JbnN0YW5jZXMgKHNlc3Npb25JZCkge1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBzZXNzaW9uSWQgPSAnc2Vzc2lvbmxlc3MnO1xuICAgIH1cbiAgICBzZXNzaW9uSWQgPSBfLnRydW5jYXRlKHNlc3Npb25JZCwge2xlbmd0aDogMTF9KTtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5DbGFzc2VzLm1hcCgoUGx1Z2luQ2xhc3MpID0+IHtcbiAgICAgIGNvbnN0IGdlbmVyYWxOYW1lID0gUGx1Z2luQ2xhc3MucGx1Z2luTmFtZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgJHtnZW5lcmFsTmFtZX0gKCR7c2Vzc2lvbklkfSlgO1xuICAgICAgY29uc3QgcGx1Z2luID0gbmV3IFBsdWdpbkNsYXNzKG5hbWUpO1xuICAgICAgdGhpcy5hc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24oJ3BsdWdpbicsIGdlbmVyYWxOYW1lLCBQbHVnaW5DbGFzcywgcGx1Z2luKTtcbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlQ29tbWFuZCAoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gV2UgaGF2ZSBiYXNpY2FsbHkgdGhyZWUgY2FzZXMgZm9yIGhvdyB0byBoYW5kbGUgY29tbWFuZHM6XG4gICAgLy8gMS4gaGFuZGxlIGdldFN0YXR1cyAod2UgZG8gdGhpcyBhcyBhIHNwZWNpYWwgb3V0IG9mIGJhbmQgY2FzZSBzbyBpdCBkb2Vzbid0IGdldCBhZGRlZCB0byBhblxuICAgIC8vICAgIGV4ZWN1dGlvbiBxdWV1ZSwgYW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgZS5nLiBjcmVhdGVTZXNzaW9uIGlzIGluIHByb2dyZXNzKVxuICAgIC8vIDIuIGhhbmRsZSBjb21tYW5kcyB0aGF0IHRoaXMgdW1icmVsbGEgZHJpdmVyIHNob3VsZCBoYW5kbGUsIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgc2Vzc2lvblxuICAgIC8vICAgIGRyaXZlciAoZm9yIGV4YW1wbGUsIGRlbGV0ZVNlc3Npb24sIG9yIG90aGVyIG5vbi1zZXNzaW9uIGNvbW1hbmRzKVxuICAgIC8vIDMuIGhhbmRsZSBzZXNzaW9uIGRyaXZlciBjb21tYW5kcy5cbiAgICAvLyBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBiZWNhdXNlIHdlIHN1cHBvcnQgY29tbWFuZCBwbHVnaW5zLCB3ZSBuZWVkIHRvIHdyYXAgYW55IG9mIHRoZXNlXG4gICAgLy8gY2FzZXMgd2l0aCBwbHVnaW4gaGFuZGxpbmcuXG5cbiAgICBjb25zdCBpc0dldFN0YXR1cyA9IGNtZCA9PT0gJ2dldFN0YXR1cyc7XG4gICAgY29uc3QgaXNVbWJyZWxsYUNtZCA9ICFpc0dldFN0YXR1cyAmJiBpc0FwcGl1bURyaXZlckNvbW1hbmQoY21kKTtcbiAgICBjb25zdCBpc1Nlc3Npb25DbWQgPSAhaXNHZXRTdGF0dXMgJiYgIWlzVW1icmVsbGFDbWQ7XG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSk7XG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2Vzc2lvbiB3aXRoIGlkICcke3Nlc3Npb25JZH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgc2F2ZSB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgZ2l2ZW4gdGhhdCB0aGUgc2Vzc2lvbiBkcml2ZXIncyBwcm90b2NvbCBtaWdodCBkaWZmZXJcbiAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgIGRyaXZlciA9IGRzdFNlc3Npb247XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGhhbmRsaW5nIHRoaXMgY29tbWFuZFxuICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbnNUb0hhbmRsZUNtZChjbWQsIHNlc3Npb25JZCk7XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGEgJ2NtZEhhbmRsZWRCeScgb2JqZWN0IHdoaWNoIHdpbGwga2VlcCB0cmFjayBvZiB3aGljaCBwbHVnaW5zIGhhdmUgaGFuZGxlZCB0aGlzXG4gICAgLy8gY29tbWFuZC4gd2UgY2FyZSBhYm91dCB0aGlzIGJlY2F1c2UgKGEpIG11bHRpcGxlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGUgc2FtZSBjb21tYW5kLCBhbmRcbiAgICAvLyAoYikgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHBsdWdpbiB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlIG5leHQoKSBtZXRob2Qgd2hpY2ggcnVucyB0aGVcbiAgICAvLyBvcmlnaW5hbCBjb21tYW5kIGV4ZWN1dGlvbi4gVGhpcyByZXN1bHRzIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21tYW5kIG1pZ2h0IGJlIGhhbmRsZWRcbiAgICAvLyBieSBzb21lIGJ1dCBub3QgYWxsIHBsdWdpbnMsIG9yIGJ5IHBsdWdpbihzKSBidXQgbm90IGJ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBTbyBzdGFydCBvdXRcbiAgICAvLyB0aGlzIG9iamVjdCBkZWNsYXJpbmcgdGhhdCB0aGUgZGVmYXVsdCBoYW5kbGVyIGhhcyBub3QgYmVlbiBleGVjdXRlZC5cbiAgICBjb25zdCBjbWRIYW5kbGVkQnkgPSB7ZGVmYXVsdDogZmFsc2V9O1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBwbHVnaW5zLCBhbmQgc3VjY2Vzc2l2ZWx5IHdyYXBwZWRcbiAgICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsdWdpbiB0aGF0IGNhbiBoYW5kbGUgdGhlIGNvbW1hbmQuIFRvIHN0YXJ0IG9mZiB3aXRoLCB0aGUgYXN5bmNcbiAgICAvLyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGNhbGxpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGkuZS4sIHdoaWNoZXZlciBvZiB0aGUgMyBjYXNlcyBhYm92ZSBpc1xuICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBvbmVcbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpZiB3ZSdyZSBydW5uaW5nIHdpdGggcGx1Z2lucywgbWFrZSBzdXJlIHdlIGxvZyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFjdHVhbGx5XG4gICAgICAvLyBoYXBwZW5pbmcgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgcGx1Z2luIGNhbGwgY2hhaW4gaXMgdW53cmFwcGluZyB0byB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgLy8gaWYgdGhhdCdzIHdoYXQgaGFwcGVuc1xuICAgICAgcGx1Z2lucy5sZW5ndGggJiYgbG9nLmluZm8oYEV4ZWN1dGluZyBkZWZhdWx0IGhhbmRsaW5nIGJlaGF2aW9yIGZvciBjb21tYW5kICcke2NtZH0nYCk7XG5cbiAgICAgIC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGhhbmRsZWRcbiAgICAgIGNtZEhhbmRsZWRCeS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKGlzR2V0U3RhdHVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICAvLyBzb21lIGNvbW1hbmRzLCBsaWtlIGRlbGV0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZSBvbiAqdGhpcyogZHJpdmVyLFxuICAgICAgICAvLyBub3QgdGhlIHBsYXRmb3JtIGRyaXZlclxuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHBsdWdpbnMubGVuZ3RoICYmIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydCh7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB3cmFwQ29tbWFuZFdpdGhQbHVnaW5zICh7ZHJpdmVyLCBjbWQsIGFyZ3MsIG5leHQsIGNtZEhhbmRsZWRCeSwgcGx1Z2luc30pIHtcbiAgICBwbHVnaW5zLmxlbmd0aCAmJiBsb2cuaW5mbyhgUGx1Z2lucyB3aGljaCBjYW4gaGFuZGxlIGNtZCAnJHtjbWR9JzogJHtwbHVnaW5zLm1hcCgocCkgPT4gcC5uYW1lKX1gKTtcblxuICAgIC8vIG5vdyB3ZSBjYW4gZ28gdGhyb3VnaCBlYWNoIHBsdWdpbiBhbmQgd3JhcCBgbmV4dGAgYXJvdW5kIGl0cyBvd24gaGFuZGxlciwgcGFzc2luZyB0aGUgKm9sZCpcbiAgICAvLyBuZXh0IGluIHNvIHRoYXQgaXQgY2FuIGNhbGwgaXQgaWYgaXQgd2FudHMgdG9cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAvLyBuZWVkIGFuIElJRkUgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIG9mIG5leHQgdGhhdCdzIHBhc3NlZCB0byBwbHVnaW4uaGFuZGxlIHRvIGJlXG4gICAgICAvLyBleGFjdGx5IHRoZSB2YWx1ZSBvZiBuZXh0IGhlcmUgYmVmb3JlIHJlYXNzaWdubWVudDsgd2UgZG9uJ3Qgd2FudCBpdCB0byBiZSBsYXppbHlcbiAgICAgIC8vIGV2YWx1YXRlZCwgb3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBvZiB0aGUgbGFzdCBgbmV4dGAgdG8gYmUgZGVmaW5lZC5cbiAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSBmYWxzZTsgLy8gd2Ugc2VlIGEgbmV3IHBsdWdpbiwgc28gYWRkIGl0IHRvIHRoZSAnY21kSGFuZGxlZEJ5JyBvYmplY3RcbiAgICAgIG5leHQgPSAoKF9uZXh0KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxvZy5pbmZvKGBQbHVnaW4gJHtwbHVnaW4ubmFtZX0gaXMgbm93IGhhbmRsaW5nIGNtZCAnJHtjbWR9J2ApO1xuICAgICAgICBjbWRIYW5kbGVkQnlbcGx1Z2luLm5hbWVdID0gdHJ1ZTsgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB0aGlzIHBsdWdpbiBoYXMgYXR0ZW1wdGVkIHRvIGhhbmRsZSBjbWRcbiAgICAgICAgLy8gZmlyc3QgYXR0ZW1wdCB0byBoYW5kbGUgdGhlIGNvbW1hbmQgdmlhIGEgY29tbWFuZC1zcGVjaWZpYyBoYW5kbGVyIG9uIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKHBsdWdpbltjbWRdKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHBsdWdpbltjbWRdKF9uZXh0LCBkcml2ZXIsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwgY2FsbCB0aGUgZ2VuZXJpYyAnaGFuZGxlJyBtZXRob2RcbiAgICAgICAgcmV0dXJuIGF3YWl0IHBsdWdpbi5oYW5kbGUoX25leHQsIGRyaXZlciwgY21kLCAuLi5hcmdzKTtcbiAgICAgIH0pKG5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgbG9nUGx1Z2luSGFuZGxlclJlcG9ydCAoe2NtZCwgY21kSGFuZGxlZEJ5fSkge1xuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRheSwgd2UgaGF2ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHdoaWNoIHBsdWdpbnMgZW5kZWQgdXAgZ2V0dGluZ1xuICAgIC8vIHRoZWlyIGNvZGUgcnVuIGFzIHBhcnQgb2YgaGFuZGxpbmcgdGhpcyBjb21tYW5kLiBCZWNhdXNlIHBsdWdpbnMgY2FuIGNob29zZSAqbm90KiB0b1xuICAgIC8vIHBhc3MgY29udHJvbCB0byBvdGhlciBwbHVnaW5zIG9yIHRvIHRoZSBkZWZhdWx0IGRyaXZlciBiZWhhdmlvciwgdGhpcyBpcyBpbmZvcm1hdGlvblxuICAgIC8vIHdoaWNoIGlzIHByb2JhYmx5IHVzZWZ1bCB0byB0aGUgdXNlciAoZXNwZWNpYWxseSBpbiBzaXR1YXRpb25zIHdoZXJlIHBsdWdpbnMgbWlnaHQgbm90XG4gICAgLy8gaW50ZXJhY3Qgd2VsbCB0b2dldGhlciwgYW5kIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGVidWcgb3RoZXJ3aXNlIHdpdGhvdXQgdGhpcyBraW5kIG9mXG4gICAgLy8gbWVzc2FnZSkuXG4gICAgY29uc3QgZGlkSGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+IGNtZEhhbmRsZWRCeVtrXSk7XG4gICAgY29uc3QgZGlkbnRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gIWNtZEhhbmRsZWRCeVtrXSk7XG4gICAgaWYgKGRpZG50SGFuZGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDb21tYW5kICcke2NtZH0nIHdhcyBub3QgaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlYWh2aW9ycyBvciBwbHVnaW5zLCBldmVuIGAgK1xuICAgICAgICAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlV3JhcHBlZENvbW1hbmQgKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pIHtcbiAgICBsZXQgY21kUmVzLCBjbWRFcnIsIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIFdlIHdhbnQgdG8gb3ZlcnJpZGUgYmFzZWRyaXZlcidzIHByb3h5IGF2b2lkYW5jZSBkZXRlY3Rpb24gc2luY2UgcGx1Z2lucyBtaWdodCB3YW50IHRvIGF2b2lkXG4gIC8vIHByb3h5aW5nIGluIG9yZGVyIHRvIGhhbmRsZSBhIGNvbW1hbmQsIHNvIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1ha2UgYW4gZXh0cmEgY2hlY2sgd2hldGhlclxuICAvLyBwbHVnaW5zIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcy5cbiAgcHJveHlSb3V0ZUlzQXZvaWRlZCAoc2Vzc2lvbklkLCBtZXRob2QsIHVybCwgYm9keSkge1xuICAgIGlmIChzdXBlci5wcm94eVJvdXRlSXNBdm9pZGVkKHNlc3Npb25JZCwgbWV0aG9kLCB1cmwsIGJvZHkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gaWYgZXZlbiBqdXN0IG9uZSBwbHVnaW4gbmVlZHMgdG8gYXZvaWQgcHJveHlpbmcsIGRvIHNvXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zRm9yU2Vzc2lvbihzZXNzaW9uSWQpKSB7XG4gICAgICBpZiAocGx1Z2luLnNob3VsZEF2b2lkUHJveHk/LihtZXRob2QsIHVybCwgYm9keSkpIHtcbiAgICAgICAgbG9nLmluZm8oYFJlcXVlc3QgdG8gJHt1cmx9IHdvdWxkIG5vcm1hbGx5IGJlIHByb3hpZWQsIGJ1dCBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gd2FudHMgYCArXG4gICAgICAgICAgICAgICAgIGB0byBoYW5kbGUgaXQgaW50ZXJuYWxseS4gV2UnbGwgYXZvaWQgcHJveHlpbmcgaW4gdGhpcyBjYXNlLmApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuZXhwb3J0IHsgQXBwaXVtRHJpdmVyIH07XG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
563
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwiYWNxdWlyZSIsIm5hbWUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImxvZyIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJfZmluZE1hdGNoaW5nRHJpdmVyIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImNsaUFyZ3MiLCJpc0VtcHR5IiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImRyaXZlckNvbmZpZyIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlciIsImN1clNlc3Npb25EYXRhRm9yRHJpdmVyIiwiZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJtZXNzYWdlIiwiZHJ2IiwiZHJpdmVyRGF0YSIsInB1c2giLCJwdWxsIiwiYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJpc1czQ1Byb3RvY29sIiwiSlNPTiIsInN0cmluZ2lmeSIsInVwZGF0ZVNldHRpbmdzIiwiaXNNanNvbndwUHJvdG9jb2wiLCJ2YWx1ZSIsIm9uU2h1dGRvd24iLCJjYXVzZSIsIkVycm9yIiwid2FybiIsInBsdWdpbiIsImlzRnVuY3Rpb24iLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsImRlYnVnIiwiZGF0YSIsInZhbHVlcyIsImZpbHRlciIsInMiLCJkYXR1bSIsImRlbGV0ZVNlc3Npb24iLCJvdGhlclNlc3Npb25zRGF0YSIsImN1ckNvbnN0cnVjdG9yTmFtZSIsImtleSIsIm9wdHMiLCJzZXNzaW9uc0NvdW50Iiwic2l6ZSIsImZvcmNlIiwicmVhc29uIiwidXRpbCIsInBsdXJhbGl6ZSIsImNsZWFudXBQcm9taXNlcyIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsImNsZWFudXBQcm9taXNlIiwicGx1Z2luc0ZvclNlc3Npb24iLCJjcmVhdGVQbHVnaW5JbnN0YW5jZXMiLCJwbHVnaW5zVG9IYW5kbGVDbWQiLCJjbWQiLCJwIiwiaGFuZGxlIiwiUGx1Z2luQ2xhc3MiLCJwbHVnaW5OYW1lIiwiZXhlY3V0ZUNvbW1hbmQiLCJpc0dldFN0YXR1cyIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsNEJBQTRCLEdBQUc7QUFDbkNDLEVBQUFBLGNBQWMsRUFBRTtBQUNkQyxJQUFBQSxRQUFRLEVBQUUsSUFESTtB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Qyw2REFIUDtBQURhLGdEQUZSLGtDQUVRO0FBS2Q7O0FBWGtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBmaW5kTWF0Y2hpbmdEcml2ZXIgfSBmcm9tICcuL2RyaXZlcnMnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgZXJyb3JzLCBpc1Nlc3Npb25Db21tYW5kLFxuICAgICAgICAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBwdWxsU2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0ge1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn07XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChhcmdzKSB7XG4gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBgLS10bXBgIGhlcmUgc2luY2UgaXQgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSIG9uY2UgYXQgYW4gaW5pdGlhbCBwb2ludCBpbiB0aGUgQXBwaXVtIGxpZmVjeWNsZS5cbiAgICAvLyBUaGUgcHJvY2VzcyBhcmd1bWVudCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgQmFzZURyaXZlci5cbiAgICAvLyBQbGVhc2UgY2FsbCBAYXBwaXVtL3N1cHBvcnQudGVtcERpciBtb2R1bGUgdG8gYXBwbHkgdGhpcyBiZW5lZml0LlxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgPSBhcmdzLnRtcERpcjtcbiAgICB9XG5cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cztcblxuICAgIC8vIHRoZSBtYWluIEFwcGl1bSBEcml2ZXIgaGFzIG5vIG5ldyBjb21tYW5kIHRpbWVvdXRcbiAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLmFyZ3N9O1xuXG4gICAgLy8gQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnNlc3Npb25zID0ge307XG5cbiAgICAvLyBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgICB0aGlzLnBsdWdpbkNsYXNzZXMgPSBbXTsgLy8gbGlzdCBvZiB3aGljaCBwbHVnaW5zIGFyZSBhY3RpdmVcbiAgICB0aGlzLnNlc3Npb25QbHVnaW5zID0ge307IC8vIG1hcCBvZiBzZXNzaW9ucyB0byBhY3R1YWwgcGx1Z2luIGluc3RhbmNlcyBwZXIgc2Vzc2lvblxuICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107IC8vIHNvbWUgY29tbWFuZHMgYXJlIHNlc3Npb25sZXNzLCBzbyB3ZSBuZWVkIGEgc2V0IG9mIHBsdWdpbnMgZm9yIHRoZW1cblxuICAgIC8vIGFsbG93IHRoaXMgdG8gaGFwcGVuIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBubyBgYXdhaXRgXG4gICAgdXBkYXRlQnVpbGRJbmZvKCk7XG4gIH1cblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ3x1bmRlZmluZWR9ICovXG4gIGRyaXZlckNvbmZpZztcblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICBsb2cuaW5mbyhkcml2ZXJWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgOiBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9IHNlc3Npb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgbG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhkcml2ZXJCYXNlVmVyc2lvblxuICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBhbiBhbGlhcyBmb3IgZHJpdmVyLmpzJ3MgbWV0aG9kLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yXG4gICAqIG1vY2tpbmcgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIF9maW5kTWF0Y2hpbmdEcml2ZXIgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoaW5nRHJpdmVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBhc3NpZ24gQ0xJIGFyZ3MgZm9yIGEgZHJpdmVyIG9yIHBsdWdpblxuICAgKlxuICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBwcm92aWRlZCBhIHNjaGVtYSwgdmFsaWRhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IGV4dFR5cGUgJ2RyaXZlcicgb3IgJ3BsdWdpbidcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0SW5zdGFuY2UgdGhlIGRyaXZlciBvciBwbHVnaW4gaW5zdGFuY2VcbiAgICovXG4gIGFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbiAoZXh0VHlwZSwgZXh0TmFtZSwgZXh0SW5zdGFuY2UpIHtcbiAgICBjb25zdCBjbGlBcmdzID0gdGhpcy5hcmdzW2V4dFR5cGVdPy5bZXh0TmFtZV07XG4gICAgaWYgKCFfLmlzRW1wdHkoY2xpQXJncykpIHtcbiAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuX2ZpbmRNYXRjaGluZ0RyaXZlcih0aGlzLmRyaXZlckNvbmZpZywgZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gbG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IGxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBkcml2ZXJJbnN0YW5jZSk7XG5cblxuICAgICAgLy8gVGhpcyBhc3NpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHdlYiBzb2NrZXRzIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIHRoZSBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlciA9IHRoaXMuc2VydmVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVubmluZ0RyaXZlcnNEYXRhID0gYXdhaXQgdGhpcy5jdXJTZXNzaW9uRGF0YUZvckRyaXZlcihJbm5lckRyaXZlcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdIHx8IFtdO1xuICAgICAgICBvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ubWFwKChkcnYpID0+IGRydi5kcml2ZXJEYXRhKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5wdXNoKGRyaXZlckluc3RhbmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGRyaXZlckluc3RhbmNlLmNyZWF0ZVNlc3Npb24oXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHJlcUNhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIFsuLi5ydW5uaW5nRHJpdmVyc0RhdGEsIC4uLm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhXVxuICAgICAgICApO1xuICAgICAgICBwcm90b2NvbCA9IGRyaXZlckluc3RhbmNlLnByb3RvY29sO1xuICAgICAgICBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZHJpdmVySW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlckluc3RhbmNlLCBpbm5lclNlc3Npb25JZCk7XG5cbiAgICAgIGxvZy5pbmZvKGBOZXcgJHtJbm5lckRyaXZlci5uYW1lfSBzZXNzaW9uIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBzZXNzaW9uIGAgK1xuICAgICAgICAgICAgICBgJHtpbm5lclNlc3Npb25JZH0gYWRkZWQgdG8gbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuXG4gICAgICAvLyBzZXQgdGhlIE5ldyBDb21tYW5kIFRpbWVvdXQgZm9yIHRoZSBpbm5lciBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgICAgLy8gYXBwbHkgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIChpZiBwcm92aWRlZClcbiAgICAgIGlmIChkcml2ZXJJbnN0YW5jZS5pc1czQ1Byb3RvY29sKCkgJiYgIV8uaXNFbXB0eSh3M2NTZXR0aW5ncykpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gVzNDIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHczY1NldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKHczY1NldHRpbmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoZHJpdmVySW5zdGFuY2UuaXNNanNvbndwUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KGp3cFNldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKGp3cFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2wsXG4gICAgICB2YWx1ZTogW2lubmVyU2Vzc2lvbklkLCBkQ2FwcywgcHJvdG9jb2xdXG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIgKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIGxvZy53YXJuKGBFbmRpbmcgc2Vzc2lvbiwgY2F1c2Ugd2FzICcke2NhdXNlLm1lc3NhZ2V9J2ApO1xuXG4gICAgICBpZiAodGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRlZmluZXMgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyOyBjYWxsaW5nIGl0IG5vd2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKGRyaXZlciwgY2F1c2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBsb2cud2FybihgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICcke2lubmVyU2Vzc2lvbklkfScgZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgIGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bihvblNodXRkb3duKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBhdHRhY2ggdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gbGlzdGVuZXIuIGAgK1xuICAgICAgICBgSXMgJ29uVW5leHBlY3RlZFNodXRkb3duJyBtZXRob2QgYXZhaWxhYmxlIGZvciAnJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0nP2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGN1clNlc3Npb25EYXRhRm9yRHJpdmVyIChJbm5lckRyaXZlcikge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IF8udmFsdWVzKHNlc3Npb25zKVxuICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmRyaXZlckRhdGEpO1xuICAgIGZvciAobGV0IGRhdHVtIG9mIGRhdGEpIHtcbiAgICAgIGlmICghZGF0dW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ibGVtIGdldHRpbmcgc2Vzc2lvbiBkYXRhIGZvciBkcml2ZXIgdHlwZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke0lubmVyRHJpdmVyLm5hbWV9OyBkb2VzIGl0IGltcGxlbWVudCAnZ2V0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRyaXZlckRhdGEnP2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKHNlc3Npb25JZCkge1xuICAgIGxldCBwcm90b2NvbDtcbiAgICB0cnkge1xuICAgICAgbGV0IG90aGVyU2Vzc2lvbnNEYXRhID0gbnVsbDtcbiAgICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICAgIGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyQ29uc3RydWN0b3JOYW1lID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIG90aGVyU2Vzc2lvbnNEYXRhID0gXy50b1BhaXJzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gY3VyQ29uc3RydWN0b3JOYW1lICYmIGtleSAhPT0gc2Vzc2lvbklkKVxuICAgICAgICAgICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlLmRyaXZlckRhdGEpO1xuICAgICAgICBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICAgIGxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICR7c2Vzc2lvbklkfSBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZGVsZXRlU2Vzc2lvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IG9yIG5vdFxuICAgICAgICAvLyBtYWtlIHRoZSBzZXNzaW9uIHVuYXZhaWxhYmxlLCBiZWNhdXNlIHdobyBrbm93cyB3aGF0IHN0YXRlIGl0IG1pZ2h0XG4gICAgICAgIC8vIGJlIGluIG90aGVyd2lzZVxuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgdmFsdWU6IGF3YWl0IGRzdFNlc3Npb24uZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIG90aGVyU2Vzc2lvbnNEYXRhKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yKGBIYWQgdHJvdWJsZSBlbmRpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH06ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yOiBlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGxTZXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gICAgY29uc3Qgc2Vzc2lvbnNDb3VudCA9IF8uc2l6ZSh0aGlzLnNlc3Npb25zKTtcbiAgICBpZiAoMCA9PT0gc2Vzc2lvbnNDb3VudCkge1xuICAgICAgbG9nLmRlYnVnKCdUaGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zIGZvciBjbGVhbnVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZm9yY2UgPSBmYWxzZSxcbiAgICAgIHJlYXNvbixcbiAgICB9ID0gb3B0cztcbiAgICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ2FjdGl2ZSBzZXNzaW9uJywgc2Vzc2lvbnNDb3VudCwgdHJ1ZSl9YCk7XG4gICAgY29uc3QgY2xlYW51cFByb21pc2VzID0gZm9yY2VcbiAgICAgID8gXy52YWx1ZXModGhpcy5zZXNzaW9ucykubWFwKChkcnYpID0+IGRydi5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihyZWFzb24gJiYgbmV3IEVycm9yKHJlYXNvbikpKVxuICAgICAgOiBfLmtleXModGhpcy5zZXNzaW9ucykubWFwKChpZCkgPT4gdGhpcy5kZWxldGVTZXNzaW9uKGlkKSk7XG4gICAgZm9yIChjb25zdCBjbGVhbnVwUHJvbWlzZSBvZiBjbGVhbnVwUHJvbWlzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm9taXNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cuZGVidWcoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgcGx1Z2lucyBmb3IgYSBzZXNzaW9uIChvciBzZXNzaW9ubGVzcyBwbHVnaW5zKVxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBzZXNzaW9uSWQgKG9yIG51bGwpIHRvIHVzZSB0byBmaW5kIHBsdWdpbnNcbiAgICogQHJldHVybnMge0FycmF5fSAtIGFycmF5IG9mIHBsdWdpbiBpbnN0YW5jZXNcbiAgICovXG4gIHBsdWdpbnNGb3JTZXNzaW9uIChzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaWYgKCF0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLnNlc3Npb25sZXNzUGx1Z2lucykpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGdldCBwbHVnaW5zIGZvciBhIGNvbW1hbmQsIHdlIGVpdGhlciBnZXQgdGhlIHBsdWdpbiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBwYXJ0aWN1bGFyIGNvbW1hbmQncyBzZXNzaW9uLCBvciBpbiB0aGUgY2FzZSBvZiBzZXNzaW9ubGVzcyBwbHVnaW5zLCBwdWxsIGZyb20gdGhlIHNldCBvZlxuICAgKiBwbHVnaW4gaW5zdGFuY2VzIHJlc2VydmVkIGZvciBzZXNzaW9ubGVzcyBjb21tYW5kcyAoYW5kIHdlIGxhemlseSBjcmVhdGUgcGx1Z2luIGluc3RhbmNlcyBvblxuICAgKiBmaXJzdCB1c2UpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgLSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byBmaW5kIGEgcGx1Z2luIHRvIGhhbmRsZVxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBwYXJ0aWN1bGFyIHNlc3Npb24gZm9yIHdoaWNoIHRvIGZpbmQgYSBwbHVnaW4sIG9yIG51bGwgaWZcbiAgICogc2Vzc2lvbmxlc3NcbiAgICovXG4gIHBsdWdpbnNUb0hhbmRsZUNtZCAoY21kLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgLy8gdG8gaGFuZGxlIGEgZ2l2ZW4gY29tbWFuZCwgYSBwbHVnaW4gc2hvdWxkIGVpdGhlciBpbXBsZW1lbnQgdGhhdCBjb21tYW5kIGFzIGEgcGx1Z2luXG4gICAgLy8gaW5zdGFuY2UgbWV0aG9kIG9yIGl0IHNob3VsZCBpbXBsZW1lbnQgYSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgIHJldHVybiB0aGlzLnBsdWdpbnNGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICAgIC5maWx0ZXIoKHApID0+IF8uaXNGdW5jdGlvbihwW2NtZF0pIHx8IF8uaXNGdW5jdGlvbihwLmhhbmRsZSkpO1xuICB9XG5cbiAgY3JlYXRlUGx1Z2luSW5zdGFuY2VzICgpIHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5DbGFzc2VzLm1hcCgoUGx1Z2luQ2xhc3MpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lO1xuICAgICAgY29uc3QgcGx1Z2luID0gbmV3IFBsdWdpbkNsYXNzKG5hbWUpO1xuICAgICAgdGhpcy5hc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24oJ3BsdWdpbicsIG5hbWUsIHBsdWdpbik7XG4gICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKGNtZCwgLi4uYXJncykge1xuICAgIC8vIFdlIGhhdmUgYmFzaWNhbGx5IHRocmVlIGNhc2VzIGZvciBob3cgdG8gaGFuZGxlIGNvbW1hbmRzOlxuICAgIC8vIDEuIGhhbmRsZSBnZXRTdGF0dXMgKHdlIGRvIHRoaXMgYXMgYSBzcGVjaWFsIG91dCBvZiBiYW5kIGNhc2Ugc28gaXQgZG9lc24ndCBnZXQgYWRkZWQgdG8gYW5cbiAgICAvLyAgICBleGVjdXRpb24gcXVldWUsIGFuZCBjYW4gYmUgY2FsbGVkIHdoaWxlIGUuZy4gY3JlYXRlU2Vzc2lvbiBpcyBpbiBwcm9ncmVzcylcbiAgICAvLyAyLiBoYW5kbGUgY29tbWFuZHMgdGhhdCB0aGlzIHVtYnJlbGxhIGRyaXZlciBzaG91bGQgaGFuZGxlLCByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIHNlc3Npb25cbiAgICAvLyAgICBkcml2ZXIgKGZvciBleGFtcGxlLCBkZWxldGVTZXNzaW9uLCBvciBvdGhlciBub24tc2Vzc2lvbiBjb21tYW5kcylcbiAgICAvLyAzLiBoYW5kbGUgc2Vzc2lvbiBkcml2ZXIgY29tbWFuZHMuXG4gICAgLy8gVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgYmVjYXVzZSB3ZSBzdXBwb3J0IGNvbW1hbmQgcGx1Z2lucywgd2UgbmVlZCB0byB3cmFwIGFueSBvZiB0aGVzZVxuICAgIC8vIGNhc2VzIHdpdGggcGx1Z2luIGhhbmRsaW5nLlxuXG4gICAgY29uc3QgaXNHZXRTdGF0dXMgPSBjbWQgPT09ICdnZXRTdGF0dXMnO1xuICAgIGNvbnN0IGlzVW1icmVsbGFDbWQgPSAhaXNHZXRTdGF0dXMgJiYgaXNBcHBpdW1Ecml2ZXJDb21tYW5kKGNtZCk7XG4gICAgY29uc3QgaXNTZXNzaW9uQ21kID0gIWlzR2V0U3RhdHVzICYmICFpc1VtYnJlbGxhQ21kO1xuXG4gICAgLy8gaWYgYSBwbHVnaW4gb3ZlcnJpZGUgcHJveHlpbmcgZm9yIHRoaXMgY29tbWFuZCBhbmQgdGhhdCBpcyB3aHkgd2UgYXJlIGhlcmUgaW5zdGVhZCBvZiBqdXN0XG4gICAgLy8gbGV0dGluZyB0aGUgcHJvdG9jb2wgcHJveHkgdGhlIGNvbW1hbmQgZW50aXJlbHksIGRldGVybWluZSB0aGF0LCBnZXQgdGhlIHJlcXVlc3Qgb2JqZWN0IGZvclxuICAgIC8vIHVzZSBsYXRlciBvbiwgdGhlbiBjbGVhbiB1cCB0aGUgYXJnc1xuICAgIGNvbnN0IHJlcUZvclByb3h5ID0gXy5sYXN0KGFyZ3MpPy5yZXFGb3JQcm94eTtcbiAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgIGFyZ3MucG9wKCk7XG4gICAgfVxuXG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSk7XG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2Vzc2lvbiB3aXRoIGlkICcke3Nlc3Npb25JZH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgc2F2ZSB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgZ2l2ZW4gdGhhdCB0aGUgc2Vzc2lvbiBkcml2ZXIncyBwcm90b2NvbCBtaWdodCBkaWZmZXJcbiAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgIGRyaXZlciA9IGRzdFNlc3Npb247XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGhhbmRsaW5nIHRoaXMgY29tbWFuZFxuICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbnNUb0hhbmRsZUNtZChjbWQsIHNlc3Npb25JZCk7XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGEgJ2NtZEhhbmRsZWRCeScgb2JqZWN0IHdoaWNoIHdpbGwga2VlcCB0cmFjayBvZiB3aGljaCBwbHVnaW5zIGhhdmUgaGFuZGxlZCB0aGlzXG4gICAgLy8gY29tbWFuZC4gd2UgY2FyZSBhYm91dCB0aGlzIGJlY2F1c2UgKGEpIG11bHRpcGxlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGUgc2FtZSBjb21tYW5kLCBhbmRcbiAgICAvLyAoYikgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHBsdWdpbiB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlIG5leHQoKSBtZXRob2Qgd2hpY2ggcnVucyB0aGVcbiAgICAvLyBvcmlnaW5hbCBjb21tYW5kIGV4ZWN1dGlvbi4gVGhpcyByZXN1bHRzIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21tYW5kIG1pZ2h0IGJlIGhhbmRsZWRcbiAgICAvLyBieSBzb21lIGJ1dCBub3QgYWxsIHBsdWdpbnMsIG9yIGJ5IHBsdWdpbihzKSBidXQgbm90IGJ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBTbyBzdGFydCBvdXRcbiAgICAvLyB0aGlzIG9iamVjdCBkZWNsYXJpbmcgdGhhdCB0aGUgZGVmYXVsdCBoYW5kbGVyIGhhcyBub3QgYmVlbiBleGVjdXRlZC5cbiAgICBjb25zdCBjbWRIYW5kbGVkQnkgPSB7ZGVmYXVsdDogZmFsc2V9O1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBwbHVnaW5zLCBhbmQgc3VjY2Vzc2l2ZWx5IHdyYXBwZWRcbiAgICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsdWdpbiB0aGF0IGNhbiBoYW5kbGUgdGhlIGNvbW1hbmQuIFRvIHN0YXJ0IG9mZiB3aXRoLCB0aGUgYXN5bmNcbiAgICAvLyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGNhbGxpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGkuZS4sIHdoaWNoZXZlciBvZiB0aGUgMyBjYXNlcyBhYm92ZSBpc1xuICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBvbmVcbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpZiB3ZSdyZSBydW5uaW5nIHdpdGggcGx1Z2lucywgbWFrZSBzdXJlIHdlIGxvZyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFjdHVhbGx5XG4gICAgICAvLyBoYXBwZW5pbmcgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgcGx1Z2luIGNhbGwgY2hhaW4gaXMgdW53cmFwcGluZyB0byB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgLy8gaWYgdGhhdCdzIHdoYXQgaGFwcGVuc1xuICAgICAgcGx1Z2lucy5sZW5ndGggJiYgbG9nLmluZm8oYEV4ZWN1dGluZyBkZWZhdWx0IGhhbmRsaW5nIGJlaGF2aW9yIGZvciBjb21tYW5kICcke2NtZH0nYCk7XG5cbiAgICAgIC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGhhbmRsZWRcbiAgICAgIGNtZEhhbmRsZWRCeS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICAgIC8vIHdlIHdvdWxkIGhhdmUgcHJveGllZCB0aGlzIGNvbW1hbmQgaGFkIGEgcGx1Z2luIG5vdCBoYW5kbGVkIGl0LCBzbyB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAvLyBpcyB0byBkbyB0aGUgcHJveHkgYW5kIHJldHJpZXZlIHRoZSByZXN1bHQgaW50ZXJuYWxseSBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gaW4gY2FzZSBpdCBjYWxscyAnYXdhaXQgbmV4dCgpJy4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkcml2ZXIgaGF2ZSBkZWZpbmVkXG4gICAgICAgIC8vICdwcm94eUNvbW1hbmQnIGFuZCBub3QganVzdCAncHJveHlSZXFSZXMnLlxuICAgICAgICBpZiAoIWRzdFNlc3Npb24ucHJveHlDb21tYW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQocmVxRm9yUHJveHkub3JpZ2luYWxVcmwsIHJlcUZvclByb3h5Lm1ldGhvZCxcbiAgICAgICAgICByZXFGb3JQcm94eS5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzR2V0U3RhdHVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICAvLyBzb21lIGNvbW1hbmRzLCBsaWtlIGRlbGV0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZSBvbiAqdGhpcyogZHJpdmVyLFxuICAgICAgICAvLyBub3QgdGhlIHBsYXRmb3JtIGRyaXZlclxuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIC8vIEFuZCBmaW5hbGx5LCBpZiB0aGUgY29tbWFuZCB3YXMgY3JlYXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtaWdyYXRlIGFueSBwbHVnaW5zIHdoaWNoIHdlcmVcbiAgICAvLyBwcmV2aW91c2x5IHNlc3Npb25sZXNzIHRvIHVzZSB0aGUgbmV3IHNlc3Npb25JZCwgc28gdGhhdCBwbHVnaW5zIGNhbiBzaGFyZSBzdGF0ZSBiZXR3ZWVuXG4gICAgLy8gdGhlaXIgY3JlYXRlU2Vzc2lvbiBtZXRob2QgYW5kIG90aGVyIGluc3RhbmNlIG1ldGhvZHNcbiAgICBpZiAoY21kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EICYmIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aCAmJiAhcmVzLmVycm9yKSB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBfLmZpcnN0KHJlcy52YWx1ZSk7XG4gICAgICBsb2cuaW5mbyhgUHJvbW90aW5nICR7dGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RofSBzZXNzaW9ubGVzcyBwbHVnaW5zIHRvIGJlIGF0dGFjaGVkIGAgK1xuICAgICAgICAgICAgICAgYHRvIHNlc3Npb24gSUQgJHtzZXNzaW9uSWR9YCk7XG4gICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHdyYXBDb21tYW5kV2l0aFBsdWdpbnMgKHtkcml2ZXIsIGNtZCwgYXJncywgbmV4dCwgY21kSGFuZGxlZEJ5LCBwbHVnaW5zfSkge1xuICAgIHBsdWdpbnMubGVuZ3RoICYmIGxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBpcyBub3cgaGFuZGxpbmcgY21kICcke2NtZH0nYCk7XG4gICAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSB0cnVlOyAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHRoaXMgcGx1Z2luIGhhcyBhdHRlbXB0ZWQgdG8gaGFuZGxlIGNtZFxuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgY29tbWFuZCB2aWEgYSBjb21tYW5kLXNwZWNpZmljIGhhbmRsZXIgb24gdGhlIHBsdWdpblxuICAgICAgICBpZiAocGx1Z2luW2NtZF0pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luW2NtZF0oX25leHQsIGRyaXZlciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjYWxsIHRoZSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luLmhhbmRsZShfbmV4dCwgZHJpdmVyLCBjbWQsIC4uLmFyZ3MpO1xuICAgICAgfSkobmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KSB7XG4gICAgaWYgKCFwbHVnaW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRheSwgd2UgaGF2ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHdoaWNoIHBsdWdpbnMgZW5kZWQgdXAgZ2V0dGluZ1xuICAgIC8vIHRoZWlyIGNvZGUgcnVuIGFzIHBhcnQgb2YgaGFuZGxpbmcgdGhpcyBjb21tYW5kLiBCZWNhdXNlIHBsdWdpbnMgY2FuIGNob29zZSAqbm90KiB0b1xuICAgIC8vIHBhc3MgY29udHJvbCB0byBvdGhlciBwbHVnaW5zIG9yIHRvIHRoZSBkZWZhdWx0IGRyaXZlciBiZWhhdmlvciwgdGhpcyBpcyBpbmZvcm1hdGlvblxuICAgIC8vIHdoaWNoIGlzIHByb2JhYmx5IHVzZWZ1bCB0byB0aGUgdXNlciAoZXNwZWNpYWxseSBpbiBzaXR1YXRpb25zIHdoZXJlIHBsdWdpbnMgbWlnaHQgbm90XG4gICAgLy8gaW50ZXJhY3Qgd2VsbCB0b2dldGhlciwgYW5kIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGVidWcgb3RoZXJ3aXNlIHdpdGhvdXQgdGhpcyBraW5kIG9mXG4gICAgLy8gbWVzc2FnZSkuXG4gICAgY29uc3QgZGlkSGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+IGNtZEhhbmRsZWRCeVtrXSk7XG4gICAgY29uc3QgZGlkbnRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gIWNtZEhhbmRsZWRCeVtrXSk7XG4gICAgaWYgKGRpZG50SGFuZGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDb21tYW5kICcke2NtZH0nIHdhcyAqbm90KiBoYW5kbGVkIGJ5IHRoZSBmb2xsb3dpbmcgYmVoYXZpb3VycyBvciBwbHVnaW5zLCBldmVuIGAgK1xuICAgICAgICAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlV3JhcHBlZENvbW1hbmQgKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pIHtcbiAgICBsZXQgY21kUmVzLCBjbWRFcnIsIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIF8uaXNGdW5jdGlvbihkc3RTZXNzaW9uLnByb3h5QWN0aXZlKSAmJiBkc3RTZXNzaW9uLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiA/IGRzdFNlc3Npb24uZ2V0UHJveHlBdm9pZExpc3QoKSA6IFtdO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5jYW5Qcm94eShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIGhlbHAgZGVjaWRlIHdoaWNoIGNvbW1hbmRzIHNob3VsZCBiZSBwcm94aWVkIHRvIHN1Yi1kcml2ZXJzIGFuZCB3aGljaFxuLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhpcywgb3VyIHVtYnJlbGxhIGRyaXZlclxuZnVuY3Rpb24gaXNBcHBpdW1Ecml2ZXJDb21tYW5kIChjbWQpIHtcbiAgcmV0dXJuICFpc1Nlc3Npb25Db21tYW5kKGNtZCkgfHwgY21kID09PSAnZGVsZXRlU2Vzc2lvbic7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gQXBwaXVtIHRyaWVkIHRvIHByb3h5IGEgY29tbWFuZCB1c2luZyBhIGRyaXZlcidzIGBwcm94eUNvbW1hbmRgIG1ldGhvZCBidXQgdGhlXG4gKiBtZXRob2QgZGlkIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfTk9fRFJJVkVSX1BST1hZQ09NTUFORCc7XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKGBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBjb21tYW5kIHdhcyB0byBwcm94eSwgYnV0IHRoZSBkcml2ZXIgYCArXG4gICAgICAgICAgYGRpZCBub3QgaGF2ZSB0aGUgJ3Byb3h5Q29tbWFuZCcgbWV0aG9kIGRlZmluZWQuIFRvIGZ1bGx5IHN1cHBvcnQgYCArXG4gICAgICAgICAgYHBsdWdpbnMsIGRyaXZlcnMgc2hvdWxkIGhhdmUgJ3Byb3h5Q29tbWFuZCcgc2V0IHRvIGEgandwUHJveHkgb2JqZWN0J3MgYCArXG4gICAgICAgICAgYCdjb21tYW5kKCknIG1ldGhvZCwgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCAncHJveHlSZXFSZXMnYCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXBwaXVtRHJpdmVyIH07XG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==