aws-cdk 2.1003.0 → 2.1005.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 (150) hide show
  1. package/build-info.json +2 -2
  2. package/lib/api/aws-auth/account-cache.d.ts +1 -1
  3. package/lib/api/aws-auth/account-cache.js +1 -1
  4. package/lib/api/aws-auth/awscli-compatible.d.ts +1 -1
  5. package/lib/api/aws-auth/awscli-compatible.js +1 -1
  6. package/lib/api/aws-auth/credential-plugins.d.ts +1 -1
  7. package/lib/api/aws-auth/credential-plugins.js +1 -1
  8. package/lib/api/aws-auth/provider-caching.d.ts +1 -1
  9. package/lib/api/aws-auth/provider-caching.js +1 -1
  10. package/lib/api/aws-auth/sdk-logger.d.ts +4 -4
  11. package/lib/api/aws-auth/sdk-logger.js +5 -10
  12. package/lib/api/aws-auth/sdk-provider.d.ts +4 -4
  13. package/lib/api/aws-auth/sdk-provider.js +1 -1
  14. package/lib/api/aws-auth/sdk.d.ts +12 -12
  15. package/lib/api/aws-auth/sdk.js +1 -1
  16. package/lib/api/bootstrap/bootstrap-environment.d.ts +4 -4
  17. package/lib/api/bootstrap/bootstrap-environment.js +9 -9
  18. package/lib/api/bootstrap/bootstrap-props.d.ts +3 -3
  19. package/lib/api/bootstrap/bootstrap-props.js +1 -1
  20. package/lib/api/bootstrap/deploy-bootstrap.d.ts +7 -7
  21. package/lib/api/bootstrap/deploy-bootstrap.js +11 -11
  22. package/lib/api/bootstrap/legacy-template.d.ts +1 -1
  23. package/lib/api/bootstrap/legacy-template.js +1 -1
  24. package/lib/api/cxapp/cloud-assembly.d.ts +1 -16
  25. package/lib/api/cxapp/cloud-assembly.js +3 -3
  26. package/lib/api/cxapp/cloud-executable.d.ts +3 -3
  27. package/lib/api/cxapp/cloud-executable.js +1 -1
  28. package/lib/api/cxapp/environments.d.ts +3 -3
  29. package/lib/api/cxapp/environments.js +1 -1
  30. package/lib/api/cxapp/exec.d.ts +4 -4
  31. package/lib/api/cxapp/exec.js +1 -1
  32. package/lib/api/deployments/asset-publishing.d.ts +6 -6
  33. package/lib/api/deployments/asset-publishing.js +7 -8
  34. package/lib/api/deployments/assets.d.ts +4 -4
  35. package/lib/api/deployments/assets.js +9 -9
  36. package/lib/api/deployments/checks.d.ts +3 -3
  37. package/lib/api/deployments/checks.js +4 -4
  38. package/lib/api/deployments/cloudformation.d.ts +8 -8
  39. package/lib/api/deployments/cloudformation.js +27 -27
  40. package/lib/api/deployments/deploy-stack.d.ts +8 -8
  41. package/lib/api/deployments/deploy-stack.js +53 -56
  42. package/lib/api/deployments/deployments.d.ts +14 -10
  43. package/lib/api/deployments/deployments.js +22 -24
  44. package/lib/api/deployments/hotswap-deployments.d.ts +7 -5
  45. package/lib/api/deployments/hotswap-deployments.js +52 -27
  46. package/lib/api/environment/environment-access.d.ts +8 -9
  47. package/lib/api/environment/environment-access.js +6 -7
  48. package/lib/api/environment/environment-resources.d.ts +5 -5
  49. package/lib/api/environment/environment-resources.js +12 -12
  50. package/lib/api/evaluate-cloudformation-template.d.ts +7 -2
  51. package/lib/api/evaluate-cloudformation-template.js +11 -5
  52. package/lib/api/garbage-collection/garbage-collector.d.ts +6 -7
  53. package/lib/api/garbage-collection/garbage-collector.js +38 -39
  54. package/lib/api/garbage-collection/progress-printer.d.ts +4 -5
  55. package/lib/api/garbage-collection/progress-printer.js +5 -6
  56. package/lib/api/garbage-collection/stack-refresh.d.ts +4 -4
  57. package/lib/api/garbage-collection/stack-refresh.js +7 -7
  58. package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -2
  59. package/lib/api/hotswap/appsync-mapping-templates.js +8 -6
  60. package/lib/api/hotswap/code-build-projects.d.ts +3 -2
  61. package/lib/api/hotswap/code-build-projects.js +8 -6
  62. package/lib/api/hotswap/common.d.ts +45 -34
  63. package/lib/api/hotswap/common.js +2 -14
  64. package/lib/api/hotswap/ecs-services.d.ts +3 -2
  65. package/lib/api/hotswap/ecs-services.js +7 -5
  66. package/lib/api/hotswap/lambda-functions.d.ts +3 -2
  67. package/lib/api/hotswap/lambda-functions.js +47 -65
  68. package/lib/api/hotswap/s3-bucket-deployments.d.ts +4 -8
  69. package/lib/api/hotswap/s3-bucket-deployments.js +18 -17
  70. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -2
  71. package/lib/api/hotswap/stepfunctions-state-machines.js +8 -6
  72. package/lib/api/logs/find-cloudwatch-logs.d.ts +2 -2
  73. package/lib/api/logs/find-cloudwatch-logs.js +6 -7
  74. package/lib/api/logs/logs-monitor.d.ts +28 -5
  75. package/lib/api/logs/logs-monitor.js +51 -30
  76. package/lib/api/resource-import/importer.d.ts +6 -8
  77. package/lib/api/resource-import/importer.js +12 -13
  78. package/lib/api/resource-import/migrator.d.ts +5 -7
  79. package/lib/api/resource-import/migrator.js +7 -9
  80. package/lib/api/stack-events/stack-activity-monitor.d.ts +5 -64
  81. package/lib/api/stack-events/stack-activity-monitor.js +9 -30
  82. package/lib/api/stack-events/stack-progress-monitor.d.ts +2 -15
  83. package/lib/api/stack-events/stack-progress-monitor.js +1 -1
  84. package/lib/api/toolkit-info.d.ts +3 -3
  85. package/lib/api/toolkit-info.js +5 -5
  86. package/lib/api/util/template-body-parameter.d.ts +1 -1
  87. package/lib/api/util/template-body-parameter.js +1 -1
  88. package/lib/api/work-graph/work-graph-builder.d.ts +4 -5
  89. package/lib/api/work-graph/work-graph-builder.js +5 -6
  90. package/lib/api/work-graph/work-graph-types.d.ts +2 -2
  91. package/lib/api/work-graph/work-graph-types.js +1 -1
  92. package/lib/api/work-graph/work-graph.d.ts +4 -9
  93. package/lib/api/work-graph/work-graph.js +6 -7
  94. package/lib/cli/activity-printer/base.d.ts +5 -6
  95. package/lib/cli/activity-printer/base.js +6 -5
  96. package/lib/cli/activity-printer/current.d.ts +2 -1
  97. package/lib/cli/activity-printer/current.js +1 -1
  98. package/lib/cli/activity-printer/history.d.ts +3 -2
  99. package/lib/cli/activity-printer/history.js +1 -1
  100. package/lib/cli/cdk-toolkit.d.ts +7 -7
  101. package/lib/cli/cdk-toolkit.js +26 -22
  102. package/lib/cli/ci-systems.d.ts +29 -0
  103. package/lib/cli/ci-systems.js +62 -0
  104. package/lib/cli/cli.d.ts +1 -1
  105. package/lib/cli/cli.js +27 -8
  106. package/lib/cli/convert-to-user-input.js +1 -1
  107. package/lib/cli/messages.d.ts +11 -9
  108. package/lib/cli/messages.js +7 -14
  109. package/lib/cli/parse-command-line-arguments.js +1 -1
  110. package/lib/cli/user-configuration.js +1 -1
  111. package/lib/cli/user-input.js +1 -1
  112. package/lib/commands/context.d.ts +1 -1
  113. package/lib/commands/context.js +1 -1
  114. package/lib/commands/migrate.d.ts +1 -1
  115. package/lib/commands/migrate.js +1 -1
  116. package/lib/context-providers/ami.d.ts +1 -1
  117. package/lib/context-providers/ami.js +1 -1
  118. package/lib/context-providers/availability-zones.d.ts +1 -1
  119. package/lib/context-providers/availability-zones.js +1 -1
  120. package/lib/context-providers/cc-api-provider.d.ts +1 -1
  121. package/lib/context-providers/cc-api-provider.js +1 -1
  122. package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -1
  123. package/lib/context-providers/endpoint-service-availability-zones.js +1 -1
  124. package/lib/context-providers/hosted-zones.d.ts +2 -2
  125. package/lib/context-providers/hosted-zones.js +1 -1
  126. package/lib/context-providers/index.d.ts +3 -3
  127. package/lib/context-providers/index.js +1 -1
  128. package/lib/context-providers/keys.d.ts +1 -1
  129. package/lib/context-providers/keys.js +1 -1
  130. package/lib/context-providers/load-balancers.d.ts +3 -3
  131. package/lib/context-providers/load-balancers.js +1 -1
  132. package/lib/context-providers/ssm-parameters.d.ts +1 -1
  133. package/lib/context-providers/ssm-parameters.js +1 -1
  134. package/lib/context-providers/vpcs.d.ts +1 -1
  135. package/lib/context-providers/vpcs.js +1 -1
  136. package/lib/diff.d.ts +1 -1
  137. package/lib/diff.js +1 -1
  138. package/lib/index.js +8764 -7741
  139. package/lib/legacy-logging-source.js +1 -1
  140. package/lib/list-stacks.d.ts +2 -2
  141. package/lib/list-stacks.js +1 -1
  142. package/lib/logging.d.ts +6 -4
  143. package/lib/logging.js +37 -34
  144. package/lib/notices.d.ts +22 -18
  145. package/lib/notices.js +46 -46
  146. package/lib/toolkit/cli-io-host.d.ts +53 -126
  147. package/lib/toolkit/cli-io-host.js +77 -78
  148. package/lib/tree.d.ts +1 -1
  149. package/lib/tree.js +1 -1
  150. package/package.json +4 -12
@@ -10,7 +10,7 @@ const messages_1 = require("../../cli/messages");
10
10
  const error_1 = require("../../toolkit/error");
11
11
  const mode_1 = require("../plugin/mode");
12
12
  // Must use a require() otherwise esbuild complains
13
- // eslint-disable-next-line @typescript-eslint/no-require-imports
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/consistent-type-imports
14
14
  const pLimit = require('p-limit');
15
15
  exports.S3_ISOLATED_TAG = 'aws-cdk:isolated';
16
16
  exports.ECR_ISOLATED_TAG = 'aws-cdk.isolated'; // ':' is not valid in ECR tags
@@ -109,8 +109,7 @@ class GarbageCollector {
109
109
  constructor(props) {
110
110
  var _a, _b;
111
111
  this.props = props;
112
- this.ioHost = props.msg.ioHost;
113
- this.action = props.msg.action;
112
+ this.ioHelper = props.ioHelper;
114
113
  this.garbageCollectS3Assets = ['s3', 'all'].includes(props.type);
115
114
  this.garbageCollectEcrAssets = ['ecr', 'all'].includes(props.type);
116
115
  this.permissionToDelete = ['delete-tagged', 'full'].includes(props.action);
@@ -122,18 +121,18 @@ class GarbageCollector {
122
121
  * Perform garbage collection on the resolved environment.
123
122
  */
124
123
  async garbageCollect() {
125
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${this.garbageCollectS3Assets} ${this.garbageCollectEcrAssets}`));
124
+ await this.ioHelper.notify((0, messages_1.debug)(`${this.garbageCollectS3Assets} ${this.garbageCollectEcrAssets}`));
126
125
  // SDKs
127
126
  const sdk = (await this.props.sdkProvider.forEnvironment(this.props.resolvedEnvironment, mode_1.Mode.ForWriting)).sdk;
128
127
  const cfn = sdk.cloudFormation();
129
128
  const qualifier = await this.bootstrapQualifier(sdk, this.bootstrapStackName);
130
129
  const activeAssets = new stack_refresh_1.ActiveAssetCache();
131
130
  // Grab stack templates first
132
- await (0, stack_refresh_1.refreshStacks)(cfn, this.props.msg, activeAssets, qualifier);
131
+ await (0, stack_refresh_1.refreshStacks)(cfn, this.ioHelper, activeAssets, qualifier);
133
132
  // Start the background refresh
134
133
  const backgroundStackRefresh = new stack_refresh_1.BackgroundStackRefresh({
135
134
  cfn,
136
- msg: this.props.msg,
135
+ ioHelper: this.ioHelper,
137
136
  activeAssets,
138
137
  qualifier,
139
138
  });
@@ -160,26 +159,26 @@ class GarbageCollector {
160
159
  const ecr = sdk.ecr();
161
160
  const repo = await this.bootstrapRepositoryName(sdk, this.bootstrapStackName);
162
161
  const numImages = await this.numImagesInRepo(ecr, repo);
163
- const printer = new progress_printer_1.ProgressPrinter(this.props.msg, numImages, 1000);
164
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Found bootstrap repo ${repo} with ${numImages} images`));
162
+ const printer = new progress_printer_1.ProgressPrinter(this.ioHelper, numImages, 1000);
163
+ await this.ioHelper.notify((0, messages_1.debug)(`Found bootstrap repo ${repo} with ${numImages} images`));
165
164
  try {
166
165
  // const batches = 1;
167
166
  const batchSize = 1000;
168
167
  const currentTime = Date.now();
169
168
  const graceDays = this.props.rollbackBufferDays;
170
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Parsing through ${numImages} images in batches`));
169
+ await this.ioHelper.notify((0, messages_1.debug)(`Parsing through ${numImages} images in batches`));
171
170
  printer.start();
172
171
  for await (const batch of this.readRepoInBatches(ecr, repo, batchSize, currentTime)) {
173
172
  await backgroundStackRefresh.noOlderThan(600000); // 10 mins
174
173
  const { included: isolated, excluded: notIsolated } = partition(batch, asset => !asset.tags.some(t => activeAssets.contains(t)));
175
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${isolated.length} isolated images`));
176
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${notIsolated.length} not isolated images`));
177
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${batch.length} images total`));
174
+ await this.ioHelper.notify((0, messages_1.debug)(`${isolated.length} isolated images`));
175
+ await this.ioHelper.notify((0, messages_1.debug)(`${notIsolated.length} not isolated images`));
176
+ await this.ioHelper.notify((0, messages_1.debug)(`${batch.length} images total`));
178
177
  let deletables = isolated;
179
178
  let taggables = [];
180
179
  let untaggables = [];
181
180
  if (graceDays > 0) {
182
- await this.ioHost.notify((0, messages_1.debug)(this.action, 'Filtering out images that are not old enough to delete'));
181
+ await this.ioHelper.notify((0, messages_1.debug)('Filtering out images that are not old enough to delete'));
183
182
  // We delete images that are not referenced in ActiveAssets and have the Isolated Tag with a date
184
183
  // earlier than the current time - grace period.
185
184
  deletables = isolated.filter(img => img.isolatedTagBefore(new Date(currentTime - (graceDays * DAY))));
@@ -188,9 +187,9 @@ class GarbageCollector {
188
187
  // We untag images that are referenced in ActiveAssets and currently have the Isolated Tag.
189
188
  untaggables = notIsolated.filter(img => img.hasIsolatedTag());
190
189
  }
191
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${deletables.length} deletable assets`));
192
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${taggables.length} taggable assets`));
193
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${untaggables.length} assets to untag`));
190
+ await this.ioHelper.notify((0, messages_1.debug)(`${deletables.length} deletable assets`));
191
+ await this.ioHelper.notify((0, messages_1.debug)(`${taggables.length} taggable assets`));
192
+ await this.ioHelper.notify((0, messages_1.debug)(`${untaggables.length} assets to untag`));
194
193
  if (this.permissionToDelete && deletables.length > 0) {
195
194
  await this.confirmationPrompt(printer, deletables, 'image');
196
195
  await this.parallelDeleteEcr(ecr, repo, deletables, printer);
@@ -218,13 +217,13 @@ class GarbageCollector {
218
217
  const s3 = sdk.s3();
219
218
  const bucket = await this.bootstrapBucketName(sdk, this.bootstrapStackName);
220
219
  const numObjects = await this.numObjectsInBucket(s3, bucket);
221
- const printer = new progress_printer_1.ProgressPrinter(this.props.msg, numObjects, 1000);
222
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Found bootstrap bucket ${bucket} with ${numObjects} objects`));
220
+ const printer = new progress_printer_1.ProgressPrinter(this.ioHelper, numObjects, 1000);
221
+ await this.ioHelper.notify((0, messages_1.debug)(`Found bootstrap bucket ${bucket} with ${numObjects} objects`));
223
222
  try {
224
223
  const batchSize = 1000;
225
224
  const currentTime = Date.now();
226
225
  const graceDays = this.props.rollbackBufferDays;
227
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Parsing through ${numObjects} objects in batches`));
226
+ await this.ioHelper.notify((0, messages_1.debug)(`Parsing through ${numObjects} objects in batches`));
228
227
  printer.start();
229
228
  // Process objects in batches of 1000
230
229
  // This is the batch limit of s3.DeleteObject and we intend to optimize for the "worst case" scenario
@@ -232,14 +231,14 @@ class GarbageCollector {
232
231
  for await (const batch of this.readBucketInBatches(s3, bucket, batchSize, currentTime)) {
233
232
  await backgroundStackRefresh.noOlderThan(600000); // 10 mins
234
233
  const { included: isolated, excluded: notIsolated } = partition(batch, asset => !activeAssets.contains(asset.fileName()));
235
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${isolated.length} isolated assets`));
236
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${notIsolated.length} not isolated assets`));
237
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${batch.length} objects total`));
234
+ await this.ioHelper.notify((0, messages_1.debug)(`${isolated.length} isolated assets`));
235
+ await this.ioHelper.notify((0, messages_1.debug)(`${notIsolated.length} not isolated assets`));
236
+ await this.ioHelper.notify((0, messages_1.debug)(`${batch.length} objects total`));
238
237
  let deletables = isolated;
239
238
  let taggables = [];
240
239
  let untaggables = [];
241
240
  if (graceDays > 0) {
242
- await this.ioHost.notify((0, messages_1.debug)(this.action, 'Filtering out assets that are not old enough to delete'));
241
+ await this.ioHelper.notify((0, messages_1.debug)('Filtering out assets that are not old enough to delete'));
243
242
  await this.parallelReadAllTags(s3, batch);
244
243
  // We delete objects that are not referenced in ActiveAssets and have the Isolated Tag with a date
245
244
  // earlier than the current time - grace period.
@@ -249,9 +248,9 @@ class GarbageCollector {
249
248
  // We untag objects that are referenced in ActiveAssets and currently have the Isolated Tag.
250
249
  untaggables = notIsolated.filter(obj => obj.hasIsolatedTag());
251
250
  }
252
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${deletables.length} deletable assets`));
253
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${taggables.length} taggable assets`));
254
- await this.ioHost.notify((0, messages_1.debug)(this.action, `${untaggables.length} assets to untag`));
251
+ await this.ioHelper.notify((0, messages_1.debug)(`${deletables.length} deletable assets`));
252
+ await this.ioHelper.notify((0, messages_1.debug)(`${taggables.length} taggable assets`));
253
+ await this.ioHelper.notify((0, messages_1.debug)(`${untaggables.length} assets to untag`));
255
254
  if (this.permissionToDelete && deletables.length > 0) {
256
255
  await this.confirmationPrompt(printer, deletables, 'object');
257
256
  await this.parallelDeleteS3(s3, bucket, deletables, printer);
@@ -293,7 +292,7 @@ class GarbageCollector {
293
292
  }],
294
293
  }));
295
294
  }
296
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Untagged ${untaggables.length} assets`));
295
+ await this.ioHelper.notify((0, messages_1.debug)(`Untagged ${untaggables.length} assets`));
297
296
  }
298
297
  /**
299
298
  * Untag assets that were previously tagged, but now currently referenced.
@@ -317,7 +316,7 @@ class GarbageCollector {
317
316
  },
318
317
  }));
319
318
  }
320
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Untagged ${untaggables.length} assets`));
319
+ await this.ioHelper.notify((0, messages_1.debug)(`Untagged ${untaggables.length} assets`));
321
320
  }
322
321
  /**
323
322
  * Tag images in parallel using p-limit
@@ -339,13 +338,13 @@ class GarbageCollector {
339
338
  // This is a false negative -- an isolated asset is untagged
340
339
  // likely due to an imageTag collision. We can safely ignore,
341
340
  // and the isolated asset will be tagged next time.
342
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Warning: unable to tag image ${JSON.stringify(img.tags)} with ${img.buildImageTag(i)} due to the following error: ${error}`));
341
+ await this.ioHelper.notify((0, messages_1.debug)(`Warning: unable to tag image ${JSON.stringify(img.tags)} with ${img.buildImageTag(i)} due to the following error: ${error}`));
343
342
  }
344
343
  };
345
344
  await limit(() => tagEcr());
346
345
  }
347
346
  printer.reportTaggedAsset(taggables);
348
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Tagged ${taggables.length} assets`));
347
+ await this.ioHelper.notify((0, messages_1.debug)(`Tagged ${taggables.length} assets`));
349
348
  }
350
349
  /**
351
350
  * Tag objects in parallel using p-limit. The putObjectTagging API does not
@@ -368,7 +367,7 @@ class GarbageCollector {
368
367
  }));
369
368
  }
370
369
  printer.reportTaggedAsset(taggables);
371
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Tagged ${taggables.length} assets`));
370
+ await this.ioHelper.notify((0, messages_1.debug)(`Tagged ${taggables.length} assets`));
372
371
  }
373
372
  /**
374
373
  * Delete images in parallel. The deleteImage API supports batches of 100.
@@ -390,12 +389,12 @@ class GarbageCollector {
390
389
  repositoryName: repo,
391
390
  });
392
391
  const deletedCount = batch.length;
393
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Deleted ${deletedCount} assets`));
392
+ await this.ioHelper.notify((0, messages_1.debug)(`Deleted ${deletedCount} assets`));
394
393
  printer.reportDeletedAsset(deletables.slice(0, deletedCount));
395
394
  }
396
395
  }
397
396
  catch (err) {
398
- await this.ioHost.notify((0, messages_1.info)(this.action, chalk.red(`Error deleting images: ${err}`)));
397
+ await this.ioHelper.notify((0, messages_1.info)(chalk.red(`Error deleting images: ${err}`)));
399
398
  }
400
399
  }
401
400
  /**
@@ -421,24 +420,24 @@ class GarbageCollector {
421
420
  },
422
421
  });
423
422
  const deletedCount = batch.length;
424
- await this.ioHost.notify((0, messages_1.debug)(this.action, `Deleted ${deletedCount} assets`));
423
+ await this.ioHelper.notify((0, messages_1.debug)(`Deleted ${deletedCount} assets`));
425
424
  printer.reportDeletedAsset(deletables.slice(0, deletedCount));
426
425
  }
427
426
  }
428
427
  catch (err) {
429
- await this.ioHost.notify((0, messages_1.debug)(this.action, chalk.red(`Error deleting objects: ${err}`)));
428
+ await this.ioHelper.notify((0, messages_1.debug)(chalk.red(`Error deleting objects: ${err}`)));
430
429
  }
431
430
  }
432
431
  async bootstrapBucketName(sdk, bootstrapStackName) {
433
- const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
432
+ const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.ioHelper, bootstrapStackName);
434
433
  return toolkitInfo.bucketName;
435
434
  }
436
435
  async bootstrapRepositoryName(sdk, bootstrapStackName) {
437
- const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
436
+ const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.ioHelper, bootstrapStackName);
438
437
  return toolkitInfo.repositoryName;
439
438
  }
440
439
  async bootstrapQualifier(sdk, bootstrapStackName) {
441
- const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
440
+ const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.ioHelper, bootstrapStackName);
442
441
  return toolkitInfo.bootstrapStack.parameters.Qualifier;
443
442
  }
444
443
  async numObjectsInBucket(s3, bucket) {
@@ -607,4 +606,4 @@ function imageMap(imageIds) {
607
606
  }
608
607
  return images;
609
608
  }
610
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnYXJiYWdlLWNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrQkFBK0I7QUFDL0IscUNBQXFDO0FBRXJDLGtEQUEwRTtBQUMxRSx5REFBcUQ7QUFDckQsbURBQTBGO0FBQzFGLGlEQUFpRDtBQUVqRCwrQ0FBbUQ7QUFDbkQseUNBQXNDO0FBRXRDLG1EQUFtRDtBQUNuRCxpRUFBaUU7QUFDakUsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUUvQyxRQUFBLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUNyQyxRQUFBLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsK0JBQStCO0FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7QUFJbkU7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFDckIsWUFDa0IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsUUFBZ0I7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFVO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUVsQyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMs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QztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBJbWFnZUlkZW50aWZpZXIgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7IFRhZyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgeyBJRUNSQ2xpZW50LCBJUzNDbGllbnQsIFNESywgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSwgVG9vbGtpdEluZm8gfSBmcm9tICcuLi90b29sa2l0LWluZm8nO1xuaW1wb3J0IHsgUHJvZ3Jlc3NQcmludGVyIH0gZnJvbSAnLi9wcm9ncmVzcy1wcmludGVyJztcbmltcG9ydCB7IEFjdGl2ZUFzc2V0Q2FjaGUsIEJhY2tncm91bmRTdGFja1JlZnJlc2gsIHJlZnJlc2hTdGFja3MgfSBmcm9tICcuL3N0YWNrLXJlZnJlc2gnO1xuaW1wb3J0IHsgZGVidWcsIGluZm8gfSBmcm9tICcuLi8uLi9jbGkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgSW9NZXNzYWdpbmcgfSBmcm9tICcuLi8uLi90b29sa2l0L2NsaS1pby1ob3N0JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgTW9kZSB9IGZyb20gJy4uL3BsdWdpbi9tb2RlJztcblxuLy8gTXVzdCB1c2UgYSByZXF1aXJlKCkgb3RoZXJ3aXNlIGVzYnVpbGQgY29tcGxhaW5zXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcExpbWl0OiB0eXBlb2YgaW1wb3J0KCdwLWxpbWl0JykgPSByZXF1aXJlKCdwLWxpbWl0Jyk7XG5cbmV4cG9ydCBjb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5leHBvcnQgY29uc3QgRUNSX0lTT0xBVEVEX1RBRyA9ICdhd3MtY2RrLmlzb2xhdGVkJzsgLy8gJzonIGlzIG5vdCB2YWxpZCBpbiBFQ1IgdGFnc1xuY29uc3QgUF9MSU1JVCA9IDUwO1xuY29uc3QgREFZID0gMjQgKiA2MCAqIDYwICogMTAwMDsgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIGRheVxuXG5leHBvcnQgdHlwZSBHY0Fzc2V0ID0gSW1hZ2VBc3NldCB8IE9iamVjdEFzc2V0O1xuXG4vKipcbiAqIEFuIGltYWdlIGFzc2V0IHRoYXQgbGl2ZXMgaW4gdGhlIGJvb3RzdHJhcHBlZCBFQ1IgUmVwb3NpdG9yeVxuICovXG5leHBvcnQgY2xhc3MgSW1hZ2VBc3NldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGFnczogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IG1hbmlmZXN0OiBzdHJpbmcsXG4gICkge1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmZpbmQodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLnNvbWUodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhFQ1JfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUYWcoRUNSX0lTT0xBVEVEX1RBRyk7XG4gIH1cblxuICBwdWJsaWMgaXNvbGF0ZWRUYWdCZWZvcmUoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IGRhdGVJc29sYXRlZCA9IHRoaXMuZGF0ZUlzb2xhdGVkKCk7XG4gICAgaWYgKCFkYXRlSXNvbGF0ZWQgfHwgZGF0ZUlzb2xhdGVkID09ICcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlSXNvbGF0ZWQpIDwgZGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZEltYWdlVGFnKGluYzogbnVtYmVyKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiBgJHtpbmN9LSR7RUNSX0lTT0xBVEVEX1RBR30tJHtTdHJpbmcoRGF0ZS5ub3coKSl9YDtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNvbGF0ZWQoKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiB0aGlzLmdldElzb2xhdGVkVGFnKCk/LnNwbGl0KCctJylbM107XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgYXNzZXQgdGhhdCBsaXZlcyBpbiB0aGUgYm9vdHN0cmFwcGVkIFMzIEJ1Y2tldFxuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QXNzZXQge1xuICBwcml2YXRlIGNhY2hlZF90YWdzOiBUYWdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyKSB7XG4gIH1cblxuICBwdWJsaWMgZmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rZXkuc3BsaXQoJy4nKVswXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhbGxUYWdzKHMzOiBJUzNDbGllbnQpIHtcbiAgICBpZiAodGhpcy5jYWNoZWRfdGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3M7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5nZXRPYmplY3RUYWdnaW5nKHsgQnVja2V0OiB0aGlzLmJ1Y2tldCwgS2V5OiB0aGlzLmtleSB9KTtcbiAgICB0aGlzLmNhY2hlZF90YWdzID0gcmVzcG9uc2UuVGFnU2V0O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZF90YWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVkX3RhZ3MpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Nhbm5vdCBjYWxsIGdldFRhZyBiZWZvcmUgYWxsVGFncycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncy5maW5kKCh0OiBhbnkpID0+IHQuS2V5ID09PSB0YWcpPy5WYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzVGFnKHRhZzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZF90YWdzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdDYW5ub3QgY2FsbCBoYXNUYWcgYmVmb3JlIGFsbFRhZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3Muc29tZSgodDogYW55KSA9PiB0LktleSA9PT0gdGFnKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUYWcoUzNfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBpc29sYXRlZFRhZ0JlZm9yZShkYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgdGFnVmFsdWUgPSB0aGlzLmdldFRhZyhTM19JU09MQVRFRF9UQUcpO1xuICAgIGlmICghdGFnVmFsdWUgfHwgdGFnVmFsdWUgPT0gJycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRhZ1ZhbHVlKSA8IGRhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEdhcmJhZ2UgQ29sbGVjdG9yXG4gKi9cbmludGVyZmFjZSBHYXJiYWdlQ29sbGVjdG9yUHJvcHMge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiB0byBwZXJmb3JtLiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gcGVyZm9ybSBhIHRydW5jYXRlZCBzZXRcbiAgICogb2YgYWN0aW9ucyBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb246ICdwcmludCcgfCAndGFnJyB8ICdkZWxldGUtdGFnZ2VkJyB8ICdmdWxsJztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgYXNzZXQgdG8gZ2FyYmFnZSBjb2xsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ3MzJyB8ICdlY3InIHwgJ2FsbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXlzIGFuIGFzc2V0IG11c3QgYmUgaW4gaXNvbGF0aW9uIGJlZm9yZSBiZWluZyBhY3R1YWxseSBkZWxldGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tCdWZmZXJEYXlzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZnVzZSBkZWxldGlvbiBvZiBhbnkgYXNzZXRzIHlvdW5nZXIgdGhhbiB0aGlzIG51bWJlciBvZiBkYXlzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEJ1ZmZlckRheXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRvIGRlcGxveSB0aGlzIHN0YWNrIGluXG4gICAqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2sgYXJ0aWZhY3QgbWF5IGJlIHVucmVzb2x2ZWQsIHRoaXMgb25lXG4gICAqIG11c3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIChzZWVkZWQgd2l0aCBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICAgKlxuICAgKiBXaWxsIGJlIHVzZWQgdG8gbWFrZSBTREsgY2FsbHMgdG8gQ2xvdWRGb3JtYXRpb24sIFMzLCBhbmQgRUNSLlxuICAgKi9cbiAgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNlbmQgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBtc2c6IElvTWVzc2FnaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHRvIGxvb2sgZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRVxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwU3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25maXJtIHdpdGggdGhlIHVzZXIgYmVmb3JlIGFjdHVhbCBkZWxldGlvbiBoYXBwZW5zXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpcm0/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgY2xhc3MgdG8gZmFjaWxpdGF0ZSBHYXJiYWdlIENvbGxlY3Rpb24gb2YgUzMgYW5kIEVDUiBhc3NldHNcbiAqL1xuZXhwb3J0IGNsYXNzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIGdhcmJhZ2VDb2xsZWN0UzNBc3NldHM6IGJvb2xlYW47XG4gIHByaXZhdGUgZ2FyYmFnZUNvbGxlY3RFY3JBc3NldHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcGVybWlzc2lvblRvRGVsZXRlOiBib29sZWFuO1xuICBwcml2YXRlIHBlcm1pc3Npb25Ub1RhZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBib290c3RyYXBTdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maXJtOiBib29sZWFuO1xuICBwcml2YXRlIGlvSG9zdDogSW9NZXNzYWdpbmdbJ2lvSG9zdCddO1xuICBwcml2YXRlIGFjdGlvbjogSW9NZXNzYWdpbmdbJ2FjdGlvbiddO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZWFkb25seSBwcm9wczogR2FyYmFnZUNvbGxlY3RvclByb3BzKSB7XG4gICAgdGhpcy5pb0hvc3QgPSBwcm9wcy5tc2cuaW9Ib3N0O1xuICAgIHRoaXMuYWN0aW9uID0gcHJvcHMubXNnLmFjdGlvbjtcblxuICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0cyA9IFsnczMnLCAnYWxsJ10uaW5jbHVkZXMocHJvcHMudHlwZSk7XG4gICAgdGhpcy5nYXJiYWdlQ29sbGVjdEVjckFzc2V0cyA9IFsnZWNyJywgJ2FsbCddLmluY2x1ZGVzKHByb3BzLnR5cGUpO1xuXG4gICAgdGhpcy5wZXJtaXNzaW9uVG9EZWxldGUgPSBbJ2RlbGV0ZS10YWdnZWQnLCAnZnVsbCddLmluY2x1ZGVzKHByb3BzLmFjdGlvbik7XG4gICAgdGhpcy5wZXJtaXNzaW9uVG9UYWcgPSBbJ3RhZycsICdmdWxsJ10uaW5jbHVkZXMocHJvcHMuYWN0aW9uKTtcbiAgICB0aGlzLmNvbmZpcm0gPSBwcm9wcy5jb25maXJtID8/IHRydWU7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSA9IHByb3BzLmJvb3RzdHJhcFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbiBvbiB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2FyYmFnZUNvbGxlY3QoKSB7XG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHt0aGlzLmdhcmJhZ2VDb2xsZWN0UzNBc3NldHN9ICR7dGhpcy5nYXJiYWdlQ29sbGVjdEVjckFzc2V0c31gKSk7XG5cbiAgICAvLyBTREtzXG4gICAgY29uc3Qgc2RrID0gKGF3YWl0IHRoaXMucHJvcHMuc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQodGhpcy5wcm9wcy5yZXNvbHZlZEVudmlyb25tZW50LCBNb2RlLkZvcldyaXRpbmcpKS5zZGs7XG4gICAgY29uc3QgY2ZuID0gc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgICBjb25zdCBxdWFsaWZpZXIgPSBhd2FpdCB0aGlzLmJvb3RzdHJhcFF1YWxpZmllcihzZGssIHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICBjb25zdCBhY3RpdmVBc3NldHMgPSBuZXcgQWN0aXZlQXNzZXRDYWNoZSgpO1xuXG4gICAgLy8gR3JhYiBzdGFjayB0ZW1wbGF0ZXMgZmlyc3RcbiAgICBhd2FpdCByZWZyZXNoU3RhY2tzKGNmbiwgdGhpcy5wcm9wcy5tc2csIGFjdGl2ZUFzc2V0cywgcXVhbGlmaWVyKTtcbiAgICAvLyBTdGFydCB0aGUgYmFja2dyb3VuZCByZWZyZXNoXG4gICAgY29uc3QgYmFja2dyb3VuZFN0YWNrUmVmcmVzaCA9IG5ldyBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKHtcbiAgICAgIGNmbixcbiAgICAgIG1zZzogdGhpcy5wcm9wcy5tc2csXG4gICAgICBhY3RpdmVBc3NldHMsXG4gICAgICBxdWFsaWZpZXIsXG4gICAgfSk7XG4gICAgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmdhcmJhZ2VDb2xsZWN0UzNBc3NldHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nYXJiYWdlQ29sbGVjdFMzKHNkaywgYWN0aXZlQXNzZXRzLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2FyYmFnZUNvbGxlY3RFY3JBc3NldHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nYXJiYWdlQ29sbGVjdEVjcihzZGssIGFjdGl2ZUFzc2V0cywgYmFja2dyb3VuZFN0YWNrUmVmcmVzaCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIEVDUiBhc3NldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnYXJiYWdlQ29sbGVjdEVjcihzZGs6IFNESywgYWN0aXZlQXNzZXRzOiBBY3RpdmVBc3NldENhY2hlLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoOiBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKSB7XG4gICAgY29uc3QgZWNyID0gc2RrLmVjcigpO1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcFJlcG9zaXRvcnlOYW1lKHNkaywgdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGNvbnN0IG51bUltYWdlcyA9IGF3YWl0IHRoaXMubnVtSW1hZ2VzSW5SZXBvKGVjciwgcmVwbyk7XG4gICAgY29uc3QgcHJpbnRlciA9IG5ldyBQcm9ncmVzc1ByaW50ZXIodGhpcy5wcm9wcy5tc2csIG51bUltYWdlcywgMTAwMCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBGb3VuZCBib290c3RyYXAgcmVwbyAke3JlcG99IHdpdGggJHtudW1JbWFnZXN9IGltYWdlc2ApKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBjb25zdCBiYXRjaGVzID0gMTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDA7XG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBncmFjZURheXMgPSB0aGlzLnByb3BzLnJvbGxiYWNrQnVmZmVyRGF5cztcblxuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgUGFyc2luZyB0aHJvdWdoICR7bnVtSW1hZ2VzfSBpbWFnZXMgaW4gYmF0Y2hlc2ApKTtcblxuICAgICAgcHJpbnRlci5zdGFydCgpO1xuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGJhdGNoIG9mIHRoaXMucmVhZFJlcG9JbkJhdGNoZXMoZWNyLCByZXBvLCBiYXRjaFNpemUsIGN1cnJlbnRUaW1lKSkge1xuICAgICAgICBhd2FpdCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLm5vT2xkZXJUaGFuKDYwMF8wMDApOyAvLyAxMCBtaW5zXG5cbiAgICAgICAgY29uc3QgeyBpbmNsdWRlZDogaXNvbGF0ZWQsIGV4Y2x1ZGVkOiBub3RJc29sYXRlZCB9ID0gcGFydGl0aW9uKGJhdGNoLCBhc3NldCA9PiAhYXNzZXQudGFncy5zb21lKHQgPT4gYWN0aXZlQXNzZXRzLmNvbnRhaW5zKHQpKSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtpc29sYXRlZC5sZW5ndGh9IGlzb2xhdGVkIGltYWdlc2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtub3RJc29sYXRlZC5sZW5ndGh9IG5vdCBpc29sYXRlZCBpbWFnZXNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7YmF0Y2gubGVuZ3RofSBpbWFnZXMgdG90YWxgKSk7XG5cbiAgICAgICAgbGV0IGRlbGV0YWJsZXM6IEltYWdlQXNzZXRbXSA9IGlzb2xhdGVkO1xuICAgICAgICBsZXQgdGFnZ2FibGVzOiBJbWFnZUFzc2V0W10gPSBbXTtcbiAgICAgICAgbGV0IHVudGFnZ2FibGVzOiBJbWFnZUFzc2V0W10gPSBbXTtcblxuICAgICAgICBpZiAoZ3JhY2VEYXlzID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgJ0ZpbHRlcmluZyBvdXQgaW1hZ2VzIHRoYXQgYXJlIG5vdCBvbGQgZW5vdWdoIHRvIGRlbGV0ZScpKTtcblxuICAgICAgICAgIC8vIFdlIGRlbGV0ZSBpbWFnZXMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBoYXZlIHRoZSBJc29sYXRlZCBUYWcgd2l0aCBhIGRhdGVcbiAgICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZSAtIGdyYWNlIHBlcmlvZC5cbiAgICAgICAgICBkZWxldGFibGVzID0gaXNvbGF0ZWQuZmlsdGVyKGltZyA9PiBpbWcuaXNvbGF0ZWRUYWdCZWZvcmUobmV3IERhdGUoY3VycmVudFRpbWUgLSAoZ3JhY2VEYXlzICogREFZKSkpKTtcblxuICAgICAgICAgIC8vIFdlIHRhZyBpbWFnZXMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBkbyBub3QgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHRhZ2dhYmxlcyA9IGlzb2xhdGVkLmZpbHRlcihpbWcgPT4gIWltZy5oYXNJc29sYXRlZFRhZygpKTtcblxuICAgICAgICAgIC8vIFdlIHVudGFnIGltYWdlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgY3VycmVudGx5IGhhdmUgdGhlIElzb2xhdGVkIFRhZy5cbiAgICAgICAgICB1bnRhZ2dhYmxlcyA9IG5vdElzb2xhdGVkLmZpbHRlcihpbWcgPT4gaW1nLmhhc0lzb2xhdGVkVGFnKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtkZWxldGFibGVzLmxlbmd0aH0gZGVsZXRhYmxlIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHt0YWdnYWJsZXMubGVuZ3RofSB0YWdnYWJsZSBhc3NldHNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7dW50YWdnYWJsZXMubGVuZ3RofSBhc3NldHMgdG8gdW50YWdgKSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvRGVsZXRlICYmIGRlbGV0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybWF0aW9uUHJvbXB0KHByaW50ZXIsIGRlbGV0YWJsZXMsICdpbWFnZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxEZWxldGVFY3IoZWNyLCByZXBvLCBkZWxldGFibGVzLCBwcmludGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub1RhZyAmJiB0YWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxUYWdFY3IoZWNyLCByZXBvLCB0YWdnYWJsZXMsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHVudGFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsVW50YWdFY3IoZWNyLCByZXBvLCB1bnRhZ2dhYmxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludGVyLnJlcG9ydFNjYW5uZWRBc3NldChiYXRjaC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHByaW50ZXIuc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbiBvbiBTMyBhc3NldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnYXJiYWdlQ29sbGVjdFMzKHNkazogU0RLLCBhY3RpdmVBc3NldHM6IEFjdGl2ZUFzc2V0Q2FjaGUsIGJhY2tncm91bmRTdGFja1JlZnJlc2g6IEJhY2tncm91bmRTdGFja1JlZnJlc2gpIHtcbiAgICBjb25zdCBzMyA9IHNkay5zMygpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwQnVja2V0TmFtZShzZGssIHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICBjb25zdCBudW1PYmplY3RzID0gYXdhaXQgdGhpcy5udW1PYmplY3RzSW5CdWNrZXQoczMsIGJ1Y2tldCk7XG4gICAgY29uc3QgcHJpbnRlciA9IG5ldyBQcm9ncmVzc1ByaW50ZXIodGhpcy5wcm9wcy5tc2csIG51bU9iamVjdHMsIDEwMDApO1xuXG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgRm91bmQgYm9vdHN0cmFwIGJ1Y2tldCAke2J1Y2tldH0gd2l0aCAke251bU9iamVjdHN9IG9iamVjdHNgKSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hTaXplID0gMTAwMDtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGdyYWNlRGF5cyA9IHRoaXMucHJvcHMucm9sbGJhY2tCdWZmZXJEYXlzO1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBQYXJzaW5nIHRocm91Z2ggJHtudW1PYmplY3RzfSBvYmplY3RzIGluIGJhdGNoZXNgKSk7XG5cbiAgICAgIHByaW50ZXIuc3RhcnQoKTtcblxuICAgICAgLy8gUHJvY2VzcyBvYmplY3RzIGluIGJhdGNoZXMgb2YgMTAwMFxuICAgICAgLy8gVGhpcyBpcyB0aGUgYmF0Y2ggbGltaXQgb2YgczMuRGVsZXRlT2JqZWN0IGFuZCB3ZSBpbnRlbmQgdG8gb3B0aW1pemUgZm9yIHRoZSBcIndvcnN0IGNhc2VcIiBzY2VuYXJpb1xuICAgICAgLy8gd2hlcmUgZ2MgaXMgcnVuIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGxvbmctc3RhbmRpbmcgYnVja2V0IHdoZXJlIH4xMDAlIG9mIG9iamVjdHMgYXJlIGlzb2xhdGVkLlxuICAgICAgZm9yIGF3YWl0IChjb25zdCBiYXRjaCBvZiB0aGlzLnJlYWRCdWNrZXRJbkJhdGNoZXMoczMsIGJ1Y2tldCwgYmF0Y2hTaXplLCBjdXJyZW50VGltZSkpIHtcbiAgICAgICAgYXdhaXQgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5ub09sZGVyVGhhbig2MDBfMDAwKTsgLy8gMTAgbWluc1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IGlzb2xhdGVkLCBleGNsdWRlZDogbm90SXNvbGF0ZWQgfSA9IHBhcnRpdGlvbihiYXRjaCwgYXNzZXQgPT4gIWFjdGl2ZUFzc2V0cy5jb250YWlucyhhc3NldC5maWxlTmFtZSgpKSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtpc29sYXRlZC5sZW5ndGh9IGlzb2xhdGVkIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtub3RJc29sYXRlZC5sZW5ndGh9IG5vdCBpc29sYXRlZCBhc3NldHNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7YmF0Y2gubGVuZ3RofSBvYmplY3RzIHRvdGFsYCkpO1xuXG4gICAgICAgIGxldCBkZWxldGFibGVzOiBPYmplY3RBc3NldFtdID0gaXNvbGF0ZWQ7XG4gICAgICAgIGxldCB0YWdnYWJsZXM6IE9iamVjdEFzc2V0W10gPSBbXTtcbiAgICAgICAgbGV0IHVudGFnZ2FibGVzOiBPYmplY3RBc3NldFtdID0gW107XG5cbiAgICAgICAgaWYgKGdyYWNlRGF5cyA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sICdGaWx0ZXJpbmcgb3V0IGFzc2V0cyB0aGF0IGFyZSBub3Qgb2xkIGVub3VnaCB0byBkZWxldGUnKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFJlYWRBbGxUYWdzKHMzLCBiYXRjaCk7XG5cbiAgICAgICAgICAvLyBXZSBkZWxldGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGhhdmUgdGhlIElzb2xhdGVkIFRhZyB3aXRoIGEgZGF0ZVxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lIC0gZ3JhY2UgcGVyaW9kLlxuICAgICAgICAgIGRlbGV0YWJsZXMgPSBpc29sYXRlZC5maWx0ZXIob2JqID0+IG9iai5pc29sYXRlZFRhZ0JlZm9yZShuZXcgRGF0ZShjdXJyZW50VGltZSAtIChncmFjZURheXMgKiBEQVkpKSkpO1xuXG4gICAgICAgICAgLy8gV2UgdGFnIG9iamVjdHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBkbyBub3QgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHRhZ2dhYmxlcyA9IGlzb2xhdGVkLmZpbHRlcihvYmogPT4gIW9iai5oYXNJc29sYXRlZFRhZygpKTtcblxuICAgICAgICAgIC8vIFdlIHVudGFnIG9iamVjdHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGN1cnJlbnRseSBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdW50YWdnYWJsZXMgPSBub3RJc29sYXRlZC5maWx0ZXIob2JqID0+IG9iai5oYXNJc29sYXRlZFRhZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7ZGVsZXRhYmxlcy5sZW5ndGh9IGRlbGV0YWJsZSBhc3NldHNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7dGFnZ2FibGVzLmxlbmd0aH0gdGFnZ2FibGUgYXNzZXRzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke3VudGFnZ2FibGVzLmxlbmd0aH0gYXNzZXRzIHRvIHVudGFnYCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub0RlbGV0ZSAmJiBkZWxldGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1hdGlvblByb21wdChwcmludGVyLCBkZWxldGFibGVzLCAnb2JqZWN0Jyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbERlbGV0ZVMzKHMzLCBidWNrZXQsIGRlbGV0YWJsZXMsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFRhZ1MzKHMzLCBidWNrZXQsIHRhZ2dhYmxlcywgY3VycmVudFRpbWUsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHVudGFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsVW50YWdTMyhzMywgYnVja2V0LCB1bnRhZ2dhYmxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludGVyLnJlcG9ydFNjYW5uZWRBc3NldChiYXRjaC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHByaW50ZXIuc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxSZWFkQWxsVGFncyhzMzogSVMzQ2xpZW50LCBvYmplY3RzOiBPYmplY3RBc3NldFtdKSB7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoUF9MSU1JVCk7XG5cbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBvYmplY3RzKSB7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PiBvYmouYWxsVGFncyhzMykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnRhZyBhc3NldHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdGFnZ2VkLCBidXQgbm93IGN1cnJlbnRseSByZWZlcmVuY2VkLlxuICAgKiBTaW5jZSB0aGlzIGlzIHRyZWF0ZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCB3ZSBkbyBub3QgcHJpbnQgdGhlIHJlc3VsdHMgaW4gdGhlIHByaW50ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsVW50YWdFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIHVudGFnZ2FibGVzOiBJbWFnZUFzc2V0W10pIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAoY29uc3QgaW1nIG9mIHVudGFnZ2FibGVzKSB7XG4gICAgICBjb25zdCB0YWcgPSBpbWcuZ2V0SXNvbGF0ZWRUYWcoKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIGVjci5iYXRjaERlbGV0ZUltYWdlKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogW3tcbiAgICAgICAgICAgIGltYWdlVGFnOiB0YWcsXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBVbnRhZ2dlZCAke3VudGFnZ2FibGVzLmxlbmd0aH0gYXNzZXRzYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVudGFnIGFzc2V0cyB0aGF0IHdlcmUgcHJldmlvdXNseSB0YWdnZWQsIGJ1dCBub3cgY3VycmVudGx5IHJlZmVyZW5jZWQuXG4gICAqIFNpbmNlIHRoaXMgaXMgdHJlYXRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHdlIGRvIG5vdCBwcmludCB0aGUgcmVzdWx0cyBpbiB0aGUgcHJpbnRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxVbnRhZ1MzKHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nLCB1bnRhZ2dhYmxlczogT2JqZWN0QXNzZXRbXSkge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBvYmogb2YgdW50YWdnYWJsZXMpIHtcbiAgICAgIGNvbnN0IHRhZ3MgPSBhd2FpdCBvYmouYWxsVGFncyhzMykgPz8gW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFncyA9IHRhZ3MuZmlsdGVyKCh0YWc6IFRhZykgPT4gdGFnLktleSAhPT0gUzNfSVNPTEFURURfVEFHKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIHMzLmRlbGV0ZU9iamVjdFRhZ2dpbmcoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIEtleTogb2JqLmtleSxcblxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PlxuICAgICAgICBzMy5wdXRPYmplY3RUYWdnaW5nKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBLZXk6IG9iai5rZXksXG4gICAgICAgICAgVGFnZ2luZzoge1xuICAgICAgICAgICAgVGFnU2V0OiB1cGRhdGVkVGFncyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgVW50YWdnZWQgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWcgaW1hZ2VzIGluIHBhcmFsbGVsIHVzaW5nIHAtbGltaXRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxUYWdFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIHRhZ2dhYmxlczogSW1hZ2VBc3NldFtdLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnZ2FibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbWcgPSB0YWdnYWJsZXNbaV07XG4gICAgICBjb25zdCB0YWdFY3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZWNyLnB1dEltYWdlKHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgICAgaW1hZ2VEaWdlc3Q6IGltZy5kaWdlc3QsXG4gICAgICAgICAgICBpbWFnZU1hbmlmZXN0OiBpbWcubWFuaWZlc3QsXG4gICAgICAgICAgICBpbWFnZVRhZzogaW1nLmJ1aWxkSW1hZ2VUYWcoaSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGZhbHNlIG5lZ2F0aXZlIC0tIGFuIGlzb2xhdGVkIGFzc2V0IGlzIHVudGFnZ2VkXG4gICAgICAgICAgLy8gbGlrZWx5IGR1ZSB0byBhbiBpbWFnZVRhZyBjb2xsaXNpb24uIFdlIGNhbiBzYWZlbHkgaWdub3JlLFxuICAgICAgICAgIC8vIGFuZCB0aGUgaXNvbGF0ZWQgYXNzZXQgd2lsbCBiZSB0YWdnZWQgbmV4dCB0aW1lLlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFdhcm5pbmc6IHVuYWJsZSB0byB0YWcgaW1hZ2UgJHtKU09OLnN0cmluZ2lmeShpbWcudGFncyl9IHdpdGggJHtpbWcuYnVpbGRJbWFnZVRhZyhpKX0gZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT4gdGFnRWNyKCkpO1xuICAgIH1cblxuICAgIHByaW50ZXIucmVwb3J0VGFnZ2VkQXNzZXQodGFnZ2FibGVzKTtcbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBUYWdnZWQgJHt0YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKSk7XG4gIH1cblxuICAvKipcbiAgICogVGFnIG9iamVjdHMgaW4gcGFyYWxsZWwgdXNpbmcgcC1saW1pdC4gVGhlIHB1dE9iamVjdFRhZ2dpbmcgQVBJIGRvZXMgbm90XG4gICAqIHN1cHBvcnQgYmF0Y2ggdGFnZ2luZyBzbyB3ZSBtdXN0IGhhbmRsZSB0aGUgcGFyYWxsZWxpc20gY2xpZW50LXNpZGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsVGFnUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIHRhZ2dhYmxlczogT2JqZWN0QXNzZXRbXSwgZGF0ZTogbnVtYmVyLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAoY29uc3Qgb2JqIG9mIHRhZ2dhYmxlcykge1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT5cbiAgICAgICAgczMucHV0T2JqZWN0VGFnZ2luZyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgS2V5OiBvYmoua2V5LFxuICAgICAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgICAgIFRhZ1NldDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgS2V5OiBTM19JU09MQVRFRF9UQUcsXG4gICAgICAgICAgICAgICAgVmFsdWU6IFN0cmluZyhkYXRlKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaW50ZXIucmVwb3J0VGFnZ2VkQXNzZXQodGFnZ2FibGVzKTtcbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBUYWdnZWQgJHt0YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGltYWdlcyBpbiBwYXJhbGxlbC4gVGhlIGRlbGV0ZUltYWdlIEFQSSBzdXBwb3J0cyBiYXRjaGVzIG9mIDEwMC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxEZWxldGVFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIGRlbGV0YWJsZXM6IEltYWdlQXNzZXRbXSwgcHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTAwO1xuICAgIGNvbnN0IGltYWdlc1RvRGVsZXRlID0gZGVsZXRhYmxlcy5tYXAoaW1nID0+ICh7XG4gICAgICBpbWFnZURpZ2VzdDogaW1nLmRpZ2VzdCxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgIGJhdGNoZXMucHVzaChpbWFnZXNUb0RlbGV0ZS5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgaW1hZ2VzIGluIGJhdGNoZXNcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICBhd2FpdCBlY3IuYmF0Y2hEZWxldGVJbWFnZSh7XG4gICAgICAgICAgaW1hZ2VJZHM6IGJhdGNoLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBiYXRjaC5sZW5ndGg7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYERlbGV0ZWQgJHtkZWxldGVkQ291bnR9IGFzc2V0c2ApKTtcbiAgICAgICAgcHJpbnRlci5yZXBvcnREZWxldGVkQXNzZXQoZGVsZXRhYmxlcy5zbGljZSgwLCBkZWxldGVkQ291bnQpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShpbmZvKHRoaXMuYWN0aW9uLCBjaGFsay5yZWQoYEVycm9yIGRlbGV0aW5nIGltYWdlczogJHtlcnJ9YCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG9iamVjdHMgaW4gcGFyYWxsZWwuIFRoZSBkZWxldGVPYmplY3RzIEFQSSBzdXBwb3J0cyBiYXRjaGVzIG9mIDEwMDAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsRGVsZXRlUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIGRlbGV0YWJsZXM6IE9iamVjdEFzc2V0W10sIHByaW50ZXI6IFByb2dyZXNzUHJpbnRlcikge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDA7XG4gICAgY29uc3Qgb2JqZWN0c1RvRGVsZXRlID0gZGVsZXRhYmxlcy5tYXAoYXNzZXQgPT4gKHtcbiAgICAgIEtleTogYXNzZXQua2V5LFxuICAgIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaGVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgIGJhdGNoZXMucHVzaChvYmplY3RzVG9EZWxldGUuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSkpO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIG9iamVjdHMgaW4gYmF0Y2hlc1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgICAgIGF3YWl0IHMzLmRlbGV0ZU9iamVjdHMoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIERlbGV0ZToge1xuICAgICAgICAgICAgT2JqZWN0czogYmF0Y2gsXG4gICAgICAgICAgICBRdWlldDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBiYXRjaC5sZW5ndGg7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYERlbGV0ZWQgJHtkZWxldGVkQ291bnR9IGFzc2V0c2ApKTtcbiAgICAgICAgcHJpbnRlci5yZXBvcnREZWxldGVkQXNzZXQoZGVsZXRhYmxlcy5zbGljZSgwLCBkZWxldGVkQ291bnQpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgY2hhbGsucmVkKGBFcnJvciBkZWxldGluZyBvYmplY3RzOiAke2Vycn1gKSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwQnVja2V0TmFtZShzZGs6IFNESywgYm9vdHN0cmFwU3RhY2tOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRvb2xraXRJbmZvID0gYXdhaXQgVG9vbGtpdEluZm8ubG9va3VwKHRoaXMucHJvcHMucmVzb2x2ZWRFbnZpcm9ubWVudCwgc2RrLCB0aGlzLnByb3BzLm1zZywgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8uYnVja2V0TmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwUmVwb3NpdG9yeU5hbWUoc2RrOiBTREssIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIHNkaywgdGhpcy5wcm9wcy5tc2csIGJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHRvb2xraXRJbmZvLnJlcG9zaXRvcnlOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBRdWFsaWZpZXIoc2RrOiBTREssIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIHNkaywgdGhpcy5wcm9wcy5tc2csIGJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHRvb2xraXRJbmZvLmJvb3RzdHJhcFN0YWNrLnBhcmFtZXRlcnMuUXVhbGlmaWVyO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBudW1PYmplY3RzSW5CdWNrZXQoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCB0b3RhbENvdW50ID0gMDtcbiAgICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgczMubGlzdE9iamVjdHNWMih7XG4gICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICBDb250aW51YXRpb25Ub2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgICB9KTtcblxuICAgICAgdG90YWxDb3VudCArPSByZXNwb25zZS5LZXlDb3VudCA/PyAwO1xuICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uVG9rZW4pO1xuXG4gICAgcmV0dXJuIHRvdGFsQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG51bUltYWdlc0luUmVwbyhlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZWNyLmxpc3RJbWFnZXMoe1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgbmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICB9KTtcblxuICAgICAgdG90YWxDb3VudCArPSByZXNwb25zZS5pbWFnZUlkcz8ubGVuZ3RoID8/IDA7XG4gICAgICBuZXh0VG9rZW4gPSByZXNwb25zZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcblxuICAgIHJldHVybiB0b3RhbENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyAqcmVhZFJlcG9JbkJhdGNoZXMoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgY3VycmVudFRpbWU6IG51bWJlcik6IEFzeW5jR2VuZXJhdG9yPEltYWdlQXNzZXRbXT4ge1xuICAgIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYmF0Y2g6IEltYWdlQXNzZXRbXSA9IFtdO1xuXG4gICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgYmF0Y2hTaXplKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZWNyLmxpc3RJbWFnZXMoe1xuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgIG5leHRUb2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5vIGltYWdlcyBpbiB0aGUgcmVwb3NpdG9yeVxuICAgICAgICBpZiAoIXJlc3BvbnNlLmltYWdlSWRzIHx8IHJlc3BvbnNlLmltYWdlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFwIHVuaXF1ZSBpbWFnZSBkaWdlc3QgdG8gKHBvc3NpYmx5IG11bHRpcGxlKSB0YWdzXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IGltYWdlTWFwKHJlc3BvbnNlLmltYWdlSWRzID8/IFtdKTtcblxuICAgICAgICBjb25zdCBpbWFnZUlkcyA9IE9iamVjdC5rZXlzKGltYWdlcykubWFwKGtleSA9PiAoe1xuICAgICAgICAgIGltYWdlRGlnZXN0OiBrZXksXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCBkZXNjcmliZUltYWdlSW5mbyA9IGF3YWl0IGVjci5kZXNjcmliZUltYWdlcyh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgaW1hZ2VJZHM6IGltYWdlSWRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBnZXRJbWFnZUluZm8gPSBhd2FpdCBlY3IuYmF0Y2hHZXRJbWFnZSh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgaW1hZ2VJZHM6IGltYWdlSWRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb21iaW5lZEltYWdlSW5mbyA9IGRlc2NyaWJlSW1hZ2VJbmZvLmltYWdlRGV0YWlscz8ubWFwKGltYWdlRGV0YWlsID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0ltYWdlID0gZ2V0SW1hZ2VJbmZvLmltYWdlcz8uZmluZChcbiAgICAgICAgICAgIGltZyA9PiBpbWcuaW1hZ2VJZD8uaW1hZ2VEaWdlc3QgPT09IGltYWdlRGV0YWlsLmltYWdlRGlnZXN0LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaW1hZ2VEZXRhaWwsXG4gICAgICAgICAgICBtYW5pZmVzdDogbWF0Y2hpbmdJbWFnZT8uaW1hZ2VNYW5pZmVzdCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGNvbWJpbmVkSW1hZ2VJbmZvID8/IFtdKSB7XG4gICAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gaW1hZ2UuaW1hZ2VQdXNoZWRBdCA/PyBuZXcgRGF0ZShjdXJyZW50VGltZSk7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIGltYWdlIGlmIGl0IHdhcyBwdXNoZWQgZWFybGllciB0aGFuIHRvZGF5IC0gY3JlYXRlZEJ1ZmZlckRheXNcbiAgICAgICAgICBpZiAoaW1hZ2UuaW1hZ2VEaWdlc3QgJiYgbGFzdE1vZGlmaWVkIDwgbmV3IERhdGUoY3VycmVudFRpbWUgLSAodGhpcy5wcm9wcy5jcmVhdGVkQnVmZmVyRGF5cyAqIERBWSkpKSB7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKG5ldyBJbWFnZUFzc2V0KGltYWdlLmltYWdlRGlnZXN0LCBpbWFnZS5pbWFnZVNpemVJbkJ5dGVzID8/IDAsIGltYWdlLmltYWdlVGFncyA/PyBbXSwgaW1hZ2UubWFuaWZlc3QgPz8gJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3BvbnNlLm5leHRUb2tlbjtcblxuICAgICAgICBpZiAoIWNvbnRpbnVhdGlvblRva2VuKSBicmVhazsgLy8gTm8gbW9yZSBpbWFnZXMgdG8gZmV0Y2hcbiAgICAgIH1cblxuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgeWllbGQgYmF0Y2g7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uVG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRvciBmdW5jdGlvbiB0aGF0IHJlYWRzIG9iamVjdHMgZnJvbSB0aGUgUzMgQnVja2V0IGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jICpyZWFkQnVja2V0SW5CYXRjaGVzKHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIGN1cnJlbnRUaW1lOiBudW1iZXIpOiBBc3luY0dlbmVyYXRvcjxPYmplY3RBc3NldFtdPiB7XG4gICAgbGV0IGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBiYXRjaDogT2JqZWN0QXNzZXRbXSA9IFtdO1xuXG4gICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgYmF0Y2hTaXplKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgczMubGlzdE9iamVjdHNWMih7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgQ29udGludWF0aW9uVG9rZW46IGNvbnRpbnVhdGlvblRva2VuLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZS5Db250ZW50cz8uZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBvYmouS2V5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBvYmouU2l6ZSA/PyAwO1xuICAgICAgICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IG9iai5MYXN0TW9kaWZpZWQgPz8gbmV3IERhdGUoY3VycmVudFRpbWUpO1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBvYmplY3QgaWYgaXQgaGFzIGEgS2V5IGFuZFxuICAgICAgICAgIC8vIGlmIGl0IGhhcyBub3QgYmVlbiBtb2RpZmllZCBzaW5jZSB0b2RheSAtIGNyZWF0ZWRCdWZmZXJEYXlzXG4gICAgICAgICAgaWYgKGtleSAmJiBsYXN0TW9kaWZpZWQgPCBuZXcgRGF0ZShjdXJyZW50VGltZSAtICh0aGlzLnByb3BzLmNyZWF0ZWRCdWZmZXJEYXlzICogREFZKSkpIHtcbiAgICAgICAgICAgIGJhdGNoLnB1c2gobmV3IE9iamVjdEFzc2V0KGJ1Y2tldCwga2V5LCBzaXplKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbjtcblxuICAgICAgICBpZiAoIWNvbnRpbnVhdGlvblRva2VuKSBicmVhazsgLy8gTm8gbW9yZSBvYmplY3RzIHRvIGZldGNoXG4gICAgICB9XG5cbiAgICAgIGlmIChiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybWF0aW9uUHJvbXB0KHByaW50ZXI6IFByb2dyZXNzUHJpbnRlciwgZGVsZXRhYmxlczogR2NBc3NldFtdLCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwbHVyYWxpemUgPSAobmFtZTogc3RyaW5nLCBjb3VudDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBjb3VudCA9PT0gMSA/IG5hbWUgOiBgJHtuYW1lfXNgO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maXJtKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gW1xuICAgICAgICBgRm91bmQgJHtkZWxldGFibGVzLmxlbmd0aH0gJHtwbHVyYWxpemUodHlwZSwgZGVsZXRhYmxlcy5sZW5ndGgpfSB0byBkZWxldGUgYmFzZWQgb2ZmIG9mIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6YCxcbiAgICAgICAgYC0gJHt0eXBlfXMgaGF2ZSBiZWVuIGlzb2xhdGVkIGZvciA+ICR7dGhpcy5wcm9wcy5yb2xsYmFja0J1ZmZlckRheXN9IGRheXNgLFxuICAgICAgICBgLSAke3R5cGV9cyB3ZXJlIGNyZWF0ZWQgPiAke3RoaXMucHJvcHMuY3JlYXRlZEJ1ZmZlckRheXN9IGRheXMgYWdvYCxcbiAgICAgICAgJycsXG4gICAgICAgICdEZWxldGUgdGhpcyBiYXRjaCAoeWVzL25vL2RlbGV0ZS1hbGwpPycsXG4gICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgcHJpbnRlci5wYXVzZSgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm9tcHRseS5wcm9tcHQobWVzc2FnZSxcbiAgICAgICAgeyB0cmltOiB0cnVlIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBBbnl0aGluZyBvdGhlciB0aGFuIHllcy95L2RlbGV0ZS1hbGwgaXMgdHJlYXRlZCBhcyBub1xuICAgICAgaWYgKCFyZXNwb25zZSB8fCAhWyd5ZXMnLCAneScsICdkZWxldGUtYWxsJ10uaW5jbHVkZXMocmVzcG9uc2UudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignRGVsZXRpb24gYWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnRvTG93ZXJDYXNlKCkgPT0gJ2RlbGV0ZS1hbGwnKSB7XG4gICAgICAgIHRoaXMuY29uZmlybSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBwcmludGVyLnJlc3VtZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnRpdGlvbjxBPih4czogSXRlcmFibGU8QT4sIHByZWQ6ICh4OiBBKSA9PiBib29sZWFuKTogeyBpbmNsdWRlZDogQVtdOyBleGNsdWRlZDogQVtdIH0ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgaW5jbHVkZWQ6IFtdIGFzIEFbXSxcbiAgICBleGNsdWRlZDogW10gYXMgQVtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIGlmIChwcmVkKHgpKSB7XG4gICAgICByZXN1bHQuaW5jbHVkZWQucHVzaCh4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmV4Y2x1ZGVkLnB1c2goeCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaW1hZ2VNYXAoaW1hZ2VJZHM6IEltYWdlSWRlbnRpZmllcltdKSB7XG4gIGNvbnN0IGltYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIGZvciAoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VJZHMgPz8gW10pIHtcbiAgICBpZiAoIWltYWdlLmltYWdlRGlnZXN0IHx8ICFpbWFnZS5pbWFnZVRhZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghaW1hZ2VzW2ltYWdlLmltYWdlRGlnZXN0XSkge1xuICAgICAgaW1hZ2VzW2ltYWdlLmltYWdlRGlnZXN0XSA9IFtdO1xuICAgIH1cbiAgICBpbWFnZXNbaW1hZ2UuaW1hZ2VEaWdlc3RdLnB1c2goaW1hZ2UuaW1hZ2VUYWcpO1xuICB9XG4gIHJldHVybiBpbWFnZXM7XG59XG4iXX0=
609
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnYXJiYWdlLWNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrQkFBK0I7QUFDL0IscUNBQXFDO0FBRXJDLGtEQUEwRTtBQUMxRSx5REFBcUQ7QUFDckQsbURBQTBGO0FBRTFGLGlEQUFpRDtBQUNqRCwrQ0FBbUQ7QUFDbkQseUNBQXNDO0FBRXRDLG1EQUFtRDtBQUNuRCw0R0FBNEc7QUFDNUcsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUUvQyxRQUFBLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUNyQyxRQUFBLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsK0JBQStCO0FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7QUFJbkU7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFDckIsWUFDa0IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsUUFBZ0I7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFVO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUVsQyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMs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UUFBUSxDQUFDLFFBQTJCO0lBQzNDLE1BQU0sTUFBTSxHQUE2QixFQUFFLENBQUM7SUFDNUMsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLGFBQVIsUUFBUSxjQUFSLFFBQVEsR0FBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgSW1hZ2VJZGVudGlmaWVyIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjcic7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgdHlwZSB7IElFQ1JDbGllbnQsIElTM0NsaWVudCwgU0RLLCBTZGtQcm92aWRlciB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLCBUb29sa2l0SW5mbyB9IGZyb20gJy4uL3Rvb2xraXQtaW5mbyc7XG5pbXBvcnQgeyBQcm9ncmVzc1ByaW50ZXIgfSBmcm9tICcuL3Byb2dyZXNzLXByaW50ZXInO1xuaW1wb3J0IHsgQWN0aXZlQXNzZXRDYWNoZSwgQmFja2dyb3VuZFN0YWNrUmVmcmVzaCwgcmVmcmVzaFN0YWNrcyB9IGZyb20gJy4vc3RhY2stcmVmcmVzaCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgZGVidWcsIGluZm8gfSBmcm9tICcuLi8uLi9jbGkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9lcnJvcic7XG5pbXBvcnQgeyBNb2RlIH0gZnJvbSAnLi4vcGx1Z2luL21vZGUnO1xuXG4vLyBNdXN0IHVzZSBhIHJlcXVpcmUoKSBvdGhlcndpc2UgZXNidWlsZCBjb21wbGFpbnNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtaW1wb3J0c1xuY29uc3QgcExpbWl0OiB0eXBlb2YgaW1wb3J0KCdwLWxpbWl0JykgPSByZXF1aXJlKCdwLWxpbWl0Jyk7XG5cbmV4cG9ydCBjb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5leHBvcnQgY29uc3QgRUNSX0lTT0xBVEVEX1RBRyA9ICdhd3MtY2RrLmlzb2xhdGVkJzsgLy8gJzonIGlzIG5vdCB2YWxpZCBpbiBFQ1IgdGFnc1xuY29uc3QgUF9MSU1JVCA9IDUwO1xuY29uc3QgREFZID0gMjQgKiA2MCAqIDYwICogMTAwMDsgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIGRheVxuXG5leHBvcnQgdHlwZSBHY0Fzc2V0ID0gSW1hZ2VBc3NldCB8IE9iamVjdEFzc2V0O1xuXG4vKipcbiAqIEFuIGltYWdlIGFzc2V0IHRoYXQgbGl2ZXMgaW4gdGhlIGJvb3RzdHJhcHBlZCBFQ1IgUmVwb3NpdG9yeVxuICovXG5leHBvcnQgY2xhc3MgSW1hZ2VBc3NldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGFnczogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IG1hbmlmZXN0OiBzdHJpbmcsXG4gICkge1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmZpbmQodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLnNvbWUodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhFQ1JfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUYWcoRUNSX0lTT0xBVEVEX1RBRyk7XG4gIH1cblxuICBwdWJsaWMgaXNvbGF0ZWRUYWdCZWZvcmUoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IGRhdGVJc29sYXRlZCA9IHRoaXMuZGF0ZUlzb2xhdGVkKCk7XG4gICAgaWYgKCFkYXRlSXNvbGF0ZWQgfHwgZGF0ZUlzb2xhdGVkID09ICcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlSXNvbGF0ZWQpIDwgZGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZEltYWdlVGFnKGluYzogbnVtYmVyKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiBgJHtpbmN9LSR7RUNSX0lTT0xBVEVEX1RBR30tJHtTdHJpbmcoRGF0ZS5ub3coKSl9YDtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNvbGF0ZWQoKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiB0aGlzLmdldElzb2xhdGVkVGFnKCk/LnNwbGl0KCctJylbM107XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgYXNzZXQgdGhhdCBsaXZlcyBpbiB0aGUgYm9vdHN0cmFwcGVkIFMzIEJ1Y2tldFxuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QXNzZXQge1xuICBwcml2YXRlIGNhY2hlZF90YWdzOiBUYWdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyKSB7XG4gIH1cblxuICBwdWJsaWMgZmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rZXkuc3BsaXQoJy4nKVswXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhbGxUYWdzKHMzOiBJUzNDbGllbnQpIHtcbiAgICBpZiAodGhpcy5jYWNoZWRfdGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3M7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5nZXRPYmplY3RUYWdnaW5nKHsgQnVja2V0OiB0aGlzLmJ1Y2tldCwgS2V5OiB0aGlzLmtleSB9KTtcbiAgICB0aGlzLmNhY2hlZF90YWdzID0gcmVzcG9uc2UuVGFnU2V0O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZF90YWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVkX3RhZ3MpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Nhbm5vdCBjYWxsIGdldFRhZyBiZWZvcmUgYWxsVGFncycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncy5maW5kKCh0OiBhbnkpID0+IHQuS2V5ID09PSB0YWcpPy5WYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzVGFnKHRhZzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZF90YWdzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdDYW5ub3QgY2FsbCBoYXNUYWcgYmVmb3JlIGFsbFRhZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3Muc29tZSgodDogYW55KSA9PiB0LktleSA9PT0gdGFnKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUYWcoUzNfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBpc29sYXRlZFRhZ0JlZm9yZShkYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgdGFnVmFsdWUgPSB0aGlzLmdldFRhZyhTM19JU09MQVRFRF9UQUcpO1xuICAgIGlmICghdGFnVmFsdWUgfHwgdGFnVmFsdWUgPT0gJycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRhZ1ZhbHVlKSA8IGRhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEdhcmJhZ2UgQ29sbGVjdG9yXG4gKi9cbmludGVyZmFjZSBHYXJiYWdlQ29sbGVjdG9yUHJvcHMge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiB0byBwZXJmb3JtLiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gcGVyZm9ybSBhIHRydW5jYXRlZCBzZXRcbiAgICogb2YgYWN0aW9ucyBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb246ICdwcmludCcgfCAndGFnJyB8ICdkZWxldGUtdGFnZ2VkJyB8ICdmdWxsJztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgYXNzZXQgdG8gZ2FyYmFnZSBjb2xsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ3MzJyB8ICdlY3InIHwgJ2FsbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXlzIGFuIGFzc2V0IG11c3QgYmUgaW4gaXNvbGF0aW9uIGJlZm9yZSBiZWluZyBhY3R1YWxseSBkZWxldGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tCdWZmZXJEYXlzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZnVzZSBkZWxldGlvbiBvZiBhbnkgYXNzZXRzIHlvdW5nZXIgdGhhbiB0aGlzIG51bWJlciBvZiBkYXlzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEJ1ZmZlckRheXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRvIGRlcGxveSB0aGlzIHN0YWNrIGluXG4gICAqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2sgYXJ0aWZhY3QgbWF5IGJlIHVucmVzb2x2ZWQsIHRoaXMgb25lXG4gICAqIG11c3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIChzZWVkZWQgd2l0aCBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICAgKlxuICAgKiBXaWxsIGJlIHVzZWQgdG8gbWFrZSBTREsgY2FsbHMgdG8gQ2xvdWRGb3JtYXRpb24sIFMzLCBhbmQgRUNSLlxuICAgKi9cbiAgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNlbmQgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdG8gbG9vayBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgYWN0dWFsIGRlbGV0aW9uIGhhcHBlbnNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlybT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBjbGFzcyB0byBmYWNpbGl0YXRlIEdhcmJhZ2UgQ29sbGVjdGlvbiBvZiBTMyBhbmQgRUNSIGFzc2V0c1xuICovXG5leHBvcnQgY2xhc3MgR2FyYmFnZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBnYXJiYWdlQ29sbGVjdEVjckFzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uVG9EZWxldGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcGVybWlzc2lvblRvVGFnOiBib29sZWFuO1xuICBwcml2YXRlIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpcm06IGJvb2xlYW47XG4gIHByaXZhdGUgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZWFkb25seSBwcm9wczogR2FyYmFnZUNvbGxlY3RvclByb3BzKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IHByb3BzLmlvSGVscGVyO1xuXG4gICAgdGhpcy5nYXJiYWdlQ29sbGVjdFMzQXNzZXRzID0gWydzMycsICdhbGwnXS5pbmNsdWRlcyhwcm9wcy50eXBlKTtcbiAgICB0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyQXNzZXRzID0gWydlY3InLCAnYWxsJ10uaW5jbHVkZXMocHJvcHMudHlwZSk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25Ub0RlbGV0ZSA9IFsnZGVsZXRlLXRhZ2dlZCcsICdmdWxsJ10uaW5jbHVkZXMocHJvcHMuYWN0aW9uKTtcbiAgICB0aGlzLnBlcm1pc3Npb25Ub1RhZyA9IFsndGFnJywgJ2Z1bGwnXS5pbmNsdWRlcyhwcm9wcy5hY3Rpb24pO1xuICAgIHRoaXMuY29uZmlybSA9IHByb3BzLmNvbmZpcm0gPz8gdHJ1ZTtcblxuICAgIHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lID0gcHJvcHMuYm9vdHN0cmFwU3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnYXJiYWdlQ29sbGVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHt0aGlzLmdhcmJhZ2VDb2xsZWN0UzNBc3NldHN9ICR7dGhpcy5nYXJiYWdlQ29sbGVjdEVjckFzc2V0c31gKSk7XG5cbiAgICAvLyBTREtzXG4gICAgY29uc3Qgc2RrID0gKGF3YWl0IHRoaXMucHJvcHMuc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQodGhpcy5wcm9wcy5yZXNvbHZlZEVudmlyb25tZW50LCBNb2RlLkZvcldyaXRpbmcpKS5zZGs7XG4gICAgY29uc3QgY2ZuID0gc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgICBjb25zdCBxdWFsaWZpZXIgPSBhd2FpdCB0aGlzLmJvb3RzdHJhcFF1YWxpZmllcihzZGssIHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICBjb25zdCBhY3RpdmVBc3NldHMgPSBuZXcgQWN0aXZlQXNzZXRDYWNoZSgpO1xuXG4gICAgLy8gR3JhYiBzdGFjayB0ZW1wbGF0ZXMgZmlyc3RcbiAgICBhd2FpdCByZWZyZXNoU3RhY2tzKGNmbiwgdGhpcy5pb0hlbHBlciwgYWN0aXZlQXNzZXRzLCBxdWFsaWZpZXIpO1xuICAgIC8vIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHJlZnJlc2hcbiAgICBjb25zdCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoID0gbmV3IEJhY2tncm91bmRTdGFja1JlZnJlc2goe1xuICAgICAgY2ZuLFxuICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICBhY3RpdmVBc3NldHMsXG4gICAgICBxdWFsaWZpZXIsXG4gICAgfSk7XG4gICAgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmdhcmJhZ2VDb2xsZWN0UzNBc3NldHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nYXJiYWdlQ29sbGVjdFMzKHNkaywgYWN0aXZlQXNzZXRzLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2FyYmFnZUNvbGxlY3RFY3JBc3NldHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5nYXJiYWdlQ29sbGVjdEVjcihzZGssIGFjdGl2ZUFzc2V0cywgYmFja2dyb3VuZFN0YWNrUmVmcmVzaCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIEVDUiBhc3NldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnYXJiYWdlQ29sbGVjdEVjcihzZGs6IFNESywgYWN0aXZlQXNzZXRzOiBBY3RpdmVBc3NldENhY2hlLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoOiBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKSB7XG4gICAgY29uc3QgZWNyID0gc2RrLmVjcigpO1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcFJlcG9zaXRvcnlOYW1lKHNkaywgdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGNvbnN0IG51bUltYWdlcyA9IGF3YWl0IHRoaXMubnVtSW1hZ2VzSW5SZXBvKGVjciwgcmVwbyk7XG4gICAgY29uc3QgcHJpbnRlciA9IG5ldyBQcm9ncmVzc1ByaW50ZXIodGhpcy5pb0hlbHBlciwgbnVtSW1hZ2VzLCAxMDAwKTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBGb3VuZCBib290c3RyYXAgcmVwbyAke3JlcG99IHdpdGggJHtudW1JbWFnZXN9IGltYWdlc2ApKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBjb25zdCBiYXRjaGVzID0gMTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDA7XG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBncmFjZURheXMgPSB0aGlzLnByb3BzLnJvbGxiYWNrQnVmZmVyRGF5cztcblxuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYFBhcnNpbmcgdGhyb3VnaCAke251bUltYWdlc30gaW1hZ2VzIGluIGJhdGNoZXNgKSk7XG5cbiAgICAgIHByaW50ZXIuc3RhcnQoKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBiYXRjaCBvZiB0aGlzLnJlYWRSZXBvSW5CYXRjaGVzKGVjciwgcmVwbywgYmF0Y2hTaXplLCBjdXJyZW50VGltZSkpIHtcbiAgICAgICAgYXdhaXQgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5ub09sZGVyVGhhbig2MDBfMDAwKTsgLy8gMTAgbWluc1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IGlzb2xhdGVkLCBleGNsdWRlZDogbm90SXNvbGF0ZWQgfSA9IHBhcnRpdGlvbihiYXRjaCwgYXNzZXQgPT4gIWFzc2V0LnRhZ3Muc29tZSh0ID0+IGFjdGl2ZUFzc2V0cy5jb250YWlucyh0KSkpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2lzb2xhdGVkLmxlbmd0aH0gaXNvbGF0ZWQgaW1hZ2VzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHtub3RJc29sYXRlZC5sZW5ndGh9IG5vdCBpc29sYXRlZCBpbWFnZXNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2JhdGNoLmxlbmd0aH0gaW1hZ2VzIHRvdGFsYCkpO1xuXG4gICAgICAgIGxldCBkZWxldGFibGVzOiBJbWFnZUFzc2V0W10gPSBpc29sYXRlZDtcbiAgICAgICAgbGV0IHRhZ2dhYmxlczogSW1hZ2VBc3NldFtdID0gW107XG4gICAgICAgIGxldCB1bnRhZ2dhYmxlczogSW1hZ2VBc3NldFtdID0gW107XG5cbiAgICAgICAgaWYgKGdyYWNlRGF5cyA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZygnRmlsdGVyaW5nIG91dCBpbWFnZXMgdGhhdCBhcmUgbm90IG9sZCBlbm91Z2ggdG8gZGVsZXRlJykpO1xuXG4gICAgICAgICAgLy8gV2UgZGVsZXRlIGltYWdlcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGhhdmUgdGhlIElzb2xhdGVkIFRhZyB3aXRoIGEgZGF0ZVxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lIC0gZ3JhY2UgcGVyaW9kLlxuICAgICAgICAgIGRlbGV0YWJsZXMgPSBpc29sYXRlZC5maWx0ZXIoaW1nID0+IGltZy5pc29sYXRlZFRhZ0JlZm9yZShuZXcgRGF0ZShjdXJyZW50VGltZSAtIChncmFjZURheXMgKiBEQVkpKSkpO1xuXG4gICAgICAgICAgLy8gV2UgdGFnIGltYWdlcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGRvIG5vdCBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdGFnZ2FibGVzID0gaXNvbGF0ZWQuZmlsdGVyKGltZyA9PiAhaW1nLmhhc0lzb2xhdGVkVGFnKCkpO1xuXG4gICAgICAgICAgLy8gV2UgdW50YWcgaW1hZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBjdXJyZW50bHkgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHVudGFnZ2FibGVzID0gbm90SXNvbGF0ZWQuZmlsdGVyKGltZyA9PiBpbWcuaGFzSXNvbGF0ZWRUYWcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHtkZWxldGFibGVzLmxlbmd0aH0gZGVsZXRhYmxlIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7dGFnZ2FibGVzLmxlbmd0aH0gdGFnZ2FibGUgYXNzZXRzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0cyB0byB1bnRhZ2ApKTtcblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9EZWxldGUgJiYgZGVsZXRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtYXRpb25Qcm9tcHQocHJpbnRlciwgZGVsZXRhYmxlcywgJ2ltYWdlJyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbERlbGV0ZUVjcihlY3IsIHJlcG8sIGRlbGV0YWJsZXMsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFRhZ0VjcihlY3IsIHJlcG8sIHRhZ2dhYmxlcywgcHJpbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9UYWcgJiYgdW50YWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxVbnRhZ0VjcihlY3IsIHJlcG8sIHVudGFnZ2FibGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50ZXIucmVwb3J0U2Nhbm5lZEFzc2V0KGJhdGNoLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJpbnRlci5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIFMzIGFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdhcmJhZ2VDb2xsZWN0UzMoc2RrOiBTREssIGFjdGl2ZUFzc2V0czogQWN0aXZlQXNzZXRDYWNoZSwgYmFja2dyb3VuZFN0YWNrUmVmcmVzaDogQmFja2dyb3VuZFN0YWNrUmVmcmVzaCkge1xuICAgIGNvbnN0IHMzID0gc2RrLnMzKCk7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5ib290c3RyYXBCdWNrZXROYW1lKHNkaywgdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGNvbnN0IG51bU9iamVjdHMgPSBhd2FpdCB0aGlzLm51bU9iamVjdHNJbkJ1Y2tldChzMywgYnVja2V0KTtcbiAgICBjb25zdCBwcmludGVyID0gbmV3IFByb2dyZXNzUHJpbnRlcih0aGlzLmlvSGVscGVyLCBudW1PYmplY3RzLCAxMDAwKTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBGb3VuZCBib290c3RyYXAgYnVja2V0ICR7YnVja2V0fSB3aXRoICR7bnVtT2JqZWN0c30gb2JqZWN0c2ApKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSAxMDAwO1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZ3JhY2VEYXlzID0gdGhpcy5wcm9wcy5yb2xsYmFja0J1ZmZlckRheXM7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBQYXJzaW5nIHRocm91Z2ggJHtudW1PYmplY3RzfSBvYmplY3RzIGluIGJhdGNoZXNgKSk7XG5cbiAgICAgIHByaW50ZXIuc3RhcnQoKTtcblxuICAgICAgLy8gUHJvY2VzcyBvYmplY3RzIGluIGJhdGNoZXMgb2YgMTAwMFxuICAgICAgLy8gVGhpcyBpcyB0aGUgYmF0Y2ggbGltaXQgb2YgczMuRGVsZXRlT2JqZWN0IGFuZCB3ZSBpbnRlbmQgdG8gb3B0aW1pemUgZm9yIHRoZSBcIndvcnN0IGNhc2VcIiBzY2VuYXJpb1xuICAgICAgLy8gd2hlcmUgZ2MgaXMgcnVuIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGxvbmctc3RhbmRpbmcgYnVja2V0IHdoZXJlIH4xMDAlIG9mIG9iamVjdHMgYXJlIGlzb2xhdGVkLlxuICAgICAgZm9yIGF3YWl0IChjb25zdCBiYXRjaCBvZiB0aGlzLnJlYWRCdWNrZXRJbkJhdGNoZXMoczMsIGJ1Y2tldCwgYmF0Y2hTaXplLCBjdXJyZW50VGltZSkpIHtcbiAgICAgICAgYXdhaXQgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5ub09sZGVyVGhhbig2MDBfMDAwKTsgLy8gMTAgbWluc1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IGlzb2xhdGVkLCBleGNsdWRlZDogbm90SXNvbGF0ZWQgfSA9IHBhcnRpdGlvbihiYXRjaCwgYXNzZXQgPT4gIWFjdGl2ZUFzc2V0cy5jb250YWlucyhhc3NldC5maWxlTmFtZSgpKSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7aXNvbGF0ZWQubGVuZ3RofSBpc29sYXRlZCBhc3NldHNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke25vdElzb2xhdGVkLmxlbmd0aH0gbm90IGlzb2xhdGVkIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7YmF0Y2gubGVuZ3RofSBvYmplY3RzIHRvdGFsYCkpO1xuXG4gICAgICAgIGxldCBkZWxldGFibGVzOiBPYmplY3RBc3NldFtdID0gaXNvbGF0ZWQ7XG4gICAgICAgIGxldCB0YWdnYWJsZXM6IE9iamVjdEFzc2V0W10gPSBbXTtcbiAgICAgICAgbGV0IHVudGFnZ2FibGVzOiBPYmplY3RBc3NldFtdID0gW107XG5cbiAgICAgICAgaWYgKGdyYWNlRGF5cyA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZygnRmlsdGVyaW5nIG91dCBhc3NldHMgdGhhdCBhcmUgbm90IG9sZCBlbm91Z2ggdG8gZGVsZXRlJykpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxSZWFkQWxsVGFncyhzMywgYmF0Y2gpO1xuXG4gICAgICAgICAgLy8gV2UgZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBoYXZlIHRoZSBJc29sYXRlZCBUYWcgd2l0aCBhIGRhdGVcbiAgICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZSAtIGdyYWNlIHBlcmlvZC5cbiAgICAgICAgICBkZWxldGFibGVzID0gaXNvbGF0ZWQuZmlsdGVyKG9iaiA9PiBvYmouaXNvbGF0ZWRUYWdCZWZvcmUobmV3IERhdGUoY3VycmVudFRpbWUgLSAoZ3JhY2VEYXlzICogREFZKSkpKTtcblxuICAgICAgICAgIC8vIFdlIHRhZyBvYmplY3RzIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgZG8gbm90IGhhdmUgdGhlIElzb2xhdGVkIFRhZy5cbiAgICAgICAgICB0YWdnYWJsZXMgPSBpc29sYXRlZC5maWx0ZXIob2JqID0+ICFvYmouaGFzSXNvbGF0ZWRUYWcoKSk7XG5cbiAgICAgICAgICAvLyBXZSB1bnRhZyBvYmplY3RzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBjdXJyZW50bHkgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHVudGFnZ2FibGVzID0gbm90SXNvbGF0ZWQuZmlsdGVyKG9iaiA9PiBvYmouaGFzSXNvbGF0ZWRUYWcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHtkZWxldGFibGVzLmxlbmd0aH0gZGVsZXRhYmxlIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7dGFnZ2FibGVzLmxlbmd0aH0gdGFnZ2FibGUgYXNzZXRzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0cyB0byB1bnRhZ2ApKTtcblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9EZWxldGUgJiYgZGVsZXRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtYXRpb25Qcm9tcHQocHJpbnRlciwgZGVsZXRhYmxlcywgJ29iamVjdCcpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxEZWxldGVTMyhzMywgYnVja2V0LCBkZWxldGFibGVzLCBwcmludGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub1RhZyAmJiB0YWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxUYWdTMyhzMywgYnVja2V0LCB0YWdnYWJsZXMsIGN1cnJlbnRUaW1lLCBwcmludGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub1RhZyAmJiB1bnRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFVudGFnUzMoczMsIGJ1Y2tldCwgdW50YWdnYWJsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRlci5yZXBvcnRTY2FubmVkQXNzZXQoYmF0Y2gubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwcmludGVyLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsUmVhZEFsbFRhZ3MoczM6IElTM0NsaWVudCwgb2JqZWN0czogT2JqZWN0QXNzZXRbXSkge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2JqZWN0cykge1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT4gb2JqLmFsbFRhZ3MoczMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW50YWcgYXNzZXRzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHRhZ2dlZCwgYnV0IG5vdyBjdXJyZW50bHkgcmVmZXJlbmNlZC5cbiAgICogU2luY2UgdGhpcyBpcyB0cmVhdGVkIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgd2UgZG8gbm90IHByaW50IHRoZSByZXN1bHRzIGluIHRoZSBwcmludGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbFVudGFnRWNyKGVjcjogSUVDUkNsaWVudCwgcmVwbzogc3RyaW5nLCB1bnRhZ2dhYmxlczogSW1hZ2VBc3NldFtdKSB7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoUF9MSU1JVCk7XG5cbiAgICBmb3IgKGNvbnN0IGltZyBvZiB1bnRhZ2dhYmxlcykge1xuICAgICAgY29uc3QgdGFnID0gaW1nLmdldElzb2xhdGVkVGFnKCk7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PlxuICAgICAgICBlY3IuYmF0Y2hEZWxldGVJbWFnZSh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgaW1hZ2VJZHM6IFt7XG4gICAgICAgICAgICBpbWFnZVRhZzogdGFnLFxuICAgICAgICAgIH1dLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYFVudGFnZ2VkICR7dW50YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKSk7XG4gIH1cblxuICAvKipcbiAgICogVW50YWcgYXNzZXRzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHRhZ2dlZCwgYnV0IG5vdyBjdXJyZW50bHkgcmVmZXJlbmNlZC5cbiAgICogU2luY2UgdGhpcyBpcyB0cmVhdGVkIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgd2UgZG8gbm90IHByaW50IHRoZSByZXN1bHRzIGluIHRoZSBwcmludGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbFVudGFnUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIHVudGFnZ2FibGVzOiBPYmplY3RBc3NldFtdKSB7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoUF9MSU1JVCk7XG5cbiAgICBmb3IgKGNvbnN0IG9iaiBvZiB1bnRhZ2dhYmxlcykge1xuICAgICAgY29uc3QgdGFncyA9IGF3YWl0IG9iai5hbGxUYWdzKHMzKSA/PyBbXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzID0gdGFncy5maWx0ZXIoKHRhZzogVGFnKSA9PiB0YWcuS2V5ICE9PSBTM19JU09MQVRFRF9UQUcpO1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT5cbiAgICAgICAgczMuZGVsZXRlT2JqZWN0VGFnZ2luZyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgS2V5OiBvYmoua2V5LFxuXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIHMzLnB1dE9iamVjdFRhZ2dpbmcoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIEtleTogb2JqLmtleSxcbiAgICAgICAgICBUYWdnaW5nOiB7XG4gICAgICAgICAgICBUYWdTZXQ6IHVwZGF0ZWRUYWdzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgVW50YWdnZWQgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWcgaW1hZ2VzIGluIHBhcmFsbGVsIHVzaW5nIHAtbGltaXRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxUYWdFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIHRhZ2dhYmxlczogSW1hZ2VBc3NldFtdLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnZ2FibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbWcgPSB0YWdnYWJsZXNbaV07XG4gICAgICBjb25zdCB0YWdFY3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZWNyLnB1dEltYWdlKHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgICAgaW1hZ2VEaWdlc3Q6IGltZy5kaWdlc3QsXG4gICAgICAgICAgICBpbWFnZU1hbmlmZXN0OiBpbWcubWFuaWZlc3QsXG4gICAgICAgICAgICBpbWFnZVRhZzogaW1nLmJ1aWxkSW1hZ2VUYWcoaSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGZhbHNlIG5lZ2F0aXZlIC0tIGFuIGlzb2xhdGVkIGFzc2V0IGlzIHVudGFnZ2VkXG4gICAgICAgICAgLy8gbGlrZWx5IGR1ZSB0byBhbiBpbWFnZVRhZyBjb2xsaXNpb24uIFdlIGNhbiBzYWZlbHkgaWdub3JlLFxuICAgICAgICAgIC8vIGFuZCB0aGUgaXNvbGF0ZWQgYXNzZXQgd2lsbCBiZSB0YWdnZWQgbmV4dCB0aW1lLlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBXYXJuaW5nOiB1bmFibGUgdG8gdGFnIGltYWdlICR7SlNPTi5zdHJpbmdpZnkoaW1nLnRhZ3MpfSB3aXRoICR7aW1nLmJ1aWxkSW1hZ2VUYWcoaSl9IGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiAke2Vycm9yfWApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+IHRhZ0VjcigpKTtcbiAgICB9XG5cbiAgICBwcmludGVyLnJlcG9ydFRhZ2dlZEFzc2V0KHRhZ2dhYmxlcyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYFRhZ2dlZCAke3RhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWcgb2JqZWN0cyBpbiBwYXJhbGxlbCB1c2luZyBwLWxpbWl0LiBUaGUgcHV0T2JqZWN0VGFnZ2luZyBBUEkgZG9lcyBub3RcbiAgICogc3VwcG9ydCBiYXRjaCB0YWdnaW5nIHNvIHdlIG11c3QgaGFuZGxlIHRoZSBwYXJhbGxlbGlzbSBjbGllbnQtc2lkZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxUYWdTMyhzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZywgdGFnZ2FibGVzOiBPYmplY3RBc3NldFtdLCBkYXRlOiBudW1iZXIsIHByaW50ZXI6IFByb2dyZXNzUHJpbnRlcikge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBvYmogb2YgdGFnZ2FibGVzKSB7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PlxuICAgICAgICBzMy5wdXRPYmplY3RUYWdnaW5nKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBLZXk6IG9iai5rZXksXG4gICAgICAgICAgVGFnZ2luZzoge1xuICAgICAgICAgICAgVGFnU2V0OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBLZXk6IFMzX0lTT0xBVEVEX1RBRyxcbiAgICAgICAgICAgICAgICBWYWx1ZTogU3RyaW5nKGRhdGUpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpbnRlci5yZXBvcnRUYWdnZWRBc3NldCh0YWdnYWJsZXMpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBUYWdnZWQgJHt0YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGltYWdlcyBpbiBwYXJhbGxlbC4gVGhlIGRlbGV0ZUltYWdlIEFQSSBzdXBwb3J0cyBiYXRjaGVzIG9mIDEwMC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxEZWxldGVFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIGRlbGV0YWJsZXM6IEltYWdlQXNzZXRbXSwgcHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTAwO1xuICAgIGNvbnN0IGltYWdlc1RvRGVsZXRlID0gZGVsZXRhYmxlcy5tYXAoaW1nID0+ICh7XG4gICAgICBpbWFnZURpZ2VzdDogaW1nLmRpZ2VzdCxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgIGJhdGNoZXMucHVzaChpbWFnZXNUb0RlbGV0ZS5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgaW1hZ2VzIGluIGJhdGNoZXNcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICBhd2FpdCBlY3IuYmF0Y2hEZWxldGVJbWFnZSh7XG4gICAgICAgICAgaW1hZ2VJZHM6IGJhdGNoLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBiYXRjaC5sZW5ndGg7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBEZWxldGVkICR7ZGVsZXRlZENvdW50fSBhc3NldHNgKSk7XG4gICAgICAgIHByaW50ZXIucmVwb3J0RGVsZXRlZEFzc2V0KGRlbGV0YWJsZXMuc2xpY2UoMCwgZGVsZXRlZENvdW50KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShpbmZvKGNoYWxrLnJlZChgRXJyb3IgZGVsZXRpbmcgaW1hZ2VzOiAke2Vycn1gKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgb2JqZWN0cyBpbiBwYXJhbGxlbC4gVGhlIGRlbGV0ZU9iamVjdHMgQVBJIHN1cHBvcnRzIGJhdGNoZXMgb2YgMTAwMC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxEZWxldGVTMyhzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZywgZGVsZXRhYmxlczogT2JqZWN0QXNzZXRbXSwgcHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTAwMDtcbiAgICBjb25zdCBvYmplY3RzVG9EZWxldGUgPSBkZWxldGFibGVzLm1hcChhc3NldCA9PiAoe1xuICAgICAgS2V5OiBhc3NldC5rZXksXG4gICAgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0c1RvRGVsZXRlLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgICAgYmF0Y2hlcy5wdXNoKG9iamVjdHNUb0RlbGV0ZS5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgb2JqZWN0cyBpbiBiYXRjaGVzXG4gICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGJhdGNoZXMpIHtcbiAgICAgICAgYXdhaXQgczMuZGVsZXRlT2JqZWN0cyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgRGVsZXRlOiB7XG4gICAgICAgICAgICBPYmplY3RzOiBiYXRjaCxcbiAgICAgICAgICAgIFF1aWV0OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGJhdGNoLmxlbmd0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYERlbGV0ZWQgJHtkZWxldGVkQ291bnR9IGFzc2V0c2ApKTtcbiAgICAgICAgcHJpbnRlci5yZXBvcnREZWxldGVkQXNzZXQoZGVsZXRhYmxlcy5zbGljZSgwLCBkZWxldGVkQ291bnQpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGNoYWxrLnJlZChgRXJyb3IgZGVsZXRpbmcgb2JqZWN0czogJHtlcnJ9YCkpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcEJ1Y2tldE5hbWUoc2RrOiBTREssIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIHNkaywgdGhpcy5pb0hlbHBlciwgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8uYnVja2V0TmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwUmVwb3NpdG9yeU5hbWUoc2RrOiBTREssIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIHNkaywgdGhpcy5pb0hlbHBlciwgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8ucmVwb3NpdG9yeU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcFF1YWxpZmllcihzZGs6IFNESywgYm9vdHN0cmFwU3RhY2tOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRvb2xraXRJbmZvID0gYXdhaXQgVG9vbGtpdEluZm8ubG9va3VwKHRoaXMucHJvcHMucmVzb2x2ZWRFbnZpcm9ubWVudCwgc2RrLCB0aGlzLmlvSGVscGVyLCBib290c3RyYXBTdGFja05hbWUpO1xuICAgIHJldHVybiB0b29sa2l0SW5mby5ib290c3RyYXBTdGFjay5wYXJhbWV0ZXJzLlF1YWxpZmllcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbnVtT2JqZWN0c0luQnVja2V0KHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XG4gICAgbGV0IGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHMzLmxpc3RPYmplY3RzVjIoe1xuICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgQ29udGludWF0aW9uVG9rZW46IGNvbnRpbnVhdGlvblRva2VuLFxuICAgICAgfSk7XG5cbiAgICAgIHRvdGFsQ291bnQgKz0gcmVzcG9uc2UuS2V5Q291bnQgPz8gMDtcbiAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuICAgIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuKTtcblxuICAgIHJldHVybiB0b3RhbENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBudW1JbWFnZXNJblJlcG8oZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCB0b3RhbENvdW50ID0gMDtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjci5saXN0SW1hZ2VzKHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgIG5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgfSk7XG5cbiAgICAgIHRvdGFsQ291bnQgKz0gcmVzcG9uc2UuaW1hZ2VJZHM/Lmxlbmd0aCA/PyAwO1xuICAgICAgbmV4dFRva2VuID0gcmVzcG9uc2UubmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG5cbiAgICByZXR1cm4gdG90YWxDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgKnJlYWRSZXBvSW5CYXRjaGVzKGVjcjogSUVDUkNsaWVudCwgcmVwbzogc3RyaW5nLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIGN1cnJlbnRUaW1lOiBudW1iZXIpOiBBc3luY0dlbmVyYXRvcjxJbWFnZUFzc2V0W10+IHtcbiAgICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJhdGNoOiBJbWFnZUFzc2V0W10gPSBbXTtcblxuICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA8IGJhdGNoU2l6ZSkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjci5saXN0SW1hZ2VzKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBuZXh0VG9rZW46IGNvbnRpbnVhdGlvblRva2VuLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBObyBpbWFnZXMgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgICAgaWYgKCFyZXNwb25zZS5pbWFnZUlkcyB8fCByZXNwb25zZS5pbWFnZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1hcCB1bmlxdWUgaW1hZ2UgZGlnZXN0IHRvIChwb3NzaWJseSBtdWx0aXBsZSkgdGFnc1xuICAgICAgICBjb25zdCBpbWFnZXMgPSBpbWFnZU1hcChyZXNwb25zZS5pbWFnZUlkcyA/PyBbXSk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VJZHMgPSBPYmplY3Qua2V5cyhpbWFnZXMpLm1hcChrZXkgPT4gKHtcbiAgICAgICAgICBpbWFnZURpZ2VzdDoga2V5LFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpYmVJbWFnZUluZm8gPSBhd2FpdCBlY3IuZGVzY3JpYmVJbWFnZXMoe1xuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgIGltYWdlSWRzOiBpbWFnZUlkcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2V0SW1hZ2VJbmZvID0gYXdhaXQgZWNyLmJhdGNoR2V0SW1hZ2Uoe1xuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgIGltYWdlSWRzOiBpbWFnZUlkcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29tYmluZWRJbWFnZUluZm8gPSBkZXNjcmliZUltYWdlSW5mby5pbWFnZURldGFpbHM/Lm1hcChpbWFnZURldGFpbCA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdJbWFnZSA9IGdldEltYWdlSW5mby5pbWFnZXM/LmZpbmQoXG4gICAgICAgICAgICBpbWcgPT4gaW1nLmltYWdlSWQ/LmltYWdlRGlnZXN0ID09PSBpbWFnZURldGFpbC5pbWFnZURpZ2VzdCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmltYWdlRGV0YWlsLFxuICAgICAgICAgICAgbWFuaWZlc3Q6IG1hdGNoaW5nSW1hZ2U/LmltYWdlTWFuaWZlc3QsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBjb21iaW5lZEltYWdlSW5mbyA/PyBbXSkge1xuICAgICAgICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IGltYWdlLmltYWdlUHVzaGVkQXQgPz8gbmV3IERhdGUoY3VycmVudFRpbWUpO1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBpbWFnZSBpZiBpdCB3YXMgcHVzaGVkIGVhcmxpZXIgdGhhbiB0b2RheSAtIGNyZWF0ZWRCdWZmZXJEYXlzXG4gICAgICAgICAgaWYgKGltYWdlLmltYWdlRGlnZXN0ICYmIGxhc3RNb2RpZmllZCA8IG5ldyBEYXRlKGN1cnJlbnRUaW1lIC0gKHRoaXMucHJvcHMuY3JlYXRlZEJ1ZmZlckRheXMgKiBEQVkpKSkge1xuICAgICAgICAgICAgYmF0Y2gucHVzaChuZXcgSW1hZ2VBc3NldChpbWFnZS5pbWFnZURpZ2VzdCwgaW1hZ2UuaW1hZ2VTaXplSW5CeXRlcyA/PyAwLCBpbWFnZS5pbWFnZVRhZ3MgPz8gW10sIGltYWdlLm1hbmlmZXN0ID8/ICcnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXNwb25zZS5uZXh0VG9rZW47XG5cbiAgICAgICAgaWYgKCFjb250aW51YXRpb25Ub2tlbikgYnJlYWs7IC8vIE5vIG1vcmUgaW1hZ2VzIHRvIGZldGNoXG4gICAgICB9XG5cbiAgICAgIGlmIChiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0b3IgZnVuY3Rpb24gdGhhdCByZWFkcyBvYmplY3RzIGZyb20gdGhlIFMzIEJ1Y2tldCBpbiBiYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyAqcmVhZEJ1Y2tldEluQmF0Y2hlcyhzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZywgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBjdXJyZW50VGltZTogbnVtYmVyKTogQXN5bmNHZW5lcmF0b3I8T2JqZWN0QXNzZXRbXT4ge1xuICAgIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYmF0Y2g6IE9iamVjdEFzc2V0W10gPSBbXTtcblxuICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA8IGJhdGNoU2l6ZSkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHMzLmxpc3RPYmplY3RzVjIoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2UuQ29udGVudHM/LmZvckVhY2goKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gb2JqLktleSA/PyAnJztcbiAgICAgICAgICBjb25zdCBzaXplID0gb2JqLlNpemUgPz8gMDtcbiAgICAgICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBvYmouTGFzdE1vZGlmaWVkID8/IG5ldyBEYXRlKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgb2JqZWN0IGlmIGl0IGhhcyBhIEtleSBhbmRcbiAgICAgICAgICAvLyBpZiBpdCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdG9kYXkgLSBjcmVhdGVkQnVmZmVyRGF5c1xuICAgICAgICAgIGlmIChrZXkgJiYgbGFzdE1vZGlmaWVkIDwgbmV3IERhdGUoY3VycmVudFRpbWUgLSAodGhpcy5wcm9wcy5jcmVhdGVkQnVmZmVyRGF5cyAqIERBWSkpKSB7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKG5ldyBPYmplY3RBc3NldChidWNrZXQsIGtleSwgc2l6ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udGludWF0aW9uVG9rZW4gPSByZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG5cbiAgICAgICAgaWYgKCFjb250aW51YXRpb25Ub2tlbikgYnJlYWs7IC8vIE5vIG1vcmUgb2JqZWN0cyB0byBmZXRjaFxuICAgICAgfVxuXG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB5aWVsZCBiYXRjaDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1hdGlvblByb21wdChwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIsIGRlbGV0YWJsZXM6IEdjQXNzZXRbXSwgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGx1cmFsaXplID0gKG5hbWU6IHN0cmluZywgY291bnQ6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gY291bnQgPT09IDEgPyBuYW1lIDogYCR7bmFtZX1zYDtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IFtcbiAgICAgICAgYEZvdW5kICR7ZGVsZXRhYmxlcy5sZW5ndGh9ICR7cGx1cmFsaXplKHR5cGUsIGRlbGV0YWJsZXMubGVuZ3RoKX0gdG8gZGVsZXRlIGJhc2VkIG9mZiBvZiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOmAsXG4gICAgICAgIGAtICR7dHlwZX1zIGhhdmUgYmVlbiBpc29sYXRlZCBmb3IgPiAke3RoaXMucHJvcHMucm9sbGJhY2tCdWZmZXJEYXlzfSBkYXlzYCxcbiAgICAgICAgYC0gJHt0eXBlfXMgd2VyZSBjcmVhdGVkID4gJHt0aGlzLnByb3BzLmNyZWF0ZWRCdWZmZXJEYXlzfSBkYXlzIGFnb2AsXG4gICAgICAgICcnLFxuICAgICAgICAnRGVsZXRlIHRoaXMgYmF0Y2ggKHllcy9uby9kZWxldGUtYWxsKT8nLFxuICAgICAgXS5qb2luKCdcXG4nKTtcbiAgICAgIHByaW50ZXIucGF1c2UoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvbXB0bHkucHJvbXB0KG1lc3NhZ2UsXG4gICAgICAgIHsgdHJpbTogdHJ1ZSB9LFxuICAgICAgKTtcblxuICAgICAgLy8gQW55dGhpbmcgb3RoZXIgdGhhbiB5ZXMveS9kZWxldGUtYWxsIGlzIHRyZWF0ZWQgYXMgbm9cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgIVsneWVzJywgJ3knLCAnZGVsZXRlLWFsbCddLmluY2x1ZGVzKHJlc3BvbnNlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RlbGV0aW9uIGFib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS50b0xvd2VyQ2FzZSgpID09ICdkZWxldGUtYWxsJykge1xuICAgICAgICB0aGlzLmNvbmZpcm0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJpbnRlci5yZXN1bWUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJ0aXRpb248QT4oeHM6IEl0ZXJhYmxlPEE+LCBwcmVkOiAoeDogQSkgPT4gYm9vbGVhbik6IHsgaW5jbHVkZWQ6IEFbXTsgZXhjbHVkZWQ6IEFbXSB9IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGluY2x1ZGVkOiBbXSBhcyBBW10sXG4gICAgZXhjbHVkZWQ6IFtdIGFzIEFbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICBpZiAocHJlZCh4KSkge1xuICAgICAgcmVzdWx0LmluY2x1ZGVkLnB1c2goeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5leGNsdWRlZC5wdXNoKHgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGltYWdlTWFwKGltYWdlSWRzOiBJbWFnZUlkZW50aWZpZXJbXSkge1xuICBjb25zdCBpbWFnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlSWRzID8/IFtdKSB7XG4gICAgaWYgKCFpbWFnZS5pbWFnZURpZ2VzdCB8fCAhaW1hZ2UuaW1hZ2VUYWcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWltYWdlc1tpbWFnZS5pbWFnZURpZ2VzdF0pIHtcbiAgICAgIGltYWdlc1tpbWFnZS5pbWFnZURpZ2VzdF0gPSBbXTtcbiAgICB9XG4gICAgaW1hZ2VzW2ltYWdlLmltYWdlRGlnZXN0XS5wdXNoKGltYWdlLmltYWdlVGFnKTtcbiAgfVxuICByZXR1cm4gaW1hZ2VzO1xufVxuIl19
@@ -1,8 +1,7 @@
1
- import { GcAsset as GCAsset } from './garbage-collector';
2
- import { IoMessaging } from '../../toolkit/cli-io-host';
1
+ import type { GcAsset as GCAsset } from './garbage-collector';
2
+ import type { IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
3
3
  export declare class ProgressPrinter {
4
- private ioHost;
5
- private action;
4
+ private ioHelper;
6
5
  private totalAssets;
7
6
  private assetsScanned;
8
7
  private taggedAsset;
@@ -12,7 +11,7 @@ export declare class ProgressPrinter {
12
11
  private interval;
13
12
  private setInterval?;
14
13
  private isPaused;
15
- constructor(msg: IoMessaging, totalAssets: number, interval?: number);
14
+ constructor(ioHelper: IoHelper, totalAssets: number, interval?: number);
16
15
  reportScannedAsset(amt: number): void;
17
16
  reportTaggedAsset(assets: GCAsset[]): void;
18
17
  reportDeletedAsset(assets: GCAsset[]): void;