aws-cdk 2.1002.0 → 2.1004.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/THIRD_PARTY_LICENSES +2 -9
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/api/aws-auth/account-cache.js +3 -3
  5. package/lib/api/aws-auth/credential-plugins.js +4 -4
  6. package/lib/api/aws-auth/sdk-logger.d.ts +3 -3
  7. package/lib/api/aws-auth/sdk-logger.js +7 -12
  8. package/lib/api/aws-auth/sdk-provider.js +3 -3
  9. package/lib/api/aws-auth/sdk.js +3 -3
  10. package/lib/api/aws-auth/user-agent.js +3 -3
  11. package/lib/api/bootstrap/bootstrap-environment.d.ts +3 -3
  12. package/lib/api/bootstrap/bootstrap-environment.js +13 -14
  13. package/lib/api/bootstrap/bootstrap-template.yaml +14 -1
  14. package/lib/api/bootstrap/deploy-bootstrap.d.ts +4 -4
  15. package/lib/api/bootstrap/deploy-bootstrap.js +11 -11
  16. package/lib/api/cxapp/cloud-assembly.d.ts +1 -16
  17. package/lib/api/cxapp/cloud-assembly.js +3 -3
  18. package/lib/api/cxapp/exec.js +3 -3
  19. package/lib/api/deployments/asset-publishing.d.ts +5 -5
  20. package/lib/api/deployments/asset-publishing.js +7 -8
  21. package/lib/api/deployments/assets.d.ts +2 -2
  22. package/lib/api/deployments/assets.js +9 -9
  23. package/lib/api/deployments/checks.d.ts +2 -2
  24. package/lib/api/deployments/checks.js +4 -4
  25. package/lib/api/deployments/cloudformation.d.ts +7 -7
  26. package/lib/api/deployments/cloudformation.js +30 -31
  27. package/lib/api/deployments/deploy-stack.d.ts +3 -5
  28. package/lib/api/deployments/deploy-stack.js +55 -58
  29. package/lib/api/deployments/deployments.d.ts +9 -8
  30. package/lib/api/deployments/deployments.js +27 -31
  31. package/lib/api/deployments/hotswap-deployments.d.ts +2 -2
  32. package/lib/api/deployments/hotswap-deployments.js +14 -14
  33. package/lib/api/deployments/nested-stack-helpers.js +3 -3
  34. package/lib/api/environment/environment-access.d.ts +3 -4
  35. package/lib/api/environment/environment-access.js +7 -8
  36. package/lib/api/environment/environment-resources.d.ts +5 -5
  37. package/lib/api/environment/environment-resources.js +13 -13
  38. package/lib/api/garbage-collection/garbage-collector.d.ts +3 -4
  39. package/lib/api/garbage-collection/garbage-collector.js +37 -38
  40. package/lib/api/garbage-collection/progress-printer.d.ts +3 -4
  41. package/lib/api/garbage-collection/progress-printer.js +5 -6
  42. package/lib/api/garbage-collection/stack-refresh.d.ts +3 -3
  43. package/lib/api/garbage-collection/stack-refresh.js +7 -7
  44. package/lib/api/logs/find-cloudwatch-logs.d.ts +2 -2
  45. package/lib/api/logs/find-cloudwatch-logs.js +6 -6
  46. package/lib/api/logs/logs-monitor.d.ts +27 -4
  47. package/lib/api/logs/logs-monitor.js +53 -32
  48. package/lib/api/resource-import/importer.d.ts +3 -5
  49. package/lib/api/resource-import/importer.js +12 -13
  50. package/lib/api/resource-import/migrator.d.ts +3 -5
  51. package/lib/api/resource-import/migrator.js +8 -10
  52. package/lib/api/settings.js +2 -2
  53. package/lib/api/stack-events/stack-activity-monitor.d.ts +5 -63
  54. package/lib/api/stack-events/stack-activity-monitor.js +7 -8
  55. package/lib/api/stack-events/stack-event-poller.js +3 -3
  56. package/lib/api/stack-events/stack-progress-monitor.d.ts +1 -14
  57. package/lib/api/stack-events/stack-progress-monitor.js +4 -4
  58. package/lib/api/toolkit-info.d.ts +2 -2
  59. package/lib/api/toolkit-info.js +5 -5
  60. package/lib/api/util/placeholders.d.ts +1 -1
  61. package/lib/api/util/placeholders.js +1 -1
  62. package/lib/api/util/template-body-parameter.js +4 -5
  63. package/lib/api/work-graph/work-graph-builder.d.ts +3 -4
  64. package/lib/api/work-graph/work-graph-builder.js +10 -11
  65. package/lib/api/work-graph/work-graph.d.ts +3 -8
  66. package/lib/api/work-graph/work-graph.js +8 -9
  67. package/lib/cli/activity-printer/base.d.ts +3 -4
  68. package/lib/cli/activity-printer/base.js +6 -5
  69. package/lib/cli/activity-printer/current.js +1 -1
  70. package/lib/cli/activity-printer/history.d.ts +1 -1
  71. package/lib/cli/activity-printer/history.js +1 -1
  72. package/lib/cli/cdk-toolkit.d.ts +0 -6
  73. package/lib/cli/cdk-toolkit.js +30 -40
  74. package/lib/cli/cli.d.ts +0 -1
  75. package/lib/cli/cli.js +6 -8
  76. package/lib/cli/messages.d.ts +11 -9
  77. package/lib/cli/messages.js +7 -14
  78. package/lib/cli/root-dir.d.ts +10 -0
  79. package/lib/cli/root-dir.js +23 -0
  80. package/lib/cli/version.js +6 -5
  81. package/lib/commands/migrate.js +3 -3
  82. package/lib/context-providers/cc-api-provider.js +5 -5
  83. package/lib/context-providers/index.js +3 -3
  84. package/lib/index.js +6962 -6363
  85. package/lib/init-hooks.js +3 -3
  86. package/lib/init-templates/.init-version.json +1 -1
  87. package/lib/init.js +8 -9
  88. package/lib/legacy-exports-source.d.ts +2 -5
  89. package/lib/legacy-exports-source.js +7 -10
  90. package/lib/list-stacks.d.ts +1 -2
  91. package/lib/list-stacks.js +1 -2
  92. package/lib/logging.d.ts +3 -1
  93. package/lib/logging.js +2 -1
  94. package/lib/notices.js +6 -7
  95. package/lib/toolkit/cli-io-host.d.ts +37 -125
  96. package/lib/toolkit/cli-io-host.js +44 -74
  97. package/lib/util.d.ts +1 -0
  98. package/lib/util.js +18 -0
  99. package/package.json +8 -15
  100. package/lib/util/archive.d.ts +0 -1
  101. package/lib/util/archive.js +0 -86
  102. package/lib/util/arrays.d.ts +0 -14
  103. package/lib/util/arrays.js +0 -36
  104. package/lib/util/bool.d.ts +0 -7
  105. package/lib/util/bool.js +0 -13
  106. package/lib/util/bytes.d.ts +0 -8
  107. package/lib/util/bytes.js +0 -21
  108. package/lib/util/cloudformation.d.ts +0 -16
  109. package/lib/util/cloudformation.js +0 -36
  110. package/lib/util/content-hash.d.ts +0 -5
  111. package/lib/util/content-hash.js +0 -43
  112. package/lib/util/directories.d.ts +0 -23
  113. package/lib/util/directories.js +0 -58
  114. package/lib/util/format-error.d.ts +0 -9
  115. package/lib/util/format-error.js +0 -22
  116. package/lib/util/index.d.ts +0 -15
  117. package/lib/util/index.js +0 -32
  118. package/lib/util/json.d.ts +0 -48
  119. package/lib/util/json.js +0 -68
  120. package/lib/util/objects.d.ts +0 -52
  121. package/lib/util/objects.js +0 -183
  122. package/lib/util/parallel.d.ts +0 -6
  123. package/lib/util/parallel.js +0 -48
  124. package/lib/util/serialize.d.ts +0 -27
  125. package/lib/util/serialize.js +0 -86
  126. package/lib/util/string-manipulation.d.ts +0 -14
  127. package/lib/util/string-manipulation.js +0 -39
  128. package/lib/util/type-brands.d.ts +0 -39
  129. package/lib/util/type-brands.js +0 -38
  130. package/lib/util/types.d.ts +0 -27
  131. package/lib/util/types.js +0 -25
  132. package/lib/util/version-range.d.ts +0 -2
  133. package/lib/util/version-range.js +0 -36
  134. package/lib/util/yaml-cfn.d.ts +0 -15
  135. package/lib/util/yaml-cfn.js +0 -58
@@ -4,7 +4,7 @@ import { type ResourceIdentifierSummaries, ResourcesToImport, Template } from '.
4
4
  import { DeploymentMethod } from './deployment-method';
5
5
  import { DeployStackResult } from './deployment-result';
6
6
  import { type RootTemplateWithNestedStacks } from './nested-stack-helpers';
7
- import { IIoHost, ToolkitAction } from '../../toolkit/cli-io-host';
7
+ import { IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
8
8
  import type { SdkProvider } from '../aws-auth/sdk-provider';
9
9
  import { EnvironmentAccess } from '../environment';
10
10
  import { HotswapMode, HotswapPropertyOverrides } from '../hotswap/common';
@@ -205,14 +205,17 @@ interface PublishStackAssetsOptions extends AssetOptions {
205
205
  * Stack name this asset is for
206
206
  */
207
207
  readonly stackName?: string;
208
+ /**
209
+ * Always publish, even if it already exists
210
+ *
211
+ * @default false
212
+ */
213
+ readonly forcePublish?: boolean;
208
214
  }
209
215
  export interface DestroyStackOptions {
210
216
  stack: cxapi.CloudFormationStackArtifact;
211
217
  deployName?: string;
212
218
  roleArn?: string;
213
- quiet?: boolean;
214
- force?: boolean;
215
- ci?: boolean;
216
219
  }
217
220
  export interface StackExistsOptions {
218
221
  stack: cxapi.CloudFormationStackArtifact;
@@ -222,8 +225,7 @@ export interface StackExistsOptions {
222
225
  export interface DeploymentsProps {
223
226
  readonly sdkProvider: SdkProvider;
224
227
  readonly toolkitStackName?: string;
225
- readonly ioHost: IIoHost;
226
- readonly action: ToolkitAction;
228
+ readonly ioHelper: IoHelper;
227
229
  }
228
230
  /**
229
231
  * Scope for a single set of deployments from a set of Cloud Assembly Artifacts
@@ -253,8 +255,7 @@ export declare class Deployments {
253
255
  private readonly deployStackSdkProvider;
254
256
  private readonly publisherCache;
255
257
  private _allowCrossAccountAssetPublishing;
256
- private readonly ioHost;
257
- private readonly action;
258
+ private readonly ioHelper;
258
259
  constructor(props: DeploymentsProps);
259
260
  /**
260
261
  * Resolves the environment for a stack.
@@ -12,7 +12,7 @@ const deploy_stack_1 = require("./deploy-stack");
12
12
  const nested_stack_helpers_1 = require("./nested-stack-helpers");
13
13
  const messages_1 = require("../../cli/messages");
14
14
  const error_1 = require("../../toolkit/error");
15
- const format_error_1 = require("../../util/format-error");
15
+ const util_1 = require("../../util");
16
16
  const environment_1 = require("../environment");
17
17
  const stack_events_1 = require("../stack-events");
18
18
  const toolkit_info_1 = require("../toolkit-info");
@@ -30,9 +30,8 @@ class Deployments {
30
30
  this.publisherCache = new Map();
31
31
  this.assetSdkProvider = props.sdkProvider;
32
32
  this.deployStackSdkProvider = props.sdkProvider;
33
- this.ioHost = props.ioHost;
34
- this.action = props.action;
35
- this.envs = new environment_1.EnvironmentAccess(props.sdkProvider, (_a = props.toolkitStackName) !== null && _a !== void 0 ? _a : toolkit_info_1.DEFAULT_TOOLKIT_STACK_NAME, { ioHost: this.ioHost, action: this.action });
33
+ this.ioHelper = props.ioHelper;
34
+ this.envs = new environment_1.EnvironmentAccess(props.sdkProvider, (_a = props.toolkitStackName) !== null && _a !== void 0 ? _a : toolkit_info_1.DEFAULT_TOOLKIT_STACK_NAME, this.ioHelper);
36
35
  }
37
36
  /**
38
37
  * Resolves the environment for a stack.
@@ -45,13 +44,13 @@ class Deployments {
45
44
  return (0, nested_stack_helpers_1.loadCurrentTemplateWithNestedStacks)(rootStackArtifact, env.sdk, retrieveProcessedTemplate);
46
45
  }
47
46
  async readCurrentTemplate(stackArtifact) {
48
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Reading existing template for stack ${stackArtifact.displayName}.`));
47
+ await this.ioHelper.notify((0, messages_1.debug)(`Reading existing template for stack ${stackArtifact.displayName}.`));
49
48
  const env = await this.envs.accessStackForLookupBestEffort(stackArtifact);
50
49
  return (0, nested_stack_helpers_1.loadCurrentTemplate)(stackArtifact, env.sdk);
51
50
  }
52
51
  async resourceIdentifierSummaries(stackArtifact) {
53
52
  var _a;
54
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Retrieving template summary for stack ${stackArtifact.displayName}.`));
53
+ await this.ioHelper.notify((0, messages_1.debug)(`Retrieving template summary for stack ${stackArtifact.displayName}.`));
55
54
  // Currently, needs to use `deploy-role` since it may need to read templates in the staging
56
55
  // bucket which have been encrypted with a KMS key (and lookup-role may not read encrypted things)
57
56
  const env = await this.envs.accessStackForReadOnlyStackOperations(stackArtifact);
@@ -73,7 +72,7 @@ class Deployments {
73
72
  }
74
73
  const response = await cfn.getTemplateSummary(cfnParam);
75
74
  if (!response.ResourceIdentifierSummaries) {
76
- await this.ioHost.notify((0, messages_1.debug)(this.action, 'GetTemplateSummary API call did not return "ResourceIdentifierSummaries"'));
75
+ await this.ioHelper.notify((0, messages_1.debug)('GetTemplateSummary API call did not return "ResourceIdentifierSummaries"'));
77
76
  }
78
77
  return (_a = response.ResourceIdentifierSummaries) !== null && _a !== void 0 ? _a : [];
79
78
  }
@@ -116,7 +115,7 @@ class Deployments {
116
115
  resourcesToImport: options.resourcesToImport,
117
116
  overrideTemplate: options.overrideTemplate,
118
117
  assetParallelism: options.assetParallelism,
119
- }, { ioHost: this.ioHost, action: this.action });
118
+ }, this.ioHelper);
120
119
  }
121
120
  async rollbackStack(options) {
122
121
  var _a, _b, _c;
@@ -138,10 +137,10 @@ class Deployments {
138
137
  const executionRoleArn = await env.replacePlaceholders((_c = options.roleArn) !== null && _c !== void 0 ? _c : options.stack.cloudFormationExecutionRoleArn);
139
138
  switch (cloudFormationStack.stackStatus.rollbackChoice) {
140
139
  case stack_events_1.RollbackChoice.NONE:
141
- await this.ioHost.notify((0, messages_1.warn)(this.action, `Stack ${deployName} does not need a rollback: ${cloudFormationStack.stackStatus}`));
140
+ await this.ioHelper.notify((0, messages_1.warn)(`Stack ${deployName} does not need a rollback: ${cloudFormationStack.stackStatus}`));
142
141
  return { notInRollbackableState: true };
143
142
  case stack_events_1.RollbackChoice.START_ROLLBACK:
144
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Initiating rollback of stack ${deployName}`));
143
+ await this.ioHelper.notify((0, messages_1.debug)(`Initiating rollback of stack ${deployName}`));
145
144
  await cfn.rollbackStack({
146
145
  StackName: deployName,
147
146
  RoleARN: executionRoleArn,
@@ -165,7 +164,7 @@ class Deployments {
165
164
  .map((r) => { var _a; return (_a = r.event.LogicalResourceId) !== null && _a !== void 0 ? _a : ''; });
166
165
  }
167
166
  const skipDescription = resourcesToSkip.length > 0 ? ` (orphaning: ${resourcesToSkip.join(', ')})` : '';
168
- await this.ioHost.notify((0, messages_1.warn)(this.action, `Continuing rollback of stack ${deployName}${skipDescription}`));
167
+ await this.ioHelper.notify((0, messages_1.warn)(`Continuing rollback of stack ${deployName}${skipDescription}`));
169
168
  await cfn.continueUpdateRollback({
170
169
  StackName: deployName,
171
170
  ClientRequestToken: (0, crypto_1.randomUUID)(),
@@ -174,7 +173,7 @@ class Deployments {
174
173
  });
175
174
  break;
176
175
  case stack_events_1.RollbackChoice.ROLLBACK_FAILED:
177
- await this.ioHost.notify((0, messages_1.warn)(this.action, `Stack ${deployName} failed creation and rollback. This state cannot be rolled back. You can recreate this stack by running 'cdk deploy'.`));
176
+ await this.ioHelper.notify((0, messages_1.warn)(`Stack ${deployName} failed creation and rollback. This state cannot be rolled back. You can recreate this stack by running 'cdk deploy'.`));
178
177
  return { notInRollbackableState: true };
179
178
  default:
180
179
  throw new error_1.ToolkitError(`Unexpected rollback choice: ${cloudFormationStack.stackStatus.rollbackChoice}`);
@@ -183,14 +182,13 @@ class Deployments {
183
182
  cfn,
184
183
  stack: options.stack,
185
184
  stackName: deployName,
186
- ioHost: this.ioHost,
187
- action: this.action,
185
+ ioHelper: this.ioHelper,
188
186
  });
189
187
  await monitor.start();
190
188
  let stackErrorMessage = undefined;
191
189
  let finalStackState = cloudFormationStack;
192
190
  try {
193
- const successStack = await (0, cloudformation_1.stabilizeStack)(cfn, { ioHost: this.ioHost, action: this.action }, deployName);
191
+ const successStack = await (0, cloudformation_1.stabilizeStack)(cfn, this.ioHelper, deployName);
194
192
  // This shouldn't really happen, but catch it anyway. You never know.
195
193
  if (!successStack) {
196
194
  throw new error_1.ToolkitError('Stack deploy failed (the stack disappeared while we were rolling it back)');
@@ -202,7 +200,7 @@ class Deployments {
202
200
  }
203
201
  }
204
202
  catch (e) {
205
- stackErrorMessage = suffixWithErrors((0, format_error_1.formatErrorMessage)(e), monitor.errors);
203
+ stackErrorMessage = suffixWithErrors((0, util_1.formatErrorMessage)(e), monitor.errors);
206
204
  }
207
205
  finally {
208
206
  await monitor.stop();
@@ -228,9 +226,7 @@ class Deployments {
228
226
  roleArn: executionRoleArn,
229
227
  stack: options.stack,
230
228
  deployName: options.deployName,
231
- quiet: options.quiet,
232
- ci: options.ci,
233
- }, { ioHost: this.ioHost, action: this.action });
229
+ }, this.ioHelper);
234
230
  }
235
231
  async stackExists(options) {
236
232
  var _a;
@@ -261,7 +257,7 @@ class Deployments {
261
257
  const publisher = this.cachedPublisher(assetManifest, resolvedEnvironment, options.stackName);
262
258
  await publisher.buildEntry(asset);
263
259
  if (publisher.hasFailures) {
264
- throw new error_1.ToolkitError(`Failed to build asset ${asset.id}`);
260
+ throw new error_1.ToolkitError(`Failed to build asset ${asset.displayName(false)}`);
265
261
  }
266
262
  }
267
263
  /**
@@ -271,18 +267,18 @@ class Deployments {
271
267
  const stackEnv = await this.envs.resolveStackEnvironment(options.stack);
272
268
  // No need to validate anymore, we already did that during build
273
269
  const publisher = this.cachedPublisher(assetManifest, stackEnv, options.stackName);
274
- await publisher.publishEntry(asset, { allowCrossAccount: await this.allowCrossAccountAssetPublishingForEnv(options.stack) });
270
+ await publisher.publishEntry(asset, {
271
+ allowCrossAccount: await this.allowCrossAccountAssetPublishingForEnv(options.stack),
272
+ force: options.forcePublish,
273
+ });
275
274
  if (publisher.hasFailures) {
276
- throw new error_1.ToolkitError(`Failed to publish asset ${asset.id}`);
275
+ throw new error_1.ToolkitError(`Failed to publish asset ${asset.displayName(true)}`);
277
276
  }
278
277
  }
279
278
  async allowCrossAccountAssetPublishingForEnv(stack) {
280
279
  if (this._allowCrossAccountAssetPublishing === undefined) {
281
280
  const env = await this.envs.accessStackForReadOnlyStackOperations(stack);
282
- this._allowCrossAccountAssetPublishing = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(env.sdk, {
283
- ioHost: this.ioHost,
284
- action: this.action,
285
- }, this.props.toolkitStackName);
281
+ this._allowCrossAccountAssetPublishing = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(env.sdk, this.ioHelper, this.props.toolkitStackName);
286
282
  }
287
283
  return this._allowCrossAccountAssetPublishing;
288
284
  }
@@ -304,7 +300,7 @@ class Deployments {
304
300
  await envResources.validateVersion(requiresBootstrapStackVersion, bootstrapStackVersionSsmParameter);
305
301
  }
306
302
  catch (e) {
307
- throw new error_1.ToolkitError(`${stackName}: ${(0, format_error_1.formatErrorMessage)(e)}`);
303
+ throw new error_1.ToolkitError(`${stackName}: ${(0, util_1.formatErrorMessage)(e)}`);
308
304
  }
309
305
  }
310
306
  cachedPublisher(assetManifest, env, stackName) {
@@ -317,7 +313,7 @@ class Deployments {
317
313
  // The AssetPublishing class takes care of role assuming etc, so it's okay to
318
314
  // give it a direct `SdkProvider`.
319
315
  aws: new asset_publishing_1.PublishingAws(this.assetSdkProvider, env),
320
- progressListener: new ParallelSafeAssetProgress(prefix, { ioHost: this.ioHost, action: this.action }),
316
+ progressListener: new ParallelSafeAssetProgress(prefix, this.ioHelper),
321
317
  });
322
318
  this.publisherCache.set(assetManifest, publisher);
323
319
  return publisher;
@@ -328,8 +324,8 @@ exports.Deployments = Deployments;
328
324
  * Asset progress that doesn't do anything with percentages (currently)
329
325
  */
330
326
  class ParallelSafeAssetProgress extends asset_publishing_1.BasePublishProgressListener {
331
- constructor(prefix, { ioHost, action }) {
332
- super({ ioHost, action });
327
+ constructor(prefix, ioHelper) {
328
+ super(ioHelper);
333
329
  this.prefix = prefix;
334
330
  }
335
331
  getMessage(type, event) {
@@ -339,4 +335,4 @@ class ParallelSafeAssetProgress extends asset_publishing_1.BasePublishProgressLi
339
335
  function suffixWithErrors(msg, errors) {
340
336
  return errors && errors.length > 0 ? `${msg}: ${errors.join(', ')}` : msg;
341
337
  }
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFFcEMseUNBQXlDO0FBQ3pDLCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHFDQUFxRTtBQUNyRSxxREFPMEI7QUFDMUIsaURBQTJEO0FBRzNELGlFQUlnQztBQUNoQyxpREFBaUQ7QUFFakQsK0NBQW1EO0FBQ25ELDBEQUE2RDtBQUU3RCxnREFBOEU7QUFFOUUsa0RBQXlGO0FBRXpGLGtEQUE2RDtBQUM3RCw2RUFBb0U7QUFFcEUsTUFBTSxvQ0FBb0MsR0FBRyxFQUFFLENBQUM7QUFvUWhEOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVc7SUE4QnRCLFlBQTZCLEtBQXVCOztRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQVBuQyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUF3RCxDQUFDO1FBUWhHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLCtCQUFpQixDQUMvQixLQUFLLENBQUMsV0FBVyxFQUNqQixNQUFBLEtBQUssQ0FBQyxnQkFBZ0IsbUNBQUkseUNBQTBCLEVBQ3BELEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUF3QztRQUN0RSxPQUFPLElB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LEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN0RyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBNVpELGtDQTRaQztBQUVEOztHQUVHO0FBQ0gsTUFBTSx5QkFBMEIsU0FBUSw4Q0FBMkI7SUFHakUsWUFBWSxNQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlO1FBQ3pELEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBMEIsRUFBRSxLQUFrQztRQUNqRixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLE1BQWlCO0lBQ3RELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0ICogYXMgY2RrX2Fzc2V0cyBmcm9tICdjZGstYXNzZXRzJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi9hc3NldC1tYW5pZmVzdC1idWlsZGVyJztcbmltcG9ydCB7XG4gIEJhc2VQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lcixcbiAgUHVibGlzaGluZ0F3cyxcbn0gZnJvbSAnLi9hc3NldC1wdWJsaXNoaW5nJztcbmltcG9ydCB7IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nIH0gZnJvbSAnLi9jaGVja3MnO1xuaW1wb3J0IHtcbiAgQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgdHlwZSBSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMsXG4gIFJlc291cmNlc1RvSW1wb3J0LFxuICBzdGFiaWxpemVTdGFjayxcbiAgVGVtcGxhdGUsXG4gIHVwbG9hZFN0YWNrVGVtcGxhdGVBc3NldHMsXG59IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgZGVwbG95U3RhY2ssIGRlc3Ryb3lTdGFjayB9IGZyb20gJy4vZGVwbG95LXN0YWNrJztcbmltcG9ydCB7IERlcGxveW1lbnRNZXRob2QgfSBmcm9tICcuL2RlcGxveW1lbnQtbWV0aG9kJztcbmltcG9ydCB7IERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ltZW50LXJlc3VsdCc7XG5pbXBvcnQge1xuICBsb2FkQ3VycmVudFRlbXBsYXRlLFxuICBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyxcbiAgdHlwZSBSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxufSBmcm9tICcuL25lc3RlZC1zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IGRlYnVnLCB3YXJuIH0gZnJvbSAnLi4vLi4vY2xpL21lc3NhZ2VzJztcbmltcG9ydCB7IElJb0hvc3QsIElvTWVzc2FnaW5nLCBUb29sa2l0QWN0aW9uIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L2Vycm9yJztcbmltcG9ydCB7IGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL3V0aWwvZm9ybWF0LWVycm9yJztcbmltcG9ydCB0eXBlIHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hd3MtYXV0aC9zZGstcHJvdmlkZXInO1xuaW1wb3J0IHsgdHlwZSBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBIb3Rzd2FwTW9kZSwgSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzIH0gZnJvbSAnLi4vaG90c3dhcC9jb21tb24nO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eU1vbml0b3IsIFN0YWNrRXZlbnRQb2xsZXIsIFJvbGxiYWNrQ2hvaWNlIH0gZnJvbSAnLi4vc3RhY2stZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgVGFnIH0gZnJvbSAnLi4vdGFncyc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSB9IGZyb20gJy4uL3Rvb2xraXQtaW5mbyc7XG5pbXBvcnQgeyBtYWtlQm9keVBhcmFtZXRlciB9IGZyb20gJy4uL3V0aWwvdGVtcGxhdGUtYm9keS1wYXJhbWV0ZXInO1xuXG5jb25zdCBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0sgPSAyMztcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gZGVwbG95XG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvcGljIEFSTnMgdG8gc2VuZCBhIG1lc3NhZ2Ugd2hlbiBkZXBsb3ltZW50IGZpbmlzaGVzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBuYW1lIHVuZGVyIHdoaWNoIHN0YWNrIHdpbGwgYmUgZGVwbG95ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgYXJ0aWZhY3QgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFnZSB0aGUgY2hhbmdlIHNldCBidXQgZG9uJ3QgZXhlY3V0ZSBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICogQGRlcHJlY2F0ZWQgVXNlICdkZXBsb3ltZW50TWV0aG9kJyBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgJ2RlcGxveW1lbnRNZXRob2QnIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgZGVwbG95bWVudCBtZXRob2QgKGRpcmVjdCBvciB1c2luZyBhIGNoYW5nZSBzZXQpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ2hhbmdlIHNldCB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZD86IERlcGxveW1lbnRNZXRob2Q7XG5cbiAgLyoqXG4gICAqIEZvcmNlIGRlcGxveW1lbnQsIGV2ZW4gaWYgdGhlIGRlcGxveWVkIHRlbXBsYXRlIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHdlIGFyZSBhYm91dCB0byBkZXBsb3kuXG4gICAqIEBkZWZhdWx0IGZhbHNlIGRlcGxveW1lbnQgd2lsbCBiZSBza2lwcGVkIGlmIHRoZSB0ZW1wbGF0ZSBpcyBpZGVudGljYWxcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXh0cmEgcGFyYW1ldGVycyBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLypcbiAgICogV2hldGhlciB0byBwZXJmb3JtIGEgJ2hvdHN3YXAnIGRlcGxveW1lbnQuXG4gICAqIEEgJ2hvdHN3YXAnIGRlcGxveW1lbnQgd2lsbCBhdHRlbXB0IHRvIHNob3J0LWNpcmN1aXQgQ2xvdWRGb3JtYXRpb25cbiAgICogYW5kIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgcmVzb3VyY2VzIGxpa2UgTGFtYmRhIGZ1bmN0aW9ucyBkaXJlY3RseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UYCBmb3IgcmVndWxhciBkZXBsb3ltZW50cywgYEhvdHN3YXBNb2RlLkhPVFNXQVBfT05MWWAgZm9yICd3YXRjaCcgZGVwbG95bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXA/OiBIb3Rzd2FwTW9kZTtcblxuICAvKipcbiAgICogUHJvcGVydGllcyB0aGF0IGNvbmZpZ3VyZSBob3Rzd2FwIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwUHJvcGVydHlPdmVycmlkZXM/OiBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRyYSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlciB3aGVuIHBlcmZvcm1pbmcgQVdTIFNESyBjYWxscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub3RoaW5nIGV4dHJhIGlzIGFwcGVuZGVkIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFVc2VyQWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZXhpc3RpbmcgcmVzb3VyY2VzIHRvIGJlIElNUE9SVEVEIGludG8gdGhlIHN0YWNrLCBpbnN0ZWFkIG9mIGJlaW5nIENSRUFURURcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQYXJhbGxlbGlzbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVwbG95IGlmIHRoZSBhcHAgY29udGFpbnMgbm8gc3RhY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaWdub3JlTm9TdGFja3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGxiYWNrU3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHRvIHJvbGwgYmFja1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBkZXBsb3ltZW50IChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb24ndCBzaG93IHN0YWNrIGRlcGxveW1lbnQgZXZlbnRzLCBqdXN0IHdhaXRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgb24gYSBDSSBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNpPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIGEgcm9sbGJhY2sgb3Igbm90XG4gICAqXG4gICAqIEZvcmNpbmcgYSByb2xsYmFjayB3aWxsIG9ycGhhbiBhbGwgdW5kZWxldGFibGUgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcnBoYW4gdGhlIHJlc291cmNlcyB3aXRoIHRoZSBnaXZlbiBsb2dpY2FsIElEc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG9ycGhhbmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgb3JwaGFuTG9naWNhbElkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBib290c3RyYXAgc3RhY2sgcGVybWlzc2lvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGxiYWNrU3RhY2tSZXN1bHQge1xuICByZWFkb25seSBub3RJblJvbGxiYWNrYWJsZVN0YXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3VjY2Vzcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgd2l0aCBhc3NldHMgdG8gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGJ1aWxkaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIG5hbWUgdGhpcyBhc3NldCBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95U3RhY2tPcHRpb25zIHtcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgcm9sZUFybj86IHN0cmluZztcbiAgcXVpZXQ/OiBib29sZWFuO1xuICBmb3JjZT86IGJvb2xlYW47XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0V4aXN0c09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICB0cnlMb29rdXBSb2xlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50c1Byb3BzIHtcbiAgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpb0hvc3Q6IElJb0hvc3Q7XG4gIHJlYWRvbmx5IGFjdGlvbjogVG9vbGtpdEFjdGlvbjtcbn1cblxuLyoqXG4gKiBTY29wZSBmb3IgYSBzaW5nbGUgc2V0IG9mIGRlcGxveW1lbnRzIGZyb20gYSBzZXQgb2YgQ2xvdWQgQXNzZW1ibHkgQXJ0aWZhY3RzXG4gKlxuICogTWFuYWdlcyBsb29rdXAgb2YgU0RLcywgQm9vdHN0cmFwIHN0YWNrcywgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudHMge1xuICBwdWJsaWMgcmVhZG9ubHkgZW52czogRW52aXJvbm1lbnRBY2Nlc3M7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgYXNzZXQgcHVibGlzaGluZyAoZG8gbm90IHVzZSBmb3IgYW55dGhpbmcgZWxzZSkuXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBhc3NldCBoYW5kbGluZyByb3V0aW5lcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgcGFzc2luZyB0byBkZXBsb3lTdGFja1xuICAgKlxuICAgKiBUaGlzIFNESyBwcm92aWRlciBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLCBub3RoaW5nIGVsc2UuXG4gICAqXG4gICAqIEl0J3Mgbm90IGEgZGlmZmVyZW50IG9iamVjdCwgYnV0IHRoZSBmaWVsZCBuYW1lIHNob3VsZCBpbXBseSB0aGF0IHRoaXNcbiAgICogb2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgZXhjZXB0IHRvIHBhc3MgdG8gYGRlcGxveVN0YWNrYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95U3RhY2tTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoZXJDYWNoZSA9IG5ldyBNYXA8Y2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LCBjZGtfYXNzZXRzLkFzc2V0UHVibGlzaGluZz4oKTtcblxuICBwcml2YXRlIF9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSG9zdDogSUlvSG9zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb246IFRvb2xraXRBY3Rpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogRGVwbG95bWVudHNQcm9wcykge1xuICAgIHRoaXMuYXNzZXRTZGtQcm92aWRlciA9IHByb3BzLnNka1Byb3ZpZGVyO1xuICAgIHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlciA9IHByb3BzLnNka1Byb3ZpZGVyO1xuICAgIHRoaXMuaW9Ib3N0ID0gcHJvcHMuaW9Ib3N0O1xuICAgIHRoaXMuYWN0aW9uID0gcHJvcHMuYWN0aW9uO1xuICAgIHRoaXMuZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2VzcyhcbiAgICAgIHByb3BzLnNka1Byb3ZpZGVyLFxuICAgICAgcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSxcbiAgICAgIHsgaW9Ib3N0OiB0aGlzLmlvSG9zdCwgYWN0aW9uOiB0aGlzLmFjdGlvbiB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVudmlyb25tZW50IGZvciBhIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc29sdmVFbnZpcm9ubWVudChzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxjeGFwaS5FbnZpcm9ubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQoc3RhY2spO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKFxuICAgIHJvb3RTdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICAgcmV0cmlldmVQcm9jZXNzZWRUZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBQcm9taXNlPFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3M+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHJvb3RTdGFja0FydGlmYWN0KTtcbiAgICByZXR1cm4gbG9hZEN1cnJlbnRUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3Mocm9vdFN0YWNrQXJ0aWZhY3QsIGVudi5zZGssIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFJlYWRpbmcgZXhpc3RpbmcgdGVtcGxhdGUgZm9yIHN0YWNrICR7c3RhY2tBcnRpZmFjdC5kaXNwbGF5TmFtZX0uYCkpO1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdCwgZW52LnNkayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKFxuICAgIHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgKTogUHJvbWlzZTxSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXM+IHtcbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBSZXRyaWV2aW5nIHRlbXBsYXRlIHN1bW1hcnkgZm9yIHN0YWNrICR7c3RhY2tBcnRpZmFjdC5kaXNwbGF5TmFtZX0uYCkpO1xuICAgIC8vIEN1cnJlbnRseSwgbmVlZHMgdG8gdXNlIGBkZXBsb3ktcm9sZWAgc2luY2UgaXQgbWF5IG5lZWQgdG8gcmVhZCB0ZW1wbGF0ZXMgaW4gdGhlIHN0YWdpbmdcbiAgICAvLyBidWNrZXQgd2hpY2ggaGF2ZSBiZWVuIGVuY3J5cHRlZCB3aXRoIGEgS01TIGtleSAoYW5kIGxvb2t1cC1yb2xlIG1heSBub3QgcmVhZCBlbmNyeXB0ZWQgdGhpbmdzKVxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKHN0YWNrQXJ0aWZhY3QpO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICAgIGF3YWl0IHVwbG9hZFN0YWNrVGVtcGxhdGVBc3NldHMoc3RhY2tBcnRpZmFjdCwgdGhpcyk7XG5cbiAgICAvLyBVcGxvYWQgdGhlIHRlbXBsYXRlLCBpZiBuZWNlc3NhcnksIGJlZm9yZSBwYXNzaW5nIGl0IHRvIENGTlxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgICBjb25zdCBjZm5QYXJhbSA9IGF3YWl0IG1ha2VCb2R5UGFyYW1ldGVyKFxuICAgICAgc3RhY2tBcnRpZmFjdCxcbiAgICAgIGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgYnVpbGRlcixcbiAgICAgIGVudi5yZXNvdXJjZXMpO1xuXG4gICAgLy8gSWYgdGhlIGBtYWtlQm9keVBhcmFtZXRlcmAgYmVmb3JlIHRoaXMgYWRkZWQgYXNzZXRzLCBtYWtlIHN1cmUgdG8gcHVibGlzaCB0aGVtIGJlZm9yZVxuICAgIC8vIGNhbGxpbmcgdGhlIEFQSS5cbiAgICBjb25zdCBhZGRlZEFzc2V0cyA9IGJ1aWxkZXIudG9NYW5pZmVzdChzdGFja0FydGlmYWN0LmFzc2VtYmx5LmRpcmVjdG9yeSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhZGRlZEFzc2V0cy5lbnRyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkU2luZ2xlQXNzZXQoJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsIGFkZGVkQXNzZXRzLCBlbnRyeSwge1xuICAgICAgICBzdGFjazogc3RhY2tBcnRpZmFjdCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoU2luZ2xlQXNzZXQoYWRkZWRBc3NldHMsIGVudHJ5LCB7XG4gICAgICAgIHN0YWNrOiBzdGFja0FydGlmYWN0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZm4uZ2V0VGVtcGxhdGVTdW1tYXJ5KGNmblBhcmFtKTtcbiAgICBpZiAoIXJlc3BvbnNlLlJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcykge1xuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCAnR2V0VGVtcGxhdGVTdW1tYXJ5IEFQSSBjYWxsIGRpZCBub3QgcmV0dXJuIFwiUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzXCInKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGxldCBkZXBsb3ltZW50TWV0aG9kID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kO1xuICAgIGlmIChvcHRpb25zLmNoYW5nZVNldE5hbWUgfHwgb3B0aW9ucy5leGVjdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZXBsb3ltZW50TWV0aG9kKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgXCJZb3UgY2Fubm90IHN1cHBseSBib3RoICdkZXBsb3ltZW50TWV0aG9kJyBhbmQgJ2NoYW5nZVNldE5hbWUvZXhlY3V0ZScuIFN1cHBseSBvbmUgb3IgdGhlIG90aGVyLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVwbG95bWVudE1ldGhvZCA9IHtcbiAgICAgICAgbWV0aG9kOiAnY2hhbmdlLXNldCcsXG4gICAgICAgIGNoYW5nZVNldE5hbWU6IG9wdGlvbnMuY2hhbmdlU2V0TmFtZSxcbiAgICAgICAgZXhlY3V0ZTogb3B0aW9ucy5leGVjdXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuXG4gICAgLy8gRG8gYSB2ZXJpZmljYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgb3B0aW9ucy5zdGFjay5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQ6IGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2QsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICAgIGhvdHN3YXA6IG9wdGlvbnMuaG90c3dhcCxcbiAgICAgIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogb3B0aW9ucy5ob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4gICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgIHJlc291cmNlc1RvSW1wb3J0OiBvcHRpb25zLnJlc291cmNlc1RvSW1wb3J0LFxuICAgICAgb3ZlcnJpZGVUZW1wbGF0ZTogb3B0aW9ucy5vdmVycmlkZVRlbXBsYXRlLFxuICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgIH0sIHsgaW9Ib3N0OiB0aGlzLmlvSG9zdCwgYWN0aW9uOiB0aGlzLmFjdGlvbiB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByb2xsYmFja1N0YWNrKG9wdGlvbnM6IFJvbGxiYWNrU3RhY2tPcHRpb25zKTogUHJvbWlzZTxSb2xsYmFja1N0YWNrUmVzdWx0PiB7XG4gICAgbGV0IHJlc291cmNlc1RvU2tpcDogc3RyaW5nW10gPSBvcHRpb25zLm9ycGhhbkxvZ2ljYWxJZHMgPz8gW107XG4gICAgaWYgKG9wdGlvbnMuZm9yY2UgJiYgcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Nhbm5vdCBjb21iaW5lIC0tZm9yY2Ugd2l0aCAtLW9ycGhhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICBpZiAob3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbiA/PyB0cnVlKSB7XG4gICAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0ssXG4gICAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuXG4gICAgLy8gV2UgbG9vcCBpbiBjYXNlIG9mIGAtLWZvcmNlYCBhbmQgdGhlIHN0YWNrIGVuZHMgdXAgaW4gYENPTlRJTlVFX1VQREFURV9ST0xMQkFDS2AuXG4gICAgbGV0IG1heExvb3BzID0gMTA7XG4gICAgd2hpbGUgKG1heExvb3BzLS0pIHtcbiAgICAgIGxldCBjbG91ZEZvcm1hdGlvblN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICAgIHN3aXRjaCAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZSkge1xuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLk5PTkU6XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KHdhcm4odGhpcy5hY3Rpb24sIGBTdGFjayAke2RlcGxveU5hbWV9IGRvZXMgbm90IG5lZWQgYSByb2xsYmFjazogJHtjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzfWApKTtcbiAgICAgICAgICByZXR1cm4geyBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKSk7XG4gICAgICAgICAgYXdhaXQgY2ZuLnJvbGxiYWNrU3RhY2soe1xuICAgICAgICAgICAgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgLy8gRW5hYmxpbmcgdGhpcyBpcyBqdXN0IHRoZSBiZXR0ZXIgb3ZlcmFsbCBkZWZhdWx0LCB0aGUgb25seSByZWFzb24gaXQgaXNuJ3QgdGhlIHVwc3RyZWFtIGRlZmF1bHQgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIFJldGFpbkV4Y2VwdE9uQ3JlYXRlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLOlxuICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmYWlsZWQgcmVzb3VyY2VzIGZyb20gdGhlIGRlcGxveW1lbnQgYW5kIGF1dG9tYXRpY2FsbHkgc2tpcCB0aGVtXG4gICAgICAgICAgICAvLyAoVXNpbmcgZGVwbG95bWVudCBsb2cgYmVjYXVzZSB3ZSBkZWZpbml0ZWx5IGhhdmUgYERlc2NyaWJlU3RhY2tFdmVudHNgIHBlcm1pc3Npb25zLCBhbmQgd2UgbWlnaHQgbm90IGhhdmVcbiAgICAgICAgICAgIC8vIGBEZXNjcmliZVN0YWNrUmVzb3VyY2VzYCBwZXJtaXNzaW9ucykuXG4gICAgICAgICAgICBjb25zdCBwb2xsZXIgPSBuZXcgU3RhY2tFdmVudFBvbGxlcihjZm4sIHtcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgICBzdGFja1N0YXR1c2VzOiBbJ1JPTExCQUNLX0lOX1BST0dSRVNTJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUyddLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICAgICAgICAgICAgcmVzb3VyY2VzVG9Ta2lwID0gcG9sbGVyLnJlc291cmNlRXJyb3JzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHIpID0+ICFyLmlzU3RhY2tFdmVudCAmJiByLnBhcmVudFN0YWNrTG9naWNhbElkcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPz8gJycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNraXBEZXNjcmlwdGlvbiA9IHJlc291cmNlc1RvU2tpcC5sZW5ndGggPiAwID8gYCAob3JwaGFuaW5nOiAke3Jlc291cmNlc1RvU2tpcC5qb2luKCcsICcpfSlgIDogJyc7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KHdhcm4odGhpcy5hY3Rpb24sIGBDb250aW51aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX0ke3NraXBEZXNjcmlwdGlvbn1gKSk7XG4gICAgICAgICAgYXdhaXQgY2ZuLmNvbnRpbnVlVXBkYXRlUm9sbGJhY2soe1xuICAgICAgICAgICAgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICBSb2xlQVJOOiBleGVjdXRpb25Sb2xlQXJuLFxuICAgICAgICAgICAgUmVzb3VyY2VzVG9Ta2lwOiByZXNvdXJjZXNUb1NraXAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5ST0xMQkFDS19GQUlMRUQ6XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KHdhcm4oXG4gICAgICAgICAgICB0aGlzLmFjdGlvbixcbiAgICAgICAgICAgIGBTdGFjayAke2RlcGxveU5hbWV9IGZhaWxlZCBjcmVhdGlvbiBhbmQgcm9sbGJhY2suIFRoaXMgc3RhdGUgY2Fubm90IGJlIHJvbGxlZCBiYWNrLiBZb3UgY2FuIHJlY3JlYXRlIHRoaXMgc3RhY2sgYnkgcnVubmluZyAnY2RrIGRlcGxveScuYCxcbiAgICAgICAgICApKTtcbiAgICAgICAgICByZXR1cm4geyBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBVbmV4cGVjdGVkIHJvbGxiYWNrIGNob2ljZTogJHtjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLnJvbGxiYWNrQ2hvaWNlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb25pdG9yID0gbmV3IFN0YWNrQWN0aXZpdHlNb25pdG9yKHtcbiAgICAgICAgY2ZuLFxuICAgICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgICAgc3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICBpb0hvc3Q6IHRoaXMuaW9Ib3N0LFxuICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBtb25pdG9yLnN0YXJ0KCk7XG5cbiAgICAgIGxldCBzdGFja0Vycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGZpbmFsU3RhY2tTdGF0ZSA9IGNsb3VkRm9ybWF0aW9uU3RhY2s7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWNjZXNzU3RhY2sgPSBhd2FpdCBzdGFiaWxpemVTdGFjayhjZm4sIHsgaW9Ib3N0OiB0aGlzLmlvSG9zdCwgYWN0aW9uOiB0aGlzLmFjdGlvbiB9LCBkZXBsb3lOYW1lKTtcblxuICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuLCBidXQgY2F0Y2ggaXQgYW55d2F5LiBZb3UgbmV2ZXIga25vdy5cbiAgICAgICAgaWYgKCFzdWNjZXNzU3RhY2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSByb2xsaW5nIGl0IGJhY2spJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxTdGFja1N0YXRlID0gc3VjY2Vzc1N0YWNrO1xuXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IG1vbml0b3IuZXJyb3JzLmpvaW4oJywgJyk7XG4gICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICBzdGFja0Vycm9yTWVzc2FnZSA9IGVycm9ycztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gc3VmZml4V2l0aEVycm9ycyhmb3JtYXRFcnJvck1lc3NhZ2UoZSksIG1vbml0b3IuZXJyb3JzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IG1vbml0b3Iuc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxTdGFja1N0YXRlLnN0YWNrU3RhdHVzLmlzUm9sbGJhY2tTdWNjZXNzIHx8ICFzdGFja0Vycm9yTWVzc2FnZSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEVpdGhlciB3ZSBuZWVkIHRvIGlnbm9yZSBzb21lIHJlc291cmNlcyB0byBjb250aW51ZSB0aGUgcm9sbGJhY2ssIG9yIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICBpZiAoZmluYWxTdGFja1N0YXRlLnN0YWNrU3RhdHVzLnJvbGxiYWNrQ2hvaWNlID09PSBSb2xsYmFja0Nob2ljZS5DT05USU5VRV9VUERBVEVfUk9MTEJBQ0sgJiYgb3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAvLyBEbyBhbm90aGVyIGxvb3AtZGUtbG9vcFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgYCR7c3RhY2tFcnJvck1lc3NhZ2V9IChmaXggcHJvYmxlbSBhbmQgcmV0cnksIG9yIG9ycGhhbiB0aGVzZSByZXNvdXJjZXMgdXNpbmcgLS1vcnBoYW4gb3IgLS1mb3JjZSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgIFwiUm9sbGJhY2sgZGlkIG5vdCBmaW5pc2ggYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgc3RvcHBpbmcgYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdlJ3JlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgYW55bW9yZS4gWW91IGNhbiByZXRyeSBpZiByb2xsYmFjayB3YXMgcHJvZ3Jlc3NpbmcgYXMgZXhwZWN0ZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogZW52LnNkayxcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIGRlcGxveU5hbWU6IG9wdGlvbnMuZGVwbG95TmFtZSxcbiAgICAgIHF1aWV0OiBvcHRpb25zLnF1aWV0LFxuICAgICAgY2k6IG9wdGlvbnMuY2ksXG4gICAgfSwgeyBpb0hvc3Q6IHRoaXMuaW9Ib3N0LCBhY3Rpb246IHRoaXMuYWN0aW9uIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YWNrRXhpc3RzKG9wdGlvbnM6IFN0YWNrRXhpc3RzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBlbnY7XG4gICAgaWYgKG9wdGlvbnMudHJ5TG9va3VwUm9sZSkge1xuICAgICAgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTG9va3VwQmVzdEVmZm9ydChvcHRpb25zLnN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgfVxuICAgIGNvbnN0IHN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoZW52LnNkay5jbG91ZEZvcm1hdGlvbigpLCBvcHRpb25zLmRlcGxveU5hbWUgPz8gb3B0aW9ucy5zdGFjay5zdGFja05hbWUpO1xuICAgIHJldHVybiBzdGFjay5leGlzdHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBzaW5nbGUgYXNzZXQgZnJvbSBhbiBhc3NldCBtYW5pZmVzdFxuICAgKlxuICAgKiBJZiBhbiBhc3NlcnQgbWFuaWZlc3QgYXJ0aWZhY3QgaXMgZ2l2ZW4sIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgKiB3aWxsIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnN0cmFpbnRzIGluIHRoYXQgbWFuaWZlc3QgYXJ0aWZhY3QuXG4gICAqIElmIHRoYXQgaXMgbm90IG5lY2Vzc2FyeSwgYCduby12ZXJzaW9uLXZhbGlkYXRpb24nYCBjYW4gYmUgcGFzc2VkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gYnVpbGQgYXNzZXQgJHthc3NldC5pZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaFNpbmdsZUFzc2V0KFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gdmFsaWRhdGUgYW55bW9yZSwgd2UgYWxyZWFkeSBkaWQgdGhhdCBkdXJpbmcgYnVpbGRcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoRW50cnkoYXNzZXQsIHsgYWxsb3dDcm9zc0FjY291bnQ6IGF3YWl0IHRoaXMuYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmdGb3JFbnYob3B0aW9ucy5zdGFjaykgfSk7XG4gICAgaWYgKHB1Ymxpc2hlci5oYXNGYWlsdXJlcykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgRmFpbGVkIHRvIHB1Ymxpc2ggYXNzZXQgJHthc3NldC5pZH1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgICAgdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhlbnYuc2RrLCB7XG4gICAgICAgIGlvSG9zdDogdGhpcy5pb0hvc3QsXG4gICAgICAgIGFjdGlvbjogdGhpcy5hY3Rpb24sXG4gICAgICB9LCB0aGlzLnByb3BzLnRvb2xraXRTdGFja05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBzaW5nbGUgYXNzZXQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1NpbmdsZUFzc2V0UHVibGlzaGVkKFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIHJldHVybiBwdWJsaXNoZXIuaXNFbnRyeVB1Ymxpc2hlZChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgYm9vdHN0cmFwIHN0YWNrIGhhcyB0aGUgcmlnaHQgdmVyc2lvbiBmb3IgdGhpcyBzdGFja1xuICAgKlxuICAgKiBDYWxsIGludG8gZW52UmVzb3VyY2VzLnZhbGlkYXRlVmVyc2lvbiwgYnV0IHByZXBlbmQgdGhlIHN0YWNrIG5hbWUgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVudlJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXMsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uKHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLCBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgJHtzdGFja05hbWV9OiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGVudjogY3hhcGkuRW52aXJvbm1lbnQsIHN0YWNrTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wdWJsaXNoZXJDYWNoZS5nZXQoYXNzZXRNYW5pZmVzdCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IHN0YWNrTmFtZSA/IGAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX06IGAgOiAnJztcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgY2RrX2Fzc2V0cy5Bc3NldFB1Ymxpc2hpbmcoYXNzZXRNYW5pZmVzdCwge1xuICAgICAgLy8gVGhlIEFzc2V0UHVibGlzaGluZyBjbGFzcyB0YWtlcyBjYXJlIG9mIHJvbGUgYXNzdW1pbmcgZXRjLCBzbyBpdCdzIG9rYXkgdG9cbiAgICAgIC8vIGdpdmUgaXQgYSBkaXJlY3QgYFNka1Byb3ZpZGVyYC5cbiAgICAgIGF3czogbmV3IFB1Ymxpc2hpbmdBd3ModGhpcy5hc3NldFNka1Byb3ZpZGVyLCBlbnYpLFxuICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcjogbmV3IFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MocHJlZml4LCB7IGlvSG9zdDogdGhpcy5pb0hvc3QsIGFjdGlvbjogdGhpcy5hY3Rpb24gfSksXG4gICAgfSk7XG4gICAgdGhpcy5wdWJsaXNoZXJDYWNoZS5zZXQoYXNzZXRNYW5pZmVzdCwgcHVibGlzaGVyKTtcbiAgICByZXR1cm4gcHVibGlzaGVyO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXQgcHJvZ3Jlc3MgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggcGVyY2VudGFnZXMgKGN1cnJlbnRseSlcbiAqL1xuY2xhc3MgUGFyYWxsZWxTYWZlQXNzZXRQcm9ncmVzcyBleHRlbmRzIEJhc2VQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJlZml4OiBzdHJpbmcsIHsgaW9Ib3N0LCBhY3Rpb24gfTogSW9NZXNzYWdpbmcpIHtcbiAgICBzdXBlcih7IGlvSG9zdCwgYWN0aW9uIH0pO1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UodHlwZTogY2RrX2Fzc2V0cy5FdmVudFR5cGUsIGV2ZW50OiBjZGtfYXNzZXRzLklQdWJsaXNoUHJvZ3Jlc3MpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0ke3R5cGV9OiAke2V2ZW50Lm1lc3NhZ2V9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWZmaXhXaXRoRXJyb3JzKG1zZzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwID8gYCR7bXNnfTogJHtlcnJvcnMuam9pbignLCAnKX1gIDogbXNnO1xufVxuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFFcEMseUNBQXlDO0FBQ3pDLCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHFDQUFxRTtBQUNyRSxxREFPMEI7QUFDMUIsaURBQTJEO0FBRzNELGlFQUlnQztBQUVoQyxpREFBaUQ7QUFDakQsK0NBQW1EO0FBQ25ELHFDQUFnRDtBQUVoRCxnREFBOEU7QUFFOUUsa0RBQXlGO0FBRXpGLGtEQUE2RDtBQUM3RCw2RUFBb0U7QUFFcEUsTUFBTSxvQ0FBb0MsR0FBRyxFQUFFLENBQUM7QUF1UWhEOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVc7SUE2QnRCLFlBQTZCLEtBQXVCOztRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQU5uQyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUF3RCxDQUFDO1FBT2hHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksK0JBQWlCLENBQy9CLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLE1BQUEsS0FBSyxDQUFDLGdCQUFnQixtQ0FBSSx5Q0FBMEIsRUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQXdDO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLG1DQUFtQyxDQUM5QyxpQkFBb0QsRUFDcEQsNEJBQXFDLEtBQUs7UUFFMUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUUsT0FBTyxJQUFBLDBEQUFtQyxFQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLGFBQWdEO1FBQy9FLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBQSxnQkFBSyxFQUFDLHVDQUF1QyxhQUFhLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxPQUFPLElBQUEsMENBQW1CLEVBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUN0QyxhQUFnRDs7UUFFaEQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGdCQUFLLEVBQUMseUNBQXlDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekcsMkZBQTJGO1FBQzNGLGtHQUFrRztRQUNsRyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVyQyxNQUFNLElBQUEsMENBQXlCLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXJELDhEQUE4RDtRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLDZDQUFvQixFQUFFLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDJDQUFpQixFQUN0QyxhQUFhLEVBQ2IsR0FBRyxDQUFDLG1CQUFtQixFQUN2QixPQUFPLEVBQ1AsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpCLHdGQUF3RjtRQUN4RixtQkFBbUI7UUFDbkIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBQ3ZFLEtBQUssRUFBRSxhQUFhO2FBQ3JCLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBQ2hELEtBQUssRUFBRSxhQUFhO2FBQ3JCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGdCQUFLLEVBQUMsMEVBQTBFLENBQUMsQ0FBQyxDQUFDO1FBQ2hILENBQUM7UUFDRCxPQUFPLE1BQUEsUUFBUSxDQUFDLDJCQUEyQixtQ0FBSSxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBMkI7O1FBQ2xELElBQUksZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLG9CQUFZLENBQ3BCLGlHQUFpRyxDQUNsRyxDQUFDO1lBQ0osQ0FBQztZQUNELGdCQUFnQixHQUFHO2dCQUNqQixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO2dCQUNwQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87YUFDekIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhGLG1EQUFtRDtRQUNuRCxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQy9DLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQUEsT0FBTyxDQUFDLE9BQU8sbUNBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRXhILE9BQU8sSUFBQSwwQkFBVyxFQUFDO1lBQ2pCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO1lBQzVDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ3hDLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLFlBQVksRUFBRSxHQUFHLENBQUMsU0FBUztZQUMzQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsZ0JBQWdCO1lBQ2hCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIscUJBQXFCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQjtZQUNwRCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyx3QkFBd0I7WUFDMUQsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1lBQ3RDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7WUFDNUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZQUMxQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1NBQzNDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQTZCOztRQUN0RCxJQUFJLGVBQWUsR0FBYSxNQUFBLE9BQU8sQ0FBQyxnQkFBZ0IsbUNBQUksRUFBRSxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxvQkFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEYsSUFBSSxNQUFBLE9BQU8sQ0FBQyw2QkFBNkIsbUNBQUksSUFBSSxFQUFFLENBQUM7WUFDbEQsbURBQW1EO1lBQ25ELE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDdkIsb0NBQW9DLEVBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQy9DLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUUzQyxvRkFBb0Y7UUFDcEYsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLG1CQUFtQixHQUFHLE1BQU0sb0NBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUU1RSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQUEsT0FBTyxDQUFDLE9BQU8sbUNBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBRXhILFFBQVEsbUJBQW1CLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2RCxLQUFLLDZCQUFjLENBQUMsSUFBSTtvQkFDdEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUksRUFBQyxTQUFTLFVBQVUsOEJBQThCLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDckgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDO2dCQUUxQyxLQUFLLDZCQUFjLENBQUMsY0FBYztvQkFDaEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGdCQUFLLEVBQUMsZ0NBQWdDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDaEYsTUFBTSxHQUFHLENBQUMsYUFBYSxDQUFDO3dCQUN0QixTQUFTLEVBQUUsVUFBVTt3QkFDckIsT0FBTyxFQUFFLGdCQUFnQjt3QkFDekIsa0JBQWtCLEVBQUUsSUFBQSxtQkFBVSxHQUFFO3dCQUNoQyw2SEFBNkg7d0JBQzdILG9CQUFvQixFQUFFLElBQUk7cUJBQzNCLENBQUMsQ0FBQztvQkFDSCxNQUFNO2dCQUVSLEtBQUssNkJBQWMsQ0FBQyx3QkFBd0I7b0JBQzFDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNsQiw0RUFBNEU7d0JBQzVFLDRHQUE0Rzt3QkFDNUcseUNBQXlDO3dCQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFnQixDQUFDLEdBQUcsRUFBRTs0QkFDdkMsU0FBUyxFQUFFLFVBQVU7NEJBQ3JCLGFBQWEsRUFBRSxDQUFDLHNCQUFzQixFQUFFLDZCQUE2QixDQUFDO3lCQUN2RSxDQUFDLENBQUM7d0JBQ0gsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3BCLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYzs2QkFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7NkJBQ3RFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQUMsT0FBQSxNQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLG1DQUFJLEVBQUUsQ0FBQSxFQUFBLENBQUMsQ0FBQztvQkFDakQsQ0FBQztvQkFFRCxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSSxFQUFDLGdDQUFnQyxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNqRyxNQUFNLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDL0IsU0FBUyxFQUFFLFVBQVU7d0JBQ3JCLGtCQUFrQixFQUFFLElBQUEsbUJBQVUsR0FBRTt3QkFDaEMsT0FBTyxFQUFFLGdCQUFnQjt3QkFDekIsZUFBZSxFQUFFLGVBQWU7cUJBQ2pDLENBQUMsQ0FBQztvQkFDSCxNQUFNO2dCQUVSLEtBQUssNkJBQWMsQ0FBQyxlQUFlO29CQUNqQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSSxFQUM3QixTQUFTLFVBQVUsdUhBQXVILENBQzNJLENBQUMsQ0FBQztvQkFDSCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBRTFDO29CQUNFLE1BQU0sSUFBSSxvQkFBWSxDQUFDLCtCQUErQixtQkFBbUIsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQ0FBb0IsQ0FBQztnQkFDdkMsR0FBRztnQkFDSCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdEIsSUFBSSxpQkFBaUIsR0FBdUIsU0FBUyxDQUFDO1lBQ3RELElBQUksZUFBZSxHQUFHLG1CQUFtQixDQUFDO1lBQzFDLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsK0JBQWMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFMUUscUVBQXFFO2dCQUNyRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sSUFBSSxvQkFBWSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7Z0JBQ3RHLENBQUM7Z0JBQ0QsZUFBZSxHQUFHLFlBQVksQ0FBQztnQkFFL0IsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsaUJBQWlCLEdBQUcsTUFBTSxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLElBQUEseUJBQWtCLEVBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBRUQsSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzQixDQUFDO1lBRUQsNEZBQTRGO1lBQzVGLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEtBQUssNkJBQWMsQ0FBQyx3QkFBd0IsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVHLDBCQUEwQjtnQkFDMUIsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLElBQUksb0JBQVksQ0FDcEIsR0FBRyxpQkFBaUIsK0VBQStFLENBQ3BHLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxJQUFJLG9CQUFZLENBQ3BCLHNMQUFzTCxDQUN2TCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBNEI7O1FBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFBLE9BQU8sQ0FBQyxPQUFPLG1DQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUV4SCxPQUFPLElBQUEsMkJBQVksRUFBQztZQUNsQixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7U0FDL0IsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBMkI7O1FBQ2xELElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxvQ0FBbUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFBLE9BQU8sQ0FBQyxVQUFVLG1DQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEgsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxtQ0FBbUM7SUFDNUIsS0FBSyxDQUFDLGdCQUFnQixDQUMzQixhQUFvRSxFQUNwRSxhQUF1QyxFQUN2QyxLQUFnQyxFQUNoQyxPQUFnQztRQUVoQyxJQUFJLGFBQWEsS0FBSyx1QkFBdUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakYsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUN2QixhQUFhLENBQUMsNkJBQTZCLEVBQzNDLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDL0MsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksb0JBQVksQ0FBQyx5QkFBeUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsYUFBdUMsRUFDdkMsS0FBZ0MsRUFDaEMsT0FBa0M7UUFFbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4RSxnRUFBZ0U7UUFDaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRixNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ2xDLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbkYsS0FBSyxFQUFFLE9BQU8sQ0FBQyxZQUFZO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxvQkFBWSxDQUFDLDJCQUEyQixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxLQUF3QztRQUMzRixJQUFJLElBQUksQ0FBQyxpQ0FBaUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLE1BQU0sSUFBQSxrREFBeUMsRUFBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsc0JBQXNCLENBQ2pDLGFBQXVDLEVBQ3ZDLEtBQWdDLEVBQ2hDLE9BQWtDO1FBRWxDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRixPQUFPLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyw2QkFBNkIsQ0FDekMsU0FBaUIsRUFDakIsNkJBQWlELEVBQ2pELGlDQUFxRCxFQUNyRCxZQUFrQztRQUVsQyxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksQ0FBQyxlQUFlLENBQUMsNkJBQTZCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUN2RyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksb0JBQVksQ0FBQyxHQUFHLFNBQVMsS0FBSyxJQUFBLHlCQUFrQixFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxhQUF1QyxFQUFFLEdBQXNCLEVBQUUsU0FBa0I7UUFDekcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRTtZQUM5RCw2RUFBNkU7WUFDN0Usa0NBQWtDO1lBQ2xDLEdBQUcsRUFBRSxJQUFJLGdDQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQztZQUNsRCxnQkFBZ0IsRUFBRSxJQUFJLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUF0WkQsa0NBc1pDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLHlCQUEwQixTQUFRLDhDQUEyQjtJQUdqRSxZQUFZLE1BQWMsRUFBRSxRQUFrQjtRQUM1QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVTLFVBQVUsQ0FBQyxJQUEwQixFQUFFLEtBQWtDO1FBQ2pGLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUI7SUFDdEQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjZGtfYXNzZXRzIGZyb20gJ2Nkay1hc3NldHMnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQXNzZXRNYW5pZmVzdEJ1aWxkZXIgfSBmcm9tICcuL2Fzc2V0LW1hbmlmZXN0LWJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgQmFzZVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyLFxuICBQdWJsaXNoaW5nQXdzLFxufSBmcm9tICcuL2Fzc2V0LXB1Ymxpc2hpbmcnO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgfSBmcm9tICcuL2NoZWNrcyc7XG5pbXBvcnQge1xuICBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICB0eXBlIFJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyxcbiAgUmVzb3VyY2VzVG9JbXBvcnQsXG4gIHN0YWJpbGl6ZVN0YWNrLFxuICBUZW1wbGF0ZSxcbiAgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyxcbn0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBkZXBsb3lTdGFjaywgZGVzdHJveVN0YWNrIH0gZnJvbSAnLi9kZXBsb3ktc3RhY2snO1xuaW1wb3J0IHsgRGVwbG95bWVudE1ldGhvZCB9IGZyb20gJy4vZGVwbG95bWVudC1tZXRob2QnO1xuaW1wb3J0IHsgRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuL2RlcGxveW1lbnQtcmVzdWx0JztcbmltcG9ydCB7XG4gIGxvYWRDdXJyZW50VGVtcGxhdGUsXG4gIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxuICB0eXBlIFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MsXG59IGZyb20gJy4vbmVzdGVkLXN0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgSW9IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBkZWJ1Zywgd2FybiB9IGZyb20gJy4uLy4uL2NsaS9tZXNzYWdlcyc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L2Vycm9yJztcbmltcG9ydCB7IGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTZGtQcm92aWRlciB9IGZyb20gJy4uL2F3cy1hdXRoL3Nkay1wcm92aWRlcic7XG5pbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UmVzb3VyY2VzLCBFbnZpcm9ubWVudEFjY2VzcyB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEhvdHN3YXBNb2RlLCBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMgfSBmcm9tICcuLi9ob3Rzd2FwL2NvbW1vbic7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5TW9uaXRvciwgU3RhY2tFdmVudFBvbGxlciwgUm9sbGJhY2tDaG9pY2UgfSBmcm9tICcuLi9zdGFjay1ldmVudHMnO1xuaW1wb3J0IHR5cGUgeyBUYWcgfSBmcm9tICcuLi90YWdzJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FIH0gZnJvbSAnLi4vdG9vbGtpdC1pbmZvJztcbmltcG9ydCB7IG1ha2VCb2R5UGFyYW1ldGVyIH0gZnJvbSAnLi4vdXRpbC90ZW1wbGF0ZS1ib2R5LXBhcmFtZXRlcic7XG5cbmNvbnN0IEJPT1RTVFJBUF9TVEFDS19WRVJTSU9OX0ZPUl9ST0xMQkFDSyA9IDIzO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayB0byBkZXBsb3lcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGZvciB0aGUgZGVwbG95bWVudCAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9waWMgQVJOcyB0byBzZW5kIGEgbWVzc2FnZSB3aGVuIGRlcGxveW1lbnQgZmluaXNoZXMgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG5hbWUgdW5kZXIgd2hpY2ggc3RhY2sgd2lsbCBiZSBkZXBsb3llZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSBhcnRpZmFjdCBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBkZXBsb3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrLCBpZiBub3QgdGhlIGRlZmF1bHQgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ0RLVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXNzZXQgSURzIHdoaWNoIHNob3VsZCBOT1QgYmUgYnVpbHQgb3IgdXBsb2FkZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBCdWlsZCBhbGwgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSByZXVzZUFzc2V0cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFjayB0YWdzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogVGFnW107XG5cbiAgLyoqXG4gICAqIFN0YWdlIHRoZSBjaGFuZ2Ugc2V0IGJ1dCBkb24ndCBleGVjdXRlIGl0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgJ2RlcGxveW1lbnRNZXRob2QnIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBuYW1lIHRvIHVzZSBmb3IgdGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZSBzZXQuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSAnZGVwbG95bWVudE1ldGhvZCcgaW5zdGVhZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBkZXBsb3ltZW50IG1ldGhvZCAoZGlyZWN0IG9yIHVzaW5nIGEgY2hhbmdlIHNldClcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDaGFuZ2Ugc2V0IHdpdGggZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50TWV0aG9kPzogRGVwbG95bWVudE1ldGhvZDtcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCwgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2UgZGVwbG95bWVudCB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIHRlbXBsYXRlIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKlxuICAgKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSAnaG90c3dhcCcgZGVwbG95bWVudC5cbiAgICogQSAnaG90c3dhcCcgZGVwbG95bWVudCB3aWxsIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCBDbG91ZEZvcm1hdGlvblxuICAgKiBhbmQgdXBkYXRlIHRoZSBhZmZlY3RlZCByZXNvdXJjZXMgbGlrZSBMYW1iZGEgZnVuY3Rpb25zIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlRgIGZvciByZWd1bGFyIGRlcGxveW1lbnRzLCBgSG90c3dhcE1vZGUuSE9UU1dBUF9PTkxZYCBmb3IgJ3dhdGNoJyBkZXBsb3ltZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcD86IEhvdHN3YXBNb2RlO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0aWVzIHRoYXQgY29uZmlndXJlIGhvdHN3YXAgYmVoYXZpb3JcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcz86IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcztcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBleGlzdGluZyByZXNvdXJjZXMgdG8gYmUgSU1QT1JURUQgaW50byB0aGUgc3RhY2ssIGluc3RlYWQgb2YgYmVpbmcgQ1JFQVRFRFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzVG9JbXBvcnQ/OiBSZXNvdXJjZXNUb0ltcG9ydDtcblxuICAvKipcbiAgICogSWYgcHJlc2VudCwgdXNlIHRoaXMgZ2l2ZW4gdGVtcGxhdGUgaW5zdGVhZCBvZiB0aGUgc3RvcmVkIG9uZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSB0aGUgc3RvcmVkIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVRlbXBsYXRlPzogYW55O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGJ1aWxkL3B1Ymxpc2ggYXNzZXRzIGluIHBhcmFsbGVsXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWUgVG8gcmVtYWluIGJhY2t3YXJkIGNvbXBhdGlibGUuXG4gICAqL1xuICByZWFkb25seSBhc3NldFBhcmFsbGVsaXNtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZXBsb3kgaWYgdGhlIGFwcCBjb250YWlucyBubyBzdGFja3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpZ25vcmVOb1N0YWNrcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sbGJhY2tTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gcm9sbCBiYWNrXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvbid0IHNob3cgc3RhY2sgZGVwbG95bWVudCBldmVudHMsIGp1c3Qgd2FpdFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGFyZSBvbiBhIENJIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrLCBpZiBub3QgdGhlIGRlZmF1bHQgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ0RLVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgYSByb2xsYmFjayBvciBub3RcbiAgICpcbiAgICogRm9yY2luZyBhIHJvbGxiYWNrIHdpbGwgb3JwaGFuIGFsbCB1bmRlbGV0YWJsZSByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ycGhhbiB0aGUgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIGxvZ2ljYWwgSURzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gb3JwaGFuaW5nXG4gICAqL1xuICByZWFkb25seSBvcnBoYW5Mb2dpY2FsSWRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIHZlcnNpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sbGJhY2tTdGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IG5vdEluUm9sbGJhY2thYmxlU3RhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdWNjZXNzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayB3aXRoIGFzc2V0cyB0byBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGZvciB0aGUgYnVpbGRpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIG5hbWUgdGhpcyBhc3NldCBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFB1Ymxpc2hTdGFja0Fzc2V0c09wdGlvbnMgZXh0ZW5kcyBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgbmFtZSB0aGlzIGFzc2V0IGlzIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgcHVibGlzaCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VQdWJsaXNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95U3RhY2tPcHRpb25zIHtcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgcm9sZUFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0V4aXN0c09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICB0cnlMb29rdXBSb2xlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50c1Byb3BzIHtcbiAgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG59XG5cbi8qKlxuICogU2NvcGUgZm9yIGEgc2luZ2xlIHNldCBvZiBkZXBsb3ltZW50cyBmcm9tIGEgc2V0IG9mIENsb3VkIEFzc2VtYmx5IEFydGlmYWN0c1xuICpcbiAqIE1hbmFnZXMgbG9va3VwIG9mIFNES3MsIEJvb3RzdHJhcCBzdGFja3MsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRzIHtcbiAgcHVibGljIHJlYWRvbmx5IGVudnM6IEVudmlyb25tZW50QWNjZXNzO1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgZm9yIGFzc2V0IHB1Ymxpc2hpbmcgKGRvIG5vdCB1c2UgZm9yIGFueXRoaW5nIGVsc2UpLlxuICAgKlxuICAgKiBUaGlzIFNESyBwcm92aWRlciBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLCBub3RoaW5nIGVsc2UuXG4gICAqXG4gICAqIEl0J3Mgbm90IGEgZGlmZmVyZW50IG9iamVjdCwgYnV0IHRoZSBmaWVsZCBuYW1lIHNob3VsZCBpbXBseSB0aGF0IHRoaXNcbiAgICogb2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgZXhjZXB0IHRvIHBhc3MgdG8gYXNzZXQgaGFuZGxpbmcgcm91dGluZXMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0U2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgZm9yIHBhc3NpbmcgdG8gZGVwbG95U3RhY2tcbiAgICpcbiAgICogVGhpcyBTREsgcHJvdmlkZXIgaXMgb25seSBhbGxvd2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQgcHVycG9zZSwgbm90aGluZyBlbHNlLlxuICAgKlxuICAgKiBJdCdzIG5vdCBhIGRpZmZlcmVudCBvYmplY3QsIGJ1dCB0aGUgZmllbGQgbmFtZSBzaG91bGQgaW1wbHkgdGhhdCB0aGlzXG4gICAqIG9iamVjdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGV4Y2VwdCB0byBwYXNzIHRvIGBkZXBsb3lTdGFja2AuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveVN0YWNrU2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGVyQ2FjaGUgPSBuZXcgTWFwPGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCwgY2RrX2Fzc2V0cy5Bc3NldFB1Ymxpc2hpbmc+KCk7XG5cbiAgcHJpdmF0ZSBfYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogRGVwbG95bWVudHNQcm9wcykge1xuICAgIHRoaXMuYXNzZXRTZGtQcm92aWRlciA9IHByb3BzLnNka1Byb3ZpZGVyO1xuICAgIHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlciA9IHByb3BzLnNka1Byb3ZpZGVyO1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5pb0hlbHBlcjtcbiAgICB0aGlzLmVudnMgPSBuZXcgRW52aXJvbm1lbnRBY2Nlc3MoXG4gICAgICBwcm9wcy5zZGtQcm92aWRlcixcbiAgICAgIHByb3BzLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsXG4gICAgICB0aGlzLmlvSGVscGVyLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVudmlyb25tZW50IGZvciBhIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc29sdmVFbnZpcm9ubWVudChzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxjeGFwaS5FbnZpcm9ubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQoc3RhY2spO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKFxuICAgIHJvb3RTdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICAgcmV0cmlldmVQcm9jZXNzZWRUZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBQcm9taXNlPFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3M+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHJvb3RTdGFja0FydGlmYWN0KTtcbiAgICByZXR1cm4gbG9hZEN1cnJlbnRUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3Mocm9vdFN0YWNrQXJ0aWZhY3QsIGVudi5zZGssIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBSZWFkaW5nIGV4aXN0aW5nIHRlbXBsYXRlIGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApKTtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QsIGVudi5zZGspO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyhcbiAgICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYFJldHJpZXZpbmcgdGVtcGxhdGUgc3VtbWFyeSBmb3Igc3RhY2sgJHtzdGFja0FydGlmYWN0LmRpc3BsYXlOYW1lfS5gKSk7XG4gICAgLy8gQ3VycmVudGx5LCBuZWVkcyB0byB1c2UgYGRlcGxveS1yb2xlYCBzaW5jZSBpdCBtYXkgbmVlZCB0byByZWFkIHRlbXBsYXRlcyBpbiB0aGUgc3RhZ2luZ1xuICAgIC8vIGJ1Y2tldCB3aGljaCBoYXZlIGJlZW4gZW5jcnlwdGVkIHdpdGggYSBLTVMga2V5IChhbmQgbG9va3VwLXJvbGUgbWF5IG5vdCByZWFkIGVuY3J5cHRlZCB0aGluZ3MpXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2tBcnRpZmFjdCk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgYXdhaXQgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyhzdGFja0FydGlmYWN0LCB0aGlzKTtcblxuICAgIC8vIFVwbG9hZCB0aGUgdGVtcGxhdGUsIGlmIG5lY2Vzc2FyeSwgYmVmb3JlIHBhc3NpbmcgaXQgdG8gQ0ZOXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICAgIGNvbnN0IGNmblBhcmFtID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgICBzdGFja0FydGlmYWN0LFxuICAgICAgZW52LnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBidWlsZGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICAvLyBJZiB0aGUgYG1ha2VCb2R5UGFyYW1ldGVyYCBiZWZvcmUgdGhpcyBhZGRlZCBhc3NldHMsIG1ha2Ugc3VyZSB0byBwdWJsaXNoIHRoZW0gYmVmb3JlXG4gICAgLy8gY2FsbGluZyB0aGUgQVBJLlxuICAgIGNvbnN0IGFkZGVkQXNzZXRzID0gYnVpbGRlci50b01hbmlmZXN0KHN0YWNrQXJ0aWZhY3QuYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFkZGVkQXNzZXRzLmVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRTaW5nbGVBc3NldCgnbm8tdmVyc2lvbi12YWxpZGF0aW9uJywgYWRkZWRBc3NldHMsIGVudHJ5LCB7XG4gICAgICAgIHN0YWNrOiBzdGFja0FydGlmYWN0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnB1Ymxpc2hTaW5nbGVBc3NldChhZGRlZEFzc2V0cywgZW50cnksIHtcbiAgICAgICAgc3RhY2s6IHN0YWNrQXJ0aWZhY3QsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZVN1bW1hcnkoY2ZuUGFyYW0pO1xuICAgIGlmICghcmVzcG9uc2UuUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZygnR2V0VGVtcGxhdGVTdW1tYXJ5IEFQSSBjYWxsIGRpZCBub3QgcmV0dXJuIFwiUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzXCInKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGxldCBkZXBsb3ltZW50TWV0aG9kID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kO1xuICAgIGlmIChvcHRpb25zLmNoYW5nZVNldE5hbWUgfHwgb3B0aW9ucy5leGVjdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZXBsb3ltZW50TWV0aG9kKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgXCJZb3UgY2Fubm90IHN1cHBseSBib3RoICdkZXBsb3ltZW50TWV0aG9kJyBhbmQgJ2NoYW5nZVNldE5hbWUvZXhlY3V0ZScuIFN1cHBseSBvbmUgb3IgdGhlIG90aGVyLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVwbG95bWVudE1ldGhvZCA9IHtcbiAgICAgICAgbWV0aG9kOiAnY2hhbmdlLXNldCcsXG4gICAgICAgIGNoYW5nZVNldE5hbWU6IG9wdGlvbnMuY2hhbmdlU2V0TmFtZSxcbiAgICAgICAgZXhlY3V0ZTogb3B0aW9ucy5leGVjdXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuXG4gICAgLy8gRG8gYSB2ZXJpZmljYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgb3B0aW9ucy5zdGFjay5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQ6IGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2QsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICAgIGhvdHN3YXA6IG9wdGlvbnMuaG90c3dhcCxcbiAgICAgIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogb3B0aW9ucy5ob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4gICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgIHJlc291cmNlc1RvSW1wb3J0OiBvcHRpb25zLnJlc291cmNlc1RvSW1wb3J0LFxuICAgICAgb3ZlcnJpZGVUZW1wbGF0ZTogb3B0aW9ucy5vdmVycmlkZVRlbXBsYXRlLFxuICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgIH0sIHRoaXMuaW9IZWxwZXIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJvbGxiYWNrU3RhY2sob3B0aW9uczogUm9sbGJhY2tTdGFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrU3RhY2tSZXN1bHQ+IHtcbiAgICBsZXQgcmVzb3VyY2VzVG9Ta2lwOiBzdHJpbmdbXSA9IG9wdGlvbnMub3JwaGFuTG9naWNhbElkcyA/PyBbXTtcbiAgICBpZiAob3B0aW9ucy5mb3JjZSAmJiByZXNvdXJjZXNUb1NraXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ2Fubm90IGNvbWJpbmUgLS1mb3JjZSB3aXRoIC0tb3JwaGFuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcblxuICAgIGlmIChvcHRpb25zLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uID8/IHRydWUpIHtcbiAgICAgIC8vIERvIGEgdmVyaWZpY2F0aW9uIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIEJPT1RTVFJBUF9TVEFDS19WRVJTSU9OX0ZPUl9ST0xMQkFDSyxcbiAgICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICAgIGVudi5yZXNvdXJjZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICBjb25zdCBkZXBsb3lOYW1lID0gb3B0aW9ucy5zdGFjay5zdGFja05hbWU7XG5cbiAgICAvLyBXZSBsb29wIGluIGNhc2Ugb2YgYC0tZm9yY2VgIGFuZCB0aGUgc3RhY2sgZW5kcyB1cCBpbiBgQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLYC5cbiAgICBsZXQgbWF4TG9vcHMgPSAxMDtcbiAgICB3aGlsZSAobWF4TG9vcHMtLSkge1xuICAgICAgbGV0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgICAgc3dpdGNoIChjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLnJvbGxiYWNrQ2hvaWNlKSB7XG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuTk9ORTpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeSh3YXJuKGBTdGFjayAke2RlcGxveU5hbWV9IGRvZXMgbm90IG5lZWQgYSByb2xsYmFjazogJHtjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzfWApKTtcbiAgICAgICAgICByZXR1cm4geyBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgSW5pdGlhdGluZyByb2xsYmFjayBvZiBzdGFjayAke2RlcGxveU5hbWV9YCkpO1xuICAgICAgICAgIGF3YWl0IGNmbi5yb2xsYmFja1N0YWNrKHtcbiAgICAgICAgICAgIFN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgIFJvbGVBUk46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIC8vIEVuYWJsaW5nIHRoaXMgaXMganVzdCB0aGUgYmV0dGVyIG92ZXJhbGwgZGVmYXVsdCwgdGhlIG9ubHkgcmVhc29uIGl0IGlzbid0IHRoZSB1cHN0cmVhbSBkZWZhdWx0IGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBSZXRhaW5FeGNlcHRPbkNyZWF0ZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSzpcbiAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgZmFpbGVkIHJlc291cmNlcyBmcm9tIHRoZSBkZXBsb3ltZW50IGFuZCBhdXRvbWF0aWNhbGx5IHNraXAgdGhlbVxuICAgICAgICAgICAgLy8gKFVzaW5nIGRlcGxveW1lbnQgbG9nIGJlY2F1c2Ugd2UgZGVmaW5pdGVseSBoYXZlIGBEZXNjcmliZVN0YWNrRXZlbnRzYCBwZXJtaXNzaW9ucywgYW5kIHdlIG1pZ2h0IG5vdCBoYXZlXG4gICAgICAgICAgICAvLyBgRGVzY3JpYmVTdGFja1Jlc291cmNlc2AgcGVybWlzc2lvbnMpLlxuICAgICAgICAgICAgY29uc3QgcG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICAgICAgICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgICAgc3RhY2tTdGF0dXNlczogWydST0xMQkFDS19JTl9QUk9HUkVTUycsICdVUERBVEVfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgICAgICAgIHJlc291cmNlc1RvU2tpcCA9IHBvbGxlci5yZXNvdXJjZUVycm9yc1xuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiAhci5pc1N0YWNrRXZlbnQgJiYgci5wYXJlbnRTdGFja0xvZ2ljYWxJZHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAubWFwKChyKSA9PiByLmV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBza2lwRGVzY3JpcHRpb24gPSByZXNvdXJjZXNUb1NraXAubGVuZ3RoID4gMCA/IGAgKG9ycGhhbmluZzogJHtyZXNvdXJjZXNUb1NraXAuam9pbignLCAnKX0pYCA6ICcnO1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KHdhcm4oYENvbnRpbnVpbmcgcm9sbGJhY2sgb2Ygc3RhY2sgJHtkZXBsb3lOYW1lfSR7c2tpcERlc2NyaXB0aW9ufWApKTtcbiAgICAgICAgICBhd2FpdCBjZm4uY29udGludWVVcGRhdGVSb2xsYmFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIFJvbGVBUk46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICAgICAgICBSZXNvdXJjZXNUb1NraXA6IHJlc291cmNlc1RvU2tpcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLlJPTExCQUNLX0ZBSUxFRDpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeSh3YXJuKFxuICAgICAgICAgICAgYFN0YWNrICR7ZGVwbG95TmFtZX0gZmFpbGVkIGNyZWF0aW9uIGFuZCByb2xsYmFjay4gVGhpcyBzdGF0ZSBjYW5ub3QgYmUgcm9sbGVkIGJhY2suIFlvdSBjYW4gcmVjcmVhdGUgdGhpcyBzdGFjayBieSBydW5uaW5nICdjZGsgZGVwbG95Jy5gLFxuICAgICAgICAgICkpO1xuICAgICAgICAgIHJldHVybiB7IG5vdEluUm9sbGJhY2thYmxlU3RhdGU6IHRydWUgfTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFVuZXhwZWN0ZWQgcm9sbGJhY2sgY2hvaWNlOiAke2Nsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgU3RhY2tBY3Rpdml0eU1vbml0b3Ioe1xuICAgICAgICBjZm4sXG4gICAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgICBzdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgIGlvSGVscGVyOiB0aGlzLmlvSGVscGVyLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBtb25pdG9yLnN0YXJ0KCk7XG5cbiAgICAgIGxldCBzdGFja0Vycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGZpbmFsU3RhY2tTdGF0ZSA9IGNsb3VkRm9ybWF0aW9uU3RhY2s7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWNjZXNzU3RhY2sgPSBhd2FpdCBzdGFiaWxpemVTdGFjayhjZm4sIHRoaXMuaW9IZWxwZXIsIGRlcGxveU5hbWUpO1xuXG4gICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4sIGJ1dCBjYXRjaCBpdCBhbnl3YXkuIFlvdSBuZXZlciBrbm93LlxuICAgICAgICBpZiAoIXN1Y2Nlc3NTdGFjaykge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1N0YWNrIGRlcGxveSBmYWlsZWQgKHRoZSBzdGFjayBkaXNhcHBlYXJlZCB3aGlsZSB3ZSB3ZXJlIHJvbGxpbmcgaXQgYmFjayknKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFN0YWNrU3RhdGUgPSBzdWNjZXNzU3RhY2s7XG5cbiAgICAgICAgY29uc3QgZXJyb3JzID0gbW9uaXRvci5lcnJvcnMuam9pbignLCAnKTtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgbW9uaXRvci5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMuaXNSb2xsYmFja1N1Y2Nlc3MgfHwgIXN0YWNrRXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRWl0aGVyIHdlIG5lZWQgdG8gaWdub3JlIHNvbWUgcmVzb3VyY2VzIHRvIGNvbnRpbnVlIHRoZSByb2xsYmFjaywgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UgPT09IFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSyAmJiBvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgIC8vIERvIGFub3RoZXIgbG9vcC1kZS1sb29wXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICBgJHtzdGFja0Vycm9yTWVzc2FnZX0gKGZpeCBwcm9ibGVtIGFuZCByZXRyeSwgb3Igb3JwaGFuIHRoZXNlIHJlc291cmNlcyB1c2luZyAtLW9ycGhhbiBvciAtLWZvcmNlKWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgXCJSb2xsYmFjayBkaWQgbm90IGZpbmlzaCBhZnRlciBhIGxhcmdlIG51bWJlciBvZiBpdGVyYXRpb25zOyBzdG9wcGluZyBiZWNhdXNlIGl0IGxvb2tzIGxpa2Ugd2UncmUgbm90IG1ha2luZyBwcm9ncmVzcyBhbnltb3JlLiBZb3UgY2FuIHJldHJ5IGlmIHJvbGxiYWNrIHdhcyBwcm9ncmVzc2luZyBhcyBleHBlY3RlZC5cIixcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3lTdGFjayhvcHRpb25zOiBEZXN0cm95U3RhY2tPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXN0cm95U3RhY2soe1xuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgcm9sZUFybjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgIH0sIHRoaXMuaW9IZWxwZXIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YWNrRXhpc3RzKG9wdGlvbnM6IFN0YWNrRXhpc3RzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBlbnY7XG4gICAgaWYgKG9wdGlvbnMudHJ5TG9va3VwUm9sZSkge1xuICAgICAgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTG9va3VwQmVzdEVmZm9ydChvcHRpb25zLnN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgfVxuICAgIGNvbnN0IHN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoZW52LnNkay5jbG91ZEZvcm1hdGlvbigpLCBvcHRpb25zLmRlcGxveU5hbWUgPz8gb3B0aW9ucy5zdGFjay5zdGFja05hbWUpO1xuICAgIHJldHVybiBzdGFjay5leGlzdHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBzaW5nbGUgYXNzZXQgZnJvbSBhbiBhc3NldCBtYW5pZmVzdFxuICAgKlxuICAgKiBJZiBhbiBhc3NlcnQgbWFuaWZlc3QgYXJ0aWZhY3QgaXMgZ2l2ZW4sIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgKiB3aWxsIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnN0cmFpbnRzIGluIHRoYXQgbWFuaWZlc3QgYXJ0aWZhY3QuXG4gICAqIElmIHRoYXQgaXMgbm90IG5lY2Vzc2FyeSwgYCduby12ZXJzaW9uLXZhbGlkYXRpb24nYCBjYW4gYmUgcGFzc2VkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gYnVpbGQgYXNzZXQgJHthc3NldC5kaXNwbGF5TmFtZShmYWxzZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBzaW5nbGUgYXNzZXQgZnJvbSBhbiBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2hTaW5nbGVBc3NldChcbiAgICBhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsXG4gICAgYXNzZXQ6IGNka19hc3NldHMuSU1hbmlmZXN0RW50cnksXG4gICAgb3B0aW9uczogUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhY2tFbnYgPSBhd2FpdCB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQob3B0aW9ucy5zdGFjayk7XG5cbiAgICAvLyBObyBuZWVkIHRvIHZhbGlkYXRlIGFueW1vcmUsIHdlIGFscmVhZHkgZGlkIHRoYXQgZHVyaW5nIGJ1aWxkXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgc3RhY2tFbnYsIG9wdGlvbnMuc3RhY2tOYW1lKTtcbiAgICBhd2FpdCBwdWJsaXNoZXIucHVibGlzaEVudHJ5KGFzc2V0LCB7XG4gICAgICBhbGxvd0Nyb3NzQWNjb3VudDogYXdhaXQgdGhpcy5hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZ0ZvckVudihvcHRpb25zLnN0YWNrKSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlUHVibGlzaCxcbiAgICB9KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gcHVibGlzaCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKHRydWUpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmdGb3JFbnYoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgICB0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyA9IGF3YWl0IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nKGVudi5zZGssIHRoaXMuaW9IZWxwZXIsIHRoaXMucHJvcHMudG9vbGtpdFN0YWNrTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBhIHNpbmdsZSBhc3NldCBoYXMgYmVlbiBwdWJsaXNoZWQgYWxyZWFkeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlzU2luZ2xlQXNzZXRQdWJsaXNoZWQoXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IFB1Ymxpc2hTdGFja0Fzc2V0c09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuICAgIGNvbnN0IHB1Ymxpc2hlciA9IHRoaXMuY2FjaGVkUHVibGlzaGVyKGFzc2V0TWFuaWZlc3QsIHN0YWNrRW52LCBvcHRpb25zLnN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlci5pc0VudHJ5UHVibGlzaGVkKGFzc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBib290c3RyYXAgc3RhY2sgaGFzIHRoZSByaWdodCB2ZXJzaW9uIGZvciB0aGlzIHN0YWNrXG4gICAqXG4gICAqIENhbGwgaW50byBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uLCBidXQgcHJlcGVuZCB0aGUgc3RhY2sgbmFtZSBpbiBjYXNlIG9mIGZhaWx1cmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZW52UmVzb3VyY2VzOiBFbnZpcm9ubWVudFJlc291cmNlcyxcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudlJlc291cmNlcy52YWxpZGF0ZVZlcnNpb24ocmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGAke3N0YWNrTmFtZX06ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVkUHVibGlzaGVyKGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCwgZW52OiBjeGFwaS5FbnZpcm9ubWVudCwgc3RhY2tOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnB1Ymxpc2hlckNhY2hlLmdldChhc3NldE1hbmlmZXN0KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gc3RhY2tOYW1lID8gYCR7Y2hhbGsuYm9sZChzdGFja05hbWUpfTogYCA6ICcnO1xuICAgIGNvbnN0IHB1Ymxpc2hlciA9IG5ldyBjZGtfYXNzZXRzLkFzc2V0UHVibGlzaGluZyhhc3NldE1hbmlmZXN0LCB7XG4gICAgICAvLyBUaGUgQXNzZXRQdWJsaXNoaW5nIGNsYXNzIHRha2VzIGNhcmUgb2Ygcm9sZSBhc3N1bWluZyBldGMsIHNvIGl0J3Mgb2theSB0b1xuICAgICAgLy8gZ2l2ZSBpdCBhIGRpcmVjdCBgU2RrUHJvdmlkZXJgLlxuICAgICAgYXdzOiBuZXcgUHVibGlzaGluZ0F3cyh0aGlzLmFzc2V0U2RrUHJvdmlkZXIsIGVudiksXG4gICAgICBwcm9ncmVzc0xpc3RlbmVyOiBuZXcgUGFyYWxsZWxTYWZlQXNzZXRQcm9ncmVzcyhwcmVmaXgsIHRoaXMuaW9IZWxwZXIpLFxuICAgIH0pO1xuICAgIHRoaXMucHVibGlzaGVyQ2FjaGUuc2V0KGFzc2V0TWFuaWZlc3QsIHB1Ymxpc2hlcik7XG4gICAgcmV0dXJuIHB1Ymxpc2hlcjtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2V0IHByb2dyZXNzIHRoYXQgZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHBlcmNlbnRhZ2VzIChjdXJyZW50bHkpXG4gKi9cbmNsYXNzIFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MgZXh0ZW5kcyBCYXNlUHVibGlzaFByb2dyZXNzTGlzdGVuZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByZWZpeDogc3RyaW5nLCBpb0hlbHBlcjogSW9IZWxwZXIpIHtcbiAgICBzdXBlcihpb0hlbHBlcik7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TWVzc2FnZSh0eXBlOiBjZGtfYXNzZXRzLkV2ZW50VHlwZSwgZXZlbnQ6IGNka19hc3NldHMuSVB1Ymxpc2hQcm9ncmVzcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fSR7dHlwZX06ICR7ZXZlbnQubWVzc2FnZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1ZmZpeFdpdGhFcnJvcnMobXNnOiBzdHJpbmcsIGVycm9ycz86IHN0cmluZ1tdKSB7XG4gIHJldHVybiBlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDAgPyBgJHttc2d9OiAke2Vycm9ycy5qb2luKCcsICcpfWAgOiBtc2c7XG59XG4iXX0=
@@ -3,13 +3,13 @@ import type { SdkProvider } from '../aws-auth';
3
3
  import type { CloudFormationStack } from './cloudformation';
4
4
  import { HotswapMode, HotswapPropertyOverrides } from '../hotswap/common';
5
5
  import { SuccessfulDeployStackResult } from './deployment-result';
6
- import { IoMessaging } from '../../toolkit/cli-io-host';
6
+ import { IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
7
7
  /**
8
8
  * Perform a hotswap deployment, short-circuiting CloudFormation if possible.
9
9
  * If it's not possible to short-circuit the deployment
10
10
  * (because the CDK Stack contains changes that cannot be deployed without CloudFormation),
11
11
  * returns `undefined`.
12
12
  */
13
- export declare function tryHotswapDeployment(sdkProvider: SdkProvider, { ioHost, action }: IoMessaging, assetParams: {
13
+ export declare function tryHotswapDeployment(sdkProvider: SdkProvider, ioHelper: IoHelper, assetParams: {
14
14
  [key: string]: string;
15
15
  }, cloudFormationStack: CloudFormationStack, stackArtifact: cxapi.CloudFormationStackArtifact, hotswapMode: HotswapMode, hotswapPropertyOverrides: HotswapPropertyOverrides): Promise<SuccessfulDeployStackResult | undefined>;