testcafe 2.2.0 → 2.3.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/bin/testcafe-with-v8-flag-filter.js +16 -3
  2. package/lib/api/exportable-lib/index.mjs +27 -0
  3. package/lib/api/skip-js-errors/index.js +36 -12
  4. package/lib/api/structure/fixture.js +6 -1
  5. package/lib/api/structure/test.js +7 -1
  6. package/lib/browser/connection/gateway.js +13 -1
  7. package/lib/browser/connection/index.js +6 -1
  8. package/lib/browser/connection/service-routes.js +2 -1
  9. package/lib/browser/provider/built-in/dedicated/chrome/index.js +6 -1
  10. package/lib/browser/provider/index.js +4 -1
  11. package/lib/cli/argument-parser/index.js +58 -59
  12. package/lib/cli/cli.js +3 -2
  13. package/lib/client/automation/index.js +88 -4
  14. package/lib/client/automation/index.min.js +1 -1
  15. package/lib/client/browser/idle-page/index.js +7 -5
  16. package/lib/client/core/deps/hammerhead.js +24 -0
  17. package/lib/client/core/index.js +21 -6
  18. package/lib/client/core/index.min.js +1 -1
  19. package/lib/client/driver/index.js +140 -52
  20. package/lib/client/driver/index.min.js +1 -1
  21. package/lib/client/test-run/iframe.js.mustache +2 -1
  22. package/lib/client/test-run/index.js.mustache +30 -28
  23. package/lib/client/ui/index.js +30 -23
  24. package/lib/client/ui/index.min.js +1 -1
  25. package/lib/compiler/babel/load-libs.js +10 -9
  26. package/lib/compiler/compilers.js +7 -7
  27. package/lib/compiler/esm-loader.js +38 -0
  28. package/lib/compiler/index.js +8 -7
  29. package/lib/compiler/interfaces.js +1 -1
  30. package/lib/compiler/prevent-module-caching-suffix.js +6 -0
  31. package/lib/compiler/test-file/add-export-api.js +3 -9
  32. package/lib/compiler/test-file/api-based.js +30 -14
  33. package/lib/compiler/test-file/base.js +4 -1
  34. package/lib/compiler/test-file/formats/coffeescript/compiler.js +5 -4
  35. package/lib/compiler/test-file/formats/es-next/compiler.js +23 -11
  36. package/lib/compiler/test-file/formats/extensions.js +15 -0
  37. package/lib/compiler/test-file/formats/typescript/compiler.js +27 -17
  38. package/lib/compiler/test-file/get-exportable-lib-path.js +17 -0
  39. package/lib/configuration/option-names.js +2 -1
  40. package/lib/errors/is-internal-stack-frame.js +3 -2
  41. package/lib/errors/process-test-fn-error.js +3 -2
  42. package/lib/errors/runtime/index.js +18 -4
  43. package/lib/errors/runtime/templates.js +2 -1
  44. package/lib/errors/test-run/utils.js +8 -3
  45. package/lib/errors/types.js +2 -1
  46. package/lib/proxyless/api-base.js +25 -0
  47. package/lib/proxyless/client/event-simulator.js +35 -0
  48. package/lib/proxyless/client/types.js +11 -0
  49. package/lib/proxyless/client/utils.js +24 -0
  50. package/lib/proxyless/console-messages/formatter.js +23 -0
  51. package/lib/proxyless/console-messages/index.js +56 -0
  52. package/lib/proxyless/console-messages/types.js +5 -0
  53. package/lib/proxyless/index.js +29 -2
  54. package/lib/proxyless/js-error-handling/index.js +70 -0
  55. package/lib/proxyless/native-dialogs/index.js +40 -0
  56. package/lib/proxyless/request-pipeline/index.js +6 -3
  57. package/lib/proxyless/resource-injector.js +7 -3
  58. package/lib/proxyless/session-storage/index.js +30 -0
  59. package/lib/proxyless/types.js +8 -1
  60. package/lib/proxyless/utils/cdp.js +19 -2
  61. package/lib/runner/bootstrapper.js +3 -2
  62. package/lib/runner/browser-job.js +1 -1
  63. package/lib/services/compiler/service.js +4 -4
  64. package/lib/services/utils/ipc/interfaces.js +1 -1
  65. package/lib/services/utils/ipc/proxy.js +1 -4
  66. package/lib/shared/utils/is-file-protocol.js +9 -0
  67. package/lib/test-run/commands/actions.js +2 -2
  68. package/lib/test-run/index.js +36 -9
  69. package/lib/testcafe.js +3 -3
  70. package/lib/utils/async-event-emitter.js +1 -1
  71. package/lib/utils/convert-to-best-fit-type.js +1 -1
  72. package/lib/utils/get-options/base.js +1 -1
  73. package/lib/utils/setup-sourcemap-support.js +10 -4
  74. package/package.json +11 -7
  75. package/ts-defs/index.d.ts +4 -4
  76. package/ts-defs/selectors.d.ts +2 -2
  77. package/ts-defs/testcafe-scripts.d.ts +2 -2
  78. package/lib/compiler/test-file/exportble-lib-path.js +0 -7
@@ -126,6 +126,7 @@ class TestRun extends async_event_emitter_1.default {
126
126
  this.consoleMessages = new browser_console_messages_1.default();
127
127
  this.pendingRequest = null;
128
128
  this.pendingPageError = null;
129
+ this.proxylessJSError = null;
129
130
  this.controller = null;
130
131
  this.ctx = Object.create(null);
131
132
  this.fixtureCtx = null;
@@ -169,8 +170,11 @@ class TestRun extends async_event_emitter_1.default {
169
170
  this._proxylessRequestPipeline.restoringStorages = storageSnapshot;
170
171
  }
171
172
  get _proxylessRequestPipeline() {
173
+ return this._proxyless.requestPipeline;
174
+ }
175
+ get _proxyless() {
172
176
  const runtimeInfo = this.browserConnection.provider.plugin.openedBrowsers[this.browserConnection.id];
173
- return runtimeInfo.proxyless.requestPipeline;
177
+ return runtimeInfo.proxyless;
174
178
  }
175
179
  _getRoleProvider() {
176
180
  if (this.opts.experimentalProxyless)
@@ -327,17 +331,18 @@ class TestRun extends async_event_emitter_1.default {
327
331
  else
328
332
  await Promise.all(this.test.requestHooks.map(hook => this._initRequestHook(hook)));
329
333
  }
330
- _prepareSkipJsErrorsOption() {
334
+ prepareSkipJsErrorsOption() {
331
335
  const options = this.test.skipJsErrorsOptions !== void 0
332
336
  ? this.test.skipJsErrorsOptions
333
337
  : this.opts.skipJsErrors || false;
334
- return (0, skip_js_errors_1.prepareSkipJsErrorsOptions)(options);
338
+ return (0, skip_js_errors_1.prepareSkipJsErrorsOptions)(options, this.opts.experimentalProxyless);
335
339
  }
336
340
  // Hammerhead payload
337
341
  async getPayloadScript() {
338
342
  this.fileDownloadingHandled = false;
339
343
  this.resolveWaitForFileDownloadingPromise = null;
340
- const skipJsErrors = this._prepareSkipJsErrorsOption();
344
+ const proxyless = this.opts.experimentalProxyless;
345
+ const skipJsErrors = proxyless ? false : this.prepareSkipJsErrorsOption();
341
346
  return mustache_1.default.render(TEST_RUN_TEMPLATE, {
342
347
  testRunId: JSON.stringify(this.session.id),
343
348
  browserId: JSON.stringify(this.browserConnection.id),
@@ -349,6 +354,7 @@ class TestRun extends async_event_emitter_1.default {
349
354
  browserActiveWindowIdUrl: JSON.stringify(this.browserConnection.activeWindowIdUrl),
350
355
  browserCloseWindowUrl: JSON.stringify(this.browserConnection.closeWindowUrl),
351
356
  browserOpenFileProtocolRelativeUrl: JSON.stringify(this.browserConnection.openFileProtocolRelativeUrl),
357
+ browserDispatchProxylessEventRelativeUrl: JSON.stringify(this.browserConnection.dispatchProxylessEventRelativeUrl),
352
358
  userAgent: JSON.stringify(this.browserConnection.userAgent),
353
359
  testName: JSON.stringify(this.test.name),
354
360
  fixtureName: JSON.stringify(this.test.fixture.name),
@@ -360,7 +366,7 @@ class TestRun extends async_event_emitter_1.default {
360
366
  speed: this.speed,
361
367
  dialogHandler: JSON.stringify(this.activeDialogHandler),
362
368
  canUseDefaultWindowActions: JSON.stringify(await this.browserConnection.canUseDefaultWindowActions()),
363
- proxyless: JSON.stringify(this.opts.experimentalProxyless),
369
+ proxyless: JSON.stringify(proxyless),
364
370
  domain: JSON.stringify(this.browserConnection.browserConnectionGateway.proxy.server1Info.domain),
365
371
  });
366
372
  }
@@ -372,6 +378,7 @@ class TestRun extends async_event_emitter_1.default {
372
378
  retryTestPages: !!this.opts.retryTestPages,
373
379
  speed: this.speed,
374
380
  dialogHandler: JSON.stringify(this.activeDialogHandler),
381
+ proxyless: JSON.stringify(this.opts.experimentalProxyless),
375
382
  });
376
383
  }
377
384
  // Hammerhead handlers
@@ -468,9 +475,11 @@ class TestRun extends async_event_emitter_1.default {
468
475
  }
469
476
  // Errors
470
477
  _addPendingPageErrorIfAny() {
471
- if (this.pendingPageError) {
472
- this.addError(this.pendingPageError);
478
+ const error = this.pendingPageError || this.proxylessJSError;
479
+ if (error) {
480
+ this.addError(error);
473
481
  this.pendingPageError = null;
482
+ this.proxylessJSError = null;
474
483
  return true;
475
484
  }
476
485
  return false;
@@ -495,6 +504,11 @@ class TestRun extends async_event_emitter_1.default {
495
504
  this.errs.push(adapter);
496
505
  });
497
506
  }
507
+ addProxylessJSError(err) {
508
+ var _a;
509
+ this.proxylessJSError = err;
510
+ this.proxylessJSError.callsite = (_a = this.currentDriverTask) === null || _a === void 0 ? void 0 : _a.callsite;
511
+ }
498
512
  normalizeRequestHookErrors() {
499
513
  const requestHookErrors = (0, lodash_1.remove)(this.errs, e => e.code === types_1.TEST_RUN_ERRORS.requestHookNotImplementedError ||
500
514
  e.code === types_1.TEST_RUN_ERRORS.requestHookUnhandledError);
@@ -784,6 +798,10 @@ class TestRun extends async_event_emitter_1.default {
784
798
  else
785
799
  error = err;
786
800
  }
801
+ if (this.proxylessJSError) {
802
+ error = this.proxylessJSError;
803
+ this.proxylessJSError = null;
804
+ }
787
805
  const duration = new Date().getTime() - start;
788
806
  if (error) {
789
807
  // NOTE: check if error is TestCafeErrorList is specific for the `useRole` action
@@ -858,8 +876,17 @@ class TestRun extends async_event_emitter_1.default {
858
876
  return await this._executeJsExpression(command);
859
877
  if (command.type === type_1.default.executeAsyncExpression)
860
878
  return this._executeAsyncJsExpression(command, callsite);
861
- if (command.type === type_1.default.getBrowserConsoleMessages)
879
+ if (command.type === type_1.default.skipJsErrors && this.opts.experimentalProxyless)
880
+ return this._proxyless.jsErrorHandlingApi.setErrorHandler(command);
881
+ if (command.type === type_1.default.getNativeDialogHistory && this.opts.experimentalProxyless)
882
+ return this._proxyless.nativeDialogsApi.getNativeDialogHistory();
883
+ if (command.type === type_1.default.setNativeDialogHandler && this.opts.experimentalProxyless)
884
+ await this._proxyless.nativeDialogsApi.fixMissingBeforeUnloadHandling();
885
+ if (command.type === type_1.default.getBrowserConsoleMessages) {
886
+ if (this.opts.experimentalProxyless)
887
+ return this._proxyless.consoleMessagesApi.getBrowserConsoleMessages();
862
888
  return this._enqueueBrowserConsoleMessagesCommand(command, callsite);
889
+ }
863
890
  if (command.type === type_1.default.switchToPreviousWindow)
864
891
  command.windowId = this.browserConnection.previousActiveWindowId;
865
892
  if (command.type === type_1.default.switchToWindowByPredicate)
@@ -1113,4 +1140,4 @@ class TestRun extends async_event_emitter_1.default {
1113
1140
  }
1114
1141
  exports.default = TestRun;
1115
1142
  module.exports = exports.default;
1116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUlnQjtBQUVoQixtQ0FBZ0M7QUFDaEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3Qyx3REFBZ0M7QUFDaEMsdUZBQTZEO0FBQzdELDREQUEwQztBQUMxQyxpR0FBb0Y7QUFDcEYsc0VBQXFEO0FBQ3JELCtDQUFpRDtBQUVqRCxrREFVNkI7QUFFN0Isd0VBQWdEO0FBQ2hELDJEQUEyQztBQUMzQywyREFBbUM7QUFDbkMsbUZBQXlEO0FBQ3pELG9FQUE0QztBQUM1QywrRUFBcUQ7QUFDckQsMERBQXVDO0FBQ3ZDLDBFQUF5RDtBQUN6RCwwRkFBZ0U7QUFDaEUsK0VBQXNEO0FBQ3RELHVGQUErRDtBQUUvRCw2REFXNkI7QUFFN0IsbUVBQXFEO0FBQ3JELDBEQUF3RTtBQUN4RSwrRUFBd0U7QUFDeEUsNENBQStFO0FBRS9FLDRDQVEwQjtBQUUxQixnREFZNEI7QUFFNUIsMkNBQWtFO0FBQ2xFLDRGQUFpRTtBQUNqRSwrRkFBNEU7QUFDNUUsK0RBQXlGO0FBS3pGLDhFQUFxRDtBQUVyRCw4RkFBb0U7QUFDcEUsOEZBQW9FO0FBTXBFLGdEQUFvRTtBQUtwRSx1R0FBNkU7QUFNN0Usb0RBQW1DO0FBRW5DLHdEQUlnQztBQUVoQyxtSEFBa0o7QUFDbEosMkZBQWlFO0FBQ2pFLGlHQUF1RTtBQUN2RSx1RUFBOEM7QUFDOUMsc0VBQXVEO0FBQ3ZELHlFQUFnRDtBQUdoRCwrRkFBb0U7QUFDcEUsNkJBQTBCO0FBRTFCLDBEQUFtRTtBQUNuRSwrQ0FBMEQ7QUFFMUQsbUZBQXlEO0FBRXpELG1EQUl5QjtBQUl6QixNQUFNLFdBQVcsR0FBbUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLE1BQU0scUJBQXFCLEdBQVMsV0FBVyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7QUFDL0YsTUFBTSxlQUFlLEdBQWUsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzlELE1BQU0sY0FBYyxHQUFnQixXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN0RSxNQUFNLDJCQUEyQixHQUFHLFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ25GLE1BQU0sZUFBZSxHQUFlLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sbUJBQW1CLEdBQVcsV0FBVyxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFFMUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLEdBQUcsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFakcsTUFBTSxpQkFBaUIsR0FBaUIsSUFBQSw2QkFBSSxFQUFDLHNDQUFzQyxDQUFXLENBQUM7QUFDL0YsTUFBTSx3QkFBd0IsR0FBVSxJQUFBLDZCQUFJLEVBQUMsdUNBQXVDLENBQVcsQ0FBQztBQUNoRyxNQUFNLCtCQUErQixHQUFHLHdCQUF3QixDQUFDO0FBQ2pFLE1BQU0sa0JBQWtCLEdBQWdCLElBQUksQ0FBQztBQUM3QyxNQUFNLDBCQUEwQixHQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFbEQsTUFBTSxxQ0FBcUMsR0FBRyxpQ0FBaUMsQ0FBQztBQUVoRixNQUFNLHVCQUF1QixHQUFHO0lBQzVCLFNBQVM7SUFDVCxrQ0FBa0M7SUFDbEMsbUNBQW1DO0lBQ25DLHNDQUFzQztDQUN6QyxDQUFDO0FBeURGLE1BQXFCLE9BQVEsU0FBUSw2QkFBaUI7SUEyRGxELFlBQW9CLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFlO1FBQ3hKLEtBQUssRUFBRSxDQUFDO1FBUEosK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBU3ZDLElBQUksQ0FBQyx1QkFBYSxDQUFDLEdBQU0sSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQVMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQVUsSUFBSSxxQkFBVSxDQUFDLGdCQUFnQixFQUFFLHFCQUFVLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakgsSUFBSSxDQUFDLElBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQWdCLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBYSxJQUFBLHFCQUFVLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQVksQ0FBQyxPQUFPLENBQUM7UUFFbEMsSUFBSSxDQUFDLGVBQWUsR0FBUyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUksSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFlLENBQUM7UUFDdEQsSUFBSSxDQUFDLGVBQWUsR0FBUSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLGtCQUFrQixHQUFLLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQTZCLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLEtBQUssQ0FBQztRQUMvSCxJQUFJLENBQUMsa0JBQWtCLEdBQUssSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBNkIsQ0FBQztRQUUxRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFpQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsT0FBTyxHQUFHLDRCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksa0NBQXNCLEVBQUUsQ0FBQztRQUVwRCxJQUFJLENBQUMsY0FBYyxHQUFLLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQVUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV2QixJQUFJLENBQUMsYUFBYSxHQUFJLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZixJQUFJLENBQUMsa0JBQWtCLEdBQVMsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFFckMsSUFBSSxDQUFDLHNCQUFzQixHQUFpQixLQUFLLENBQUM7UUFDbEQsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLElBQUksQ0FBQztRQUVqRCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO1FBRTFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLFNBQVMsR0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFvQixDQUFDO1FBQzlELElBQUksQ0FBQyxXQUFXLEdBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFzQixDQUFDO1FBQ2hFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUkscUJBQWtCLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckgsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxVQUFVLEdBQUksSUFBSSxDQUFDO1FBRXhCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFekMsSUFBSSxDQUFDLGlCQUFpQixHQUFZLElBQUksb0NBQXdCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsZUFBZSxHQUFjLGVBQWUsQ0FBQztRQUNsRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFFcEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFBLDZCQUFnQixFQUFDLENBQUUsSUFBSSxrQ0FBcUIsRUFBRSxDQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsWUFBWSxHQUFRLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxxQkFBcUIsR0FBTyxxQkFBcUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsbUJBQW1CLEdBQVMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsYUFBYSxHQUFlLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxlQUFlLEdBQUcsK0JBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFnQyxDQUFDLENBQUM7UUFFdEcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyw0QkFBNEI7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztRQUVqRCxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyx3QkFBd0IsQ0FBQztJQUNuRSxDQUFDO0lBRU0sb0JBQW9CLENBQUUsZUFBaUM7UUFDMUQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBWSx5QkFBeUI7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyRyxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO0lBQ2pELENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQjtZQUMvQixPQUFPLElBQUkscUNBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsT0FBTyxJQUFJLGlDQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxtQkFBbUIsQ0FBRSxJQUFVLEVBQUUsSUFBNkI7O1FBQ2xFLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLGVBQWUsTUFBSyxLQUFLLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQyxlQUF5QixDQUFDO0lBQzFDLENBQUM7SUFFTyxrQkFBa0IsQ0FBRSxJQUFVLEVBQUUsSUFBNkI7O1FBQ2pFLE9BQU87WUFDSCxJQUFJLEVBQUUsQ0FBQSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLGtCQUFrQixLQUFJLElBQUksQ0FBQyxrQkFBNEI7WUFDNUUsSUFBSSxFQUFFLENBQUEsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxrQkFBa0IsS0FBSSxJQUFJLENBQUMsa0JBQTRCO1NBQy9FLENBQUM7SUFDTixDQUFDO0lBRU8sb0JBQW9CLENBQUUsT0FBZSxFQUFFLEtBQXlDO1FBQ3BGLE9BQU87WUFDSCxPQUFPO1lBQ1AsVUFBVSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztJQUNOLENBQUM7SUFFTyx3QkFBd0IsQ0FBRSxJQUE2QjtRQUMzRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBOEIsSUFBSSxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLG9CQUFvQjtZQUNyQixPQUFPLElBQUksQ0FBQztRQUVoQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLDJCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRU8sdUJBQXVCLENBQUUsSUFBNkI7UUFDMUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQTZCLElBQUksQ0FBQyxDQUFDO1FBRXBFLElBQUksQ0FBQyxtQkFBbUI7WUFDcEIsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsSUFBSSwwQkFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsSUFBVyx1QkFBdUI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFDeEQsT0FBTyxJQUFJLENBQUM7UUFFaEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNILE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDO1lBQzNJLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCO1lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFTywwQ0FBMEM7UUFDOUMsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxHQUFHLElBQUEsOEJBQXNCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUErQixDQUFDLENBQUM7UUFFdkcsSUFBSSxLQUFLLENBQUMsTUFBTTtZQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHlCQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUU5RSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBOEIsSUFBQSx3QkFBZSxFQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDN0UsTUFBTSxpQ0FBaUMsR0FBRyxJQUFBLG9DQUEyQixFQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRS9GLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHlCQUFlLENBQUMsa0NBQWtDLEVBQUUsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7U0FDN0g7SUFDTCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsMENBQTBDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JFLE9BQU87Z0JBQ0gsR0FBRyxFQUFHLElBQUEsaUJBQXdCLEVBQUMsTUFBc0IsQ0FBQztnQkFDdEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUF5QjthQUN6QyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDbkMsQ0FBQztJQUVNLGlCQUFpQixDQUFFLFVBQXNCO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFFLElBQWlCO1FBQzVDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNyQyxPQUFPO1FBRVgsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUUsSUFBaUI7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdEMsT0FBTztRQUVYLElBQUEsYUFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUUsSUFBaUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRW5DLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRTtnQkFDakUsU0FBUyxFQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDOUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pELFVBQVUsRUFBVyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDbEQsRUFBRSxDQUFDLEdBQTJCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFTyxLQUFLLENBQUMsa0NBQWtDLENBQUUsTUFBYyxFQUFFLGFBQXFCLEVBQUUsS0FBMEI7UUFDL0csTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFFNUIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFO2dCQUNqRSxTQUFTLEVBQVksQ0FBQyxLQUFtQixFQUFFLEVBQUUsV0FBQyxPQUFBLE1BQUEsSUFBSSxDQUFDLGVBQWUsMENBQUUsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSwyQkFBc0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUEsRUFBQTtnQkFDcEssbUJBQW1CLEVBQUUsQ0FBQyxLQUE2QixFQUFFLEVBQUUsV0FBQyxPQUFBLE1BQUEsSUFBSSxDQUFDLGVBQWUsMENBQUUsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSwyQkFBc0IsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQSxFQUFBO2dCQUN6TCxVQUFVLEVBQVcsQ0FBQyxLQUFvQixFQUFFLEVBQUUsV0FBQyxPQUFBLE1BQUEsSUFBSSxDQUFDLGVBQWUsMENBQUUsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSwyQkFBc0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUEsRUFBQTthQUN6SyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8seUJBQXlCLENBQUUsS0FBNkIsRUFBRSxhQUFxQjtRQUNuRixJQUFJLEdBQUcsR0FBd0MsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMzRCxNQUFNLHNDQUFzQyxHQUFHLENBQUMsR0FBbUMsYUFBbkMsR0FBRyx1QkFBSCxHQUFHLENBQWtDLElBQUksTUFBSyx1QkFBZSxDQUFDLDhCQUE4QixDQUFDO1FBRTdJLElBQUksQ0FBQyxzQ0FBc0M7WUFDdkMsR0FBRyxHQUFHLElBQUksb0NBQXlCLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFFLElBQWlCO1FBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8sS0FBSyxDQUFDLDRCQUE0QixDQUFFLEtBQTBCO1FBQ2xFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8saUNBQWlDO1FBQ3JDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7b0JBQzVDLGFBQWE7b0JBQ2IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQzNGLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEYsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUN2RSxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hELE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2RyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7O1lBRUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVPLDBCQUEwQjtRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssQ0FBQztZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBbUQsSUFBSSxLQUFLLENBQUM7UUFFN0UsT0FBTyxJQUFBLDJDQUEwQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxxQkFBcUI7SUFDZCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3pCLElBQUksQ0FBQyxzQkFBc0IsR0FBaUIsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7UUFFakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFdkQsT0FBTyxrQkFBUSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtZQUN0QyxTQUFTLEVBQTJCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkUsU0FBUyxFQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDN0UsY0FBYyxFQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDdkUsMkJBQTJCLEVBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7WUFDL0Ysd0JBQXdCLEVBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7WUFDNUYsNEJBQTRCLEVBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUM7WUFDaEcsc0JBQXNCLEVBQWMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDO1lBQzFGLHdCQUF3QixFQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDO1lBQzVGLHFCQUFxQixFQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztZQUN6RixrQ0FBa0MsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQztZQUN0RyxTQUFTLEVBQTJCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUNwRixRQUFRLEVBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEUsV0FBVyxFQUF5QixJQUFJLENBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBbUIsQ0FBQyxJQUFJLENBQUM7WUFDdkYsZUFBZSxFQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDN0QsZUFBZSxFQUFxQixJQUFJLENBQUMsZUFBZTtZQUN4RCx1QkFBdUIsRUFBYSwwQkFBMEI7WUFDOUQsWUFBWSxFQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUNoRSxjQUFjLEVBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUM1RCxLQUFLLEVBQStCLElBQUksQ0FBQyxLQUFLO1lBQzlDLGFBQWEsRUFBdUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDNUUsMEJBQTBCLEVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQzdHLFNBQVMsRUFBMkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ25GLE1BQU0sRUFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDL0gsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0I7UUFDL0IsT0FBTyxrQkFBUSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUM3QyxTQUFTLEVBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQzFDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxjQUFjLEVBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUMzQyxLQUFLLEVBQVksSUFBSSxDQUFDLEtBQUs7WUFDM0IsYUFBYSxFQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1NBQzVELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxzQkFBc0I7SUFDZixrQkFBa0I7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNyQyxDQUFDO0lBRU0sa0JBQWtCO1FBQ3JCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDO1NBQ3BEOztZQUVHLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQUVNLGdCQUFnQixDQUFFLElBQXNDO1FBQzNELElBQUksSUFBSSxDQUFDLG1CQUFtQjtZQUN4QixJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFFTSxlQUFlLENBQUUsR0FBUSxFQUFFLEdBQVU7UUFDeEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksd0JBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsd0NBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCwwQkFBMEI7SUFDbEIsS0FBSyxDQUFDLGNBQWMsQ0FBRSxLQUFtQixFQUFFLEVBQVksRUFBRSxPQUFnQztRQUM3RixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJO1lBQ0EsTUFBTSxJQUFBLGlDQUFvQixFQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLEdBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtnQkFDTztZQUNKLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjOztRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUN4QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBWSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTlHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2xCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRyxJQUFJLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLDBDQUFFLFlBQVk7WUFDL0IsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBWSxDQUFDLHVCQUF1QixFQUFFLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLDBDQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVuSSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWE7O1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFZLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2pHLElBQUksTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sMENBQUUsV0FBVztZQUNuQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBWSxDQUFDLHNCQUFzQixFQUFFLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLDBDQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxSCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUN2QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFFLEVBQVU7UUFDdEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWxGLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFFRCwwQkFBYyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNkLDBCQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpCLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVSxFQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTVELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU3QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekIsSUFBSSxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUM3QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUM5QjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVk7WUFDakIsT0FBTztRQUVYLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBRTlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXRFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV0RSxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMzRDtRQUVELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUvQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRWxDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFN0MsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxTQUFTO0lBQ0QseUJBQXlCO1FBQzdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUU3QixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLGNBQWMsQ0FBRSxHQUFVO1FBQzlCLGFBQWE7UUFDYixHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBQSxlQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLG1CQUFtQixDQUFFLEdBQVU7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixPQUFPLElBQUksNkJBQThCLENBQUMsR0FBRyxFQUFFO1lBQzNDLFNBQVMsRUFBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUztZQUNoRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEVBQUU7WUFDNUMsU0FBUyxFQUFPLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLFlBQVksRUFBSSxJQUFJLENBQUMsS0FBSztTQUM3QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sUUFBUSxDQUFFLEdBQWlEO1FBQzlELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxZQUFZLG9CQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFZLENBQUM7UUFFbEYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sMEJBQTBCO1FBQzdCLE1BQU0saUJBQWlCLEdBQUcsSUFBQSxlQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUMzQyxDQUFpQyxDQUFDLElBQUksS0FBSyx1QkFBZSxDQUFDLDhCQUE4QjtZQUN6RixDQUFpQyxDQUFDLElBQUksS0FBSyx1QkFBZSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFM0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07WUFDekIsT0FBTztRQUVYLE1BQU0scUJBQXFCLEdBQUcsSUFBQSxjQUFLLEVBQUMsaUJBQWlCLENBQUM7YUFDakQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1IsTUFBTSxHQUFHLEdBQUcsQ0FBb0MsQ0FBQztZQUVqRCxPQUFPLEdBQUcsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUM5QyxDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDdkMsS0FBSyxFQUFFLENBQUM7UUFFYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGFBQWE7SUFDTCxlQUFlLENBQUUsT0FBb0IsRUFBRSxRQUF3QjtRQUNuRSxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQ25CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRWxFLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCO2dCQUM1QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFXLHFCQUFxQjtRQUM1QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBQSx5QkFBYyxFQUFDLElBQStCLEVBQUUscUNBQXFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9LLENBQUM7SUFFTSxLQUFLLENBQUMscUNBQXFDLENBQUUsT0FBb0IsRUFBRSxRQUF3QjtRQUM5RixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUxRCxhQUFhO1FBQ2IsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRSxPQUEwQjtRQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFFLE9BQTBCO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxHQUFHLEdBQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUxRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLHFCQUFxQixDQUFFLE9BQTZCO1FBQzdELE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxLQUFLLENBQUMsNEJBQTRCLENBQUUsUUFBb0MsRUFBRSxLQUFjO1FBQzVGLElBQUksSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxDQUFZLENBQUM7SUFDeEosQ0FBQztJQUVPLHlCQUF5QjtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBQSx3QkFBZ0IsRUFBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2RyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBRU8saUJBQWlCLENBQUUsWUFBMEI7UUFDakQsSUFBSSxZQUFZLENBQUMsS0FBSztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLElBQVcsaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8seUJBQXlCLENBQUUsTUFBZ0I7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLHFCQUFxQjtZQUMxQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU8sd0JBQXdCLENBQUUsR0FBVTtRQUN4QyxhQUFhO1FBQ2IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7UUFFL0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ1Ysb0JBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBRSxPQUEyQjtRQUN2RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHdCQUF3QjtJQUNoQiwrQkFBK0IsQ0FBRSxZQUEwQjtRQUMvRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1FBRXRELE1BQU0sNkJBQTZCLEdBQUcsY0FBYyxZQUFZLG1CQUFtQixDQUFDLHNCQUFzQjtZQUN0RyxjQUFjLFlBQVksMENBQTRCLENBQUM7UUFFM0QsTUFBTSxhQUFhLEdBQUcsY0FBYyxZQUFZLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQztRQUVyRixNQUFNLDJCQUEyQixHQUM3QixZQUFZLENBQUMsa0NBQWtDLElBQUksQ0FBQyw2QkFBNkIsSUFBSSxhQUFhLENBQUMsQ0FBQztRQUV4RyxPQUFPLENBQUMsMkJBQTJCLENBQUM7SUFDeEMsQ0FBQztJQUVPLHlCQUF5QixDQUFFLFlBQTBCOztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUN2QixPQUFPO1FBRVgsSUFBSSxNQUFBLFlBQVksQ0FBQyxRQUFRLDBDQUFFLE1BQU0sRUFBRTtZQUMvQixZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQXNCLEVBQUUsRUFBRTtnQkFDckQsSUFBQSw4QkFBa0IsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLHlCQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekgsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksWUFBWSxDQUFDLGNBQWM7WUFDM0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMxRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUM7WUFDdkQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sc0JBQXNCLENBQUUsU0FBZ0I7UUFDNUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBQSxzQ0FBOEIsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFFN0IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksU0FBUyxDQUFDO1FBRTNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUUsWUFBMEI7UUFDMUQsTUFBTSxVQUFVLEdBQW1CLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDN0QsY0FBWSxDQUFDLFFBQVEsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBb0IsSUFBSSxDQUFDLGdCQUFnQixJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDbkYsTUFBTSwwQkFBMEIsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLDBCQUEwQixJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUU7WUFDN0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBRWpDLE9BQU8sK0JBQStCLENBQUM7YUFDMUM7WUFFRCxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFN0MsSUFBSSxZQUFZLENBQUMsd0JBQXdCO2dCQUNyQyxPQUFPLElBQUksQ0FBQztTQUNuQjtRQUVELE9BQU8sSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEI7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFFaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUUvQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLFVBQVUsSUFBSyxPQUFlLENBQUMsYUFBYTtZQUMxRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBRSxPQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUUxRixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsa0JBQWtCO0lBQ1YsS0FBSyxDQUFDLG9CQUFvQixDQUFFLE9BQWlDO1FBQ2pFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3RELElBQUksVUFBVSxHQUFhLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFFOUMsSUFBSSxrQkFBa0I7WUFDbEIsVUFBVSxHQUFHLEdBQUcsa0JBQWtCLE1BQU0sVUFBVSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFFaEYsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDNUMsVUFBVTtnQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLE9BQU8sRUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRTthQUM1QyxDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBRSxPQUFzQyxFQUFFLFFBQWlCO1FBQzlGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDO2dCQUNqRCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7Z0JBQzlCLFNBQVMsRUFBRyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsUUFBUTthQUNYLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU8sc0RBQXNELENBQUUsT0FBeUI7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3JCLE9BQU87UUFFWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFFbEIsT0FBTyxDQUFDLE1BQU0sR0FBRywrQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7O1lBQ25ELE9BQU8sTUFBQSxJQUFJLENBQUMsZUFBZSwwQ0FBRSx1QkFBdUIsQ0FBQztnQkFDakQsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7YUFDeEIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sOENBQThDLENBQUUsUUFBMkI7UUFDL0UsUUFBUSxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUU7O1lBQ2YsT0FBTyxNQUFBLElBQUksQ0FBQyxlQUFlLDBDQUFFLGtCQUFrQixDQUFDO2dCQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7YUFDakMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBRSxPQUF5QixFQUFFLFFBQXdCO1FBQ2hGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLGlEQUF3QyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxzREFBc0QsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RSxNQUFNLGdCQUFnQixHQUFHLElBQUEsK0JBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBVyxJQUFJLGtCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVwRixRQUFRLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxlQUFlLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVKLFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxlQUFlLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFFcEcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWhHLE9BQU8sTUFBTSxTQUFTLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sK0JBQStCLENBQUUsT0FBb0I7UUFDekQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxRQUFRLEVBQUU7WUFDeEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO2FBRUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxzQkFBc0I7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFJLE9BQWUsQ0FBQyxhQUFhLENBQUM7YUFFekQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxjQUFjO1lBQ2pELElBQUksQ0FBQyxvQkFBb0IsR0FBSSxPQUFlLENBQUMsUUFBUSxDQUFDO2FBRXJELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFZLENBQUMsa0JBQWtCO1lBQ3JELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7YUFFaEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxZQUFZO1lBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUksT0FBZSxDQUFDLEtBQUssQ0FBQzthQUVuQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLGtCQUFrQjtZQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFJLE9BQWUsQ0FBQyxRQUFRLENBQUM7YUFFaEQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBRXJCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFZLENBQUMsWUFBWSxFQUFFO1lBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFFTCxDQUFDO0lBRU8sS0FBSyxDQUFDLHdCQUF3QixDQUFFLE9BQWtDO1FBQ3RFLE1BQU0sU0FBUyxHQUFzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQy9ELE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoSCxJQUFJLENBQUMsd0JBQXdCO1lBQ3pCLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxLQUFLLENBQUMsbUNBQW1DLENBQUUsT0FBb0IsRUFBRSxRQUF3Qjs7UUFDNUYsSUFBSSxDQUFBLE1BQUMsT0FBZSxDQUFDLE9BQU8sMENBQUUsWUFBWSxNQUFLLEtBQUssQ0FBQztZQUNqRCxPQUFPO1FBRVgsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxRQUFRLEVBQUU7WUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUUsT0FBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV2RixJQUFJLENBQUMsTUFBTTtnQkFDUCxPQUFPO1lBRVgsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFM0MsT0FBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBQSwyQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pFO2FBRUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxRQUFRLEVBQUU7WUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxlQUFlLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBRWpHLElBQUksQ0FBQyxNQUFNO2dCQUNQLE9BQU87WUFFWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUzQyxPQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFBLDJCQUFlLEVBQUMsSUFBSSxDQUFDLENBQUM7U0FDakU7YUFDSSxJQUFJLE9BQU8sWUFBWSw4Q0FBZ0MsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUN4SCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1lBRXZDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksZUFBZSxDQUFDLG1DQUFtQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ25IO0lBRUwsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBRSxPQUFvQixFQUFFLFFBQXlCO1FBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFBLDZDQUFxQyxFQUFDLE9BQU8sQ0FBQztZQUNqRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBRSxPQUF3QyxFQUFFLFFBQWtDO1FBQ3JHLE9BQU8sT0FBTyxZQUFZLDJCQUFpQjtZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxRQUEwQixDQUFDO1lBQ2pFLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCLENBQUUsT0FBMEIsRUFBRSxRQUF3QjtRQUNwRixNQUFNLFVBQVUsR0FBRyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBRWxFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBVSxJQUFJLENBQUM7UUFDeEIsSUFBSSxNQUFNLEdBQVMsSUFBSSxDQUFDO1FBRXhCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbkMsSUFBSTtZQUNBLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sR0FBRyxFQUFFO1lBQ1IsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUNmO1FBRUQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUd2RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLEtBQUs7Z0JBQ04sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sR0FBRyxFQUFFO1lBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGVBQVksQ0FBQyxtQkFBbUIsSUFBSSxHQUFHLFlBQVksd0NBQTZCO2dCQUMvRixJQUFBLDhCQUFrQixFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQWUsQ0FBQyw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDOztnQkFFckksS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUNuQjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRTlDLElBQUksS0FBSyxFQUFFO1lBQ1AsaUZBQWlGO1lBQ2pGLHFFQUFxRTtZQUNyRSwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLG9CQUFpQixDQUFDLEVBQUU7Z0JBQ3ZDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFbkQsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFBLCtCQUFrQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdEU7O2dCQUVHLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQ3BDO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsTUFBTTtZQUNOLFFBQVE7WUFDUixHQUFHLEVBQUUsWUFBWTtTQUNwQixDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXRELElBQUksS0FBSztZQUNMLE1BQU0sS0FBSyxDQUFDO1FBRWhCLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQUUsT0FBb0IsRUFBRSxRQUFrQztRQUMxRixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFBLHNDQUE4QixFQUFDLE9BQU8sQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUEwQixDQUFDLENBQUM7UUFFeEUsSUFBSSxJQUFBLG1DQUEyQixFQUFDLE9BQU8sQ0FBQztZQUNwQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVsQyxJQUFJLENBQUMsK0JBQStCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLFFBQTBCLENBQUMsQ0FBQztRQUUxRSxJQUFJLElBQUEsMkJBQW1CLEVBQUMsT0FBTyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSx5QkFBZSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFFekcsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUVELE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQW9DLENBQUMsQ0FBQztTQUM3RTtRQUVELElBQUksSUFBQSxvQ0FBNEIsRUFBQyxPQUFPLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTVDLElBQUksSUFBQSw2QkFBcUIsRUFBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7Z0JBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pJO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxJQUFJO1lBQ2xDLE9BQU8sSUFBQSxlQUFLLEVBQUUsT0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFZLENBQUMsa0JBQWtCO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFZLENBQUMsS0FBSyxFQUFFO1lBQ3JDLGlIQUFpSDtZQUNqSCwwREFBMEQ7WUFDMUQsc0lBQXNJO1lBQ3RJLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFdkYsSUFBSSxRQUFRO2dCQUNSLE9BQU8sTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXZGLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBRXZCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTFHLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxJQUFJLEVBQUUsR0FBRyxHQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBRSxPQUFlLENBQUMsSUFBSSxFQUFFLFFBQTBCLENBQUMsQ0FBQztZQUUvRixFQUFFLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFakUsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxlQUFlLEVBQUU7WUFDL0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFpQyxDQUFDO1lBQ3ZELE1BQU0sU0FBUyxHQUFNLElBQUEsNEJBQWdCLEVBQUMsRUFBRSxDQUFDLENBQUM7WUFFMUMsT0FBTyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLFNBQVM7WUFDdkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBMkIsRUFBRSxRQUEwQixDQUFDLENBQUM7UUFFM0YsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxpQkFBaUI7WUFDL0MsT0FBTyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFtQyxDQUFDLENBQUM7UUFFaEYsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxzQkFBc0I7WUFDcEQsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBd0MsRUFBRSxRQUFrQixDQUFDLENBQUM7UUFFeEcsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyx5QkFBeUI7WUFDdkQsT0FBTyxJQUFJLENBQUMscUNBQXFDLENBQUMsT0FBTyxFQUFFLFFBQTBCLENBQUMsQ0FBQztRQUUzRixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLHNCQUFzQjtZQUNuRCxPQUFlLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQztRQUU5RSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLHlCQUF5QjtZQUN2RCxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUEyQyxDQUFDLENBQUM7UUFFeEYsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxVQUFVO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQTRCLENBQUMsQ0FBQztRQUVqRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLFVBQVU7WUFDeEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBNEIsQ0FBQyxDQUFDO1FBRWpFLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxjQUFZLENBQUMsYUFBYTtZQUMzQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUErQixDQUFDLENBQUM7UUFFdkUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQVksQ0FBQyxlQUFlO1lBQzdDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBRSxPQUFrQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBWSxDQUFDLGtCQUFrQjtZQUNoRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUUsT0FBcUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFFBQTBCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8sMkJBQTJCLENBQUUsUUFBeUI7UUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRWxDLGFBQWE7UUFDYixHQUFHLENBQUMsUUFBUSxHQUFZLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sNkNBQTZDO1FBQ2pELE9BQU8sSUFBSSxjQUFjLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRU0sS0FBSyxDQUFDLHFCQUFxQixDQUFFLGNBQXVCO1FBQ3ZELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssV0FBcUMsYUFBckMsV0FBVyx1QkFBWCxXQUFXLENBQTRCLFdBQVcsQ0FBQTtZQUM5RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSwyQkFBMkIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQVcsQ0FBQztJQUMvSixDQUFDO0lBRU8saUJBQWlCLENBQUUsRUFBWSxFQUFFLFFBQWdCLEVBQUUsS0FBYztRQUNyRSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ2QsYUFBYTtZQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFdkIsSUFBSTtnQkFDQSxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7YUFDckI7b0JBQ087Z0JBQ0osYUFBYTtnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7YUFDM0I7UUFDTCxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU0sK0JBQStCLENBQUUsRUFBWSxFQUFFLEVBQUUsT0FBTyxFQUF3QjtRQUNuRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVNLCtCQUErQixDQUFFLEVBQVksRUFBRSxFQUFFLE9BQU8sRUFBd0I7UUFDbkYsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTFELEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FBcUIsQ0FBQztRQUVySCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVk7UUFDdEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDbEIsS0FBSyxFQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2pDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7Z0JBQ3JDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDbEIsS0FBSyxFQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ2pDLENBQUMsQ0FBQztTQUNOO2FBQ0k7WUFDRCxJQUFJLENBQUMsR0FBRyxHQUFVLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUUsR0FBVztRQUN0QyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksa0NBQXNCLEVBQUUsQ0FBQztRQUVwRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsbUNBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFM0YsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFFeEgsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUNqRTtRQUVELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDMUIsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFckgsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUNsRTtJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFFLEdBQVcsRUFBRSxXQUFvQixFQUFFLGFBQXNCO1FBQ2pGLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRWxHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUUsSUFBVTtRQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFVLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksb0JBQWlCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQzVHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBWSxDQUFDLGlCQUFpQixDQUFDO1FBRTVDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFVLENBQUMsYUFBYTtZQUN2QyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFFM0IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGVBQVUsQ0FBQyxxQkFBcUI7WUFDcEQsTUFBTSxJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLE9BQU87WUFDWixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFFdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFFLElBQVUsRUFBRSxRQUF3QjtRQUN4RCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBWSxDQUFDLGlCQUFpQjtZQUM3QyxNQUFNLElBQUksMkNBQWdDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpELE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLGFBQWE7WUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU1RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBRTdCLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQzNDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQywrQkFBK0I7UUFDaEUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTFDLE9BQU8sTUFBTSxXQUFXLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU8sS0FBSyxDQUFDLDBCQUEwQixDQUFFLE9BQXlDO1FBQy9FLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksa0NBQXdCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBZ0IsQ0FBOEIsQ0FBQztRQUU5SSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsc0JBQVcsRUFBMEIsY0FBYyxFQUFFLEtBQUssRUFBQyxHQUFHLEVBQUMsRUFBRTtZQUNuRixJQUFJO2dCQUNBLE1BQU0sYUFBYSxHQUFHO29CQUNsQixHQUFHLEVBQUksSUFBSSxTQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFDdkIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO2lCQUNuQixDQUFDO2dCQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDdEIsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTt3QkFDOUQsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNsQixTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7cUJBQ3hCLENBQUMsQ0FBQztvQkFFSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUM7aUJBQ3pFO2dCQUVELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBTSxFQUFFO2dCQUNYLE1BQU0sSUFBSSx1Q0FBNEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckQ7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNmLE1BQU0sSUFBSSw4QkFBbUIsRUFBRSxDQUFDO1FBRXBDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLHlCQUFlLENBQUMsK0JBQStCLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpILE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksK0JBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBZ0IsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFTyxXQUFXLENBQUUsR0FBVTtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLDBCQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sd0NBQXdDO1FBQzVDLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ25DLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7WUFFMUMsT0FBTyxJQUFJLENBQUMsNkNBQTZDLEVBQUUsQ0FBQztTQUMvRDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFFLFNBQWlCLEVBQUUsSUFBYTtRQUMxRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUI7WUFDN0IsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sTUFBTSxDQUFDLHdCQUF3QixDQUFFLE9BQWdCO1FBQ3BELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFakQsT0FBTyxDQUFDLHNCQUFzQixJQUFJLENBQUUsSUFBc0IsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDcEcsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVO1FBQ25CLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUNyQixPQUFPO1FBRVgsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDO1lBQzdDLFNBQVMsRUFBTyxJQUFJLENBQUMsRUFBRTtZQUN2QixNQUFNLEVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLE9BQU8sRUFBUyxJQUFJLENBQUMsT0FBTztZQUM1QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsVUFBVSxFQUFNLElBQUksQ0FBQyxXQUFXO1NBQ25DLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDO0lBQ2pELENBQUM7SUFFRCwwRkFBMEY7SUFDbEYsS0FBSyxDQUFDLENBQUMseUJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBRSxHQUFrQjtRQUNyRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMscUNBQXFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7UUFFM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUNqQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIsMkZBQTJGO1FBQzNGLDJGQUEyRjtRQUMzRixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0I7WUFDekMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFFekMsSUFBSSxDQUFDLGtCQUFrQixHQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0I7WUFDcEUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFFekMsc0dBQXNHO1FBQ3RHLGdGQUFnRjtRQUNoRixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFaEcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxLQUFLLENBQUMsQ0FBQyx5QkFBZSxDQUFDLDJCQUEyQixDQUFDLENBQUUsR0FBa0I7UUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksS0FBSyxHQUFJLElBQUksQ0FBQztRQUVsQixJQUFJO1lBQ0EsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbEc7UUFDRCxPQUFPLEdBQVksRUFBRTtZQUNqQixJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUU7Z0JBQ3RCLEtBQUssR0FBRztvQkFDSixJQUFJLEVBQWEsR0FBRyxDQUFDLElBQUk7b0JBQ3pCLE9BQU8sRUFBVSxHQUFHLENBQUMsT0FBTztvQkFDNUIsS0FBSyxFQUFZLEdBQUcsQ0FBQyxLQUFLO29CQUMxQixlQUFlLEVBQUUsSUFBSTtpQkFDeEIsQ0FBQzthQUNMOztnQkFFRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ25CO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sS0FBSyxDQUFDLENBQUMseUJBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFFLEdBQWtCO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQjs7Z0JBRUcsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLE9BQU8sQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTE0Q0QsMEJBMDRDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgcHVsbCxcbiAgICByZW1vdmUsXG4gICAgY2hhaW4sXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyByZWFkU3luYyBhcyByZWFkIH0gZnJvbSAncmVhZC1maWxlLXJlbGF0aXZlJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0UnVuRGVidWdMb2cgZnJvbSAnLi9kZWJ1Zy1sb2cnO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgVGVzdENhZmVFcnJvckxpc3QgZnJvbSAnLi4vZXJyb3JzL2Vycm9yLWxpc3QnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuXG5pbXBvcnQge1xuICAgIFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IsXG4gICAgUGFnZUxvYWRFcnJvcixcbiAgICBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcixcbiAgICBTd2l0Y2hUb1dpbmRvd1ByZWRpY2F0ZUVycm9yLFxuICAgIFdpbmRvd05vdEZvdW5kRXJyb3IsXG4gICAgUmVxdWVzdEhvb2tCYXNlRXJyb3IsXG4gICAgVGVzdFRpbWVvdXRFcnJvcixcbiAgICBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcixcbiAgICBSdW5UaW1lb3V0RXJyb3IsXG59IGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi8nO1xuXG5pbXBvcnQgQ0xJRU5UX01FU1NBR0VTIGZyb20gJy4vY2xpZW50LW1lc3NhZ2VzJztcbmltcG9ydCBDT01NQU5EX1RZUEUgZnJvbSAnLi9jb21tYW5kcy90eXBlJztcbmltcG9ydCBkZWxheSBmcm9tICcuLi91dGlscy9kZWxheSc7XG5pbXBvcnQgaXNQYXNzd29yZElucHV0IGZyb20gJy4uL3V0aWxzL2lzLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0ZXN0UnVuTWFya2VyIGZyb20gJy4vbWFya2VyLXN5bWJvbCc7XG5pbXBvcnQgdGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IFJPTEVfUEhBU0UgZnJvbSAnLi4vcm9sZS9waGFzZSc7XG5pbXBvcnQgUmVwb3J0ZXJQbHVnaW5Ib3N0IGZyb20gJy4uL3JlcG9ydGVyL3BsdWdpbi1ob3N0JztcbmltcG9ydCBCcm93c2VyQ29uc29sZU1lc3NhZ2VzIGZyb20gJy4vYnJvd3Nlci1jb25zb2xlLW1lc3NhZ2VzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRSBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbWVzc2FnZSc7XG5cbmltcG9ydCB7XG4gICAgU3RhdGVTbmFwc2hvdCxcbiAgICBTUEVDSUFMX0VSUk9SX1BBR0UsXG4gICAgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgSW5qZWN0YWJsZVJlc291cmNlcyxcbiAgICBSZXF1ZXN0RXZlbnQsXG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICBSZXNwb25zZUV2ZW50LFxuICAgIFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsXG4gICAgU3RvcmFnZXNTbmFwc2hvdCxcbiAgICBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIsXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5pbXBvcnQgKiBhcyBJTkpFQ1RBQkxFUyBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgZmluZFByb2JsZW1hdGljU2NyaXB0cyB9IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgZ2V0Q3VzdG9tQ2xpZW50U2NyaXB0VXJsIGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9nZXQtdXJsJztcbmltcG9ydCB7IGdldFBsdXJhbFN1ZmZpeCwgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcblxuaW1wb3J0IHtcbiAgICBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IsXG4gICAgaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZCxcbiAgICBpc1NjcmVlbnNob3RDb21tYW5kLFxuICAgIGlzU2VydmljZUNvbW1hbmQsXG4gICAgY2FuU2V0RGVidWdnZXJCcmVha3BvaW50QmVmb3JlQ29tbWFuZCxcbiAgICBpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQsXG4gICAgaXNSZXNpemVXaW5kb3dDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCxcbiAgICBFeGVjdXRlRXhwcmVzc2lvbkNvbW1hbmQsXG4gICAgR2V0Q3VycmVudFdpbmRvd3NDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93Q29tbWFuZCxcbiAgICBHZXRDb29raWVzQ29tbWFuZCxcbiAgICBTZXRDb29raWVzQ29tbWFuZCxcbiAgICBEZWxldGVDb29raWVzQ29tbWFuZCxcbiAgICBBZGRSZXF1ZXN0SG9va3NDb21tYW5kLFxuICAgIFJlbW92ZVJlcXVlc3RIb29rc0NvbW1hbmQsXG4gICAgUnVuQ3VzdG9tQWN0aW9uQ29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcy9hY3Rpb25zJztcblxuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMsIFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgcHJvY2Vzc1Rlc3RGbkVycm9yIGZyb20gJy4uL2Vycm9ycy9wcm9jZXNzLXRlc3QtZm4tZXJyb3InO1xuaW1wb3J0IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMgZnJvbSAnLi4vYXBpL3JlcXVlc3QtaG9va3MvaG9vay1tZXRob2QtbmFtZXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVwbGljYXRvciwgU2VsZWN0b3JOb2RlVHJhbnNmb3JtIH0gZnJvbSAnLi4vY2xpZW50LWZ1bmN0aW9ucy9yZXBsaWNhdG9yJztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgQ2FwdHVyZXIgZnJvbSAnLi4vc2NyZWVuc2hvdHMvY2FwdHVyZXInO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ29tcGlsZXJTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2NvbXBpbGVyL2hvc3QnO1xuaW1wb3J0IFNlc3Npb25Db250cm9sbGVyIGZyb20gJy4vc2Vzc2lvbi1jb250cm9sbGVyJztcbmltcG9ydCBUZXN0Q29udHJvbGxlciBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyJztcbmltcG9ydCBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWUgZnJvbSAnLi9icm93c2VyLW1hbmlwdWxhdGlvbi1xdWV1ZSc7XG5pbXBvcnQgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlIGZyb20gJy4vb2JzZXJ2ZWQtY2FsbHNpdGVzLXN0b3JhZ2UnO1xuaW1wb3J0IENsaWVudFNjcmlwdCBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi4vYnJvd3Nlci9jb25uZWN0aW9uJztcbmltcG9ydCB7IFF1YXJhbnRpbmUgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lJztcbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBEcml2ZXJTdGF0dXMgZnJvbSAnLi4vY2xpZW50L2RyaXZlci9zdGF0dXMnO1xuaW1wb3J0IHsgQ29tbWFuZEJhc2UsIEFjdGlvbkNvbW1hbmRCYXNlIH0gZnJvbSAnLi9jb21tYW5kcy9iYXNlLmpzJztcbmltcG9ydCBSb2xlIGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBUZXN0UnVuRXJyb3JCYXNlIH0gZnJvbSAnLi4vc2hhcmVkL2Vycm9ycyc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ2NhbGxzaXRlLXJlY29yZCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZ2V0QXNzZXJ0aW9uVGltZW91dCBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9nZXQtYXNzZXJ0aW9uLXRpbWVvdXQnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXNzZXJ0aW9uJztcbmltcG9ydCB7IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2Jyb3dzZXItbWFuaXB1bGF0aW9uJztcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGVzdFJ1biBhcyBMZWdhY3lUZXN0UnVuIH0gZnJvbSAndGVzdGNhZmUtbGVnYWN5LWFwaSc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3RSdW5QaGFzZSBmcm9tICcuL3BoYXNlJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLFxuICAgIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmRCYXNlLFxuICAgIEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvb2JzZXJ2YXRpb24nO1xuXG5pbXBvcnQgeyBSRV9FWEVDVVRBQkxFX1BST01JU0VfTUFSS0VSX0RFU0NSSVBUSU9OIH0gZnJvbSAnLi4vc2VydmljZXMvc2VyaWFsaXphdGlvbi9yZXBsaWNhdG9yL3RyYW5zZm9ybXMvcmUtZXhlY3V0YWJsZS1wcm9taXNlLXRyYW5zZm9ybS9tYXJrZXInO1xuaW1wb3J0IFJlRXhlY3V0YWJsZVByb21pc2UgZnJvbSAnLi4vdXRpbHMvcmUtZXhlY3V0YWJsZS1wcm9taXNlJztcbmltcG9ydCBhZGRSZW5kZXJlZFdhcm5pbmcgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9hZGQtcmVuZGVyZWQtd2FybmluZyc7XG5pbXBvcnQgZ2V0QnJvd3NlciBmcm9tICcuLi91dGlscy9nZXQtYnJvd3Nlcic7XG5pbXBvcnQgQXNzZXJ0aW9uRXhlY3V0b3IgZnJvbSAnLi4vYXNzZXJ0aW9ucy9leGVjdXRvcic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQgZnJvbSAnLi4vdXRpbHMvZXhlY3V0ZS1mbi13aXRoLXRpbWVvdXQnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1hbmRzL29wdGlvbnMnO1xuaW1wb3J0IHsgcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbnMgfSBmcm9tICcuLi9hcGkvc2tpcC1qcy1lcnJvcnMnO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi9jb29raWVzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXIgfSBmcm9tICcuL2Nvb2tpZXMvYmFzZSc7XG5pbXBvcnQgd3JhcEN1c3RvbUFjdGlvbiBmcm9tICcuLi9hcGkvd3JhcC1jdXN0b20tYWN0aW9uJztcblxuaW1wb3J0IHtcbiAgICBQcm94eWxlc3NSb2xlUHJvdmlkZXIsXG4gICAgUHJveHlSb2xlUHJvdmlkZXIsXG4gICAgUm9sZVByb3ZpZGVyLFxufSBmcm9tICcuL3JvbGUtcHJvdmlkZXInO1xuXG5pbXBvcnQgUHJveHlsZXNzUmVxdWVzdFBpcGVsaW5lIGZyb20gJy4uL3Byb3h5bGVzcy9yZXF1ZXN0LXBpcGVsaW5lJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IENsaWVudEZ1bmN0aW9uQnVpbGRlciAgICAgICA9IGxhenlSZXF1aXJlKCcuLi9jbGllbnQtZnVuY3Rpb25zL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJyk7XG5jb25zdCBUZXN0UnVuQm9va21hcmsgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ib29rbWFyaycpO1xuY29uc3QgYWN0aW9uQ29tbWFuZHMgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYWN0aW9ucycpO1xuY29uc3QgYnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmRzID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nKTtcbmNvbnN0IHNlcnZpY2VDb21tYW5kcyAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL3NlcnZpY2UnKTtcbmNvbnN0IG9ic2VydmF0aW9uQ29tbWFuZHMgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL29ic2VydmF0aW9uJyk7XG5cbmNvbnN0IHsgZXhlY3V0ZUpzRXhwcmVzc2lvbiwgZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIH0gPSBsYXp5UmVxdWlyZSgnLi9leGVjdXRlLWpzLWV4cHJlc3Npb24nKTtcblxuY29uc3QgVEVTVF9SVU5fVEVNUExBVEUgICAgICAgICAgICAgICA9IHJlYWQoJy4uL2NsaWVudC90ZXN0LXJ1bi9pbmRleC5qcy5tdXN0YWNoZScpIGFzIHN0cmluZztcbmNvbnN0IElGUkFNRV9URVNUX1JVTl9URU1QTEFURSAgICAgICAgPSByZWFkKCcuLi9jbGllbnQvdGVzdC1ydW4vaWZyYW1lLmpzLm11c3RhY2hlJykgYXMgc3RyaW5nO1xuY29uc3QgVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRSA9ICd0ZXN0LWRvbmUtY29uZmlybWF0aW9uJztcbmNvbnN0IE1BWF9SRVNQT05TRV9ERUxBWSAgICAgICAgICAgICAgPSAzMDAwO1xuY29uc3QgQ0hJTERfV0lORE9XX1JFQURZX1RJTUVPVVQgICAgICA9IDMwICogMTAwMDtcblxuY29uc3QgQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCA9ICdhbGwtZHJpdmVyLXRhc2tzLWFkZGVkLXRvLXF1ZXVlJztcblxuY29uc3QgQ09NUElMRVJfU0VSVklDRV9FVkVOVFMgPSBbXG4gICAgJ3NldE1vY2snLFxuICAgICdzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucycsXG4gICAgJ3NldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG4gICAgJ3JlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG5dO1xuXG5cbmludGVyZmFjZSBUZXN0UnVuSW5pdCB7XG4gICAgdGVzdDogVGVzdDtcbiAgICBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgc2NyZWVuc2hvdENhcHR1cmVyOiBDYXB0dXJlcjtcbiAgICBnbG9iYWxXYXJuaW5nTG9nOiBXYXJuaW5nTG9nO1xuICAgIG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBtZXNzYWdlQnVzPzogTWVzc2FnZUJ1cztcbiAgICBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xufVxuXG5pbnRlcmZhY2UgRHJpdmVyVGFzayB7XG4gICAgY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQ7XG59XG5cbmludGVyZmFjZSBEcml2ZXJNZXNzYWdlIHtcbiAgICBzdGF0dXM6IERyaXZlclN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERyaXZlcldhcm5pbmcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBXQVJOSU5HX01FU1NBR0U7XG4gICAgYXJnczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0VGltZW91dCB7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBhamF4PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uVGltZW91dCB7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIHJlamVjdFdpdGg6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3I7XG59XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gICAgcmVzcG9uc2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dDtcbiAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICByZWplY3Q6IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgQnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdCB7XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGVycm9yOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgT3BlbmVkV2luZG93SW5mb3JtYXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1biBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIFt0ZXN0UnVuTWFya2VyXTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgcHVibGljIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHB1YmxpYyBwaGFzZTogVGVzdFJ1blBoYXNlO1xuICAgIHByaXZhdGUgZHJpdmVyVGFza1F1ZXVlOiBEcml2ZXJUYXNrW107XG4gICAgcHJpdmF0ZSB0ZXN0RG9uZUNvbW1hbmRRdWV1ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGFjdGl2ZURpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHB1YmxpYyBhY3RpdmVJZnJhbWVTZWxlY3RvcjogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIHNwZWVkOiBudW1iZXI7XG4gICAgcHVibGljIHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdEV4ZWN1dGlvblRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVuRXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlUGFnZVJlbG9hZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVxdWVzdFRpbWVvdXQ6IFJlcXVlc3RUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIHByaXZhdGUgcGVuZGluZ1JlcXVlc3Q6IFBlbmRpbmdSZXF1ZXN0IHwgbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdQYWdlRXJyb3I6IFBhZ2VMb2FkRXJyb3IgfCBFcnJvciB8IG51bGw7XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IFRlc3RDb250cm9sbGVyIHwgbnVsbDtcbiAgICBwdWJsaWMgY3R4OiBvYmplY3Q7XG4gICAgcHVibGljIGZpeHR1cmVDdHg6IG9iamVjdCB8IG51bGw7XG4gICAgcHVibGljIHRlc3RSdW5DdHg6IG9iamVjdCB8IG51bGw7XG4gICAgcHJpdmF0ZSBjdXJyZW50Um9sZUlkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlZFJvbGVTdGF0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcHVibGljIGVycnM6IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdO1xuICAgIHByaXZhdGUgbGFzdERyaXZlclN0YXR1c0lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgbGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlOiBDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmc7XG4gICAgcHJpdmF0ZSBmaWxlRG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZTogRnVuY3Rpb24gfCBudWxsO1xuICAgIHByaXZhdGUgYWRkaW5nRHJpdmVyVGFza3NDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBkZWJ1Z2dpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z09uRmFpbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWdSZXBvcnRlclBsdWdpbkhvc3Q6IFJlcG9ydGVyUGx1Z2luSG9zdDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZTogQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlO1xuICAgIHByaXZhdGUgZGVidWdMb2c6IFRlc3RSdW5EZWJ1Z0xvZztcbiAgICBwdWJsaWMgcXVhcmFudGluZTogUXVhcmFudGluZSB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0xvZ2dlcjogYW55O1xuICAgIHB1YmxpYyBvYnNlcnZlZENhbGxzaXRlczogT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlO1xuICAgIHB1YmxpYyByZWFkb25seSBjb21waWxlclNlcnZpY2U/OiBDb21waWxlclNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBsaWNhdG9yOiBhbnk7XG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBlcnJTY3JlZW5zaG90UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlIGFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzOiBNYXA8c3RyaW5nLCBDYWxsc2l0ZVJlY29yZD47XG4gICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgcHJpdmF0ZSBfY2xpZW50RW52aXJvbm1lbnRQcmVwYXJlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Nvb2tpZVByb3ZpZGVyOiBDb29raWVQcm92aWRlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnRSdW5FeGVjdXRpb25UaW1lPzogRGF0ZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI6IFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yb2xlUHJvdmlkZXI6IFJvbGVQcm92aWRlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyB0ZXN0LCBicm93c2VyQ29ubmVjdGlvbiwgc2NyZWVuc2hvdENhcHR1cmVyLCBnbG9iYWxXYXJuaW5nTG9nLCBvcHRzLCBjb21waWxlclNlcnZpY2UsIG1lc3NhZ2VCdXMsIHN0YXJ0UnVuRXhlY3V0aW9uVGltZSB9OiBUZXN0UnVuSW5pdCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXNbdGVzdFJ1bk1hcmtlcl0gICAgPSB0cnVlO1xuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzICAgICAgID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKGdsb2JhbFdhcm5pbmdMb2csIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKG1lc3NhZ2VCdXMsIHRoaXMpKTtcbiAgICAgICAgdGhpcy5vcHRzICAgICAgICAgICAgICA9IG9wdHM7XG4gICAgICAgIHRoaXMudGVzdCAgICAgICAgICAgICAgPSB0ZXN0O1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uID0gYnJvd3NlckNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMudW5zdGFibGUgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5icm93c2VyICAgICAgICAgICA9IGdldEJyb3dzZXIoYnJvd3NlckNvbm5lY3Rpb24pO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBUZXN0UnVuUGhhc2UuaW5pdGlhbDtcblxuICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZSAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnRlc3REb25lQ29tbWFuZFF1ZXVlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciAgPSBudWxsO1xuICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGVlZCAgICAgICAgICAgICAgICA9IHRoaXMub3B0cy5zcGVlZCBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMucGFnZUxvYWRUaW1lb3V0ICAgICAgPSB0aGlzLl9nZXRQYWdlTG9hZFRpbWVvdXQodGVzdCwgb3B0cyk7XG4gICAgICAgIHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgPSB0aGlzLl9nZXRUZXN0RXhlY3V0aW9uVGltZW91dChvcHRzKTtcblxuICAgICAgICB0aGlzLmRpc2FibGVQYWdlUmVsb2FkcyAgID0gdGVzdC5kaXNhYmxlUGFnZVJlbG9hZHMgfHwgb3B0cy5kaXNhYmxlUGFnZVJlbG9hZHMgYXMgYm9vbGVhbiAmJiB0ZXN0LmRpc2FibGVQYWdlUmVsb2FkcyAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzYWJsZVBhZ2VDYWNoaW5nICAgPSB0ZXN0LmRpc2FibGVQYWdlQ2FjaGluZyB8fCBvcHRzLmRpc2FibGVQYWdlQ2FjaGluZyBhcyBib29sZWFuO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlV2luZG93cyA9IG9wdHMuZGlzYWJsZU11bHRpcGxlV2luZG93cyBhcyBib29sZWFuO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXQgPSB0aGlzLl9nZXRSZXF1ZXN0VGltZW91dCh0ZXN0LCBvcHRzKTtcblxuICAgICAgICB0aGlzLnNlc3Npb24gPSBTZXNzaW9uQ29udHJvbGxlci5nZXRTZXNzaW9uKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gbmV3IEJyb3dzZXJDb25zb2xlTWVzc2FnZXMoKTtcblxuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ICAgPSBudWxsO1xuICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG51bGw7XG4gICAgICAgIHRoaXMuY3R4ICAgICAgICA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuZml4dHVyZUN0eCA9IG51bGw7XG4gICAgICAgIHRoaXMudGVzdFJ1bkN0eCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Um9sZUlkICA9IG51bGw7XG4gICAgICAgIHRoaXMudXNlZFJvbGVTdGF0ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIHRoaXMuZXJycyA9IFtdO1xuXG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c0lkICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCAgICAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuZGVidWdnaW5nICAgICAgICAgICAgICAgPSB0aGlzLm9wdHMuZGVidWdNb2RlIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMuZGVidWdPbkZhaWwgICAgICAgICAgICAgPSB0aGlzLm9wdHMuZGVidWdPbkZhaWwgYXMgYm9vbGVhbjtcbiAgICAgICAgdGhpcy5kaXNhYmxlRGVidWdCcmVha3BvaW50cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlYnVnUmVwb3J0ZXJQbHVnaW5Ib3N0ID0gbmV3IFJlcG9ydGVyUGx1Z2luSG9zdCh7IG5vQ29sb3JzOiBmYWxzZSB9KTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZSA9IG5ldyBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWUoYnJvd3NlckNvbm5lY3Rpb24sIHNjcmVlbnNob3RDYXB0dXJlciwgdGhpcy53YXJuaW5nTG9nKTtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nID0gbmV3IFRlc3RSdW5EZWJ1Z0xvZyh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnVzZXJBZ2VudCk7XG5cbiAgICAgICAgdGhpcy5xdWFyYW50aW5lICA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlciA9IHRoaXMub3B0cy5kZWJ1Z0xvZ2dlcjtcblxuICAgICAgICB0aGlzLm9ic2VydmVkQ2FsbHNpdGVzICAgICAgICAgID0gbmV3IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZSAgICAgICAgICAgID0gY29tcGlsZXJTZXJ2aWNlO1xuICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzID0gbmV3IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPigpO1xuXG4gICAgICAgIHRoaXMucmVwbGljYXRvciA9IGNyZWF0ZVJlcGxpY2F0b3IoWyBuZXcgU2VsZWN0b3JOb2RlVHJhbnNmb3JtKCkgXSk7XG5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcblxuICAgICAgICB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZSAgICAgPSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU7XG4gICAgICAgIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dCAgICAgICA9IHRoaXMuX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlciA9IHRoaXMuX2dldFJlcXVlc3RIb29rRXZlbnRQcm92aWRlcigpO1xuICAgICAgICB0aGlzLl9yb2xlUHJvdmlkZXIgICAgICAgICAgICAgPSB0aGlzLl9nZXRSb2xlUHJvdmlkZXIoKTtcblxuICAgICAgICB0aGlzLl9jb29raWVQcm92aWRlciA9IENvb2tpZVByb3ZpZGVyRmFjdG9yeS5jcmVhdGUodGhpcywgdGhpcy5vcHRzLmV4cGVyaW1lbnRhbFByb3h5bGVzcyBhcyBib29sZWFuKTtcblxuICAgICAgICB0aGlzLl9hZGRJbmplY3RhYmxlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlcXVlc3RIb29rRXZlbnRQcm92aWRlciAoKTogUmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3h5bGVzc1JlcXVlc3RQaXBlbGluZS5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVTdG9yYWdlc1NuYXBzaG90IChzdG9yYWdlU25hcHNob3Q6IFN0b3JhZ2VzU25hcHNob3QpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcHJveHlsZXNzUmVxdWVzdFBpcGVsaW5lLnJlc3RvcmluZ1N0b3JhZ2VzID0gc3RvcmFnZVNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IF9wcm94eWxlc3NSZXF1ZXN0UGlwZWxpbmUgKCk6IFByb3h5bGVzc1JlcXVlc3RQaXBlbGluZSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVJbmZvID0gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcm92aWRlci5wbHVnaW4ub3BlbmVkQnJvd3NlcnNbdGhpcy5icm93c2VyQ29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVJbmZvLnByb3h5bGVzcy5yZXF1ZXN0UGlwZWxpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Um9sZVByb3ZpZGVyICgpOiBSb2xlUHJvdmlkZXIge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmV4cGVyaW1lbnRhbFByb3h5bGVzcylcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlsZXNzUm9sZVByb3ZpZGVyKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJveHlSb2xlUHJvdmlkZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UGFnZUxvYWRUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IG51bWJlciB7XG4gICAgICAgIGlmICh0ZXN0LnRpbWVvdXRzPy5wYWdlTG9hZFRpbWVvdXQgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiB0ZXN0LnRpbWVvdXRzLnBhZ2VMb2FkVGltZW91dDtcblxuICAgICAgICByZXR1cm4gb3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlcXVlc3RUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IFJlcXVlc3RUaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRlc3QudGltZW91dHM/LnBhZ2VSZXF1ZXN0VGltZW91dCB8fCBvcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBudW1iZXIsXG4gICAgICAgICAgICBhamF4OiB0ZXN0LnRpbWVvdXRzPy5hamF4UmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEV4ZWN1dGlvblRpbWVvdXQgKHRpbWVvdXQ6IG51bWJlciwgZXJyb3I6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3IpOiBFeGVjdXRpb25UaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICByZWplY3RXaXRoOiBlcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUZXN0RXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRlc3RFeGVjdXRpb25UaW1lb3V0ID0gb3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBudW1iZXIgfHwgMDtcblxuICAgICAgICBpZiAoIXRlc3RFeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQodGVzdEV4ZWN1dGlvblRpbWVvdXQsIG5ldyBUZXN0VGltZW91dEVycm9yKHRlc3RFeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UnVuRXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBvcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCFydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQocnVuRXhlY3V0aW9uVGltZW91dCwgbmV3IFJ1blRpbWVvdXRFcnJvcihydW5FeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN0UnVuRXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lIHx8ICF0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZW91dCA9IE1hdGgubWF4KHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IC0gKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZS5nZXRUaW1lKCkpLCAwKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RXhlY3V0aW9uVGltZW91dChjdXJyZW50VGltZW91dCwgdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0LnJlamVjdFdpdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dCAmJiAoIXRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IDwgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dC50aW1lb3V0KVxuICAgICAgICAgICAgPyB0aGlzLnJlc3RSdW5FeGVjdXRpb25UaW1lb3V0XG4gICAgICAgICAgICA6IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRDbGllbnRTY3JpcHRDb250ZW50V2FybmluZ3NJZk5lY2Vzc2FyeSAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHksIGR1cGxpY2F0ZWRDb250ZW50IH0gPSBmaW5kUHJvYmxlbWF0aWNTY3JpcHRzKHRoaXMudGVzdC5jbGllbnRTY3JpcHRzIGFzIENsaWVudFNjcmlwdFtdKTtcblxuICAgICAgICBpZiAoZW1wdHkubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFLmNsaWVudFNjcmlwdHNXaXRoRW1wdHlDb250ZW50KTtcblxuICAgICAgICBpZiAoZHVwbGljYXRlZENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRQbHVyYWxTdWZmaXgoZHVwbGljYXRlZENvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlZENvbnRlbnRDbGllbnRTY3JpcHRzU3RyID0gZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKGR1cGxpY2F0ZWRDb250ZW50LCAnXFxuJyk7XG5cbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5jbGllbnRTY3JpcHRzV2l0aER1cGxpY2F0ZWRDb250ZW50LCBzdWZmaXgsIGR1cGxpY2F0ZWRDb250ZW50Q2xpZW50U2NyaXB0c1N0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRJbmplY3RhYmxlcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FkZENsaWVudFNjcmlwdENvbnRlbnRXYXJuaW5nc0lmTmVjZXNzYXJ5KCk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS5zY3JpcHRzLnB1c2goLi4uSU5KRUNUQUJMRVMuU0NSSVBUUyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS51c2VyU2NyaXB0cy5wdXNoKC4uLnRoaXMudGVzdC5jbGllbnRTY3JpcHRzLm1hcChzY3JpcHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6ICBnZXRDdXN0b21DbGllbnRTY3JpcHRVcmwoc2NyaXB0IGFzIENsaWVudFNjcmlwdCksXG4gICAgICAgICAgICAgICAgcGFnZTogc2NyaXB0LnBhZ2UgYXMgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS5zdHlsZXMucHVzaChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TVFlMRVMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWQgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbmplY3RhYmxlICgpOiBJbmplY3RhYmxlUmVzb3VyY2VzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5pbmplY3RhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRRdWFyYW50aW5lSW5mbyAocXVhcmFudGluZTogUXVhcmFudGluZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnF1YXJhbnRpbmUgPSBxdWFyYW50aW5lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2FkZFJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0LnJlcXVlc3RIb29rcy5pbmNsdWRlcyhob29rKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLnRlc3QucmVxdWVzdEhvb2tzLnB1c2goaG9vayk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2luaXRSZXF1ZXN0SG9vayhob29rKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZW1vdmVSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHB1bGwodGhpcy50ZXN0LnJlcXVlc3RIb29rcywgaG9vayk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VSZXF1ZXN0SG9vayhob29rKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9pbml0UmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGhvb2suX3dhcm5pbmdMb2cgPSB0aGlzLndhcm5pbmdMb2c7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzLm1hcChydWxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUsIHtcbiAgICAgICAgICAgICAgICBvblJlcXVlc3Q6ICAgICAgICAgICBob29rLm9uUmVxdWVzdC5iaW5kKGhvb2spLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlndXJlUmVzcG9uc2U6IGhvb2suX29uQ29uZmlndXJlUmVzcG9uc2UuYmluZChob29rKSxcbiAgICAgICAgICAgICAgICBvblJlc3BvbnNlOiAgICAgICAgICBob29rLm9uUmVzcG9uc2UuYmluZChob29rKSxcbiAgICAgICAgICAgIH0sIChlcnI6IFJlcXVlc3RIb29rTWV0aG9kRXJyb3IpID0+IHRoaXMuX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvcihlcnIsIGhvb2suX2NsYXNzTmFtZSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdFJlcXVlc3RIb29rRm9yQ29tcGlsZXJTZXJ2aWNlIChob29rSWQ6IHN0cmluZywgaG9va0NsYXNzTmFtZTogc3RyaW5nLCBydWxlczogUmVxdWVzdEZpbHRlclJ1bGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0ZXN0SWQgPSB0aGlzLnRlc3QuaWQ7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocnVsZXMubWFwKHJ1bGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5hZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSwge1xuICAgICAgICAgICAgICAgIG9uUmVxdWVzdDogICAgICAgICAgIChldmVudDogUmVxdWVzdEV2ZW50KSA9PiB0aGlzLmNvbXBpbGVyU2VydmljZT8ub25SZXF1ZXN0SG9va0V2ZW50KHsgdGVzdElkLCBob29rSWQsIG5hbWU6IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMub25SZXF1ZXN0LCBldmVudERhdGE6IGV2ZW50IH0pLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlndXJlUmVzcG9uc2U6IChldmVudDogQ29uZmlndXJlUmVzcG9uc2VFdmVudCkgPT4gdGhpcy5jb21waWxlclNlcnZpY2U/Lm9uUmVxdWVzdEhvb2tFdmVudCh7IHRlc3RJZCwgaG9va0lkLCBuYW1lOiBSZXF1ZXN0SG9va01ldGhvZE5hbWVzLl9vbkNvbmZpZ3VyZVJlc3BvbnNlLCBldmVudERhdGE6IGV2ZW50IH0pLFxuICAgICAgICAgICAgICAgIG9uUmVzcG9uc2U6ICAgICAgICAgIChldmVudDogUmVzcG9uc2VFdmVudCkgPT4gdGhpcy5jb21waWxlclNlcnZpY2U/Lm9uUmVxdWVzdEhvb2tFdmVudCh7IHRlc3RJZCwgaG9va0lkLCBuYW1lOiBSZXF1ZXN0SG9va01ldGhvZE5hbWVzLm9uUmVzcG9uc2UsIGV2ZW50RGF0YTogZXZlbnQgfSksXG4gICAgICAgICAgICB9LCBlcnIgPT4gdGhpcy5fb25SZXF1ZXN0SG9va01ldGhvZEVycm9yKGVyciwgaG9va0NsYXNzTmFtZSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25SZXF1ZXN0SG9va01ldGhvZEVycm9yIChldmVudDogUmVxdWVzdEhvb2tNZXRob2RFcnJvciwgaG9va0NsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yIHwgVGVzdFJ1bkVycm9yQmFzZSAgICAgICAgICAgID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzUmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZE1ldGhvZEVycm9yID0gKGVyciBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckJhc2UpPy5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yO1xuXG4gICAgICAgIGlmICghaXNSZXF1ZXN0SG9va05vdEltcGxlbWVudGVkTWV0aG9kRXJyb3IpXG4gICAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcihlcnIsIGhvb2tDbGFzc05hbWUsIGV2ZW50Lm1ldGhvZE5hbWUpO1xuXG4gICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9kaXNwb3NlUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGhvb2suX3dhcm5pbmdMb2cgPSBudWxsO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcy5tYXAocnVsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2RldGFjaFJlcXVlc3RFdmVudExpc3RlbmVycyAocnVsZXM6IFJlcXVlc3RGaWx0ZXJSdWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocnVsZXMubWFwKHJ1bGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdWJzY3JpYmVPbkNvbXBpbGVyU2VydmljZUV2ZW50cyAoKTogdm9pZCB7XG4gICAgICAgIENPTVBJTEVSX1NFUlZJQ0VfRVZFTlRTLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlLm9uKGV2ZW50TmFtZSwgYXN5bmMgYXJncyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXNzaW9uW2V2ZW50TmFtZV0oLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2Uub24oJ2FkZFJlcXVlc3RFdmVudExpc3RlbmVycycsIGFzeW5jICh7IGhvb2tJZCwgaG9va0NsYXNzTmFtZSwgcnVsZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXRSZXF1ZXN0SG9va0ZvckNvbXBpbGVyU2VydmljZShob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZS5vbigncmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgYXN5bmMgKHsgcnVsZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RldGFjaFJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRSZXF1ZXN0SG9va3MgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZU9uQ29tcGlsZXJTZXJ2aWNlRXZlbnRzKCk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLm1hcChob29rID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdFJlcXVlc3RIb29rRm9yQ29tcGlsZXJTZXJ2aWNlKGhvb2suaWQsIGhvb2suX2NsYXNzTmFtZSwgaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLm1hcChob29rID0+IHRoaXMuX2luaXRSZXF1ZXN0SG9vayhob29rKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb24gKCk6IGJvb2xlYW4gfCBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMudGVzdC5za2lwSnNFcnJvcnNPcHRpb25zICE9PSB2b2lkIDBcbiAgICAgICAgICAgID8gdGhpcy50ZXN0LnNraXBKc0Vycm9yc09wdGlvbnNcbiAgICAgICAgICAgIDogdGhpcy5vcHRzLnNraXBKc0Vycm9ycyBhcyBTa2lwSnNFcnJvcnNPcHRpb25zT2JqZWN0IHwgYm9vbGVhbiB8fCBmYWxzZTtcblxuICAgICAgICByZXR1cm4gcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gSGFtbWVyaGVhZCBwYXlsb2FkXG4gICAgcHVibGljIGFzeW5jIGdldFBheWxvYWRTY3JpcHQgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCAgICAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gbnVsbDtcblxuICAgICAgICBjb25zdCBza2lwSnNFcnJvcnMgPSB0aGlzLl9wcmVwYXJlU2tpcEpzRXJyb3JzT3B0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihURVNUX1JVTl9URU1QTEFURSwge1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXNzaW9uLmlkKSxcbiAgICAgICAgICAgIGJyb3dzZXJJZDogICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWQpLFxuICAgICAgICAgICAgYWN0aXZlV2luZG93SWQ6ICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVXaW5kb3dJZCksXG4gICAgICAgICAgICBicm93c2VySGVhcnRiZWF0UmVsYXRpdmVVcmw6ICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmhlYXJ0YmVhdFJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJTdGF0dXNSZWxhdGl2ZVVybDogICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uc3RhdHVzUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlclN0YXR1c0RvbmVSZWxhdGl2ZVVybDogICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5zdGF0dXNEb25lUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlcklkbGVSZWxhdGl2ZVVybDogICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5pZGxlUmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckFjdGl2ZVdpbmRvd0lkVXJsOiAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5hY3RpdmVXaW5kb3dJZFVybCksXG4gICAgICAgICAgICBicm93c2VyQ2xvc2VXaW5kb3dVcmw6ICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmNsb3NlV2luZG93VXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJPcGVuRmlsZVByb3RvY29sUmVsYXRpdmVVcmw6IEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ub3BlbkZpbGVQcm90b2NvbFJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIHVzZXJBZ2VudDogICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50KSxcbiAgICAgICAgICAgIHRlc3ROYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudGVzdC5uYW1lKSxcbiAgICAgICAgICAgIGZpeHR1cmVOYW1lOiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KCh0aGlzLnRlc3QuZml4dHVyZSBhcyBGaXh0dXJlKS5uYW1lKSxcbiAgICAgICAgICAgIHNlbGVjdG9yVGltZW91dDogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQsXG4gICAgICAgICAgICBwYWdlTG9hZFRpbWVvdXQ6ICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCxcbiAgICAgICAgICAgIGNoaWxkV2luZG93UmVhZHlUaW1lb3V0OiAgICAgICAgICAgIENISUxEX1dJTkRPV19SRUFEWV9USU1FT1VULFxuICAgICAgICAgICAgc2tpcEpzRXJyb3JzOiAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2tpcEpzRXJyb3JzKSxcbiAgICAgICAgICAgIHJldHJ5VGVzdFBhZ2VzOiAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWQsXG4gICAgICAgICAgICBkaWFsb2dIYW5kbGVyOiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpLFxuICAgICAgICAgICAgY2FuVXNlRGVmYXVsdFdpbmRvd0FjdGlvbnM6ICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5jYW5Vc2VEZWZhdWx0V2luZG93QWN0aW9ucygpKSxcbiAgICAgICAgICAgIHByb3h5bGVzczogICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMub3B0cy5leHBlcmltZW50YWxQcm94eWxlc3MpLFxuICAgICAgICAgICAgZG9tYWluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucHJveHkuc2VydmVyMUluZm8uZG9tYWluKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldElmcmFtZVBheWxvYWRTY3JpcHQgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoSUZSQU1FX1RFU1RfUlVOX1RFTVBMQVRFLCB7XG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBzZWxlY3RvclRpbWVvdXQ6IHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQsXG4gICAgICAgICAgICBwYWdlTG9hZFRpbWVvdXQ6IHRoaXMucGFnZUxvYWRUaW1lb3V0LFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICAhIXRoaXMub3B0cy5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgdGhpcy5zcGVlZCxcbiAgICAgICAgICAgIGRpYWxvZ0hhbmRsZXI6ICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFtbWVyaGVhZCBoYW5kbGVyc1xuICAgIHB1YmxpYyBnZXRBdXRoQ3JlZGVudGlhbHMgKCk6IG51bGwgfCBBdXRoQ3JlZGVudGlhbHMge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0LmF1dGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlRmlsZURvd25sb2FkICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVBdHRhY2htZW50IChkYXRhOiB7IGlzT3BlbmVkSW5OZXdXaW5kb3c6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0YS5pc09wZW5lZEluTmV3V2luZG93KVxuICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlUGFnZUVycm9yIChjdHg6IGFueSwgZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBuZXcgUGFnZUxvYWRFcnJvcihlcnIsIGN0eC5yZXFPcHRzLnVybCk7XG5cbiAgICAgICAgY3R4LnJlZGlyZWN0KGN0eC50b1Byb3h5VXJsKFNQRUNJQUxfRVJST1JfUEFHRSkpO1xuICAgIH1cblxuICAgIC8vIFRlc3QgZnVuY3Rpb24gZXhlY3V0aW9uXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZVRlc3RGbiAocGhhc2U6IFRlc3RSdW5QaGFzZSwgZm46IEZ1bmN0aW9uLCB0aW1lb3V0OiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLnBoYXNlID0gcGhhc2U7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGV4ZWN1dGVGbldpdGhUaW1lb3V0KGZuLCB0aW1lb3V0LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX21ha2VTY3JlZW5zaG90T25GYWlsKCk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5lcnJTY3JlZW5zaG90UGF0aCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuX2FkZFBlbmRpbmdQYWdlRXJyb3JJZkFueSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3J1bkJlZm9yZUhvb2sgKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0Lmdsb2JhbEJlZm9yZUZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QmVmb3JlSG9vaywgdGhpcy50ZXN0Lmdsb2JhbEJlZm9yZUZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3QuYmVmb3JlRm4pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QmVmb3JlSG9vaywgdGhpcy50ZXN0LmJlZm9yZUZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3QuZml4dHVyZT8uYmVmb3JlRWFjaEZuKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluRml4dHVyZUJlZm9yZUVhY2hIb29rLCB0aGlzLnRlc3QuZml4dHVyZT8uYmVmb3JlRWFjaEZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3J1bkFmdGVySG9vayAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QuYWZ0ZXJGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEFmdGVySG9vaywgdGhpcy50ZXN0LmFmdGVyRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudGVzdC5maXh0dXJlPy5hZnRlckVhY2hGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluRml4dHVyZUFmdGVyRWFjaEhvb2ssIHRoaXMudGVzdC5maXh0dXJlPy5hZnRlckVhY2hGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0Lmdsb2JhbEFmdGVyRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RBZnRlckhvb2ssIHRoaXMudGVzdC5nbG9iYWxBZnRlckZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2ZpbmFsaXplVGVzdFJ1biAoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdzID0gYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2UuZ2V0V2FybmluZ01lc3NhZ2VzKHsgdGVzdFJ1bklkOiBpZCB9KTtcblxuICAgICAgICAgICAgd2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh3YXJuaW5nKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5yZW1vdmVUZXN0UnVuRnJvbVN0YXRlKHsgdGVzdFJ1bklkOiBpZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4oaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRlc3RSdW5UcmFja2VyLmFkZEFjdGl2ZVRlc3RSdW4odGhpcyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzdGFydCcpO1xuXG4gICAgICAgIGNvbnN0IG9uRGlzY29ubmVjdGVkID0gKGVycjogRXJyb3IpOiB2b2lkID0+IHRoaXMuX2Rpc2Nvbm5lY3QoZXJyKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLm9uY2UoJ2Rpc2Nvbm5lY3RlZCcsIG9uRGlzY29ubmVjdGVkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLm9uY2UoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgncmVhZHknKTtcblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fcnVuQmVmb3JlSG9vaygpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3QsIHRoaXMudGVzdC5mbiBhcyBGdW5jdGlvbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bkFmdGVySG9vaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBUZXN0UnVuUGhhc2UucGVuZGluZ0ZpbmFsaXphdGlvbjtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKCdkaXNjb25uZWN0ZWQnLCBvbkRpc2Nvbm5lY3RlZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXJycy5sZW5ndGggJiYgdGhpcy5kZWJ1Z09uRmFpbCkge1xuICAgICAgICAgICAgY29uc3QgZXJyU3RyID0gdGhpcy5kZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdC5mb3JtYXRFcnJvcih0aGlzLmVycnNbMF0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQodm9pZCAwLCBlcnJTdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmUtZG9uZScpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5UZXN0RG9uZUNvbW1hbmQoKSk7XG5cbiAgICAgICAgdGhpcy5fYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55KCk7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5jbGVhclJlcXVlc3RFdmVudExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZVJlcXVlc3RIb29rRXJyb3JzKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZmluYWxpemVUZXN0UnVuKHRoaXMuc2Vzc2lvbi5pZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdkb25lJyk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3JzXG4gICAgcHJpdmF0ZSBfYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55ICgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1BhZ2VFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5hZGRFcnJvcih0aGlzLnBlbmRpbmdQYWdlRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW5zdXJlRXJyb3JJZCAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5pZCA9IGVyci5pZCB8fCBuYW5vaWQoNyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlRXJyb3JBZGFwdGVyIChlcnI6IEVycm9yKTogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlRXJyb3JJZChlcnIpO1xuXG4gICAgICAgIHJldHVybiBuZXcgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyKGVyciwge1xuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50LFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6IHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggfHwgJycsXG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgIHRlc3RSdW5QaGFzZTogICB0aGlzLnBoYXNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRXJyb3IgKGVycjogRXJyb3IgfCBUZXN0Q2FmZUVycm9yTGlzdCB8IFRlc3RSdW5FcnJvckJhc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXJyTGlzdCA9IChlcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCA/IGVyci5pdGVtcyA6IFtlcnJdKSBhcyBFcnJvcltdO1xuXG4gICAgICAgIGVyckxpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIoaXRlbSk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJycy5wdXNoKGFkYXB0ZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1ZXN0SG9va0Vycm9ycyA9IHJlbW92ZSh0aGlzLmVycnMsIGUgPT5cbiAgICAgICAgICAgIChlIGFzIHVua25vd24gYXMgVGVzdFJ1bkVycm9yQmFzZSkuY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvciB8fFxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcik7XG5cbiAgICAgICAgaWYgKCFyZXF1ZXN0SG9va0Vycm9ycy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdW5pcVJlcXVlc3RIb29rRXJyb3JzID0gY2hhaW4ocmVxdWVzdEhvb2tFcnJvcnMpXG4gICAgICAgICAgICAudW5pcUJ5KGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGUgYXMgdW5rbm93biBhcyBSZXF1ZXN0SG9va0Jhc2VFcnJvcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuaG9va0NsYXNzTmFtZSArIGVyci5tZXRob2ROYW1lO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0QnkoWydob29rQ2xhc3NOYW1lJywgJ21ldGhvZE5hbWUnXSlcbiAgICAgICAgICAgIC52YWx1ZSgpO1xuXG4gICAgICAgIHRoaXMuZXJycyA9IHRoaXMuZXJycy5jb25jYXQodW5pcVJlcXVlc3RIb29rRXJyb3JzKTtcbiAgICB9XG5cbiAgICAvLyBUYXNrIHF1ZXVlXG4gICAgcHJpdmF0ZSBfZW5xdWV1ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlUGVuZGluZ1JlcXVlc3QoY29tbWFuZCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQtLTtcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlLnB1c2goeyBjb21tYW5kLCByZXNvbHZlLCByZWplY3QsIGNhbGxzaXRlIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCwgdGhpcy5kcml2ZXJUYXNrUXVldWUubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkcml2ZXJUYXNrUXVldWVMZW5ndGggKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQgPyBwcm9taXNpZnlFdmVudCh0aGlzIGFzIHVua25vd24gYXMgRXZlbnRFbWl0dGVyLCBBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5UKSA6IFByb21pc2UucmVzb2x2ZSh0aGlzLmRyaXZlclRhc2tRdWV1ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcblxuICAgICAgICBjb25zdCBjb25zb2xlTWVzc2FnZUNvcHkgPSB0aGlzLmNvbnNvbGVNZXNzYWdlcy5nZXRDb3B5KCk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gY29uc29sZU1lc3NhZ2VDb3B5W1N0cmluZyh0aGlzLmFjdGl2ZVdpbmRvd0lkKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlR2V0Q29va2llcyAoY29tbWFuZDogR2V0Q29va2llc0NvbW1hbmQpOiBQcm9taXNlPFBhcnRpYWw8Q29va2llT3B0aW9ucz5bXT4ge1xuICAgICAgICBjb25zdCB7IGNvb2tpZXMsIHVybHMgfSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvb2tpZVByb3ZpZGVyLmdldENvb2tpZXMoY29va2llcywgdXJscyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlU2V0Q29va2llcyAoY29tbWFuZDogU2V0Q29va2llc0NvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29va2llcyA9IGNvbW1hbmQuY29va2llcztcbiAgICAgICAgY29uc3QgdXJsICAgICA9IGNvbW1hbmQudXJsIHx8IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb29raWVQcm92aWRlci5zZXRDb29raWVzKGNvb2tpZXMsIHVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlRGVsZXRlQ29va2llcyAoY29tbWFuZDogRGVsZXRlQ29va2llc0NvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBjb29raWVzLCB1cmxzIH0gPSBjb21tYW5kO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb29raWVQcm92aWRlci5kZWxldGVDb29raWVzKGNvb2tpZXMsIHVybHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCAoY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkIHwgdW5kZWZpbmVkLCBlcnJvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z0xvZ2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuc2hvd0JyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkLCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnVzZXJBZ2VudCwgY2FsbHNpdGUsIGVycm9yKTtcblxuICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5TZXRCcmVha3BvaW50Q29tbWFuZCghIWVycm9yLCAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlKSwgY2FsbHNpdGUpIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgPSB0aGlzLmRyaXZlclRhc2tRdWV1ZS5maWx0ZXIoZHJpdmVyVGFzayA9PiBpc1NlcnZpY2VDb21tYW5kKGRyaXZlclRhc2suY29tbWFuZCkpO1xuXG4gICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnJlbW92ZUFsbE5vblNlcnZpY2VNYW5pcHVsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRGVidWdTdGF0ZSAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRyaXZlclN0YXR1cy5kZWJ1ZylcbiAgICAgICAgICAgIHRoaXMuZW1pdChkcml2ZXJTdGF0dXMuZGVidWcpO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgZHJpdmVyIHRhc2tcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnREcml2ZXJUYXNrICgpOiBEcml2ZXJUYXNrIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJpdmVyVGFza1F1ZXVlWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayAocmVzdWx0PzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUuc2hpZnQoKTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWplY3RDdXJyZW50RHJpdmVyVGFzayAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5jYWxsc2l0ZSA9IGVyci5jYWxsc2l0ZSB8fCB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNhbGxzaXRlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudERyaXZlclRhc2sucmVqZWN0KGVycik7XG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcygpO1xuICAgIH1cblxuICAgIC8vIFBlbmRpbmcgcmVxdWVzdFxuICAgIHByaXZhdGUgX2NsZWFyUGVuZGluZ1JlcXVlc3QgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ1JlcXVlc3QucmVzcG9uc2VUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBlbmRpbmdSZXF1ZXN0IChjb21tYW5kOiBDb21tYW5kQmFzZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgPSBjb21tYW5kO1xuXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0KVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdC5yZXNvbHZlKGNvbW1hbmQpO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZ1JlcXVlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZHJpdmVyIHJlcXVlc3RcbiAgICBwcml2YXRlIF9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21tYW5kID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kO1xuXG4gICAgICAgIGNvbnN0IGlzRXhlY3V0aW5nT2JzZXJ2YXRpb25Db21tYW5kID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBvYnNlcnZhdGlvbkNvbW1hbmRzLkV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2YgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZDtcblxuICAgICAgICBjb25zdCBpc0RlYnVnQWN0aXZlID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBzZXJ2aWNlQ29tbWFuZHMuU2V0QnJlYWtwb2ludENvbW1hbmQ7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUN1cnJlbnRDb21tYW5kID1cbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy5pc0ZpcnN0UmVxdWVzdEFmdGVyV2luZG93U3dpdGNoaW5nICYmIChpc0V4ZWN1dGluZ09ic2VydmF0aW9uQ29tbWFuZCB8fCBpc0RlYnVnQWN0aXZlKTtcblxuICAgICAgICByZXR1cm4gIXNob3VsZEV4ZWN1dGVDdXJyZW50Q29tbWFuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9mdWxmaWxsQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoZHJpdmVyU3RhdHVzLndhcm5pbmdzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBEcml2ZXJXYXJuaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgV0FSTklOR19NRVNTQUdFW3dhcm5pbmcudHlwZV0sIHRoaXMuY3VycmVudERyaXZlclRhc2suY2FsbHNpdGUsIC4uLndhcm5pbmcuYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpXG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKSlcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVQYWdlRXJyb3JTdGF0dXMgKHBhZ2VFcnJvcjogRXJyb3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyaXZlclRhc2sgJiYgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yKHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKHBhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvciB8fCBwYWdlRXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZURyaXZlclJlcXVlc3QgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaXNUZXN0RG9uZSAgICAgICAgICAgICAgICAgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrICYmIHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZC50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfVFlQRS50ZXN0RG9uZTtcbiAgICAgICAgY29uc3QgcGFnZUVycm9yICAgICAgICAgICAgICAgICAgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgfHwgZHJpdmVyU3RhdHVzLnBhZ2VFcnJvcjtcbiAgICAgICAgY29uc3QgY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgPSBwYWdlRXJyb3IgJiYgdGhpcy5faGFuZGxlUGFnZUVycm9yU3RhdHVzKHBhZ2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMuY29uY2F0KGRyaXZlclN0YXR1cy5jb25zb2xlTWVzc2FnZXMpO1xuXG4gICAgICAgIHRoaXMuX2hhbmRsZURlYnVnU3RhdGUoZHJpdmVyU3RhdHVzKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUYXNrUmVqZWN0ZWRCeUVycm9yICYmIGRyaXZlclN0YXR1cy5pc0NvbW1hbmRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChpc1Rlc3REb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChkcml2ZXJTdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCAoKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUubmF2aWdhdGVUbyAmJiAoY29tbWFuZCBhcyBhbnkpLnN0YXRlU25hcHNob3QpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChKU09OLnBhcnNlKChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdCkpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgY29tbWFuZFxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHRWYXJpYWJsZU5hbWUgPSBjb21tYW5kLnJlc3VsdFZhcmlhYmxlTmFtZTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gICAgICAgICAgID0gY29tbWFuZC5leHByZXNzaW9uO1xuXG4gICAgICAgIGlmIChyZXN1bHRWYXJpYWJsZU5hbWUpXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYCR7cmVzdWx0VmFyaWFibGVOYW1lfSA9ICR7ZXhwcmVzc2lvbn0sICR7cmVzdWx0VmFyaWFibGVOYW1lfWA7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2UuZXhlY3V0ZUpzRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICB7IHNraXBWaXNpYmlsaXR5Q2hlY2s6IGZhbHNlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGVjdXRlSnNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHRoaXMsIHsgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIChjb21tYW5kOiBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCwgY2FsbHNpdGU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzLmNsZWFyKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGNvbW1hbmQuZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6ICB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNhbGxzaXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQuZXhwcmVzc2lvbiwgdGhpcywgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0UmVFeGVjdXRhYmxlUHJvbWlzZUV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlclNlcnZpY2UpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgY29tbWFuZC5hY3R1YWwgPSBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlclNlcnZpY2U/LmdldEFzc2VydGlvbkFjdHVhbFZhbHVlKHtcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHNlbGYuaWQsXG4gICAgICAgICAgICAgICAgY29tbWFuZElkOiBjb21tYW5kLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0QXNzZXJ0aW9uRm5FeGVjdXRpb25Ub0NvbXBpbGVyU2VydmljZSAoZXhlY3V0b3I6IEFzc2VydGlvbkV4ZWN1dG9yKTogdm9pZCB7XG4gICAgICAgIGV4ZWN1dG9yLmZuID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5leGVjdXRlQXNzZXJ0aW9uRm4oe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGV4ZWN1dG9yLmNvbW1hbmQuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlQXNzZXJ0aW9uIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQuYWN0dWFsID09PSBTeW1ib2wuZm9yKFJFX0VYRUNVVEFCTEVfUFJPTUlTRV9NQVJLRVJfREVTQ1JJUFRJT04pKVxuICAgICAgICAgICAgdGhpcy5fcmVkaXJlY3RSZUV4ZWN1dGFibGVQcm9taXNlRXhlY3V0aW9uVG9Db21waWxlclNlcnZpY2UoY29tbWFuZCk7XG5cbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uVGltZW91dCA9IGdldEFzc2VydGlvblRpbWVvdXQoY29tbWFuZCwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgICAgICAgICA9IG5ldyBBc3NlcnRpb25FeGVjdXRvcihjb21tYW5kLCBhc3NlcnRpb25UaW1lb3V0LCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgZXhlY3V0b3Iub25jZSgnc3RhcnQtYXNzZXJ0aW9uLXJldHJpZXMnLCAodGltZW91dDogbnVtYmVyKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuU2hvd0Fzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHRpbWVvdXQpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ2VuZC1hc3NlcnRpb24tcmV0cmllcycsIChzdWNjZXNzOiBib29sZWFuKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuSGlkZUFzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHN1Y2Nlc3MpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ25vbi1zZXJpYWxpemFibGUtYWN0dWFsLXZhbHVlJywgdGhpcy5fcmVkaXJlY3RBc3NlcnRpb25GbkV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBleGVjdXRlRm4gPSB0aGlzLmRlY29yYXRlUHJldmVudEVtaXRBY3Rpb25FdmVudHMoKCkgPT4gZXhlY3V0b3IucnVuKCksIHsgcHJldmVudDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUZuKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRqdXN0Q29uZmlndXJhdGlvbldpdGhDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudGVzdERvbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuaGlkZUJyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldE5hdGl2ZURpYWxvZ0hhbmRsZXIpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgPSAoY29tbWFuZCBhcyBhbnkpLmRpYWxvZ0hhbmRsZXI7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9JZnJhbWUpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb01haW5XaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gbnVsbDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRUZXN0U3BlZWQpXG4gICAgICAgICAgICB0aGlzLnNwZWVkID0gKGNvbW1hbmQgYXMgYW55KS5zcGVlZDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IChjb21tYW5kIGFzIGFueSkuZHVyYXRpb247XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGlzYWJsZURlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyLmhpZGVCcmVha3BvaW50KHRoaXMuc2Vzc2lvbi5pZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWdnaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2FkanVzdFNjcmVlbnNob3RDb21tYW5kIChjb21tYW5kOiBUYWtlU2NyZWVuc2hvdEJhc2VDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJJZCAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkO1xuICAgICAgICBjb25zdCB7IGhhc0Nocm9tZWxlc3NTY3JlZW5zaG90cyB9ID0gYXdhaXQgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcm92aWRlci5oYXNDdXN0b21BY3Rpb25Gb3JCcm93c2VyKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgaWYgKCFoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHMpXG4gICAgICAgICAgICBjb21tYW5kLmdlbmVyYXRlU2NyZWVuc2hvdE1hcmsoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2FkanVzdENvbW1hbmRPcHRpb25zQW5kRW52aXJvbm1lbnQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKChjb21tYW5kIGFzIGFueSkub3B0aW9ucz8uY29uZmlkZW50aWFsICE9PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnR5cGVUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKChjb21tYW5kIGFzIGFueSkuc2VsZWN0b3IsIGNhbGxzaXRlKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUucHJlc3NLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5HZXRBY3RpdmVFbGVtZW50Q29tbWFuZCgpKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSAmJiAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlICYmICF0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlByZXBhcmVDbGllbnRFbnZpcm9ubWVudEluRGVidWdNb2RlKGNvbW1hbmQuZXNtUnVudGltZSkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3NldEJyZWFrcG9pbnRJZk5lY2Vzc2FyeSAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzICYmIHRoaXMuZGVidWdnaW5nICYmIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQoY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UgfCBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU/OiBzdHJpbmcgfCBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZCBpbnN0YW5jZW9mIEFjdGlvbkNvbW1hbmRCYXNlXG4gICAgICAgICAgICA/IHRoaXMuX2V4ZWN1dGVBY3Rpb25Db21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKVxuICAgICAgICAgICAgOiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2V4ZWN1dGVBY3Rpb25Db21tYW5kIChjb21tYW5kOiBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSB7IGFwaUFjdGlvbk5hbWU6IGNvbW1hbmQubWV0aG9kTmFtZSwgY29tbWFuZCB9O1xuXG4gICAgICAgIGxldCBlcnJvckFkYXB0ZXIgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgICAgICAgID0gbnVsbDtcbiAgICAgICAgbGV0IHJlc3VsdCAgICAgICA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudChjb21tYW5kLCBjYWxsc2l0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRBY3Rpb25FdmVudCgnYWN0aW9uLXN0YXJ0JywgYWN0aW9uQXJncyk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFlcnJvcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5waGFzZSA9PT0gVGVzdFJ1blBoYXNlLnBlbmRpbmdGaW5hbGl6YXRpb24gJiYgZXJyIGluc3RhbmNlb2YgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpXG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UudW5hd2FpdGVkTWV0aG9kV2l0aEFzc2VydGlvbiwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgY2FsbHNpdGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTk9URTogY2hlY2sgaWYgZXJyb3IgaXMgVGVzdENhZmVFcnJvckxpc3QgaXMgc3BlY2lmaWMgZm9yIHRoZSBgdXNlUm9sZWAgYWN0aW9uXG4gICAgICAgICAgICAvLyBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYW4gYWRhcHRlcixcbiAgICAgICAgICAgIC8vIHNpbmNlIGVycm9yIGlzIGFscmVhZHkgd2FzIHByb2Nlc3NlZCBpbiByb2xlIGluaXRpYWxpemVyXG4gICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21ha2VTY3JlZW5zaG90T25GYWlsKGNvbW1hbmQuYWN0aW9uSWQpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gdGhpcy5fY3JlYXRlRXJyb3JBZGFwdGVyKHByb2Nlc3NUZXN0Rm5FcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yQWRhcHRlciA9IGVycm9yLmFkYXB0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbkFyZ3MsIHtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgZXJyOiBlcnJvckFkYXB0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEFjdGlvbkV2ZW50KCdhY3Rpb24tZG9uZScsIGFjdGlvbkFyZ3MpO1xuXG4gICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCB8IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmNvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1BhZ2VFcnJvciAmJiBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IoY29tbWFuZCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0Q29tbWFuZFdpdGhQYWdlRXJyb3IoY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQrKztcblxuICAgICAgICB0aGlzLl9hZGp1c3RDb25maWd1cmF0aW9uV2l0aENvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0QnJlYWtwb2ludElmTmVjZXNzYXJ5KGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoaXNTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlU2NyZWVuc2hvdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5zY3JlZW5zaG90c0Rpc2FibGVkLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hZGp1c3RTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kIGFzIFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICAgIGlmIChpc1Jlc2l6ZVdpbmRvd0NvbW1hbmQoY29tbWFuZCkgJiYgdGhpcy5vcHRzLnZpZGVvUGF0aClcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS52aWRlb0Jyb3dzZXJSZXNpemluZywgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgdGhpcy50ZXN0Lm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLndhaXQpXG4gICAgICAgICAgICByZXR1cm4gZGVsYXkoKGNvbW1hbmQgYXMgYW55KS50aW1lb3V0KTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0UGFnZUxvYWRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmRlYnVnKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBJbiByZWd1bGFyIG1vZGUsIGl0J3MgcG9zc2libGUgdG8gZGVidWcgdGVzdHMgb25seSB1c2luZyBUZXN0Q2FmZSBVSSAoJ1Jlc3VtZScgYW5kICdOZXh0IHN0ZXAnIGJ1dHRvbnMpLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCB3YXJuIG9uIHRyeWluZyB0byBkZWJ1ZyBpbiBoZWFkbGVzcyBtb2RlLlxuICAgICAgICAgICAgLy8gSW4gY29tcGlsZXIgc2VydmljZSBtb2RlLCB3ZSBjYW4gZGVidWcgZXZlbiBpbiBoZWFkbGVzcyBtb2RlIHVzaW5nIGFueSBkZWJ1Z2dpbmcgdG9vbHMuIFNvLCBpbiB0aGlzIGNhc2UsIHRoZSB3YXJuaW5nIGlzIGV4Y2Vzc2l2ZS5cbiAgICAgICAgICAgIGNvbnN0IGNhbkRlYnVnID0gISF0aGlzLmNvbXBpbGVyU2VydmljZSB8fCAhdGhpcy5icm93c2VyQ29ubmVjdGlvbi5pc0hlYWRsZXNzQnJvd3NlcigpO1xuXG4gICAgICAgICAgICBpZiAoY2FuRGVidWcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZChjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCwgdm9pZCAwKTtcblxuICAgICAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UuZGVidWdJbkhlYWRsZXNzRXJyb3IsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS51c2VSb2xlKSB7XG4gICAgICAgICAgICBsZXQgZm4gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLl91c2VSb2xlKChjb21tYW5kIGFzIGFueSkucm9sZSwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyhmbiwgeyBwcmV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgZm4gPSB0aGlzLmRlY29yYXRlRGlzYWJsZURlYnVnQnJlYWtwb2ludHMoZm4sIHsgZGlzYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUucnVuQ3VzdG9tQWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB7IGZuLCBhcmdzIH0gPSBjb21tYW5kIGFzIFJ1bkN1c3RvbUFjdGlvbkNvbW1hbmQ7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkRm4gICAgPSB3cmFwQ3VzdG9tQWN0aW9uKGZuKTtcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdyYXBwZWRGbih0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5hc3NlcnRpb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzc2VydGlvbihjb21tYW5kIGFzIEFzc2VydGlvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZXhlY3V0ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZUpzRXhwcmVzc2lvbihjb21tYW5kIGFzIEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmV4ZWN1dGVBc3luY0V4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQgYXMgRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldEJyb3dzZXJDb25zb2xlTWVzc2FnZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9QcmV2aW91c1dpbmRvdylcbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkud2luZG93SWQgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByZXZpb3VzQWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZShjb21tYW5kIGFzIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZ2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlR2V0Q29va2llcyhjb21tYW5kIGFzIEdldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlU2V0Q29va2llcyhjb21tYW5kIGFzIFNldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVsZXRlQ29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlRGVsZXRlQ29va2llcyhjb21tYW5kIGFzIERlbGV0ZUNvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuYWRkUmVxdWVzdEhvb2tzKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKChjb21tYW5kIGFzIEFkZFJlcXVlc3RIb29rc0NvbW1hbmQpLmhvb2tzLm1hcChob29rID0+IHRoaXMuX2FkZFJlcXVlc3RIb29rKGhvb2spKSk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnJlbW92ZVJlcXVlc3RIb29rcylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCgoY29tbWFuZCBhcyBSZW1vdmVSZXF1ZXN0SG9va3NDb21tYW5kKS5ob29rcy5tYXAoaG9vayA9PiB0aGlzLl9yZW1vdmVSZXF1ZXN0SG9vayhob29rKSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVqZWN0Q29tbWFuZFdpdGhQYWdlRXJyb3IgKGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPEVycm9yPiB7XG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvcjtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5jYWxsc2l0ZSAgICAgICAgICA9IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NlbmRDbG9zZUNoaWxkV2luZG93T25GaWxlRG93bmxvYWRpbmdDb21tYW5kICgpOiBDb21tYW5kQmFzZSB7XG4gICAgICAgIHJldHVybiBuZXcgYWN0aW9uQ29tbWFuZHMuQ2xvc2VDaGlsZFdpbmRvd09uRmlsZURvd25sb2FkaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9tYWtlU2NyZWVuc2hvdE9uRmFpbCAoZmFpbGVkQWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBzY3JlZW5zaG90cyB9ID0gdGhpcy5vcHRzO1xuXG4gICAgICAgIGlmICghdGhpcy5lcnJTY3JlZW5zaG90UGF0aCAmJiAoc2NyZWVuc2hvdHMgYXMgU2NyZWVuc2hvdE9wdGlvblZhbHVlKT8udGFrZU9uRmFpbHMpXG4gICAgICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgYnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmRzLlRha2VTY3JlZW5zaG90T25GYWlsQ29tbWFuZCh7IGZhaWxlZEFjdGlvbklkIH0pKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGVjb3JhdGVXaXRoRmxhZyAoZm46IEZ1bmN0aW9uLCBmbGFnTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpc1tmbGFnTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzW2ZsYWdOYW1lXSA9ICF2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyAoZm46IEZ1bmN0aW9uLCB7IHByZXZlbnQgfTogeyBwcmV2ZW50OiBib29sZWFuIH0pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29yYXRlV2l0aEZsYWcoZm4sICdwcmV2ZW50RW1pdEFjdGlvbkV2ZW50cycsIHByZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvcmF0ZURpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzIChmbjogRnVuY3Rpb24sIHsgZGlzYWJsZSB9OiB7IGRpc2FibGU6IGJvb2xlYW4gfSk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb3JhdGVXaXRoRmxhZyhmbiwgJ2Rpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzJywgZGlzYWJsZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYW5hZ2VtZW50XG4gICAgcHVibGljIGFzeW5jIGdldFN0YXRlU25hcHNob3QgKCk6IFByb21pc2U8U3RhdGVTbmFwc2hvdD4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgc3RhdGUuc3RvcmFnZXMgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuQmFja3VwU3RvcmFnZXNDb21tYW5kKCkpIGFzIFN0b3JhZ2VzU25hcHNob3Q7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NsZWFuVXBDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5zZXRDdHgoe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnNldEZpeHR1cmVDdHgoe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3R4ICAgICAgICA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVDdHggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy50ZXN0UnVuQ3R4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzd2l0Y2hUb0NsZWFuUnVuICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9jbGVhblVwQ3R4cygpO1xuXG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gbmV3IEJyb3dzZXJDb25zb2xlTWVzc2FnZXMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChTdGF0ZVNuYXBzaG90LmVtcHR5KCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnNwZWVkICE9PSB0aGlzLm9wdHMuc3BlZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldFNwZWVkQ29tbWFuZCA9IG5ldyBhY3Rpb25Db21tYW5kcy5TZXRUZXN0U3BlZWRDb21tYW5kKHsgc3BlZWQ6IHRoaXMub3B0cy5zcGVlZCB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChzZXRTcGVlZENvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZUxvYWRUaW1lb3V0ICE9PSB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCBzZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQoeyBkdXJhdGlvbjogdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChzZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUb1VybCh1cmwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZURpYWxvZ0hhbmRsZXJDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldE5hdGl2ZURpYWxvZ0hhbmRsZXJDb21tYW5kKHsgZGlhbG9nSGFuZGxlcjogeyBmbjogbnVsbCB9IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHJlbW92ZURpYWxvZ0hhbmRsZXJDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBuYXZpZ2F0ZVRvVXJsICh1cmw6IHN0cmluZywgZm9yY2VSZWxvYWQ6IGJvb2xlYW4sIHN0YXRlU25hcHNob3Q/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGVDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLk5hdmlnYXRlVG9Db21tYW5kKHsgdXJsLCBmb3JjZVJlbG9hZCwgc3RhdGVTbmFwc2hvdCB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5hdmlnYXRlQ29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0U3RhdGVTbmFwc2hvdEZyb21Sb2xlIChyb2xlOiBSb2xlKTogUHJvbWlzZTxTdGF0ZVNuYXBzaG90PiB7XG4gICAgICAgIGNvbnN0IHByZXZQaGFzZSA9IHRoaXMucGhhc2U7XG5cbiAgICAgICAgaWYgKHJvbGUucGhhc2UgPT09IFJPTEVfUEhBU0UuaW5pdGlhbGl6ZWQgJiYgcm9sZS5pbml0RXJyIGluc3RhbmNlb2YgVGVzdENhZmVFcnJvckxpc3QgJiYgcm9sZS5pbml0RXJyLmhhc0Vycm9ycylcbiAgICAgICAgICAgIHJvbGUuaW5pdEVyci5hZGFwdGVyID0gdGhpcy5fY3JlYXRlRXJyb3JBZGFwdGVyKHJvbGUuaW5pdEVyci5pdGVtc1swXSk7XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5pblJvbGVJbml0aWFsaXplcjtcblxuICAgICAgICBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS51bmluaXRpYWxpemVkKVxuICAgICAgICAgICAgYXdhaXQgcm9sZS5pbml0aWFsaXplKHRoaXMpO1xuXG4gICAgICAgIGVsc2UgaWYgKHJvbGUucGhhc2UgPT09IFJPTEVfUEhBU0UucGVuZGluZ0luaXRpYWxpemF0aW9uKVxuICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQocm9sZSwgJ2luaXRpYWxpemVkJyk7XG5cbiAgICAgICAgaWYgKHJvbGUuaW5pdEVycilcbiAgICAgICAgICAgIHRocm93IHJvbGUuaW5pdEVycjtcblxuICAgICAgICB0aGlzLnBoYXNlID0gcHJldlBoYXNlO1xuXG4gICAgICAgIHJldHVybiByb2xlLnN0YXRlU25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdXNlUm9sZSAocm9sZTogUm9sZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnBoYXNlID09PSBUZXN0UnVuUGhhc2UuaW5Sb2xlSW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUm9sZVN3aXRjaEluUm9sZUluaXRpYWxpemVyRXJyb3IoY2FsbHNpdGUpO1xuXG4gICAgICAgIGNvbnN0IGJvb2ttYXJrID0gbmV3IFRlc3RSdW5Cb29rbWFyayh0aGlzLCByb2xlKTtcblxuICAgICAgICBhd2FpdCBib29rbWFyay5pbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJvbGVJZClcbiAgICAgICAgICAgIHRoaXMudXNlZFJvbGVTdGF0ZXNbdGhpcy5jdXJyZW50Um9sZUlkXSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGVTbmFwc2hvdCgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlU25hcHNob3QgPSB0aGlzLnVzZWRSb2xlU3RhdGVzW3JvbGUuaWRdIHx8IGF3YWl0IHRoaXMuX2dldFN0YXRlU25hcHNob3RGcm9tUm9sZShyb2xlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChzdGF0ZVNuYXBzaG90KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRSb2xlSWQgPSByb2xlLmlkO1xuXG4gICAgICAgIGF3YWl0IGJvb2ttYXJrLnJlc3RvcmUoY2FsbHNpdGUsIHN0YXRlU25hcHNob3QpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50VXJsICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgfSwgeyBib3VuZFRlc3RSdW46IHRoaXMgfSk7XG5cbiAgICAgICAgY29uc3QgZ2V0TG9jYXRpb24gPSBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExvY2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZSAoY29tbWFuZDogU3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFdpbmRvd3MgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBHZXRDdXJyZW50V2luZG93c0NvbW1hbmQoe30sIHRoaXMpIGFzIENvbW1hbmRCYXNlKSBhcyBPcGVuZWRXaW5kb3dJbmZvcm1hdGlvbltdO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd3MgPSBhd2FpdCBhc3luY0ZpbHRlcjxPcGVuZWRXaW5kb3dJbmZvcm1hdGlvbj4oY3VycmVudFdpbmRvd3MsIGFzeW5jIHduZCA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHVybDogICBuZXcgVVJMKHduZC51cmwpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogd25kLnRpdGxlLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXJTZXJ2aWNlUHJlZGljYXRlRGF0YSA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZElkOiBjb21tYW5kLmlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2UuY2hlY2tXaW5kb3coY29tcGlsZXJTZXJ2aWNlUHJlZGljYXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQuY2hlY2tXaW5kb3cocHJlZGljYXRlRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvd3MubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLm11bHRpcGxlV2luZG93c0ZvdW5kQnlQcmVkaWNhdGUsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IFN3aXRjaFRvV2luZG93Q29tbWFuZCh7IHdpbmRvd0lkOiB3aW5kb3dzWzBdLmlkIH0sIHRoaXMpIGFzIENvbW1hbmRCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNjb25uZWN0IChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKGVycik7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0ZWQnLCBlcnIpO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QgKCk6IENvbW1hbmRCYXNlIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QWN0aW9uRXZlbnQgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpcGxlV2luZG93c0FsbG93ZWQgKHRlc3RSdW46IFRlc3RSdW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0ZXN0IH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIHJldHVybiAhZGlzYWJsZU11bHRpcGxlV2luZG93cyAmJiAhKHRlc3QgYXMgTGVnYWN5VGVzdFJ1bikuaXNMZWdhY3kgJiYgISF0ZXN0UnVuLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0aWFsaXplICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY29va2llUHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLl9pbml0UmVxdWVzdEhvb2tzKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVyU2VydmljZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5pbml0aWFsaXplVGVzdFJ1bkRhdGEoe1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgdGhpcy50ZXN0LmlkLFxuICAgICAgICAgICAgYnJvd3NlcjogICAgICAgIHRoaXMuYnJvd3NlcixcbiAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiB0aGlzLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgbWVzc2FnZUJ1czogICAgIHRoaXMuX21lc3NhZ2VCdXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aXZlV2luZG93SWQgKCk6IG51bGwgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5hY3RpdmVXaW5kb3dJZDtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIHRpbWUtY3JpdGljYWwgYW5kIG11c3QgcmV0dXJuIEFTQVAgdG8gYXZvaWQgY2xpZW50IGRpc2Nvbm5lY3Rpb25cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMucmVhZHldIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKG1zZy5zdGF0dXMuaXNPYnNlcnZpbmdGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QoKTtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy50ZXN0UnVuUmVxdWVzdEluRGlzY29ubmVjdGVkQnJvd3NlciwgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VySW5mby5hbGlhcykpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nUmVxdWVzdCgpO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBkcml2ZXIgc2VuZHMgdGhlIHN0YXR1cyBmb3IgdGhlIHNlY29uZCB0aW1lIGlmIGl0IGRpZG4ndCBnZXQgYSByZXNwb25zZSBhdCB0aGVcbiAgICAgICAgLy8gZmlyc3QgdHJ5LiBUaGlzIGlzIHBvc3NpYmxlIHdoZW4gdGhlIHBhZ2Ugd2FzIHVubG9hZGVkIGFmdGVyIHRoZSBkcml2ZXIgc2VudCB0aGUgc3RhdHVzLlxuICAgICAgICBpZiAobXNnLnN0YXR1cy5pZCA9PT0gdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U7XG5cbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQgICAgICAgPSBtc2cuc3RhdHVzLmlkO1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuX2hhbmRsZURyaXZlclJlcXVlc3QobXNnLnN0YXR1cyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlIHx8IG1zZy5zdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlO1xuXG4gICAgICAgIC8vIE5PVEU6IHdlIHNlbmQgYW4gZW1wdHkgcmVzcG9uc2UgYWZ0ZXIgdGhlIE1BWF9SRVNQT05TRV9ERUxBWSB0aW1lb3V0IGlzIGV4Y2VlZGVkIHRvIGtlZXAgY29ubmVjdGlvblxuICAgICAgICAvLyB3aXRoIHRoZSBjbGllbnQgYW5kIHByZXZlbnQgdGhlIHJlc3BvbnNlIHRpbWVvdXQgZXhjZXB0aW9uIG9uIHRoZSBjbGllbnQgc2lkZVxuICAgICAgICBjb25zdCByZXNwb25zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChudWxsKSwgTUFYX1JFU1BPTlNFX0RFTEFZKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHsgcmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZVRpbWVvdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLnJlYWR5Rm9yQnJvd3Nlck1hbmlwdWxhdGlvbl0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8QnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdD4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IGVycm9yICA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLmV4ZWN1dGVQZW5kaW5nTWFuaXB1bGF0aW9uKG1zZywgdGhpcy5fbWVzc2FnZUJ1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgICAgZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YWNrOiAgICAgICAgICAgZXJyLnN0YWNrLFxuICAgICAgICAgICAgICAgICAgICBpc0ludGVybmFsRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlc3VsdCwgZXJyb3IgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMud2FpdEZvckZpbGVEb3dubG9hZF0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
1143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUlnQjtBQUVoQixtQ0FBZ0M7QUFDaEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3Qyx3REFBZ0M7QUFDaEMsdUZBQTZEO0FBQzdELDREQUEwQztBQUMxQyxpR0FBb0Y7QUFDcEYsc0VBQXFEO0FBQ3JELCtDQUFpRDtBQUVqRCxrREFVNkI7QUFFN0Isd0VBQWdEO0FBQ2hELDJEQUEyQztBQUMzQywyREFBbUM7QUFDbkMsbUZBQXlEO0FBQ3pELG9FQUE0QztBQUM1QywrRUFBcUQ7QUFDckQsMERBQXVDO0FBQ3ZDLDBFQUF5RDtBQUN6RCwwRkFBZ0U7QUFDaEUsK0VBQXNEO0FBQ3RELHVGQUErRDtBQUUvRCw2REFXNkI7QUFFN0IsbUVBQXFEO0FBQ3JELDBEQUF3RTtBQUN4RSwrRUFBd0U7QUFDeEUsNENBQStFO0FBRS9FLDRDQVEwQjtBQUUxQixnREFhNEI7QUFFNUIsMkNBQWtFO0FBQ2xFLDRGQUFpRTtBQUNqRSwrRkFBNEU7QUFDNUUsK0RBQXlGO0FBSXpGLDhFQUFxRDtBQUVyRCw4RkFBb0U7QUFDcEUsOEZBQW9FO0FBTXBFLGdEQUFvRTtBQUtwRSx1R0FBNkU7QUFhN0Usb0RBQW1DO0FBRW5DLHdEQUlnQztBQUVoQyxtSEFBa0o7QUFDbEosMkZBQWlFO0FBQ2pFLGlHQUF1RTtBQUN2RSx1RUFBOEM7QUFDOUMsc0VBQXVEO0FBQ3ZELHlFQUFnRDtBQUdoRCwrRkFBb0U7QUFDcEUsNkJBQTBCO0FBRTFCLDBEQUFtRTtBQUNuRSwrQ0FBMEQ7QUFFMUQsbUZBQXlEO0FBRXpELG1EQUl5QjtBQUt6QixNQUFNLFdBQVcsR0FBbUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLE1BQU0scUJBQXFCLEdBQVMs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Q0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQjs7Z0JBRUcsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLE9BQU8sQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQWg3Q0QsMEJBZzdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgcHVsbCxcbiAgICByZW1vdmUsXG4gICAgY2hhaW4sXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyByZWFkU3luYyBhcyByZWFkIH0gZnJvbSAncmVhZC1maWxlLXJlbGF0aXZlJztcbmltcG9ydCBwcm9taXNpZnlFdmVudCBmcm9tICdwcm9taXNpZnktZXZlbnQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0UnVuRGVidWdMb2cgZnJvbSAnLi9kZWJ1Zy1sb2cnO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgVGVzdENhZmVFcnJvckxpc3QgZnJvbSAnLi4vZXJyb3JzL2Vycm9yLWxpc3QnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuXG5pbXBvcnQge1xuICAgIFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IsXG4gICAgUGFnZUxvYWRFcnJvcixcbiAgICBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcixcbiAgICBTd2l0Y2hUb1dpbmRvd1ByZWRpY2F0ZUVycm9yLFxuICAgIFdpbmRvd05vdEZvdW5kRXJyb3IsXG4gICAgUmVxdWVzdEhvb2tCYXNlRXJyb3IsXG4gICAgVGVzdFRpbWVvdXRFcnJvcixcbiAgICBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcixcbiAgICBSdW5UaW1lb3V0RXJyb3IsXG59IGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi8nO1xuXG5pbXBvcnQgQ0xJRU5UX01FU1NBR0VTIGZyb20gJy4vY2xpZW50LW1lc3NhZ2VzJztcbmltcG9ydCBDT01NQU5EX1RZUEUgZnJvbSAnLi9jb21tYW5kcy90eXBlJztcbmltcG9ydCBkZWxheSBmcm9tICcuLi91dGlscy9kZWxheSc7XG5pbXBvcnQgaXNQYXNzd29yZElucHV0IGZyb20gJy4uL3V0aWxzL2lzLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0ZXN0UnVuTWFya2VyIGZyb20gJy4vbWFya2VyLXN5bWJvbCc7XG5pbXBvcnQgdGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IFJPTEVfUEhBU0UgZnJvbSAnLi4vcm9sZS9waGFzZSc7XG5pbXBvcnQgUmVwb3J0ZXJQbHVnaW5Ib3N0IGZyb20gJy4uL3JlcG9ydGVyL3BsdWdpbi1ob3N0JztcbmltcG9ydCBCcm93c2VyQ29uc29sZU1lc3NhZ2VzIGZyb20gJy4vYnJvd3Nlci1jb25zb2xlLW1lc3NhZ2VzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRSBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbWVzc2FnZSc7XG5cbmltcG9ydCB7XG4gICAgU3RhdGVTbmFwc2hvdCxcbiAgICBTUEVDSUFMX0VSUk9SX1BBR0UsXG4gICAgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgSW5qZWN0YWJsZVJlc291cmNlcyxcbiAgICBSZXF1ZXN0RXZlbnQsXG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICBSZXNwb25zZUV2ZW50LFxuICAgIFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsXG4gICAgU3RvcmFnZXNTbmFwc2hvdCxcbiAgICBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIsXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5pbXBvcnQgKiBhcyBJTkpFQ1RBQkxFUyBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgZmluZFByb2JsZW1hdGljU2NyaXB0cyB9IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgZ2V0Q3VzdG9tQ2xpZW50U2NyaXB0VXJsIGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9nZXQtdXJsJztcbmltcG9ydCB7IGdldFBsdXJhbFN1ZmZpeCwgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcblxuaW1wb3J0IHtcbiAgICBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IsXG4gICAgaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZCxcbiAgICBpc1NjcmVlbnNob3RDb21tYW5kLFxuICAgIGlzU2VydmljZUNvbW1hbmQsXG4gICAgY2FuU2V0RGVidWdnZXJCcmVha3BvaW50QmVmb3JlQ29tbWFuZCxcbiAgICBpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQsXG4gICAgaXNSZXNpemVXaW5kb3dDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCxcbiAgICBFeGVjdXRlRXhwcmVzc2lvbkNvbW1hbmQsXG4gICAgR2V0Q3VycmVudFdpbmRvd3NDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93Q29tbWFuZCxcbiAgICBHZXRDb29raWVzQ29tbWFuZCxcbiAgICBTZXRDb29raWVzQ29tbWFuZCxcbiAgICBEZWxldGVDb29raWVzQ29tbWFuZCxcbiAgICBBZGRSZXF1ZXN0SG9va3NDb21tYW5kLFxuICAgIFJlbW92ZVJlcXVlc3RIb29rc0NvbW1hbmQsXG4gICAgUnVuQ3VzdG9tQWN0aW9uQ29tbWFuZCxcbiAgICBTa2lwSnNFcnJvcnNDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL2FjdGlvbnMnO1xuXG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUywgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBwcm9jZXNzVGVzdEZuRXJyb3IgZnJvbSAnLi4vZXJyb3JzL3Byb2Nlc3MtdGVzdC1mbi1lcnJvcic7XG5pbXBvcnQgUmVxdWVzdEhvb2tNZXRob2ROYW1lcyBmcm9tICcuLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rLW1ldGhvZC1uYW1lcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXBsaWNhdG9yLCBTZWxlY3Rvck5vZGVUcmFuc2Zvcm0gfSBmcm9tICcuLi9jbGllbnQtZnVuY3Rpb25zL3JlcGxpY2F0b3InO1xuaW1wb3J0IFRlc3QgZnJvbSAnLi4vYXBpL3N0cnVjdHVyZS90ZXN0JztcbmltcG9ydCBDYXB0dXJlciBmcm9tICcuLi9zY3JlZW5zaG90cy9jYXB0dXJlcic7XG5pbXBvcnQgQ29tcGlsZXJTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2NvbXBpbGVyL2hvc3QnO1xuaW1wb3J0IFNlc3Npb25Db250cm9sbGVyIGZyb20gJy4vc2Vzc2lvbi1jb250cm9sbGVyJztcbmltcG9ydCBUZXN0Q29udHJvbGxlciBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyJztcbmltcG9ydCBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWUgZnJvbSAnLi9icm93c2VyLW1hbmlwdWxhdGlvbi1xdWV1ZSc7XG5pbXBvcnQgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlIGZyb20gJy4vb2JzZXJ2ZWQtY2FsbHNpdGVzLXN0b3JhZ2UnO1xuaW1wb3J0IENsaWVudFNjcmlwdCBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi4vYnJvd3Nlci9jb25uZWN0aW9uJztcbmltcG9ydCB7IFF1YXJhbnRpbmUgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lJztcbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBEcml2ZXJTdGF0dXMgZnJvbSAnLi4vY2xpZW50L2RyaXZlci9zdGF0dXMnO1xuaW1wb3J0IHsgQ29tbWFuZEJhc2UsIEFjdGlvbkNvbW1hbmRCYXNlIH0gZnJvbSAnLi9jb21tYW5kcy9iYXNlLmpzJztcbmltcG9ydCBSb2xlIGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBUZXN0UnVuRXJyb3JCYXNlIH0gZnJvbSAnLi4vc2hhcmVkL2Vycm9ycyc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ2NhbGxzaXRlLXJlY29yZCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZ2V0QXNzZXJ0aW9uVGltZW91dCBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9nZXQtYXNzZXJ0aW9uLXRpbWVvdXQnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXNzZXJ0aW9uJztcbmltcG9ydCB7IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2Jyb3dzZXItbWFuaXB1bGF0aW9uJztcblxuaW1wb3J0IHtcbiAgICBEaWN0aW9uYXJ5LFxuICAgIFNraXBKc0Vycm9yc0NhbGxiYWNrLFxuICAgIFNraXBKc0Vycm9yc09wdGlvbnNPYmplY3QsXG59IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5cbi8vQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGVzdFJ1biBhcyBMZWdhY3lUZXN0UnVuIH0gZnJvbSAndGVzdGNhZmUtbGVnYWN5LWFwaSc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3RSdW5QaGFzZSBmcm9tICcuL3BoYXNlJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLFxuICAgIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmRCYXNlLFxuICAgIEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvb2JzZXJ2YXRpb24nO1xuXG5pbXBvcnQgeyBSRV9FWEVDVVRBQkxFX1BST01JU0VfTUFSS0VSX0RFU0NSSVBUSU9OIH0gZnJvbSAnLi4vc2VydmljZXMvc2VyaWFsaXphdGlvbi9yZXBsaWNhdG9yL3RyYW5zZm9ybXMvcmUtZXhlY3V0YWJsZS1wcm9taXNlLXRyYW5zZm9ybS9tYXJrZXInO1xuaW1wb3J0IFJlRXhlY3V0YWJsZVByb21pc2UgZnJvbSAnLi4vdXRpbHMvcmUtZXhlY3V0YWJsZS1wcm9taXNlJztcbmltcG9ydCBhZGRSZW5kZXJlZFdhcm5pbmcgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9hZGQtcmVuZGVyZWQtd2FybmluZyc7XG5pbXBvcnQgZ2V0QnJvd3NlciBmcm9tICcuLi91dGlscy9nZXQtYnJvd3Nlcic7XG5pbXBvcnQgQXNzZXJ0aW9uRXhlY3V0b3IgZnJvbSAnLi4vYXNzZXJ0aW9ucy9leGVjdXRvcic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQgZnJvbSAnLi4vdXRpbHMvZXhlY3V0ZS1mbi13aXRoLXRpbWVvdXQnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1hbmRzL29wdGlvbnMnO1xuaW1wb3J0IHsgcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbnMgfSBmcm9tICcuLi9hcGkvc2tpcC1qcy1lcnJvcnMnO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi9jb29raWVzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXIgfSBmcm9tICcuL2Nvb2tpZXMvYmFzZSc7XG5pbXBvcnQgd3JhcEN1c3RvbUFjdGlvbiBmcm9tICcuLi9hcGkvd3JhcC1jdXN0b20tYWN0aW9uJztcblxuaW1wb3J0IHtcbiAgICBQcm94eWxlc3NSb2xlUHJvdmlkZXIsXG4gICAgUHJveHlSb2xlUHJvdmlkZXIsXG4gICAgUm9sZVByb3ZpZGVyLFxufSBmcm9tICcuL3JvbGUtcHJvdmlkZXInO1xuXG5pbXBvcnQgUHJveHlsZXNzUmVxdWVzdFBpcGVsaW5lIGZyb20gJy4uL3Byb3h5bGVzcy9yZXF1ZXN0LXBpcGVsaW5lJztcbmltcG9ydCBQcm94eWxlc3MgZnJvbSAnLi4vcHJveHlsZXNzJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IENsaWVudEZ1bmN0aW9uQnVpbGRlciAgICAgICA9IGxhenlSZXF1aXJlKCcuLi9jbGllbnQtZnVuY3Rpb25zL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJyk7XG5jb25zdCBUZXN0UnVuQm9va21hcmsgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ib29rbWFyaycpO1xuY29uc3QgYWN0aW9uQ29tbWFuZHMgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYWN0aW9ucycpO1xuY29uc3QgYnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmRzID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nKTtcbmNvbnN0IHNlcnZpY2VDb21tYW5kcyAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL3NlcnZpY2UnKTtcbmNvbnN0IG9ic2VydmF0aW9uQ29tbWFuZHMgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL29ic2VydmF0aW9uJyk7XG5cbmNvbnN0IHsgZXhlY3V0ZUpzRXhwcmVzc2lvbiwgZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIH0gPSBsYXp5UmVxdWlyZSgnLi9leGVjdXRlLWpzLWV4cHJlc3Npb24nKTtcblxuY29uc3QgVEVTVF9SVU5fVEVNUExBVEUgICAgICAgICAgICAgICA9IHJlYWQoJy4uL2NsaWVudC90ZXN0LXJ1bi9pbmRleC5qcy5tdXN0YWNoZScpIGFzIHN0cmluZztcbmNvbnN0IElGUkFNRV9URVNUX1JVTl9URU1QTEFURSAgICAgICAgPSByZWFkKCcuLi9jbGllbnQvdGVzdC1ydW4vaWZyYW1lLmpzLm11c3RhY2hlJykgYXMgc3RyaW5nO1xuY29uc3QgVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRSA9ICd0ZXN0LWRvbmUtY29uZmlybWF0aW9uJztcbmNvbnN0IE1BWF9SRVNQT05TRV9ERUxBWSAgICAgICAgICAgICAgPSAzMDAwO1xuY29uc3QgQ0hJTERfV0lORE9XX1JFQURZX1RJTUVPVVQgICAgICA9IDMwICogMTAwMDtcblxuY29uc3QgQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCA9ICdhbGwtZHJpdmVyLXRhc2tzLWFkZGVkLXRvLXF1ZXVlJztcblxuY29uc3QgQ09NUElMRVJfU0VSVklDRV9FVkVOVFMgPSBbXG4gICAgJ3NldE1vY2snLFxuICAgICdzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucycsXG4gICAgJ3NldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG4gICAgJ3JlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG5dO1xuXG5cbmludGVyZmFjZSBUZXN0UnVuSW5pdCB7XG4gICAgdGVzdDogVGVzdDtcbiAgICBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgc2NyZWVuc2hvdENhcHR1cmVyOiBDYXB0dXJlcjtcbiAgICBnbG9iYWxXYXJuaW5nTG9nOiBXYXJuaW5nTG9nO1xuICAgIG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBtZXNzYWdlQnVzPzogTWVzc2FnZUJ1cztcbiAgICBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xufVxuXG5pbnRlcmZhY2UgRHJpdmVyVGFzayB7XG4gICAgY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQ7XG59XG5cbmludGVyZmFjZSBEcml2ZXJNZXNzYWdlIHtcbiAgICBzdGF0dXM6IERyaXZlclN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERyaXZlcldhcm5pbmcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBXQVJOSU5HX01FU1NBR0U7XG4gICAgYXJnczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0VGltZW91dCB7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBhamF4PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uVGltZW91dCB7XG4gICAgdGltZW91dDogbnVtYmVyO1xuICAgIHJlamVjdFdpdGg6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3I7XG59XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gICAgcmVzcG9uc2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dDtcbiAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICByZWplY3Q6IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgQnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdCB7XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGVycm9yOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgT3BlbmVkV2luZG93SW5mb3JtYXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1biBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIFt0ZXN0UnVuTWFya2VyXTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgcHVibGljIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHB1YmxpYyBwaGFzZTogVGVzdFJ1blBoYXNlO1xuICAgIHByaXZhdGUgZHJpdmVyVGFza1F1ZXVlOiBEcml2ZXJUYXNrW107XG4gICAgcHJpdmF0ZSB0ZXN0RG9uZUNvbW1hbmRRdWV1ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGFjdGl2ZURpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHB1YmxpYyBhY3RpdmVJZnJhbWVTZWxlY3RvcjogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIHNwZWVkOiBudW1iZXI7XG4gICAgcHVibGljIHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdEV4ZWN1dGlvblRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVuRXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlUGFnZVJlbG9hZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVxdWVzdFRpbWVvdXQ6IFJlcXVlc3RUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIHByaXZhdGUgcGVuZGluZ1JlcXVlc3Q6IFBlbmRpbmdSZXF1ZXN0IHwgbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdQYWdlRXJyb3I6IFBhZ2VMb2FkRXJyb3IgfCBFcnJvciB8IG51bGw7XG4gICAgcHJpdmF0ZSBwcm94eWxlc3NKU0Vycm9yOiBUZXN0UnVuRXJyb3JCYXNlIHwgbnVsbDtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogVGVzdENvbnRyb2xsZXIgfCBudWxsO1xuICAgIHB1YmxpYyBjdHg6IG9iamVjdDtcbiAgICBwdWJsaWMgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwdWJsaWMgdGVzdFJ1bkN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIGN1cnJlbnRSb2xlSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VkUm9sZVN0YXRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwdWJsaWMgZXJyczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U6IENvbW1hbmRCYXNlIHwgbnVsbCB8IHN0cmluZztcbiAgICBwcml2YXRlIGZpbGVEb3dubG9hZGluZ0hhbmRsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlOiBGdW5jdGlvbiB8IG51bGw7XG4gICAgcHJpdmF0ZSBhZGRpbmdEcml2ZXJUYXNrc0NvdW50OiBudW1iZXI7XG4gICAgcHVibGljIGRlYnVnZ2luZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnT25GYWlsOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZURlYnVnQnJlYWtwb2ludHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdDogUmVwb3J0ZXJQbHVnaW5Ib3N0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlOiBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWU7XG4gICAgcHJpdmF0ZSBkZWJ1Z0xvZzogVGVzdFJ1bkRlYnVnTG9nO1xuICAgIHB1YmxpYyBxdWFyYW50aW5lOiBRdWFyYW50aW5lIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBhbnk7XG4gICAgcHVibGljIG9ic2VydmVkQ2FsbHNpdGVzOiBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2U7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcGxpY2F0b3I6IGFueTtcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGVyclNjcmVlbnNob3RQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXM6IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlQnVzPzogTWVzc2FnZUJ1cztcbiAgICBwcml2YXRlIF9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29va2llUHJvdmlkZXI6IENvb2tpZVByb3ZpZGVyO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlcjogUmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JvbGVQcm92aWRlcjogUm9sZVByb3ZpZGVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh7IHRlc3QsIGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIGdsb2JhbFdhcm5pbmdMb2csIG9wdHMsIGNvbXBpbGVyU2VydmljZSwgbWVzc2FnZUJ1cywgc3RhcnRSdW5FeGVjdXRpb25UaW1lIH06IFRlc3RSdW5Jbml0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpc1t0ZXN0UnVuTWFya2VyXSAgICA9IHRydWU7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgPSBtZXNzYWdlQnVzO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgID0gbmV3IFdhcm5pbmdMb2coZ2xvYmFsV2FybmluZ0xvZywgV2FybmluZ0xvZy5jcmVhdGVBZGRXYXJuaW5nQ2FsbGJhY2sobWVzc2FnZUJ1cywgdGhpcykpO1xuICAgICAgICB0aGlzLm9wdHMgICAgICAgICAgICAgID0gb3B0cztcbiAgICAgICAgdGhpcy50ZXN0ICAgICAgICAgICAgICA9IHRlc3Q7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24gPSBicm93c2VyQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy51bnN0YWJsZSAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgICAgICAgICAgID0gZ2V0QnJvd3Nlcihicm93c2VyQ29ubmVjdGlvbik7XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5pbml0aWFsO1xuXG4gICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlICAgICAgID0gW107XG4gICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyICA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLnNwZWVkICAgICAgICAgICAgICAgID0gdGhpcy5vcHRzLnNwZWVkIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5wYWdlTG9hZFRpbWVvdXQgICAgICA9IHRoaXMuX2dldFBhZ2VMb2FkVGltZW91dCh0ZXN0LCBvcHRzKTtcbiAgICAgICAgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dCA9IHRoaXMuX2dldFRlc3RFeGVjdXRpb25UaW1lb3V0KG9wdHMpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZVBhZ2VSZWxvYWRzICAgPSB0ZXN0LmRpc2FibGVQYWdlUmVsb2FkcyB8fCBvcHRzLmRpc2FibGVQYWdlUmVsb2FkcyBhcyBib29sZWFuICYmIHRlc3QuZGlzYWJsZVBhZ2VSZWxvYWRzICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZUNhY2hpbmcgICA9IHRlc3QuZGlzYWJsZVBhZ2VDYWNoaW5nIHx8IG9wdHMuZGlzYWJsZVBhZ2VDYWNoaW5nIGFzIGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gb3B0cy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzIGFzIGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHRoaXMuX2dldFJlcXVlc3RUaW1lb3V0KHRlc3QsIG9wdHMpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IFNlc3Npb25Db250cm9sbGVyLmdldFNlc3Npb24odGhpcyk7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMgPSBuZXcgQnJvd3NlckNvbnNvbGVNZXNzYWdlcygpO1xuXG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgICA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlsZXNzSlNFcnJvciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdHggICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ID0gbnVsbDtcbiAgICAgICAgdGhpcy50ZXN0UnVuQ3R4ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmN1cnJlbnRSb2xlSWQgID0gbnVsbDtcbiAgICAgICAgdGhpcy51c2VkUm9sZVN0YXRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdGhpcy5lcnJzID0gW107XG5cbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQgICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCA9IDA7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgICAgICAgICAgICAgICA9IHRoaXMub3B0cy5kZWJ1Z01vZGUgYXMgYm9vbGVhbjtcbiAgICAgICAgdGhpcy5kZWJ1Z09uRmFpbCAgICAgICAgICAgICA9IHRoaXMub3B0cy5kZWJ1Z09uRmFpbCBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVidWdSZXBvcnRlclBsdWdpbkhvc3QgPSBuZXcgUmVwb3J0ZXJQbHVnaW5Ib3N0KHsgbm9Db2xvcnM6IGZhbHNlIH0pO1xuXG4gICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlID0gbmV3IEJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZShicm93c2VyQ29ubmVjdGlvbiwgc2NyZWVuc2hvdENhcHR1cmVyLCB0aGlzLndhcm5pbmdMb2cpO1xuXG4gICAgICAgIHRoaXMuZGVidWdMb2cgPSBuZXcgVGVzdFJ1bkRlYnVnTG9nKHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50KTtcblxuICAgICAgICB0aGlzLnF1YXJhbnRpbmUgID0gbnVsbDtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyID0gdGhpcy5vcHRzLmRlYnVnTG9nZ2VyO1xuXG4gICAgICAgIHRoaXMub2JzZXJ2ZWRDYWxsc2l0ZXMgICAgICAgICAgPSBuZXcgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlICAgICAgICAgICAgPSBjb21waWxlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXMgPSBuZXcgTWFwPHN0cmluZywgQ2FsbHNpdGVSZWNvcmQ+KCk7XG5cbiAgICAgICAgdGhpcy5yZXBsaWNhdG9yID0gY3JlYXRlUmVwbGljYXRvcihbIG5ldyBTZWxlY3Rvck5vZGVUcmFuc2Zvcm0oKSBdKTtcblxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lICAgICA9IHN0YXJ0UnVuRXhlY3V0aW9uVGltZTtcbiAgICAgICAgdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0ICAgICAgID0gdGhpcy5fZ2V0UnVuRXhlY3V0aW9uVGltZW91dChvcHRzKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyID0gdGhpcy5fZ2V0UmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMuX3JvbGVQcm92aWRlciAgICAgICAgICAgICA9IHRoaXMuX2dldFJvbGVQcm92aWRlcigpO1xuXG4gICAgICAgIHRoaXMuX2Nvb2tpZVByb3ZpZGVyID0gQ29va2llUHJvdmlkZXJGYWN0b3J5LmNyZWF0ZSh0aGlzLCB0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzIGFzIGJvb2xlYW4pO1xuXG4gICAgICAgIHRoaXMuX2FkZEluamVjdGFibGVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyICgpOiBSZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5leHBlcmltZW50YWxQcm94eWxlc3MpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcHJveHlsZXNzUmVxdWVzdFBpcGVsaW5lLnJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZVN0b3JhZ2VzU25hcHNob3QgKHN0b3JhZ2VTbmFwc2hvdDogU3RvcmFnZXNTbmFwc2hvdCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcm94eWxlc3NSZXF1ZXN0UGlwZWxpbmUucmVzdG9yaW5nU3RvcmFnZXMgPSBzdG9yYWdlU25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX3Byb3h5bGVzc1JlcXVlc3RQaXBlbGluZSAoKTogUHJveHlsZXNzUmVxdWVzdFBpcGVsaW5lIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3h5bGVzcy5yZXF1ZXN0UGlwZWxpbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgX3Byb3h5bGVzcyAoKTogUHJveHlsZXNzIHtcbiAgICAgICAgY29uc3QgcnVudGltZUluZm8gPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByb3ZpZGVyLnBsdWdpbi5vcGVuZWRCcm93c2Vyc1t0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcblxuICAgICAgICByZXR1cm4gcnVudGltZUluZm8ucHJveHlsZXNzO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJvbGVQcm92aWRlciAoKTogUm9sZVByb3ZpZGVyIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5leHBlcmltZW50YWxQcm94eWxlc3MpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5bGVzc1JvbGVQcm92aWRlcih0aGlzKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3h5Um9sZVByb3ZpZGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFBhZ2VMb2FkVGltZW91dCAodGVzdDogVGVzdCwgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBudW1iZXIge1xuICAgICAgICBpZiAodGVzdC50aW1lb3V0cz8ucGFnZUxvYWRUaW1lb3V0ICE9PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm4gdGVzdC50aW1lb3V0cy5wYWdlTG9hZFRpbWVvdXQ7XG5cbiAgICAgICAgcmV0dXJuIG9wdHMucGFnZUxvYWRUaW1lb3V0IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRSZXF1ZXN0VGltZW91dCAodGVzdDogVGVzdCwgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBSZXF1ZXN0VGltZW91dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlOiB0ZXN0LnRpbWVvdXRzPy5wYWdlUmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICAgICAgYWpheDogdGVzdC50aW1lb3V0cz8uYWpheFJlcXVlc3RUaW1lb3V0IHx8IG9wdHMuYWpheFJlcXVlc3RUaW1lb3V0IGFzIG51bWJlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRFeGVjdXRpb25UaW1lb3V0ICh0aW1lb3V0OiBudW1iZXIsIGVycm9yOiBUZXN0VGltZW91dEVycm9yIHwgUnVuVGltZW91dEVycm9yKTogRXhlY3V0aW9uVGltZW91dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgcmVqZWN0V2l0aDogZXJyb3IsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0VGVzdEV4ZWN1dGlvblRpbWVvdXQgKG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+KTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBjb25zdCB0ZXN0RXhlY3V0aW9uVGltZW91dCA9IG9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCF0ZXN0RXhlY3V0aW9uVGltZW91dClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFeGVjdXRpb25UaW1lb3V0KHRlc3RFeGVjdXRpb25UaW1lb3V0LCBuZXcgVGVzdFRpbWVvdXRFcnJvcih0ZXN0RXhlY3V0aW9uVGltZW91dCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQgKG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+KTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBjb25zdCBydW5FeGVjdXRpb25UaW1lb3V0ID0gb3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0IGFzIG51bWJlciB8fCAwO1xuXG4gICAgICAgIGlmICghcnVuRXhlY3V0aW9uVGltZW91dClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFeGVjdXRpb25UaW1lb3V0KHJ1bkV4ZWN1dGlvblRpbWVvdXQsIG5ldyBSdW5UaW1lb3V0RXJyb3IocnVuRXhlY3V0aW9uVGltZW91dCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQgKCk6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZSB8fCAhdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFRpbWVvdXQgPSBNYXRoLm1heCh0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQudGltZW91dCAtIChEYXRlLm5vdygpIC0gdGhpcy5zdGFydFJ1bkV4ZWN1dGlvblRpbWUuZ2V0VGltZSgpKSwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQoY3VycmVudFRpbWVvdXQsIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC5yZWplY3RXaXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblRpbWVvdXQgKCk6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQgJiYgKCF0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0IHx8IHRoaXMucmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQudGltZW91dCA8IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQudGltZW91dClcbiAgICAgICAgICAgID8gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dFxuICAgICAgICAgICAgOiB0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0IHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkQ2xpZW50U2NyaXB0Q29udGVudFdhcm5pbmdzSWZOZWNlc3NhcnkgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGVtcHR5LCBkdXBsaWNhdGVkQ29udGVudCB9ID0gZmluZFByb2JsZW1hdGljU2NyaXB0cyh0aGlzLnRlc3QuY2xpZW50U2NyaXB0cyBhcyBDbGllbnRTY3JpcHRbXSk7XG5cbiAgICAgICAgaWYgKGVtcHR5Lmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5jbGllbnRTY3JpcHRzV2l0aEVtcHR5Q29udGVudCk7XG5cbiAgICAgICAgaWYgKGR1cGxpY2F0ZWRDb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0UGx1cmFsU3VmZml4KGR1cGxpY2F0ZWRDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZWRDb250ZW50Q2xpZW50U2NyaXB0c1N0ciA9IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyhkdXBsaWNhdGVkQ29udGVudCwgJ1xcbicpO1xuXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UuY2xpZW50U2NyaXB0c1dpdGhEdXBsaWNhdGVkQ29udGVudCwgc3VmZml4LCBkdXBsaWNhdGVkQ29udGVudENsaWVudFNjcmlwdHNTdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkSW5qZWN0YWJsZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZGRDbGllbnRTY3JpcHRDb250ZW50V2FybmluZ3NJZk5lY2Vzc2FyeSgpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUuc2NyaXB0cy5wdXNoKC4uLklOSkVDVEFCTEVTLlNDUklQVFMpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUudXNlclNjcmlwdHMucHVzaCguLi50aGlzLnRlc3QuY2xpZW50U2NyaXB0cy5tYXAoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiAgZ2V0Q3VzdG9tQ2xpZW50U2NyaXB0VXJsKHNjcmlwdCBhcyBDbGllbnRTY3JpcHQpLFxuICAgICAgICAgICAgICAgIHBhZ2U6IHNjcmlwdC5wYWdlIGFzIFJlcXVlc3RGaWx0ZXJSdWxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUuc3R5bGVzLnB1c2goSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1RZTEVTKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW5qZWN0YWJsZSAoKTogSW5qZWN0YWJsZVJlc291cmNlcyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVhcmFudGluZUluZm8gKHF1YXJhbnRpbmU6IFF1YXJhbnRpbmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWFyYW50aW5lID0gcXVhcmFudGluZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9hZGRSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MuaW5jbHVkZXMoaG9vaykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5wdXNoKGhvb2spO1xuICAgICAgICBhd2FpdCB0aGlzLl9pbml0UmVxdWVzdEhvb2soaG9vayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5pbmNsdWRlcyhob29rKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBwdWxsKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MsIGhvb2spO1xuICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlUmVxdWVzdEhvb2soaG9vayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdFJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gdGhpcy53YXJuaW5nTG9nO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcy5tYXAocnVsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLmFkZFJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlLCB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0OiAgICAgICAgICAgaG9vay5vblJlcXVlc3QuYmluZChob29rKSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpZ3VyZVJlc3BvbnNlOiBob29rLl9vbkNvbmZpZ3VyZVJlc3BvbnNlLmJpbmQoaG9vayksXG4gICAgICAgICAgICAgICAgb25SZXNwb25zZTogICAgICAgICAgaG9vay5vblJlc3BvbnNlLmJpbmQoaG9vayksXG4gICAgICAgICAgICB9LCAoZXJyOiBSZXF1ZXN0SG9va01ldGhvZEVycm9yKSA9PiB0aGlzLl9vblJlcXVlc3RIb29rTWV0aG9kRXJyb3IoZXJyLCBob29rLl9jbGFzc05hbWUpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRSZXF1ZXN0SG9va0ZvckNvbXBpbGVyU2VydmljZSAoaG9va0lkOiBzdHJpbmcsIGhvb2tDbGFzc05hbWU6IHN0cmluZywgcnVsZXM6IFJlcXVlc3RGaWx0ZXJSdWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGVzdElkID0gdGhpcy50ZXN0LmlkO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJ1bGVzLm1hcChydWxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIuYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUsIHtcbiAgICAgICAgICAgICAgICBvblJlcXVlc3Q6ICAgICAgICAgICAoZXZlbnQ6IFJlcXVlc3RFdmVudCkgPT4gdGhpcy5jb21waWxlclNlcnZpY2U/Lm9uUmVxdWVzdEhvb2tFdmVudCh7IHRlc3RJZCwgaG9va0lkLCBuYW1lOiBSZXF1ZXN0SG9va01ldGhvZE5hbWVzLm9uUmVxdWVzdCwgZXZlbnREYXRhOiBldmVudCB9KSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpZ3VyZVJlc3BvbnNlOiAoZXZlbnQ6IENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQpID0+IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5vblJlcXVlc3RIb29rRXZlbnQoeyB0ZXN0SWQsIGhvb2tJZCwgbmFtZTogUmVxdWVzdEhvb2tNZXRob2ROYW1lcy5fb25Db25maWd1cmVSZXNwb25zZSwgZXZlbnREYXRhOiBldmVudCB9KSxcbiAgICAgICAgICAgICAgICBvblJlc3BvbnNlOiAgICAgICAgICAoZXZlbnQ6IFJlc3BvbnNlRXZlbnQpID0+IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5vblJlcXVlc3RIb29rRXZlbnQoeyB0ZXN0SWQsIGhvb2tJZCwgbmFtZTogUmVxdWVzdEhvb2tNZXRob2ROYW1lcy5vblJlc3BvbnNlLCBldmVudERhdGE6IGV2ZW50IH0pLFxuICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvcihlcnIsIGhvb2tDbGFzc05hbWUpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvciAoZXZlbnQ6IFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsIGhvb2tDbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IFRlc3RSdW5FcnJvckJhc2UgICAgICAgICAgICA9IGV2ZW50LmVycm9yO1xuICAgICAgICBjb25zdCBpc1JlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRNZXRob2RFcnJvciA9IChlcnIgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKT8uY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvcjtcblxuICAgICAgICBpZiAoIWlzUmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZE1ldGhvZEVycm9yKVxuICAgICAgICAgICAgZXJyID0gbmV3IFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IoZXJyLCBob29rQ2xhc3NOYW1lLCBldmVudC5tZXRob2ROYW1lKTtcblxuICAgICAgICB0aGlzLmFkZEVycm9yKGVycik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZGlzcG9zZVJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gbnVsbDtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMubWFwKHJ1bGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RIb29rRXZlbnRQcm92aWRlci5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9kZXRhY2hSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMgKHJ1bGVzOiBSZXF1ZXN0RmlsdGVyUnVsZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJ1bGVzLm1hcChydWxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIucmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlT25Db21waWxlclNlcnZpY2VFdmVudHMgKCk6IHZvaWQge1xuICAgICAgICBDT01QSUxFUl9TRVJWSUNFX0VWRU5UUy5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZS5vbihldmVudE5hbWUsIGFzeW5jIGFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbltldmVudE5hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlLm9uKCdhZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMnLCBhc3luYyAoeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9pbml0UmVxdWVzdEhvb2tGb3JDb21waWxlclNlcnZpY2UoaG9va0lkLCBob29rQ2xhc3NOYW1lLCBydWxlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2Uub24oJ3JlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycycsIGFzeW5jICh7IHJ1bGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZXRhY2hSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9pbml0UmVxdWVzdEhvb2tzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmVPbkNvbXBpbGVyU2VydmljZUV2ZW50cygpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy50ZXN0LnJlcXVlc3RIb29rcy5tYXAoaG9vayA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRSZXF1ZXN0SG9va0ZvckNvbXBpbGVyU2VydmljZShob29rLmlkLCBob29rLl9jbGFzc05hbWUsIGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy50ZXN0LnJlcXVlc3RIb29rcy5tYXAoaG9vayA9PiB0aGlzLl9pbml0UmVxdWVzdEhvb2soaG9vaykpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbiAoKTogYm9vbGVhbiB8IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBTa2lwSnNFcnJvcnNDYWxsYmFjayB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnRlc3Quc2tpcEpzRXJyb3JzT3B0aW9ucyAhPT0gdm9pZCAwXG4gICAgICAgICAgICA/IHRoaXMudGVzdC5za2lwSnNFcnJvcnNPcHRpb25zXG4gICAgICAgICAgICA6IHRoaXMub3B0cy5za2lwSnNFcnJvcnMgYXMgU2tpcEpzRXJyb3JzT3B0aW9uc09iamVjdCB8IGJvb2xlYW4gfHwgZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb25zKG9wdGlvbnMsIHRoaXMub3B0cy5leHBlcmltZW50YWxQcm94eWxlc3MgYXMgYm9vbGVhbik7XG4gICAgfVxuXG4gICAgLy8gSGFtbWVyaGVhZCBwYXlsb2FkXG4gICAgcHVibGljIGFzeW5jIGdldFBheWxvYWRTY3JpcHQgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCAgICAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gbnVsbDtcblxuICAgICAgICBjb25zdCBwcm94eWxlc3MgICAgPSB0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzO1xuICAgICAgICBjb25zdCBza2lwSnNFcnJvcnMgPSBwcm94eWxlc3MgPyBmYWxzZSA6IHRoaXMucHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbigpO1xuXG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoVEVTVF9SVU5fVEVNUExBVEUsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBicm93c2VySWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkKSxcbiAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlV2luZG93SWQpLFxuICAgICAgICAgICAgYnJvd3NlckhlYXJ0YmVhdFJlbGF0aXZlVXJsOiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5oZWFydGJlYXRSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyU3RhdHVzUmVsYXRpdmVVcmw6ICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnN0YXR1c1JlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJTdGF0dXNEb25lUmVsYXRpdmVVcmw6ICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uc3RhdHVzRG9uZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJJZGxlUmVsYXRpdmVVcmw6ICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWRsZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJBY3RpdmVXaW5kb3dJZFVybDogICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYWN0aXZlV2luZG93SWRVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckNsb3NlV2luZG93VXJsOiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5jbG9zZVdpbmRvd1VybCksXG4gICAgICAgICAgICBicm93c2VyT3BlbkZpbGVQcm90b2NvbFJlbGF0aXZlVXJsOiAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLm9wZW5GaWxlUHJvdG9jb2xSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyRGlzcGF0Y2hQcm94eWxlc3NFdmVudFJlbGF0aXZlVXJsOiBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmRpc3BhdGNoUHJveHlsZXNzRXZlbnRSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnVzZXJBZ2VudCksXG4gICAgICAgICAgICB0ZXN0TmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRlc3QubmFtZSksXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSgodGhpcy50ZXN0LmZpeHR1cmUgYXMgRml4dHVyZSkubmFtZSksXG4gICAgICAgICAgICBzZWxlY3RvclRpbWVvdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0LFxuICAgICAgICAgICAgcGFnZUxvYWRUaW1lb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTG9hZFRpbWVvdXQsXG4gICAgICAgICAgICBjaGlsZFdpbmRvd1JlYWR5VGltZW91dDogICAgICAgICAgICAgICAgICBDSElMRF9XSU5ET1dfUkVBRFlfVElNRU9VVCxcbiAgICAgICAgICAgIHNraXBKc0Vycm9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHNraXBKc0Vycm9ycyksXG4gICAgICAgICAgICByZXRyeVRlc3RQYWdlczogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMucmV0cnlUZXN0UGFnZXMsXG4gICAgICAgICAgICBzcGVlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWVkLFxuICAgICAgICAgICAgZGlhbG9nSGFuZGxlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSxcbiAgICAgICAgICAgIGNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zOiAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uY2FuVXNlRGVmYXVsdFdpbmRvd0FjdGlvbnMoKSksXG4gICAgICAgICAgICBwcm94eWxlc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcm94eWxlc3MpLFxuICAgICAgICAgICAgZG9tYWluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucHJveHkuc2VydmVyMUluZm8uZG9tYWluKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldElmcmFtZVBheWxvYWRTY3JpcHQgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoSUZSQU1FX1RFU1RfUlVOX1RFTVBMQVRFLCB7XG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBzZWxlY3RvclRpbWVvdXQ6IHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQsXG4gICAgICAgICAgICBwYWdlTG9hZFRpbWVvdXQ6IHRoaXMucGFnZUxvYWRUaW1lb3V0LFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICAhIXRoaXMub3B0cy5yZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgICAgIHNwZWVkOiAgICAgICAgICAgdGhpcy5zcGVlZCxcbiAgICAgICAgICAgIGRpYWxvZ0hhbmRsZXI6ICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSxcbiAgICAgICAgICAgIHByb3h5bGVzczogICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRzLmV4cGVyaW1lbnRhbFByb3h5bGVzcyksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgaGFuZGxlcnNcbiAgICBwdWJsaWMgZ2V0QXV0aENyZWRlbnRpYWxzICgpOiBudWxsIHwgQXV0aENyZWRlbnRpYWxzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdC5hdXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUZpbGVEb3dubG9hZCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlQXR0YWNobWVudCAoZGF0YTogeyBpc09wZW5lZEluTmV3V2luZG93OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRhdGEuaXNPcGVuZWRJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZVBhZ2VFcnJvciAoY3R4OiBhbnksIGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbmV3IFBhZ2VMb2FkRXJyb3IoZXJyLCBjdHgucmVxT3B0cy51cmwpO1xuXG4gICAgICAgIGN0eC5yZWRpcmVjdChjdHgudG9Qcm94eVVybChTUEVDSUFMX0VSUk9SX1BBR0UpKTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGZ1bmN0aW9uIGV4ZWN1dGlvblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVUZXN0Rm4gKHBoYXNlOiBUZXN0UnVuUGhhc2UsIGZuOiBGdW5jdGlvbiwgdGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlRm5XaXRoVGltZW91dChmbiwgdGltZW91dCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9tYWtlU2NyZWVuc2hvdE9uRmFpbCgpO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycik7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLl9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5CZWZvcmVIb29rICgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5nbG9iYWxCZWZvcmVGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEJlZm9yZUhvb2ssIHRoaXMudGVzdC5nbG9iYWxCZWZvcmVGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0LmJlZm9yZUZuKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEJlZm9yZUhvb2ssIHRoaXMudGVzdC5iZWZvcmVGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0LmZpeHR1cmU/LmJlZm9yZUVhY2hGbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pbkZpeHR1cmVCZWZvcmVFYWNoSG9vaywgdGhpcy50ZXN0LmZpeHR1cmU/LmJlZm9yZUVhY2hGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ydW5BZnRlckhvb2sgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0LmFmdGVyRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RBZnRlckhvb2ssIHRoaXMudGVzdC5hZnRlckZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnRlc3QuZml4dHVyZT8uYWZ0ZXJFYWNoRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pbkZpeHR1cmVBZnRlckVhY2hIb29rLCB0aGlzLnRlc3QuZml4dHVyZT8uYWZ0ZXJFYWNoRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5nbG9iYWxBZnRlckZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QWZ0ZXJIb29rLCB0aGlzLnRlc3QuZ2xvYmFsQWZ0ZXJGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9maW5hbGl6ZVRlc3RSdW4gKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5ncyA9IGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLmdldFdhcm5pbmdNZXNzYWdlcyh7IHRlc3RSdW5JZDogaWQgfSk7XG5cbiAgICAgICAgICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcod2FybmluZyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2UucmVtb3ZlVGVzdFJ1bkZyb21TdGF0ZSh7IHRlc3RSdW5JZDogaWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXN0UnVuVHJhY2tlci5yZW1vdmVBY3RpdmVUZXN0UnVuKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0ZXN0UnVuVHJhY2tlci5hZGRBY3RpdmVUZXN0UnVuKHRoaXMpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc3RhcnQnKTtcblxuICAgICAgICBjb25zdCBvbkRpc2Nvbm5lY3RlZCA9IChlcnI6IEVycm9yKTogdm9pZCA9PiB0aGlzLl9kaXNjb25uZWN0KGVycik7XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5vbmNlKCdkaXNjb25uZWN0ZWQnLCBvbkRpc2Nvbm5lY3RlZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5vbmNlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3JlYWR5Jyk7XG5cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuX3J1bkJlZm9yZUhvb2soKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0LCB0aGlzLnRlc3QuZm4gYXMgRnVuY3Rpb24sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ydW5BZnRlckhvb2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLnBlbmRpbmdGaW5hbGl6YXRpb247XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5yZW1vdmVMaXN0ZW5lcignZGlzY29ubmVjdGVkJywgb25EaXNjb25uZWN0ZWQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVycnMubGVuZ3RoICYmIHRoaXMuZGVidWdPbkZhaWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyclN0ciA9IHRoaXMuZGVidWdSZXBvcnRlclBsdWdpbkhvc3QuZm9ybWF0RXJyb3IodGhpcy5lcnJzWzBdKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kKHZvaWQgMCwgZXJyU3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlLWRvbmUnKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuVGVzdERvbmVDb21tYW5kKCkpO1xuXG4gICAgICAgIHRoaXMuX2FkZFBlbmRpbmdQYWdlRXJyb3JJZkFueSgpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIuY2xlYXJSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVSZXF1ZXN0SG9va0Vycm9ycygpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmFsaXplVGVzdFJ1bih0aGlzLnNlc3Npb24uaWQpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnZG9uZScpO1xuICAgIH1cblxuICAgIC8vIEVycm9yc1xuICAgIHByaXZhdGUgX2FkZFBlbmRpbmdQYWdlRXJyb3JJZkFueSAoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5wZW5kaW5nUGFnZUVycm9yIHx8IHRoaXMucHJveHlsZXNzSlNFcnJvcjtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eWxlc3NKU0Vycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW5zdXJlRXJyb3JJZCAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5pZCA9IGVyci5pZCB8fCBuYW5vaWQoNyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlRXJyb3JBZGFwdGVyIChlcnI6IEVycm9yKTogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlRXJyb3JJZChlcnIpO1xuXG4gICAgICAgIHJldHVybiBuZXcgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyKGVyciwge1xuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50LFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6IHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggfHwgJycsXG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgIHRlc3RSdW5QaGFzZTogICB0aGlzLnBoYXNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRXJyb3IgKGVycjogRXJyb3IgfCBUZXN0Q2FmZUVycm9yTGlzdCB8IFRlc3RSdW5FcnJvckJhc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXJyTGlzdCA9IChlcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCA/IGVyci5pdGVtcyA6IFtlcnJdKSBhcyBFcnJvcltdO1xuXG4gICAgICAgIGVyckxpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIoaXRlbSk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJycy5wdXNoKGFkYXB0ZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUHJveHlsZXNzSlNFcnJvciAoZXJyOiBUZXN0UnVuRXJyb3JCYXNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJveHlsZXNzSlNFcnJvciA9IGVycjtcblxuICAgICAgICB0aGlzLnByb3h5bGVzc0pTRXJyb3IuY2FsbHNpdGUgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrPy5jYWxsc2l0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1ZXN0SG9va0Vycm9ycyA9IHJlbW92ZSh0aGlzLmVycnMsIGUgPT5cbiAgICAgICAgICAgIChlIGFzIHVua25vd24gYXMgVGVzdFJ1bkVycm9yQmFzZSkuY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvciB8fFxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcik7XG5cbiAgICAgICAgaWYgKCFyZXF1ZXN0SG9va0Vycm9ycy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdW5pcVJlcXVlc3RIb29rRXJyb3JzID0gY2hhaW4ocmVxdWVzdEhvb2tFcnJvcnMpXG4gICAgICAgICAgICAudW5pcUJ5KGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGUgYXMgdW5rbm93biBhcyBSZXF1ZXN0SG9va0Jhc2VFcnJvcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuaG9va0NsYXNzTmFtZSArIGVyci5tZXRob2ROYW1lO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0QnkoWydob29rQ2xhc3NOYW1lJywgJ21ldGhvZE5hbWUnXSlcbiAgICAgICAgICAgIC52YWx1ZSgpO1xuXG4gICAgICAgIHRoaXMuZXJycyA9IHRoaXMuZXJycy5jb25jYXQodW5pcVJlcXVlc3RIb29rRXJyb3JzKTtcbiAgICB9XG5cbiAgICAvLyBUYXNrIHF1ZXVlXG4gICAgcHJpdmF0ZSBfZW5xdWV1ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlUGVuZGluZ1JlcXVlc3QoY29tbWFuZCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQtLTtcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlLnB1c2goeyBjb21tYW5kLCByZXNvbHZlLCByZWplY3QsIGNhbGxzaXRlIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCwgdGhpcy5kcml2ZXJUYXNrUXVldWUubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkcml2ZXJUYXNrUXVldWVMZW5ndGggKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQgPyBwcm9taXNpZnlFdmVudCh0aGlzIGFzIHVua25vd24gYXMgRXZlbnRFbWl0dGVyLCBBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5UKSA6IFByb21pc2UucmVzb2x2ZSh0aGlzLmRyaXZlclRhc2tRdWV1ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcblxuICAgICAgICBjb25zdCBjb25zb2xlTWVzc2FnZUNvcHkgPSB0aGlzLmNvbnNvbGVNZXNzYWdlcy5nZXRDb3B5KCk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gY29uc29sZU1lc3NhZ2VDb3B5W1N0cmluZyh0aGlzLmFjdGl2ZVdpbmRvd0lkKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlR2V0Q29va2llcyAoY29tbWFuZDogR2V0Q29va2llc0NvbW1hbmQpOiBQcm9taXNlPFBhcnRpYWw8Q29va2llT3B0aW9ucz5bXT4ge1xuICAgICAgICBjb25zdCB7IGNvb2tpZXMsIHVybHMgfSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvb2tpZVByb3ZpZGVyLmdldENvb2tpZXMoY29va2llcywgdXJscyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlU2V0Q29va2llcyAoY29tbWFuZDogU2V0Q29va2llc0NvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29va2llcyA9IGNvbW1hbmQuY29va2llcztcbiAgICAgICAgY29uc3QgdXJsICAgICA9IGNvbW1hbmQudXJsIHx8IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb29raWVQcm92aWRlci5zZXRDb29raWVzKGNvb2tpZXMsIHVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlRGVsZXRlQ29va2llcyAoY29tbWFuZDogRGVsZXRlQ29va2llc0NvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBjb29raWVzLCB1cmxzIH0gPSBjb21tYW5kO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb29raWVQcm92aWRlci5kZWxldGVDb29raWVzKGNvb2tpZXMsIHVybHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCAoY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkIHwgdW5kZWZpbmVkLCBlcnJvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z0xvZ2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuc2hvd0JyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkLCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnVzZXJBZ2VudCwgY2FsbHNpdGUsIGVycm9yKTtcblxuICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5TZXRCcmVha3BvaW50Q29tbWFuZCghIWVycm9yLCAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlKSwgY2FsbHNpdGUpIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgPSB0aGlzLmRyaXZlclRhc2tRdWV1ZS5maWx0ZXIoZHJpdmVyVGFzayA9PiBpc1NlcnZpY2VDb21tYW5kKGRyaXZlclRhc2suY29tbWFuZCkpO1xuXG4gICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnJlbW92ZUFsbE5vblNlcnZpY2VNYW5pcHVsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRGVidWdTdGF0ZSAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRyaXZlclN0YXR1cy5kZWJ1ZylcbiAgICAgICAgICAgIHRoaXMuZW1pdChkcml2ZXJTdGF0dXMuZGVidWcpO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgZHJpdmVyIHRhc2tcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnREcml2ZXJUYXNrICgpOiBEcml2ZXJUYXNrIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJpdmVyVGFza1F1ZXVlWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayAocmVzdWx0PzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUuc2hpZnQoKTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWplY3RDdXJyZW50RHJpdmVyVGFzayAoZXJyOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5jYWxsc2l0ZSA9IGVyci5jYWxsc2l0ZSB8fCB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNhbGxzaXRlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudERyaXZlclRhc2sucmVqZWN0KGVycik7XG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcygpO1xuICAgIH1cblxuICAgIC8vIFBlbmRpbmcgcmVxdWVzdFxuICAgIHByaXZhdGUgX2NsZWFyUGVuZGluZ1JlcXVlc3QgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ1JlcXVlc3QucmVzcG9uc2VUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBlbmRpbmdSZXF1ZXN0IChjb21tYW5kOiBDb21tYW5kQmFzZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgPSBjb21tYW5kO1xuXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0KVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdC5yZXNvbHZlKGNvbW1hbmQpO1xuXG4gICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZ1JlcXVlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZHJpdmVyIHJlcXVlc3RcbiAgICBwcml2YXRlIF9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21tYW5kID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kO1xuXG4gICAgICAgIGNvbnN0IGlzRXhlY3V0aW5nT2JzZXJ2YXRpb25Db21tYW5kID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBvYnNlcnZhdGlvbkNvbW1hbmRzLkV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2YgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZDtcblxuICAgICAgICBjb25zdCBpc0RlYnVnQWN0aXZlID0gY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBzZXJ2aWNlQ29tbWFuZHMuU2V0QnJlYWtwb2ludENvbW1hbmQ7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUN1cnJlbnRDb21tYW5kID1cbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy5pc0ZpcnN0UmVxdWVzdEFmdGVyV2luZG93U3dpdGNoaW5nICYmIChpc0V4ZWN1dGluZ09ic2VydmF0aW9uQ29tbWFuZCB8fCBpc0RlYnVnQWN0aXZlKTtcblxuICAgICAgICByZXR1cm4gIXNob3VsZEV4ZWN1dGVDdXJyZW50Q29tbWFuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9mdWxmaWxsQ3VycmVudERyaXZlclRhc2sgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoZHJpdmVyU3RhdHVzLndhcm5pbmdzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRyaXZlclN0YXR1cy53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBEcml2ZXJXYXJuaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgV0FSTklOR19NRVNTQUdFW3dhcm5pbmcudHlwZV0sIHRoaXMuY3VycmVudERyaXZlclRhc2suY2FsbHNpdGUsIC4uLndhcm5pbmcuYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpXG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKSlcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVQYWdlRXJyb3JTdGF0dXMgKHBhZ2VFcnJvcjogRXJyb3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyaXZlclRhc2sgJiYgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yKHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKHBhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvciB8fCBwYWdlRXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZURyaXZlclJlcXVlc3QgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaXNUZXN0RG9uZSAgICAgICAgICAgICAgICAgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrICYmIHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZC50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfVFlQRS50ZXN0RG9uZTtcbiAgICAgICAgY29uc3QgcGFnZUVycm9yICAgICAgICAgICAgICAgICAgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgfHwgZHJpdmVyU3RhdHVzLnBhZ2VFcnJvcjtcbiAgICAgICAgY29uc3QgY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgPSBwYWdlRXJyb3IgJiYgdGhpcy5faGFuZGxlUGFnZUVycm9yU3RhdHVzKHBhZ2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMuY29uY2F0KGRyaXZlclN0YXR1cy5jb25zb2xlTWVzc2FnZXMpO1xuXG4gICAgICAgIHRoaXMuX2hhbmRsZURlYnVnU3RhdGUoZHJpdmVyU3RhdHVzKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUYXNrUmVqZWN0ZWRCeUVycm9yICYmIGRyaXZlclN0YXR1cy5pc0NvbW1hbmRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChpc1Rlc3REb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChkcml2ZXJTdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCAoKTogUHJvbWlzZTxDb21tYW5kQmFzZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUubmF2aWdhdGVUbyAmJiAoY29tbWFuZCBhcyBhbnkpLnN0YXRlU25hcHNob3QpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChKU09OLnBhcnNlKChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdCkpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgY29tbWFuZFxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHRWYXJpYWJsZU5hbWUgPSBjb21tYW5kLnJlc3VsdFZhcmlhYmxlTmFtZTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gICAgICAgICAgID0gY29tbWFuZC5leHByZXNzaW9uO1xuXG4gICAgICAgIGlmIChyZXN1bHRWYXJpYWJsZU5hbWUpXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYCR7cmVzdWx0VmFyaWFibGVOYW1lfSA9ICR7ZXhwcmVzc2lvbn0sICR7cmVzdWx0VmFyaWFibGVOYW1lfWA7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2UuZXhlY3V0ZUpzRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICB7IHNraXBWaXNpYmlsaXR5Q2hlY2s6IGZhbHNlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGVjdXRlSnNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHRoaXMsIHsgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIChjb21tYW5kOiBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCwgY2FsbHNpdGU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzLmNsZWFyKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGNvbW1hbmQuZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6ICB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNhbGxzaXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQuZXhwcmVzc2lvbiwgdGhpcywgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0UmVFeGVjdXRhYmxlUHJvbWlzZUV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlclNlcnZpY2UpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgY29tbWFuZC5hY3R1YWwgPSBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlclNlcnZpY2U/LmdldEFzc2VydGlvbkFjdHVhbFZhbHVlKHtcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHNlbGYuaWQsXG4gICAgICAgICAgICAgICAgY29tbWFuZElkOiBjb21tYW5kLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0QXNzZXJ0aW9uRm5FeGVjdXRpb25Ub0NvbXBpbGVyU2VydmljZSAoZXhlY3V0b3I6IEFzc2VydGlvbkV4ZWN1dG9yKTogdm9pZCB7XG4gICAgICAgIGV4ZWN1dG9yLmZuID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5leGVjdXRlQXNzZXJ0aW9uRm4oe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGV4ZWN1dG9yLmNvbW1hbmQuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlQXNzZXJ0aW9uIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQuYWN0dWFsID09PSBTeW1ib2wuZm9yKFJFX0VYRUNVVEFCTEVfUFJPTUlTRV9NQVJLRVJfREVTQ1JJUFRJT04pKVxuICAgICAgICAgICAgdGhpcy5fcmVkaXJlY3RSZUV4ZWN1dGFibGVQcm9taXNlRXhlY3V0aW9uVG9Db21waWxlclNlcnZpY2UoY29tbWFuZCk7XG5cbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uVGltZW91dCA9IGdldEFzc2VydGlvblRpbWVvdXQoY29tbWFuZCwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgICAgICAgICA9IG5ldyBBc3NlcnRpb25FeGVjdXRvcihjb21tYW5kLCBhc3NlcnRpb25UaW1lb3V0LCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgZXhlY3V0b3Iub25jZSgnc3RhcnQtYXNzZXJ0aW9uLXJldHJpZXMnLCAodGltZW91dDogbnVtYmVyKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuU2hvd0Fzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHRpbWVvdXQpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ2VuZC1hc3NlcnRpb24tcmV0cmllcycsIChzdWNjZXNzOiBib29sZWFuKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuSGlkZUFzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHN1Y2Nlc3MpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ25vbi1zZXJpYWxpemFibGUtYWN0dWFsLXZhbHVlJywgdGhpcy5fcmVkaXJlY3RBc3NlcnRpb25GbkV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBleGVjdXRlRm4gPSB0aGlzLmRlY29yYXRlUHJldmVudEVtaXRBY3Rpb25FdmVudHMoKCkgPT4gZXhlY3V0b3IucnVuKCksIHsgcHJldmVudDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUZuKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRqdXN0Q29uZmlndXJhdGlvbldpdGhDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudGVzdERvbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuaGlkZUJyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldE5hdGl2ZURpYWxvZ0hhbmRsZXIpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgPSAoY29tbWFuZCBhcyBhbnkpLmRpYWxvZ0hhbmRsZXI7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9JZnJhbWUpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb01haW5XaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gbnVsbDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRUZXN0U3BlZWQpXG4gICAgICAgICAgICB0aGlzLnNwZWVkID0gKGNvbW1hbmQgYXMgYW55KS5zcGVlZDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IChjb21tYW5kIGFzIGFueSkuZHVyYXRpb247XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGlzYWJsZURlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyLmhpZGVCcmVha3BvaW50KHRoaXMuc2Vzc2lvbi5pZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWdnaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2FkanVzdFNjcmVlbnNob3RDb21tYW5kIChjb21tYW5kOiBUYWtlU2NyZWVuc2hvdEJhc2VDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJJZCAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkO1xuICAgICAgICBjb25zdCB7IGhhc0Nocm9tZWxlc3NTY3JlZW5zaG90cyB9ID0gYXdhaXQgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcm92aWRlci5oYXNDdXN0b21BY3Rpb25Gb3JCcm93c2VyKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgaWYgKCFoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHMpXG4gICAgICAgICAgICBjb21tYW5kLmdlbmVyYXRlU2NyZWVuc2hvdE1hcmsoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2FkanVzdENvbW1hbmRPcHRpb25zQW5kRW52aXJvbm1lbnQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKChjb21tYW5kIGFzIGFueSkub3B0aW9ucz8uY29uZmlkZW50aWFsICE9PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnR5cGVUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKChjb21tYW5kIGFzIGFueSkuc2VsZWN0b3IsIGNhbGxzaXRlKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUucHJlc3NLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5HZXRBY3RpdmVFbGVtZW50Q29tbWFuZCgpKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSAmJiAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlICYmICF0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlByZXBhcmVDbGllbnRFbnZpcm9ubWVudEluRGVidWdNb2RlKGNvbW1hbmQuZXNtUnVudGltZSkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3NldEJyZWFrcG9pbnRJZk5lY2Vzc2FyeSAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzICYmIHRoaXMuZGVidWdnaW5nICYmIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQoY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UgfCBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU/OiBzdHJpbmcgfCBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZCBpbnN0YW5jZW9mIEFjdGlvbkNvbW1hbmRCYXNlXG4gICAgICAgICAgICA/IHRoaXMuX2V4ZWN1dGVBY3Rpb25Db21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKVxuICAgICAgICAgICAgOiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2V4ZWN1dGVBY3Rpb25Db21tYW5kIChjb21tYW5kOiBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSB7IGFwaUFjdGlvbk5hbWU6IGNvbW1hbmQubWV0aG9kTmFtZSwgY29tbWFuZCB9O1xuXG4gICAgICAgIGxldCBlcnJvckFkYXB0ZXIgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgICAgICAgID0gbnVsbDtcbiAgICAgICAgbGV0IHJlc3VsdCAgICAgICA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudChjb21tYW5kLCBjYWxsc2l0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRBY3Rpb25FdmVudCgnYWN0aW9uLXN0YXJ0JywgYWN0aW9uQXJncyk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFlcnJvcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5waGFzZSA9PT0gVGVzdFJ1blBoYXNlLnBlbmRpbmdGaW5hbGl6YXRpb24gJiYgZXJyIGluc3RhbmNlb2YgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpXG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UudW5hd2FpdGVkTWV0aG9kV2l0aEFzc2VydGlvbiwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgY2FsbHNpdGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJveHlsZXNzSlNFcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSB0aGlzLnByb3h5bGVzc0pTRXJyb3I7XG5cbiAgICAgICAgICAgIHRoaXMucHJveHlsZXNzSlNFcnJvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBjaGVjayBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCBpcyBzcGVjaWZpYyBmb3IgdGhlIGB1c2VSb2xlYCBhY3Rpb25cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIGlzIFRlc3RDYWZlRXJyb3JMaXN0IHdlIGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSBhbiBhZGFwdGVyLFxuICAgICAgICAgICAgLy8gc2luY2UgZXJyb3IgaXMgYWxyZWFkeSB3YXMgcHJvY2Vzc2VkIGluIHJvbGUgaW5pdGlhbGl6ZXJcbiAgICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVGVzdENhZmVFcnJvckxpc3QpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoY29tbWFuZC5hY3Rpb25JZCk7XG5cbiAgICAgICAgICAgICAgICBlcnJvckFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocHJvY2Vzc1Rlc3RGbkVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gZXJyb3IuYWRhcHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWN0aW9uQXJncywge1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlcnI6IGVycm9yQWRhcHRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0QWN0aW9uRXZlbnQoJ2FjdGlvbi1kb25lJywgYWN0aW9uQXJncyk7XG5cbiAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZT86IENhbGxzaXRlUmVjb3JkIHwgc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuY29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUGFnZUVycm9yICYmIGlzQ29tbWFuZFJlamVjdGFibGVCeVBhZ2VFcnJvcihjb21tYW5kKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWplY3RDb21tYW5kV2l0aFBhZ2VFcnJvcihjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGlzRXhlY3V0YWJsZU9uQ2xpZW50Q29tbWFuZChjb21tYW5kKSlcbiAgICAgICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCsrO1xuXG4gICAgICAgIHRoaXMuX2FkanVzdENvbmZpZ3VyYXRpb25XaXRoQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcmVha3BvaW50SWZOZWNlc3NhcnkoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc1NjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90cykge1xuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnNjcmVlbnNob3RzRGlzYWJsZWQsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FkanVzdFNjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQgYXMgVGFrZVNjcmVlbnNob3RCYXNlQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgICAgaWYgKGlzUmVzaXplV2luZG93Q29tbWFuZChjb21tYW5kKSAmJiB0aGlzLm9wdHMudmlkZW9QYXRoKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnZpZGVvQnJvd3NlclJlc2l6aW5nLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9LCB0aGlzLnRlc3QubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUud2FpdClcbiAgICAgICAgICAgIHJldHVybiBkZWxheSgoY29tbWFuZCBhcyBhbnkpLnRpbWVvdXQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IEluIHJlZ3VsYXIgbW9kZSwgaXQncyBwb3NzaWJsZSB0byBkZWJ1ZyB0ZXN0cyBvbmx5IHVzaW5nIFRlc3RDYWZlIFVJICgnUmVzdW1lJyBhbmQgJ05leHQgc3RlcCcgYnV0dG9ucykuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIHdhcm4gb24gdHJ5aW5nIHRvIGRlYnVnIGluIGhlYWRsZXNzIG1vZGUuXG4gICAgICAgICAgICAvLyBJbiBjb21waWxlciBzZXJ2aWNlIG1vZGUsIHdlIGNhbiBkZWJ1ZyBldmVuIGluIGhlYWRsZXNzIG1vZGUgdXNpbmcgYW55IGRlYnVnZ2luZyB0b29scy4gU28sIGluIHRoaXMgY2FzZSwgdGhlIHdhcm5pbmcgaXMgZXhjZXNzaXZlLlxuICAgICAgICAgICAgY29uc3QgY2FuRGVidWcgPSAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlIHx8ICF0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlzSGVhZGxlc3NCcm93c2VyKCk7XG5cbiAgICAgICAgICAgIGlmIChjYW5EZWJ1ZylcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kKGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkLCB2b2lkIDApO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5kZWJ1Z0luSGVhZGxlc3NFcnJvciwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnVzZVJvbGUpIHtcbiAgICAgICAgICAgIGxldCBmbiA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuX3VzZVJvbGUoKGNvbW1hbmQgYXMgYW55KS5yb2xlLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgICAgIGZuID0gdGhpcy5kZWNvcmF0ZVByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKGZuLCB7IHByZXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVEaXNhYmxlRGVidWdCcmVha3BvaW50cyhmbiwgeyBkaXNhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5ydW5DdXN0b21BY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm4sIGFyZ3MgfSA9IGNvbW1hbmQgYXMgUnVuQ3VzdG9tQWN0aW9uQ29tbWFuZDtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRGbiAgICA9IHdyYXBDdXN0b21BY3Rpb24oZm4pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgd3JhcHBlZEZuKHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmFzc2VydGlvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leGVjdXRlQXNzZXJ0aW9uKGNvbW1hbmQgYXMgQXNzZXJ0aW9uQ29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5leGVjdXRlRXhwcmVzc2lvbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlSnNFeHByZXNzaW9uKGNvbW1hbmQgYXMgRXhlY3V0ZUV4cHJlc3Npb25Db21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZXhlY3V0ZUFzeW5jRXhwcmVzc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oY29tbWFuZCBhcyBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCwgY2FsbHNpdGUgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2tpcEpzRXJyb3JzICYmIHRoaXMub3B0cy5leHBlcmltZW50YWxQcm94eWxlc3MpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJveHlsZXNzLmpzRXJyb3JIYW5kbGluZ0FwaS5zZXRFcnJvckhhbmRsZXIoY29tbWFuZCBhcyBTa2lwSnNFcnJvcnNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZ2V0TmF0aXZlRGlhbG9nSGlzdG9yeSAmJiB0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3h5bGVzcy5uYXRpdmVEaWFsb2dzQXBpLmdldE5hdGl2ZURpYWxvZ0hpc3RvcnkoKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0TmF0aXZlRGlhbG9nSGFuZGxlciAmJiB0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJveHlsZXNzLm5hdGl2ZURpYWxvZ3NBcGkuZml4TWlzc2luZ0JlZm9yZVVubG9hZEhhbmRsaW5nKCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldEJyb3dzZXJDb25zb2xlTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZXhwZXJpbWVudGFsUHJveHlsZXNzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm94eWxlc3MuY29uc29sZU1lc3NhZ2VzQXBpLmdldEJyb3dzZXJDb25zb2xlTWVzc2FnZXMoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VucXVldWVCcm93c2VyQ29uc29sZU1lc3NhZ2VzQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9QcmV2aW91c1dpbmRvdylcbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkud2luZG93SWQgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByZXZpb3VzQWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZShjb21tYW5kIGFzIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZ2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlR2V0Q29va2llcyhjb21tYW5kIGFzIEdldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlU2V0Q29va2llcyhjb21tYW5kIGFzIFNldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVsZXRlQ29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlRGVsZXRlQ29va2llcyhjb21tYW5kIGFzIERlbGV0ZUNvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuYWRkUmVxdWVzdEhvb2tzKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKChjb21tYW5kIGFzIEFkZFJlcXVlc3RIb29rc0NvbW1hbmQpLmhvb2tzLm1hcChob29rID0+IHRoaXMuX2FkZFJlcXVlc3RIb29rKGhvb2spKSk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnJlbW92ZVJlcXVlc3RIb29rcylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCgoY29tbWFuZCBhcyBSZW1vdmVSZXF1ZXN0SG9va3NDb21tYW5kKS5ob29rcy5tYXAoaG9vayA9PiB0aGlzLl9yZW1vdmVSZXF1ZXN0SG9vayhob29rKSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVqZWN0Q29tbWFuZFdpdGhQYWdlRXJyb3IgKGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPEVycm9yPiB7XG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvcjtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVyci5jYWxsc2l0ZSAgICAgICAgICA9IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NlbmRDbG9zZUNoaWxkV2luZG93T25GaWxlRG93bmxvYWRpbmdDb21tYW5kICgpOiBDb21tYW5kQmFzZSB7XG4gICAgICAgIHJldHVybiBuZXcgYWN0aW9uQ29tbWFuZHMuQ2xvc2VDaGlsZFdpbmRvd09uRmlsZURvd25sb2FkaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9tYWtlU2NyZWVuc2hvdE9uRmFpbCAoZmFpbGVkQWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBzY3JlZW5zaG90cyB9ID0gdGhpcy5vcHRzO1xuXG4gICAgICAgIGlmICghdGhpcy5lcnJTY3JlZW5zaG90UGF0aCAmJiAoc2NyZWVuc2hvdHMgYXMgU2NyZWVuc2hvdE9wdGlvblZhbHVlKT8udGFrZU9uRmFpbHMpXG4gICAgICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgYnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmRzLlRha2VTY3JlZW5zaG90T25GYWlsQ29tbWFuZCh7IGZhaWxlZEFjdGlvbklkIH0pKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGVjb3JhdGVXaXRoRmxhZyAoZm46IEZ1bmN0aW9uLCBmbGFnTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpc1tmbGFnTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzW2ZsYWdOYW1lXSA9ICF2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyAoZm46IEZ1bmN0aW9uLCB7IHByZXZlbnQgfTogeyBwcmV2ZW50OiBib29sZWFuIH0pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29yYXRlV2l0aEZsYWcoZm4sICdwcmV2ZW50RW1pdEFjdGlvbkV2ZW50cycsIHByZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvcmF0ZURpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzIChmbjogRnVuY3Rpb24sIHsgZGlzYWJsZSB9OiB7IGRpc2FibGU6IGJvb2xlYW4gfSk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb3JhdGVXaXRoRmxhZyhmbiwgJ2Rpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzJywgZGlzYWJsZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYW5hZ2VtZW50XG4gICAgcHVibGljIGFzeW5jIGdldFN0YXRlU25hcHNob3QgKCk6IFByb21pc2U8U3RhdGVTbmFwc2hvdD4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuX3JvbGVQcm92aWRlci5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgc3RhdGUuc3RvcmFnZXMgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuQmFja3VwU3RvcmFnZXNDb21tYW5kKCkpIGFzIFN0b3JhZ2VzU25hcHNob3Q7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NsZWFuVXBDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5zZXRDdHgoe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnNldEZpeHR1cmVDdHgoe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3R4ICAgICAgICA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVDdHggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy50ZXN0UnVuQ3R4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzd2l0Y2hUb0NsZWFuUnVuICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9jbGVhblVwQ3R4cygpO1xuXG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gbmV3IEJyb3dzZXJDb25zb2xlTWVzc2FnZXMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChTdGF0ZVNuYXBzaG90LmVtcHR5KCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnNwZWVkICE9PSB0aGlzLm9wdHMuc3BlZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldFNwZWVkQ29tbWFuZCA9IG5ldyBhY3Rpb25Db21tYW5kcy5TZXRUZXN0U3BlZWRDb21tYW5kKHsgc3BlZWQ6IHRoaXMub3B0cy5zcGVlZCB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChzZXRTcGVlZENvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZUxvYWRUaW1lb3V0ICE9PSB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCBzZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQoeyBkdXJhdGlvbjogdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChzZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUb1VybCh1cmwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZURpYWxvZ0hhbmRsZXJDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldE5hdGl2ZURpYWxvZ0hhbmRsZXJDb21tYW5kKHsgZGlhbG9nSGFuZGxlcjogeyBmbjogbnVsbCB9IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHJlbW92ZURpYWxvZ0hhbmRsZXJDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBuYXZpZ2F0ZVRvVXJsICh1cmw6IHN0cmluZywgZm9yY2VSZWxvYWQ6IGJvb2xlYW4sIHN0YXRlU25hcHNob3Q/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGVDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLk5hdmlnYXRlVG9Db21tYW5kKHsgdXJsLCBmb3JjZVJlbG9hZCwgc3RhdGVTbmFwc2hvdCB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5hdmlnYXRlQ29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0U3RhdGVTbmFwc2hvdEZyb21Sb2xlIChyb2xlOiBSb2xlKTogUHJvbWlzZTxTdGF0ZVNuYXBzaG90PiB7XG4gICAgICAgIGNvbnN0IHByZXZQaGFzZSA9IHRoaXMucGhhc2U7XG5cbiAgICAgICAgaWYgKHJvbGUucGhhc2UgPT09IFJPTEVfUEhBU0UuaW5pdGlhbGl6ZWQgJiYgcm9sZS5pbml0RXJyIGluc3RhbmNlb2YgVGVzdENhZmVFcnJvckxpc3QgJiYgcm9sZS5pbml0RXJyLmhhc0Vycm9ycylcbiAgICAgICAgICAgIHJvbGUuaW5pdEVyci5hZGFwdGVyID0gdGhpcy5fY3JlYXRlRXJyb3JBZGFwdGVyKHJvbGUuaW5pdEVyci5pdGVtc1swXSk7XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5pblJvbGVJbml0aWFsaXplcjtcblxuICAgICAgICBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS51bmluaXRpYWxpemVkKVxuICAgICAgICAgICAgYXdhaXQgcm9sZS5pbml0aWFsaXplKHRoaXMpO1xuXG4gICAgICAgIGVsc2UgaWYgKHJvbGUucGhhc2UgPT09IFJPTEVfUEhBU0UucGVuZGluZ0luaXRpYWxpemF0aW9uKVxuICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQocm9sZSwgJ2luaXRpYWxpemVkJyk7XG5cbiAgICAgICAgaWYgKHJvbGUuaW5pdEVycilcbiAgICAgICAgICAgIHRocm93IHJvbGUuaW5pdEVycjtcblxuICAgICAgICB0aGlzLnBoYXNlID0gcHJldlBoYXNlO1xuXG4gICAgICAgIHJldHVybiByb2xlLnN0YXRlU25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdXNlUm9sZSAocm9sZTogUm9sZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnBoYXNlID09PSBUZXN0UnVuUGhhc2UuaW5Sb2xlSW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUm9sZVN3aXRjaEluUm9sZUluaXRpYWxpemVyRXJyb3IoY2FsbHNpdGUpO1xuXG4gICAgICAgIGNvbnN0IGJvb2ttYXJrID0gbmV3IFRlc3RSdW5Cb29rbWFyayh0aGlzLCByb2xlKTtcblxuICAgICAgICBhd2FpdCBib29rbWFyay5pbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJvbGVJZClcbiAgICAgICAgICAgIHRoaXMudXNlZFJvbGVTdGF0ZXNbdGhpcy5jdXJyZW50Um9sZUlkXSA9IGF3YWl0IHRoaXMuZ2V0U3RhdGVTbmFwc2hvdCgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlU25hcHNob3QgPSB0aGlzLnVzZWRSb2xlU3RhdGVzW3JvbGUuaWRdIHx8IGF3YWl0IHRoaXMuX2dldFN0YXRlU25hcHNob3RGcm9tUm9sZShyb2xlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9yb2xlUHJvdmlkZXIudXNlU3RhdGVTbmFwc2hvdChzdGF0ZVNuYXBzaG90KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRSb2xlSWQgPSByb2xlLmlkO1xuXG4gICAgICAgIGF3YWl0IGJvb2ttYXJrLnJlc3RvcmUoY2FsbHNpdGUsIHN0YXRlU25hcHNob3QpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50VXJsICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgfSwgeyBib3VuZFRlc3RSdW46IHRoaXMgfSk7XG5cbiAgICAgICAgY29uc3QgZ2V0TG9jYXRpb24gPSBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExvY2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZSAoY29tbWFuZDogU3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZUNvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFdpbmRvd3MgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBHZXRDdXJyZW50V2luZG93c0NvbW1hbmQoe30sIHRoaXMpIGFzIENvbW1hbmRCYXNlKSBhcyBPcGVuZWRXaW5kb3dJbmZvcm1hdGlvbltdO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd3MgPSBhd2FpdCBhc3luY0ZpbHRlcjxPcGVuZWRXaW5kb3dJbmZvcm1hdGlvbj4oY3VycmVudFdpbmRvd3MsIGFzeW5jIHduZCA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHVybDogICBuZXcgVVJMKHduZC51cmwpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogd25kLnRpdGxlLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXJTZXJ2aWNlUHJlZGljYXRlRGF0YSA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZElkOiBjb21tYW5kLmlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2UuY2hlY2tXaW5kb3coY29tcGlsZXJTZXJ2aWNlUHJlZGljYXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQuY2hlY2tXaW5kb3cocHJlZGljYXRlRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvd3MubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLm11bHRpcGxlV2luZG93c0ZvdW5kQnlQcmVkaWNhdGUsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IFN3aXRjaFRvV2luZG93Q29tbWFuZCh7IHdpbmRvd0lkOiB3aW5kb3dzWzBdLmlkIH0sIHRoaXMpIGFzIENvbW1hbmRCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNjb25uZWN0IChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKGVycik7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0ZWQnLCBlcnIpO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QgKCk6IENvbW1hbmRCYXNlIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QWN0aW9uRXZlbnQgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpcGxlV2luZG93c0FsbG93ZWQgKHRlc3RSdW46IFRlc3RSdW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0ZXN0IH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIHJldHVybiAhZGlzYWJsZU11bHRpcGxlV2luZG93cyAmJiAhKHRlc3QgYXMgTGVnYWN5VGVzdFJ1bikuaXNMZWdhY3kgJiYgISF0ZXN0UnVuLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0aWFsaXplICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY29va2llUHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLl9pbml0UmVxdWVzdEhvb2tzKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVyU2VydmljZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5pbml0aWFsaXplVGVzdFJ1bkRhdGEoe1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgdGhpcy50ZXN0LmlkLFxuICAgICAgICAgICAgYnJvd3NlcjogICAgICAgIHRoaXMuYnJvd3NlcixcbiAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiB0aGlzLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgbWVzc2FnZUJ1czogICAgIHRoaXMuX21lc3NhZ2VCdXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aXZlV2luZG93SWQgKCk6IG51bGwgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5hY3RpdmVXaW5kb3dJZDtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIHRpbWUtY3JpdGljYWwgYW5kIG11c3QgcmV0dXJuIEFTQVAgdG8gYXZvaWQgY2xpZW50IGRpc2Nvbm5lY3Rpb25cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMucmVhZHldIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKG1zZy5zdGF0dXMuaXNPYnNlcnZpbmdGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QoKTtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy50ZXN0UnVuUmVxdWVzdEluRGlzY29ubmVjdGVkQnJvd3NlciwgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VySW5mby5hbGlhcykpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nUmVxdWVzdCgpO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBkcml2ZXIgc2VuZHMgdGhlIHN0YXR1cyBmb3IgdGhlIHNlY29uZCB0aW1lIGlmIGl0IGRpZG4ndCBnZXQgYSByZXNwb25zZSBhdCB0aGVcbiAgICAgICAgLy8gZmlyc3QgdHJ5LiBUaGlzIGlzIHBvc3NpYmxlIHdoZW4gdGhlIHBhZ2Ugd2FzIHVubG9hZGVkIGFmdGVyIHRoZSBkcml2ZXIgc2VudCB0aGUgc3RhdHVzLlxuICAgICAgICBpZiAobXNnLnN0YXR1cy5pZCA9PT0gdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U7XG5cbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQgICAgICAgPSBtc2cuc3RhdHVzLmlkO1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuX2hhbmRsZURyaXZlclJlcXVlc3QobXNnLnN0YXR1cyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlIHx8IG1zZy5zdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlO1xuXG4gICAgICAgIC8vIE5PVEU6IHdlIHNlbmQgYW4gZW1wdHkgcmVzcG9uc2UgYWZ0ZXIgdGhlIE1BWF9SRVNQT05TRV9ERUxBWSB0aW1lb3V0IGlzIGV4Y2VlZGVkIHRvIGtlZXAgY29ubmVjdGlvblxuICAgICAgICAvLyB3aXRoIHRoZSBjbGllbnQgYW5kIHByZXZlbnQgdGhlIHJlc3BvbnNlIHRpbWVvdXQgZXhjZXB0aW9uIG9uIHRoZSBjbGllbnQgc2lkZVxuICAgICAgICBjb25zdCByZXNwb25zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChudWxsKSwgTUFYX1JFU1BPTlNFX0RFTEFZKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHsgcmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZVRpbWVvdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLnJlYWR5Rm9yQnJvd3Nlck1hbmlwdWxhdGlvbl0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8QnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdD4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IGVycm9yICA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLmV4ZWN1dGVQZW5kaW5nTWFuaXB1bGF0aW9uKG1zZywgdGhpcy5fbWVzc2FnZUJ1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgICAgZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YWNrOiAgICAgICAgICAgZXJyLnN0YWNrLFxuICAgICAgICAgICAgICAgICAgICBpc0ludGVybmFsRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlc3VsdCwgZXJyb3IgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMud2FpdEZvckZpbGVEb3dubG9hZF0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==